文章目录
- 一、系统需求分析(避坑指南)
- 二、技术选型(2024新版)
- 三、数据库设计(三大核心表)
- 1. 学生表(student)
- 2. 课程表(course)
- 3. 成绩表(score)
- 四、核心功能实现(附避坑代码)
- 1. Excel批量导入(百万级数据不卡顿)
- 2. 动态查询(MyBatis Plus真香!)
- 3. 成绩分析(SQL聚合妙用)
- 五、部署运行(避坑三连)
- 六、扩展方向(毕业设计可用)
- 七、总结(血泪经验)
一、系统需求分析(避坑指南)
咱们先来盘盘这个系统的核心需求(别一上来就撸代码!):
- 成绩录入模块:支持Excel批量导入(这个坑最多!)
- 多维度查询:按学生/课程/学期组合查询(SQL要写好索引)
- 统计分析:自动计算平均分/最高分/挂科率(注意浮点数精度)
- 权限控制:教师和管理员不同操作权限(RBAC模型安排)
- 数据导出:生成美观的PDF成绩单(别用iText,有坑!)
二、技术选型(2024新版)
// 技术栈配置(比传统SSM香多了!)
implementation 'org.springframework.boot:spring-boot-starter-web:3.2.4'
implementation 'com.baomidou:mybatis-plus-boot-starter:3.5.5'
implementation 'com.alibaba:easyexcel:3.3.3' // Excel处理神器
implementation 'org.flywaydb:flyway-core:9.22.3' // 数据库版本控制
runtimeOnly 'com.mysql:mysql-connector-j:8.0.33' // 必须用8.x驱动!
三、数据库设计(三大核心表)
1. 学生表(student)
字段名 | 类型 | 说明 |
---|---|---|
student_id | BIGINT | 学号(雪花算法生成) |
name | VARCHAR(20) | 真实姓名 |
gender | TINYINT | 0-男 1-女 |
class_name | VARCHAR(50) | 班级名称 |
2. 课程表(course)
CREATE TABLE `course` (`course_id` INT NOT NULL AUTO_INCREMENT,`course_name` VARCHAR(50) NOT NULL COMMENT '课程名称',`credit` DECIMAL(3,1) NOT NULL COMMENT '学分',`teacher_id` BIGINT NOT NULL COMMENT '授课教师',PRIMARY KEY (`course_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3. 成绩表(score)
注意! 这里使用联合主键避免重复成绩:
@Data
@TableName("score")
public class Score {@TableId(type = IdType.INPUT)private Long studentId; // 学号private Integer courseId; // 课程IDprivate BigDecimal score; // 考试成绩private String semester; // 学期(如2023-2024-1)
}
四、核心功能实现(附避坑代码)
1. Excel批量导入(百万级数据不卡顿)
@PostMapping("/import")
public void importExcel(@RequestParam MultipartFile file) {EasyExcel.read(file.getInputStream(), ScoreData.class, new ScoreDataListener(scoreService)).sheet().doRead();
}// 自定义监听器(内存优化关键!)
public class ScoreDataListener extends AnalysisEventListener<ScoreData> {private static final int BATCH_COUNT = 300;private List<ScoreData> cachedList = new ArrayList<>(BATCH_COUNT);@Overridepublic void invoke(ScoreData data, AnalysisContext context) {cachedList.add(data);if (cachedList.size() >= BATCH_COUNT) {saveData();cachedList.clear();}}
}
2. 动态查询(MyBatis Plus真香!)
public Page<ScoreVO> queryScores(ScoreQuery query) {return scoreMapper.selectPage(new Page<>(query.getPage(), query.getSize()),new LambdaQueryWrapper<Score>().eq(query.getStudentId() != null, Score::getStudentId, query.getStudentId()).eq(query.getCourseId() != null, Score::getCourseId, query.getCourseId()).likeRight(StringUtils.isNotBlank(query.getSemester()), Score::getSemester, query.getSemester()).orderByDesc(Score::getScore));
}
3. 成绩分析(SQL聚合妙用)
SELECT c.course_name,AVG(s.score) AS avg_score,MAX(s.score) AS max_score,COUNT(CASE WHEN s.score < 60 THEN 1 END) AS fail_count
FROM score s
JOIN course c ON s.course_id = c.course_id
WHERE s.semester = '2023-2024-1'
GROUP BY c.course_id;
五、部署运行(避坑三连)
- MySQL时区配置(必看!)
spring.datasource.url=jdbc:mysql://localhost:3306/score_db?serverTimezone=Asia/Shanghai&useSSL=false
- Flyway迁移脚本命名(格式不对全完蛋!)
V1__init_database.sql
V2__add_index.sql
- 启动参数设置(内存溢出退散!)
java -jar score-system.jar --spring.profiles.active=prod -Xmx512m -XX:MaxMetaspaceSize=256m
六、扩展方向(毕业设计可用)
- 增加成绩预警模块(挂科风险预测)
- 集成短信通知功能(考试成绩实时推送)
- 开发可视化大屏(Echarts炫酷展示)
- 实现多维度权限控制(Vue3+Spring Security)
七、总结(血泪经验)
开发过程中最容易翻车的三个点:
- Excel导入时日期格式处理(建议统一转时间戳)
- 成绩保留小数位问题(BigDecimal别用double!)
- 并发修改成绩时的乐观锁控制(@Version安排上)
建议大家在GitHub建立私有仓库(别问我怎么知道的),每次实现新功能前先创建新分支。这个项目完整代码我整理成了标准Maven工程,需要的同学可以评论区留言(看到必回)!
最后叮嘱:数据库记得每天自动备份!别等毕设答辩前夜数据丢失哭鼻子(别笑,真发生过)!