资源描述
工资管理系统的设计与实现
──工资账户管理、请假管理
摘 要:工资管理是财务管理的一个重要方面,对于任何一个企业或者组织都极其重要,现今社会利用计算机支持企业或组织高效率来完成操作势在必行。我们由一个四人团队来完成了工资管理系统设计与实现。在本工资管理系统中,涉及到最多的就是对数据的增删改查,当然在真正的系统中,对于这些操作要控制在严格的权限中,使用struts2+hibernate+spring实现了简单的CRUD操作。本系统采用三层架构,也就是数据访问层、业务逻辑层、表示层。整个系统包含7个模块(系统管理、人事管理、工资账户管理、工资管理、请假管理、个人信息管理、报表管理),本论文包括其中的两个模块-工资账户管理、请假管理。
关键词:工资管理系统;MYSQL数据库; 工资账户管理;请假管理
Abstract:Salary management is an important aspect of financial management,it is very important to any enterprise or organization, nowadays, using computer for enterprise or the organization to complete the operation is imperative.So we are a team of four have completed the design and implementation of salary management system. In the salary management system, involving the most is the data crud, of course, in the real system, for these operations to control in strict access .We used Struts2 and hibernate and spring to achieve a simple CRUD operations. The system uses three layer architecture, which is the data access layer, business logic layer and presentation layer. The whole system contains seven modules (system management, personnel management, wage and salary account management, salary management, leave management, personal information management, report management), in this paper, including two modules ,they are salary account management and leave management.
Key words:The wages management; MYSQL database; Salary account; Leave management.
前 言
有效的工资管理对于任何一个单位或者组织都是不可缺少的部分,它的内容对于单位或者组织的决策者和管理者来说都至关重要,所以工资管理系统应该能够为用户提供充足的信息和快捷的查询等手段。但一直以来人们使用传统人工的方式管理文件信息,这种管理方式存在着许多缺点,如:效率低、保密性差,另外时间一长,将产生大量的文件和数据,这对于查找、更新和维护都带来了不少的困难。随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识已进入人类社会的各个领域并发挥着越来越重要的作用。作为计算机应用的一部分,使用计算机对工资管理信息进行管理,具有手工管理所无法比拟的优点.例如:检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高单位或者组织信息管理的效率,也是单位或者组织的科学化、正规化管理,与世界接轨的重要条件。随着数据库技术的不断发展及数据库管理系统的广泛应用,数据库中存储的数据量急剧增大,这些数据库中的大量数据隐含着许多有价值的信息,而传统的对数据库的简单操作只能发现表层的知识,不能归纳出隐含的带有结构性的知识,已不能满足人们的需要,人们更希望通过对数据的分析,得到数据更深层次的信息,或者说得到可用于进行决策的知识,也即对数据进行挖掘。数据挖掘,顾名思义就是从大量的数据中挖掘出有用的信息。开发本系统的目的就是帮助单位或者组织的财务主管部门提高工作效率,实现单位或者组织员工工资信息管理的系统化、规范化和自动化。本系统包括七个大功能,使单位或者组织实现工资管理的自动化,无疑会给单位或组织管理部门带来很大方便。
1 系统需求分析
1.1 范围
本次开发的系统为工资管理系统。用于对小型企业的职工基本信息和工资信息的管理。包括工资账户管理(创建工资账户、审批工资账户)、请假管理(个人请假管理、审批请假申请)。
1.2 定义
GZGLXT
Gong Zi Guan Li Xi Tong(工资管理系统)的缩写。
FS
Finance Staff(财务人员)的缩写。
NFS
Not Finance Staff(非财务人员)的缩写。
JSP
Java Server Page(Java服务器页面)的缩写,一个脚本化的语言。
UML
Unified Modeling Language的缩写,一个建模语言。
1.3 功能需求
定义了开发人员必须实现的软件功能,使得用户能完成他们的任务,从而满足其业务需求。
工资账户管理:对员工的工资账户进行添加、修改、删除。
请假管理:添加请假单,审批请假申请
1.4 系统优势
1)降低财务专员的工作量,提高日常工作效率.
2) 先进的工资管理系统能够及时准确地收集、管理信息,够有效地在企事业单位的各个部门间架起一个沟通的桥梁,使企事业单位或者组织的各个部门根据相关的信息作出合理高效的操作。
3)操作简单易用,能满足企业、学校等组织对员工的工资进行有效管理。
1.5 开发与运行环境
本例的工资管理系统开发与运行环境如下:
开发环境:Windows XP/Windows 7
开发工具:myeclipse
数据库管理系统:MYSQL数据库
运行环境:WindowsXP / Windows 7
2 系统总体结构设计
2.1 系统目标
本系统要对重庆师大学教职员工的工资进行数据管理,对各项工资条款进行计算。汇总各项数据生成员工个人工资,打印工资报表。采用用户名,密码安全机制,分用户权限登陆访问,保证系统资源不受人为因素的干扰。
2.2 系统功能结构与分析
一个有效的系统要能储存系统中所必须的信息并能对这些信息进行各种操作。例如对信息快速查找以及对数据的增删改查。工资管理系统是帮助企业或者组织管理职工工资的系统,本系统是由系统管理、人事管理、工资账户管理、工资管理、请假管理、个人信息管理、报表管理几个功能模块组成。
2.3 系统各功能模块设计
据以上分析的功能,总结出系统结构图如下:
图2.2.3系统结构图
2.4 工资账户管理模块
工资账户管理
创建工资账户
审批工资账户
查询
添加
修改
删除
查询
审批
修改
删除
图2.2.4工资管理模块功能示意图
2.5 请假管理模块
请假管理
个人请假管理
审批请假申请
修改
添加
查询
删除
审批
图2.2.4请假管理模块功能示意图
3 数据库设计
3.1数据流程图
1)工资账户管理
工资账户管理理
创建工资账户
审批工资账户
图3-1.1工资账户管理流程图
2)请假管理
请假管理
个人请假管理
审批请假申请
图3-1.2请假管理流程图
3.2数据字典分析
1)模块管理表(module)-主要用来管理模块的排列和模块的访问路径。
字段名称
数据类型
字段大小
是否主键
说明
id
int
11
Y
模块编号
name
varchar
500
N
模块名称
sn
varchar
500
N
系统标识
url
varchar
500
N
访问路径
orderNo
varchar
500
N
优先级标识
parentId
int
11
N
父亲模块编号
2)工资账户表(account)
字段名称
数据类型
字段大小
是否主键
说明
id
int
11
N
序号
personId
int
11
Y
员工id
number
varchar
255
N
账户编号
status
varchar
255
N
审批状态
opinion
varchar
255
审批意见
createTime
datetime
N
创建时间
3)请假管理表(leaves)
字段名称
数据类型
字段大小
是否主键
说明
id
int
11
Y
请假次数
personId
int
11
N
员工id
name
varchar
255
N
员工姓名
content
varchar
255
N
请假内容
status
varchar
255
N
审批状态
opinion
varchar
255
N
意见
createTime
datetime
N
创建时间
fristDay
datetime
N
开始时间
lastDay
datetime
N
结束时间
4 详细设计与实现
Spring配置:
Spring作为业务层,结合hibernateFilter文件处理,
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4.1 工资账户管理实现
4.1.1 配置
在strusts.xml中添加
<include file="cs/xj/action/account/account.xml"/><!-- 账户管理 -->
account.xml的配置如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="account" extends="struts-default" namespace="/account">
<interceptors>
<interceptor name="securityInterceptor" class="cs.xj.interceptor.SecurityInterceptor"></interceptor>
</interceptors>
<global-results>
<result name="error">/pages/pay_main.jsp</result>
<result name="login" type="redirect">/index.jsp</result>
</global-results>
<action name="accountAction" class="accountAction">
<result name="find">/pages/account/account.jsp</result><!-- 创建工资账户界面-->
<result name="approve">/pages/account/approve_account.jsp</result><!-- 审批工资账户 -->
<result name="add">/pages/account/add_account.jsp</result><!-- 添加工资账户 -->
<result name="saveInput">/pages/account/add_account.jsp</result><!-- 保存添加工资账户 -->
<result name="save" type="redirect">/pages/common/success.jsp</result><!-- 保存添加工资账户 -->
<result name="delete" type="redirect">/pages/common/del_success.jsp</result><!-- 删除工资账户 -->
<result name="app">/pages/account/app_account.jsp</result><!--审批工资账户 -->
<result name="approveSuccess" type="redirect">/pages/common/success.jsp</result><!--审批工资账户成功 -->
<result name="edit">/pages/account/edit_account.jsp</result><!--修改工资账户 -->
<result name="updateInput">/pages/account/edit_account.jsp</result><!--修改工资账户 -->
<result name="update" type="redirect">/pages/common/success.jsp</result><!--修改工资账户 成功-->
<interceptor-ref name="paramsPrepareParamsStack"></interceptor-ref>
<interceptor-ref name="securityInterceptor"></interceptor-ref>
</action>
</package>
</struts>
模块对应数据库表:
4.1.2 程序实现
(AccountAction.java):
@Controller("accountAction")
@Scope("prototype")
public class AccountAction extends BaseAction {
private static final long serialVersionUID = 1L;
private Account account;
private Integer id;
private PagerModel<Person> pagerModel;
@Resource(name = "personService")
private PersonService personService;
private Person person;
private Integer personId;
private String personNumber;
@Resource(name = "accountService")
private AccountService accountService;
private String approve;
@Override
public void prepare() throws Exception {
if(id != null){
account = accountService.findById(id);
}else{
account = new Account();
}
}
@Override
public Account getModel() {
return account;
}
public String find() throws Exception {
int offset = 0;
try {
offset = Integer.parseInt(request.getParameter("pager.offset"));
} catch (RuntimeException e) {
}
if(personNumber != null){
pagerModel = personService.find(new String[]{"number"}, new String[]{personNumber }
, new MatchMode[]{MatchMode.ANYWHERE }, offset, PageSize.NORMAL);
}
else{
pagerModel = personService.find(offset, PageSize.NORMAL);
}
if("true".equals(approve)){
return "approve";
}
return "find";
}
public String add() throws Exception {
person = personService.findById(personId);
request.setAttribute("per", person);
return "add";
}
@InputConfig(resultName = "saveInput")
public String save() throws Exception {
accountService.saveOrUpdate(account, personId);
session.put("notice", "分配工资账户成功");
return "save";
}
public void validateSave() {
if(isNull(account.getNumber())){
addFieldError("number", "工资账户不能为空");
}
else{
Account a = accountService.findByNumber(account.getNumber());
if(a != null){
if(account.getNumber().equals(a.getNumber())){
addFieldError("number", "工资账户已存在");
}
}
}
}
public String delete() throws Exception {
accountService.delete(account);
session.put("notice", "删除工资账户成功");
return "delete";
}
public String app() throws Exception {
return "app";
}
public String approve() throws Exception {
accountService.saveOrUpdate(account);
session.put("notice", "审批工资账户成功");
return "approveSuccess";
}
public String edit() throws Exception {
return "edit";
}
@InputConfig(resultName = "updateInput")
public String update() throws Exception {
account.setStatus(Status.NEW);
accountService.saveOrUpdate(account);
session.put("notice", "修改工资账户成功");
return "update";
}
public void validateUpdate() {
if(isNull(account.getNumber())){
addFieldError("number", "工资账户不能为空");
}
else{
Account a = accountService.findByNumber(account.getNumber());
if(a != null){
if(account.getNumber().equals(a.getNumber()) && !a.getId().equals(account.getId())){
addFieldError("number", "工资账户已存在");
}
}
}
}
public Account getAccount() {
return account;
}
public void setAccount(Account account) {
this.account = account;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public PagerModel<Person> getPagerModel() {
return pagerModel;
}
public void setPagerModel(PagerModel<Person> pagerModel) {
this.pagerModel = pagerModel;
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
public Integer getPersonId() {
return personId;
}
public void setPersonId(Integer personId) {
this.personId = personId;
}
public String getApprove() {
return approve;
}
public void setApprove(String approve) {
this.approve = approve;
}
public String getPersonNumber() {
return personNumber;
}
public void setPersonNumber(String personNumber) {
this.personNumber = personNumber;
}
}
4.1.3 接口
AclDao操作数据库中的权限控制表acl的方法的接口
AccountService用户服务接口
AccountDao操作工资账户表的Dao接口
调用
调用
调用
图4.1.3工资账户管理模块接口调用图
4.1.4 运行效果图
1)总效果图:
2)各个小功能运行效果图:
工资账户查询图(成功显示查询数据)
添加工资账户图(已存在工资账户的员工不能再进行添加)
修改员工的工资账户图(审批通过的员工工资账户不能进行修改和删除操作):
删除工作账户图:
审批员工的工资账户图:
4.2 请假管理实现
4.2.1 配置
在strusts.xml中添加
<include file="cs/xj/action/leave/leave.xml"/><!-- 请假管理 -->
leave.xml的配置如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="leave" extends="struts-default" namespace="/leave">
<interceptors>
<interceptor name="securityInterceptor" class="cs.xj.interceptor.SecurityInterceptor"></interceptor>
</interceptors>
<global-results>
<result name="error">/pages/pay_main.jsp</result>
<result name="login" type="redirect">/index.jsp</result>
</global-results>
<action name="leaveAction" class="leaveAction">
<result name="findMyLeave">/pages/leave/leave.jsp</result><!--个人请假管理 界面-->
<result name="find">/pages/leave/approve_leave.jsp</result><!-- 审批请假申请界面 -->
<result name="saveInput">/pages/leave/add_leave.jsp</result><!-- 添加请假单界面 -->
<result name="save" type="redirect">/pages/common/success.jsp</result><!-- 添加请假单成功界面 -->
<result name="edit">/pages/leave/edit_leave.jsp</result><!-- 修改请假单界面 -->
<result name="updateInput">/pages/leave/edit_leave.jsp</result><!-- 修改请假单界面 -->
<result name="update" type="redirect">/pages/common/success.jsp</result><!--修改请假单成功 界面 -->
<result name="app">/pages/leave/app_leave.jsp</result><!-- 审批请假单界面 -->
<result name="approve" type="redirect">/pages/common/success.jsp</result><!-- 审批请假单成功界面 -->
<result name="delete" type="redirect">/pages/common/del_success.jsp</result><!-- 删除成功界面 -->
<interceptor-ref name="paramsPrepareParamsStack"></interceptor-ref>
<interceptor-ref name="securityInterceptor"></interceptor-ref>
</action>
</package>
</struts>
模块对应数据库表:
4.2.1 程序实现
(LeaveAction.java):
public class LeaveAction extends BaseAction {
private static final long serialVersionUID = 1L;
private Leave leave;
private Integer id;
private PagerModel<Leave> pagerModel;
private String approve;
@Resource(name = "leaveService")
private LeaveService leaveService;
private String personNumber;
@Resource(name = "personService")
private PersonService personService;
@Override
public void prepare() throws Exception {
if(id != null){
leave = leaveService.findById(id);
}else{
leave = new Leave();
}
}
@Override
public Leave getModel() {
return leave;
}
public String findMyLeave() throws Exception {
int offset = 0;
try {
offset = Integer.parseInt(request.getParameter("pager.offset"));
} catch (RuntimeException e) {
}
Person person = ((User)session.get("login")).getPerson();
pagerModel = leaveService.find(new String[]{"person"}, new Object[]{person }, offset, PageSize.NORMAL);
return "findMyLeave";
}
@InputConfig(resultName = "saveInput")
public String save() throws Exception {
leaveService.saveOrUpdate(leave, ((User)session.get("login")).getPerson().getId());
session.put("notice", "添加请假单成功");
return "save";
}
public void validateSave() {
if(isNull(leave.getName())){
addFieldError("name", "请假单名称不能为空");
}
if(leave.getFirstDay() == null || leave.getLastDay() == null){
addFieldError("firstDay", "请假日期不能为空");
}
Calendar c1 = Calendar.getInstance();
c1.setTime(leave.getFirstDay());
Calendar c2 = Calendar.getInstance();
c2.setTime(leave.getLastDay());
if (!c1.before(c2)){
addFieldError("firstDay", "请假日期错误");
}
}
public String edit() throws Exception {
return "edit";
}
@InputConfig(resultName = "updateInput")
public String update() throws Exception {
leave.setStatus(Status.NEW);
leaveService.saveOrUpdate(leave);
session.put("notice", "修改请假单成功");
return "update";
}
public void validateUpdate() {
if(isNull(leave.getName())){
addFieldError("name"
展开阅读全文