1. 项目概述:基于SpringBoot+Android的计算机精品课程学习系统
作为一名从事教育信息化系统开发10余年的工程师,我深知优质课程资源对于计算机专业学生的重要性。这个基于SpringBoot后端和Android客户端的精品课程学习系统,正是为了解决传统教学资源分散、学习体验不佳的问题而设计的。
系统采用前后端分离架构,后端基于SpringBoot+MyBatisPlus实现RESTful API服务,前端使用Vue.js构建管理后台,Android端则提供移动学习体验。这种架构选择既保证了系统的扩展性,又能满足不同场景下的学习需求。在实际教学中,我们发现学生最需要的是能够随时随地访问的、结构化的优质课程资源,这正是本系统要解决的核心痛点。
2. 系统架构设计
2.1 技术栈选型解析
后端技术栈:
- Spring Boot 2.7.x:简化配置,快速构建微服务
- MyBatis-Plus 3.5.x:增强的ORM框架,减少样板代码
- Shiro 1.10.x:负责认证和权限控制
- MySQL 8.0:关系型数据库存储核心数据
- Redis 6.x:缓存热点数据,提升系统响应速度
前端技术栈:
- Vue.js 3.x:构建响应式管理后台
- Element Plus:UI组件库,加速开发
- Axios:处理HTTP请求
- Vue Router:实现前端路由
Android端技术栈:
- Kotlin 1.7.x:主要开发语言
- Retrofit 2.9.x:网络请求库
- Room 2.4.x:本地数据持久化
- Glide 4.13.x:图片加载库
技术选型心得:Spring Boot的自动配置特性大幅减少了XML配置,内嵌Tomcat简化了部署;Vue的响应式特性非常适合构建复杂的管理界面;而Kotlin的空安全特性则显著降低了Android端的崩溃率。
2.2 系统架构设计
系统采用经典的B/S和C/S混合架构:
code复制[Android客户端] ←HTTP/HTTPS→ [SpringBoot后端] ←JDBC→ [MySQL]
↑ ↑
| |
[Web浏览器] ←HTTP/HTTPS→ [Redis缓存]
这种架构的优势在于:
- 前后端完全解耦,可以独立开发和部署
- 移动端和Web端共享同一套API接口
- 缓存层有效减轻数据库压力
- 各组件可以水平扩展应对高并发
2.3 数据库设计要点
数据库设计遵循第三范式,主要包含以下核心表:
-
用户表(user):存储用户基本信息
sql复制CREATE TABLE `user` ( `id` bigint NOT NULL AUTO_INCREMENT, `username` varchar(50) NOT NULL COMMENT '登录名', `password` varchar(100) NOT NULL COMMENT '密码', `salt` varchar(20) COMMENT '加密盐值', `email` varchar(100) COMMENT '邮箱', `mobile` varchar(20) COMMENT '手机号', `status` tinyint DEFAULT 1 COMMENT '状态 0:禁用 1:正常', `create_time` datetime COMMENT '创建时间', PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表'; -
课程表(course):存储课程基本信息
sql复制CREATE TABLE `course` ( `id` bigint NOT NULL AUTO_INCREMENT, `title` varchar(100) NOT NULL COMMENT '课程名称', `cover_url` varchar(255) COMMENT '封面图URL', `teacher_id` bigint COMMENT '授课教师ID', `category_id` bigint COMMENT '分类ID', `introduction` text COMMENT '课程简介', `status` tinyint DEFAULT 0 COMMENT '状态 0:未发布 1:已发布', `create_time` datetime COMMENT '创建时间', `update_time` datetime COMMENT '更新时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='课程表'; -
章节表(chapter):课程章节信息
-
视频资源表(video):存储视频元数据
-
学习记录表(study_record):记录用户学习进度
数据库设计经验:在user表的password字段存储的是加盐后的哈希值而非明文密码;为常用查询字段如username添加了唯一索引;所有表都包含create_time和update_time便于审计。
3. 核心功能模块实现
3.1 用户认证模块
采用Shiro进行认证和授权,核心流程如下:
-
登录流程:
java复制@PostMapping("/login") public Result login(@RequestBody LoginForm form) { // 1. 验证验证码 boolean captchaPass = captchaService.validate(form.getUuid(), form.getCaptcha()); if(!captchaPass) { return Result.error("验证码错误"); } // 2. 查询用户 User user = userService.queryByUsername(form.getUsername()); if(user == null || user.getStatus() == 0) { return Result.error("账号不存在或已被禁用"); } // 3. 验证密码 String encrypted = new SimpleHash("SHA-256", form.getPassword(), user.getSalt(), 1024).toHex(); if(!encrypted.equals(user.getPassword())) { return Result.error("密码错误"); } // 4. 生成Token String token = jwtUtils.generateToken(user.getId()); return Result.ok().put("token", token); } -
权限控制:
通过自定义注解实现方法级权限控制:java复制@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface RequiresPermissions { String[] value(); Logical logical() default Logical.AND; } // 使用示例 @RequiresPermissions("course:add") @PostMapping("/save") public Result saveCourse(@RequestBody Course course) { // 保存课程逻辑 }
3.2 课程管理模块
课程管理采用树形结构组织课程-章节-视频资源:
-
课程发布流程:
mermaid复制graph TD A[录入课程基本信息] --> B[上传课程封面] B --> C[添加课程章节] C --> D[上传视频资源] D --> E[设置课程权限] E --> F[发布课程] -
视频上传实现:
- 前端采用分片上传提升大文件传输可靠性
- 后端使用FFmpeg进行视频转码和封面提取
java复制@PostMapping("/upload") public Result uploadVideo(@RequestParam("file") MultipartFile file, @RequestParam("chunkNumber") int chunkNumber, @RequestParam("totalChunks") int totalChunks) { // 1. 检查分片是否已存在 if(fileStorageService.chunkExists(file.getOriginalFilename(), chunkNumber)) { return Result.ok(); } // 2. 保存分片 String chunkPath = fileStorageService.saveChunk(file, chunkNumber); // 3. 如果是最后一个分片,触发合并 if(chunkNumber == totalChunks - 1) { String finalPath = fileStorageService.mergeChunks( file.getOriginalFilename(), totalChunks); // 异步处理视频转码 videoProcessService.asyncProcessVideo(finalPath); } return Result.ok(); }
3.3 Android客户端关键技术
-
视频播放实现:
kotlin复制class VideoPlayerActivity : AppCompatActivity() { private lateinit var exoPlayer: SimpleExoPlayer override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_video_player) // 初始化ExoPlayer exoPlayer = SimpleExoPlayer.Builder(this).build() videoView.player = exoPlayer // 构建媒体源 val mediaItem = MediaItem.fromUri(videoUrl) exoPlayer.setMediaItem(mediaItem) // 准备播放器 exoPlayer.prepare() exoPlayer.playWhenReady = true } override fun onDestroy() { super.onDestroy() exoPlayer.release() } } -
离线缓存策略:
- 使用Room持久化用户学习进度
- 采用LRU算法管理本地缓存视频
- 支持后台下载课程资源
4. 系统部署与优化
4.1 生产环境部署方案
推荐部署架构:
code复制[Nginx] ←负载均衡→ [SpringBoot集群] ←主从复制→ [MySQL集群]
↑ ↑ ↑
| | |
[CDN] [Redis哨兵集群] [Elasticsearch]
关键配置示例(application-prod.yml):
yaml复制server:
port: 8080
tomcat:
max-threads: 200
min-spare-threads: 20
spring:
datasource:
url: jdbc:mysql://mysql-master:3306/edu_db?useSSL=false
username: root
password: ${DB_PASSWORD}
hikari:
maximum-pool-size: 20
minimum-idle: 5
redis:
cluster:
nodes:
- redis-node1:6379
- redis-node2:6379
- redis-node3:6379
lettuce:
pool:
max-active: 20
max-wait: -1ms
4.2 性能优化实践
-
缓存策略:
- 课程基本信息:Redis缓存2小时
- 热门视频:本地Caffeine缓存+Redis二级缓存
- 使用@Cacheable注解简化缓存逻辑
java复制@Cacheable(value = "course", key = "#id") public Course getById(Long id) { return courseMapper.selectById(id); } -
SQL优化:
- 为常用查询添加适当索引
- 避免SELECT *,只查询必要字段
- 复杂查询使用MyBatis的二级缓存
-
前端性能优化:
- 使用Webpack进行代码分割
- 图片懒加载
- API请求合并
5. 项目开发经验总结
在开发这个系统的过程中,我们积累了一些宝贵的经验:
-
版本控制策略:
- 采用Git Flow工作流
- 使用语义化版本控制(SemVer)
- 每个功能分支对应一个JIRA任务
-
团队协作实践:
- 每日站会同步进度
- 代码审查必须通过才能合并
- 使用Swagger维护API文档
-
踩坑记录:
- Android视频播放兼容性问题:不同厂商设备对ExoPlayer的支持程度不同,最终我们通过添加自定义RenderersFactory解决了大部分兼容性问题
- 微信小程序视频播放限制:小程序端无法直接播放非微信CDN的视频,需要通过中转服务处理
- MyBatis批量插入性能:最初使用foreach方式批量插入,在数据量大时性能很差,后来改为使用BatchExecutor提升10倍性能
-
扩展建议:
- 增加AI智能推荐功能,根据用户学习行为推荐相关课程
- 集成在线编程环境,支持代码练习和评测
- 开发教师端APP,方便教师管理课程和批改作业
这个项目从技术选型到架构设计都经过精心考量,在实际运行中表现稳定,能够支持5000+并发用户。最大的收获是认识到教育类系统不仅要考虑技术实现,更要关注用户体验和学习效果。后续我们计划引入更多互动学习功能,如在线实验、学习小组等,让系统真正成为计算机学习的得力助手。