数据库原理课程设计——高校教务管理系统
随着高校办学规模的扩大,课程设置、师生管理、选课与成绩处理等教务工作变得日益复杂。传统人工管理方式效率低下、数据易出错,亟需一个高效、安全、智能的教务管理系统来支撑教学运行。高校教务系统旨在为教务人员、教师和学生三类用户提供全面的信息管理与操作平台,实现选课、成绩管理、课程安排、教学评估等功能的信息化与自动化。管理员:负责系统的整体管理,包括用户账号管理、权限分配、数据维护、系统配置等。教师:负责
一、系统分析
1.1 项目背景
随着现代教育信息化进程的不断推进,教育管理工作逐渐从传统的人工记录、纸质文档管理转向信息化、数字化管理。教务信息管理系统作为其中的一部分,已经成为高校日常管理和决策支持的重要工具。传统的教务管理方式不仅效率低,而且容易出错。学生信息、课程安排、成绩录入等过程往往需要手动输入和存储,这会导致大量数据处理和传递的错误,且管理工作繁琐复杂,数据查询不方便,极大地影响了教务人员的工作效率,也给学生、教师带来了不便。
因此,开发一个高效、便捷、智能化的教务信息管理系统,显得尤为重要。本系统的实现,能够有效地集成学校内部各类教务信息资源,为教务人员、学生、教师提供高效的管理平台,从而提升教务管理工作水平,优化教学资源配置,减少人工管理带来的错误,提升数据处理的准确性和查询效率,为学校的教学管理提供更加科学和智能的支持。
1.2 可行性分析
本系统是一个能够管理高校中教师,学生信息的系统,旨在管理教师的相关信息例如授课信息等,管理学生的相关信息例如选课信息等。
为了确保本教务信息管理系统的顺利开发与实施,需要对系统的可行性从技术可行性、经济可行性、安全可行性、以及用户可行性等维度进行系统分析,以保证项目具备良好的执行基础。
1.2.1 技术可行性
本系统采用的关键技术已在业界广泛应用,成熟稳定,文档资源丰富,开发门槛适中,具有较强的可实现性。
后端技术:数据库选用 MySQL,具备良好的事务处理能力、稳定性强,适合结构化教务数据存储。支持视图、存储过程、触发器等功能,便于实现复杂业务逻辑。
前端开发:界面开发采用 C++ 结合 Qt 框架,能够实现跨平台的图形用户界面(GUI),具有高度自定义性,适合高校终端部署需求。
系统架构:采用模块化设计,功能分区明确(如教师管理模块、学生管理模块、课程安排模块、查询统计模块等),便于维护与后续扩展。
开发工具链:全流程可使用 Visual Studio + Qt Creator 作为主要开发环境,支持调试、图形设计、跨平台编译,兼容性良好。
综上,从技术资源、开发工具、人员技能储备等方面来看,本系统具有较强的可实现性。
1.2.2 经济可行性
项目的开发与部署整体成本可控,具有良好的经济可行性:
开发成本低:所使用的工具与技术大部分为开源或免费版本,如 Qt 开源社区版、MySQL 社区版、C++ 标准编译器等,无需购买商业许可。
部署成本小:系统运行对硬件要求不高,可在普通 PC 或校内服务器上运行,适合实验性部署与后续扩展。
维护成本低:系统设计强调模块解耦与可维护性,后期维护工作主要集中于数据更新和用户支持,费用可控。
长期回报大:通过系统化管理减少人工操作与失误,释放教务人员工作时间,提高数据质量,具有长期经济效益。
1.2.3 安全可行性
信息安全是教务系统的重要考量因素。本系统在设计上引入以下安全机制以确保数据安全性和操作可靠性:
身份认证机制:所有用户需通过账户与密码登录,系统根据角色(学生、教师、管理员)实施权限分级控制,防止未授权访问与操作。
操作日志记录:关键数据操作如新增、修改、删除等均会记录至日志数据库中,用于追踪用户行为,保障审计可追溯性。
数据完整性与备份机制:对关键数据表设计外键约束,防止非法操作破坏数据一致性,并定期进行数据备份以防数据丢失。
前后端分离与输入校验:在输入阶段设定数据校验机制,防止 SQL 注入、数据越界等安全漏洞,提高系统鲁棒性。
1.3 功能性需求分析
1.3.1 需求概述
教务信息管理系统旨在实现高校教务管理工作的数字化、智能化,服务于用户。系统应支持课程安排、选课、成绩管理、用户权限管理等核心功能,通过统一的信息平台提高工作效率、减少人为错误、增强信息透明度。
特别地,系统的设计与实现应以用户需求为导向,结合实际使用场景,明确系统所需满足的核心功能与辅助功能,确保各类用户均能高效、便捷、安全地完成其业务目标。
1.3.2 用户角色
教务信息管理系统的用户对象主要分为三类:管理员、教师和学生
管理员:作为系统的核心用户,管理员拥有最全面的权限。管理员负责系统的整体信息管理操作。管理员还可以根据权限设置不同的角色和功能,保证系统的安全和灵活性。
教师:教师主要使用系统进行成绩录入和信息查看。教师可以查看和修改自己负责的课程安排、成绩评定等信息。教师还可以根据权限进行课程调整和学生信息修改。
学生:学生主要通过系统查询自己的课程信息、成绩信息以及自己的选课情况。学生可以进行选课、退课操作。
【-- 数据流图 --】

因此,可进一步为每类用户具备不同的权限边界与操作范围:
(1)管理员角色
权限等级:最高权限
核心职责:
维护系统基础数据(如专业安排);
管理教师与学生的账户信息(包括增删改查、重置密码等);
管理课程信息、教室信息、教材信息等;
审核学生选课、分配课程资源、排课;
管理系统权限(为用户赋予或撤销角色)。
(2)教师角色
权限等级:中等权限(限于自身授课相关信息)
核心职责:
查看和修改自身信息(如密码修改等);
查看所授课程安排;
录入与修改学生成绩;
查询学生名单与选课情况;
(3)学生角色
权限等级:基础权限(限于自身信息)
核心职责:
查看和修改自身信息(如密码修改等);
浏览个人课表与课程信息;
进行选课与退课操作;
查询课程成绩、打印学生成绩单。
1.顶层数据流图及说明

功能概述:
顶层DFD展示了整个教务管理系统与外部实体之间的交互关系,定义了系统边界。
外部实体:
-
管理员:负责系统维护、数据管理和权限控制
-
教师:进行授课安排、成绩录入和个人信息管理
-
学生:进行选课操作、成绩查询和个人信息维护
-
课程(被动实体):提供课程信息
-
教室(被动实体):提供教学场地资源
主要数据流:
-
管理员 ↔ 系统:
-
输入:账号信息、系统配置指令、数据维护请求
-
输出:系统状态报告、操作结果反馈
-
-
教师 ↔ 系统:
-
输入:授课计划、成绩数据、个人信息更新
-
输出:课表信息、学生名单、教学提醒
-
-
学生 ↔ 系统:
-
输入:选课申请、个人信息、查询请求
-
输出:选课结果、成绩单、个人课
-
2.中层数据流图及说明

功能概述:
中层DFD将系统分解为5个主要功能模块,展示模块间的数据交互。
主要处理模块:
-
用户管理模块:
-
功能:处理所有用户的认证和基本信息管理
-
数据流:
-
接收来自管理员、教师、学生的登录请求
-
维护用户账号、密码和基本信息
-
向核心处理模块提供用户验证结果
-
-
-
课程管理模块:
-
功能:维护课程信息和教材数据
-
数据流:
-
接收管理员输入的课程设置
-
维护课程-教材关联关系
-
向选课管理模块提供课程可用信息
-
-
-
选课管理模块:
-
功能:处理选课全流程
-
数据流:
-
接收学生选课请求
-
检查课程容量和冲突
-
记录选课结果和成绩
-
-
-
教室管理模块:
-
功能:管理教室资源和分配
-
数据流:
-
接收授课安排的教室需求
-
检查教室可用性
-
记录教室使用安排
-
-
-
核心处理模块:
-
功能:协调各模块工作,处理业务逻辑
-
数据流:
-
接收各模块的处理请求
-
协调数据在不同模块间的流转
-
生成综合性的处理结果
-
-
数据存储:
-
用户数据库:存储所有用户的基本信息
-
课程数据库:存储课程和教材信息
-
选课数据库:存储选课记录和成绩
-
教室安排数据库:存储教室使用情况
3.底层数据流图及说明
1.学生信息管理模块

数据流说明:
-
输入:学生登录凭证、修改请求(性别/出生日期)。
-
输出:个人信息或错误提示。
-
约束:仅操作
Student表,不涉及其他模块。
2.选课/退课管理模块

权限控制:
-
学生:通过
student_id限制仅操作自己的选课记录。 -
管理员:可绕过校验,直接修改
Grade表。
3.教师信息管理模块

数据流说明:
-
输入:教师登录凭证、课程/成绩查询请求。
-
输出:课程详情及学生成绩(含等级转换)。
4.成绩评分管理模块

权限控制:
-
教师:仅能修改自己授课课程的成绩。
-
管理员:可直接调用
a_UpdateGrade,无需权限校验。
5.管理员管理模块

数据流说明:
-
输入:所有基础数据的增删改查指令。
-
输出:操作状态及错误日志。
-
约束:需验证外键关联(如
major_id存在性)。
1.3.3 功能分析建模
(1)功能结构分解
我们对系统的功能模块进行了描述,采用了“自顶向下”的分解方式。将系统划分为了五大核心模块,对各模块再进一步细化子功能。可得到如下功能分层架构图:
教务信息管理系统
├── 用户管理
│ ├── 用户登录/登出
│ ├── 修改个人信息
│ └── 密码修改
├── 教务管理
│ ├── 学生选课与退课
│ └── 教师授课安排
├── 资源管理(专业、课程、教室、教材)
│ ├── 信息维护
│ ├── 课程信息维护
│ ├── 教室信息管理
│ └── 教材信息管理
├── 成绩管理
│ ├── 教师录入、修改成绩
│ ├── 管理员修改成绩
│ ├── 学生成绩查询与成绩单导出
│ └── 教师教授课程成绩报表导出
└── 查询统计
├── 统计学院、专业的教师、学生情况
├── 查询选课情况及成绩
├── 查询指定课程安排
└── 课程成绩报表统计课程考核成绩信息
功能分层架构图
(2)功能模块职责说明
为了实现教务信息管理系统的功能目标,系统设计将整体功能划分为多个独立但协同的模块。每个模块围绕特定业务需求展开,具备清晰的功能边界和责任分工。通过模块化设计,系统不仅具备良好的可维护性和可扩展性,还能在后续演进中灵活集成新功能,提高开发效率与系统稳定性。
下表展示了系统核心功能模块及其主要职责说明:
系统核心功能模块主要职责说明
模块名称
功能说明
用户管理
实现用户身份认证、信息修改、权限角色分配与验证
教务管理
管理选课流程、教师授课分配和课程审核机制
资源管理
实现专业安排、课程、教室、教材等教学资源的信息维护
成绩管理
教师对学生成绩进行评定、录入与修正、生成报表
学生对成绩进行查询、成绩单导出
查询统计
支持个性化信息查询、数据统计
功能模块的划分不仅有助于系统开发过程中的任务分配,也为后期维护、测试与升级提供了良好的结构基础。每个模块之间通过接口通信协作,形成一个高内聚低耦合的系统体系,确保各类用户在不同场景下均可实现其业务目标,体现系统的专业性与实用性。
进一步综合用户定义、业务逻辑,可将系统功能分角色进行如下描述:
- 学生可以查询和修改自己的个人信息和密码;
- 学生可以查询课程状态并进行选课/退课操作;
- 学生可以进行成绩单打印PDF操作。
- 教师可以查询修改自己的个人信息和密码;
- 教师可以查询和评定或修改自己所授课程的学生成绩;
- 教师可以进行课程成绩报表打印PDF操作。
- 管理员可以查询、增加、删除、修改学校专业信息;
- 管理员可以查询、增加、删除教材相关信息;
- 管理员可以查询、增加、删除教室相关信息;
- 管理员可以查询、增加、删除、修改学生、教师用户信息和账号管理;
- 管理员可以查询、增加、删除、修改课程相关信息;
- 管理员可以查询、修改学生相关课程成绩。
1.4 非功能性需求分析
教务信息管理系统作为高校日常管理的重要信息化平台,其稳定性、可用性、安全性与用户体验对于系统整体运行至关重要。与传统单体架构不同,本系统采用模块化设计,功能解耦、便于维护,同时也对非功能性指标提出了更高要求。因此,需从多个维度对非功能性需求进行明确定义与保障设计。
1.4.1 安全性需求
系统需严格保障用户数据与操作的安全性,防止数据泄露与恶意攻击。具体包括:
- 用户身份验证机制:通过账户密码登录,并实施基于角色的访问控制(RBAC),限制越权访问;
- 数据输入合法性校验:所有用户输入均需进行格式校验,防止 SQL 注入、XSS 等攻击行为;
- 敏感数据加密存储:对用户密码、成绩等敏感信息采用加密存储;
- 操作日志审计机制:可选择记录所有关键操作(如登录、增删改查行为),保障审计可追溯。
1.4.2 性能需求
为确保系统在高并发访问场景下的响应速度与稳定性,系统应满足以下性能要求:
- 响应时间:页面加载时间限制,查询结果反馈时间限制;
- 并发支持:系统应支持至少千名用户同时在线操作,无明显卡顿或崩溃;
- 数据处理能力:支持大量的学生成绩与选课记录的存储与查询,保持良好查询性能;
- 异常处理能力:系统应具备良好的异常捕捉与容错机制,保障服务不中断。
1.4.3 可用性与可维护性
系统还应具备高可用、易维护的特性,以降低后期运维成本,提高服务持续性:
- 高可用性设计:系统运行时间需达到 99.9% 以上,全年故障停机时间不得超过指定限制;
- 模块化设计:各功能模块(如学生管理、课程安排等)独立部署,便于更新、替换、备份、恢复等操作;
- 自动备份机制:系统每日自动备份数据库,并支持手动恢复操作,防止数据丢失;
- 错误提示友好:系统在操作异常时应提供明确、友好的错误提示信息,提升用户体验。
1.4.4 用户界面(UI)与交互需求
具有良好的用户体验是系统推广与应用的关键。系统应满足以下界面与交互规范:
- 简洁清晰:页面布局结构合理,主要操作区域突出,避免冗余信息干扰用户;
- 操作一致性:各模块风格统一,按钮与功能命名规范一致,减少用户学习成本;
- 适配性强:界面兼容主流操作系统,适配 1080P 与 2K 分辨率屏幕显示;
交互友好:支持键盘快捷操作、数据自动补全、常用功能引导等交互辅助功能。
二、系统设计
2.1 数据库设计
2.1.1 数据库概念结构设计
(1)实体(Entity)设计
在完成系统的需求分析的基础上,我们对教务信息管理系统的核心数据结构进行了抽象和设计。通过识别系统中涉及的关键业务对象,将其映射为数据库中的实体(Entity),以便后续逻辑结构和物理结构的构建。
本系统共抽象出以下九个核心实体,涵盖了课程安排、人员信息、教室资源、教材使用、选课与成绩管理等核心业务需求。各实体的主键字段用于唯一标识对象,其余属性则体现该业务对象的基本信息或与其他实体的关联关系。
实体及属性初步设计
|
实体名 |
主键 |
其余属性 |
|
学院 |
学院号 |
学院名 |
|
专业 |
专业号 |
专业名、学院号 |
|
教室 |
教室编号 |
教室名称、楼栋、容量 |
|
教材 |
教材编号 |
教材名称、作者、出版社 |
|
教师 |
教师号 |
姓名、性别、出生日期、学院号、账号、密码 |
|
学生 |
学号 |
姓名、性别、出生日期、专业号、年级、账号、密码 |
|
课程 |
课程号 |
课程名、课时、学分、教室编号、教师号、教材编号 |
|
成绩 |
学号+课程号 |
成绩 |
|
管理员 |
账号 |
密码 |
(2)关系(Relationships)设计
在建立教务信息管理系统的实体结构后,进一步需要分析实体之间的关联关系,明确它们在业务场景中的联动逻辑。这些关系体现了系统在数据层面的依赖结构,有助于保障数据库设计的完整性与一致性。
本节通过归纳系统中核心业务对象之间的交互行为,识别出多个典型的一对一、一对多、多对多关系,并为每一关系设定合理的参照策略(如级联删除、字段置空),以保障数据的联动性与系统的稳定性。
关系设计及其关联实体对应类型
|
关系名 |
关联实体 |
类型 |
|
所属 |
专业↔学院 |
多对一 |
|
所属 |
教师↔学院 |
多对一 |
|
所属 |
学生↔专业 |
多对一 |
|
使用 |
课程↔教室 |
一对一 |
|
授课 |
课程↔教师 |
多对一 |
|
使用 |
课程↔教材 |
一对一 |
|
选课 |
学生↔课程 |
多对多 |
(3)E-R图设计
- 专业-学院关系

- 专业-学生关系

- 学院-教师关系

- 教师-课程关系

- 学生-选课-课程关系

- 教程-教材关系

- 课程-教师关系

- 综合E-R图

2.1.2 数据库逻辑结构、物理结构设计
(1)数据库表逻辑设计
基于概念结构实体设计,为数据库构建以下表:
数据库表逻辑设计
|
实体 |
主要属性 |
说明 |
|
College |
college_id、college_name |
学校各个院系 |
|
Major |
major_id、major_name、college_id |
学院下属专业 |
|
Classroom |
classroom_id、classroom_name、building、capacity |
教学场所 |
|
Textbook |
textbook_id、textbook_name、 author、publisher |
课程使用教材 |
|
Teacher |
teacher_id、name、gender、birth_date、 college_id、username、password |
教师信息 |
|
Student |
student_id、name、gender、birth_date、 major_id、grade、username、password |
学生信息 |
|
Course |
course_id、course_name、hours、credits、 classroom_id、teacher_id、textbook_id |
课程信息 |
|
Grade |
student_id、course_id、grade |
学生选课及 成绩记录 |
|
Admin |
username、password |
数据库管理员 |
(2)完整性优化设计
实体完整性:
主键约束:所有实体均设定合适的主键,确保数据唯一性和完整性。
参照完整性:
外键约束及级联操作:
- 专业所属学院删除时,级联删除对应专业,保证专业不悬挂。
- 学生所属专业删除时,将学生专业字段置空,避免学生信息丢失。
- 教师所属学院删除时,教师学院字段置空,保持教师信息完整。
- 教室、教师、教材删除时,相关课程字段置空,保证课程信息有效。
- 成绩表通过外键关联学生和课程,学生或课程删除时,级联删除对应成绩,保持数据一致。
自定义完整性
数据检查:
- 性别字段限制为'M'或'F'。
- 年级字段限制在合理范围(1~4)。
- 成绩字段限制0~100。
- 教室容量限制合理范围(30~200)。
字段长度和类型优化:
- 用合适的数据类型(如VARCHAR、INT、DATE)减少存储开销。
- 对密码字段设定足够长度(可选择支持加密存储)。
(3)数据库表字段设计
为不重复赘述,以下均为结合了完整性约束优化,进行了字段设计后的完整表数据结构定义:
- 学院(学院号,学院名)
主键:college_id:学院的唯一标识。
外键:无。
约束项:
college_name:NOT NULL,UNIQUE。
College表字段设计
|
字段名 |
数据类型 |
约束 |
说明 |
|
college_id |
VARCHAR(10) |
PRIMARY KEY |
学院号 |
|
college_name |
VARCHAR(20) |
NOT NULL UNIQUE |
学院名称 |
- 专业(专业号,专业名,学院号)
主键:major_id:专业的唯一标识。
外键:college_id → College(college_id):所属学院。ON DELETE CASCADE 表示删除学院时,级联删除该学院下的所有专业。
约束项:
major_name:NOT NULL, UNIQUE;
college_id:NOT NULL 外键约束,必须关联存在的学院。
Major表字段设计
|
字段名 |
数据类型 |
约束 |
说明 |
|
major_id |
VARCHAR(10) |
PRIMARY KEY |
专业号 |
|
major_name |
VARCHAR(20) |
NOT NULL UNIQUE |
专业名称 |
|
college_id |
VARCHAR(10) |
FOREIGN KEY → College(college_id)ON DELETE CASCADE |
所属学院号 |
- 教室(教室编号,教室名称,楼栋,容量)
主键:classroom_id:教室的唯一标识。
外键:无。
约束项:
classroom_name:NOT NULL;
building:NOT NULL;
capacity:CHECK (capacity > 30 AND capacity < 200),限定教室容量必须在合理区间内。
Classroom表字段设计
|
字段名 |
数据类型 |
约束 |
说明 |
|
classroom_id |
VARCHAR(10) |
PRIMARY KEY |
教室编号 |
|
classroom_name |
VARCHAR(10) |
NOT NULL |
教室名称 |
|
building |
VARCHAR(5) |
NOT NULL |
所在楼栋 |
|
capacity |
INT |
CHECK (capacity > 30 AND capacity < 200) |
教室容量 |
- 教材(教材编号,教材名称,作者,出版社)
主键:textbook_id:教材的唯一标识。
外键:无。
约束项:
所有字段均为 NOT NULL,数据完整性强。
Textbook表字段设计
|
字段名 |
数据类型 |
约束 |
说明 |
|
textbook_id |
VARCHAR(10) |
PRIMARY KEY |
教材编号 |
|
textbook_name |
VARCHAR(20) |
NOT NULL |
教材名称 |
|
author |
VARCHAR(20) |
NOT NULL |
作者 |
|
publisher |
VARCHAR(20) |
NOT NULL |
出版社 |
- 教师(教师号,姓名,性别,出生日期,学院号,账号,密码)
主键:teacher_id:教师的唯一标识。
外键:college_id → College(college_id):所属学院。ON DELETE SET NULL 表示学院删除时教师学院号字段置空。
约束项:
username:NOT NULL, UNIQUE;
password:NOT NULL;
name:NOT NULL;
gender:CHECK (gender IN ('M','F'))性别必须为M(男)或F(女)。
Teacher表字段设计
|
字段名 |
数据类型 |
约束 |
说明 |
|
teacher_id |
VARCHAR(10) |
PRIMARY KEY |
教师号 |
|
name |
VARCHAR(10) |
NOT NULL |
姓名 |
|
gender |
CHAR(1) |
CHECK (gender IN ('M','F')) |
性别(M/F) |
|
birth_date |
DATE |
- |
出生日期 |
|
college_id |
VARCHAR(10) |
FOREIGN KEY REFERENCES College(college_id) ON DELETE SET NULL |
所属学院号 |
|
username |
VARCHAR(50) |
NOT NULL UNIQUE |
登录账号 |
|
password |
VARCHAR(100) |
NOT NULL |
登录密码 |
- 学生(学号,姓名,性别,生日,专业号,年级,账号,密码)
主键:student_id:学生的唯一标识。
外键:major_id → Major(major_id):专业号。ON DELETE SET NULL 表示专业删除时学生专业号字段置空。
约束项:
username:NOT NULL, UNIQUE;
password:NOT NULL;
name:NOT NULL;
grade:CHECK (grade BETWEEN 1 AND 4) 年级必须为1~4;
gender:CHECK (gender IN ('M','F')) 性别必须为M(男)或F(女)。
Student表字段设计
|
字段名 |
数据类型 |
约束 |
说明 |
|
student_id |
VARCHAR(10) |
PRIMARY KEY |
学号 |
|
name |
VARCHAR(10) |
NOT NULL |
姓名 |
|
gender |
CHAR(1) |
CHECK (gender IN ('M','F')) |
性别(M/F) |
|
birth_date |
DATE |
- |
出生日期 |
|
major_id |
VARCHAR(10) |
FOREIGN KEY REFERENCES Major(major_id) ON DELETE SET NULL |
专业号 |
|
grade |
INT |
CHECK (grade BETWEEN 1 AND 4) |
年级 |
|
username |
VARCHAR(50) |
NOT NULL UNIQUE |
登录账号 |
|
password |
VARCHAR(100) |
NOT NULL |
登录密码 |
- 课程(课程号,课程名,课时,学分,教室编号,教师号,教材编号)
主键:course_id:课程的唯一标识。
外键:
classroom_id → Classroom(classroom_id):教室编号。ON DELETE SET NULL 表示教室删除时教室编号字段置空;
teacher_id → Teacher(teacher_id):授课教师。ON DELETE SET NULL 表示教师删除时学生教师号字段置空;
textbook_id → Textbook(textbook_id):使用教材。ON DELETE SET NULL表示教材删除时教材编号字段置空。
约束项:
course_name:NOT NULL;
hours:NOT NULL;
credits:CHECK (credits > 0),学分必须为正数。
Course表字段设计
|
字段名 |
数据类型 |
约束 |
说明 |
|
course_id |
VARCHAR(10) |
PRIMARY KEY |
课程号 |
|
course_name |
VARCHAR(20) |
NOT NULL |
课程名称 |
|
hours |
INT |
NOT NULL |
授课时数 |
|
credits |
DECIMAL(2,1) |
CHECK (credits > 0) |
课程学分 |
|
classroom_id |
VARCHAR(10) |
FOREIGN KEY REFERENCES Classroom(classroom_id) ON DELETE SET NULL |
上课教室编号 |
|
teacher_id |
VARCHAR(10) |
FOREIGN KEY REFERENCES Teacher(teacher_id) ON DELETE SET NULL |
授课教师号 |
|
textbook_id |
VARCHAR(10) |
FOREIGN KEY REFERENCES Textbook(textbook_id) ON DELETE SET NULL |
授课教材编号 |
- 成绩(学号,课程号,成绩)
主键:联合主键:(student_id, course_id),一个学生只能对应一个课程的唯一成绩。
外键:
student_id → Student(student_id):ON DELETE CASCADE 表示删除学生时,级联删除该学生的所有成绩;
course_id → Course(course_id):ON DELETE CASCADE 表示删除课程时,级联删除该课程下的所有成绩。
约束项:
grade:CHECK (grade BETWEEN 0 AND 100),成绩必须为0~100之间的整数。
Grade表字段设计
|
字段名 |
数据类型 |
约束 |
说明 |
|
student_id |
VARCHAR(10) |
PRIMARY KEY FOREIGN KEY REFERENCES Student(student_id) ON DELETE CASCADE |
学号 |
|
course_id |
VARCHAR(10) |
PRIMARY KEY FOREIGN KEY REFERENCES Course(course_id) ON DELETE CASCADE |
课程号 |
|
grade |
INT |
CHECK (grade BETWEEN 0 AND 100) |
成绩 |
- 管理员(账号、密码)
主键:username,管理员的唯一标识。
外键:无。
约束项:无。
Admin表字段设计
|
字段名 |
数据类型 |
约束 |
说明 |
|
username |
VARCHAR(50) |
NOT NULL UNIQUE |
登录账号 |
|
password |
VARCHAR(100) |
NOT NULL |
登录密码 |

2.1.3 视图设计
- vw_School_AllInfo
内容:聚合 College和Major表、Teacher(计数)、Student(计数),展示院校整体架构与人员规模。
目的与作用:
- 提供学校组织结构与资源总览;
- 支持管理层决策、教育资源配置、整体规划。
学院专业视图字段说明
|
字段名 |
来源表 |
说明 |
|
college_id |
College |
学院号 |
|
college_name |
College |
学院名称 |
|
teacher_count |
Teacher |
学院教师数量 |
|
major_id |
Major |
专业号 |
|
major_name |
Major |
专业名称 |
|
student_count |
Student |
专业学生数量 |
- vw_Student_AllInfo
内容:整合 Student、Major、College 表的学生基本信息、专业和学院。
目的与作用:
- 统一展示学生信息,简化外键解析;
- 支持按专业、学院过滤学生;
- 对管理员或教务管理模块友好,便于进行学生信息查询、管理。
学生信息视图字段说明
|
字段名 |
来源表 |
说明 |
|
student_id |
Student |
学号 |
|
name AS student_name |
Student |
学生姓名 |
|
gender |
Student |
性别 |
|
birth_date |
Student |
出生日期 |
|
major_id |
Student |
专业号 |
|
grade |
Student |
年级 |
|
username |
Student |
登录账号 |
|
password |
Student |
登录密码 |
|
major_name |
Major |
专业名称 |
|
college_id |
Major |
学生所属学院号 |
|
college_name |
College |
学生所属学院名称 |
- vw_Teacher_AllInfo
内容:整合 Teacher 和 College表,展示教师基本信息及所属学院。
目的与作用:
- 提供完整的教师信息视图;
- 便于教务处快速获取教师资源分布;
- 支持按学院筛选教师、统一教师身份认证入口。
教师信息视图字段说明
|
字段名 |
来源表 |
说明 |
|
teacher_id |
Teacher |
教师号 |
|
name AS teacher_name |
Teacher |
教师姓名 |
|
gender |
Teacher |
性别 |
|
birth_date |
Teacher |
出生日期 |
|
college_id |
Teacher |
教师所属学院号 |
|
username |
Teacher |
登录账号 |
|
password |
Teacher |
登录密码 |
|
college_name |
College |
教师所属学院名称 |
- vw_Course_AllInfo
内容:整合 Course、Classroom、Teacher、Textbook表,展示课程信息、上课地点、授课教师及教材详情。
目的与作用:
- 实现课程全景式信息展示;
- 支持课程安排、选课系统、教师课程查询等模块;
- 提高跨表查询效率,减少程序端关联逻辑复杂度。
课程信息视图字段说明
|
字段名 |
来源表 |
说明 |
|
course_id |
Course |
课程号 |
|
course_name |
Course |
课程名称 |
|
hours |
Course |
学时 |
|
credits |
Course |
学分 |
|
classroom_id |
Course |
教室号 |
|
teacher_id |
Course |
教师号 |
|
textbook_id |
Course |
教材号 |
|
classroom_name |
Classroom |
教室名称 |
|
building AS classroom_building |
Classroom |
楼栋 |
|
capacity |
Classroom |
容量 |
|
name AS teacher_name |
Teacher |
教师姓名 |
|
textbook_name |
Textbook |
教材名称 |
|
author |
Textbook |
作者 |
|
publisher |
Textbook |
出版社 |
- vw_Grade_AllInfo
内容:整合 Grade、Course、Student、Teacher表,全面展示学生成绩信息。
目的与作用:
- 支持教师和教务查看教学成果;
- 提供按学生、课程、教师维度统计成绩的基础;
- 便于开发成绩管理、分析和导出模块。
成绩汇总视图字段说明
|
字段名 |
来源表 |
说明 |
|
course_id |
Grade |
课程号 |
|
student_id |
Grade |
学生号 |
|
grade |
Grade |
成绩 |
|
course_name |
Course |
课程名称 |
|
teacher_id |
Course |
授课教师号 |
|
name AS teacher_name |
Teacher |
授课教师姓名 |
|
name AS student_name |
Student |
学生姓名 |
- vw_Classroom_AllInfo
内容:整合 Classroom 和 Course表,展示教室信息及其使用课程。
目的与作用:
- 提高教室资源可视化程度;
- 支持教室利用率分析、冲突检查、排课辅助;
- 便于后续扩展教室状态、设备等信息。
教室安排视图字段说明
|
字段名 |
来源表 |
说明 |
|
classroom_id |
Classroom |
教室号 |
|
classroom_name |
Classroom |
教室名称 |
|
building |
Classroom |
楼栋 |
|
capacity |
Classroom |
容量 |
|
course_name |
Course |
使用该教室的课程名称 |
- vw_Textbook_AllInfo
内容:整合 Textbook、Course、College表,展示教材使用情况及其学院分布。
目的与作用:
- 管理教材采购、发放、使用等流程;
- 追踪教材使用周期、覆盖课程、出版社等数据;
- 教材管理人员可依据该视图调整教材供应计划。
教材信息视图字段说明
|
字段名 |
来源表 |
说明 |
|
textbook_id |
Textbook |
教材号 |
|
textbook_name |
Textbook |
教材名称 |
|
author |
Textbook |
作者 |
|
publisher |
Textbook |
出版社 |
|
course_name |
Course |
使用该教材的课程名称 |
|
college_name |
College |
使用该教材的学院名称 |
2.1.4 范式分析(Normalization Analysis)
(1)第一范式(1NF):原子性与规范结构的实现
核心要求:数据表中每一列都应具有原子性(Atomicity),即不可再分;每一行都唯一表示一个实体。
字段原子性保障:
所有字段都严格定义为不可再拆分的原子单元,例如:
- birth_date 字段采用 DATE 类型,而非字符串格式,防止非结构化日期输入(如“2023年12月31日”);
- gender 字段使用 CHAR(1) 类型,限制为单一字符,如“M”“F”,防止出现“男、女、其他”等字符串;
- credits、hours 等数字型字段统一采用 INT 类型,防止出现诸如“32小时”这样的混合值;
主键约束明确定义:
- 单列主键:如 college_id、major_id、student_id、teacher_id 等均为唯一标识;
- 复合主键:如 Grade(student_id, course_id),联合唯一标识一门课程下某位学生的成绩,防止重复记录。
整体分析:所有表均未使用 逗号分隔的值、数组字段 或其他非关系型结构,无重复组结构,严格避免“重复组”现象,全面符合 1NF。
(2)第二范式(2NF):完全依赖的结构保证
核心要求:在满足1NF的基础上,表中的非主属性必须完全依赖于主键,不能只依赖主键的一部分(适用于复合主键情况)。
完全函数依赖验证:
例如:
- Course表:非主属性如 course_name、credits、textbook_id 等都完全依赖主键 course_id;
- Grade表:成绩 grade 完全依赖于复合主键 (student_id, course_id),而非单独依赖其中任意一项;
- Student表:如 gender、major_id 等属性都直接依赖于 student_id,无冗余或部分依赖;
- Teacher表:如 college_id、username 等同样满足完全依赖。
避免冗余的反向说明:
例如:若 Teacher 表直接存储 college_name(应由外键 college_id 决定)则构成部分依赖,此设计中已通过外键关联 College 表来规避此问题。
整体分析:所有非主属性均完全依赖于主键,无例外情况,系统设计满足2NF。
(3)第三范式(3NF):消除传递依赖与语义冗余
核心要求:在满足2NF基础上,所有非主属性不能传递依赖于主键。
关键传递依赖消除:
例如:
- 学生 → 专业 → 学院链条
Student 表只记录 major_id,不存储 college_name,避免出现 student_id → major_id → college_name 的传递依赖;
- 课程 → 教室 → 容量链条
Course 表只保留 classroom_id,教室的容量 capacity 由 Classroom 表管理,避免 course_id → classroom_id → capacity 的传递依赖。
整体分析:所有非主属性均未传递依赖于主属性,系统设计满足3NF。
(4)BCNF(巴斯-科德范式):候选键上的函数依赖一致性
核心要求:对于任意非平凡函数依赖 X → Y,X 必须是表的候选键(不局限于主键)。
候选键一致性验证:
- Teacher.username 为候选键,具备唯一性约束,满足 username → teacher_id, name, college_id...;
- Student.username 同理,具备登录系统唯一标识功能;
- Course.course_id、Textbook.textbook_id 等主键对其他属性函数依赖完全合理;
- Grade(student_id, course_id) 作为复合候选键,唯一确定成绩 grade。
整体分析:所有函数依赖均以候选键为前提,无违反 BCNF 情况出现。
2.2 系统功能设计
2.2.1 存储过程设计
为了实现功能建模中的各项核心功能,并提升系统整体的模块化程度与功能调用的便捷性,我们从教师、学生与管理员三类用户的业务需求出发,进行了功能划分与服务封装。在此基础上,我们将部分操作频繁、逻辑明确的基础性功能在数据库层面进行建模设计,采用存储过程的方式进行实现。
为此我们设计了如下一系列基于不同用户角色的存储过程:
管理员功能存储过程
|
存储过程 |
输入参数 |
功能说明 |
|
a_UpdateStudentInfo |
全字段 |
修改指定学生个人信息 |
|
a_AddStudent |
全字段 |
添加学生 |
|
a_DeleteStudent |
p_student_id |
删除学生 |
|
a_UpdateTeacherInfo |
全字段 |
修改指定教师个人信息 |
|
a_AddTeacher |
全字段 |
添加教师 |
|
a_DeleteTeacher |
p_teacher_id |
删除教师 |
|
a_AddClassroom |
classroom_id, name, building, capacity |
添加教室 |
|
a_DeleteClassroom |
classroom_id |
删除教室 |
|
a_AddTextbook |
textbook_id, name, author, publisher |
添加教材 |
|
a_DeleteTextbook |
textbook_id |
删除教材 |
|
a_UpdateMajor |
major_id, major_name, college_name |
修改专业名及所属学院 |
|
a_AddMajor |
major_id, major_name, college_name |
添加专业 |
|
a_DeleteMajor |
major_id |
删除专业 |
|
a_UpdateGrade |
student_id, course_id, new_grade |
根据课程号和学号修改课程成绩 |
|
a_UpdateCourse |
全字段 |
修改课程信息 |
|
a_AddCourse |
全字段 |
添加课程 |
|
a_DeleteCourse |
course_id |
删除课程 |
教师功能存储过程
|
存储过程 |
输入参数 |
功能说明 |
|
t_GetInfo |
p_username |
查询指定教师个人基本信息 |
|
t_GetCourse |
p_username |
查询指定教师所授课程信息 |
|
t_UpdateInfo |
p_username, p_gender, p_birth_date |
修改指定教师基本信息 |
|
t_GetGrade |
p_username |
查询指定教师所授课程的学生成绩 |
|
t_UpdateGrade |
p_teacher_username, p_student_id, p_course_id, p_new_grade |
指定教师评定/修改所授课程学生成绩 |
|
t_UpdatePassword |
p_username p_new_password |
修改教师账号的密码 |
学生功能存储过程
|
存储过程 |
输入参数 |
功能说明 |
|
s_GetInfo |
p_username |
查询指定学生个人基本信息 |
|
s_GetCourse |
p_username |
查询指定学生选课及成绩信息 |
|
s_UpdateInfo |
p_username, p_gender, p_birth_date |
修改指定学生基本信息 |
|
s_GetStatus |
p_student_id |
查询课程信息及选课状态 |
|
s_UpdateCourse |
p_student_id, p_course_id, p_enroll_status |
修改选课状态(选课/退课) |
|
s_UpdatePassword |
p_username p_new_password |
修改学生账号的密码 |
这种设计不仅优化了业务逻辑的组织形式,还能确保系统在数据访问时的一致性与安全性,进一步提升了后端逻辑的可维护性与可扩展性。各类用户对应的功能如成绩管理、课程安排、用户权限控制、信息查询与更新等,均通过数据库存储过程进行标准化封装,极大地提升了系统响应效率与功能复用能力。
除了上述基本的数据库功能设计之外,对于如报表打印等涉及用户交互与视觉呈现的扩展性功能,我们选择将其直接集成进UI设计中,与交互逻辑一并实现。这类功能更侧重于前端展示与操作体验,因此在设计时充分考虑了界面友好性与用户使用流程的顺畅性。
通过将关键业务功能以存储过程方式进行预封装,并按照模块化、分批次的策略逐步实现,不仅提升了系统功能的实现效率,也显著降低了前端开发过程中的重复编码和前后端联调成本。该策略有力支持了前端界面与数据库功能模块的高效对接,为整个系统的开发迭代提供了灵活、稳定的技术支撑。
2.2.2 UI交互逻辑设计
本系统基于多角色权限划分,提供学生端、教师端和管理员端三大类用户交互逻辑。各角色功能逻辑按业务功能模块独立设计,保证后续设计的UI交互界面能响应清晰,操作流程简洁,遵循数据驱动、状态更新及时、编辑权限限定的交互逻辑。具体设计如下:
(1)登录界面
用户选择角色身份,输入账号和密码,点击登录按钮进行身份验证。
验证通过后跳转至对应主界面,验证失败时弹出错误提示信息。
(2)学生端交互逻辑
- 主界面展示学生个人基本信息与选修课程列表;
课程成绩字段为空表示未评定,一经评定系统自动计算并显示等级。
- 修改个人信息时,仅开放性别和出生日期两个字段;
点击“修改信息”按钮后提交并保存更新。
- 修改密码操作通过点击“修改密码”按钮,在弹出窗口中输入新密码并确认。
- 选课/退课操作通过选课界面实现,仅“是否选课”字段可修改,其他字段为只读;用户修改选状态后,点击“保存”按钮生效。
- 查询课程信息支持课程号全匹配和课程名模糊匹配;
用户点击“查询”按钮可进行表格记录查询。
- 可点击“导出PDF”按钮,将当前学生全部成绩记录生成PDF文档并保存。
- 所有子界面均设有“返回”按钮,便于导航切换。
(3)教师端交互逻辑
- 主界面展示教师个人基本信息和授课课程列表;
- 信息修改逻辑与学生端一致,仅开放性别与出生日期字段编辑;
修改后,点击“修改信息”后提交并保存更新。
- 密码修改同样通过点击“修改密码”按钮,在弹出窗口中输入新密码并确认。
- 成绩评定界面中,仅成绩字段可修改,修改后系统自动更新并显示等级,无需手动填写。
- 成绩查询配合查询匹配字段输入和点击“查询”按钮可进行表格记录查询。
支持以下逻辑:
-
- 仅输入学号:定位该学生的第一条成绩记录,若存在多条,系统提示用户需输入课程号进一步定位,并可通过多次点击“查询”定位下一条;
- 仅输入课程号:定位到该课程所有成绩记录中的第一条;
- 同时输入学号与课程号:精确定位成绩记录。
- 以课程号查询为间接接口,点击“打印课程成绩报表”对该课程生成课程报表PDF文档并保存。
- 所有子界面均设有“返回”按钮,便于导航切换。
(4)管理员端交互逻辑
- 主界面包括各信息管理子系统入口、视图选择器及“刷新”按钮;操作后需点击刷新以更新界面显示内容。
- 通用交互逻辑包括:
- 定位查询功能,按编号(全匹配)或名称(模糊匹配)搜索;
- 增加记录时,点击“新增”后系统自动插入空行,用户填写后点击“确认修改”完成添加;
- 修改信息时,仅可编辑指定字段,其他字段为只读;点击“确认修改”提交;
- 删除操作通过选中记录点击“删除”按钮完成,系统弹出确认提示,点击“是”后删除数据;
- 成绩管理系统补充逻辑:
- 输入学号但无课程号时,系统提醒需提供课程号以精确定位;
- 仅成绩字段可修改,修改后等级字段自动更新,无需额外操作;
- 点击“查询”可循环定位至该学生或该教师课程成绩的下一条记录。
2.2.3 UI界面设计
根据上述 UI 交互逻辑设计,我们将各类操作流程封装为一系列功能明确、结构统一的交互界面,便于用户高效完成系统操作任务。整个 UI 系统采用统一的模块化与表格化布局,交互按钮与控件风格保持一致,强调信息密度适中、操作入口清晰的设计理念。各类界面结构设计如下:
(1)登录界面
- 界面元素包括:角色选择、账号输入框、密码输入框及登录、退出按钮。
- 当用户身份验证失败时,系统通过弹窗提示具体错误原因。
(2)学生主界面
- 左方区域显示学生个人信息,右方展示课程选修与成绩表格;
- 所有操作提示信息均以弹窗形式展示;
- 按钮区域包括:<修改信息>、<修改密码>、<导出PDF>、<退出>功能按钮和<选课>操作界面入口。
(3)学生选课/退课子界面
- 课程信息以表格形式呈现,仅可编辑“是否选课”字段,选项为“是”或“否”;
- 提供课程号(全匹配)和课程名(模糊匹配)查询功能;
- 所有操作提示信息均以弹窗形式展示;
- 按钮区域包括:<查询>、<保存>、<退出>功能按钮和<返回>的返回主界面入口按钮。
(4)教师主界面
- 左方区域显示教师个人信息,右方展示授课课程表格;
- 所有操作提示信息均以弹窗形式展示;
- 按钮区域包括:<修改信息>、<修改密码>、 <退出>功能按钮和<成绩评定>操作界面入口。
(5)教师成绩评定子界面
- 成绩记录以表格形式呈现,仅成绩字段可编辑,修改后自动更新等级字段。
- 提供查询区(学号与课程号),查询结果支持多条记录顺序切换;
- 所有操作提示信息均以弹窗形式展示;
- 按钮区域包括:<查询>、<保存>、<退出>、<打印课程成绩报表>功能按钮和<返回>的返回主界面入口按钮。
(6)管理员主界面
- 以面板按钮集形式展示子系统入口(如学院、教室、教材、教师、学生、课程、成绩管理系统);
- 顶部提供视图选择;
- 支持页面刷新操作的<刷新>按钮。
(7)信息管理子界面通用结构
- 数据表格区:展示所有信息记录,支持新增、修改与删除操作,各子系统根据权限规则设定字段是否可编辑;
- 查询字段输入区:包含查询匹配字段文本输入框(如编号或名称),用于快速定位目标记录;
- 操作按钮区:所有子界面均包括<查询>、<确认修改(添加)>、<退出>功能按钮,除成绩管理系统子界面外,其余界面还均包含:<添加>、<删除>用于增删记录的功能按钮,所有关键操作效果均通过弹窗提示信息反馈给用户。
本教务信息管理系统在界面设计方面坚持统一规范、清晰分区、模块组合、用户友好的原则。系统整体采用模块化结构与表格化布局相结合的方式,配合一致的交互样式与操作入口,使不同用户角色在使用过程中获得一致、连贯的操作体验。
具体设计特点总结如下:
- 界面风格统一:各角色界面风格保持一致,布局采用左侧信息区 + 右侧操作区的结构,辅以顶部导航或底部操作按钮区,确保系统整体美观、协调。
- 信息密度适中:各模块根据功能复杂度合理安排信息展示与操作控件,避免信息过载,提升数据可读性与用户理解效率。
- 交互逻辑清晰:所有关键操作(如增删改查、选课、成绩录入)均提供明确入口与交互反馈,重要变更操作均通过弹窗提示以增强操作确认感。
- 角色分工明确:针对学生、教师、管理员三类角色分别设定不同主界面与子模块,界面元素与权限控制紧密结合用户职能,体现角色导向的设计思想。
- 操作可控可回溯:所有界面均配置“退出”与“返回”等控件,确保用户可灵活切换视图或撤回操作,提升系统可用性。
- 结构可扩展:各功能子模块均采用通用的三段式布局(查询区、表格区、操作区),便于后续功能拓展与系统维护。
综上所述,本系统的界面设计在确保功能完备性的基础上,注重交互体验和系统一致性,能够有效支撑多角色、多场景下的教务信息管理需求,为用户提供直观、高效、可靠的操作平台。
三、系统实现
3.1 数据库实现
3.1.1 数据库主要表的实现
1.学院表
-- College Table
CREATE TABLE College (
college_id VARCHAR(10) PRIMARY KEY,
college_name VARCHAR(20)
);
2.专业表
-- Major Table
CREATE TABLE Major (
major_id VARCHAR(10) PRIMARY KEY,
major_name VARCHAR(20),
college_id VARCHAR(10),
FOREIGN KEY (college_id) REFERENCES College(college_id)
ON DELETE CASCADE
);
3.教室表
-- Classroom Table
CREATE TABLE Classroom (
classroom_id VARCHAR(10) PRIMARY KEY,
classroom_name VARCHAR(10),
building VARCHAR(5),
capacity INT CHECK (capacity > 0 AND capacity < 200)
);
4.教材表
-- Textbook Table
CREATE TABLE Textbook (
textbook_id VARCHAR(10) PRIMARY KEY,
textbook_name VARCHAR(20),
author VARCHAR(20),
publisher VARCHAR(20)
);
5.教师表
-- Teacher Table
CREATE TABLE Teacher (
teacher_id VARCHAR(10) PRIMARY KEY,
name VARCHAR(10),
gender CHAR(1) CHECK (gender IN ('M', 'F')),
birth_date DATE,
college_id VARCHAR(10),
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(100) NOT NULL,
FOREIGN KEY (college_id) REFERENCES College(college_id)
ON DELETE SET NULL
);
6.学生表
-- Student Table
CREATE TABLE Student (
student_id VARCHAR(10) PRIMARY KEY,
name VARCHAR(10),
gender CHAR(1) CHECK (gender IN ('M', 'F')),
birth_date DATE,
major_id VARCHAR(10),
grade INT CHECK (grade BETWEEN 1 AND 4),
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(100) NOT NULL,
FOREIGN KEY (major_id) REFERENCES Major(major_id)
ON DELETE SET NULL
);
7.课程表
-- Course Table
CREATE TABLE Course (
course_id VARCHAR(10) PRIMARY KEY,
course_name VARCHAR(20),
hours INT,
credits DECIMAL(2,1) CHECK (credits > 0),
classroom_id VARCHAR(10),
teacher_id VARCHAR(10),
textbook_id VARCHAR(10),
FOREIGN KEY (classroom_id) REFERENCES Classroom(classroom_id)
ON DELETE SET NULL,
FOREIGN KEY (teacher_id) REFERENCES Teacher(teacher_id)
ON DELETE SET NULL,
FOREIGN KEY (textbook_id) REFERENCES Textbook(textbook_id)
ON DELETE SET NULL
);
8.成绩表
-- Grade Table
CREATE TABLE Grade(
student_id VARCHAR(10),
course_id VARCHAR(10),
grade INT CHECK (grade BETWEEN 0 AND 100),
PRIMARY KEY (student_id, course_id),
FOREIGN KEY (student_id) REFERENCES Student(student_id)
ON DELETE CASCADE,
FOREIGN KEY (course_id) REFERENCES Course(course_id)
ON DELETE CASCADE
);
3.1.2 视图实现
1.学生综合信息视图
-- 1、学生综合信息视图
CREATE VIEW vw_Student_AllInfo AS
SELECT
s.student_id,
s.name AS student_name,
s.gender,
s.birth_date,
s.major_id,
m.major_name,
c.college_id,
c.college_name,
s.grade,
s.username,
s.password
FROM
Student s
LEFT JOIN
Major m ON s.major_id = m.major_id
LEFT JOIN
College c ON m.college_id = c.college_id;
2.教师综合信息视图
-- 2、教师综合信息视图
CREATE VIEW vw_Teacher_AllInfo AS
SELECT
t.teacher_id,
t.name AS teacher_name,
t.gender,
t.birth_date,
t.college_id,
c.college_name,
t.username,
t.password
FROM
Teacher t
LEFT JOIN
College c ON t.college_id = c.college_id;
3.课程详细信息视图
-- 3、课程详细信息视图
CREATE VIEW vw_Course_AllInfo AS
SELECT
co.course_id,
co.course_name,
co.hours,
co.credits,
co.classroom_id,
cl.classroom_name,
cl.building AS classroom_building,
cl.capacity,
co.teacher_id,
t.name AS teacher_name,
co.textbook_id,
tb.textbook_name,
tb.author,
tb.publisher
FROM
Course co
LEFT JOIN
Classroom cl ON co.classroom_id = cl.classroom_id
LEFT JOIN
Teacher t ON co.teacher_id = t.teacher_id
LEFT JOIN
Textbook tb ON co.textbook_id = tb.textbook_id;
4.学生成绩综合视图
-- 4、学生成绩综合视图
CREATE VIEW vw_Grade_AllInfo AS
SELECT
g.course_id,
c.course_name,
t.teacher_id,
t.name AS teacher_name,
g.student_id,
s.name AS student_name,
g.grade,
CASE
WHEN g.grade IS NULL THEN NULL
WHEN g.grade >= 90 THEN 'A'
WHEN g.grade >= 80 THEN 'B'
WHEN g.grade >= 70 THEN 'C'
WHEN g.grade >= 60 THEN 'D'
ELSE 'F'
END AS grade_level
FROM
Grade g
JOIN
Student s ON g.student_id = s.student_id
JOIN
Course c ON g.course_id = c.course_id
LEFT JOIN
Teacher t ON c.teacher_id = t.teacher_id;
5.教室使用情况视图
-- 5、教室使用情况视图
CREATE VIEW vw_Classroom_AllInfo AS
SELECT
cl.classroom_id,
cl.classroom_name,
cl.building,
cl.capacity,
GROUP_CONCAT(co.course_name) AS scheduled_courses
FROM
Classroom cl
LEFT JOIN
Course co ON cl.classroom_id = co.classroom_id
GROUP BY
cl.classroom_id, cl.classroom_name, cl.building, cl.capacity;
6.教材使用情况视图
-- 6、教材使用情况视图
CREATE VIEW vw_Textbook_AllInfo AS
SELECT
t.textbook_id,
t.textbook_name,
t.author,
t.publisher,
GROUP_CONCAT(c.course_name) AS used_in_courses,
GROUP_CONCAT(DISTINCT ct.college_name) AS used_in_colleges
FROM
Textbook t
LEFT JOIN
Course c ON t.textbook_id = c.textbook_id
LEFT JOIN
Teacher te ON c.teacher_id = te.teacher_id
LEFT JOIN
College ct ON te.college_id = ct.college_id
GROUP BY
t.textbook_id, t.textbook_name, t.author, t.publisher;
7.学院专业安排情况视图
-- 7、学院专业安排情况视图
CREATE VIEW vw_School_AllInfo AS
SELECT
c.college_id,
c.college_name,
(
SELECT COUNT(*)
FROM Teacher t
WHERE t.college_id = c.college_id
) AS teacher_count,
m.major_id,
m.major_name,
COUNT(DISTINCT s.student_id) AS student_count
FROM
College c
LEFT JOIN
Major m ON c.college_id = m.college_id
LEFT JOIN
Student s ON m.major_id = s.major_id
GROUP BY
c.college_id, c.college_name, m.major_id, m.major_name;
3.1.3 存储过程实现
1.教师相关存储过程
1. t_GetInfo
-- 1、查询指定教师个人基本信息
DELIMITER //
CREATE PROCEDURE t_GetInfo(IN p_username VARCHAR(50))
BEGIN
SELECT
t.teacher_id,
t.name AS teacher_name,
t.gender,
t.birth_date,
c.college_name
FROM
Teacher t
LEFT JOIN
College c ON t.college_id = c.college_id
WHERE
t.username = p_username;
END //
DELIMITER ;
功能: 查询指定教师个人基本信息
数据流:
- 输入: 教师用户名(p_username)
- 处理: 从Teacher表获取教师信息,并关联College表获取学院名称
- 输出: 教师ID、姓名、性别、出生日期和所属学院名称
2. t_GetCourse
-- 2、查询指定教师所授课程信息
DELIMITER //
CREATE PROCEDURE t_GetCourse(IN p_username VARCHAR(50))
BEGIN
SELECT
co.course_id,
co.course_name,
co.credits,
cl.classroom_name,
cl.building,
tb.textbook_name
FROM
Teacher t
JOIN
Course co ON t.teacher_id = co.teacher_id
LEFT JOIN
Classroom cl ON co.classroom_id = cl.classroom_id
LEFT JOIN
Textbook tb ON co.textbook_id = tb.textbook_id
WHERE
t.username = p_username;
END //
DELIMITER ;
功能: 查询指定教师所授课程信息
数据流:
- 输入: 教师用户名(p_username)
- 处理: 通过Teacher表找到教师,关联Course表获取课程,再关联Classroom和Textbook表
- 输出: 课程ID、名称、学分、教室名称、建筑和教材名称
3. t_UpdateInfo
-- 3、修改指定教师基本信息
DELIMITER //
CREATE PROCEDURE t_UpdateInfo(
IN p_username VARCHAR(50),
IN p_gender CHAR(1),
IN p_birth_date DATE
)
BEGIN
-- 仅保留性别输入验证
IF p_gender NOT IN ('M', 'F') THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '性别必须为M或F';
END IF;
UPDATE Teacher
SET
gender = p_gender,
birth_date = p_birth_date
WHERE
username = p_username;
END //
DELIMITER ;
功能: 修改指定教师基本信息
数据流:
- 输入: 教师用户名(p_username)、性别(p_gender)、出生日期(p_birth_date)
- 处理: 验证性别有效性,更新Teacher表中对应记录
- 输出: 无直接输出,修改Teacher表数据
4. t_GetGrade
-- 4、查询指定教师所授课程的学生成绩
DELIMITER //
CREATE PROCEDURE t_GetGrade(IN p_username VARCHAR(50))
BEGIN
SELECT
co.course_id,
co.course_name,
s.student_id,
s.name AS student_name,
m.major_name,
g.grade,
CASE
WHEN g.grade IS NULL THEN NULL
WHEN g.grade >= 90 THEN 'A'
WHEN g.grade >= 80 THEN 'B'
WHEN g.grade >= 70 THEN 'C'
WHEN g.grade >= 60 THEN 'D'
ELSE 'F'
END AS grade_level
FROM
Teacher t
JOIN
Course co ON t.teacher_id = co.teacher_id
JOIN
Grade g ON co.course_id = g.course_id
JOIN
Student s ON g.student_id = s.student_id
LEFT JOIN
Major m ON s.major_id = m.major_id
WHERE
t.username = p_username
ORDER BY
co.course_id, g.grade DESC;
END //
DELIMITER ;
功能: 查询指定教师所授课程的学生成绩
数据流:
- 输入: 教师用户名(p_username)
- 处理: 通过Teacher→Course→Grade→Student→Major链式关联查询
- 输出: 课程ID、名称、学生ID、姓名、专业、成绩和等级(A-F)
5. t_UpdateGrade
-- 5、指定教师评定/修改所授课程学生成绩
DELIMITER //
CREATE PROCEDURE t_UpdateGrade(
IN p_teacher_username VARCHAR(50),
IN p_student_id VARCHAR(10),
IN p_course_id VARCHAR(10),
IN p_new_grade INT
)
BEGIN
DECLARE v_teacher_id VARCHAR(10);
DECLARE v_is_teaching INT;
-- 获取教师ID
SELECT teacher_id INTO v_teacher_id
FROM Teacher
WHERE username = p_teacher_username;
IF v_teacher_id IS NULL THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '教师用户名不存在';
END IF;
-- 检查是否是该教师授课
SELECT COUNT(*) INTO v_is_teaching
FROM Course
WHERE course_id = p_course_id AND teacher_id = v_teacher_id;
IF v_is_teaching = 0 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '您无权修改此课程的成绩';
END IF;
-- 判断学生是否选修了该课程(不管成绩是不是NULL)
IF NOT EXISTS (
SELECT 1 FROM Grade
WHERE student_id = p_student_id AND course_id = p_course_id
) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '该学生未选修此课程';
END IF;
-- 检查成绩合法性
IF p_new_grade < 0 OR p_new_grade > 100 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '成绩必须在0-100之间';
END IF;
-- 更新成绩
UPDATE Grade
SET grade = p_new_grade
WHERE student_id = p_student_id AND course_id = p_course_id;
END //
DELIMITER ;
功能: 评定/修改所授课程学生成绩
数据流:
- 输入: 教师用户名、学生ID、课程ID、新成绩
- 处理: 验证教师权限、学生选课情况和成绩有效性
- 输出: 无直接输出,更新Grade表中的成绩
2.学生相关存储过程
6. s_GetInfo
-- 6、查询指定学生个人基本信息
DELIMITER //
CREATE PROCEDURE s_GetInfo(IN p_username VARCHAR(50))
BEGIN
SELECT
s.student_id,
s.name AS student_name,
s.gender,
s.birth_date,
m.major_name,
c.college_name
FROM
Student s
LEFT JOIN
Major m ON s.major_id = m.major_id
LEFT JOIN
College c ON m.college_id = c.college_id
WHERE
s.username = p_username;
END //
DELIMITER ;
功能: 查询指定学生个人基本信息
数据流:
- 输入: 学生用户名(p_username)
- 处理: 从Student表获取信息,关联Major和College表
- 输出: 学生ID、姓名、性别、出生日期、专业和学院名称
7. s_GetCourse
-- 7、查询指定学生选课及成绩信息
DELIMITER //
CREATE PROCEDURE s_GetCourse(IN p_username VARCHAR(50))
BEGIN
-- 查询学生选课信息及成绩等级
SELECT
co.course_id,
co.course_name,
co.credits,
t.name AS teacher_name,
cl.classroom_name AS classroom_number,
cl.building AS building_name,
tb.textbook_name,
g.grade,
-- 成绩等级(A/B/C/D/F)
CASE
WHEN g.grade IS NULL THEN NULL
WHEN g.grade >= 90 THEN 'A'
WHEN g.grade >= 80 THEN 'B'
WHEN g.grade >= 70 THEN 'C'
WHEN g.grade >= 60 THEN 'D'
ELSE 'F'
END AS grade_level
FROM
Student s
LEFT JOIN
Grade g ON s.student_id = g.student_id
LEFT JOIN
Course co ON g.course_id = co.course_id
LEFT JOIN
Teacher t ON co.teacher_id = t.teacher_id
LEFT JOIN
Classroom cl ON co.classroom_id = cl.classroom_id
LEFT JOIN
Textbook tb ON co.textbook_id = tb.textbook_id
WHERE
s.username = p_username
ORDER BY
co.course_id;
END //
DELIMITER ;
功能: 查询指定学生选课及成绩信息
数据流:
- 输入: 学生用户名(p_username)
- 处理: 通过Student→Grade→Course→Teacher→Classroom→Textbook链式关联
- 输出: 课程ID、名称、学分、教师、教室、教材、成绩和等级
8. s_UpdateInfo
-- 8、修改指定学生基本信息
DELIMITER //
CREATE PROCEDURE s_UpdateInfo(
IN p_username VARCHAR(50),
IN p_gender CHAR(1),
IN p_birth_date DATE
)
BEGIN
-- 验证性别输入有效性
IF p_gender NOT IN ('M', 'F') THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '性别必须为M(男)或F(女)';
END IF;
-- 执行更新操作
UPDATE Student
SET
gender = p_gender,
birth_date = p_birth_date
WHERE
username = p_username;
END //
DELIMITER ;
功能: 修改指定学生基本信息
数据流:
- 输入: 学生用户名、性别、出生日期
- 处理: 验证性别有效性,更新Student表
- 输出: 无直接输出,修改Student表数据
9. s_GetStatus
-- 9、查询课程信息及选课状态
DELIMITER //
CREATE PROCEDURE s_GetStatus(IN p_student_id VARCHAR(10))
BEGIN
SELECT
c.course_id,
c.course_name,
t.name AS teacher_name,
CASE
WHEN EXISTS (
SELECT 1 FROM Grade g
WHERE g.course_id = c.course_id
AND g.student_id = p_student_id
) THEN '是'
ELSE '否'
END AS is_enrolled
FROM
Course c
LEFT JOIN
Teacher t ON c.teacher_id = t.teacher_id
ORDER BY
c.course_id;
END //
DELIMITER ;
功能: 查询课程信息及选课状态
数据流:
- 输入: 学生ID
- 处理: 查询所有课程并检查Grade表判断是否已选
- 输出: 课程ID、名称、教师和选课状态(是/否)
10. s_UpdateCourse
-- 10、修改选课状态(选课/退课)
DELIMITER //
CREATE PROCEDURE s_UpdateCourse(
IN p_student_id VARCHAR(10),
IN p_course_id VARCHAR(10),
IN p_enroll_status CHAR(1) -- 'Y'表示选课,'N'表示退课
)
BEGIN
-- 声明变量必须放在最前
DECLARE has_record INT DEFAULT 0;
-- 验证学生是否存在
IF NOT EXISTS (
SELECT 1 FROM Student WHERE student_id = p_student_id
) THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '学生不存在';
END IF;
-- 验证课程是否存在
IF NOT EXISTS (
SELECT 1 FROM Course WHERE course_id = p_course_id
) THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '课程不存在';
END IF;
-- 验证选课状态参数
IF p_enroll_status NOT IN ('Y', 'N') THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '状态参数必须为Y(选课)或N(退课)';
END IF;
-- 检查当前是否已经选课
SELECT COUNT(*) INTO has_record
FROM Grade
WHERE student_id = p_student_id AND course_id = p_course_id;
-- 根据状态判断是否需要操作
IF p_enroll_status = 'Y' AND has_record = 0 THEN
-- 需要选课且尚未选课
INSERT INTO Grade (student_id, course_id, grade)
VALUES (p_student_id, p_course_id, NULL);
ELSEIF p_enroll_status = 'N' AND has_record = 1 THEN
-- 需要退课且已选课
DELETE FROM Grade
WHERE student_id = p_student_id AND course_id = p_course_id;
END IF;
-- 其他情况,不操作
END //
DELIMITER ;
功能: 修改选课状态(选课/退课)
数据流:
- 输入: 学生ID、课程ID、选课状态(Y/N)
- 处理: 验证参数有效性,在Grade表中添加或删除记录
- 输出: 无直接输出,修改Grade表数据
3.管理员相关存储过程
11. a_UpdateStudentInfo
-- 11、修改指定学生个人信息
DELIMITER //
CREATE PROCEDURE a_UpdateStudentInfo (
IN p_student_id VARCHAR(10),
IN p_name VARCHAR(10),
IN p_gender CHAR(1), -- 限定为 'M' 或 'F'
IN p_birth_date DATE,
IN p_major_name VARCHAR(20),
IN p_grade INT, -- 1~4 之间
IN p_username VARCHAR(50),
IN p_password VARCHAR(100)
)
BEGIN
DECLARE v_major_id VARCHAR(10);
-- 获取对应的专业ID
SELECT major_id INTO v_major_id
FROM Major
WHERE major_name = p_major_name
LIMIT 1;
-- 如果找不到专业,抛出错误
IF v_major_id IS NULL THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '错误:未找到该专业名称对应的 major_id。';
END IF;
-- 校验性别是否合法(数据库已有 CHECK,此处可做逻辑校验增强)
IF p_gender NOT IN ('M', 'F') THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '错误:性别参数必须为 ''M'' 或 ''F''。';
END IF;
-- 校验年级合法性(数据库已CHECK,此处亦可防御)
IF p_grade < 1 OR p_grade > 4 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '错误:年级应在 1 到 4 之间。';
END IF;
-- 更新学生信息
UPDATE Student
SET
name = p_name,
gender = p_gender,
birth_date = p_birth_date,
major_id = v_major_id,
grade = p_grade,
username = p_username,
password = p_password
WHERE
student_id = p_student_id;
END
//
DELIMITER ;
功能: 修改指定学生个人信息
数据流:
- 输入: 学生ID、姓名、性别、出生日期、专业名、年级、用户名、密码
- 处理: 通过专业名查找major_id,验证参数,更新Student表
- 输出: 无直接输出,修改Student表数据
12. a_AddStudent
-- 12、添加学生
DELIMITER //
CREATE PROCEDURE a_AddStudent (
IN p_student_id VARCHAR(10),
IN p_name VARCHAR(10),
IN p_gender CHAR(1),
IN p_birth_date DATE,
IN p_major_name VARCHAR(20),
IN p_grade INT,
IN p_username VARCHAR(50),
IN p_password VARCHAR(100)
)
BEGIN
DECLARE v_major_id VARCHAR(10);
-- 查找专业名对应的 major_id
SELECT major_id INTO v_major_id
FROM Major
WHERE major_name = p_major_name
LIMIT 1;
-- 插入学生信息
INSERT INTO Student (
student_id, name, gender, birth_date, major_id, grade, username, password
)
VALUES (
p_student_id, p_name, p_gender, p_birth_date, v_major_id, p_grade, p_username, p_password
);
END
//
DELIMITER ;
功能: 添加学生
数据流:
- 输入: 学生ID、姓名、性别、出生日期、专业名、年级、用户名、密码
- 处理: 通过专业名查找major_id,插入Student表
- 输出: 无直接输出,向Student表添加记录
13. a_DeleteStudent
-- 13、删除学生
DELIMITER //
CREATE PROCEDURE a_DeleteStudent (
IN p_student_id VARCHAR(10)
)
BEGIN
-- 删除学生成绩信息(虽然 ON DELETE CASCADE 会自动处理,但这里显式写出)
DELETE FROM Grade
WHERE student_id = p_student_id;
-- 删除学生基本信息
DELETE FROM Student
WHERE student_id = p_student_id;
END
//
DELIMITER ;
功能: 删除学生
数据流:
- 输入: 学生ID
- 处理: 先删除Grade表中相关成绩,再删除Student表记录
- 输出: 无直接输出,删除Grade和Student表记录
14. a_UpdateTeacherInfo
-- 14、修改指定教师个人信息
DELIMITER //
CREATE PROCEDURE a_UpdateTeacherInfo (
IN p_teacher_id VARCHAR(10),
IN p_name VARCHAR(10),
IN p_gender CHAR(1),
IN p_birth_date DATE,
IN p_college_name VARCHAR(20),
IN p_username VARCHAR(50),
IN p_password VARCHAR(100)
)
BEGIN
DECLARE v_college_id VARCHAR(10);
-- 查询学院名对应的 college_id
SELECT college_id INTO v_college_id
FROM College
WHERE college_name = p_college_name
LIMIT 1;
-- 若未找到学院,终止更新
IF v_college_id IS NULL THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '学院名称不存在,请先添加该学院';
END IF;
-- 校验性别是否合法(数据库已有 CHECK,此处可做逻辑校验增强)
IF p_gender NOT IN ('M', 'F') THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '错误:性别参数必须为 ''M'' 或 ''F''。';
END IF;
-- 更新教师信息
UPDATE Teacher
SET
name = p_name,
gender = p_gender,
birth_date = p_birth_date,
college_id = v_college_id,
username = p_username,
password = p_password
WHERE teacher_id = p_teacher_id;
END
//
DELIMITER ;
功能: 修改指定教师个人信息
数据流:
- 输入: 教师ID、姓名、性别、出生日期、学院名、用户名、密码
- 处理: 通过学院名查找college_id,验证参数,更新Teacher表
- 输出: 无直接输出,修改Teacher表数据
15. a_AddTeacher
-- 15、添加教师
DELIMITER //
CREATE PROCEDURE a_AddTeacher (
IN p_teacher_id VARCHAR(10),
IN p_name VARCHAR(10),
IN p_gender CHAR(1),
IN p_birth_date DATE,
IN p_college_name VARCHAR(20),
IN p_username VARCHAR(50),
IN p_password VARCHAR(100)
)
BEGIN
DECLARE v_college_id VARCHAR(10);
-- 获取对应学院 ID
SELECT college_id INTO v_college_id
FROM College
WHERE college_name = p_college_name
LIMIT 1;
-- 如果学院不存在,抛出异常
IF v_college_id IS NULL THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '学院名称不存在,请先添加该学院';
END IF;
-- 插入教师记录
INSERT INTO Teacher (
teacher_id, name, gender, birth_date,
college_id, username, password
)
VALUES (
p_teacher_id, p_name, p_gender, p_birth_date,
v_college_id, p_username, p_password
);
END
//
DELIMITER ;
功能: 添加教师
数据流:
- 输入: 教师ID、姓名、性别、出生日期、学院名、用户名、密码
- 处理: 通过学院名查找college_id,插入Teacher表
- 输出: 无直接输出,向Teacher表添加记录
16. a_DeleteTeacher
-- 16、删除教师
DELIMITER //
CREATE PROCEDURE a_DeleteTeacher (
IN p_teacher_id VARCHAR(10)
)
BEGIN
-- 删除教师记录
DELETE FROM Teacher
WHERE teacher_id = p_teacher_id;
END
//
DELIMITER ;
功能: 删除教师
数据流:
- 输入: 教师ID
- 处理: 删除Teacher表记录(级联处理相关Course表)
- 输出: 无直接输出,删除Teacher表记录
17. a_AddClassroom
-- 17、添加教室
DELIMITER //
CREATE PROCEDURE a_AddClassroom (
IN p_classroom_id VARCHAR(10),
IN p_classroom_name VARCHAR(10),
IN p_building VARCHAR(5),
IN p_capacity INT
)
BEGIN
INSERT INTO Classroom (classroom_id, classroom_name, building, capacity)
VALUES (p_classroom_id, p_classroom_name, p_building, p_capacity);
END
//
DELIMITER ;
功能: 添加教室
数据流:
- 输入: 教室ID、名称、建筑、容量
- 处理: 插入Classroom表
- 输出: 无直接输出,向Classroom表添加记录
18. a_DeleteClassroom
-- 18、删除教室
DELIMITER //
CREATE PROCEDURE a_DeleteClassroom (
IN p_classroom_id VARCHAR(10)
)
BEGIN
DELETE FROM Classroom WHERE classroom_id = p_classroom_id;
END //
DELIMITER ;
功能: 删除教室
数据流:
- 输入: 教室ID
- 处理: 删除Classroom表记录
- 输出: 无直接输出,删除Classroom表记录
19. a_AddTextbook
-- 19、添加教材
DELIMITER //
CREATE PROCEDURE a_AddTextbook (
IN p_textbook_id VARCHAR(10),
IN p_textbook_name VARCHAR(20),
IN p_author VARCHAR(20),
IN p_publisher VARCHAR(20)
)
BEGIN
INSERT INTO Textbook (textbook_id, textbook_name, author, publisher)
VALUES (p_textbook_id, p_textbook_name, p_author, p_publisher);
END
//
DELIMITER ;
功能: 添加教材
数据流:
- 输入: 教材ID、名称、作者、出版社
- 处理: 插入Textbook表
- 输出: 无直接输出,向Textbook表添加记录
20. a_DeleteTextbook
-- 20、删除教材
DELIMITER //
CREATE PROCEDURE a_DeleteTextbook (
IN p_textbook_id VARCHAR(10)
)
BEGIN
DELETE FROM Textbook WHERE textbook_id = p_textbook_id;
END
//
DELIMITER ;
功能: 删除教材
数据流:
- 输入: 教材ID
- 处理: 删除Textbook表记录
- 输出: 无直接输出,删除Textbook表记录
21. a_UpdateMajor
-- 21、修改专业名及所属学院
DELIMITER //
CREATE PROCEDURE a_UpdateMajor(
IN p_major_id VARCHAR(10),
IN p_major_name VARCHAR(20),
IN p_college_name VARCHAR(20)
)
BEGIN
DECLARE v_college_id VARCHAR(10);
SELECT college_id INTO v_college_id
FROM College
WHERE college_name = p_college_name
LIMIT 1;
UPDATE Major
SET major_name = p_major_name,
college_id = v_college_id
WHERE major_id = p_major_id;
END
//
DELIMITER ;
功能: 修改专业名及所属学院
数据流:
- 输入: 专业ID、新专业名、新学院名
- 处理: 通过学院名查找college_id,更新Major表
- 输出: 无直接输出,修改Major表数据
22. a_AddMajor
-- 22、添加专业
DELIMITER //
CREATE PROCEDURE a_AddMajor(
IN p_major_id VARCHAR(10),
IN p_major_name VARCHAR(20),
IN p_college_name VARCHAR(20)
)
BEGIN
DECLARE v_college_id VARCHAR(10);
SELECT college_id INTO v_college_id
FROM College
WHERE college_name = p_college_name
LIMIT 1;
INSERT INTO Major(major_id, major_name, college_id)
VALUES (p_major_id, p_major_name, v_college_id);
END
//
DELIMITER ;
功能: 添加专业
数据流:
- 输入: 专业ID、专业名、学院名
- 处理: 通过学院名查找college_id,插入Major表
- 输出: 无直接输出,向Major表添加记录
23. a_DeleteMajor
-- 23、删除专业
DELIMITER //
CREATE PROCEDURE a_DeleteMajor(
IN p_major_id VARCHAR(10)
)
BEGIN
DELETE FROM Major WHERE major_id = p_major_id;
END
//
DELIMITER ;
功能: 删除专业
数据流:
- 输入: 专业ID
- 处理: 删除Major表记录
- 输出: 无直接输出,删除Major表记录
24. a_UpdateGrade
-- 24、根据课程号和学号修改课程成绩
DELIMITER //
CREATE PROCEDURE a_UpdateGrade (
IN p_student_id VARCHAR(10),
IN p_course_id VARCHAR(10),
IN p_new_grade INT
)
BEGIN
-- 检查成绩是否在有效范围内
IF p_new_grade < 0 OR p_new_grade > 100 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '成绩必须在 0 到 100 之间';
END IF;
-- 判断学生是否选修了该课程
IF NOT EXISTS (
SELECT 1 FROM Grade
WHERE student_id = p_student_id AND course_id = p_course_id
) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '该学生未选修此课程';
END IF;
-- 更新成绩
UPDATE Grade
SET grade = p_new_grade
WHERE student_id = p_student_id AND course_id = p_course_id;
END
//
DELIMITER ;
功能: 根据课程号和学号修改课程成绩
数据流:
- 输入: 学生ID、课程ID、新成绩
- 处理: 验证成绩范围和选课情况,更新Grade表
- 输出: 无直接输出,修改Grade表数据
25. a_UpdateCourse
-- 25、修改课程信息
DELIMITER //
CREATE PROCEDURE a_UpdateCourse (
IN p_course_id VARCHAR(10),
IN p_course_name VARCHAR(20),
IN p_hours INT,
IN p_credits DECIMAL(2,1),
IN p_classroom_id VARCHAR(10),
IN p_teacher_id VARCHAR(10),
IN p_textbook_id VARCHAR(10)
)
BEGIN
-- 校验学分
IF p_credits <= 0 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '学分必须大于 0';
END IF;
-- 校验课程是否存在
IF NOT EXISTS (
SELECT 1 FROM Course WHERE course_id = p_course_id
) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '该课程编号不存在';
END IF;
-- 执行更新
UPDATE Course
SET
course_name = p_course_name,
hours = p_hours,
credits = p_credits,
classroom_id = p_classroom_id,
teacher_id = p_teacher_id,
textbook_id = p_textbook_id
WHERE
course_id = p_course_id;
END //
DELIMITER ;
功能: 修改课程信息
数据流:
- 输入: 课程ID、名称、学时、学分、教室ID、教师ID、教材ID
- 处理: 验证学分有效性,更新Course表
- 输出: 无直接输出,修改Course表数据
26. a_AddCourse
-- 26、添加课程
DELIMITER //
CREATE PROCEDURE a_AddCourse (
IN p_course_id VARCHAR(10),
IN p_course_name VARCHAR(20),
IN p_hours INT,
IN p_credits DECIMAL(2,1),
IN p_classroom_id VARCHAR(10),
IN p_teacher_id VARCHAR(10),
IN p_textbook_id VARCHAR(10)
)
BEGIN
-- 检查是否已存在相同课程号
IF EXISTS (
SELECT 1 FROM Course WHERE course_id = p_course_id
) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '课程编号已存在';
END IF;
-- 插入课程
INSERT INTO Course (
course_id, course_name, hours, credits,
classroom_id, teacher_id, textbook_id
)
VALUES (
p_course_id, p_course_name, p_hours, p_credits,
p_classroom_id, p_teacher_id, p_textbook_id
);
END //
DELIMITER ;
功能: 添加课程
数据流:
- 输入: 课程ID、名称、学时、学分、教室ID、教师ID、教材ID
- 处理: 检查课程ID是否已存在,插入Course表
- 输出: 无直接输出,向Course表添加记录
27. a_DeleteCourse
-- 27、删除课程
DELIMITER //
CREATE PROCEDURE a_DeleteCourse (
IN p_course_id VARCHAR(10)
)
BEGIN
-- 检查课程是否存在
IF NOT EXISTS (
SELECT 1 FROM Course WHERE course_id = p_course_id
) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '课程编号不存在';
END IF;
-- 删除课程(将自动级联删除Grade表中对应记录)
DELETE FROM Course WHERE course_id = p_course_id;
END
//
DELIMITER ;
功能: 删除课程
数据流:
- 输入: 课程ID
- 处理: 验证课程存在性,删除Course表记录(级联删除Grade表记录)
- 输出: 无直接输出,删除Course表记录
3.2 UI界面实现
本系统的用户界面层(UI)采用 Qt Creator 集成开发环境 配合 Visual Studio 编译工具链,使用 C++ 编程语言进行开发实现。基于 Qt 框架强大的跨平台图形界面支持能力,系统实现了图形化的交互界面、响应式的控件管理机制与多角色权限视图的动态切换功能。在界面设计过程中,充分遵循多角色分离、模块划分清晰与交互逻辑一致性的设计原则。围绕功能建模中定义的各类业务操作流程,系统通过统一风格、结构分区明确的图形化界面,实现了对学生、教师与管理员三类用户的功能支持。以下从界面呈现与交互实现两方面展开描述。
3.1.1 界面实现
在界面结构设计上,本系统采用模块化与表格化相结合的布局模式,不同角色主界面按功能区分为信息展示区与操作控制区,配合统一风格的控件与交互按钮,确保用户在不同操作场景下能够获得清晰、连贯的视觉与操作体验。各子界面遵循“信息展示 + 功能操作”双区划分策略.
具体实现的界面展示如下:

登录界面

学生主界面

学生选课/退课子界面

教师主界面

教师成绩评定子界面

管理员主界面

学院信息管理子界面

教室信息管理子界面

教材信息管理子界面

教师信息管理子界面

学生信息管理子界面

课程信息管理子界面

成绩管理子界面
3.1.2 交互功能实现
本系统各交互功能以用户角色为核心设计依据,围绕“信息查询、数据编辑、结果确认、交互反馈”四个基本流程,通过按钮触发、弹窗提示等机制构建完整的交互闭环。
实现了系统交互逻辑与业务权限紧密绑定,确保数据操作的规范性与用户操作的安全性。同时,为保障用户操作的即时性与准确性,系统广泛采用输入验证、动态更新与状态提示机制,以提升整体交互效率与体验质量。
详细功能展示见下文的业务流程测试和边界测试;
由于 UI 交互功能的具体实现代码较为繁复,篇幅较大,在此不逐一展开展示。为体现其整体设计结构,我们展示了基于 Qt 的 UI 交互功能模块的框架目录结构图,具体见下图:

更多推荐




所有评论(0)