Jelajahi Sumber

优化样式

shish 2 bulan lalu
induk
melakukan
775bc58455

+ 14 - 35
app-hd/controllers/GoodsController.php

@@ -15,6 +15,7 @@ use bizHd\wx\classes\WxOpenClass;
 use common\components\dict;
 use common\components\imgUtil;
 use common\components\miniUtil;
+use common\components\PosterUtil;
 use common\components\printUtil;
 use common\components\stringUtil;
 use Yii;
@@ -199,8 +200,6 @@ class GoodsController extends BaseController
         $scene = 'id=' . $id . '&a=' . $shopId;
         $envVersion = miniUtil::normalizeMiniEnvVersion(Yii::$app->request->get('env_version', 'release'));
         $miniCode = miniUtil::generateUnlimitedMiniCode($merchant, $page, $scene, $ptStyle, $envVersion);
-        $miniCode = $miniCode . '?x-oss-process=image/resize,m_fill,h_200,w_200';
-        $miniCodeBase64 = stringUtil::ossBase64($miniCode);
 
         Yii::$app->params['ptStyle'] = dict::getDict('ptStyle', 'hd');
 
@@ -208,44 +207,24 @@ class GoodsController extends BaseController
         $goodsInfo = GoodsClass::getGoodsInfo($id, $shop, $this->custom, []);
         $priceType = $goodsInfo['priceType'] ?? 0;
         if ($priceType == 1) {
-            $newPrice = '¥' . floatval($goodsInfo['price'] ?? 0);
+            $priceText = '¥' . floatval($goodsInfo['price'] ?? 0);
         } else {
-            $newPrice = '面议';
+            $priceText = '面议';
         }
-        $priceBase64 = stringUtil::ossBase64($newPrice);
-
-        $name = $goods->name ?? '';
-        $nameBase64 = stringUtil::ossBase64($name);
 
         $staff = $this->shopAdmin;
         $staffName = $staff->name ?? '';
-        $newStaffName = $staffName . ' 为您推荐';
-        $staffNameBase64 = stringUtil::ossBase64($newStaffName);
-
-        $goodsCover = $cover . '?x-oss-process=image/resize,m_fill,h_750,w_750';
-        $goodsCoverBase64 = stringUtil::ossBase64($goodsCover);
-
-        $logoBase64 = '';
-        if (in_array($this->mainId, [52, 1459, 13495])) {
-            $logo = 'poster/hyxh_ncd_logo.png?x-oss-process=image/resize,m_fill,h_90,w_90';
-            if ($this->mainId == 1459) {
-                $logo = 'poster/hyxh_gcd_logo.png?x-oss-process=image/resize,m_fill,h_90,w_90';
-            }
-            if ($this->mainId == 13495) {
-                $logo = 'poster/hyxh_hzd_logo.png?x-oss-process=image/resize,m_fill,h_90,w_90';
-            }
-            $logoBase64 = stringUtil::ossBase64($logo);
-        }
-
-        $url = $prefix . 'poster/1234.jpg?x-oss-process=image';
-        $url .= '/watermark,image_' . $goodsCoverBase64 . ',g_nw,x_0,y_0';
-        $url .= '/watermark,image_' . $miniCodeBase64 . ',g_se';
-        if (!empty($logoBase64)) {
-            $url .= '/watermark,image_' . $logoBase64 . ',g_se,x_65,y_65';
-        }
-        $url .= '/watermark,text_' . $staffNameBase64 . ',g_sw,x_18,y_235,color_8B8989,type_d3F5LW1pY3JvaGVp,size_30';
-        $url .= '/watermark,text_' . $nameBase64 . ',g_sw,x_18,y_145';
-        $url .= '/watermark,text_' . $priceBase64 . ',g_sw,x_18,y_50,color_EE2C2C,type_d3F5LW1pY3JvaGVp,size_50';
+        $staffText = $staffName . ' 为您推荐';
+
+        $url = PosterUtil::buildMallGoodsPosterUrl($prefix, [
+            'cover' => $cover,
+            'miniCode' => $miniCode,
+            'priceText' => $priceText,
+            'name' => $goods->name ?? '',
+            'flowerNum' => (int)($goods->flowerNum ?? 0),
+            'staffText' => $staffText,
+            'mainId' => $this->mainId,
+        ]);
 
         util::success(['imgUrl' => $url]);
     }

+ 13 - 45
app-hd/controllers/ItemController.php

@@ -11,6 +11,7 @@ use bizHd\wx\classes\WxOpenClass;
 use common\components\dict;
 use common\components\imgUtil;
 use common\components\miniUtil;
+use common\components\PosterUtil;
 use common\components\stringUtil;
 use common\components\util;
 use Yii;
@@ -283,6 +284,7 @@ class ItemController extends BaseController
         if (empty($cover)) {
             util::fail('获取失败');
         }
+        $cover = imgUtil::normalizeOssObjectPath($cover);
 
         $merchant = WxOpenClass::getMallWxInfo();
         $page = 'pages/item/detail';
@@ -293,8 +295,6 @@ class ItemController extends BaseController
         $scene = "id=" . $id . '&a=' . $shopId;
         $envVersion = miniUtil::normalizeMiniEnvVersion(Yii::$app->request->get('env_version', 'release'));
         $miniCode = miniUtil::generateUnlimitedMiniCode($merchant, $page, $scene, $ptStyle, $envVersion);
-        $miniCode = $miniCode . '?x-oss-process=image/resize,m_fill,h_200,w_200';
-        $miniCodeBase64 = stringUtil::ossBase64($miniCode);
 
         Yii::$app->params['ptStyle'] = dict::getDict('ptStyle', 'hd');
 
@@ -305,51 +305,19 @@ class ItemController extends BaseController
         $addPriceMap = \bizGhs\custom\classes\CustomClass::$levelAddPriceKeyMap;
         $price = \bizGhs\product\classes\ProductClass::getFinalPrice($item, $level, $priceMap, $addPriceMap);
 
-        $newPrice = '¥' . floatval($price);
-        $priceBase64 = stringUtil::ossBase64($newPrice);
-
-        $name = $item->name ?? '';
-        $nameBase64 = stringUtil::ossBase64($name);
-
         $staff = $this->shopAdmin;
         $staffName = $staff->name ?? '';
-        $newStaffName = $staffName . ' 为您推荐';
-        $staffNameBase64 = stringUtil::ossBase64($newStaffName);
-
-        //花材主图
-        $itemCover = $cover . '?x-oss-process=image/resize,m_fill,h_750,w_750';
-        $itemCoverBase64 = stringUtil::ossBase64($itemCover);
-
-        $logoBase64 = '';
-        if (in_array($this->mainId, [52, 1459, 13495])) {
-            $logo = 'poster/hyxh_ncd_logo.png?x-oss-process=image/resize,m_fill,h_90,w_90';
-            if ($this->mainId == 1459) {
-                $logo = 'poster/hyxh_gcd_logo.png?x-oss-process=image/resize,m_fill,h_90,w_90';
-            }
-            if ($this->mainId == 13495) {
-                $logo = 'poster/hyxh_hzd_logo.png?x-oss-process=image/resize,m_fill,h_90,w_90';
-            }
-            $logoBase64 = stringUtil::ossBase64($logo);
-        }
-
-        $url = $prefix . 'poster/1234.jpg?x-oss-process=image';
-        //花材主图
-        $url .= '/watermark,image_' . $itemCoverBase64 . ',g_nw,x_0,y_0';
-        //小程序码
-        $url .= '/watermark,image_' . $miniCodeBase64 . ',g_se';
-        if (!empty($logoBase64)) {
-            //logo
-            $url .= '/watermark,image_' . $logoBase64 . ',g_se,x_65,y_65';
-        }
-        //为你推荐
-        $url .= '/watermark,text_' . $staffNameBase64 . ',g_sw,x_18,y_235,color_8B8989,type_d3F5LW1pY3JvaGVp,size_30';
-        //标题
-        $url .= '/watermark,text_' . $nameBase64 . ',g_sw,x_18,y_145';
-        //价格
-        $url .= '/watermark,text_' . $priceBase64 . ',g_sw,x_18,y_50,color_EE2C2C,type_d3F5LW1pY3JvaGVp,size_50';
-
-        $respond = ['imgUrl' => $url];
-        util::success($respond);
+
+        $url = PosterUtil::buildMallItemPosterUrl($prefix, [
+            'cover' => $cover,
+            'miniCode' => $miniCode,
+            'priceText' => '¥' . floatval($price),
+            'name' => $item->name ?? '',
+            'staffText' => $staffName . ' 为您推荐',
+            'mainId' => $this->mainId,
+        ]);
+
+        util::success(['imgUrl' => $url]);
     }
 
     //获取花材描述

+ 115 - 0
common/components/PosterUtil.php

@@ -0,0 +1,115 @@
+<?php
+
+namespace common\components;
+
+/**
+ * 散客分享海报(OSS 图片水印合成)
+ */
+class PosterUtil
+{
+    const BASE_TEMPLATE = 'poster/1234.jpg';
+
+    const FONT = 'd3F5LW1pY3JvaGVp';
+
+    /**
+     * 海报标题过长时截断,避免压住底部文案区
+     */
+    public static function truncateText($text, $maxLen = 14)
+    {
+        $text = trim((string)$text);
+        if ($text === '') {
+            return '';
+        }
+        if (mb_strlen($text, 'UTF-8') > $maxLen) {
+            return mb_substr($text, 0, $maxLen, 'UTF-8') . '…';
+        }
+        return $text;
+    }
+
+    /**
+     * 和炫鲜花等门店角标
+     */
+    public static function buildHyxhLogoWatermark($mainId)
+    {
+        if (!in_array((int)$mainId, [52, 1459, 13495], true)) {
+            return '';
+        }
+        $logo = 'poster/hyxh_ncd_logo.png?x-oss-process=image/resize,m_fill,h_72,w_72';
+        if ($mainId == 1459) {
+            $logo = 'poster/hyxh_gcd_logo.png?x-oss-process=image/resize,m_fill,h_72,w_72';
+        }
+        if ($mainId == 13495) {
+            $logo = 'poster/hyxh_hzd_logo.png?x-oss-process=image/resize,m_fill,h_72,w_72';
+        }
+        return stringUtil::ossBase64($logo);
+    }
+
+    /**
+     * 花束海报:主图 m_lfit 保留完整花束,底部价格/标题/扫码区层次更清晰
+     */
+    public static function buildMallGoodsPosterUrl($prefix, array $options)
+    {
+        $cover = $options['cover'] ?? '';
+        $miniCode = $options['miniCode'] ?? '';
+        $priceText = $options['priceText'] ?? '';
+        $name = $options['name'] ?? '';
+        $staffText = $options['staffText'] ?? '';
+        $mainId = (int)($options['mainId'] ?? 0);
+        $flowerNum = (int)($options['flowerNum'] ?? 0);
+
+        $displayName = self::truncateText($name, 14);
+        if ($flowerNum > 0 && $displayName !== '') {
+            $displayName .= ' · ' . $flowerNum . '支';
+        }
+
+        $coverWatermark = $cover . '?x-oss-process=image/resize,m_lfit,h_1020,w_700,limit_0';
+        $qrWatermark = $miniCode . '?x-oss-process=image/resize,m_fill,h_220,w_220';
+
+        $url = $prefix . self::BASE_TEMPLATE . '?x-oss-process=image';
+        $url .= '/watermark,image_' . stringUtil::ossBase64($coverWatermark) . ',g_north,x_25,y_8';
+        $url .= '/watermark,image_' . stringUtil::ossBase64($qrWatermark) . ',g_se,x_36,y_32';
+
+        $logoB64 = self::buildHyxhLogoWatermark($mainId);
+        if ($logoB64 !== '') {
+            $url .= '/watermark,image_' . $logoB64 . ',g_se,x_210,y_48';
+        }
+
+        $url .= '/watermark,text_' . stringUtil::ossBase64($priceText) . ',g_sw,x_24,y_32,color_EE2C2C,type_' . self::FONT . ',size_56';
+        $url .= '/watermark,text_' . stringUtil::ossBase64($displayName) . ',g_sw,x_24,y_102,color_333333,type_' . self::FONT . ',size_36';
+        $url .= '/watermark,text_' . stringUtil::ossBase64($staffText) . ',g_sw,x_24,y_148,color_999999,type_' . self::FONT . ',size_26';
+        $url .= '/watermark,text_' . stringUtil::ossBase64('微信扫码下单') . ',g_se,x_44,y_292,color_888888,type_' . self::FONT . ',size_24';
+
+        return $url;
+    }
+
+    /**
+     * 花材海报:方图裁切,保持原有布局
+     */
+    public static function buildMallItemPosterUrl($prefix, array $options)
+    {
+        $cover = $options['cover'] ?? '';
+        $miniCode = $options['miniCode'] ?? '';
+        $priceText = $options['priceText'] ?? '';
+        $name = $options['name'] ?? '';
+        $staffText = $options['staffText'] ?? '';
+        $mainId = (int)($options['mainId'] ?? 0);
+
+        $coverWatermark = $cover . '?x-oss-process=image/resize,m_fill,h_750,w_750';
+        $qrWatermark = $miniCode . '?x-oss-process=image/resize,m_fill,h_200,w_200';
+
+        $url = $prefix . self::BASE_TEMPLATE . '?x-oss-process=image';
+        $url .= '/watermark,image_' . stringUtil::ossBase64($coverWatermark) . ',g_nw,x_0,y_0';
+        $url .= '/watermark,image_' . stringUtil::ossBase64($qrWatermark) . ',g_se';
+
+        $logoB64 = self::buildHyxhLogoWatermark($mainId);
+        if ($logoB64 !== '') {
+            $url .= '/watermark,image_' . $logoB64 . ',g_se,x_65,y_65';
+        }
+
+        $url .= '/watermark,text_' . stringUtil::ossBase64($staffText) . ',g_sw,x_18,y_235,color_8B8989,type_' . self::FONT . ',size_30';
+        $url .= '/watermark,text_' . stringUtil::ossBase64(self::truncateText($name, 16)) . ',g_sw,x_18,y_145';
+        $url .= '/watermark,text_' . stringUtil::ossBase64($priceText) . ',g_sw,x_18,y_50,color_EE2C2C,type_' . self::FONT . ',size_50';
+
+        return $url;
+    }
+}