## 目标 - 新用户列表增加:积分余额、资产、道具卡、优惠券、称号、上一次在线时间 - 实时抽奖动态展示:用户 | 活动 | 奖品 - 待办事项改为:未抽奖用户列表 ## 后端改动 ### 新用户列表扩展 `GET /api/admin/dashboard/new_users` - 文件:`internal/api/admin/dashboard_admin.go` - 在 `DashboardNewUsers()` 为每个用户追加: - `couponCount`:`user_coupons` 有效/未使用计数 - `titleCount`:`user_titles` 数量(或仅活跃状态) - `lastOnlineAt`:近似“最后活跃时间”,取多个行为表的最大时间: - `activity_draw_logs.created_at` - `orders.updated_at` 或 `paid_at` - `user_points_ledger.created_at` - `user_item_cards.updated_at` - `user_inventory.updated_at` - 注:当前日志表 `log_request` 未记录 `user_id`,无法精确映射在线时间;后续可优化为日志写入 `user_id` 字段。 - 返回结构:在 `newUserItem` 增加 `couponCount:number`、`titleCount:number`、`lastOnlineAt:string` ### 抽奖动态增强 `GET /api/admin/dashboard/draw_stream` - 已新增字段:`activityName`、`issueNumber`、`prizeName` - 保持现有结构,前端按“用户 | 活动 | 奖品”展示即可(`dynamic-stats.vue` 已适配) ### 待办事项改为未抽奖用户 `GET /api/admin/dashboard/todos` - 文件:`internal/api/admin/dashboard_admin.go` - 原“绑定手机号/加入公会”规则改为: - 查询 `users`,过滤 `NOT EXISTS activity_draw_logs WHERE user_id=users.id` - 返回字段:`userId/nickname/avatar`,`taskType` 固定为 `undrawn`,文案 `taskLabel='从未参与抽奖'` - 保持分页/limit 与安全校验一致 ## 前端改动 ### 新用户模块 `web/admin/src/views/dashboard/console/modules/new-user.vue` - 表格新增列:优惠券数、称号数、上一次在线时间 - 数据源类型:更新 `web/admin/src/api/dashboard.ts` 的 `NewUserItem` 接口,增加上述3字段;`fetchNewUsers` 返回保持一致 ### 抽奖动态 `web/admin/src/views/dashboard/console/modules/dynamic-stats.vue` - 已展示“活动名-期号”和中奖奖品名;文案保持“用户 | 活动 | 奖品”格式 ### 待办事项 `web/admin/src/views/dashboard/console/modules/todo-list.vue` - 调整列表文案与标签:从“绑定手机号/加入公会”改为“从未参与抽奖”的用户清单(调用同名接口) ## 验证 - 后端:`go build ./...` 通过; - 接口验证: - 新用户:`curl -H 'Authorization: ' 'http://localhost:8000/api/admin/dashboard/new_users?page=1&page_size=20'` - 抽奖动态:`curl -H 'Authorization: ' 'http://localhost:8000/api/admin/dashboard/draw_stream?limit=50'` - 待办(未抽奖用户):`curl -H 'Authorization: ' 'http://localhost:8000/api/admin/dashboard/todos?limit=50'` - 前端:工作台“新用户”、“抽奖动态”、“待办事项”模块显示对应数据 ## 后续可选优化 - 在 `log_request` 增加 `user_id` 字段,并在中间件从会话写入;将“上一次在线时间”改为日志精准口径 - 为关联查询增加必要索引以保证统计性能(`activity_draw_logs.user_id/issue_id`、`orders.user_id/status` 等) 确认后我将按上述文件路径逐项实现并联调。