欢迎在我的 GitHub 查看更多项目与代码实现。
一、写在前面的话
这个迷你教务管理系统其实是数据库的课程实验,我花了一周时间(每天大概 1~2 小时)手搓了一个。
这个项目很简单,主要目的是为了熟悉 SQL 语句的编写以及掌握数据库工具的使用。不过反正看着还过得去,就也放在专栏里。

二、从建表开始:SQL 基础实践
教务系统是数据库课程中最经典的案例,业务逻辑大家都很熟悉:学生选课、老师打分、统计学分等。我一共设计了 11 张表,覆盖了核心的实体关系。
1. 数据定义语言
- 主键(PK):保证记录唯一(如
Sno)。 - 外键(FK):保证引用关系正确(如
SC.Cno必须存在于Course表)。 - Check 约束:限制数据范围(如
Credit > 0)。 - Enum 枚举:规范字段取值(如
Gender只能是 ‘M’ 或 ‘F’)。

2. 触发器
为了防止非法数据的录入,我尝试写了几个复杂的触发器。比如:
- 防止环形依赖:在设置先修课程时,不能让 A 的先修是 B,B 的先修又是 A。
- 选课校验:学生在选课(Insert SC)前,触发器会自动检查该学生是否修完了这门课的所有先修课程。

三、后端开发:Flask + SQLAlchemy
为了快速验证功能,我选择了轻量级的 Flask 框架。
这里我用了 RESTful API 的设计风格:
GET /api/v1/students:获取所有学生列表。POST /api/v1/students:新增一个学生。PUT /api/v1/students/<id>:修改学生信息。DELETE /api/v1/students/<id>:删除学生。
后端逻辑非常简单直观,基本就是接收前端 JSON -> 拼接 SQL/ORM 查询 -> 返回数据。

四、前端交互与可视化
虽然是练手项目,但我还是给它配了一个基于原生 JS + Webpack 的单页应用(SPA)前端。
我引入了 ECharts 图表库:
- 热力图:统计每天的操作活跃度。
- 柱状图:分析各院系的课程数量、教师职称分布。
- 饼图:展示选课状态(在读 vs 已修)。
这些可视化图表的数据源,本质上都是后端写好的 GROUP BY 聚合查询语句。

