通用工资管理系统--SQL server课程设计(Java实现+SQL server)

avatar
作者
筋斗云
阅读量:2

本科参与项目文档合集: 点击跳转~

通用工资管理系统

General payroll management system


设计题目:通用工资管理系统
专 业:计算机科学与技术
班 级: 19级1班
设 计 人: 安**
指导老师: 刘**
日 期:2021年06月30日


项目文档目录

1.开发环境和相关技术介绍

1.1开发环境

数据库系统:Microsoft SQL Server 2019
开发语言:JAVA
数据库连接方式:JDBC连接方式
开发工具:Eclipse

1.2相关技术介绍

  Microsoft SQL Server 2019数据库管理系统是微软公司研制开发的关系型数据库管理系统。该系统支持并扩展了SQL语言标准,可以运用标准SQL语句对数据进行操作,也可以使用功能强大的GUI工具进行灵活的数据管理。同时,系统还提供功能完善的API,可以在应用程序中调用这些API来实现与数据库系统的连接以及相关数据的操作。
  Eclipse:功能强大的应用程序开发工具,主要支持基于Java语言的各种开发项目。灵活的Plun-in功能,可以根据具体需要安装各种插件。
  JDBC连接方式:Java与数据库系统的一种连接方式,Java程序使用JDBC API与数据库进行通信,并用它操作数据库中的数据。JDBC API使Java程序与具体数据库系统独立开来,保证了Java程序高度的可移植性。

2.需求分析

2.1需求分析

  设计本通用工资管理系统,包括对员工信息的增加、修改、删除、查询等功能以及对工资的新增、修改和查找功能,系统需要考虑的情况如下:
(1)可随时对公司员工信息:姓名、性别、所在部门、总工资进行增删改查。
(2)可随时对公司员工信息的工资情况进行增删改查。
(3)使用存储过程实现自动计算员工所得总工资(数据处理层面)。
(4)使用模糊查询,有关键字即可查询到员工信息。
2.2数据字典
2.2.1数据结构
管理员 = 管理员账号+管理员密码
用户 = 用户账号+用户密码
员工 = 员工编号+员工姓名+员工性别+员工所在部门编号+员工所在地址+员工联系方式
部门 = 部门编号+部门名称+部门人数
工资 = 员工编号+用户基本工资+奖金+总工资
职位 = 部门编号+员工编号+职位名称
2.2.2数据项
            表2.1数据项表
在这里插入图片描述

2.3安全性要求
  在数据库内设有管理员表和用户表,登陆系统时会要求输入管理员账号和密码。登陆模块根据输入账号和密码查管理员表,查到匹配记录则允许其登陆系统。

3.概念结构设计

3.1设计方法和步骤
  采用自底而上的设计方法。先自顶向下地进行需求分析,对通用工资管理系统的需求进行逐步细化;然后再自底而上地设计概念结构,最终将各个局部应用的概念结构集合成为全局概念结构。
3.2概念结构E-R图
  通过对局部应用的选择,逐一设计出分E-R图,并对各个分E-R图进行合并,生成初步E-R图,消除不必要的系统冗余,可以得出通用工资管理系统E-R图。
在这里插入图片描述

        图3.1管理员E-R图
在这里插入图片描述

        图3.2用户E-R图
在这里插入图片描述

        图3.3员工E-R图
在这里插入图片描述

          图3.4部门E-R图

在这里插入图片描述

          图3.5工资E-R图

在这里插入图片描述

        图3.6 职位E-R图
在这里插入图片描述

          图3.7工资管理系统E-R图

4.逻辑结构设计

4.1关系模式设计与优化分析

4.1.1关系模式设计
根据概念结构的设计,可以将系统E-R图转换为以下关系模式(画横线的为各关系的码):
Employee(员工编号,员工姓名,员工性别,所在部门编号,家庭地址,联系方式)
Foreign key:部门编号
Salary(员工编号,基本工资,奖金,总工资)
Foreign key:员工编号
Department(部门编号,部门名称,部门人数)
Login1(账户名(管理员),密码)
Login2(账户名(用户),密码)
Foreign key:账户名(用户)
Role(员工编号,部门编号,职位名称)
Foreign key:员工编号

4.1.2优化分析
考察关系模式:Employee(员工编号,员工姓名,性别,所在部门编号,家庭地址,联系方式):
员工编号—>员工姓名
员工编号—>性别
员工编号—>所在部门编号
员工编号—>家庭地址
员工编号—>联系方式
它只有一个码:员工编号,这里没有任何属性对员工编号部分依赖或传递依赖,所以此关系模式属于3NF,由于此关系模式中员工编号是唯一的决定因素,所以该关系模式属于BCNF.
考察关系模式:Salary(员工编号,基本工资,奖金,总工资):
员工编号—>基本工资
员工编号—>奖金
员工编号—>总工资
它只有一个码:员工编号,这里没有任何属性对员工编号部分依赖或传递依赖,所以此关系模式属于3NF,由于此关系模式中员工编号是唯一的决定因素,所以该关系模式属于BCNF.
考察关系模式:Department(部门编号,部门名称,部门人数):
部门编号—>部门名称
部门编号—>部门人数
它只有一个码:部门编号,这里没有任何属性对部门编号部分依赖或传递依赖,所以此关系模式属于3NF,由于此关系模式中部门编号是唯一的决定因素,所以该关系模式属于BCNF.
考察关系模式:Login1(账户名(管理员),密码):
账户名(管理员)—>密码
显然属于BCNF.
关系模式:Role(员工编号,部门编号,职位名称):
员工编号—>部门编号
员工编号—>职位名称 显然属于BCNF.

4.2系统完整性设计

Employee员工编号,员工姓名,性别,所在部门编号,家庭地址,联系方式)
其中:员工编号为主码,员工姓名,性别,所在部门编号,家庭地址,联系方式约束都为非空,部门编号为外码(参照对象为Department (部门编号))
Salary员工编号,基本工资,奖金,总工资):
其中:员工编号为主码,基本工资,奖金,总工资约束为非空,员工编号为外码(参照对象为Employee(员工编号))
Department部门编号,部门名称,部门人数):
其中:部门编号为主码,部门名称,部门人数约束为非空
Login1 (用户名(管理员),密码)
其中:用户名(管理员)为主码,密码约束为非空
Role员工编号,部门编号,职位名称)
其中:员工编号是主码也是外码(参照对象为Employee(员工编号)),部门编号为外码(参照对象为Department (部门编号)),职位名称约束为非空。

5.数据库物理设计

5.1数据存放位置
本系统数据存放在磁盘中。
5.2确定系统配置
根据具体需要配置。
5.3模块设计
5.3.1登陆模块
在这里插入图片描述

              图5.1
5.3.2管理模块
在这里插入图片描述

              图5.2
5.3.4查询模块
在这里插入图片描述

              图5.3

6.数据库实施

6.1数据库构建

6.1.1各数据表说明
在这里插入图片描述
在这里插入图片描述

6.2数据库分离和恢复方案

6.2.1分离数据库
  在企业管理器中右击需要备份的数据库,选择“所有任务”,“分离数据库”,执行分离操作,之后可进行拷贝数据库MDF文件和LDF文件。
6.2.2恢复数据库
  在企业管理器的控制台树中选择“数据库”节点,右击,“所有任务”,“附加数据库”,找到待恢复数据库的MDF文件,确定。

7.应用界面设计

7.1用户界面设计
  本系统的用户界面用Java Swing编写,主要由一个登陆界面,一个主界面,多个子功能实现界面和多个辅助对话框组成。主界面集合系统主要基本功能按键,子功能实现界面和辅助对话框负责采集用户输入信息和做基本的信息处理
在这里插入图片描述

            图7.1登陆界面
在这里插入图片描述

              图7.2主界面

7.2类文件功能描述
在这里插入图片描述

8.系统测试

8.1测试方案
  整个测试过程按照系统结构图自顶向下进行,先测试登陆模块,成功登陆后再对主界面的各子模块按深度优先策略逐一进行测试。
8.2测试过程
8.2.1登陆测试
选择管理员页面进行登录:
在这里插入图片描述

          图8.1
输入错误的管理员ID或密码,无法登陆:
在这里插入图片描述

          图8.2
输入正确的管理员名和密码(as aaascx),可以正常登陆:
在这里插入图片描述

          图8.3
8.2.2各子模块测试
成功登陆后进入主界面:
在这里插入图片描述

              图8.4

a. 管理员登录界面功能测试:
点击职工管理展示下拉菜单:
在这里插入图片描述

            图8.5
点击添加职工:
在这里插入图片描述

        图8.6
输入一个已经存在的员工编号(由于主键约束故无法添加):
在这里插入图片描述
        图8.7
填入正确的员工信息:

在这里插入图片描述

        图8.8
点击查询员工:
在这里插入图片描述

        图8.9

点击修改员工,输入一个不存在的员工编号:
在这里插入图片描述
        图8.10

输入正确的员工编号点击修改:

在这里插入图片描述

        图8.10
确认删除点击删除:
在这里插入图片描述

        图8.11
再次点击查询:
在这里插入图片描述

        图8.12
点击添加工资信息:
在这里插入图片描述

              图8.13

进行工资信息修改(将奖金修改为50000):
在这里插入图片描述

            图8.14
点击确定后查询该员工工资信息结果为:
在这里插入图片描述

        图8.15

点击查询员工信息(按编号),可得如下查询结果:
在这里插入图片描述

        图8.16

点击查询员工信息(模糊查找),可得如下查询结果:
在这里插入图片描述

        图8.17

b.员工界面查询测试:
点击用户界面进行登录:

              图8.18
在这里插入图片描述

点击查询按钮后显示:
在这里插入图片描述

        图8.19

f.退出系统测试:
从主界面点击退出系统,成功从系统退出。
在这里插入图片描述

            图8.20

9.完成情况和总结

9.1完成情况
  本系统完成了任务书中要求的所有内容,包括对员工信息的增加、修改、删除、查询等功能以及对工资的新增、修改和查找功能,情况如下:
(1)可随时对公司员工信息:姓名、性别、所在部门、总工资进行增删改查。
(2)可随时对公司员工信息的工资情况进行增删改查。
(3)使用存储过程实现自动计算员工所得总工资(数据处理层面)。
(4)使用模糊查询,有关键字即可查询到员工信息。
(5)数据统计:调用存储过程实现输入基本工资和奖金后自动计算出总工资并存到数据库中。
(6)退出系统:完成所需操作后点击“退出系统”从本系统退出结束操作。所有功能经过测试均能够正确运行操作简便,界面友好。
9.2总结
  此次课程设计对我来说是一次不小的挑战:周一布置的课设任务,周二就有考试!在顾及考试的情况下还不能拉下SQL Server的课程设计。通过本次课程设计,我对数据库这门课程有了更加深刻的理解。设计的初期,在对数据库系统的分析、设计中,碰到了一些概念上较模糊的问题,通过查找课本以及查阅相关资料,问题得到了解决,设计工作也顺利进行;在最终设计表格的时候由于表格要求太多就设计了一个比较牵强的表,最后找老师辅导才得到老师指点进而得到了改正。另外,在运用JDBC数据库连接技术以及写程序的时候,我碰到过好多问题,有些是仔细一点就可以解决的,但是有些技术问题自己很难解决又不能及时请教老师,于是我就查阅相关书籍和网络资源,经过大量的查阅资料,终于解决了各种问题,一波三折的完成了课程设计。现在我对JAVA数据库编程技术也有了更进一步的了解和认识。这次课程设计,我不但收获了丰富的知识,而且更加认识到老师的重要性,遇到一些不是那么客观的问题的时候请教老师还是一个很好的选择。相信这些收获会使我终身受益。

10. 系统不足及需改进部分

10.1系统不足之处
  由于时间有限而且自己想拿一个好的成绩,所以我就得:在完成设计报告上的基本要求外再往外拓展比如:根据员工姓名信息进行模糊查询得到员工信息以及调用数据库存储过程来实现数据计算等功能,总结起来主要有一下不足:
(1) 对于数据的安全性检查处理做的不到位,例如:工资可以输入负数,而这是不符合实际情况的。
(2) 对于异常处理:由于设置了外键,所以再插入数据时可能由于主键不存在而造成抛异常,此时没有对话框提示错误。
(3) 界面不是很美观,有些地方的文本输入框大小和位置可能也设置的不合理,界面友好性还值得改进。

10.2改进办法
(1) 时间允许的情况下:可以数据库的字段添加约束,从而是数据的安全性得到保证。
(2) 时间允许的情况下:可以通过在系统抛异常的语句中加入消息对话框从而当程序抛异常时可以通过消息提示框让用户知道具体是什么地方报错了,增加用户友好性。
(3) 时间允许的情况下:通过对每一个文本输入框、按钮、文本输入区域等等的大小的位置的设置可以解决上述提到的不足三,通过添加背景图片以及对界面美化的力度来实现界面更加美观友好,增加用户体验。

11. 系统部分核心代码

11.1数据库层面
11.1.1存储过程

  此处用数据库新建查询并新建存储过程summ,有三个参数:职工的编号、员工的基本工资和奖金,该存储过程用于:当输入用户的编号以及所得的基本工资和奖金后,Java调用该存储过程实现自动计算该员工所得总工资并存入数据库中。

CREATE OR ALTER PROC summ 	@职工编号 nchar(10), 	@基本工资 int, 	@奖金 int AS UPDATE Salary SET 总工资 = @基本工资 + @奖金 where 职工编号=@职工编号 GO 

11.1.2 SQL语句实现Java操作数据库中数据

  1. 管理员登录:rs1=sql1.executeQuery(“select * from login1 where name ='”+name1+“’ and pwd='”+pwd1+“'”);
  2. 用户登录:rs2=sql2.executeQuery(“select * from login2 where name ='”+name2+“’ and pwd='”+pwd2+“'”);
  3. 用户查询个人信息: rs3=sql3.executeQuery(“select e.职工编号,e.职工姓名,e.职工性别,e.家庭住址,e.联系电话,d.部门名称,s.总工资 from Department d,Employee e,Salary s where d.部门编号 =e.部门编号 and s.职工编号=e.职工编号 and e.职工编号 ='”+name2+“'”);
  4. 向数据库中插入员工信息:st.executeUpdate(“insert into Employee values('”+EmployeeID+“‘,’”+EmployeeName+“‘,’”+EmployeeSex+“‘,’”+EMPNO+“‘,’”+EmployeeAddress+“‘,’”+EmployeePhone+“')”);
  5. 同时向职位表中插入员工信息:st.executeUpdate(“insert into Role values('”+EMPNO+“‘,’”+EmployeeRole+“‘,’”+EMPNO+“')”);
  6. 向工资表中插入工资信息:st.executeUpdate(“insert into Salary values('”+EmployeeID+“‘,’”+EmployeeSalary+“‘,’”+bonus+“‘,’”+总工资+“')”);
  7. 由于存在外键约束,所以在删除员工表的数据同时还要先删除掉工资表中的对应数据:st.executeUpdate(“delete from Salary where 职工编号 = '”+EmployeeID+“'”);
  8. 此处才是删除的员工表中的信息:st.executeUpdate(“delete from Employee where 职工编号 = '”+EmployeeID+“'”);
  9. 通过编号查询员工信息:ResultSet rs=st.executeQuery(“select e.职工编号,e.职工姓名,e.职工性别,r.部门编号,e.家庭住址,e.联系电话,r.职位名称 from Role r,Employee e where r.员工编号=e.职工编号 and e.职工编号 ='”+EmployeeID+“'”);
  10. 通过姓名信息模糊查询员工信息:ResultSet rs=st.executeQuery(“select e.职工编号,e.职工姓名,e.职工性别,r.部门编号,e.家庭住址,e.联系电话,r.职位名称 from Role r,Employee e where r.员工编号=e.职工编号 and 职工姓名 like '%”+employeeName+“%'”);
  11. st.executeUpdate(“update Employee set 职工姓名 ='”+jTextField3.getText()+“’ where 职工编号 ='”+jTextField2.getText()+“'”);
  12. st.executeUpdate(“update Employee set 职工性别 ='”+jTextField4.getText()+“’ where 职工编号 ='”+jTextField2.getText()+“'”);
  13. st.executeUpdate(“update Employee set 部门编号 ='”+jTextField5.getText()+“’ where 职工编号 ='”+jTextField2.getText()+“'”);
  14. st.executeUpdate(“update Employee set 家庭住址 ='”+jTextField6.getText()+“’ where 职工编号 ='”+jTextField2.getText()+“'”);
  15. st.executeUpdate( “update Employee set 联系电话 ='”+jTextField7.getText()+“’ where 职工编号 ='”+jTextField2.getText()+“'”);
  16. ResultSet rs=st.executeQuery(“select * from Salary where 职工编号 ='”+EmployeeID+“'”);
  17. jTextArea1.setText(“职工编号: “+rs.getString(“职工编号”)+”\n”+“职工基本工资:”+rs.getString(“职工基本工资”)+“\n”+“奖金:”+rs.getString(“奖金”)+“\n”+“总工资:”+rs.getString(“总工资”)+“\n”);

11.2 JAVA层面

  1. 调用存储过程
String call = "{call summ(?, ?, ?)}"; CallableStatement callStatement = con.prepareCall(call); callStatement.setString(1, jTextField2.getText()); callStatement.setInt(2, Integer.parseInt(jTextField3.getText())); callStatement.setFloat(3, Integer.parseInt(jTextField4.getText())); callStatement.execute(); callStatement.close(); 
  1. 连接数据库
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); //以系统默认用户身份,连接数据库 StudentManager Return DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=Student","ast","123456"); 

【参考文献】

[1] 王珊 . 数据库系统概论[M]. 第四版.高等教育出版社.2006.5.
[2] 赵明渊 . 数据库原理与应用教程SQL server 2014[M].清华大学出版社.2018.9.

惊喜


既然你看到了这里,需要项目源码的话那就私我叭~
由于太多人私信根本回复不过来啦!,我已经将项目文档打包发到了这篇文章上,大家需要的可以自行下载!

在这里插入图片描述


广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!