1. 项目背景与核心价值
在线教育这几年发展迅猛,但很多学校的作业提交方式还停留在QQ群、邮箱这种原始阶段。去年帮本地一所职业院校做技术咨询时,发现他们老师每周要花3-4个小时整理学生发来的各种格式作业,经常出现文件损坏、命名混乱的情况。于是我们决定开发这套基于SpringBoot+Vue3的移动端作业管理系统,特别针对Android平台做了深度适配。
这套系统最大的特点是"双端协同"——教师端用浏览器就能批改作业,学生端则通过Android APP实现随堂作业的即时提交。实测下来,相比传统方式能节省60%以上的作业管理时间,特别是支持在线预览PDF/Word/图片等常见格式,再也不用担心文件打不开的问题。
2. 技术架构设计
2.1 整体技术栈选型
后端采用SpringBoot 2.7 + MyBatis Plus组合,主要考虑因素:
- 快速构建RESTful API(平均开发一个接口只需2小时)
- 内置Tomcat容器方便部署
- MyBatis Plus的代码生成器能自动生成85%的CRUD代码
前端选用Vue3 + Vant移动端组件库:
- Composition API更适合复杂交互场景(如作业批注功能)
- Vant的Uploader组件完美适配Android文件上传
- Pinia状态管理解决多页面数据同步问题
数据库使用MySQL 8.0:
- JSON字段存储作业批改痕迹
- 全文索引加速作业内容搜索
2.2 安卓端特殊处理
由于需要兼容学校的老旧Android设备(最低支持到5.0),我们做了这些优化:
- 使用AndroidX兼容库
- 文件上传采用分块传输(每块512KB)
- 离线缓存未提交的作业草稿
- 集成腾讯X5内核提升WebView兼容性
3. 核心功能实现细节
3.1 作业提交流程
学生端关键代码逻辑:
java复制// 文件选择器配置
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("*/*"); // 允许所有文件类型
intent.addCategory(Intent.CATEGORY_OPENABLE);
startActivityForResult(intent, FILE_REQUEST_CODE);
服务端接收处理:
java复制@PostMapping("/upload")
public Result upload(@RequestParam MultipartFile file,
@RequestHeader("X-Device-Info") String deviceInfo) {
// 病毒扫描(集成ClamAV)
antivirusService.scan(file);
// 转存OSS并生成缩略图
String fileKey = ossService.upload(file);
// 记录设备信息用于问题排查
logService.logUpload(deviceInfo);
return Result.success(fileKey);
}
3.2 实时批注系统
采用Operational Transformation算法实现多人协同:
- 教师批改时生成操作指令(如划重点、文字批注)
- 通过WebSocket广播到所有在线学生
- 客户端合并指令时解决冲突(采用Last-Write-Win策略)
前端核心代码:
javascript复制// 处理批注指令
socket.on('annotation', (op) => {
const newState = ot.apply(currentDoc, op);
renderAnnotations(newState);
});
4. 性能优化实战
4.1 图片加载优化
针对学生作业中的大量图片:
- 安卓端:使用Glide加载,自动降级到WebP格式
- 服务端:根据设备DPI返回不同分辨率图片
- CDN加速:七牛云存储+智能缓存
4.2 数据库分表策略
按学期分表(如homework_2023_spring):
sql复制CREATE TABLE homework_2023_spring (
id BIGINT PRIMARY KEY,
student_id VARCHAR(20) NOT NULL,
file_key VARCHAR(255) NOT NULL,
submit_time DATETIME DEFAULT CURRENT_TIMESTAMP,
INDEX idx_student (student_id)
) ENGINE=InnoDB;
5. 踩坑记录与解决方案
5.1 安卓文件上传中断
现象:部分华为设备上传大文件时频繁失败
排查:发现是EMUI系统的后台限制
解决:增加分片上传+断点续传功能
java复制// 分片上传实现
public void uploadChunk(String fileKey, int chunkIndex,
byte[] chunkData) {
String lockKey = "upload:" + fileKey;
redisLock.lock(lockKey);
try {
ossService.appendChunk(fileKey, chunkIndex, chunkData);
} finally {
redisLock.unlock(lockKey);
}
}
5.2 Vue3内存泄漏
现象:长时间使用后浏览器卡顿
定位:发现是未清理的WebSocket监听
修复方案:
javascript复制onUnmounted(() => {
socket.off('annotation');
clearInterval(syncTimer);
});
6. 部署方案
6.1 服务端部署
采用Docker Compose编排:
yaml复制version: '3'
services:
app:
image: openjdk:11-jre
ports:
- "8080:8080"
volumes:
- ./logs:/app/logs
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
6.2 安卓打包技巧
配置build.gradle加速构建:
groovy复制android {
compileOptions {
coreLibraryDesugaringEnabled true
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
packagingOptions {
exclude 'META-INF/*.kotlin_module'
}
}
7. 扩展功能建议
- 集成OCR识别手写作业(测试Tesseract安卓版识别率约75%)
- 增加作业查重功能(可用SimHash算法)
- 实现自动批改选择题(正则表达式匹配答案)
- 添加语音批注功能(使用科大讯飞SDK)
这套系统经过一个学期的实际运行,日均处理作业提交2000+次,最关键的收获是:一定要做好文件上传的容错处理,我们通过添加MD5校验+自动重试机制,将失败率从最初的15%降到了0.3%以下。