一、系统分析

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展示了整个教务管理系统与外部实体之间的交互关系,定义了系统边界。

外部实体

  1. 管理员:负责系统维护、数据管理和权限控制

  2. 教师:进行授课安排、成绩录入和个人信息管理

  3. 学生:进行选课操作、成绩查询和个人信息维护

  4. 课程(被动实体):提供课程信息

  5. 教室(被动实体):提供教学场地资源

主要数据流

  • 管理员 ↔ 系统

    • 输入:账号信息、系统配置指令、数据维护请求

    • 输出:系统状态报告、操作结果反馈

  • 教师 ↔ 系统

    • 输入:授课计划、成绩数据、个人信息更新

    • 输出:课表信息、学生名单、教学提醒

  • 学生 ↔ 系统

    • 输入:选课申请、个人信息、查询请求

    • 输出:选课结果、成绩单、个人课

2.中层数据流图及说明

功能概述
中层DFD将系统分解为5个主要功能模块,展示模块间的数据交互。

主要处理模块

  1. 用户管理模块

    • 功能:处理所有用户的认证和基本信息管理

    • 数据流:

      • 接收来自管理员、教师、学生的登录请求

      • 维护用户账号、密码和基本信息

      • 向核心处理模块提供用户验证结果

  2. 课程管理模块

    • 功能:维护课程信息和教材数据

    • 数据流:

      • 接收管理员输入的课程设置

      • 维护课程-教材关联关系

      • 向选课管理模块提供课程可用信息

  3. 选课管理模块

    • 功能:处理选课全流程

    • 数据流:

      • 接收学生选课请求

      • 检查课程容量和冲突

      • 记录选课结果和成绩

  4. 教室管理模块

    • 功能:管理教室资源和分配

    • 数据流:

      • 接收授课安排的教室需求

      • 检查教室可用性

      • 记录教室使用安排

  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图设计
  1. 专业-学院关系
  2. 专业-学生关系
  3. 学院-教师关系
  4. 教师-课程关系
  5. 学生-选课-课程关系
  6. 教程-教材关系
  7. 课程-教师关系
  8. 综合E-R图 

2.1.2 数据库逻辑结构、物理结构设计

(1)数据库表逻辑设计

基于概念结构实体设计,为数据库构建以下表:

数据库表逻辑设计

实体

主要属性

说明

College

college_idcollege_name

学校各个院系

Major

major_idmajor_namecollege_id

学院下属专业

Classroom

classroom_idclassroom_namebuildingcapacity

教学场所

Textbook

textbook_idtextbook_name

authorpublisher

课程使用教材

Teacher

teacher_idnamegenderbirth_date

college_idusernamepassword

教师信息

Student

student_idnamegenderbirth_date

major_idgradeusernamepassword

学生信息

Course

course_idcourse_namehourscredits

classroom_idteacher_idtextbook_id

课程信息

Grade

student_idcourse_idgrade

学生选课及

成绩记录

Admin

usernamepassword

数据库管理员

(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 交互功能模块的框架目录结构图,具体见下图

 

Logo

一站式 AI 云服务平台

更多推荐