bindbox-game/.trae/documents/活动期数奖品数量、登录态与奖励管理价格增强改造方案.md
邹方成 2a89a1ab9d
Some checks failed
Build docker and publish / linux (1.24.5) (push) Failing after 39s
feat(admin): 更新前端资源文件及修复相关功能
refactor(service): 修改banner和guild删除逻辑为软删除
fix(service): 修复删除操作使用软删除而非物理删除

build: 添加SQLite测试仓库实现
docs: 新增奖励管理字段拆分和批量抽奖UI改造文档

ci: 更新CI忽略文件
style: 清理无用资源文件
2025-11-19 01:35:55 +08:00

51 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 目标与范围
- 优化期数管理:在期数列表中新增“奖品数量”,支持实时刷新与排序。
- 登录状态保持:核查并完善前端请求头携带令牌、后端校验逻辑,加入令牌自动刷新机制。
- 奖励管理增强:名称后显示价格“名称(价格)”,下拉显示名称+价格,统一两位小数,支持按价格筛选与排序。
## 现状定位
- 期数列表:`web/admin/src/views/activity/issues/index.vue` 使用 `listActivityIssues`;后端 `internal/api/admin/issues_admin.go` 未返回奖品数量。
- 登录令牌:前端 `web/admin/src/utils/http/index.ts` 注入 `Authorization`401登出无刷新后端鉴权在 `internal/router/interceptor/admin_auth.go`JWT工具具备 `Refresh` 但未暴露接口。
- 奖励管理:`web/admin/src/views/activity/rewards/index.vue` 已有价格缓存与总成本;向导 `wizard/index.vue` 已显示单价但管理页未统一展示,筛选仅支持名称/等级/Boss。
## 实施方案
### 1) 期数管理“奖品数量”
- 后端接口返回扩展:
-`internal/api/admin/issues_admin.go` 的列表响应结构添加 `prize_count` 字段;统计当前活动期对应的奖励配置数量(表 `activity_reward_settings`)并填入。
- 为避免 N+1 查询,优先采用按 `IssueID` 分组的聚合统计一次性返回。
- 前端表格列:
-`issues/index.vue``columnsFactory` 增加 `{ prop: 'prize_count', label: '奖品数量', minWidth: 120, align: 'center', sortable: true }`
- 保持字体大小与现有列一致,列宽 120保证清晰可见。
- 实时刷新:
- 在新增/删除奖励后(`createIssueRewards``deleteIssueReward`)触发行级期数列表刷新;或在奖励模块完成操作后发出事件总线通知,期数页监听并刷新。
### 2) 登录状态保持与自动刷新
- 前端核查与完善:
- 保证所有请求统一使用封装实例,已自动注入 `Authorization`;抽样验证重要路由跳转后的接口头部是否带令牌(在拦截器内添加开发模式日志)。
-`axios` 响应拦截器中实现一次性刷新流程:当收到 401 且存在 `refreshToken`,调用后端刷新接口获取新 `accessToken`,更新到 `useUserStore` 并重放队列中的失败请求。
- 后端刷新接口:
- 新增 `POST /api/admin/auth/refresh`,从 `refreshToken` 校验后发新 `accessToken` 与新的过期时间;使用 `internal/pkg/jwtoken.Refresh`
- 刷新令牌有效期策略:`accessToken` 24h`refreshToken` 714d可根据配置调整。
- 有效期验证:
- 检查管理端 JWT `exp` 与中间件的过期处理;在返回体附带 `expires_in`(秒)便于前端设置刷新窗口(如 T-5min 刷新)。
### 3) 奖励管理价格展示与筛选排序
- 名称后显示“名称(价格)”:
-`rewards/index.vue` 的名称列渲染处,读取 `priceCache[row.product_id]`,以元显示并保留两位小数:`{{ row.name }} (¥{{ unitPrice(row.product_id).toFixed(2) }})`
- 下拉选项展示价格:
- 在新增/编辑奖励的商品选择下拉项 `<ElOption>` 增加右侧显示 `¥price.toFixed(2)`;统一从 `fetchProducts``price` 转换为元并缓存。
- 价格筛选与排序:
- 在筛选区新增最小价/最大价输入与排序选择(`price asc/desc`),在 `displayedData` 计算中对 `priceCache` 区间过滤并根据选择排序。
- 统一格式:
- 所有价格展示统一使用元、`toFixed(2)`;缓存与计算逻辑复用,避免重复请求与闪烁。
## 验收标准
- 期数列表出现“奖品数量”列且支持点击列头进行升降序;奖励增减后期数页能自动反映变更。
- 前端所有 API 请求头包含 `Authorization`登录态过期前能自动刷新并续期401 时先刷新再重放请求,刷新失败才登出。
- 奖励管理名称与下拉均显示价格,价格保留两位小数;可按价格筛选与排序,结果正确稳定。
## 交付变更清单
- 后端:扩展期数列表响应(含聚合统计)、新增管理员令牌刷新接口与逻辑。
- 前端期数列表新增“奖品数量”列与刷新机制HTTP 拦截器加入自动刷新与队列重放;奖励管理价格展示、筛选与排序统一完善。
确认后我将按以上步骤实施,并为关键函数按要求补充函数级注释。