|
|
@@ -1,8 +1,8 @@
|
|
|
# 爱伴 · AI之旅 训练营小程序 项目详细设计说明书
|
|
|
|
|
|
-> **版本**:V1.0 | **日期**:2026-09-04 | **关联文档**:《小程序需求规格说明书 V2.0》
|
|
|
+> **版本**:V2.0 | **日期**:2026-09-08 | **关联文档**:《小程序需求规格说明书 V3.0》
|
|
|
>
|
|
|
-> 依据 SRS V2.0 分期(一期课堂管理 / 二期课前准备 / 三期课后跟踪 / 新增报名·付费·裂变),结合 train-backend、train-frontend、train-web 三端现状编写。
|
|
|
+> 依据 SRS V3.0 分期(一期课堂管理 / 二期课前准备 / 三期课后跟踪 / 报名·付费·裂变),结合 train-backend、train-frontend、train-web 三端现状编写。V2.0 同步代码库截至 2026-09-08 的实际演进(Phase1-15b + 登录态统一/课程中心化/报名挂课程)。
|
|
|
|
|
|
---
|
|
|
|
|
|
@@ -26,20 +26,20 @@
|
|
|
|
|
|
### 1.1 设计目标
|
|
|
|
|
|
-在既有三端代码基础上,按 SRS V2.0 分期落地:
|
|
|
+在既有三端代码基础上,按 SRS V3.0 分期落地:
|
|
|
|
|
|
-- **一期 · 课堂管理**:固化现有课堂功能,形成最低可用闭环。
|
|
|
+- **一期 · 课堂管理**:固化现有课堂功能(含投屏大屏),形成最低可用闭环。
|
|
|
- **二期 · 课前准备**:补齐课前资料包、提醒通知。
|
|
|
- **三期 · 课后跟踪**:补齐 T+ 跟进、证书、权益发放。
|
|
|
-- **新增 · 报名 / 付费 / 裂变**:落地商业闭环,新增订单、报名、转介三张表及对应接口、页面、后台。
|
|
|
+- **报名 / 付费 / 裂变**:落地商业闭环,订单、报名(挂课程)、转介、团报、案例六张表及对应接口、页面、后台。
|
|
|
|
|
|
### 1.2 技术栈现状
|
|
|
|
|
|
| 端 | 技术栈 | 现状 |
|
|
|
|---|---|---|
|
|
|
-| train-backend | Spring Boot 2.7.18 / Java 8 / MyBatis-Plus 3.5.3.1 | 端口 9083,48 个 @PostMapping,20 Mapper,18 实体,2 Service,4 Config |
|
|
|
-| train-frontend | uni-app Vue2(HBuilderX 打包) | 15 页面,4 tabBar,31 个接口调用封装 |
|
|
|
-| train-web | Vue2 + Element UI + vue-cli 5 | 12 路由,含 ECharts 统计 |
|
|
|
+| train-backend | Spring Boot 2.7.18 / Java 8 / MyBatis-Plus 3.5.3.1 | 端口 9083,25 个 Controller(含 10 个 admin/*),26 张表实体 + Mapper,Service(ScoreService/WechatService/PayService/CertService/FollowUpTask/SubscribeMessageService 等) |
|
|
|
+| train-frontend | uni-app Vue2(HBuilderX 打包) | 27 页面,4 tabBar(首页/任务/课程/我的),各业务接口封装于 utils/api.js |
|
|
|
+| train-web | Vue2 + Element UI + vue-cli 5 | 20 路由(含 /screen /courses /group-orders /cases),含 ECharts 统计 |
|
|
|
|
|
|
### 1.3 设计范围映射
|
|
|
|
|
|
@@ -66,14 +66,14 @@
|
|
|
▼ ▼
|
|
|
┌───────────────────────────────────────────────────┐
|
|
|
│ train-backend (端口 9083) │
|
|
|
-│ Controller(48) → Service(2) → Mapper(20) │
|
|
|
+│ Controller(25) → Service → Mapper │
|
|
|
│ JwtInterceptor / WebConfig / DatabaseInitializer │
|
|
|
└───────────────────────┬───────────────────────────┘
|
|
|
│ 单数据源(cfc 同库 zxyj)
|
|
|
▼
|
|
|
┌───────────────────────────────────────────────────┐
|
|
|
│ MySQL 192.168.16.251:3306 / zxyj │
|
|
|
-│ train_* 运营表 20 张 + cfc 表(users/activities) │
|
|
|
+│ train_* 运营表 26 张 + cfc 表(users/activities) │
|
|
|
└───────────────────────────────────────────────────┘
|
|
|
```
|
|
|
|
|
|
@@ -104,9 +104,9 @@
|
|
|
- 建表幂等:`CREATE TABLE IF NOT EXISTS`;存量补列用 try-catch 忽略"已存在"。
|
|
|
- 同步更新 `schema.sql` 的完整 CREATE TABLE 定义。
|
|
|
|
|
|
-### 3.2 现存表(20 张)
|
|
|
+### 3.2 现存表(26 张,schema.sql 已实现)
|
|
|
|
|
|
-> 下表均已由 `schema.sql` / `DatabaseInitializer` 建立,本文档对齐到实际 Entity。
|
|
|
+> 下表均已由 `schema.sql` / `DatabaseInitializer` 建立,本文档对齐到实际 Entity。V2.0 较 V1.0 新增:enrollment / order / invite / course_material / screen_config / group_order / group_order_member / case 共 8 张。
|
|
|
|
|
|
| 表 | 实体 | 用途 | SRS 分期 |
|
|
|
|---|---|---|---|
|
|
|
@@ -121,25 +121,36 @@
|
|
|
| train_roadmap | TrainRoadmap | 路演材料 | 一期 |
|
|
|
| train_vote | TrainVote | 两轮投票 | 一期 |
|
|
|
| train_score | TrainScore | 积分流水 | 一期 |
|
|
|
+| train_screen_config | TrainScreenConfig | 投屏配置(按班次) | 一期 |
|
|
|
| train_checkin | TrainCheckin | 装机打卡 | 二期 |
|
|
|
| train_prep_check | TrainPrepCheck | 数据自检 | 二期 |
|
|
|
+| train_course_material | TrainCourseMaterial | 课前资料包 | 二期 |
|
|
|
| train_plan | TrainPlan | 7 天计划 | 三期 |
|
|
|
| train_survey | TrainSurvey | 测评调研 | 三期 |
|
|
|
| train_coupon | TrainCoupon | 卡券 | 三期 |
|
|
|
| train_admin | TrainAdmin | 后台账号 | 一期 |
|
|
|
| train_audit_log | TrainAuditLog | 审计日志 | 一期 |
|
|
|
-| users(cfc) | CfcUser | 统一会员 | 一期 |
|
|
|
-| activities(cfc) | CfcActivity | cfc 活动 | 一期 |
|
|
|
+| train_enrollment | TrainEnrollment | 报名单(挂课程) | 扩展 |
|
|
|
+| train_order | TrainOrder | 支付订单 | 扩展 |
|
|
|
+| train_invite | TrainInvite | 转介绍关系 | 扩展 |
|
|
|
+| train_group_order | TrainGroupOrder | 团报单 | 扩展 |
|
|
|
+| train_group_order_member | TrainGroupOrderMember | 团报成员 | 扩展 |
|
|
|
+| train_case | TrainCase | 学员案例授权 | 扩展 |
|
|
|
+| users(cfc 同库) | CfcUser | 统一会员(非 schema.sql 建表) | 一期 |
|
|
|
+| activities(cfc 同库) | CfcActivity | cfc 活动(非 schema.sql 建表) | 一期 |
|
|
|
|
|
|
-### 3.3 新增表(报名 / 付费 / 裂变)
|
|
|
+### 3.3 新增表 DDL(V2.0 已落地)
|
|
|
|
|
|
-#### 3.3.1 `train_enrollment` — 报名单
|
|
|
+> V1.0 预设的 enrollment/order/invite/course_material 已全部建成;V2.0 关键变更:**enrollment 改 course 主导**(报名=报课程,班次由后台分配回填),并补齐投屏/团报/案例 4 张新表 DDL。以下 DDL 与 `schema.sql` 实际定义一致。
|
|
|
+
|
|
|
+#### 3.3.1 `train_enrollment` — 报名单(course 主导)
|
|
|
|
|
|
```sql
|
|
|
CREATE TABLE IF NOT EXISTS train_enrollment (
|
|
|
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
|
|
uid BIGINT COMMENT '学员ID(登录后)',
|
|
|
- class_id BIGINT COMMENT '所选班次ID',
|
|
|
+ course_id BIGINT COMMENT '报名所属课程ID(train_course.id,报名=报课程)',
|
|
|
+ class_id BIGINT COMMENT '所选班次ID(该课程的某一期,后台分配回填)',
|
|
|
name VARCHAR(50) COMMENT '姓名',
|
|
|
phone VARCHAR(11) COMMENT '手机号',
|
|
|
bring_laptop TINYINT DEFAULT 0 COMMENT '1=带电脑',
|
|
|
@@ -147,10 +158,11 @@ CREATE TABLE IF NOT EXISTS train_enrollment (
|
|
|
top_problems TEXT COMMENT '最想解决的3个问题JSON',
|
|
|
source VARCHAR(20) DEFAULT 'scene' COMMENT '来源:scene/invite',
|
|
|
invite_code VARCHAR(50) COMMENT '邀请码(基于train_user.invite_code)',
|
|
|
- status VARCHAR(20) DEFAULT 'pending' COMMENT 'pending/paid/confirmed/cancelled',
|
|
|
+ status VARCHAR(20) DEFAULT 'pending' COMMENT 'pending(待支付)/paid(已支付)/reviewing(进班待审核)/confirmed(已进班)/rejected(进班被拒)/cancelled(已取消)',
|
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
|
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
|
INDEX idx_uid (uid),
|
|
|
+ INDEX idx_course_id (course_id),
|
|
|
INDEX idx_class_id (class_id),
|
|
|
INDEX idx_status (status)
|
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='报名单';
|
|
|
@@ -217,13 +229,103 @@ CREATE TABLE IF NOT EXISTS train_course_material (
|
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='课前资料包';
|
|
|
```
|
|
|
|
|
|
+#### 3.3.5 `train_screen_config` — 班级投屏配置(一期)
|
|
|
+
|
|
|
+```sql
|
|
|
+CREATE TABLE IF NOT EXISTS train_screen_config (
|
|
|
+ id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
|
|
+ class_id BIGINT NOT NULL COMMENT '班次ID',
|
|
|
+ show_scoreboard TINYINT DEFAULT 1 COMMENT '1=显示小组积分榜',
|
|
|
+ show_checkin TINYINT DEFAULT 1 COMMENT '1=显示签到情况',
|
|
|
+ show_progress TINYINT DEFAULT 1 COMMENT '1=显示完课进度',
|
|
|
+ show_group_progress TINYINT DEFAULT 1 COMMENT '1=显示小组进展矩阵(分工/任务/路演)',
|
|
|
+ show_vote TINYINT DEFAULT 1 COMMENT '1=显示投票结果',
|
|
|
+ show_material TINYINT DEFAULT 1 COMMENT '1=显示课程资料',
|
|
|
+ show_banner TINYINT DEFAULT 1 COMMENT '1=显示公告横幅',
|
|
|
+ show_timer TINYINT DEFAULT 1 COMMENT '1=显示课程进行时间',
|
|
|
+ agenda VARCHAR(2000) COMMENT '课程环节JSON: [{"title":"开场","minutes":10},...]',
|
|
|
+ current_step INT DEFAULT 0 COMMENT '当前环节序号(从0开始,助教切换)',
|
|
|
+ banner VARCHAR(200) COMMENT '投屏公告',
|
|
|
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
|
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
|
+ UNIQUE KEY uk_class_id (class_id)
|
|
|
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='班级投屏配置';
|
|
|
+```
|
|
|
+
|
|
|
+#### 3.3.6 `train_group_order` — 团报单(扩展)
|
|
|
+
|
|
|
+```sql
|
|
|
+CREATE TABLE IF NOT EXISTS train_group_order (
|
|
|
+ id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
|
|
+ group_no VARCHAR(32) NOT NULL UNIQUE COMMENT '团报单号',
|
|
|
+ class_id BIGINT NOT NULL COMMENT '班次ID',
|
|
|
+ leader_uid BIGINT NOT NULL COMMENT '发起人(train_user.id)',
|
|
|
+ member_count INT DEFAULT 1 COMMENT '报名人数',
|
|
|
+ unit_amount INT COMMENT '单价(分)',
|
|
|
+ total_amount INT NOT NULL COMMENT '总金额(分)',
|
|
|
+ order_id BIGINT COMMENT '关联支付订单(train_order.id)',
|
|
|
+ status VARCHAR(20) DEFAULT 'pending' COMMENT 'pending/paid/closed',
|
|
|
+ invoice_title VARCHAR(200) COMMENT '发票抬头(企业名称)',
|
|
|
+ invoice_tax_no VARCHAR(100) COMMENT '税号',
|
|
|
+ invoice_email VARCHAR(100) COMMENT '电子发票接收邮箱',
|
|
|
+ invoice_phone VARCHAR(50) COMMENT '收票人电话',
|
|
|
+ invoice_type VARCHAR(20) COMMENT '普票/专票',
|
|
|
+ pay_time DATETIME COMMENT '支付时间',
|
|
|
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
|
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
|
+ INDEX idx_class_id (class_id),
|
|
|
+ INDEX idx_leader_uid (leader_uid),
|
|
|
+ INDEX idx_status (status)
|
|
|
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='团报订单(多学员一单+开票)';
|
|
|
+```
|
|
|
+
|
|
|
+#### 3.3.7 `train_group_order_member` — 团报成员(扩展)
|
|
|
+
|
|
|
+```sql
|
|
|
+CREATE TABLE IF NOT EXISTS train_group_order_member (
|
|
|
+ id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
|
|
+ group_order_id BIGINT NOT NULL COMMENT '团报单ID',
|
|
|
+ name VARCHAR(50) NOT NULL COMMENT '学员姓名',
|
|
|
+ phone VARCHAR(11) COMMENT '手机号',
|
|
|
+ uid BIGINT COMMENT '对应学员ID(已注册则回填)',
|
|
|
+ enrollment_id BIGINT COMMENT '支付成功后生成的报名单ID',
|
|
|
+ status VARCHAR(20) DEFAULT 'pending' COMMENT 'pending/paid',
|
|
|
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
|
+ INDEX idx_group_order_id (group_order_id),
|
|
|
+ INDEX idx_uid (uid)
|
|
|
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='团报成员';
|
|
|
+```
|
|
|
+
|
|
|
+#### 3.3.8 `train_case` — 学员案例(扩展)
|
|
|
+
|
|
|
+```sql
|
|
|
+CREATE TABLE IF NOT EXISTS train_case (
|
|
|
+ id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
|
|
+ uid BIGINT NOT NULL COMMENT '案例学员ID',
|
|
|
+ class_id BIGINT COMMENT '班次ID',
|
|
|
+ title VARCHAR(100) NOT NULL COMMENT '案例标题',
|
|
|
+ summary TEXT COMMENT '脱敏后的案例内容(不含真实数据)',
|
|
|
+ source_submission_id BIGINT COMMENT '来源成果(train_submission.id)',
|
|
|
+ status VARCHAR(20) DEFAULT 'pending' COMMENT 'pending待授权/authorized已授权/rejected已拒绝/published已发布',
|
|
|
+ consent_at DATETIME COMMENT '学员授权时间',
|
|
|
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
|
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
|
+ INDEX idx_uid (uid),
|
|
|
+ INDEX idx_status (status)
|
|
|
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学员案例(采集/授权/回流)';
|
|
|
+```
|
|
|
+
|
|
|
### 3.4 表关系概览
|
|
|
|
|
|
```
|
|
|
train_course 1─* train_class 1─* train_group 1─* train_group_member
|
|
|
- └─ train_class 1─* train_enrollment
|
|
|
+ └─ train_class 1─* train_enrollment(班次由后台分配回填)
|
|
|
+train_course 1─* train_enrollment(报名挂课程,enrollment.course_id 主导)
|
|
|
train_user 1─* train_enrollment 1─1 train_order
|
|
|
train_user 1─* train_invite *─1 train_user (inviter/invitee)
|
|
|
+train_user 1─* train_group_order 1─* train_group_order_member(支付成功 → 逐人生成 enrollment)
|
|
|
+train_user 1─* train_case *─1 train_submission (source)
|
|
|
+train_class 1─1 train_screen_config(投屏配置,uk_class_id)
|
|
|
train_user 1─* train_assignment / train_submission / train_score / train_plan ...
|
|
|
```
|
|
|
|
|
|
@@ -237,17 +339,28 @@ train_user 1─* train_assignment / train_submission / train_score / train_plan
|
|
|
|---|---|---|---|
|
|
|
| 认证 | AuthController | wechat-login / wechat-phone-login / alumni-verify | WechatService(code2Session / getPhoneNumber) |
|
|
|
| 班次 | ClassController | join / info | —(直连 Mapper) |
|
|
|
-| 课程 | CourseController | list / current | — |
|
|
|
+| 课程 | CourseController | list / current / enter / progress | — |
|
|
|
| 分组 | GroupController | join / mine / spokesperson / assign / list | — |
|
|
|
| 分工 | AssignmentController | claim / mine / group | — |
|
|
|
| 计划/调研/卡券 | PlanController | submit / mine / survey / coupons | — |
|
|
|
| 成果/打卡/教学卡 | SubmissionController | checkin / prep-check / upload / mylist / teaching-card | — |
|
|
|
| 上传 | UploadController | file | — |
|
|
|
| 路演/投票/积分榜 | VoteController | roadmap / cast / result / voted / scoreboard | ScoreService |
|
|
|
+| 报名 | EnrollmentController | classes / create / mine | EnrollmentService |
|
|
|
+| 团报 | GroupOrderController | create / mine / detail / pay | GroupOrderService |
|
|
|
+| 案例授权 | CaseController | mine / decide | CaseService |
|
|
|
+| 课前资料 | MaterialController | materials | — |
|
|
|
+| 支付订单 | OrderController | pay-notify / pay-status(微信回调) | PayService |
|
|
|
+| 转介绍 | InviteController | invite-link / bind(分享链接处理) | InviteService |
|
|
|
| 后台认证 | AdminAuthController | login | — |
|
|
|
| 后台班级/用户 | AdminClassController | createClass / classList / classDetail / createGroup / setSpokesperson / userList / setUserStatus | — |
|
|
|
+| 后台课程 | AdminCourseController | list / create / update / classes | — |
|
|
|
| 后台审核/评分 | AdminReviewController | submission/review / card/score / roadmap/score / score/manual | ScoreService |
|
|
|
| 后台统计 | AdminStatsController | overview / scoreboard / user-scoreboard | — |
|
|
|
+| 后台投屏 | AdminScreenController | config/get / config/save / step / start / reset / vote/record | — |
|
|
|
+| 后台团报 | AdminGroupOrderController | list / members | GroupOrderService |
|
|
|
+| 后台案例 | AdminCaseController | create / list / publish | CaseService |
|
|
|
+| 后台资料 | AdminMaterialController | list / save | — |
|
|
|
|
|
|
### 4.2 积分引擎(ScoreService)— 幂等设计
|
|
|
|
|
|
@@ -283,12 +396,30 @@ train_user 1─* train_assignment / train_submission / train_score / train_plan
|
|
|
- 回调幂等:`order_no` 已 paid 则跳过;防重复发放权益。
|
|
|
- 订单关闭超时未支付订单(定时任务)。
|
|
|
|
|
|
-### 4.5 报名模块(新增 `EnrollmentController`)
|
|
|
+### 4.5 报名模块(`EnrollmentController`)
|
|
|
|
|
|
-- 游客/学员填写报名表单 → 生成 `train_enrollment`(status=pending)。
|
|
|
+- 游客/学员**选择课程** → 填报名表单 → 生成 `train_enrollment`(course_id + class_id,status=pending)。**V2.0:报名=报课程,班次由后台审核分配回填**(enrollment.class_id 以审核结果为准)。
|
|
|
- 若带 invite_code → 记录到 `train_invite`(inviter 关系)。
|
|
|
-- 班次容量:`count(enrollment where class_id & status in pending/paid)` < `capacity` 才可报名。
|
|
|
-- 报名成功(paid)后自动进班(`train_user.class_id` 回填)。
|
|
|
+- 班次容量:`count(enrollment where class_id & status in pending/paid)` < `capacity` 才可分配进班。
|
|
|
+- 报名支付成功(paid)→ 后台按课程班次审核(reviewing→confirmed)→ `train_user.class_id` 回填。
|
|
|
+- 团报:`train_group_order` + `train_group_order_member` → 支付成功 → 逐人生成 enrollment。
|
|
|
+
|
|
|
+### 4.5b 投屏模块(`AdminScreenController`)
|
|
|
+
|
|
|
+- 每班一份 `train_screen_config`(uk_class_id),开关控制大屏各模块显示。
|
|
|
+- 助教端:config/get、config/save、step(切换环节)、start、reset、vote/record。
|
|
|
+- 学员端 vote 页展示投票结果;大屏页 `pages.screen`(train-web)自动轮询展示。
|
|
|
+
|
|
|
+### 4.5c 团报模块(`GroupOrderController` / `AdminGroupOrderController`)
|
|
|
+
|
|
|
+- 发起人填名单(name/phone)+ 开票信息 → 生成 `train_group_order` 与 `train_group_order_member`。
|
|
|
+- `group-order/pay` 单人支付总金额 → 回调 paid → 逐人生成 enrollment(status=paid)。
|
|
|
+- 后台 list / members 查看与追踪。
|
|
|
+
|
|
|
+### 4.5d 案例模块(`CaseController` / `AdminCaseController`)
|
|
|
+
|
|
|
+- 运营采集案例(脱敏)→ `train_case`(status=pending)。
|
|
|
+- 学员 `case/decide` 授权/拒绝;授权后 status=authorized,运营可 publish 回流。
|
|
|
|
|
|
### 4.6 裂变模块(新增)
|
|
|
|
|
|
@@ -313,9 +444,9 @@ train_user 1─* train_assignment / train_submission / train_score / train_plan
|
|
|
- 鉴权:拦截器注入 `@RequestAttribute userId`(学员)或 `adminId`(管理员)。
|
|
|
- 分页:`page` / `size`(本期少数列表,可后续标准化)。
|
|
|
|
|
|
-### 5.2 现有接口清单(对齐,31 个学员端)
|
|
|
+### 5.2 现有接口清单(对齐 §4.1 各 Controller)
|
|
|
|
|
|
-> 均已实现,本文档作为验收对照。路径见 §4.1 各 Controller。
|
|
|
+> 均已实现,本文档作为验收对照。路径见 §4.1 各 Controller(学员端 + 后台端)。
|
|
|
|
|
|
### 5.3 新增接口定义
|
|
|
|
|
|
@@ -323,8 +454,8 @@ train_user 1─* train_assignment / train_submission / train_score / train_plan
|
|
|
|
|
|
| 接口 | 方法 | 参数 | 返回 | 说明 |
|
|
|
|---|---|---|---|---|
|
|
|
-| `POST /api/enroll/classes` | `listClasses` | `@RequestBody(required=false) Map` | `Result<List<Map>>` {id,name,time,place,capacity,num,price,memberPrice,status} | 可报名班次列表(含剩余名额/价格) |
|
|
|
-| `POST /api/enroll/create` | `create` | `@RequestBody Map` {classId,name,phone,bringLaptop,dataReady,topProblems,inviteCode} | `Result<EnrollmentVO>` | 创建报名单 |
|
|
|
+| `POST /api/enroll/classes` | `listClasses` | `@RequestBody(required=false) Map` {courseId?} | `Result<List<Map>>` {id,name,time,place,capacity,num,price,memberPrice,status} | 可报名班次列表(可按课程过滤) |
|
|
|
+| `POST /api/enroll/create` | `create` | `@RequestBody Map` {**courseId 必填**, name, phone, bringLaptop, dataReady, topProblems, inviteCode, classId?} | `Result<EnrollmentVO>` | 创建报名单(报名=报课程,班次可后台分配回填) |
|
|
|
| `POST /api/enroll/mine` | `mine` | `@RequestAttribute userId` | `Result<List<Map>>` | 我的报名单列表 |
|
|
|
|
|
|
#### 支付模块(`OrderController` → `/api/pay`)
|
|
|
@@ -354,6 +485,22 @@ train_user 1─* train_assignment / train_submission / train_score / train_plan
|
|
|
| `POST /api/admin/material/list` | `materialList` | `@RequestBody(required=false) Map` {classId?} | `Result<List<Map>>` | 课前资料列表 |
|
|
|
| `POST /api/admin/material/save` | `materialSave` | `@RequestBody Map` + `@RequestAttribute adminId` | `Result<Boolean>` | 保存资料 |
|
|
|
|
|
|
+#### 团报模块(`GroupOrderController` → `/api/group-order`)
|
|
|
+
|
|
|
+| 接口 | 方法 | 参数 | 返回 | 说明 |
|
|
|
+|---|---|---|---|---|
|
|
|
+| `POST /api/group-order/create` | `create` | `@RequestBody Map` {classId, name, phone, members:[{name,phone}], invoice...} + `@RequestAttribute userId` | `Result<Map>` {groupNo, amount, ...} | 发起团报(名单+开票信息) |
|
|
|
+| `POST /api/group-order/mine` | `mine` | `@RequestAttribute userId` | `Result<List<Map>>` | 我发起的团报列表 |
|
|
|
+| `POST /api/group-order/detail` | `detail` | `@RequestBody Map` {id} + `@RequestAttribute userId` | `Result<Map>` | 团报详情(成员/开票/状态) |
|
|
|
+| `POST /api/group-order/pay` | `pay` | `@RequestBody Map` {id} + `@RequestAttribute userId` | `Result<Map>` | 拉起支付 |
|
|
|
+
|
|
|
+#### 案例模块(`CaseController` → `/api/case`)
|
|
|
+
|
|
|
+| 接口 | 方法 | 参数 | 返回 | 说明 |
|
|
|
+|---|---|---|---|---|
|
|
|
+| `POST /api/case/mine` | `mine` | `@RequestAttribute userId` | `Result<List<Map>>` | 我的案例列表(待授权/已授权) |
|
|
|
+| `POST /api/case/decide` | `decide` | `@RequestBody Map` {id, agree} + `@RequestAttribute userId` | `Result<Boolean>` | 授权/拒绝案例回流 |
|
|
|
+
|
|
|
#### 二期/三期补充接口
|
|
|
|
|
|
| 接口 | 方法 | 说明 |
|
|
|
@@ -366,21 +513,24 @@ train_user 1─* train_assignment / train_submission / train_score / train_plan
|
|
|
|
|
|
## 6. 前端页面详细设计(train-frontend)
|
|
|
|
|
|
-### 6.1 页面架构与导航(现有)
|
|
|
+### 6.1 页面架构与导航(现状,27 页)
|
|
|
|
|
|
-**TabBar(4)**:首页 index / 任务 checkin / 路演投票 vote / 我的 mine
|
|
|
+**TabBar(4,V2.0)**:首页 index / 任务 checkin / **课程 course** / 我的 mine —— V2.0 起「路演投票 vote」移出 tabBar 降为子页面,「课程」进入 tabBar(课程中心化)。
|
|
|
|
|
|
-**子页面(11)**:login、verify、class、group、assignment、upload、teaching、roadmap、scoreboard、plan、survey
|
|
|
+**子页面(23)**:course/detail、vote、verify、class、group、assignment、upload、teaching、roadmap、scoreboard、plan、survey、enroll/list、enroll/form、pay/index、pay/result、share/index、share/stats、material/index、group-order/index、group-order/create、group-order/detail、case/index
|
|
|
|
|
|
**通用工具**:
|
|
|
-- `utils/api.js`:`request(url, method, data)`(自动 Bearer token,401 跳登录)+ `uploadFile(filePath)` + 各业务接口封装。
|
|
|
+- `utils/api.js`:`request(url, method, data)`(自动 Bearer token + 登录守卫联动)+ `uploadFile(filePath)` + 各业务接口封装。
|
|
|
- `utils/auth.js`:`getToken/setToken/removeToken`。
|
|
|
-- 注:`utils/format.js` **当前不存在**——按 SRS 时间规范应新增 `parseDate()` 等函数。
|
|
|
+- `utils/guard.js`:登录守卫(未登录弹窗/跳登录,storage 兜底判空,V2.0 已落地)。
|
|
|
+- `utils/format.js`:`parseDate()` 等时间格式化(仅接受 ISO 字符串,兼容 iOS,V2.0 已落地)。
|
|
|
|
|
|
-### 6.2 新增页面(报名/付费/裂变)
|
|
|
+### 6.2 新增页面(报名/付费/裂变/团报/案例,已落地)
|
|
|
|
|
|
| 页面 | 路径 | 功能 | 主要接口 |
|
|
|
|---|---|---|---|
|
|
|
+| 课程主页 | `pages/course/index` | tabBar 课程页:课程列表/当前课程入口 | `course/list` / `course/current` |
|
|
|
+| 课程详情 | `pages/course/detail` | 课程介绍+报名入口+课程内容入口 | `course/detail` / `course/enter` / `course/progress` |
|
|
|
| 课程报名列表 | `pages/enroll/list` | 浏览可报名班次、选班 | `enroll/classes` |
|
|
|
| 报名表单 | `pages/enroll/form` | 填报名信息(含带参邀请码) | `enroll/create` |
|
|
|
| 支付页 | `pages/pay/index` | 展示订单、拉起 wx.requestPayment、轮询状态 | `pay/create` / `pay/status` |
|
|
|
@@ -388,6 +538,10 @@ train_user 1─* train_assignment / train_submission / train_score / train_plan
|
|
|
| 我的海报 | `pages/share/index` | 展示专属海报+邀请码、保存图片 | `invite/myposter` |
|
|
|
| 我的邀请 | `pages/share/stats` | 转介绍统计 | `invite/stats` |
|
|
|
| 课前资料包 | `pages/material/index` | 下载课前资料 | `class/materials` |
|
|
|
+| 团报首页 | `pages/group-order/index` | 团报列表/发起入口 | `group-order/mine` |
|
|
|
+| 发起团报 | `pages/group-order/create` | 填名单+开票信息 | `group-order/create` |
|
|
|
+| 团报详情 | `pages/group-order/detail` | 成员列表+支付入口 | `group-order/detail` |
|
|
|
+| 我的案例 | `pages/case/index` | 案例授权/下载 | `case/mine` / `case/decide` |
|
|
|
|
|
|
### 6.3 页面状态管理(Vuex)
|
|
|
|
|
|
@@ -400,21 +554,29 @@ train_user 1─* train_assignment / train_submission / train_score / train_plan
|
|
|
function fenToYuan(fen) { return (fen / 100).toFixed(2) }
|
|
|
// 时间:ISO → yyyy-MM-dd HH:mm:ss(截前 19 位 + T 替换空格)
|
|
|
```
|
|
|
-- 小程序端禁止可选链 `?.`、CSS Grid,用 `utils/format.js` 的 `parseDate()`(需新增)。
|
|
|
+- 小程序端禁止可选链 `?.`、CSS Grid;时间统一 `utils/format.js parseDate()`(V2.0 已存在)。
|
|
|
|
|
|
---
|
|
|
|
|
|
## 7. 管理后台详细设计(train-web)
|
|
|
|
|
|
-### 7.1 现有页面(12 路由,现状对齐)
|
|
|
+### 7.1 现有页面(20 路由,现状对齐)
|
|
|
|
|
|
| 路由 | 组件 | 功能 |
|
|
|
|---|---|---|
|
|
|
| /login | Login | 后台登录 |
|
|
|
+| /screen | Screen | 投屏大屏(轮询展示积分榜/签到/进展/投票等) |
|
|
|
| /dashboard | Dashboard | 概览统计卡片 |
|
|
|
+| /courses | Courses | 课程管理(L0-L4 增改) |
|
|
|
| /classes | Classes | 班级列表+新建 |
|
|
|
| /groups | Groups | 分组列表+新建+设置发言人 |
|
|
|
| /users | Users | 学员管理(筛选/启停) |
|
|
|
+| /enrollments | Enrollments | 报名单管理 |
|
|
|
+| /orders | Orders | 订单管理(含退款) |
|
|
|
+| /group-orders | GroupOrders | 团报管理 |
|
|
|
+| /cases | Cases | 案例授权管理 |
|
|
|
+| /invites | Invites | 转介绍漏斗 |
|
|
|
+| /materials | Materials | 课前资料管理 |
|
|
|
| /review/submissions | Submissions | 成果审核 |
|
|
|
| /review/cards | Cards | 教学卡评分 |
|
|
|
| /review/roadmaps | Roadmaps | 路演评审 |
|
|
|
@@ -422,14 +584,16 @@ function fenToYuan(fen) { return (fen / 100).toFixed(2) }
|
|
|
| /manual-score | ManualScore | 人工加减分 |
|
|
|
| /stats | Stats | 统计(ECharts) |
|
|
|
|
|
|
-### 7.2 新增页面
|
|
|
+### 7.2 阶段补充说明
|
|
|
+
|
|
|
+> V1.0 规划的 /enrollments、/orders、/invites、/materials 已在第一阶段落地(见 §7.1);后续新增 /screen、/courses、/group-orders、/cases 亦已实现并纳入 §7.1 现状表。本节点仅保留接口映射参考。
|
|
|
|
|
|
| 路由 | 组件 | 功能 | 主要接口 |
|
|
|
|---|---|---|---|
|
|
|
-| /enrollments | Enrollments | 报名单管理 | `admin/enrollment/list` |
|
|
|
-| /orders | Orders | 订单管理(含退款) | `admin/order/list` / `admin/order/refund` |
|
|
|
-| /invites | Invites | 转介绍漏斗 | `admin/invite/funnel` |
|
|
|
-| /materials | Materials | 课前资料管理 | `admin/material/list` / `admin/material/save` |
|
|
|
+| /screen | Screen | 投屏大屏 | `admin/screen/config/get` / `admin/screen/step` |
|
|
|
+| /courses | Courses | 课程管理 | `admin/course/list` / `admin/course/create` / `admin/course/update` |
|
|
|
+| /group-orders | GroupOrders | 团报管理 | `admin/group-order/list` / `admin/group-order/members` |
|
|
|
+| /cases | Cases | 案例授权管理 | `admin/case/list` / `admin/case/publish` |
|
|
|
|
|
|
### 7.3 权限优化建议
|
|
|
|
|
|
@@ -441,13 +605,22 @@ function fenToYuan(fen) { return (fen / 100).toFixed(2) }
|
|
|
|
|
|
## 8. 关键业务流程设计
|
|
|
|
|
|
-### 8.1 报名 → 付费 → 进班
|
|
|
+### 8.1 报名 → 付费 → 进班(V2.0:报名挂课程 + 班次后台分配)
|
|
|
|
|
|
```
|
|
|
-浏览班次列表 → 选择班次 → 填报名表单(可带邀请码)
|
|
|
- → 创建报名单(pending) → 创建订单 → 微信支付
|
|
|
- → 支付回调(paid) → 自动进班(class_id 回填)
|
|
|
+浏览课程 → 选择课程 → 填报名表单(可带邀请码/可发起团报)
|
|
|
+ → 创建报名单(pending, course_id 主导) → 创建订单 → 微信支付
|
|
|
+ → 支付回调(paid) → 后台审核分配班次(reviewing→confirmed, class_id 回填)
|
|
|
→ 若带邀请码:被邀请人 paid → 邀请人发卡券
|
|
|
+ → 团报:group_order(members) → 支付成功 → 逐人生成 enrollment
|
|
|
+```
|
|
|
+
|
|
|
+### 8.1b 团报 → 开票 → 进班(扩展)
|
|
|
+
|
|
|
+```
|
|
|
+发起人填名单 + 开票信息(invoice_*) → 创建 group_order(pending)+members
|
|
|
+ → 单人支付 total_amount → 回调 paid → 逐人生成 enrollment(paid)
|
|
|
+ → 后台按课程分配班次 → confirmed 进班
|
|
|
```
|
|
|
|
|
|
### 8.2 课前准备(二期)
|
|
|
@@ -465,6 +638,7 @@ function fenToYuan(fen) { return (fen / 100).toFixed(2) }
|
|
|
破冰组队(分组/分工) → 装机通关 → 数据找茬 → 三本账分工做互教会
|
|
|
→ 路演备战(教学卡/路演材料) → 终极路演+两轮投票+颁奖
|
|
|
全程:成果上传→助教核验→积分流水→实时积分板
|
|
|
+落地:投屏大屏(/screen) 按 train_screen_config 展示积分榜/签到/进展/投票/资料
|
|
|
```
|
|
|
|
|
|
### 8.4 课后跟踪(三期)
|
|
|
@@ -519,23 +693,25 @@ function fenToYuan(fen) { return (fen / 100).toFixed(2) }
|
|
|
|
|
|
---
|
|
|
|
|
|
-## 11. 开发任务拆分与排期
|
|
|
+## 11. 开发任务拆分与排期(V2.0 状态更新)
|
|
|
|
|
|
-| 序号 | 任务 | 范围 | 依赖 | 建议 |
|
|
|
+| 序号 | 任务 | 范围 | 状态(V2.0) | 说明 |
|
|
|
|---|---|---|---|---|
|
|
|
-| 1 | 一期课堂管理验收上线 | 现有三端 | 无 | 现稍微修正后上线支撑首期线下课 |
|
|
|
-| 2 | `utils/format.js` 新增 | train-frontend | 无 | 一期并行 |
|
|
|
-| 3 | 新增表 DDL + schema.sql | train-backend | 1 | 一期后可先行 |
|
|
|
-| 4 | 报名模块(表+接口+页面+后台) | 三端 | 3 | 二期启动 |
|
|
|
-| 5 | 支付模块(PayService+回调+订单页) | 三端 | 4 | 与报名并行 |
|
|
|
-| 6 | 裂变模块(海报/邀请码/激励/漏斗) | 三端 | 4 | 报名后可接 |
|
|
|
-| 7 | 课前资料包 + 订阅消息通知 | 三端 | 3 | 二期 |
|
|
|
-| 8 | 课后证书 + T+ 定时任务 | 三端 | 3 | 三期 |
|
|
|
-| 9 | 后台权限菜单过滤 | train-web | 1 | 三期 |
|
|
|
-| 10 | 微信支付/登录生产环境联调 | 三端 | 5 | 上线前 |
|
|
|
-
|
|
|
-> **建议**:先交付 #1(一期课堂管理)+ #2(format.js),随后并行推进 #3-#6(报名/付费/裂变),再 #7-#9(二期/三期)。
|
|
|
+| 1 | 一期课堂管理验收上线 | 现有三端 | ✅ 已落地 | 含投屏大屏 |
|
|
|
+| 2 | `utils/format.js` / `guard.js` | train-frontend | ✅ 已落地 | parseDate + 登录守卫 |
|
|
|
+| 3 | 表 DDL + schema.sql(26 张) | train-backend | ✅ 已落地 | 含 enrollment(course 主导)、order、invite、material、screen_config、group_order、group_order_member、case |
|
|
|
+| 4 | 报名模块(表+接口+页面+后台) | 三端 | ✅ 已落地 | 报名挂课程,班次后台分配 |
|
|
|
+| 5 | 支付模块(PayService+回调+订单页) | 三端 | ✅ 已实现 | 生产联调待上线前 |
|
|
|
+| 6 | 裂变模块(海报/邀请码/激励/漏斗) | 三端 | ✅ 已实现 | 券发放具备接口,待真实卡券打通 |
|
|
|
+| 7 | 课前资料包 + 订阅消息通知 | 三端 | 🟡 部分 | 资料包已落地;订阅消息模板待配置 |
|
|
|
+| 8 | 课后证书 + T+ 定时任务 | 三端 | 🟡 部分 | T+21/30 复盘安排已纳入 Phase13;证书/卡券待生产联调 |
|
|
|
+| 9 | 后台权限菜单过滤 | train-web | ⏳ 待办 | 建议三期 |
|
|
|
+| 10 | 微信支付/登录生产环境联调 | 三端 | ⏳ 待办 | 上线前置 |
|
|
|
+| 11 | 团报模块(group-order 三页 + 开票) | 三端 | ✅ 已落地 | Phase14 |
|
|
|
+| 12 | 案例授权(采集/授权/回流) | 三端 | ✅ 已落地 | Phase14 |
|
|
|
+
|
|
|
+> **V2.0 结论**:本设计已对齐代码库现状(26 表 / 27 页面 / 20 后台路由 / 25 个后端 Controller)。剩余工作集中在生产环境联调(支付/登录/订阅消息)与后台权限菜单过滤。
|
|
|
|
|
|
---
|
|
|
|
|
|
-*爱伴 · AI之旅 训练营小程序 · 项目详细设计说明书 V1.0 · 2026-09-04*
|
|
|
+*爱伴 · AI之旅 训练营小程序 · 项目详细设计说明书 V2.0 · 2026-09-08*
|