苏州科技大学
电子信息与智能化实验中心
面向对象技术课程设计A 报告
——人事工资管理系统
专业年级 班 级 学 号 姓 名 成 绩 指导教师
计算机科学与技术(嵌入式培养)15级
嵌入式1511
[1**********]
[1**********]
[1**********] [1**********]
[1**********]
张梓轩
戚春阳
徐敏杰
袁祺林
王雨欣
丁 俊
2016年12月24日
注:如果按小组进行,需要此表,否则删除。
人事工资系统设计报告
1 课程设计任务概述
人事工资管理系统是非常通用的管理信息系统,一个公司必须要有健全的人事工资管理系统来管理员工的信息,才能实现它的日常运转。 因此,为了支持企业规范化的管理,高效率地完成人事的业务,需要实现包括员工的姓名、年龄、编号、电话号码等基本信息的建立,授予员工所能获取的权限,例如管理员权限,就可以对普通员工进行信息管理,其中包括新员工个人的基本信息资料的增加、修改,退休员工的信息的删除,员工奖惩信息的增加、删除和修改;此外还支持管理员对部门整体进行调薪,扩大了管理员的管理范围;
同时为了支持人事管理及其相关方面的科学决策,增加了员工的个人基本信息查询、薪资查询、奖惩情况查询和部门的总体情况查询等,大大提高了公司内部员工管理的效率,减少了不必要的精力的投入,使得企业的正常维护得以实现。
2 系统需求分析
2.1 系统功能分析
本系统主要是实现企业人事管理的系统化、规范化和自动化,实现数
据的录入、插入、删除、查询、统计、更新等功能。
具有员工注册以及登录的功能,且登录后管理员可修改自己用户权限; 大体分为以下四个主功能:
1. 人事管理系统:主要用来实现对员工的基本信息的增加、信息的删除、信息的修改以及模糊查询,还包括对员工的奖惩信息的增加,信息的删除,信息的修改以及信息的查询;
2. 工资管理系统:主要包括模糊查询部门信息、员工的总体以及个人工资信息,以及对部门的薪资进行整体调整的功能;
3. 统计管理系统:主要指用来显示部门的整体情况以及员工人数; 4. 系统设置系统:主要是用来对数据进行恢复和备份。
2.2 用例图及用例说明
2.2.1 用户注册用例
1. 用例名称: 注册
2. 用例描述: 注册成为本管理系统的用户 3. 角色: 用户
4. 前置条件: 格式输入正确 5. 后置条件: 保存此用户的信息
6. 基本路径: A.填写用户名和密码 B.保存用户信息 7. 扩展点: A.未填写完整或者格式错误 a1. 错误提示 B.用户已经存在 b1.错误提示
3 系统设计
3.1 系统类图
3.2 系统活动图
用户登陆活动图:
人事管理系统活动图:
统计管理系统活动图: 工资管理系统活动图:
系统设置管理活动图:
3.3 系统时序图
用户登陆时序图:
人事管理系统时序图:
工资管理系统时序图:
统计管理系统时序图:
系统设置管理时序图:
4 系统实现
4.1登录模块设计与实现
登录模块是用户登录进去进行相关操作的,如员工信息的增删改查等等。
(1)View 层代码
loginTitle = new javax.swing.JLabel(); jLabel1 = new javax.swing.JLabel(); jLabel2 = new javax.swing.JLabel(); uname = new javax.swing.JTextField(); pwd = new javax.swing.JPasswordField(); limit = new javax.swing.JComboBox(); jLabel3 = new javax.swing.JLabel(); loginBtn = new javax.swing.JButton(); registerBtn = new javax.swing.JButton(); jLabel4 = new javax.swing.JLabel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE );
setForeground(java.awt.Color.white ); setResizable(false ); setState(1);
loginTitle .setFont(new java.awt.Font("Microsoft YaHei UI" , 1, 44)); loginTitle .setHorizontalAlignment(javax.swing.SwingConstants.CENT ER );
loginTitle .setText("\u4eba\u4e8b\u5de5\u8d44\u7ba1\u7406\u7cfb\u7edf" );
jLabel1.setText("\u7528\u6237\u540d");
jLabel2.setText("\u5bc6 \u7801\uff1a");
//limit.setModel(javax.swing.DefaultComboBoxModel@187e702);
jLabel3.setText("\u6743 \u9650\uff1a");
loginBtn .setText("\u767b\u9646");
(2)Action 层
private void registerBtnActionPerformed(java.awt.event.ActionEvent evt) {
registerFrame r = new registerFrame(); r.setVisible(true ); }
{
private void loginBtnMouseClicked(java.awt.event.MouseEvent evt) } String name = this . uname .getText(); String pwd = this . pwd String limit = this . limit .getSelectedItem().toString(); int type = 0; if (" 管理员" .equals(limit)) { type = 1; usertype =" 管理员" ; } else { type = 2; usertype =" 普通员工" ; } User user = new User(name, pwd, type); User flag = userService .login(user); if (flag != null ) { wusername = name; wtype = limit; ok o = new ok(); o.setVisible(true ); setVisible(false ); } else { fail f = new fail(); f.setVisible(true ); dispose(); }
(3)Dao 数据交互层
@Override
public User login(User user) {
// TODO Auto-generated method stub
User resultUser=null ;
String sql = "select user_no,user_name,user_pwd,user_type" + " from t_user " +
" where user_name='"+user.getUserName()+"' " + " and user_pwd='"+user.getUserPwd()+"'" +
" and user_type="+user.getUserType()+"" ;
conn = JDBCUtil.getConnection (); try { stmt = conn .createStatement(); rs = stmt .executeQuery(sql); if (rs .next()){ resultUser = new User();
} resultUser.setUserNo(rs .getInt("user_no")); resultUser.setUserName(rs .getString("user_name")); resultUser.setUserPwd(rs .getString("user_pwd")); resultUser.setUserType(rs .getInt("user_type")); } } catch (SQLException e) { e.printStackTrace(); } finally { JDBCUtil. closeResource (conn , psmt , stmt , rs ); } return resultUser;
4.2系统主界面
可在该模块完成员工资料的常用操作。员工的各项人事记录可在选择员工后,在主界面下面的分栏里面进行添加、修改、删除操作。
4.3人事管理模块设计及实现
对员工的相关资料及记录进行管理。可在该模块对员工基本资料、奖惩记录、修改员工信息可实现对员工的调动、薪水记录进行修改。
当进入到人事管理子系统模块,再点击模糊查询。删除员工按钮,会进入到下面的界面
其中的模糊查询代码如下
(1)view 层
private void initComponents() {
jScrollPane1 = new javax.swing.JScrollPane();
jTable1 = new javax.swing.JTable();
jButton1 = new javax.swing.JButton();
jLabel1 = new javax.swing.JLabel();
jname = new javax.swing.JTextField();
jButton2 = new javax.swing.JButton();
jButton3 = new javax.swing.JButton();
jLabel2 = new javax.swing.JLabel();
jButton4 = new javax.swing.JButton();
jLabel3 = new javax.swing.JLabel();
jLabel4 = new javax.swing.JLabel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE );
jTable1.setModel(new javax.swing.table.DefaultTableModel( new Object[][] {
}, new String[] { " 姓名" , " 编号" , " 部门编号" , " 职称" , " 性别" , " 基本工资" ,
" 电话号码" , " 工号" }));
jScrollPane1.setViewportView(jTable1);
jButton1.setText("\u786e\u5b9a");
jButton1.addActionListener(new
java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
jLabel1
.setText("\u8bf7\u8f93\u5165\u59d3\u540d\uff0c\u652f\u6301\u6a21\u7cca\u67e5\u627e");
jname .setText(null );
jButton2.setText("\u9000\u51fa\u6a21\u7cca\u67e5\u627e"); jButton2.addActionListener(new
java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton2ActionPerformed(evt);
}
});
jButton3.setText("\u5237\u65b0");
jButton3.addActionListener(new
java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent
evt) {
jButton3ActionPerformed(evt);
}
});
jLabel2.setText("\u5237\u65b0\u540e\u53ef\u7ee7\u7eed\u67e5\u627e" );
jButton4.setText("\u5220\u9664\u6b64\u5458\u5de5");
jButton4.addActionListener(new
java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton4ActionPerformed(evt);
}
});
jLabel3
.setText("\u7a7a\u503c\u53ef\u67e5\u627e\u6240\u6709\u5458\u5de5" );
jLabel4
.setText("\u9700\u8981\u8f93\u5165\u5168\u540d\u53ef\u4ee5\u5220\u9664\u5458\u5de5");
public void findStaffName(JTable jTable, String name) {
DefaultTableModel model = (DefaultTableModel)
jTable.getModel();
model.setRowCount(0);
Vector v = staffInfoDao .findStaffInfo(name);
for (int i = 0; i
model.addRow((Vector) v.get(i));
}
}
(2)action 层
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
String name = jname .getText();
} if (name != null ) { staff .findStaffName(jTable1, name); } else { pleaseInput p = new pleaseInput(); p.setVisible(true ); }
(3)dao 层
public Vector findStaffInfo(String staffname) {
Vector list = new Vector();
String sql = "select *" + "from t_staff_info "
+ "where staff_name like'%" + staffname + "%'"; conn = JDBCUtil.getConnection ();
try {
stmt = conn .createStatement();
rs = stmt .executeQuery(sql);
while (rs .next()) {
Vector listObject = new Vector();
// listObject.add( new
// User(rs.getInt("id"),rs.getString("uname"),rs.getString("pwd")));
listObject.add(rs .getString("staff_name"));
listObject.add(rs .getInt("staff_id"));
listObject.add(rs .getInt("dept_no"));
listObject.add(rs .getString("staff_pos_name")); listObject.add(rs .getString("staff_sex"));
listObject.add(rs .getInt("staff_baseSal"));
listObject.add(rs .getInt("staff_phoneNum"));
listObject.add(rs .getString("staff_workNum")); list.add(listObject);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
JDBCUtil. closeResource (conn , psmt , stmt , rs );
}
return list; }
4.4 工资管理模块设计与实现
在员工基本信息管理界面里可以对单个员工进行基本工资的修改,因而在面向人数较多的企业时,这种方式存在弊端,部门整体调薪操作可以对整个业绩高的部门进行整体调薪
(1)view 层
private void initComponents() {
jButton1 = new javax.swing.JButton();
jLabel1 = new javax.swing.JLabel();
jdepart = new javax.swing.JTextField();
jButton2 = new javax.swing.JButton();
jLabel2 = new javax.swing.JLabel();
jScrollPane1 = new javax.swing.JScrollPane();
jTable1 = new javax.swing.JTable();
jLabel3 = new javax.swing.JLabel();
jdepart2 = new javax.swing.JTextField();
sure = new javax.swing.JButton();
jLabel4 = new javax.swing.JLabel();
money = new javax.swing.JTextField();
jLabel5 = new javax.swing.JLabel();
jLabel6 = new javax.swing.JLabel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE );
jButton1.setText("\u8fd4\u56de\u4e3b\u754c\u9762");
jButton1.addActionListener(new
java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
jLabel1
.setText("\u8bf7\u8f93\u5165\u90e8\u95e8\u540d\u53ef\u8fdb\u884c\u6a21\u7cca\u67e5\u627e");
jButton2.setText("\u786e\u5b9a");
jButton2.addActionListener(new
java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton2ActionPerformed(evt);
}
});
jLabel2
.setText("\u7ed9\u6307\u5b9a\u90e8\u95e8\u7684\u6240\u6709\u5458\u5de5\u8c03\u85aa");
jTable1.setModel(new javax.swing.table.DefaultTableModel( new Object[][] {
}, new String[] { " 部门编号" , " 部门名称" }));
jScrollPane1.setViewportView(jTable1);
jLabel3.setText("\u8f93\u5165\u5168\u540d\u9009\u5b9a\u90e8\u95e8" );
sure .setText("\u786e\u5b9a");
sure .addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) {
sureActionPerformed(evt);
}
});
jLabel4.setText("\u8f93\u5165\u8c03\u6574\u529b\u5ea6");
money .addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
moneyActionPerformed(evt);
}
});
jLabel5
.setText("\u6e29\u99a8\u63d0\u793a:\u63d0\u85aa\u5219\u8f93\u5165\u6b63\u6570,\u964d\u85aa\u5219\u8f93\u5165\u8d1f\u6570");
jLabel6.setText("\u5143");
(2)action 层
private void sureActionPerformed(java.awt.event.ActionEvent evt) { String jdept = jdepart2.getText();
Double money2 = Double.parseDouble (money .getText());
StaffInfo s=new StaffInfo();
s.num(staff .updateSalary(jdept,money2));
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
dispose();
}
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
String department = jdepart .getText();
if (department != null ) {
depart .findDepart(jTable1, department);
} else {
pleaseInput p = new pleaseInput();
p.setVisible(true );
}
}
(3)dao 层
public Vector findDepart(String name) {
Vector list = new Vector();
String sql = "select *" + "from t_department "
+ "where dept_name like'%" + name + "%'";
conn = JDBCUtil.getConnection ();
try {
stmt = conn .createStatement();
rs = stmt .executeQuery(sql);
while (rs .next()) {
Vector listObject = new Vector();
// listObject.add( new
// User(rs.getInt("id"),rs.getString("uname"),rs.getString("pwd")));
listObject.add(rs .getInt("dept_no"));
listObject.add(rs .getString("dept_name"));
list.add(listObject);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
JDBCUtil. closeResource (conn , psmt , stmt , rs );
}
return list; }
4.5 统计管理模块设计与实现
统计部门总数和各部门人数
(1)view 层
private void initComponents() {
jScrollPane1 = new javax.swing.JScrollPane(); jTable1 = new javax.swing.JTable(); jButton1 = new javax.swing.JButton(); jLabel1 = new javax.swing.JLabel();
jdepart = new javax.swing.JTextField(); jButton2 = new javax.swing.JButton();
jScrollPane3 = new javax.swing.JScrollPane(); jTable2 = new javax.swing.JTable(); jLabel2 = new javax.swing.JLabel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE );
jTable1.setModel(new javax.swing.table.DefaultTableModel( new Object[][] {
}, new String[] { " 员工编号" , " 员工姓名" , " 统计人数" })); jScrollPane1.setViewportView(jTable1);
jButton1.setText("\u786e\u5b9a"); jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt); } });
jLabel1
.setText("\u8bf7\u8f93\u5165\u90e8\u95e8\u540d\u8fdb\u884c\u6a21\u7cca\u67e5\u627e");
jdepart .addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jdepartActionPerformed(evt); } });
jButton2.setText("\u8fd4\u56de\u4e3b\u754c\u9762"); jButton2.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton2ActionPerformed(evt); } });
jTable2.setModel(new javax.swing.table.DefaultTableModel( new Object[][] {
}, new String[] { " 部门编号" , " 部门名称" })); jScrollPane3.setViewportView(jTable2);
jLabel2
.setText("\u8f93\u5165\u7a7a\u503c\u53ef\u67e5\u627e\u5168\u90e8\u5458\u5de5\u6240\u5728\u90e8\u95e8\u7684\u4fe1\u606f"); public void findDepart(JTable jTable, String name) {
DefaultTableModel model = (DefaultTableModel) jTable.getModel();
model.setRowCount(0);
Vector v = departDao .findDepart(name); for (int i = 0; i
@Override
public void showDepartNumber(JTable jTable, String name) { DefaultTableModel model = (DefaultTableModel) jTable.getModel();
model.setRowCount(0);
Vector v = departDao .showDepartNumber(name); for (int i = 0; i
(2)action 层
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
String depart2 = jdepart .getText();
if (depart2 != null ) {
d .showDepartNumber(jTable1, depart2); d .findDepart(jTable2, depart2);
} else {
pleaseInput p = new pleaseInput(); p.setVisible(true ); } }
(3)dao 层
public Vector findDepart(String name) { Vector list = new Vector();
String sql = "select *" + "from t_department " + "where dept_name like'%" + name + "%'";
conn = JDBCUtil.getConnection (); try {
stmt = conn .createStatement(); rs = stmt .executeQuery(sql); while (rs .next()) {
Vector listObject = new Vector(); // listObject.add( new //
User(rs.getInt("id"),rs.getString("uname"),rs.getString("pwd")));
listObject.add(rs .getInt("dept_no"));
listObject.add(rs .getString("dept_name")); list.add(listObject); }
} catch (SQLException e) {
// TODO Auto-generated catch block e.printStackTrace();
} finally {
JDBCUtil. closeResource (conn , psmt , stmt , rs ); }
return list; }
@Override
public Vector showDepartNumber(String name) { // TODO Auto-generated method stub Vector list = new Vector();
String sql = "select staff_id,staff_name from t_staff_info " +
"where dept_no in " +
"(select dept_no from t_department " + "where dept_name like '%"+name+"%')"; conn = JDBCUtil.getConnection (); try {
stmt = conn .createStatement(); rs = stmt .executeQuery(sql); int rowCount=0;
while (rs .next()) {
listObject = new Vector();
listObject .add(rs .getInt("staff_id"));
listObject .add(rs .getString("staff_name"));
//int rowCount = rs.last().getRow();//得到当前行号,也就是记录数
rowCount++;
list.add(listObject );
listObject .add(rowCount); }
} catch (SQLException e) {
// TODO Auto-generated catch block e.printStackTrace();
} finally {
JDBCUtil. closeResource (conn , psmt , stmt , rs ); }
return list; }
4.6 系统设置模块设计与实现
可以对数据库备份, 恢复,管理操作员,基础资料设置
.
其中数据备份和数据恢复的代码是
public void backUp(User user) {
// TODO Auto-generated method stub try {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("g:\\user.txt"));
oos.writeObject(user); oos.close();
backupok b=new backupok(); b.setVisible(true );
} catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace();
backupfalse b=new backupfalse(); b.setVisible(true ); } catch (IOException e) {
// TODO Auto-generated catch block e.printStackTrace();
backupfalse2 b=new backupfalse2(); b.setVisible(true ); } }
@Override
public User recOver() { User user=null ; try {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("g:\\user.txt"));
user=(User)ois.readObject(); ois.close();
recoverok r=new recoverok(); r.setVisible(true );
} catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace();
recoverfalse2 r=new recoverfalse2(); r.setVisible(true ); } catch (IOException e) {
// TODO Auto-generated catch block e.printStackTrace();
recoverfalse r=new recoverfalse(); r.setVisible(true );
} catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }
return user;
}
5 系统测试
测试1 系统登录测试:
步骤及操作:运行系统,转到登陆界面,输入账号及密码,选择用户类型,测试登陆功能。
允许偏差:不允许任何偏差
条件:用户即可,包括管理员和普通用户。
测试1 系统登录结果:
测试2 奖惩系统增加奖惩信息测试如下表所示:
在测试奖惩系统时,用户不存在提示界面
原因:不存在此员工。
6 课程设计总结
已经实现了数据备份,数据恢复。查询员工的登录信息,模糊查询,删除、增加、修改员工信息。显示所有员工工资,部门整体调薪,员工奖惩。显示各个部门和各个部门的人数。还没有实现对员工的请假管理,考评管理,以及操作日志管理相关功能。
经过老师的一步步地指导,我们一步步地完善自己的代码,使系统能够实现越来越多的功能。在实验的过程中,我们也会发现一些问题,比如:在数据库设计初时,在划分模块确定各实体及关系,也许是因为自己对人事管理不太了解,也许是因为自己对于数据库整体概念还是理解的不到位,所以迟迟不能确定该系统所设计相关的实体以及它们的关系,最后在查阅相关资料和老师的点拨下,我们克服了困难。
我觉得计算机语言最大的特点就是得靠我们认真务实,因为我们具备的计算机方面的基础知识太少,我们得边听边自学,这样既能培养我们的兴趣,又能学到实在的知识。通过课程设计我们进一步掌握了许多课本知识,同时还了解了许多课外的有关计算机语言的知识如数据库的有关知识,这对于我们来说受益匪浅。
7 参考文献
[1] 王国旭. 基于企业需求的人事管理系统的设计与实现[J]. 江西广播电视大学学报,2013,04:72-75.
[2] 张莹莹. 企业人事管理系统的设计与实现[D].吉林大学,2014. [3] 范雯芩. 人事工资管理系统的分析与设计[D].云南大学,2013.
[4] 李港港. 一个中小企业人力资源管理系统的设计与实现[D].华中科技大学,2012. [5] 常涛. 人事数据库管理系统研发背景和现状分析[J]. 电脑知识与技术,2014,07:1364-1365+1386.
[6] 萨维奇,施平安,李牧译. Java完美编程(第3版). 清华大学出版社,2008. [7] 陶永明. 企业人事管理系统设计[J]. 计算机与信息技术,2008,Z1:96-100. [8] Connolly,T.M.著,何玉洁 译. 数据库设计教程(第二版),2005. [9] 赵静. 人事档案管理系统分析[J]. 经营管理者,2013,30:285.