如何使用ssm实现学生信息管理系统
@TOC
ssm075学生信息管理系统+jsp
第1章 绪论
1.1选题动因
目前网络技术和软件技术均已形成完善的基础理论体系,在市场中出现了众多经过技术开发与创新的软件产品。这些软件产品被广泛应用于多个领域涵盖生活与工作等多个领域。
随着个人电脑及笔记本电脑的普及推广,并伴随着计算机硬件设施的不断升级和完善。这些设备的整体性能得到了显著提升,并且能够运行处理的各种软件数量也随之增加。
在处理海量的学生信息数据时会面临诸多挑战。
首先耗时较长其次容易出现错误并且最后检索数据耗时费力。
针对上述存在的问题与挑战在这一背景下有必要建立学生信息管理系统来规范流程以确保管理工作的系统化和程序化同时有效运用的学生信息管理系统有助于管理人员能够更为高效准确地处理各项事务。
1.2目的和意义
学生信息管理系统能够对学生信息实施统一管理和规范性处理,并彻底避免传统管理模式存在的不足之处。它是一款基于软件开发技术构建的应用系统,在数据处理效率上有显著提升作用。无论是针对数据添加、数据维护与统计以及数据查询等操作需求而言,在处理速度方面都能够体现出显著优势。因此,在实际应用中选择学生信息管理系统是实现信息化管理升级的理想方案之一:它能够保证信息处理的便捷化需求得到满足,并且能够建立一套完整的操作规范流程;无论是对于事务性的日常管理还是日常业务运作而言,在很大程度上都会使工作变得更加简便:管理人员只需掌握基本操作方法即可完成日常事务性工作而不必像过去那样面临繁重的手工处理任务:尽管该系统集成了较为完善的功能模块但在实际应用中仍需管理人员通过业余时间加强自身的专业能力以更好地发挥系统的综合效能:在日常使用过程中应当充分利用该系统提供的各项功能模块使其不仅能够在提高工作效率的同时始终保持稳定运行状态而且能够确保所处理的数据具有高度的安全性和可靠性
1.3论文结构安排
本文共计涵盖了6个章节,并且每个章节都阐述了各自独特的主题。随后将对全文的研究内容进行深入探讨。
本章属于论文绪论部分的内容。它将围绕选题的研究背景及其重要性展开讨论,并阐述即将开发的系统。
第2章:本章主要介绍技术背景部分。从当前系统的角度出发,阐述本系统的所涉及的技术基础及其运行机制
第3章:这一部分属于系统的整体规划与设计。对系统的可行性和效率进行评估,并深入探讨其技术架构和性能指标。
第4章:本章主要涉及系统的整体架构设计。主要从系统功能结构层面和数据库设计层面进行详细说明。
第5章:这个章节是系统实现部分。从系统功能模块效果的角度阐述系统。
第6章:本章涉及系统的测试环节。从系统的功能特性以及系统的测试方法两个方面对本章的内容进行阐述。
第2章 开发环境与技术
构建学生成绩管理系统需要配置编程环境,并且经过调研对各项相关技术进行深入分析,以选择最适合本系统的软硬件平台。
2.1 MYSQL数据库
题目判定为一个应用程序后就开始循序渐进地展开设计与分析工作。本课题涉及以数据库作为数据管理和数据存储的核心工具,在程序功能分析与数据分析阶段需要对关系型数据库进行合理选择。由于关系型数据库可选类型有限(仅限于甲骨文公司的两家、微软的两家以及IBM的一家),即总共五个选项可供选择,在此前提下不同功能及差异都不会影响数据库的选择依据。因此必须从其他角度综合考量哪种数据库更适合当前需求。就开发使用的计算机硬件设备而言,在最初购买时并未投入过多资金选择了较为老旧的笔记本电脑,并将其主要用于教学用途的学习与开发工作使用至今已近十年之久。经过长期使用后发现该设备已显老态日非能且运行效率亦有明显下降同时面临毕业临近需选择学校机房等长久打算的问题在此背景下最理想的目标是寻找一个适合自身老旧型笔记本电脑的应用开发所需的基础数据库系统解决方案综合考虑后决定采用MySQL数据库作为应用开发所选用的基础数据库系统解决方案原因在于MySQL databases以其轻量化的特点占用内存较小不会对其他软件运行造成影响此外其无需因安装维护而重新配置系统资源从而最终确定MySQL databases为最佳选型方案
注:以上改写遵循以下原则:
- 每句话均通过词汇替换或句式变换实现了表达方式的变化
- 保持了原文的技术内容和技术表述
- 增加了必要的修饰词以丰富语言表达
- 未添加任何额外信息或解释
- 严格遵循了格式要求
- 在技术术语方面保持了一致性
2.2 Tomcat 介绍
最初接触Java语言时,并不晓得Tomcat的存在。各种语法及运行结果通过控制台显示出来,在开发基于Java的网站时不可避免地需要使用到Tomcat服务器。准确地说,并非传统意义上的服务器而是JSP引擎或一种容器,在学术上或原理上都十分贴切;然而在实际工作中Tomcat确实作为一个轻量级Web服务器存在主要适用于中小型企业以及对并发处理要求不高的场景;例如某些行业特有的应用系统由于客户端资源有限通常只需要少量连接就可以运行这些系统一般会选择Tomcat作为Web服务提供者;配置文件通常以config结尾并具有类似于XML的结构特征便于管理与维护;每次新版本发布时 Tomcat 都会相应升级以匹配新的功能;汤姆猫标识是一只略显陈旧的小猫形象图当其配置成功测试环境后就可以看到标志性的"小猫咪"这一步骤至关重要才能顺利进行下一步配置工作;总体而言在现代Web开发中选择合适的服务层架构对于提升开发效率至关重要
2.3 JSP技术
该技术有助于初学开发者迅速掌握动态网站开发的基础技能,并非要求具备高级Java编程能力即可编写代码。从效率提升的角度来看,在学习和编写过程中均能获得显著效益。通过分离网页开发者的职责与后端逻辑开发者的职责进行协作开发已成为可能,并降低了整体学习成本;无需考虑程序解释与编译阶段的情况下,默认情况下一个JSP网页就可以被理解为一个普通的Servlet。从结构角度来看,则主要包含两个关键部分:一个是专门的JSP引擎(即能够实现编译后解释功能的核心组件),另一个是用于处理客户端请求的 web 服务器;而 JSP 编译过程则依赖于 JSP 引擎与 web 服务器之间的协作配合;尽管功能类似但二者实为不同的工具,在文件系统中的存储位置也存在差异;如果存在特殊需求还可以进行特定配置;这种配置较为灵活。部署完成后,默认情况下该 JSP 引擎就能支持网页服务功能供客户访问;但需要注意的是 JSP 引擎本身并非真正的 web 服务器;例如 JRUN 和 Resin 等都是典型的 JSP 引擎实例;而 web 服务器的主要职责则是处理客户端请求并返回相应的响应数据;相比之下 JSP 引擎则具备更强的功能优势能够处理纯 HTML 编写的静态页面以及 JSP 编写的动态网站等;虽然在某些方面单靠 web 服务器可能略显不足但在实现特定功能需求时选择使用 JSP 技术无疑能带来显著性能提升。
第3章 系统分析
用户的使用需求以及市场上现有的类似产品可作为参考资料,在进行系统分析时可供使用。通过分析这些信息, 可以识别其功能; 研究其性能.
3.1可行性分析
考虑到该软件系统需按照用户的实际需求来设计,在确认制作阶段之前必须对其可行性能进行详细评估。
3.1.1操作可行性分析
在开发过程中需要用到的一些工具我对这些工具非常熟悉因此可以运用这些工具能够全面实现学生信息管理系统的设计与构建在功能模块上主要涉及信息数据的处理流程不仅包括基础的信息增删改查功能并且所有的管理流程均通过直观的操作界面实现这样看来整个系统的运行将会非常顺利
3.1.2经济可行性分析
搭建本系统的平台无需投入额外资金。这些工具均源自百度公开平台,并安装于个人电脑上。随着软件开发技术的进步, 系统功能实现的编码也都模块化, 方便快速获取所需功能模块, 并通过仅需少量代码优化即可融入当前项目中。这些均不涉及资金投入, 同时, 整体架构采用B/S模式设计, 总体成本微乎其微
3.1.3技术可行性分析
为开发本系统所需的软件环境配置方面
基于前面的分析结果,在经济方面已经确认了本系统的可行性;同时,在技术和操作方面也已经确认了本系统的可行性。从而得出,在当前条件下完成学生信息系统的建设设计和实现是完全可行的。
3.2系统流程分析
在数据处理过程中, 该系统的具体操作流程需通过相关工具来呈现
在本系统中的数据分析录入界面设置了严格的验证机制。具体而言,在每一笔输入的数据中不允许出现非法字符;另外对于应当以汉字形式呈现的数据则必须使用汉字而非字母;此外还规定了关于字段长度等方面的格式要求;这些严格的验证规则能够有效保证所有输入信息的质量与准确性;整个编码阶段已经预先完成了这些规则的设计与实现工作;请参考附图所示的操作流程;一旦将这些信息存入数据库后,则可确认操作者的输入完全符合规范

图3.1 添加信息流程图
通常情况下,在处理海量数据的过程中不可避免地会遇到一些问题。为了确保系统的稳定性与准确性……系统不仅具备……功能,并且其操作流程……值得注意的是,在进行数据更新操作前……只有当修正后的数据满足相关标准时才能最终被记录到数据库中

图3.2 修改信息流程图
面对系统前台展示的大量数据信息,在线平台为了快速获取所需的数据信息必须依靠查询功能来完成数据检索任务

图3.3 查询信息流程图
3.3系统性能分析
该学生信息管理系统在性能方面的需求主要体现在以下五个方面:其实用性能、操作便捷性和安全性等特性。
性能需求一:系统的实用价值主要体现在整合相关资源,并提供高效的信息化服务流程和数据处理与维护功能。在提升运营效能的同时优化资源配置效率,并减轻日常管理负担。
性能需求二:系统的适应性方面要求不高,在实际应用中具有广泛的适用性。其特点在于即使在普通用户的电脑或便携设备上即可轻松搭建所需环境,并支持基本的操作功能如添加、修改等操作
性能指标三:简便的操作界面。该系统与其同类产品在功能配置上具有相似性,并支持基本的增删改功能模块。其操作流程遵循用户习惯设计,在日常数据管理中能够便捷高效地完成各项任务。
安全性能要求四:本系统需确保数据存储和管理的安全性达到标准。在设计编码阶段应依据用户权限设置将系统功能按角色划分至各用户。开发包含安全验证功能的代码模块以实现根据不同用户的访问权限而提供不同访问界面。同时对用户的登录信息(如账号和密码)实施加密存储处理,并采用当前成熟可靠的MD5加密技术实现。
为了提升系统的易维护性,在系统运行后期阶段将根据用户操作生成大量数据信息。为了便于后续维护操作对这些数据进行提取处理,并对非实时性数据执行一次性清除操作以优化存储结构进而实现低负载运行目标使系统整体更加高效稳定
3.4系统功能分析
完成这一部分内容的开发工作,则要求设计团队在项目初期投入充分准备。具体而言,则需包括调研项目实际操作人员的功能需求,并收集相关业务部门的技术需求信息;同时还需要参考国内外先进系统的实践经验来优化本系统的设计方案。基于此分析所得出的功能体系则将成为系统开发的基础依据。
在本系统中担任一个角色,在功能示意图中展示其具体作用。该角色负责协调班级与课程之间的关联关系,并处理奖惩类别以及相关的课程设置以及专业的相关信息内容。

图3.4 管理员用例图
老师担任本系统的一个核心角色,在功能模块及其交互关系可通过下图展示的基础上进行课程管理与教学评价相关的操作。具体而言,在该系统中负责管理学生成绩信息以及实施学生奖惩的相关事务,并根据教学计划安排对所授课程进行查询操作以获取相关信息

图3.5 老师用例图
在本系统中,默认角色定义为学生,默认情况下,默认情况下,请参考下图以了解具体功能配置。学生主要用于查询成绩信息、奖惩记录以及查阅班级概况及课程安排。

图3.6 学生用例图
第4章 系统设计
市场上一些系统设计较为出色的产品普遍具有的一个显著特点是主题鲜明突出。通过优化页面布局使其呈现简洁明了的结构使得页面中的文字语言视频图片等多媒体元素能够准确传达出系统的主题从而让用户无需投入过多精力时间即可轻松获取所需信息
4.1界面设计原则
通常情况下,在线平台上的大多数用户会通过该平台来完成他们的日常任务。其中一些人希望从该平台中获取所需的信息资源,并且他们希望这些信息资源能够满足他们的学习或工作需求;另一些用户则主要利用该系统的各项服务功能。为了提升用户体验体验感并优化用户的可用性,在设计新的界面时应当充分考虑用户的实际需求以及其操作习惯,并且遵循以下原则进行规划与实施
第一点要求深入分析用户的特征,并明确掌握用户使用系统的各种目的。同时要考虑用户采用的各种进入系统的途径,在充分考虑大多数用户的阅读习惯的基础上设计Z字形或F型布局能够有效地帮助用户快速获取所需信息。
第二部分是规划有效的导航系统,在每个网页中均需展示导览信息。这一项不仅涉及在主界面顶部设置导览栏,此外还可以将导览信息放置于页面底部,以便用户根据个人习惯选择查看位置。对于访问特定网页的用户来说,应提供相应的引导标识,以帮助他们快速定位所需内容。对于位于网页较为突出的部分,必须确保所有导出链接都明确无误地指向目标位置,这样即使点击这些链接也无需额外操作就能到达相应目标页码或者直接回到主页
第三点:为整个系统建立统一的设计方案至关重要,这包括色彩风格的一致、布局模式的一致以及对同类功能的专业术语表现的一致
第四点:确保界面能够有效传达清晰准确的信息。尽量减少同一页面上信息量过多的同时,可以通过科学分类系统内容,将页面中用户视觉焦点所在区域用于展示关键信息
作为初学者,在开始阶段可能缺乏较为专业的设计经验;然而通过应用上述界面设计原则, 能够开发出具有良好效果的系统界面.
4.2功能结构设计
为了使系统的编码流程得以顺利实施, 本系统特别地在功能模块上进行了细致的划分, 其功能架构可在附图中找到详细说明。负责协调班级与课程对应关系, 管理奖惩类型, 同时负责协调班级与课程对应关系, 以及与专业相关的各类信息管理

图4.1 管理员功能结构图
在对老师功能进行细分之后,在功能结构被设计并展示于图中之前。负责管理学生成绩以及学生的奖惩信息,并根据教学安排查询所授课程信息。

图4.2 老师功能结构图
根据功能划分后的子系统其功能架构示意图如图所示 学生可进行如下查询操作 包括查看成绩 获取奖惩记录 以及查阅班级概况以及各班级开设的课程信息

图4.3 学生功能结构图
4.3数据库设计
通常情况下,在深入了解用户需求之前,请先完成功能上的分析设计。实际上,在设计功能时,并非只关注功能本身的设计,请注意数据库在其中的作用和影响。数据库作为程序的数据存储基础,它能够根据预先设定的规则管理程序中的数据信息,并提供相应的服务支持。为了确保系统的高效运行和数据的安全性,请充分重视数据库的设计工作,并投入足够的精力去完成这一任务。因为这不仅关系到当前系统的开发质量,在后续的应用过程中也会带来诸多不便与挑战。试想一下:如果无法建立一个良好的数据管理系统,则可能导致一系列问题:首先,在处理信息时会面临复杂的业务逻辑设置以及冗长的操作流程;其次,在编写处理代码时会遇到大量重复的功能实现问题;此外还需要面对大量的数据冗余情况以及代码注释困难的问题;最后还需要占用更多的系统资源来满足高负载下的运行需求。由此可见,在数据库系统的设计阶段投入足够的重视与规划是非常必要的
4.3.1数据库概念设计
为此部分内容需要完成,请通过构建展示最终数据库概念模型的设计过程来实现这一目标。这一过程同样涉及创建必要的E-R(实体-关系)图谱作为支撑材料。选择采用E-R建模方法来呈现概念设计的内容原因在于其能够更直观且系统地呈现实体以及它们之间的关系,并能更清晰地传达数据所蕴含的意义。这些要素的存在使得该方法成为构建完整信息系统的可靠架构方案选择之一,并且这种架构方案的选择能够显著提升整体系统架构规划的质量
建立E-R模型需要依赖相应的软件工具。目前市面上应用广泛的有微软旗下的一家叫做Visio的产品;另一款国产软件是亿图技术公司开发的亿图软件也可以用来绘制E-R模型。在选择绘图工具时,请确保你能够掌握绘制E-R图的关键,并且了解各个图形符号的具体含义。例如:通常用于表示实体的是矩形;而椭圆形则用于表示实体特征;如菱形这种图形通常位于两个矩形之间,并且表现两者的关联关系;直线则将这些图形连接起来。最后我们将详细展示本系统的ER图
(1)设计的学生实体,其具备的属性见下图。

图4.4 学生实体属性图
(2)设计的成绩实体,其具备的属性见下图。

图4.5 成绩实体属性图
(3)设计的老师实体,其具备的属性见下图。

图4.6 老师实体属性图
- 设计的学生奖惩实体,其具备的属性见下图。

图4.7 学生奖惩实体属性图
- 设计的上述实体间关系见下图。

图4.8 实体间关系E-R图
4.3.2 数据库物理设计
为了在程序后台发挥作用, 该数据库同样需要规划数据存储架构. 数据存储架构的设计涵盖了构建数据库模式和具体实现的全过程. 在这里, 我们将之前建立的E-R模型应用到这里.
该系统采用分层架构进行设计与实现,在功能模块划分上遵循模块化原则。系统功能需求主要由需求分析部分给出具体说明,并在此基础上完成功能模块的设计工作。系统架构图则为功能模块间的交互关系提供直观描述。
在本设计中,默认采用标准的数据库规范来进行数据库建模工作,在此基础之上完成对各实体属性及约束条件的详细定义。
根据本程序信息存储要求,在完成一张数据表的设计后,请及时将其存入数据库中,并对其设计内容进行准确命名。
需要注意的是,在设置数据表名称时最好选用英文名,并且易于记忆。
为了方便后续操作,在编写SQL语句时请尽量避免使用中文变量名。
表4. 1班级信息表
| 字段 | 类型 | 空 | 默认 | 注释 |
|---|---|---|---|---|
| id (主键) | int(11) | 否 | 主键 | |
| zhuanye_types | int(11) | 是 | NULL | 专业 |
| banji_name | varchar(200) | 是 | NULL | 班级名称 |
| create_time | timestamp | 是 | NULL | 创建时间 |
表4.2 学生信息表
| 字段 | 类型 | 空 | 默认 | 注释 |
|---|---|---|---|---|
| id (主键) | int(11) | 否 | 主键 | |
| username | varchar(200) | 是 | NULL | 账户 |
| password | varchar(200) | 是 | NULL | 密码 |
| name | varchar(200) | 是 | NULL | 姓名 |
| phone | varchar(200) | 是 | NULL | 手机号 |
| id_number | varchar(200) | 是 | NULL | 身份证号 |
| sex_types | int(11) | 是 | NULL | 性别 |
| my_photo | varchar(200) | 是 | NULL | 照片 |
| nation | varchar(200) | 是 | NULL | 民族 |
| politics_types | int(11) | 是 | NULL | 政治面貌 |
| birthplace | varchar(200) | 是 | NULL | 籍贯 |
| wupin_types | int(11) | 是 | NULL | 是否领取过物品 |
| banji_id | int(11) | 是 | NULL | 班级 |
| yonghu_types | int(11) | 是 | NULL | 学生状态 |
| create_time | timestamp | 是 | NULL | 创建时间 |
表4.3 成绩信息表
| 字段 | 类型 | 空 | 默认 | 注释 |
|---|---|---|---|---|
| id (主键) | int(11) | 否 | 主键 | |
| yonghu_id | int(11) | 是 | NULL | 学生 |
| exam_name | varchar(200) | 是 | NULL | 考试名称 |
| kecheng_id | int(11) | 是 | NULL | 课程 |
| fraction | decimal(10,4) | 是 | NULL | 分数 |
| create_time | timestamp | 是 | NULL | 创建时间 |
表4.4 学生奖惩信息表
| 字段 | 类型 | 空 | 默认 | 注释 |
|---|---|---|---|---|
| id (主键) | int(11) | 否 | 主键 | |
| yonghu_id | int(11) | 是 | NULL | 学生id |
| jiangcheng_name | varchar(200) | 是 | NULL | 奖惩名称 |
| jiangcheng_types | int(11) | 是 | NULL | 奖惩类型 |
| jiangcheng_content | varchar(200) | 是 | NULL | 奖惩详情 |
| insert_time | timestamp | 是 | NULL | 奖惩时间 |
| create_time | timestamp | 是 | NULL | 创建时间 |
表4.5 课程信息表
| 字段 | 类型 | 空 | 默认 | 注释 |
|---|---|---|---|---|
| id (主键) | int(11) | 否 | 主键 | |
| laoshi_id | int(11) | 是 | NULL | 老师 |
| kecheng_name | varchar(200) | 是 | NULL | 课程名称 |
| kecheng_content | varchar(200) | 是 | NULL | 课程内容 |
| create_time | timestamp | 是 | NULL | 创建时间 |
表4.6 老师信息表
| 字段 | 类型 | 空 | 默认 | 注释 |
|---|---|---|---|---|
| id (主键) | int(11) | 否 | 主键 | |
| username | varchar(200) | 是 | NULL | 账户 |
| password | varchar(200) | 是 | NULL | 密码 |
| name | varchar(200) | 是 | NULL | 老师姓名 |
| phone | varchar(200) | 是 | NULL | 老师手机号 |
| id_number | varchar(200) | 是 | NULL | 老师身份证号 |
| sex_types | int(11) | 是 | NULL | 老师性别 |
| my_photo | varchar(200) | 是 | NULL | 照片 |
| nation | varchar(200) | 是 | NULL | 民族 |
| politics_types | int(11) | 是 | NULL | 政治面貌 |
| birthplace | varchar(200) | 是 | NULL | 籍贯 |
| create_time | timestamp | 是 | NULL | 创建时间 |
第5章 系统实现
这一阶段必须依赖前期规划好的方案, 涵盖系统的各个模块规划, 以及为程序后台数据支持而设计的数据库规划等. 然而这部分内容的主要目标在于培养系统的开发团队的能力, 我们需要将前期规划的内容转化为具体的代码, 并整合成一个完整且功能完善的系统.
5.1管理员功能实现
5.1.1班级和课程关系管理
系统管理员负责管理班级与课程之间的关联关系,并通过图表形式呈现效果,请参考下图获取详细信息。在当前页面界面中,默认情况下会清晰地显示每个班级对应开设的课程及其对应的任课老师信息,并且系统允许管理员进行相应操作。

图5.1 班级和课程关系管理页面
5.1.2老师管理
管理员负责管理老师。其效果体现在下图中。老师是本系统中的一个重要角色, 其信息需要管理员负责维护和更新

图5.2 老师管理页面
5.1.3奖惩类型管理
管理员能够管理奖惩类别,并如图所示为其设置相关参数。管理员可修改奖惩类别名称,并提交该名称以获取对应的配置信息。

图5.3 奖惩类型管理页面
5.2 老师功能实现
5.2.1成绩管理
教师负责管理学生成绩情况。其表现可见于下图。教师记录了各学生在各项课程中的学习分数。通过按分数区间浏览就能查看学生成绩。

图5.4 成绩管理页面
5.2.2学生奖惩管理
老师负责处理学生奖惩事务的具体效果可参考下图所示图表数据。为确保公平性与透明度,在收集学生奖励与惩罚信息时,请教师需负责收集并维护相关信息以供查询与更新

图5.5 学生奖惩管理页面
5.2.3课程管理
老师负责管理课程,并通过图表显示其效果。
老师可以在当前页面浏览课程列表,并根据老师的姓名检索对应的信息。

图5.6 课程管理页面
5.3 学生功能实现
5.3.1班级管理
通过管理功能进行班级日常事务。从图表中可以看出效果。除了能够查询班级信息外,并非只有查询课程信息这一项功能;学生还可以了解该班级的相关课程设置。

图5.7 班级管理页面
5.3.2查询成绩
通过查看学习效果可见于下图的学生都能够掌握相关知识。学生可以通过其后台来查看成绩。凭借课程名称或分数段信息,学生即可获取相关成绩。

图5.8 查询成绩页面
5.3.3修改密码
学生更换密码。如图所示,在本页面输入新密码后完成设置。完成密码设置后,请再次登录。

图5.9 修改密码页面
KechengController.java
package com.controller;
import java.text.SimpleDateFormat;
import com.alibaba.fastjson.JSONObject;
import java.util.*;
import org.springframework.beans.BeanUtils;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.context.ContextLoader;
import javax.servlet.ServletContext;
import com.service.TokenService;
import com.utils.StringUtil;
import java.lang.reflect.InvocationTargetException;
import com.service.DictionaryService;
import org.apache.commons.lang3.StringUtils;
import com.annotation.IgnoreAuth;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.entity.KechengEntity;
import com.service.KechengService;
import com.entity.view.KechengView;
import com.service.LaoshiService;
import com.entity.LaoshiEntity;
import com.utils.PageUtils;
import com.utils.R;
/** * 课程
* 后端接口
* @author
* @email
* @date 2021-03-13
*/
@RestController
@Controller
@RequestMapping("/kecheng")
public class KechengController {
private static final Logger logger = LoggerFactory.getLogger(KechengController.class);
@Autowired
private KechengService kechengService;
@Autowired
private TokenService tokenService;
@Autowired
private DictionaryService dictionaryService;
//级联表service
@Autowired
private LaoshiService laoshiService;
/** * 后端列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params, HttpServletRequest request){
logger.debug("page方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));
String role = String.valueOf(request.getSession().getAttribute("role"));
if(StringUtil.isNotEmpty(role) && "用户".equals(role)){
params.put("yonghuId",request.getSession().getAttribute("userId"));
}
PageUtils page = kechengService.queryPage(params);
//字典表数据转换
List<KechengView> list =(List<KechengView>)page.getList();
for(KechengView c:list){
//修改对应字典表字段
dictionaryService.dictionaryConvert(c);
}
return R.ok().put("data", page);
}
/** * 后端详情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id){
logger.debug("info方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
KechengEntity kecheng = kechengService.selectById(id);
if(kecheng !=null){
//entity转view
KechengView view = new KechengView();
BeanUtils.copyProperties( kecheng , view );//把实体数据重构到view中
//级联表
LaoshiEntity laoshi = laoshiService.selectById(kecheng.getLaoshiId());
if(laoshi != null){
BeanUtils.copyProperties( laoshi , view ,new String[]{ "id", "createDate"});//把级联的数据添加到view中,并排除id和创建时间字段
view.setLaoshiId(laoshi.getId());
}
//修改对应字典表字段
dictionaryService.dictionaryConvert(view);
return R.ok().put("data", view);
}else {
return R.error(511,"查不到数据");
}
}
/** * 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody KechengEntity kecheng, HttpServletRequest request){
logger.debug("save方法:,,Controller:{},,kecheng:{}",this.getClass().getName(),kecheng.toString());
Wrapper<KechengEntity> queryWrapper = new EntityWrapper<KechengEntity>()
.eq("laoshi_id", kecheng.getLaoshiId())
.eq("kecheng_name", kecheng.getKechengName())
.eq("kecheng_content", kecheng.getKechengContent())
;
logger.info("sql语句:"+queryWrapper.getSqlSegment());
KechengEntity kechengEntity = kechengService.selectOne(queryWrapper);
if(kechengEntity==null){
kecheng.setCreateTime(new Date());
// String role = String.valueOf(request.getSession().getAttribute("role"));
// if("".equals(role)){
// kecheng.set
// }
kechengService.insert(kecheng);
return R.ok();
}else {
return R.error(511,"表中有相同数据");
}
}
/** * 修改
*/
@RequestMapping("/update")
public R update(@RequestBody KechengEntity kecheng, HttpServletRequest request){
logger.debug("update方法:,,Controller:{},,kecheng:{}",this.getClass().getName(),kecheng.toString());
//根据字段查询是否有相同数据
Wrapper<KechengEntity> queryWrapper = new EntityWrapper<KechengEntity>()
.notIn("id",kecheng.getId())
.eq("laoshi_id", kecheng.getLaoshiId())
.eq("kecheng_name", kecheng.getKechengName())
.eq("kecheng_content", kecheng.getKechengContent())
;
logger.info("sql语句:"+queryWrapper.getSqlSegment());
KechengEntity kechengEntity = kechengService.selectOne(queryWrapper);
if(kechengEntity==null){
// String role = String.valueOf(request.getSession().getAttribute("role"));
// if("".equals(role)){
// kecheng.set
// }
kechengService.updateById(kecheng);//根据id更新
return R.ok();
}else {
return R.error(511,"表中有相同数据");
}
}
/** * 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Integer[] ids){
logger.debug("delete:,,Controller:{},,ids:{}",this.getClass().getName(),ids.toString());
kechengService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
}

CommonServiceImpl.java
package com.service.impl;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.dao.CommonDao;
import com.service.CommonService;
/** * 系统用户
* @author yangliyuan
* @date 2019年10月10日 上午9:17:59
*/
@Service("commonService")
public class CommonServiceImpl implements CommonService {
@Autowired
private CommonDao commonDao;
@Override
public List<String> getOption(Map<String, Object> params) {
return commonDao.getOption(params);
}
@Override
public Map<String, Object> getFollowByOption(Map<String, Object> params) {
return commonDao.getFollowByOption(params);
}
@Override
public void sh(Map<String, Object> params) {
commonDao.sh(params);
}
@Override
public int remindCount(Map<String, Object> params) {
return commonDao.remindCount(params);
}
@Override
public Map<String, Object> selectCal(Map<String, Object> params) {
return commonDao.selectCal(params);
}
@Override
public List<Map<String, Object>> selectGroup(Map<String, Object> params) {
return commonDao.selectGroup(params);
}
@Override
public List<Map<String, Object>> selectValue(Map<String, Object> params) {
return commonDao.selectValue(params);
}
@Override
public List<Map<String, Object>> chartBoth(Map<String, Object> params) {
return commonDao.chartBoth(params);
}
@Override
public List<Map<String, Object>> chartOne(Map<String, Object> params) {
return commonDao.chartOne(params);
}
/** * 新的级联字典表的 分组求和统计
* @param params
* @return
*/
@Override
public List<Map<String, Object>> newSelectGroupSum(Map<String, Object> params) {
return commonDao.newSelectGroupSum(params);
}
/** * 新的级联字典表的 分组条数统计
* @param params
* @return
*/
@Override
public List<Map<String, Object>> newSelectGroupCount(Map<String, Object> params) {
return commonDao.newSelectGroupCount(params);
}
}

DictionaryServiceImpl.java
package com.service.impl;
import com.utils.StringUtil;
import org.springframework.stereotype.Service;
import java.lang.reflect.Field;
import java.util.*;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.transaction.annotation.Transactional;
import com.utils.PageUtils;
import com.utils.Query;
import org.springframework.web.context.ContextLoader;
import javax.servlet.ServletContext;
import com.dao.DictionaryDao;
import com.entity.DictionaryEntity;
import com.service.DictionaryService;
import com.entity.view.DictionaryView;
/** * 字典表 服务实现类
* @author
* @since 2021-03-13
*/
@Service("dictionaryService")
@Transactional
public class DictionaryServiceImpl extends ServiceImpl<DictionaryDao, DictionaryEntity> implements DictionaryService {
@Override
public PageUtils queryPage(Map<String,Object> params) {
if(params != null && (params.get("limit") == null || params.get("page") == null)){
params.put("page","1");
params.put("limit","10");
}
Page<DictionaryView> page =new Query<DictionaryView>(params).getPage();
page.setRecords(baseMapper.selectListView(page,params));
return new PageUtils(page);
}
/** * 赋值给字典表
* @param obj view对象
*/
public void dictionaryConvert(Object obj) {
try {
if (obj == null) return;
//当前view和entity中的所有types的字段
List<String> fieldNameList = new ArrayList<>();
Class tempClass = obj.getClass();
while (tempClass !=null) {
Field[] declaredFields = tempClass.getDeclaredFields();
for (Field f : declaredFields) {
f.setAccessible(true);
if (f.getType().getName().equals("java.lang.Integer") && f.getName().contains("Types")) {
fieldNameList.add(f.getName());
}
}
tempClass = tempClass.getSuperclass(); //得到父类,然后赋给自己
}
// 获取监听器中的字典表
ServletContext servletContext = ContextLoader.getCurrentWebApplicationContext().getServletContext();
Map<String, Map<Integer, String>> dictionaryMap= (Map<String, Map<Integer, String>>) servletContext.getAttribute("dictionaryMap");
//通过Types的值给Value字段赋值
for (String s : fieldNameList) {
Field types = null;
if(hasField(obj.getClass(),s)){
//判断view中有没有这个字段,有就通过反射取出字段
types= obj.getClass().getDeclaredField(s);//获取Types私有字段
}else{
//本表中没有这个字段,说明它是父表中的字段,也就是entity中的字段,从entity中取值
types=obj.getClass().getSuperclass().getDeclaredField(s);
}
Field value = obj.getClass().getDeclaredField(s.replace("Types", "Value"));//获取value私有字段
//设置权限
types.setAccessible(true);
value.setAccessible(true);
//赋值
if (StringUtil.isNotEmpty(String.valueOf(types.get(obj)))) { //types的值不为空
int i = Integer.parseInt(String.valueOf(types.get(obj)));//type
String s1 = s.replace("Types", "_types");
String s2 = dictionaryMap.get(s1).get(i);
value.set(obj, s2);
} else {
new Exception("字典表赋值出现问题::::"+value.getName());
value.set(obj, "");
}
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/** * 判断本实体有没有这个字段
* @param c
* @param fieldName
* @return
*/
public boolean hasField(Class c, String fieldName){
Field[] fields = c.getDeclaredFields();
for (Field f : fields) {
if (fieldName.equals(f.getName())) {
return true;
}
}
return false;
}
}

jquery.flot.time.min.js
!function(e){function t(e,t){return t*Math.floor(e/t)}function n(e,t,n,r){if("function"==typeof e.strftime)return e.strftime(t);var a=function(e,t){return e=""+e,t=""+(null==t?"0":t),1==e.length?t+e:e},i=[],o=!1,s=e.getHours(),u=12>s;null==n&&(n=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]),null==r&&(r=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]);var m;m=s>12?s-12:0==s?12:s;for(var c=0;c<t.length;++c){var l=t.charAt(c);if(o){switch(l){case"a":l=""+r[e.getDay()];break;case"b":l=""+n[e.getMonth()];break;case"d":l=a(e.getDate());break;case"e":l=a(e.getDate()," ");break;case"h":case"H":l=a(s);break;case"I":l=a(m);break;case"l":l=a(m," ");break;case"m":l=a(e.getMonth()+1);break;case"M":l=a(e.getMinutes());break;case"q":l=""+(Math.floor(e.getMonth()/3)+1);break;case"S":l=a(e.getSeconds());break;case"y":l=a(e.getFullYear()%100);break;case"Y":l=""+e.getFullYear();break;case"p":l=u?"am":"pm";break;case"P":l=u?"AM":"PM";break;case"w":l=""+e.getDay()}i.push(l),o=!1}else"%"==l?o=!0:i.push(l)}return i.join("")}function r(e){function t(e,t,n,r){e[t]=function(){return n[r].apply(n,arguments)}}var n={date:e};void 0!=e.strftime&&t(n,"strftime",e,"strftime"),t(n,"getTime",e,"getTime"),t(n,"setTime",e,"setTime");for(var r=["Date","Day","FullYear","Hours","Milliseconds","Minutes","Month","Seconds"],a=0;a<r.length;a++)t(n,"get"+r[a],e,"getUTC"+r[a]),t(n,"set"+r[a],e,"setUTC"+r[a]);return n}function a(e,t){if("browser"==t.timezone)return new Date(e);if(t.timezone&&"utc"!=t.timezone){if("undefined"!=typeof timezoneJS&&"undefined"!=typeof timezoneJS.Date){var n=new timezoneJS.Date;return n.setTimezone(t.timezone),n.setTime(e),n}return r(new Date(e))}return r(new Date(e))}function i(r){r.hooks.processOptions.push(function(r){e.each(r.getAxes(),function(e,r){var i=r.options;"time"==i.mode&&(r.tickGenerator=function(e){var n=[],r=a(e.min,i),o=0,u=i.tickSize&&"quarter"===i.tickSize[1]||i.minTickSize&&"quarter"===i.minTickSize[1]?c:m;null!=i.minTickSize&&(o="number"==typeof i.tickSize?i.tickSize:i.minTickSize[0]*s[i.minTickSize[1]]);for(var l=0;l<u.length-1&&!(e.delta<(u[l][0]*s[u[l][1]]+u[l+1][0]*s[u[l+1][1]])/2&&u[l][0]*s[u[l][1]]>=o);++l);var h=u[l][0],f=u[l][1];if("year"==f){if(null!=i.minTickSize&&"year"==i.minTickSize[1])h=Math.floor(i.minTickSize[0]);else{var k=Math.pow(10,Math.floor(Math.log(e.delta/s.year)/Math.LN10)),d=e.delta/s.year/k;h=1.5>d?1:3>d?2:7.5>d?5:10,h*=k}1>h&&(h=1)}e.tickSize=i.tickSize||[h,f];var g=e.tickSize[0];f=e.tickSize[1];var M=g*s[f];"second"==f?r.setSeconds(t(r.getSeconds(),g)):"minute"==f?r.setMinutes(t(r.getMinutes(),g)):"hour"==f?r.setHours(t(r.getHours(),g)):"month"==f?r.setMonth(t(r.getMonth(),g)):"quarter"==f?r.setMonth(3*t(r.getMonth()/3,g)):"year"==f&&r.setFullYear(t(r.getFullYear(),g)),r.setMilliseconds(0),M>=s.minute&&r.setSeconds(0),M>=s.hour&&r.setMinutes(0),M>=s.day&&r.setHours(0),M>=4*s.day&&r.setDate(1),M>=2*s.month&&r.setMonth(t(r.getMonth(),3)),M>=2*s.quarter&&r.setMonth(t(r.getMonth(),6)),M>=s.year&&r.setMonth(0);var y,S=0,z=Number.NaN;do if(y=z,z=r.getTime(),n.push(z),"month"==f||"quarter"==f)if(1>g){r.setDate(1);var p=r.getTime();r.setMonth(r.getMonth()+("quarter"==f?3:1));var v=r.getTime();r.setTime(z+S*s.hour+(v-p)*g),S=r.getHours(),r.setHours(0)}else r.setMonth(r.getMonth()+g*("quarter"==f?3:1));else"year"==f?r.setFullYear(r.getFullYear()+g):r.setTime(z+M);while(z<e.max&&z!=y);return n},r.tickFormatter=function(e,t){var r=a(e,t.options);if(null!=i.timeformat)return n(r,i.timeformat,i.monthNames,i.dayNames);var o,u=t.options.tickSize&&"quarter"==t.options.tickSize[1]||t.options.minTickSize&&"quarter"==t.options.minTickSize[1],m=t.tickSize[0]*s[t.tickSize[1]],c=t.max-t.min,l=i.twelveHourClock?" %p":"",h=i.twelveHourClock?"%I":"%H";o=m<s.minute?h+":%M:%S"+l:m<s.day?c<2*s.day?h+":%M"+l:"%b %d "+h+":%M"+l:m<s.month?"%b %d":u&&m<s.quarter||!u&&m<s.year?c<s.year?"%b":"%b %Y":u&&m<s.year?c<s.year?"Q%q":"Q%q %Y":"%Y";var f=n(r,o,i.monthNames,i.dayNames);return f})})})}var o={xaxis:{timezone:null,timeformat:null,twelveHourClock:!1,monthNames:null}},s={second:1e3,minute:6e4,hour:36e5,day:864e5,month:2592e6,quarter:7776e6,year:525949.2*60*1e3},u=[[1,"second"],[2,"second"],[5,"second"],[10,"second"],[30,"second"],[1,"minute"],[2,"minute"],[5,"minute"],[10,"minute"],[30,"minute"],[1,"hour"],[2,"hour"],[4,"hour"],[8,"hour"],[12,"hour"],[1,"day"],[2,"day"],[3,"day"],[.25,"month"],[.5,"month"],[1,"month"],[2,"month"]],m=u.concat([[3,"month"],[6,"month"],[1,"year"]]),c=u.concat([[1,"quarter"],[2,"quarter"],[1,"year"]]);e.plot.plugins.push({init:i,options:o,name:"time",version:"1.0"}),e.plot.formatDate=n,e.plot.dateGenerator=a}(jQuery);
声明
本平台涵盖全面的学术与教育资源, 包括个人学习, 开发设计以及产品设计等多个应用场景. 仅限作参考内容, 目的在于为研究人员提供深入分析与学术探讨的资料.
