ShareService.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. <?php
  2. namespace app\common\Service\Share;
  3. use think\Model;
  4. use app\common\model\user\Share as ShareModel;
  5. use app\common\model\User as UserModel;
  6. use app\common\model\Goods as GoodsModel;
  7. use app\common\Enum\ShareEnum;
  8. use app\common\Enum\PageTypeEnum;
  9. class ShareService
  10. {
  11. /**
  12. * 添加分享记录
  13. * @param object $user 当前用户对象
  14. * @param array $params 分享参数
  15. * @return mixed
  16. */
  17. public static function addShareLog($user, $params)
  18. {
  19. // 错误的分享参数
  20. if (empty($params['spm'])) {
  21. return false;
  22. }
  23. // 解析spm参数: shareId.page.query.platform.from
  24. $spmParts = explode('.', $params['spm']);
  25. if (count($spmParts) < 5) {
  26. return false;
  27. }
  28. list($shareId, $pageType, $query, $platform, $from) = $spmParts;
  29. // 分享用户为空
  30. if ($shareId <= 0) {
  31. return false;
  32. }
  33. // 不能分享给本人
  34. if ($shareId == $user->id) {
  35. return false;
  36. }
  37. // 新用户不能分享给老用户 按需打开
  38. // if($user->id < $shareId) {
  39. // return false;
  40. // }
  41. $shareUser = UserModel::where('id', $shareId)->find();
  42. // 分享人不存在
  43. if (!$shareUser) {
  44. return false;
  45. }
  46. // 5分钟内相同的分享信息不保存,防止冗余数据
  47. $lastShareLog = ShareModel::where([
  48. 'user_id' => $user->id
  49. ])->where('createtime', '>', time() - 300)->order('id desc')->find();
  50. if ($lastShareLog && $lastShareLog->spm === $params['spm']) {
  51. return $lastShareLog;
  52. }
  53. // 根据页面类型构造页面路径和描述
  54. $pageInfo = self::getPageInfo($pageType, $query);
  55. $memoText = '通过' . ShareEnum::getFromText($params['from']) . '访问了' . $pageInfo['description'];
  56. $ext = [
  57. 'image' => $pageInfo['image'] ?? "",
  58. 'memo' => $memoText
  59. ];
  60. $shareInfo = ShareModel::create([
  61. 'user_id' => $user->id,
  62. 'share_id' => $shareId,
  63. 'spm' => $params['spm'],
  64. 'page' => $pageInfo['path'],
  65. 'query' => $query,
  66. 'platform' => $params['platform'],
  67. 'from' => $params['from'],
  68. 'ext' => $ext
  69. ]);
  70. $data = ['shareInfo' => $shareInfo];
  71. \think\Hook::listen('user_share_after', $data);
  72. return $shareInfo;
  73. }
  74. /**
  75. * 根据页面类型获取页面信息
  76. * @param int $pageType 页面类型
  77. * @param string $query 查询参数
  78. * @return array
  79. */
  80. private static function getPageInfo($pageType, $query)
  81. {
  82. $pageInfo = [
  83. 'path' => '',
  84. 'description' => '',
  85. 'image' => ''
  86. ];
  87. switch ($pageType) {
  88. case PageTypeEnum::HOME:
  89. $pageInfo['path'] = '/pages/index/index';
  90. $pageInfo['description'] = '首页';
  91. break;
  92. case PageTypeEnum::GOODS:
  93. $pageInfo['path'] = '/pages/goods/index';
  94. $pageInfo['description'] = '商品';
  95. $pageInfo = self::appendGoodsInfo($pageInfo, $query);
  96. break;
  97. case PageTypeEnum::GROUP_GOODS:
  98. $pageInfo['path'] = '/pages/goods/groupon';
  99. $pageInfo['description'] = '拼团商品';
  100. $pageInfo = self::appendGoodsInfo($pageInfo, $query);
  101. break;
  102. case PageTypeEnum::SECKILL_GOODS:
  103. $pageInfo['path'] = '/pages/goods/seckill';
  104. $pageInfo['description'] = '秒杀商品';
  105. $pageInfo = self::appendGoodsInfo($pageInfo, $query);
  106. break;
  107. case PageTypeEnum::INVITE_GROUP:
  108. $pageInfo['path'] = '/pages/activity/groupon/detail';
  109. $pageInfo['description'] = '拼团活动';
  110. break;
  111. case PageTypeEnum::AGENT_POSTER:
  112. $pageInfo['path'] = '/pages/agent/poster';
  113. $pageInfo['description'] = '分销海报页';
  114. break;
  115. default:
  116. $pageInfo['path'] = '/pages/index/index';
  117. $pageInfo['description'] = '未知页面';
  118. break;
  119. }
  120. return $pageInfo;
  121. }
  122. /**
  123. * 为商品页面添加商品信息
  124. * @param array $pageInfo 页面信息
  125. * @param string $goodsId 商品ID
  126. * @return array
  127. */
  128. private static function appendGoodsInfo($pageInfo, $goodsId)
  129. {
  130. if (!empty($goodsId)) {
  131. $goods = GoodsModel::find($goodsId);
  132. if ($goods) {
  133. $pageInfo['description'] .= "[{$goods->title}]";
  134. $pageInfo['image'] = $goods->image;
  135. }
  136. }
  137. return $pageInfo;
  138. }
  139. /**
  140. * 解析spm参数
  141. * @param string $spm smp参数
  142. * @return array|false
  143. */
  144. public static function parseSpm($spm)
  145. {
  146. if (empty($spm)) {
  147. return false;
  148. }
  149. $spmParts = explode('.', $spm);
  150. if (count($spmParts) < 5) {
  151. return false;
  152. }
  153. list($shareId, $pageType, $query, $platform, $from) = $spmParts;
  154. return [
  155. 'shareId' => intval($shareId),
  156. 'pageType' => intval($pageType),
  157. 'query' => $query,
  158. 'platform' => intval($platform),
  159. 'from' => intval($from)
  160. ];
  161. }
  162. }