20 KiB
20 KiB
在线学习系统实施计划
项目架构设计
系统架构
┌─────────────────┐ ┌─────────────────┐
│ 管理后台 │ │ UniApp客户端 │
│ (Vue Web) │ │ (Vue) │
└────────┬────────┘ └────────┬────────┘
│ │
│ HTTP/WebSocket │
└───────────┬───────────────┘
│
┌───────────▼───────────┐
│ Java后端服务 │
│ (Spring Boot) │
└───────────┬───────────┘
│
┌───────────▼───────────┐
│ MySQL数据库 │
└───────────────────────┘
技术选型
前端(UniApp)
- 框架:UniApp + Vue 3
- UI组件库:uView UI 或 uni-ui
- 状态管理:Vuex 或 Pinia
- 网络请求:uni.request 封装
- 文件上传:uni.uploadFile
- 屏幕截图:使用canvas或plus API实现
- 视频播放:video组件,支持进度跟踪
- 图表库:echarts-for-uniapp(用于成绩统计图表)
- 平台支持:iOS 12+、Android 8.0+
- 横屏支持:强制横屏或横竖屏自适应
后端(Java)
- 框架:Spring Boot 2.7+ 或 3.x
- 安全框架:Spring Security(简化版,仅账号密码)
- ORM框架:MyBatis-Plus
- 文件存储:本地文件系统(局域网部署)
- WebSocket:Spring WebSocket(用于实时监控)
- 权限控制:基于角色的权限控制(RBAC)
- 文件处理:
- PDF处理:Apache PDFBox(用于PDF生成和打印)
- Excel处理:EasyExcel(用于数据导入导出)
- 视频处理:FFmpeg(视频转码,在保证清晰度的情况下压缩文件大小)
- 图表生成:JFreeChart 或 ECharts Java(用于后端图表生成
数据库
- 版本:MySQL 5.7+ 或 8.0+
- 字符集:utf8mb4
语音评测服务
- 候选方案:
- 科大讯飞语音评测(价格中等,准确率高)
- 百度语音识别(价格较低)
- 腾讯云语音识别(价格中等)
- 阿里云语音识别(价格中等)
- 选择原则:根据实际使用量和价格选择
功能模块划分
后端模块
-
用户认证模块(auth)
- 登录、登出
- 权限验证
- Token管理
-
用户管理模块(user)
- 管理员管理
- 学员管理
- 角色权限管理
-
班级管理模块(class)
- 班级CRUD
- 学员分配
- 班级查询
-
课件管理模块(courseware)
- 课件上传
- 课件分类
- 课件查询
- 文件存储管理
-
课程管理模块(course)
- 课程创建
- 课程发布
- 课程分配
- 学习进度跟踪
-
学习监控模块(monitor)
- 屏幕截图接收
- 实时监控
- 历史记录查询
-
语音评测模块(voice)
- 语音上传
- 语音评测接口调用
- 评测结果存储
-
考试模块(exam)
- 题库管理
- 试卷生成
- 考试发布
- 自动评分
- 成绩统计
-
成绩管理模块(score)
- 成绩查询
- 成绩统计
- 成绩单生成(PDF)
-
数据导入导出模块(import-export)
- Excel导入
- 数据导出
- 模板下载
前端模块(UniApp)
-
登录模块
- 学员登录
- 自动登录(Token保存)
-
课程学习模块
- 课程列表(显示分配的课程)
- 课件查看:
- 图文课件:PDF、图片、文档在线查看
- 视频课件:视频播放,支持横屏全屏
- 学习进度跟踪:
- 视频播放进度实时上报(每5-10秒)
- 记录学习开始和结束时间
- 记录视频播放位置
- 累计学习时长和次数
- 学习记录本地缓存
-
语音练习模块
- 课文显示
- 语音录制(使用uni.getRecorderManager)
- 语音上传
- 评测结果展示
- 评测历史记录
-
考试模块
- 考试列表(显示分配的考试)
- 答题界面:
- 单选题、多选题、判断题、填空题
- 答题进度显示
- 考试倒计时
- 考试提交
- 成绩查看
- 重考功能(如果允许)
-
个人中心模块
- 个人信息
- 学习记录查看
- 学习进度查看(视频播放进度、学习次数、观看时长)
- 成绩查询
- 语音评测记录
-
屏幕监控模块
- 定时截图(每30秒或可配置)
- 截图上传到服务器
- 后台运行(保活机制)
管理后台模块(Vue Web)
-
仪表盘
- 数据统计(管理员和教师分别显示)
- 快捷操作
- 权限控制显示
-
用户管理(仅管理员)
- 学员管理
- 教师管理
- 管理员管理
- 角色权限分配
-
班级管理
- 班级列表(教师只能看到自己管理的班级)
- 学员分配
- 教师分配(仅管理员)
-
课件管理
- 课件上传(需选择学科分类)
- 课件列表
- 学科分类管理(仅管理员)
- 课件删除和编辑
-
课程管理
- 课程创建
- 课程发布(分配给学员/班级)
- 学习进度查看(视频播放进度、学习次数、观看时长)
- 学习监控(实时画面和历史记录)
-
考试管理
- 题库管理
- 试卷管理
- 考试发布
- 考试规则设置(教师可设置,管理员可限制重考)
- 重考限制设置(仅管理员)
-
成绩管理
- 成绩查询(教师只能查看自己班级)
- 成绩统计图表(柱状图、折线图、饼图等)
- 成绩单打印(PDF导出)
- 成绩分析
数据库设计(初步规划)
核心表结构
1. 用户表(sys_user)
- id: 主键
- username: 用户名(唯一)
- password: 密码(加密存储)
- real_name: 真实姓名
- role: 角色(admin/teacher/student)
- status: 状态(0:禁用 1:启用)
- create_time: 创建时间
- update_time: 更新时间
2. 学科分类表(subject)
- id: 主键
- subject_name: 学科名称(如:语文、数学、英语等)
- subject_code: 学科编码
- sort_order: 排序
- status: 状态
- create_time: 创建时间
3. 班级表(class)
- id: 主键
- class_name: 班级名称
- class_code: 班级编号
- teacher_id: 班主任ID(教师用户ID)
- description: 班级描述
- status: 状态
- create_time: 创建时间
- update_time: 更新时间
4. 学员班级关联表(student_class)
- id: 主键
- student_id: 学员ID
- class_id: 班级ID
- join_time: 加入时间
- status: 状态
5. 课件表(courseware)
- id: 主键
- title: 课件标题
- type: 课件类型(text/video/image/document)
- file_path: 文件路径
- file_size: 文件大小(字节)
- file_name: 原始文件名
- subject_id: 学科分类ID(外键关联subject表)
- upload_user_id: 上传人ID
- description: 课件描述
- duration: 视频时长(秒,仅视频类型)
- create_time: 创建时间
- update_time: 更新时间
6. 课程表(course)
- id: 主键
- course_name: 课程名称
- courseware_id: 课件ID(外键关联courseware表)
- description: 课程描述
- start_time: 开始时间
- end_time: 结束时间
- create_user_id: 创建人ID
- status: 状态
- create_time: 创建时间
- update_time: 更新时间
7. 课程分配表(course_assignment)
- id: 主键
- course_id: 课程ID(外键关联course表)
- student_id: 学员ID(可为空,表示分配给班级)
- class_id: 班级ID(可为空,表示分配给个人)
- assign_time: 分配时间
- assign_user_id: 分配人ID
- status: 状态(0:未开始 1:进行中 2:已结束)
- create_time: 创建时间
8. 学习记录表(learning_record)
- id: 主键
- student_id: 学员ID(外键关联sys_user表)
- course_id: 课程ID(外键关联course表)
- progress: 学习进度(百分比,0-100)
- total_duration: 总学习时长(秒,累计)
- learn_count: 学习次数(累计)
- video_progress: 视频播放进度(秒,仅视频类型)
- video_total_duration: 视频总时长(秒,仅视频类型)
- last_learn_time: 最后学习时间
- last_video_position: 最后视频播放位置(秒)
- create_time: 创建时间
- update_time: 更新时间
8.1 学习详情记录表(learning_detail)
- id: 主键
- learning_record_id: 学习记录ID(外键关联learning_record表)
- student_id: 学员ID
- course_id: 课程ID
- start_time: 本次学习开始时间
- end_time: 本次学习结束时间
- duration: 本次学习时长(秒)
- video_start_position: 视频开始位置(秒)
- video_end_position: 视频结束位置(秒)
- create_time: 创建时间
9. 学习监控表(monitor_record)
- id: 主键
- student_id: 学员ID(外键关联sys_user表)
- course_id: 课程ID(外键关联course表,可为空)
- screenshot_path: 截图路径
- monitor_time: 监控时间
- device_info: 设备信息(JSON格式)
- ip_address: IP地址
- create_time: 创建时间
10. 语音评测表(voice_evaluation)
- id: 主键
- student_id: 学员ID(外键关联sys_user表)
- course_id: 课程ID(外键关联course表)
- content: 评测内容(课文或文字)
- audio_path: 音频文件路径
- score: 评分(总分)
- accuracy: 准确度(0-100)
- fluency: 流畅度(0-100)
- completeness: 完整度(0-100)
- result_detail: 评测详情(JSON格式,包含详细评测结果)
- create_time: 创建时间
11. 题库表(question_bank)
- id: 主键
- question_type: 题型(single:单选题 multiple:多选题 judge:判断题 fill:填空题)
- question_content: 题目内容
- options: 选项(JSON格式,如:["选项A","选项B","选项C","选项D"])
- correct_answer: 正确答案(JSON格式,多选题和填空题为数组)
- score: 分值
- difficulty: 难度(1:简单 2:中等 3:困难)
- subject_id: 学科分类ID(外键关联subject表)
- category: 分类标签
- create_user_id: 创建人ID
- create_time: 创建时间
- update_time: 更新时间
12. 试卷表(exam_paper)
- id: 主键
- paper_name: 试卷名称
- question_ids: 题目ID列表(JSON格式数组)
- total_score: 总分
- duration: 考试时长(分钟)
- create_user_id: 创建人ID
- create_time: 创建时间
- update_time: 更新时间
13. 考试表(exam)
- id: 主键
- exam_name: 考试名称
- paper_id: 试卷ID(外键关联exam_paper表)
- start_time: 开始时间
- end_time: 结束时间
- duration: 考试时长(分钟,可为空,表示不限制)
- class_id: 班级ID(可为空,表示分配给个人)
- student_id: 学员ID(可为空,表示分配给班级)
- allow_retake: 是否允许重考(0:不允许 1:允许,管理员可设置)
- max_retake_times: 最大重考次数(如果允许重考)
- create_user_id: 创建人ID
- status: 状态(0:未开始 1:进行中 2:已结束)
- create_time: 创建时间
- update_time: 更新时间
14. 考试记录表(exam_record)
- id: 主键
- exam_id: 考试ID(外键关联exam表)
- student_id: 学员ID(外键关联sys_user表)
- paper_id: 试卷ID(外键关联exam_paper表)
- answers: 答案(JSON格式,存储题目ID和答案的映射)
- score: 得分
- start_time: 开始时间
- submit_time: 提交时间
- duration: 考试用时(秒)
- status: 状态(doing:进行中 completed:已完成)
- retake_count: 重考次数(第几次参加该考试)
- create_time: 创建时间
- update_time: 更新时间
开发阶段规划
第一阶段:基础架构搭建(预计1-2周)
目标:搭建项目基础框架,完成核心功能的基础部分
后端任务
- 创建Spring Boot项目
- 配置数据库连接
- 创建数据库表结构(包含所有核心表)
- 实现用户认证模块(登录、Token、权限验证)
- 实现基于角色的权限控制(RBAC)
- 实现基础CRUD接口(用户管理、学科分类)
- 配置文件上传功能
- 配置跨域和WebSocket(跨域已配置,WebSocket待实现)
- 实现数据权限过滤(教师只能看到自己班级的数据)
前端任务(UniApp)
- 创建UniApp项目基础结构
- 配置项目结构
- 实现登录页面
- 封装网络请求(包含Token管理)
- 实现基础路由
- 配置横屏支持
- 实现权限控制(路由守卫)
管理后台任务
- 创建Vue项目基础结构
- 配置路由和状态管理
- 实现登录页面
- 实现基础布局(菜单、权限控制)
- 实现权限控制(路由守卫、菜单权限)
- 集成图表库(ECharts)
第二阶段:核心功能开发(预计3-4周)
目标:完成核心业务功能
2.1 用户和班级管理
- 用户管理(管理员、教师、学员)
- 学员信息管理(CRUD)
- 学员信息批量导入(Excel/CSV)
- 班级管理(CRUD)
- 学员班级分配
- 教师班级分配(管理员分配教师管理班级)
- 权限控制实现(教师只能管理自己的班级)
2.2 课件管理
- 学科分类管理(管理员)
- 课件上传功能(需选择学科分类)
- 课件列表查询(按学科分类、权限过滤)
- 课件删除功能
- 视频文件处理(FFmpeg转码,压缩文件大小)
2.3 课程管理
- 课程创建
- 课程发布(分配给学员/班级)
- App端课程列表
- 课件查看(图文/视频播放)
- 学习进度跟踪:
- 视频播放进度上报接口
- 学习记录存储(学习次数、观看时长)
- 学习详情记录
- 学习进度查询接口
- 后台学习进度查看(管理员和教师)
2.4 学习监控
- App端截图功能
- 截图上传接口
- 后台监控查看
- 历史记录查询
第三阶段:语音和考试功能(预计2-3周)
目标:完成语音评测和考试模块
3.1 语音评测
- 调研并选择语音服务商
- 集成语音评测API
- 实现语音录制功能
- 实现评测结果展示
- 评测记录存储
3.2 考试模块
- 题库管理(题目CRUD,按学科分类)
- 试卷生成功能
- 考试发布功能(分配给学员/班级)
- 考试规则设置(教师可设置时长、时间等)
- 重考限制设置(管理员可设置是否允许重考)
- App端考试界面
- 自动评分功能
- 成绩统计(按班级、按学员等)
第四阶段:成绩管理和优化(预计1-2周)
目标:完成成绩管理和系统优化
4.1 成绩管理
- 成绩查询功能(权限控制:教师只能查看自己班级)
- 成绩统计功能
- 成绩统计图表(柱状图、折线图、饼图等)
- 成绩单生成(PDF)
- 成绩打印功能
- 成绩导出功能
4.2 系统优化
- 性能优化
- 界面优化
- 错误处理完善
- 日志记录
第五阶段:测试和部署(预计1周)
目标:系统测试和部署准备
5.1 测试
- 功能测试
- 兼容性测试
- 性能测试
- 安全测试
5.2 部署
- 部署文档编写
- 数据库初始化脚本
- 部署环境配置
- 上线准备
技术难点和解决方案
1. 屏幕截图上传
难点:UniApp如何实现屏幕截图并上传 解决方案:
- 使用uni.canvasToTempFilePath将页面转为图片
- 或使用plus.screen.capture(需5+App环境)
- 定时上传截图到服务器
2. 视频播放
难点:UniApp视频播放兼容性 解决方案:
- 使用video组件
- 支持多种视频格式
- 处理横屏播放
3. 语音评测
难点:选择合适的语音服务并集成 解决方案:
- 对比各服务商价格和功能
- 封装统一的语音评测接口
- 支持后续切换服务商
4. 文件存储
难点:局域网部署的文件存储 解决方案:
- 使用本地文件系统存储
- 配置静态资源访问
- 考虑文件大小限制
5. 实时监控
难点:实时查看学生学习画面 解决方案:
- 使用WebSocket推送最新截图
- 或使用轮询方式获取最新截图
- 考虑性能优化
下一步行动
- 确认需求:与用户确认需求文档是否完整准确
- 技术选型确认:确认技术栈选择
- 数据库设计:详细设计数据库表结构
- 接口设计:设计前后端接口规范
- 开始开发:按照开发阶段逐步实施
权限控制设计
角色权限矩阵
| 功能模块 | 管理员 | 教师 | 学员 |
|---|---|---|---|
| 用户管理 | ✅ 全部 | ❌ | ❌ |
| 教师管理 | ✅ 全部 | ❌ | ❌ |
| 学科分类管理 | ✅ 全部 | ❌ | ❌ |
| 班级管理 | ✅ 全部 | ✅ 仅自己管理的班级 | ❌ |
| 学员管理 | ✅ 全部 | ✅ 仅自己班级的学员 | ❌ |
| 课件管理 | ✅ 全部 | ✅ 上传和管理 | ❌ |
| 课程管理 | ✅ 全部 | ✅ 创建和发布 | ✅ 查看和学习 |
| 学习监控 | ✅ 全部 | ✅ 仅自己班级 | ❌ |
| 学习进度查看 | ✅ 全部 | ✅ 仅自己班级 | ✅ 仅自己 |
| 考试管理 | ✅ 全部 | ✅ 创建和发布 | ✅ 参加考试 |
| 考试规则设置 | ✅ 全部(可限制重考) | ✅ 设置规则 | ❌ |
| 成绩查看 | ✅ 全部 | ✅ 仅自己班级 | ✅ 仅自己 |
| 成绩统计 | ✅ 全部 | ✅ 仅自己班级 | ❌ |
数据权限控制
- 教师数据隔离:教师只能查看和管理自己负责的班级相关数据
- 学员数据隔离:学员只能查看自己的学习记录和成绩
- 管理员全局权限:管理员可以查看和管理所有数据
视频处理策略
视频压缩和优化
- 目标:在保证清晰度的情况下,文件大小尽量最小
- 方案:
- 使用FFmpeg进行视频转码
- 视频编码:H.264(兼容性好)
- 音频编码:AAC
- 分辨率:根据原始视频自动适配,最大不超过1080p
- 码率:动态码率,平衡清晰度和文件大小
- 格式:统一转换为MP4格式
视频播放进度跟踪
- 跟踪方式:
- 前端定时上报播放进度(每5-10秒)
- 视频暂停/播放/结束事件上报
- 后端记录每次学习的详细记录
- 计算总学习时长和播放进度百分比
图表展示需求
成绩统计图表类型
- 柱状图:各班级/学员成绩对比
- 折线图:成绩趋势分析(时间维度)
- 饼图:成绩分布(优秀、良好、及格、不及格)
- 雷达图:多维度成绩分析
- 表格:详细成绩数据表格
图表展示位置
- 管理后台:成绩管理页面、仪表盘
- 图表库:前端使用ECharts,后端生成使用JFreeChart或ECharts Java
已确认事项
✅ 用户角色:区分管理员和教师,教师只能管理自己的班级,管理员管理所有 ✅ 课程分类:按学科分类,学科分类由管理员管理 ✅ 学习进度:视频播放进度实时跟踪,记录学习次数和观看时间,管理员和教师都可查看 ✅ 考试规则:教师可以自定义,管理员可以限制是否重考 ✅ 成绩统计:需要图表展示(柱状图、折线图、饼图等) ✅ 文件大小:暂无限制,在保证清晰度的情况下文件大小尽量最小 ✅ 设备兼容性:同时兼容iOS和Android,兼容主流系统(iOS 12+、Android 8.0+)