@TOC
springboot394疫情居家办公系统--论文pf
第1章 绪论
1.1 课题背景
伴随着科技的进步,电子计算机已经成为人们日常生活不可或缺的办公工具。在这样的背景下,互联网技术被用于各个领域。为了能提高日常生活高效率,互联网信息技术性蓬勃发展。在这样的背景下,人类社会发展进到了一个新的信息时期。疫情居家办公管理方法一直是信息管理方法的一大难题。疫情居家办公管理人员流动性大,信息量多。这时,探寻合理方便快捷的疫情居家办公管理方案是重中之重。而日益完善的电子计算机信息管理方法已经成为解决这一问题的唯一选择。现如今,电子计算机信息管理方法早已非常容易解决疫情居家办公管理信息。实际上,信息管理方法早已渗入各行各业的信息全面管理中,并发挥了主导作用。随着现在社会主义社会的不断发展,平凡人的生活水准有了很大提高,互联网完成了许多方面,使互联网变成最直观、最简单、最便捷的接入口。
与传统疫情居家办公管理方案对比,应用疫情居家办公管理系统具备很多特点:最先,可以有效地提高疫情居家办公管理信息查找,仅需键入有关信息即可在几秒内意见反馈预期成果;次之,能够存放大量疫情居家办公管理管理信息,确保疫情居家办公管理管理信息安全性;与纸质文件对比,疫情居家办公管理系统节约了更多的空间和人力资源管理。这种优势大大的提高了效率降低成本。因而,必须开发设计疫情居家办公管理系统,高效管理疫情居家办公管理信息,不但提高疫情居家办公管理效益,提高客户信息安全性,便捷及时与管理人员意见反馈信息,提升与管理人员之间的互动,提高疫情居家办公管理的感受抗压强度。
1.2 课题意义
传统处理数据,必须是一张张纸,然后处理完毕又是统计在一张张纸上面,不断的重复处理,最终有个结果给最高层作为参考,这个模式在互联网没有出现之前,是一种常见的事情,信息管理的效率提不上去,人多不一定力量大,因为人多肯定更加消耗资源,并且因为人类需要休息,需要管理,思想会不统一,会偷懒,所以人们研究出专门帮助人们计算的机器,就是计算机的前身,到了互联网时代,人们发现完全可以让程序供应商提供解决方案,自己挑选自己合适的方案来提高自己的产出比。所以在日常工作和生活中会发现各种各样方便人们的工具。
本课题研发的疫情居家办公系统管理系统,就是提供疫情居家办公系统信息处理的解决方案,它可以短时间处理完信息,并且这些信息都有专门的存储设备,而且数据的备份和迁移都可以设定为无人值守,从人力角度和信息处理角度以及信息安全角度,疫情居家办公系统管理系统是完胜传统纸质操作的。
1.3 研究方案
软件系统结构计划方案:因为系统务必在不同设备上运行,计算机服务器配置要求越小越好。要实现这一要求,B/S结构已经成为最好的选择。运用B/S结构的系统基本可以在大多数计算机中运行。只需计算机电脑浏览器可以正常运行,系统就能正常的运行,维护费用和二次修改比较容易符合要求。
操作过程系统方案:Windows10操作过程系统是微软发布最新发布的系统。目前市面上绝大部分计算机都使用这种系统,功能齐全,兼容模式好。开发工具:挑选IDEA。Java语言研发设计。
第2章 开发环境与技术
本章节对开发疫情居家办公系统管理系统需要搭建的开发环境,还有疫情居家办公系统管理系统开发中使用的编程技术等进行阐述。
2.1 MySQL数据库
MySQL是一种具有安全系数、安全系数、混合开发性、高效化等特征的轻量关联数据库智能管理系统。MySQL由C语言和C++语言构成,由于C语言和C++语言是混合开发的,因此MySQL源码是生命期的。MySQL提供多种多样数据种类,常见的数据种类包含[34]。伴随着数据库技术发展,MySQL逐步形成数据库管理方法的重要工具之一。它不仅能提供简单实用的操作作用,还能实现复杂多变的数据检索方法和查询记录导出方式。因为MySQL具有较好的兼容模式和扩展性,因而广泛应用于各行各业。
MySQL在WEB行业越来越受单位和个人开发者的亲睐。大部分大中小型网址都采用MySQL数据库,它不仅可以提供简单高效的数据浏览作用,还会对数据进行相应的分析解决。因为Linux电脑操作系统和MySQL数据库全是开源系统免费体验,能够为公司节约许多费用,让很多企业使用Linux MySQL做为网址数据库,体型小,启动速度快,也不会影响网址性能,导致用户体验感极差。
MySQL数据库能够支持各种各样操作系统的运作,包含AIX、HP-UX、OS/2 Wrap、Solaris、Mac OS、Linux和Windows等。性能好,使用便捷。因而,MySQL数据库已成为当下数据库行业最流行商品之一。MySQL数据库系统使用面向对象设计方式,客户至上开展编程设计。是利用面向对象观念来达到各项功能。它不仅能管理方法大中型数据表或关系数据库,还可以把这种复杂且庞大信息系统集成到一个简单的中小型数据库系统内。现阶段,中国很多公司早已运用了这一尖端技术。
2.2 Java语言技术
Java语言已经存在了25年有余。通过这些年的发展趋势,it行业在市场占有率上仍然占据一半,仍然受到了很多程序员的工作钟爱。许多从业者都是在学习培训。近年来随着从业者的提高,Java语言的位置并没减少,算得上是常青藤。Java语言学习培训比较简单,自然,它是对于C前辈们的 而言的,C 语言非常强劲。Java取消了许多特点,如go这种描述,也取消了主文件,让所有文件夹全是类,类是二维数组以及各种对象,也使Java处理一些对象的引入和回收利用,让开发者只需建立对象,应用对象,编写代码逻辑,不需要留意性能,让各种各样文件存储给Java自己解决,你能花很多时间科学研究应用软件相互关系,使研发更为集中化,如同跑车驾驶员一样,只要了解各种汽车的性能,实际操作,不需要科学研究如何生产车轮子,使软件开发更为详尽。
2.3 Spring Boot框架
Spring Boot框架是一个SpringMVC架构的快速轻量快速框架,能够帮助开发人员迅速搭建靠谱高效率的应用程序。依据自动部署和协议书,改善了Spring的研究过程,使开发人员可以更加专注于领域模型。
Spring Boot有许多特性,当中最主要的是它提供了内置Tomcat、Jetty、Undertow等Web网络服务器能够轻松搭建Web应用程序。除此之外,它也提供自动部署、无需撰写XML文件等功能。这种功能使开发人员能够迅速建立和布署应用程序,而无需解决繁杂的环境变量和其它繁琐复杂每日任务。
开发系统时,Spring Boot能够帮助开发人员完成模块化设计和松耦合的代码结构,从而更好地日常维护拓展应用程序。除此之外,它也提供了很多常见的库和部件,如Spring Data、Spring Security等,能够轻松集成化这种部件,完成数据库操作、验证、受权等功能。
2.4 其他技术使用
Spring-jdbc联接:
这是一个专业生产制造Connection对象工厂类,大部分全部用以建立数据库联接框架都是会完成这一插口,Springjdbc包就实现了这一插口,实现类是DriverManagerdasource、现阶段的项目是由DataSource的getconection方式获得配备MySQL5.7数据库连接信息。
提交Fileupload文件:
项目中应用Fileupload完成文件提交,通常是Fileupload前面提交文件提交请求,请求形式为POST:<form action="uploadServlet" method="post" ....="">请求编码方式:等候文件提交,启用Fileitem的isformField()方式,判断出表格域到底还是不是表格域,文件提交到后台管理,应用Fileupload接受文件信息,并把文件解决包存储在硬盘和库中。
Alibaba驱动:
比照各大网站Alibaba.Druid是JAVA语言中比较好的数据库连接池。Druid可提供强有力的拓展和监控功能。该项目应用Alibababa.Druid开展数据库系统连接,Druid 0.1.18 以后,全部版本号都分享到maven中央仓库,在项目pome中.在xml里加入dependency就可以使用。
log4j日志:
疫情居家办公系统管理系统错误处理和日志信息纪录,应用log4j开展日志日常维护管理与查询,其核心优势是错误处理:在logback中,应用软件里的出现异常不被应用软件认知,特性提升,关键或没有废弃物体制,log4j在很多情况下,可采取设计的一套无废弃物体制,防止经常日志搜集所引起的jvm gc。操作方法很简单,在pom中.新增log4j有关jarxml就可以。
第3章 系统分析
本文作者在确定了研究的课题之后,从各大数字图书馆下载文献来阅读,并了解同类型的网站具备的大致功能,然后具体事务具体分析,得出本系统要研究的具体功能与性能。虽然分析系统这一阶段性工作主要是确定功能,但它却影响着后面系统开发环节的进展,系统分析这个环节是不能少的。
3 系统分析
3.1.1 技术可行性分析
研发设计程序流程选择面向对象设计、功能齐全、简单实用的Java编程设计核心理念。MySQL数据库存储数据。IDEA工具作为编程软件,Windows 10计算机操作系统作为应用系统,以及数据库可视化工具等技术职称。一般来说,该程序流程的开发能够从技术上开展是可行的。
3.1.2 经济可行性分析
开发的程序并不是向着商业程序方向设计与开发的,反而是做为一个新的毕业论文新项目开发的。它主要运用于检测小朋友们在院校所学的知识,并锻练用戶使用网络、书籍和其他方式自学能力。因而,程序软件的开发不容易涉及到边际收益,也不会为软件的选择付钱。你可以在开发软件的官网上下载所需要的软件,并依据所需要的安装方法将应用安装到你的电脑里。一般来说,开发这一程序并没有社会经济发展花费。
3.1.3 运行可行性分析
由于程序软件就是针对大部分一般操作用户,考虑到他的知识与文化水准,尤其开发了一个可操作度高的程序软件,能够轻而易举地让用户应用,数据可视化操作页面。一般来说,从用户操作程序的角度看,这一程序其实并不难操作。只需用户开启程序,就能避免专职人员学习培训开展程序作用操作。
3.2系统性能分析
需求分析报告包含根据用户实际需求制订功能和定制系统的性能需求分析报告。因而,在一般数据分析系统时,一方面要数据分析系统的作用,另一方面要知道全面的性能。终究,性能更加好的全面的设计设计和开发能够保证系统质量以及可靠性。
下面,从易学易用性、系统时间特性、系统稳定性等多个方面系统性能展开分析表明。
(1)系统容积规定:明确系统进行数据处理方法容量更大化。换句话说,假如系统建立模型容量临界点超出这一临界点,系统可能设备异常。
(2)系统精度规定:明确传送数据所需要的精度值,包含数值计算方法的精度值、数据信息精度系数的设定等。
(3)时长特点规定:系统建立模型有时限要求,那也是系统的时间也特点。一般剖析数据处理方法的时间也,设定用户标准的响应速度,及其系统在超负荷运行中能够偏移的范围值,要提前剖析明确。
(4)适应能力规定:当系统应对系统环境变化时,其融入这些变化的能力也要根据参数信息来反映。比如,应对变动的必须,系统必须通过强调必须设计方案的一个过程或系统来适应变化来反映系统的适应能力。
(5)易学易用性:除开作用应该考虑用户要求外,人机交互设计还要考虑到用户的用户习惯,包含界面风格、页面色彩选择与色彩搭配。尝试让用户接受简单学习后单独实际操作系统。
(6)系统稳定性:针对新手来说,容易出现一个问题,那便是产品设计开发的系统,由于人工操作失误奔溃,有的还会造成电脑崩溃。这种情况也说明了容错机制能力低系统不靠谱。
3.3系统流程分析
管理员假如要操作系统提供的功能,那么管理员就要在系统的登录界面,填写管理员登录的账号信息,填写相应的密码信息,管理员需要保证这两者能够验证身份的账号以及密码信息的正确性,这样管理员就可以通过登录界面进入系统后台操作界面。图3.1就是开发的程序软件疫情居家办公系统它的操作流程图。
图3.1 系统操作流程图
3.3.1系统登录流程
疫情居家办公系统登录流程如下图。
图3.2 系统登录流程图
3.3.2信息添加流程
用户添加信息流程如下图。
图3.3 添加信息流程图
3.3.3信息删除流程
信息删除流程如下图所示。
图3.4 信息删除流程图
3.4 功能用例描述
通过对疫情居家办公系统的用户及管理员的用例分析,将本系统的主要用例描述如下:
表 3.6 疫情居家办公系统用户查看用户信息用例描述
|名称|疫情居家办公系统用户查看用户信息| | - | - | |说明|疫情居家办公系统用户查看用户信息| |参与者|疫情居家办公系统用户| |先决条件|系统正常运行,且用户已经登陆疫情居家办公系统| |输入信息|商品名称或商品编号| |结果|显示商品详情| |过程|
1. 用户在查找输入框输入用户名称
2. 点击搜索按钮
3. 系统显示出符合条件的用户的简要信息
4. 用户点击进行浏览用户详情
|表3.7 疫情居家办公系统用户登录用例描述
|名称|疫情居家办公系统用户登录| | - | - | |说明|疫情居家办公系统用户输入自己的账号和密码进行登录| |参与者|疫情居家办公系统用户| |先决条件|系统正常运行| |输入信息|账号和密码| |结果|跳转系统首页| |后置条件|如果用户登录成功,则该用户可以查看个人中心和添加购物车等操作| |过程|
1. 用户进入登录界面
2. 用户输入自己的账号和密码
3. 用户提交输入的信息
4. 系统对用户输入的账号和密码进行校验
|表3.8 疫情居家办公系统用户修改个人信息用例描述
|名称|疫情居家办公系统用户修改个人信息| | - | - | |说明|疫情居家办公系统用户修改个人信息| |参与者|疫情居家办公系统用户| |先决条件|系统正常运行,且用户已经登陆疫情居家办公系统| |输入信息|无| |结果|弹出修改成功或失败| |过程|
1. 用户点击个人中心
2. 在对应的输入框输入要修改的内容
3. 点击更新信息
|表3.9 疫情居家办公系统外出报备管理用例描述
|名称|疫情居家办公系统外出报备管理| | - | - | |说明|疫情居家办公系统用户对外出报备进行添加修改和删除查看等| |参与者|疫情居家办公系统用户| |先决条件|系统正常运行,且用户已经登陆疫情居家办公系统| |输入信息|无| |过程|
1. 用户点击外出报备
2. 可以对外出报备进行相关的维护和搜索
|表 3.10 疫情居家办公系统签到管理用例描述
|名称|疫情居家办公系统管理员管理签到管理信息| | - | - | |说明|疫情居家办公系统管理员查看、增加、删除、修改签到管理信息| |参与者|疫情居家办公系统管理员| |先决条件|系统正常运行,且管理员已经登陆疫情居家办公系统| |输入信息|无| |结果|管理员查看、增加、删除、修改签到管理信息| |过程|
管理员点击签到管理列表
可以对签到管理信息进行相关的维护和搜索
|表 3.11 疫情居家办公系统管理员系统公告管理用例描述
|名称|疫情居家办公系统管理员系统公告管理| | - | - | |说明|疫情居家办公系统管理员查看、增加、删除、修改系统公告| |参与者|疫情居家办公系统管理员| |先决条件|系统正常运行,且管理员已经登陆疫情居家办公系统| |输入信息|无| |结果|管理员查看、增加、删除、修改系统公告| |过程|
1. 管理员点击系统公告管理
2. 管理员对系统公告进行增加、删除和修改
|第4章 系统设计
用户对着浏览器操作,肯定会出现某些不可预料的问题,但是不代表着系统对于用户在浏览器上的操作不进行处理,所以说,要提前考虑可能会出现的问题。
4.1 系统设计思想
系统设计,肯定要把设计的思想进行统一,只有统一的思想才能指导程序的开发,并且可以让众多的程序开发人员更快速的进入状态,提高开发速度。根据当前系统的既定需求,下面将进行本系统设计思想的阐述。
(1)扩展性:开发任何一个系统的时候不可避免要考虑这个问题。软件版本的更迭是一种常识,任何一个软件都不会一次性开发就成永恒,软件是一个不断成长的东西。所以考虑问题的时候需要对当前问题进行数据上的扩大化,然后进行归纳整理,最终形成具有一定扩展性的程序。程序的可扩展性必然会影响开发进度,所以最终需要综合评估程序的可扩展程度,进而有的放矢,循序开发。
(2)实用性:程序设计是一个先高屋建瓴式的设想,然后再具体化,实用性就是具体化的第一个步骤,要充分考虑使用者是不懂程序设计的这一点,使用者只是懂得常规性的上网操作步骤,并不需要对程序进行理解,所以一定要让使用者感觉到便利,感觉到实用性的存在,如果使用者使用程序过程中没发现使用程序的好处,那么程序设计的实用性将大大降低。
(3)安全性:当使用者使用的过程中,会产生大量的相关数据,这些数据必须有安全性的保证,否则当使用者发现数据出现问题的原因是程序设计问题的时候,将会对程序开发者失去信任,甚至可能会产生大量的费用赔偿问题,这是一个不可避免的问题。所以安全性关系开发与使用者双方的经济利益,程序的安全性是一定要保证的。
(4)先进性:程序设计的先进性是开发者进行考虑的,必须要在满足系统功能的前提下,必须要选择好当下最合适的技术。最合适的技术要从开发成本,使用成本以及维护成本里面综合分析,经过综合分析后要让技术实现最优解,保持先进的技术生产力。
(5)维护性:程序开发之初就要考虑以后的维护问题。维护是在程序开发完毕,已经上线可以运作,进入生产试用过程和使用过程中才会发现需要维护的必要。要通过各方面降低维护成本,不是说维护的越少就代表程序开发的越完美,程序既然是人类进行设计制造的,肯定有很多不可避免的问题产生,那么如何维护好程序的正常运作也是一门很重要的学问。
4.2 功能结构设计
图4.1即为设计的管理员功能结构,管理员权限操作的功能包括管理公告,管理疫情居家办公系统信息,包括外出报备管理,培训管理,签到管理,薪资管理等,可以管理公告。
图4.1 管理员功能结构
4.3 数据库设计
疫情居家办公系统管理系统运行中产生的数据需要按照提前设置的存储规则进行保存,设计出一个符合项目的最优数据存储格式,因为它能减少用户的等待时间,还可以对系统的请求在最短时间内进行响应。所以,对数据库设计时,需要对功能需求进行详细的拆分,以及对业务状态的细分,然后设计具体的存储规则,保证数据库能正常运作,缩短数据处理时间,并在一定程度上降低数据冗余,节省存储空间。
4.3.1 数据库概念设计
实体-联系图还有一个名称即E-R图,是Entity Relationship Diagram各英文单词首字母的缩写,它这种概念模型通常用于对现实世界进行描述。同时它还是一种能够直观表达数据中实体,联系,属性的有效手段。绘制E-R图能够选择的工具也有很多,但是Office Visio 这款软件在E-R图的绘制上一般都是作为首选工具,因为它是基于可视化处理,使用它创建E-R图非常简单。使用基本的E-R图构成元素,比如椭圆,菱形,矩形,还有实线段来表达对应的信息,椭圆代表属性,即实体的特征,矩形代表实体,即数据库中的一个具体数据表,菱形代表实体中相互关系,实线段主要是完成椭圆,矩形,菱形的连接。
(1)下图是签到信息实体和其具备的属性。
签到信息实体属性图
(2)下图是用户实体和其具备的属性。
用户实体属性图
(3)下图是部门信息实体和其具备的属性。
部门信息实体属性图
(4)下图是公告信息实体和其具备的属性。
公告信息实体属性图
(5)下图是办公设备实体和其具备的属性。
办公设备实体属性图
(6)下图是请假信息实体和其具备的属性。
请假信息实体属性图
(7)下图是留言实体和其具备的属性。
留言实体属性图
(8)下图是外出报备实体和其具备的属性。
外出报备实体属性图
(9)下图是薪资实体和其具备的属性。
薪资实体属性图
(10)下图是公司资料实体和其具备的属性。
公司资料实体属性图
4.3.2 数据库物理设计
本小节主要任务即是根据上述内容进行数据存储结构的设计,实体的属性就用来表示字段名称,不同的字段表示的数据类型以及取值都不相同,以及该表各个字段是否能够保持空等进行说明,设计完成一张数据表的结构之后,在保存时同样要命名,尽量选择英文名称进行命名并保存,还不容易导致系统出错。接下来就对设计的表进行简单说明。
表4.1办公设备表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
---|---|---|---|---|
1 | Id | Int | id | 否 |
2 | bangong_yuyue_uuid_number | String | 报名编号 | 是 |
3 | yonghu_id | Integer | 用户 | 是 |
4 | bangong_yuyue_text | String | 理由 | 是 |
5 | insert_time | Date | 请假信息时间 | 是 |
6 | bangong_yuyue_types | Integer | 办公用品 | 是 |
7 | bangong_yuyue_yesno_types | Integer | 报名状态 | 是 |
8 | bangong_yuyue_yesno_text | String | 审核回复 | 是 |
9 | bangong_yuyue_shenhe_time | Date | 审核时间 | 是 |
10 | bangong_yuyue_time | Date | 预约时间 | 是 |
11 | create_time | Date | 创建时间 | 是 |
表4.2部门信息表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
---|---|---|---|---|
1 | Id | Int | id | 否 |
2 | bumen_uuid_number | String | 部门编号 | 是 |
3 | bumen_name | String | 部门名称 | 是 |
4 | bumen_address | String | 部门位置 | 是 |
5 | bumen_content | String | 部门备注 | 是 |
6 | insert_time | Date | 录入时间 | 是 |
7 | create_time | Date | 创建时间 | 是 |
表4.3字典表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
---|---|---|---|---|
1 | Id | Int | id | 否 |
2 | dic_code | String | 字段 | 是 |
3 | dic_name | String | 字段名 | 是 |
4 | code_index | Integer | 编码 | 是 |
5 | index_name | String | 编码名字 | 是 |
6 | super_id | Integer | 父字段id | 是 |
7 | beizhu | String | 备注 | 是 |
8 | create_time | Date | 创建时间 | 是 |
表4.4公告信息表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
---|---|---|---|---|
1 | Id | Int | id | 否 |
2 | gonggao_name | String | 公告名称 | 是 |
3 | gonggao_photo | String | 公告图片 | 是 |
4 | gonggao_types | Integer | 公告类型 | 是 |
5 | insert_time | Date | 发布时间 | 是 |
6 | gonggao_content | String | 公告详情 | 是 |
7 | create_time | Date | 创建时间 | 是 |
表4.5请假信息表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
---|---|---|---|---|
1 | Id | Int | id | 否 |
2 | huodong_yuyue_uuid_number | String | 报名编号 | 是 |
3 | yonghu_id | Integer | 用户 | 是 |
4 | huodong_yuyue_text | String | 请假理由 | 是 |
5 | insert_time | Date | 请假信息时间 | 是 |
6 | huodong_yuyue_yesno_types | Integer | 报名状态 | 是 |
7 | huodong_yuyue_yesno_text | String | 审核回复 | 是 |
8 | huodong_yuyue_shenhe_time | Date | 审核时间 | 是 |
9 | huodong_yuyue_time | Date | 预约时间 | 是 |
10 | create_time | Date | 创建时间 | 是 |
表4.6签到信息表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
---|---|---|---|---|
1 | Id | Int | id | 否 |
2 | yonghu_id | Integer | 用户 | 是 |
3 | kaoqin_types | Integer | 考勤结果 | 是 |
4 | kaoqin_content | String | 考勤详情 | 是 |
5 | kaoqin_time | Date | 考勤日期 | 是 |
6 | insert_time | Date | 录入时间 | 是 |
7 | create_time | Date | 创建时间 | 是 |
表4.7留言表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
---|---|---|---|---|
1 | Id | Int | id | 否 |
2 | yonghu_id | Integer | 用户 | 是 |
3 | liuyan_text | String | 留言内容 | 是 |
4 | insert_time | Date | 留言时间 | 是 |
5 | reply_text | String | 回复内容 | 是 |
6 | update_time | Date | 回复时间 | 是 |
7 | create_time | Date | 创建时间 | 是 |
表4.8外出报备表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
---|---|---|---|---|
1 | Id | Int | id | 否 |
2 | yonghu_id | Integer | 用户 | 是 |
3 | wangfan_yuyue_text | String | 申请理由 | 是 |
4 | wangfan_yuyue_types | Integer | 交通工具 | 是 |
5 | wangfan_yuyue_mudidi | String | 去哪里 | 是 |
6 | wangfan_yuyue_chufadi | String | 地址 | 是 |
7 | wangfan_yuyue_shenti_types | Integer | 身体状态 | 是 |
8 | wangfan_yuyue_chufa_time | Date | 出发时间 | 是 |
9 | wangfan_yuyue_daoda_time | Date | 到达时间 | 是 |
10 | wangfan_yuyue_yesno_types | Integer | 申报状态 | 是 |
11 | wangfan_yuyue_yesno_text | String | 审核回复 | 是 |
12 | wangfan_yuyue_shenhe_time | Date | 审核时间 | 是 |
13 | insert_time | Date | 活动报名时间 | 是 |
14 | create_time | Date | 创建时间 | 是 |
表4.9薪资表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
---|---|---|---|---|
1 | Id | Int | id | 否 |
2 | yonghu_id | Integer | 用户 | 是 |
3 | xinzi_uuid_number | String | 薪资编号 | 是 |
4 | xinzi_name | String | 标题 | 是 |
5 | xinzi_month | String | 月份 | 是 |
6 | jiben_jine | BigDecimal | 基本工资 | 是 |
7 | jiangjin_jine | BigDecimal | 奖金 | 是 |
8 | jixiao_jine | BigDecimal | 绩效 | 是 |
9 | butie_jine | BigDecimal | 补贴 | 是 |
10 | shifa_jine | BigDecimal | 实发 | 是 |
11 | xinzi_content | String | 备注 | 是 |
12 | insert_time | Date | 添加时间 | 是 |
13 | create_time | Date | 创建时间 | 是 |
表4.10用户表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
---|---|---|---|---|
1 | Id | Int | id | 否 |
2 | bumen_id | Integer | 部门 | 是 |
3 | yonghu_name | String | 用户姓名 | 是 |
4 | yonghu_phone | String | 用户手机号 | 是 |
5 | yonghu_id_number | String | 用户身份证号 | 是 |
6 | yonghu_photo | String | 用户头像 | 是 |
7 | yonghu_email | String | 电子邮箱 | 是 |
8 | create_time | Date | 创建时间 | 是 |
表4.11公司资料表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
---|---|---|---|---|
1 | Id | Int | id | 否 |
2 | ziliao_name | String | 公司资料名称 | 是 |
3 | ziliao_uuid_number | String | 公司资料编号 | 是 |
4 | ziliao_photo | String | 公司资料照片 | 是 |
5 | ziliao_types | Integer | 公司资料类型 | 是 |
6 | ziliao_file | String | 公司资料下载 | 是 |
7 | ziliao_content | String | 公司资料介绍 | 是 |
8 | ziliao_delete | Integer | 逻辑删除 | 是 |
9 | insert_time | Date | 录入时间 | 是 |
10 | create_time | Date | 创建时间 | 是 |
表4.12管理员表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
---|---|---|---|---|
1 | Id | Int | id | 否 |
2 | username | String | 儿童名 | 是 |
3 | password | String | 密码 | 是 |
4 | role | String | 角色 | 是 |
5 | addtime | Date | 新增时间 | 是 |
第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 公告类型管理界面
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);
}
}
KaoqinController.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("/kaoqin")
public class KaoqinController {
private static final Logger logger = LoggerFactory.getLogger(KaoqinController.class);
private static final String TABLE_NAME = "kaoqin";
@Autowired
private KaoqinService kaoqinService;
@Autowired
private TokenService tokenService;
@Autowired
private BangongYuyueService bangongYuyueService;//办公设备
@Autowired
private BumenService bumenService;//部门信息
@Autowired
private DictionaryService dictionaryService;//字典
@Autowired
private GonggaoService gonggaoService;//公告信息
@Autowired
private HuodongYuyueService huodongYuyueService;//请假信息
@Autowired
private LiuyanService liuyanService;//留言
@Autowired
private WangfanYuyueService wangfanYuyueService;//外出报备
@Autowired
private XinziService xinziService;//薪资
@Autowired
private YonghuService yonghuService;//用户
@Autowired
private ZiliaoService ziliaoService;//公司资料
@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"));
CommonUtil.checkMap(params);
PageUtils page = kaoqinService.queryPage(params);
//字典表数据转换
List<KaoqinView> list =(List<KaoqinView>)page.getList();
for(KaoqinView 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);
KaoqinEntity kaoqin = kaoqinService.selectById(id);
if(kaoqin !=null){
//entity转view
KaoqinView view = new KaoqinView();
BeanUtils.copyProperties( kaoqin , view );//把实体数据重构到view中
//级联表 用户
//级联表
YonghuEntity yonghu = yonghuService.selectById(kaoqin.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 KaoqinEntity kaoqin, HttpServletRequest request){
logger.debug("save方法:,,Controller:{},,kaoqin:{}",this.getClass().getName(),kaoqin.toString());
String role = String.valueOf(request.getSession().getAttribute("role"));
if(false)
return R.error(511,"永远不会进入");
else if("用户".equals(role))
kaoqin.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));
Wrapper<KaoqinEntity> queryWrapper = new EntityWrapper<KaoqinEntity>()
.eq("yonghu_id", kaoqin.getYonghuId())
.eq("kaoqin_types", kaoqin.getKaoqinTypes())
.eq("kaoqin_time", new SimpleDateFormat("yyyy-MM-dd").format(kaoqin.getKaoqinTime()))
;
logger.info("sql语句:"+queryWrapper.getSqlSegment());
KaoqinEntity kaoqinEntity = kaoqinService.selectOne(queryWrapper);
if(kaoqinEntity==null){
kaoqin.setInsertTime(new Date());
kaoqin.setCreateTime(new Date());
kaoqinService.insert(kaoqin);
return R.ok();
}else {
return R.error(511,"表中有相同数据");
}
}
/**
* 后端修改
*/
@RequestMapping("/update")
public R update(@RequestBody KaoqinEntity kaoqin, HttpServletRequest request) throws NoSuchFieldException, ClassNotFoundException, IllegalAccessException, InstantiationException {
logger.debug("update方法:,,Controller:{},,kaoqin:{}",this.getClass().getName(),kaoqin.toString());
KaoqinEntity oldKaoqinEntity = kaoqinService.selectById(kaoqin.getId());//查询原先数据
String role = String.valueOf(request.getSession().getAttribute("role"));
// if(false)
// return R.error(511,"永远不会进入");
// else if("用户".equals(role))
// kaoqin.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));
if("".equals(kaoqin.getKaoqinContent()) || "null".equals(kaoqin.getKaoqinContent())){
kaoqin.setKaoqinContent(null);
}
kaoqinService.updateById(kaoqin);//根据id更新
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Integer[] ids, HttpServletRequest request){
logger.debug("delete:,,Controller:{},,ids:{}",this.getClass().getName(),ids.toString());
List<KaoqinEntity> oldKaoqinList =kaoqinService.selectBatchIds(Arrays.asList(ids));//要删除的数据
kaoqinService.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");
//.eq("time", new SimpleDateFormat("yyyy-MM-dd").format(new Date()))
try {
List<KaoqinEntity> kaoqinList = 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){
//循环
KaoqinEntity kaoqinEntity = new KaoqinEntity();
// kaoqinEntity.setYonghuId(Integer.valueOf(data.get(0))); //用户 要改的
// kaoqinEntity.setKaoqinTypes(Integer.valueOf(data.get(0))); //考勤结果 要改的
// kaoqinEntity.setKaoqinContent("");//详情和图片
// kaoqinEntity.setKaoqinTime(sdf.parse(data.get(0))); //考勤日期 要改的
// kaoqinEntity.setInsertTime(date);//时间
// kaoqinEntity.setCreateTime(date);//时间
kaoqinList.add(kaoqinEntity);
//把要查询是否重复的字段放入map中
}
//查询是否重复
kaoqinService.insertBatch(kaoqinList);
return R.ok();
}
}
}
}catch (Exception e){
e.printStackTrace();
return R.error(511,"批量插入数据异常,请联系管理员");
}
}
}
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;
}
}
声明
本博客适用于广泛的学术和教育用途,包括但不限于个人学习、开发设计,产品设计。仅供学习参考,旨在为读者提供深入理解和学术研究的材料。