下面是我大二时数据库课程设计做的人力资源管理系统,包括设计文档以及详细源码,全文上万字左右,如有不足,欢迎指正
系统源码获取:
通过百度网盘分享的文件:人力资源管理系统链接:https://pan.baidu.com/s/1obZ9Gin-yL8uG6jHnk1_vQ?pwd=m1at 提取码:m1at
系统截图:
- 目录
在现代化的企业战略发展过程中,人力资源管理部门的工作十分关键。随着企业规模的扩大和业务的复杂化,传统的人力资源管理方式已无法满足企业高效、准确、便捷的管理需求。因此,开发一套符合企业实际需求的HRMS系统,对于提高人力资源管理效率,优化管理流程、降低管理成本具有重要意义
参考中国人民大学出版社的人力资源管理概论(董克用,李超平主编)一书,可构建出大中型人力资源管理部门的组织结构,如下图所示。
图表 1
故本系统针对人力资源部所需要的功能进行设计,系统角色包括人力资源部部长以及各大主管、其它部门主管还有非人力资源部员工,其中人力资源部部长和副总经理均具有该系统的全部权限,而各主管分别具有该系统的部分权限,其它部门主管对该系统具有查询权限,但不具有修改除自己以外其它员工信息的权限,非人力资源部员工可以仅可以管理查询自己的信息,保证了系统的安全性。
- 员工信息的集中管理,包括对于员工基本信息的增删改查。
- 部门信息管理,包括对部门信息的增删改查。
- 招聘流程管理,包括职位发布,简历搜集,面试安排等。
- 薪资管理,包括对于薪资信息的增删改查以及工资条的打印。
- 培训管理,包括对于培训信息的增删改查。
- 绩效管理,主要记录了员工的奖惩情况。
- 考勤管理,主要记录员工的打卡出勤,请假信息,该记录与工资计算挂钩。
- 通知管理,包括通知提醒和历史通知管理。
- 报表统计功能,便于管理层对于人力资源数据进行统计和分析。
- 员工信息录入、修改、查询功能
- 员工信息导入导出功能
- 部门信息的录入、删除、修改以及查询
- 规划和安排培训计划
- 对员工的奖惩情况进行记录删除修改管理
- 查看具体奖励惩罚信息
- 打卡记录查询功能
- 打卡记录增加删除功能
- 请假申请功能
- 通知的提醒功能
- 对旧通知的管理功能
- 提供多种报表模版,支持自定义报表
- 支持报表导出功能(如Excel、PDF等格式)
- 性能需求:系统应当具备良好的响应速度和并发处理能力,确保在高峰时段也能稳定运行。
- 安全性需求:系统应具备完善的安全措施,如数据加密,访问控制、审计日志等,确保数据的安全性和完整性。
- 易用性需求:系统界面应简洁明了,操作流程应简单易懂,减低用户的学习成本。
- 可扩展性需求:系统应具备良好的可扩展性,便于后续功能的添加和修改。
注:因副总经理和人力资源部长被设定为该系统的超级管理员,拥有该系统的全部体内,故不再描述其与系统的交互。
-
-
- 顶层数据流图说明
- 外部项
- 顶层数据流图说明
-
编号 | 名称 | 有关数据流 | 属性描述 |
E1 | 考核主管 | F1.1 F1.2 F1.3 F1.4 F1.5 | 为人力资源部门负责考核功能的主管,主要负责各部门部长的考核和制定大体的考核规则 |
E2 | 薪酬主管 | F2.1 F2.2 F2.3 F2.4 F2.5 F2.6 | 为人力资源部门负责薪资方面功能的主管,主要负责制定薪酬体系,包括薪酬的结构、发放的方式、确定的标准等等以及核算员工的具体薪酬数额 |
E3 | 招聘主管 | F3.1 F3.2 F3.3 F3.4 F3.5 F3.6 F3.7 F3.8 | 为人力资源部门负责招聘方面功能的主管,根据规定确定招聘的时间,范围,发布招聘信息 ,对招聘人员进行面试,给新员工办理各种手续 |
E4 | 普通员工 | F4.1 F4.2 F4.3 F4.4 F4.5 F4.6 F4.7 | 普通员工主要可以登录系统进行基本信息的查询,修改个人信息,进行打卡、请假等操作。 |
E5 | 培训主管 | F5.1 F5.2 F5.3 F5.4 F5.5 | 为人力资源部门负责培训方面功能的主管,主要负责制定培训体系,包括培训的形式、培训的项目、培训的责任等。 |
E6 | 简历投递人员(游客) | F6.1 F6.2 F6.3 | 为浏览官方网站投递简历信息的人,不需要登录信息。 |
E7 | 各部门部长 | F7.1 F7.2 F7.3 F7.4 F7.5 F7.6 | 主要是对部门员工进行管理,包括审批员工请假信息,录入详细的部门规则,以及对员工的奖惩记录等 |
-
-
-
- 处理逻辑
-
-
编号 | 名称 | 功能描述 | 处理频度 |
P1 | 人力资源管理系统 | 以web网站的形式管理人力资源 | 每次登录选择相应的功能时 |
-
-
-
- 数据流
-
-
- 数据流名称:F1.1、F3.5、F5.2、F2.5、F4.2、F7.1、F6.2
数据流说明:反馈信息
数据项 | 数据类型 | 长度 | 备注 |
反馈内容 | 字符型 | 500 | 是外部项对系统输入指令后的反馈结果 |
- 数据流名称:F1.3、F3.2、F5.1、F2.4、F4.1、F7.3、F6.1
数据流说明:查询条件
数据项 | 数据类型 | 长度 | 备注 |
查询条件 | 字符型 | 500 | 是外部项对系统输入输入的查询条件 |
- 数据流名称:F1.4、F3.6、F5.3、F2.2、F4.8、F7.2
数据流说明:通知信息
数据项 | 数据类型 | 长度 | 备注 |
通信信息编号 | 数字型 | 整型 | 编号 |
通知信息内容 | 字符型 | 500 | 是系统对外部项的通知信息 |
- 数据流名称:F1.2
数据流说明:员工考核情况
数据项 | 数据类型 | 长度 | 备注 |
考核编号 | 数字型 | 整型 | |
员工编号 | 数字型 | 整型 | |
主管编号 | 数字型 | 整型 | |
考核情况 | 字符型 | 10 | 考核情况包括:优秀,良好,及格,不及格 |
考核时间 | 日期/时间 | ||
考核地点 | 字符型 | 50 |
- 数据流名称:F1.5
数据流说明:各部门考核规则
数据项 | 数据类型 | 长度 | 备注 |
考核规则编号 | 数字型 | 整型 | |
考核名称 | 字符型 | 10 | |
部门编号 | 数字型 | 整型 | |
规则描述 | 字符型 | 255 | url |
生效日期 | 日期/时间 | ||
失效时间 | 日期/时间 | ||
创建时间 | 日期/时间 | ||
修改时间 | 日期/时间 |
- 数据流名称:F3.1
数据流说明:员工信息
数据项 | 数据类型 | 长度 | 备注 |
员工编号 | 数字型 | 整型 | |
员工照片 | 字符型 | 255 | url |
员工姓名 | 字符型 | 10 | |
员工账号密码 | 字符型 | 10 | 员工账号默认为员工编号,员工密码初始为123456 |
身份证号码 | 字符型 | 20 | |
入职时间 | 日期/时间 | ||
部门编号 | 数字型 | 整型 | |
职位编号 | 数字型 | 整型 |
- 数据流名称:F3.8
数据流说明:部门信息
数据项 | 数据类型 | 长度 | 备注 |
部门编号 | 数字型 | 整型 | |
部门名称 | 字符型 | 10 |
- 数据流名称:F3.3
数据流说明:招聘职位信息
数据项 | 数据类型 | 长度 | 备注 |
招聘信息编号 | 数字型 | 整型 | |
招聘岗位 | 字符型 | 10 | |
招聘要求 | 字符型 | 255 | url |
招聘人数 | 数字型 | 整型 | |
简历投递链接 | 字符型 | 255 | url |
发布人编号 | 数字型 | 整型 | |
截止时间 | 日期/时间 |
- 数据流名称:F3.4
数据流说明:面试安排信息
数据项 | 数据类型 | 长度 | 备注 |
面试信息编号 | 数字型 | 整型 | |
面试地点 | 字符型 | 50 | |
面试时间 | 日期/时间 | ||
面试考官编号 | 数字型 | 整型 | |
面试考官名称 | 字符型 | 10 | |
面试人名称 | 字符型 | 10 | |
面试人联系方式 | 字符型 | 20 |
- 数据流名称:F3.7
数据流说明:员工调度指令
数据项 | 数据类型 | 长度 | 备注 |
指令内容 | 字符型 | 500 | 包含删除、添加、修改员工信息等指令 |
- 数据流名称:F5.5
数据流说明:培训规则
数据项 | 数据类型 | 长度 | 备注 |
培训规则编号 | 数字型 | 整型 | |
培训规则名称 | 字符型 | 10 | |
培训规则具体内容 | 字符型 | 255 | url |
生效日期 | 日期/时间 | ||
失效日期 | 日期/时间 | ||
创建时间 | 日期/时间 | ||
修改时间 | 日期/时间 |
- 数据流名称:F5.4
数据流说明:培训信息
数据项 | 数据类型 | 长度 | 备注 |
培训编号 | 数字型 | 整型 | |
培训内容 | 字符型 | 255 | url |
培训对象 | 字符型 | 500 | |
培训开始时间 | 日期/时间 | ||
培训结束时间 | 日期/时间 |
- 数据流名称:F2.1
数据流说明:薪资调度指令
数据项 | 数据类型 | 长度 | 备注 |
指令内容 | 字符型 | 500 | 包含计算、修改、删除、添加薪资信息的指令 |
- 数据流名称:F2.6
数据流说明:薪资计算规则
数据项 | 数据类型 | 长度 | 备注 |
薪资计算规则编号 | 数字型 | 整型 | |
税率 | 浮点型 | ||
缺勤罚款 | 货币 | ||
迟到罚款 | 货币 | ||
薪资计算规则具体内容 | 字符型 | 255 | url |
生效日期 | 日期/时间 | ||
失效日期 | 日期/时间 | ||
建立日期 | 日期/时间 | ||
修改日期 | 日期/时间 |
- 数据流名称:F2.3
数据流说明:员工薪资信息
数据项 | 数据类型 | 长度 | 备注 |
工资编号 | 数字型 | 整型 | |
员工编号 | 数字型 | 整型 | |
时间 | 日期/时间 | ||
员工基本工资 | 货币 | ||
奖金金额 | 货币 | ||
迟到次数 | 数字型 | 整型 | |
缺勤次数 | 数字型 | 整型 | |
罚款金额 | 货币 | ||
税前工资 | 货币 | ||
税后工资 | 货币 | ||
薪资计算规则编号 | 数字型 | 整型 |
- 数据流名称:F4.7
数据流说明:培训报名信息
数据项 | 数据类型 | 长度 | 备注 |
员工编号 | 数字型 | 整型 | |
培训编号 | 数字型 | 整型 | |
报名时间 | 日期/时间 |
- 数据流名称:F4.6
数据流说明:请假信息
数据项 | 数据类型 | 长度 | 备注 |
请假编号 | 数字型 | 整型 | |
员工编号 | 数字型 | 整型 | |
审核主管编号 | 数字型 | 整型 | |
开始时间 | 日期/时间 | ||
结束时间 | 日期/时间 | ||
审核意见 | 字符型 | 10 | 通过/未通过/未审核 |
审核时间 | 日期/时间 |
- 数据流名称:F4.5
数据流说明:考勤信息
数据项 | 数据类型 | 长度 | 备注 |
员工编号 | 数字型 | 整型 | |
时间 | 日期/时间 | ||
考勤状态 | 字符型 | 10 | 迟到、缺勤、正常、请假 |
- 数据流名称:F4.4
数据流说明:信息修改内容
数据项 | 数据类型 | 长度 | 备注 |
员工编号 | 数字型 | 整型 | |
修改前内容 | 字符型 | 50 | |
修改后内容 | 字符型 | 50 |
- 数据流名称:F7.5
数据流说明:员工奖惩情况
数据项 | 数据类型 | 长度 | 备注 |
奖惩编号 | 数字型 | 整型 | |
员工编号 | 数字型 | 整型 | |
主管编号 | 数字型 | 整型 | |
奖惩情况 | 字符型 | 10 | 奖励/惩罚 |
奖惩内容 | 字符型 | 500 | 简要描述内容 |
处理时间 | 日期/时间 |
- 数据流名称:F7.4
数据流说明:详细的部门规则
数据项 | 数据类型 | 长度 | 备注 |
部门规则编号 | 数字型 | 整型 | |
部门编号 | 数字型 | 整型 | |
部门规则 | 字符型 | 255 | url |
- 数据流名称:F7.6
数据流说明:员工请假信息审核
数据项 | 数据类型 | 长度 | 备注 |
请假编号 | 数字型 | 整型 | |
审核意见 | 字符型 | 10 | 通过/未通过/未审核 |
- 数据流名称:F6.3
数据流说明:简历信息
数据项 | 数据类型 | 长度 | 备注 |
简历编号 | 数字型 | 整型 | |
照片 | 字符型 | 255 | url |
姓名 | 字符型 | 10 | |
身份证号码 | 字符型 | 20 | |
联系方式 | 字符型 | 20 | |
家庭住址 | 字符型 | 20 | |
简历内容 | 字符型 | 255 | url |
注:所以的外部项和查询处理逻辑均有查询条件和查询反馈的交互,鉴于篇幅过小,仅以招聘主管与查询的交互为例。
2.2.1.1外部项
同一层
2.2.1.2处理逻辑
编号 | 名称 | 功能描述 | 处理频度 |
P1.1 | 考核子系统 | 对员工进行考核并制定考核规则 | 每次考核 |
P1.2 | 部门管理 | 主要是各部门主管负责制定本部门的部门规则,并根据部门规则记录员工的奖惩情况 | 每次制定规则 |
P1.3 | 招聘子系统 | 发布招聘信息,组织面试,搜集简历并录入管理员工信息和部门信息 | 每次招聘 |
P1.4 | 通知 | 是不同角色之间交互的媒介,通过每日通知还有历史通知来提醒员工日常需要进行的任务 | 每天 |
P1.5 | 培训子系统 | 制定培训规制,并定期发布培训信息,员工报名之后记录报名信息 | 每次培训 |
P1.6 | 薪酬管理子系统 | 制定薪资计算规则,并管理薪资信息,负责计算核对员工的薪资信息 | 每次工资结算 |
P1.7 | 考勤子系统 | 记录员工请假信息、考勤信息和主管的审核信息 | 每次考勤 |
P1.8 | 信息修改 | 员工提出信息修改申请修改信息 | 每次申请 |
P1.9 | 查询 | 外部项输入查询指令,系统反馈信息 | 每次查询 |
2.2.1.2数据存储
-
- 数据存储代号:D1.1.1
数据存储名称:各部门考核规则
数据项 | 数据类型 | 长度 | 备注 |
考核规则编号 | 数字型 | 整型 | |
考核名称 | 字符型 | 10 | |
部门编号 | 数字型 | 整型 | |
规则描述 | 字符型 | 255 | url |
生效日期 | 日期/时间 | ||
失效时间 | 日期/时间 | ||
创建时间 | 日期/时间 | ||
修改时间 | 日期/时间 |
-
- 数据存储代号:D1.1.2
数据存储描述:考核情况
数据项 | 数据类型 | 长度 | 备注 |
考核编号 | 数字型 | 整型 | |
员工编号 | 数字型 | 整型 | |
主管编号 | 数字型 | 整型 | |
考核情况 | 字符型 | 10 | 考核情况包括:优秀,良好,及格,不及格 |
考核时间 | 日期/时间 | ||
考核地点 | 字符型 | 50 |
-
- 数据存储代号:D1.2.2
数据存储描述:员工奖惩情况
数据项 | 数据类型 | 长度 | 备注 |
奖惩编号 | 数字型 | 整型 | |
员工编号 | 数字型 | 整型 | |
主管编号 | 数字型 | 整型 | |
奖惩情况 | 字符型 | 10 | 奖励/惩罚 |
奖惩内容 | 字符型 | 500 | 简要描述 |
处理时间 | 日期/时间 |
-
- 数据存储代号:D1.2.1
数据存储描述:部门规则
数据项 | 数据类型 | 长度 | 备注 |
部门规则编号 | 数字型 | 整型 | |
部门编号 | 数字型 | 整型 | |
部门规则 | 字符型 | 255 | url |
-
- 数据存储代号:D1.3.1
数据存储描述:简历信息
数据项 | 数据类型 | 长度 | 备注 |
简历编号 | 数字型 | 整型 | |
照片 | 字符型 | 255 | url |
姓名 | 字符型 | 10 | |
身份证号码 | 字符型 | 20 | |
联系方式 | 字符型 | 20 | |
家庭住址 | 字符型 | 20 | |
简历内容 | 字符型 | 255 | url |
-
- 数据存储代号:1.3.2
数据存储描述:员工信息
数据项 | 数据类型 | 长度 | 备注 |
员工编号 | 数字型 | 整型 | |
员工照片 | 字符型 | 255 | url |
员工姓名 | 字符型 | 10 | |
员工账号密码 | 字符型 | 10 | 员工账号默认为员工编号,员工密码初始为123456 |
身份证号码 | 字符型 | 20 | |
入职时间 | 日期/时间 | ||
部门编号 | 数字型 | 整型 | |
职位编号 | 数字型 | 整型 |
-
- 数据存储代号:1.3.3
数据存储描述:部门信息
数据项 | 数据类型 | 长度 | 备注 |
部门编号 | 数字型 | 整型 | |
部门名称 | 字符型 | 10 |
-
- 数据存储代号:1.3.4
数据存储描述:面试信息
数据项 | 数据类型 | 长度 | 备注 |
面试信息编号 | 数字型 | 整型 | |
面试地点 | 字符型 | 50 | |
面试时间 | 日期/时间 | ||
面试考官编号 | 数字型 | 整型 | |
面试考官名称 | 字符型 | 10 | |
面试人名称 | 字符型 | 10 | |
面试人联系方式 | 字符型 | 20 |
-
- 数据存储代号:1.3.5
数据存储描述:招聘信息
数据项 | 数据类型 | 长度 | 备注 |
招聘信息编号 | 数字型 | 整型 | |
招聘岗位 | 字符型 | 10 | |
招聘要求 | 字符型 | 255 | url |
招聘人数 | 数字型 | 整型 | |
简历投递链接 | 字符型 | 255 | url |
发布人编号 | 数字型 | 整型 | |
截止时间 | 日期/时间 |
-
- 数据存储代号:1.4.1
数据存储描述:通知信息
数据项 | 数据类型 | 长度 | 备注 |
通信信息编号 | 数字型 | 整型 | 编号 |
通知信息内容 | 字符型 | 500 | 是系统对外部项的通知信息 |
-
- 数据存储代号:1.5.1
数据存储描述:培训信息
数据项 | 数据类型 | 长度 | 备注 |
培训编号 | 数字型 | 整型 | |
培训内容 | 字符型 | 255 | url |
培训对象 | 字符型 | 500 | |
培训开始时间 | 日期/时间 | ||
培训结束时间 | 日期/时间 |
-
- 数据存储代号:1.5.2
数据存储描述:培训规则
数据项 | 数据类型 | 长度 | 备注 |
培训规则编号 | 数字型 | 整型 | |
培训规则名称 | 字符型 | 10 | |
培训规则具体内容 | 字符型 | 255 | url |
生效日期 | 日期/时间 | ||
失效日期 | 日期/时间 | ||
创建时间 | 日期/时间 | ||
修改时间 | 日期/时间 |
-
- 数据存储代号:1.5.3
数据存储描述:培训报名信息
数据项 | 数据类型 | 长度 | 备注 |
员工编号 | 数字型 | 整型 | |
培训编号 | 数字型 | 整型 | |
报名时间 | 日期/时间 |
-
- 数据存储代号:1.6.1
数据存储描述:工资表
数据项 | 数据类型 | 长度 | 备注 |
工资编号 | 数字型 | 整型 | |
员工编号 | 数字型 | 整型 | |
时间 | 日期/时间 | ||
员工基本工资 | 货币 | ||
奖金金额 | 货币 | ||
迟到次数 | 数字型 | 整型 | |
缺勤次数 | 数字型 | 整型 | |
罚款金额 | 货币 | ||
税前工资 | 货币 | ||
税后工资 | 货币 | ||
薪资计算规则编号 | 数字型 | 整型 |
-
- 数据存储代号:1.6.2
数据存储描述:薪资计算规则
数据项 | 数据类型 | 长度 | 备注 |
薪资计算规则编号 | 数字型 | 整型 | |
税率 | 浮点型 | ||
缺勤罚款 | 货币 | ||
迟到罚款 | 货币 | ||
薪资计算规则具体内容 | 字符型 | 255 | url |
生效日期 | 日期/时间 | ||
失效日期 | 日期/时间 | ||
建立日期 | 日期/时间 | ||
修改日期 | 日期/时间 |
-
- 数据存储代号:1.6.3
数据存储描述:职位表
数据项 | 数据类型 | 长度 | 备注 |
职位编号 | 数字型 | 整形 | |
职位名称 | 字符型 | 10 | |
基本工资 | 货币 |
-
- 数据存储代号:1.7.1
数据存储描述:考勤信息
数据项 | 数据类型 | 长度 | 备注 |
员工编号 | 数字型 | 整型 | |
时间 | 日期/时间 | ||
考勤状态 | 字符型 | 10 | 迟到、缺勤、正常、请假 |
-
- 数据存储代号:1.7.2
数据存储描述:请假信息
数据项 | 数据类型 | 长度 | 备注 |
请假编号 | 数字型 | 整型 | |
员工编号 | 数字型 | 整型 | |
审核主管编号 | 数字型 | 整型 | |
开始时间 | 日期/时间 | ||
结束时间 | 日期/时间 | ||
审核意见 | 字符型 | 10 | 通过/未通过/未审核 |
审核时间 | 日期/时间 |
招聘子系统细化
考勤子系统细化
薪资管理子系统细化
培训子系统细化
以薪资管理子系统为例
总的功能模块图
注:因为在图中详细描述了实体的属性,且在数据字典中也详细描述了各表属性结构,故不单独以文字的形式再次描述关系模式。
1)各部门考核规则表
2)考核情况表
3)员工奖惩情况表
4)部门规则表
5)简历信息表
6)员工信息表
7)部门信息
8)面试信息
9)招聘信息
10)通知信息
11)培训信息
12)培训规则
13)培训报名信息
14)工资表
15)薪资计算规则
16)职位表
17)考勤信息表
18)请假信息
以薪资管理系统为例
--安全性
--创建角色——这里以培训主管为例
CREATE ROLE Training_Supervisor
GRANT SELECT,INSERT,UPDATE ON TrainingRegistrations TO Training_Supervisor
GRANT SELECT,INSERT,UPDATE ON TrainingInfo TO Training_Supervisor
GRANT SELECT,INSERT,UPDATE ON TrainingRules TO Training_Supervisor
注:本来是想实现除了招聘主管之外,其它角色对于员工信息表的操作只可以修改更新自己的信息,但是经过查询,发现该操作在数据库中比较难以实现,因为数据库中的权限往往是对应一整个表,而不是特定的某行。
--密码加密函数
CREATE FUNCTION EncryptByPassPhraseTest
(@pwd varchar(15),@MemberID INT)
RETURNS VARBINARY(256)
WITH ENCRYPTION
BEGIN
DECLARE @EncryptPWD VARBINARY(256)
SET @EncryptPWD= EncryptByPassPhrase('这是密码',@pwd,1,CONVERT(VARBINARY,@MemberID))
RETURN @EncryptPWD
END
--会员注册过程
CREATE PROC Register
@MemberID INT
,@PWD VARCHAR(15)
AS
BEGIN
SET NOCOUNT ON
DECLARE @EncryptPWD VARBINARY(256)
SELECT @EncryptPWD=dbo.EncryptByPassPhraseTest(@PWD,@MemberID)
UPDATE Employees
SET AccountPassword=@EncryptPWD
WHERE Employees.EmployeeID=@MemberID
END
--密码解密
CREATE FUNCTION DencryptByPassPhraseTest
(@pwd VARBINARY(256),@MemberID INT)
RETURNS VARCHAR(15)
WITH ENCRYPTION
BEGIN
DECLARE @DencryptPWD VARCHAR(15)
SET @DencryptPWD= CONVERT(VARCHAR(15),DECRYPTBYPASSPHRASE('这是密码',@pwd,1,CONVERT(VARBINARY,@MemberID)))
RETURN @DencryptPWD
END
--密码验证过程
CREATE PROC MemberLogin
@MemberID INT
,@PWD VARCHAR(15)
AS
BEGIN
SET NOCOUNT ON
DECLARE @DencryptPWD VARCHAR(15)
DECLARE @EncryptPWD VARBINARY(256)
SELECT @EncryptPWD =CONVERT(varbinary,AccountPassword)
FROM Employees
WHERE EmployeeID = @MemberID
SELECT @DencryptPWD=dbo.DencryptByPassPhraseTest(@EncryptPWD,@MemberID)
IF @DencryptPWD=@PWD
PRINT '成功登陆'
ELSE
PRINT '密码和会员号不匹配,请重新输入'
END
--各部门考核规则
CREATE TABLE EvaluationRules (
RuleID INT IDENTITY(1,1) PRIMARY KEY, -- 考核规则编号,整型,自增主键
DepartmentID VARCHAR(10) NOT NULL, -- 考核名称
DepartmentID INT NOT NULL, -- 部门编号
RuleDescription VARCHAR(255), -- 规则描述
EffectiveDate DATETIME NOT NULL, -- 生效日期
ExpirationDate DATETIME, -- 失效时间
CreateTime DATETIME DEFAULT GETDATE(), -- 创建时间,默认值为当前时间
UpdateTime DATETIME DEFAULT NULL -- 修改时间
);
--建立外键
ALTER TABLE EvaluationRules
ADD CONSTRAINT FK_Eva FOREIGN KEY(DepartmentID) REFERENCES Departments(DepartmentID)
--建立触发器更新修改时间
CREATE TRIGGER TRIG_Eva
ON EvaluationRules
FOR UPDATE
AS
BEGIN
IF UPDATE(RuleName) OR UPDATE(RuleDescription) OR UPDATE(EffectiveDate) OR UPDATE(ExpirationDate)
BEGIN
UPDATE EvaluationRules
SET UpdateTime=GETDATE()
WHERE EvaluationRules.RuleID IN (SELECT RuleID FROM INSERTED)
END
END;
-建立考核情况表
CREATE TABLE EvaluationRecords (
EvaluationID INT IDENTITY(1,1) PRIMARY KEY, -- 考核编号
EmployeeID INT NOT NULL, -- 员工编号
SupervisorID INT NOT NULL, -- 主管编号
EvaluationStatus VARCHAR(10) NOT NULL CHECK(EvaluationStatus IN ('优秀','良好','及格','不及格')), -- 考核情况
EvaluationDateTime DATETIME DEFAULT GETDATE(), -- 考核时间
EvaluationLocation VARCHAR(50) NOT NULL -- 考核地点
);
--建立外键
ALTER TABLE EvaluationRecords
ADD CONSTRAINT FK_EvaR1 FOREIGN KEY(EmployeeID) REFERENCES Employees(EmployeeID)
ALTER TABLE EvaluationRecords
ADD CONSTRAINT FK_EvaR2 FOREIGN KEY(SupervisorID) REFERENCES Employees(EmployeeID)
--建立员工奖惩情况表
CREATE TABLE RewardsAndPunishments (
RewardPunishmentID INT IDENTITY(1,1) PRIMARY KEY, -- 奖惩编号
EmployeeID INT NOT NULL, -- 员工编号
SupervisorID INT NOT NULL, -- 主管编号
RewardPunishmentType VARCHAR(10) NOT NULL CHECK(RewardPunishmentType IN ('奖励','惩罚')), -- 奖惩情况(奖励/惩罚)
RewardPunishmentContent varchar(500), -- 奖惩内容(简要描述),使用TEXT类型以支持更长的文本
ProcessingDateTime DATETIME DEFAULT GETDATE() -- 处理时间
);
--建立外键
ALTER TABLE RewardsAndPunishments
ADD CONSTRAINT FK_Rew1 FOREIGN KEY(EmployeeID) REFERENCES Employees(EmployeeID)
ALTER TABLE RewardsAndPunishments
ADD CONSTRAINT FK_Rew2 FOREIGN KEY(SupervisorID) REFERENCES Employees(EmployeeID)
--建立部门规则表
CREATE TABLE DepartmentRules (
DepartmentRuleID INT IDENTITY(1,1) PRIMARY KEY, -- 部门规则编号
DepartmentID INT NOT NULL, -- 部门编号
DepartmentRule VARCHAR(255) NOT NULL -- 部门规则(这里假设为URL)
);
--建立外键
ALTER TABLE DepartmentRules
ADD CONSTRAINT FK_Dep FOREIGN KEY(DepartmentID) REFERENCES Departments(DepartmentID)
--建立招聘信息表
CREATE TABLE JobPostings (
JobPostingID INT IDENTITY(1,1) PRIMARY KEY, -- 招聘信息编号 (唯一标识符)
JobPosition VARCHAR(10) NOT NULL, -- 招聘岗位
JobRequirements VARCHAR(255) NOT NULL, -- 招聘要求
NumberOfPositions INT NOT NULL, -- 招聘人数
ResumeSubmissionLink VARCHAR(255) NOT NULL, -- 简历投递链接 (假设为URL格式)
Deadline DATETIME NOT NULL, -- 截止时间
SupervisorID INT --发布人编号
);
ALTER TABLE JobPostings
ADD CONSTRAINT FK_Job FOREIGN KEY(SupervisorID) REFERENCES Employees(EmployeeID);
--建立简历信息表
CREATE TABLE Resumes (
ResumeID INT IDENTITY(1,1) PRIMARY KEY, -- 简历编号
PhotoURL VARCHAR(255) NOT NULL, -- 照片(URL)
Name VARCHAR(10) NOT NULL, -- 姓名
IDCardNumber VARCHAR(20) NOT NULL, -- 身份证号码
ContactWay VARCHAR(20) NOT NULL, -- 联系方式
HomeAddress VARCHAR(20) NOT NULL, -- 家庭住址
ResumeContent VARCHAR(255) NOT NULL -- 简历内容
);
--建立约束检查身份证号的合法性
--建立函数检查身份证号的合法性
CREATE FUNCTION IsvalidIDCard ( @IDCardNo VARCHAR(20) )
RETURNS BIT
AS
BEGIN
DECLARE @Length INT ,
@Loop INT ,
@Sum INT
DECLARE @SingleChar CHAR
SET @Sum = 0
IF LTRIM(RTRIM(@IDCardNo)) = ''
BEGIN
RETURN 0
END
SET @Length = LEN(@IDCardNo)
--判断位数
IF @Length < > 18
AND @Length < > 15
BEGIN
RETURN 0
END
IF @Length = 18
BEGIN
IF ISNUMERIC(LEFT(@IDCardNo, 17)) = 0
BEGIN
RETURN 0
END
IF ISDATE(SUBSTRING(@IDCardNo, 7, 4) + ' - '
+ SUBSTRING(@IDCardNo, 11, 2) + ' - '
+ SUBSTRING(@IDCardNo, 13, 2)) = 0
BEGIN
RETURN 0
END
SET @Loop = 17
WHILE ( @Loop >= 1 )
BEGIN
SET @Sum = @Sum
+ CONVERT(INT, REPLACE(SUBSTRING(@IDCardNo, @Loop,
1), '.', ''))
* ( POWER(2, ( 18 - @Loop )) % 11 )
SET @Loop = @Loop - 1
END
SET @Loop = @Sum % 11
IF @Loop = 0
BEGIN
SET @SingleChar = '1'
END
ELSE
IF @Loop = 1
BEGIN
SET @SingleChar = '0'
END
ELSE
IF @Loop = 2
BEGIN
SET @SingleChar = 'X'
END
ELSE
BEGIN
SET @SingleChar = CONVERT(VARCHAR(2), ( 12- @Loop ))
END
IF LOWER(RIGHT(@IDCardNo, 1)) < > LOWER(@SingleChar)
BEGIN
RETURN 0
END
END
ELSE
IF @Length = 15
BEGIN
IF ISNUMERIC(@IDCardNo) = 0
BEGIN
RETURN 0
END
IF ISDATE('19' + SUBSTRING(@IDCardNo, 7, 2) + ' - '
+ SUBSTRING(@IDCardNo, 9, 2) + ' - '
+ SUBSTRING(@IDCardNo, 11, 2)) = 0
BEGIN
RETURN 0
END
END
RETURN 1
END
--建立触发器当输入身份证号码的时候自动触发
CREATE TRIGGER TRG_Re_IDCARD
ON Resumes
FOR INSERT,UPDATE
AS
BEGIN
DECLARE @IDCardNumber VARCHAR(20)
SELECT @IDCardNumber=IDCardNumber FROM INSERTED
IF dbo.IsvalidIDCard(@IDCardNumber)=0
BEGIN
PRINT '身份证号码不准确,请检查输入的数据!'
ROLLBACK
END
END
--验证联系方式的准确性,经过查询得知一般在通过第三方服务进行验证,在到达数据库时已经正确,故而在此处不再验证
--建立员工信息表
CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY, -- 员工编号
EmployeePhoto VARCHAR(255) NOT NULL, -- 员工照片URL
EmployeeName VARCHAR(10) NOT NULL, -- 员工姓名
AccountPassword VARCHAR(255) DEFAULT '123456' NOT NULL, -- 员工密码(加密后存储)
IDCardNumber VARCHAR(20) NOT NULL, -- 身份证号码
HireDate DATETIME NOT NULL, -- 入职时间
DepartmentID INT NOT NULL, -- 部门编号
PositionID INT NOT NULL, -- 职位编号
);
--建立外键约束
ALTER TABLE Employees
ADD CONSTRAINT FK_Emp1 FOREIGN KEY(DepartmentID) REFERENCES Departments(DepartmentID)
ALTER TABLE Employees
ADD CONSTRAINT FK_Emp2 FOREIGN KEY(PositionID) REFERENCES Positions(PositionID)
--建立约束检查身份证号的合法性
--验证身份证号码合法性的函数详见Resumes
--建立触发器当输入身份证号码的时候自动触发
CREATE TRIGGER TRG_Em_IDCARD
ON Employees
FOR INSERT,UPDATE
AS
BEGIN
DECLARE @IDCardNumber VARCHAR(20)
SELECT @IDCardNumber=IDCardNumber FROM INSERTED
IF dbo.IsvalidIDCard(@IDCardNumber)=0
BEGIN
PRINT '身份证号码不准确,请检查输入的数据!'
ROLLBACK
END
END
---建立部门信息
CREATE TABLE Departments (
DepartmentID INT PRIMARY KEY, -- 部门编号,作为主键
DepartmentName VARCHAR(10) NOT NULL, -- 部门名称,不允许为空
SupervisorID INT NOT NULL --部门负责人编号
);
ALTER TABLE Departments
ADD CONSTRAINT FK_Dep FOREIGN KEY(SupervisorID) REFERENCES Employees(EmployeeID);
--建立面试信息表
CREATE TABLE Interviews (
InterviewID INT IDENTITY(1,1) PRIMARY KEY, -- 面试信息编号 (唯一标识符)
InterviewLocation VARCHAR(50) NOT NULL, -- 面试地点
InterviewTime DATETIME NOT NULL, -- 面试时间
InterviewerID INT NOT NULL, -- 面试考官编号
InterviewerName VARCHAR(10) NOT NULL, -- 面试考官名称
CandidateName VARCHAR(10) NOT NULL, -- 面试人名称
CandidateContactInfo VARCHAR(20) NOT NULL -- 面试人联系方式
);
--建立外键
ALTER TABLE Interviews
ADD CONSTRAINT FK_Int FOREIGN KEY(InterviewerID) REFERENCES Employees(EmployeeID)
--建立通知信息表
CREATE TABLE CommunicationInfo (
CommunicationID INT IDENTITY(1,1) PRIMARY KEY, -- 通信信息编号(唯一标识符)
NotificationContent VARCHAR(500) NOT NULL -- 通知信息内容(是系统对外部项的通知信息)
);
--建立培训信息表
CREATE TABLE TrainingInfo (
TrainingID INT IDENTITY(1,1) PRIMARY KEY, -- 培训编号(唯一标识符)
TrainingContent VARCHAR(255) NOT NULL, -- 培训内容(URL格式)
TrainingTarget VARCHAR(500) NOT NULL, -- 培训对象
TrainingStartTime DATETIME NOT NULL, -- 培训开始时间
TrainingEndTime DATETIME NOT NULL -- 培训结束时间
);
--建立培训规则表
CREATE TABLE TrainingRules (
TrainingRuleID INT IDENTITY(1,1) PRIMARY KEY, -- 培训规则编号(唯一标识符)
TrainingRuleName VARCHAR(10) NOT NULL, -- 培训规则名称
TrainingRuleContent VARCHAR(255) NOT NULL, -- 培训规则具体内容(URL格式)
EffectiveDate DATETIME NOT NULL, -- 生效日期
ExpirationDate DATETIME, -- 失效日期(如果规则永不过期,则可以为NULL)
CreateTime DATETIME NOT NULL DEFAULT GETDATE(), -- 创建时间
UpdateTime DATETIME-- 修改时间
);
--建立触发器自动更新修改时间
CREATE TRIGGER TRIG_Tra
ON TrainingRules
FOR UPDATE
AS
BEGIN
IF UPDATE(TrainingRuleName) OR UPDATE(TrainingRuleContent) OR UPDATE(EffectiveDate) OR UPDATE(ExpirationDate)
BEGIN
UPDATE TrainingRules
SET UpdateTime=GETDATE()
WHERE TrainingRules.TrainingRuleID IN (SELECT TrainingRuleID FROM INSERTED)
END
END;
-REATE TABLE TrainingRegistrations (
EmployeeID INT NOT NULL, -- 员工编号
TrainingID INT NOT NULL, -- 培训编号
RegistrationDate DATETIME DEFAULT GETDATE() NOT NULL, -- 报名时间(日期/时间)
PRIMARY KEY (EmployeeID, TrainingID), -- 主键由员工编号和培训编号组合而成
);
--建立外键
ALTER TABLE TrainingRegistrations
ADD CONSTRAINT FK_TraR1 FOREIGN KEY(EmployeeID) REFERENCES Employees(EmployeeID)
ALTER TABLE TrainingRegistrations
ADD CONSTRAINT FK_TraR2 FOREIGN KEY(TrainingID) REFERENCES TrainingInfo(TrainingID)--建立触发器实现如果报名时间晚于培训结束时间,则报名失败
CREATE TRIGGER TRG_CHE
ON TrainingRegistrations
FOR INSERT
AS
BEGIN
DECLARE @TrainingID INT
DECLARE @TraingDate DATE
SELECT @TrainingID=INSERTED.TrainingID
FROM INSERTED
SELECT @TraingDate=TrainingInfo.TrainingEndTime
FROM TrainingInfo
WHERE @TrainingID=TrainingInfo.TrainingID
IF GETDATE()>@TraingDate
BEGIN
PRINT '培训时间已过,无法报名!'
ROLLBACK
END
END
--建立工资表
CREATE TABLE EmployeeSalaries (
SalaryID INT IDENTITY(1,1) PRIMARY KEY, -- 工资编号(自动递增)
EmployeeID INT NOT NULL, -- 员工编号
SalaryDate DATE NOT NULL, -- 时间(日期)
BaseSalary DECIMAL(10, 2) NOT NULL, -- 员工基本工资
BonusAmount DECIMAL(10, 2) DEFAULT 0, -- 奖金金额
LateTimes INT DEFAULT 0, -- 缺勤次数
AbsentTimes INT DEFAULT 0, -- 缺勤次数
FineAmount DECIMAL(10, 2) DEFAULT 0, -- 罚款金额
GrossSalary DECIMAL(10, 2) NOT NULL,
NetSalary DECIMAL(10, 2)NOT NULL,
SalaryCalculationRuleID INT --采用哪套规则计算薪资
);
--建立工资表的相关处理逻辑
CREATE PROC EXRC_EMPL(@EmployeeID INT,@SalaryDate DATE,@SalaryCalculationRuleID INT)
AS
BEGIN
DECLARE @GrossSalary DECIMAL(10, 2)
DECLARE @NetSalary DECIMAL(10, 2)
DECLARE @BaseSalary DECIMAL(10, 2)
DECLARE @BonusAmount DECIMAL(10, 2)
DECLARE @FineForLate DECIMAL(10, 2) -- 迟到的罚款金额
DECLARE @FineForAbsence DECIMAL(10, 2) -- 缺勤的罚款金额
DECLARE @LateTimes INT
DECLARE @AbsenceTimes INT
DECLARE @FineAmount DECIMAL(10, 2)
DECLARE @TaxRate DECIMAL(10, 2)
SET @FineAmount=(SELECT FineAmount FROM SalaryCalculationRules WHERE @SalaryCalculationRuleID=SalaryCalculationRules.SalaryCalculationRuleID)
SET @FineForAbsence=(SELECT FineForAbsence FROM SalaryCalculationRules WHERE @SalaryCalculationRuleID=SalaryCalculationRules.SalaryCalculationRuleID)
SET @TaxRate=(SELECT TaxRate FROM SalaryCalculationRules WHERE @SalaryCalculationRuleID=SalaryCalculationRules.SalaryCalculationRuleID)
SELECT
@BaseSalary = BaseSalary,
@BonusAmount = BonusAmount
FROM
EmployeeSalaries
WHERE
EmployeeID = @EmployeeID
SELECT
@LateTimes=(SELECT COUNT(*) FROM EmployeeAttendance
WHERE EmployeeAttendance.AttendanceStatus='迟到'
AND EmployeeAttendance.EmployeeID=@EmployeeID)
SELECT
@LateTimes=(SELECT COUNT(*) FROM EmployeeAttendance
WHERE EmployeeAttendance.AttendanceStatus='缺勤'
AND EmployeeAttendance.EmployeeID=@EmployeeID)
SET @FineAmount = (@FineForLate * @LateTimes) + (@FineForAbsence * @AbsenceTimes)-- 计算罚款金额
SET @GrossSalary = @BaseSalary + @BonusAmount - @FineAmount-- 计算总工资和净工资
SET @NetSalary = @GrossSalary * @TaxRate;
INSERT INTO EmployeeSalaries (EmployeeID, SalaryDate, BaseSalary, BonusAmount, FineAmount, GrossSalary, NetSalary) -- 插入新的工资记录到EmployeeSalaries表中
VALUES (@EmployeeID, @SalaryDate, @BaseSalary, @BonusAmount, @FineAmount, @GrossSalary, @NetSalary);
DELETE FROM EmployeeAttendance--每次计算完工资就清除该员工的考勤记录表
WHERE EmployeeAttendance.EmployeeID=@EmployeeID
END;
--建立外键
ALTER TABLE EmployeeSalaries
ADD CONSTRAINT FK_ES1 FOREIGN KEY(EmployeeID) REFERENCES Employees(EmployeeID)
ALTER TABLE EmployeeSalaries
ADD CONSTRAINT FK_ES2 FOREIGN KEY(ESalaryCalculationRuleID) REFERENCES SalaryCalculationRules(SalaryCalculationRuleID)
---建立薪资计算规则表
CREATE TABLE SalaryCalculationRules (
SalaryCalculationRuleID INT PRIMARY KEY, -- 薪资计算规则编号
TaxRate DECIMAL(10, 2) NOT NULL, --税率
FineAmount DECIMAL(10, 2) NOT NULL, --迟到罚款
FineForAbsence DECIMAL(10, 2) NOT NULL, --缺勤罚款
SalaryCalculationDetails VARCHAR(255) NOT NULL, -- 薪资计算规则具体内容,url
EffectiveDate DATETIME NOT NULL, -- 生效日期
ExpirationDate DATETIME, -- 失效日期
CreationDate DATETIME NOT NULL DEFAULT GETDATE(), -- 建立日期
UpdateTime DATETIME NULL -- 修改日期
);
--建立触发器自动更新修改时间
CREATE TRIGGER TRIG_SCR
ON SalaryCalculationRules
FOR UPDATE
AS
BEGIN
IF UPDATE(SalaryCalculationDetails) OR UPDATE(SalaryCalculationDetails) OR UPDATE(EffectiveDate) OR UPDATE(ExpirationDate)
BEGIN
UPDATE SalaryCalculationRules
SET UpdateTime=GETDATE()
WHERE SalaryCalculationRules.SalaryCalculationRuleID IN (SELECT SalaryCalculationRuleID FROM INSERTED)
END
END
--建立职位表
CREATE TABLE Positions (
PositionID INT IDENTITY(1,1) PRIMARY KEY, -- 职位编号(自动递增)
PositionName VARCHAR(10) NOT NULL, -- 职位名称
BaseSalary DECIMAL(10, 2) NOT NULL -- 基本工资
);
CREATE TABLE LeaveRequests (
LeaveID INT IDENTITY(1,1) PRIMARY KEY, -- 请假编号(自动递增)
EmployeeID INT NOT NULL, -- 员工编号
SupervisorID INT NOT NULL, -- 审核部长编号
StartTime DATETIME NOT NULL, -- 开始时间(日期/时间)
EndTime DATETIME NOT NULL, -- 结束时间(日期/时间)
ApprovalStatus VARCHAR(10) NOT NULL DEFAULT '未审核' CHECK (ApprovalStatus IN ('通过', '未通过', '未审核')), -- 审核意见
ApprovalTime DATETIME, -- 审核时间(日期/时间)
);
--建立外键
ALTER TABLE LeaveRequests
ADD CONSTRAINT FK_LR1 FOREIGN KEY(EmployeeID) REFERENCES Employees(EmployeeID)
ALTER TABLE LeaveRequests
ADD CONSTRAINT FK_LR2 FOREIGN KEY(SupervisorID ) REFERENCES Employees(EmployeeID)
--建立考勤信息表
CREATE TABLE EmployeeAttendance (
EmployeeID INT NOT NULL, -- 员工编号
AttendanceTime DATETIME NOT NULL, -- 时间(日期/时间)
AttendanceStatus VARCHAR(10) NOT NULL CHECK (AttendanceStatus IN ('迟到', '缺勤', '正常', '请假')), -- 考勤状态
PRIMARY KEY (EmployeeID, AttendanceTime), -- 主键由员工编号和考勤时间组合而成
);
--建立外键
ALTER TABLE EmployeeAttendance
ADD CONSTRAINT FK_EA FOREIGN KEY(EmployeeID) REFERENCES Employees(EmployeeID)
--每次计算完工资之后清理考勤信息表(在工作表已实现)
--建立考勤时间的降序索引
CREATE NONCLUSTERED INDEX NON_EMP
ON EmployeeAttendance (AttendanceTime DESC)
在写本篇文档的时候,刚开始的设计是划分了四个角色,主管,总经理,普通员工,还有简历投递人员,但是如果单从主管来划分权限,其它部门的主管应当不具备删除,增加员工信息这项功能的,但是他们又应该具有部门管理的功能,所以进行了修改。但是因为时间的关系,该数据库的设计还不够完善,比如在安全性设计这一部分,不完善,还有对于薪资计算规则等部分表的设计不够具体,会影响计算结果,比如对于薪资计算规则表,用的是url来存储文件路径,但是在数据库中没有存储具体规则,在计算工资的时候就比较困难,还有对于想实现的显示培训进度的功能,不同的员工具有不同的培训要求,但是在培训规则表中,也没有具体规则,所以对于显式计算进度会比较困难,如果时间允许的话,把各种规则细化会比较符合实际情况。在编写此篇文档的时候确实花费了不少的时间,后面就比较疲乏了,对于一些细节上的东西可能考虑得不仔细,但是也学到了很多,比如如何验证身份证号码的正确性,如何对密码进行加密存储等内容,对数据库的一些操作也更加熟悉了。