实验一 需求规格说明书
1.1 产品介绍
1.1.1 项目来源
随着科技的不断发展以及科技在各领域的不断深入,越来越多的行业和领域步入信息智能化阶段。学生成绩管理系统在当今教育领域是一个不可缺少的工具软件。学生成绩管理系统是学校不可缺少的部分,它的内容对于学校和学生来说都有至关重要的作用。然而,一个好的高质量的软件少之又少,并为根本实现智能化,也不利于科学的管理和审查。因此,准备开发一个功能完善的学生成绩管理系统。
1.1.2 项目需要解决的问题
在本次项目的酝酿和前期准备阶段,为了使项目的开发目的和范围更加明确,学校多次进行内部会议,并与项目开发小组多次以项目需求初步获取为目的进行讨论,对学校目前的档案管理方式和工作模式中存在的问题进行了讨论,总结出了如下需要解决的问题:
原来人工管理成绩的效率低。
可在任何地方任何时间使用这个系统
原来对成绩的更改或其他操作由于交流沟通的缺乏总是存在各种困难。此外,一些不可避免的临时变动造成的突发状况也使管理工作难上加难。
1.1.3项目概念
产品用途:利用软件实现成绩的录入、修改、查询等流程。
产品性质:本产品是基于B/S架构的web网络应用系统。
产品的使用领域:完成成绩的录入、修改、查询等实现工作。
产品内容:本产品主要包含四个子系统,分别是成绩修改子系统、成绩查询子系统、成绩删除子系统、成绩录入子系统。
1.1.4项目目标
本项目的开发目标是帮助学校:
使信息处理复杂化的现状得以改观,从而有效地提高管理效率。
通过制定详细合理的管理计划,规范工作流程,统一工作步调。
通过成绩管理系统,为学校提供高效高质的工作机制和方法,优质的完成预期的工作。
1.2 产品面向的用户群体
本软件的最终用户为学校所有教职人员和学生,其主要构成为教师、学生及管理人员,因此本软件在提供完善的业务处理功能的同时,将提供友好、易用、便捷的用户操作界面和简单的使用流程,以方便使用人员更好的进行操作,提高工作效率和质量。
1.3 产品应当遵循的标准或规范
平台约束:
本项目的开发平台为Windows操作系统。
客户端应用平台:Windows操作系统。
服务器端应用平台:Windows操作系统。
语言约束:
本项目的开发语言为Java;国际化语言系统支持中文和英语两种语言。
时间约束:
项目开发周期:6周(2023-3-1------2023-4-8)。
为了使产品更好更全面的发挥其作用,其他项目可能会与本项目并行或在本项目结束后对产品的其他子系统进行开发。
1.4 产品的功能性需求
简要描述:学校是一个人员往来流动频繁的地方,且人数众多。鉴于对人员档案的简洁、便利地管理,为了提高人员调动效率,我们准备开发一套档案管理系统,取代原来的人工处理方式。
主要功能:老师上传学生成绩,系统自动按学号排列学生成绩以及按成绩的高低排列学生成绩,自动列出成绩不及格的学生以及成绩优秀的学生,计算该班某门课程的平均成绩,老师修改成绩,学生查询成绩。
学生成绩管理系统采用模块化设计方法,根据大学生课程成绩的特点,采用模块化设计,操作更加人性化,管理更加方便。
公司现有一套基于微软SQL Server的人事管理数据库系统,记录员工的基本信息和团队的组织结构。报帐系统将和现有人事管理数据库系统协同工作,需要引用人事管理数据库系统中的部分信息,但不会更新其内容。
1.5. 功能模型
1.5.1 系统总用例图

图1-1 系统总用例图
1.5.2 成绩管理系统用例描述
- 查询成绩

图1-2 查询成绩用例图
表1-1 查询成绩用例描述
|----------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 用例名 | 查询成绩 |
| 主要业务参与者 | 学生、教师 |
| 其他参与者 | 成绩管理系统 |
| 项目相关人员兴趣 | 学生:在系统中查询自己的成绩 教师:在系统中查询学生的成绩 |
| 描述 | 该用例描述了查询个人成绩以及教师查询学生成绩的过程 |
| 前置条件 | 用户为学生或教师 |
| 后置条件 | 显示相应的个人成绩信息或相应的学生成绩 |
| 触发条件 | 当用户选择查询成绩系统时被触发 |
| 基本流程 | 1. 用户选择查询成绩信息,系统跳转web页面 2. 系统校验用户身份,并提示输入学生学号或者姓名 3. 系统校验学号或者姓名是否正确 4. 系统显示成绩信息,提示查询成功 5. 用户选择打印成绩单 6. 系统询问是否打印成绩单 7. 系统显示成绩单打印成功 |
| 替代流程 | 1.1 若用户不为学生或教师,则提示查询失败 2.1 若用户为学生,则系统提取学生个人全部成绩信息,并在系统中显示 2.2 若用户为教师,提示教师选择查询所有学生成绩或者查询个别学生成绩,若选择查询查询所有,则系统提取全部学生成绩信息,并在系统中显示。否则,提示教师输入学生学号或者姓名查询成绩,若成功则系统提取该学生成绩,并显示成绩信息 3.1 若不正确,提示重新输入学号或姓名 6.1 若取消打印,则系统提示取消成功 |
| 结束 | 系统完成对成绩的查询,并显示到Web界面 |
- 录入成绩

图1-3 录入成绩用例图
表1-2 录入成绩用例描述
|---------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 用例名 | 录入学生成绩 |
| 主要业务参与者 | 教师 |
| 其他参与者 | 成绩管理系统 |
| 描述 | 该用例描述了教师录入成绩的过程。 |
| 前置条件 | 录入成绩的是教师身份 |
| 后置条件 | 文件储存成绩信息 |
| 触发条件 | 当教师录入成绩时被触发。 |
| 基本流程 | 1. 教师选择录入成绩功能,系统跳转web页面 2. 系统校验用户身份 3. 教师输入学生学号 4. 教师选择录入成绩窗口,可以通过期末构成进行设置 4.1 在平时成绩或实验成绩栏上,如果该课程没有平时成绩或实验成绩,在设置栏内输入0,如果该课程没有平时成绩或实验成绩,按比例10%,20%,30%,在设置栏内输入10,20或30,教师只能按照10分制、20分制或30分制进行录入 4.2 在期末考试成绩栏上,如果该课程没有平时成绩或实验成绩,期末卷面占100%,在期末成绩设置栏输入100;如果该课程有平时成绩或实验成绩,比例10%,20%,或30%,卷面占90%,80%,或70%,教师按照90分制,80分制或70分制进行录入 5. 录入过程中,可以随时点击按钮保存,并且录入一小部分就暂时保存,以免数据丢失。在未提交状态下,学生还看不到本门课的成绩。 6. 系统提示是否添加备注:备注内容为缺考,旷考,取消考试资格,作弊,违纪等 7. 系统判断成绩是否合法 8. 系统提示是否保存学生成绩 9. 系统保存成绩到文件信息,显示学生成绩信息录入成功 |
| | 1. 教师选择录入成绩功能,系统跳转web页面 2. 系统校验用户身份 3. 教师输入学生学号 4. 教师选择录入成绩窗口,可以通过期末构成进行设置 4.1 在平时成绩或实验成绩栏上,如果该课程没有平时成绩或实验成绩,在设置栏内输入0,如果该课程没有平时成绩或实验成绩,按比例10%,20%,30%,在设置栏内输入10,20或30,教师只能按照10分制、20分制或30分制进行录入 4.2 在期末考试成绩栏上,如果该课程没有平时成绩或实验成绩,期末卷面占100%,在期末成绩设置栏输入100;如果该课程有平时成绩或实验成绩,比例10%,20%,或30%,卷面占90%,80%,或70%,教师按照90分制,80分制或70分制进行录入 5. 录入过程中,可以随时点击按钮保存,并且录入一小部分就暂时保存,以免数据丢失。在未提交状态下,学生还看不到本门课的成绩。 6. 系统提示是否添加备注:备注内容为缺考,旷考,取消考试资格,作弊,违纪等 7. 系统判断成绩是否合法 8. 系统提示是否保存学生成绩 9. 系统保存成绩到文件信息,显示学生成绩信息录入成功 |
| 替代流程 | 2.1 若用户不是教师,提示录入失败 3.1 若输入学生学号检测到成绩已经录入,提示成绩已经录入。 3.2 若输入学号不正确则提示重新输入 6.1 若取消备注,显示取消成功 7.1 成绩不合法,系统提示成绩超过总分,无法录入。 7.2 成绩不合法,系统提示请保留小数点后两位,无法录入。 7.3 成绩不合法,系统提示成绩不能为负,无法录入 8.1 若取消保存,显示取消成功 |
| 结束 | 系统成功完成成绩信息录入及修改,并保存到数据库 |
| 实现约束和说明 | 密码要求:六位以上字符(可以包括大小写) |
- 计算学分

图1-4 计算学分用例图
表1-3 计算学分用例描述
|----------|----------------------------------------------------------------------------------------------------------|
| 用例名 | 查询学分 |
| 主要业务参与者 | 学生 |
| 其他参与者 | 成绩管理系统 |
| 项目相关人员兴趣 | 学生:在系统中查询学分 |
| 描述 | 该用例描述了查询学分的过程。 |
| 前置条件 | 用户已经登录,且为学生 |
| 后置条件 | 显示相应的学分 |
| 触发条件 | 当用户选择查询学分系统时被触发。 |
| 基本流程 | 1. 学生选择计算学分 2. 系统读取学生学籍数据库验证用户是否为学生,若是则进行下一步,若否,则提示查询失败 3. 系统读取学生成绩信息,分析计算学分 4. 显示该学生本人的学分信息 5. 学分信息查询成功 |
| | 1. 学生选择计算学分 2. 系统读取学生学籍数据库验证用户是否为学生,若是则进行下一步,若否,则提示查询失败 3. 系统读取学生成绩信息,分析计算学分 4. 显示该学生本人的学分信息 5. 学分信息查询成功 |
| 替代流程 | 若不存在学生成绩信息,则提示查询失败 |
| 结束 | 系统成功完成学分信息计算,并显示到Web界面 |
- 查询试卷

图1-5 查询试卷用例图
表1-4 查询试卷用例描述
|----------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 用例名 | 查询试卷 |
| 主要业务参与者 | 学生、教师 |
| 其他参与者 | 成绩管理系统 |
| 描述 | 该用例描述了查询试卷相关过程。 |
| 前置条件 | 查询试卷的是教师或学生 |
| 后置条件 | 系统显示本科目考试试卷 |
| 触发条件 | 当用户选择查询试卷时被触发 |
| 项目相关人员兴趣 | 学生:通过查询自己的试卷,来寻找自己的错误点,核对自己分数 教师:查询学生试卷,看学生的答题情况 |
| 基本流程 | 1. 用户选择查询试卷详情 2. 系统校验用户身份,并提示输入 3. 用户根据提示进行相应输入 4. 系统判断用户输入是否正确 5. 系统显示试卷详情 6. 用户选择查询答案 7. 系统提示输入学科 8. 系统判断用户输入是否正确 9. 系统显示该科目试卷答案 10. 用户选择搜索同类型题 11. 系统在题库中搜索3个相同题型并显示 |
| | 1. 用户选择查询试卷详情 2. 系统校验用户身份,并提示输入 3. 用户根据提示进行相应输入 4. 系统判断用户输入是否正确 5. 系统显示试卷详情 6. 用户选择查询答案 7. 系统提示输入学科 8. 系统判断用户输入是否正确 9. 系统显示该科目试卷答案 10. 用户选择搜索同类型题 11. 系统在题库中搜索3个相同题型并显示 |
| 替代流程 | 2.2 若用户不是教师或学生,提示查询失败 2.2 若用户为教师,则系统提示输入学生学号以及学科科目 2.3 若用户为学生,则系统提示输入学科科目 4.1 若用户输入错误,则系统提示请输入正确的学科科目 7.1 若选择取消,则系统提示取消成功 8.1 若用户输入错误,则系统提示请输入正确的学科科目 11.1 若没有同类型题,显示题库未更新,没有相关题型 |
| 结束 | 系统成功完成用户信息录入 |
| 实现约束和说明 | 密码要求:六位以上字符(可以包括大小写) |
- 统计成绩

图1-6 统计成绩用例活动图
表1-5 统计成绩信息用例描述
|----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 用例名 | 统计成绩 |
| 主要业务参与者 | 教师 |
| 其他参与者 | 无 |
| 项目相关人员兴趣 | 教师:在系统中统计本班学生成绩信息 |
| 描述 | 该用例描述了统计成绩的过程 |
| 前置条件 | 用户已登录,并且为教师 |
| 后置条件 | 系统显示统计出来的成绩信息分布图 |
| 触发条件 | 当用户选择统计成绩时被触发 |
| 基本流程 | 1. 用户选择统计成绩功能 2. 选择授课班级进行统计成绩 3. 系统对学生成绩的分布的百分比进行统计,并形成一个成绩柱状图,用户可进行查看。 4. 系统还会对挂科人数进行统计,并形成一张具体的树状图,显示本科目挂科几人。 5. 系统还会根据学生成绩分析出总体的学生成绩情况,并形成树状图,并在树状图上方显示情况优或良。 |
| 替代流程 | 6. 若用户不为学生或教师,则无法进入统计web页面,并且提示本用户无权限对该功能进行操作 7. 若用户查询分成绩表的考试模块显示为缺考,系统就会在总系统表里自动定义为缺考,并记录缺考几人 8. 若用户想重新统计成绩或者统计成绩失败,用户取消对此班级成绩统计,系统返回选择班级页面 9. 若用户想查询挂科的具体人名,可直接点击挂科人数的树状图。就会跳转到挂科的具体人名显示。 |
| 结束 | 系统完成对成绩的统计,并显示到Web主页界面 |
- 查询挂科科目

图1-7 查询挂科科目用例活动图
表1-6 查询挂科科目用例描述
|----------|-------------------------------------------------------------------------------------------------------------------------------------------|
| 用例名 | 查询挂科科目 |
| 主要业务参与者 | 学生、教师 |
| 其他参与者 | 成绩管理系统 |
| 项目相关人员兴趣 | 学生:在系统中查询挂科科目 教师:在系统中查询挂科科目 |
| 描述 | 该用例描述了查询挂科科目的过程 |
| 前置条件 | 用户已经登录,且为学生或教师 |
| 后置条件 | 显示相应的挂科科目情况 |
| 触发条件 | 当用户选择排名查询系统时被触发 |
| 基本流程 | 1. 用户选择查询挂科科目 2. 系统读取学生学籍身份信息验证用户是否为学生,若是则进行下一步;若否,则继续验证用户是否为教师,若是则进行下一步,若否,则提示查询失+败。 3. 读取学生成绩文件 4. 分析学生成绩 5. 显示该学生所有课程的挂科情况 6. 挂科数目查询成功 |
| | 1. 用户选择查询挂科科目 2. 系统读取学生学籍身份信息验证用户是否为学生,若是则进行下一步;若否,则继续验证用户是否为教师,若是则进行下一步,若否,则提示查询失+败。 3. 读取学生成绩文件 4. 分析学生成绩 5. 显示该学生所有课程的挂科情况 6. 挂科数目查询成功 |
| 替代流程 | 若学生没有成绩或缺考,则提示查询失败 |
| 结束 | 系统成功完成查询挂科科目 |
- 学业预警

图1-8 学业预警用例活动图
表1-7学业预警用例描述
|---------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 用例名 | 学业预警 |
| 主要业务参与者 | 学生 |
| 其他参与者 | 成绩管理系统 |
| 描述 | 该用例描述了查询学业预警的过程 |
| 前置条件 | 用户需进入成绩统计页面 |
| 后置条件 | 在成绩统计下方会根据成绩信息自动显示学业预警情况 |
| 触发条件 | 当学生进入成绩统计页面即可查看 |
| 基本流程 | 1.用户需登录并进入成绩统计页面。 2.系统读取学生成绩文件。 3.分析成绩信息,提取不及格成绩,会自动根据挂科数量给予相应预警。并显示在统计成绩下方,例如挂科科目,挂科数量,超过九门数字会变红,其他则显示绿色。 4.若超过1门以上,系统会自动在统计成绩上方显示挂科预警。并会提示已上报教务处。如有异议,请申报教务处。 |
| 替代流程 | 若用户不为学生,则提示查询失败。 |
| 结束 | 系统成功完成预警显示 |
- 排名成绩

图1-9 排名成绩用例活动图
表1-8排名成绩用例描述
|----------|---------|-----------|
| 用例名 | 排名成绩 | 用例类型 业务需求 |
| 用例ID | MSM1207 | 用例类型 业务需求 |
| 主要业务参与者 | 教师 ||
| 其他参与者 | 无 ||
| 项目相关人员兴趣 | 每个用户:希望能够看到学生绩点排名情况 ||
| 描述 | 该用例描述了一个学生绩点排名的过程 ||
| 前置条件 | 登录用户为教师 ||
| 后置条件 | 教师在该用例完成后可以看到学生绩点排名情况 ||
| 触发条件 | 教师选择排名绩点时该用例被触发 ||
| 基本流程 | 教师选择排名成绩功能 系统提示用户选择根据绩或成绩排名 用户选择根据绩点排名 系统读取学生成绩数据库信息,并利用相应算法进行计算,最后将绩点进行排序 系统显示排名后的绩点情况 ||
| 替代流程 | 3.1用户选择根据成绩排名 4.1系统读取学生成绩数据库表,并利用相应算法进行计算,最后将成绩进行排序 5.1 系统显示排名后的成绩情况 ||
| 结束 | 当系统计算成功后,显示绩点排名情况时该用例结束。 ||
| 实现约束和说明 | "成绩管理系统"为Web界面,内部工作人员也为Web界面。 ||
1.5.3成绩管理系统用例活动图
- 查询成绩用例活动图

图1-10 查询成绩用例活动图
- 录入成绩用例活动图

图1-11 录入成绩用例活动图
- 计算学分用例活动图

图1-12 计算学分用例活动图
- 查询试卷用例活动图

图1-13 查询试卷用例活动图
- 统计成绩用例活动图

图1-14 统计成绩用例活动图
- 查询挂科科目用例活动图

图1-15 查询挂科科目用例活动图
- 学业预警用例活动图

图1-16 学业预警用例活动图
- 排名成绩用例活动图

图1-17 排名成绩用例活动图
1.6 产品的非功能需求
1.6.1 软硬件环境需求
- 硬件环境
|--------|-----|-------------|-------------|
| 分类 || 推荐配置 | 最低配置 |
| 数据库服务器 | CPU | 英特尔迅驰双核处理器 | 英特尔酷睿2双核处理器 |
| 数据库服务器 | 内存 | 2GB | 1GB |
| 数据库服务器 | 硬盘 | 160GB | 120GB |
| 数据库服务器 | 网卡 | 100M | 10M |
| 应用服务器 | CPU | 英特尔酷睿2双核处理器 | 英特尔酷睿1处理器 |
| 应用服务器 | 内存 | 3GB | 1GB |
| 应用服务器 | 硬盘 | 120GB | 80GB |
| 应用服务器 | 网卡 | 100M | 10M |
| 网络 | 带宽 | 100M | 10M |
| 客户端 | CPU | 英特尔酷睿2双核处理器 | 英特尔奔腾3处理器 |
| 客户端 | 内存 | 2GB | 1GB |
| 客户端 | 硬盘 | 160GB | 120GB |
| 客户端 | 网卡 | 100M | 10M |
- 软件环境
|-----------|----------------------------|------------|-----|
| 分类 | 名称 | 版本 | 语种 |
| 操作系统 | Windows | XP | 中文 |
| 操作系统的附加功能 | JDBC数据源管理工具 | | 中文 |
| 数据库平台 | Microsoft SQL Server | 2000 | 中文 |
| 数据库平台补丁 | --- | sp4 | --- |
| 数据库驱动 | SQL Server Driver For JDBC | sp4 | --- |
| 应用平台 | Windows | XP/Vista | 中文 |
| 浏览器 | 各种功能完善、运行稳定的浏览器 | eg. IE、遨游等 | 中文 |
| 客户端软件 | Windows | XP/Vista | 中文 |
1.6.2 产品质量需求
- 精度
本系统中输入的各种数据均要求精确到小数点后2位。
- 时间特性的要求
搜索查询时间最大不超过7秒。页面平均处理及响应时间在3---10秒以内,最大不超过10秒。页面平均更新响应时间为3秒左右,最大不超过7秒。
- 灵活性
操作方式的变化:如果学校的业务情况或业务逻辑出现变化,导致本系统需求发生变化,在可接受的范围内,要求本系统能够及时完成需求变更及各项相关的处理工作,实现新的需求。运行环境的变化:本系统支持各种功能完善、成熟的浏览器(eg. IE、遨游等)。精度和有效时限的变化:如果学校提出要求改变精度和有效时限,在可接受的范围内,接受并实现其需求变更。开发计划的变化或改进:在可接受的范围内,本系统的开发工作将积极开发配合计划的变化或改进。
- 输入输出要求
本系统的输入数据类型主要是整形、浮点型和字符串类型;输出以字符串、整形、浮点型及各类3D图表为主。
1.7.词汇表
|-------|--------------------------------------------|
| 名称 | 描述 |
| 学生 | 成绩管理系统的使用对象 |
| 教师 | 负责使用成绩管理系统对学生的成绩进行一系列的操作。 |
| 教务处 | 掌握系统基本权限和关键权限,防止教师乱改学生成绩。 |
| 学生信息表 | 该数据库中记录了有关学生个人资料的相关信息,包括学生的姓名、年龄、入学时间等等。 |
| 成绩信息表 | 该数据库中记录了有关学生考试成绩的相关信息,包括每个科目的考试成绩、加权平均成绩等。 |
实验二 领域模型
2.1 概念类分析
2.1.1查询成绩概念类分析
使用概念类分类列表
得到候选概念类:
人:学生、教师
事物:成绩、平时分、期中考试分、期末考试分、成绩信息、学生信息、学号、学生姓名、个人信息、成绩单
概念类:学生、教师、成绩、平时分、期中考试分、期末考试分、学生信息、班级、学号、学生姓名、课程
识别名词短语
得到候选概念类:
教师、教务处、成绩、课程、学生、平时分、期中考试分、学生信息
筛选得到概念类:
学生、教师、成绩、课程、成绩信息表
表2-1 统计成绩用例概念类分析
|-------|-------------------------------------|-------------|
| 概念类名 | 属性 | 描述 |
| 学生 | 用户名、密码、教师姓名、 班级编号 | 描述每一个教师基本信息 |
| 教师 | 学生id、学科id、平时分、 期中考试分、期末考试分、总成绩、考试卷子 | 描述成绩类信息 |
| 成绩 | 用户名、密码、学生姓名、入学时间、班级编号 | 描述每一位学生基本信息 |
| 课程 | 课程编号、课程名称、课程学分 | 描述课程类信息 |
| 成绩信息表 | 成绩编号、成绩信息 | 描述总体学生成绩信息 |
2.1.2录入成绩概念类分析
使用概念类分类列表
得到候选概念类:
人:学生、教师、教务处
事物:成绩、平时分、期中考试分、期末考试分、学生信息、班级、学号、学生姓名、
概念类:学生、教师、成绩、平时分、期中考试分、期末考试分、学生信息、班级、学号、学生姓名、学科、成绩信息表、课程
识别名词短语
得到候选概念类:
教师、成绩、课程、学生、班级、平时分、成绩信息表
筛选得到概念类:
教师、成绩、课程、学生、教务处、成绩信息表
表2-2 录入成绩用例概念类分析
|-------|-------------------------------------|-------------|
| 概念类名 | 属性 | 描述 |
| 教师 | 用户名、密码、教师姓名、 班级编号 | 描述每一个教师基本信息 |
| 成绩 | 学生id、学科id、平时分、 期中考试分、期末考试分、总成绩、考试卷子 | 描述每一位学生基本信息 |
| 教务处 | 用户名、密码、姓名 | 描述教务处基本信息 |
| 学生 | 用户名、密码、学生姓名、入学时间、班级编号 | 描述成绩类信息 |
| 课程 | 课程编号、课程名称、课程学分 | 描述课程类信息 |
| 成绩信息表 | 成绩编号、成绩信息 | 描述总体学生成绩信息 |
2.1.3计算学分概念类分析
使用概念类分类列表
得到候选概念类:
人:学生
事物:成绩、学生信息、班级、学号、学生姓名、学分
概念类:学生、教师、成绩、平时分、期中考试分、期末考试分、学生信息、班级、学号、学生姓名、学科、成绩信息表、课程
识别名词短语
得到候选概念类:
教师、成绩、课程、学生、班级、平时分、成绩信息表
筛选得到概念类:
成绩、学生、成绩信息表、学分
表2-3 计算学分用例概念类分析
|-------|-------------------------------------|-------------|
| 概念类名 | 属性 | 描述 |
| 成绩 | 学生id、学科id、平时分、 期中考试分、期末考试分、总成绩、考试卷子 | 描述成绩类信息 |
| 学生 | 用户名、密码、学生姓名、入学时间、班级编号 | 描述每一位学生基本信息 |
| 课程 | 课程编号、课程名称、课程学分 | 描述课程类信息 |
| 成绩信息表 | 成绩编号、成绩信息 | 描述总体学生成绩信息 |
| 学分 | 数字 | 描述总体学生学分信息 |
2.1.4查询试卷概念类分析
使用概念类分类列表
得到候选概念类:
人:学生、教师
事物:试卷、学生姓名、学科
概念类:学生、教师、教务处、班级、成绩信息、学科
识别名词短语
得到候选概念类:
教师、管理员、成绩、课程、学生、平时分、试卷
筛选得到概念类:
教师、学生、试卷、成绩信息表
表2-4 查询试卷用例概念类分析
|-------|-------------------------------------|-------------|
| 概念类名 | 属性 | 描述 |
| 学生 | 用户名、密码、教师姓名、 班级编号 | 描述每一个教师基本信息 |
| 教师 | 学生id、学科id、平时分、 期中考试分、期末考试分、总成绩、考试卷子 | 描述成绩类信息 |
| 试卷 | 试卷编号、试卷课程、考生姓名、试卷详情 | 描述试卷基本信息 |
| 成绩信息表 | 成绩编号、成绩信息 | 描述总体学生成绩信息 |
2.1.5统计成绩概念类分析
使用概念类分类列表
得到候选概念类:
人:学生、教师、管理员
事物:成绩信息、班级、学科
概念类:学生、教师、管理员、班级、成绩信息、课程
教师、管理员、成绩、课程、学生、平时分、期中考试分、学生信息
识别名词短语
得到候选概念类:
教师、管理员、成绩、课程、学生、平时分、期中考试分、学生信息
筛选得到概念类:教师、管理员、成绩、课程、成绩信息表
表2-5 统计成绩用例概念类分析
|-------|-------------------------------------|-------------|
| 概念类名 | 属性 | 描述 |
| 教师 | 用户名、密码、教师姓名、教师工号、班级编号 | 描述每一个教师基本信息 |
| 成绩 | 学生id、学科id、平时分、 期中考试分、期末考试分、总成绩、考试卷子 | 描述成绩类信息 |
| 系统管理员 | 用户名、密码、姓名 | 描述管理员基本信息 |
| 课程 | 课程编号、课程名称、课程学分 | 描述课程类信息 |
| 成绩信息表 | 成绩编号、成绩信息 | 描述总体学生成绩信息 |
2.1.6查询挂科科目概念类分析
使用概念类分类列表
得到候选概念类:
人:学生、教师
事物:挂科科目、成绩信息
概念类:学生、教师、挂科科目、成绩信息、成绩、课程
识别名词短语
得到候选概念类:
教师、管理员、成绩、课程、学生
筛选得到概念类:教师、学生、成绩、课程、成绩信息表
表2-6 查询挂科科目用例概念类分析
|-------|-------------------------------------|-------------|
| 概念类名 | 属性 | 描述 |
| 教师 | 用户名、密码、教师姓名、教师工号、班级编号 | 描述每一个教师基本信息 |
| 成绩 | 学生id、学科id、平时分、 期中考试分、期末考试分、总成绩、考试卷子 | 描述成绩类信息 |
| 学生 | 用户名、密码、学生姓名、入学时间、班级编号 | 描述管理员基本信息 |
| 课程 | 课程编号、课程名称、课程学分 | 描述课程类信息 |
| 成绩信息表 | 成绩编号、成绩信息 | 描述总体学生成绩信息 |
2.1.7学业预警概念类分析
使用概念类分类列表
得到候选概念类:
人:学生、教师
事物:挂科科目、成绩信息
概念类:学生、教师、挂科科目、成绩信息、成绩、课程
识别名词短语
得到候选概念类:
教师、管理员、成绩、课程、学生
筛选得到概念类:教师、学生、成绩、课程、成绩信息表
表2-7 学业预警用例概念类分析
|-------|-------------------------------------|-------------|
| 概念类名 | 属性 | 描述 |
| 教师 | 用户名、密码、教师姓名、教师工号、班级编号 | 描述每一个教师基本信息 |
| 成绩 | 学生id、学科id、平时分、 期中考试分、期末考试分、总成绩、考试卷子 | 描述成绩类信息 |
| 学生 | 用户名、密码、学生姓名、入学时间、班级编号 | 描述管理员基本信息 |
| 课程 | 课程编号、课程名称、课程学分 | 描述课程类信息 |
| 成绩信息表 | 成绩编号、成绩信息 | 描述总体学生成绩信息 |
2.1.8 排名成绩概念类分析
使用概念类分类列表
得到候选概念类:
人:教师、学生
事物:学生成绩、绩点、系统
概念类:学生、教师、成绩信息、成绩
识别名词短语
得到候选概念类:
教师、成绩、绩点、学生
筛选得到概念类:教师、成绩、学生、成绩信息表
表2-8 排名成绩用例概念类分析
|-------|-------------------------------------|-------------|
| 概念类名 | 属性 | 描述 |
| 教师 | 用户名、密码、教师姓名、教师工号、班级编号 | 描述每一个教师基本信息 |
| 成绩 | 学生id、学科id、平时分、 期中考试分、期末考试分、总成绩、考试卷子 | 描述成绩类信息 |
| 学生 | 用户名、密码、学生姓名、入学时间、班级编号 | 描述管理员基本信息 |
| 成绩信息表 | 成绩编号、成绩信息 | 描述总体学生成绩信息 |
2.2 领域模型(概念类图)

图2-1 系统概念类图
2.2.1 查询成绩概念类图

图2-2 查询成绩概念类图
2.2.2 录入成绩概念类图

图2-3 录入成绩概念类图
2.2.3 计算学分概念类图

图2-4 查询学分概念类图
2.2.4 查询试卷概念类图

图2-5 查询试卷概念类图
2.2.5 统计成绩概念类图

图2-6 统计成绩概念类图
2.2.6 查询挂科科目概念类图

图2-7 查询挂科科目概念类图
2.2.7 学业预警概念类图

图2-8 学业预警概念类图
2.2.8 排名成绩概念类图

图2-9 排名成绩概念类图
2.3 系统顺序图
2.3.1 查询成绩顺序图

图2-10 查询成绩用例顺序图
2.3.2 录入成绩顺序图

图2-11 录入成绩用例顺序图
2.3.3 计算学分顺序图

图2-12 计算学分用例顺序图
2.3.4 查询试卷顺序图

图2-13 查询试卷用例顺序图
2.3.5统计成绩顺序图

图2-14 统计成绩用例顺序图
2.3.6 查询挂科科目顺序图

图2-15 查询挂科科目用例顺序图
2.3.7 学业预警顺序图

图2-16 学业预警用例顺序图
2.3.8 排名成绩顺序图

图2-17 排名成绩用例顺序图
实验三 详细设计报告
3.1 查询成绩---系统实现
3.1.1 顺序图
实现查询成绩的顺序图如图3-1所示。

图3-1 查询成绩用例实现之顺序图
3.1.2 类图
实现查询成绩的类图如图3-2所示。

图3-2 查询成绩用例实现之设计类图
类图说明:
|------|------------------|------------------------------------------------------------------------|
| 模块名 | 类名 | 说明 |
| 查询成绩 | Teacher | 教师类,成绩管理系统的主要对象,对查询成绩、录入成绩、查询试卷、统计成绩、排名成绩、学业预警、查询挂科科目功能进行使用,信息从数据库中提取。 |
| 查询成绩 | Student | 学生类,成绩管理系统的主要对象,,对查询成绩、查询试卷、计算学分、学业预警、查询挂科科目功能进行使用,信息从学生信息数据库提取。 |
| 查询成绩 | System Admin | 系统管理员,对整个成绩管理系统起到了权限保护作用 |
| 查询成绩 | Interface | 界面类,系统与用户建立连接的地方 |
| 查询成绩 | Controller | 控制器类,起协调作用 |
| 查询成绩 | Service | 业务处理类,将复杂业务进行处理。 |
| 查询成绩 | Dao | 实现和数据库之间数据信息的提取。 |
| 查询成绩 | Grade Info Table | 成绩信息表,通过筛选表内数据后得到属性。 |
3.2 录入成绩---系统实现
3.2.1 顺序图
实现录入成绩的顺序图如图3-3所示。

图3-3 录入成绩用例实现之顺序图
3.2.2 类图
实现录入成绩的类图如图3-4所示。

图3-4 录入成绩用例实现之设计类图
类图说明:
|------|------------------|------------------------------------------------------------------------|
| 模块名 | 类名 | 说明 |
| 录入成绩 | Teacher | 教师类,成绩管理系统的主要对象,对查询成绩、录入成绩、查询试卷、统计成绩、排名成绩、学业预警、查询挂科科目功能进行使用,信息从数据库中提取。 |
| 录入成绩 | Student | 学生类,成绩管理系统的主要对象,,对查询成绩、查询试卷、计算学分、学业预警、查询挂科科目功能进行使用,信息从学生信息数据库提取。 |
| 录入成绩 | System Admin | 系统管理员,对整个成绩管理系统起到了权限保护作用 |
| 录入成绩 | Interface | 界面类,系统与用户建立连接的地方 |
| 录入成绩 | Controller | 控制器类,起协调作用 |
| 录入成绩 | Service | 业务处理类,将复杂业务进行处理。 |
| 录入成绩 | Dao | 实现和数据库之间数据信息的提取。 |
| 录入成绩 | Grade Info Table | 成绩信息表,通过筛选表内数据后得到属性。 |
3.3 计算学分---系统实现
3.3.1 顺序图
实现计算学分的顺序图如图3-5所示。

图3-5 计算学分用例实现之顺序图
3.3.2 类图
实现计算学分的类图如图3-6所示。

图3-6 计算学分用例实现之设计类图
类图说明:
|------|------------------|------------------------------------------------------------------------|
| 模块名 | 类名 | 说明 |
| 计算学分 | Teacher | 教师类,成绩管理系统的主要对象,对查询成绩、录入成绩、查询试卷、统计成绩、排名成绩、学业预警、查询挂科科目功能进行使用,信息从数据库中提取。 |
| 计算学分 | Student | 学生类,成绩管理系统的主要对象,,对查询成绩、查询试卷、计算学分、学业预警、查询挂科科目功能进行使用,信息从学生信息数据库提取。 |
| 计算学分 | System Admin | 系统管理员,对整个成绩管理系统起到了权限保护作用 |
| 计算学分 | Interface | 界面类,系统与用户建立连接的地方 |
| 计算学分 | Controller | 控制器类,起协调作用 |
| 计算学分 | Service | 业务处理类,将复杂业务进行处理。 |
| 计算学分 | Dao | 实现和数据库之间数据信息的提取。 |
| 计算学分 | Grade Info Table | 成绩信息表,通过筛选表内数据后得到属性。 |
3.4 查询试卷---系统实现
3.4.1 顺序图
实现查询试卷的顺序图如图3-7所示。

图3-7 查询试卷用例实现之顺序图
3.4.2类图
实现查询试卷的类图如图3-8所示。

图3-8 查询试卷用例实现之设计类图
类图说明:
|------|------------------|------------------------------------------------------------------------|
| 模块名 | 类名 | 说明 |
| 查询试卷 | Teacher | 教师类,成绩管理系统的主要对象,对查询成绩、录入成绩、查询试卷、统计成绩、排名成绩、学业预警、查询挂科科目功能进行使用,信息从数据库中提取。 |
| 查询试卷 | Student | 学生类,成绩管理系统的主要对象,,对查询成绩、查询试卷、计算学分、学业预警、查询挂科科目功能进行使用,信息从学生信息数据库提取。 |
| 查询试卷 | System Admin | 系统管理员,对整个成绩管理系统起到了权限保护作用 |
| 查询试卷 | Interface | 界面类,系统与用户建立连接的地方 |
| 查询试卷 | Controller | 控制器类,起协调作用 |
| 查询试卷 | Service | 业务处理类,将复杂业务进行处理。 |
| 查询试卷 | Dao | 实现和数据库之间数据信息的提取。 |
| 查询试卷 | Grade Info Table | 成绩信息表,通过筛选表内数据后得到属性。 |
3.5 统计成绩---系统实现
3.5.1顺序图
实现统计成绩的顺序图如图3-9所示。

图3-9 统计成绩用例实现之顺序图
3.5.2 类图
实现统计成绩的类图如图3-10所示。

图3-10 统计成绩用例实现之设计类图
类图说明:
|------|------------------|------------------------------------------------------------------------|
| 模块名 | 类名 | 说明 |
| 统计成绩 | Teacher | 教师类,成绩管理系统的主要对象,对查询成绩、录入成绩、查询试卷、统计成绩、排名成绩、学业预警、查询挂科科目功能进行使用,信息从数据库中提取。 |
| 统计成绩 | Student | 学生类,成绩管理系统的主要对象,,对查询成绩、查询试卷、计算学分、学业预警、查询挂科科目功能进行使用,信息从学生信息数据库提取。 |
| 统计成绩 | System Admin | 系统管理员,对整个成绩管理系统起到了权限保护作用 |
| 统计成绩 | Interface | 界面类,系统与用户建立连接的地方 |
| 统计成绩 | Controller | 控制器类,起协调作用 |
| 统计成绩 | Service | 业务处理类,将复杂业务进行处理。 |
| 统计成绩 | Dao | 实现和数据库之间数据信息的提取。 |
| 统计成绩 | Grade Info Table | 成绩信息表,通过筛选表内数据后得到属性。 |
3.6 查询挂科科目---系统实现
3.6.1 顺序图
实现查询挂科科目的顺序图如图3-11所示。

图3-11 查询挂科科目用例实现之顺序图
3.6.2 类图
实现查询挂科科目的类图如图3-12所示。

图3-12 查询挂科科目用例实现之设计类图
类图说明:
|--------|------------------|------------------------------------------------------------------------|
| 模块名 | 类名 | 说明 |
| 查询挂科科目 | Teacher | 教师类,成绩管理系统的主要对象,对查询成绩、录入成绩、查询试卷、统计成绩、排名成绩、学业预警、查询挂科科目功能进行使用,信息从数据库中提取。 |
| 查询挂科科目 | Student | 学生类,成绩管理系统的主要对象,,对查询成绩、查询试卷、计算学分、学业预警、查询挂科科目功能进行使用,信息从学生信息数据库提取。 |
| 查询挂科科目 | System Admin | 系统管理员,对整个成绩管理系统起到了权限保护作用 |
| 查询挂科科目 | Interface | 界面类,系统与用户建立连接的地方 |
| 查询挂科科目 | Controller | 控制器类,起协调作用 |
| 查询挂科科目 | Service | 业务处理类,将复杂业务进行处理。 |
| 查询挂科科目 | Dao | 实现和数据库之间数据信息的提取。 |
| 查询挂科科目 | Grade Info Table | 成绩信息表,通过筛选表内数据后得到属性。 |
3.7 学业预警---系统实现
3.7.1 顺序图
实现学业预警的顺序图如图3-13所示。

图3-13 学业预警用例实现之顺序图
3.7.2 类图
实现学业预警的类图如图3-14所示。

图3-14 学业预警用例实现之设计类图
类图说明:
|------|------------------|------------------------------------------------------------------------|
| 模块名 | 类名 | 说明 |
| 学业预警 | Teacher | 教师类,成绩管理系统的主要对象,对查询成绩、录入成绩、查询试卷、统计成绩、排名成绩、学业预警、查询挂科科目功能进行使用,信息从数据库中提取。 |
| 学业预警 | Student | 学生类,成绩管理系统的主要对象,,对查询成绩、查询试卷、计算学分、学业预警、查询挂科科目功能进行使用,信息从学生信息数据库提取。 |
| 学业预警 | System Admin | 系统管理员,对整个成绩管理系统起到了权限保护作用 |
| 学业预警 | Interface | 界面类,系统与用户建立连接的地方 |
| 学业预警 | Controller | 控制器类,起协调作用 |
| 学业预警 | Service | 业务处理类,将复杂业务进行处理。 |
| 学业预警 | Dao | 实现和数据库之间数据信息的提取。 |
| 学业预警 | Grade Info Table | 成绩信息表,通过筛选表内数据后得到属性。 |
3.8 排名成绩---系统实现
3.8.1 顺序图
实现排名成绩的顺序图如图3-15所示。

图3-15 排名成绩用例实现之顺序图
3.8.2 类图
实现排名成绩的类图如图3-16所示。

图3-16 排名成绩用例实现之设计类图
类图说明:
|------|------------------|------------------------------------------------------------------------|
| 模块名 | 类名 | 说明 |
| 排名成绩 | Teacher | 教师类,成绩管理系统的主要对象,对查询成绩、录入成绩、查询试卷、统计成绩、排名成绩、学业预警、查询挂科科目功能进行使用,信息从数据库中提取。 |
| 排名成绩 | Student | 学生类,成绩管理系统的主要对象,,对查询成绩、查询试卷、计算学分、学业预警、查询挂科科目功能进行使用,信息从学生信息数据库提取。 |
| 排名成绩 | System Admin | 系统管理员,对整个成绩管理系统起到了权限保护作用 |
| 排名成绩 | Interface | 界面类,系统与用户建立连接的地方 |
| 排名成绩 | Controller | 控制器类,起协调作用 |
| 排名成绩 | Service | 业务处理类,将复杂业务进行处理。 |
| 排名成绩 | Dao | 实现和数据库之间数据信息的提取。 |
| 排名成绩 | Grade Info Table | 成绩信息表,通过筛选表内数据后得到属性。 |
实验四 系统实现
4.1查询成绩用例实现描述
4.1.1 查询成绩用例实现界面
- 教师端

图4-1 查询成绩用例页面(教师端)
- 学生端

图4-2 查询成绩用例页面(学生端)
4.1.2查询成绩用例实现主要代码
java
教师端:
controller层:
@Autowired
lndexteacherService indexteacher;
@RequestMapping("/skip1")
public String skip1(Model model){
List<Grade> find= indexteacher.findall();
model.addAttribute("grades",find);
return "/studentcilent/成绩信息";
}
service层:
List<Grade> findall();
@Autowired
lndexteacherMapper indexteacher;
@Override
public List<Grade> findall() {
return indexteacher.findall();
}
mapper层:
@Select("select * from t_grade")
List<Grade> findall();
html:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<html>
<head>
<meta charset="utf-8">
<title>成绩信息</title>
<style type="text/css">
#a1{width: 30%;height: 90px;float: left;}
#a2{width: 55%;height: 40px;float: left;text-align: right;padding-top: 35px;}
#t1{width: 100%;height: 500px;}
#table{width: 100%;text-align: center;border-color: #6495ED;border: 0px solid #6495ED;}
.table{width: 80%;float: left;}
#addinfo{width: 400px;height: 320px; text-align: left;float: left;box-shadow: 0px 0px 35px 0px #6495ED;
z-index: 3;background-color: white;position: absolute;left: 25%;top: 18%;border-radius: 27px 0px 27px 27px;}
th{border: 1px solid ghostwhite;}
th{height: 40px;background-color: #6495ED;}
td{border: 1px solid floralwhite;height: 30px;}
tr:hover{background-color: #999999;height: 37px;}
#td{border: 3px solid #000000;width: 60px;height: 40px;background-color: #6495ED;}
#add{width: 140px;height: 40px;text-decoration: none;background-color: #6495ED;border: 3px solid #000000;
color: #F0F8FF;padding:10px 10px 10px 10px;margin-right: 10%;}
#add:hover{color: #000000;}
select{height: 40px;border: 2px solid #000000;border-radius: 3px 3px 3px 3px;
margin-right: 40px;margin-left: 20px;
}
#form1{font-size: larger;padding-left: 20px;}
input{width: 85%;height: 25px;border-radius: 6px 6px 6px 6px;margin-top: 10px;}
#btn_update,#btn_ext,#btn_add{width: 120px;height: 40px;border-radius: 6px 6px 6px 6px;margin:0 auto;background-color: #6495ED;}
#btn_add{color: white;}
#btn_ext{color: white;}
#btn_add :hover{color: #999999;}
#btn_ext :hover{color: antiquewhite;}
#xiu{border-radius: 3px 3px 3px 3px;border: 1px solid bisque;padding: 5px;box-shadow: 0px 0px 30px 0px #DCDCDC;background-color: coral;}
#xiu:hover{color: #BD0A01;}
#xiu2{border-radius: 3px 3px 3px 3px;border: 1px solid bisque;padding: 5px;box-shadow: 0px 0px 30px 0px #DCDCDC;background-color:springgreen;}
#xiu2:hover{color: #BD0A01;}
#h4{width: 94%;float: left;padding-top: 15px;font-size: larger;height: 30px;padding-left: 0px;border-radius: 0px 0px 50% 50%/0px 0px 40px 40px;background-color: #6495ED;}}
#h3{width: 5%;float: right;height: 20px;padding:0;text-align: right;margin: 0 auto;}
/* #h2{width: 100%;float: left;height: 40px;border-radius: 0px 0px 50% 50%/0px 0px 30px 30px;background-color: #6495ED;} */
#span1{width: 20px;font-size: x-large;line-height: 10px;}
#h3 :hover{background-color: #DCDCDC;}
#aa2{float: left;width: 15%;}
#aa3{width: 80%;height: 320px;float: left;}
#shu{height: 320px;}
.a10 .a9{width: 70px;height: 20px;background-color: #fff;position: absolute;left:200px;bottom:0px;}
.a10{width: 100%;height: 50px;margin-top: 0px;background-color:#dcdcdc;float: left;font-size:larger;padding-left:20px;}
</style>
</head>
<body>
<div id="a1">
<h2>~~学生成绩信息~~</h2>
</div>
<div id="a3">
</div>
<!-- <div id="a2">-->
<!-- <select name="">-->
<!-- <option value="">计算机与信息技术学院</option>-->
<!-- <option value ="">软件学院</option>-->
<!-- <option value ="">教育学院</option>-->
<!-- </select>-->
<!-- <a href="#" onclick="javascript:showAddInput();" id="add">添加信息</a>-->
<!-- </div>-->
<div class="table" style="width:500px;height:500px;overflow-y: auto ">
<table border="1" style="text-align:center;overflow-y: auto" id="table" cellspacing="0" >
<tr>
<th>编号</th>
<th>姓名</th>
<th>课程名称</th>
<th>课程分数</th>
</tr>
<tr th:each="grade:${grades}">
<td th:text="${grade.id}"></td>
<td th:text="${grade.name}"></td>
<td th:text="${grade.subjectname}"></td>
<td th:text="${grade.subjectgrade}"></td>
</tr>
</table>
</div>
<script type="text/javascript">
var row = 0 ; //定义全局行数用于修改
var reg_name = /^((\w*\d\w*[a-z]\w*)|(\w*[a-z]\w*\d\w*))$/i; //用于判断用户名格式
var reg_chinese = /^[\u0391-\uFFE5]+$/ ; //用于判断姓名格式
var reg_pass = /^((\w*\d\w*[a-z]\w*)|(\w*[a-z]\w*\d\w*))$/i;//用于判断密码格式
var reg_s=/^[1-9]{1,2}\d?$/;
//----获取行号-----
function getRow(r){
var i=r.parentNode.parentNode.rowIndex;
return i ;
}
//----获取行号-----
//----删除某一行-----
function delRow(r){
document.getElementById('table').deleteRow(getRow(r));
}
//----删除某一行-----
//----清除添加信息框的内容-----
function cleanAddInput(){
document.getElementById('s1').value='';
document.getElementById('s2').value='';
document.getElementById('s3').value='';
document.getElementById('name').value='';
document.getElementById('bid').value='';
}
//----清除添加信息框的内容-----
//----显示添加信息框-----
function showAddInput(){
document.getElementById('addinfo').style="display:block-inline" ;
document.getElementById('btn_add').style="display:block-inline" ;
document.getElementById('btn_update').style="display:none" ;
cleanAddInput();
}
//----显示添加信息框-----
//----隐藏添加信息框-----
function hideAddInput(){
document.getElementById('addinfo').style="display:none" ;
}
//----隐藏添加信息框-----
//----判断输入框的信息是否符合要求-----
function judge(){
//根据id获取表单信息
var s1= document.getElementById('s1').value;
var s2 = document.getElementById('s2').value;
var name = document.getElementById('name').value;
var s3 = document.getElementById('s3').value;
var bid=document.getElementById('bid').value;
var judge = true ; //用于判断表单信息是否符合
if(s1==''){
judge = false ;
alert('请输入第三列成绩');
}else if(s2==''){
judge = false ;
alert('请输入第四列成绩');
}else if(name==''){
judge = false ;
alert('请输入姓名');
}else if(bid==''){
judge = false ;
alert('请输入编号');
}else if(s3==''){
judge = false ;
alert('请输入第五列成绩');
}else if(!reg_s.test(s1)|!reg_s.test(s2)|!reg_s.test(s3))
{
judge = false ;
alert('请输入正确成绩信息(1-100)');
}else if(s1>100|s2>100|s3>100)
{ judge = false ;
alert('请输入一百以内成绩');
}
return judge ;
}
//----判断输入框的信息是否符合要求-----
//----新增信息的插入方法-----
function insertInfo(){
//根据id获取表单信息
var arr = new Array();
arr[0] = document.getElementById('bid').value;
arr[1] = document.getElementById('name').value;
arr[2] = document.getElementById('s1').value;
arr[3] = document.getElementById('s2').value;
arr[4] = document.getElementById('s3').value;
arr[5] ="<a style='text-align:center;color:#6495ED;cursor:pointer;' onclick='updateRow(this);' id='xiu'>修改</a> <a style='text-align:center;color:chocolate;cursor:pointer;' onclick='delRow(this);'id='xiu2'>删除</a>";
var x = document.getElementById('table').insertRow(1); //获取第一行对象
for(var i=0;i<arr.length;i++){
x.insertCell(i).innerHTML = arr[i] ; //用循环把每个数据插入第一行的每一列
}
}
//----新增信息的插入方法-----
//----新增信息-----
function addInfo(){
if(judge()==true){
alert('添加成功');
insertInfo(); //执行插入
hideAddInput(); //隐藏添加信息框
}else{
alert('添加失败');
}
}
//----新增信息-----
//----根据行号修改信息-----
function updateRow(r){
row = getRow(r); //把该行号赋值给全局变量
showAddInput(); //显示修改表单
//提交按钮替换
document.getElementById('btn_add').style="display:none" ;
document.getElementById('btn_update').style="display:block-inline" ;
insertInputFromQuery(queryInfoByRow(row));
}
//----根据行号修改信息-----
//----根据行号查信息----
function queryInfoByRow(r){
var arr = new Array();
for(var m=0; m<6;m++){
arr[m] = document.getElementById('table').rows[row].cells[m].innerText;
}
return arr ; //返回该行数据
}
//----根据行号查信息----
//----把查询到的信息放入修改的表单里----
function insertInputFromQuery(arr){
document.getElementById('bid').value = arr[0];
document.getElementById('name').value = arr[1];
document.getElementById('s1').value = arr[2];
document.getElementById('s2').value = arr[3];
document.getElementById('s3').value = arr[4];
}
//----把查询到的信息放入修改的表单里----
function updateInfo(){
if(judge()==true){
alert('修改成功');
document.getElementById('table').deleteRow(row);//删除原来那行
insertInfo(); //插入修改后的值
hideAddInput(); //隐藏添加模块
}else{
alert('修改失败');
hideAddInput();
}
}
</script>
</body>
</html>
<body>
<div id="a1">
<h2>~~学生成绩信息~~</h2>
</div>
<div id="a3">
</div>
<div class="table" style="width:500px;height:500px;overflow-y: auto ">
<table border="1" style="text-align:center;overflow-y: auto" id="table" cellspacing="0" >
<tr>
<th>编号</th>
<th>姓名</th>
<th>课程名称</th>
<th>课程分数</th>
</tr>
<tr th:each="grade:${grades}">
<td th:text="${grade.id}"></td>
<td th:text="${grade.name}"></td>
<td th:text="${grade.subjectname}"></td>
<td th:text="${grade.subjectgrade}"></td>
</tr>
</table>
</div>
<script type="text/javascript">
var row = 0 ; //定义全局行数用于修改
var reg_name = /^((\w*\d\w*[a-z]\w*)|(\w*[a-z]\w*\d\w*))$/i; //用于判断用户名格式
var reg_chinese = /^[\u0391-\uFFE5]+$/ ; //用于判断姓名格式
var reg_pass = /^((\w*\d\w*[a-z]\w*)|(\w*[a-z]\w*\d\w*))$/i;//用于判断密码格式
var reg_s=/^[1-9]{1,2}\d?$/;
//----获取行号-----
function getRow(r){
var i=r.parentNode.parentNode.rowIndex;
return i ;
}
//----获取行号-----
//----删除某一行-----
function delRow(r){
document.getElementById('table').deleteRow(getRow(r));
}
//----删除某一行-----
//----清除添加信息框的内容-----
function cleanAddInput(){
document.getElementById('s1').value='';
document.getElementById('s2').value='';
document.getElementById('s3').value='';
document.getElementById('name').value='';
document.getElementById('bid').value='';
}
//----清除添加信息框的内容-----
//----显示添加信息框-----
function showAddInput(){
document.getElementById('addinfo').style="display:block-inline" ;
document.getElementById('btn_add').style="display:block-inline" ;
document.getElementById('btn_update').style="display:none" ;
cleanAddInput();
}
//----显示添加信息框-----
//----隐藏添加信息框-----
function hideAddInput(){
document.getElementById('addinfo').style="display:none" ;
}
//----隐藏添加信息框-----
//----判断输入框的信息是否符合要求-----
function judge(){
//根据id获取表单信息
var s1= document.getElementById('s1').value;
var s2 = document.getElementById('s2').value;
var name = document.getElementById('name').value;
var s3 = document.getElementById('s3').value;
var bid=document.getElementById('bid').value;
var judge = true ; //用于判断表单信息是否符合
if(s1==''){
judge = false ;
alert('请输入第三列成绩');
}else if(s2==''){
judge = false ;
alert('请输入第四列成绩');
}else if(name==''){
judge = false ;
alert('请输入姓名');
}else if(bid==''){
judge = false ;
alert('请输入编号');
}else if(s3==''){
judge = false ;
alert('请输入第五列成绩');
}else if(!reg_s.test(s1)|!reg_s.test(s2)|!reg_s.test(s3))
{
judge = false ;
alert('请输入正确成绩信息(1-100)');
}else if(s1>100|s2>100|s3>100)
{ judge = false ;
alert('请输入一百以内成绩');
}
return judge ;
}
//----判断输入框的信息是否符合要求-----
//----新增信息的插入方法-----
function insertInfo(){
//根据id获取表单信息
var arr = new Array();
arr[0] = document.getElementById('bid').value;
arr[1] = document.getElementById('name').value;
arr[2] = document.getElementById('s1').value;
arr[3] = document.getElementById('s2').value;
arr[4] = document.getElementById('s3').value;
arr[5] ="<a style='text-align:center;color:#6495ED;cursor:pointer;' onclick='updateRow(this);' id='xiu'>修改</a> <a style='text-align:center;color:chocolate;cursor:pointer;' onclick='delRow(this);'id='xiu2'>删除</a>";
var x = document.getElementById('table').insertRow(1); //获取第一行对象
for(var i=0;i<arr.length;i++){
x.insertCell(i).innerHTML = arr[i] ; //用循环把每个数据插入第一行的每一列
}
}
//----新增信息的插入方法-----
//----新增信息-----
function addInfo(){
if(judge()==true){
alert('添加成功');
insertInfo(); //执行插入
hideAddInput(); //隐藏添加信息框
}else{
alert('添加失败');
}
}
//----新增信息-----
//----根据行号修改信息-----
function updateRow(r){
row = getRow(r); //把该行号赋值给全局变量
showAddInput(); //显示修改表单
//提交按钮替换
document.getElementById('btn_add').style="display:none" ;
document.getElementById('btn_update').style="display:block-inline" ;
insertInputFromQuery(queryInfoByRow(row));
}
//----根据行号修改信息-----
//----根据行号查信息----
function queryInfoByRow(r){
var arr = new Array();
for(var m=0; m<6;m++){
arr[m] = document.getElementById('table').rows[row].cells[m].innerText;
}
return arr ; //返回该行数据
}
//----根据行号查信息----
//----把查询到的信息放入修改的表单里----
function insertInputFromQuery(arr){
document.getElementById('bid').value = arr[0];
document.getElementById('name').value = arr[1];
document.getElementById('s1').value = arr[2];
document.getElementById('s2').value = arr[3];
document.getElementById('s3').value = arr[4];
}
//----把查询到的信息放入修改的表单里----
function updateInfo(){
if(judge()==true){
alert('修改成功');
document.getElementById('table').deleteRow(row);//删除原来那行
insertInfo(); //插入修改后的值
hideAddInput(); //隐藏添加模块
}else{
alert('修改失败');
hideAddInput();
}
}
</script>
</body>
</html>
学生端:
controllor层:
@Autowired
IndexService indexService;
@RequestMapping("/skip1/{name}")
public String skip1(Model model, @PathVariable("name") String name){
System.out.println(name);
List<Grade> find= indexService.findall(name);
model.addAttribute("grades",find);
return "/studentcilent/成绩信息";
}
service层:
List<Grade> findall(String name);
@Autowired
IndexMapper indexMapper;
@Override
public List<Grade> findall(String name) {
return indexMapper.findall(name);
}
mapper层:
@Select("select * from t_grade where name=#{name}")
List<Grade> findall(@Param("name") String name);
html:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<html>
<head>
<meta charset="utf-8">
<title>成绩信息</title>
<style type="text/css">
#a1{width: 30%;height: 90px;float: left;}
#a2{width: 55%;height: 40px;float: left;text-align: right;padding-top: 35px;}
#t1{width: 100%;height: 500px;}
#table{width: 100%;text-align: center;border-color: #6495ED;border: 0px solid #6495ED;}
.table{width: 80%;float: left;}
#addinfo{width: 400px;height: 320px; text-align: left;float: left;box-shadow: 0px 0px 35px 0px #6495ED;
z-index: 3;background-color: white;position: absolute;left: 25%;top: 18%;border-radius: 27px 0px 27px 27px;}
th{border: 1px solid ghostwhite;}
th{height: 40px;background-color: #6495ED;}
td{border: 1px solid floralwhite;height: 30px;}
tr:hover{background-color: #999999;height: 37px;}
#td{border: 3px solid #000000;width: 60px;height: 40px;background-color: #6495ED;}
#add{width: 140px;height: 40px;text-decoration: none;background-color: #6495ED;border: 3px solid #000000;
color: #F0F8FF;padding:10px 10px 10px 10px;margin-right: 10%;}
#add:hover{color: #000000;}
select{height: 40px;border: 2px solid #000000;border-radius: 3px 3px 3px 3px;
margin-right: 40px;margin-left: 20px;
}
#form1{font-size: larger;padding-left: 20px;}
input{width: 85%;height: 25px;border-radius: 6px 6px 6px 6px;margin-top: 10px;}
#btn_update,#btn_ext,#btn_add{width: 120px;height: 40px;border-radius: 6px 6px 6px 6px;margin:0 auto;background-color: #6495ED;}
#btn_add{color: white;}
#btn_ext{color: white;}
#btn_add :hover{color: #999999;}
#btn_ext :hover{color: antiquewhite;}
#xiu{border-radius: 3px 3px 3px 3px;border: 1px solid bisque;padding: 5px;box-shadow: 0px 0px 30px 0px #DCDCDC;background-color: coral;}
#xiu:hover{color: #BD0A01;}
#xiu2{border-radius: 3px 3px 3px 3px;border: 1px solid bisque;padding: 5px;box-shadow: 0px 0px 30px 0px #DCDCDC;background-color:springgreen;}
#xiu2:hover{color: #BD0A01;}
#h4{width: 94%;float: left;padding-top: 15px;font-size: larger;height: 30px;padding-left: 0px;border-radius: 0px 0px 50% 50%/0px 0px 40px 40px;background-color: #6495ED;}}
#h3{width: 5%;float: right;height: 20px;padding:0;text-align: right;margin: 0 auto;}
/* #h2{width: 100%;float: left;height: 40px;border-radius: 0px 0px 50% 50%/0px 0px 30px 30px;background-color: #6495ED;} */
#span1{width: 20px;font-size: x-large;line-height: 10px;}
#h3 :hover{background-color: #DCDCDC;}
#aa2{float: left;width: 15%;}
#aa3{width: 80%;height: 320px;float: left;}
#shu{height: 320px;}
.a10 .a9{width: 70px;height: 20px;background-color: #fff;position: absolute;left:200px;bottom:0px;}
.a10{width: 100%;height: 50px;margin-top: 0px;background-color:#dcdcdc;float: left;font-size:larger;padding-left:20px;}
</style>
</head>
<body>
<div id="a1">
<h2>~~学生成绩信息~~</h2>
</div>
<div id="a3">
</div>
<div class="table" style="width:500px;height:500px;overflow-y: auto ">
<table border="1" style="text-align:center;overflow-y: auto" id="table" cellspacing="0" >
<tr>
<th>编号</th>
<th>姓名</th>
<th>课程名称</th>
<th>课程分数</th>
</tr>
<tr th:each="grade:${grades}">
<td th:text="${grade.id}"></td>
<td th:text="${grade.name}"></td>
<td th:text="${grade.subjectname}"></td>
<td th:text="${grade.subjectgrade}"></td>
</tr>
</table>
</div>
<script type="text/javascript">
var row = 0 ; //定义全局行数用于修改
var reg_name = /^((\w*\d\w*[a-z]\w*)|(\w*[a-z]\w*\d\w*))$/i; //用于判断用户名格式
var reg_chinese = /^[\u0391-\uFFE5]+$/ ; //用于判断姓名格式
var reg_pass = /^((\w*\d\w*[a-z]\w*)|(\w*[a-z]\w*\d\w*))$/i;//用于判断密码格式
var reg_s=/^[1-9]{1,2}\d?$/;
//----获取行号-----
function getRow(r){
var i=r.parentNode.parentNode.rowIndex;
return i ;
}
//----获取行号-----
//----删除某一行-----
function delRow(r){
document.getElementById('table').deleteRow(getRow(r));
}
//----删除某一行-----
//----清除添加信息框的内容-----
function cleanAddInput(){
document.getElementById('s1').value='';
document.getElementById('s2').value='';
document.getElementById('s3').value='';
document.getElementById('name').value='';
document.getElementById('bid').value='';
}
//----清除添加信息框的内容-----
//----显示添加信息框-----
function showAddInput(){
document.getElementById('addinfo').style="display:block-inline" ;
document.getElementById('btn_add').style="display:block-inline" ;
document.getElementById('btn_update').style="display:none" ;
cleanAddInput();
}
//----显示添加信息框-----
//----隐藏添加信息框-----
function hideAddInput(){
document.getElementById('addinfo').style="display:none" ;
}
//----隐藏添加信息框-----
//----判断输入框的信息是否符合要求-----
function judge(){
//根据id获取表单信息
var s1= document.getElementById('s1').value;
var s2 = document.getElementById('s2').value;
var name = document.getElementById('name').value;
var s3 = document.getElementById('s3').value;
var bid=document.getElementById('bid').value;
var judge = true ; //用于判断表单信息是否符合
if(s1==''){
judge = false ;
alert('请输入第三列成绩');
}else if(s2==''){
judge = false ;
alert('请输入第四列成绩');
}else if(name==''){
judge = false ;
alert('请输入姓名');
}else if(bid==''){
judge = false ;
alert('请输入编号');
}else if(s3==''){
judge = false ;
alert('请输入第五列成绩');
}else if(!reg_s.test(s1)|!reg_s.test(s2)|!reg_s.test(s3))
{
judge = false ;
alert('请输入正确成绩信息(1-100)');
}else if(s1>100|s2>100|s3>100)
{ judge = false ;
alert('请输入一百以内成绩');
}
return judge ;
}
//----判断输入框的信息是否符合要求-----
//----新增信息的插入方法-----
function insertInfo(){
//根据id获取表单信息
var arr = new Array();
arr[0] = document.getElementById('bid').value;
arr[1] = document.getElementById('name').value;
arr[2] = document.getElementById('s1').value;
arr[3] = document.getElementById('s2').value;
arr[4] = document.getElementById('s3').value;
arr[5] ="<a style='text-align:center;color:#6495ED;cursor:pointer;' onclick='updateRow(this);' id='xiu'>修改</a> <a style='text-align:center;color:chocolate;cursor:pointer;' onclick='delRow(this);'id='xiu2'>删除</a>";
var x = document.getElementById('table').insertRow(1); //获取第一行对象
for(var i=0;i<arr.length;i++){
x.insertCell(i).innerHTML = arr[i] ; //用循环把每个数据插入第一行的每一列
}
}
//----新增信息的插入方法-----
//----新增信息-----
function addInfo(){
if(judge()==true){
alert('添加成功');
insertInfo(); //执行插入
hideAddInput(); //隐藏添加信息框
}else{
alert('添加失败');
}
}
//----新增信息-----
//----根据行号修改信息-----
function updateRow(r){
row = getRow(r); //把该行号赋值给全局变量
showAddInput(); //显示修改表单
//提交按钮替换
document.getElementById('btn_add').style="display:none" ;
document.getElementById('btn_update').style="display:block-inline" ;
insertInputFromQuery(queryInfoByRow(row));
}
//----根据行号修改信息-----
//----根据行号查信息----
function queryInfoByRow(r){
var arr = new Array();
for(var m=0; m<6;m++){
arr[m] = document.getElementById('table').rows[row].cells[m].innerText;
}
return arr ; //返回该行数据
}
//----根据行号查信息----
//----把查询到的信息放入修改的表单里----
function insertInputFromQuery(arr){
document.getElementById('bid').value = arr[0];
document.getElementById('name').value = arr[1];
document.getElementById('s1').value = arr[2];
document.getElementById('s2').value = arr[3];
document.getElementById('s3').value = arr[4];
}
//----把查询到的信息放入修改的表单里----
function updateInfo(){
if(judge()==true){
alert('修改成功');
document.getElementById('table').deleteRow(row);//删除原来那行
insertInfo(); //插入修改后的值
hideAddInput(); //隐藏添加模块
}else{
alert('修改失败');
hideAddInput();
}
}
</script>
</body>
</html>
4.2 录入成绩用例实现描述
4.2.1 录入成绩用例实现界面

图4-3 录入成绩用例页面
4.2.2 录入成绩用例实现主要代码
java
controllor层:
@RequestMapping("/skip6")
public String skip6(Model model){
return "/teachercilent/录入成绩";
}
@RequestMapping("/skip7")
public String skip7(Model model, @RequestParam("normal") String normal,@RequestParam("exam")String exam,@RequestParam("test")String test,@RequestParam("subjectname")String subjectname,@RequestParam("name")String name){
indexteacher.inserttotal(normal,exam,test,subjectname,name);
return "/teachercilent/index";
}
service层:
void inserttotal(String normal, String exam, String test,String subjectname,String name);
@Override
public void inserttotal(String normal, String exam, String test,String subjectname,String name) {
indexteacher.inserttotal(normal,exam,test,subjectname,name);
}
mapper层:
@Insert("insertintot_insert values(null,#{name},#{subjectname},#{normal},#{test},#{exam},#{normal}+#{test}+#{exam})")
void inserttotal(@Param("normal") String normal, @Param("exam") String exam, @Param("test") String test,@Param("subjectname") String subjectname,@Param("name") String name);
html:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<html>
<head>
<meta charset="utf-8">
<title>录入成绩</title>
<style type="text/css">
#a1{width: 40%;height: 400px;box-shadow: 10px 0px 35px 10px #6495ED;margin-top: 90px;float: left;border-radius: 0px 27px 27px 0px;}
.i2{border-radius: 10px 10px 10px 10px;height: 30px;width: 230px;}
.i3{border-radius: 20px 20px 20px 20px;color: #000000;height: 40px;width: 180px;font-size: x-large;background-color: white;
border-width: 4px; }
#a2{width: 20%;height: 400px;float: left;margin-top: 90px;box-shadow: 0px 0px 35px 0px #6495ED;border-radius: 27px 0px 0px 27px;}
#a3{width: 20%;height: 400px;float: left;margin-top: 90px;}
#img1{height: 400px;}
</style>
</head>
<body>
<center>
<div id="a3">
</div>
<div id="a2">
<img src="img/书2.jpg" id="img1" align="right">
</div>
<div id="a1">
<h1>~~录入成绩~~</h1>
<hr width="70%" size="3" color="black">
<form th:href="@{/Page1/skip7}" method="get">
<br>
<input type="text" name="normal" id="zhanghao" placeholder="平时分" class="i2" onkeyup="bbbclick()" onkeypress="if(event.keyCode==13) next(this)"/><br>
<span></span><br>
<input type="password" name="exam" id="xmima" placeholder="实验分" class="i2" onkeyup="bbbclick()" onkeypress="if(event.keyCode==13) next(this)"/><br><br>
<input type="password" name="test" id="mima" placeholder="试卷分" class="i2" onkeyup="bbbclick()" onkeypress="if(event.keyCode==13) next(this)"/><br><br>
<input type="text" name="subjectname" id="zhanghao" placeholder="科目名" class="i2" onkeyup="bbbclick()" onkeypress="if(event.keyCode==13) next(this)"/><br>
<input type="text" name="name" id="zhanghao" placeholder="姓名" class="i2" onkeyup="bbbclick()" onkeypress="if(event.keyCode==13) next(this)"/><br>
</form><br><button type="submit" class="i3" value="" onclick="aaaclick()" id="i3"/>提交</button>
</div>
</center>
<script type="text/javascript">
function aaaclick()
{
var l1=document.getElementById("zhanghao").value;
var password=document.getElementById("mima").value;
var repassword=document.getElementById("xmima").value;
document.getElementById("i3").disabled=true;
if(l1=="")
{alert("账号为空");document.getElementById("i3").disabled=true;}
if(password=="")
{alert("密码为空");document.getElementById("i3").disabled=true;}
else if(repassword==password)
{alert("修改成功!");}
else
{alert("账号或密码不正确");}
}
function bbbclick()
{
var l1=document.getElementById("zhanghao").value;
var password=document.getElementById("mima").value;
if(l1!==""&&password!="")
{
document.getElementById("i3").disabled=false;
}
}
function next(t)
{
var sum=document.getElementsByTagName("input");
for(var i=0;i<sum.length;i++)
{
if(i==(sum.length-1))
{sum[0].focus();break;}
else if(t==sum[i])
{
sum[i+1].focus();break;
}
}
}
</script>
</body>
</html>
4.3 计算学分用例实现描述
4.3.1 计算学分用例实现界面

图4-4 计算学分用例页面
4.3.2 计算学分用例实现主要代码
java
controllor层:
@RequestMapping("/skip2/{name}")
public String skip2(Model model,@PathVariable("name") String name){
List<Score> findscore=indexService.findscore(name);
model.addAttribute("scores",findscore);
Integer count = indexService.findcount(name);
model.addAttribute("counts",count);
return "/studentcilent/学分信息";
}
service层:
List<Score> findscore(String name);
@Override
public List<Score> findscore(String name) {
return indexMapper.findscore(name);
}
mapper层:
@Select("select * from t_score where name=#{name}")
List<Score> findscore(@Param("name") String name);
html:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<html>
<head>
<meta charset="utf-8">
<title>成绩信息</title>
<style type="text/css">
#a1{width: 30%;height: 90px;float: left;}
#a2{width: 55%;height: 40px;float: left;text-align: right;padding-top: 35px;}
#t1{width: 100%;height: 500px;}
#table{width: 100%;text-align: center;border-color: #6495ED;border: 0px solid #6495ED;}
.table{width: 80%;float: left;}
#addinfo{width: 400px;height: 320px; text-align: left;float: left;box-shadow: 0px 0px 35px 0px #6495ED;
z-index: 3;background-color: white;position: absolute;left: 25%;top: 18%;border-radius: 27px 0px 27px 27px;}
th{border: 1px solid ghostwhite;}
th{height: 40px;background-color: #6495ED;}
td{border: 1px solid floralwhite;height: 30px;}
tr:hover{background-color: #999999;height: 37px;}
#td{border: 3px solid #000000;width: 60px;height: 40px;background-color: #6495ED;}
#add{width: 140px;height: 40px;text-decoration: none;background-color: #6495ED;border: 3px solid #000000;
color: #F0F8FF;padding:10px 10px 10px 10px;margin-right: 10%;}
#add:hover{color: #000000;}
select{height: 40px;border: 2px solid #000000;border-radius: 3px 3px 3px 3px;
margin-right: 40px;margin-left: 20px;
}
#form1{font-size: larger;padding-left: 20px;}
input{width: 85%;height: 25px;border-radius: 6px 6px 6px 6px;margin-top: 10px;}
#btn_update,#btn_ext,#btn_add{width: 120px;height: 40px;border-radius: 6px 6px 6px 6px;margin:0 auto;background-color: #6495ED;}
#btn_add{color: white;}
#btn_ext{color: white;}
#btn_add :hover{color: #999999;}
#btn_ext :hover{color: antiquewhite;}
#xiu{border-radius: 3px 3px 3px 3px;border: 1px solid bisque;padding: 5px;box-shadow: 0px 0px 30px 0px #DCDCDC;background-color: coral;}
#xiu:hover{color: #BD0A01;}
#xiu2{border-radius: 3px 3px 3px 3px;border: 1px solid bisque;padding: 5px;box-shadow: 0px 0px 30px 0px #DCDCDC;background-color:springgreen;}
#xiu2:hover{color: #BD0A01;}
#h4{width: 94%;float: left;padding-top: 15px;font-size: larger;height: 30px;padding-left: 0px;border-radius: 0px 0px 50% 50%/0px 0px 40px 40px;background-color: #6495ED;}}
#h3{width: 5%;float: right;height: 20px;padding:0;text-align: right;margin: 0 auto;}
/* #h2{width: 100%;float: left;height: 40px;border-radius: 0px 0px 50% 50%/0px 0px 30px 30px;background-color: #6495ED;} */
#span1{width: 20px;font-size: x-large;line-height: 10px;}
#h3 :hover{background-color: #DCDCDC;}
#aa2{float: left;width: 15%;}
#aa3{width: 80%;height: 320px;float: left;}
#shu{height: 320px;}
.a10 .a9{width: 70px;height: 20px;background-color: #fff;position: absolute;left:200px;bottom:0px;}
.a10{width: 100%;height: 50px;margin-top: 0px;background-color:#dcdcdc;float: left;font-size:larger;padding-left:20px;}
</style>
</head>
<body>
<div id="a1">
<h2>~~学生学分信息~~</h2>
</div>
<div id="a3">
<h3 th:text="'学生总学分为:'+${counts}"></h3>
</div>
<div class="table" style="width:500px;height:500px;overflow-y: auto">
<table border="1" style="text-align:center" id="table" cellspacing="0">
<tr>
<th>编号</th>
<th>姓名</th>
<th>课程名称</th>
<th>课程学分</th>
</tr>
<tr th:each="score:${scores}">
<td th:text="${score.id}"></td>
<td th:text="${score.name}"></td>
<td th:text="${score.subjectname}"></td>
<td th:text="${score.subjectscore}"></td>
</tr>
</table>
</div>
<script type="text/javascript">
var row = 0 ; //定义全局行数用于修改
var reg_name = /^((\w*\d\w*[a-z]\w*)|(\w*[a-z]\w*\d\w*))$/i; //用于判断用户名格式
var reg_chinese = /^[\u0391-\uFFE5]+$/ ; //用于判断姓名格式
var reg_pass = /^((\w*\d\w*[a-z]\w*)|(\w*[a-z]\w*\d\w*))$/i;//用于判断密码格式
var reg_s=/^[1-9]{1,2}\d?$/;
//----获取行号-----
function getRow(r){
var i=r.parentNode.parentNode.rowIndex;
return i ;
}
//----获取行号-----
//----删除某一行-----
function delRow(r){
document.getElementById('table').deleteRow(getRow(r));
}
//----删除某一行-----
//----清除添加信息框的内容-----
function cleanAddInput(){
document.getElementById('s1').value='';
document.getElementById('s2').value='';
document.getElementById('s3').value='';
document.getElementById('name').value='';
document.getElementById('bid').value='';
}
//----清除添加信息框的内容-----
//----显示添加信息框-----
function showAddInput(){
document.getElementById('addinfo').style="display:block-inline" ;
document.getElementById('btn_add').style="display:block-inline" ;
document.getElementById('btn_update').style="display:none" ;
cleanAddInput();
}
//----显示添加信息框-----
//----隐藏添加信息框-----
function hideAddInput(){
document.getElementById('addinfo').style="display:none" ;
}
//----隐藏添加信息框-----
//----判断输入框的信息是否符合要求-----
function judge(){
//根据id获取表单信息
var s1= document.getElementById('s1').value;
var s2 = document.getElementById('s2').value;
var name = document.getElementById('name').value;
var s3 = document.getElementById('s3').value;
var bid=document.getElementById('bid').value;
var judge = true ; //用于判断表单信息是否符合
if(s1==''){
judge = false ;
alert('请输入第三列成绩');
}else if(s2==''){
judge = false ;
alert('请输入第四列成绩');
}else if(name==''){
judge = false ;
alert('请输入姓名');
}else if(bid==''){
judge = false ;
alert('请输入编号');
}else if(s3==''){
judge = false ;
alert('请输入第五列成绩');
}else if(!reg_s.test(s1)|!reg_s.test(s2)|!reg_s.test(s3))
{
judge = false ;
alert('请输入正确成绩信息(1-100)');
}else if(s1>100|s2>100|s3>100)
{ judge = false ;
alert('请输入一百以内成绩');
}
return judge ;
}
//----判断输入框的信息是否符合要求-----
//----新增信息的插入方法-----
function insertInfo(){
//根据id获取表单信息
var arr = new Array();
arr[0] = document.getElementById('bid').value;
arr[1] = document.getElementById('name').value;
arr[2] = document.getElementById('s1').value;
arr[3] = document.getElementById('s2').value;
arr[4] = document.getElementById('s3').value;
arr[5] ="<a style='text-align:center;color:#6495ED;cursor:pointer;' onclick='updateRow(this);' id='xiu'>修改</a> <a style='text-align:center;color:chocolate;cursor:pointer;' onclick='delRow(this);'id='xiu2'>删除</a>";
var x = document.getElementById('table').insertRow(1); //获取第一行对象
for(var i=0;i<arr.length;i++){
x.insertCell(i).innerHTML = arr[i] ; //用循环把每个数据插入第一行的每一列
}
}
//----新增信息的插入方法-----
//----新增信息-----
function addInfo(){
if(judge()==true){
alert('添加成功');
insertInfo(); //执行插入
hideAddInput(); //隐藏添加信息框
}else{
alert('添加失败');
}
}
//----新增信息-----
//----根据行号修改信息-----
function updateRow(r){
row = getRow(r); //把该行号赋值给全局变量
showAddInput(); //显示修改表单
//提交按钮替换
document.getElementById('btn_add').style="display:none" ;
document.getElementById('btn_update').style="display:block-inline" ;
insertInputFromQuery(queryInfoByRow(row));
}
//----根据行号修改信息-----
//----根据行号查信息----
function queryInfoByRow(r){
var arr = new Array();
for(var m=0; m<6;m++){
arr[m] = document.getElementById('table').rows[row].cells[m].innerText;
}
return arr ; //返回该行数据
}
//----根据行号查信息----
//----把查询到的信息放入修改的表单里----
function insertInputFromQuery(arr){
document.getElementById('bid').value = arr[0];
document.getElementById('name').value = arr[1];
document.getElementById('s1').value = arr[2];
document.getElementById('s2').value = arr[3];
document.getElementById('s3').value = arr[4];
}
//----把查询到的信息放入修改的表单里----
function updateInfo(){
if(judge()==true){
alert('修改成功');
document.getElementById('table').deleteRow(row);//删除原来那行
insertInfo(); //插入修改后的值
hideAddInput(); //隐藏添加模块
}else{
alert('修改失败');
hideAddInput();
}
}
</script>
</body>
</html>
4.4 查询试卷用例实现描述
4.4.1 查询试卷用例实现界面


图4-5 查询试卷用例页面
4.4.2 查询试卷用例实现主要代码
java
教师端:
controller层:
@RequestMapping("/skip6")
public String skip6(Model model, @RequestParam("number") Integer number, @RequestParam("name") String name, @RequestParam("sex") String sex){
String address=indexService.findaddress(number,name,sex);
if (address!=null){
model.addAttribute("address",address);
return "/studentcilent/show";
}
return "/studentcilent/查询试卷";
}
service层:
String findaddress(Integer number, String name, String sex);
@Override
public String findaddress(Integer number, String name, String sex) {
return indexMapper.findadress(number,name,sex);
}
mapper层:
@Select("Select address FROM t_picture WHERE name=#{name} and sex=#{sex} and number=#{number}")
String findadress(@Param("number") Integer number, @Param("name") String name, @Param("sex") String sex);
查询试卷html:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<html>
<head>
<meta charset="utf-8" http-equiv="Page-Enter" content="RevealTrans(duration=5,Transtionv=2)">
<title></title>
<style type="text/css">
#a1{width: 40%;height: 360px;float: left;}
#a2{width: 60%;height: 360px;float: left;}
#a3{width: 40%;height: 100px;float: left;text-align: center;}
label{font-size: x-large;}
#i1{width: 210px;height: 30px; border-radius: 7px 7px 7px 7px;}
#i2{zoom: 2;}
select{height: 40px;border: 2px solid deeppink;border-radius: 3px 3px 3px 3px;
}
option{height: 20px;}
#i3{width: 180px;background-color: #6495ED;height: 50px;margin-left: 10%;font-size: x-large;float: left;}
</style>
</head>
<body>
<h2>~~查询试卷~~</h2>
<form th:action="@{/Page/skip6}" method="get">
<div id="a1">
<label>学号</label><br> <br>
<input type="text" name="number" id="i1" value="" /><br><br>
<label>姓名</label><br><br>
<input type="text" name="name" id="i1" value="" /><br><br>
<label>性别</label><br><br>
<input type="radio" name="sex" id="i2" value="男" /><font size="4" color="">男</font>
<input type="radio" name="sex" id="i2" value="女" /><font size="4" color="">女</font>
</div>
<div id="a2">
</div><br>
<input type="submit" value="查询" id="i3" />
</form>
</body>
</html>
学生端:
controllor层:
@RequestMapping("/skip6")
public String skip6(Model model, @RequestParam("number") Integer number, @RequestParam("name") String name, @RequestParam("sex") String sex){
String address=indexService.findaddress(number,name,sex);
if (address!=null){
model.addAttribute("address",address);
return "/studentcilent/show";
}
return "/studentcilent/查询试卷";
}
service层:
String findaddress(Integer number, String name, String sex);
@Override
public String findaddress(Integer number, String name, String sex) {
return indexMapper.findadress(number,name,sex);
}
mapper层:
@Select("Select address FROM t_picture WHERE name=#{name} and sex=#{sex} and number=#{number}")
String findadress(@Param("number") Integer number, @Param("name") String name, @Param("sex") String sex);
html:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<html>
<head>
<meta charset="utf-8" http-equiv="Page-Enter" content="RevealTrans(duration=5,Transtionv=2)">
<title></title>
<style type="text/css">
#a1{width: 40%;height: 360px;float: left;}
#a2{width: 60%;height: 360px;float: left;}
#a3{width: 40%;height: 100px;float: left;text-align: center;}
label{font-size: x-large;}
#i1{width: 210px;height: 30px; border-radius: 7px 7px 7px 7px;}
#i2{zoom: 2;}
select{height: 40px;border: 2px solid deeppink;border-radius: 3px 3px 3px 3px;
}
option{height: 20px;}
#i3{width: 180px;background-color: #6495ED;height: 50px;margin-left: 10%;font-size: x-large;float: left;}
</style>
</head>
<body>
<h2>~~查询试卷~~</h2>
<form th:action="@{/Page/skip6}" method="get">
<div id="a1">
<label>学号</label><br> <br>
<input type="text" name="number" id="i1" value="" /><br><br>
<label>姓名</label><br><br>
<input type="text" name="name" id="i1" value="" /><br><br>
<label>性别</label><br><br>
<input type="radio" name="sex" id="i2" value="男" /><font size="4" color="">男</font>
<input type="radio" name="sex" id="i2" value="女" /><font size="4" color="">女</font>
</div>
<div id="a2">
</div><br>
<input type="submit" value="查询" id="i3" />
</form>
</body>
</html>
4.5 统计成绩用例实现描述
4.5.1 统计成绩用例实现界面

图4-6 统计成绩用例页面
4.5.2 统计成绩用例实现主要代码
java
controllor层:
@RequestMapping("/skip4")
public String skip4(Model model){
Integer failcount= indexteacher.failcount();
model.addAttribute("failcount",failcount);
Integer goodcount=indexteacher.goodcount();
System.out.println(goodcount);
model.addAttribute("goodcount",goodcount);
Integer bothcount=indexteacher.bothcount();
model.addAttribute("bothcount",bothcount);
Integer total= indexteacher.total();
double good=((goodcount*1.0)/total)*100;
model.addAttribute("good",good);
double fail=((failcount*1.0)/total)*100;
model.addAttribute("failbai",fail);
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd");
Date date1=new Date(System.currentTimeMillis());
String format = simpleDateFormat.format(date1);
model.addAttribute("time",format);
return "/teachercilent/首页";
}
service层:
Integer failcount();
Integer goodcount();
Integer bothcount();
Integer total();
@Override
public Integer failcount() {
return indexteacher.failcount();
}
@Override
public Integer goodcount() {
return indexteacher.goodcount();
}
@Override
public Integer bothcount() {
return indexteacher.bothcount();
}
@Override
public Integer total() {
return indexteacher.total();
}
mapper层:
@Select("SELECT COUNT(DISTINCT(t_grade.`name`)) FROM t_grade WHERE subjectgrade<=60 ")
Integer failcount();
@Select("SELECT COUNT(DISTINCT(t_grade.`name`)) FROM t_grade WHERE (SELECT COUNT(t_grade.subjectgrade) FROM t_grade WHERE t_grade.subjectgrade>60)=(SELECT COUNT(t_grade.subjectgrade) FROM t_grade) AND (SELECT COUNT(*) FROM t_grade WHERE t_grade.subjectgrade>=90)>=7")
Integer goodcount();
@Select("SELECT COUNT(DISTINCT(t_grade.`name`)) FROM t_grade WHERE (SELECT COUNT(t_grade.subjectgrade) FROM t_grade WHERE t_grade.subjectgrade>=60)=(SELECT COUNT(t_grade.subjectgrade) FROM t_grade)")
Integer bothcount();
@Select("SELECT COUNT(DISTINCT(t_grade.`name`)) FROM t_grade")
Integer total();
@Select("SELECT uid,t_grade.`name`,SUM(t_grade.subjectgrade) from t_grade GROUP BY t_grade.`name` ORDER BY SUM(t_grade.subjectgrade) DESC")
html:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<html>
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
#a1{width: 230px;height: 120px;border-radius: 3px 3px 3px 3px;box-shadow: 0px 0px 35px 0px #dcdcdc;float: left;
margin-left: 1%;margin-top: 20px;padding: 10px;}
#a3{width: 23%;height: 120px;border-radius: 3px 3px 3px 3px;box-shadow: 0px 0px 35px 0px #dcdcdc;float: left;
margin-left: 1%;margin-top: 20px;background-color: #6495ED;padding: 10px;}
#a2{width: 50%;height: 410px;border-radius: 23px 23px 23px 23px;box-shadow: 0px 0px 35px 0px #dcdcdc;float: right;
margin-top: 15px;background-color: #6495ED;}
* {box-sizing:border-box;}
ul {list-style-type: none;}
body {font-family: Verdana,sans-serif;}
.month {
padding: 50px 25px;
height: 150px;
width: 100%;
background: #6495ED;
border-radius: 23px 23px 0px 0px;
}
.month ul {
margin: 0;
padding: 0;
}
.month ul li {
color: white;
font-size: 20px;
text-transform: uppercase;
letter-spacing: 3px;
}
.month .prev {
float: left;
padding-top: 10px;
}
.month .next {
float: right;
padding-top: 10px;
}
.weekdays {
height: 60px;
margin: 0;
padding: 10px 0;
line-height: 40px;
background-color: #ddd;
}
.weekdays li {
display: inline-block;
width: 13%;
color: #666;
text-align: center;
}
.days {
padding: 10px 0;
height: 200px;
padding-top: 20px;
background: #eee;
margin: 0;
}
.days li {
list-style-type: none;
display: inline-block;
width: 13%;
text-align: center;
margin-bottom: 5px;
font-size:16px;
color: #777;
}
.days li .active {
padding: 5px;
background: #6495ED;
color: white !important
}
/* 添加不同尺寸屏幕的样式 */
@media screen and (max-width:720px) {
.weekdays li, .days li {width: 13.1%;}
}
@media screen and (max-width: 420px) {
.weekdays li, .days li {width: 12.5%;}
.days li .active {padding: 2px;}
}
@media screen and (max-width: 290px) {
.weekdays li, .days li {width: 12.2%;}
}
#i1{height: 220px;}
#btoom{width: 100%;height: 40px;margin-top: 20px;font-size: 26px;color: white;}
#btoom1{width: 100%;height: 40px;margin-top: 40px;font-size: 26px;color: #6495ED;}
#biao{float: right;font-size: 26px;}
</style>
</head>
<body>
<h1><font style="color: #666;">~~统计成绩~~</font></h1>
<div id="a3">
<font size="4" color="white">挂科人数(挂1科以上的人数)</font>
<hr color="#666" size="2" width="30%" align="left">
<center>
<div id="btoom">
<b th:text="'挂科人数为'+${failcount}+'人'"></b>
<div id="biao">
<b></b>
</div>
</div></center>
</div>
<div id="a3">
<font size="4" color="white">优秀人数(科目全部及格而且科目90分有7科以上)</font>
<hr color="#666" size="2" width="30%" align="left">
<center>
<div id="btoom">
<b th:text="'优秀人数为'+${goodcount}+'人'"></b>
<div id="biao">
<b></b>
</div>
</div></center>
</div>
<div id="a2">
<div class="month">
<center>
<ul>
<li style="text-align:center">
<span style="font-size: 50px;" th:text="'当前的日期为:'+${time}"></span><br>
</li>
</ul></center>
</div>
<div id="a3">
<font size="4" color="white">全部科目及格的人数为</font>
<hr color="#666" size="2" width="30%" align="left">
<center>
<div id="btoom">
<b th:text="${bothcount}+'人'"></b>
<div id="biao">
<b></b>
</div>
</div></center>
</div>
<div id="a3">
<font size="4" color="white">优秀率</font>
<hr color="#666" size="2" width="30%" align="left">
<center>
<div id="btoom">
<b th:text="${good}+'%'"></b><div id="biao">
<b></b>
</div>
</div></center>
</div>
<div id="a3">
<font size="4" color="white">挂科率</font>
<hr color="#666" size="2" width="30%" align="left">
<center>
<div id="btoom">
<b th:text="${failbai}+'%'"></b><div id="biao">
<b></b>
</div>
</div></center>
</div>
</body>
</html>
4.6 查询挂科科目用例实现描述
4.6.1 查询挂科科目用例实现界面
- 教师端

图4-7 查询挂科科目用例页面
- 学生端

图4-8 查询挂科科目用例页面
4.6.2 查询挂科科目用例实现主要代码
java
教师端:
controllor层:
@RequestMapping("/skip3")
public String skip3(Model model){
List<Grade> fail=indexteacher.findfail();
model.addAttribute("gua",fail);
return "/teachercilent/挂科统计";
}
service层:
List<Grade> findfail();
@Override
public List<Grade> findfail() {
return indexteacher.findfail();
}
mapper层:
@Select("select * from t_grade where subjectgrade<60 ")
List<Grade> findfail();
html:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<html>
<head>
<meta charset="utf-8">
<title>课程信息</title>
<style type="text/css">
#a1{width: 50%;height: 90px;float: left;}
#a3{width: 40%;height: 50px;float: left;text-align: right;}
#a2{width: 50%;height: 40px;float: left;text-align: left; margin-bottom: 10px;}
#t1{width: 100%;height: 500px;}
#tab1{width: 60%;text-align: center;border-color: #6495ED;border: 0px solid #6495ED;}
th{border: 1px solid aliceblue;}
th{width: 230px;height: 40px;background-color: #6495ED;}
td{border: 1px solid aliceblue;height: 30px;}
tr:hover{background-color: #999999;height: 32px;}
#td{border: 3px solid #000000;width: 60px;height: 40px;background-color: #6495ED;}
select{height: 40px;border: 2px solid #6495ED;border-radius: 3px 3px 3px 3px;
margin-right: 60px;margin-left: 20px;
}
</style>
</head>
<body>
<div id="a1">
<h2>~~挂科科目信息~~</h2>
</div>
<div id="a3">
</div>
<div id="a2">
</div>
<div id="t1">
<table border="0" cellspacing="0" cellpadding="" id="tab1">
<tr>
<th>挂科科目编号</th>
<th>姓名</th>
<th>挂科课程名称</th>
<th>挂科课程分数</th>
</tr>
<tr th:each="fails:${gua}">
<td th:text="${fails.id}"></td>
<td th:text="${fails.name}"></td>
<td th:text="${fails.subjectname}"></td>
<td th:text="${fails.subjectgrade}"></td>
<!-- <td><a style="color:#6495ED;cursor: pointer;" onclick="updateRow(this);" id="xiu">修改<a> <a style="color:chocolate;cursor:pointer;" onclick="delRow(this);" id="xiu2">删除</a></td>-->
</tr>
</table>
</div>
</body>
</html>
学生端:
controllor层:
@RequestMapping("/skip3/{name}")
public String skip3(Model model,@PathVariable("name") String name){
List<Grade> fail=indexService.findfail(name);
model.addAttribute("fails",fail);
return "/studentcilent/挂科统计";
}
service层:
List<Grade> findfail(String name);
@Override
public List<Grade> findfail(String name) {
return indexMapper.findfail(name);
}
mapper层:
@Select("select * from t_grade where subjectgrade<60 and name=#{name}")
List<Grade> findfail(@Param("name") String name);
html:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<html>
<head>
<meta charset="utf-8">
<title>课程信息</title>
<style type="text/css">
#a1{width: 50%;height: 90px;float: left;}
#a3{width: 40%;height: 50px;float: left;text-align: right;}
#a2{width: 50%;height: 40px;float: left;text-align: left; margin-bottom: 10px;}
#t1{width: 100%;height: 500px;}
#tab1{width: 60%;text-align: center;border-color: #6495ED;border: 0px solid #6495ED;}
th{border: 1px solid aliceblue;}
th{width: 230px;height: 40px;background-color: #6495ED;}
td{border: 1px solid aliceblue;height: 30px;}
tr:hover{background-color: #999999;height: 32px;}
#td{border: 3px solid #000000;width: 60px;height: 40px;background-color: #6495ED;}
select{height: 40px;border: 2px solid #6495ED;border-radius: 3px 3px 3px 3px;
margin-right: 60px;margin-left: 20px;
}
</style>
</head>
<body>
<div id="a1">
<h2>~~挂科科目信息~~</h2>
</div>
<div id="a3">
</div>
<div id="a2">
</div>
<div id="t1">
<table border="0" cellspacing="0" cellpadding="" id="tab1">
<tr>
<th>挂科科目编号</th>
<th>姓名</th>
<th>挂科课程名称</th>
<th>挂科课程分数</th>
</tr>
<tr th:each="fail:${fails}">
<td th:text="${fail.id}"></td>
<td th:text="${fail.name}"></td>
<td th:text="${fail.subjectname}"></td>
<td th:text="${fail.subjectgrade}"></td>
<!-- <td><a style="color:#6495ED;cursor: pointer;" onclick="updateRow(this);" id="xiu">修改<a> <a style="color:chocolate;cursor:pointer;" onclick="delRow(this);" id="xiu2">删除</a></td>-->
</tr>
</table>
</div>
</body>
</html>
4.7 学业预警用例实现描述
4.7.1 学业预警用例实现界面

图4-9 学业预警用例页面
4.7.2 学业预警用例实现主要代码
java
controllor层:
@RequestMapping("/skip4/{name}")
public String skip4(Model model,@PathVariable("name") String name){
Integer failcount= indexService.findfailcount(name);
model.addAttribute("counts",failcount);
Integer total=indexService.findtotalcount(name);
model.addAttribute("total",total);
double gua=(failcount*1.0/total)*100;
model.addAttribute("gua",gua);
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd");
Date date1=new Date(System.currentTimeMillis());
String format = simpleDateFormat.format(date1);
model.addAttribute("time",format);
if (failcount<=1){
model.addAttribute("chendu","你的挂科程度较轻");
model.addAttribute("pingjia","别灰心,你还有机会");
}
if (failcount<6&&1<failcount){
model.addAttribute("chendu","你的挂科较严重");
model.addAttribute("pingjia","你快无了");
}
if (failcount>=6){
model.addAttribute("chendu","你的挂科非常严重");
model.addAttribute("pingjia","准备回家吧");
}
return "/studentcilent/首页";
}
service层:
Integer findcount(String name);
Integer findfailcount(String name);
Integer findtotalcount(String name);
@Override
public Integer findcount(String name) {
return indexMapper.findcount(name);
}
@Override
public Integer findfailcount(String name) {
return indexMapper.findfailcount(name);
}
@Override
public Integer findtotalcount(String name) {
return indexMapper.findtotalcount(name);
}
mapper层:
@Select("SELECT SUM(t_score.subjectscore) FROM t_score where name=#{name}")
Integer findcount(@Param("name") String name);
@Select("select COUNT(*) from t_grade where subjectgrade<60 and name=#{name}")
Integer findfailcount(@Param("name") String name);
@Select("SELECT COUNT(*) FROM t_grade where name=#{name}")
Integer findtotalcount(@Param("name") String name);
html:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<html>
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
#a1{width: 230px;height: 120px;border-radius: 3px 3px 3px 3px;box-shadow: 0px 0px 35px 0px #dcdcdc;float: left;
margin-left: 1%;margin-top: 20px;padding: 10px;}
#a3{width: 23%;height: 120px;border-radius: 3px 3px 3px 3px;box-shadow: 0px 0px 35px 0px #dcdcdc;float: left;
margin-left: 1%;margin-top: 20px;background-color: #6495ED;padding: 10px;}
#a2{width: 50%;height: 410px;border-radius: 23px 23px 23px 23px;box-shadow: 0px 0px 35px 0px #dcdcdc;float: right;
margin-top: 15px;background-color: #6495ED;}
* {box-sizing:border-box;}
ul {list-style-type: none;}
body {font-family: Verdana,sans-serif;}
.month {
padding: 50px 25px;
height: 150px;
width: 100%;
background: #6495ED;
border-radius: 23px 23px 0px 0px;
}
.month ul {
margin: 0;
padding: 0;
}
.month ul li {
color: white;
font-size: 20px;
text-transform: uppercase;
letter-spacing: 3px;
}
.month .prev {
float: left;
padding-top: 10px;
}
.month .next {
float: right;
padding-top: 10px;
}
.weekdays {
height: 60px;
margin: 0;
padding: 10px 0;
line-height: 40px;
background-color: #ddd;
}
.weekdays li {
display: inline-block;
width: 13%;
color: #666;
text-align: center;
}
.days {
padding: 10px 0;
height: 200px;
padding-top: 20px;
background: #eee;
margin: 0;
}
.days li {
list-style-type: none;
display: inline-block;
width: 13%;
text-align: center;
margin-bottom: 5px;
font-size:16px;
color: #777;
}
.days li .active {
padding: 5px;
background: #6495ED;
color: white !important
}
/* 添加不同尺寸屏幕的样式 */
@media screen and (max-width:720px) {
.weekdays li, .days li {width: 13.1%;}
}
@media screen and (max-width: 420px) {
.weekdays li, .days li {width: 12.5%;}
.days li .active {padding: 2px;}
}
@media screen and (max-width: 290px) {
.weekdays li, .days li {width: 12.2%;}
}
#i1{height: 220px;}
#btoom{width: 100%;height: 40px;margin-top: 40px;font-size: 26px;color: white;}
#btoom1{width: 100%;height: 40px;margin-top: 40px;font-size: 26px;color: #6495ED;}
#biao{float: right;font-size: 26px;}
</style>
</head>
<body>
<h1><font style="color: #666;">~~学业预警~~</font></h1>
<div id="a3">
<font size="4" color="white">挂科科目数警告</font>
<hr color="#666" size="2" width="30%" align="left">
<center>
<div id="btoom">
<b th:text="'你已挂'+${counts}+'科,请注意查收'"></b>
<div id="biao">
<b></b>
</div>
</div></center>
</div>
<div id="a1">
<font size="4" color="#6495ED">挂科率</font>
<hr color="#666" size="2" width="30%" align="left">
<center>
<div id="btoom1">
<b th:text="${gua}+'%'"></b>
<div id="biao">
<b></b>
</div>
</div></center>
</div>
<div id="a2">
<div class="month">
<center>
<ul>
<li style="text-align:center">
<span style="font-size: 50px;" th:text="'当前的日期为:'+${time}"></span><br>
</li>
</ul></center>
</div>
</div>
<div id="a3">
<font size="4" color="white">挂科预警程度</font>
<hr color="#666" size="2" width="30%" align="left">
<center>
<div id="btoom">
<b th:text="${chendu}"></b>
<div id="biao">
<b></b>
</div>
</div></center>
</div>
<div id="a3">
<font size="4" color="white">友情提示</font>
<hr color="#666" size="2" width="30%" align="left">
<center>
<div id="btoom">
<b th:text="${pingjia}"></b><div id="biao">
<b></b>
</div>
</div></center>
</div>
</body>
</html>
4.8 排名成绩用例实现描述
4.8.1 排名成绩用例实现界面

图4-10 排名成绩用例页面
4.8.2 排名成绩用例实现主要代码
java
controllor层:
@RequestMapping("/skip2")
public String skip2(Model model){
List<Grade> paimin= indexteacher.paimin();
model.addAttribute("paimin",paimin);
List<Integer> total=indexteacher.totalgrade();
Collections.reverse(total);
model.addAttribute("sum",total);
return "/teachercilent/排名成绩";
}
service层:
List<Grade> paimin();
@Override
public List<Grade> paimin() {
return indexteacher.paimin();
}
mapper层:
@Select("SELECT uid,t_grade.`name`,SUM(t_grade.subjectgrade) from t_grade GROUP BY t_grade.`name` ORDER BY SUM(t_grade.subjectgrade) DESC")
List<Grade> paimin();
html:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<html>
<head>
<meta charset="utf-8">
<title>课程信息</title>
<style type="text/css">
#a1{width: 50%;height: 90px;float: left;}
#a3{width: 40%;height: 50px;float: left;text-align: right;}
#a2{width: 50%;height: 40px;float: left;text-align: left; margin-bottom: 10px;}
#t1{width: 100%;height: 500px;}
#tab1{width: 60%;text-align: center;border-color: #6495ED;border: 0px solid #6495ED;}
th{border: 1px solid aliceblue;}
th{width: 230px;height: 40px;background-color: #6495ED;}
td{border: 1px solid aliceblue;height: 30px;}
tr:hover{background-color: #999999;height: 32px;}
#td{border: 3px solid #000000;width: 60px;height: 40px;background-color: #6495ED;}
select{height: 40px;border: 2px solid #6495ED;border-radius: 3px 3px 3px 3px;
margin-right: 60px;margin-left: 20px;
}
</style>
</head>
<body>
<div id="a1">
<h2>~~挂科科目信息~~</h2>
</div>
<div id="a3">
</div>
<div id="a2">
</div>
<div id="t1">
<table border="0" cellspacing="0" cellpadding="" id="tab1">
<tr>
<th>姓名编号</th>
<th>姓名</th>
<th>科目总分数</th>
</tr>
<tr th:each="fail:${paimin}" >
<td th:text="${fail.uid}"></td>
<td th:text="${fail.name}"></td>
<td th:text="${sum.get(fail.uid)}"></td>
</tr>
</table>
</div>
</body>
</html>
4.9 小结
在做这个系统之前,我连基本的连接数据库,配置文件,数据库查询语句等这些东西都不熟练。现在对于数据库的增删改查操作比较熟练了,对多次进行数据库的链接,增删改查操作中不断总结规律。纵观此学生信息管理系统的整体概况,目前,自我认为设计良好,相关功能都能够实现,功能强大,条理清晰,界面可观性比较好。并且特色在于,所设计的表单都在一个表单系统桌面中运行,比较符合系统的观念。在系统设计的过程中,学习数据库要细心和有耐性,并且要不断地从外界学习更多的技术才能设计出一套完美的系统。
实验总结(一)
略。
实验总结(二)
略。
若觉得有帮助,欢迎点赞关注,一起成长进步~
声明:本文仅供学习交流,禁作商用;禁篡改、歪曲及有偿传播,引用需标明来源。侵权必究。