社区帮扶对象管理系统pf

news2024/9/23 1:39:48

@TOC

springboot419社区帮扶对象管理系统pf

第1章 绪论

1.1 课题背景

互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。所以各行业,尤其是规模较大的企业和学校等都开始借助互联网和软件工具管理信息,传播信息,共享信息等等,以此可以增强自身实力,提高在同行业当中的竞争能力,并从各种激烈的竞争中获取发展的机会。针对捐款项目信息管理混乱,出错率高,信息安全性差,劳动强度大,费时费力等问题,经过分析和考虑,在目前的情况下,可以引进一款社区帮扶对象管理系统这样的现代化管理工具,这个工具就是解决上述问题的最好的解决方案。它不仅可以实时完成信息处理,还缩短捐款项目信息管理流程,使其系统化和规范化。同时还可以减少工作量,节约捐款项目信息管理需要的人力和资金。所以社区帮扶对象管理系统是信息管理环节中不可缺少的工具,它对管理者来说非常重要。

1.2 课题意义

现如今,信息种类变得越来越多,信息的容量也变得越来越大,这就是信息时代的标志。近些年,计算机科学发展得也越来越快,而且软件开发技术也越来越成熟,因此,在生活中的各个领域,只要存在信息管理,几乎都有计算机的影子,可以说很多行业都采用计算机的方式管理信息。信息计算机化处理相比手工操作,有着保密性强,效率高,存储空间大,成本低等诸多优点。针对捐款项目信息管理,采用社区帮扶对象管理系统可以有效管理,使信息管理能够更加科学和规范。

总之,在实际中使用社区帮扶对象管理系统,其意义如下:

第一点:社区帮扶对象管理系统的实际运用,可以帮助管理人员在短时间内完成信息处理工作;

第二点:通过系统页面的合理排版布局,可以更加直观的展示系统的内容,并且使用者可以随时阅读页面信息,随时操作系统提供的功能;

第三点:可以实现信息管理计算机化;

第四点:可以降低信息管理成本;

1.3 研究内容

对社区帮扶对象管理系统设计制作,不仅需要技术支撑,也需要大量的理论研究。本文在对社区帮扶对象管理系统进行介绍时,将按照如下内容进行。

第一部分:介绍社区帮扶对象管理系统研究的背景意义,便于用户了解系统;

第二部分:介绍开发社区帮扶对象管理系统需要搭建的环境,包括技术和工具;

第三部分:介绍用户对社区帮扶对象管理系统的功能要求,以及对社区帮扶对象管理系统的性能要求等;

第四部分:介绍数据库的设计方案,以及根据功能要求设计的功能结构;

第五部分:介绍通过编码最终实现的系统功能运行效果;

第六部分:介绍系统的功能测试,对系统进行综合检测,并及时解决系统出现的问题,直至系统运行正常。

第2章 开发环境与技术

社区帮扶对象管理系统的编码实现需要搭建一定的环境和使用相应的技术,接下来的内容就是对社区帮扶对象管理系统用到的技术和工具进行介绍。

2.1 MYSQL数据库

本课题所开发的应用程序在数据操作方面是不可预知的,是经常变动的,没有办法直接把数据写在文档里,这样不仅仅不安全,也不能实现应用程序的功能。如果要能实现应用程序所需要的数据存储功能,就避免不了要进行专业数据库存储软件的选择。基本上应用程序实现的功能不算太复杂,市面上任何一个关系型数据库软件都可以实现。参考自己的学习进度和操作习惯来讲,Oracle数据库是适合的,但是所需要的的安装软件很大,并且有好多不需要的功能都是开启的状态,十分消耗电脑资源,所以没有选择Oracle数据库,而SQL Server数据库虽然学过,但是安装的时候因为电脑上可能有其他的软件存在,经常性的出问题,而安装问题不好解决就需要重新安装操作系统,这样对已经存在的软件来讲又是一种时间上的浪费。只有MySQL数据库,安装包小,安装速度快,操作简单,哪怕安装出问题也好解决,不用重装操作系统,也不影响电脑上运行的其他软件,消耗资源也少,最重要的是在功能方面完全的符合设计需要,所以最后选择了MySQL数据库作为应用软件开发需要的数据库。

2.2 vue技术

在动态网站的兴起之初,作为高级编程语言的Java自然不会放弃这个领域的蛋糕。Sun公司推出了Servlet作为输出动态网站的一种技术标准,虽然不怎么受当时程序员的喜爱,但是当初也没有太多的选择,随后几个月java语言问世,不考虑性能和效率如何,起码在书写网页所需要的动态代码块和静态代码块方面进行了区分,让书写效率和可读效率大大的提升,所以很多Java程序员以及刚入行的初级程序员都选择了java语言作为自己职业的发展方向,Sun公司为了维护Java语言在高级编程语言上的江湖地位,防止java继续抢走市场份额占有率,Sun公司联合Apache基金会研发了一个关于Java动态网页的一个新型的技术标准,这就是vue技术。vue吸取了java语言在页面书写上面的所有优点,但是又背靠Java EE的庞大后台,又能实现很多通过Java组件就能实现的功能,在vue页面上可以直接引用那些组件,让vue更加的强壮丰富。保证了Java技术纵向的可持续发展,并且在动态网站开发领域终于站稳了脚跟,其他java开发人员可以很快的转移到vue进行开发,不考虑一些特殊组件或者功能的开发,只从动态页面的开发上来讲,完全实现了java程序和vue程序的几乎无成本的转换,vue技术就这样的发展了起来。

2.3 Spring Boot框架

Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。

SpringBoot基于Spring4.0设计,不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。另外SpringBoot通过集成大量的框架使得依赖包的版本冲突,以及引用的不稳定性等问题得到了很好的解决。

SpringBoot框架中还有两个非常重要的策略:开箱即用和约定优于配置。开箱即用,Outofbox,是指在开发过程中,通过在MAVEN项目的pom文件中添加相关依赖包,然后使用对应注解来代替繁琐的XML配置文件以管理对象的生命周期。这个特点使得开发人员摆脱了复杂的配置工作以及依赖的管理工作,更加专注于业务逻辑。约定优于配置,Convention over configuration,是一种由SpringBoot本身来配置目标结构,由开发者在结构中添加信息的软件设计范式。这一特点虽降低了部分灵活性,增加了BUG定位的复杂性,但减少了开发人员需要做出决定的数量,同时减少了大量的XML配置,并且可以将代码编译、测试和打包等工作自动化。

SpringBoot应用系统开发模板的基本架构设计从前端到后台进行说明:前端常使用模板引擎,主要有FreeMarker和Thymeleaf,它们都是用Java语言编写的,渲染模板并输出相应文本,使得界面的设计与应用的逻辑分离,同时前端开发还会使用到Bootstrap、AngularJS、JQuery等;在浏览器的数据传输格式上采用Json,非xml,同时提供RESTfulAPI;SpringMVC框架用于数据到达服务器后处理请求;到数据访问层主要有Hibernate、MyBatis、JPA等持久层框架;数据库常用MySQL;开发工具推荐IntelliJIDEA。

第3章 系统分析

面对即将开发的系统,进行提前的分析是必要的。这也是开发流程中必须有的环节。通常分析系统期间,主要涉及的内容包括系统开发可行性问题,对系统功能和性能的分析等问题。

3.1 可行性分析

在正式对需要建设的项目进行投资前,有一个比较关键的步骤是不能缺少的,那就是可行性分析。它主要从当前技术,经济等角度去评估系统的可行性,在投资决策中常常采用这种科学的方法来论证项目。

3.1.1 技术可行性

当前,系统开发的技术已经发展成熟,而且通过计算机网络可以获取开发工具的使用方法,以及规范化编写的模块化代码,这些知识可以帮助开发者顺利完成本系统的编码工作。

3.1.2 经济可行性

本系统开发期间需要配置的软件环境,可以免费通过开发类官网下载安装,需要配置的硬件设备也不需要具备很高的性能,通常网吧电脑,或学校计算机机房的电脑都符合要求。因此,从经济方面考虑,社区帮扶对象管理系统开发可行。

3.1.3 操作可行性

社区帮扶对象管理系统根据用户使用习惯进行开发,设计的界面具有统一性,并具备优秀的导航功能。所以,只要会简单操作电脑的人员,可以无压力操作社区帮扶对象管理系统。

总之,从上述的论证来看,本系统可以开发。

3.2 系统流程

流程图这样的工具可以直观反映出系统内部的操作逻辑,可以帮助用户更好的理解系统。

3.2.1 操作流程

进入本系统需要访问者提供验证信息。验证合格的访问者才能获取访问资格。其具体的操作流程见下图。访问者根据登录界面设置的信息项如实填写,待信息通过验证后,访问者可以进入指定的页面享受本系统提供的服务和阅读本系统的相关信息。

图3.1 操作流程图

3.2.2 登录流程

本系统的登录模块,其内部的流程见下图。主要对访问本系统的人员提供的验证信息进行逐个判断,系统面对录入错误的信息会给出提示,比如,提示账号不对,或提示密码不匹配等提示信息。总之,在登录页面填写的所有信息都符合要求,访问者就登录成功了。

图3.2 登录流程图

3.2.3 删除信息流程

本系统在经常性的使用后,会产生很多失去价值的信息,因此就需要及时清理数据,腾出系统的空间。对这些数据进行清理时,其对应的流程见下图。先选中要清理的数据,通过反复确认需要清理的数据,避免操作人员误删。已经删除的数据就不会出现在系统里面。

图3.3 删除信息流程图

3.2.4 添加信息流程

本系统主要用于显示信息,提供服务,其中,数据添加功能就是其中的服务之一,具体流程见下图。让操作者在信息添加的页面录入数据,待这些数据被提交检验合格后,就会在系统指定页面显示出来。

图3.4 添加信息流程图

3.3 性能需求

进行需求分析,包括了根据用户实际需求制定功能,也涵盖了对即将设计的系统进行性能上的需求分析。所以一般分析系统时,一方面要分析系统功能,另一方面也要分析系统的性能。毕竟设计开发出一个好性能的系统可以确保系统的质量可靠。

接下来分析系统的性能,还要从界面友好性,系统的时间特性,系统的可靠性等方面来分析说明。

(1)时间特性要求:系统处理数据都有时间要求,这也是系统的时间特性。通常都会把数据处理的时间进行分析,也会设置用户请求的响应时间,还有系统在满负荷运行时可以偏离的范围数值等都需要提前分析确定。

(2)界面友好性:除了功能上需要考虑用户需求外,在人机交互界面的设计上,也需要考虑用户的使用习惯,包括界面的布局,界面基调选择以及颜色搭配等。尽量做到用户在接受简单的培训之后,可以对系统进行独立操作。

(3)系统可靠性:对于初学者而言,很容易出现一个问题,就是设计开发的系统,因为人为的误操作出现崩溃,有些也会导致电脑死机。这样的现象也说明这种容错能力低下的系统是不可靠的。完全不能作为生活中处理信息的系统。当下,系统开发要保证可靠性,设计时,把模块化和结构化的设计理念也考虑进来。如果遇到对时效性要求比较严格的系统,也需要采取其它的措施,比如双机系统,还有磁盘阵列等方式。还有就是一个可靠性的系统,对设备的供电能力也有要求。

第4章 系统设计

一个成功设计的系统在内容上必定是丰富的,在系统外观或系统功能上必定是对用户友好的。所以为了提升系统的价值,吸引更多的访问者访问系统,以及让来访用户可以花费更多时间停留在系统上,则表明该系统设计得比较专业。

4.1 设计原则

本系统在设计过程中需要依照一定的设计原则进行,目的就是为了让开发的系统具备高质量,齐全完备的功能,方便简单的操作,如此才可以最大限度的满足使用者的要求。系统设计原则除了基本的易操作原则外,还有安全性原则,准确性原则。

第一个设计原则:易操作原则,针对本系统设计的功能要完备齐全,编码时,设计的各个接口要具备友好性,使用者一旦使用本系统时,要能够轻松上手,操作本系统处理数据时,要具备便利性。此外,也需要设计一些必要提示,引导使用者操作系统。

第二个设计原则:安全性原则,本系统在登录模块要对各个访问者进行身份验证,系统会通过访问者输入的信息进行判断,使用提前编写的安全验证代码进行数据比对,引导匹配成功的访问者进入指定的操作界面。这样可以避免无关性访问者窃取系统的数据。

第三个设计原则:准确性原则,为了保证使用者登记的数据是正确的,需要提前设计数据纠错机制,让使用者可以通过系统的报错提示,仔细检查登记的错误信息,并及时纠正错误,填写规范正确的信息。比如设置密码时,要求密码的长度不能低于6个字符,且数据类型要求不能全部是数字等都能进行规范。

4.2 功能结构设计

在前面分析的管理员功能的基础上,进行接下来的设计工作,最终展示设计的管理员结构图(见下图)。管理员增删改查捐款项目

结构设计图

4.3 数据库设计

开发一个系统也需要提前设计数据库。这里的数据库是相关数据的集合,存储在一起的这些数据也是按照一定的组织方式进行的。目前,数据库能够服务于多种应用程序,则是源于它存储方式最佳,具备数据冗余率低的优势。虽然数据库为程序提供信息存储服务,但它与程序之间也可以保持较高的独立性。总而言之,数据库经历了很长一段时间的发展,从最初的不为人知,到现在的人尽皆知,其相关技术也越发成熟,同时也拥有着坚实的理论基础。

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

C:/Users/Administrator/Desktop/temp111\1\____img\用户.jpg 用户实体属性图

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

C:/Users/Administrator/Desktop/temp111\1\____img\社区公告.jpg 社区公告实体属性图

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

C:/Users/Administrator/Desktop/temp111\1\____img\档案.jpg 档案实体属性图

(4)下图是捐款项目留言实体和其具备的属性。

C:/Users/Administrator/Desktop/temp111\1\____img\捐款项目留言.jpg 捐款项目留言实体属性图

(5)下图是捐款项目实体和其具备的属性。

C:/Users/Administrator/Desktop/temp111\1\____img\捐款项目.jpg 捐款项目实体属性图

(6)下图是志愿者实体和其具备的属性。

C:/Users/Administrator/Desktop/temp111\1\____img\志愿者.jpg 志愿者实体属性图

(7)下图是论坛实体和其具备的属性。

C:/Users/Administrator/Desktop/temp111\1\____img\论坛.jpg 论坛实体属性图

(8)下图是物品留言实体和其具备的属性。

C:/Users/Administrator/Desktop/temp111\1\____img\物品留言.jpg 物品留言实体属性图

(9)下图是帮扶申请实体和其具备的属性。

C:/Users/Administrator/Desktop/temp111\1\____img\帮扶申请.jpg 帮扶申请实体属性图

(10)下图是物品交换实体和其具备的属性。

C:/Users/Administrator/Desktop/temp111\1\____img\物品交换.jpg 物品交换实体属性图

(11)下图是帮扶对象实体和其具备的属性。

C:/Users/Administrator/Desktop/temp111\1\____img\帮扶对象.jpg 帮扶对象实体属性图

(12)下图是物品收藏实体和其具备的属性。

C:/Users/Administrator/Desktop/temp111\1\____img\物品收藏.jpg 物品收藏实体属性图

(13)下图是申请交换实体和其具备的属性。

C:/Users/Administrator/Desktop/temp111\1\____img\申请交换.jpg 申请交换实体属性图

4.3.2 数据库物理设计

本数据库是关系型数据库,因此对二维表的结构设计也比较关键。毕竟二维表格模型就是关系型数据库中的关系模型。而一些常用的关系模型中的概念也需要了解,才可以对关系模型进行设计。下面就简单介绍关系,元组,属性,域,关键字等常用概念的含义。

关系:关系就是数据库中的一张数据表,每张数据表都有命名,也就是每个关系也有名字,那就是数据表名;

元组:元组就是数据表中的一行记录;

属性:属性就是数据表中的字段,也就是数据表中的一列;

域:域就是对数据表中属性的取值进行限定;

关键字:关键字就是数据表中的主键;

在了解了表结构设计的常用概念后,接下来就需要使用前面绘制的E-R模型完成表结构的设计工作,并在数据库中创建数据表,并为各个数据表进行命名。以下就对设计的结果通过表格形式进行展示。

表4.1帮扶对象表

序号列名数据类型说明允许空
1IdIntid
2yonghu_idInteger用户
3bangfuduixiang_typesInteger帮扶类型
4bangfuduixiang_contentString帮扶详情
5bangfuduixiang_deleteInteger逻辑删除
6insert_timeDate录入时间
7create_timeDate创建时间

表4.2帮扶申请表

序号列名数据类型说明允许空
1IdIntid
2yonghu_idInteger用户
3bangfushenqing_textString申请原因
4bangfushenqing_fileString凭证文件
5bangfuduixiang_typesInteger帮扶类型
6bangfushenqing_yesno_typesInteger交换状态
7bangfushenqing_yesno_textString回复
8insert_timeDate申请时间
9create_timeDate创建时间

表4.3档案表

序号列名数据类型说明允许空
1IdIntid
2dangan_nameString档案标题
3dangan_typesInteger档案类型
4dangan_fileString基础病史
5yonghu_idInteger用户
6dangan_contentString档案详情
7dangan_deleteInteger逻辑删除
8insert_timeDate录入时间
9create_timeDate创建时间

表4.4字典表

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

表4.5论坛表

序号列名数据类型说明允许空
1IdIntid
2forum_nameString帖子标题
3zhiyuanzhe_idInteger志愿者
4yonghu_idInteger用户
5users_idInteger管理员
6forum_contentString发布内容
7super_idsInteger父id
8forum_state_typesInteger帖子状态
9insert_timeDate发帖时间
10update_timeDate修改时间
11create_timeDate创建时间

表4.6捐款项目表

序号列名数据类型说明允许空
1IdIntid
2juankuanxiangm_nameString项目名称
3juankuanxiangm_photoString封面
4zhiyuanzhe_idInteger志愿者
5juankuanxiangm_typesInteger项目类型
6juankuanxiangm_xuqiuInteger捐款数值
7juankuanxiangm_qudaoString捐款渠道
8juankuanxiangm_contentString项目介绍
9juankuanxiangm_yesno_typesInteger项目审核
10juankuanxiangm_yesno_textString审核回复
11juankuanxiangm_deleteInteger逻辑删除
12insert_timeDate录入时间
13create_timeDate创建时间

表4.7捐款项目留言表

序号列名数据类型说明允许空
1IdIntid
2juankuanxiangm_idInteger物品
3yonghu_idInteger用户
4juankuanxiangm_liuyan_textString留言内容
5insert_timeDate留言时间
6reply_textString回复内容
7update_timeDate回复时间
8create_timeDate创建时间

表4.8社区公告表

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

表4.9物品交换表

序号列名数据类型说明允许空
1IdIntid
2wupin_nameString物品名称
3wupin_photoString封面
4wupin_typesInteger物品类型
5wupin_xuqiuString交换需求
6yonghu_idInteger用户
7wupin_contentString物品介绍
8wupin_deleteInteger逻辑删除
9insert_timeDate录入时间
10create_timeDate创建时间

表4.10物品收藏表

序号列名数据类型说明允许空
1IdIntid
2wupin_idInteger物品
3yonghu_idInteger用户
4wupin_collection_typesInteger类型
5insert_timeDate收藏时间
6create_timeDate创建时间

表4.11物品留言表

序号列名数据类型说明允许空
1IdIntid
2wupin_idInteger物品
3yonghu_idInteger用户
4wupin_liuyan_textString留言内容
5insert_timeDate留言时间
6reply_textString回复内容
7update_timeDate回复时间
8create_timeDate创建时间

表4.12申请交换表

序号列名数据类型说明允许空
1IdIntid
2wupin_idInteger物品
3yonghu_idInteger用户
4wupin_yuyue_textString交换物品详情
5wupin_yuyue_yesno_typesInteger交换状态
6wupin_yuyue_yesno_textString回复
7insert_timeDate申请时间
8create_timeDate创建时间

表4.13用户表

序号列名数据类型说明允许空
1IdIntid
2yonghu_nameString用户姓名
3yonghu_phoneString用户手机号
4yonghu_id_numberString用户身份证号
5yonghu_photoString用户头像
6jiaren_photoString家人联系方式
7yonghu_emailString用户邮箱
8create_timeDate创建时间

表4.14志愿者表

序号列名数据类型说明允许空
1IdIntid
2zhiyuanzhe_nameString志愿者姓名
3zhiyuanzhe_phoneString志愿者手机号
4zhiyuanzhe_id_numberString志愿者身份证号
5zhiyuanzhe_photoString志愿者头像
6zhiyuanzhe_emailString志愿者邮箱
7create_timeDate创建时间

表4.15管理员表

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

5.1用户信息管理

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

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

图5.1 用户信息管理页面

5.2 捐款项目管理

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

图5.2 捐款项目管理页面

5.3档案信息管理

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

图5.3 档案信息管理页面

5.1公告信息管理

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

图5.4 公告信息管理页面

MPUtil.java
package com.utils;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;

import cn.hutool.core.bean.BeanUtil;

import com.baomidou.mybatisplus.mapper.Wrapper;

/**
 * Mybatis-Plus工具类
 */
public class MPUtil {
	public static final char UNDERLINE = '_';

	
	//mybatis plus allEQ 表达式转换
		public static Map allEQMapPre(Object bean,String pre) {
		   Map<String, Object> map =BeanUtil.beanToMap(bean);
		  return camelToUnderlineMap(map,pre);
	   }

		//mybatis plus allEQ 表达式转换
		public static Map allEQMap(Object bean) {
		   Map<String, Object> map =BeanUtil.beanToMap(bean);
		   return camelToUnderlineMap(map,"");
	   }

		public static Wrapper allLikePre(Wrapper wrapper,Object bean,String pre) {
			   Map<String, Object> map =BeanUtil.beanToMap(bean);
			   Map result = camelToUnderlineMap(map,pre);
			 
			return genLike(wrapper,result);
		}
	
		public static Wrapper allLike(Wrapper wrapper,Object bean) {
			  Map result = BeanUtil.beanToMap(bean, true, true);			 
			return genLike(wrapper,result);
		}
	
	
		public static Wrapper genLike( Wrapper wrapper,Map param) {
			Iterator<Map.Entry<String, Object>> it = param.entrySet().iterator();
			int i=0;
			while (it.hasNext()) {
				if(i>0) wrapper.and();
				Map.Entry<String, Object> entry = it.next();
				String key = entry.getKey();
				String value = (String) entry.getValue();
				wrapper.like(key, value);
				i++;
			}
			return wrapper;
		}
		
		public static Wrapper likeOrEq(Wrapper wrapper,Object bean) {
			  Map result = BeanUtil.beanToMap(bean, true, true);			 
			return genLikeOrEq(wrapper,result);
		}
		
		public static Wrapper genLikeOrEq( Wrapper wrapper,Map param) {
			Iterator<Map.Entry<String, Object>> it = param.entrySet().iterator();
			int i=0;
			while (it.hasNext()) {
				if(i>0) wrapper.and();
				Map.Entry<String, Object> entry = it.next();
				String key = entry.getKey();
				if(entry.getValue().toString().contains("%")) {
					wrapper.like(key, entry.getValue().toString().replace("%", ""));
				} else {
					wrapper.eq(key, entry.getValue());
				}
				i++;
			}
			return wrapper;
		}
		
		public static Wrapper allEq(Wrapper wrapper,Object bean) {
			  Map result = BeanUtil.beanToMap(bean, true, true);			 
			return genEq(wrapper,result);
		}
	
	
		public static Wrapper genEq( Wrapper wrapper,Map param) {
			Iterator<Map.Entry<String, Object>> it = param.entrySet().iterator();
			int i=0;
			while (it.hasNext()) {
				if(i>0) wrapper.and();
				Map.Entry<String, Object> entry = it.next();
				String key = entry.getKey();
				wrapper.eq(key, entry.getValue());
				i++;
			}
			return wrapper;
		}
	
	
		public static Wrapper between(Wrapper wrapper,Map<String, Object> params) {
			for(String key : params.keySet()) {
				String columnName = "";
				if(key.endsWith("_start")) {
					columnName = key.substring(0, key.indexOf("_start"));
					if(StringUtils.isNotBlank(params.get(key).toString())) {
						wrapper.ge(columnName, params.get(key));
					}
				}
				if(key.endsWith("_end")) {
					columnName = key.substring(0, key.indexOf("_end"));
					if(StringUtils.isNotBlank(params.get(key).toString())) {
						wrapper.le(columnName, params.get(key));
					}
				}
			}
			return wrapper;
		}
	
		public static Wrapper sort(Wrapper wrapper,Map<String, Object> params) {
			String order = "";
			if(params.get("order") != null && StringUtils.isNotBlank(params.get("order").toString())) {
				order = params.get("order").toString();
			}
			if(params.get("sort") != null && StringUtils.isNotBlank(params.get("sort").toString())) {
				if(order.equalsIgnoreCase("desc")) {
					wrapper.orderDesc(Arrays.asList(params.get("sort")));
				} else {
					wrapper.orderAsc(Arrays.asList(params.get("sort")));
				}
			}
			return wrapper;
		}
	
	
	/**
	 * 驼峰格式字符串转换为下划线格式字符串
	 * 
	 * @param param
	 * @return
	 */
	public static String camelToUnderline(String param) {
		if (param == null || "".equals(param.trim())) {
			return "";
		}
		int len = param.length();
		StringBuilder sb = new StringBuilder(len);
		for (int i = 0; i < len; i++) {
			char c = param.charAt(i);
			if (Character.isUpperCase(c)) {
				sb.append(UNDERLINE);
				sb.append(Character.toLowerCase(c));
			} else {
				sb.append(c);
			}
		}
		return sb.toString();
	}

	public static void main(String[] ages) {
		System.out.println(camelToUnderline("ABCddfANM"));
	}
	
	public static Map camelToUnderlineMap(Map param, String pre) {

		Map<String, Object> newMap = new HashMap<String, Object>();
		Iterator<Map.Entry<String, Object>> it = param.entrySet().iterator();
		while (it.hasNext()) {
			Map.Entry<String, Object> entry = it.next();
			String key = entry.getKey();
			String newKey = camelToUnderline(key);
			if (pre.endsWith(".")) {
				newMap.put(pre + newKey, entry.getValue());
			} else if (StringUtils.isEmpty(pre)) {
				newMap.put(newKey, entry.getValue());
			} else {

				newMap.put(pre + "." + newKey, entry.getValue());
			}
		}
		return newMap;
	}
}

BangfushenqingController.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("/bangfushenqing")
public class BangfushenqingController {
    private static final Logger logger = LoggerFactory.getLogger(BangfushenqingController.class);

    private static final String TABLE_NAME = "bangfushenqing";

    @Autowired
    private BangfushenqingService bangfushenqingService;


    @Autowired
    private TokenService tokenService;

    @Autowired
    private BangfuduixiangService bangfuduixiangService;//帮扶对象
    @Autowired
    private DanganService danganService;//档案
    @Autowired
    private DictionaryService dictionaryService;//字典
    @Autowired
    private ForumService forumService;//论坛
    @Autowired
    private JuankuanxiangmService juankuanxiangmService;//捐款项目
    @Autowired
    private JuankuanxiangmLiuyanService juankuanxiangmLiuyanService;//捐款项目留言
    @Autowired
    private NewsService newsService;//社区公告
    @Autowired
    private WupinService wupinService;//物品交换
    @Autowired
    private WupinCollectionService wupinCollectionService;//物品收藏
    @Autowired
    private WupinLiuyanService wupinLiuyanService;//物品留言
    @Autowired
    private WupinYuyueService wupinYuyueService;//申请交换
    @Autowired
    private YonghuService yonghuService;//用户
    @Autowired
    private ZhiyuanzheService zhiyuanzheService;//志愿者
    @Autowired
    private UsersService usersService;//管理员


    /**
    * 后端列表
    */
    @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("zhiyuanzheId",request.getSession().getAttribute("userId"));
        CommonUtil.checkMap(params);
        PageUtils page = bangfushenqingService.queryPage(params);

        //字典表数据转换
        List<BangfushenqingView> list =(List<BangfushenqingView>)page.getList();
        for(BangfushenqingView 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);
        BangfushenqingEntity bangfushenqing = bangfushenqingService.selectById(id);
        if(bangfushenqing !=null){
            //entity转view
            BangfushenqingView view = new BangfushenqingView();
            BeanUtils.copyProperties( bangfushenqing , view );//把实体数据重构到view中
            //级联表 用户
            //级联表
            YonghuEntity yonghu = yonghuService.selectById(bangfushenqing.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 BangfushenqingEntity bangfushenqing, HttpServletRequest request){
        logger.debug("save方法:,,Controller:{},,bangfushenqing:{}",this.getClass().getName(),bangfushenqing.toString());

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

        Wrapper<BangfushenqingEntity> queryWrapper = new EntityWrapper<BangfushenqingEntity>()
            .eq("yonghu_id", bangfushenqing.getYonghuId())
            .eq("bangfuduixiang_types", bangfushenqing.getBangfuduixiangTypes())
            .in("bangfushenqing_yesno_types", new Integer[]{1,2})
            ;

        logger.info("sql语句:"+queryWrapper.getSqlSegment());
        BangfushenqingEntity bangfushenqingEntity = bangfushenqingService.selectOne(queryWrapper);
        if(bangfushenqingEntity==null){
            bangfushenqing.setBangfushenqingYesnoTypes(1);
            bangfushenqing.setInsertTime(new Date());
            bangfushenqing.setCreateTime(new Date());
            bangfushenqingService.insert(bangfushenqing);
            return R.ok();
        }else {
            if(bangfushenqingEntity.getBangfushenqingYesnoTypes()==1)
                return R.error(511,"有相同的待审核的数据");
            else if(bangfushenqingEntity.getBangfushenqingYesnoTypes()==2)
                return R.error(511,"有相同的审核通过的数据");
            else
                return R.error(511,"表中有相同数据");
        }
    }

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

        String role = String.valueOf(request.getSession().getAttribute("role"));
//        if(false)
//            return R.error(511,"永远不会进入");
//        else if("用户".equals(role))
//            bangfushenqing.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));
        if("".equals(bangfushenqing.getBangfushenqingFile()) || "null".equals(bangfushenqing.getBangfushenqingFile())){
                bangfushenqing.setBangfushenqingFile(null);
        }

            bangfushenqingService.updateById(bangfushenqing);//根据id更新
            return R.ok();
    }


    /**
    * 审核
    */
    @RequestMapping("/shenhe")
    public R shenhe(@RequestBody BangfushenqingEntity bangfushenqingEntity, HttpServletRequest request){
        logger.debug("shenhe方法:,,Controller:{},,bangfushenqingEntity:{}",this.getClass().getName(),bangfushenqingEntity.toString());

        BangfushenqingEntity oldBangfushenqing = bangfushenqingService.selectById(bangfushenqingEntity.getId());//查询原先数据

        if(bangfushenqingEntity.getBangfushenqingYesnoTypes() == 2){//通过
            BangfuduixiangEntity bangfuduixiangEntity = new BangfuduixiangEntity();
            bangfuduixiangEntity.setYonghuId(oldBangfushenqing.getYonghuId());
            bangfuduixiangEntity.setBangfuduixiangTypes(oldBangfushenqing.getBangfuduixiangTypes());
            bangfuduixiangEntity.setBangfuduixiangDelete(1);
            bangfuduixiangEntity.setCreateTime(new Date());
            bangfuduixiangEntity.setInsertTime(new Date());
            bangfuduixiangService.insert(bangfuduixiangEntity);
        }
        bangfushenqingService.updateById(bangfushenqingEntity);//审核

        return R.ok();
    }

    /**
    * 删除
    */
    @RequestMapping("/delete")
    public R delete(@RequestBody Integer[] ids, HttpServletRequest request){
        logger.debug("delete:,,Controller:{},,ids:{}",this.getClass().getName(),ids.toString());
        List<BangfushenqingEntity> oldBangfushenqingList =bangfushenqingService.selectBatchIds(Arrays.asList(ids));//要删除的数据
        bangfushenqingService.deleteBatchIds(Arrays.asList(ids));

        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<BangfushenqingEntity> bangfushenqingList = 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){
                            //循环
                            BangfushenqingEntity bangfushenqingEntity = new BangfushenqingEntity();
//                            bangfushenqingEntity.setYonghuId(Integer.valueOf(data.get(0)));   //用户 要改的
//                            bangfushenqingEntity.setBangfushenqingText(data.get(0));                    //申请原因 要改的
//                            bangfushenqingEntity.setBangfushenqingFile(data.get(0));                    //凭证文件 要改的
//                            bangfushenqingEntity.setBangfuduixiangTypes(Integer.valueOf(data.get(0)));   //帮扶类型 要改的
//                            bangfushenqingEntity.setBangfushenqingYesnoTypes(Integer.valueOf(data.get(0)));   //交换状态 要改的
//                            bangfushenqingEntity.setBangfushenqingYesnoText(data.get(0));                    //回复 要改的
//                            bangfushenqingEntity.setInsertTime(date);//时间
//                            bangfushenqingEntity.setCreateTime(date);//时间
                            bangfushenqingList.add(bangfushenqingEntity);


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

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




    /**
    * 前端列表
    */
    @IgnoreAuth
    @RequestMapping("/list")
    public R list(@RequestParam Map<String, Object> params, HttpServletRequest request){
        logger.debug("list方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));

        CommonUtil.checkMap(params);
        PageUtils page = bangfushenqingService.queryPage(params);

        //字典表数据转换
        List<BangfushenqingView> list =(List<BangfushenqingView>)page.getList();
        for(BangfushenqingView c:list)
            dictionaryService.dictionaryConvert(c, request); //修改对应字典表字段

        return R.ok().put("data", page);
    }

    /**
    * 前端详情
    */
    @RequestMapping("/detail/{id}")
    public R detail(@PathVariable("id") Long id, HttpServletRequest request){
        logger.debug("detail方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
        BangfushenqingEntity bangfushenqing = bangfushenqingService.selectById(id);
            if(bangfushenqing !=null){


                //entity转view
                BangfushenqingView view = new BangfushenqingView();
                BeanUtils.copyProperties( bangfushenqing , view );//把实体数据重构到view中

                //级联表
                    YonghuEntity yonghu = yonghuService.selectById(bangfushenqing.getYonghuId());
                if(yonghu != null){
                    BeanUtils.copyProperties( yonghu , view ,new String[]{ "id", "createDate"});//把级联的数据添加到view中,并排除id和创建时间字段
                    view.setYonghuId(yonghu.getId());
                }
                //修改对应字典表字段
                dictionaryService.dictionaryConvert(view, request);
                return R.ok().put("data", view);
            }else {
                return R.error(511,"查不到数据");
            }
    }


    /**
    * 前端保存
    */
    @RequestMapping("/add")
    public R add(@RequestBody BangfushenqingEntity bangfushenqing, HttpServletRequest request){
        logger.debug("add方法:,,Controller:{},,bangfushenqing:{}",this.getClass().getName(),bangfushenqing.toString());
        Wrapper<BangfushenqingEntity> queryWrapper = new EntityWrapper<BangfushenqingEntity>()
            .eq("yonghu_id", bangfushenqing.getYonghuId())
            .eq("bangfushenqing_text", bangfushenqing.getBangfushenqingText())
            .eq("bangfuduixiang_types", bangfushenqing.getBangfuduixiangTypes())
            .in("bangfushenqing_yesno_types", new Integer[]{1,2})
            .eq("bangfushenqing_yesno_text", bangfushenqing.getBangfushenqingYesnoText())
//            .notIn("bangfushenqing_types", new Integer[]{102})
            ;
        logger.info("sql语句:"+queryWrapper.getSqlSegment());
        BangfushenqingEntity bangfushenqingEntity = bangfushenqingService.selectOne(queryWrapper);
        if(bangfushenqingEntity==null){
            bangfushenqing.setBangfushenqingYesnoTypes(1);
            bangfushenqing.setInsertTime(new Date());
            bangfushenqing.setCreateTime(new Date());
        bangfushenqingService.insert(bangfushenqing);

            return R.ok();
        }else {
            if(bangfushenqingEntity.getBangfushenqingYesnoTypes()==1)
                return R.error(511,"有相同的待审核的数据");
            else if(bangfushenqingEntity.getBangfushenqingYesnoTypes()==2)
                return R.error(511,"有相同的审核通过的数据");
            else
                return R.error(511,"表中有相同数据");
        }
    }

}


YonghuServiceImpl.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.YonghuDao;
import com.entity.YonghuEntity;
import com.service.YonghuService;
import com.entity.view.YonghuView;

/**
 * 用户 服务实现类
 */
@Service("yonghuService")
@Transactional
public class YonghuServiceImpl extends ServiceImpl<YonghuDao, YonghuEntity> implements YonghuService {

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


}

IndexHeader.vue
<template>
	<!-- <el-header>
		<el-menu background-color="#00c292" text-color="#FFFFFF" active-text-color="#FFFFFF" mode="horizontal">
			<div class="fl title">{{this.$project.projectName}}</div>
			<div class="fr logout" style="display:flex;">
				<el-menu-item index="2">
					<div>{{this.$storage.get('role')}} {{this.$storage.get('adminName')}}</div>
				</el-menu-item>
				<el-menu-item @click="onLogout" index="2">
					<div>退出登录</div>
				</el-menu-item>
			</div>
		</el-menu>
	</el-header> -->
	<div class="navbar" :style="{background:heads.headBgColor,height:heads.headHeight,boxShadow:heads.headBoxShadow,lineHeight:heads.headHeight}">
		<div class="title-menu" :style="{justifyContent:heads.headTitleStyle=='1'?'flex-start':'center'}">
			<el-image v-if="heads.headTitleImg" class="title-img" :style="{width:heads.headTitleImgWidth,height:heads.headTitleImgHeight,boxShadow:heads.headTitleImgBoxShadow,borderRadius:heads.headTitleImgBorderRadius}" :src="heads.headTitleImgUrl" fit="cover"></el-image>
			<div class="title-name" :style="{color:heads.headFontColor,fontSize:heads.headFontSize}">{{this.$project.projectName}}</div>
		</div>
		<div class="right-menu">
			<div class="user-info" :style="{color:heads.headUserInfoFontColor,fontSize:heads.headUserInfoFontSize}">{{this.$storage.get('role')}} {{this.$storage.get('adminName')}}</div>
			<!--<div v-if="this.$storage.get('role')!='管理员'" class="logout" :style="{color:heads.headLogoutFontColor,fontSize:heads.headLogoutFontSize}" @click="onIndexTap">退出到前台</div>-->
			<div class="logout" :style="{color:heads.headLogoutFontColor,fontSize:heads.headLogoutFontSize}" @click="onLogout">退出登录</div>
		</div>
	</div>
</template>

<script>
	export default {
		data() {
			return {
				dialogVisible: false,
				ruleForm: {},
				user: {},
				heads: {"headLogoutFontHoverColor":"var(--publicMainColor)","headFontSize":"24px","headUserInfoFontColor":"#fff","headBoxShadow":"0px 0px 0px 10px var(--publicSubColor) inset","headTitleImgHeight":"44px","headLogoutFontHoverBgColor":"var(--publicSubColor)","headFontColor":"#fff","headTitleImg":false,"headHeight":"80px","headTitleImgBorderRadius":"22px","headTitleImgUrl":"http://codegen.caihongy.cn/20201021/cc7d45d9c8164b58b18351764eba9be1.jpg","headBgColor":"var(--publicMainColor)","headTitleImgBoxShadow":"0 1px 6px #444","headLogoutFontColor":"#fff","headUserInfoFontSize":"16px","headTitleImgWidth":"44px","headTitleStyle":"2","headLogoutFontSize":"16px"},
			};
		},
		created() {
			this.setHeaderStyle()
		},
		mounted() {
			let sessionTable = this.$storage.get("sessionTable")
			this.$http({
				url: sessionTable + '/session',
				method: "get"
			}).then(({
				data
			}) => {
				if (data && data.code === 0) {
					this.user = data.data;
					this.$storage.set('userid',data.data.id);
				} else {
					let message = this.$message
					message.error(data.msg);
				}
			});
		},
		methods: {
			onLogout() {
				let storage = this.$storage
				let router = this.$router
				storage.clear()
				router.replace({
					name: "login"
				});
			},
      			onIndexTap(){
      				window.location.href = `${this.$base.indexUrl}`
    			},
			setHeaderStyle() {
			  this.$nextTick(()=>{
			    document.querySelectorAll('.navbar .right-menu .logout').forEach(el=>{
			      el.addEventListener("mouseenter", e => {
			        e.stopPropagation()
			        el.style.backgroundColor = this.heads.headLogoutFontHoverBgColor
					el.style.color = this.heads.headLogoutFontHoverColor
			      })
			      el.addEventListener("mouseleave", e => {
			        e.stopPropagation()
			        el.style.backgroundColor = "transparent"
					el.style.color = this.heads.headLogoutFontColor
			      })
			    })
			  })
			},
		}
	};
</script>


<style lang="scss" scoped>
	.navbar {
		height: 60px;
		line-height: 60px;
		width: 100%;
		padding: 0 34px;
		box-sizing: border-box;
		background-color: #ff00ff;
		position: relative;
		z-index: 111;
		
		.right-menu {
			position: absolute;
			right: 34px;
			top: 0;
			height: 100%;
			display: flex;
			justify-content: flex-end;
			align-items: center;
			z-index: 111;
			
			.user-info {
				font-size: 16px;
				color: red;
				padding: 0 12px;
			}
			
			.logout {
				font-size: 16px;
				color: red;
				padding: 0 12px;
				cursor: pointer;
			}
			
		}
		
		.title-menu {
			display: flex;
			justify-content: flex-start;
			align-items: center;
			width: 100%;
			height: 100%;
			
			.title-img {
				width: 44px;
				height: 44px;
				border-radius: 22px;
				box-shadow: 0 1px 6px #444;
				margin-right: 16px;
			}
			
			.title-name {
				font-size: 24px;
				color: #fff;
				font-weight: 700;
			}
		}
	}
	// .el-header .fr {
	// 	float: right;
	// }

	// .el-header .fl {
	// 	float: left;
	// }

	// .el-header {
	// 	width: 100%;
	// 	color: #333;
	// 	text-align: center;
	// 	line-height: 60px;
	// 	padding: 0;
	// 	z-index: 99;
	// }

	// .logo {
	// 	width: 60px;
	// 	height: 60px;
	// 	margin-left: 70px;
	// }

	// .avator {
	// 	width: 40px;
	// 	height: 40px;
	// 	background: #ffffff;
	// 	border-radius: 50%;
	// }

	// .title {
	// 	color: #ffffff;
	// 	font-size: 20px;
	// 	font-weight: bold;
	// 	margin-left: 20px;
	// }
</style>

声明

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

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

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

相关文章

谷歌的高级指令有哪些

今天会分享一些组合用法&#xff0c;这样就能节省许多时间可以放在跟进客户上面&#xff08;本文只介绍谷歌的搜索指令&#xff0c;并无推广&#xff09; part one 谷歌常用的搜索引擎指令&#xff1a; 1、Inurl&#xff0c;在网址中 2、Intext&#xff0c;在网页内容中 3、…

Python使用BeautifulSoup进行网页爬虫技术详解

目录 一、BeautifulSoup简介 1.1 安装BeautifulSoup 1.2 引入BeautifulSoup 二、基本使用 2.1 实例化BeautifulSoup对象 2.2 解析HTML文档 2.2.1 查找标签 2.2.2 获取标签属性和内容 2.3 异常处理 三、进阶使用 3.1 复杂标签查找 3.1.1 CSS选择器 3.1.2 正则表达式…

【1-4】设计模式概述

目录 一.设计模式产生背景 二.软件设计模式的概念 三.学习设计模式的必要性 四.设计模式分类 一.设计模式产生背景 二.软件设计模式的概念 软件设计模式&#xff0c;又称设计模式&#xff0c;是一套被反复使用、多人知晓的、经过分类编目的、代码设计经验的总结。它描述了…

skynet的消息发送:send和call

skynet是一个轻量级的游戏服务器框架。 skynet的核心是服务&#xff0c;服务之间通过消息来通信&#xff0c;消息的来源主要有&#xff1a; 定时器网络服务之间的调用(skynet.send或skynet.call) skynet.send和skynet.call 假设我们有两个服务A和B&#xff0c;A发了两条消息…

AI+服装电商细分赛道的落地应用:图应AI模特的进化史干货篇

文章目录 AI绘制人物的效果进化史2022年2023年2024年 摄影师、设计师、模特三方在AI商拍领域的位置国家统计局的一些服装行业数据遇到的一些问题以及相应的解决方案图应AI这个产品未来可能怎么走统一回答某些投资人的一个问题 AI绘制人物的效果进化史 2022年 还记得我2022年从…

Understanding the Overheads of Launching CUDA Kernels (理解启动 CUDA Kernels 的开销)

Understanding the Overheads of Launching CUDA Kernels {理解启动 CUDA Kernels 的开销} Understanding the Overheads of Launching CUDA Kernels1. INTRODUCTION2. MICRO-BENCHMARKS USED IN OUR STUDY3. OVERHEAD OF LAUNCHING KERNELS3.1. Experimental Environment3.2. …

【Validation + i18n】✈️运行时参数校验+国际化上下文实现自定义参数校验规则

目录 &#x1f44b;前言 &#x1f440;一、环境准备 &#x1f4eb;二、代码实现 2.1 Validation 自定义验证类 2.2 自定义注解代码实现 &#x1f49e;️三、测试 &#x1f331;四、章末 &#x1f44b;前言 小伙伴们大家好&#xff0c;最近在和一位读者讨论国际化上下文工具…

SpringBoot-01-全局异常处理器

在之前的项目中每一个异常的地方都要进行处理&#xff0c;十分的麻烦。 在springBoot项目中&#xff0c;提供了全局的异常处理器&#xff0c;可能出现异常的地方直接抛出即可。 RestControllerAdvice public class GlobalException {ExceptionHandlerpublic Result<String…

Golang | Leetcode Golang题解之第342题4的幂

题目&#xff1a; 题解&#xff1a; func isPowerOfFour(n int) bool {return n > 0 && n&(n-1) 0 && n%3 1 }

【电路笔记】-桥接 T 型衰减器

桥接 T 型衰减器 文章目录 桥接 T 型衰减器1、概述2、桥接 T 型衰减器示例 13、可变桥接 T 型衰减器4、完全可调衰减器5、可切换桥接 T 型衰减器Bridged-T 衰减器是另一种电阻衰减器设计,它是标准对称 T 垫衰减器的变体。 1、概述 顾名思义,桥接 T 形衰减器具有一个额外的电…

Chapter 39 Python多线程编程

欢迎大家订阅【Python从入门到精通】专栏&#xff0c;一起探索Python的无限可能&#xff01; 文章目录 前言一、并行执行二、threading模块 前言 现代操作系统如 macOS、UNIX、Linux 和 Windows 等&#xff0c;均支持多任务处理。本篇文章详细讲解了并行执行的概念以及如何在 …

苍穹外卖-day03(SpringBoot+SSM的企业级Java项目实战)

苍穹外卖-day03 课程内容 公共字段自动填充 新增菜品 菜品分页查询 删除菜品 修改菜品 功能实现&#xff1a;菜品管理 菜品管理效果图&#xff1a; 1. 公共字段自动填充 1.1 问题分析 在上一章节我们已经完成了后台系统的员工管理功能和菜品分类功能的开发&#xff0c…

本地ComfyUI安装全记录

资料 先看我写的stable diffusion全记录 ComfyUI 完全入门&#xff1a;安装部署 ComfyUI 完全入门&#xff1a;图生视频 ComfyUI【强烈推荐】 秋葉aaaki comfy UI整合包 可以使用stable diffusion的大模型&#xff0c;通过修改文件重新指向 修改路径即可 下载秋叶大佬的…

Linux 实操-权限管理:深入了解rwx的作用

&#x1f600;前言 本篇博文是关于Linux文件权限管理的基本知识和实际操作&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是…

git rebase 重建清爽的历史提交

前言 在代码评审时遇到分支上有多个commit信息&#xff0c;对于评审者来说是非常头疼的&#xff0c;因为太混乱了。遇到这样的情况&#xff0c;就需要让开发人员把commit压缩一下&#xff0c;简单来说就是将多个commit合并为一个&#xff0c;这样看起来就比较整洁了&#xff0…

【颠覆传统!】SmartEDA引领潮流:在线实时仿真,Multisim与Proteus望尘莫及的新纪元!

在电子设计自动化的浩瀚星空中&#xff0c;两款老牌软件——Multisim与Proteus&#xff0c;如同璀璨星辰&#xff0c;长久以来照亮了工程师们的设计之路。它们以强大的仿真功能和丰富的元件库&#xff0c;赢得了无数设计者的青睐。然而&#xff0c;时代的车轮滚滚向前&#xff…

关于FreeRTOS使用相关API函数导致程序阻塞的问题

前言&#xff1a; 如题。近日在给项目移植FreeRTOS的时候&#xff0c;发现调用如下API函数会阻塞&#xff1a; xTaskNotifyGive(xTaskGetHandle(Task_PrintCtrl_attributes.name)); 首先猜测可能是xTaskGetHandle有问题导致。通过printf打印调试信息&#xff0c;发现执行xTask…

乐凡三防平板定制:为行业量身打造的移动解决方案

在数字化转型的大潮中&#xff0c;移动设备成为企业提升效率、优化流程的关键工具。三防平板&#xff0c;以其坚固耐用、适应恶劣环境的特性&#xff0c;成为工业、物流、建筑、军事等领域不可或缺的选择。而三防平板的定制化服务&#xff0c;则进一步满足了不同行业对设备性能…

Linux | Linux进程万字全解:内核原理、进程状态转换、优先级调度策略与环境变量

目录 1、从计算机组成原理到冯诺依曼架构 计算机系统的组成 冯诺依曼体系 思考&#xff1a;为什么计算机不能直接设计为 输入设备-CPU运算-输出设备 的结构&#xff1f; 2、操作系统(Operator System) 概念 设计OS的目的 描述和组织被管理对象 3、进程 基本概念 进程id和父进程…

亲测好用,吐血整理 ChatGPT 3.5/4.0 新手使用手册~

废话不多说&#xff0c;直接分享正文~ 以下是小编为大家搜集到的最新的ChatGPT国内站&#xff0c;各有优缺点。 1、AI Plus&#xff08;稳定使用&#xff09; 推荐指数&#xff1a;⭐⭐⭐⭐⭐ yixiaai.com 该网站已经稳定运营了1年多了。2023年3月份第一批上线的网…