1. 项目概述
企业级在线课程管理系统是基于SpringBoot+Vue+MyBatis技术栈构建的完整解决方案,专为教育机构、培训机构和企业内训部门设计。这套系统采用前后端分离架构,后端使用SpringBoot框架提供RESTful API服务,前端采用Vue.js实现响应式界面,数据持久层使用MyBatis操作MySQL数据库。
我在实际开发中发现,这类系统需要特别关注三个核心需求:课程管理的灵活性、用户权限的精细控制以及学习数据的统计分析。系统源码完整包含了用户管理、课程管理、学习进度跟踪、考试测评等模块,可以直接部署使用或作为二次开发的基础框架。
2. 技术架构解析
2.1 后端技术栈
SpringBoot 2.7.x作为后端基础框架,其自动配置特性大幅简化了项目初始化工作。我在配置时特别注意了几个关键点:
- 使用Spring Security进行认证授权
- 集成Swagger用于API文档自动生成
- 配置多数据源支持(主从分离)
- 事务管理采用@Transactional注解
MyBatis 3.5.x作为ORM框架,配合MyBatis-Plus 3.5.x增强功能。实际开发中,我推荐使用XML映射文件而非注解方式,因为:
- 复杂SQL更易维护
- 支持动态SQL
- 便于SQL优化
- 与MyBatis-Plus的BaseMapper形成互补
2.2 前端技术栈
Vue 3.x作为前端框架,采用Composition API编写组件。系统实现了以下关键功能:
- 基于Vue Router的路由管理
- 使用Pinia进行状态管理
- Element Plus组件库构建UI
- Axios封装HTTP请求
特别值得注意的是视频播放功能,系统支持m3u8格式的流媒体播放,通过vue-video-player组件实现,并做了以下优化:
- 自适应码率
- 断点续播
- 播放速度控制
- 全屏模式适配
2.3 数据库设计
MySQL 8.0作为关系型数据库,采用InnoDB引擎。核心表结构设计要点:
CREATE TABLE `course` ( `id` bigint NOT NULL AUTO_INCREMENT, `title` varchar(100) NOT NULL COMMENT '课程名称', `cover_url` varchar(255) DEFAULT NULL COMMENT '封面图', `teacher_id` bigint NOT NULL COMMENT '讲师ID', `category_id` int DEFAULT NULL COMMENT '分类ID', `price` decimal(10,2) DEFAULT '0.00' COMMENT '价格', `status` tinyint DEFAULT '0' COMMENT '状态:0-未发布 1-已发布', `create_time` datetime DEFAULT CURRENT_TIMESTAMP, `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;数据库优化方面,我特别添加了:
- 合理的索引设计
- 字段注释规范
- 自动更新时间戳
- 字符集统一使用utf8mb4
3. 核心功能实现
3.1 课程管理模块
课程管理采用树形结构组织,支持多级分类。关键实现细节:
课程发布流程:
- 草稿状态 → 审核中 → 已发布
- 状态变更记录审计日志
- 支持富文本编辑器和Markdown双模式
视频处理方案:
// 视频转码任务处理 @Async public void handleVideoTranscode(Long videoId) { Video video = videoMapper.selectById(videoId); String originalPath = video.getOriginalUrl(); String outputPath = "/transcoded/"+videoId+".m3u8"; // 使用FFmpeg进行转码 String command = String.format("ffmpeg -i %s -c:v libx264 -hls_time 10 -hls_list_size 0 -c:a aac -strict -2 -f hls %s", originalPath, outputPath); try { Process process = Runtime.getRuntime().exec(command); int exitCode = process.waitFor(); if(exitCode == 0) { video.setTranscodedUrl(outputPath); video.setStatus(2); // 转码完成 videoMapper.updateById(video); } } catch (Exception e) { log.error("视频转码失败", e); video.setStatus(3); // 转码失败 videoMapper.updateById(video); } }3.2 权限控制系统
采用RBAC(基于角色的访问控制)模型,实现五层权限控制:
- 接口权限:Spring Security配置
- 菜单权限:Vue路由动态加载
- 数据权限:MyBatis拦截器实现
- 操作权限:前端按钮级控制
- 字段权限:DTO动态过滤
权限表关系设计:
user - user_role - role - role_permission - permission3.3 学习进度跟踪
使用Redis+MySQL双写策略记录学习行为:
实时记录使用Redis Sorted Set
- key: user:progress:{userId}
- score: 学习时间戳
- member: 课程ID:视频ID
定时任务每小时同步到MySQL
@Scheduled(cron = "0 0 * * * ?") public void syncLearningProgress() { // 获取所有正在学习的用户 Set<String> keys = redisTemplate.keys("user:progress:*"); for (String key : keys) { Long userId = Long.parseLong(key.split(":")[2]); Set<String> progresses = redisTemplate.opsForZSet().range(key, 0, -1); // 批量更新数据库 batchUpdateProgress(userId, progresses); // 清除已同步的Redis数据 redisTemplate.delete(key); } }4. 部署与运维
4.1 环境准备
推荐的生产环境配置:
- 服务器:2核4G以上(视用户量调整)
- JDK:17+
- Node.js:16+
- MySQL:8.0+
- Redis:6.0+
4.2 后端部署
- 打包SpringBoot应用:
mvn clean package -DskipTests- 使用Docker部署:
FROM openjdk:17-jdk COPY target/course-system.jar app.jar ENTRYPOINT ["java","-jar","/app.jar"]- 关键启动参数:
-Dspring.profiles.active=prod -Dserver.port=8080 -Dspring.datasource.url=jdbc:mysql://mysql-host:3306/course_db4.3 前端部署
- 生产环境构建:
npm run build- Nginx配置示例:
server { listen 80; server_name course.example.com; location / { root /var/www/course-system/dist; try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://backend:8080/; proxy_set_header Host $host; } }5. 常见问题排查
5.1 视频播放问题
问题现象:m3u8视频无法播放 排查步骤:
- 检查Nginx是否正确配置了m3u8和ts文件的MIME类型
- 确认FFmpeg转码参数是否合规
- 检查视频文件权限
- 测试直接访问m3u8文件URL
5.2 性能优化建议
数据库层面:
- 添加适当的索引
- 优化慢查询
- 考虑读写分离
应用层面:
- 启用SpringBoot的缓存注解
- 使用Redis缓存热点数据
- 异步处理耗时操作
前端层面:
- 组件懒加载
- 路由懒加载
- 启用Gzip压缩
5.3 二次开发建议
扩展功能方向:
- 直播功能集成
- 在线考试系统增强
- 学习数据分析报表
代码结构说明:
src/ ├── main/ │ ├── java/ │ │ └── com/ │ │ └── example/ │ │ ├── config/ # 配置类 │ │ ├── controller/ # 控制器 │ │ ├── dto/ # 数据传输对象 │ │ ├── entity/ # 实体类 │ │ ├── mapper/ # MyBatis映射接口 │ │ ├── service/ # 业务逻辑 │ │ └── utils/ # 工具类 │ └── resources/ │ ├── mapper/ # MyBatis XML文件 │ └── application.yml # 配置文件 └── test/ # 测试代码- 开发规范:
- 遵循阿里巴巴Java开发手册
- 接口版本控制(/api/v1/...)
- 统一异常处理
- 日志规范(SLF4J+Logback)
这套系统在实际部署中表现稳定,单台4核8G服务器可支撑2000+并发用户。我在开发过程中特别注重了接口的幂等性设计和分布式事务处理,这对于企业级应用至关重要。如果需要进行集群部署,建议使用Nginx做负载均衡,并配置Redis集群实现会话共享。