## 目标 - 在运营管理中接入“批量抽奖”并确保对话框正确对接后端接口(含用户搜索、期数选择、执行与验证)。 - 在玩家管理页新增“分配称号”功能:支持搜索玩家、选择系统称号并分配(含有效期与备注)。 ## 改造与新增点 ### 1. 批量抽奖对话框对接 - 位置:`web/admin/src/views/activity/rewards/modules/batch-draw-dialog.vue` - 接口统一由 `@/api/adminActivities` 提供;若需要使用“带效果抽奖”后端路径,保持 URL 不变(后端已在同一路由替换为带效果执行),前端无需改参。 - 校验与交互: - 期数下拉:数据源 `listActivityIssues(activityId)`(已存在)。 - 玩家搜索与选择:数据源 `listAdminUsers(params)`(已存在),保留分页与勾选逻辑。 - 批量执行:`batchDrawForUsers(activityId, issueId, { user_ids })`,展示收据与中奖汇总。 - 结果验证:`verifyDrawReceipt(activityId, issueId, body)` 保持结构一致。 - UI 微调:在结果区增加“效果标识”展示(若收据选中项名称带 `(x2)` 则以标签提示“奖励翻倍”)。 ### 2. 玩家管理页新增“分配称号” - 入口:`web/admin/src/views/player-manage/index.vue` 操作列新增按钮。 - 枚举:`web/admin/src/enums/tableActionEnum.ts` 增加 `ASSIGN_TITLE`,映射中文标签与图标。 - 弹窗组件(新增):`web/admin/src/views/player-manage/modules/assign-title-dialog.vue` - 表单: - 选择系统称号(下拉,数据源:`titlesApi.getList({page,page_size,name,status})`)。 - 可选:有效期(日期时间)、备注(文本)。 - 提交:`titlesApi.assignToUser(userId, { title_id, expires_at?, remark? })`,成功后 toast 并关闭。 - 前端 API(新增):`web/admin/src/api/titles.ts` - `getList(params)` → `GET /api/admin/system_titles`(分页检索)。 - `assignToUser(userId, payload)` → `POST /api/admin/users/:user_id/titles`。 - 玩家搜索集成:保留现有搜索栏 `player-search.vue`;在结果表行的操作列加入“分配称号”按钮,点击打开弹窗并携带当前 `user_id`。 ### 3. 后端路由与处理(需一并落地) - 路由:`internal/router/router.go` - 系统称号:`GET/POST/PUT/DELETE /api/admin/system_titles` - 用户分配称号:`POST /api/admin/users/:user_id/titles` - Handler:`internal/api/admin/titles_admin.go` - 列表、创建、修改、删除系统称号。 - 用户分配:校验头衔存在与启用状态,写入或更新 `user_titles`(保持 `user_id + title_id` 唯一,激活状态与有效期)。 - 复用服务/DAO:`internal/repository/mysql/dao/*` 与 `internal/service/title/effects_resolver.go`(后续用于预览用户生效效果)。 ## 交互与校验 - 分配称号: - 重复分配处理:若用户已持有该称号,则更新 `expires_at`/`remark`/`active`。 - 时间校验:`expires_at` 可空;若传入需晚于当前时间。 - 批量抽奖: - 期数必选、用户列表非空;执行后展示收据与命中明细。 - 收据中的 `(x2)` 标签用于前端提示“奖励翻倍”。 ## 验收与测试 - 前端: - 玩家搜索能正常检索与分页;操作列新增“分配称号”按钮弹窗正常。 - 批量抽奖弹窗从运营管理入口可用,执行与验证接口成功,结果展示清晰。 - 后端: - 系统称号列表与 CRUD 可用;用户分配称号接口成功写 `user_titles`。 - 集成: - 用户分配称号后,管理端批量抽奖能体现概率/双倍效果(已有后端支持)。 ## 交付物 - 新增前端 API `titles.ts` 与 `assign-title-dialog.vue`。 - 更新 `player-manage/index.vue` 与 `tableActionEnum.ts` 增加入口。 - 如需对批量抽奖对话框做 `(x2)` 标签显示,补充小型 UI 更新。 - 后端路由与 Handler 实现(称号 CRUD 与分配)。 确认后我将立即实施上述前后端改造,并进行编译与交互联调。