课程设计之基于python+MySQL的员工档案管理系统

4 篇文章 0 订阅
4 篇文章 0 订阅

系统定义

随着计算机技术的不断发展,计算机作为知识经济时代的产物,已被广泛应用于社会的各个行业和领域。在许多工作行业各自的领域上,行内竞争十分关键,谁掌握的知识多,信息量大,处理数据的速度快,谁就能在激烈的行内竞争中立于不败之地。越来越多的企业管理员意识到了信息管理的重要性,所以说信息化是当今世界发展的主流。因此,一个良好的员工管理系统对企业而言必不可少,可以方便地对整个企业的各个员工进行统计和管理,有效地减少了传统管理时间、精力的浪费。本课题是设计一个基于python+mysql的员工档案管理系统,可以有效对公司、工厂的员工进行管理。

需求分析

系统综合需求

作为一个员工管理系统,应当为公司的员工信息管理提供便利。同时给用户提供方便、友好而简洁的界面进行操作和使用。

在实际的公司员工管理过程中,通常有三类用户:管理员(BOSS)、部门经理以及员工。显然,用户的身份不同,所拥有的权限也不会相同,因此我们应当为不同身份的用户提供不同的操作权限和界面。所以在此我们通过设立三种不同类型的账号,不同账号类型登入系统后的功能不同来达到此效果。

管理员(BOSS)拥有最高级别的权限,可以对所有员工和经理的信息进行增加、删除、修改和查找操作,同时可以对公司的所有员工、经理的登录账号和密码进行管理,若有新员工入职,管理员不仅需要增加其信息,还需要为其设立一个可登录系统的账号,同时,如有员工离职,则对其信息和账号进行删除。员工、经理的信息更新和忘记密码等功能均由管理员完成。

部门经理由于对自己所属部门的员工拥有领导权,因此拥有管理员的部分权限,经理只能对属于自己部门的员工的信息进行增加、删除、修改和查找操作,同时,经理登录后可以查看自己的信息和修改自己的登录密码。经理无法查看和修改其他经理的信息,也无法对其他部门的员工信息进行管理,在经理进行增加员工操作时,会检查新增员工的部门信息是否与经理本人相同,不相同则弹出Error提示框,告诉经理没有该部门的操作权限。由此解决了经理可能存在的滥用职权等问题。

作为公司的基层,员工不具有对其他人员的领导权,因此员工登录后的功能实现比较简单:员工登录后只能查看自己的信息和修改自己的登录密码。由此实现了一定的保密能力,并在很大程度上避免了信息的泄露和外流。

由此也实现了管理员(BOSS)-部门经理-员工的三级管理模式,比较契合实际企业的员工管理情况。

系统逻辑模型

数据字典

数据字典是进行详细的数据收集和数据分析所获得的主要成果。它是关于数据库中数据的描述,即元数据,而不是数据本身。数据字典是在需求分析阶段建立,在数据库设计过程中不断修改、充实和完善的。在数据库设计中占有很重要的地位。数据字典通常包括数据项、数据结构、数据流、数据存储和处理过程几个部分。其中,数据项是不可再分的数据单位。数据结构反应了数据之间的组合关系。一个数据结构可以由若干数据项组成,也可以由若干个数据结构组成。数据流是数据结构在系统内传输的路径。数据存储是数据结构停留或存在的地方,也是数据流的来源和去向之一。通过在设计过程中不断地修整和完善,得到本次课程设计的数据字典如下:

表1 系统数据项

数据项名数据项含义说明数据类型长度
工号员工或经理在公司的唯一身份标识char30
姓名员工或经理的姓名char40
性别员工或经理的性别(只能取’男’或’女’)char10
年龄员工或经理的年龄int-
部门员工或经理所在的部门char40
账号管理员、经理、员工的系统登录账号char30
密码管理员、经理、员工的系统登录账号char30

表2 系统数据结构

数据结构名含义说明组成
管理员即管理员的账号密码账号、密码
经理信息即经理的基本信息工号、姓名、性别、年龄、部门
员工信息即员工的基本信息工号、姓名、性别、年龄、部门
经理账号即经理的账号和密码账号、密码
员工账号即员工的账号和密码账号、密码

表3 系统数据流

数据流名说明数据流来源数据流去向
经理信息管理员、经理本人调用的经理信息经理信息管理模块管理员、经理
员工信息管理员、经理、员工本人调用的员工信息员工信息管理模块管理员、经理、员工
被修改的经理信息管理员对经理的信息进行更新管理员经理信息管理模块
被修改的员工信息管理员、经理对员工的信息进行更新管理员、经理员工信息管理模块
被修改的经理密码管理员、经理本人对经理密码的更新管理员、经理经理账号管理模块
被修改的员工密码管理员、员工本人对员工密码的更新管理员、员工员工账号管理模块

数据流图

由上述系统数据流表可得出系统数据流图如下:

 

图1 系统数据流图

由需求分析知,管理员需要从员工账号管理模块中获取员工的账号密码,并将要增删改的账号密码传入员工账号管理模块,同时从员工信息管理模块获取员工的信息,并将要增删改的员工信息传入员工信息管理。经理账号管理模块和经理信息管理模块同理。经理需要从员工信息管理系统中获得经理所属部门员工的信息,并将要进行增删改的本部门员工信息传入员工信息管理模块,同时经理还需要从经理信息模块获取经理本人的信息,并将可能要修改的新密码传入经理账号管理模块。员工本人需要从员工信息管理模块获取本人信息,如果需要修改密码,则将新密码传入员工账号管理模块。

系统设计

概念结构设计

该系统的E-R图如下:

 

图2 员工管理系统E-R图

逻辑结构设计

管理员账号表(admin)管理员账号表(admin)管理员账号表(admin)管理员账号表(admin)管理员账号表(admin)
字段名类型NULLKEY备注
user_namechar(30)NOPRI管理员账号
passwordchar(30)管理员密码
经理信息表(manager)经理信息表(manager)经理信息表(manager)经理信息表(manager)经理信息表(manager)
字段名类型NULLKEY备注
idchar(30)NOPRI经理工号
namechar(40)经理姓名
genderchar(10)经理性别
ageint经理年龄
deptchar(40)经理所属部门
员工信息表(employee)员工信息表(employee)员工信息表(employee)员工信息表(employee)员工信息表(employee)
字段名类型NULLKEY备注
idchar(30)NOPRI员工工号
namechar(40)员工姓名
genderchar(10)员工性别
ageint员工年龄
deptchar(40)员工所属部门
经理账号表(manager_login)经理账号表(manager_login)经理账号表(manager_login)经理账号表(manager_login)经理账号表(manager_login)
字段名类型NULLKEY备注
user_namechar(30)NOPRI经理账号
passwordchar(30)经理密码
员工账号表(employee_login)员工账号表(employee_login)员工账号表(employee_login)员工账号表(employee_login)员工账号表(employee_login)
字段名类型NULLKEY备注
user_namechar(30)NOPRI员工账号
passwordchar(30)员工密码

子模块划分及功能描述

该系统的具体模块划分如下:

 

图3 系统功能划分

该系统的具体功能描述如下:

系统设有员工信息管理和员工账号管理两个平台,其中,员工信息管理平台对管理员、经理、员工都可用,公司所有人都可通过选择不同的登录身份并输入自己的账号密码登录平台。而员工账号管理平台因为权限原因只对管理员开放,通过该平台可以实现管理员对自己和所有员工、经理的账号和密码进行管理。实际生活中,公司对员工进行管理通常分为如下情况:新员工入职、新经理入职、员工离职、经理离职、员工或经理部门变动、员工晋升为经理等。下面解析如何实现这些具体情形:

新员工入职

新员工入职后,管理员首先要对新员工进行信息采集,并在员工信息管理平台上新建该员工的记录,同时录入该员工的信息。随后在账号管理平台生成一个员工账号记录,将该员工的工号作为其系统登录账号,并设置密码为默认密码123456。完成之后通知该新员工登录信息管理平台查询信息是否有误并修改自己的登录密码。信息录入完成后,该员工所在的部门经理也拥有了对该员工的领导权,可对其信息进行合法的修改。

新经理入职

新经理入职后,管理员首先对该经理进行信息采集,并在员工信息管理平台上新建该经理的记录,并录入该经理的信息。随后在账号管理平台生成一个经理账号记录,将该经理的工号作为其系统登录账号,并设置密码为默认密码123456。完成后通知该名经理登录信息管理平台查询信息是否有误并修改自己的登录密码,同时,通知经理已经可以对其部门的员工进行管理了。

 

图4 新员工入职流程图 

 

图5 新经理入职流程图

员工离职

如有员工离职,管理员需首先将该员工信息删除,同时一并将该员工账号一同删除。由于员工离职过程简单,因此这里的流程图不再给出。

经理离职

如有经理离职,为防止公司信息泄露,管理员应当第一时间将该经理的信息和账号删除,并新增一位经理填补该经理的空缺,即新增一条经理信息和一个经理账号,类似于上述新经理入职的过程,实现对该部门的管理。

 

图6 经理离职流程图

员工或经理部门变动

单纯的只是更换部门其实很简单,管理员只需要在信息管理平台中对员工或经理的部门信息进行修改即可,对于经理,修改之后经理的权限也会对应的变化。由于此过程也叫简单,因此流程图这里不再给出。

员工晋升经理

在实际应用场景中,大部分公司的经理都是从员工中晋升而来,因此该功能的实现就显得十分重要。要实现员工晋升经理的功能,首先应当在信息管理平台中创建一条新的经理记录,并录入晋升员工的个人信息,录入完成后删除原有员工的信息。在账号管理中删除该员工的账号密码并新增一条经理账号密码,设置账号为晋升后的工号,设置密码默认值为123456,随后通知新晋经理登录信息管理平台检查个人信息及修改密码,同时对所属部门行使领导权。

 

图7 员工晋升经理流程图

详细设计

开发平台及工具

开发工具:Visual Studio Code

开发语言:Python + MySQL

DBMS:MySQL

第三方库:pymysql, tkinter, PIL

创建数据库和表

由于我没有在Python程序中进行创建数据库和表的操作,因此在程序开始之前必须在MySQL中执行以下语句:

创建数据库

Create database employee_system;
Use employee_system;

 创建管理员表

Create table admin(
User_name char(30) primary key,
Password char(30)
);

创建员工信息表

Create table employee(
Id char(30) primary key,
Name char(40),
Gender char(10),
Age int,
Dept char(40)
);

创建经理信息表

Create table manager(
Id char(30) primary key,
Name char(40),
Gender char(10),
Age int,
Dept char(40)
);

 创建员工账号表

Create table employee_login(
User_name char(30) primary key,
Password char(30) );

 创建经理登录表

Create table manager_login(
User_name char(30) primary key,
Password char(30) );

 

设计框架

本次课程设计,我的总体想法是一个系统,两个平台。一个系统即员工管理系统。两个平台分别为信息管理平台和账号管理平台。信息管理平台对所有人开放,而账号管理系统仅限于管理员登录。

在信息管理平台中,我定义了两个全局变量分别为page和mode。其中,page用于控制显示页,即每页只显示20行的内容,便于后续的上下翻页操作。mode用于识别登录者的身份(mode初始值为-1,若mode=0表示管理员登录,mode=1表示经理登录,mode=2表示员工登录),通过一个tkinter.Combobox(values=[‘管理员’,‘经理’,‘员工’])来实现(若选择管理员,则index=0,即mode=0,其余选项同理)。而后定义一个全局的画布mywindow来显示登录页面,并使用Lable()以在画布上显示文字,Combobox()来实现选择框,Entry()用于显示输入框同时读取用户的键盘输入,为了界面美观不单调,我还通过调用第三方库PIL的Image功能,配合tkinter的Canvas()函数在登录页面插入了学校标志性建筑大门的图片。使用Button()以实现登录按钮控件,并将登录按钮与函数botton_login_clicked()绑定。用户按下登录按钮后会进入到botton_login_clicked函数中,在函数中,程序会根据选择框返回的index来判断登录用户的身份,并根据选择身份分别在admin表、employee_login表、manager_login表中进行一次select查询,查询到与用户输入相同的记录则说明当前登录用户合法,此时会根据选择的身份为mode赋值,同时将mywindow进行destroy(),根据不同的mode值进入不同的if分支,在不同的if分支中生成不同的页面。

管理员界面

管理员页面的全部功能有:显示所有员工信息(select * from employee)、显示所有经理信息(select * from manager)、按工号或姓名查找员工和经理(select * from employee / manager where id / name = )、添加新员工或新经理(insert into employee / manager values())、对员工或经理的信息进行修改(update employee / manager set __ = __)、删除员工或经理信息(delete from employee / manager where id = __)。这些功能都被嵌入到了函数中并与管理员界面上的按钮进行绑定。

经理界面

经理页面的全部功能有:显示本部门的员工信息(如何实现请见下文)、按工号或姓名查找员工(select * from employee where id / name = __)、添加新员工(insert into employee values( ))、对员工的信息进行修改(update employee set __ = __)、删除员工(delete from employee where id = )、显示经理本人的信息(select * from manager where id = user_name)、修改经理本人的登录密码(update manager_login set password=)。这些功能都被嵌入到了函数中并与经理界面上的按钮进行绑定。

经理页面部分功能的实现是我认为在整个开发过程中最难的地方,因为经理页面不同于管理员,经理只具有管理员的部分权限,而管理员页面的所有操作都可以对所有人进行,经理只能对自己本部门的员工进行管理,这也就意味着在实现经理页面时会有一大堆的多次查询、嵌套查询、限定条件修改等操作。在实际的公司管理中,一个部门的经理一般只能对该部门的员工进行管理,这样有利于提高工作效率和防止经理滥用职权。因此这个功能也是必须要实现的。我前前后后修改了好几个版本,终于想到使用两次select语句来解决此问题:先使用select语句在manager表中得到该经理的部门department(select dept from manager where id = user_name),再使用select语句在employee表中得到部门等于该经理的部门的所有员工(select * from employee where dept = department)。经理对本部门员工进行搜索时,我采用了嵌套查询的方法,即select * from (select * from employee where dept = department) as new_emp where new_emp.id =search_id。如此就将查找和搜索都限定在了本部门内,这样就同时保证了修改也限定在本部门内。在经理进行新增员工操作时,会检查新增员工的部门是否为经理本人的部门,不是则弹出Error框,提示经理“抱歉,您没有该部门的权限”,这样即可以防止经理滥用职权,还保证了部门的设置权只在管理员手中。

员工界面

员工界面的全部功能有:显示员工本人的信息(select * from employee where id = user_name)、修改员工本人的密码(update employee_login set password=__ where id=user_name)。这些功能都被嵌入到了函数中并与员工界面上的按钮进行绑定。

账号管理平台

账号管理平台由于登录身份仅限于管理员,因此实现起来相对比较简单。登录页面与信息管理平台类似,但少了选择身份这一操作。进行登录检查并成功登录后可一目了然的看到账号管理系统的所有功能:修改管理员本人的密码(update admin set password = __ where id = __)、新增员工或经理账号(insert into employee_login / manager_login values( ))、修改员工或经理账号(update employee_login / manager_login where id = __)、删除员工或经理账号(delete from employee_login / manager_login where id = __)。这些功能都被嵌入到了函数中并与账号管理页面上的按钮进行绑定。

界面设计

信息管理平台登录界面

 

图8 信息管理平台登录界面

账号管理平台登录页面

 

图9 账号管理平台登录界面

信息管理平台管理员界面

 

图10 信息管理平台管理员界面

信息管理平台经理界面

图11 信息管理平台经理界面

信息管理平台员工界面

 图12 信息管理平台员工界面

账号管理界面

 图13 账号管理界面

课程设计总结

日月交替,斗转星移。七日已逝,文章终成。

为期一周的课程设计在答辩完成后落下了完美的句号,回想过去一周,完成课程设计的道路并不顺畅。在这次课程设计的过程中,我一路磕磕绊绊,经过了无数次的报错,无数次发现问题、分析问题再到解决问题,时间随着指尖在键盘上飞舞而逝去,日复一日,总算得到了这篇自我感觉良好的拙作。

为了完美地完成这次课程设计任务,同时也吸取了上学期进行Python程序设计时因为准备工作不足导致未能进行答辩而留下的遗憾,我早早地就在心里确定了必须完美地完成此次数据库课程设计的宗旨。最后一次实验课时,我认真学习了第三方库pymysql的使用,同时,在课程设计开始之前,我也经常利用空余时间在一些技术网站上(如CSDN、Github)浏览相关的知识和项目,为的就是这一天。我为此次课程设计所做的准备远不止于此:在周日假期的时候,老师就已经下发了课程设计任务书,这时,我就已经确定好了我的选题——员工管理系统。也就是说,同样的课程设计,我比别人多花了一天的时间,在答辩那天,我参观了许多其他同学的成果并与他们进行交流,发现他们中有的界面美观、有的功能完整、甚至还实现了许多企业级的功能,由此我不觉间心生惭愧。但无妨,身边都是优秀的人又何尝不是件好事呢?身处其间,常自律,常自省,常进步。

在不断地修改和完善之后,程序终于达到了我的预期,但在答辩时还是出现了问题:在员工和经理账号已经存在的情况下依然可以插入相同的账号,分析是由于账号未设置主码约束,导致重复数据未能被察觉,在添加了主码约束后,我又意识到,一旦插入相同的账号时,程序会直接报错,作为程序员,我们固然知道是因为主码的唯一性,但作为使用者的客户却不具备此方面的知识,会认为程序出错,因此我再对此进行了更新:插入一条数据前,先使用一条select查询语句进行查询,一旦发现数据库中已有此记录(查询获得结果的长度大于0),则在UI界面中弹出一个Error,提示该ID已存在,并返回None终止后续的插入操作。至此,程序也算真正完成了,但我想还没有结束,我想在后续期末考试结束之后,再对系统进行改进:添加员工的上下班打卡功能和出勤统计以及工资管理的功能,以此来实现真正的小规模企业级的应用,也算完成了我本次课程设计的初衷。

在课程设计的过程中,我也多次得到了老师的指导和帮助,老师的帮助常让我茅塞顿开、醍醐灌顶,在此再次感谢。

七日光景,受益匪浅!课程设计在一些人的眼中,可能只是一个学分那么简单,得过且过,混到及格分就心满意足,但我认为,课程设计的意义却远不止眼前的一个学分和一周的时间。课程设计的真正意义,在于让我们在实际的项目开发中进行学习:学习需求分析、框架设计、UI界面开发等等,让我真正的认识到程序应当从用户的角度出发、设身处地的为用户着想、设计更多方便用户使用的功能等等,这些都是在传统的理论课堂中学不到的,这也是我们工科教育中不可缺少的。在提升专业知识能力的同时,也提升了我们发现、分析并解决问题得到能力,同时充分磨砺了我的心性和意志,让我在以后的学习工作中不怕重担,勇往直前!

参考文献

《数据库系统概论(第三版)》 王珊 萨师煊编著 高等教育出版社

《Python GUI设计:tkinter菜鸟编程》洪锦魁著 清华大学出版社

《Python编程从入门到实践(第2版)》 [美]埃里克·马瑟斯 人民邮电出版社

《高性能MySQL(第3版)》 [美]Baron Schwartz等著 电子工业出版社

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值