基于QT(C++)+Oracle实现的(界面)教务管理系统
一、选题背景教务管理系统是基本每个高校都有的一个系统教务系统管理系统充分利用互联网络B/S管理系统模式以网络为平台为各个学校教务系统的管理提供一个平台帮助学校管理教务用一个账号解决学校教务教学管理并且学校可以自由选择学校需要的教务管理系统灵活地定制符合学校自己实际情况的教务系统。二、方案论证(设计理念)由于我们设计的是教务管理系统虽然我们是使用ORACLE数据库来存储系统的各种信息但是对于前端界面的设计和显示都需要预先知道一定的处理数据量这样才比较好安排各种界面的交互以及展示。所以我们首先要知道需要处理的数据量到低有多大所以需要一定的前期调研。由于教务系统面向的主要对象是学生查课表查成绩等和老师录成绩查名单查课表等所以我们重点调研一个学校中老师学生的人数以及学院和专业的人数。以我们学校华南理工大学为例通过查阅华南理工大学2017年《本科招生资讯册》.pdf和《华南理工大学2017年本科招生专业情况总表》发现我们学校2017年招生的学院数是26个学院招收专业数是101个专业。招收的总学生人数大概在6300人左右那么这里我们可以估计本科4个年级的总人数6300x425200人在每年的招生计划变化都不大的情况下。再仔细考察招生专业情况表发现每个专业所招的人数各不相同比如招收人数最多的专业“软件工程”会招230人招收人数最少的专业“音乐学”只招8个人。可见每个专业招收的人数各不相同并且招收人数比较多的大于60~70人的专业很可能会分成2个或多个班级。再考虑我们学校老师的人数每个学院老师的人数也是各不相同。这里我没有想到很好的办法去获取我们学校每个学院的老师人数只能通过查阅每个学院的官网去获取老师的人数先以我的学院计算机科学与工程学院为例我们学院一共有93名老师这个人数应该属于比较普遍的人数的水平。然后我查到的最多老师的学院是322人是机械与汽车工程学院。其它的学院的教职工人数普遍在90~120的区间。得到了这些关于总数统计的数据我们能更加科学和结合实际情况来设计如何去组织这些数据从而使我们的系统更加科学。在本程序的设计里面我们选择了用面向对象进行编写程序我们编写的教务管理系统里面有如下的类1学生类涉及的信息包括①基本信息ID学号、姓名、性别、登录密码、身份证号、专业、联系方式②学生对应本专业的课表③个人成绩表④关于该学生年级和专业的通知展示2.老师类涉及的信息包括①基本信息ID工号、姓名、性别、登录密码、身份证号、任教科目、联系方式②上课安排表③所教专业班级和学生的名单④所教专业班级和学生的成绩单⑤关于这位老师的通知的展示⑥给任教的班级的所有学生发布通知3.学校管理人员类涉及的信息包括① 基本信息ID帐号、姓名、性别、登录密码、身份证号、学院、联系方式② 所有学生、老师的信息表③ 整个学校的课程列表④ 所有专业的课程表⑤ 各专业班级的GPA绩点表。⑥ 所有学院和专业列表⑦ 通知表4.用户登录类涉及的信息包括里面没有任何信息只是用作登录界面的代码编写。面向类对象设计这个程序能够使我们更好地分类编写程序避免重复编写同样功能的函数。下面简述不同类实现的功能1对于整个程序的login类①提供登录入口②每个类型的人可以凭ID和密码登录③提供通过验证身份证号和预留的手机号来重置帐号密码的功能2对于Student类①提供个人课表查询和课表导出②成绩查询和成绩单导出单科排名等③开始界面展示和该名学生相关的通知3对于Teacher类①提供各教学班级的上课节次安排②所教各专业班级学生名单的查询与导出③所教班级成绩的设置与导出成绩的处理最高分、最低分、平均分、及格率等④开始界面展示和这位老师相关的通知⑤给自己的任教班级的学生发通知4对于学校管理人员类后台函数通过所有学生的个人成绩单生成不同专业的GPA文件。前台界面函数1 用户数据管理① 通过一个外部特定格式的csv文本文件来初始化系统的二进制数据库并且提供② 添加一名新用户用户类型可选学生、老师或管理员。③ 通过特定关键字搜索用户可以对搜索出来的结果执行查看删除或者修改2 课程管理① 通过一个外部特定格式的csv导入课程列表② 通过输入关键字或者留空搜索栏选择查看所有课程或者查看特定的课程并可以对搜索结果执行删除操作3 学生课表管理① 通过某个文件夹下面放置的所有专业的课程表csv文件来导入全部学生的课程表② 可以按年级专业分类查看课程表可以通过搜索框搜索特定的年级或者专业查看指定的课程表4 学生绩点及成绩表管理① 可以生成、查看所有学生的绩点GPA可以清空所有学生的成绩信息5 学院管理① 可以添加单条学院和专业的记录② 可以通过一个外部的csv文件来批量添加学院和专业③ 可以查询、修改、删除某条学院专业记录6 通知管理① 管理员可以选择发送通知的对象全体成员某个学院的老师某个年级某个专业的学生② 可以查询和删除通知另外每个用户的界面的最后一个Tab都是修改密码的界面用户可以通过验证旧密码的方式来修改密码。为了方便用户打印查看的数据我们队每一张表格的旁边都设计了“导出为csv文件”的按钮用户可以把在系统里面查询到的结果输出为csv文件用excel可以直接打开方便用作其它用途e.g.老师可以把学生名单导出并用excel打印出来当做点名册。以上为我们设计的教务系统的全部功能。除此之外我们设计的程序安全性较高每次提供用户选择操作都会有明确的提示以及错误输入的应对方法输出错误提示并让用户重新输入或者选择对于数据库的修改也有一定的维护措施如果数据库的操作有错我们会弹窗告诉用户数据返回的错误信息进一步方便用户对出错位置的判断。系统的运行是在Windows系统下以windows程序运行界面展示的只要数据库前期把相应的表格正确建立就能够完整地运行。至于性能方面虽然数据量比较大但是我们使用的是oracle的数据库是一款比较成熟的数据库管理系统所以在运行速度和稳定性方面都有一定的保障。三、过程论述这一次数据库大作业要做的第一件事情自然就是设计数据库了那我们也已经做过中期汇报不过那个时候我们的数据库模型还不够完整在编码的过程中我们发现需要增删不少表项方便我们对数据进行查询、插入、删除等操作。那么现在我先分析一下数据库的设计过程1.需求分析关于需求分析我们主要需要知道的是这个教务系统应该有些什么功能下面开始分析教务系统应有的功能。对于功能的设计我们分为几个模块分别是学生、教师、管理员另外我想加一个通知功能就是说管理员可以发通知然后学生和教师登陆后可以看到通知的标题点进去可以看详细内容 对于学生来说教务系统的功能应有 ① 查询自己所修的科目② 查询课程表课程名、时间、地点③ 查询各科的成绩及单科排名④ 查询绩点和班专业排名⑤ 选课这应该是我们这次想要实现的东西里面最麻烦的 ⑥ 当然还要能查看自己的信息 ⑦还要能看通知能登录 对于老师来说教务系统的功能应有 ① 查询自己所教的课程课程名、时间、地点、班级并能导出课程表 ② 查询所教的所教班级各班级的成绩 ③ 能修改所教科目各班级的成绩 ④ 能查看自己的信息所在院系、办公室地点之类的 ⑤ 能看通知、能登录对于管理员来说教务系统的功能有① 批量录入学生的信息导入csv文件② 单个录入学生的信息在程序中输入③ 批量录入老师的信息导入csv文件④ 单个录入老师的信息在程序中输入⑤ 输出每个老师的上课安排表⑥ 计算每个学生的GPA⑦ 能够发布通知、读取通知、能登录2.概念结构设计E-R图这是我设计的初稿图1这是我们组在编写程序完善后得到的终稿图2由于图比较大所以没办法看得很清楚具体可以打开教务管理系统ER图.vsdx文件来看。3.逻辑结构设计我们使用的是oracle数据库根据初始的E-R图我们设计出如下关系表① STUDENTSNO学号SNAME学生姓名、SSEX性别、SPSW密码、SID身份证、MNAME专业名、STEL联系方式② TEACHERTNO工号、TNAME教师姓名、TSEX性别、TPSW密码、TID身份证、INAME教师所属学院TTEL联系方式③ 管理员表格和教师表类似。ANO工号、ANAME教师姓名、ASEX性别、APSW密码、AID身份证、INAME教师所属学院ATEL联系方式④ COURSECNO课程号(4位)、CNAME课程名称、CREDIT学分数、FLAG标志必修、选修⑤ SCSNO(学号)、CNO(课程号) (4位)、SCORE学科分数、SRANK单科排名⑥ INFORMINF_NAME通知名、CONTENT内容、ITIME发布时间、RECEIVER接受对象0为全部人接收1为学生接收2位老师接收⑦ GPASNO学号、SGPA学生绩点、SRANK学生排名)⑧ TIMETABLETDAY(星期几)、TTIME(时间)几点~几点、CNO课程号(4位)、TNO(工号)、MNAME专业名、GRADE年级,INAME学院名TPLACE(上课地点)、SWEEK上课周数⑨ MIMNO专业号,MNAME(专业名)INO学院号INAME学院名IPLACE办公地址)⑩ RECYCLEDNO用来回收删除的学号工号在增加用户的时候到垃圾桶找找看有没有可以用的可以用的话就取出来用不可以用再分配新的。年级表GLISTGRADE年级2015-20184.物理结构设计这次我们在数据库框架的设计方面我们考虑到很多时候表的读写和连接需要反复读写内存所以我们的表会有一些冗余项事实上这些冗余项是我们在设计的时候遇到了问题发现数据量大的时候这样的表结构会使查询操作比较慢所以才加上去的。而事实上我们改变了这些以后发现确实快上了那么一秒左右的时间主要原因是不用进行大量表项的连接。事实上我们也有考虑过用视图但是后来觉得视图并不是那么科学因为视图其实并不是真正存在的一张表它只是构建出来给没有权限获取全部信息的用户使用的查询的时候视图还是要进行视图消解所以耗时并不会减少多少。5.qt和oracle数据库的连接作为面向C语言GUI设计软件的qt可以和oracle进行连接具体地说就是要进行以下操作图3在qt中要对数据库进行操作使用的是sql_query对象具体来说我们对数据库的查询都是通过这个对象来完成的我们用prepare语句可以把sql语言的语句准备好里面的参数我们用‘?’来代替这样做的目的是防止有人用字符串连接攻击对对数据库的内容进行窃取。然后这些参数我们用addBindValue函数进行填充具体的代码片段如下图4插入数据到COURSE表中的实例6.数据库的使用和程序编码下面我来介绍一下自己负责的部分由我负责编写的功能有1.课程列表的导入和显示以及删除插入方面我们直接使用qt文件路径获取的窗口然后对课程列表文件进行读取考虑到一个大学每一个学期课表一旦确定下来就不会有太多的改变所以这里我只写了删除操作这个删除操作可以删除一门课程比如说在学期初选课的时候可能有一些课程是不够人开课的这时候就可以把这么课程删掉。具体来说我们用一个csv文件一种可以用word进行编辑的文件存放课表然后直接读入这个csv文件就可以把文件中相关的课程信息全部导入到数据库里面。显示方面我用QTableWidget这个qt的表格类型来显示信息此外我设计了一个查询框供用户输入关键字只要关键字能够匹配的上课程列表里面任何一个表项的内容该条记录就会被显示出来既可以按专业查询也可以按课程号或课程名来查询我认为这种模糊查询比起全字匹配查询更方便用户使用因为当管理员查询一门课程很多时候它不知道这门课的完整名字这时候模糊搜索的作用就比较大了。此外我搜索得到的结果还可以点击标题头部实现按某标题的字符串顺序来显示课程信息。删除方面我做了一个右键菜单其实就是获取鼠标点击的焦点对应表格的第几行第几列然后获取到对应的课程号在数据库进行删除即可。 然后我还实现了到处查询结果为CSV文件的功能这个实现起来使用的是文件操作这里就不详细叙述了。2.课程表的导入和查询操作导入方面具体逻辑是获取文件夹路径读取里面所有的文件名对各个文件路径进行构造并存放在一个数组里面然后逐个文件读入并放入数据库中。这个过程涉及到比较多的磁盘I/O操作可能要等上那么两三秒的时间。读入数据以后我会显示第一个课程表在数据库的界面上只是为了让用户看看效果而已然后点击“确认导入”按钮就能够获取插入数据插入错误的时候会返回相应的提示。要注意一点插入课程表后相应学生修了什么课程也已经知道了所以同时构造出SC表学生-课程 表。因此确认导入后需要的时间会比较长。查询课程表方面我做了一个下拉框用来给用户选择年级然后旁边有一个搜索框给用户作模糊搜索用另外一种查询方式是我设置了另外一个下拉框专门用来获取全部的专业列表用户选择什么专业就会显示什么专业的课程。显示方面的话比较麻烦的是要根据上课星期数和上课时间来决定这门课放在QTableWidget的什么地方这样显示就能做到和我们平时的课程表一模一样而不是一条普通的记录。当然我也做了删除全部课程表的功能这个就比较简单了直接执行SQL语句DELETE FROM TIMETABLE就可以了。图5课程表查询界面3.学生绩点的生成、查询操作学生GPA的生成设计到数据量比较多GPA表结构为GPASNO学号、SGPA学生绩点、SRANK学生排名)因为获取学生的GPA首先要有学生的成绩而要计算排名就要把同一个专业的学生的GPA计算出来才能够进行排名因此需要进行STUDENT表、SC表学生课程表、COURSE表课程表这三个表的连接由于学生有37000多个学生所以这个操作耗费的时间也比较多大概需要30s左右。 具体计算步骤先连接三张表获取所有学生的所有科目的成绩然后遍历该表遍历这个表的时候需要注意的是一条记录只是一个学生一门科目的成绩当读完这个学生的所有成绩以后才可以算出该学生的gpa但是这时候该学生的GPA信息里面还没有排名只有当把一个专业的所有学生的GPA都计算出来以后才能进行排序排序之后再把该专业各个学生的GPA记录存到一个vector向量里面。直到把全校所有学生的GPA信息都统计完成后我们再把这些信息入库。 至于显示GPA信息的窗口我也提供了一个搜索框这个框提供模糊搜索能够实现含通配符字符串的查找比如输入“计算机%_1”就会显示出所有专业名中有“计算机”并且以“_1”结尾的专业学生的GPA。然后标题也是有正序反序排序的功能比如一个专业的学生的gpa我可以按gpa排名来顺序显示gpa信息也可以按照这个班学生的学号递增顺序来显示gpa信息。 另外我也提供了清空所有学生GPA和清空所有学生成绩的按钮方便学期末的时候管理员清理数据库中的数据。图6GPA查询界面四、结果分析这是我写的内容有这些图7目录树下面演示一下导入课程列表的效果图8课程列表导入图9系统提示图10读取文件后显示读取到的课程信息图11导入课程列表成功然后是查询课程列表的效果图图12查询全部课程信息图13模糊搜索得到的结果显示全部有‘现’字的课程图14查看学分数为3.5分的全部课程图15按课程类型的顺序来显示图16按课程号升序来显示图17.1删除课表的某门课图17.2可以看到删除成功0000课程号的课程已经删掉了图18导出文件效果(1)图19导出文件的效果2然后我们来看看导入学生课表的效果图20导入各专业课程表图21读取各个课程表文件以后显示读取到的第一张课表的信息图22插入时的错误提示PS这是我故意多准备了一条相同的记录为了测试错误信息图23导入课程表成功开始生成SC表图24SC表创建成功接下来是查询课程表查询课程表可以选择用搜索框查询还是用下拉框选择专业来查询课程表图25使用下拉框查询课程表的效果和我们平时的课表一模一样图26使用搜索框实现课程搜索最后演示一下生成GPA和查询GPA的页面效果图27生成全部学生GPA并进行查询按照排名显示图28按照学号升序显示gpa信息图29进行模糊搜索会显示不同专业的GPA信息图30用含通配符字符串进行模糊搜索五、课程设计总结这次数据库大作业让我更加清楚地认识到了数据库的重要性。大二上学期我们也做过一个类似的系统但是我们当时对数据操作都是以文本文件或者二进制文件来存储的读取起来真的非常的慢。而且当时我们为了求出某一项数据还必须要将很多个文件连接起来而这些文件又放在不同的目录里面所以我们要查找一个文件还要先查找目录名。现在回想起来那个目录名其实就是数据库的表名如果我们要生成某个学生的GPA我们要先查找这个学生修的都有些什么课程进而获取这些课程的学分还要获取这个学生的各科的成绩因此要对很多个文件进行读写操作。在这种情况下要实现一个数据的查询确实需要有非常清晰的文件读取逻辑才能完成文件的读写我们当时可以说是用文件系统实现了一个数据库。但是有了数据库以后一切都变得不一样了简单的几个表就可以把所有的信息记录起来而对于某项数据的查询只需要进行表连接即可。甚至数据库还能帮我们完成一些简单的排序运算操作。关于表的设计之前在学习数据库概念模型设计时我不明白为什么一些数据库的表会有一些冗余项然后到我们现在自己去设计数据库结构的时候我们就会发现一个表里面有些表项可能确实会破坏关系规范性插入了这项数目这个表可能就不是BCNF或者3NF了但是出于对数据库运行速度的考虑我们为了减少查询时对表的连接次数我们很有可能会选择将两张3NF的表合成为1张2NF的表虽然有可能会有冗余数据但是我认为现在我们的存储空间相对来说都是比较大的所以有一部分冗余数据也是可以接受的。但是读写硬盘的时间就不一样了我们学习过操作系统就知道I/O是最花时间的对表进行连接需要直接对内存进行操作数据量大的时候甚至还要对磁盘进行操作。因此表中的冗余项其实就是“用空间冗余换取时间缩减”。此外我觉得用户需求真的是非常重要因为只有知道了用户想要实现什么功能我们才可以确定自己需要什么数据才可以确定数据库的结构。就比如这次我们开始设计的时候虽然有需求分析但是我们没有想清楚实现这些需求的时候需要什么数据这就导致我们在编写代码的过程中需要重新构建E-R图再次修改各个关系表的结构因此程序代码也要作出相应的调整。所以说设计数据库之前理解好客户需求是非常重要的。其次的话就是编码了大一大二的大作业中我编写的大多是后台函数没有怎么接触用户界面的编写这次我尝试用qt写了一下界面感觉不算太困难不过由于初次使用所以做出来的界面会比较简陋不过如果再有机会使用qt我觉得我会把界面设计的更加好看。总的来说这次数据库大作业我还是有挺多的收获的希望下次大作业能够学习到其他更多的知识。参考文献[1]周爱武汪海威肖云数据库课程设计M北京 机械工业出版社 2012[2]王珊萨师煊数据库系统概论(第五版) M北京 高等教育出版社 2014[3]杨冬青等译 数据库系统概念(第六版) M北京 机械工业出版社 2012[4] Qt中文手册 之 QTreeWidget - CSDN博客https://blog.csdn.net/u010168781/article/details/51565317[5] Qt中文手册 之 QTreeWidgetItem - CSDN博客https://blog.csdn.net/u010168781/article/details/51579526[6] Qt UserRole详解 - fanyun的博客 - CSDN博客https://blog.csdn.net/fanyun_01/article/details/78640277[7] 强大的QVariant - u010335285的专栏 - CSDN博客https://blog.csdn.net/zhanghuiyi222/article/details/8949828[8] QTreeWidget的使用方法_百度经验https://jingyan.baidu.com/article/22fe7ced24e7033002617fbe.html[9] Qt之QStackedWidget多界面切换 - Lance - CSDN博客https://blog.csdn.net/u011731378/article/details/79975782[10] QFileDialog-CSDN论坛https://bbs.csdn.net/topics/390375238[11] Qt获取文件夹下文件夹文件列表 - Seven - CSDN博客https://blog.csdn.net/qq_33854260/article/details/70299353[12] QString替换多个字符 - 各位-请不吝赐教 - CSDN博客https://blog.csdn.net/u013776188/article/details/73492349?utm_sourceblogxgwz5[13] QTableWidget之右键菜单的实现 - hitxiaya的专栏 - CSDN博客https://blog.csdn.net/hitxiaya/article/details/7193732[14] QTableWidget怎么得到鼠标位置所在的单元格-CSDN论坛https://bbs.csdn.net/wap/topics/360266015[15] QT实现鼠标右键快捷菜单(QTableWidget) - TanChengkai的博客 - CSDN博客https://blog.csdn.net/tanchengkai/article/details/52104924♻️ 资源大小5.69MB➡️资源下载https://download.csdn.net/download/s1t16/87425294注更多内容可关注微信公众号【神仙别闹】如当前文章或代码侵犯了您的权益请私信作者删除
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2494125.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!