老师布置了第二个JAVA作业,让写人事管理系统。
代码思路参考自:清华大学出版设出版的《Java课程设计案例精编(第3版)》
作业是老师在十月一日哦放假前让写的,所以十一回家写了俩界面,然后回到学校老师说先
不做这个,先写一个订餐系统,后来为了参加十一月的区域赛就搁置了这个作业,参加完
区域赛白天还要练题没怎么写,都是晚上快睡觉的时候写了几个界面,断断续续把界面写完
了,这周五、周六一鼓作气把这个给写完了,正好周一上课老师检查。
项目下载地址:https://github.com/wenyaxinluoyang/HRManagement
项目运行环境:
jdk 1.8.0_141
mysql 5.5.27
关于项目几个问题:
1.是否可以把项目发到邮箱?
答:没法发,原因两点,这个代码两三年前写的,那么久远,现在我都毕业工作了,电脑也换了,我没这个代码。
2.关于github的,没有账号的。
答:个知识个代码托管的地方,我记忆中注册好像不需要翻墙,直接去注册就好了,然后去下载代码,
不知道怎么下载,百度一下就好,这些操作都特别简单。
3.关于问题,你的项目在我的环境能够成功运行?
答:纠正一点这个项目下载后一定要配备我说的环境,而不是在你的环境运行。
举个例子:工作的时候,技术总监已经说了我们开发项目要用哪个版本的jdk,框架spring用哪个版本,
我们工作人员也按照要求进行开发,然后可以成功运行我们的代码。当我们把项目部署到服务器的时候,
我们服务器的环境配置的和开发环境是会保持一致的,然后我们的代码才能有最大的可能不发生问题跑起来,
我们绝不会任由喜爱,在服务器上随便安装与开发时候不相同的版本的东西,然后对开发人员说,你的代码
要在这个环境中跑起来。时间推移,版本更新,里面的某些内容发生了改变,万一了以前版本的代码不兼容,
代码将永远跑不起来。
我上学的时候jdk发展到1.8,1.9我们大部分都用1.8
现在,写文章时间为2019.06.23,jdk现在版本发展到1.12, 1.11,可以看到和项目开发时的版本相差
很大了。同样项目中使用的mysql等工具,经过几年的发展,版本更新很快,版本跨度这么大,已经出现
了兼容问题。好多使用我代码的人,配置了较高版本的jdk,结果界面无法显示,都是jdk太高导致的。
4.关于数据库链接问题?
改数据库连接对应的用户名和密码,要到DataOperator中修改。
项目使用mysql作为数据库。如果你更换成sqlserver或oracle,那么数据库驱动也要修改为sqlserver或
oracle的驱动,如果mysql用了与项目不同的版本,请记得修改驱动的对应版本。
5.运行代码时无法显示问题
这个是根据很多人遇到反应的,问题所在jdk版本过高,出现对旧版本代码的兼容问题。
解决方案,换成1.8.0_141或比他不要高太多的版本。
6.关于数据库(指用mysql)改了用户名和密码还报错的。
这是最近一个同学新遇到的问题,我之前没见过。改了用户名和密码后,还提示无法连接数据库,
数据库驱动版本也对,是因为高版本的驱动对应数据库连接的写法与低版本的不同,直接百度
抛出的异常,然后根据网上经验修改连接。
7.关于无法修改员工部门的问题
我代码的bug,在PersonBean中修改员工信息的update语句中我忘记写部门了,大家可以自行加上。
8.建议
建议从下载到环境配置到项目导入自己完成,包括驱动,一切前期工作自己完成。然后认真看
一下代码,代码逻辑非常简单,核心代码就是数据库操作,jdbc编程都是固定格式的,看一个
能明白其他的。然后出现什么问题了可以在留言询问了。本来我在评论区留了我的QQ号,
说起来真是后悔,有些同学什么都不管,每一步都希望我告诉他,包括下载和eclipse导入项目
之类的基本操做,让我觉得有点难以接受。甚至我在上班的时候,在外面朋友聚会的时候都在
QQ上回复大家遇到的问题,我有时会气得都锤桌子了,真的不能什么都依靠作者,自己一点
脑子都不想动。
人事管理系统功能简介:
人事管理系统主要用来实现各种人事管理功能,这些功能包括人员基本信息管理,部门
管理,人员调动管理,人员考核管理以及劳资管理这些模块。
系统功能图:
数据库设计:
员工信息表:Person
未使用员工编号表:unUsedPersonId
部门信息表:DeptTable
未使用部门编号表:unUsedDeptId
人员调动历史表:jobChange
人员考核历史表:assessChange
劳资历史记录表:salaryChange
系统主界面图:(HrMain.java)
可以发现主界面是两个分离面板,将左侧的树形结构和右侧的面板隔开。左侧的树形结构清晰地
表示出了该系统地功能。设计该界面左侧是一个树,人事管理系统是树根root,然后有四个一级节点,
接下来是若干个二级节点(叶子节点)。该界面主要响应的事件有,当点击根节点的时候,显示图中
右侧界面,当点击一级节点的时候,如果该节点没有展开,则先展开该节点。当点击叶子节点的时候
将相应的面板显示在右侧区域中。
1.基本信息管理模块:实现对人员信息的增删查该操作,以及对部门的增删查改操作。
1.1 添加人员信息界面(NodeOnePanelOne.java)
该模块主要实现添加员工信息功能,当点击获取新编号按钮的时候,清空所有文本框,并为欲添加的人员
自动分配一个编号。点击添加按钮的时候,首先判断数据库中不能为空的字段在文本框中是否为空,如果
为有是空的值则拒绝插入,否则插入到Person,并弹出提示信息信息插入成功。
1.2 修改人员信息界面(NodeOnePanelTwo.java)
该模块用来实现信息修改功能,首先通过在Person中查找,将人员的编号和姓名等信息绑定到选择人员信息
下拉列表,然后可以选择人员,选中某个人员后从Person中将该人员的基本信息查找出来,并在文本框显示。
对于性别、出生年月、民族这三个信息由于在通常情况下不常变动,则设置文本框不可修改,其他信息可以
进行修改,点击修改按钮的时候,同样要进行信息的检测,看信息输入是否正确,如果正确则更新表中对应
的记录,否则拒绝更新,点击清空按钮的时候,清空所有文本框内的内容。
1.3 删除人员信息界面(NodeOnePanelThree.java)
该模块用来实现删除员工记录的功能,首先在右侧面板初始化的时候,我们先从Person中查找需要的信息
并显示在右侧,当点中界面中表的一条记录时,将该员工的信息显示在下部文本框中,当点击删除按钮
的时候,删除该记录,并刷新界面。
1.4 查询人员信息界面(NodeOnePanelFour.java)
该界面和上个界面相似,就是将所有员工的信息显示在界面上。
1.5 部门管理界面(NodeOnePanelFive.java)
该界面可以实现部门的增删查改功能。初始化面板的时候,将DeptTable总的所有信息绑定到该界面上,
当点击获取新编号的时候,清空文本框,给欲添加的部门分配一个编号,当点击添加按钮的时候,需要
检测信息输入是否合法。当选中表中的一条记录,将该部门的信息显示在下部文本框中,然后可以对一级
部门和二级部门进行修改,当点击修改按钮的时候,检测信息是否合法,合法则修改并提示用户修改成功,
否则拒绝修改,如果修改成功,则该界面也需要跟着刷新。当点击删除按钮的时候,由于数据库中表的级
联关系, 如果Person表中还有对应部门的员工,则不允许删除,否则可以删除。当点击清空按钮的时候,
清空所有文本框内的内容。
2.人员调动模块:实现对人员工作的调动以及对调动历史的查询。
2.1人员调动:(NodeTwoPanelOne.java)
该模块实现人员部门的调动,从Person表中查询图中字段相应的信息并显示,并从DeptTable表中查询所有
部门并将这些部门绑定到新部门下拉列表框中,选择调入新部门后,更新Person表中的信息,并且将该调动
记录添加到jobChange表中。
2.2调动历史查询(NodeTwoPanelTwo.java)
该界面从jobChange表中读出所有信息并在界面上显示。
3.人员考核管理模块:实现对员工工作的考核,并显示考核记录。
3.1人员考核(NodeThreePanelOne.java)
同样从Person表中取出图中相应的信息并在面板上显示,当选择一条记录的时候,将其信息在下方文本框
显示,点击确定按钮的时候,将Person表中的相关信息更新,并将该考核记录插入assessChange表中。
3.2考核历史查询(NodeThreePanelTwo.java)
该界面将assessChange表的内容进行显示。
4.劳资管理:用来实现员工工资的调整和劳资历史的查询。
4.1劳资分配管理(NodeFourPanelOne.java)
该模块用来实现员工工资的调整,同样从Person中取出相应的信息并生成表格显示在界面上,当选中一条记录
时,将该记录的信息在下方文本框中显示,点击确定按钮后,更新Person中的信息,弹出修改提示,并将该劳资
历史插入到salaryChange表中。
4.2劳资历史查询(NodeFourPanelTwo.java)
从salaryChange表中取出所有信息在界面上显示。
项目代码:
主界面(HrMain.java)
package HRPackage;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.ResultSet;
import javax.swing.*;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;
import DataOperator.Database;
import JobTransfer.*;
import LaborManagement.*;
import PersonAccess.*;
/**
* 人事管理系统的主界面
* @author YaXin Wen
* @date 2017/10/2
*/
public class HrMain extends JFrame implements ActionListener, TreeSelectionListener {
//框架的大小
Dimension facesize = new Dimension(1200,900);
//程序左上角图标
ImageIcon icon;
//建立界面左侧JTree菜单
JTree tree;
DefaultMutableTreeNode root; //根节点,人事管理系统
DefaultMutableTreeNode node1; //一级节点,基本信息管理
DefaultMutableTreeNode node2; //一级节点,人员调动管理
DefaultMutableTreeNode node3; //一级节点,人员考核管理
DefaultMutableTreeNode node4; //一级节点,劳资管理
DefaultMutableTreeNode leafnode; //叶子节点
TreePath treePath;
//建立右侧操作区域,整个界面由两个分离面板构成
public static JSplitPane splitPane;
JPanel panel1;
JPanel panel2;
JPanel panel3;
JPanel panel4;
JLabel welcome = new JLabel(); //用来显示欢迎信息
JScrollPane scrollPane; //滚动面板
/**
* 构造函数,完成对象的初始化工作
*/
public HrMain() {
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
//添加框架的关闭事件处理
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.pack();
this.setSize(facesize); //设置窗体大小
this.setLocation(400, 50); //设置窗体初始位置
this.setVisible(true); //设置窗体可见
this.setTitle("人事管理系统"); //设置窗体标题
this.setResizable(false); //设置窗体大小不可变
//设置窗体左上角图标
icon = new ImageIcon("image\\computer.png");
this.setIconImage(icon.getImage());
try {
Init(); //控件布局。
}catch (Exception ex) {
ex.printStackTrace();
}
}
/**
* 初始化函数,完成界面的初始化工作
* @param 无参数
*/
private void Init() throws Exception {
//将各个子节点,添加到root上去。
root = new DefaultMutableTreeNode("人事管理系统");
//实例化root的四个子节点。
node1 = new DefaultMutableTreeNode("基本信息管理");
node2 = new DefaultMutableTreeNode("人员调动管理");
node3 = new DefaultMutableTreeNode("人员考核管理");
node4 = new DefaultMutableTreeNode("劳资管理");
//基本信息管理上添加5个子节点
leafnode = new DefaultMutableTreeNode("添加人员信息");
node1.add(leafnode);
leafnode = new DefaultMutableTreeNode("修改人员信息");
node1.add(leafnode);
leafnode = new DefaultMutableTreeNode("删除人员信息");
node1.add(leafnode);
leafnode = new DefaultMutableTreeNode("查询人员信息");
node1.add(leafnode);
leafnode = new DefaultMutableTreeNode("部门管理");
node1.add(leafnode);
//基本信息管理节点添加到根节点上。
root.add(node1);
//人员调动管理上添加两个子节点。
leafnode = new DefaultMutableTreeNode("人员调动");
node2.add(leafnode);
leafnode = new DefaultMutableTreeNode("调动历史查询");
node2.add(leafnode);
//将人员调动管理节点添加到根节点上
root.add(node2);
//人员考核管理模块子功能
leafnode = new DefaultMutableTreeNode("人员考核");
node3.add(leafnode);
leafnode = new DefaultMutableTreeNode("考核历史查询");
node3.add(leafnode);
//人员考核管理节点添加到根节点上。
root.add(node3);
//劳资管理模块子功能
leafnode = new DefaultMutableTreeNode("劳资分配管理");
node4.add(leafnode);
leafnode = new DefaultMutableTreeNode("劳资历史查询");
node4.add(leafnode);
//劳资管理节点添加到根节点上。
root.add(node4);
//生成左侧的JTree,并且该树以root为根。
tree = new JTree(root);
//将树添加到滚动面板上
scrollPane = new JScrollPane(tree);
//设置滚动面板的大小。
scrollPane.setPreferredSize(new Dimension(200,850));
tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
//生成JPanel,panel1盛装左侧控件,
panel1 = new JPanel();
panel2 = new JPanel();
panel3 = new JPanel();
panel1.add(scrollPane); //在此,左边界面设计完毕。
//开始设计右部界面。
welcome.setText("欢迎使用人事管理系统"); //显示欢迎信息
panel3.add(welcome);
splitPane = new JSplitPane();
splitPane.setOneTouchExpandable(false);
splitPane.setContinuousLayout(true);
splitPane.setPreferredSize(new Dimension(1100,900));
//间隔方式是水平摆放间隔
splitPane.setOrientation(JSplitPane.HORIZONTAL_SPLIT);
//功能树位于界面左侧
splitPane.setLeftComponent(panel1);
//相应功能对应的面板位于分离面板的右侧。
splitPane.setRightComponent(panel3);
splitPane.setDividerSize(2);
splitPane.setDividerLocation(200);
this.setContentPane(splitPane);
this.setVisible(true);
//为左侧的tree添加事件监听器。
tree.addTreeSelectionListener(this);
}
@Override
/**
* 点击不同的节点,右侧显示不同的面板
*/
public void valueChanged(TreeSelectionEvent e) {
// TODO Auto-generated method stub
DefaultMutableTreeNode currentNode = (DefaultMutableTreeNode)e.getPath().getLastPathComponent();
//System.out.println("nodeText = " + currentNode);
String nodeText = currentNode.toString();
//如果当前选择的节点是root,人事管理系统,右侧面板是初始模样
if(nodeText == "人事管理系统") {
splitPane.setRightComponent(panel3);
}
else if(nodeText == "基本信息管理") {
/* 当点击基本信息管理节点的时候,如果此节点处于
* 关闭状态,则将其自动展开,用此代码实现节点自动展开。
*/
treePath = new TreePath(node1.getPath());
if(tree.isExpanded(treePath)) {
tree.collapsePath(treePath);
}
else {
tree.expandPath(treePath);
}
}
else if (nodeText == "添加人员信息") {
NodeOnePanelOne nodepanel11 = new NodeOnePanelOne();
splitPane.setRightComponent(nodepanel11);
}
else if(nodeText == "修改人员信息") {
NodeOnePanelTwo nodepanel12 = new NodeOnePanelTwo();
splitPane.setRightComponent(nodepanel12);
}
else if(nodeText == "删除人员信息") {
NodeOnePanelThree nodepanel13 = new NodeOnePanelThree();
splitPane.setRightComponent(nodepanel13);
}
else if(nodeText == "查询人员信息") {
NodeOnePanelFour nodepanel14 = new NodeOnePanelFour();
splitPane.setRightComponent(nodepanel14);
}
else if(nodeText == "部门管理") {
NodeOnePanelFive nodepanel15 = new NodeOnePanelFive();
splitPane.setRightComponent(nodepanel15);
}
else if(nodeText == "人员调动") {
NodeTwoPanelOne nodePanel21 = new NodeTwoPanelOne();
splitPane.setRightComponent(nodePanel21);
}
else if(nodeText == "调动历史查询") {
NodeTwoPanelTwo nodePanel22 = new NodeTwoPanelTwo();
splitPane.setRightComponent(nodePanel22);
}
else if(nodeText == "人员考核") {
NodeThreePanelOne nodePanel31 = new NodeThreePanelOne();
splitPane.setRightComponent(nodePanel31);
}
else if(nodeText == "考核历史查询") {
NodeThreePanelTwo nodePanel32 = new NodeThreePanelTwo();
splitPane.setRightComponent(nodePanel32);
}
else if(nodeText == "劳资分配管理") {
NodeFourPanelOne nodePanel41 = new NodeFourPanelOne();
splitPane.setRightComponent(nodePanel41);
}
else if(nodeText == "劳资历史查询") {
NodeFourPanelTwo nodePanel42 = new NodeFourPanelTwo();
splitPane.setRightComponent(nodePanel42);
}
}
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
}
public static void main(String[] args) throws Exception{
HrMain hr = new HrMain();
/**Database db = new Database();
db.OpenConn();
//String sql = "insert into DeptTable(DeptId,FatherDept,SonDept) values('3','办公室','机要科')";
String sql = "select * from DeptTable";
int number = db.RecordNumber(sql);
System.out.println(number);
db.closeStmt();
db.closeConn();
*/
}
}
1.基本信息管理模块:
1.1添加人员信息(NodeOnePanelOne.java)
package HRPackage;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import DataOperator.DeptBean;
import DataOperator.PersonBean;
/**
* 每个节点对应一个面板,这些面板按照父节点、子节点进行编号。
* 1号节点下的1号子节点,其面板命名为NodeOnePanelOne.
* @author Yaxin Wen
* @date 2017/10/2
*
*/
public class NodeOnePanelOne extends JPanel implements ActionListener, ItemListener {
//界面分为两部分,上部分用来显示该模块的作用
JPanel upPanel = new JPanel();
//中部用来让用户执行相应的操作,来满足自己的需求。
JPanel centerPanel = new JPanel();
//定义界面标签
JLabel title = new JLabel("增加人员信息"); //说明文字,表明该模块的功能
JLabel pIdLabel = new JLabel(); //员工编号
JLabel pNameLabel = new JLabel(); //员工姓名
JLabel pSexLabel = new JLabel(); //员工性别
JLabel pBirthDateLabel = new JLabel(); //出生年月
JLabel pNationLabel = new JLabel(); //民族
JLabel pAddressLabel = new JLabel(); //地址
JLabel pDepartmentLabel = new JLabel(); //部门
JLabel pOtherLabel = new JLabel(); //其他
//定义界面需要的文本框
JTextField pIdText = new JTextField(15); //用来显示或填写员工编号
JTextField pNameText = new JTextField(30); //用来显示或填写员工姓名
JTextField pSexText = new JTextField(15); //用来显示或填写员工性别
JTextField pBirthDateText = new JTextField(30); //用来显示或填写出生年月
JTextField pNationText = new JTextField(15); //用来显示或填写民族
JTextField pAddressText = new JTextField(30); //用来显示或填写地址
JTextField pOtherText = new JTextField(30); //用来显示或填写其他信息
JComboBox pDepartmentCombo = null; //用来选择部门信息
//两个按钮,用来添加信息和清空信息。
//该按钮用来为新增加的员工分配编号
JButton getNewIdButton = new JButton("获取新编号");
//该按钮用来执行添加员工信息的操作
JButton addInfoButton = new JButton("添 加");
//该按钮用来完成清空文本框的操作
JButton clearInfoButton = new JButton("清 空");
JScrollPane jScrollPane1 = new JScrollPane();
String Did = "0"; //员工所属部门编号
String Salary = "0"; //员工工资
String Assess = "未考核"; //员工烤鹅
//使用网格布局。
GridBagLayout gridBag = new GridBagLayout();
GridBagConstraints gridBagCon;
/**
* 构造函数完成对象的初始化工作
*/
public NodeOnePanelOne() {
this.setLayout(new BorderLayout());
try {
jScrollPanelInit(); //中部面板
panelInit(); //上部面板
addListener(); //为控件添加监听器
}catch (Exception ex) {
ex.printStackTrace();
}
}
public void jScrollPanelInit() throws Exception {
//设置面板的布局为网格布局。
centerPanel.setLayout(gridBag);
//将“人员编号”这个标签添加到面板的指定位置
gridBagCon = new GridBagConstraints();
pIdLabel.setText("人 员 编 号 :");
pIdLabel.setFont(new Font("Dialog",0,15));
gridBagCon.gridx = 0;
gridBagCon.gridy = 1;
gridBagCon.insets = new Insets(0,10,10,1);
gridBag.setConstraints(pIdLabel,gridBagCon); //把标题放到相应的位置
centerPanel.add(pIdLabel);
//添加用来填写人员编号的文本框到面板上
gridBagCon = new GridBagConstraints();
gridBagCon.gridx = 1;
gridBagCon.gridy = 1;
gridBagCon.insets = new Insets(0,1,10,15);
gridBag.setConstraints(pIdText, gridBagCon);
centerPanel.add(pIdText);
//添加人员姓名标签
gridBagCon = new GridBagConstraints();
pNameLabel.setText("人 员 姓 名 :");
pNameLabel.setFont(new Font("Dialog",0,15));
gridBagCon.gridx = 2;
gridBagCon.gridy = 1;
gridBagCon.insets = new Insets(0,15,10,1);
gridBag.setConstraints(pNameLabel, gridBagCon);
centerPanel.add(pNameLabel);
//添加显示人员姓名的文本框
gridBagCon = new GridBagConstraints();
gridBagCon.gridx = 3;
gridBagCon.gridy = 1;
gridBagCon.insets = new Insets(0,1,10,10);
gridBag.setConstraints(pNameText, gridBagCon);
centerPanel.add(pNameText);
//添加性别标签
gridBagCon = new GridBagConstraints();
pSexLabel.setText("性 别 :");
pSexLabel.setFont(new Font("Dialog",0,15));
gridBagCon.gridx = 0;
gridBagCon.gridy = 2;
gridBagCon.insets = new Insets(15,10,10,1);
gridBag.setConstraints(pSexLabel, gridBagCon);
centerPanel.add(pSexLabel);
//添加填写性别文本框
gridBagCon = new GridBagConstraints();
gridBagCon.gridx = 1;
gridBagCon.gridy = 2;
gridBagCon.insets = new Insets(15,1,10,15);
gridBag.setConstraints(pSexText, gridBagCon);
centerPanel.add(pSexText);
//添加出生年月文本标签
gridBag