1. 项目背景与核心需求
高校综合测评管理一直是学生工作的重要组成部分。传统纸质申报和Excel统计方式存在效率低下、数据易丢失、审核流程不透明等问题。我们团队开发的这套Android平台综合测评管理系统,正是为了解决这些痛点。
系统采用B/S架构设计,后端基于SpringBoot框架,前端使用uniapp实现跨平台移动端应用。核心功能围绕三类用户角色展开:
- 学生端:支持测评材料在线提交(文字+图片)、历史记录查询
- 教师端:实现批量评分操作、学生材料审核(通过/驳回)
- 管理员端:完成账户权限管理、系统参数配置、数据备份恢复
关键设计原则:权限分离、操作留痕、数据安全。所有用户操作都会记录日志,确保可追溯性。
2. 技术架构设计
2.1 整体架构方案
系统采用典型的三层架构:
客户端(Android) ↔ 应用服务器(SpringBoot) ↔ 数据库(MySQL)选择混合开发模式(uniapp+H5)主要基于以下考虑:
- 开发效率:一套代码同时适配Android/iOS
- 维护成本:热更新无需应用市场审核
- 功能扩展:可灵活集成Web插件
2.2 关键技术选型
| 技术组件 | 版本 | 选型理由 |
|---|---|---|
| JDK | 1.8 | LTS长期支持版本,稳定性高 |
| MySQL | 5.7 | 高校场景数据量下性能足够 |
| Tomcat | 7 | 与SpringBoot 2.x版本兼容性好 |
| uniapp | 最新 | 完善的跨平台开发解决方案 |
特别注意:MySQL必须使用5.7版本。我们测试发现5.6版本在事务处理时存在性能瓶颈,而8.0版本与旧版Navicat存在兼容性问题。
3. 数据库设计详解
3.1 核心表结构
-- 用户基础表 CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(20) NOT NULL, `password` varchar(64) NOT NULL COMMENT 'SHA256加密', `role` enum('student','teacher','admin') NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `username_UNIQUE` (`username`) ); -- 学生测评表 CREATE TABLE `evaluation` ( `id` int(11) NOT NULL AUTO_INCREMENT, `student_id` int(11) NOT NULL, `school_year` varchar(9) NOT NULL COMMENT '格式:2022-2023', `semester` enum('1','2') NOT NULL, `item_type` varchar(20) NOT NULL COMMENT '加分项类别', `description` text NOT NULL, `image_url` varchar(255) DEFAULT NULL, `score` decimal(5,2) DEFAULT '0.00', `status` enum('pending','approved','rejected') DEFAULT 'pending', `audit_comment` varchar(255) DEFAULT NULL, `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `idx_student` (`student_id`), KEY `idx_year_semester` (`school_year`,`semester`) );3.2 关键设计要点
- 密码存储:采用SHA256加盐哈希处理
- 状态管理:使用枚举类型确保数据一致性
- 索引优化:为高频查询字段建立复合索引
- 审计追踪:记录操作时间和审核意见
踩坑记录:初期未加复合索引,当学期末查询数据时响应时间超过3秒。添加
(school_year, semester)复合索引后,查询效率提升20倍。
4. 核心功能实现
4.1 学生上传流程
- 前端实现要点:
// uniapp上传组件配置 uni.chooseImage({ count: 3, // 最多3张图片 sizeType: ['compressed'], // 压缩图片 success: (res) => { this.uploadToOSS(res.tempFilePaths) // 先传图床 } })- 后端接口设计:
@PostMapping("/evaluation") public Result submitEvaluation( @RequestParam MultipartFile[] images, @Valid EvaluationForm form) { // 1. 验证学期有效性 if(!academicService.validateSemester(form.getSchoolYear(), form.getSemester())){ return Result.error("无效的学年学期"); } // 2. 图片上传OSS(异步处理) List<String> imageUrls = imageService.upload(images); // 3. 保存测评记录 evaluationService.saveEvaluation( form, imageUrls, getCurrentUserId()); return Result.success(); }4.2 教师审核模块
审核流程状态机设计:
pending → [approved/rejected] ↑______|关键业务逻辑:
public void auditEvaluation(Long evalId, boolean pass, String comment) { Evaluation eval = evaluationRepository.findById(evalId) .orElseThrow(() -> new BusinessException("记录不存在")); if(!eval.getStatus().equals("pending")){ throw new BusinessException("记录已审核"); } eval.setStatus(pass ? "approved" : "rejected"); eval.setAuditComment(comment); eval.setAuditTime(LocalDateTime.now()); eval.setAuditorId(getCurrentUserId()); if(pass){ studentService.addScore( eval.getStudentId(), eval.getScore()); } evaluationRepository.save(eval); }5. 安全与性能优化
5.1 安全防护措施
- 接口权限控制:
@PreAuthorize("hasRole('TEACHER')") @PostMapping("/audit") public Result audit(...) { ... }- 防XSS攻击:
<text>{{ description | escape }}</text>- 文件上传安全:
- 限制文件类型(jpg/png)
- 扫描文件头验证真实类型
- 存储路径随机化
5.2 性能优化实践
- 缓存策略:
@Cacheable(value = "evaluation", key = "#studentId+'-'+#year+'-'+#semester") public List<Evaluation> getByStudentAndSemester(Long studentId, String year, String semester) { return repository.findByStudentAndSemester(studentId, year, semester); }- 批量操作优化:
-- 教师批量加分 UPDATE student_score SET total_score = total_score + 5 WHERE class_id = 'CS1801' AND attendance_rate > 0.9;6. 部署与运维
6.1 服务器配置建议
最低配置要求:
- CPU:2核
- 内存:4GB
- 磁盘:100GB(建议SSD)
- 带宽:5Mbps
推荐使用Docker部署:
FROM tomcat:7-jre8 COPY target/eps.war /usr/local/tomcat/webapps/ ENV SPRING_PROFILES_ACTIVE=prod EXPOSE 80806.2 日常维护要点
- 数据库备份策略:
# 每天凌晨全量备份 mysqldump -uroot -p eps > /backups/eps_$(date +%F).sql- 日志分析监控:
- 使用ELK收集Tomcat访问日志
- 设置异常请求告警阈值
7. 常见问题解决方案
7.1 典型问题排查表
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 图片上传失败 | OSS配置错误 | 检查endpoint和bucket权限 |
| 审核状态不更新 | 数据库事务未提交 | 添加@Transactional注解 |
| 安卓端白屏 | 跨域问题 | 配置CORS过滤器 |
| 查询速度慢 | 缺少索引 | 使用explain分析SQL |
7.2 移动端适配经验
- 屏幕适配方案:
/* 使用rpx单位 */ .container { width: 750rpx; /* 相当于100%屏幕宽度 */ padding: 20rpx; }- 安卓兼容性处理:
- 避免使用ES6+新特性
- 测试不同厂商ROM的WebView内核
这个项目从需求分析到上线历时3个月,最大的收获是认识到教育类系统的特殊性——既要保证流程规范性,又要考虑用户操作的便捷性。特别是在期末高峰时段,我们通过引入异步审核队列和批量处理机制,成功将教师端的平均处理时间从15秒缩短到3秒。