612 lines
26 KiB
Markdown
612 lines
26 KiB
Markdown
|
|
# 课程发布流程完善方案
|
|||
|
|
|
|||
|
|
> 创建时间: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 版本数据模型
|
|||
|
|
|
|||
|
|
```prisma
|
|||
|
|
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 授权数据模型
|
|||
|
|
|
|||
|
|
```prisma
|
|||
|
|
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 数据库变更
|
|||
|
|
|
|||
|
|
```prisma
|
|||
|
|
// 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 请求/响应示例
|
|||
|
|
|
|||
|
|
#### 提交审核
|
|||
|
|
|
|||
|
|
```typescript
|
|||
|
|
// POST /api/v1/courses/:id/submit
|
|||
|
|
// Request
|
|||
|
|
{
|
|||
|
|
"copyrightConfirmed": true // 确认版权合规
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Response
|
|||
|
|
{
|
|||
|
|
"success": true,
|
|||
|
|
"data": {
|
|||
|
|
"id": 1,
|
|||
|
|
"status": "PENDING",
|
|||
|
|
"submittedAt": "2026-02-13T10:30:00Z"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 审核通过
|
|||
|
|
|
|||
|
|
```typescript
|
|||
|
|
// 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
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 审核驳回
|
|||
|
|
|
|||
|
|
```typescript
|
|||
|
|
// 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 审核流程
|
|||
|
|
|
|||
|
|
- [x] 是否需要多人审核?还是单人审核即可?
|
|||
|
|
- **决策:单人审核即可**
|
|||
|
|
- 任一有审核权限的超管审核通过即可发布
|
|||
|
|
|
|||
|
|
- [x] 审核人是否可以审核自己提交的课程?
|
|||
|
|
- **决策:不允许自审**
|
|||
|
|
- 提交人和审核人不能是同一人,代码层面需要校验
|
|||
|
|
|
|||
|
|
- [ ] 是否需要审核超时自动提醒?
|
|||
|
|
- **决策:暂不实现**,后续根据需求迭代
|
|||
|
|
|
|||
|
|
### 10.2 发布权限
|
|||
|
|
|
|||
|
|
- [x] 是否允许超管绕过审核直接发布?
|
|||
|
|
- **决策:仅特定角色可绕过**
|
|||
|
|
- 超级管理员可绕过审核直接发布
|
|||
|
|
- 普通超管/教研人员仍需走审核流程
|
|||
|
|
|
|||
|
|
- [x] 直接发布是否需要二次确认?
|
|||
|
|
- **决策:需要**
|
|||
|
|
- 直接发布时需弹窗确认,显示跳过审核的提示
|
|||
|
|
|
|||
|
|
- [ ] 是否需要发布审批日志?
|
|||
|
|
- **决策:需要**
|
|||
|
|
- 记录所有发布操作,包括操作人、时间、方式(审核通过/直接发布)
|
|||
|
|
|
|||
|
|
### 10.3 版本策略
|
|||
|
|
|
|||
|
|
- [x] 新版本发布后,旧版本是否保留?
|
|||
|
|
- **决策:保留旧版本**
|
|||
|
|
- 学校可选择使用新版本或继续使用旧版本
|
|||
|
|
|
|||
|
|
- [x] 已使用旧版本上课的学校是否可以继续使用?
|
|||
|
|
- **决策:可以**
|
|||
|
|
- 新版本发布不影响已创建的授课记录
|
|||
|
|
|
|||
|
|
- [ ] 版本回滚是否需要支持?
|
|||
|
|
- **决策:暂不支持**
|
|||
|
|
- 如有问题可发布新修复版本
|
|||
|
|
|
|||
|
|
### 10.4 授权粒度
|
|||
|
|
|
|||
|
|
- [x] 是否需要立即实现细粒度授权?
|
|||
|
|
- **决策:暂不实现**
|
|||
|
|
- 保持当前全量授权方式(发布时授权给所有活跃租户)
|
|||
|
|
- 后续根据业务需求迭代
|
|||
|
|
|
|||
|
|
- [ ] 授权变更是否需要通知租户?
|
|||
|
|
- **决策:暂不实现**
|
|||
|
|
- 后续迭代时考虑
|
|||
|
|
|
|||
|
|
- [x] 是否支持定时授权(如:预约上线时间)?
|
|||
|
|
- **决策:暂不实现**
|
|||
|
|
- 发布后立即生效
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 十、已确认的开发范围
|
|||
|
|
|
|||
|
|
### 10.1 本次实现功能
|
|||
|
|
|
|||
|
|
| 功能 | 优先级 | 状态 |
|
|||
|
|
|------|--------|------|
|
|||
|
|
| 发布前完整性验证 | P0 | ✅ 已实现 |
|
|||
|
|
| 审核状态流转(DRAFT → PENDING → PUBLISHED/REJECTED) | P0 | ✅ 已实现 |
|
|||
|
|
| 单人审核机制(禁止自审) | P0 | ✅ 已实现 |
|
|||
|
|
| 超级管理员直接发布权限 | P0 | ✅ 已实现 |
|
|||
|
|
| 驳回后重新提交流程 | P1 | ✅ 已实现 |
|
|||
|
|
| 审核意见记录 | P1 | ✅ 已实现 |
|
|||
|
|
| 审核管理页面 | P1 | ✅ 已实现 |
|
|||
|
|
| 版本迭代机制(保留旧版本) | P2 | ✅ 已实现 |
|
|||
|
|
| 发布审批日志 | P1 | ✅ 已实现 |
|
|||
|
|
|
|||
|
|
### 10.2 暂不实现功能
|
|||
|
|
|
|||
|
|
| 功能 | 原因 | 预计迭代时间 |
|
|||
|
|
|------|------|-------------|
|
|||
|
|
| 多人审核流程 | 当前规模不需要 | 待定 |
|
|||
|
|
| 细粒度授权控制 | 业务需求不明确 | 待定 |
|
|||
|
|
| 预约上线时间 | 当前无需定时发布 | 待定 |
|
|||
|
|
| 审核超时提醒 | 暂无强需求 | 待定 |
|
|||
|
|
| 版本回滚 | 可通过发布新版解决 | 待定 |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 十一、参考资料
|
|||
|
|
|
|||
|
|
1. [CMS内容审核工作流详解](https://www.woshipm.com/operate/4783399.html)
|
|||
|
|
2. [课程审核与发布流程详解](https://blog.csdn.net/2201_75550069/article/details/149466534)
|
|||
|
|
3. [企业课程管理系统2025评测](https://www.zdsztech.com/blog/qi-ye-ke-cheng-guan-li-xi-tong-na-jia-qiang-2025-nian-zui-zui-xin-ping/)
|
|||
|
|
4. [October CMS内容工作流引擎](https://blog.csdn.net/gitblog_01198/article/details/153449487)
|
|||
|
|
5. [在线课程管理系统开发实战](https://blog.csdn.net/H12131213/article/details/155601761)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 十二、变更记录
|
|||
|
|
|
|||
|
|
| 日期 | 版本 | 变更内容 | 作者 |
|
|||
|
|
|------|------|---------|------|
|
|||
|
|
| 2026-02-13 | v1.0 | 初始版本 | Claude |
|