PostersKdHelper.php 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. <?php
  2. /*
  3. * @Description: 宽带海报
  4. * @Version: *
  5. * @Autor: lexuan
  6. * @Date: 2024-11-25 10:14:33
  7. * @LastEditors: lexuan
  8. * @LastEditTime: 2024-11-25 10:14:33
  9. */
  10. namespace App\DataApiNew\Helper;
  11. use App\DataApiNew\Models\AdminUsers;
  12. use App\DataApiNew\Models\PackagesKd as Packages;
  13. use App\DataApiNew\Models\Posters;
  14. use App\Models\Poster;
  15. use Illuminate\Http\Request;
  16. use Intervention\Image\ImageManager;
  17. use Intervention\Image\Typography\FontFactory;
  18. use SimpleSoftwareIO\QrCode\Facades\QrCode;
  19. use Vinkla\Hashids\Facades\Hashids;
  20. class PostersKdHelper
  21. {
  22. // 创建宽带小店海报
  23. public function createShopPosterKd(Request $request)
  24. {
  25. $request->validate([
  26. 'poster_id' => 'required',
  27. ]);
  28. sys_log($request, '创建宽带小店海报', '海报日志');
  29. $user_id = auth()->id();
  30. $poster_id = $request->poster_id;
  31. $qr_code_size = $request->input('qr_code_size', 250); //二维码尺寸
  32. $qr_code_left = $request->input('qr_code_left', 148); //二维码左边距
  33. $qr_code_top = $request->input('qr_code_top', 455); //二维码上边距
  34. $avatar_size = $request->input('avatar_size', 100); //头像尺寸
  35. $avatar_left = $request->input('avatar_left', 130); //头像左边距
  36. $avatar_top = $request->input('avatar_top', 303); //头像上边距
  37. $mini_text_size = $request->input('mini_text_size', 20); //小文字尺寸
  38. $mini_text_left = $request->input('mini_text_left', 74); //小文字左边距
  39. $mini_text_top = $request->input('mini_text_top', 618); //小文字上边距
  40. $mini_text_color = $request->input('mini_text_color', '#fff'); //小文字颜色
  41. $h5_url = "http://saler.test/h5/#/pages/portableWifi/portableWifi/"; // 号卡小店链接
  42. $qr_path = public_path('poster/temp_qrcode/'); // 二维码路径
  43. $qr_file_name = 'temp_poster_shop_' . $user_id . time() . mt_rand(1000, 9999) . '.jpg'; // 二维码文件名
  44. $path = 'poster/smallshop_poster_kd/' . $user_id . '/'; // 海报保存相对路径
  45. $fxuser_path = public_path($path); // 海报保存路径
  46. $fxuser_file_name = 'iotgoods_smallshop_poster_' . $user_id . $poster_id . '.jpg'; // 海报保存文件名
  47. $user_info = AdminUsers::select(['id', 'small_shop_image'])->where('id', $user_id)->first();
  48. $url = $h5_url . "?user_key=" . Hashids::encode($user_info->id);
  49. $poster_info = Posters::select(['id', 'img'])->where('id', $poster_id)->first();
  50. // 生成二维码并保存为图片
  51. UtilsHelper::ensureDirectoryExists($qr_path);
  52. QrCode::format('png')->size($qr_code_size)->margin(1)
  53. ->generate($url, $qr_path . $qr_file_name);
  54. // 选择引擎
  55. $manager = ImageManager::gd();
  56. // 加载网路背景图
  57. $templateImage = $manager->read(file_get_contents($poster_info->img));
  58. // 合并图片
  59. $templateImage->place($qr_path . $qr_file_name, 'top-left', $qr_code_left, $qr_code_top);
  60. // 获取小店头像
  61. if (empty($user_info->small_shop_image) || !UtilsHelper::remoteFileExists($user_info->small_shop_image)) {
  62. $small_shop_image = "http://saler.test/cos_file/small_shop_image/small_shop_image.png";
  63. } else {
  64. $small_shop_image = $user_info->small_shop_image;
  65. }
  66. $filename = basename($small_shop_image); // 获取文件名
  67. $savePath = public_path("poster/temp_small_shop/") . $filename;
  68. UtilsHelper::ensureDirectoryExists(public_path("poster/temp_small_shop/"));
  69. if (!UtilsHelper::downloadImage($small_shop_image, $savePath)) {
  70. return ['code' => 0, 'msg' => "海报生成失败"];
  71. }
  72. UtilsHelper::z_image2circle($savePath, $savePath);
  73. $smallShopImage = $manager->read($savePath);
  74. $smallShopImage->resize($avatar_size, $avatar_size); // 缩放
  75. $templateImage->place($smallShopImage, 'top-left', $avatar_left, $avatar_top);
  76. $templateImage->text(UtilsHelper::truncateString("我的小店"), $mini_text_left, $mini_text_top, function (FontFactory $font) use ($mini_text_size, $mini_text_color) {
  77. $font->filename(public_path('poster/ttf/思源黑体SOURCEHANSANSCN-REGULAR.OTF')); // 指定字体文件的路径
  78. $font->size($mini_text_size); // 设置文本大小,单位是像素
  79. $font->color($mini_text_color); // 设置文本颜色
  80. });
  81. // 保存
  82. UtilsHelper::ensureDirectoryExists($fxuser_path); // 检查路径是否存在
  83. $templateImage->save($fxuser_path . $fxuser_file_name,);
  84. unlink($savePath); // 删除临时海报头像
  85. unlink($qr_path . $qr_file_name); // 删除临时二维码
  86. $TencentCosHelper = new TencentCosHelper();
  87. $result = $TencentCosHelper->uploadFiles($fxuser_path . $fxuser_file_name, "cos_file/" . $path . $fxuser_file_name);
  88. if ($result['code'] != 1) {
  89. return ['code' => 0, 'msg' => "海报生成失败"];
  90. }
  91. unlink($fxuser_path . $fxuser_file_name);
  92. return ['code' => 1, 'msg' => "success", 'data' => $result['data']['path'], 'url' => $url];
  93. }
  94. // 创建宽带套餐海报
  95. public function createPackagePosterKd(Request $request)
  96. {
  97. $request->validate([
  98. 'poster_id' => 'required',
  99. 'package_id' => 'required',
  100. ]);
  101. sys_log($request, '创建号卡套餐海报', '海报日志');
  102. $user_id = auth()->id();
  103. $poster_id = $request->poster_id;
  104. $package_id = $request->package_id;
  105. $package_image_size = $request->input('package_image_size', 340); //主图尺寸
  106. $package_image_left = $request->input('package_image_left', 104); //主图左边距
  107. $package_image_top = $request->input('package_image_top', 172); //主图上边距
  108. $qr_code_size = $request->input('qr_code_size', 124); //二维码尺寸
  109. $qr_code_left = $request->input('qr_code_left', 344); //二维码左边距
  110. $qr_code_top = $request->input('qr_code_top', 668); //二维码上边距
  111. // $title_size = $request->input('title_size', 30); //标题字体大小
  112. // $title_left = $request->input('title_left', 74); //标题左边距
  113. // $title_top = $request->input('title_top', 576); //标题上边距
  114. // $title_color = $request->input('title_color', '#fff'); //标题颜色
  115. $mini_text_size = $request->input('mini_text_size', 20); //小文字字体大小
  116. $mini_text_left = $request->input('mini_text_left', 74); //小文字左边距
  117. $mini_text_top = $request->input('mini_text_top', 618); //小文字上边距
  118. $mini_text_color = $request->input('mini_text_color', '#fff'); //小文字颜色
  119. $h5_url = "http://saler.test/small_shop/#/pages/index/queryDetail"; // H5招募链接
  120. $qr_path = public_path('poster/temp_qrcode/'); // 二维码路径
  121. $qr_file_name = 'temp_poster_package_' . $user_id . time() . mt_rand(1000, 9999) . '.jpg'; // 二维码文件名
  122. $path = 'poster/package_poster_kd/' . $user_id . '/'; // 海报保存相对路径
  123. $fxuser_path = public_path($path); // 海报保存路径
  124. $fxuser_file_name = 'package_poster_' . $user_id . $poster_id . $package_id . '.jpg'; // 海报保存文件名
  125. $urlParams = http_build_query([
  126. 'user_key' => Hashids::encode($user_id),
  127. 'package_key' => Hashids::encode($package_id),
  128. ]);
  129. $url = $h5_url . "?" . $urlParams; // 分享链接
  130. $packageInfo = Packages::select(['id', 'image', 'mini_text'])->where('id', $package_id)->first();
  131. $poster_info = Posters::select(['id', 'img'])->where('id', $poster_id)->first();
  132. // 生成二维码并保存为图片
  133. UtilsHelper::ensureDirectoryExists($qr_path);
  134. QrCode::format('png')->size($qr_code_size)->margin(1)->generate($url, $qr_path . $qr_file_name);
  135. // 选择引擎
  136. $manager = ImageManager::gd();
  137. // 加载网路背景图
  138. $templateImage = $manager->read(file_get_contents($poster_info->img));
  139. // 合并二维码
  140. $templateImage->place($qr_path . $qr_file_name, 'top-left', $qr_code_left, $qr_code_top);
  141. // 加载套餐图
  142. $packageImage = $manager->read(file_get_contents($packageInfo->image));
  143. // 缩放套餐图
  144. $packageImage->scale($package_image_size);
  145. // 合并套餐图
  146. $templateImage->place($packageImage, 'top-left', $package_image_left, $package_image_top);
  147. // 合并文字
  148. $templateImage->text(UtilsHelper::truncateString($packageInfo->mini_text), $mini_text_left, $mini_text_top, function (FontFactory $font) use ($mini_text_size, $mini_text_color) {
  149. $font->filename(public_path('poster/ttf/思源黑体SOURCEHANSANSCN-REGULAR.OTF')); // 指定字体文件的路径
  150. $font->size($mini_text_size); // 设置文本大小,单位是像素
  151. $font->color($mini_text_color); // 设置文本颜色
  152. });
  153. // 保存
  154. UtilsHelper::ensureDirectoryExists($fxuser_path); // 检查路径是否存在
  155. $templateImage->save($fxuser_path . $fxuser_file_name,);
  156. unlink($qr_path . $qr_file_name); // 删除临时二维码
  157. $TencentCosHelper = new TencentCosHelper();
  158. $result = $TencentCosHelper->uploadFiles($fxuser_path . $fxuser_file_name, "cos_file/" . $path . $fxuser_file_name);
  159. if ($result['code'] != 1) {
  160. return ['code' => 0, 'msg' => "海报生成失败"];
  161. }
  162. unlink($fxuser_path . $fxuser_file_name);
  163. return ['code' => 1, 'msg' => "success", 'data' => $result['data']['path'], 'url' => $url];
  164. }
  165. }