# 数据模型与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. 开发环境搭建