Tigshop开源商城 分销推广海报后端怎么合成?带二维码的那种(附代码)

Tigshop开源商城 分销推广海报后端怎么合成?带二维码的那种(附代码) 分销这套做着做着又追加进来一条需求分销员要能生成带自己专属二维码的商品海报发朋友圈那种别人扫码进来买就算他的业绩。这功能在 tigshop 里也是 Pro 的官网推广海报标着 (Pro)开源版没有。海报合成本身不复杂就是底图 商品图 二维码 文字四层叠一起。PHP 用 GD 或者 Intervention Image 都行我用 Intervention代码干净点。按生成流程一步步走。装库tigshop 是 composer 项目直接加依赖别手动塞 vendorcdphpcomposerrequire intervention/imagecomposerrequire endroid/qr-code生成分销员专属二维码二维码里带上分销员 id扫码进小程序或 H5 时能识别是谁推广的参数拼进落地页 URL?phpnamespaceapp\service\front\salesman;useEndroid\QrCode\QrCode;useEndroid\QrCode\Writer\PngWriter;classPosterService{// 生成带分销员标识的二维码返回本地临时路径privatefunctionmakeQrcode(int$salesmanId,int$productId):string{$urlsprintf(https://你的域名/mobile/#/pages/product/detail?id%dsid%d,$productId,$salesmanId);$result(newPngWriter())-write(QrCode::create($url)-setSize(180));$pathruntime_path().poster/qr_.$salesmanId._.$productId..png;$result-saveToFile($path);return$path;}}四层叠图底图放一张固定模板到public/static/poster_bg.png商品主图从product表拿二维码用上一步的文字写价格和标题。注意商品字段名售价列是product_price图叫pic_url别写成priceuseIntervention\Image\ImageManager;useIntervention\Image\Drivers\Gd\Driver;publicfunctiongenerate(int$salesmanId,int$productId):string{$managernewImageManager(newDriver());// 1) 底图$poster$manager-read(public_path().static/poster_bg.png);// 2) 商品主图缩放后贴到顶部$product\app\model\product\Product::field(product_name,pic_url,product_price)-find($productId);$cover$manager-read($product-pic_url)-resize(600,600);$poster-place($cover,top-left,40,40);// 3) 二维码贴右下角$qr$manager-read($this-makeQrcode($salesmanId,$productId));$poster-place($qr,bottom-right,40,40);// 4) 文字标题 价格$poster-text($product-product_name,60,700,function($font){$font-file(public_path().static/fonts/SourceHan.ttf);$font-size(32);$font-color(#333333);});$poster-text(.$product-product_price,60,760,function($font){$font-file(public_path().static/fonts/SourceHan.ttf);$font-size(40);$font-color(#e4393c);});// 存到 public也可以直接推 OSS$saveposter/.$salesmanId._.$productId._.time()..png;$poster-save(public_path().$save);return/.$save;}字体一定要带一个中文 ttf 进去。GD 默认字体打中文是乱码这个坑我踩过排查了半天才发现是字体的事。给 C 端一个接口照 tigshop 的 controller 风格挂在 user 分组下当前登录用户换算出他对应的分销员 id?phpnamespaceapp\api\controller\user;useapp\api\IndexBaseController;useapp\service\front\salesman\PosterService;usethink\App;usethink\Response;classPosterextendsIndexBaseController{protectedPosterService$service;publicfunction__construct(App$app,PosterService$service){parent::__construct($app);$this-service$service;}publicfunctionproduct():Response{$this-checkLogin();$productId$this-request-all(product_id/d,0);$salesman\app\model\salesman\Salesman::where(user_id,request()-userId)-find();if(!$salesman)return$this-error(你还不是分销员);$url$this-service-generate($salesman-salesman_id,$productId);return$this-success([poster_url$url]);}}路由Route::group(poster,function(){Route::get(product,user.poster/product);})-middleware([\app\api\middleware\CheckLogin::class]);前端展示 保存Uniapp 拿到 URL 直接显示长按保存script setup langts import request from /utils/request const poster ref() async function gen(productId: number) { poster.value (await request.get(/api/user/poster/product, { product_id: productId })).data.poster_url } /script template image v-ifposter :srcposter show-menu-by-longpress modewidthFix / /template合成量大了怎么办同一个分销员同一个商品海报别每次都现合成。加个 Redis key 判断存在就直接返回旧图省 CPU。合成量再大就扔队列异步跑tigshop 本身支持 redis 队列别卡在同步请求里让用户干等。到这分销员发圈的海报就齐活了配上返佣记录一套轻量分销就凑出来了。要做完整的推广素材体系还是得上 Pro但这个需求下上面这些跑起来没问题。