kindergarten_java/docs/design/13-数据模型与API设计.md
2026-02-28 16:41:39 +08:00

949 lines
31 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设计
> ⚠️ **本文档已过时**
>
> 本文档需要按新结构重构。请参考 **[17-课程包套餐重构需求.md](./17-课程包套餐重构需求.md)** 中的数据模型部分。
>
> 主要变更:
> - 新增:课程套餐表、套餐-课程包关联表
> - 新增:课程表(导入课/集体课/领域课)、教学环节表
> - 新增:校本课程包表、主题字典表
> - 重构:课程包表结构大幅调整
> - 废弃:课程脚本表、逐页配置表(改为课程-环节结构)
>
> 本文档仅供参考,待重构更新。
---
> 创建时间2025-02-04
> 最后更新2025-02-13
> **状态:已过时,待重构**
> 版本MVP v1.1
---
## 一、数据模型设计
### 1.1 核心实体关系图
```
┌─────────────────────────────────────────────────────────────────┐
│ 核心实体关系 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 租户 │────│ 教师 │────│ 班级 │ │
│ │ (Tenant) │ 1 │(Teacher) │ M │ (Class) │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ │ │ │
│ │ M │ M │
│ ▼ ▼ │
│ ┌──────────┐ ┌──────────┐ │
│ │ 学生 │ │ 授课记录 │ │
│ │(Student) │ │(Lesson) │ │
│ └──────────┘ └──────────┘ │
│ │ │ │
│ │ M │ │
│ └────────────────────────────────┘ │
│ │ │
│ │ M │
│ ▼ │
│ ┌──────────┐ │
│ │ 课程包 │ │
│ │(Course) │ │
│ └──────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
```
### 1.2 数据表清单
| 表名 | 说明 | 核心字段 |
|-----|------|---------|
| tenants | 租户(幼儿园) | id, name, package_type, status |
| teachers | 教师 | id, tenant_id, name, phone, classes[], status |
| students | 学生 | id, tenant_id, class_id, name, gender, parent_phone |
| classes | 班级 | id, tenant_id, name, grade, teacher_id |
| courses | 课程包 | id, name, grade_tags[], domain_tags[], status, version |
| course_resources | 课程包资源 | id, course_id, resource_type, file_url |
| course_scripts | 课程脚本 | id, course_id, step_index, content, interactions[] |
| course_activities | 延伸活动 | id, course_id, name, domain, materials[], guide |
| lessons | 授课记录 | id, tenant_id, teacher_id, class_id, course_id, datetime |
| lesson_feedbacks | 课程反馈 | id, lesson_id, teacher_id, rating, comments |
| student_records | 学生测评记录 | id, lesson_id, student_id, participation, understanding |
| tags | 标签体系 | id, level, code, name, parent_id |
| tenant_courses | 租户课程授权 | id, tenant_id, course_id, authorized |
---
### 1.3 详细表结构
#### tenants租户表
```sql
CREATE TABLE tenants (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL COMMENT '幼儿园名称',
address VARCHAR(255) COMMENT '地址',
contact_person VARCHAR(50) COMMENT '联系人',
contact_phone VARCHAR(20) COMMENT '联系电话',
logo_url VARCHAR(255) COMMENT 'Logo URL',
-- 套餐信息
package_type ENUM('basic', 'standard', 'advanced') NOT NULL COMMENT '套餐类型',
teacher_quota INT DEFAULT 20 COMMENT '教师账号配额',
student_quota INT DEFAULT 200 COMMENT '学生档案配额',
storage_quota BIGINT DEFAULT 5368709120 COMMENT '存储配额(字节)',
-- 时间信息
start_date DATE NOT NULL COMMENT '套餐开始日期',
expire_date DATE NOT NULL COMMENT '套餐到期日期',
-- 使用统计
teacher_count INT DEFAULT 0 COMMENT '已使用教师数',
student_count INT DEFAULT 0 COMMENT '已使用学生数',
storage_used BIGINT DEFAULT 0 COMMENT '已使用存储',
-- 状态
status ENUM('active', 'suspended', 'expired') DEFAULT 'active',
-- 审计字段
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_package_type (package_type),
INDEX idx_status (status),
INDEX idx_expire_date (expire_date)
) COMMENT='租户(幼儿园)表';
```
#### teachers教师表
```sql
CREATE TABLE teachers (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
tenant_id BIGINT NOT NULL COMMENT '所属租户ID',
name VARCHAR(50) NOT NULL COMMENT '姓名',
phone VARCHAR(20) NOT NULL COMMENT '手机号',
email VARCHAR(100) COMMENT '邮箱',
-- 账号信息
login_account VARCHAR(100) NOT NULL COMMENT '登录账号',
password_hash VARCHAR(255) NOT NULL COMMENT '密码哈希',
-- 班级信息JSON数组
class_ids JSON COMMENT '负责的班级ID列表',
-- 状态
status ENUM('active', 'suspended') DEFAULT 'active',
-- 统计字段
lesson_count INT DEFAULT 0 COMMENT '授课次数',
feedback_count INT DEFAULT 0 COMMENT '反馈提交数',
-- 审计字段
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
last_login_at DATETIME COMMENT '最后登录时间',
UNIQUE KEY uk_login_account (login_account),
INDEX idx_tenant_id (tenant_id),
INDEX idx_status (status),
FOREIGN KEY (tenant_id) REFERENCES tenants(id)
) COMMENT='教师表';
```
#### students学生表
```sql
CREATE TABLE students (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
tenant_id BIGINT NOT NULL COMMENT '所属租户ID',
class_id BIGINT NOT NULL COMMENT '所属班级ID',
name VARCHAR(50) NOT NULL COMMENT '姓名',
gender ENUM('male', 'female') COMMENT '性别',
birth_date DATE COMMENT '出生日期',
parent_phone VARCHAR(20) COMMENT '家长手机号',
parent_name VARCHAR(50) COMMENT '家长姓名',
-- 统计字段
reading_count INT DEFAULT 0 COMMENT '阅读数量',
lesson_count INT DEFAULT 0 COMMENT '参与课程次数',
-- 审计字段
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_tenant_class (tenant_id, class_id),
INDEX idx_parent_phone (parent_phone),
FOREIGN KEY (tenant_id) REFERENCES tenants(id),
FOREIGN KEY (class_id) REFERENCES classes(id)
) COMMENT='学生表';
```
#### classes班级表
```sql
CREATE TABLE classes (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
tenant_id BIGINT NOT NULL COMMENT '所属租户ID',
name VARCHAR(50) NOT NULL COMMENT '班级名称',
grade ENUM('small', 'middle', 'big') NOT NULL COMMENT '年级',
teacher_id BIGINT COMMENT '负责教师ID',
-- 统计字段
student_count INT DEFAULT 0 COMMENT '学生人数',
lesson_count INT DEFAULT 0 COMMENT '本月授课次数',
-- 审计字段
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_tenant_id (tenant_id),
INDEX idx_grade (grade),
FOREIGN KEY (tenant_id) REFERENCES tenants(id),
FOREIGN KEY (teacher_id) REFERENCES teachers(id)
) COMMENT='班级表';
```
#### courses课程包表
```sql
CREATE TABLE courses (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(200) NOT NULL COMMENT '课程包名称',
description TEXT COMMENT '课程简介',
-- 绘本关联
picture_book_id BIGINT COMMENT '关联绘本ID',
picture_book_name VARCHAR(200) COMMENT '绘本名称',
-- 封面图片
cover_image_path VARCHAR(500) COMMENT '封面图片路径',
-- 标签
grade_tags JSON COMMENT '适切年级标签 ["small", "middle"]',
domain_tags JSON COMMENT '领域标签 [{"level1":"语言", "level2":"阅读与书写准备"}]',
-- 时长
duration INT DEFAULT 25 COMMENT '教学时长(分钟)',
-- 数字资源JSON数组存储多文件路径
ebook_paths JSON COMMENT '电子绘本路径 [{"name":"xxx.pdf", "path":"/uploads/..."}]',
audio_paths JSON COMMENT '音频路径',
video_paths JSON COMMENT '视频路径',
other_resources JSON COMMENT '其他资源路径',
-- 教学材料
ppt_path VARCHAR(500) COMMENT 'PPT文件路径',
ppt_name VARCHAR(200) COMMENT 'PPT文件名',
poster_paths JSON COMMENT '挂图路径',
tools JSON COMMENT '教具列表 [{"name":"剪刀", "quantity":10}]',
student_materials TEXT COMMENT '学生材料',
-- 复杂数据JSON存储- 2025-02-13 新增
lesson_plan_data JSON COMMENT '课堂计划数据 {phases:[], scriptPages:[]}',
activities_data JSON COMMENT '延伸活动数据 [{name, type, content, materials, duration}]',
assessment_data JSON COMMENT '测评工具数据 {enabled, types[], indicators[], ...}',
-- 状态
status ENUM('draft', 'pending', 'rejected', 'published', 'archived') DEFAULT 'draft',
version VARCHAR(20) DEFAULT '1.0' COMMENT '版本号',
-- 审核相关
submitted_at DATETIME COMMENT '提交审核时间',
submitted_by BIGINT COMMENT '提交人ID',
reviewed_at DATETIME COMMENT '审核时间',
reviewed_by BIGINT COMMENT '审核人ID',
review_comment TEXT COMMENT '审核意见',
review_checklist JSON COMMENT '审核检查项',
-- 版本管理
parent_id BIGINT COMMENT '父版本ID迭代时指向原版本',
is_latest BOOLEAN DEFAULT TRUE COMMENT '是否最新版本',
-- 统计字段
usage_count INT DEFAULT 0 COMMENT '使用次数',
teacher_count INT DEFAULT 0 COMMENT '使用教师数',
avg_rating DECIMAL(3,2) DEFAULT 0 COMMENT '平均评分',
-- 审计字段
created_by BIGINT COMMENT '创建者ID超管端用户',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
published_at DATETIME COMMENT '发布时间',
INDEX idx_status (status),
INDEX idx_grade_tags (grade_tags(100)),
INDEX idx_published_at (published_at)
) COMMENT='课程包表';
```
#### course_resources课程包资源表
```sql
CREATE TABLE course_resources (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
course_id BIGINT NOT NULL COMMENT '课程包ID',
resource_type ENUM('ebook', 'audio', 'video', 'ppt', 'animation', 'interactive') NOT NULL,
resource_name VARCHAR(255) NOT NULL COMMENT '资源名称',
file_url VARCHAR(500) NOT NULL COMMENT '文件URL',
file_size BIGINT COMMENT '文件大小(字节)',
mime_type VARCHAR(100) COMMENT 'MIME类型',
metadata JSON COMMENT '其他元数据(时长、分辨率等)',
-- 排序
sort_order INT DEFAULT 0,
-- 审计字段
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
INDEX idx_course_id (course_id),
INDEX idx_resource_type (resource_type),
FOREIGN KEY (course_id) REFERENCES courses(id) ON DELETE CASCADE
) COMMENT='课程包资源表';
```
#### course_scripts课程脚本表
```sql
CREATE TABLE course_scripts (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
course_id BIGINT NOT NULL COMMENT '课程包ID',
step_index INT NOT NULL COMMENT '环节序号',
step_name VARCHAR(100) NOT NULL COMMENT '环节名称',
step_type ENUM('intro', 'guide', 'reading', 'activity', 'ending') NOT NULL,
-- 环节内容
duration INT NOT NULL COMMENT '预计时长(分钟)',
objective TEXT COMMENT '环节目标',
teacher_script TEXT COMMENT '教师话术脚本',
interaction_points JSON COMMENT '互动要点',
-- 关联资源
resource_ids JSON COMMENT '关联的资源ID列表',
-- 排序
sort_order INT DEFAULT 0,
-- 审计字段
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uk_course_step (course_id, step_index),
INDEX idx_course_id (course_id),
FOREIGN KEY (course_id) REFERENCES courses(id) ON DELETE CASCADE
) COMMENT='课程脚本表';
```
#### course_script_pages逐页配置表
```sql
CREATE TABLE course_script_pages (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
script_id BIGINT NOT NULL COMMENT '脚本ID',
page_number INT NOT NULL COMMENT '页码',
questions JSON COMMENT '提问列表',
interaction_component JSON COMMENT '互动组件配置',
teacher_notes TEXT COMMENT '教师提示',
-- 审计字段
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uk_script_page (script_id, page_number),
INDEX idx_script_id (script_id),
FOREIGN KEY (script_id) REFERENCES course_scripts(id) ON DELETE CASCADE
) COMMENT='课程脚本逐页配置表';
```
#### course_activities延伸活动表
```sql
CREATE TABLE course_activities (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
course_id BIGINT NOT NULL COMMENT '课程包ID',
name VARCHAR(200) NOT NULL COMMENT '活动名称',
-- 分类
domain VARCHAR(100) COMMENT '所属领域',
domain_tag_id BIGINT COMMENT '关联领域标签ID',
activity_type ENUM('hands_on', 'communication', 'game', 'other') NOT NULL,
duration INT COMMENT '预计时长(分钟)',
-- 素材
online_materials JSON COMMENT '线上素材 [{"name":"xxx", "url":"xxx"}]',
offline_materials TEXT COMMENT '线下素材说明',
-- 活动指引
activity_guide TEXT COMMENT '详细活动指引',
objectives TEXT COMMENT '活动目标',
-- 排序
sort_order INT DEFAULT 0,
-- 审计字段
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
INDEX idx_course_id (course_id),
FOREIGN KEY (course_id) REFERENCES courses(id) ON DELETE CASCADE
) COMMENT='延伸活动表';
```
#### lessons授课记录表
```sql
CREATE TABLE lessons (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
tenant_id BIGINT NOT NULL COMMENT '租户ID',
teacher_id BIGINT NOT NULL COMMENT '教师ID',
class_id BIGINT NOT NULL COMMENT '班级ID',
course_id BIGINT NOT NULL COMMENT '课程包ID',
-- 时间
planned_datetime DATETIME COMMENT '计划上课时间',
start_datetime DATETIME COMMENT '实际开始时间',
end_datetime DATETIME COMMENT '实际结束时间',
actual_duration INT COMMENT '实际时长(分钟)',
-- 状态
status ENUM('planned', 'in_progress', 'completed', 'cancelled') DEFAULT 'planned',
-- 快速记录
overall_rating ENUM('excellent', 'good', 'average', 'needs_improvement') COMMENT '整体效果',
participation_rating ENUM('very_high', 'high', 'medium', 'low') COMMENT '参与度',
completion_note ENUM('all_completed', 'adjusted', 'partial') COMMENT '完成情况',
-- 审计字段
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_tenant_teacher (tenant_id, teacher_id),
INDEX idx_class_id (class_id),
INDEX idx_course_id (course_id),
INDEX idx_status (status),
INDEX idx_start_datetime (start_datetime),
FOREIGN KEY (tenant_id) REFERENCES tenants(id),
FOREIGN KEY (teacher_id) REFERENCES teachers(id),
FOREIGN KEY (class_id) REFERENCES classes(id),
FOREIGN KEY (course_id) REFERENCES courses(id)
) COMMENT='授课记录表';
```
#### lesson_feedbacks课程反馈表
```sql
CREATE TABLE lesson_feedbacks (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
lesson_id BIGINT NOT NULL COMMENT '授课记录ID',
teacher_id BIGINT NOT NULL COMMENT '教师ID',
-- 整体评价
design_quality TINYINT COMMENT '课程设计质量 1-5',
participation TINYINT COMMENT '孩子参与度 1-5',
goal_achievement TINYINT COMMENT '教学目标达成度 1-5',
-- 环节反馈JSON
step_feedbacks JSON COMMENT '各环节反馈和评分',
-- 优点与建议
pros TEXT COMMENT '优点',
suggestions TEXT COMMENT '改进建议',
-- 延伸活动开展
activities_done JSON COMMENT '开展的延伸活动列表',
-- 审计字段
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uk_lesson_teacher (lesson_id, teacher_id),
INDEX idx_lesson_id (lesson_id),
INDEX idx_teacher_id (teacher_id),
FOREIGN KEY (lesson_id) REFERENCES lessons(id) ON DELETE CASCADE,
FOREIGN KEY (teacher_id) REFERENCES teachers(id)
) COMMENT='课程反馈表';
```
#### student_records学生测评记录表
```sql
CREATE TABLE student_records (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
lesson_id BIGINT NOT NULL COMMENT '授课记录ID',
student_id BIGINT NOT NULL COMMENT '学生ID',
-- 参与度评分1-5
focus TINYINT COMMENT '专注度',
participation TINYINT COMMENT '参与度',
interest TINYINT COMMENT '兴趣度',
understanding TINYINT COMMENT '理解度',
-- 领域目标达成JSON
domain_achievements JSON COMMENT '各领域目标达成情况',
-- 备注
notes TEXT COMMENT '备注',
-- 审计字段
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uk_lesson_student (lesson_id, student_id),
INDEX idx_lesson_id (lesson_id),
INDEX idx_student_id (student_id),
FOREIGN KEY (lesson_id) REFERENCES lessons(id) ON DELETE CASCADE,
FOREIGN KEY (student_id) REFERENCES students(id)
) COMMENT='学生测评记录表';
```
#### tags标签体系表
```sql
CREATE TABLE tags (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
level TINYINT NOT NULL COMMENT '层级 1-4',
code VARCHAR(50) NOT NULL COMMENT '标签编码',
name VARCHAR(100) NOT NULL COMMENT '标签名称',
parent_id BIGINT COMMENT '父标签ID',
-- 额外信息
description TEXT COMMENT '说明',
metadata JSON COMMENT '其他元数据',
-- 排序
sort_order INT DEFAULT 0,
-- 审计字段
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY uk_code (code),
INDEX idx_parent_id (parent_id),
INDEX idx_level (level)
) COMMENT='标签体系表';
```
#### tenant_courses租户课程授权表
```sql
CREATE TABLE tenant_courses (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
tenant_id BIGINT NOT NULL COMMENT '租户ID',
course_id BIGINT NOT NULL COMMENT '课程包ID',
-- 授权信息
authorized BOOLEAN DEFAULT TRUE COMMENT '是否授权',
authorized_at DATETIME COMMENT '授权时间',
-- 审计字段
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY uk_tenant_course (tenant_id, course_id),
INDEX idx_tenant_id (tenant_id),
INDEX idx_course_id (course_id),
FOREIGN KEY (tenant_id) REFERENCES tenants(id) ON DELETE CASCADE,
FOREIGN KEY (course_id) REFERENCES courses(id) ON DELETE CASCADE
) COMMENT='租户课程授权表';
```
---
## 二、API接口设计
### 2.1 接口规范
| 项目 | 说明 |
|-----|------|
| 协议 | HTTPS |
| 数据格式 | JSON |
| 认证方式 | JWT Token |
| 基础路径 | `/api/v1` |
| 错误码 | 标准HTTP状态码 + 业务错误码 |
### 2.2 通用响应格式
```json
// 成功响应
{
"code": 0,
"message": "success",
"data": {}
}
// 错误响应
{
"code": 1001,
"message": "参数错误",
"data": null
}
```
### 2.3 认证接口
| 方法 | 路径 | 说明 |
|-----|------|-----|
| POST | `/auth/login` | 登录 |
| POST | `/auth/logout` | 登出 |
| POST | `/auth/refresh` | 刷新Token |
| GET | `/auth/profile` | 获取当前用户信息 |
**登录请求示例:**
```json
POST /api/v1/auth/login
{
"account": "teacher@school.com",
"password": "123456",
"role": "teacher"
}
```
**登录响应示例:**
```json
{
"code": 0,
"message": "success",
"data": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"user": {
"id": 1,
"name": "李老师",
"role": "teacher",
"tenant_id": 1
}
}
}
```
---
### 2.4 超管端API
#### 课程包管理
| 方法 | 路径 | 说明 |
|-----|------|-----|
| POST | `/admin/courses` | 创建课程包 |
| GET | `/admin/courses` | 获取课程包列表 |
| GET | `/admin/courses/:id` | 获取课程包详情 |
| PUT | `/admin/courses/:id` | 更新课程包 |
| DELETE | `/admin/courses/:id` | 删除课程包 |
| POST | `/admin/courses/:id/publish` | 发布课程包 |
| POST | `/admin/courses/:id/unpublish` | 下架课程包 |
| GET | `/admin/courses/:id/stats` | 获取课程包统计数据 |
**创建课程包请求示例:**
```json
POST /api/v1/admin/courses
{
"name": "好饿的毛毛虫完整阅读活动",
"picture_book_id": 1,
"grade_tags": ["middle", "big"],
"domain_tags": [
{"level1": "语言", "level2": "阅读与书写准备"},
{"level1": "科学", "level2": "科学探究"}
],
"duration": 25,
"description": "通过绘本..."
}
```
#### 课程包资源管理
| 方法 | 路径 | 说明 |
|-----|------|-----|
| POST | `/admin/courses/:id/resources` | 上传资源 |
| GET | `/admin/courses/:id/resources` | 获取资源列表 |
| DELETE | `/admin/resources/:id` | 删除资源 |
#### 课程包脚本管理
| 方法 | 路径 | 说明 |
|-----|------|-----|
| POST | `/admin/courses/:id/scripts` | 创建教学环节 |
| GET | `/admin/courses/:id/scripts` | 获取教学环节列表 |
| PUT | `/admin/scripts/:id` | 更新教学环节 |
| DELETE | `/admin/scripts/:id` | 删除教学环节 |
| POST | `/admin/scripts/:id/pages` | 添加逐页配置 |
| PUT | `/admin/script-pages/:id` | 更新逐页配置 |
#### 租户管理
| 方法 | 路径 | 说明 |
|-----|------|-----|
| POST | `/admin/tenants` | 创建租户 |
| GET | `/admin/tenants` | 获取租户列表 |
| GET | `/admin/tenants/:id` | 获取租户详情 |
| PUT | `/admin/tenants/:id` | 更新租户 |
| DELETE | `/admin/tenants/:id` | 删除租户 |
| POST | `/admin/tenants/:id/suspend` | 停用租户 |
| POST | `/admin/tenants/:id/activate` | 启用租户 |
| PUT | `/admin/tenants/:id/package` | 更改套餐 |
| POST | `/admin/tenants/:id/courses` | 授权课程包 |
**创建租户请求示例:**
```json
POST /api/v1/admin/tenants
{
"name": "阳光幼儿园",
"address": "北京市朝阳区xx路xx号",
"contact_person": "张园长",
"contact_phone": "010-12345678",
"package_type": "advanced",
"start_date": "2024-09-01",
"expire_date": "2025-09-01"
}
```
---
### 2.5 学校端API
#### 教师管理
| 方法 | 路径 | 说明 |
|-----|------|-----|
| POST | `/school/teachers` | 新增教师 |
| GET | `/school/teachers` | 获取教师列表 |
| GET | `/school/teachers/:id` | 获取教师详情 |
| PUT | `/school/teachers/:id` | 更新教师信息 |
| POST | `/school/teachers/:id/suspend` | 停用教师 |
| POST | `/school/teachers/:id/activate` | 启用教师 |
| POST | `/school/teachers/:id/reset-password` | 重置密码 |
#### 学生管理
| 方法 | 路径 | 说明 |
|-----|------|-----|
| POST | `/school/students` | 新增学生 |
| GET | `/school/students` | 获取学生列表 |
| GET | `/school/students/:id` | 获取学生详情 |
| PUT | `/school/students/:id` | 更新学生信息 |
| DELETE | `/school/students/:id` | 删除学生 |
| POST | `/school/students/import` | 批量导入学生 |
| GET | `/school/students/:id/growth` | 获取学生成长档案 |
#### 班级管理
| 方法 | 路径 | 说明 |
|-----|------|-----|
| POST | `/school/classes` | 新增班级 |
| GET | `/school/classes` | 获取班级列表 |
| PUT | `/school/classes/:id` | 更新班级信息 |
#### 数据统计
| 方法 | 路径 | 说明 |
|-----|------|-----|
| GET | `/school/stats/overview` | 获取概览数据 |
| GET | `/school/stats/teachers` | 获取教师统计 |
| GET | `/school/stats/courses` | 获取课程统计 |
| GET | `/school/stats/report` | 导出数据报表 |
---
### 2.6 教师端API
#### 课程包
| 方法 | 路径 | 说明 |
|-----|------|-----|
| GET | `/teacher/courses` | 获取课程包列表(已授权) |
| GET | `/teacher/courses/:id` | 获取课程包详情 |
| GET | `/teacher/courses/:id/preview` | 预览课程包(备课模式) |
| POST | `/teacher/courses/:id/favorite` | 收藏课程包 |
| DELETE | `/teacher/courses/:id/favorite` | 取消收藏 |
| POST | `/teacher/planned-lessons` | 添加到待上清单 |
#### 授课
| 方法 | 路径 | 说明 |
|-----|------|-----|
| POST | `/teacher/lessons` | 创建授课计划 |
| GET | `/teacher/lessons` | 获取授课记录列表 |
| GET | `/teacher/lessons/:id` | 获取授课详情 |
| POST | `/teacher/lessons/:id/start` | 开始上课 |
| POST | `/teacher/lessons/:id/complete` | 结束上课 |
#### 反馈
| 方法 | 路径 | 说明 |
|-----|------|-----|
| POST | `/teacher/lessons/:id/quick-feedback` | 快速反馈 |
| POST | `/teacher/lessons/:id/detailed-feedback` | 详细反馈 |
| GET | `/teacher/lessons/:id/feedback` | 获取反馈记录 |
#### 学生测评
| 方法 | 路径 | 说明 |
|-----|------|-----|
| POST | `/teacher/lessons/:id/student-records` | 批量创建学生测评 |
| PUT | `/teacher/student-records/:id` | 更新学生测评 |
#### 班级与学生
| 方法 | 路径 | 说明 |
|-----|------|-----|
| GET | `/teacher/classes` | 获取我的班级列表 |
| GET | `/teacher/classes/:id/students` | 获取班级学生 |
| GET | `/teacher/students/:id/growth` | 查看学生成长档案 |
---
### 2.7 公共API
| 方法 | 路径 | 说明 |
|-----|------|-----|
| GET | `/common/tags` | 获取标签体系 |
| GET | `/common/grades` | 获取年级配置 |
| GET | `/common/upload-url` | 获取文件上传URL |
| GET | `/common/resources/:id/download` | 下载资源 |
---
## 三、接口调用示例
### 3.1 教师端完整流程
```javascript
// 1. 登录
const loginResponse = await fetch('/api/v1/auth/login', {
method: 'POST',
body: JSON.stringify({
account: 'teacher@school.com',
password: '123456',
role: 'teacher'
})
});
const { token } = loginResponse.data;
// 2. 获取课程包列表
const coursesResponse = await fetch('/api/v1/teacher/courses?grade=middle', {
headers: { 'Authorization': `Bearer ${token}` }
});
// 3. 获取课程包详情(备课模式)
const courseDetailResponse = await fetch(`/api/v1/teacher/courses/${courseId}/preview`, {
headers: { 'Authorization': `Bearer ${token}` }
});
// 4. 创建授课计划
const lessonResponse = await fetch('/api/v1/teacher/lessons', {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
course_id: courseId,
class_id: classId,
planned_datetime: '2025-02-05 10:00:00'
})
});
const lessonId = lessonResponse.data.id;
// 5. 开始上课
await fetch(`/api/v1/teacher/lessons/${lessonId}/start`, {
method: 'POST',
headers: { 'Authorization': `Bearer ${token}` }
});
// 6. 结束上课并快速反馈
await fetch(`/api/v1/teacher/lessons/${lessonId}/complete`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
overall_rating: 'good',
participation_rating: 'high',
completion_note: 'all_completed'
})
});
// 7. 提交详细反馈
await fetch(`/api/v1/teacher/lessons/${lessonId}/detailed-feedback`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
design_quality: 5,
participation: 5,
goal_achievement: 4,
pros: '课件精美,互动丰富',
suggestions: '共读环节可以延长'
})
});
// 8. 提交学生测评记录
await fetch(`/api/v1/teacher/lessons/${lessonId}/student-records`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
records: [
{
student_id: 1,
focus: 4,
participation: 5,
interest: 5,
understanding: 4
},
{
student_id: 2,
focus: 3,
participation: 4,
interest: 4,
understanding: 3
}
]
})
});
```
---
## 四、后续优化方向
### 4.1 性能优化
| 优化项 | 说明 |
|-------|------|
| 缓存 | Redis缓存热点数据课程包、标签等 |
| 分页 | 所有列表接口支持分页 |
| 索引 | 优化查询索引,提升查询效率 |
| CDN | 静态资源音视频、图片使用CDN |
### 4.2 安全加固
| 优化项 | 说明 |
|-------|------|
| 数据隔离 | 租户数据完全隔离,防止跨租户访问 |
| 权限控制 | 基于角色的权限控制RBAC |
| 审计日志 | 记录关键操作日志 |
| 敏感数据 | 加密存储敏感信息 |
---
## 五、下一步
1. 前端技术栈确认Vue/React
2. 后端技术栈确认Node.js/Java/Go
3. 数据库选型确认
4. 开发环境搭建