基于JavaEE的办公OA系统的设计与实现

Livealone

发布日期: 2019-05-13 11:10:55 浏览量: 495
评分:
star star star star star star star star star star
*转载请注明来自write-bug.com

摘 要

当今互联网技术发展的非常迅速,而以往的定点办公模式已经不能满足现代人们的需要,迫切地需要我们设计一款办公自动化的OA系统才可以解决目前日益突出的问题。本系统采用了Java开发工具IntelliJ IDEA,数据库MySQL和轻量级框架SpringMVC,Hibernate,Spring开发出基于JavaEE的文珺OA系统。本课题主要实现了用户,部门,岗位等模块的增删改查,请假流程的审批,公共相册管理,个人信息管理,公告管理等功能。其中岗位管理中实现了对不同用户角色的权限管理,根据不同用户的角色授权登录系统而划分不同的功能模块。核心工作流采用自主设计的方式实现,无风险控制流程管理,解决了定点办公方式的局限性,最终实现信息以无线的方式进行流转,对提高人们的办公效率和改善企业的办公生产能力,减少企业运营成本有着重大的意义。

关键词:OA;办公系统;J2EE

Abstract

Today, the development of Internet technology is fast, and the past fixed-point office model has been unable to meet the needs of modern people, the urgent need for us to design an office automation OA system can solve the increasingly prominent problems. The system uses the Java development tools IntelliJ IDEA, database MySQL and lightweight framework SpringMVC, Hibernate, Spring developed Java EE-based OA system. This topic mainly to the user, department, post and other modules to delete or delete, leave the approval process, public photo album management, personal information management, bulletin management and other functions. Which in the post management to achieve the different user roles of the rights management, according to the role of different users authorized to log in the system and the division of different functional modules. The core workflow is implemented in the way of independent design, and the risk management process is managed to solve the limitation of the fixed-point office. Finally, the information is transmitted in a wireless way, which improves the office efficiency and improves the office productivity of the enterprise. Business operating costs are of great significance.

Key words: OA; office system; J2EE

1 绪论

1.1 选题背景

基于JavaEE的文珺OA系统面向文珺公司的日常运作和管理,使用频率高,对员工和管理者友好。因为OA系统是部署在网络上的,能够解决异地办公、及时审批、方便以后查询统计、节省沟通成本、快速解决各种审批。通过实现办公自动化(数字化办公),能够优化当前的管理组织结构,提高效率,调整管理体制,并在这些基础上起到了提高决策效能的目的。

1.2 国内外研究现状

OA系统随着历史发展,以变种的方式来实现OA,把传统的办公和网络功能相结合提升办公效率 [1]。通过实现办公自动化和数字化,提高了办公的协调和一致性,人员的配合也得到了很大的增强,通过一系列的措施,充分利用好OA的优势,能够真正达到提高我们决策的目的。

OA系统的概念最早是被美国提出的, 它首先在日本和美国兴起,国外在这方面的研究也一直处于领先地位,而现在OA已涉及多种技术,成为了一种新型的综合学科。

80年代至今,我国在OA系统的发展方向经历了流程型、智能型、文件型、知识型四个阶段。同时经济水平得到了很大进步,科技也在不断发展壮大,我国OA系统的发展水平也达到了国际标准 [2]。

随着技术的不断变革,OA比以前更加成熟了。过去只能固定在办公室工作办公,发展到现在的线上办公,需求量也是不断增长,通过网络来办公,使得OA变得非常方便和实用[3]。OA的使用也越来越简单。当工作流技术的问世的时候,借助于网络通讯的革命性发展,工作流把传统的手工方式转变为工作流自动化方式。目前企业比较倾向的开发架构都是JavaEE技术,JavaEE因其开放性得到企业的热衷,随着企业内部关系变得越来越复杂,企业关系也越来越多,OA系统的要求也随之增高,而“协同办公”和“数字办公”也将成为OA系统未来的发展趋势 [4]。

1.3 研究意义

文珺OA利用网络的便捷性,改变了以往需要人工或者手工办公的方式,实现了无纸化办公,摆脱了繁琐日常事务的处理流程,提高了文珺公司内部的办事效率[5]。

基于JavaEE的文珺OA系统利用目前流行的轻量级框架开发后台,并按照良好的Java规范命名和优化代码,前台页面Bootsrap,Bootsrap是Twitter推出的非常绚丽的前端框架。有着良好的用户体验。文珺OA不仅提高管理和处理流程事务的效率外,公司内部还可以分享个人的精彩瞬间,更及时的获取公司内部最新动态,这对公司内部团队的凝聚力和合作意识都有着非常重要的意义。

1.4 研究内容

基于JavaEE的文珺OA系统是一个为了方便管理公司事务而面向员工的系统。通过对以上选题背景的研究,完成了本系统的设计与开发。

本课题的的主要工作有以下几点:

  • 调研基于JavaEE框架下开发OA系统所用到的专业技术,对系统开发的可行性进行严格评估

  • 整体系统分析,规划系统的功能结构,以及各模块的划分,合理安排系统各项菜单

  • 系统数据库的设计,E-R图,数据表的结构,数据对象的关联关系等

  • 系统的UI页面,前端框架,如何优化用户体验,模板的选择等

  • 根据工作流的思想,设计符合本系统的工作流模式

  • 系统基础框架的搭建,各个模块的开发与实现

  • 对系统进行测试,优化,运行程序查看实现效果

  • 撰写论文

1.5 组织结构

通过明确的分析,对本文的组织结构做了以下概括:

第一部分是绪论:在这一部分,主要分析了文珺OA系统的研究背景以及意义,对文珺OA系统目前应用现状进行分析,以及最新发展概况,并且介绍了本文的研究内容以及结构安排。

第二部分是相关技术分析:这一部分主要介绍了设计和开发文珺OA系统所涉及的相关技术。重点介绍了J2EE相关技术、MySQL数据库技术、Gradle技术、Bootstrap技术,以及MVC分层结构的优缺点,后面关于系统的实现都会运用到这些技术。

第三部分是需求分析:通过相关人员的共同参与,在进行充分的探讨和调研后,确定系统的需求,并且加以整理,通过UML用例图,ER结构图以及数据库表格的方式,突出明显也更加直观的描述系统需求。

第四部分是系统设计:首先根据需求分析,系统的整体设计,分为几个重要板块,其次是系统的各种功能模块的设计,最后是数据库的设计包括了视图设计、数据表的设计,详细介绍了开发过程中系统支持的各项技术。

第五部分是系统实现:针对上面提出的每个部分进行具体的代码实现,得到最终的结果。

第六部分是系统测试:本章主要是对已经完成的文珺OA系统进行功能上的测试,看是否满足需求分析以及是否存在一些未知的Bug。

2 相关技术

2.1 JavaEE相关技术

选择用Java EE技术构建OA系统, 这是对于一个企业而言, 体现了一种深远的规划:很多时候,尤其是后期维护中,经常会有不同的平台、不同系统的异构系统需要重新整合,且OA系统功能庞大,本身就是不断进行整合的过程。Java EE应用提供的跨平台性、开放性及各种远程访问技术,为异构系统的良好整合提供了保证[6]。

本项目采用SpringMVC + Hibernate + Spring框架的整合开发。此套组合是JavaEE世界里面流行的轻量级框架,整合简单,易于使用。 基于轻量级Java EE平台的应用程序可以在通用的Web容器中运行,而不需要支持EJB容器,具有稳定的性能和高可扩展性和可维护性。

2.1.1 SpringMVC框架

Spring MVC是一个MVC设计模式实现的框架,是当前最优秀的MVC框架,SpringMVC支持注解配置,使用方式较以往有着很大的变化,由于支持注解配置,易用性有了大幅度的提高。越来越多的团队使用SpringMVC替代其他的MVC框架。且随着时代的发展,SpringMVC已经超越了Struts2框架。SpringMVC使用简单,学习成本低,使用SpringMVC目的是帮助我们简化开发,Spring MVC实现了MVC的核心概念。它为控制器和处理程序提供了与此模式相关的许多功能。当将控制反转(IoC)添加到MVC时,它使应用程序高度解耦,并提供了灵活性,可以通过简单的配置动态更改组件。 Spring MVC使您能够完全控制应用程序的各个方面。还有REST风格的支持,简单的文件上传,约定大于配置的契约式编程支持,注解的零配置支持以摆脱繁琐的xml配置等等强大功能。

如图2–1所示是SpringMVC的工作原理。

2.1.2 Hibernate框架

Hibernate是一个开源的对象关系映射(ORM)框架,为了减少直接对数据库进行访问,Hibernate对JDBC进行了进一步的封装,使Java程序员可以使用任意面向对象的编程思维来操纵底层数据库。 通过使用Hibernate,开发人员可以减少大量SQL语句的编写,无需直接操作数据库,由Hibernate为我们生成SQL语句,可以有效提高开发效率,快速转化产品,减少时间的浪费[7]。

Hibernate之所以能够在众多的ORM框架中脱颖而出,是因为Hibernate与其他的ORM框架相比有很多优势:Hibernate是开源的,社区非常活跃,产品更新迭代速度很快,发展稳定,bug极少;可扩展性较强,自己编码进行扩展,随时定制API功能;调试容易,上手简单;开源和免费的License,方便进行功能定制。

2.1.3 Spring框架

Spring是一个轻量级的IoC和AOP的开源容器框架,可以单独使用,主要是对JavaBean的生命周期进行管理,代替以前只可能由EJB完成的事情,当然Spring框架还可以结合其他的框架一起使用。该框架的主要优点之一是其层次结构,允许用户选择要使用的组件,并为J2EE应用程序开发提供集成框架[8]。

Spring的核心概念是IoC(控制反转),IoC的抽象概念是控制逆向。 它可以将组件之间的依赖关系完成注入,使组件之间的依赖性达到最小化,从而提高组件的重用性。 使用Spring提供的IoC容器,我们可以控制对象之间的依赖关系到Spring,以避免由硬编码引起的过程编程耦合。 使用Spring,用户不必自己写单实例模式,解析属性文件等等,只需要将重点放在上层应用程序上。

如图2–2所示是Spring框架的组成结构。

2.1.4 MVC框架技术

MVC(模型-视图-控制器)在上世纪的八十年代一开始只是作为变成语言的设计模式,经过不断的发展,在各种设计领域被广泛使用,同时MVC 也被应用到J2EE 的领域中,由于MVC 的功能强大和它具有的许多优点,已经受到越来越多的开发人员的使用。

MVC是由Model,View,Controller的三部分组成的一种设计模式,开发人员使用MVC这种设计模式对系统进行良好的分层,使得系统的耦合性大大降低,重用性提高,开发的周期和成本变低,如视图的变化,只需改变视图即可,无需改变其他任何地方。其中模型层可以用JavaBean来实现,这部分是应用程序中用于处理应用程序数据逻辑的部分。视图层用于与用户界面的交互,可以用HTML,JSP等来实现; 控制器层是模型和视图之间的桥梁,可以分配用户并选择适当的显示视图,还可以解释用户的输入并将其映射为模型级可执行操作。如图2–3所示是MVC模式图。

2.1.5 Tomcat服务器

Tomcat是一个jsp和servlets的Web服务器,Apache 软件基金会的Jakarta 项目中的一个核心项目,在世界上得到了广泛的应用。Tomcat开源免费,同时支持Servlet和Jsp,并提供了Web服务器的一些独特功能,如Tomcat 管理和控制平台,安全域管理和Tomcat阀[9]。 由于Tomcat本身还包含一个HTTP服务器,因此它也可以被视为单独的Web服务器。

Tomcat服务器属于轻量级应用服务器,并发访问量不是很多的场合中在中小型系统被广泛使用。 正是因为Tomcat稳定,先进,免费,高性能的特点,受到了广大Java开发人员的爱好和认可,成为目前比较流行的Web应用服务器[10]。

2.2 MySQL技术

MySQL是世界上最受欢迎的一款开源数据库。无论您是一个快速成长的Web应用企业,独立软件开发商或是大型企业,MySQL都能经济有效地帮助你交付高性能,可扩展的数据库应用。

MySQL虽然是免费的,但同其他商业数据库一样,具有数据库系统的通用性:

  • 数据库管理系统:访问,添加,处理一个计算机中存储在数据库中的数据,就需要MySQL这样的数据库管理系统,MySQL正好符合需求,具备这样的功能

  • 关系型数据库管理系统:通过管理关系数据库,并把数据组织为相关的行和列的系统就叫做关系型数据库管理系统。MySQL恰恰就是处理关系型的数据库系统,支持标准的结构化查询语言(Structured Query Language)

  • 开放源码数据库:开源的好处在于我们可以从github等仓库中下载阅读此软件的源代码,信任此软件,并加以扩展或者修改软件,定制高性能稳定的开源软件

  • 技术特点:MySQL是以一个客户机/服务器结构实现其功能的,它使用的核心线程是完全多线程,支持多处理器。MySQL主要特点是快速、健壮和易用。

2.3 Gradle技术

自动化构建,在软件生命周期中占据着举足轻重的地位,也是现代软件开发过程的重要组成部分,起着越来越重要的作用。在过去的Java世界里,我们已经非常熟悉Ant,Maven这些构建工具了,最开始是Ant,然后Maven凭借强大的依赖配置战胜了Ant,可以说Maven已经成为了Java构建的标准,但是随着技术的更新迭代,Gradle将渐渐取而代之Maven。

今天,大多数项目都包含了多而杂的技术栈,混合的多种编程语言,并且使用多种测试策略。随着敏捷实践的崛起,构建不得不更早地支持代码集成,以及频繁和简单地交付软件到测试和产品环境中。现有的构建工具不能够以一种简单但是可定制的方式去满足这些要求。而Gradle做到了这一切。Gradle是基于JVM的构建工具的新一代版本。它从现有的构建工具如Ant和Maven中学到了很多东西,并且把他们的最优思想提升到更高的层次。因为Gradle是基于JVM的,它允许使用Java或者Groovy语言来编写定制逻辑代码并提供了聚优表达性的DSL,约定优于配置的方法和强大的依赖管理。现代系统变得比以往更加的繁杂,构建的灵活性要求越来越高,而Gradle,一个基于Groovy的构建系统,灵活而又强大,能构建更复杂的项目[11]。

2.4 BootStrap技术

BootStrap是基于JavaScript、HTML和CSS开发的框架 ,由Twitter发布的开源产品托管于Github上面, 用于开发具有移动设备偏好的响应式Web项目,结合常见的CSS布局小部件和JavaScript插件封装成的性能良好的库,即便是没有经验的开发者也能够迅速上手掌握并使用,很大程度上提高了开发的效率,并且根据一定的规则编写符合规范的CSS和JavaScript代码。它还是后端程序员的福音,使他们只需要专注业务逻辑,而无须浪费太多的精力在界面设计上。

2.5 本章小结

本节主要介绍了设计和开发文珺OA系统所涉及的相关技术。重点介绍了J2EE技术、数据库技术、Gradle技术,Bootstrap技术等等,这些技术在后面的系统实现中都会使用到。

3 需求分析

本章分别通过分析系统的可行性,系统功能性需求,用例分析,以及非功能性需求分析得到系统的总体需求,为后续系统的设计奠定基础。

3.1 可行性分析

可行性分析是分析文珺OA系统的开发是否具备可能性。分别从技术上,经济上,解决方案上进行分析与研究,从而避免不必要的损失。确保文珺OA系统能够顺利开发成功。分析的目的在于充分利用时间来完成系统开发,尽可能减少风险代价,为全局做个良好的推断。下面是具体的分析:

3.1.1 技术可行性

随着技术的不断发展,开源社区的活跃,不断涌现出成熟的开源框架。充分利用这些成熟的框架对自己项目开发的便捷与稳定提供了很大的帮助。本系统是基于JavaEE的文珺OA的开发与实现,而本人对于Java技术的不断深入,完成本系统没有太大的难度,软件方面,采用的是SpringMVC,Hibernate,Spring框架,数据库技术采用MySQL,这些均为开源免费的软件,能够利用这些解决很多复杂的问题。硬件上,在window7平台上构建,开发工具使用IntelliJ IDEA优秀的IDE快捷开发,系统配置要求低,运行流畅。通过以上的分析,其技术上的可行性完全是可行的。

3.1.2 经济可行性

由于现代计算机已经非常普及,而且市场上普通个人电脑的价格也很低廉,在现有的个人电脑上即可满足系统开发工作需要的所有硬件设备环境。由于此系统并非商业系统,故不需要过多的人力,物力。而本系统的研究是基于Java语言,基于目前流行的SpringMVC,Hibernate,Spring框架开发的文珺OA系统,且这些都是开源免费的项目,所以经济上是可行的。充分利用现有开源的一些工具,项目开发的周期在指定时间内都是可行的。

3.1.3 操作可行性

系统有良好的用户界面,操作简洁,且用到了Bootsrap作为前端开发组件,改善用户体验,用户能够清晰地操作系统功能,不需要任何学习成本,简单方便。综合以上的分析,本系统的开发目标已经非常明确,各方面都是满足要求,因此本系统的开发是完全可行的。

3.2 功能性需求分析

本系统在功能的实现上主要分为系统管理,审批管理,相册管理,个人信息管理,公告管理五大模块。初始情况下,本系统只有一个用户admin,该用户拥有系统所有权,且整个用户权限的管理是动态添加可改变的,因为权限的动态性,为了系统描述的方便,系统首先添加两个岗位(Role)经理,员工,并分配默认的权限,当然系统后期可以添加更多的岗位角色,此种模式大大增加了OA系统灵活性,随时自定义配置。

3.2.1 系统管理

系统管理是拥有系统管理权限的用户对系统进行基础维护的重要模块,系统管理主要包括(用户管理,岗位管理,部门管理)模块,也是拥有子模块最多的模块。

  • 用户管理主要功能包括:添加用户,删除用户,更新用户,用户列表,初始化密码等操作

  • 岗位管理主要功能包括:添加岗位,删除岗位,更新岗位,岗位列表,设置权限等操作。

  • 部门管理主要功能包括:添加部门,删除部门,更新部门,部门列表等操作。

3.2.2 审批管理

审批管理是系统的核心模块,其中的流程管理为自主设计,操作简单,易于理解。主要功能包括:请假申请、待我审批、我的申请查询等操作。用户选择申请类型,提交申请后,将消息分发给待审批的人员,根据审批人员的审批意见来决定最终审批结果。

3.2.3 相册管理

公司内部员工可以共享内部相片,分享精彩瞬间,用户可以上传分享任意图片格式的文件,并拥有删除个人上传的照片的权限。

3.2.4 个人信息管理

用户可以查看自己的个人信息,修改个人信息,更新个人信息,修改自己的密码等操作。

3.2.5 公告管理

管理员拥有发布公告和修改,删除公告的权限,每次更新公告都会同步到数据库中,其他用户刷新即可看到最新公告,处理各项事务。

3.3 用例分析

OA系统创建用例模型,通过用户反馈和OA系统要求获得系统的需求,根据用户的角色,分配不同的权限,通过用例来描述系统需要完成的不同模块,划分实现不同的功能。

3.3.1 系统总用例

该系统采用UML面向对象的方法对各个模块进行分析,例如可以根据管理员、经理、员工等用户拥有的不同权限,处理不同的业务。如图3–1从业务层面描述了整个系统的功能需求。

3.3.2 系统管理模块用例分析

系统管理模块主要包括管理员,经理2个主要的角色用户拥有操作权限,普通用户不能操作系统管理模块。如果没有权限的用户访问该模块,系统会通过拦截器查询用户拥有的权限,并根据当前访问的url判断用户是否拥有该权限,如果没有,将被系统拦截掉。下面是系统管理模块的用例图,如图3–2所示,其中管理员和经理所拥有的功能如下所示:

  • 管理员拥有系统的所有权,系统不会对管理员进行拦截。 可以直接对系统管理模块(用户,部门,岗位)进行增加,修改,查找,删除,给岗位(角色Role)赋予权限等操作

  • 经理同样拥有系统的核心权限,可以对(用户,部门,岗位)进行增加,修改,查找,删除,以及给岗位(角色Role)赋予权限等操作

  • 普通用户无系统管理模块的权限,不能够操作此模块,同时普通用户登录系统后,页面无法显示此模块相关列表

3.3.3 审批管理模块用例分析

审批管理的主要目的是解决用户办公的便捷,提高公司办公的效率:审批管理是OA系统中比较重要的模块,通过分析审批管理模块的用例,更好地设计出优秀的工作流。拥有审批管理权限的用户可以处理员工的请假等申请;收到待审批消息时候处理消息;查看自己的请假申请等功能。用户可以对已提交的申请进行增删改查操作,历史记录的查询等。审批管理模块的用例图如图3–3所示,在赋予不同角色权限的情况下,每个角色的具体功能如下:

  • 经理的功能:起草申请,待我审批,我的申请查询

  • 员工的功能:起草申请,我的申请查询

3.3.4 相册管理模块用例分析

相册管理模块主要目的是公司员工在勤奋工作的同时,能够上传分享公司内部的精彩瞬间,增加公司的凝聚力和亲和力。用户可以查看公有相片,上传相片,删除个人上传过的相片,相册管理模块的用例图如图3–4所示。

3.3.5 个人信息模块用例分析

个人信息模块是基础权限,归属于所有用户,用户可以添加用户信息,修改用户信息,查询用户信息,修改密码等。如图3–5所示。

3.3.6 公告管理模块用例分析

管理员可以添加公告或修改,删除公告,并更新入库,用户能够及时看到最新的公告,且只有管理员拥有添加,修改,删除公告的权限,其他任何用户只能够查看公告,如图3–6所示。

3.4 非功能性需求分析

3.4.1 操作优化

系统充分考虑了用户的操作习惯,并针对系统的各项功能进行了严格测试,然后逐步完善操作。不管是从前台设计,还是从用户操作习惯都做到了高水准。页面展示友好,方便了用户的使用,增加了系统的实用性。

3.4.2 系统可扩展性

系统采用JavaEE技术,所有的功能都是按照模块划分的,面向接口编程,很多公用的部分抽象出接口,代码抽取出来,如果需要延伸功能,只需继承接口实现即可。使用JavaEE框架的同时遵从严格的代码规范,保证了系统的可扩充与维护[12]。

3.5 本章小结

本章主要是对系统进行功能性和非功能性的分析,以及系统用例的分析。在功能性分析上站在员工的角度观察问题;对于非功能性的分析,我们通过UML画出了类图,使得条理更加清晰;用例图更加直观的展示了系统的需求,让系统的需求可视化,便于日后的再次开发和维护。

4 系统设计

对OA系统进行详细的需求分析后,对系统进行了五个主要模块的划分:系统管理模块,审批管理模块,相册管理模块,个人信息模块,公告管理模块。

4.1 功能模块设计

根据前面的需求分析,将办公自动化系统划分为三个层次:分别为系统应用层、中间层和数据层。在确定了系统的开发方案后,现在开始对系统的整体架构进行设计。

4.1.1 整体架构

系统采用B/S 三层开发模式,包括数据层、业务层、应用层。如下图4–1所示。

4.1.2 模块设计

合理划分模块对整个系统的成败意义重大,尤其是OA系统的模块众多,如果不事先安排好模块的划分,将浪费很多时间和金钱,只有合理安排各个模块,才能更好地完成系统的功能和实现。

系统总模块大致分为系统管理模块、审批管理模块、相册管理模块、个人信息模块、公告管理模块。如图4–2所示。

系统管理模块分为员工管理、部门管理、岗位管理。如图4–3所示。

审批管理模块大致分为我的申请查询、待我审批、起草申请。如图4–4所示。

相册管理模块大致分为相册管理,相片管理。如图4–5所示。

个人信息模块大致分为添加用户信息,修改用户信息,删除用户信息,密码修改等操作。如图4–6所示。

公告管理模块主要为管理员发布公告,用户查看公告信息。如图4–7所示。

4.2 数据库设计

数据库主要是对各种信息的保存、删除、更新和查询,是一个系统的核心部分,所以数据库的设计是否合理,对整个系统的影响都是深远的。

4.2.1 概念结构设计

为了描述各个模块之间的关系,给后面的实现提供好的基础,根据上文的分析结果,设计了实体,实体中包含了具体信息,下面是部门实体图。

请假实体用来存储请假ID,申请人,审批人,请假天数,请假原因,请假结果等信息,请假实体图如图4–8所示。

审批实体用于存储审批信息ID,申请人ID,审批建议,审批状态,申请人等信息,审批实体图如图4–9所示。

部门实体用于存储部门ID,部门名称,部门描述,上级部门等信息,部门实体图如图4–10所示。

权限实体用于存储权限ID,权限名称,权限URL,上级权限等信息,权限实体图如图4–11所示。

角色实体用于存储角色ID,角色名称,角色描述等信息,角色实体图如图4–12所示。

用户实体用于存储用户ID,登录名,密码,姓名,邮箱等信息,用户实体图如图4–13所示。

4.2.2 系统E-R图

E-R图是用户,角色,权限,部门,请假,审批之间的实体关系图,其主要的实体关系如下:用户拥有角色是多对多的关系,角色拥有权限是多对多的关系,用户属于部门是多对一的关系,用户操作请假条是一对多的关系,用户操作审批记录是一对多的关系。系统E-R图如图4–14所示。

4.2.3 表结构

数据库设计在整个系统实现中都占据着举足轻重的位置,各个模块的实现都离不开数据库,所以说,整个系统的关键就在于数据库,如果数据库设计的不好,将对整个系统的成败造成直接的影响[13]。根据系统的需求分析结合数据库的设计原则,文珺OA系统的部分数据表如下。

用户表专门用来保存用户信息,表4–1结构如所示。

字段名 字段类型 字段长度 是否主键 描述
zj_user_id bigint 22 ID
createTime datetime 注册时间
description varchar 130 描述
email varchar 130 电子邮箱
gender varchar 130 性别
loginName varchar 130 登录名
name varchar 130 名字
password varchar 130 密码
phoneNumber bigint 22 手机号码
depart_id bigint 22 部门ID

部门表专门用来保存部门信息,表结构如表4–2所示。

字段名 字段名称 字段长度 是否主键 描述
zj_depart_id bigint 22 ID
name varchar 130 名称
description varchar 130 描述
parent_id bigint 22 上级ID

角色信息表专门用来保存角色信息,表结构如表4–3所示。

字段名 字段类型 字段长度 是否主键 描述
zj_role_id bigint 22 ID
name varchar 130 名称
description varchar 130 描述

权限表专门用来保存权限信息,表结构如表4–4所示。

字段名 字段类型 字段长度 是否主键 描述
id bigint 22 ID
name varchar 130 名称
url varchar 130 URL
parent_id bigint 22 上级权限ID

公告表用于公司内部公告,表结构如表4–5所示。

字段名 字段类型 字段长度 是否主键 描述
notice_id bigint 22 ID
content longtext 内容
createTime datetime 创建时间

相册表用来保存相片存储信息,表结构如表4–6所示。

字段名 字段类型 字段长度 是否主键 描述
photo_id bigint 22 ID
name varchar 130 名称
url varchar 130 文件地址
username varchar 130 上传者
userId bigint 22 上传者ID

请假表专门用来保存请假信息,表结构如表4–7所示。

字段名 字段类型 字段长度 是否主键 描述
leave_id bigint 22 ID
approverid varchar 130 审批人
startTime datetime 开始时间
endTime datetime 结束时间
days float 请假天数
picture varchar 130 图片
reason varchar 130 原因
result int 22 结果
createTime datetime 创建时间
status int 22 请假状态
type int 22 请假类型

审批表专门用来审批用户的请假信息,表结构如表4–8所示。

字段名 字段类型 字段长度 是否主键 描述
approver_id bigint 22 ID
leaveId bigint 22 请假ID
status int 22 审批状态
summary varchar 130 审批意见
createTime datetime 创建时间
updateTime datetime 更新时间
userId bigint 22 请假人ID
username varchar 130 请假人姓名

消息表用来保存待我审批的消息,表结构如表4–9所示。

字段名 字段类型 字段长度 是否主键 描述
message_id bigint 22 ID
title varchar 130 标题
type int 22 消息类型
disable bit 1 是否可用
watch int 22 是否查看
createTime datetime 创建时间
userId bigint 22 消息归属者
leaveId bigint 22 消息来源

4.3 核心业务流程设计

工作流的设计在文珺OA系统中占着非常重要的作用,在不使用任何第三方框架的基础上开发出安全稳定可靠的系统并非易事,针对本系统,以及通过大量的参考借鉴,针对此环节设计了通用的工作流程。系统核心流程如图4–15所示。

5 系统实现

通过完成需求分析和系统设计,现在开始本系统的开发。通过各种比较,本系统最终确定了最适合本系统开发的开发工具,构建工具和开发框架等。严格按照MVC分层架构,优化代码,合并抽取公用代码,并有着良好的Java命名规范,最终完成一个高性能的OA系统。

5.1 开发环境的搭建

5.1.1 开发环境搭建

  • 首先确保电脑上面已经配置好JDK,MySQL,Tomcat等环境

  • 在官方网站下载安装IntelliJ IDEA并运行

  • 新建Gradle项目,同时勾选中java 和 web选项,然后点击Next,如图5–1所示

  • 创建Gradle项目的目录结构,类似于Maven项目,Gradle项目需要建立src文件夹,用于存放java代码,resources文件夹,用于存放主流框架的xml配置文件等,jsp等文件存放在webapp目录下。由于gradle项目不会自动生成这些目录,故需要安装约定手动创建

  • 然后配置Tomcat的运行和调试参数,添加一个Application运行环境,配置Tomcat,最后最重要的一点是需要设置发布的构建包,在server和deployment中添加发布包,如图5–2所示

5.1.2 Cradle配置

Gradle是一个强大的项目自动化建构工具,这里用Gradle替代Maven,主要配置代码如下。

  1. group 'com.wenjun'
  2. version '1.0-SNAPSHOT'
  3. apply plugin: 'java'
  4. apply plugin: 'war'
  5. apply plugin: 'jetty'
  6. sourceCompatibility = 1.6
  7. repositories {
  8. maven { url "http://maven.aliyun.com/nexus/content/groups/public/" }
  9. jcenter()
  10. mavenCentral()
  11. }
  12. //设置项目编码
  13. tasks.withType(JavaCompile) {
  14. options.encoding = "UTF-8"
  15. }
  16. dependencies {
  17. compile fileTree(dir: 'libs', include: ['*.jar'])
  18. compile 'javax.servlet:servlet-api:2.5'
  19. compile group: 'javax.servlet.jsp', name: 'jsp-api', version: '2.2'
  20. def springVersion = "4.2.9.RELEASE"
  21. def hibernateVerion = "4.3.10.Final"
  22. compile ("org.hibernate:hibernate-core:$hibernateVerion")
  23. compile ("org.hibernate:hibernate-entitymanager:$hibernateVerion")
  24. compile ("org.hibernate:hibernate-c3p0:$hibernateVerion")
  25. compile ("org.hibernate:hibernate-ehcache:$hibernateVerion")
  26. compile("org.springframework:spring-context:$springVersion",
  27. "org.springframework:spring-core:$springVersion",
  28. "org.springframework:spring-beans:$springVersion",
  29. "org.springframework:spring-aspects:$springVersion",
  30. "org.springframework:spring-tx:$springVersion",
  31. "org.springframework:spring-web:$springVersion",
  32. "org.springframework:spring-webmvc:$springVersion")
  33. compile("mysql:mysql-connector-java:5.1.24")
  34. compile group: 'javax.mail', name: 'mail', version: '1.4.7'
  35. compile group: 'log4j', name: 'log4j', version: '1.2.16'
  36. compile group: 'commons-fileupload', name: 'commons-fileupload', version: '1.3.1'
  37. compile group: 'commons-codec', name: 'commons-codec', version: '1.9'
  38. compile group: 'com.google.code.gson', name: 'gson', version: '2.8.0'
  39. }

5.2 系统功能实现

5.2.1 通用功能实现

由于各模块数据的增删改查操作都是通用的,只有操作的对象不同,故这里抽出公共代码部分,采用接口编程,具体模块的特例重写接口即可。主要接口代码如下。

  1. public interface BaseDao<T> {
  2. void save(T entity);
  3. void delete(Long id);
  4. void update(T entity);
  5. T getById(Long id);
  6. List<T> getByIds(Long[] ids);
  7. List<T> findAll();
  8. Class getEntityClass();
  9. PageBean getPageBean(int cursorPage, int pageSize, String sql, List<Object> params);
  10. }

5.2.2 用户登录

登录界面

Bootsrap是一个简约漂亮的前端框架,简单实用,故后台的UI使用了基于Bootrap的AdminLTE框架,使页面漂亮美观。主页面使用了FrameSet嵌套的方式来展现数据,登录界面如图5–3所示。

业务逻辑代码

  1. //登录
  2. @RequestMapping("/user_login.action")
  3. public String login(User user, HttpSession session,Map map ) {
  4. if (TextUtils.isEmpty(user.loginName()) || TextUtils.isEmpty(user.password())) {
  5. return "user/loginUI";
  6. }
  7. if (session.getAttribute("user")!=null) {
  8. //已经登陆过
  9. return "redirect:/home_index.action";
  10. }
  11. User u = userService.checkUserIn(user.getLoginName(),user.getPassword());
  12. if (u == null) {
  13. return "user/loginUI";
  14. } else {
  15. session.setAttribute("user", u);
  16. return "redirect:/home_index.action"; //后台主界面
  17. }
  18. }

5.2.3 系统管理模块的实现

系统模块包含部门管理模块,岗位管理模块,用户管理模块三大部分,基础部分均包含了数据的增删改查,以及用户列表的分页功能。

用户添加的核心代码

  1. @RequestMapping("/user_add.action")
  2. public String add(User modelBean,Long depart_id,Long [] role_ids){
  3. // 设置所属部门
  4. modelBean.setDepartment(departmentService.getById(depart_id));
  5. List<Role> list = roleService.getByIds(role_ids);
  6. modelBean.setRoles(new HashSet<Role>( list));
  7. String mdStr = DigestUtils.md5Hex("1234");
  8. modelBean.setPassword(mdStr);
  9. // 保存到数据库
  10. userMgService.save(modelBean);
  11. return "redirect:/user_list.action";
  12. }

页面效果如图5–4。

用户分页展示核心代码

  1. @RequestMapping("/user_list.action")
  2. public String list(Integer currentPage, Map map, HttpSession session){
  3. // 分页显示
  4. if (currentPage == null ) {
  5. currentPage = Constants.PAGE_CURRENT_DEFAULT;
  6. }
  7. // 取出currentUser
  8. User currentUser= (User) session.getAttribute("user");
  9. if(currentUser == null){
  10. return "error";
  11. }
  12. List<Object> parameters = new ArrayList();
  13. parameters.add(currentUser);
  14. //ASC DESC
  15. String sql = "FROM User u WHERE u <> ? ORDER BY u.createTime DESC";
  16. PageBean pb = userMgService.getPageBean(cursorPage, Constants.PAGE_SIZE, sql, params);
  17. map.put("pageBean", pb);
  18. return "user/list";
  19. }

页面效果如图5–5。

岗位权限分配核心代码

  1. @RequestMapping("/role_setPrivilegeUI.action")
  2. public String setPrivilegeUI(Long id,Map m) throws Exception {
  3. Role r = roleService.getById(id);
  4. m.put("role", r);
  5. if (role.getPrivileges() != null) {
  6. Long[] pri_ids = new Long[r.getPrivileges().size()];
  7. int index = 0;
  8. for (Privilege p : role.getPrivileges()) {
  9. pri_ids[index++] = p.getId();
  10. }
  11. map.put("privilegeIds", pri_ids);
  12. }
  13. // 准备数据 privilegeList
  14. List<Privilege> list = privilegeService.findAll();
  15. map.put("privilegeList", list);
  16. return "role/setPrivilegeUI";
  17. }
  18. /** 设置权限 */
  19. @RequestMapping("/role_setPrivilege.action")
  20. public String setPrivilege(Long [] pri_ids,Long id) throws Exception {
  21. // 1,从数据库中获取原对象
  22. Role r = roleService.getById(id);
  23. // 2,设置要修改的属性
  24. List<Privilege> datas = privilegeService.getByIds(pri_ids);
  25. r.setPrivileges(new HashSet<Privilege>(datas));
  26. // 3,更新到数据库
  27. roleService.update(r);
  28. return "redirect:/role_list.action";
  29. }

页面效果如图5–6。

由于其它子模块中的增加、查找、修改、删除与前面类似较,由于篇幅问题,此处不再说明。

5.2.4 审批管理模块的实现

用户首先登陆系统,登陆成功后选择菜单“起草申请”流程选择,进入页面后,选择其中一个流程申请如 “请假申请”,填写表单后,提交申请,将会在数据库插入一条记录,并通知需要审批的人员。需要审批的人员收到消息后,对申请进行审批。主要页面代码如下。

模板选择页面

  1. <div class="wrapper">
  2. <div class="row">
  3. <div class="jumbotron text-center" style="background-color:transparent;">
  4. <h2>轻轻松松走完流程审核</h2>
  5. <br/>
  6. <br/>
  7. <span>
  8. <c:forEach var="type" items="${applyTypeList}">
  9. <a href="${type.url}" >${type.name}</a>
  10. </c:forEach>
  11. </span>
  12. </div>
  13. </div>
  14. </div

页面效果图如图5–7。

提交申请业务处理

  1. /** 提交申请 */
  2. @RequestMapping("/flow_submit.action")
  3. public String submit(LeaveBean leave,HttpSession session) throws Exception {
  4. // 封装申请信息
  5. User user = getCurrentUser(session);
  6. if(user == null){
  7. return "error";
  8. }
  9. leave.setCreateTime(new Date());
  10. leave.setUserId(user.getId());
  11. workflowService.save(leave);
  12. workflowService.submit(leave,user.getDepartment());
  13. //发送通知
  14. String approverStr= leave.getApproverid();
  15. String approvers [] = null;
  16. try{
  17. approvers = approverStr.split(",");
  18. }catch(Exception e){
  19. return "error";
  20. }
  21. messageService.sendMessage(leave.getId(),user.getName()+"发来一条消息需要您的处理",approvers);
  22. return "redirect:/flow_leaveList.action";// 成功后转到"我的申请查询"
  23. }

提交申请表单页面如图5–8。

我的申请查询

  1. @RequestMapping("/flow_leaveList.action")
  2. public String flow_leaveList(HttpSession session,Map map) throws Exception {
  3. User user = getCurrentUser(session);
  4. List<LeaveBean> list = workflowService.getLeaveListByUser(user.getId());
  5. map.put("leaveList", list);
  6. return "flow/leaveList";
  7. }

待我审批

  1. @RequestMapping("/flow_myMessageList.action")
  2. public String myMessageList(Map map,boolean disable,HttpSession session) throws Exception {
  3. List<Message> messagesList = messageService.getMessageList(getCurrentUser(session),disable);
  4. map.put("messageList", messagesList);
  5. return "flow/myMessageList";
  6. }

审批处理

  1. @RequestMapping("/flow_approve.action")
  2. public String approve(HttpSession session,Long messageId,LeaveApprover model) throws Exception {
  3. User currentUser = getCurrentUser(session);
  4. // 消息处理
  5. Message message = messageService.getById(messageId);
  6. message.setDisable(true);
  7. messageService.update(message);
  8. //审批单处理
  9. model.setUserId(currentUser.getId());
  10. model.setUsername(currentUser.getName());
  11. model.setCreateTime(new Date());
  12. leaveApproverService.save(model);
  13. // 请假单处理(处理中 or 同意 or 拒绝 )
  14. Long leaveId = model.getLeaveId();
  15. LeaveBean leaveBean = workflowService.getById(leaveId);
  16. if (model.getStatus() == LeaveApprover.STATUS_REFUSE) {
  17. //如果一个审批人拒绝,则直接拒绝申请
  18. leaveBean.setResult(LeaveBean.STATUS_REFUSE);
  19. workflowService.update(leaveBean);
  20. }else{ //如果全部通过,同意申请
  21. int sendRequestLength = leaveBean.getApproverid().split(",").length-1; //审批人总数
  22. List<LeaveApprover> leaveApprovers = leaveApproverService.getByLeaveId(leaveBean.getId());//所有审批人员
  23. if (leaveApprovers.size() == sendRequestLength) {
  24. List<Integer> tempResults = new ArrayList<Integer>();
  25. for (LeaveApprover approver : leaveApprovers) {
  26. int status = approver.getStatus();
  27. tempResults.add(status);
  28. }
  29. if (tempResults.contains(LeaveApprover.STATUS_REFUSE)) {
  30. leaveBean.setResult(LeaveBean.STATUS_REFUSE);
  31. workflowService.update(leaveBean);
  32. } else {
  33. leaveBean.setResult(LeaveBean.STATUS_AGREE);
  34. workflowService.update(leaveBean);
  35. // 审批人都同意了,发送邮件或短信,可以走人了
  36. // MainManager.sendTo(User);
  37. }
  38. }
  39. }
  40. return "redirect:/flow_myMessageList.action";// // 成功后转到待我审批页面
  41. }

以上为核心业务处理,部分由于篇幅原因省略。

5.2.5 相册管理模块的实现

文件上传核心代码如下

  1. @RequestMapping("/upload.action")
  2. public String upload(MultipartFile photoFile, HttpSession session,Map map) throws IOException {
  3. if(!FormVerifyUtils.checkUpload(file)){
  4. map.put("error", "参数有误");
  5. return "upload/uploadUI";
  6. }
  7. User currentUser = (User) session.getAttribute("user");
  8. String name = photoFile.getName();
  9. String suffix = file.getOriginalFilename().substring(photoFile.getOriginalFilename().lastIndexOf("."));
  10. String urlFolder = session.getServletContext().getContextPath()+"/upload/";
  11. String destFolder = session.getServletContext().getRealPath("/upload/");
  12. String fileName = UUID.randomUUID().toString();
  13. String fileDest = destFolder + fileName + suffix;
  14. String imageUrl = urlFolder + fileName + suffix;
  15. FileUtils.copyInputStreamToFile(file.getInputStream(),new File(fileDest));
  16. Photo photo = new Photo();
  17. photo.setName(name);
  18. photo.setUserId(currentUser.getId());
  19. photo.setUsername(currentUser.getName());
  20. photo.setUrl(imageUrl);
  21. uploadService.save(photo);
  22. return "redirect:/upload_list.action";
  23. }

页面效果如图5–9。

5.2.6 个人信息模块的实现

用户登录成功后,可以查看自己的个人信息,并修改保存个人信息。

核心代码如下。

  1. @RequestMapping("user_setting.action")
  2. public String setting(User m,HttpSession session) {
  3. //因为设置的是当前用户,直接从session中取出即可
  4. User currentUser = (User) session.getAttribute("user");
  5. if (currentUser != null) {
  6. currentUser.setName(m.getName());
  7. currentUser.setGender(m.getGender());
  8. currentUser.setPhoneNumber(m.getPhoneNumber());
  9. currentUser.setEmail(m.getEmail());
  10. currentUser.setDescription(m.getDescription());
  11. }
  12. return "user/optSuccess";
  13. }

页面效果如图5–10。

5.2.7 公告管理模块的实现

用户查看公告

  1. @RequestMapping("/home_right.action")
  2. public String right(Map map) throws Exception {
  3. //准备公告信息
  4. List<Notice> noticeList = noticeService.findAll();
  5. if (noticeList.size() > 0) {
  6. Notice notice = noticeList.get(0);
  7. map.put("content", notice.getContent());
  8. }
  9. return "home/right";
  10. }

页面效果如图5–11。

管理员更新公告

  1. @RequestMapping("notice_update.action")
  2. public String addOrUpdate(String content,Map map) throws Exception {
  3. List<Notice> noticeList = noticeService.findAll();
  4. if (noticeList.size() > 0) {
  5. Notice notice = noticeList.get(0);
  6. notice.setContent(content);
  7. noticeService.update(notice);
  8. map.put("content", notice.getContent());
  9. }else{
  10. Notice notice = new Notice();
  11. notice.setContent(content);
  12. notice.setCreateTime(new Date());
  13. noticeService.save(notice);
  14. map.put("content", notice.getContent());
  15. }
  16. return "home/right";
  17. }

页面效果如图5–12。

5.3 本章小结

本章根据系统分析和设计实现了各个功能模块,详细说明了系统管理模块和审批管理模块的开发过程。其中审批管理模块中使用的工作流技术未使用任何框架,而是根据工作流的设计思想,设计出简单易用的工作流。由于完全是自主设计,减少了因第三方框架底层原理的不了解而造成的意外bug。可扩展性和稳定性很强,维护成本低,并给出了具体的代码实现和图片展示。

6 功能测试

6.1 系统管理模块测试

办公自动化(简称OA)系统是企业内部各级部门之间以及企业内外部之间信息的收集与处理、流动与共享以实现科学决策的具有战略意义的信息系统。如果在一些关键应用中使用质量有问题的软件,会给企业造成灾难性的后果。因此,加强软件测试工作,成为提高企业 OA 系统抵御风险,不断更新 ,增强其可靠性、安全性的重要条件[14]。

用户管理测试

用户管理中包含用户查看,用户添加,用户删除,用户修改。用户管理的测试项和测试结果如表6–1所示。

测试项 测试输入 测试输出 测试结果
部门添加 部门名称:测试 上级: 测试上级 将添加的部门存储到数据库中 测试通过
部门查看 测试部门 输出测试部门的信息 测试通过
部门修改 测试部门 将修改过的部门更新到数据库中 测试通过
删除部门 测试部门 数据库中删除了该部门的信息 测试通过

部门管理测试

部门管理中包含部门查看,部门添加,部门删除,部门修改。部门管理的测试项和测试结果如表6–2所示。

测试项 测试输入 测试输出 测试结果
部门添加 部门名称:测试 上级: 测试上级 将添加的部门存储到数据库中 测试通过
部门查看 测试部门 输出测试部门的信息 测试通过
部门修改 测试部门 将修改过的部门更新到数据库中 测试通过
删除部门 测试部门 数据库中删除了该部门的信息 测试通过

岗位管理测试

岗位管理中包含岗位查看,岗位添加,岗位删除,岗位修改。岗位管理的部分测试项和测试结果如表6–3所示。

测试项 测试输入 测试输出 测试结果
岗位添加 岗位名称:测试 将添加的岗位存储到数据库中 测试通过
岗位查看 测试岗位 输出测试岗位的信息 测试通过
岗位修改 测试岗位 将修改过的岗位更新到数据库中 测试通过
删除岗位 测试岗位 数据库中删除了该岗位的信息 测试通过

6.2 审批管理模块测试

审批管理中包含起草申请,申请查询,待我审批。审批管理的部分测试项和测试结果如表6–4所示。

测试项 测试输入 测试输出 测试结果
起草申请 申请类型:病假 申请原因: 生病了 数据库增加一条请假记录 测试通过
申请查询 申请人:当前用户 输出申请历史列表 测试通过
待我审批 审批人:当前用户 输出待审批消息列表 测试通过

6.3 相册管理模块测试

相册管理中用户可以查看公共相片,上传相片,删除个人相片。相册管理的部分测试项和测试结果如表6–5所示。

测试项 测试输入 测试输出 测试结果
查看公告相片 员工相册 输出相册列表 测试通过
上传相片 图片地址:测试图片 数据库增加一条上传记录 测试通过
删除个人相片 图片ID:测试ID 数据库删除了该条记录 测试通过

6.4 个人信息模块测试

个人信息模块中包含密码修改,个人信息维护。个人信息模块的部分测试项和测试结果如表6–6所示。

测试项 测试输入 测试输出 测试结果
密码修改 测试密码 用户密码更新到数据库 测试通过
个人信息添加 测试用户 用户信息更新到数据库 测试通过

6.5 公告管理模块测试

公告管理模块中包含发布公告,查看公告。公告管理模块的部分测试项和测试结果如表6–7所示。

测试项 测试输入 测试输出 测试结果
发布公告 测试公告 公告信息更新到数据 测试通过
查看公告 测试公告 输出公告信息 测试通过

结束语

毕业设计是大学里学到知识一次测试,它包含了几乎所有我们学到过的专业知识。而毕业设计作品的好与坏,反映了我们个人实力的强弱,是否认真对待,为了做出好的毕业设计,我们必须拿出我们一百分的热情,用心去搞好这次毕业设计。

我对这次的毕业设计有着非常多的感想,通过这次很难忘的经历,让我对从前所有学过的知识进行了一次整理,然后运用这些技能完成此项目。这个项目对我有着很大的提升,让我在原来的基础上进一步提升,做到了知识的再次升华。对于我们,毕业设计不仅仅是对过去知识的回顾,还是对现有知识的进一步提升,为了能够不落后飞速发展的IT浪潮,比如MVC框架中,我把最熟悉的Struts2替换为SpringMVC,Maven替换为Gradle等等,因为Gradle在JavaEE中还不是很流行,期间也遇到了很多各种各样的错误,都最终一一解决,进一步提升自我。

在页面的美化和代码质量方面,我也花了很大的心思,为了追求完美,UI不断的推翻重来,代码的命名和复用,是否清晰,易于阅读等等,不下三次地重构,虽然消耗了大量的时间,但是我认为这是非常值得的一件事,做到自己满意为止,这很有趣。

一个好的程序,并不是一蹴而就的,它需要经过需求分析设计之后,经过细致的开发和修正后才得以实现,否则会造成一些无法去挽回的后果。

也许,毕业设计是我在大学的职业生涯中的最后特别认真做的事,大学生活将要远离我们而去,但我不会感到遗憾,我尽力做到最好!

参考文献

[1] 孔明.基于工作流的办公自动化系统的研究与实现[D]. 大连海事大学,2013

[2] 陈次白.政府办公自动化原理与应用[M].北京:北京大学出版社,2012:50-53

[3] 李慧勇,郑艳明. 国内外办公自动化的研究现状及发展趋势[J]. 科技信息(学术研究),2011,17:7

[4] 张凯. 基于SSH的小型办公系统的设计与实现[D].华中科技大学,2011

[5] 陈嘉杰. 基于.NET的企业OA系统的设计与实现[D].华南理工大学,2010.

[6] 李刚. 轻量级J2EE企业应用实战:Struts+Spring+Hibernate整合开发[M]. 电子工业出版社, 2007:25-30

[7] 宋汉增, 沈琳. 利用Hibernate对象持久化服务简化Java数据库访问 [J]. 计算机应用,2011,12:135-137

[8] 胡启敏,薛锦云,钟林辉. 基于Spring框架的轻量级J2EE架构与应用[J].计算机科学重点实验室,2012,44(5):115-118

[9] 孙卫琴,李洪成. Tomcat与Java Web开发技术详解[M].北京:电子工业出版社,2012:43-46.

[10] 鲁骏, 郭旭展. 一种基于CAN/GPRS无线网关的车载网络设计方案[J]. 电脑知识与技术:学术交流, 2012, 08(21):5067-5069.

[11] (美)马斯可.实战Gradle[M].北 京:电子工业出版社,2015:24-28

[12] TFG Guia, MMT Rodrigo, MMC Dagam et. Modeling the affective states of students using SQL-Tutor[EB/OL],http://link.springer.com/chapter/10.1007/978-3-642-3095-2_97,2014-03-16/2014-03-20

[13] 员建厦.基于数据仓库的信息处理系统及关键技术研究[D].西安电子科技大学,2012

[14] 宋洁. 企业OA系统性能测试工具简介[J]. 中国职业技术教育,2007,(12):13-14.

上传的附件 cloud_download 基于JavaEE的办公OA系统的设计与实现.7z ( 10.70mb, 1次下载 )
error_outline 下载需要20点积分

发送私信

只有过着不安稳得日子,日子才能不纠结

7
文章数
7
评论数
最近文章
eject