kindergarten_java/docs/design/15-课程发布流程完善方案.md
2026-02-28 16:41:39 +08:00

26 KiB
Raw Permalink Blame History

课程发布流程完善方案

创建时间2026-02-13 状态: 已实现2026-02-13


一、现状分析

1.1 当前实现

方面 现状
课程状态 DRAFT / REVIEWING未实现 / PUBLISHED / ARCHIVED
发布流程 草稿 → 直接发布(无审核)
授权机制 发布时自动授权给所有活跃租户
验证逻辑 仅前端表单验证,无后端完整性校验
版本管理 有字段但未实现功能

1.2 与需求的差距

需求(来自设计文档) 当前状态
草稿 → 审核中 → 已发布 状态流转 未实现审核环节
审核检查项(完整性、科学性等) 未实现
审核意见记录 未实现
版本迭代机制 未实现
按租户细粒度授权 当前是全量授权

二、状态流转设计

2.1 状态流转图

┌─────────┐  保存   ┌─────────┐  提交   ┌─────────┐  通过   ┌─────────┐
│  新建   │ ──────▶ │  草稿   │ ──────▶ │ 审核中  │ ──────▶ │ 已发布  │
└─────────┘         └─────────┘         └─────────┘         └─────────┘
                         │                   │                   │
                         │                   │ 驳回              │ 下架
                         │                   ▼                   ▼
                         │              ┌─────────┐         ┌─────────┐
                         └─────────────▶│ 已驳回  │         │ 已下架  │
                                        └─────────┘         └─────────┘
                                             │                   │
                                             │ 重新提交          │ 重新发布
                                             └───────────┬───────┘
                                                         ▼
                                                    ┌─────────┐
                                                    │ 审核中  │
                                                    └─────────┘

2.2 状态说明

状态 英文标识 说明 允许操作
草稿 DRAFT 制作中,未提交审核 保存、编辑、删除、提交审核
审核中 PENDING 已提交,等待审核 查看详情、撤销审核
已驳回 REJECTED 审核未通过 查看驳回原因、修改后重新提交
已发布 PUBLISHED 审核通过,教师可见 下架、迭代新版本
已下架 ARCHIVED 暂停使用 重新发布

三、发布前验证检查

3.1 自动验证项(提交时强制校验)

检查项 验证规则 错误级别 提示信息
课程名称 非空2-50字符 🔴 阻断 "请输入课程名称"
适用年级 至少选择1个年级 🔴 阻断 "请选择适用年级"
课程时长 5-60分钟 🔴 阻断 "课程时长需在5-60分钟之间"
封面图片 必须上传 🔴 阻断 "请上传课程封面"
数字资源 至少1个资源 🟡 警告 "建议上传至少1个数字资源"
教学流程 至少1个环节 🔴 阻断 "请配置教学流程"
版权声明 需确认 🔴 阻断 "请确认版权合规"

3.2 人工审核项(审核员手动确认)

检查项 说明 审核要点
教学科学性 教学目标、流程符合幼儿教育规律 目标明确、环节合理、符合幼儿认知水平
素材质量 音视频清晰度、课件美观度 分辨率达标、设计美观、无明显错误
标签准确性 领域、年级标签是否准确 领域分类正确、年级定位准确
版权合规 所有素材有合法版权 素材来源合法、已获得授权
内容安全 无敏感、不当内容 符合内容安全规范

四、审核流程设计

4.1 审核页面原型

┌─────────────────────────────────────────────────────────────────┐
│ 课程审核页面                                                     │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│ 课程:《好饿的毛毛虫》完整阅读活动                               │
│ 提交人:张教研 | 提交时间2026-02-13 10:30                      │
│                                                                 │
│ ━━ 自动检查项 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━│
│ ✅ 基本信息完整                                                 │
│ ✅ 封面图片已上传                                               │
│ ✅ 数字资源电子绘本1个、音频1个                               │
│ ✅ 教学流程5个环节                                            │
│                                                                 │
│ ━━ 人工审核项 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━│
│ ☐ 教学科学性符合要求                                           │
│ ☐ 素材质量达标                                                 │
│ ☐ 标签分类准确                                                 │
│ ☐ 版权合规                                                     │
│                                                                 │
│ ━━ 审核意见 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━│
│ [_______________________________________________]               │
│ [_______________________________________________]               │
│                                                                 │
│ [✓ 通过并发布] [✗ 驳回] [暂存待讨论]                            │
└─────────────────────────────────────────────────────────────────┘

4.2 审核结果处理

审核结果 状态变更 后续操作
通过并发布 PENDING → PUBLISHED 自动授权给租户,发送通知
驳回 PENDING → REJECTED 记录驳回原因,通知提交人
暂存待讨论 保持 PENDING 记录讨论意见,等待确认

五、版本管理机制

5.1 版本号规则

版本类型 版本号变化 说明 示例
小优化 x.x.+1 修改文案、优化素材 v1.0.0 → v1.0.1
功能更新 x.+1.0 增加环节、修改流程 v1.0.0 → v1.1.0
大改版 +1.0.0 重新设计、全新版本 v1.0.0 → v2.0.0

5.2 版本迭代流程

已发布课程 v1.0
     │
     ├─▶ 点击"迭代新版本"
     │       │
     │       ▼
     │   复制为新草稿 v2.0
     │       │
     │       ▼
     │   编辑修改 → 提交审核 → 发布
     │       │
     │       ▼
     │   v2.0 成为最新版本
     │   v1.0 保留历史记录
     │
     └─▶ 历史版本可查看但不可编辑

5.3 版本数据模型

model CourseVersion {
  id             Int      @id @default(autoincrement())
  courseId       Int
  course         Course   @relation(fields: [courseId], references: [id])
  version        String                // 版本号,如 "1.0.0"
  snapshotData   String                // JSON快照完整课程内容
  changeLog      String?               // 变更说明
  publishedAt    DateTime @default(now())
  publishedBy    Int
  publisher      User     @relation(fields: [publishedBy], references: [id])

  @@index([courseId])
}

六、授权机制优化

6.1 当前授权方式

  • 发布时自动授权给所有活跃租户
  • 下架时取消所有租户授权
  • 无法按套餐或指定租户控制

6.2 优化后的授权选项

┌─────────────────────────────────────────────────────────────────┐
│ 授权配置                                                         │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│ ○ 全量授权(所有活跃租户)                                       │
│   适用场景:通用课程,适合所有幼儿园                             │
│                                                                 │
│ ○ 按套餐授权                                                    │
│   ☐ 基础套餐租户约50个课程包                                │
│   ☐ 标准套餐租户约150个课程包                               │
│   ☑ 高级套餐租户(不限)                                        │
│   适用场景:高级课程,仅限付费更高的用户                         │
│                                                                 │
│ ○ 指定租户授权                                                  │
│   [搜索租户...]                                                 │
│   ☑ 阳光幼儿园                                                 │
│   ☑ 花儿朵朵幼儿园                                             │
│   ☐ 蓝天双语幼儿园                                             │
│   适用场景:定制课程,仅限特定客户                               │
│                                                                 │
│ [确认发布] [取消]                                                │
└─────────────────────────────────────────────────────────────────┘

6.3 授权数据模型

model TenantCourse {
  id           Int      @id @default(autoincrement())
  tenantId     Int
  tenant       Tenant   @relation(fields: [tenantId], references: [id])
  courseId     Int
  course       Course   @relation(fields: [courseId], references: [id])
  authorized   Boolean  @default(true)
  authorizedAt DateTime @default(now())
  authorizedBy Int?                  // 授权操作人
  packageType  String?               // 授权来源套餐类型

  @@unique([tenantId, courseId])
  @@index([tenantId])
  @@index([courseId])
}

七、技术实现方案

7.1 数据库变更

// Course 模型变更
model Course {
  id              Int      @id @default(autoincrement())
  // ... 现有字段 ...

  // 状态相关(新增/修改)
  status          CourseStatus  @default(DRAFT)
  submittedAt     DateTime?     // 提交审核时间
  submittedBy     Int?          // 提交人ID
  reviewedAt      DateTime?     // 审核时间
  reviewedBy      Int?          // 审核人ID
  reviewComment   String?       // 审核意见
  reviewChecklist Json?         // 审核检查项结果 [{item, passed, comment}]

  // 版本相关(新增)
  version         String        @default("1.0.0")
  parentId        Int?          // 父版本ID
  isLatest        Boolean       @default(true)  // 是否最新版本

  // 关联
  submitter       User?         @relation("CourseSubmitter", fields: [submittedBy], references: [id])
  reviewer        User?         @relation("CourseReviewer", fields: [reviewedBy], references: [id])
  parent          Course?       @relation("CourseVersions", fields: [parentId], references: [id])
  children        Course[]      @relation("CourseVersions")
  versions        CourseVersion[]

  @@index([status])
  @@index([parentId])
}

// 课程版本快照(新增)
model CourseVersion {
  id             Int      @id @default(autoincrement())
  courseId       Int
  course         Course   @relation(fields: [courseId], references: [id])
  version        String
  snapshotData   String   // JSON格式的课程完整内容快照
  changeLog      String?  // 变更说明
  publishedAt    DateTime @default(now())
  publishedBy    Int
  publisher      User     @relation(fields: [publishedBy], references: [id])

  @@index([courseId])
}

// 课程状态枚举(修改)
enum CourseStatus {
  DRAFT       // 草稿
  PENDING     // 待审核(原 REVIEWING
  REJECTED    // 已驳回
  PUBLISHED   // 已发布
  ARCHIVED    // 已下架
}

7.2 API 设计

方法 路径 说明 权限
POST /api/v1/courses/:id/submit 提交审核 超管
POST /api/v1/courses/:id/approve 审核通过并发布 超管(审核权限)
POST /api/v1/courses/:id/reject 审核驳回 超管(审核权限)
POST /api/v1/courses/:id/withdraw 撤销审核申请 超管(提交人)
POST /api/v1/courses/:id/publish 直接发布(绕过审核) 超管(特殊权限)
POST /api/v1/courses/:id/unpublish 下架课程 超管
POST /api/v1/courses/:id/iterate 创建新版本迭代 超管
GET /api/v1/courses/:id/versions 获取版本历史 超管
POST /api/v1/courses/:id/validate 验证课程完整性 超管

7.3 API 请求/响应示例

提交审核

// POST /api/v1/courses/:id/submit
// Request
{
  "copyrightConfirmed": true  // 确认版权合规
}

// Response
{
  "success": true,
  "data": {
    "id": 1,
    "status": "PENDING",
    "submittedAt": "2026-02-13T10:30:00Z"
  }
}

审核通过

// POST /api/v1/courses/:id/approve
// Request
{
  "checklist": [
    { "item": "教学科学性", "passed": true, "comment": "教学设计合理" },
    { "item": "素材质量", "passed": true, "comment": "" },
    { "item": "标签准确性", "passed": true, "comment": "" },
    { "item": "版权合规", "passed": true, "comment": "已确认" }
  ],
  "comment": "审核通过,课程设计优秀",
  "authOption": "all"  // all | package | specific
}

// Response
{
  "success": true,
  "data": {
    "id": 1,
    "status": "PUBLISHED",
    "publishedAt": "2026-02-13T11:00:00Z",
    "authorizedTenants": 128
  }
}

审核驳回

// POST /api/v1/courses/:id/reject
// Request
{
  "checklist": [
    { "item": "教学科学性", "passed": true, "comment": "" },
    { "item": "素材质量", "passed": false, "comment": "音频清晰度不足" },
    { "item": "标签准确性", "passed": true, "comment": "" },
    { "item": "版权合规", "passed": true, "comment": "" }
  ],
  "comment": "请更换高清音频文件后重新提交"
}

// Response
{
  "success": true,
  "data": {
    "id": 1,
    "status": "REJECTED",
    "reviewedAt": "2026-02-13T11:00:00Z"
  }
}

八、前端改造方案

8.1 课程列表状态标签

┌──────────┬─────────────────────────────────────────────────────────┐
│ 状态     │ 操作按钮                                                │
├──────────┼─────────────────────────────────────────────────────────┤
│ 🟡 草稿  │ [编辑] [删除] [提交审核]                                │
│ 🔵 审核中│ [查看] [撤销]                                           │
│ 🔴 已驳回│ [查看] [查看驳回原因] [重新编辑] [重新提交]              │
│ 🟢 已发布│ [查看] [编辑] [下架] [迭代新版本] [查看数据]            │
│ ⚫ 已下架│ [查看] [重新发布] [查看数据]                            │
└──────────┴─────────────────────────────────────────────────────────┘

8.2 课程编辑页面

底部操作栏改造:

┌─────────────────────────────────────────────────────────────────┐
│                                                                 │
│   [上一步] [下一步] [保存草稿] [预览] [提交审核]                 │
│                                                                 │
│   注:提交审核前请确保:                                         │
│   ☐ 已上传封面图片                                              │
│   ☐ 已配置教学流程                                              │
│   ☐ 已确认版权合规                                              │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

8.3 审核管理页面(新增)

┌──────────────────────────────────────────────────────────────────────┐
│ 审核管理                                         待审核: 5 门课程    │
├──────────────────────────────────────────────────────────────────────┤
│ 筛选:状态:[待审核 ▼]  提交人:[全部 ▼]  时间:[最近7天 ▼]        │
│                                                                      │
│ ┌────┬────────────────┬─────────┬───────────┬──────────┬──────────┐ │
│ │序号│  课程名称       │ 提交人  │ 提交时间   │ 自动检查  │  操作    │ │
│ ├────┼────────────────┼─────────┼───────────┼──────────┼──────────┤ │
│ │ 1  │好饿的毛毛虫    │ 张教研  │02-13 10:30│ ✅ 全部通过│[审核]   │ │
│ ├────┼────────────────┼─────────┼───────────┼──────────┼──────────┤ │
│ │ 2  │猜猜我有多爱你  │ 李教研  │02-12 15:20│ ⚠️ 有警告 │[审核]   │ │
│ ├────┼────────────────┼─────────┼───────────┼──────────┼──────────┤ │
│ │ 3  │逃家小兔        │ 王教研  │02-11 09:00│ ❌ 有错误 │[查看]   │ │
│ │    │                │         │           │          │[退回修改]│ │
│ └────┴────────────────┴─────────┴───────────┴──────────┴──────────┘ │
└──────────────────────────────────────────────────────────────────────┘

九、实施计划

9.1 阶段划分

阶段 功能 优先级 预估工作量 依赖
P0 发布前完整性验证 🔴 1天
P0 审核状态流转 🔴 2天 P0验证
P0 前端状态标签和操作按钮 🔴 1天 P0状态流转
P1 审核意见记录 🟡 1天 P0
P1 驳回后重新提交流程 🟡 0.5天 P1审核意见
P1 审核管理页面 🟡 1.5天 P1
P2 版本迭代机制 🟢 2天 P0
P2 版本历史快照 🟢 1天 P2版本迭代
P3 细粒度授权控制 🟢 1.5天 P0
P3 授权配置界面 🟢 1天 P3授权

9.2 详细任务分解

第一阶段P0 - 核心流程)

Day 1发布前验证

  • 后端:实现课程完整性验证服务
  • 后端添加验证API端点
  • 前端验证提示UI组件
  • 前端:提交前验证调用

Day 2-3审核状态流转

  • 数据库:添加新状态和字段
  • 后端:实现 submit/approve/reject API
  • 后端:状态变更通知逻辑
  • 前端:课程列表状态标签
  • 前端:操作按钮改造

Day 4前端完善

  • 前端:提交审核确认弹窗
  • 前端:版权确认勾选
  • 前端:验证未通过提示

第二阶段P1 - 审核完善)

Day 5审核意见

  • 数据库:添加审核意见字段
  • 后端:保存审核检查项结果
  • 前端:驳回原因展示

Day 6审核管理页面

  • 前端:审核列表页面
  • 前端:审核详情页面
  • 前端:审核操作交互

第三阶段P2/P3 - 扩展功能)

  • 版本迭代机制
  • 细粒度授权控制

十、待讨论问题

10.1 审核流程

  • 是否需要多人审核?还是单人审核即可?

    • 决策:单人审核即可
    • 任一有审核权限的超管审核通过即可发布
  • 审核人是否可以审核自己提交的课程?

    • 决策:不允许自审
    • 提交人和审核人不能是同一人,代码层面需要校验
  • 是否需要审核超时自动提醒?

    • 决策:暂不实现,后续根据需求迭代

10.2 发布权限

  • 是否允许超管绕过审核直接发布?

    • 决策:仅特定角色可绕过
    • 超级管理员可绕过审核直接发布
    • 普通超管/教研人员仍需走审核流程
  • 直接发布是否需要二次确认?

    • 决策:需要
    • 直接发布时需弹窗确认,显示跳过审核的提示
  • 是否需要发布审批日志?

    • 决策:需要
    • 记录所有发布操作,包括操作人、时间、方式(审核通过/直接发布)

10.3 版本策略

  • 新版本发布后,旧版本是否保留?

    • 决策:保留旧版本
    • 学校可选择使用新版本或继续使用旧版本
  • 已使用旧版本上课的学校是否可以继续使用?

    • 决策:可以
    • 新版本发布不影响已创建的授课记录
  • 版本回滚是否需要支持?

    • 决策:暂不支持
    • 如有问题可发布新修复版本

10.4 授权粒度

  • 是否需要立即实现细粒度授权?

    • 决策:暂不实现
    • 保持当前全量授权方式(发布时授权给所有活跃租户)
    • 后续根据业务需求迭代
  • 授权变更是否需要通知租户?

    • 决策:暂不实现
    • 后续迭代时考虑
  • 是否支持定时授权(如:预约上线时间)?

    • 决策:暂不实现
    • 发布后立即生效

十、已确认的开发范围

10.1 本次实现功能

功能 优先级 状态
发布前完整性验证 P0 已实现
审核状态流转DRAFT → PENDING → PUBLISHED/REJECTED P0 已实现
单人审核机制(禁止自审) P0 已实现
超级管理员直接发布权限 P0 已实现
驳回后重新提交流程 P1 已实现
审核意见记录 P1 已实现
审核管理页面 P1 已实现
版本迭代机制(保留旧版本) P2 已实现
发布审批日志 P1 已实现

10.2 暂不实现功能

功能 原因 预计迭代时间
多人审核流程 当前规模不需要 待定
细粒度授权控制 业务需求不明确 待定
预约上线时间 当前无需定时发布 待定
审核超时提醒 暂无强需求 待定
版本回滚 可通过发布新版解决 待定

十一、参考资料

  1. CMS内容审核工作流详解
  2. 课程审核与发布流程详解
  3. 企业课程管理系统2025评测
  4. October CMS内容工作流引擎
  5. 在线课程管理系统开发实战

十二、变更记录

日期 版本 变更内容 作者
2026-02-13 v1.0 初始版本 Claude