diff --git a/app/Http/Controllers/Api/UsersController.php b/app/Http/Controllers/Api/UsersController.php index 1527cbb22..97828e166 100755 --- a/app/Http/Controllers/Api/UsersController.php +++ b/app/Http/Controllers/Api/UsersController.php @@ -2835,7 +2835,7 @@ class UsersController extends AbstractController * @apiGroup users * @apiName favorites * - * @apiParam {String} [type] 收藏类型过滤 (task/project/file) + * @apiParam {String} [type] 收藏类型过滤 (task/project/file/message) * @apiParam {Number} [page=1] 页码 * @apiParam {Number} [pagesize=20] 每页数量 * @@ -2852,7 +2852,7 @@ class UsersController extends AbstractController $pageSize = min(intval(Request::input('pagesize', 20)), 100); // // 验证收藏类型 - $allowedTypes = [UserFavorite::TYPE_TASK, UserFavorite::TYPE_PROJECT, UserFavorite::TYPE_FILE]; + $allowedTypes = [UserFavorite::TYPE_TASK, UserFavorite::TYPE_PROJECT, UserFavorite::TYPE_FILE, UserFavorite::TYPE_MESSAGE]; if ($type && !in_array($type, $allowedTypes)) { return Base::retError('无效的收藏类型'); } @@ -2870,7 +2870,7 @@ class UsersController extends AbstractController * @apiGroup users * @apiName favorite__toggle * - * @apiParam {String} type 收藏类型 (task/project/file) + * @apiParam {String} type 收藏类型 (task/project/file/message) * @apiParam {Number} id 收藏对象ID * * @apiSuccess {Number} ret 返回状态码(1正确、0错误) @@ -2889,7 +2889,7 @@ class UsersController extends AbstractController } // // 验证收藏类型 - $allowedTypes = [UserFavorite::TYPE_TASK, UserFavorite::TYPE_PROJECT, UserFavorite::TYPE_FILE]; + $allowedTypes = [UserFavorite::TYPE_TASK, UserFavorite::TYPE_PROJECT, UserFavorite::TYPE_FILE, UserFavorite::TYPE_MESSAGE]; if (!in_array($type, $allowedTypes)) { return Base::retError('无效的收藏类型'); } @@ -2914,6 +2914,12 @@ class UsersController extends AbstractController return Base::retError('文件不存在'); } break; + case UserFavorite::TYPE_MESSAGE: + $object = WebSocketDialogMsg::whereId($id)->first(); + if (!$object) { + return Base::retError('消息不存在'); + } + break; } // $result = UserFavorite::toggleFavorite($user->userid, $type, $id); @@ -2930,7 +2936,7 @@ class UsersController extends AbstractController * @apiGroup users * @apiName favorites__clean * - * @apiParam {String} [type] 收藏类型 (task/project/file),不传则清理全部 + * @apiParam {String} [type] 收藏类型 (task/project/file/message),不传则清理全部 * * @apiSuccess {Number} ret 返回状态码(1正确、0错误) * @apiSuccess {String} msg 返回信息(错误描述) @@ -2944,7 +2950,7 @@ class UsersController extends AbstractController // // 验证收藏类型 if ($type) { - $allowedTypes = [UserFavorite::TYPE_TASK, UserFavorite::TYPE_PROJECT, UserFavorite::TYPE_FILE]; + $allowedTypes = [UserFavorite::TYPE_TASK, UserFavorite::TYPE_PROJECT, UserFavorite::TYPE_FILE, UserFavorite::TYPE_MESSAGE]; if (!in_array($type, $allowedTypes)) { return Base::retError('无效的收藏类型'); } @@ -2964,7 +2970,7 @@ class UsersController extends AbstractController * @apiGroup users * @apiName favorite__check * - * @apiParam {String} type 收藏类型 (task/project/file) + * @apiParam {String} type 收藏类型 (task/project/file/message) * @apiParam {Number} id 收藏对象ID * * @apiSuccess {Number} ret 返回状态码(1正确、0错误) @@ -2983,7 +2989,7 @@ class UsersController extends AbstractController } // // 验证收藏类型 - $allowedTypes = [UserFavorite::TYPE_TASK, UserFavorite::TYPE_PROJECT, UserFavorite::TYPE_FILE]; + $allowedTypes = [UserFavorite::TYPE_TASK, UserFavorite::TYPE_PROJECT, UserFavorite::TYPE_FILE, UserFavorite::TYPE_MESSAGE]; if (!in_array($type, $allowedTypes)) { return Base::retError('无效的收藏类型'); } diff --git a/app/Models/UserFavorite.php b/app/Models/UserFavorite.php index d42eb8530..ed46fe6c5 100644 --- a/app/Models/UserFavorite.php +++ b/app/Models/UserFavorite.php @@ -38,6 +38,7 @@ class UserFavorite extends AbstractModel const TYPE_TASK = 'task'; const TYPE_PROJECT = 'project'; const TYPE_FILE = 'file'; + const TYPE_MESSAGE = 'message'; protected $fillable = [ 'userid', @@ -126,13 +127,15 @@ class UserFavorite extends AbstractModel $data = [ 'tasks' => [], 'projects' => [], - 'files' => [] + 'files' => [], + 'messages' => [] ]; // 分组收集ID $taskIds = []; $projectIds = []; $fileIds = []; + $messageIds = []; foreach ($favorites->items() as $favorite) { switch ($favorite->favoritable_type) { @@ -145,6 +148,9 @@ class UserFavorite extends AbstractModel case self::TYPE_FILE: $fileIds[] = $favorite->favoritable_id; break; + case self::TYPE_MESSAGE: + $messageIds[] = $favorite->favoritable_id; + break; } } @@ -230,6 +236,38 @@ class UserFavorite extends AbstractModel } } + if (!empty($messageIds)) { + $messages = WebSocketDialogMsg::select([ + 'id', 'dialog_id', 'userid', 'type', 'msg', 'created_at' + ])->whereIn('id', $messageIds)->get()->keyBy('id'); + + foreach ($favorites->items() as $favorite) { + if ($favorite->favoritable_type === self::TYPE_MESSAGE && isset($messages[$favorite->favoritable_id])) { + $message = $messages[$favorite->favoritable_id]; + + // 使用 previewTextMsg 获取消息预览文本 + $previewText = ''; + if ($message->msg && is_array($message->msg)) { + $previewText = WebSocketDialogMsg::previewTextMsg($message->msg); + } + + // 如果没有预览文本,使用消息类型作为标题 + if (empty($previewText)) { + $previewText = '[' . ucfirst($message->type) . ']'; + } + + $data['messages'][] = [ + 'id' => $message->id, + 'name' => $previewText, + 'dialog_id' => $message->dialog_id, + 'userid' => $message->userid, + 'type' => $message->type, + 'favorited_at' => Carbon::parse($favorite->created_at)->format('Y-m-d H:i:s'), + ]; + } + } + } + return [ 'data' => $data, 'total' => $favorites->total(), diff --git a/resources/assets/js/pages/manage/components/DialogWrapper.vue b/resources/assets/js/pages/manage/components/DialogWrapper.vue index e2705510d..f3549b123 100644 --- a/resources/assets/js/pages/manage/components/DialogWrapper.vue +++ b/resources/assets/js/pages/manage/components/DialogWrapper.vue @@ -376,6 +376,10 @@ {{ $L(operateItem.tag ? '取消标注' : '标注') }} +