1、人事管理系统 一.系统需求分析: 2 (1) 系统功效设计 2 (2) 系统功效结构 2 (3) 数据库设计 2 二. 功效模块开发 3 (1) 查询人员信息界面 3 (2) 添加职员界面 3 (3) 修改职员信息界面 4 (4) 删除职员界面 5 (5) 职员考评界面 5 (6) 职员考评历史统计界面 6 三. 各个类说明 6 四. 程序代码 9 (1) Manager 9 (2) CardEmploy 11 (3) SelEmploy 12 (4) AddEmploy 14 (5) ReviseEmploy 16 i UpdDialog 18
2、 (6) DelEmploy 21 (7) AllEmploy 22 (8) Examine 23 (9) History 27 (10) EmployModel 28 (11) AppraisalModel 30 (12) SqlHelper 33 一.系统需求分析: (1) 系统功效设计 i 职员信息管理:职员信息管理包含对职员基础信息和情况进行查询、添加、删除和修改及部门管理 ii 职员考评管理:包含对职员考评情况进行操作,还能够对历史考评情况进行浏览 (2) 系统功效结构 人事管理系统结构功效结构图所表示: (3) 数据库设计 职员基础表(E
3、mployinfo) 名称 字段名称 数据类型 主键 非空 工号 Empno varchar(10) Yes Yes 姓名 Ename varchar(10) No yes 性别 Sex varchar(4) No yes 出生年月 Birthday Datetime No Yes 部门 DeptNo Char(10) No Yes 职务 Ejob Char(20) No Yes 工资 Sal float No Yes 职员考评表(Appraisal) 名称 字段名称 数据类型 主键 非
4、空 工号 Empno varchar(10) yes yes 考评 Consequence varchar(10) no yes 变更日期 RegDate datetime No Yes 考评历史统计(History) 名称 字段名称 数据类型 主键 非空 流水号 JourNo Int Yes yes 工号 Empno varchar(10) no yes 姓名 Ename varchar(10) No Yes 上次考评 OldInfo varchar(10) No Yes 此次考评 NewI
5、nfo varchar(10) No Yes 变更日期 RegDate datetime No Yes 二. 功效模块开发 (1) 查询人员信息界面 实例一个SelEmploy类,当点击“查询”时调用EmployModel类queryEmploy方法实现查询 (2) 添加职员界面 实例一个AddEmploy类当点击“添加”时调用EmployModel类updEmploy方法实现添加功效 (3) 修改职员信息界面 实例一个ReviseEmploy类当点击“修改”时,先调用UpdDialo弹跳出一个修改信息对话框,信息修改完成后
6、调用EmployModel类updEmploy方法实现修改功效 (4) 删除职员界面 实例一个DelEmploy类当点击“删除”时调用EmployModel类updEmploy方法实现删除功效 (5) 职员考评界面 实例一个Examine类当点击“确定”时调用AppraisalModel类updAppraisal方法来完成考评功效 (6) 职员考评历史统计界面 实例一个History类当点击时调用AppraisalModel类updAppraisal方法来完成考评功效 三. 各个类说明 类之间关系图: 1. Manager类 Manager类一个实
7、例,从而生成了人事管理系统界面,用JSplitPane类将整个界面分为左右两个部分。其中左侧实现了人事管理系统功效树,采取JTree类构建,同时实现了TreeSelectionListener接口,定义了该接口所必需实现valueChanged(TreeSelectionEvent e)方法,JSplitPane右边加入卡片布局CardEmploy类。当JTreeTreeSelectionEvent事件发生时,调用CardEmployc.show方法 切换不一样卡片,实现不一样管理界面。 2. CardEmploy类 CardEmploy为卡片布局类面板,关键功效是添加各个界面卡片,当
8、JTreeTreeSelectionEvent事件发生时。切换不一样卡片 3. EmployModel、AppraisalModel类 这两个类继承了AbstractTableModel,关键实现功效是,存放调用sqlhelper 类得到数据。能够经过调用sqlhelper实现 增 删 查 改 功效 4. SqlHelper类 关键就是连接数据库部分基础操作是,方便代码修改,反复使用 5. SelEmploy 这个类继承Panel,为“查询职员”界面。实现了Actionlistener 接口,当ActionEvent 事件发生时,调用EmployModel类queryEmpl
9、oy方法实现查询 6. AddEmploy、ReviseEmploy、DelEmploy类 这些类继承Pane,分别为“添加职员信息”“修改职员信息”“删除职员信息”界面, 这些类实现了Actionlistener 接口,当ActionEvent 事件发生时,调用EmployModel类updEmploy方法实现添加、查询、删除、功效 7. Examine类 这个类继承Panel,为“考评职员”界面。这个类实现了Actionlistener 接口,当ActionEvent 事件发生时,(1)先经过调用AppraisalModelqueryAppraisal获取上次考评成绩,(2)修
10、改Appraisal表考评成绩(3)再把上次考评成绩跟此次考评成绩加到History表中 8. History 这个类关键是把History表中信息显示到界面上。 四. 程序代码 (1) Manager package com.Manager; import java.awt.*; import javax.swing.*; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.tree.*
11、 import java.awt.event.*; public class Manager extends JFrame implements TreeSelectionListener { JPanel jp; JSplitPane js; JScrollPane jsp; JTree tree; DefaultMutableTreeNode root, t1, t2, t1_1, t1_2, t1_3, t1_4, t1_5, t2_1, t2_2; CardEmploy ae; EmployModel em; public st
12、atic void main(String[] args) { Manager manager = new Manager(); } public Manager() { // 给树各个结点赋值 root = new DefaultMutableTreeNode("人事管理系统"); t1 = new DefaultMutableTreeNode("基础信息管理"); t1_1 = new DefaultMutableTreeNode("查询职员"); t1_2 = new DefaultMutableTreeNode("添加职员");
13、 t1_3 = new DefaultMutableTreeNode("修改职员信息"); t1_4 = new DefaultMutableTreeNode("删除职员资料"); t1_5 = new DefaultMutableTreeNode("查询全体职员"); t2 = new DefaultMutableTreeNode("人员考评管理"); t2_1 = new DefaultMutableTreeNode("人员考评"); t2_2 = new DefaultMutableTreeNode("考评历史查询"); t1.add(t1_1
14、); t1.add(t1_2); t1.add(t1_3); t1.add(t1_4); t1.add(t1_5); t2.add(t2_1); t2.add(t2_2); root.add(t1); root.add(t2); tree = new JTree(root); // 对树进行监听 tree.addTreeSelectionListener(this); // 实例化CardEmploy面板 并加到jsplitpane边 ae = new CardEmploy(); js
15、 new JSplitPane(); js.setLeftComponent(tree); js.setRightComponent(ae); this.getContentPane().add(js); this.setTitle("人事管理系统"); this.setVisible(true); this.setSize(600, 500); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void valueChanged(TreeSelectionEv
16、ent e) { // 获取点击结点名称 DefaultMutableTreeNode dpath = (DefaultMutableTreeNode) tree .getLastSelectedPathComponent(); // 经过点击不一样结点切换不一样界面 if (dpath.equals(t1_1)) { ae.c.show(ae, "1"); } else if (dpath.equals(t1_2)) { ae.c.show(ae, "2"); } else if (dpath.equals(t1_3))
17、{ ae.c.show(ae, "3"); } else if (dpath.equals(t1_4)) { ae.c.show(ae, "4"); } else if (dpath.equals(t1_5)) { ae.c.show(ae, "5"); } else if (dpath.equals(t2_1)) { ae.c.show(ae, "6"); } else if (dpath.equals(t2_2)) { ae.c.show(ae, "7"); } } } (2) CardEmploy /**
18、 * 用卡片布局设置各个界面 */ package com.Manager; import javax.swing.*; import java.awt.*; public class CardEmploy extends Panel{ CardLayout c; //查询表 SelEmploy selE; //添加表 AddEmploy addE; //修改职员信息表 ReviseEmploy revE; //删除职员表格 DelEmploy delE; //全部职员
19、信息 AllEmploy allE; //职员考评表 Examine exaE; //历史统计界面 History His; public CardEmploy() { //查询职员表 selE = new SelEmploy(); //添加职员表 addE = new AddEmploy(); //修改职员信息 revE = new ReviseEmploy(); //删除职员表格
20、 delE = new DelEmploy(); //全部职员信息 allE =new AllEmploy(); //职员考评表 exaE = new Examine(); //历史统计界面 His = new History(); JPanel jp = new JPanel(); //定义cardemploy面板 为卡片布局 //把各个面板加入到C
21、卡片布局中 c = new CardLayout(); this.setLayout(c); this.add(selE,"1"); this.add(addE,"2"); this.add(revE,"3"); this.add(delE,"4"); this.add(allE,"5"); this.add(exaE,"6"); this.add(His,"7"); } } (3) SelEmploy /** * SelEmploy 类 设置查
22、询职员界面 */ package com.Manager; import java.awt.*; import javax.swing.*; import java.awt.event.*; public class SelEmploy extends Panel implements ActionListener { EmployModel em; JLabel jl; JTextField jtf; JButton jb; JTable jt; JScrollPane jsp; JPanel jp1; public SelEmplo
23、y() { // 北部 jp1 = new JPanel(); jl = new JLabel("输入职员号:"); jtf = new JTextField(20); jb = new JButton("查询"); // 对查询按钮监听 jb.addActionListener(this); jp1.add(jl); jp1.add(jtf); jp1.add(jb); // 中部 em = new EmployModel(); String[] paras = { "1" }; em.query
24、Employ("select * from Employinfo where 1 = ?", paras); jt = new JTable(em); jsp = new JScrollPane(jt); this.setLayout(new BorderLayout()); this.add(jp1, BorderLayout.NORTH); this.add(jsp, BorderLayout.CENTER); } public void actionPerformed(ActionEvent e) { if (e.getSource()
25、 == jb) { String name = this.jtf.getText().trim(); String sql = "select * from Employinfo where Empno = ?"; String[] paras = { name }; em = new EmployModel(); em.queryEmploy(sql, paras); // 查找成功更新表 jt.setModel(em); } } } (4) AddEmploy package com.Manager; i
26、mport java.awt.*; import javax.swing.*; import java.awt.event.*; public class AddEmploy extends Panel implements ActionListener { JLabel jl, jl1, jl2, jl3, jl4, jl5, jl6, jl7; JButton jb1, jb2; JTextField jtf1, jtf2, jtf3, jtf4, jtf5, jtf6, jtf7; JPanel jp1, jp2, jp3, jp4; EmployM
27、odel em; public AddEmploy() { jl1 = new JLabel("工号:"); jl2 = new JLabel("姓名:"); jl3 = new JLabel("性别:"); jl4 = new JLabel("出生年月:"); jl5 = new JLabel("部门:"); jl6 = new JLabel("职位:"); jl7 = new JLabel("工资:"); jtf1 = new JTextField(20); jtf2 = new JTextField(20); j
28、tf3 = new JTextField(20); jtf4 = new JTextField(20); jtf5 = new JTextField(20); jtf6 = new JTextField(20); jtf7 = new JTextField(20); jb1 = new JButton("添加"); jb2 = new JButton("取消"); // 监听‘添加’ ‘取消’按钮 jb1.addActionListener(this); jb2.addActionListener(this); jp1 = n
29、ew JPanel(new GridLayout(7, 1)); jp2 = new JPanel(new GridLayout(7, 1)); jp3 = new JPanel(); jp1.add(jl1); jp1.add(jl2); jp1.add(jl3); jp1.add(jl4); jp1.add(jl5); jp1.add(jl6); jp1.add(jl7); jp2.add(jtf1); jp2.add(jtf2); jp2.add(jtf3); jp2.add(jtf4); jp2
30、add(jtf5); jp2.add(jtf6); jp2.add(jtf7); jp3.add(jb1); jp3.add(jb2); jp4 = new JPanel(new BorderLayout()); jp4.add(jp1, BorderLayout.WEST); jp4.add(jp2, BorderLayout.EAST); jp4.setSize(300, 300); this.setLayout(new FlowLayout()); this.add(jp4); this.add(jp
31、3); } public void actionPerformed(ActionEvent e) { if (e.getSource() == jb1) { // 调用EmployModel 里updEmploy 方法,实现对表格添加 String sql = "insert into Employinfo values(?,?,?,?,?,?,?)"; String[] paras = { jtf1.getText(), jtf2.getText(), jtf3.getText(), jtf4.getText(), jtf5.getT
32、ext(), jtf6.getText(), jtf7.getText() }; em = new EmployModel(); if (em.updEmploy(sql, paras)) { // 当添加新职员成功时,则弹出”添加成功“对话框 JOptionPane.showMessageDialog(this, "添加成功"); } else if (!em.updEmploy(sql, paras)) { JOptionPane.showMessageDialog(this, "添加失败"); }
33、// 当新职员加入成功后,要把新加入职员工号加到考评表 AppraisalModel temp = new AppraisalModel(); String sql1 = "insert into Appraisal(Empno) values(?)"; String[] paras1 = { jtf1.getText() }; temp.updAppraisal(sql1, paras1); }else if(e.getSource() == jb2){ jtf1.setText(""); jtf2.setText("");
34、jtf3.setText(""); jtf4.setText(""); jtf5.setText(""); jtf6.setText(""); jtf7.setText(""); } } } (5) ReviseEmploy package com.Manager; /** * 修改职员界面 */ import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ReviseEmploy extends Panel i
35、mplements ActionListener { JTable jt; JScrollPane jsp; JButton jb1, jb2; JPanel jp1,jp2; EmployModel em; JLabel jl1; public ReviseEmploy() { jl1 = new JLabel("修改职员信息",JLabel.CENTER); jl1.setFont(new Font("宋体", Font.BOLD, 28)); jp2 = new JPanel(); jp2.add(jl1); em
36、 new EmployModel(); String[] paras = { "1" }; em.queryEmploy("select * from Employinfo where 1 = ?", paras); jt = new JTable(em); jsp = new JScrollPane(jt); jb1 = new JButton("修改"); jb2 = new JButton("刷新"); // 对两个按钮进行监听 jb1.addActionListener(this); jb2.addActionListener
37、this); this.setLayout(new BorderLayout()); jp1 = new JPanel(); jp1.add(jb1); jp1.add(jb2); this.add(jp2,BorderLayout.NORTH); this.add(jsp, BorderLayout.CENTER); this.add(jp1, BorderLayout.SOUTH); } public void actionPerformed(ActionEvent e) { if (e.getSource()
38、 jb1) { int rowNum = this.jt.getSelectedRow(); if (rowNum == -1) { JOptionPane.showMessageDialog(this, "请选择一行"); return; } // 弹出修改对话框 new UpdDialog(em, rowNum); } else if (e.getSource() == jb2) { // 刷新修改界面中表格 em = new EmployModel(); String[] paras
39、1 = { "1" }; em.queryEmploy("select * from Employinfo where 1 = ?", paras1); jt.setModel(em); } } } i UpdDialog package com.Manager; /** * 弹出修改界面 */ import javax.swing.*; import java.awt.*; import java.awt.event.*; public class UpdDialog extends JDialog implements Acti
40、onListener { JLabel jl1, jl2, jl3, jl4, jl5, jl6, jl7; JButton jb1, jb2; JTextField jtf1, jtf2, jtf3, jtf4, jtf5, jtf6, jtf7; JPanel jp1, jp2, jp3; public UpdDialog(EmployModel em, int rowNums) { jl1 = new JLabel("工号:"); jl2 = new JLabel("姓名:"); jl3 = new JLabel("性别:"); jl4 =
41、 new JLabel("出生年月:"); jl5 = new JLabel("部门:"); jl6 = new JLabel("职位:"); jl7 = new JLabel("工资:"); jtf1 = new JTextField(20); jtf2 = new JTextField(30); jtf3 = new JTextField(30); jtf4 = new JTextField(30); jtf5 = new JTextField(30); jtf6 = new JTextField(30); jtf7 = ne
42、w JTextField(30); // 初始化jtextfield数据 jtf1.setText((String) em.getValueAt(rowNums, 0)); jtf1.setEditable(false); jtf2.setText((String) em.getValueAt(rowNums, 1)); jtf3.setText((String) em.getValueAt(rowNums, 2)); jtf4.setText((String) em.getValueAt(rowNums, 3)); jtf5.setText((S
43、tring) em.getValueAt(rowNums, 4)); jtf6.setText((String) em.getValueAt(rowNums, 5)); jtf7.setText((String) em.getValueAt(rowNums, 6)); jb1 = new JButton("修改"); jb2 = new JButton("取消"); // 对两个按钮监听 jb1.addActionListener(this); jb2.addActionListener(this); jp1 = new JPanel
44、); jp2 = new JPanel(); jp3 = new JPanel(); // 设置布局 jp1.setLayout(new GridLayout(7, 1)); jp2.setLayout(new GridLayout(7, 1)); // 添加组件 jp1.add(jl1); jp1.add(jl2); jp1.add(jl3); jp1.add(jl4); jp1.add(jl5); jp1.add(jl6); jp1.add(jl7); jp2.add(jtf1); jp
45、2.add(jtf2); jp2.add(jtf3); jp2.add(jtf4); jp2.add(jtf5); jp2.add(jtf6); jp2.add(jtf7); jp3.add(jb1); jp3.add(jb2); this.add(jp1, BorderLayout.WEST); this.add(jp2, BorderLayout.CENTER); this.add(jp3, BorderLayout.SOUTH); this.setSize(300, 250); this.setVisib
46、le(true); this.setLocation(200, 200); this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { dispose(); } }); } public void actionPerformed(ActionEvent e) { if (e.getSource() == jb1) { // 修改职员信息 sql 语句,paras 为待注入值 String sql =
47、 "update Employinfo set " + "Ename = ?,Sex = ?,Birthday = ?, DeptNo = ?, Ejob = ? ,Sal=? where Empno = ?"; String[] paras = { jtf2.getText(), jtf3.getText(), jtf4.getText(), jtf5.getText(), jtf6.getText(), jtf7.getText(), jtf1.getText() }; EmployModel temp = new EmployM
48、odel(); // 假如修改语句运行成功 则弹出“修改成功”对话框 if (temp.updEmploy(sql, paras)) { JOptionPane.showMessageDialog(this, "修改成功"); } this.dispose(); } else if (e.getSource() == jb2) { // 关闭对话框 this.dispose(); } } } (6) DelEmploy /** * 删除职员 */ package com.Manager;
49、 import javax.swing.*; import java.awt.*; import java.awt.event.*; public class DelEmploy extends Panel implements ActionListener { JTable jt; JScrollPane jsp; JButton jb1, jb2; JPanel jp1, jp2; JLabel jl1; EmployModel em; public DelEmploy() { // 北部 jl1 = new JLabel("删
50、除职员", JLabel.CENTER); jl1.setFont(new Font("黑体", Font.BOLD, 30)); jp2 = new JPanel(); jp2.add(jl1); // 中部 em = new EmployModel(); String[] paras = { "1" }; em.queryEmploy("select * from Employinfo where 1 = ?", paras); jt = new JTable(em); jsp = new JScrollPane(jt);






