4.1 具体流程
4.1.1登录
用户登录通过后根据登录ID查询数据库并返回用户权限,根据用户的权限显示主页,不同的权限做看到的主页不同。
4.1.2主页
1.四颗星以下权限员工所看到的页面
最上面有一个退出登录的链接,点击回到“登录”页面
能看到一个搜索条,通过搜索链接到“个人详细资料”页面,查看被搜索员工的公开资料。
可以看到一些自己的资料,并在下面有二个链接:查看详细资料和修改个人资料,点击分别进入“个人详细资料”和“修改个人资料”的页面,查看自己的详细资料、工资,修改自己的联系方式等。
能看到公司最新的通知,下面有一个查看以往通知的链接,点击进入“所有通知”页面查看所有通知。
能看到公司最新的10条新闻的标题,点击标题就能进入“新闻内容”的页面,下面有一个所有新闻的链接,点击进入“所有新闻”页面查看所有新闻。
2.四颗星以上权限员工所看到的页面
所有一颗星权限员工能看到的数据。
能在最上面的标题图片下面看到一个各部门的菜单,列出了所有部门的链接,无论点击哪个都会进入“部门员工清单”页面。
也能通过搜索条搜索员工,但是链接到“员工详细资料”页面。
有一个添加员工和员工业绩的链接,点击进入“添加员工”页面和“员工业绩”页面。
能看到发布通知和添加新闻的链接,点击进入“发布通知”和“添加新闻”页面。
只有财务部的四颗星员工和五颗星员工才能看到员工薪金的链接,点击进入“员工薪金清单”页面。
4.1.3各功能模块页面
(1)“个人详细资料”页面
显示员工的公开资料。
(2)“修改个人资料”页面
修改自己的联系方式和地址。
(3)“所有通知”页面
在页面的左边部分列出了所有通知的发布时间,点击时右面便显示点击消息的内容。
(4)“新闻内容”页面
显示新闻的发布人,发布时间和内容。
(5)“所有新闻”页面
在页面左边部分列出了所有新闻的标题,点击时右面变显示点击新闻的内容。
(6)“部门员工清单”页面
根据链接来是所传来的部门的参数显示部门所有员工的一个清单,每个员工仅显示了编号、姓名、性别、部门四个资料,在每个员工后面还有一个详细资料的链接,点击进入“员工详细资料”页面。如果登录的是两颗星权限,并且登录者的部门和显示页面的部门一致的情况下或者登录的是三颗星权限的情况下,那么便会在每个员工的最后面看到一个删除的链接,点击删除此名员工的所有资料。
(7)“员工详细资料”页面
显示员工所有的资料,包括公开资料和保密资料。如果登录的是两颗星权限,并且登录者的部门和所显示员工的部门一致的情况下或者登录的是三颗星权限的情况下,就会在下面看到一个修改的链接,点击进入“修改员工资料”页面。
(8)“修改员工资料”页面
修改员工的资料。
(9)“添加员工”页面
当新员工加入的时候添加员工。
(10)“发布通知”页面
发布通知。
(11)“添加新闻”页面
添加新闻。
(12)“员工业绩新闻”页面
各部门的部门经理,对所属员工的业绩进行加减。
(13)“员工业绩新闻”页面
财务部的部门经理和公司部门经理以上职位的能人看到公司所有人当月薪金。
如图2所示:
实现
4.2.1数据库的设计
1.创建数据库
首先在 SQL Server 2000 的企业管理器中创建一个名为 manager 的数据库。
2.创建表
数据库 manager 包含 7 个表:员工权限表(userpassword)、员工公开资料表(public_userdata)、员工保密资料表(interior_userdata)、公司理念表(com_idea)、新闻表(news)、通知表(notice)、员工业绩表(contribution)。详细如下:
(1)员工权限表
员工权限表(userpassword)用来保存每个员工的登录帐号、口令和登录权限,结构如表1:
表1 员工权限表(userpassword)
编号
|
字段名称
|
数据结构
|
说明
|
1
|
USERID
|
vachar(7)
|
员工编号(主键)
|
2
|
PASSWORD
|
varchar(7)
|
登录密码
|
3
|
JURISDICTION
|
varchar(10)
|
员工权限
|
(2)员工公开资料表
员工公开资料表(public_userdata)用来保存每个员工的公开资料,结构如表2:
表2 员工公开资料表(public_userdata)
编号
|
字段名称
|
数据结构
|
说明
|
1
|
USERID
|
vachar(7)
|
员工编号(主键)
|
2
|
USERNAME
|
varchar(10)
|
员工姓名
|
3
|
SEX
|
varchar(2)
|
员工性别
|
4
|
DEPARTMENT
|
varchar(10)
|
所属部门
|
5
|
DUTY
|
varchar(10)
|
员工职务
|
6
|
TEL
|
varchar(30)
|
联系电话
|
7
|
E_MAIL
|
varchar(50)
|
E_mail
|
8
|
ADDRESS
|
varchar(50)
|
地址
|
(3)员工保密资料表
员工保密资料表(interior_userdata)用来保存每个员工的保密资料,结构如表3:
表3 员工保密资料表(interior_userdata)
编号
|
字段名称
|
数据结构
|
说明
|
1
|
USERID
|
vachar(7)
|
员工编号(主键)
|
2
|
ADDCOMDATE
|
varchar(10)
|
加入公司时间
|
3
|
DOCUMENT
|
varchar(8000)
|
员工档案
|
(4)公司理念表
公司理念表(com_idea)用来保存公司的理念,结构如表4:
表4 公司理念表(com_idea)
编号
|
字段名称
|
数据结构
|
说明
|
1
|
ID
|
int(4)
|
理念序号,标识种子,增量1(主键)
|
2
|
TITLE
|
varchar(100)
|
理念标题
|
3
|
BODY
|
varchar(8000)
|
理念内容
|
4
|
ADDDATE
|
varchar(50)
|
加入日期
|
5
|
ADDUSER
|
varchar(10)
|
加入员工姓名
|
(5)新闻表
新闻表(news)用来保存公司的新闻,结构如表5:
表5 新闻表(news)
编号
|
字段名称
|
数据结构
|
说明
|
1
|
ID
|
int(4)
|
新闻序号,标识种子,增量1(主键)
|
2
|
TITLE
|
varchar(100)
|
新闻标题
|
3
|
BODY
|
varchar(8000)
|
新闻内容
|
4
|
ADDDATE
|
varchar(30)
|
加入日期
|
5
|
ADDUSER
|
varchar(10)
|
加入员工姓名
|
(6)通知表
通知表(notice)用来保存公司的通知,结构如表6:
表6 通知表(notice)
编号
|
字段名称
|
数据结构
|
说明
|
1
|
ID
|
int(4)
|
通知序号,标识种子,增量1(主键)
|
2
|
CONTENT
|
varchar(1000)
|
通知标题
|
3
|
ADDDATE
|
varchar(30)
|
加入日期
|
4
|
ADDUSER
|
varchar(10)
|
加入员工姓名
|
(7)员工业绩表
员工业绩表(contribution)用来保存员工每月的业绩,结构如表7:
表7 员工业绩表(contribution)
编号
|
字段名称
|
数据结构
|
说明
|
1
|
USERID
|
int(4)
|
员工编号
|
2
|
CONTRIBUTION
|
int(4)
|
员工业绩
|
3
|
DATE
|
varchar(10)
|
当月日期
|
3.数据库的连接
在实现各个模块之前,首先要建立与数据库 manager 的连接,因为在系统中,这个操作非常频繁,所以我把它写成了两个 javabean : DBConnection.class 和 DBSQL.class,下面是详细的说明:
DBConnection.class 是用 JDBC 建立与数据库的连接,具体代码如下:
public class DBConnection
{
privateString driverName ="com.microsoft.jdbc.sqlserver.SQLServerDriver"; //驱动名称
privateString url="jdbc:microsoft:sqlserver://localhost:1433;databaseName=manage"; //驱动路径
privateString user = "sa"; //数据库用户名
privateString password = "sa"; //数据库密码
publicConnection getConnection()
{
try
{
Class.forName(driverName); //加载驱动
return DriverManager.getConnection(url,user, password); //建立连接
}
catch (Exception e)
{
e.printStackTrace();
return null;
}
}
}
DBSQL.class 通过调用 DBConnection.class 的对象建立与数据库的连接,然后执行传来的 SQL 语句,返回操作的结果集,代码如下:
public class DBSQL
{
protectedConnection conn = null;//Connection对象
protectedStatement stmt = null; //Statement对象
protectedResultSet rs = null; //记录结果集
protectedString sqlStr; //SQL语句
publicDBSQL()
{
try
{
sqlStr = "";
DBConnectiondcm = new DBConnection(); //实例 DBConnection 对象
conn= dcm.getConnection(); //获得连接
stmt= conn.createStatement(); //获取执行 SQL 语句命令对象
}
catch(Exception e)
{
System.out.println(e);
}
}
publicStatement getStmt()
{
returnstmt;
}
publicConnection getConn()
{
returnconn;
}
publicResultSet getRs()
{
returnrs;
}
publicvoid setSqlStr(String newSqlStr) //获得SQL语句
{
this.sqlStr=newSqlStr;
}
publicString getSqlStr() {
returnsqlStr;
}
publicvoid executeQuery() throws Exception
{
rs= stmt.executeQuery(sqlStr); //记录结果集
}
publicvoid executeUpdate() throws Exception
{
stmt.executeUpdate(sqlStr); //执行 SQL 语句
}
publicvoid close() throws SQLException //关闭数据库连接
{
if( stmt != null )
{
stmt.close();
stmt= null;
}
conn.close();
conn= null;
}
}
4.2.2界面的设计
猎头公司管理软件由9个模块13个前台显示界面、14个后台操作页面和5个公共页面组成,因受论文篇幅所限,仅给出部分模块的设计和代码。
1.公共模块
公共模块是各个模块都可能用要的,在本系统中公共模块主要包括整个系统都要用到的图片和一些公共的调用,如对系统当前时间的读取,把它写到公共页面里,每次只要把公共页面包括进去,直接读取时间变量就行,具体实现的代码如下:
java.util.Date cur_time = new java.util.Date();//读取系统当前时间
SimpleDateFormat formatter = newSimpleDateFormat("yyyy-MM-dd");//定义读取时间格式
String dateString = formatter.format(cur_time);//付值给变量
2.用户登录模块
用户登录界面(login.jsp)用于员工的登录,主要功能用于判断用户输入的登录名和密码是否合法。
界面如图3:
当用户输入不合法的用户或者密码的时候,就会弹出错误对话框,在本系统,将用户和密码的规则都设为七位,所以当没有输入或者输入错误的时候就会弹出提醒对话框,此功能的实现是在前台登录的jsp页面嵌入一个javascript,具体的代码如下:
<scriptlanguage="javascript"> //用javascript判断用户的输入是否合法
function checkform()
{
if(form.userid.value.length!=7)
{
alert("请输入正确的编号!");
form.userid.focus();
returnfalse;
}
if(form.password.value.length!=7)
{
alert("请输入正确的密码!");
form.password.focus();
returnfalse;
}
returntrue;
}
</script>
通过在登录表单设置onClick属性来调用上面的javascript,具体代码如下:
<input type="submit"name="Submit" value="登录"onClick="javascript:return(checkform());">
当用户输入完毕点击登录按钮后,就会跳转到后台的检查页面,检查页面的功能是,通过用户输入的用户名和密码作为参数,到数据库里面去查找是否有匹配的项,如果有,则登录成功,跳转到系统主页面;如果没有,则返回登录页面,并显示用户名或密码错误。然后将登录状态设置为真,具体是通过给Session付值来实现具体代码如下:
String userid = newString(request.getParameter ("userid").trim().getBytes("ISO-8859-1"));
String password = newString(request.getParameter
("password").trim().getBytes("ISO-8859-1"));//接受从用户输入的用户名和密码
String sql = "SELECT * FROM userpasswordWHERE USERID='"+userid+"' ANDPASSWORD='"+password+"'";//通过用户名和密码在userpassword表中寻找是否有匹配项
DBSQL dbsql = new DBSQL();//连接数据库
dbsql.setSqlStr(sql);
dbsql.executeQuery();//执行SQL语句
ResultSet rs = dbsql.getRs();//返回结果集
if (!rs.next()) //判断登录用户和密码在数据库里是否存在
{
Stringerrmsg="error1";
response.sendRedirect("login.jsp?errmsg="+errmsg);//不存在则返回登录页面,并提示错误
return;
}
request.getSession(true);//存在则设置登录状态为真
String chk="true";
session.putValue("Enter",chk);
session.putValue("userid",userid);//记录登录用户的用户名
response.sendRedirect("index.jsp");//登录成功,跳转到主页面
3.系统主页模块
系统主页面(index.jsp)是员工进入系统后的一个操作索引,所有的操作都从这里开始,在此页面中,对权限的判断十分重要,不同权限的员工所看到的界面是不一样的,详细如下:
四颗星以下权限的员工登录后所看到的界面如图4:
不同权限员工看到的不同界面主要是部门菜单显示和非显示,具体的实现是用java代码实现的,具体如下:
<%
Stringuserid=(String)session.getValue("userid");//通过session获取登录用户的用户名
String sql="SELECT * FROM userpasswordWHERE USERID ='"+userid+"'";
DBSQL dbsql = new DBSQL();
dbsql.setSqlStr(sql);
dbsql.executeQuery();
ResultSet rs=dbsql.getRs();
rs.next();
String jurisdiction=newString(rs.getString("JURISDICTION"));//利用登录用户的用户名,通过查询员工权限表,得到登录用户的权限
sql="SELECT * FROM public_userdata WHEREUSERID ='"+userid+"'";
dbsql.setSqlStr(sql);
dbsql.executeQuery();
rs=dbsql.getRs();
rs.next();
String userdepartment =rs.getString("DEPARTMENT");//利用登录用户的用户名,通过查询员工公开资料表,得到登录用户的所属部门
if(jurisdiction.equals("****")||jurisdiction.equals("*****"))//判断登录用户权限决定是否显示,只有四颗星和五颗星登录权限才能显示
{
String renshi_department="人事部";
String houqin_department="后勤部";
String caiwu_department="财务部";
String yewu_department="业务部";
String jishu_department="技术部";
%>
<table width="800"border="0" cellpadding="0" cellspacing="0" bgcolor="#66CCFF">
<tr>
<td width="100"><divalign="center"><a href="userlist.jsp?department=<%=renshi_department%>">人事部</a></div></td>
<td width="100"><divalign="center"><ahref="userlist.jsp?department=<%=houqin_department%>">后勤部</a></div></td>
<td width="100"><divalign="center"><ahref="userlist.jsp?department=<%=caiwu_department%>">财务部</a></div></td>
<td width="100"><divalign="center"><ahref="userlist.jsp?department=<%=yewu_department%>">业务部</a></div></td>
<td width="100"><divalign="center"><ahref="userlist.jsp?department=<%=jishu_department%>">技术部</a></div></td>
<td width="100"><divalign="center"><a href="contributionlist.jsp">员工业绩</a></div></td>
<%
if(userdepartment.equals("财务部")||jurisdiction.equals("*****"))//用一个嵌套if语句,判断权限,只有财务部的部门经理和五颗星权限显示员工薪金
{
%>
<td width="100"><div><ahref="salarylist.jsp">员工薪金</a></div></td>
<%
}
%>
<td width="100"><divalign="center"><a href="adduser.jsp">添加员工</a></div></td>
</tr>
</table>
<%
}
%>
4.查询模块
查询模块是方便公司员工查询其他员工的一些资料而设计的,这也涉及到权限问题,一般员工的登录权限只能查询其他员工的公开资料,而管理层的登录权限不仅可以查询到公开资料,也能查询保密资料,这个功能是根据登录者的权限点击链接时,跳转到不同的显示页面来实现的。
一般员工查询的跳转页面如图6:
代码如下:
Stringuserid=(String)session.getValue("userid");//获取登录者用户名
String sql="SELECT * FROM userpasswordWHERE USERID ='"+userid+"'";
DBSQL dbsql = new DBSQL();
dbsql.setSqlStr(sql);
dbsql.executeQuery();
ResultSet rs=dbsql.getRs();
rs.next();
String jurisdiction=newString(rs.getString("JURISDICTION"));//根据用户名查询数据库,得到登录权限
String username = newString(request.getParameter("keyword").
trim().getBytes("ISO-8859-1"));//获取用户输入的查询关键字
sql = "SELECT * FROM public_userdataWHERE USERNAME='"+username+"'";
dbsql.setSqlStr(sql);
dbsql.executeQuery();
rs=dbsql.getRs();//根据关键字查询数据库
if(!rs.next())// 判断是否有此人
{
out.println("没有此人!");
}
else
{
if(jurisdiction.equals("****")||jurisdiction.equals("*****"))//判断登录权限
{
response.sendRedirect("particularuser.jsp?userid="+rs.getString("USERID"));//四颗星以上登录权限者跳转到particularuser.jsp页面查看被查询者资料
}
else
{
response.sendRedirect("usermessage.jsp?userid="+rs.getString("USERID"));//其他登录权限的则跳转到usermessage.jsp页面查看被查询者资料
}
}
5.薪金计算模块
员工每月薪金的计算是和员工的职务与业绩分不开的,而职务和员工的权限又是成正比的,所以和薪金相关的就是员工的权限与业绩,员工的权限是固定的,而每个月的业绩确实浮动的,所以具体的实现是:每个权限对应不同的固定薪金,然后每个员工的业绩通过一个算法,得到浮动薪金,把这两部分加起来就是员工的总薪金。这个算法我把它封装到了一个javabean里面,具体代码如下:
public class Salary
{
protectedint salary;//员工总薪金
publicSalary(String jurisdiction,int contribution)
{
try
{
int_salary = 0;
//不同权限对应不同的固定薪金
if(jurisdiction.equals("*"))
{
_salary= 1500;
}
if(jurisdiction.equals("**"))
{
_salary= 2000;
}
if(jurisdiction.equals("***"))
{
_salary= 3000;
}
if(jurisdiction.equals("****"))
{
_salary= 5000;
}
if(jurisdiction.equals("*****"))
{
_salary= 8000;
}
this.salary= _salary + contribution * 200;//计算员工总薪金
}
catch(Exception e) {
System.out.println(e.toString());
}
}
publicint getSalary() //获取薪金
{
returnsalary;
}
};
但需要计算某个员工薪金时,只需把这个员工的权限和业绩作为参数实例这个类的一个对象,然后调用getSalary()方法就能取的薪金,具体调用如下:
Salary sal = new Salary(jurisdiction,contribution);//jurisdiction和contribution为员工的权限和当月业绩
int salary = sal.getSalary();