基于springboot养老院管理系统pf

news2024/11/15 3:27:44

@TOC

springboot332基于springboot养老院管理系统pf

第1章 绪论

1.1选题动因

当前的网络技术,软件技术等都具备成熟的理论基础,市场上也出现各种技术开发的软件,这些软件都被用于各个领域,包括生活和工作的领域。随着电脑和笔记本的广泛运用,以及各种计算机硬件的完善和升级,市面上的电脑和笔记本的性能都得到提升,可以支持的软件也逐渐增多,因此,在计算机上安装软件来发挥其高效地信息处理的作用,则很受人们的青睐。对于养老院管理系统信息来讲,通过手工形式处理,在面对庞大的信息数量时,就显得不适宜了,首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,为了解决上述问题,有必要建立养老院管理系统,来规范养老院管理系统信息管理流程,让管理工作可以系统化和程序化,同时,养老院管理系统的有效运用可以帮助管理人员准确快速地处理信息。

1.2目的和意义

养老院管理系统可以对养老院管理系统信息进行集中管理,可以真正避免传统管理的缺陷。养老院管理系统是一款运用软件开发技术设计实现的应用系统,在信息处理上可以达到快速的目的,不管是针对数据添加,数据维护和统计,以及数据查询等处理要求,养老院管理系统都可以轻松应对。所以,养老院管理系统的运用是让养老院管理系统信息管理升级的最好方式。它可以实现信息处理的便利化要求,还可以规范信息处理的流程,让事务处理成为管理人员手中的一件简单事,而不是之前手工处理时的困难事。尽管养老院管理系统具备较完善的功能,但是也需要管理人员利用闲暇时间提升自身素质以及个人能力,在操作养老院管理系统时可以最大化运用养老院管理系统提供的功能,让系统在满足高效率处理数据的同时,也能始终稳定运行,还可以确保数据的可靠性与数据处理的质量。

1.3论文结构安排

本文总共分为6个章节,每个章节都对本系统描述了不同的内容。接下来就对本文的研究内容进行阐述。

第1章:这个章节是论文的绪论部分。从选题的背景和意义的角度阐述即将开发的系统。

第2章:这个章节是技术介绍部分。从本系统需要运用的技术知识的角度阐述系统。

第3章:这个章节是系统分析部分。从分析系统可行性,分析系统功能和性能等角度阐述系统。

第4章:这个章节是系统设计部分。从系统功能结构的角度和数据库设计的角度阐述系统。

第5章:这个章节是系统实现部分。从系统功能模块运行效果的角度阐述系统。

第6章:这个章节是系统测试部分。从测试系统功能,系统测试方法的角度阐述系统。

第2章 开发环境与技术

开发养老院管理系统需要搭建编程的环境,也需要通过调查,对各个相关技术进行分析,选取适合本系统开发的技术与工具。

2.1 MYSQL数据库

题目确定了是一个应用程序之后,就开始按部就班的进行设计与分析。本课题是需要数据库作为数据管理工具以及数据载体,从程序功能分析到数据分析,选择合适的关系型数据库是当下所选择的重要环节。关系型数据库可选择余地不多,本身甲骨文公司的两个,微软的两个,IBM的一个,也就是这五个了,功能和差异都不影响数据库的选择,因为这些数据库都能实现应用程序功能所需的,那么只能从其他的方面来综合考虑哪种数据库更合适。作为开发使用的电脑硬件上来讲,还是大一的时候买的,当初并没有太多的钱买好一点的电脑,只是作为学习用的,所以经过这么几年的使用,电脑老化了,性能下降也比较厉害,还有好多需要用的学习资料,本身面临毕业,选择学校机房也不是一个长久的打算,选择一个数据库适合自己的老旧笔记本电脑作为学习开发当前的应用,是最重要的。综合考虑的结果就是选用MySQL数据库作为应用数据库,因为MySQL数据库体积小,占用内存小,不影响电脑上其他用的软件运行,并且不需要因为安装维护MySQL数据库而重装系统,最终选择的数据库就是MySQL数据库。

2.2 Tomcat 介绍

刚开始学习Java语言的时候,是不知道还有Tomcat这些东西的,各种语法各种输出在控制台进行输出结果,当Java网站开发的时候就不可避免的学习到了Tomcat服务器。Tomcat准确的来讲不算是服务器,可以说是vue引擎或者一个容器,这些都是学术上或者原理上都比较贴切的,但是实际工作中Tomcat就是作为一个web服务器来用的,因为可以实现网站的发布和运行。因为工作原理的原因,Tomcat一般作为中小型企业和并发量并不突出的一种轻量级的服务器存在的,比如某些行业的应用系统,本身客户端就不多,需要的连接也不多,一般都用Tomcat的。Tomcat里面可以配置多个网站,配置文件后缀是config的文档,类似于XML的结构,比较清晰明了。每当Java发布新的版本的时候,Tomcat也会为了匹配Java的版本进行升级,目前Tomcat版本已经到版本10了。Tomcat标识是一只有点发黄的小猫咪,当Tomcat配置成功一般测试的时候能看到这个小猫咪就算是成功的,才能进行下一步的配置。Tomcat服务器在Java网站开发中还是挺合适的。

2.3 vue技术

vue技术可以让初学者尽快上手进行编写动态网站,不需要变成高级的Java编程人员才可以书写代码,从学习的效率还有编写的效率上都有很大的提升。让着重于网页开发者与着重于后台逻辑开发进行分离合作开发变成了一种可能,降低了学习成本,不需要考虑程序运行解释编译阶段的话,vue网页本身就可以理解成一个普通的Servlet。vue结构上面,主要分为两个方面,一个是专属的vue引擎,通俗的讲就是可以实现vue编译后运行解释的一个东西,另一个就是web服务器。vue运行编译需要vue引擎和web服务器进行配合以及相互协作,当然他们的分工也是很明确的,这样才可以真正的运行起来。vue容器和引擎有Tomcat,这个Tomcat其实也还有Apache静态解释代码的部分,虽然看起来运行效果差不多,但是其实是两个截然不同的工具,在文件系统里目录也是不一样的,当然如果有特殊需求也是可以进行特殊的配置的,配置上面还是比较灵活的。虽然Tomcat部署了网站之后就可以运行网页让客户访问,但是Tomcat也只是vue引擎而非web服务器。比如JRUN和Resin都算是vue引擎,而web服务器的职责比较单一,就是处理客户端请求还有返回给客户显示请求处理后的数据而已。vue引擎则可以运行纯HTML编写的网站,也可以运行vue编写的动态网站,在效率上也只是比单纯的web服务器而已,但是从纯web服务器无法运行动态网站上来讲,vue引擎在功能上还是强大了很多,提升一点点效率反而算不了什么,对于必须实现的功能这些要素上,选择了vue技术。

2.4 SpringBoot框架

java一直被人诟病的一点就是臃肿、麻烦。当我们还在辛苦的搭建项目时,可能Python程序员已经把功能写好了,究其原因注意是两点:复杂的配置,项目各种配置其实是开发时的损耗, 因为在思考 Spring 特性配置和解决业务问题之间需要进行思维切换,所以写配置挤占了写应用程序逻辑的时间。一个是混乱的依赖管理。项目的依赖管理也是件吃力不讨好的事情。决定项目里要用哪些库就已经够让人头痛的了,你还要知道这些库的哪个版本和其他库不会有冲突,这难题实在太棘手。并且,依赖管理也是一种损耗,添加依赖不是写应用程序代码。一旦选错了依赖的版本,随之而来的不兼容问题毫无疑问会是生产力杀手。而SpringBoot让这一切成为过去!Spring Boot 简化了基于Spring的应用开发,只需要“run”就能创建一个独立的、生产级别的Spring应用。Spring Boot为Spring平台及第三方库提供开箱即用的设置(提供默认设置,存放默认配置的包就是启动器),这样我们就可以简单的开始。多数Spring Boot应用只需要很少的Spring配置。我们可以使用SpringBoot创建java应用,并使用java –jar 启动它,就能得到一个生产级别的web工程。

第3章 系统分析

用户的需求以及与本系统相似的在市场上存在的其它系统可以作为系统分析中参考的资料,分析人员可以根据这些信息确定出本系统具备的功能,分析出本系统具备的性能等内容。

3.1可行性分析

尽管系统是根据用户的要求进行制作,但是在确定制作前,有必要分析其可行性。

3.1.1操作可行性分析

开发本系统需要用到的工具,本人都比较熟悉,因此可以使用这些工具,完整开发养老院管理系统。此外,养老院管理系统在功能上,基本都是完成信息的处理,涵盖了添加,修改,删除等,而且操作者面对的都是各个功能操作界面,并不是编码后台,所以一般的使用者都可以通过操作界面轻松完成信息的加工处理。因此,本系统操作可行。

3.1.2经济可行性分析

开发本系统,并没有投入资金购买开发工具。因为使用的开发工具都是事先在百度上下载安装在本人电脑上的,随着软件开发技术的成熟,系统功能实现的编码也都模块化,很容易通过各大软件开发类网站获取,并通过小部分代码改动,运用到本系统中,这些都不需要资金投入,同时,本系统开发的结构选用B/S,成本可以忽略不计。

3.1.3技术可行性分析

本系统需要的软件包括Eclipse,Tomcat,Mysql等,这些工具都接触并使用过,至于JAVA,B/S,vue,Html等技术,图书馆都有对应的书籍可以参考学习,加上平时课堂上学习的编程小项目对这些技术都有讲解,另外,本人也从课程设计作业中锻炼了编程能力。所以在技术上,可以完成养老院管理系统的编程开发。

通过上面的分析,已经确定了本系统在经济上的可行,本系统在技术上的可行,本系统在操作上的可行。由此,可以得出在目前的条件下,对于养老院管理系统的设计与实现是可以进行下去的。

3.2系统流程分析

本系统在处理数据时,其内部的操作逻辑也需要使用相应的工具进行展示。

在本系统的数据录入页面,对于操作者提供的每条数据都有相应的检验规则,比如数据信息不能有非法字符,或者本来应该是汉字的数据,不能用字母代替,还有对数据内容的长度等进行规范,这样的可以确保数据准确性的检验规则,在编码时,就提前编写好了。数据添加的流程见下图。如果数据已经保存进入数据库,则说明操作者提供的数据内容和格式都是符合要求的。

图3.1 添加信息流程图

很多时候,面对系统中的大量数据,难免会发现一些错误,因此需要及时纠正错误,本系统也提供数据后期的修改功能,其流程见下图。但是更新的数据也需要通过数据有效性检验。能够最终写入数据库则说明修改的数据是符合要求的。

图3.2 修改信息流程图

面对数据库里面大量数据,在系统的前台,要想快速获取需要的信息,就需要使用查询功能。其流程见下图。该功能需要操作者提前输入关键词,当系统的后台数据库保存了与关键词匹配的数据时,就会及时显示出来,整个过程耗时很短。

图3.3 查询信息流程图

3.3系统性能分析

分析养老院管理系统对于性能的需求主要还是从下面的5个角度来分析,它们分别是系统的实用性,系统的适应性,系统的易操作性,系统的安全性和系统的易维护性。

性能需求一:系统的实用性,本系统主要是让管理人员集中处理相关信息,可以提供方便快捷的信息添加,信息编辑等操作。在提高信息管理人员的工作效率的同时,也可以降低管理成本,并大大减少管理人员日常繁琐的工作量。

性能需求二:系统的适应性,本系统对于运行环境的要求并不高,可以被广泛运用在生活中。因为使用者只要在日常使用的计算机,或者是随身携带的笔记本上搭建运行环境都能运行本系统,另外系统提供的基础功能包括添加,修改等都能随时操作。

性能需求三:系统的易操作性,本系统提供的功能跟同类型系统一样,也具备简单的增删改操作,操作流程的逻辑也符合广大使用者的使用需求,使用者使用本系统管理数据会非常顺手。

性能需求四:系统的安全性,本系统在数据保存与管理上安全系数要达标,在设计与编码阶段,通过对用户进行权限分配,把系统的功能依照不同用户的角色进行分配,在首次进入系统时,通过编写安全验证的代码模块,引导不同用户进入不同的操作界面。还可以对用户基础信息包括登录的账号密码等进行加密保存,可以利用当下常用的技术成熟的MD5加密技术实现。

性能需求五:系统的易维护性,本系统在后期运行中,会根据使用者的操作,产生许多数据信息,为了便于维护,就要求这些数据可以通过工具从数据库中导出来,对于一些阶段性数据,可以进行批量删除,以此达到轻负荷处理数据的目标,让本系统可以变得更加轻盈。

第4章 系统设计

市面上设计比较好的系统都有一个共同特征,就是主题鲜明突出。通过对页面简洁清晰的布局,让页面的内容,包括文字语言,或者视频图片等元素可以清晰表达出系统的主题。让来访用户无需花费过多精力和时间找寻需要的内容。

4.1界面设计原则

一般来说,大部分用户使用系统,有些是想从系统中获取需要的信息,有些则是使用系统提供的服务。所以,为了改善用户体验,提高系统的使用率,在对系统界面设计时,需要按照下面的原则进行。

第一点,对用户进行分析,了解用户使用系统的目的,以及使用系统的方式,考虑大部分用户的阅读习惯,设计Z字形或F型结构可以方便用户获取信息。

第二点:设计有效的导航,这个包括每个页面上都有导航条的显示,有时也可以在页面的底部设计导航条,当用户进入具体页面时,要设计相应的位置提示,在页面中比较特殊的位置,需要设计返回链接,可以返回上个页面,也可以返回首页等。

第三点:对整个系统要运用统一的设计方案,包括色彩方案的一致性,页面模板的相似性等,对相同操作和专业术语的描述在整个系统中也应该保持一致。

第四点:设计的界面要保证传达的内容清晰准确。要避免在同一个页面设计非常多的内容,另外可以准确对系统内容进行分类,把页面中用户视觉集中的位置,用来显示重要信息。

作为初学者,并没有那么多的设计经验,但是可以运用上面提到的界面设计原则设计出比较好的系统,可以让用户产生良好的使用体验。

4.2功能结构设计

为了让系统的编码可以顺利进行,特意对本系统功能进行细分设计,设计的系统功能结构见下图。

结构设计图

图4.1 系统功能结构图

4.3数据库设计

一般来说,对用户进行调查,了解其需求,主要还是完成功能上的分析设计,殊不知,设计功能时,也要展示对数据库的设计。数据库服务于程序,它可以按照设定的规则对程序的数据进行保存,因此,也可以说数据库就是程序相关数据的集合。为了保证程序的高质量,数据库提供的数据存储服务也需要快速响应,同时数据信息也要安全合法可靠,所以设计一个数据库这样的任务也需要高度重视,并花时间和精力去努力完成。毕竟这影响到后期程序的开发和使用。试想而知,假设设计一个不好的数据库,遇到的问题将会有:第一,面对信息处理,会有着繁琐的业务逻辑,延长事务处理时间。第二:程序编码期间,将会产生更多的代码去完成数据处理的功能,产生大量的数据冗余,而且也不方便注释代码,还会占用更多的存储空间。综上所述,设计出合理的数据库是多么的重要。

(1)下图是家属实体和其具备的属性。

C:/Users/Administrator/Desktop/temp111\2\img\家属.jpg 家属实体属性图

(2)下图是公告信息实体和其具备的属性。

C:/Users/Administrator/Desktop/temp111\2\img\公告信息.jpg 公告信息实体属性图

(3)下图是老人实体和其具备的属性。

C:/Users/Administrator/Desktop/temp111\2\img\老人.jpg 老人实体属性图

(4)下图是字典表实体和其具备的属性。

C:/Users/Administrator/Desktop/temp111\2\img\字典表.jpg 字典表实体属性图

(5)下图是体检实体和其具备的属性。

C:/Users/Administrator/Desktop/temp111\2\img\体检.jpg 体检实体属性图

(6)下图是食物实体和其具备的属性。

C:/Users/Administrator/Desktop/temp111\2\img\食物.jpg 食物实体属性图

(7)下图是老人外出信息实体和其具备的属性。

C:/Users/Administrator/Desktop/temp111\2\img\老人外出信息.jpg 老人外出信息实体属性图

(8)下图是家属意见实体和其具备的属性。

C:/Users/Administrator/Desktop/temp111\2\img\家属意见.jpg 家属意见实体属性图

(9)下图是老人家属信息实体和其具备的属性。

C:/Users/Administrator/Desktop/temp111\2\img\老人家属信息.jpg 老人家属信息实体属性图

4.3.2 数据库物理设计

作为程序后台的支持,本数据库也需要设计数据存储的结构。而数据存储结构的设计就包括了数据表结构的设计和创建。数据表结构包括了字段,数据类型,还有字段的取值范围等信息。而E-R模型中的实体就是一张表,实体的特征就可以作为该表中的字段,根据本程序信息存储要求,设计每个字段需要的类型,还有该字段的取值范围等。每当设计完成一张数据表,就需要及时保存在数据库里面,并对该设计的数据表准确命名,要求设置的数据表的名称尽量不要是中文,而且要方便记忆。因为在程序编码阶段,通过SQL语句可以把程序里面的数据写入在各个数据表里面,而这个环节需要使用到数据表的名称。如果数据表名称是中文的话,可能会乱码并影响程序运行。下面就以表格形式展示设计的结果。

表4.1老人表

序号列名数据类型说明允许空
1IdIntid
2yonghu_nameString老人姓名
3yonghu_photoString头像
4jiankang_typesInteger健康状态
5yonghu_ageInteger年龄
6yonghu_phoneString紧急联系方式
7yonghu_addressString住址
8yonghu_deleteInteger假删
9insert_timeDate添加时间
10create_timeDate创建时间

表4.2字典表表

序号列名数据类型说明允许空
1IdIntid
2dic_codeString字段
3dic_nameString字段名
4code_indexInteger编码
5index_nameString编码名字
6super_idInteger父字段id
7beizhuString备注
8create_timeDate创建时间

表4.3家属表

序号列名数据类型说明允许空
1IdIntid
2jiashu_nameString家属名称
3jiashu_photoString家属照片
4jiashu_phoneString联系电话
5jiashu_emailString邮箱
6jiashu_deleteInteger逻辑删除
7create_timeDate创建时间

表4.4家属意见表

序号列名数据类型说明允许空
1IdIntid
2jiashuyijian_nameString标题
3jiashuyijian_typesInteger类型
4jiashu_idInteger家属
5jiashuyijian_contentString详细信息
6jiashuyijian_deleteInteger逻辑删除
7create_timeDate创建时间 homeMain

表4.5老人家属信息表

序号列名数据类型说明允许空
1IdIntid
2yonghu_idInteger老人
3jiashu_idInteger家属
4laorenjiashu_typesInteger家属身份
5insert_timeDate添加时间
6create_timeDate创建时间

表4.6食物表

序号列名数据类型说明允许空
1IdIntid
2meishi_nameString食物名称
3meishi_photoString食物照片
4meishi_typesInteger食物类型
5meishi_new_moneyBigDecimal价格
6meishi_contentString食物介绍
7meishi_deleteInteger逻辑删除
8create_timeDate创建时间 homeMain

表4.7公告信息表

序号列名数据类型说明允许空
1IdIntid
2news_nameString公告信息标题
3news_typesInteger公告类型
4news_photoString公告信息图片
5insert_timeDate添加时间
6news_contentString公告详情
7create_timeDate创建时间

表4.8体检表

序号列名数据类型说明允许空
1IdIntid
2tijian_nameString标题
3tijian_typesInteger体检项目
4tijian_new_moneyBigDecimal体检价格
5tijian_contentString体检项目介绍
6tijian_deleteInteger逻辑删除
7create_timeDate创建时间 homeMain

表4.9老人外出信息表

序号列名数据类型说明允许空
1IdIntid
2waichu_nameString标题
3waichu_typesInteger外出目的
4waichu_timeDate外出时间
5huilia_timeDate回来时间
6yonghu_idInteger老人
7waichu_textString备注
8waichu_contentString详情
9waichu_deleteInteger逻辑删除
10create_timeDate创建时间 homeMain

表4.10管理员表

序号列名数据类型说明允许空
1IdIntid
2usernameString用户名
3passwordString密码
4roleString角色
5addtimeDate新增时间

第5章 系统实现

这个环节需要使用前面的设计方案,包括对系统模块的设计,还有对程序后台的数据支持的数据库的设计等。不过这部分内容还是强调系统编码人员的开发能力,要把前面设计的内容通过编码的形式以一个完整的,可以运行的系统呈现出来。

功能模块的实现

5.1老人信息管理

如图5.1显示的就是老人信息管理页面,此页面提供给管理员的功能有:老人信息的查询管理,可以删除老人信息、修改老人信息、新增老人信息,

还进行了对用户名称的模糊查询的条件

图5.1 老人信息管理页面

5.2 家属信息管理

如图5.2显示的就是家属信息管理页面,此页面提供给管理员的功能有:查看已发布的家属信息数据,修改家属信息,家属信息作废,即可删除,还进行了对家属信息名称的模糊查询 家属信息信息的类型查询等等一些条件。

图5.2 家属信息管理页面

5.3公告类型管理

如图5.3显示的就是公告类型管理页面,此页面提供给管理员的功能有:根据公告类型进行条件查询,还可以对公告类型进行新增、修改、查询操作等等。

图5.3 公告类型管理页面

5.1公告信息管理

如图5.4显示的就是公告信息管理页面,此页面提供给管理员的功能有:根据公告信息进行新增、修改、查询操作等等。

图5.4 公告信息管理页面

FileController.java
package com.controller;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.UUID;

import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import com.annotation.IgnoreAuth;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.entity.ConfigEntity;
import com.entity.EIException;
import com.service.ConfigService;
import com.utils.R;

/**
 * 上传文件映射表
 */
@RestController
@RequestMapping("file")
@SuppressWarnings({"unchecked","rawtypes"})
public class FileController{
	@Autowired
    private ConfigService configService;
	/**
	 * 上传文件
	 */
	@RequestMapping("/upload")
	public R upload(@RequestParam("file") MultipartFile file,String type) throws Exception {
		if (file.isEmpty()) {
			throw new EIException("上传文件不能为空");
		}
		String fileExt = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")+1);
		File path = new File(ResourceUtils.getURL("classpath:static").getPath());
		if(!path.exists()) {
		    path = new File("");
		}
		File upload = new File(path.getAbsolutePath(),"/upload/");
		if(!upload.exists()) {
		    upload.mkdirs();
		}
		String fileName = new Date().getTime()+"."+fileExt;
		File dest = new File(upload.getAbsolutePath()+"/"+fileName);
		file.transferTo(dest);
		if(StringUtils.isNotBlank(type) && type.equals("1")) {
			ConfigEntity configEntity = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "faceFile"));
			if(configEntity==null) {
				configEntity = new ConfigEntity();
				configEntity.setName("faceFile");
				configEntity.setValue(fileName);
			} else {
				configEntity.setValue(fileName);
			}
			configService.insertOrUpdate(configEntity);
		}
		return R.ok().put("file", fileName);
	}
	
	/**
	 * 下载文件
	 */
	@IgnoreAuth
	@RequestMapping("/download")
	public ResponseEntity<byte[]> download(@RequestParam String fileName) {
		try {
			File path = new File(ResourceUtils.getURL("classpath:static").getPath());
			if(!path.exists()) {
			    path = new File("");
			}
			File upload = new File(path.getAbsolutePath(),"/upload/");
			if(!upload.exists()) {
			    upload.mkdirs();
			}
			File file = new File(upload.getAbsolutePath()+"/"+fileName);
			if(file.exists()){
				/*if(!fileService.canRead(file, SessionManager.getSessionUser())){
					getResponse().sendError(403);
				}*/
				HttpHeaders headers = new HttpHeaders();
			    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);    
			    headers.setContentDispositionFormData("attachment", fileName);    
			    return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.CREATED);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return new ResponseEntity<byte[]>(HttpStatus.INTERNAL_SERVER_ERROR);
	}
	
}

YinshixihaoController.java

package com.controller;

import java.io.File;
import java.math.BigDecimal;
import java.net.URL;
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.*;
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.*;
import com.entity.view.*;
import com.service.*;
import com.utils.PageUtils;
import com.utils.R;
import com.alibaba.fastjson.*;

/**
 * 饮食喜好
 * 后端接口
 * @author
 * @email
*/
@RestController
@Controller
@RequestMapping("/yinshixihao")
public class YinshixihaoController {
    private static final Logger logger = LoggerFactory.getLogger(YinshixihaoController.class);

    private static final String TABLE_NAME = "yinshixihao";

    @Autowired
    private YinshixihaoService yinshixihaoService;


    @Autowired
    private TokenService tokenService;
    @Autowired
    private DictionaryService dictionaryService;

    //级联表非注册的service
    //注册表service
    @Autowired
    private YonghuService yonghuService;
    @Autowired
    private JiashuService jiashuService;


    /**
    * 后端列表
    */
    @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(false)
            return R.error(511,"永不会进入");
        else if("老人".equals(role))
            params.put("yonghuId",request.getSession().getAttribute("userId"));
        else if("家属".equals(role))
            params.put("jiashuId",request.getSession().getAttribute("userId"));
        params.put("yinshixihaoDeleteStart",1);params.put("yinshixihaoDeleteEnd",1);
        CommonUtil.checkMap(params);
        PageUtils page = yinshixihaoService.queryPage(params);

        //字典表数据转换
        List<YinshixihaoView> list =(List<YinshixihaoView>)page.getList();
        for(YinshixihaoView c:list){
            //修改对应字典表字段
            dictionaryService.dictionaryConvert(c, request);
        }
        return R.ok().put("data", page);
    }

    /**
    * 后端详情
    */
    @RequestMapping("/info/{id}")
    public R info(@PathVariable("id") Long id, HttpServletRequest request){
        logger.debug("info方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
        YinshixihaoEntity yinshixihao = yinshixihaoService.selectById(id);
        if(yinshixihao !=null){
            //entity转view
            YinshixihaoView view = new YinshixihaoView();
            BeanUtils.copyProperties( yinshixihao , view );//把实体数据重构到view中
            //级联表 老人
            //级联表
            YonghuEntity yonghu = yonghuService.selectById(yinshixihao.getYonghuId());
            if(yonghu != null){
            BeanUtils.copyProperties( yonghu , view ,new String[]{ "id", "createTime", "insertTime", "updateTime", "yonghuId"});//把级联的数据添加到view中,并排除id和创建时间字段,当前表的级联注册表
            view.setYonghuId(yonghu.getId());
            }
            //修改对应字典表字段
            dictionaryService.dictionaryConvert(view, request);
            return R.ok().put("data", view);
        }else {
            return R.error(511,"查不到数据");
        }

    }

    /**
    * 后端保存
    */
    @RequestMapping("/save")
    public R save(@RequestBody YinshixihaoEntity yinshixihao, HttpServletRequest request){
        logger.debug("save方法:,,Controller:{},,yinshixihao:{}",this.getClass().getName(),yinshixihao.toString());

        String role = String.valueOf(request.getSession().getAttribute("role"));
        if(false)
            return R.error(511,"永远不会进入");
        else if("老人".equals(role))
            yinshixihao.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));

        Wrapper<YinshixihaoEntity> queryWrapper = new EntityWrapper<YinshixihaoEntity>()
            .eq("yinshixihao_name", yinshixihao.getYinshixihaoName())
            .eq("yinshixihao_types", yinshixihao.getYinshixihaoTypes())
            .eq("yonghu_id", yinshixihao.getYonghuId())
            .eq("yinshixihao_delete", yinshixihao.getYinshixihaoDelete())
            ;

        logger.info("sql语句:"+queryWrapper.getSqlSegment());
        YinshixihaoEntity yinshixihaoEntity = yinshixihaoService.selectOne(queryWrapper);
        if(yinshixihaoEntity==null){
            yinshixihao.setYinshixihaoDelete(1);
            yinshixihao.setCreateTime(new Date());
            yinshixihaoService.insert(yinshixihao);
            return R.ok();
        }else {
            return R.error(511,"表中有相同数据");
        }
    }

    /**
    * 后端修改
    */
    @RequestMapping("/update")
    public R update(@RequestBody YinshixihaoEntity yinshixihao, HttpServletRequest request) throws NoSuchFieldException, ClassNotFoundException, IllegalAccessException, InstantiationException {
        logger.debug("update方法:,,Controller:{},,yinshixihao:{}",this.getClass().getName(),yinshixihao.toString());
        YinshixihaoEntity oldYinshixihaoEntity = yinshixihaoService.selectById(yinshixihao.getId());//查询原先数据

        String role = String.valueOf(request.getSession().getAttribute("role"));
//        if(false)
//            return R.error(511,"永远不会进入");
//        else if("老人".equals(role))
//            yinshixihao.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));
        //根据字段查询是否有相同数据
        Wrapper<YinshixihaoEntity> queryWrapper = new EntityWrapper<YinshixihaoEntity>()
            .notIn("id",yinshixihao.getId())
            .andNew()
            .eq("yinshixihao_name", yinshixihao.getYinshixihaoName())
            .eq("yinshixihao_types", yinshixihao.getYinshixihaoTypes())
            .eq("yonghu_id", yinshixihao.getYonghuId())
            .eq("yinshixihao_delete", yinshixihao.getYinshixihaoDelete())
            ;

        logger.info("sql语句:"+queryWrapper.getSqlSegment());
        YinshixihaoEntity yinshixihaoEntity = yinshixihaoService.selectOne(queryWrapper);
        if("".equals(yinshixihao.getYinshixihaoPhoto()) || "null".equals(yinshixihao.getYinshixihaoPhoto())){
                yinshixihao.setYinshixihaoPhoto(null);
        }
        if(yinshixihaoEntity==null){
            yinshixihaoService.updateById(yinshixihao);//根据id更新
            return R.ok();
        }else {
            return R.error(511,"表中有相同数据");
        }
    }



    /**
    * 删除
    */
    @RequestMapping("/delete")
    public R delete(@RequestBody Integer[] ids, HttpServletRequest request){
        logger.debug("delete:,,Controller:{},,ids:{}",this.getClass().getName(),ids.toString());
        List<YinshixihaoEntity> oldYinshixihaoList =yinshixihaoService.selectBatchIds(Arrays.asList(ids));//要删除的数据
        ArrayList<YinshixihaoEntity> list = new ArrayList<>();
        for(Integer id:ids){
            YinshixihaoEntity yinshixihaoEntity = new YinshixihaoEntity();
            yinshixihaoEntity.setId(id);
            yinshixihaoEntity.setYinshixihaoDelete(2);
            list.add(yinshixihaoEntity);
        }
        if(list != null && list.size() >0){
            yinshixihaoService.updateBatchById(list);
        }

        return R.ok();
    }


    /**
     * 批量上传
     */
    @RequestMapping("/batchInsert")
    public R save( String fileName, HttpServletRequest request){
        logger.debug("batchInsert方法:,,Controller:{},,fileName:{}",this.getClass().getName(),fileName);
        Integer yonghuId = Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId")));
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            List<YinshixihaoEntity> yinshixihaoList = new ArrayList<>();//上传的东西
            Map<String, List<String>> seachFields= new HashMap<>();//要查询的字段
            Date date = new Date();
            int lastIndexOf = fileName.lastIndexOf(".");
            if(lastIndexOf == -1){
                return R.error(511,"该文件没有后缀");
            }else{
                String suffix = fileName.substring(lastIndexOf);
                if(!".xls".equals(suffix)){
                    return R.error(511,"只支持后缀为xls的excel文件");
                }else{
                    URL resource = this.getClass().getClassLoader().getResource("static/upload/" + fileName);//获取文件路径
                    File file = new File(resource.getFile());
                    if(!file.exists()){
                        return R.error(511,"找不到上传文件,请联系管理员");
                    }else{
                        List<List<String>> dataList = PoiUtil.poiImport(file.getPath());//读取xls文件
                        dataList.remove(0);//删除第一行,因为第一行是提示
                        for(List<String> data:dataList){
                            //循环
                            YinshixihaoEntity yinshixihaoEntity = new YinshixihaoEntity();
//                            yinshixihaoEntity.setYinshixihaoName(data.get(0));                    //食物名称 要改的
//                            yinshixihaoEntity.setYinshixihaoPhoto("");//详情和图片
//                            yinshixihaoEntity.setYinshixihaoTypes(Integer.valueOf(data.get(0)));   //食物类型 要改的
//                            yinshixihaoEntity.setYonghuId(Integer.valueOf(data.get(0)));   //老人 要改的
//                            yinshixihaoEntity.setYinshixihaoContent("");//详情和图片
//                            yinshixihaoEntity.setYinshixihaoDelete(1);//逻辑删除字段
//                            yinshixihaoEntity.setCreateTime(date);//时间
                            yinshixihaoList.add(yinshixihaoEntity);


                            //把要查询是否重复的字段放入map中
                        }

                        //查询是否重复
                        yinshixihaoService.insertBatch(yinshixihaoList);
                        return R.ok();
                    }
                }
            }
        }catch (Exception e){
            e.printStackTrace();
            return R.error(511,"批量插入数据异常,请联系管理员");
        }
    }





}

NewsServiceImpl.java
package com.service.impl;

import com.utils.StringUtil;
import com.service.DictionaryService;
import com.utils.ClazzDiff;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
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 javax.servlet.http.HttpServletRequest;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import com.dao.NewsDao;
import com.entity.NewsEntity;
import com.service.NewsService;
import com.entity.view.NewsView;

/**
 * 公告信息 服务实现类
 */
@Service("newsService")
@Transactional
public class NewsServiceImpl extends ServiceImpl<NewsDao, NewsEntity> implements NewsService {

    @Override
    public PageUtils queryPage(Map<String,Object> params) {
        Page<NewsView> page =new Query<NewsView>(params).getPage();
        page.setRecords(baseMapper.selectListView(page,params));
        return new PageUtils(page);
    }


}

声明

本博客适用于广泛的学术和教育用途,包括但不限于个人学习、开发设计,产品设计。仅供学习参考,旨在为读者提供深入理解和学术研究的材料。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2048411.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Hive3:简单ETL实操案例

一、ETL概念简介 ETL&#xff1a; E&#xff0c;Extract&#xff0c;抽取 T&#xff0c;Transform&#xff0c;转换 L&#xff0c;Load&#xff0c;加载 从A抽取数据(E)&#xff0c;进行数据转换过滤(T)&#xff0c;将结果加载到B(L)&#xff0c;就是ETL 二、情景描述 聊天平…

数据结构(邓俊辉)学习笔记】优先级队列 04——完全二叉堆:插入与上滤

文章目录 1. 上滤2. 实例3. 实现4. 效率 1. 上滤 好&#xff0c;接下来我们就来学习在一个完全二叉堆中&#xff0c;如何有效地插入一个新的元素。我们将会看到插入过程中的核心技巧是所谓的 ”上滤“ 过程。 为了在完全二叉堆中引入一个新的词条 e&#xff0c;我们只需在物…

【网络编程】TCP实现网络通信(C语言、Ubuntu实现)

TCP服务器通信模型&#xff1a;&#xff08;分为以下6个步骤&#xff09; 1、sfd socket(); //创建一个用于连接的套接字文件描述符 2、bind(); //为服务器套接字绑定ip地址和端口号&#xff0c;为了让客户端额能够找到服务器 3、l…

C++第三十七弹---深入理解红黑树:旋转、着色与性质维护

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1 红黑树 1.1 红黑树的概念 1.2 红黑树的性质 1.3 红黑树节点的定义 1.4 红黑树结构 1.5 红黑树的插入操作 1.6 红黑树的验证 1.7 红黑树与…

XSS的一些相关案例及DOM破坏的案例

目录 第一关 第二关 第三关 第四关 第五关 第六关 第七关 第八关(DOM破坏) 网址&#xff1a;XSS Game - Learning XSS Made Simple! | Created by PwnFunction 第一关 来分析一下代码 就是一个URL类里进行一个get接收参数(somebody)如果没参数就默认接收(Somebody)这…

C++仿C#实现事件处理

测试 #include "beacon/beacon.hpp" #include <cstdio> #include <thread>class mouseEvent : public beacon::args { public:mouseEvent(int x, int y) : x(x), y(y) {}int x, y; };class object : public beacon::sender { public:};class mouseHandl…

6大企业必备的公司常用的加密软件推荐|2024公司常用加密软件推荐!

2024年上半年&#xff0c;企业对于数据加密的需求日益增长&#xff0c;以确保数据在存储和传输过程中的安全性。以下是六款企业常用的加密软件推荐&#xff0c;它们各具特色&#xff0c;能够满足不同企业的加密需求&#xff1a; 1.NordLocker&#xff1a; 特点&#xff1a;它是…

【Linux系列】telnet使用入门

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

什么是视频比特率?与视频时长是什么关系

​ ‌比特率是指单位时间内传输或处理的比特的数量&#xff0c;单位为‌bps(‌bit per second)。‌ 比特率经常用于描述在电信和计算领域中数据传输的速度&#xff0c;也可以作为衡量音频和视频文件数据率的指标。比特率越高&#xff0c;传送的数据越大&#xff0c;音频或视频…

Ubuntu安装Anaconda3

本文详细阐述了在 Ubuntu 系统中安装 Anaconda3 的完整流程。包括 Anaconda3 安装包的获取途径&#xff0c;具体安装过程中的每一个步骤及注意事项&#xff0c;还有安装后的环境变量设置和安装成功的验证方法。旨在为 Ubuntu 用户提供清晰、易懂且准确的 Anaconda3 安装指南&am…

Windows Microsoft Edge 浏览器 配置【密码】

在浏览 Web 时&#xff0c;Microsoft Edge 可以轻松保存密码。 在桌面或移动设备上的 Edge 浏览器中输入新密码时&#xff0c;Microsoft Edge 会询问你是否要记住用户名和密码。 下次访问该网站时&#xff0c;浏览器将完成帐户信息的填写。 如果使用 Microsoft 帐户登录到 Edg…

重塑业务生态,Vatee万腾平台:引领行业变革的新引擎

在数字经济浪潮汹涌的今天&#xff0c;传统行业的边界正被不断模糊与重塑&#xff0c;新兴技术如云计算、大数据、人工智能等正以前所未有的速度改变着商业世界的面貌。在这一背景下&#xff0c;Vatee万腾平台应运而生&#xff0c;以其独特的创新模式和强大的技术实力&#xff…

i.MX6裸机开发(1):环境搭建

1. 熟悉sdk SDK&#xff08;Software Development Kit&#xff09;是NXP针对其官方评估 版的软件开发包&#xff0c;可以在NXP的官网下载得到。SDK中包含了 各种程序范例&#xff0c;我们心心念念的固件库也包含在它里边。 NXP官网链接&#xff1a;https://www.nxp.com 未登录…

Camera基础知识系列(2)——对焦和变焦

目录 一. 引言 二. 对焦 定义&#xff1a; 原理 三. 变焦 定义 用途 四. 总结 一. 引言 这一节简单聊一下对焦和变焦&#xff0c;这两个是摄影种出现的高频词&#xff0c;但这里把它们放一起讲&#xff0c;主要还是因为它们在字面上就一字之差&#xff0c;初次接触…

XSS DOM破坏实战案例

目录 案例一 思考 源码分析 查找问题 实现 案例二 查看源码 问题查找 实现 实验环境&#xff1a;DOM clobbering | Web Security Academy (portswigger.net) 案例一 里面是一篇篇的博客&#xff0c;点击进去里面是一些评论 思考 尝试一些常规的xss 没什么效果... 他将…

Java、python、php版的企业单位考勤打卡管理系统的设计与实现(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

无人机之螺旋桨的安装与维护

一、安装&#xff1a;正确安装桨叶至关重要。请确保顺时针旋转的桨叶安装在对应的电机上&#xff0c;并使逆时针旋转的桨叶安装在相应的电机上。否则&#xff0c;无人机可能无法正常飞行或失去控制。 二、维护&#xff1a;为了确保无人机的安全及长久使用&#xff0c;请定期检…

pytorch-AutoEncoders

目录 1. 监督学习&无监督学习1.1 监督学习1.2 无监督学习1.3 为什么需要无监督学习 2. AutoEncoders3. Auto Encoders loss function4. PCA VS Auto Encoders5. Auto Encoders的变种5.1 Denoising Auto Encoders5.2 Dropout AutoEncoders5.3 Adversarial AutoEncoders5.4 V…

使用 Python构建 Windows 进程管理器应用程序

在这篇博客中&#xff0c;我们将探讨如何使用 wxPython 构建一个简单的 Windows 进程管理器应用程序。这个应用程序允许用户列出当前系统上的所有进程&#xff0c;选择和终止进程&#xff0c;并将特定进程保存到文件中以供将来加载。 C:\pythoncode\new\manageprocess.py 全部…

打击盗版,禁止盗版软件联网!电脑下载了不安全的“软件”,怎么禁止它联网?这三种方法最常用!

数字化时代&#xff0c;盗版软件的泛滥不仅侵犯了软件开发者的知识产权&#xff0c;还严重威胁到用户的网络安全和数据安全。当不慎在电脑上下载了不安全的盗版软件时&#xff0c;如何有效地禁止其联网&#xff0c;成为保护个人或企业信息、系统安全的重要一环。 本文将为您介…