HNUST - Python+Mysql数据库课设
一、实验题目
人事管理系统
二、实验目的
企业人事管理系统主要用于员工个人资料的录入、职务变动的记录和管理。使用人事管理系统,便于公司领导掌握人员的动向,及时调整人才的分配。通过实现企业人事管理系统,加深对关系数据库理论知识的理解,通过使用具体的 DBMS,掌握一种实际的数据库管理系统并掌握其操作技术,熟练掌握使用数据库前端开发工具,进一步提高同学们运用数据库技术解决实际问题的能力。
企业人事管理系统的实现,需要实现以下功能点——
- 新员工资料的输入
- 自动分配员工号,并且设置初始的用户密码
- 人事变动的详细记录,包括岗位和部门的调整
- 员工信息的查询与修改包括员工的个人信息和密码等
三、总体设计
A - 技术架构
后端脚本语言: Python
Python GUI软件框架: ttkbootstrap
数据库: Mysql
B - 模块介绍
static
: 保存静态文件
sql.xml
: 保存数据库操作语句
webcome.gif
: 登录页面的欢迎图片
exec_sql.py
: 封装了各种针对数据操作,实现具体的功能
get_sql.py
: 从xml文件中获取sql语句
GUI.py
: 图形化页面绘制
main.py
: 主函数
C - 设计步骤
- 需求分析
- 数据库设计
- 编写数据库处理语句和功能实现语句
- 用户界面设计
- 测试运行
四、详细设计
A - 需求分析
本实验主要目的是人事管理,所以首先需要将每个员工的属性分析出来。我们用一张员工表存储员工的数据,其中具体分为核心数据(非空)、边缘数据(可以为空)与员工ID(主键)。其中主键有员工ID;核心数据有:密码、权限、姓名、级别、部门、职位、学历、联系方式、状态;边缘数据有:生日、专业、地址、电子邮箱、备注。
接下来需要设计的是部门表,部门表中需要存储的数据有:部门ID、部门名称、部门经理和简介。部门表中的数据一般不做修改。
最后需要设计的表格为人事变动记录表,其中需要存储的数据为:记录ID、变动的人员ID、人事变动记录的性质、描述,其中可以看出,变动的人员ID为员工ID的外键。
最后还有一些特殊的功能表需要设计,比如如果数据只有固定的种类,则可以在表中存储简单的标记,然后单独存储标记与真实数据的映射,也就是存储外键。这些表将在数据库设计中提到。
B - 数据库设计
概念模型设计
关系模型如下:
员工(员工编号, 密码, 权限, 姓名, 性别, 生日, 部门, 职位, 学历, 专业, 地址,联系方式, 电子邮箱, 当前状态, 备注信息)
部门(部门编号, 部门名称, 简介, 部门主管)
员工部门所属(记录编号, 员工编号,部门编号)
人事变动记录(记录编号, 员工编号, 变动, 详细描述)
逻辑模型设计
员工表的设计
人事变动表的数据
职位表的数据
学历表的数据
上述三张表存储了员工表外键对应的数据信息,能够让减少员工表这个需要经常操作的表的数据量,从而优化性能。
部门表的设计
记录表的设计
之前E-R图清楚的说明了员工与部门一对多的关系,所以我们还需要一张表来保存它们之间的关系
所属表的设计
物理模型的设计
我们针对三张核心表(员工表,部门表和记录表)进行了物理模型的设计。首先介绍员工表 ——
值得一提的是,员工表中的一些数据只能选定固定选项。有些通过简单的映射就可以使用enum类型存储,有些则使用int类型存储,这些映射关系被存储的其它的表中供程序参考使用,但是因为每次读取时都需要消耗资源,所以在程序设计时,直接使用了全局变量进行存储这些映射关系。还有一点需要说明,因为默认值的缘故,所以并非所有的核心属性都加上了非空的约束。
接下来介绍部门表——
部门表没有什么需要说明的地方,因为其中的数据除了部门经理外都是不需要更改的。因为没有针对部门的查询操作,所以这些信息暂时还需要手动更改。
最后介绍记录表——
记录表中的person为员工表中员工编号的外键,description可以根据需求添加人员变动记录的详细信息
C - 编写数据库处理语句和功能实现语句
数据库处理语句我们参考了SqlMap项目的处理方式,使用首先先在Mysql环境中测试语句的正确性,确认无误后,使用XML保存,类似于SqlMap保存payload。因为需要用到预处理语句,所以将SQL语句中需要传参的地方使用%S
替代方便调用时预处理的进行。
<?xml version="1.0" encoding="utf-8" ?>
<root>
<mysql>
<select>
<login>
<person>select authority, id from person where name = %s and passwd = md5(%s)</person>
</login>
<search>
<person>select id, name from person where name regexp %s</person>
</search>
<data>
<person>select * from person where id = %s</person>
</data>
</select>
<insert>
<params>[name, passwd, sex, d_id, j_id, e_level, tel]</params>
<person>INSERT INTO person(name, passwd, sex, department, job, edu_level, tel) values(%s, MD5(%s), %s, %s, %s, %s, %s);</person>
<pdmap>insert into pdmap(p_id, d_id) values(%s, %s)</pdmap>
<personnel>insert into personnel(person, `change`) values(%s, 0)</personnel>
</insert>
<update>
<data>
<params>[birthday, specialty, address, email, state, remark, p_id]</params>
<person>update person set birthday = %s, specialty=%s, address=%s, email=%s, state=%s, remark=%s where id = %s;</person>
</data>
<core>
<params>[name, sex, j_id, e_level, tel, p_id]</params>
<person>update person set name = %s,sex = %s,job = %s,edu_level = %s,tel = %s where id = %s</person>
</core>
<passwd>
<params>[passwd, p_id]</params>
<person>update person set passwd = md5(%s) where id = %s</person>
</passwd>
<change>
<params>[p_id, new_d_id]</params>
<person>update person set department = %s where id = %s</person>
<pdmap>update pdmap set d_id = %s where p_id = %s</pdmap>
<personnel>insert into personnel(person, `change`) values(%s, 1)</personnel>
</change>
</update>
<delete>
<params>[del_id]</params>
<person>delete from person where id = %s</person>
<pdmap>delete from pdmap where p_id = %s</pdmap>
<personnel>insert into personnel(person, `change`) values(%s, 2)</personnel>
</delete>
</mysql>
</root>
本实验将业务逻辑代码封装到一个文件中实现了:exec_sql.py,其中具体函数功能如下——
在GUI页面中,通过调用这些函数实现具体的业务逻辑
D - 用户界面的设计
先展示一下程序的整体流程
首先系统将用户分为了两种权限,一种是管理员权限,一种是普通用户权限,跟据登录页面的输入,分别为两种权限的用户分配不同的操作页面
普通用户只有自己数据的查询权限 ——
而管理员用户具有对普通用户数据的查询、修改、增加、删除权限,并且拥有增加和删除普通用户的权限。
入职登记页面是增加用户同时需要输入ta的核心数据的页面
信息查询页面需要让你选择接下来的查询方式
按照ID查询可以唯一查询出一条数据,然后进入数据操作页面
按照名称查询是一种模糊查询,能够查询出所有符合条件的数据,如果数据只有一条,则进入数据操作页面;如果数据存在多条,则会将所有符合条件的数据ID输入提供选择
接下来展示唯一查询到一条数据后的操作页面
可以看到,可供管理员进行的操作有 —— 查询和修改核心数据、查询和修改边缘数据、部门变动和办理离职(即删除用户),我们一一展示以上功能。
以上就是用户页面设计的全部内容
E - 测试运行
实现了实验的功能要求,未发现恶性bug
五、实验结果与分析
- 新员工资料的输入 ✔
- 自动分配员工号,并且设置初始的用户密码 ✔
- 人事变动的详细记录,包括岗位和部门的调整 ✔
- 员工信息的查询与修改包括员工的个人信息和密码等 ✔
六、小结与心得体会
本实验我花费在数据库设计上的时间并不多,主要时间还是花在了设计用户页面上,虽说有点本末倒置了,但是通过两周的学习,我还是有一定的收获的。首先是为了方便要使用python的GUI,我学习了python的SQL预处理机制;然后再数据库设计方面,我在设计物理模型上还是花了心思的。然后,感觉本项目最值得说的一点就是参照SqlMap脚本的机制将数据库处理语句保存在XML文件中,这使得能够很好的修改SQL语句和扩展功能。
源码下载
Tips:大家下载下来参考参考即可,最好不要照搬