@TOC
springboot453工资信息管理系统--论文pf
绪论
1.1研究背景与意义
信息化管理模式是将行业中的工作流程由人工服务,逐渐转换为使用计算机技术的信息化管理服务。这种管理模式发展迅速,使用起来非常简单容易,用户甚至不用掌握相关的专业知识,根据教程指导即可正常使用相关的系统,因而被越来越多的用户所使用。由于相关行业管理信息化,这就使得管理工作不在受到时间和区域的限制,随时随地即可完成相关的工作任务和结果[1]。就目前而言,管理信息化在现代社会中非常流行,使用比较广泛。早在20世纪70年代末,就出现了早期的电子商务,相关的公司企业使用计算机建立专用的内部网络,通过内部网络完成相应的采购、销售等活动,加快相关的企业之间的交易速度,提高了工作效率[2]。
当下,许多行业采用互联网技术将工作流程信息化、数字化,提高了相关人员的服务质量和效率,节约了相关行业的人力、财力、物力等资源,与此同时,人们获取外界的相关信息主要依赖于主流的信息化技术和工具。人们对生活的需求也在不断的发生着变化,为了应对用户的多样化需求,许多相关的第三产业应运而生,管理信息化也逐渐的流行起来,比如电子商务行业。本人通过查询大量学习资料,了解基本的开发系统的基本背景和关键任务,学习与掌握Java语言、web技术、AJAX技术、HTML语言等开发技术,设计系统功能模块,以及MySQL数据库的相关语法和工具,创建和存储数据表格,反映和关联表格之间相互存在的关系,由此对工资信息管理系统进行研发和实现。
1.2国内外研究现状
大概在20世纪90年代,我国才开始研发工资信息管理系统,与一些发达国家相比,系统研发起步比较晚。当时的计算机技术刚开始发展起来,国家经济力量比较薄弱,各地区的经济发展水平不平衡,再加上相关的网络应用技术不太先进,我国也使用了一段较长的时间对网络信息化管理进行探索[3]。近些年,因为国家非常重视和支持第三产业的发展,以及人们的日常生活需求越来越离不开信息管理技术的使用,所以我国的信息管理系统行业发展速度非常快,并且相关的体制法规也正在不断地被完善和改进。新时代背景下,根据人们的相关需求,不断地促进着相关产业的产生与发展,一系列电子产品、应用软件、信息管理系统等新时代的产物逐渐出现在人们的视野中,并且在近几年发展迅速,日渐趋于成熟[4]。
与国内相比,国外工资信息管理系统领域发展较早。国外的计算机技术发展比较成熟,所以系统相关的设计也比较完善。19世纪60年代左右,国外就开始研发工资信息管理系统,并且不久之后,迅速将其投入市场进行使用。美国、英国等一些发达国家快速发展计算机技术,促进了工资信息管理系统管理行业信息化建设[5]。而后随着相关的技术不断地发展,覆盖面非常广泛,应用领域比较多,促进着工资信息管理系统等相关的信息管理系统不断地发展和完善,并且其所设计的系统功能结构也比较合理、全面。相对而言,国外系统的研发在相关领域上还是占据着较大的优势[6]。因此,我们需要吸收国外系统开发领域中的较好的技术精华,发展我国的信息化管理系统,使得其面向大众,能够更好的、更全面的服务于相关的工作人员。
1.3研究内容
现今,互联网在我们的日常生活占据着日益重要的地位,我们也越来越离不开对移动设备、电脑等上网设备的使用。传统的工资信息管理系统模式主要依靠管理人员纯手工记录的相关信息,比较繁琐,不方便查找,也非常容易出现错误。如今,如果再通过手工记录用户,将大大不利于工资信息管理系统行业管理相关的工资信息管理系统信息,严重影响工资信息管理系统行业的发展。因此,本人结合传统的工资信息管理系统业务模式和先进的电子信息管理模式,使用Java语言编程设计功能模块,AJAX实现前台和后台之间的交互,MySQL数据库创建和存储数据表格,对工资信息管理系统进行设计和开发。本系统的设计有利于相关行业实现最大化的资源管理与共享,促进相关行业的信息交流、分工合作,提高相关工作人员的工作效率,最终实现整个工资信息管理系统行业服务的信息化管理。
1.4论文结构
本文围绕着工资信息管理系统的整个开发过程,展开了详细的描述和说明,设计和实现本系统的主要工作有:首先分析研究背景、研究状态,其次介绍设计系统时使用到的相关技术,然后通过系统分析确定系统的功能需求,接着通过编码工作详细设计和实现系统,最后再通过系统测试,找出系统存在的问题和解决问题的方法,不断地修改和完善系统。论文内容的组织结构设计如下。
第一章绪论,通过介绍本系统的研究背景、研究现状等内容,帮助用户了解和认识本系统的发展过程。
第二章相关技术介绍,主要介绍了Java语言、VUE框架、MySQL数据库等相关的开发技术,为后期系统的功能实现提供技术上的支持。
第三章系统分析,分析用户的使用需求,以及系统实现的可行性,最后通过用例建模分析与系统相关的参与者及其用例之间的关系。
第四章系统设计,主要根据系统总体功能设计,确定将要设计的系统功能模块,设计相关的数据表格。
第五章系统实现,通过相关的功能模块运行图,展现出系统的主要功能模块操作流程。
第六章系统测试,主要使用功能测试的方式,测试系统的相关功能运行和使用的具体情况。
第七章总结与展望,通过本文的各章节描述总结得出,基本上完成了系统的设计,展望未来将学习和使用更加先进的技术,提高系统的实用性,使得系统更好的服务于使用人员。
1.5本章小结
本章主要介绍了课题的研究背景与意义,研究现状,研究内容等内容,最后介绍了本论文的组织结构设计。信息化管理模式顺应了信息化时代的变化,本人以现在主流的管理模式为前提,根据使用者的相关需求,设计出一款符合大众需求的工资信息管理系统。
2理论基础
2.1 MySQL数据库
MySQL是一种具有安全系数、安全系数、混合开发性、高效化等特征的轻量关联数据库智能管理系统。MySQL由C语言和C++语言构成 由于C语言和C++语言是混合开发的,因此MySQL源码是生命期的。MySQL提供多种多样数据种类,常见的数据种类包含。伴随着数据库技术发展,MySQL逐步形成数据库管理方法的重要工具之一。它不仅能提供简单实用的操作作用,还能实现复杂多变的数据检索方法和查询记录导出方式。因为MySQL具有较好的兼容模式和扩展性,因而广泛应用于各行各业。
MySQL在WEB行业越来越受单位和个人开发者的亲睐。大部分大中小型网址都采用MySQL数据库,它不仅可以提供简单高效的数据浏览作用,还会对数据进行相应的分析解决。因为Linux电脑操作系统和MySQL数据库全是开源系统免费体验,能够为公司节约许多费用,让很多企业使用Linux MySQL做为网址数据库,体型小,启动速度快,也不会影响网址性能,导致用户体验感极差。
MySQL数据库能够支持各种各样操作系统的运作,包含AIX、HP-UX、OS/2 Wrap、Solaris、Mac OS、Linux和Windows等。性能好,使用便捷。因而,MySQL数据库已成为当下数据库行业最流行产品之一。MySQL数据库系统使用面向对象设计方式,客户至上开展编程设计。是利用面向对象观念来达到各项功能。它不仅能管理方法大中型数据表或关系数据库,还可以把这种复杂且庞大信息系统集成到一个简单的中小型数据库系统内。现阶段,中国很多公司早已运用了这一尖端技术。但是由于该操作系统是根据远程服务器/服务器结构的(C/S),因而,存在一些缺陷:最先,系统软件不可以提供完备的数据访问接口,客户只能依靠浏览器浏览所需要的数据;次之,系统软件并没有统一的标准,不同类型的客户端难以实现数据分享;第三,系统软件没有很好的权限管理体制。
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就可以。
2.5本章小结
本章主要介绍了实现工资信息管理系统的相关理论基础以及开发工具。本系统采用VUE,使用Java语言、AJAX技术、MySQL数据库等工具,设计系统功能、页面布局、后台数据等。开发本系统所使用的相关技术操作简单、容易掌握,Java语言具有跨平台性,可以支持在不同的浏览器使用本系统,MySQL数据库是开源的,减少了本系统的开发成本。
3需求分析
3.1功能需求分析
需求分析过程是系统能否成功投入市场,也能否被用户所接受和使用的非常关键的一个步骤。功能需求分析是通过设计系统功能来实现相关的业务事项,详细分析用户的实际需要,确定需要设计的相关业务事项,其是系统实现的关键,本系统存在的主要功能需求包括用户注册管理、用户信息管理、密码信息管理等。
3.2技术需求分析
本系统需要使用Java语言编码设计相关的功能模块,MySQL数据库创建和存储数据表格,AJAX实现前台和后台之间的交互,并且需要在IDEA开发环境中,编写相关的Java代码等系统程序文件,使用MySQL数据库存储数据信息,然后通过使用连接代码完成与MySQL数据库的搭建工作,再通过使用开发环境中的Tomcat插件,完成与Tomcat服务器的发布工作,最后通过与Tomcat服务器的交互行为可以实现代码调试工作。满足以上相关的技术需求,本系统才可以在浏览器上进行访问和使用。
3.3数据需求分析
在设计系统功能模块时,需要收集与系统有关的数据信息,并且对采集的数据信息进行组织和存储,分析系统功能设计,筛选有价值的数据,而后形成数据字典。其中,从庞大的数据信息中筛选出有价值的数据是比较耗时,也是非常重要的一步,主要依据信息的来源、信息的有效性、信息的扩充性、信息的真实性等内容筛选数据。数据需求分析阶段,为系统的开发工作做好进一步准备,便于更好的设计和完成系统。
3.4安全需求分析
安全需求分析是在系统使用过程中对性能的具体要求,对功能需求的一个补充内容,也是对功能需求的一个补充内容,主要包括响应需求、安全性需求、稳定性需求、可扩展性需求等内容。安全需求是在系统功能需求以外的其他必要的需求内容,其不论在系统设计过程,还是在系统投入市场过程,都起到了极其重要的作用。
3.5可行性分析
3.5.1经济可行性
经济可行性是决定是否研发系统的关键性因素。我们主要通过比较实际的收益和成本的方法,来确定一个系统是否具有经济可行性。在使用系统的过程中,当获得的收益大于开发的成本时,说明此系统的研发在经济上是可行的。由于本系统的开发使用的技术基本上是开源的,获得技术上的支持是没有多少问题的,在软件实现方面所花费的成本是很低的,甚至不需要花费成本。研发系统的成本主要是来自调研、硬件和技术人员等方面。如果系统中需要存储的数据量不是很大,仅需要配置一台普通的服务器,即可满足相关需求。如果需要存储的数据量很大,则需要配置一台具有独立功能的服务器,比如管理数据库需要单独的数据库服务器,负责接入网站需要web服务器等等,但是一台服务器的价格是比较贵的。考虑到数据量和成本,我们使用小型集群服务器,这样既可以充分利用相关的资源,又可以让系统正常访问服务器。
3.5.2技术可行性
Java语言具有跨平台性,本系统主要通过Java语言进行编码实现的,所以本系统可以支持在多个操作系统或者多个浏览器上运行和使用[14]。MySQL数据库是可以被免费使用的,并且MySQL数据库的日常运行和维护工作比较简单,这样有利于降低本系统的开发成本[15]。在学校期间,本人已经学习和掌握了Java语言、MySQL数据库、AJAX技术等相关的技术相关知识以及用法,因此在技术可行性方面,本系统是可以实现被设计与实现的。
3.5.3操作可行性
本系统所采用网络结构是VUE,对于开发人员来说,可以直接复用相关的代码,或者稍微对原代码进行修改,使得其满足于本系统的相关需求,如此便可大大节约了开发时间,在最优最短的时间内完成对系统的设计。对于用户来说,在传统的模式下,需要下载客户端才可使用系统。现在,在新型的模式下,使用本系统,就不需要下载,直接选择浏览器打开网址,即可访问和使用本系统。并且,用户可以根据自身的工作需要,选择相关的菜单按钮操作本系统。在系统的一些功能模块中,本人还添加了相关的使用提示信息,方便用户更好更快的了解和使用本系统。因此,本系统的设计和实现是具备操作可行性的。
3.6本章小结
需求分析在软件开发周期中是耗时最长的一个环节,系统的整个设计和实现过程主要依赖于需求分析报告。调查收集出不同用户对本系统的相关使用需求,由此设计相关的功能模块,从而期望实现用户满意度较高的实用型系统。本章主要从功能需求、技术需求、数据需求、安全需求、可行性分析等方面,对系统进行需求分析,确保设计出一款实用价值比较高的管理系统。
4系统设计
4.1系统功能设计
本系统主要通过使用Java语言编码设计系统功能,MySQL数据库管理数据,AJAX技术设计简洁的、友好的网址页面,然后在IDEA开发平台中,编写相关的Java代码文件,接着通过连接语言完成与数据库的搭建工作,再通过平台提供的Tomcat插件完成信息的交互,最后在浏览器中打开系统网址便可使用本系统。本系统的使用角色可以被分为用户和管理员,用户具有注册、查看信息、留言信息等功能,管理员具有修改用户信息,发布津贴等功能,系统总体功能设计图如图4-1所示。
图4-1系统总体功能设计图
4.2数据库设计
4.2.1概念设计
在数据库设计过程中,概念设计阶段是逻辑设计阶段得以实现的基础,也是根据用户参与情况确定对数据的处理要求,从而使得数据库设计成功的关键。概念设计的主要任务是将现实世界的所收集到的使用需求转化为抽象的信息世界结构的过程,能够真实的反映现实生活中实体与实体之间的联系,数据库的相关语法和代码比较容易理解和修改,方便相关人员将相关的数据信息存储到数据库中,并对其进行修改和使用[18]。
通过将现实世界中的实体、属性、联系等内容进行概念设计,建立比较抽象的概念数据模型,即E-R图。通过E-R图可将现实世界抽象到的概念设计转变成数据库的实体设计,并且能够明显的看见各个实体之间,数据的流动情况,具体较强的表达能力,更加方便于开发人员寻找与发现用户具体的需求[19]。因此,E-R的建立,在整个数据库的设计过程中,起着至关重要的作用。本系统主要的实体有管理员、用户、留言等。在E-R图中,矩形表示实体集,椭圆形表示属性,菱形表示联系。其中,联系的类型包括1:1(一对一)、1:n(一对多)、n:m(多对多)关系。
(1)下图是绩效实体和其具备的属性。
绩效实体属性图
(2)下图是用户实体和其具备的属性。
用户实体属性图
(3)下图是员工考勤详情实体和其具备的属性。
员工考勤详情实体属性图
(4)下图是津贴实体和其具备的属性。
津贴实体属性图
(5)下图是公告实体和其具备的属性。
公告实体属性图
(6)下图是套账实体和其具备的属性。
套账实体属性图
(7)下图是字典表实体和其具备的属性。
字典表实体属性图
(8)下图是员工考勤实体和其具备的属性。
员工考勤实体属性图
4.2.2逻辑设计
本系统使用MySQL数据库管理与系统相关的数据信息。逻辑设计阶段是将上一个阶段中的概念数据模型,转换为方便数据库进行存储的关系模型,即基本表的形式,方便开发人员后期对数据模型进行优化和管理[20]。逻辑设计阶段是整个数据库设计设计的关键,与系统有关的信息将会在这一阶段中被存储在数据库中,当用户使用本系统进行相关的功能操作时,与之有关的数据信息所在的基本表会发生相应的更新变化。数据库的逻辑设计阶段主要任务是将与系统相关的数据信息,设计成为方便数据库存储和管理的基本表格的形式,具体内容如下。
表4.1字典表表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
---|---|---|---|---|
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.2公告表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
---|---|---|---|---|
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.3津贴表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
---|---|---|---|---|
1 | Id | Int | id | 否 |
2 | yuangong_id | Integer | 员工 | 是 |
3 | jintie_uuid_number | String | 津贴编号 | 是 |
4 | jintie_name | String | 津贴标题 | 是 |
5 | jintie_file | String | 附件 | 是 |
6 | jintie_types | Integer | 津贴类型 | 是 |
7 | jintie_jine | BigDecimal | 津贴金额 | 是 |
8 | jintie_content | String | 津贴缘由 | 是 |
9 | insert_time | Date | 上传时间 | 是 |
10 | create_time | Date | 创建时间 | 是 |
表4.4绩效表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
---|---|---|---|---|
1 | Id | Int | id | 否 |
2 | yuangong_id | Integer | 员工 | 是 |
3 | jixiao_uuid_number | String | 绩效编号 | 是 |
4 | jixiao_name | String | 绩效标题 | 是 |
5 | jixiao_file | String | 附件 | 是 |
6 | jixiao_types | Integer | 绩效类型 | 是 |
7 | jixiao_dafen | BigDecimal | 绩效打分 | 是 |
8 | pinggu_time | Date | 评估时间 | 是 |
9 | jixiao_content | String | 打分缘由 | 是 |
10 | insert_time | Date | 记录时间 | 是 |
11 | create_time | Date | 创建时间 | 是 |
表4.5套账表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
---|---|---|---|---|
1 | Id | Int | id | 否 |
2 | yuangong_id | Integer | 员工 | 是 |
3 | xinzi_uuid_number | String | 薪资编号 | 是 |
4 | xinzi_month | String | 月份 | 是 |
5 | jiangjin_jine | BigDecimal | 提成 | 是 |
6 | jixiao_jine | BigDecimal | 绩效 | 是 |
7 | butie_jine | BigDecimal | 津贴 | 是 |
8 | shifa_jine | BigDecimal | 实发 | 是 |
9 | xinzi_content | String | 备注 | 是 |
10 | insert_time | Date | 添加时间 | 是 |
11 | create_time | Date | 创建时间 | 是 |
表4.6用户表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
---|---|---|---|---|
1 | Id | Int | id | 否 |
2 | yuangong_uuid_number | String | 用户编号 | 是 |
3 | yuangong_name | String | 用户姓名 | 是 |
4 | yuangong_phone | String | 用户手机号 | 是 |
5 | yuangong_id_number | String | 用户身份证号 | 是 |
6 | yuangong_photo | String | 用户头像 | 是 |
7 | bumen_types | Integer | 部门 | 是 |
8 | zhiwei_types | Integer | 职位 | 是 |
9 | yuangong_email | String | 用户邮箱 | 是 |
10 | jinyong_types | Integer | 账户状态 | 是 |
11 | create_time | Date | 创建时间 | 是 |
表4.7员工考勤表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
---|---|---|---|---|
1 | Id | Int | id | 否 |
2 | yuangong_kaoqin_uuid_number | String | 考勤唯一编号 | 是 |
3 | yuangong_kaoqin_name | String | 考勤标题 | 是 |
4 | yuangong_kaoqin_types | Integer | 员工考勤类型 | 是 |
5 | bumen_types | Integer | 部门 | 是 |
6 | yuangong_kaoqin_content | String | 考勤详情 | 是 |
7 | insert_time | Date | 考勤发起时间 | 是 |
8 | jiezhi_time | Date | 考勤截止时间 | 是 |
9 | create_time | Date | 创建时间 | 是 |
表4.8员工考勤详情表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
---|---|---|---|---|
1 | Id | Int | id | 否 |
2 | yuangong_id | Integer | 员工 | 是 |
3 | yuangong_kaoqin_id | Integer | 考勤 | 是 |
4 | yuangong_kaoqin_list_types | Integer | 打卡状态 | 是 |
5 | insert_time | Date | 添加时间 | 是 |
6 | update_time | Date | 打卡时间 | 是 |
7 | create_time | Date | 创建时间 | 是 |
表4.9管理员表
序号 | 列名 | 数据类型 | 说明 | 允许空 |
---|---|---|---|---|
1 | Id | Int | id | 否 |
2 | username | String | 员工名 | 是 |
3 | password | String | 密码 | 是 |
4 | role | String | 角色 | 是 |
5 | addtime | Date | 新增时间 | 是 |
4.3本章小结
本章主要介绍了系统功能设计、数据库设计等内容。通过设计系统的总体功能框架,确定系统的功能设计主要包括用户等模块。数据库设计主要分为概念设计阶段和逻辑设计阶段,其中,概念设计是将现实世界中的数据转变为信息世界中的概念模型,逻辑设计是将概念设计中的概念模型转变成可以被数据库存储的数据表格。系统功能设计好坏是系统得以被编码实现的重要依据。数据库设计是否符合规范,是系统能够成功运行的基本保障,也是用户和系统实现交互处理的重要前提。
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.1.6 津贴类型管理
如图5.5显示的就是津贴类型管理页面,此页面提供给管理员的功能有:新增津贴类型,修改津贴类型,删除津贴类型。
图5.6 津贴类型管理页面
系
XinziController.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("/xinzi")
public class XinziController {
private static final Logger logger = LoggerFactory.getLogger(XinziController.class);
private static final String TABLE_NAME = "xinzi";
@Autowired
private XinziService xinziService;
@Autowired
private TokenService tokenService;
@Autowired
private DictionaryService dictionaryService;//字典表
@Autowired
private GonggaoService gonggaoService;//公告
@Autowired
private JintieService jintieService;//津贴
@Autowired
private JixiaoService jixiaoService;//绩效
@Autowired
private YuangongService yuangongService;//用户
@Autowired
private YuangongKaoqinService yuangongKaoqinService;//员工考勤
@Autowired
private YuangongKaoqinListService yuangongKaoqinListService;//员工考勤详情
@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("yuangongId",request.getSession().getAttribute("userId"));
CommonUtil.checkMap(params);
PageUtils page = xinziService.queryPage(params);
//字典表数据转换
List<XinziView> list =(List<XinziView>)page.getList();
for(XinziView 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);
XinziEntity xinzi = xinziService.selectById(id);
if(xinzi !=null){
//entity转view
XinziView view = new XinziView();
BeanUtils.copyProperties( xinzi , view );//把实体数据重构到view中
//级联表 用户
//级联表
YuangongEntity yuangong = yuangongService.selectById(xinzi.getYuangongId());
if(yuangong != null){
BeanUtils.copyProperties( yuangong , view ,new String[]{ "id", "createTime", "insertTime", "updateTime", "username", "password", "newMoney", "yuangongId"});//把级联的数据添加到view中,并排除id和创建时间字段,当前表的级联注册表
view.setYuangongId(yuangong.getId());
}
//修改对应字典表字段
dictionaryService.dictionaryConvert(view, request);
return R.ok().put("data", view);
}else {
return R.error(511,"查不到数据");
}
}
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody XinziEntity xinzi, HttpServletRequest request){
logger.debug("save方法:,,Controller:{},,xinzi:{}",this.getClass().getName(),xinzi.toString());
String role = String.valueOf(request.getSession().getAttribute("role"));
if(false)
return R.error(511,"永远不会进入");
else if("用户".equals(role))
xinzi.setYuangongId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));
Wrapper<XinziEntity> queryWrapper = new EntityWrapper<XinziEntity>()
.eq("yuangong_id", xinzi.getYuangongId())
.eq("xinzi_month", xinzi.getXinziMonth())
;
logger.info("sql语句:"+queryWrapper.getSqlSegment());
XinziEntity xinziEntity = xinziService.selectOne(queryWrapper);
if(xinziEntity==null){
YuangongEntity yuangong = yuangongService.selectById(xinzi.getYuangongId());
if(yuangong == null)
return R.error("查不到员工");
DictionaryEntity one = dictionaryService.selectOne(new EntityWrapper<DictionaryEntity>()
.eq("dic_code", "zhiwei_types")
.eq("code_index", yuangong.getZhiweiTypes())
);
xinzi.setInsertTime(new Date());
xinzi.setCreateTime(new Date());
xinzi.setShifaJine(xinzi.getJixiaoJine()+xinzi.getJiangjinJine()+xinzi.getButieJine()+Double.valueOf(one.getBeizhu()));//薪资表特有,不需要可以手动删掉
xinziService.insert(xinzi);
return R.ok();
}else {
return R.error(511,"该员工该月份已有薪资记录,不能重复添加");
}
}
/**
* 后端修改
*/
@RequestMapping("/update")
public R update(@RequestBody XinziEntity xinzi, HttpServletRequest request) throws NoSuchFieldException, ClassNotFoundException, IllegalAccessException, InstantiationException {
logger.debug("update方法:,,Controller:{},,xinzi:{}",this.getClass().getName(),xinzi.toString());
XinziEntity oldXinziEntity = xinziService.selectById(xinzi.getId());//查询原先数据
String role = String.valueOf(request.getSession().getAttribute("role"));
// if(false)
// return R.error(511,"永远不会进入");
// else if("用户".equals(role))
// xinzi.setYuangongId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));
if("".equals(xinzi.getXinziContent()) || "null".equals(xinzi.getXinziContent())){
xinzi.setXinziContent(null);
}
YuangongEntity yuangong = yuangongService.selectById(xinzi.getYuangongId());
if(yuangong == null)
return R.error("查不到员工");
DictionaryEntity one = dictionaryService.selectOne(new EntityWrapper<DictionaryEntity>()
.eq("dic_code", "zhiwei_types")
.eq("code_index", yuangong.getZhiweiTypes())
);
xinzi.setShifaJine(xinzi.getJixiaoJine()+xinzi.getJiangjinJine()+xinzi.getButieJine()+Double.valueOf(one.getBeizhu()));//薪资表特有,不需要可以手动删掉
xinziService.updateById(xinzi);//根据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<XinziEntity> oldXinziList =xinziService.selectBatchIds(Arrays.asList(ids));//要删除的数据
xinziService.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 yuangongId = 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<XinziEntity> xinziList = 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){
//循环
XinziEntity xinziEntity = new XinziEntity();
// xinziEntity.setYuangongId(Integer.valueOf(data.get(0))); //员工 要改的
// xinziEntity.setXinziUuidNumber(data.get(0)); //薪资编号 要改的
// xinziEntity.setXinziMonth(data.get(0)); //月份 要改的
// xinziEntity.setJiangjinJine(data.get(0)); //提成 要改的
// xinziEntity.setJixiaoJine(data.get(0)); //绩效 要改的
// xinziEntity.setButieJine(data.get(0)); //津贴 要改的
// xinziEntity.setShifaJine(data.get(0)); //实发 要改的
// xinziEntity.setXinziContent("");//详情和图片
// xinziEntity.setInsertTime(date);//时间
// xinziEntity.setCreateTime(date);//时间
xinziList.add(xinziEntity);
//把要查询是否重复的字段放入map中
//薪资编号
if(seachFields.containsKey("xinziUuidNumber")){
List<String> xinziUuidNumber = seachFields.get("xinziUuidNumber");
xinziUuidNumber.add(data.get(0));//要改的
}else{
List<String> xinziUuidNumber = new ArrayList<>();
xinziUuidNumber.add(data.get(0));//要改的
seachFields.put("xinziUuidNumber",xinziUuidNumber);
}
}
//查询是否重复
//薪资编号
List<XinziEntity> xinziEntities_xinziUuidNumber = xinziService.selectList(new EntityWrapper<XinziEntity>().in("xinzi_uuid_number", seachFields.get("xinziUuidNumber")));
if(xinziEntities_xinziUuidNumber.size() >0 ){
ArrayList<String> repeatFields = new ArrayList<>();
for(XinziEntity s:xinziEntities_xinziUuidNumber){
repeatFields.add(s.getXinziUuidNumber());
}
return R.error(511,"数据库的该表中的 [薪资编号] 字段已经存在 存在数据为:"+repeatFields.toString());
}
xinziService.insertBatch(xinziList);
return R.ok();
}
}
}
}catch (Exception e){
e.printStackTrace();
return R.error(511,"批量插入数据异常,请联系管理员");
}
}
}
JintieServiceImpl.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.JintieDao;
import com.entity.JintieEntity;
import com.service.JintieService;
import com.entity.view.JintieView;
/**
* 津贴 服务实现类
*/
@Service("jintieService")
@Transactional
public class JintieServiceImpl extends ServiceImpl<JintieDao, JintieEntity> implements JintieService {
@Override
public PageUtils queryPage(Map<String,Object> params) {
Page<JintieView> page =new Query<JintieView>(params).getPage();
page.setRecords(baseMapper.selectListView(page,params));
return new PageUtils(page);
}
}
GonggaoController.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("/gonggao")
public class GonggaoController {
private static final Logger logger = LoggerFactory.getLogger(GonggaoController.class);
private static final String TABLE_NAME = "gonggao";
@Autowired
private GonggaoService gonggaoService;
@Autowired
private TokenService tokenService;
@Autowired
private DictionaryService dictionaryService;//字典表
@Autowired
private JintieService jintieService;//津贴
@Autowired
private JixiaoService jixiaoService;//绩效
@Autowired
private XinziService xinziService;//套账
@Autowired
private YuangongService yuangongService;//用户
@Autowired
private YuangongKaoqinService yuangongKaoqinService;//员工考勤
@Autowired
private YuangongKaoqinListService yuangongKaoqinListService;//员工考勤详情
@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("yuangongId",request.getSession().getAttribute("userId"));
CommonUtil.checkMap(params);
PageUtils page = gonggaoService.queryPage(params);
//字典表数据转换
List<GonggaoView> list =(List<GonggaoView>)page.getList();
for(GonggaoView 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);
GonggaoEntity gonggao = gonggaoService.selectById(id);
if(gonggao !=null){
//entity转view
GonggaoView view = new GonggaoView();
BeanUtils.copyProperties( gonggao , view );//把实体数据重构到view中
//修改对应字典表字段
dictionaryService.dictionaryConvert(view, request);
return R.ok().put("data", view);
}else {
return R.error(511,"查不到数据");
}
}
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody GonggaoEntity gonggao, HttpServletRequest request){
logger.debug("save方法:,,Controller:{},,gonggao:{}",this.getClass().getName(),gonggao.toString());
String role = String.valueOf(request.getSession().getAttribute("role"));
if(false)
return R.error(511,"永远不会进入");
Wrapper<GonggaoEntity> queryWrapper = new EntityWrapper<GonggaoEntity>()
.eq("gonggao_name", gonggao.getGonggaoName())
.eq("gonggao_types", gonggao.getGonggaoTypes())
;
logger.info("sql语句:"+queryWrapper.getSqlSegment());
GonggaoEntity gonggaoEntity = gonggaoService.selectOne(queryWrapper);
if(gonggaoEntity==null){
gonggao.setInsertTime(new Date());
gonggao.setCreateTime(new Date());
gonggaoService.insert(gonggao);
return R.ok();
}else {
return R.error(511,"表中有相同数据");
}
}
/**
* 后端修改
*/
@RequestMapping("/update")
public R update(@RequestBody GonggaoEntity gonggao, HttpServletRequest request) throws NoSuchFieldException, ClassNotFoundException, IllegalAccessException, InstantiationException {
logger.debug("update方法:,,Controller:{},,gonggao:{}",this.getClass().getName(),gonggao.toString());
GonggaoEntity oldGonggaoEntity = gonggaoService.selectById(gonggao.getId());//查询原先数据
String role = String.valueOf(request.getSession().getAttribute("role"));
// if(false)
// return R.error(511,"永远不会进入");
if("".equals(gonggao.getGonggaoPhoto()) || "null".equals(gonggao.getGonggaoPhoto())){
gonggao.setGonggaoPhoto(null);
}
if("".equals(gonggao.getGonggaoContent()) || "null".equals(gonggao.getGonggaoContent())){
gonggao.setGonggaoContent(null);
}
gonggaoService.updateById(gonggao);//根据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<GonggaoEntity> oldGonggaoList =gonggaoService.selectBatchIds(Arrays.asList(ids));//要删除的数据
gonggaoService.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 yuangongId = 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<GonggaoEntity> gonggaoList = 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){
//循环
GonggaoEntity gonggaoEntity = new GonggaoEntity();
// gonggaoEntity.setGonggaoName(data.get(0)); //公告名称 要改的
// gonggaoEntity.setGonggaoPhoto("");//详情和图片
// gonggaoEntity.setGonggaoTypes(Integer.valueOf(data.get(0))); //公告类型 要改的
// gonggaoEntity.setInsertTime(date);//时间
// gonggaoEntity.setGonggaoContent("");//详情和图片
// gonggaoEntity.setCreateTime(date);//时间
gonggaoList.add(gonggaoEntity);
//把要查询是否重复的字段放入map中
}
//查询是否重复
gonggaoService.insertBatch(gonggaoList);
return R.ok();
}
}
}
}catch (Exception e){
e.printStackTrace();
return R.error(511,"批量插入数据异常,请联系管理员");
}
}
}
声明
本博客适用于广泛的学术和教育用途,包括但不限于个人学习、开发设计,产品设计。仅供学习参考,旨在为读者提供深入理解和学术研究的材料。