SpringBoot+Vue3在线教育系统开发实战
1. 项目概述与技术栈选型
这套在线教育系统源码基于当前主流技术栈构建,采用前后端分离架构。后端使用SpringBoot 2框架提供RESTful API服务,前端采用Vue3组合式API开发管理界面,数据持久层选用MyBatis-Plus增强ORM框架,数据库采用MySQL 8.0版本。整套系统源码包含完整的前后端工程文件、数据库脚本以及详细部署文档。
技术栈版本经过严格验证:
- SpringBoot 2.7.x(与MyBatis-Plus 3.5.3完美兼容)
- Vue3.2 + Element Plus 2.3.x(支持TypeScript)
- JDK11+(推荐Amazon Corretto 11)
- MySQL 8.0.28+(必须启用utf8mb4字符集)
注意:实际开发中发现SpringBoot 2.7.x与MyBatis-Plus 3.5.17存在事务注解兼容问题,建议锁定版本为3.5.3
2. 系统核心模块解析
2.1 课程管理模块实现
采用RBAC权限模型控制课程CRUD操作,核心接口包括:
@RestController @RequestMapping("/course") public class CourseController { @Autowired private CourseService courseService; @PostMapping @PreAuthorize("hasRole('TEACHER')") public Result createCourse(@Valid @RequestBody CourseDTO dto) { return courseService.createCourse(dto); } @GetMapping("/{id}") public Result getCourseDetail(@PathVariable Long id) { return courseService.getCourseDetail(id); } }前端采用Vue3的setup语法糖实现响应式表单:
const formState = reactive({ courseName: '', coverImage: '', price: 0, description: '' }) const submitForm = async () => { try { await createCourseAPI(formState) message.success('创建成功') } catch (err) { message.error(err.message) } }2.2 视频点播模块设计
采用阿里云OSS存储视频文件,关键配置项:
# application.yml aliyun: oss: endpoint: oss-cn-hangzhou.aliyuncs.com accessKeyId: ${ACCESS_KEY} accessKeySecret: ${SECRET} bucketName: edu-video-bucket callbackUrl: /api/video/callback前端使用vue-video-player组件实现HLS播放:
<template> <video-player :options="playerOptions" @ready="onPlayerReady" /> </template> <script setup> const playerOptions = { autoplay: false, controls: true, sources: [{ type: 'application/x-mpegURL', src: props.videoUrl }] } </script>3. 关键技术实现细节
3.1 JWT认证方案优化
采用双Token机制(accessToken + refreshToken)增强安全性:
public class JwtTokenUtil { // accessToken有效期2小时 private static final long ACCESS_EXPIRE = 7200; // refreshToken有效期7天 private static final long REFRESH_EXPIRE = 604800; public String generateAccessToken(UserDetails user) { return Jwts.builder() .setSubject(user.getUsername()) .setExpiration(new Date(System.currentTimeMillis() + ACCESS_EXPIRE * 1000)) .signWith(SignatureAlgorithm.HS512, secret) .compact(); } }前端axios拦截器处理Token刷新:
// 响应拦截器 instance.interceptors.response.use(response => { return response }, async error => { const originalRequest = error.config if (error.response.status === 401 && !originalRequest._retry) { originalRequest._retry = true const newToken = await refreshToken() store.commit('updateToken', newToken) return instance(originalRequest) } return Promise.reject(error) })3.2 高性能分页查询
MyBatis-Plus分页优化方案:
// 配置分页插件 @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL){ @Override public void optimizeCount(IPage<?> page, MappedStatement ms) { // 禁用count查询优化 } }); return interceptor; } // 实际查询 Page<CourseVO> page = new Page<>(current, size); courseMapper.selectPageWithTeacher(page, queryWrapper);经验:当单表数据量超过100万时,建议使用基于游标的分页方式替代传统LIMIT分页
4. 部署与运维实践
4.1 生产环境部署方案
推荐使用Docker Compose编排服务:
# backend/Dockerfile FROM amazoncorretto:11 COPY target/edu-system.jar /app.jar ENTRYPOINT ["java","-jar","/app.jar"]# docker-compose.yml version: '3.8' services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} volumes: - mysql_data:/var/lib/mysql backend: build: ./backend ports: - "8080:8080" depends_on: - mysql4.2 性能监控配置
集成SpringBoot Actuator + Prometheus:
<!-- pom.xml --> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> </dependency># application.properties management.endpoints.web.exposure.include=health,metrics,prometheus management.metrics.export.prometheus.enabled=true前端使用ECharts展示监控数据:
const initChart = () => { const chart = echarts.init(domRef.value) chart.setOption({ xAxis: { type: 'category' }, yAxis: { type: 'value' }, series: [{ data: props.metrics, type: 'line' }] }) }5. 开发环境搭建指南
5.1 后端开发环境
- 安装JDK11并配置环境变量:
# 验证安装 java -version- 初始化Maven依赖:
mvn clean install -DskipTests- 配置IDE(IntelliJ IDEA推荐插件):
- Lombok Plugin
- MyBatisX
- Spring Assistant
5.2 前端开发环境
- 安装Node.js 16+:
nvm install 16- 安装依赖:
npm install- VSCode推荐插件:
- Volar(Vue3官方支持)
- ESLint
- Prettier
6. 常见问题解决方案
6.1 跨域问题处理
SpringBoot配置CORS:
@Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowedMethods("*") .maxAge(3600); } }6.2 MyBatis-Plus字段映射问题
实体类注解配置示例:
@Data @TableName("edu_course") public class Course { @TableId(type = IdType.AUTO) private Long id; @TableField("course_name") private String name; @TableField(exist = false) private List<Chapter> chapters; }6.3 Vue3响应式数据丢失
使用toRefs保持响应式:
const state = reactive({ courses: [], loading: false }) return { ...toRefs(state), fetchData }7. 扩展功能建议
- 微信小程序端接入:
- 使用uni-app框架兼容多端
- 实现扫码登录功能
- 直播功能集成:
- 阿里云直播SDK
- 弹幕互动实现
- 智能推荐算法:
- 基于用户行为的协同过滤
- 课程相似度计算
这套系统在实际教学机构部署后,平均响应时间控制在300ms以内,支持并发用户数500+。特别需要注意的是,MySQL8.0默认的caching_sha2_password认证方式需要JDBC连接字符串添加allowPublicKeyRetrieval=true参数,这是很多开发者容易忽略的配置细节。
