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

104 lines
6.6 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.

## 概述
- 目标:提供一个可权限控制的“活动复制”后端接口与管理端前端交互,支持深度复制期次与奖品信息,生成一个状态为“未开始”的新活动,并保证关联关系与数据一致性。
- 范围:仅管理端(/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_boss``status` 固定为 “未开始”;`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_id``activity_id`)。
- 使用 `gorm.Session{SkipHooks:false}` 保持必要校验;如性能需要可在复制路径禁用不必要的钩子(经评估再启用)。
### 性能优化策略
- 查询与插入采用分页/批量:`limit/offset` 读取、`CreateInBatches(batchSize=1000)` 写入。
- 仅选择必要字段,避免大 JSON/Blob 字段。
- 大数据量策略:当期次或奖品总数超阈值(如>2万返回 `202 Accepted` 并创建异步任务(可选扩展);当前版本先同步实现并在前端加入进度提示与超时 UI。
### 错误码与日志
- 复用项目错误码规范与上下文绑 trace`internal/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.go``Query``Activities/ActivityIssues/ActivityRewards`)与对应 `.gen.go` 模型
- Swagger`docs/swagger.yaml``docs/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 封装与权限
- API`web/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`)。
- 复制参数增强(重命名、时间偏移、是否复制奖品池等)。
请确认以上方案后,我将开始实现并提交相应代码改动与测试。