## 目标
- 在运营管理中接入“批量抽奖”并确保对话框正确对接后端接口（含用户搜索、期数选择、执行与验证）。
- 在玩家管理页新增“分配称号”功能：支持搜索玩家、选择系统称号并分配（含有效期与备注）。

## 改造与新增点

### 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 与分配）。

确认后我将立即实施上述前后端改造，并进行编译与交互联调。