bindbox-game/.trae/documents/实现“活动复制”后端接口与前端功能.md
邹方成 642b3cf7dd
Some checks failed
Build docker and publish / linux (1.24.5) (push) Failing after 50s
build: 更新前端构建产物和资源文件
更新了前端构建产物包括JavaScript、CSS和HTML文件,主要涉及以下变更:

1. 新增了多个组件和工具函数,包括异常页面组件、iframe组件等
2. 更新了活动管理、产品管理、优惠券管理等业务模块
3. 优化了构建配置和依赖管理
4. 修复了一些样式和功能问题
5. 更新了测试相关文件

同时更新了部分后端服务接口和测试用例。这些变更主要是为了支持新功能和改进现有功能的用户体验。
2025-11-21 01:24:13 +08:00

6.6 KiB
Raw Blame History

概述

  • 目标:提供一个可权限控制的“活动复制”后端接口与管理端前端交互,支持深度复制期次与奖品信息,生成一个状态为“未开始”的新活动,并保证关联关系与数据一致性。
  • 范围:仅管理端(/api/admin/*)可用;前端在活动管理页增加“复制”入口与对话框流程。

后端设计

路由与权限

  • 路由:POST /api/admin/activities/:activity_id/copy
  • 鉴权沿用管理端拦截器JWT + 角色/动作),新增动作码如 activity.copy(与现有 RequireAdminAction 机制一致)。
  • Swagger/api/admin/activities 下新增复制接口文档(请求/响应示例与错误码)。

请求/响应契约

  • 请求:activity_id(路径参数,必填)
  • 响应:{ new_activity_id: number, status: 'success' };错误场景返回标准错误码与消息(如未授权、找不到活动、复制失败)。

复制范围与字段策略

  • 活动主表(Activities):复制除运行态统计外的业务字段(如 name/banner/activity_category_id/price_draw/is_bossstatus 固定为 “未开始”;start_time/end_time 可按需求重置为空或原值保留(默认重置为空)。
  • 期次表(ActivityIssues):复制配置与时间安排(如期次名称、时间窗、规则参数等),新的 issue 关联新的 activity_id
  • 奖品表(ActivityRewards):复制奖品类型、数量、概率等,新的奖品关联新的 issue_id
  • 其他关联:不复制抽奖日志、收据、随机承诺历史等运行态数据;仅复制可配置静态数据。

实现步骤(事务 + 深度复制)

  1. 读取源活动(校验存在且可复制)。
  2. 开启事务(writeDB.Begin())。
  3. 新建活动记录(status=未开始,重置 start/end),拿到 new_activity_id
  4. 查询源活动的全部期次(按 activity_id),按批次复制:
    • 将源期次映射为新期次(替换 activity_id),批量插入(CreateInBatches),建立 old_issue_id -> new_issue_id 映射表。
  5. 查询源期次对应的全部奖品,按批次复制:
    • 使用映射替换为新的 issue_id,批量插入。
  6. 提交事务;返回 new_activity_id 与状态。
  • 失败回滚:任何步骤出错时回滚并返回错误码与错误信息。

数据一致性与约束

  • 全流程单事务保证跨表一致性。
  • 外键关系通过 ID 映射正确重建(issue_idactivity_id)。
  • 使用 gorm.Session{SkipHooks:false} 保持必要校验;如性能需要可在复制路径禁用不必要的钩子(经评估再启用)。

性能优化策略

  • 查询与插入采用分页/批量:limit/offset 读取、CreateInBatches(batchSize=1000) 写入。
  • 仅选择必要字段,避免大 JSON/Blob 字段。
  • 大数据量策略:当期次或奖品总数超阈值(如>2万返回 202 Accepted 并创建异步任务(可选扩展);当前版本先同步实现并在前端加入进度提示与超时 UI。

错误码与日志

  • 复用项目错误码规范与上下文绑 traceinternal/pkg/trace)。
  • 记录复制耗时、批次数与行数,便于审计与性能分析。

影响文件(后端)

  • 路由:internal/router/router.go(新增 POST /api/admin/activities/:activity_id/copy
  • 控制器:internal/api/admin/activities_copy_admin.go(新建,处理入参、鉴权、调用服务层)
  • 服务层:internal/service/activity/activity_copy.go(新建,封装事务与深度复制逻辑)
  • DAO/模型:复用 internal/repository/mysql/dao/gen.goQueryActivities/ActivityIssues/ActivityRewards)与对应 .gen.go 模型
  • Swaggerdocs/swagger.yamldocs/docs.go(新增接口文档)

前端设计(管理端)

交互流程

  1. 用户在活动管理页点击“复制”按钮。
  2. 弹出复制对话框,异步加载活动下拉(显示名称+ID支持搜索/分页)。
  3. 选择目标活动 → 点击“确认”。
  4. 调用后端复制接口显示处理中状态loading
  5. 成功:提示成功并跳转到新活动编辑页(/activity/wizard?activityId=...)或刷新列表;失败:提示错误详情。

组件与页面改动

  • 活动管理页:web/admin/src/views/activity/manage/index.vue
    • 在列表或操作区增加“复制”入口按钮
    • 引入 CopyActivityDialog(新建组件或内联对话框)
  • 复制对话框组件:web/admin/src/views/activity/manage/CopyActivityDialog.vue
    • 下拉框(远程搜索/分页),确认/取消按钮
    • 状态提示loading、成功、失败

API 封装与权限

  • APIweb/admin/src/api/adminActivities.ts
    • 新增 copyActivity(activityId: number)POST admin/activities/${activityId}/copy
    • 活动列表接口复用现有 admin 列表或新增轻量下拉接口
  • 权限显示:根据用户的动作权限(如 activity.copy)决定是否展示“复制”按钮。

错误处理与状态提示

  • 统一使用项目的消息组件与错误拦截(@/utils/http)。
  • Loading 覆盖对话框;失败显示具体原因(来自后端错误码)。
  • 大数据量复制时,提示“复制时间较长”,并在超时后提供轮询或后台进度(后端异步模式可选)。

影响文件(前端)

  • web/admin/src/views/activity/manage/index.vue(增加按钮、接入对话框)
  • web/admin/src/views/activity/manage/CopyActivityDialog.vue(新建组件)
  • web/admin/src/api/adminActivities.ts(新增复制接口方法)
  • 如需权限常量:web/admin/src/router/guards/beforeEach.ts 或权限配置处进行动作码接入

验收标准

  • 后端:
    • POST /api/admin/activities/:activity_id/copy 在合法权限下返回 200包含 new_activity_id;事务复制期次与奖品,关联正确,状态为“未开始”。
    • 非法权限或不存在的活动返回规范错误码。
    • 大数据量下复制耗时可接受且不阻塞服务。
  • 前端:
    • 管理页出现“复制”按钮;弹框可加载活动列表并选择;调用接口后有明显状态提示。
    • 成功后刷新或跳转到新活动编辑页;错误时信息清晰。

交付项

  • 新接口实现路由、控制器、服务、Swagger 文档)。
  • 前端交互(按钮+对话框+API 封装)。
  • 基础单元测试(服务层:期次与奖品复制的映射与事务回滚路径)。

后续可选扩展

  • 异步复制任务 + 进度查询(202 Accepted + job_id)。
  • 复制参数增强(重命名、时间偏移、是否复制奖品池等)。

请确认以上方案后,我将开始实现并提交相应代码改动与测试。