HNUST - 数据库课设

HNUST - Python+Mysql数据库课设

一、实验题目

人事管理系统

二、实验目的

企业人事管理系统主要用于员工个人资料的录入、职务变动的记录和管理。使用人事管理系统,便于公司领导掌握人员的动向,及时调整人才的分配。通过实现企业人事管理系统,加深对关系数据库理论知识的理解,通过使用具体的 DBMS,掌握一种实际的数据库管理系统并掌握其操作技术,熟练掌握使用数据库前端开发工具,进一步提高同学们运用数据库技术解决实际问题的能力。

企业人事管理系统的实现,需要实现以下功能点——

  1. 新员工资料的输入
  2. 自动分配员工号,并且设置初始的用户密码
  3. 人事变动的详细记录,包括岗位和部门的调整
  4. 员工信息的查询与修改包括员工的个人信息和密码等

三、总体设计

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 - 设计步骤

  1. 需求分析
  2. 数据库设计
  3. 编写数据库处理语句和功能实现语句
  4. 用户界面设计
  5. 测试运行

四、详细设计

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

五、实验结果与分析

  1. 新员工资料的输入 ✔
  2. 自动分配员工号,并且设置初始的用户密码 ✔
  3. 人事变动的详细记录,包括岗位和部门的调整 ✔
  4. 员工信息的查询与修改包括员工的个人信息和密码等 ✔

六、小结与心得体会

本实验我花费在数据库设计上的时间并不多,主要时间还是花在了设计用户页面上,虽说有点本末倒置了,但是通过两周的学习,我还是有一定的收获的。首先是为了方便要使用python的GUI,我学习了python的SQL预处理机制;然后再数据库设计方面,我在设计物理模型上还是花了心思的。然后,感觉本项目最值得说的一点就是参照SqlMap脚本的机制将数据库处理语句保存在XML文件中,这使得能够很好的修改SQL语句和扩展功能。


源码下载
Tips:大家下载下来参考参考即可,最好不要照搬

  • 3
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值