基于Python+MySQL实现(Web)学生成绩管理系统

项目介绍

  • 本项目是本人在大学期间的数据库课程设计,为学生成绩管理系统
  • 由于当时时间紧张,只有一周多点的时间,实现的功能较为简单
  • 整体架构
    • 后端采用 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 中修改

其它配置说明

    • 不能用 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 成功,跳转页面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神仙别闹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值