小型企业办公自动化系统的设计和开发+vue

@TOC

ssm013小型企业办公自动化系统的设计和开发+vue

第1章 绪论

1.1 课题背景

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

1.2 课题意义

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

总之,在实际中使用小型企业办公自动化系统,其意义如下:

第一点:小型企业办公自动化系统的实际运用,可以帮助管理人员在短时间内完成信息处理工作;

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

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

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

1.3 研究内容

对小型企业办公自动化系统设计制作,不仅需要技术支撑,也需要大量的理论研究。本文在对小型企业办公自动化系统进行介绍时,将按照如下内容进行。

第一部分:介绍小型企业办公自动化系统研究的背景意义,便于用户了解系统;

第二部分:介绍开发小型企业办公自动化系统需要搭建的环境,包括技术和工具;

第三部分:介绍用户对小型企业办公自动化系统的功能要求,以及对小型企业办公自动化系统的性能要求等;

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

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

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

第2章 开发环境与技术

小型企业办公自动化系统的编码实现需要搭建一定的环境和使用相应的技术,接下来的内容就是对小型企业办公自动化系统用到的技术和工具进行介绍。

2.1 MYSQL数据库

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

2.2 JSP技术

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

2.3 SSM框架

SSM框架不是一个框架的名称,而是三个框架的首字母缩写,分别是Spring框架、SpringMVC框架、MyBatis框架。是目前Java开发者中学习的首选框架。

Spring框架继承了JavaEE和EJB框架的优点,在依赖注入方面去掉了臃肿的配置,在面向切面方面也简化了代码数量,提高了代码品质。依赖注解进行配置,让所有的依赖都可以通过程序的自动配置和寻找,减少了代码写作数量,提高了代码阅读性。

SpringMVC框架与Spring只是一个公司的,在底层代码结构上可以复用,但是最主要的功能是对数据提交请求进行过滤,并且对数据的返回进行过滤,不限于页面是JSP技术,也可以是其他的技术,更容易大型开发的集合技术。

MyBatis框架摒弃了Hibernate框架的配置臃肿方面,有时候Hibernate框架业务比较复杂的时候,代码量反而增加,性能下降,无法对底层的数据库语句优化,而MyBatis框架则有效的解决了这个方面,可以通过Java语句,对数据库操作语句进行优化,代码更简洁,执行效率更高,并且可以生产一些模块化代码,解决了开发过程中容易出现的实体映射方面的操作。

2.4 Vue框架

Vue是最近几年最火的前端应用,在H5以及APP和小程序上面,有着很大的市场份额。作为一个不断的向前发展的生态系统,Vue不仅仅只是作为了网页的开发,Vue的概念主要是让以前静态写的DOM,变成了动态生成,超快运行虚拟DOM,DOM就是HTML里面W3C设置的标准,是文档对象模型。使用Vue,让文档对象生成变得更加智能化,在使用过程中对该机构进行访问,就能改变文档的结构、样式以及内容。让用户能体现到极简界面,急速打开,从上往下的打开层次感,使用的更加舒适。

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

3.4 功能需求

不同的系统提供的服务也不相同,其对应的功能也不相同,所以,系统开工前,需要明确其用途,确定其功能。由此,才可以进行各个任务的开展。

小型企业办公自动化系统经过分析,确定了其需要设置管理员的角色,其操作的功能通过用例图展示(见下图)。管理员管理部门经理,管理总经理,管理员工和员工留言以及员工工资,管理内部邮件,管理审批流程,管理离职申请。

图3.5 管理员用例图

小型企业办公自动化系统经过分析,确定了其需要设置部门经理的角色,其操作的功能通过用例图展示(见下图)。部门经理给员工发放工资,审核并回复员工留言,管理员工工资,审核员工的离职申请信息,查询和下载内部邮件以及审批流程。

图3.6 部门经理用例图

小型企业办公自动化系统经过分析,确定了其需要设置总经理的角色,其操作的功能通过用例图展示(见下图)。总经理查询下载内部邮件和审批流程,审核员工离职申请,查询员工工资,查询员工和部门经理。

图3.7 总经理用例图

小型企业办公自动化系统经过分析,确定了其需要设置员工的角色,其操作的功能通过用例图展示(见下图)。员工发布留言,发布内部邮件,发布离职申请,查询通知公告和审批流程,查看员工本人工资。

图3.8 员工用例图

第4章 系统设计

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

4.1 设计原则

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

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

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

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

4.2 功能结构设计

在前面分析的管理员功能的基础上,进行接下来的设计工作,最终展示设计的管理员结构图(见下图)。管理员管理部门经理,管理总经理,管理员工和员工留言以及员工工资,管理内部邮件,管理审批流程,管理离职申请。

图4.1 管理员功能结构图

在前面分析的部门经理功能的基础上,进行接下来的设计工作,最终展示设计的部门经理结构图(见下图)。部门经理给员工发放工资,审核并回复员工留言,管理员工工资,审核员工的离职申请信息,查询和下载内部邮件以及审批流程。

图4.2 部门经理功能结构图

在前面分析的总经理功能的基础上,进行接下来的设计工作,最终展示设计的总经理结构图(见下图)。总经理查询下载内部邮件和审批流程,审核员工离职申请,查询员工工资,查询员工和部门经理。

图4.3 总经理功能结构图

在前面分析的员工功能的基础上,进行接下来的设计工作,最终展示设计的员工结构图(见下图)。员工发布留言,发布内部邮件,发布离职申请,查询通知公告和审批流程,查看员工本人工资。

图4.4 员工功能结构图

4.3 数据库设计

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

4.3.1 数据库概念设计

这部分内容需要借助数据库关系图来完成,也需要使用专门绘制数据库关系图的工具,比如Visio工具就可以设计E-R图(数据库关系图)。设计数据库,也需要按照设计的流程进行,首先还是要根据需求完成实体的确定,分析实体具有的特征,还有对实体间的关联关系进行确定。最后才是使用E-R模型的表示方法,绘制本系统的E-R图。不管是使用亿图软件,还是Visio工具,对于E-R模型的表示符号都一样,通常矩形代表实体,实体间存在的关系用菱形符号表示,实体的属性也就是实体的特征用符号椭圆表示。最后使用直线将矩形,菱形和椭圆等符号连接起来。接下来就开始对本系统的E-R图进行绘制。

(1)下图是员工留言实体和其具备的属性。

图4.4 员工留言实体属性图

(2)下图是员工工资实体和其具备的属性。

图4.5 员工工资实体属性图

(3)下图是审批流程实体和其具备的属性。

图4.6 审批流程实体属性图

  1. 下图是内部邮件实体和其具备的属性。

图4.7 内部邮件实体属性图

  1. 下图是管理员实体和其具备的属性。

图4.8 管理员实体属性图

  1. 下图为上述各实体间相互之间的关系。

图4.9 实体间关系E-R图

4.3.2 数据库物理设计

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

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

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

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

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

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

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

表4.1 部门经理信息表

字段类型默认注释
idbigint(20)主键
addtimetimestampCURRENT_TIMESTAMP创建时间
bumenbianhaovarchar(200)NULL部门编号
mimavarchar(200)NULL密码
bumenvarchar(200)NULL部门
jinglixingmingvarchar(200)NULL经理姓名
lianxidianhuavarchar(200)NULL联系电话
youxiangvarchar(200)NULL邮箱
shenfenzhengvarchar(200)NULL身份证
ruzhiriqidateNULL入职日期

表4.2 离职申请信息表

字段类型默认注释
idbigint(20)主键
addtimetimestampCURRENT_TIMESTAMP创建时间
gonghaovarchar(200)NULL工号
yuangongxingmingvarchar(200)NULL员工姓名
bumenbianhaovarchar(200)NULL部门编号
bumenvarchar(200)NULL部门
lizhiyuanyinlongtextNULL离职原因
shenqingriqidateNULL申请日期
sfshvarchar(200)是否审核
shhflongtextNULL审核回复

表4.3 内部邮件信息表

字段类型默认注释
idbigint(20)主键
addtimetimestampCURRENT_TIMESTAMP创建时间
gonghaovarchar(200)NULL工号
yuangongxingmingvarchar(200)NULL员工姓名
bumenbianhaovarchar(200)NULL部门编号
bumenvarchar(200)NULL部门
zhutivarchar(200)NULL主题
neironglongtextNULL内容
fujianvarchar(200)NULL附件
riqidateNULL日期

表4.4 审批流程信息表

字段类型默认注释
idbigint(20)主键
addtimetimestampCURRENT_TIMESTAMP创建时间
bumenvarchar(200)NULL部门
shenpixiangmuvarchar(200)NULL审批项目
shenpiliuchenglongtextNULL审批流程
xiangguanfujianvarchar(200)NULL相关附件
gengxinriqidateNULL更新日期

表4.5 通知公告信息表

字段类型默认注释
idbigint(20)主键
addtimetimestampCURRENT_TIMESTAMP创建时间
biaotivarchar(200)NULL标题
neironglongtextNULL内容
xiangguanfujianvarchar(200)NULL相关附件
faburiqidateNULL发布日期

表4.6 管理员信息表

字段类型默认注释
idbigint(20)主键
usernamevarchar(100)用户名
passwordvarchar(100)密码
rolevarchar(100)管理员角色
addtimetimestampCURRENT_TIMESTAMP新增时间

表4.7 员工信息表

字段类型默认注释
idbigint(20)主键
addtimetimestampCURRENT_TIMESTAMP创建时间
gonghaovarchar(200)NULL工号
mimavarchar(200)NULL密码
yuangongxingmingvarchar(200)NULL员工姓名
xingbievarchar(200)NULL性别
shoujivarchar(200)NULL手机
youxiangvarchar(200)NULL邮箱
bumenbianhaovarchar(200)NULL部门编号
bumenvarchar(200)NULL部门
ruzhiriqidateNULL入职日期
xuelivarchar(200)NULL学历
anquandengjivarchar(200)NULL安全等级

表4.8 员工工资信息表

字段类型默认注释
idbigint(20)主键
addtimetimestampCURRENT_TIMESTAMP创建时间
gonghaovarchar(200)NULL工号
yuangongxingmingvarchar(200)NULL员工姓名
faxinyuefenvarchar(200)NULL发薪月份
jibengongzivarchar(200)NULL基本工资
tichengvarchar(200)NULL提成
butievarchar(200)NULL补贴
koukuanvarchar(200)NULL扣款
shifagongzivarchar(200)NULL实发工资
koukuanbeizhulongtextNULL扣款备注

表4.9 员工留言信息表

字段类型默认注释
idbigint(20)主键
addtimetimestampCURRENT_TIMESTAMP创建时间
gonghaovarchar(200)NULL工号
yuangongxingmingvarchar(200)NULL员工姓名
bumenbianhaovarchar(200)NULL部门编号
bumenvarchar(200)NULL部门
liuyanneironglongtextNULL留言内容
xiangguanfujianvarchar(200)NULL相关附件
liuyanriqidateNULL留言日期
sfshvarchar(200)是否审核
shhflongtextNULL审核回复

表4.10 总经理信息表

字段类型默认注释
idbigint(20)主键
addtimetimestampCURRENT_TIMESTAMP创建时间
zhanghaovarchar(200)NULL账号
mimavarchar(200)NULL密码
xingmingvarchar(200)NULL姓名
xingbievarchar(200)NULL性别
shoujivarchar(200)NULL手机
youxiangvarchar(200)NULL邮箱

第5章 系统实现

进入到这个环节,也就可以及时检查出前面设计的需求是否可靠了。一个设计良好的方案在运用于系统实现中,是会帮助系统编制人员节省时间,并提升开发效率的。所以在系统的编程阶段,也就是系统实现阶段,对于一些不合理的设计需求,也是可以及时发现。因为设计的方案是完全指导系统的编码过程的。

5.1 管理员功能实现

5.1.1 部门经理管理

管理员进入指定功能操作区之后可以管理部门经理信息。其页面见下图。管理员可以增删改查部门经理信息。

图5.1 部门经理管理页面

5.1.2 总经理管理

管理员进入指定功能操作区之后可以管理总经理。其页面见下图。管理员增删改查总经理信息。

图5.2 总经理管理页面

5.1.3 审批流程管理

管理员进入指定功能操作区之后可以管理审批流程。其页面见下图。管理员对各部门的项目审批流程进行规范,包括审批流程的增删改查管理。

图5.3 审批流程管理页面

5.1.4 通知公告管理

管理员进入指定功能操作区之后可以管理通知公告。其页面见下图。管理员实现通知公告的新增,删除,查询,修改以及附件下载功能。

图5.4 通知公告管理页面

5.2 部门经理功能实现

5.2.1 员工管理

部门经理进入指定功能操作区之后可以管理员工。其页面见下图。部门经理修改,查询,删除员工信息,对各个员工发放工资。

图5.5 员工管理页面

5.2.2 员工留言管理

部门经理进入指定功能操作区之后可以管理员工留言。其页面见下图。部门经理查询员工留言,删除员工留言,审核并回复员工留言。

图5.6 员工留言管理页面

5.2.3 员工工资管理

部门经理进入指定功能操作区之后可以管理员工工资。其页面见下图。部门经理查看各个员工的工资详情,删除,修改,查询员工的工资信息。

图5.7 员工工资管理页面

5.3 总经理功能实现

5.3.1 审批流程管理

总经理进入指定功能操作区之后可以查询项目审批流程。其页面见下图。总经理也能下载审批流程的附件文件。

图5.8 审批流程管理页面

5.3.2 离职申请管理

总经理进入指定功能操作区之后可以管理离职申请。其页面见下图。总经理查看离职申请的详情,审核并回复员工的离职申请信息。

图5.9 离职申请管理页面

5.3.3 内部邮件管理

总经理进入指定功能操作区之后可以管理内部邮件。其页面见下图。总经理查询内部邮件,下载内部邮件附件文件。

图5.10 内部邮件管理页面

5.4 员工功能实现

5.4.1 新增留言

员工进入指定功能操作区之后可以发布留言。其页面见下图。员工发布的留言在未审核前,员工可以删除或修改。

图5.11 新增留言页面

5.4.2 员工工资管理

员工进入指定功能操作区之后可以查看工资。其页面见下图。员工通过详情按钮可以查看工资明细,员工也能在本页面查询工资。

图5.12 员工工资管理页面

5.4.3 新增内部邮件

员工进入指定功能操作区之后可以新增内部邮件。其页面见下图。员工新增内部邮件,也能在内部邮件管理模块修改,删除本人发布的内部邮件。

图5.13 新增内部邮件页面

BaiduUtil.java
package com.utils;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.json.JSONObject;


/**
* @author yangliyuan
* @version 创建时间:2020年2月7日 下午9:37:05
* 类说明 : 
*/

public class BaiduUtil {
	
    /**
     * 根据经纬度获得省市区信息
     * @param lon 纬度
     * @param lat 经度
     * @param coordtype 经纬度坐标系
     * @return
     */
    public static Map<String, String> getCityByLonLat(String key, String lng, String lat) {
        String location = lat + "," + lng;
        try {
            //拼装url
            String url = "http://api.map.baidu.com/reverse_geocoding/v3/?ak="+key+"&output=json&coordtype=wgs84ll&location="+location;
            String result = HttpClientUtils.doGet(url);
            JSONObject o = new JSONObject(result);
            Map<String, String> area = new HashMap<>();
			area.put("province", o.getJSONObject("result").getJSONObject("addressComponent").getString("province"));
			area.put("city", o.getJSONObject("result").getJSONObject("addressComponent").getString("city"));
			area.put("district", o.getJSONObject("result").getJSONObject("addressComponent").getString("district"));
			area.put("street", o.getJSONObject("result").getJSONObject("addressComponent").getString("street"));
            return area;
        }catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
	     * 获取API访问token
	     * 该token有一定的有效期,需要自行管理,当失效时需重新获取.
	     * @param ak - 百度云官网获取的 API Key
	     * @param sk - 百度云官网获取的 Securet Key
	     * @return assess_token
	     */
    public static String getAuth(String ak, String sk) {
        // 获取token地址
        String authHost = "https://aip.baidubce.com/oauth/2.0/token?";
        String getAccessTokenUrl = authHost
                // 1. grant_type为固定参数
                + "grant_type=client_credentials"
                // 2. 官网获取的 API Key
                + "&client_id=" + ak
                // 3. 官网获取的 Secret Key
                + "&client_secret=" + sk;
        try {
            URL realUrl = new URL(getAccessTokenUrl);
            // 打开和URL之间的连接
            HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
            connection.setRequestMethod("GET");
            connection.connect();
            // 获取所有响应头字段
            Map<String, List<String>> map = connection.getHeaderFields();
            // 遍历所有的响应头字段
            for (String key : map.keySet()) {
                System.err.println(key + "--->" + map.get(key));
            }
            // 定义 BufferedReader输入流来读取URL的响应
            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String result = "";
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
            /**
             * 返回结果示例
             */
            System.err.println("result:" + result);
            org.json.JSONObject jsonObject = new org.json.JSONObject(result);
            String access_token = jsonObject.getString("access_token");
            return access_token;
        } catch (Exception e) {
            System.err.printf("获取token失败!");
            e.printStackTrace(System.err);
        }
        return null;
    }

}

LizhishenqingController.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.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.LizhishenqingEntity;
import com.entity.view.LizhishenqingView;

import com.service.LizhishenqingService;
import com.service.TokenService;
import com.utils.PageUtils;
import com.utils.R;
import com.utils.MPUtil;
import com.utils.CommonUtil;


/**
 * 离职申请
 * 后端接口
 * @author 
 * @email 
 * @date 2021-01-18 15:20:25
 */
@RestController
@RequestMapping("/lizhishenqing")
public class LizhishenqingController {
    @Autowired
    private LizhishenqingService lizhishenqingService;
    


    /**
     * 后端列表
     */
    @RequestMapping("/page")
    public R page(@RequestParam Map<String, Object> params,LizhishenqingEntity lizhishenqing, HttpServletRequest request){

		String tableName = request.getSession().getAttribute("tableName").toString();
		if(tableName.equals("yuangong")) {
			lizhishenqing.setGonghao((String)request.getSession().getAttribute("username"));
		}
		if(tableName.equals("bumenjingli")) {
			lizhishenqing.setBumenbianhao((String)request.getSession().getAttribute("username"));
		}
        EntityWrapper<LizhishenqingEntity> ew = new EntityWrapper<LizhishenqingEntity>();
		PageUtils page = lizhishenqingService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, lizhishenqing), params), params));
        return R.ok().put("data", page);
    }
    
    /**
     * 前端列表
     */
    @RequestMapping("/list")
    public R list(@RequestParam Map<String, Object> params,LizhishenqingEntity lizhishenqing, HttpServletRequest request){
        EntityWrapper<LizhishenqingEntity> ew = new EntityWrapper<LizhishenqingEntity>();
		PageUtils page = lizhishenqingService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, lizhishenqing), params), params));
        return R.ok().put("data", page);
    }

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

	 /**
     * 查询
     */
    @RequestMapping("/query")
    public R query(LizhishenqingEntity lizhishenqing){
        EntityWrapper< LizhishenqingEntity> ew = new EntityWrapper< LizhishenqingEntity>();
 		ew.allEq(MPUtil.allEQMapPre( lizhishenqing, "lizhishenqing")); 
		LizhishenqingView lizhishenqingView =  lizhishenqingService.selectView(ew);
		return R.ok("查询离职申请成功").put("data", lizhishenqingView);
    }
	
    /**
     * 后端详情
     */
    @RequestMapping("/info/{id}")
    public R info(@PathVariable("id") Long id){
        LizhishenqingEntity lizhishenqing = lizhishenqingService.selectById(id);
        return R.ok().put("data", lizhishenqing);
    }

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



    /**
     * 后端保存
     */
    @RequestMapping("/save")
    public R save(@RequestBody LizhishenqingEntity lizhishenqing, HttpServletRequest request){
    	lizhishenqing.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
    	//ValidatorUtils.validateEntity(lizhishenqing);

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

        lizhishenqingService.insert(lizhishenqing);
        return R.ok();
    }

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

    /**
     * 删除
     */
    @RequestMapping("/delete")
    public R delete(@RequestBody Long[] ids){
        lizhishenqingService.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<LizhishenqingEntity> wrapper = new EntityWrapper<LizhishenqingEntity>();
		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("gonghao", (String)request.getSession().getAttribute("username"));
		}
		if(tableName.equals("bumenjingli")) {
			wrapper.eq("bumenbianhao", (String)request.getSession().getAttribute("username"));
		}

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


}

YuangongliuyanServiceImpl.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.YuangongliuyanDao;
import com.entity.YuangongliuyanEntity;
import com.service.YuangongliuyanService;
import com.entity.vo.YuangongliuyanVO;
import com.entity.view.YuangongliuyanView;

@Service("yuangongliuyanService")
public class YuangongliuyanServiceImpl extends ServiceImpl<YuangongliuyanDao, YuangongliuyanEntity> implements YuangongliuyanService {
	

    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        Page<YuangongliuyanEntity> page = this.selectPage(
                new Query<YuangongliuyanEntity>(params).getPage(),
                new EntityWrapper<YuangongliuyanEntity>()
        );
        return new PageUtils(page);
    }
    
    @Override
	public PageUtils queryPage(Map<String, Object> params, Wrapper<YuangongliuyanEntity> wrapper) {
		  Page<YuangongliuyanView> page =new Query<YuangongliuyanView>(params).getPage();
	        page.setRecords(baseMapper.selectListView(page,wrapper));
	    	PageUtils pageUtil = new PageUtils(page);
	    	return pageUtil;
 	}
    
    @Override
	public List<YuangongliuyanVO> selectListVO(Wrapper<YuangongliuyanEntity> wrapper) {
 		return baseMapper.selectListVO(wrapper);
	}
	
	@Override
	public YuangongliuyanVO selectVO(Wrapper<YuangongliuyanEntity> wrapper) {
 		return baseMapper.selectVO(wrapper);
	}
	
	@Override
	public List<YuangongliuyanView> selectListView(Wrapper<YuangongliuyanEntity> wrapper) {
		return baseMapper.selectListView(wrapper);
	}

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

}

storage.js
const storage = {
    set(key, value) {
        localStorage.setItem(key, JSON.stringify(value));
    },
    get(key) {
        return localStorage.getItem(key)?localStorage.getItem(key).replace('"','').replace('"',''):"";
    },
    getObj(key) {
        return localStorage.getItem(key)?JSON.parse(localStorage.getItem(key)):null;
    },
    remove(key) {
        localStorage.removeItem(key);
    }
}
export default storage;

声明

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值