基于Vue的MES生产制造执行系统

news2024/11/16 0:55:49

@TOC

springboot307基于Vue的MES生产制造执行系统

第1章 绪论

1.1 选题动因

到现在为止,互联网已经进入了千家万户,最普通的平民百姓也有属于自己的智能设备,计算机各种技术的储备也是相当的丰富,并且实现也是没有难度,各行各业,包括一些个人,也积极拥抱互联网时代的到来,也可以说是互联网时代的到来把人们都给包在互联网之中。从刚开始的政府办公,国家企业的开头使用,到如今的老百姓都能用上,别说那些普通企业了。计算机就是有这样的魅力,互联网被称为浪潮不是浪得虚名的。采用计算机技术,开发一些软件,实现软件所在的目的,这是一个常理,这个基础的常理缩短了地域之间的联系,提高了地域竞争水准,减低了人力成本和数据存储成本。本课题研究的MES生产制造执行系统,也是采用了计算机技术,该系统能够提高产品生产制造信息数据的检索速度,使用起来非常的方便。

1.2 目的和意义

在MES生产制造执行系统实际操作中,使用者会发现使用起来相当的方便,并且对数据的管理者来讲,也能及时的获得自己想要的数据,对整个数据的所有者能提供强大的帮助,MES生产制造执行系统从操作者的角度出发,不管是在数据的接收以及传递,以及处理结果,都有一个很明显的要求,对有效数据的处理,并且形成集合,并且对有效数据集合进行固定化处理,可以得到更有效的数据,有了MES生产制造执行系统,让管理层不至于把大量的人力和财力资源消耗在数据处理整合方面,完全可以让不知疲倦的计算机来进行,不仅投入减低,并且产出也不少。互联网时代就是如此,顺之者昌,响应互联网时代,不至于说可以乘风破浪,起码可以降低直接淘汰出局的几率。MES生产制造执行系统的出现是顺应时代的。

1.3 论文结构安排

MES生产制造执行系统的论文结构将从6个章节进行阐述。具体结构安排如下:

第1章:本章节对本课题的选题动因,本课题的研究目的和意义进行说明。

第2章:本章节对本课题需要运用的环境和技术进行说明。

第3章:本章节对本课题性能,功能进行分析,对系统开发的经济,技术等条件是否可行进行说明。

第4章:本章节对本课题具体的功能进行设计,同时也对系统的数据库进行E-R图设计以及数据表设计。

第5章:本章节对实现的功能的运行效果图进行展示,同时对系统的功能进行说明。

第6章:本章节对系统功能上的测试进行说明,对测试的结果进行分析。

第2章 开发环境与技术

MES生产制造执行系统需要提前对功能进行调查分析,并且根据分析结果进行技术上的辩证,可以选择更合理的开发技术以及开发工具。

2.1 Tomcat 简介

只要学习Java Web项目就不得不学习Tomcat。Tomcat是一种免费的开源的一种Java Web项目的容器,完美继承了 Apache服务器的特性,并且里面添加可以自动化运行的Java Web组件,让Java Web项目可以完全的运行到Tomcat里面。对于特大型项目来讲,直接用Tomcat会造成启动变慢,处理有限等,所以对项目进行了前后端分离技术,但是对于需要称不上特大型的项目来讲,普通的大中型项目用Tomcat作为Java Web项目的运行容器是完全够资格的。最重要的是Tomcat完全跟着Java EE,每一次Java EE的升级,Tomcat都会有着对应的版本出现,版本更新速度是非常快的。更新速度快,代表着有技术方面的支持,值得用户使用的,让用户更加信赖Tomcat产品。

2.2 Eclipse简介

Eclipse这款开发工具最最重要的特点就是免费,不管是用来开发任何的东西,哪怕用来教学或者是生产,只要是能带了商业价值的生产都可以免费使用,这一点对于IDEA或者MyEclipse来讲,是非常的具有前瞻性的。免费的也许有很多不足,但是就是因为免费,所以很多人愿意贡献自己的力量,让这款免费的工具可以拥有更多的插件,用起来更加的舒心。可以这么说,Eclipse就是Java语言开发行业的鼻祖,只要是学过Java的人,对Eclipse没有不熟悉的。Eclipse操作起来非常的方便,可以不用安装,直接解压了就可以使用,并且可以在不同的操作系统上面都可以安装到对应的版本。Eclipse是真的不要钱,免费,下载就能用,这么多年以来长期占领着Java开发市场的半壁江山。Eclipse可以在官网上进行捐款,捐款可以支持Eclipse进一步发展,也可以不捐款直接使用,一切随心,不会强求。Eclipse真的是一款良心Java生产工具。

2.3 Navicat简介

Navicat是一款管理数据库的软件。众所周知,所有的数据库只是以特定的存放格式进行存放的,访问也需要特定的接口以及语句进行访问。如果访问数据库都用各种命令,不仅仅是开发效率上会大大的降低,并且看起来也不舒服,对于某些数据或者数据库来讲这样并不友好,如何对数据库进行友好的访问到现在为止,不同的数据库厂商都推出了适合自己数据库的管理工具,但是有一点就是,数据库厂商推出之后,只要能用就行,并没有符合人体工程学,所有的数据库厂商推出的数据库管理工具都是免费的,所以并没有对于数据库管理工具进行过多的优化,用起来相当的不友好,并且各个数据库工具是不能通用的,这一点数据库厂商肯定不会去做匹配其他数据库的管理工具,所以Navicat就应运而生,可以采用Navicat管理各种各样的数据库,可以同时访问各种数据库并且通过不同的连接进行访问,还可以访问不同电脑的数据库,页面操作简单,美观大方,用起来很好用,并且占用电脑资源很小,很适合作为替代其他数据库厂商推出的数据库管理工具使用。

2.4 Vue框架

Vue框架因为是纯JavaScript开发的模式,只需要通过浏览器就可以进行解析,不需要增加服务端的处理压力。Vue框架最典型的就是渐进式显示模式,举一个小小的例子,如果一个商店一些商品的库存或者价格不变,会急速的显示,如果一处地方进行变换,那么只要引用到这个变化数据的所有数据都会自动变化,让数据显示的实时性大大的增加,让用户使用起来更加的友好。对开发者而言,Vue框架非常好理解,编写起来能极大的减少DOM的相关操作,让页面渲染更加的有层次。当前端不在需要关注一些不必要的操作的时候,能让程序开发人员的注意力都能集中到业务逻辑方面,这样从这一个方面又能极大的提高了开发效率。所以Vue框架这个火爆是有原因的。

第3章 系统分析

通过对系统的功能进行具体分析,可以参考已经发表过的具有参考价值的文章作为对比,这样能把功能分析的很透彻,并且也会因为功能的分析而对性能也有大致的了解,并且可以预测性能,实现性能分析的结果。

3.1 可行性分析

系统的设计必须符合正常逻辑,所以设计之处,也需要从其他方面来论证其可行性。

3.1.1 经济可行性

开发MES生产制造执行系统,存在经济上面的支持,必须经济上的支持才可以有序进行,比如是否需要额外购买开发工具,购买开发电脑,或者从开发技术上是否是免费开源,达到的效果上面是否支出与收入不匹配,这些都需要进行分析。由于开发本系统,开发技术开源且稳定,电脑用正在使用的电脑就能满足,不需要太多的经济支出就可以达到目的,经济可行性通过。

3.1.2 技术可行性

MES生产制造执行系统软件主要用到的一些工具,而这些工具正好在学校就使用过,并且网上有很多免费的并且符合的开发工具,技术方面也学过,并且有图书馆的资源和网络资源可以充分利用。所以在技术角度上面来分析是可以的。

3.1.3 操作可行性

操作方面分为开发过程,实现过程,项目具体操作流程。这些因为都学过,并且有其他的项目流程作为参考。总体实现一般就是用户的登录相关,权限分配,基础数据的变更体现。让不同的角色有不同的操作界面,符合正确角色定位,使用者在操作上面并不会感觉到很突兀,影响操作流程。所以操作方面是可以的。

通过以上不同角度的分析,最后论证分析了可行性是没有问题的,完全可以进行后续步骤。

3.2 系统流程分析

操作逻辑是一个可以用画图工具展示的,因为数据在录入过程中的不可见,只能看到返回结果,所以把流程画成图可以更好的理解其中的顺序。

在系统的各项操作中,其他的录入环节,会对操作者具体操作的每条信息都会提出验证要求,比如不能为空,只能是汉字,以及其他的要求等,这些都在前端需要编写清楚,达到友好提示的目的,有效的帮助操作人员理解操作。具体数据的流程如下面的图所示。当操作员输入信息后,点击提交后台就会接收操作员提交的信息,并且提前编写好的逻辑会继续验证,如果数据合格就存入到数据库里并且返回成功提示,这样一个录入环节就达到了设计要求。

图3.1 添加信息流程图

有时候录入的一些数据可能需要修改,修改就是纠正之前的操作,所以修改数据必须是先把想要修改的数据从数据库里获取出来,然后在这个之上进行修改,修改数据也有相应的操作流程。

图3.2 修改信息流程图

数据的查询是在任何程序上都是一个常规的操作,面对的数据量不一样,想要获取想要的数据时间也不一样,都是尽快的获取自己想要的结果,所以数据查询就需要有个查询条件作为查询关键词,这样可以更好的获取符合关键词的数据。

图3.3 查询信息流程图

3.3 系统性能分析

关于MES生产制造执行系统从性能需求方面来分析,主要从五个角度分析。五个角度分别从设计的实用性,设计的操作性,设计的安全性,设计的适应性和维护性这五个角度来进行分析。

首先分析第一点,设计的实用性。本设计的目的就是让管理员可以综合的处理各种基础信息,并且有相应的权限来进行操作,达到数据同步,集中管理的目的,并且可以让用户处理用户相关信息,符合设计的既定目标,达到使用效果。

其次分析第二点,设计的操作性。开发出来的系统必须有操作性,如果操作起来丢三落四,出现各种不符合流程的操作,那么就是不符合设计规则的,设计的操作性必须符合人体工程学使用原则,从上到下,从左到右,让操作起来更加的有逻辑性,不需要不符合逻辑的页面数据体验和操作流程,让设计的操作性体现出来,看到操作界面就会有相应的下一步理解。

再次是安全性,虽然从任何角度来讲,安全性应该放到第一位,但是有些时候安全性是在数据量大并且数据重要的前提下才会对数据的安全性来进行设计,正常的软件使用过程只要数据设计合理,并且目标单一,让黑客不屑于或者付出不成正比的情况下,安全性自然可以稍微降低一点,毕竟面对的使用群体决定了安全性的强度。本设计主要是从毕业设计的角度出发,增加一点数据校验的安全性就行,没必要设置硬件防火墙之类的资源,所以安全性上面也是符合的。

再次是适应性。适应性主要是面对各种平台的操作系统,目前本设计的开发可以使用本人电脑进行开发,服务器可以架设到任何地方,并且有对应的服务器软件版本。而用户方面只需要能上网,有最新版本的浏览器进行支持即可,所以适应性是相当不错的。

最后是分析维护性。这一点只需要维护服务端代码即可,每次服务端代码维护都可以先把服务器停止,然后在开发电脑上进行测试,最后测试无误再在服务器上进行部署,维护性并不会增加多少成本。

3.4 系统功能分析

当设计人员通过参考各种文献以及其他类似项目的调研后,就会对项目具体的功能进行分析,这样有的放矢可以更快的设计程序的功能。

MES生产制造执行系统的操作者有管理员,分析的管理员功能将使用用例图进行展示。图3.4展示了管理员用例图。管理员管理工序信息,管理工艺线路,管理物料信息,管理客户信息,管理销售订单,管理产品信息,管理生产计划等。

图3.4 管理员用例图

MES生产制造执行系统的操作者有员工,分析的员工的功能将使用用例图进行展示。图3.5展示了员工用例图。员工查看工序信息,查看工艺线路,查看物料信息,查看产品信息,查看产品生产计划,管理客户信息,管理销售订单等。

图3.5 员工用例图

第4章 系统设计

在系统设计环境,业务的处理逻辑和数据的设计逻辑虽然是重中之重,但是这些都是用户看不见摸不着的,用户也只是能看到部署好的项目运行起来的结果,所以用户对界面布局以及界面功能比较看重。所以说,如今只要是开发网站不仅仅是需要懂一点页面设计就行,也需要懂得UI设计的人群。传统的网页设计其实就是换几个颜色,放几张图片,然后来充实操作页面,让操作页面不至于太单调,但是互联网发展至今,开发也越来越精细化,用户越来越挑剔,还用凑合方式来进行程序开发,已经是属于落后的状态了。

4.1 布局设计原则

布局不是传统的把页面分分类,输入和显示页面,调整调整间距这些笼统的说法了,布局设计也是有一定的原则的。

首先,布局一定要清晰合理。布局的清晰不是说图片清晰或者文字清晰,而是说用户在使用过程中,看到导航的布局,就能明白所有功能模块都可以在导航里寻找,打开一个页面,就能知道重要与不重要的资料,必须与不必须的填写,甚至是输入的格式是什么规格,都可以让用户使用的时候一目了然。因为界面是有限的,所以说布局是相当重要的一点设计原则。

其次,布局的体现要符合大众审美,比如说导航,尽量都是网页的上方或者左侧。如果把导航放到网页下方或者右方,这些代码都是可以实现,但是不符合正常人的思维定向。现代人的读写习惯都是从上而下,从左到右的阅读方式,人们身体和心灵已经习惯了这种方式,如果布局到其他方向首先用户会感到新颖,但是却不会买账,因为操作几遍后就会不习惯。

最后,布局也要考虑这个软件是用来做什么的,常用这个软件的人员的年龄划分,性别划分,以及职业划分。划分了使用人群,就可以对背景进行调色填充,如果是长时间用电脑的人群尽量设计的有护眼功能,不至于看一会眼睛就受不了,尽量要区分长时间使用和短时间使用的背景,这一点很重要。

综上所述,系统设计需要考虑方方面面,布局设计也是需要精细化考虑,系统设计需要考虑太多,但是实现却不能弄得操作上太复杂,系统设计尽量的要满足用户需要,提高用户满意度。

4.2 功能结构设计

在基于系统功能分析的基础之上,开始对系统的详细功能进行设计,最终将使用结构图的形式对设计的结果进行展示。

管理员具备的详细功能将参照最终的设计结果,即图4.1所示的管理员功能结构图。其中管理员管理工序信息,管理工艺线路,管理物料信息,管理客户信息,管理销售订单,管理产品信息,管理生产计划等。

图4.1 管理员功能结构图

员工具备的详细功能将参照最终的设计结果,即图4.2所示的员工功能结构图。其中员工查看工序信息,查看工艺线路,查看物料信息,查看产品信息,查看产品生产计划,管理客户信息,管理销售订单等。

图4.2 员工功能结构图

4.3 数据库设计

数据库的选用方面肯定要选一个市场反应比较好,性价比比较高的数据库,不能凭空想象数据库,要结合程序设计的需求来选择对应的数据库。目前来讲,市面上常用的关系型数据库足够达到需求。

4.3.1 数据库E-R图设计

想好更好的设计出数据库使用效果,那么就要对数据的存放格式以及存放关系作出调查和梳理,所以通过分析E-R图之间的数据实体关系是最好不过的。而设计数据库E-R图是有下面几点好处:

第一点:数据的冗余是一件很恐怖的事情,所以要对有些数据进行冗余筛选;

第二点:防止内存溢出,数据量太大,需要提前做好预测并且设定好规则;

第三点:数据库一定要完整,非完整数据也只是数据垃圾而已,没有任何作用;

第四点:提高数据检索性能;

这节主要是描述对系统的E-R模型的设计,数据存储格式的判断,实现的方法,用户的需要,这些都要统一,不能想当然。并且各个模型中间的关系尤其要突出。

(1)把生产计划具备的属性通过属性图进行展示,绘制的属性图见图4.4。

图4.4 生产计划实体属性图

(2)把销售订单具备的属性通过属性图进行展示,绘制的属性图见图4.5。

图4.5 销售订单实体属性图

(3)把员工具备的属性通过属性图进行展示,绘制的属性图见图4.6。

图4.6 员工实体属性图

(4)把管理员具备的属性通过属性图进行展示,绘制的属性图见图4.7。

图4.7 管理员实体属性图

(5)上述实体间关系见图4.8。

图4.8 实体间关系E-R图

4.3.2 数据库表结构设计

数据库设计必须符合规范,那就是三大范式,这样能确保数据的合理:

第一范式:保证表之间的字段关系不存在混淆的描述,必须描述准确,并且单一,不能分解;

第二范式:在上述的满足条件上,主键的设计必须要在固定的列上,不能忽前忽后;

第三范式:继续满足上个条件,保证每个字段都可以根据主键获取到,并且在一个数据表里体现。

所以说,三个范式是一脉相承的,不是说零碎的,从第一个范式上就会发现,第一个永远是基础,后面的设定就是后者的实现必须在前面范式的基础之上的要求,这些设计可以最大化的减少数据冗余,提高数据库运行效率。

表4.1 部门信息表

字段注释类型
id (主键)主键bigint(20)
addtime创建时间timestamp
bumenmingcheng部门名称varchar(200)
bumenfuzeren部门负责人varchar(200)
lianxidianhua联系电话varchar(200)
bangongquyu办公区域varchar(200)

表4.2 产品信息表

字段注释类型
id (主键)主键bigint(20)
addtime创建时间timestamp
chanpinbianhao产品编号varchar(200)
chanpinmingcheng产品名称varchar(200)
chanpinleixing产品类型varchar(200)
shuliang数量int(11)
jiage价格int(11)
chanpinshuoming产品说明longtext
chanpintese产品特色varchar(200)
chanpinguige产品规格date
shiyongfanwei适用范围varchar(200)

表4.3 工序信息表

字段注释类型
id (主键)主键bigint(20)
addtime创建时间timestamp
gongxumingcheng工序名称varchar(200)
gongxuleixing工序类型varchar(200)
gongxushizhang工序时长varchar(200)
caozuoliucheng操作流程longtext
gongxufujian工序附件varchar(200)
shiyongjiqi适用机器varchar(200)
zhuyishixiang注意事项varchar(200)

表4.4 工艺线路表

字段注释类型
id (主键)主键bigint(20)
addtime创建时间timestamp
chanpinbianhao产品编号varchar(200)
chanpinmingcheng产品名称varchar(200)
chanpinleixing产品类型varchar(200)
gongyimingcheng工艺名称varchar(200)
jiagongyuanliao加工原料longtext
gongyiliucheng工艺流程longtext
gongzuoyuanli工作原理longtext

表4.5 客户信息表

字段注释类型
id (主键)主键bigint(20)
addtime创建时间timestamp
kehumingcheng客户名称varchar(200)
kehulaiyuan客户来源varchar(200)
xingye行业varchar(200)
guojiadiqu国家地区varchar(200)
dianhua电话varchar(200)
dizhi地址varchar(200)
kehudengji客户等级varchar(200)
yuangonggonghao员工工号varchar(200)

表4.6 生产计划表

字段注释类型
id (主键)主键bigint(20)
addtime创建时间timestamp
chanpinbianhao产品编号varchar(200)
chanpinmingcheng产品名称varchar(200)
chanpinleixing产品类型varchar(200)
shengchanshuliang生产数量int(11)
chanpintese产品特色varchar(200)
chanpinguige产品规格varchar(200)
shiyongfanwei适用范围varchar(200)
shengchanjihua生产计划longtext
gongyimingcheng工艺名称varchar(200)
gongxumingcheng工序名称varchar(200)
dengjishijian登记时间varchar(200)
yuangonggonghao员工工号varchar(200)
yuangongxingming员工姓名varchar(200)

表4.7 管理员表

字段注释类型
id (主键)主键bigint(20)
username用户名varchar(100)
password密码varchar(100)
role角色varchar(100)
addtime新增时间timestamp

表4.8 物料信息表

字段注释类型
id (主键)主键bigint(20)
addtime创建时间timestamp
wuliaobianhao物料编号varchar(200)
wuliaomingcheng物料名称varchar(200)
wuliaoleixing物料类型varchar(200)
wuliaoguige物料规格varchar(200)
tupian图片varchar(200)
shuliang数量int(11)
jiage价格float
wuliaoxiangqing物料详情longtext

表4.9 销售订单表

字段注释类型
id (主键)主键bigint(20)
addtime创建时间timestamp
xiaoshoudanhao销售单号varchar(200)
chanpinbianhao产品编号varchar(200)
chanpinmingcheng产品名称varchar(200)
chanpinleixing产品类型varchar(200)
jiage价格int(11)
xiaoshoushuliang销售数量int(11)
zongxiaoshoue总销售额int(11)
xiaoshoushijian销售时间datetime
beizhu备注longtext
kehumingcheng客户名称varchar(200)
dianhua电话varchar(200)
dizhi地址varchar(200)
yuangonggonghao员工工号varchar(200)
yuangongxingming员工姓名varchar(200)

表4.10 员工表

字段注释类型
id (主键)主键bigint(20)
addtime创建时间timestamp
yuangonggonghao员工工号varchar(200)
mima密码varchar(200)
yuangongxingming员工姓名varchar(200)
xingbie性别varchar(200)
bumen部门varchar(200)
zhiwei职位varchar(200)
ruzhishijian入职时间date
lianxifangshi联系方式varchar(200)
youxiang邮箱varchar(200)
shenfenzheng身份证varchar(200)

打开新的 phpMyAdmin 窗口

打开新的 phpMyAdmin 窗口

第5章 系统实现

下面主要是对系统实现的功能进行描述,一般在系统实现阶段只算是一个粗略的功能实现,可能符合开发人员的设计预期,但是对于具体使用者来讲还是需要其他人进行发现的,所以这个环节是很有必要进行描述的。

5.1 管理员功能实现

5.1.1 工艺线路管理

实现工艺线路管理功能,其界面运行的效果图见图5.1。在该界面,管理员修改,删除,查询工艺线路信息,对新的工艺线路信息进行添加等。工艺线路信息包括产品名称,工艺名称,产品编号,产品类型等信息。

图5.1 工艺线路管理界面

5.1.2 生产计划管理

实现生产计划管理功能,其界面运行的效果图见图5.2。在该界面,管理员更改生产计划信息,包括产品名称,生产数量,产品特色,产品规格,员工姓名,工艺名称等信息,管理员在生产计划管理界面新增生产计划,查询生产计划信息等。

图5.2 生产计划管理界面

5.1.3 生产计划统计报表

实现生产计划统计报表功能,其界面运行的效果图见图5.3。在该界面,管理员查看各个产品的生产计划信息,每个产品都设置有生产数量信息。

图5.3 生产计划统计报表界面

5.1.4 销售订单统计报表

实现销售订单统计报表功能,其界面运行的效果图见图5.4。在该界面,管理员查看各个产品对应的销售数量信息。销售订单统计报表是以柱状图的形式展示统计结果,非常直观地表达出统计的数据。

图5.4 销售订单统计报表界面

5.1.5 物料信息管理

实现物料信息管理功能,其界面运行的效果图见图5.5。在该界面,管理员把物料信息通过文件的形式进行导出,同时,管理员可以新增物料信息,对物料的名称,物料规格,数量,价格等信息进行查看,修改,查询,删除等。

图5.5 物料信息管理界面

5.2 员工功能实现

5.2.1 客户信息管理

实现客户信息管理功能,其界面运行的效果图见图5.6。在该界面,员工主要是添加客户,对客户的行业,国家地区,地址,客户等级,客户来源,客户名称等信息进行修改,查询等,可以查看客户统计报表信息。

图5.6 客户信息管理界面

5.2.2 客户信息统计报表

实现客户信息统计报表功能,其界面运行的效果图见图5.7。在该界面,主要是统计员工的所属行业信息,统计信息是通过饼图的方式进行显示。

图5.7 客户信息统计报表界面

5.2.3 销售订单管理

实现销售订单管理功能,其界面运行的效果图见图5.8。在该界面,员工新增产品销售订单,对销售订单的价格,销售数量,总销售额,客户名称等信息进行修改,查询等,员工也能查看销售订单的统计报表信息。

图5.8 销售订单管理界面

5.2.4 工序信息查看

实现工序信息查看功能,其界面运行的效果图见图5.9。在该界面,员工下载工序附件,查看产品工序时长,工序名称,工序类型等信息,可以通过工序类型或工序名称查询工序信息等。

图5.9 工序信息查看界面

InterceptorConfig.java
package com.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

import com.interceptor.AuthorizationInterceptor;

@Configuration
public class InterceptorConfig extends WebMvcConfigurationSupport{
	
	@Bean
    public AuthorizationInterceptor getAuthorizationInterceptor() {
        return new AuthorizationInterceptor();
    }
	
	@Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(getAuthorizationInterceptor()).addPathPatterns("/**").excludePathPatterns("/static/**");
        super.addInterceptors(registry);
	}
	
	/**
	 * springboot 2.0配置WebMvcConfigurationSupport之后,会导致默认配置被覆盖,要访问静态资源需要重写addResourceHandlers方法
	 */
	@Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
		registry.addResourceHandler("/**")
        .addResourceLocations("classpath:/resources/")
        .addResourceLocations("classpath:/static/")
        .addResourceLocations("classpath:/admin/")
        .addResourceLocations("classpath:/front/")
        .addResourceLocations("classpath:/public/");
		super.addResourceHandlers(registry);
    }
}

KehuxinxiController.java
package com.controller;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;

import com.utils.ValidatorUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
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 com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.annotation.IgnoreAuth;

import com.entity.KehuxinxiEntity;
import com.entity.view.KehuxinxiView;

import com.service.KehuxinxiService;
import com.service.TokenService;
import com.utils.PageUtils;
import com.utils.R;
import com.utils.MD5Util;
import com.utils.MPUtil;
import com.utils.CommonUtil;
import java.io.IOException;

/**
 * 客户信息
 * 后端接口
 * @author 
 * @email 
 * @date 2022-04-04 11:25:38
 */
@RestController
@RequestMapping("/kehuxinxi")
public class KehuxinxiController {
    @Autowired
    private KehuxinxiService kehuxinxiService;


    


    /**
     * 后端列表
     */
    @RequestMapping("/page")
    public R page(@RequestParam Map<String, Object> params,KehuxinxiEntity kehuxinxi,
		HttpServletRequest request){
		String tableName = request.getSession().getAttribute("tableName").toString();
		if(tableName.equals("yuangong")) {
			kehuxinxi.setYuangonggonghao((String)request.getSession().getAttribute("username"));
		}
        EntityWrapper<KehuxinxiEntity> ew = new EntityWrapper<KehuxinxiEntity>();
		PageUtils page = kehuxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, kehuxinxi), params), params));

        return R.ok().put("data", page);
    }
    
    /**
     * 前端列表
     */
	@IgnoreAuth
    @RequestMapping("/list")
    public R list(@RequestParam Map<String, Object> params,KehuxinxiEntity kehuxinxi, 
		HttpServletRequest request){
        EntityWrapper<KehuxinxiEntity> ew = new EntityWrapper<KehuxinxiEntity>();
		PageUtils page = kehuxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, kehuxinxi), params), params));
        return R.ok().put("data", page);
    }

	/**
     * 列表
     */
    @RequestMapping("/lists")
    public R list( KehuxinxiEntity kehuxinxi){
       	EntityWrapper<KehuxinxiEntity> ew = new EntityWrapper<KehuxinxiEntity>();
      	ew.allEq(MPUtil.allEQMapPre( kehuxinxi, "kehuxinxi")); 
        return R.ok().put("data", kehuxinxiService.selectListView(ew));
    }

	 /**
     * 查询
     */
    @RequestMapping("/query")
    public R query(KehuxinxiEntity kehuxinxi){
        EntityWrapper< KehuxinxiEntity> ew = new EntityWrapper< KehuxinxiEntity>();
 		ew.allEq(MPUtil.allEQMapPre( kehuxinxi, "kehuxinxi")); 
		KehuxinxiView kehuxinxiView =  kehuxinxiService.selectView(ew);
		return R.ok("查询客户信息成功").put("data", kehuxinxiView);
    }
	
    /**
     * 后端详情
     */
    @RequestMapping("/info/{id}")
    public R info(@PathVariable("id") Long id){
        KehuxinxiEntity kehuxinxi = kehuxinxiService.selectById(id);
        return R.ok().put("data", kehuxinxi);
    }

    /**
     * 前端详情
     */
	@IgnoreAuth
    @RequestMapping("/detail/{id}")
    public R detail(@PathVariable("id") Long id){
        KehuxinxiEntity kehuxinxi = kehuxinxiService.selectById(id);
        return R.ok().put("data", kehuxinxi);
    }
    



    /**
     * 后端保存
     */
    @RequestMapping("/save")
    public R save(@RequestBody KehuxinxiEntity kehuxinxi, HttpServletRequest request){
    	kehuxinxi.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
    	//ValidatorUtils.validateEntity(kehuxinxi);
        kehuxinxiService.insert(kehuxinxi);
        return R.ok();
    }
    
    /**
     * 前端保存
     */
    @RequestMapping("/add")
    public R add(@RequestBody KehuxinxiEntity kehuxinxi, HttpServletRequest request){
    	kehuxinxi.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
    	//ValidatorUtils.validateEntity(kehuxinxi);
        kehuxinxiService.insert(kehuxinxi);
        return R.ok();
    }

    /**
     * 修改
     */
    @RequestMapping("/update")
    public R update(@RequestBody KehuxinxiEntity kehuxinxi, HttpServletRequest request){
        //ValidatorUtils.validateEntity(kehuxinxi);
        kehuxinxiService.updateById(kehuxinxi);//全部更新
        return R.ok();
    }
    

    /**
     * 删除
     */
    @RequestMapping("/delete")
    public R delete(@RequestBody Long[] ids){
        kehuxinxiService.deleteBatchIds(Arrays.asList(ids));
        return R.ok();
    }
    
    /**
     * 提醒接口
     */
	@RequestMapping("/remind/{columnName}/{type}")
	public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, 
						 @PathVariable("type") String type,@RequestParam Map<String, Object> map) {
		map.put("column", columnName);
		map.put("type", type);
		
		if(type.equals("2")) {
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
			Calendar c = Calendar.getInstance();
			Date remindStartDate = null;
			Date remindEndDate = null;
			if(map.get("remindstart")!=null) {
				Integer remindStart = Integer.parseInt(map.get("remindstart").toString());
				c.setTime(new Date()); 
				c.add(Calendar.DAY_OF_MONTH,remindStart);
				remindStartDate = c.getTime();
				map.put("remindstart", sdf.format(remindStartDate));
			}
			if(map.get("remindend")!=null) {
				Integer remindEnd = Integer.parseInt(map.get("remindend").toString());
				c.setTime(new Date());
				c.add(Calendar.DAY_OF_MONTH,remindEnd);
				remindEndDate = c.getTime();
				map.put("remindend", sdf.format(remindEndDate));
			}
		}
		
		Wrapper<KehuxinxiEntity> wrapper = new EntityWrapper<KehuxinxiEntity>();
		if(map.get("remindstart")!=null) {
			wrapper.ge(columnName, map.get("remindstart"));
		}
		if(map.get("remindend")!=null) {
			wrapper.le(columnName, map.get("remindend"));
		}

		String tableName = request.getSession().getAttribute("tableName").toString();
		if(tableName.equals("yuangong")) {
			wrapper.eq("yuangonggonghao", (String)request.getSession().getAttribute("username"));
		}

		int count = kehuxinxiService.selectCount(wrapper);
		return R.ok().put("count", count);
	}
	






    /**
     * (按值统计)
     */
    @RequestMapping("/value/{xColumnName}/{yColumnName}")
    public R value(@PathVariable("yColumnName") String yColumnName, @PathVariable("xColumnName") String xColumnName,HttpServletRequest request) {
        Map<String, Object> params = new HashMap<String, Object>();
        params.put("xColumn", xColumnName);
        params.put("yColumn", yColumnName);
        EntityWrapper<KehuxinxiEntity> ew = new EntityWrapper<KehuxinxiEntity>();
		String tableName = request.getSession().getAttribute("tableName").toString();
		if(tableName.equals("yuangong")) {
            ew.eq("yuangonggonghao", (String)request.getSession().getAttribute("username"));
		}
        List<Map<String, Object>> result = kehuxinxiService.selectValue(params, ew);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        for(Map<String, Object> m : result) {
            for(String k : m.keySet()) {
                if(m.get(k) instanceof Date) {
                    m.put(k, sdf.format((Date)m.get(k)));
                }
            }
        }
        return R.ok().put("data", result);
    }

    /**
     * (按值统计)时间统计类型
     */
    @RequestMapping("/value/{xColumnName}/{yColumnName}/{timeStatType}")
    public R valueDay(@PathVariable("yColumnName") String yColumnName, @PathVariable("xColumnName") String xColumnName, @PathVariable("timeStatType") String timeStatType,HttpServletRequest request) {
        Map<String, Object> params = new HashMap<String, Object>();
        params.put("xColumn", xColumnName);
        params.put("yColumn", yColumnName);
        params.put("timeStatType", timeStatType);
        EntityWrapper<KehuxinxiEntity> ew = new EntityWrapper<KehuxinxiEntity>();
        String tableName = request.getSession().getAttribute("tableName").toString();
        if(tableName.equals("yuangong")) {
            ew.eq("yuangonggonghao", (String)request.getSession().getAttribute("username"));
        }
        List<Map<String, Object>> result = kehuxinxiService.selectTimeStatValue(params, ew);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        for(Map<String, Object> m : result) {
            for(String k : m.keySet()) {
                if(m.get(k) instanceof Date) {
                    m.put(k, sdf.format((Date)m.get(k)));
                }
            }
        }
        return R.ok().put("data", result);
    }

    /**
     * 分组统计
     */
    @RequestMapping("/group/{columnName}")
    public R group(@PathVariable("columnName") String columnName,HttpServletRequest request) {
        Map<String, Object> params = new HashMap<String, Object>();
        params.put("column", columnName);
        EntityWrapper<KehuxinxiEntity> ew = new EntityWrapper<KehuxinxiEntity>();
        String tableName = request.getSession().getAttribute("tableName").toString();
        if(tableName.equals("yuangong")) {
            ew.eq("yuangonggonghao", (String)request.getSession().getAttribute("username"));
        }
        List<Map<String, Object>> result = kehuxinxiService.selectGroup(params, ew);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        for(Map<String, Object> m : result) {
            for(String k : m.keySet()) {
                if(m.get(k) instanceof Date) {
                    m.put(k, sdf.format((Date)m.get(k)));
                }
            }
        }
        return R.ok().put("data", result);
    }

}

KehuxinxiServiceImpl.java
package com.service.impl;

import org.springframework.stereotype.Service;
import java.util.Map;
import java.util.List;

import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.utils.PageUtils;
import com.utils.Query;


import com.dao.KehuxinxiDao;
import com.entity.KehuxinxiEntity;
import com.service.KehuxinxiService;
import com.entity.vo.KehuxinxiVO;
import com.entity.view.KehuxinxiView;

@Service("kehuxinxiService")
public class KehuxinxiServiceImpl extends ServiceImpl<KehuxinxiDao, KehuxinxiEntity> implements KehuxinxiService {
	
	
    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        Page<KehuxinxiEntity> page = this.selectPage(
                new Query<KehuxinxiEntity>(params).getPage(),
                new EntityWrapper<KehuxinxiEntity>()
        );
        return new PageUtils(page);
    }
    
    @Override
	public PageUtils queryPage(Map<String, Object> params, Wrapper<KehuxinxiEntity> wrapper) {
		  Page<KehuxinxiView> page =new Query<KehuxinxiView>(params).getPage();
	        page.setRecords(baseMapper.selectListView(page,wrapper));
	    	PageUtils pageUtil = new PageUtils(page);
	    	return pageUtil;
 	}
    
    @Override
	public List<KehuxinxiVO> selectListVO(Wrapper<KehuxinxiEntity> wrapper) {
 		return baseMapper.selectListVO(wrapper);
	}
	
	@Override
	public KehuxinxiVO selectVO(Wrapper<KehuxinxiEntity> wrapper) {
 		return baseMapper.selectVO(wrapper);
	}
	
	@Override
	public List<KehuxinxiView> selectListView(Wrapper<KehuxinxiEntity> wrapper) {
		return baseMapper.selectListView(wrapper);
	}

	@Override
	public KehuxinxiView selectView(Wrapper<KehuxinxiEntity> wrapper) {
		return baseMapper.selectView(wrapper);
	}

    @Override
    public List<Map<String, Object>> selectValue(Map<String, Object> params, Wrapper<KehuxinxiEntity> wrapper) {
        return baseMapper.selectValue(params, wrapper);
    }

    @Override
    public List<Map<String, Object>> selectTimeStatValue(Map<String, Object> params, Wrapper<KehuxinxiEntity> wrapper) {
        return baseMapper.selectTimeStatValue(params, wrapper);
    }

    @Override
    public List<Map<String, Object>> selectGroup(Map<String, Object> params, Wrapper<KehuxinxiEntity> wrapper) {
        return baseMapper.selectGroup(params, wrapper);
    }

}

index.js
import Vue from 'vue'
import SvgIcon from '@/components/SvgIcon'// svg component

// register globally
Vue.component('svg-icon', SvgIcon)

const req = require.context('./svg/svg', false, /\.svg$/)
const requireAll = requireContext => requireContext.keys().map(requireContext)
requireAll(req)

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

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

相关文章

VSCode配置ssh免密连接远程服务器

我配置了免密设置(Windows利用ssh免密码登录Linux)&#xff0c;git bash已经能够正常连接了&#xff0c;但是vscode还是不行&#xff0c;很奇怪。 VSCode报错信息&#xff1a; [17:55:50.360] SSH Resolver called for "ssh-remote106.52.2.19", attempt 5, (Recon…

《机器学习》——运用OpenCV库中的KNN算法进行图像识别

文章目录 KNN算法的简单介绍下载OpenCV库实验内容实验结果完整代码自己手写数字传入模型中测试 KNN算法的简单介绍 一、KNN算法的基本要素 K值的选择&#xff1a;K值代表选择与新测试样本距离最近的前K个训练样本数&#xff0c;通常K是不大于20的整数。K值的选择对算法结果有重…

电压检测之比较电路

设计这款电路主要是本人在锂电池充电电路中挖了一个坑&#xff0c;对电源显示芯片的数据手册内容撰写不够详细的不好感受&#xff0c;所以自己根据比较电路的思想设计出了电压检测并反馈的电路&#xff0c;亦在提供一种电压检测的思想不需要借助ADC采集&#xff0c;在电路硬件上…

基于hive的海鲜交易数据分析系统设计与实现【hadoop、Flask、某东爬虫、sqoop、flume、mysql、hdfs】商品可换

文章目录 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主项目介绍研究背景国内外研究现状研究目的研究意义 关键技术理论介绍数据采集及预处理数据采集字段介绍数据预处理hadoop集群搭建及实现过程hive建表hive大数据分析 可视化展示店铺维度画像分…

AR 眼镜之-开关机定制-实现方案

目录 &#x1f4c2; 前言 AR 眼镜系统版本 开关机定制 1. &#x1f531; 技术方案 1.1 技术方案概述 1.2 实现方案 1&#xff09;开机 Logo 2&#xff09;开机音效 3&#xff09;开机动画 4&#xff09;关机动画 5&#xff09;关机弹窗 2. &#x1f4a0; 开机 Logo…

C++笔试题汇总

C笔试题汇总记录 一、概述二、概念分类1. 结构体1. C 和 C 中 struct 有什么区别&#xff1f;2. C中的 struct 和 class 有什么区别&#xff1f; 2. 类相关1. 类的大小1. 空类的大小2. 一般非空类大小3. 有虚函数类4. 有虚函数类的继承5. 只有虚函数6. 静态数据成员 2. C的三大…

【分享】格力手机色界G0245D 刷REC、root、 救砖、第三方rom教程和资源

开门见山 帮别人弄了一台 格力G0245D&#xff0c;把找到的资源和教程分享一下 教程 这个写的很详细了格力手机色界G0245D-Root-最简指南 不过教程里刷rec这一步漏了加上电源键&#xff0c;加上就行了。 附加参考&#xff1a;格力手机2刷机 格力手机二代刷机 GREE G0215D刷机…

C++ 特殊类设计以及单例模式

目录 1 不能被拷贝 2 只能在堆上创建对象 3 只能在栈上创建对象 4 禁止在堆上创建对象 5 不能被继承的类 6 单例类 特殊类就是一些有特殊需求的类。 1 不能被拷贝 要设计一个防拷贝的类&#xff0c;C98之前我们只需要将拷贝构造以及拷贝赋值设为私有&#xff0c;同时只声明…

在HFSS中对曲线等结构进行分割(Split)

在HFSS中对曲线进行分割 我们往往需要把DXF等其他类型文件导入HFSS进行分析&#xff0c;但是有时需要对某一个曲线单独进行分割成两段修改。 如果是使用HFSS绘制的曲线&#xff0c;我们修改起来非常方便&#xff0c;修改参数即可。但是如果是导入的曲线&#xff0c;则需要使用…

代码随想录训练营 Day31打卡 贪心算法 part05 56. 合并区间 738. 单调递增的数字 968. 监控二叉树

代码随想录训练营 Day31打卡 贪心算法 part05 一、 力扣56. 合并区间 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中…

【JavaEE】JVM 内存区域划分,以及 Java 垃圾回收机制引用计数器,可达性分析等

目录 1. JVM执行流程 2. JVM运行时数据区 2.1 堆 2.2 Java虚拟机栈(线程私有) 2.3本地方法栈(线程私有) 2.4 程序计数器 2.5 元数据区 3. JVM的类加载机制 1) 加载 2) 验证 3) 准备 4) 解析 5) 初始化 双亲委派模型 4. java垃圾回收 4.1 死亡对象判断方法 a) …

超精细CG杰作:8K壁纸级官方艺术插画,展现极致美丽与细节的汉服女孩

极致精美的数字艺术杰作&#xff1a;8K壁纸级别的官方插画&#xff0c;展现超高清细节与和谐统一的美感&#xff0c;女孩的精致面容与眼神在光影下熠熠生辉&#xff0c;汉服主题下的超高分辨率作品&#xff0c;文件巨大&#xff0c;细节丰富&#xff0c;令人惊叹。 正向提示词…

内存泄漏之如何使用Visual Studio的调试工具跟踪内存泄漏?

使用Visual Studio的调试工具跟踪内存泄漏是一个系统性的过程&#xff0c;主要包括启用内存泄漏检测、运行程序、分析内存使用情况以及定位泄漏源等步骤。 Visual Studio提供了多种方式来检测内存泄漏&#xff0c;你可以根据自己的需求选择合适的方法。 注意&#xff1a;下面…

父页面选项式api,子页面组合式api,子页面如何获取父页面的方法以及传值到将子页面的值传给父页面

开发的项目中是vue3的项目&#xff0c;但是有些同事用vue2中的选项式api写法&#xff0c;有些同事使用的是vue3组合式api的写法&#xff0c;此时子页面需要获取父页面的方法把数据传入父页面的方法中 父页面&#xff1a; 在父页面中order-item组件中创建自定义方法navigation和…

Leetcode每日刷题之剑指offer 57.和为s的两个数字(C++)

1.题目解析 现在题目改名为LCR.查找总价值为目标值的两个商品&#xff0c;虽然题目改变但是核心并未变化&#xff0c;都是需要寻找出和为指定数字的两数 2.算法原理 我们由题目知道给出的数组是递增的&#xff0c;所以在数组的首尾固定两个指针&#xff0c;判断其和是否为指定数…

Ceph篇之利用shell脚本实现批量创建bucket桶

Ceph创建bucket桶 在 Ceph 中创建桶&#xff08;bucket&#xff09;需要使用 Ceph 对象网关&#xff08;RGW&#xff09;。 注&#xff1a;如果查看shell批量创建脚本请直接参见目录3 1. 利用radosgw-admin工具创建桶 确保 Ceph 集群和对象网关已正确配置 确保你的 Ceph 集群…

快速了解Vi 和 Vim 编辑器三种模式及快捷键使用

&#x1f600;前言 本篇博文是关于Vi 和 Vim 编辑器的三种模式及快捷键使用&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意…

大数据产业链图谱_产业链全景图_大数据行业市场分析

数据作为新型生产要素&#xff0c;是数字化、网络化、智能化的基础&#xff0c;已快速融入生产、分配、流通、消费和社会服务管理等各环节&#xff0c;影响着千行百业&#xff0c;推动着我国数字经济的蓬勃发展。 大数据又称巨量数据、海量数据&#xff0c;是由数量巨大、结构…

C语言 | Leetcode C语言题解之第341题扁平化嵌套列表迭代器

题目&#xff1a; 题解&#xff1a; struct NestedIterator {int *vals;int size;int cur; };void dfs(struct NestedIterator *iter, struct NestedInteger **nestedList, int nestedListSize) {for (int i 0; i < nestedListSize; i) {if (NestedIntegerIsInteger(neste…

Sprache:轻量级C#解析器构建,可用于字符串验证等。

我们在开发中&#xff0c;经常需要对一些结构化文本进行解析&#xff0c;用于验证是否符合规则。我们一般会使用正则表达式&#xff0c;同时正则表达式也非常强大&#xff0c;但正则表达式在语法不便阅读与维护。 下面介绍一个简单、轻量级的库&#xff0c;方便我们在C#代码中…