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

4.3 KiB
Raw Blame History

目标与范围

  • 优化期数管理:在期数列表中新增“奖品数量”,支持实时刷新与排序。
  • 登录状态保持:核查并完善前端请求头携带令牌、后端校验逻辑,加入令牌自动刷新机制。
  • 奖励管理增强:名称后显示价格“名称(价格)”,下拉显示名称+价格,统一两位小数,支持按价格筛选与排序。

现状定位

  • 期数列表:web/admin/src/views/activity/issues/index.vue 使用 listActivityIssues;后端 internal/api/admin/issues_admin.go 未返回奖品数量。
  • 登录令牌:前端 web/admin/src/utils/http/index.ts 注入 Authorization401登出无刷新后端鉴权在 internal/router/interceptor/admin_auth.goJWT工具具备 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.vuecolumnsFactory 增加 { prop: 'prize_count', label: '奖品数量', minWidth: 120, align: 'center', sortable: true }
    • 保持字体大小与现有列一致,列宽 120保证清晰可见。
  • 实时刷新:
    • 在新增/删除奖励后(createIssueRewardsdeleteIssueReward)触发行级期数列表刷新;或在奖励模块完成操作后发出事件总线通知,期数页监听并刷新。

2) 登录状态保持与自动刷新

  • 前端核查与完善:
    • 保证所有请求统一使用封装实例,已自动注入 Authorization;抽样验证重要路由跳转后的接口头部是否带令牌(在拦截器内添加开发模式日志)。
    • axios 响应拦截器中实现一次性刷新流程:当收到 401 且存在 refreshToken,调用后端刷新接口获取新 accessToken,更新到 useUserStore 并重放队列中的失败请求。
  • 后端刷新接口:
    • 新增 POST /api/admin/auth/refresh,从 refreshToken 校验后发新 accessToken 与新的过期时间;使用 internal/pkg/jwtoken.Refresh
    • 刷新令牌有效期策略:accessToken 24hrefreshToken 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);统一从 fetchProductsprice 转换为元并缓存。
  • 价格筛选与排序:
    • 在筛选区新增最小价/最大价输入与排序选择(price asc/desc),在 displayedData 计算中对 priceCache 区间过滤并根据选择排序。
  • 统一格式:
    • 所有价格展示统一使用元、toFixed(2);缓存与计算逻辑复用,避免重复请求与闪烁。

验收标准

  • 期数列表出现“奖品数量”列且支持点击列头进行升降序;奖励增减后期数页能自动反映变更。
  • 前端所有 API 请求头包含 Authorization登录态过期前能自动刷新并续期401 时先刷新再重放请求,刷新失败才登出。
  • 奖励管理名称与下拉均显示价格,价格保留两位小数;可按价格筛选与排序,结果正确稳定。

交付变更清单

  • 后端:扩展期数列表响应(含聚合统计)、新增管理员令牌刷新接口与逻辑。
  • 前端期数列表新增“奖品数量”列与刷新机制HTTP 拦截器加入自动刷新与队列重放;奖励管理价格展示、筛选与排序统一完善。

确认后我将按以上步骤实施,并为关键函数按要求补充函数级注释。