文章目錄
- 一、系統需求分析(避坑指南)
- 二、技術選型(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工程,需要的同學可以評論區留言(看到必回)!
最后叮囑:數據庫記得每天自動備份!別等畢設答辯前夜數據丟失哭鼻子(別笑,真發生過)!