简易人力资源管理系统(NetBeans+SQLServer)

人力资源管理系统源文件

将NetBeans下的web项目转到eclipse中

在这里插入图片描述

一、题目

  • 人力资源部门希望建立一个数据库来管理它的员工。一个公司有几个部门,而一个员工属于一个部门。这个部门指派一个经理来全面负责部门事务和部门员工。但为了有助于管理好部门工作,某些工作人员被任命来管理一组人员。当有一个新的员工进入公司时,需要他以前的工作经历和成绩。通常来说,每个员工都需要经历一次面试,这通常由经理来进行的,但有些时候也被指派给一个代表来完成。
  • 公司定义了一系列的职业类型,例如经理、业务分析员、销售人员和秘书,而且每个类型都有相关的等级,员工所处的位置决定了员工的工资。在高层,工资是可以通过谈判来决定的。职位依据其工作量来分配给一个部门。例如,一个部门可能分配给两个业务分析员的职位。每个岗位会分配一个员工,随着时间的过去,各个职位都会被跟配给工作人员。

人力资源管理的数据模型:
在这里插入图片描述
数据模型及表

二、实验环境

  1. JDK 1.8 提取码:gehi
  2. NetBeans IDE 8.1 提取码:4oe2
  3. Microsoft SQL Server 2008 提取码:5l8c
  4. sqljdbc驱动程序 提取码:52j2

三、整体设计

只实现了最基本的增删改查

1、整体框架
  • 包含部门管理、员工管理、等级管理、职等职位管理、机构管理、职位管理、职位类型管理、岗位管理、前公司管理、员工学历管理、员工评价管理以及工作历史管理。
    在这里插入图片描述
2、实体-关系图
  1. 部门
    在这里插入图片描述
  2. 员工、等级等的关系图与部门一致
    全部都画上,篇幅有点长,就省略了
3、关系模型描述
(1)用户登录表(Login)

表名:Login 主键:userName

字段名中文名类型(长度)允许空码型约束
userName用户名CHAR(20)NOT NULLPK唯一
passWord密码CHAR(12)NOT NULL
(2)部门信息表(Department)

表名:Department 主键:departmentNo

字段名中文名类型(长度)允许空码型约束
departmentNo部门编号CHAR(5)NOT NULLPK在0000000到9999999之间
departmentName部门名字CHAR(30)NOT NULL
deptLocation部门位置VARCHAR(50)
managerEmployeeNo管理人员编号CHAR(7)NOT NULL
(3)员工信息表(Employee)

表名:Employee 主键:employeeNo

字段名中文名类型(长度)允许空码型约束
employeeNo员工编号CHAR(7)NOT NULLPK唯一
title职称CHAR(20)
firstNameCHAR(10)NOT NULL
middleName教名(中间名)CHAR(10)
lastNameCHAR(10)NOT NULL
address地址VARCHAR(100)
workTelExt工作电传CHAR(11)
homeTelNo家庭电话号码(座机)CHAR(11)
empEmailAddress员工电子邮件地址VARCHAR(32)
socialSecurityNumber社会安全号码(身份证号码)CHAR(18)NOT NULLUK唯一
DOB出生日期DATE
position职务CHAR(30)
sex性别CHAR(2)只能为男或女
salary薪水NUMERIC(8,2)大于0
dateStarted入职时间DATE小于离职时间
dateLeft离职时间DATE
departmentNo部门编号CHAR(5)NOT NULLFK
supervisorEmployeeNo主管员工编号CHAR(7)NOT NULLFK
(4)等级信息表(Grade)

表名:Grade 主键:gradeNo、validFromDate

字段名中文名类型(长度)允许空码型约束
gradeNo等级编号CHAR(1)NOT NULLPK从A到E
validFromDate有效开始日期DATENOT NULLPK开始日期小于截止日期
validToDate有效截止日期DATE
gradeDescrible等级描述VARCHAR(100)
gradesalary等级薪水NUMERIC(8,2)大于0
noDaysLeaveEntitlement休假时间天数SMALLINT大于0
positionTypeNo职位类型编号CHAR(10)NOT NULLFK
(5)职等职位信息表(GradePost)

表名:GradePost 主键:gradeNo、validFromDate、postNo、availableFromDate

字段名中文名类型(长度)允许空码型约束
gradeNo等级编号CHAR(1)NOT NULLPK、FK唯一
validFromDate有效开始日期DATENOT NULLPK、FK
postNo岗位编号CHAR(10)NOT NULLPK、FK
availableFromDate开始日期DATENOT NULLPK、FK
(6)机构信息表(Institution)

表名:Institution 主键:institutionNo

字段名中文名类型(长度)允许空码型约束
institutionNo机构编号CHAR(19)NOT NULLPK唯一
institutionName机构名称VARCHAR(60)NOT NULL
instAddress机构地址VARCHAR(100)
instTelNo机构电话号码(座机)CHAR(11)
instFaxNo机构传真号码CHAR(11)
instWbeAddress机构网址CHAR(30)
contactName联系人姓名CHAR(20)NOT NULL
contactName联系人电话号码CHAR(11)NOT NULL
contactTelNo联系人传真号码CHAR(11)
contactEmailAddress联系人电子邮件地址VARCHAR(32)
(7)职位信息表(Position)

表名:Position 主键:employeeNo、postNo、startDate

字段名中文名类型(长度)允许空码型约束
employeeNo员工编号CHAR(7)NOT NULLPK、FK唯一
postNo职位编号CHAR(10)NOT NULLPK、FK
startDate入职时间DATENOT NULLPK、FK入职时间小于离职时间
endDate离职时间DATEPK、FK
(8)职位类型信息表(PositionType)

表名:PositionType 主键:positionTypeNo

字段名中文名类型(长度)允许空码型约束
positionTypeNo职位类型编号CHAR(10)NOT NULLPK唯一
positionTypeDescription职位类型描述VARCHAR(100)
(9)岗位信息表(Post)

表名:Post 主键:postNo、availableFromDate

字段名中文名类型(长度)允许空码型约束
postNo岗位编号CHAR(10)NOT NULLPK唯一
availableFromDate开始日期DATENOT NULLPK开始时间小于结束时间
availableToDate结束日期DATE
postDescription岗位描述VARCHAR(100)
salariedHourly时薪NUMERIC(6,2)大于0
fullPartTime全职或者兼职CHAR(4)只能为全职或兼职
temporaryPermanent实习生或者正式员工CHAR(8)只能为实习工或正式员工
freeLaborStandardsActExempt是否购买五金一险CHAR(2)只能为是或否
departmentNo部门编号CHAR(5)NOT NULLFK
(10)前公司信息表(PrevCompany)

表名:PrevCompany 主键:prevCompanyNo

字段名中文名类型(长度)允许空码型约束
prevCompanyNo前公司编号CHAR(19)NOT NULLPK唯一
pCompanyName前公司名称VARCHAR(60)NOT NULL
pCompanyStreet前公司所在街道VARCHAR(50)
pCompanyCity前公司所在城市CHAR(20)
pCompanyState前公司所在国家CHAR(30)
pCompanyZipCode前公司邮政编码CHAR(6)
pCompanyTelNo前公司电话号码(座机)CHAR(12)
pCompanyFaxNo前公司传真号码CHAR(12)
pCompanyWebAddress前公司网址CHAR(30)
contactName联系人姓名CHAR(20)NOT NULL
contactTelNo联系人电话CHAR(11)NOT NULL
contactFaxNo联系人传真号码CHAR(11)
contactEmailAddress联系人电子邮件地址VARCHAR(32)
(11)学历信息表(Qualification)

表名:Qualification 主键:qualificationName、employeeNo

字段名中文名类型(长度)允许空码型约束
qualificationName学历名称CHAR(10)NOT NULLPK唯一
employeeNo员工编号CHAR(7)NOT NULLPK、FK唯一
gradeObtained获得的等级CHAR(1)等级编号为A到E
startQualDate合格开始时间DATE合格开始时间小于合格结束时间
endQualDate合格结束时间DATE
gpa绩点NUMERIC(3,2)大于0
institutionNo机构编号CHAR(19)NOT NULLFK
(12)评价信息表(Review)

表名:Review 主键:revieweeEmployeeNo、reviewerEmployeeNo、reviewDate

字段名中文名类型(长度)允许空码型约束
revieweeEmployeeNo被评价者编号CHAR(7)NOT NULLPK、FK被评价者编号编号不等于评价者编号
reviewerEmployeeNo评价者编号CHAR(7)NOT NULLPK、FK
reviewDate评价日期DATE NOT NULLPK
comments评价VARCHAR(255)
(13)工作历史信息表(WorkHistory)

表名:WorkHistory 主键:prevCompanyNo、employeeNo

字段名中文名类型(长度)允许空码型约束
prevCompanyNo前公司编号CHAR(19)NOT NULLPK、FK唯一
employeeNo员工编号CHAR(7)NOT NULLPK、FK
prevPosition前任公司职位CHAR(3)
prevGrade前任公司岗位等级CHAR(1)等级编号为A到E
prevSalary前任公司薪水NUMERIC(8,2)大于0
prevLocation前任公司位置VARCHAR(60)
prevResponsibilities在前任公司负责内容VARCHAR(100)

4、创建数据库

建表
创建约束
插入数据

5、功能实现

(1)登录判断功能

1)从前端页面获取用户名、密码和记住密码标识;

String username = request.getParameter("username");//从前端页面获取用户名
String password = request.getParameter("password");//从前端页面获取密码
String remember = request.getParameter("remember");//从前端页面获取是否记住密码

2)新建查询语句,用DBean中的Query方法执行查询语句,并保存至sqlRes结果集对象中;

String sql_user = "SELECT passWord FROM Login WHERE userName='"+username+"'";
ResultSet sqlRes = DBean.Query(sql_user);  // 结果集对象

3)查看结果集中是否有值,若有则从结果集对象中取出数据并去掉字符串后的空格,判断密码是否与对应用户名密码相等,若相等则将用户名存入session中,不等则提示错误并跳转至登录界面。

if(sqlRes.next()){
	// 从数据库中取出来的字符串可能会有空格,需要用trim()方法去掉空格  
	String sqlPassword = sqlRes.getString("passWord").trim();
	if (password.equals(sqlPassword)) {
		 //将用户名存入session中
		request.getSession().setAttribute("nameSession", username);
		...
	}
}
(2)注册判断功能

1)从前端页面获取注册的用户名与密码;

String username = request.getParameter("username");
String password = request.getParameter("pwd");

2)新建查询语句select_user,用Query方法执行查询语句,用while循环判断用户名是否存在,若以及存在则提示“用户名已存在”并跳转至注册界面让用户重新注册;

boolean juge = false; 	// 初值为不存在
String select_user = "SELECT userName FROM Login";
ResultSet sqlRes = DBean.Query(select_user);
while(sqlRes.next()){
	String sqlUsername = sqlRes.getString("userName").trim(); 	
	 if(username.equals(sqlUsername)){ 
		...
		out.println("document.location.href=\"Register.jsp\";");
		juge = true;	
		...
		}
}

3)如果juge为假,即不存在该用户,创建插入语句,并通过Update方法执行插入语句;如果为真则代表用户已存在,提示“注册失败”并跳转至主持界面。

if(juge == false){
	String insert_user = "INSERT INTO Login(userName,passWord) VALUES(" + username + "," + password + ")";
	int result = DBean.Update(insert_user);
}
(3) 部门
3.1 部门删除功能

1)从前端获取需要删除的部门的编号;

PrintWriter out = response.getWriter();
String departmentNo = request.getParameter("departmentNo");

2)创建db对象,用juge判断部门编号是否存在,创建查询语句select_departmentNo,通过Query方法执行查询语句,如果结果集中有值存在则把juge赋值为真;

DBean db = new DBean();
boolean juge = false;   // 初值为不存在
String select_departmentNo = "SELECT departmentNo FROM Department WHERE departmentNo='" + departmentNo + "'";
ResultSet sqlRes = db.Query(select_departmentNo);
try {
	if(sqlRes.next()) {
		juge = true;
	}
} catch (SQLException ex) {
	out.println(ex.toString());
}

3)如果juge为真,创建删除语句del_departmentNo,通过Update方法执行删除语句删除部门;为假则提示“不存在部门编号”并返回删除界面。

if (juge) {
	String del_departmentNo = "DELETE Department WHERE departmentNo='" +departmentNo + "'";
	int result = db.Update(del_departmentNo);
	db.closeDB(sqlRes);	// 关闭数据库连接
	if (result != 0) {			// 如果返回值result不为0则代表删除成功
		...
		out.println("document.location.href=\"Department/department_delete.jsp\";");
		...
	}
}
3.2 部门插入功能

1)获取部门参数,用juge_departmentNo判断部门编号是否存在,初值为不存在;juge_manager判断管理人员编号是否存在,初值为不存在;

String departmentNo = request.getParameter("departmentNo");
...

boolean juge_departmentNo = false;   
boolean juge_manager = false;

2)创建db对象,查询语句select_departmentNo、select_manager,通过Query方法执行查询操作,将结果分别存入对应的结果集对象中;

DBean db = new DBean();
// 查询部门编号是否存在
String select_departmentNo = "SELECT departmentNo FROM Department WHERE departmentNo='"+ departmentNo +"'";
ResultSet sqlRes_departmentNo = db.Query(select_departmentNo);

// 查询管理人员是否存在
String select_manager = "SELECT employeeNo FROM Employee WHERE employeeNo='"+ managerEmployeeNo +"'";
ResultSet sqlRes_manager = db.Query(select_manager);

3)如果结果集中有值则将juge_departmentNo、juge_manager赋值为真;

try {
	if (sqlRes_departmentNo.next()) { juge_departmentNo = true; }
	if (sqlRes_manager.next()) { juge_manager = true; }
} catch (SQLException ex) {
	out.println(ex.toString());
}

4)调用Foramt方法格式化需要插入的数据;

Format format = new Format();
departmentNo = format.FormatSql(departmentNo);  
...

5)如果juge_departmentNo为假(即部门表中,此部门编号不存在,可以插入语)且juge_manager为真(即存在在此管理人员)则创建插入语句,并通过Update方法执行插入操作,然后关闭数据库。

if (!juge_departmentNo && juge_manager) {
	String insert_sql = "INSERT INTO Department"+" VALUES("+departmentNo+"," + departmentName + "," + deptLocation + "," + managerEmployeeNo + ")";
	int result = db.Update(insert_sql);
	db.closeDB(sqlRes_departmentNo);
	db.closeDB(sqlRes_manager);
	 if (result != 0) {
                out.println("<script type=\"text/javascript\">");
                out.println("alert(\"添加成功!\");");
                out.println("document.location.href=\"Department/department_insert.jsp\";");
                out.println("</script>");
	 } else {
	  ...
	 }
}
3.3 部门查询功能

1)创建public static String数组用来储存查询的数据,方便前端页面(department_query.jsp)获取部门信息的数据

public static String [] departmentNo_Arr = new String[1];
public static String [] departmentName_Arr = new String[1];
public static String [] deptLocation_Arr = new String[1];
public static String [] managerEmployeeNo_Arr = new String[1];

2)创建查询语句,通过Query方法执行查询语句,并通过while循环从结果集中取值,存入对应的数组中,并将juge赋值为真;如果juge为真,则跳转至查看结果界面。

String sql_depart = "SELECT * FROM Department WHERE departmentNo='" + departmentNo +"'";
sqlRes = db.Query(sql_depart);
if(sqlRes.next()) {
	juge = true;
	departmentNo_Arr[0] = sqlRes.getString("departmentNo").trim();	// 部门编号
	
	// 因为部门位置在数据表中可以为空,所以需要判断值是否为null;
	if(sqlRes.getString("deptLocation") != null)                      // 部门位置
		deptLocation= sqlRes.getString("deptLocation").trim();
	else    deptLocation= "";
		deptLocation_Arr[0] = deptLocation;
	...
}
3.4 部门更新功能

1)获取输入的部门数据,创建juge_departmentNo 和juge_manager判断部门编号和管理人员编号

String departmentNo = request.getParameter("departmentNo");
String departmentName = request.getParameter("departmentName");
...
boolean juge_departmentNo = false;   // 判断部门编号是否存在,初值为不存在
boolean juge_manager = false;        // 判断管理人员编号是否存在,初值为不存在

1)创建查询语句select_departmentNo和select_manager; Query方法执行查询操作,如果结果集中有值则将juge_departmentNo、juge_manager = true赋值为真;

DBean db = new DBean();

// 部门编号查询
ResultSet sqlRes_departmentNo;        // 结果集对象
String select_departmentNo = "SELECT departmentNo FROM Department WHERE departmentNo='" + departmentNo + "'";
sqlRes_departmentNo = db.Query(select_departmentNo);

// 管理人员编号查询
ResultSet sqlRes_manager;        // 结果集对象
String select_manager = "SELECT employeeNo FROM Employee WHERE employeeNo='"+ managerEmployeeNo +"'";
sqlRes_manager = db.Query(select_manager);

try {
	if (sqlRes_departmentNo.next()) {    juge_departmentNo = true;  }
	if (sqlRes_manager.next()) {    juge_manager = true;   }  
} catch (SQLException ex) {
	out.println(ex.toString());
}

2)若管理人员编号为空则将juge_manager置为true,即不修改管理人员编号;
如果juge_departmentNo、juge_manager 为真则创建对应的更新语句;判断内容是否为空,若不为空则执行更新操作。

if("".equals(managerEmployeeNo))        // 如果管理员工编号为空,即不修改管理人员编号
	juge_manager = true;
if (juge_departmentNo == true && juge_manager == true) {
	String update_name = "UPDATE Department SET departmentName='" +departmentName + "' WHERE departmentNo='" + departmentNo +"'";
	....
	if (!departmentName.equals(""))   result[0] = db.Update(update_name);
	....
	db.closeDB(sqlRes_departmentNo);
	db.closeDB(sqlRes_manager);

	// 判断是否更新成功,就是个提示,更新的还是更新了
	boolean juge_update = true;
	for (int i : result) {
		if (i == 0) {
			juge_update = false;
			break;
		}
	}
}
(4)其他页面的增删改查功能

其余功能没差,与部门的删除、插入、查询和更新功能的实现一致

(5)编码过滤功能(CodeFilter)
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) 	
		throws IOException, ServletException {
	request.setCharacterEncoding("utf-8");
	response.setCharacterEncoding("utf-8");
	response.setContentType("text/html;charset=utf-8");
	...
}
(6)数据库操作(DBean)

1)连接数据库:getconn
将数据库的URL、数据库用户名和密码作为参数使用getConnection函数连接数据库;

public Connection getconn() {
	try {
		String dbURL = "jdbc:sqlserver://127.0.0.1; DatabaseName = HRM";
		String dataBaseName = "sa"; // 数据库用户名
		String dataBasePwd = "123"; // 数据库密码
		conn = DriverManager.getConnection(dbURL, dataBaseName, dataBasePwd);
	} catch (Exception e) {
		out.println(e.toString());
	}
	return conn;
}

2)查询函数:Query
创建DB对象,使用getconn方法连接数据库,在使用sqlState对象的executeQuery方法查询数据库;

public ResultSet Query(String sql) {
	try {
		DBean db = new DBean();
		conn = db.getconn();
		sqlState = conn.createStatement();  // 创建sqlState对象
		sqlRes = sqlState.executeQuery(sql);
	} catch (SQLException e) {
		out.println(e.toString());
	}
	return sqlRes;
}

3)增删改功能:Update
调用sqlState的executeUpdate方法实现增删改功能

public int Update(String sql) {
	int result = 0;
	try {
	DBean db = new DBean();
	conn = db.getconn();
	sqlState = conn.createStatement();  // 创建sqlState对象
	result = sqlState.executeUpdate(sql);
	} catch (SQLException e) {
		out.println(e.toString());
	}
	return result;
}

4)关闭数据库:closeDB

public void closeDB(ResultSet sqlRes) {
	if (sqlRes != null) {
		try {
			if (sqlRes != null)  sqlRes.close();    // 关闭结果集对象连接
			if (sqlState != null) sqlState.close(); // 关闭sqlState对象连接		
			if (conn != null)  conn.close();        // 关闭数据库连接
		} catch (SQLException e) {
			out.println(e.toString());
		}
	}
}
(7)格式化功能(Format)

如果value为空则返回null,不为空则将其变为value格式

public class Format {
	public String FormatSql(String value){
		if(value.equals(""))	
			return null;
		else
			return "'"+value+"'";
	}
}
(8)登录过滤功能(LoginFilter)

从session中获取属性nameSession,如果为null则代表session没有用户名即未登录,提示错误并跳转至登录界面;不为空则代表session中有值,即有登录;

String user = (String)req.getSession().getAttribute("nameSession");
if(user == null){   //判断session中是否有用户名
	out.println("<script type=\"text/javascript\">");
	out.println("alert(\"未登录!请先登录!\");");
	out.println("document.location.href=\"http://localhost:8080/HRM/Login/Login.jsp\";");
	out.println("</script>");
}
else
	chain.doFilter(request,response);

四、效果图

  1. 登录界面
    在这里插入图片描述
  2. 注册界面
    在这里插入图片描述
  3. 主页面
    在这里插入图片描述
  4. 部门界面
    在这里插入图片描述
    在这里插入图片描述

五、结

Employee表和Department表中互为外键,没整出来,给省略了,如果互相关联之后,不能往这两个表中的其中一个添加数据;因为Employee、Department互相关联后,需要其中一个表中有数据才能往另一个表中添加;或者之前就把数据添加上,再添加两个表的外键,后面不允许往其中添加数据?
写的简单,还是有一些问题没整好
有些提示不够,有的地方需要根据数据之间的联系才能将数据填入
害,翻译也不知道翻译的个啥,感觉就有小部分内容翻译出来的东西有点怪怪的-_-||
。。。

  • 11
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
NetBeans是一个开源的集成开发环境(IDE),它支持多种编程语言,包括Java。使用NetBeans可以方便地进行Java应用程序的开发和调试。 要开发一个图书管理系统,你可以使用NetBeans来创建一个Java项目,并使用Java编程语言来实现系统的各个功能模块。以下是一个简单的图书管理系统的设计思路: 1. 数据库设计:首先,你需要设计一个数据库来存储图书信息。可以创建一个名为"books"的表,包含字段如下:书名、作者、出版社、ISBN号等。 2. 用户界面设计:使用NetBeans的GUI设计器,创建一个用户界面,包括添加图书、删除图书、查询图书等功能的按钮和文本框。 3. 数据库连接:使用Java的JDBC技术,连接数据库并实现对图书信息的增删改查操作。 4. 功能实现:根据用户界面的设计,编写Java代码实现各个功能模块。例如,当用户点击添加图书按钮时,将输入的图书信息插入到数据库中;当用户点击查询图书按钮时,根据输入的条件从数据库中查询相应的图书信息并显示在界面上。 5. 错误处理:在代码中添加适当的错误处理机制,例如输入验证、异常处理等,以提高系统的稳定性和用户体验。 6. 测试和调试:使用NetBeans提供的调试工具,对系统进行测试和调试,确保各个功能模块的正常运行。 以上是一个简单的图书管理系统的开发思路,你可以根据实际需求进行扩展和优化。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值