|
@@ -13,32 +13,24 @@ class ShareService
|
|
{
|
|
{
|
|
/**
|
|
/**
|
|
* 添加分享记录
|
|
* 添加分享记录
|
|
- * @param object $user 当前用户对象
|
|
|
|
|
|
+ * @param int $userId 当前用户ID
|
|
* @param array $params 分享参数
|
|
* @param array $params 分享参数
|
|
* @return mixed
|
|
* @return mixed
|
|
*/
|
|
*/
|
|
- public static function addShareLog($user, $params)
|
|
|
|
|
|
+ public static function addShareLog($userId = 0, $params)
|
|
{
|
|
{
|
|
// 错误的分享参数
|
|
// 错误的分享参数
|
|
if (empty($params['spm'])) {
|
|
if (empty($params['spm'])) {
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
-
|
|
|
|
- // 解析spm参数: shareId.page.query.platform.from
|
|
|
|
- $spmParts = explode('.', $params['spm']);
|
|
|
|
- if (count($spmParts) < 5) {
|
|
|
|
- return false;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- list($shareId, $pageType, $query, $platform, $from) = $spmParts;
|
|
|
|
-
|
|
|
|
|
|
+ $shareId = $params['shareId'];
|
|
// 分享用户为空
|
|
// 分享用户为空
|
|
if ($shareId <= 0) {
|
|
if ($shareId <= 0) {
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
// 不能分享给本人
|
|
// 不能分享给本人
|
|
- if ($shareId == $user->id) {
|
|
|
|
|
|
+ if ($shareId == $userId) {
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -55,7 +47,7 @@ class ShareService
|
|
|
|
|
|
// 5分钟内相同的分享信息不保存,防止冗余数据
|
|
// 5分钟内相同的分享信息不保存,防止冗余数据
|
|
$lastShareLog = ShareModel::where([
|
|
$lastShareLog = ShareModel::where([
|
|
- 'user_id' => $user->id
|
|
|
|
|
|
+ 'user_id' => $userId
|
|
])->where('createtime', '>', time() - 300)->order('id desc')->find();
|
|
])->where('createtime', '>', time() - 300)->order('id desc')->find();
|
|
|
|
|
|
if ($lastShareLog && $lastShareLog->spm === $params['spm']) {
|
|
if ($lastShareLog && $lastShareLog->spm === $params['spm']) {
|
|
@@ -63,7 +55,7 @@ class ShareService
|
|
}
|
|
}
|
|
|
|
|
|
// 根据页面类型构造页面路径和描述
|
|
// 根据页面类型构造页面路径和描述
|
|
- $pageInfo = self::getPageInfo($pageType, $query);
|
|
|
|
|
|
+ $pageInfo = self::getPageInfo($params['page'], $params['query'], $shareUser);
|
|
|
|
|
|
$memoText = '通过' . ShareEnum::getFromText($params['from']) . '访问了' . $pageInfo['description'];
|
|
$memoText = '通过' . ShareEnum::getFromText($params['from']) . '访问了' . $pageInfo['description'];
|
|
|
|
|
|
@@ -73,17 +65,18 @@ class ShareService
|
|
];
|
|
];
|
|
|
|
|
|
$shareInfo = ShareModel::create([
|
|
$shareInfo = ShareModel::create([
|
|
- 'user_id' => $user->id,
|
|
|
|
|
|
+ 'user_id' => $userId,
|
|
'share_id' => $shareId,
|
|
'share_id' => $shareId,
|
|
'spm' => $params['spm'],
|
|
'spm' => $params['spm'],
|
|
'page' => $pageInfo['path'],
|
|
'page' => $pageInfo['path'],
|
|
- 'query' => $query,
|
|
|
|
|
|
+ 'query' => $params['query'],
|
|
'platform' => $params['platform'],
|
|
'platform' => $params['platform'],
|
|
'from' => $params['from'],
|
|
'from' => $params['from'],
|
|
'ext' => $ext
|
|
'ext' => $ext
|
|
]);
|
|
]);
|
|
|
|
|
|
$data = ['shareInfo' => $shareInfo];
|
|
$data = ['shareInfo' => $shareInfo];
|
|
|
|
+
|
|
\think\Hook::listen('user_share_after', $data);
|
|
\think\Hook::listen('user_share_after', $data);
|
|
|
|
|
|
return $shareInfo;
|
|
return $shareInfo;
|
|
@@ -93,9 +86,10 @@ class ShareService
|
|
* 根据页面类型获取页面信息
|
|
* 根据页面类型获取页面信息
|
|
* @param int $pageType 页面类型
|
|
* @param int $pageType 页面类型
|
|
* @param string $query 查询参数
|
|
* @param string $query 查询参数
|
|
|
|
+ * @param object $shareUser 分享者用户对象(可选)
|
|
* @return array
|
|
* @return array
|
|
*/
|
|
*/
|
|
- private static function getPageInfo($pageType, $query)
|
|
|
|
|
|
+ private static function getPageInfo($pageType, $query, $shareUser = null)
|
|
{
|
|
{
|
|
$pageInfo = [
|
|
$pageInfo = [
|
|
'path' => '',
|
|
'path' => '',
|
|
@@ -134,7 +128,11 @@ class ShareService
|
|
|
|
|
|
case PageTypeEnum::AGENT_POSTER:
|
|
case PageTypeEnum::AGENT_POSTER:
|
|
$pageInfo['path'] = '/pages/agent/poster';
|
|
$pageInfo['path'] = '/pages/agent/poster';
|
|
- $pageInfo['description'] = '分销海报页';
|
|
|
|
|
|
+ if ($shareUser) {
|
|
|
|
+ $pageInfo['description'] = $shareUser->nickname . '的分销海报页';
|
|
|
|
+ } else {
|
|
|
|
+ $pageInfo['description'] = '分销海报页';
|
|
|
|
+ }
|
|
break;
|
|
break;
|
|
|
|
|
|
default:
|
|
default:
|
|
@@ -191,4 +189,83 @@ class ShareService
|
|
'from' => intval($from)
|
|
'from' => intval($from)
|
|
];
|
|
];
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 获取用户的分享记录列表
|
|
|
|
+ * @param int $userId 用户ID
|
|
|
|
+ * @param int $pageSize 每页数量
|
|
|
|
+ * @param string $type 记录类型:shared(我分享的) | received(我收到的分享)
|
|
|
|
+ * @return mixed
|
|
|
|
+ */
|
|
|
|
+ public static function getUserShareLogs($userId, $pageSize = 8, $type = 'received')
|
|
|
|
+ {
|
|
|
|
+ $query = ShareModel::with(['user' => function ($query) {
|
|
|
|
+ return $query->field(['id', 'nickname', 'avatar']);
|
|
|
|
+ }]);
|
|
|
|
+
|
|
|
|
+ // 根据类型设置查询条件
|
|
|
|
+ if ($type === 'shared') {
|
|
|
|
+ // 查看我分享的记录(我作为分享者)
|
|
|
|
+ $query->where('share_id', $userId);
|
|
|
|
+ } else {
|
|
|
|
+ // 查看我收到的分享记录(我作为被分享者)
|
|
|
|
+ $query->where('user_id', $userId);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ $logs = $query->order('createtime desc')
|
|
|
|
+ ->paginate($pageSize);
|
|
|
|
+
|
|
|
|
+ return $logs;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 获取用户分享统计数据
|
|
|
|
+ * @param int $userId 用户ID
|
|
|
|
+ * @return array
|
|
|
|
+ */
|
|
|
|
+ public static function getUserShareStats($userId)
|
|
|
|
+ {
|
|
|
|
+ return [
|
|
|
|
+ 'shared_count' => ShareModel::where('share_id', $userId)->count(), // 我分享的次数
|
|
|
|
+ 'received_count' => ShareModel::where('user_id', $userId)->count(), // 收到的分享次数
|
|
|
|
+ 'today_shared' => ShareModel::where('share_id', $userId)
|
|
|
|
+ ->whereTime('createtime', 'today')
|
|
|
|
+ ->count(), // 今日分享次数
|
|
|
|
+ 'today_received' => ShareModel::where('user_id', $userId)
|
|
|
|
+ ->whereTime('createtime', 'today')
|
|
|
|
+ ->count(), // 今日收到分享次数
|
|
|
|
+ ];
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 获取分享记录详情
|
|
|
|
+ * @param int $shareLogId 分享记录ID
|
|
|
|
+ * @param int $userId 当前用户ID(用于权限验证)
|
|
|
|
+ * @return mixed
|
|
|
|
+ */
|
|
|
|
+ public static function getShareLogDetail($shareLogId, $userId = 0)
|
|
|
|
+ {
|
|
|
|
+ $query = ShareModel::with(['user']);
|
|
|
|
+
|
|
|
|
+ // 如果指定了用户ID,则验证权限(只能查看自己相关的记录)
|
|
|
|
+ if ($userId > 0) {
|
|
|
|
+ $query->where(function($query) use ($userId) {
|
|
|
|
+ $query->whereOr('user_id', $userId)
|
|
|
|
+ ->whereOr('share_id', $userId);
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ $shareLog = $query->where('id', $shareLogId)->find();
|
|
|
|
+
|
|
|
|
+ if ($shareLog) {
|
|
|
|
+ // 解析SPM参数
|
|
|
|
+ $spmInfo = self::parseSpm($shareLog->spm);
|
|
|
|
+ if ($spmInfo) {
|
|
|
|
+ $shareLog->spm_info = $spmInfo;
|
|
|
|
+ $shareLog->page_type_text = PageTypeEnum::getPageTypeText($spmInfo['pageType']);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return $shareLog;
|
|
|
|
+ }
|
|
}
|
|
}
|