项目介绍
- 本项目是本人在大学期间的数据库课程设计,为学生成绩管理系统
- 由于当时时间紧张,只有一周多点的时间,实现的功能较为简单
- 整体架构
-
- 后端采用 python+flask+mysql 的方式,未做服务器部署,可以在单机上测试运行
- 前端则借鉴了网上找到的前端页面模板,在此基础上修改,主要技术是 html+css+js
- 前后端分离开发,见 http 接口设计.docx,使用 postman 等工具进行接口测试
目录结构
app/ 项目源代码
|--- models/ 后端模型层,用于读写数据库
|--- validate/ 后端验证层,用于验证http请求的参数合法性
|--- web/ 后端控制器层,用于处理http请求
|--- __init__.py 入口函数
|--- static/ 前端静态文件目录
|--- js/ 前端javascript文件
|--- *.html 前端html页面文件
sql/ 建库脚本及说明、测试数据脚本
http接口设计.docx
前端页面模板/
项目环境配置
- 下载安装 MySQL 8
-
- 执行 sql/建库脚本-无注释.sql
- 执行 sql/系统测试数据.sql
- 下载安装 python 3.7.3
- IDE: pycharm community
- 依赖第三方库(使用 pipenv 等工具安装)
-
- flask
- wtforms
- pymysql
- flask-login
核心要求
总体要求
- 基于 Web 的数据库应用系统
- E-R 图设计概念模式、导出逻辑模式
- 设计应用系统的系统结构图,确定系统功能
- 创建数据库和表,输入初始数据,要求每个表的记录数不得少于 18 条
- 不需要连接远程数据库,直接在一个机器上即可
- 分工可以按照学生模块、教师模块、管理员模块、前台界面、数据库设计
- 学院的网站上找老师的信息
- 学生信息输自己班的就行
- 数据库表可以在 PPT 的基础上扩展
- 可以在 PPT 的基础上增加功能,功能越完善,分数越高
- 界面做漂亮一些
角色需求描述
- 系统交互
-
- 登录
-
-
- 无需注册功能
- 管理员以 admin 作为用户名,密码为固定值,不可修改
- 教师以教师编号为用户名,密码默认为教师编号,可修改
- 学生以学生编号为用户名,密码默认为学生编号,可修改
-
-
- 修改密码
- 学生
-
- 查询
-
-
- 学生基本信息
- 该学生所选的各门课的成绩
-
- 教师
-
- 查询
-
-
- 教师基本信息
- 所授课程基本信息
- 学生选课信息
- 所授课程所有学生的成绩
- 所授课程所有学生的成绩的统计结果
- 统计各分数段学生的成绩分布, 画出直方图和饼图。
-
-
- 录入
-
-
- 学生所选课程成绩
-
-
- 修改
-
-
- 学生所选课程成绩
-
-
- 删除
-
-
- 学生所选课程成绩
-
- 管理员
-
- 查询
-
-
- 学生基本信息
- 教师基本信息
- 课程基本信息
-
-
- 录入
-
-
- 学生基本信息
- 教师基本信息
- 课程基本信息
- 专业选课信息
-
-
- 修改
-
-
- 学生基本信息
- 教师基本信息
- 课程基本信息
-
-
- 删除
-
-
- 学生基本信息
- 教师基本信息
- 课程基本信息
- 专业选课信息
-
部分需求详述
- 学生基本信息
-
- 包括学号、姓名、性别、出生年份、籍贯、已修学分、已选课程数量、加权平均学分等;其中已修学分为所有通过的课程的学分和,60 分及以上即为通过;加权平均学分根据每门课的学分进行加权。
- 教师基本信息
-
- 包括教师编号、姓名、性别、出生年份、所授课程数量等。
- 课程基本信息
-
- 包括课程编号、课程名称、开设年份、开设学期、授课教师编号、学分、选课学生数量、平均成绩等;其中平均成绩是所有学生的成绩的算术平均值。
- 专业基本信息
-
- 包括专业编号、专业名称等。
- 专业选课功能说明
-
- 本系统为学生成绩管理系统,核心功能为学生成绩的管理,但是同时该系统依托于学生选课系统。
- 我们由此添加了简单的选课功能,遵循小次数大批量的原则,以专业为单位进行选课,若添加了一条专业选课的记录,则该专业的所有学生都将选修该门课程。
编号规则
- 学院编号:2 位
- 专业编号:
-
- 学院编号:2 位
- 学院内专业编号:2 位
- 共:4 位
- 班级编号:
-
- 入学年份:4 位
- 专业编号:4 位
- 专业内班级编号:2 位
- 共:10 位
- 学生编号:
-
- 班级编号:10 位
- 班级内序号:2 位
- 共:12 位
- 教师编号:
-
- 学院编号:2 位
- 学院内编号:3 位
- 共:5 位
- 课程编号:5 位
- 所有数据库表的 id 都是用 char 存的,有一些 id 设置为了已有的最大值 +1,所以在插入数据时,需要查出数据库表中已有的 id,转化为整数,取最大值 +1,转化为字符串,作为新的 id
数据库说明
数据库为: MySQL
- 数据库用户名为: root,可在init.py 中修改
- 数据库密码为: asdfg13579,可在init.py 中修改
其它配置说明
- 端口: 6060,可在init.py 中修改
- 访问地址为 http://localhost:6060
-
- 不能用 127.0.0.1,因为前端页面里面的超链接是固定的 localhost,否则会引起跨域问题
- 管理员用户名为 admin,密码为 asdfg13579
- 学生和教师的初始密码均为其编号
数据流图
ER 图-关系模式
关系模式见 sql/建库脚本
完整性约束分析
实体完整性约束
- 所有的主键均不能为空,所有定义为 not null 的属性也不能为空。
参照完整性约束
- 学生表:学生表的 major_id 参照专业表的 major_id;
若删除某个专业,则级联删除对应学生;
插入学生前,其所属专业必须已被创建;
这样的约束应由外键实现; - 课程表:课程表的 teacher_id 参照教师表的 teacher_id;
若删除某个教师,则级联删除对应课程;
插入课程前,其授课教师必须已被创建;
这样的约束应由外键实现; - 专业选课表专业选课表的 major_id 参照专业表的 major_id,专业选课表的 course_id 参照课程表的 course_id;
若删除某个专业,则级联删除对应的专业选课信息;
若删除某个课程,则级联删除对应的专业选课信息;
插入专业选课信息之前,其对应的专业和课程必须已被创建;
这样的约束应由外键实现;
自定义完整性约束
字段 | 约束 |
major_id | 3 位数字,新添加的专业编号自动生成为已有专业编号最大值 +1 |
student_id | 10 位数字,自动生成,新添加的学生编号由 4 位入学年份、3 位专业编号和 3 位当年专业内已有学生编号最大值 +1 组成 |
course_id | 5 位数字,新添加的课程编号自动生成为已有课程编号最大值 +1 |
teacher_id | 5 位数字,新添加的教师编号自动生成为已有教师编号最大值 +1 |
major_name | unique,不同专业的名称不能相同 |
sex | 取值为“男”或“女” |
semester | 取值为“春”或“秋” |
所有的年份 | 4 位数字 |
姓名、名称等 | 不超过 20 位的字符串 |
province | 不超过 20 位的字符串 |
grade | 0~100 之间的整数 |
credit | 1~10 之间的整数 |
学生选课表与触发器
学生选课信息其实可以通过学生表、专业选课表查询得到,但由于需要存储成绩,所以新增了一张学生选课成绩表;
当专业选课表中新增一条记录时,则该专业的学生都要生成对应的选课记录;当专业选课表中删除一条记录时,则该专业的学生都要删除对应的选课记录;能直接操作该表的,只有教师修改成绩的操作;这样的约束,应由触发器实现,触发器定义见建库脚本。
当学生表增加一条记录时,则根据该学生的专业,自动添加学生选课记录;当学生表删除一条记录时,则根据该学生的专业,自动删除学生选课记录;这样的约束也应由触发器实现,触发器语句见建库脚本。
由于定义了触发器,学生选课表也就不再需要设置任何的外键了。
效果展示
登录界面
学生界面
个人信息
成绩
修改密码
教师界面
个人信息
课程列表
课程详情(学生名单及成绩)
课程成绩统计
修改密码:同学生
管理员界面
学生信息
列表
详情/修改
添加
教师信息
列表
详情/修改
课程信息
列表
详情/修改
专业信息
列表
详情/修改
专业选课信息
列表
详情
添加
附录
http接口设计:
一、总体规定
- HTML 文件均保存在如下目录中
,例如
- get 和 post 方法均需要在路径后拼上查询参数
- 查询参数例如?student_id=< 学生编号 >&course_id=< 课程编号 >
- get 和 post 方法的回复均以 JSON 的方式给出信息
- 所有的路径前均加上 6060
- http 请求的返回状态码不是 200ok 时,会有 error 字段,里面包含错误信息,客户端在适当位置显示
- 所有修改数据库的接口,用的是 post 请求,成功的情况下回复内容为空,状态码 200,失败的情况下回复包含 error 字段,状态码 404
二、学生
API | 方法 | 路径 | 发送参数 | 接收参数 |
查看基本信息 | get | /student/information | student_id | student_id;student_name;sex;birth_year;province;major_id;major_name;credits,已修学分;number_of_courses,已选课程数量;average_grade,加权平均学分 |
查看已选课程 | get | /student/courses_selected | student_id | courses: 列表(; course_id; course_name; year; semester; teacher_name; credit; grade;) |
三、教师
API | 方法 | 路径 | 发送参数 | 接收参数 |
查看基本信息 | get | /teacher/information | teacher_id | teacher_id;teacher_name;sex;birth_year;number_of_courses,所授课程数量 |
查看授课列表 | get | /teacher/courses_taught | teacher_id | courses: 列表(; course_id; course_name; year; semester,秋|春; credit;) |
查看某门课程学生列表 | get | /teacher/course_information | course_id | students: 列表(; student_id; student_name; sex; major_name; grade;) |
修改某门课程某个学生成绩 | post | /teacher/course_information | course_id;student_id;grade | |
查看某门课程统计信息 | get | /teacher/course_statistic | course_id | 0-59:人数;60-69:人数;70-79:人数;80-89:人数;90-100:人数 |
四、管理员/学生信息
API | 方法 | 路径 | 发送参数 | 接收参数 |
查看学生 | get | /admin/student/select | students:列表( ;student_id student_name;sex;birth_year;province;enter_year;major_name;major_id;credits;number_of_courses;average_grade;) | |
修改学生前的请求 | get | /admin/student/update | student_id | student_id:不可修改;student_name;sex;birth_year;province;enter_year;major_id;major_name;majors:列表 |
修改学生后的请求 | post | /admin/student/update | student_id;student_name;sex;birth_year;province;enter_year;major_id | |
添加学生前的请求 | get | /admin/student/insert | majors:列表(; major_id; major_name;) | |
添加学生后的请求 | post | /admin/student/insert | student_name;sex;birth_year;province;major_name | |
删除学生的请求 | post | /admin/student/delete | student_id |
五、管理员/教师信息
API | 方法 | 路径 | 发送参数 | 接收参数 |
查看教师 | get | /admin/teacher/select | teachers:列表(; teacher_id;teacher_name; sex; birth_year;number_of_courses;) | |
修改教师前的请求 | get | /admin/teacher/update | teacher_id | teacher_id:不可修改;teacher_name;sex;birth_year |
修改教师后的请求 | post | /admin/teacher/update | teacher_id;teacher_name;sex;birth_year | |
添加教师的请求 | post | /admin/teacher/insert | teacher_name;sex;birth_year | |
删除教师的请求 | post | /admin/teacher/delete | teacher_id |
六、管理员/课程信息
API | 方法 | 路径 | 发送参数 | 接收参数 |
查看课程 | get | /admin/course/select | courses: 列表(; course_id; course_name; year; semester; teacher_id; teacher_name; credit;number_of_students;average_grade;) | |
修改课程前的请求 | get | /admin/course/update | course_id | course_id:不可修改;course_name;year;semester;teacher_id;teacher_name;credit;teachers 列表(; teacher_id; teacher_name;) |
修改课程后的请求 | post | /admin/course/update | course_id;course_name;year;semester;teacher_id;credit | |
添加课程前的请求 | get | /admin/course/insert | teachers 列表(; teacher_id; teacher_name;) | |
添加课程后的请求 | post | /admin/course/insert | course_name;year;semester;teacher_id;credit | |
删除课程的请求 | post | /admin/course/delete | course_id |
七、管理员/专业信息
API | 方法 | 路径 | 发送参数 | 接收参数 |
查看专业 | get | /admin/major/select | majors:列表(; major_name; major_id;number_of_students;) | |
修改专业前的请求 | get | /admin/major/update | major_id | major_id,不可修改;major_name |
修改专业后的请求 | post | /admin/major/update | major_id;major_name | |
添加专业的请求 | post | /admin/major/insert | major_name | |
删除专业的请求 | post | /admin/major/delete | major_id |
八、管理员/专业选课
API | 方法 | 路径 | 发送参数 | 接收参数 |
查看专业选课列表 | get | /admin/major_course/select | major_courses:列表(; major_id; major_name; course_id; course_name;) | |
添加专业选课前的请求 | get | /admin/major_course/insert | majors:列表(; major_id; major_name;);courses:列表(; course_id; course_name;); | |
添加专业选课后的请求 | post | /admin/major_course/insert | major_id;course_id | |
删除专业选课 | post | /admin/major_course/delete | major_id;course_id |
九、登录/注销/修改密码
API | 方法 | 路径 | 发送参数 | 接收参数 |
学生登录 | get | /student/login | student_id;password | 404 失败,error 字段;200 成功,跳转页面 |
学生修改密码 | post | /student/change_password | student_id;old_password;new_password | 404 失败,error 字段;200 成功 |
教师登录 | get | /teacher/login | teacher_id;password | 404 失败,error 字段;200 成功,跳转页面 |
教师修改密码 | post | /teacher/change_password | teacher_id;old_password;new_password | 404 失败,error 字段;200 成功 |
管理员登录 | get | /admin/login | password | 404 失败,error 字段;200 成功,跳转页面 |
学生登出 | get | /student/logout | student_id | 404 失败,error 字段;200 成功,跳转页面 |
教师登出 | get | /teacher/logout | teachr_id | 404 失败,error 字段;200 成功,跳转页面 |
管理员登出 | get | /admin/logout | 404 失败,error 字段;200 成功,跳转页面 |