PosterController.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. <?php
  2. namespace app\frontend\modules\member\controllers;
  3. use app\common\components\ApiController;
  4. use app\common\facades\Setting;
  5. use app\common\helpers\ImageHelper;
  6. use app\common\services\Utils;
  7. use app\frontend\models\Member;
  8. use app\frontend\modules\member\models\MemberModel;
  9. use Yunshop\Poster\models\Poster;
  10. use Yunshop\Poster\models\PosterRecord;
  11. use Yunshop\Poster\services\CreatePosterService;
  12. class PosterController extends ApiController
  13. {
  14. protected $type;
  15. protected $uid;
  16. /**
  17. * 生成海报接口(新旧)
  18. * @return \Illuminate\Http\JsonResponse
  19. */
  20. public function index()
  21. {
  22. $this->type = intval(request()->type);
  23. $this->uid = \YunShop::app()->getMemberId();
  24. $imageRes = $this->getPoster();
  25. if ($imageRes == false) {
  26. return $this->successJson('成功', [
  27. 'image_url' => ''
  28. ]);
  29. }
  30. $this->exist_record($imageRes);
  31. $imageUrl = $imageRes['file_path'];
  32. return $this->successJson('成功', [
  33. 'image_url' => $imageUrl
  34. ]);
  35. }
  36. //判断海报记录是否存在
  37. private function exist_record($imageRes)
  38. {
  39. $image_url = $imageRes['file_path'];
  40. if (!$image_url) {
  41. return false;
  42. }
  43. if (\YunShop::plugin()->get('new-poster') && $imageRes['type'] == 1) {
  44. //如果会员第一次生成海报就写入记录表
  45. $posterModel = \Yunshop\NewPoster\models\Poster::getCenterShowPoster($this->type);
  46. if (!$posterModel) {
  47. return false;
  48. }
  49. $poster_record = \Yunshop\NewPoster\models\PosterRecord::where([
  50. 'poster_type' => $posterModel->poster_type,
  51. 'url' => $image_url,
  52. ])->orderBy('id', 'desc')->first();
  53. if ($poster_record) {
  54. $poster_record->url = $image_url;
  55. $poster_record->save();
  56. } else {
  57. $data = [
  58. 'url' => $image_url,
  59. 'poster_id' => $posterModel->id,
  60. 'member_id' => $this->uid,
  61. 'poster_type' => $posterModel->poster_type,
  62. 'created_at' => time(),
  63. ];
  64. \Yunshop\NewPoster\models\PosterRecord::create($data);
  65. }
  66. return true;
  67. }
  68. if (\YunShop::plugin()->get('poster') && $imageRes['type'] == 2) {
  69. //如果会员第一次生成海报就写入记录表
  70. $posterModel = Poster::uniacid()->select('id')->where('center_show', 1)->first();
  71. if (!$posterModel) {
  72. return false;
  73. }
  74. $poster_record = PosterRecord::where(['url'=>$image_url])->orderBy('id', 'desc')->first();
  75. if ($poster_record) {
  76. $poster_record->url = $image_url;
  77. $poster_record->save();
  78. } else {
  79. $data = [
  80. 'url' => $image_url,
  81. 'poster_id' => $posterModel->id,
  82. 'member_id' => $this->uid,
  83. 'created_at' => time(),
  84. ];
  85. PosterRecord::create($data);
  86. }
  87. }
  88. return true;
  89. }
  90. //会员中心推广二维码(包含会员是否有生成海报权限)
  91. private function getPoster()
  92. {
  93. $is_agent = Member::current()->yzMember->is_agent;
  94. if (\YunShop::plugin()->get('new-poster')) {
  95. $posterModel = \Yunshop\NewPoster\models\Poster::uniacid()->select(['id','is_open','poster_type'])
  96. ->whereRaw('FIND_IN_SET('.$this->type.',center_show)')
  97. ->first();
  98. if ($posterModel) {
  99. if ($posterModel->is_open || (!$posterModel->is_open && $is_agent)) {
  100. $file_path = (new \Yunshop\NewPoster\services\CreatePosterService(
  101. \YunShop::app()->getMemberId(),
  102. $posterModel->id,
  103. $posterModel->poster_type)
  104. )->getMemberPosterPath();
  105. if (!$file_path) {
  106. return false;
  107. }
  108. return [
  109. 'type' => 1,
  110. 'file_path' => ImageHelper::getImageUrl($file_path),
  111. ];
  112. }
  113. }
  114. }
  115. if (\YunShop::plugin()->get('poster')) {
  116. if (\Schema::hasColumn('yz_poster', 'center_show')) {
  117. $posterModel = Poster::uniacid()->select('id', 'is_open')->where('center_show', 1)->first();
  118. if ($posterModel) {
  119. if ($posterModel->is_open || (!$posterModel->is_open && $is_agent)) {
  120. $file_path = (new CreatePosterService(\YunShop::app()->getMemberId(), $posterModel->id, $this->type))->getMemberPosterPath();
  121. if (!$file_path) {
  122. return false;
  123. }
  124. return [
  125. 'type' => 2,
  126. 'file_path' => ImageHelper::getImageUrl($file_path),
  127. ];
  128. }
  129. }
  130. }
  131. }
  132. return [
  133. 'type' => 3,
  134. 'file_path' => $this->createPoster(),
  135. ];
  136. }
  137. //生成默认海报
  138. private function createPoster()
  139. {
  140. $width = 320;
  141. $height = 540;
  142. $logo_width = 40;
  143. $logo_height = 40;
  144. $font_size = 15;
  145. $font_size_show = 20;
  146. $member_id = \YunShop::app()->getMemberId();
  147. $shopInfo = Setting::get('shop.shop');
  148. $shopName = $shopInfo['name'] ?: '商城'; //todo 默认值需要更新
  149. $shopLogo = $shopInfo['logo'] ? replace_yunshop(yz_tomedia($shopInfo['logo'])) : base_path() . '/static/images/logo.png'; //todo 默认值需要更新
  150. $shopImg = $shopInfo['signimg'] ? replace_yunshop(yz_tomedia($shopInfo['signimg'])) : base_path() . '/static/images/photo-mr.jpg'; //todo 默认值需要更新
  151. $str_length = $logo_width + $font_size_show * mb_strlen($shopName);
  152. $space = ($width - $str_length) / 2;
  153. $uniacid = \YunShop::app()->uniacid;
  154. $path = storage_path('app/public/personalposter/' . $uniacid);
  155. Utils::mkdirs($path);
  156. $md5 = md5($member_id . $shopInfo['name'] . $shopInfo['logo'] . $shopInfo['signimg'] . $this->type . '2'); //用于标识组成元素是否有变化
  157. $extend = '.png';
  158. $file = $md5 . $extend;
  159. if (!file_exists($path . '/' . $file)) {
  160. $targetImg = imagecreatetruecolor($width, $height);
  161. $white = imagecolorallocate($targetImg, 255, 255, 255);
  162. imagefill($targetImg, 0, 0, $white);
  163. $imgSource = imagecreatefromstring(\Curl::to($shopImg)->get());
  164. $logoSource = imagecreatefromstring(\Curl::to($shopLogo)->get());
  165. if (2 == $this->type and request()->input('ingress') == 'weChatApplet') {
  166. $qrcode = MemberModel::getWxacode();
  167. $qrSource = imagecreatefromstring(\Curl::to($qrcode)->get());
  168. } else {
  169. $qrcode = MemberModel::getAgentQR();
  170. $qrSource = imagecreatefromstring(\Curl::to($qrcode)->get());
  171. }
  172. $fingerPrintImg = imagecreatefromstring(file_get_contents($this->getImgUrl('ewm.png')));
  173. $mergeData = [
  174. 'dst_left' => $space,
  175. 'dst_top' => 10,
  176. 'dst_width' => $logo_width,
  177. 'dst_height' => $logo_height,
  178. ];
  179. self::mergeImage($targetImg, $logoSource, $mergeData); //合并商城logo图片
  180. $mergeData = [
  181. 'size' => $font_size,
  182. 'left' => $space + $logo_width + 10,
  183. 'top' => 37,
  184. ];
  185. self::mergeText($targetImg, $shopName, $mergeData);//合并商城名称(文字)
  186. $mergeData = [
  187. 'dst_left' => 0,
  188. 'dst_top' => 60,
  189. 'dst_width' => 320,
  190. 'dst_height' => 320,
  191. ];
  192. self::mergeImage($targetImg, $imgSource, $mergeData); //合并商城海报图片
  193. $mergeData = [
  194. 'dst_left' => 0,
  195. 'dst_top' => 380,
  196. 'dst_width' => 160,
  197. 'dst_height' => 160,
  198. ];
  199. self::mergeImage($targetImg, $fingerPrintImg, $mergeData); //合并指纹图片
  200. if ($this->type == 2) {
  201. $mergeData = [
  202. 'dst_left' => 180,
  203. 'dst_top' => 390,
  204. 'dst_width' => 120,
  205. 'dst_height' => 120,
  206. ];
  207. } else {
  208. $mergeData = [
  209. 'dst_left' => 160,
  210. 'dst_top' => 380,
  211. 'dst_width' => 160,
  212. 'dst_height' => 160,
  213. ];
  214. }
  215. self::mergeImage($targetImg, $qrSource, $mergeData); //合并二维码图片
  216. header("Content-Type: image/png");
  217. $imgPath = $path . "/" . $file;
  218. imagepng($targetImg, $imgPath);
  219. }
  220. $file = $path . '/' . $file;
  221. $imgUrl = ImageHelper::getImageUrl($file).'?='.str_random(6);
  222. return $imgUrl;
  223. }
  224. //合并图片并指定图片大小
  225. private static function mergeImage($destinationImg, $sourceImg, $data)
  226. {
  227. $w = imagesx($sourceImg);
  228. $h = imagesy($sourceImg);
  229. imagecopyresized($destinationImg,$sourceImg,$data['dst_left'],$data['dst_top'],0,0,$data['dst_width'],$data['dst_height'],$w,$h);
  230. imagedestroy($sourceImg);
  231. return $destinationImg;
  232. }
  233. //合并字符串
  234. private static function mergeText($destinationImg, $text, $data)
  235. {
  236. $font = base_path() . DIRECTORY_SEPARATOR . "static" . DIRECTORY_SEPARATOR . "fonts" . DIRECTORY_SEPARATOR . "source_han_sans.ttf";
  237. $black = imagecolorallocate($destinationImg, 0, 0, 0);
  238. imagettftext($destinationImg, $data['size'], 0, $data['left'], $data['top'], $black, $font, $text);
  239. return $destinationImg;
  240. }
  241. private function getImgUrl($file){
  242. if (config('app.framework') == 'platform') {
  243. return request()->getSchemeAndHttpHost().'/addons/yun_shop/static/app/images/'.$file;
  244. } else {
  245. return base_path() . '/static/app/images/'.$file;
  246. }
  247. }
  248. }