QT是C++的桌面应用开发框架,数据库结课作业便使用QT编写制作
1、数据库设计
1.1 ER图
1.2 关系模式
共7张表,如下:
- 学生(学号,姓名,密码,出生日期,所在学院号,专业名称,照片,班级)
- 教师(职工号,姓名,密码,出生日期,所属学院号,照片)
- 课程(课程号,课程名,学分,上课地点,授课教师职工号)
- 学院(学院号,学院名)
- 上课时间(课程号,上课星期,开始节次,结束节次)
- 选课(学号,课程号,成绩)
- 课程学院对应(课程号,学院号,课程属性)
2、功能介绍
2.1 总体概述
本程序分为三个登录方式,学生、教师和管理员,中心功能为选课功能,学生可以登录选择课程,教师查看自己教授课程班级的学生信息,管理员添加新用户、新课程
使用MySQL数据库存储数据。
2.2 登录窗口
2.2.1 选择身份登录
使用数据库存储的相应身份的用户名和正确密码即可成功登录,进入下一窗口
验证码点击会刷新
登录不存在的用户等失误操作会弹出提示
2.2.2 修改密码
点击修改密码红色字体进入
修改密码需要知道原密码,管理员新增用户后,默认的密码和用户登录名相同,此功能主要目的为新用户修改默认密码
2.2.3 密码使用MD5加密存储
数据中存储的密码为MD5加密方式,每次输入密码时,会将输入的密码转换为MD5格式与数据中存储的MD5正确密码比对
QT中有方便的MD5加密库函数,代码如下:
password = QCryptographicHash::hash(password.toLatin1(), QCryptographicHash::Md5).toHex();//将password转为MD5加密后格式
2.3 学生端
如上为登录学生端后初始首页
2.3.1 个人信息
展示当前登陆用户存储在数据库中的个人信息
照片可选择更改,更改后存储入数据库相应表
2.3.2 选课界面
选课列表仅会显示当前登陆学生学院可以选择的课程,选课时如果已选课程上课时间冲突会出现提示
2.3.3 当前课表
覆盖当前登录用户已选课程的课表,展示课程名、上课时间和地点
2.3.4 查看成绩
登录用户查看自己选择课程的成绩,教师未录入时不显示
2.4 教师端
如上为登录教师端后初始首页
2.4.1 个人信息
和学生端相同,不再说明
2.4.2 课程班级
如图,下拉框中显示当前登录教师授课的班级,选择后显示选择该课进入班级的学生
录入成绩需保证0-100的整数,不输入会将数据库对应属性置为null。输入框使用正则表达式限制了输入只能是0-100的整数
存在未录入成绩的学生时,点击提交成绩按钮后会弹出提示
2.4.3 成绩分布(聚集函数)
通过下拉框选择查看当前登录教师用户教授的班级成绩
使用了聚集函数计算该门课程总人数和分数平均值,SQL语句如下:
SELECT COUNT(sc_s_id),AVG(sc_grade) FROM sc WHERE sc_c_id=?
/*?表示课程号*/
2.5 管理员端
如上为登录管理员端后初始首页
2.5.1 新增信息
2.5.1.1 新增学生用户
每个输入框均使用正则表达式做了输入限制,无法输入非法字符串,在右侧日历控件选择出生日期。点击提交按钮存入数据库,重置按钮清空输入
2.5.1.2 新增教师用户
与新增学生用户相同,不再说明
2.5.1.3 新增课程
所有输入框均使用正则表达式限制输入
授课教师框输入教师职工号,点击查找是否存在,不存在会显示不存在!
下拉框选择可选课学生的学院和上课时间,上课时间若与当前授课教师其他课的上课时间冲突,会弹窗提示
2.5.2 修改信息(存储过程)
2.5.2.1 删除学生、教师或课程
单选框选择删除的对象,输入删除对象的编号(学号、职工号或课程号),点击删除
因为数据库关系模式的参照完整性,删除信息时需要从底向上删除,例如删除课程时,需要先删除选课表、上课时间表等的信息,使用存储过程删除
删除课程如下:
DROP PROCEDURE IF EXISTS `delete_course`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `delete_course`(in id varchar(10))
begin
delete from sc where sc_c_id=id; /*删除学生选课记录*/
delete from ccchoice where cc_c_id=id; /*删除学院对应记录*/
delete from course_time where c_id=id; /*删除上课时间记录*/
delete from course where c_id=id; /*删除课程*/
end$$
DELIMITER ;
删除教师如下:
DROP PROCEDURE IF EXISTS `delete_teacher`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `delete_teacher`(IN id VARCHAR(20))
BEGIN
DELETE FROM sc WHERE sc_c_id IN (SELECT c_id FROM course WHERE c_t_id=id); /*删除授课记录*/
DELETE FROM ccchoice WHERE cc_c_id IN (SELECT c_id FROM course WHERE c_t_id=id); /*删除学院对应记录*/
DELETE FROM course_time WHERE c_id IN (SELECT c_id FROM course WHERE c_t_id=id); /*删除上课时间*/
DELETE FROM course WHERE c_t_id=id; /*删除课程*/
DELETE FROM teacher WHERE t_id=id; /*删除教师*/
END$$
DELIMITER ;
删除学生如下:
DROP PROCEDURE IF EXISTS `delete_student`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `delete_student`(IN id VARCHAR(20))
BEGIN
DELETE FROM sc WHERE sc_s_id=id; /*删除选课记录*/
DELETE FROM student WHERE s_id=id; /*删除学生*/
END$$
DELIMITER ;