利用使用PYQT制作一个人才交流管理系统,先使用QT designer.exe设计好人才交流管理系统的各个UI界面,然后利用pyuic把生成的ui界面编译为py文件,在主函数文件内创建一个类继承ui.py界面的类,即可完成数据库逻辑与 GUI 代码分离,以提高可维护性和可重用性。
源码:
https://gitee.com/ink-ink0/hrm.git
1.系统简介
系统采用PyCharm作为开发语言,采用Qt Designer来设计图形化界面,该工具有助于开发者加快开发PyQt程序的速度,并采用Qt里的一个强大的GUI库PyQt5进行开发,本系统连接MySql数据库,具备注册登录功能,以及对数据库的增、删、查、改功能。
基于上述开发工具和技术,本系统具有新用户的注册登录功能,用户在注册登录时选择好是求职者用户还是公司用户还是管理员用户的身份,然后根据登入的身份来进入不同的界面。公司用户可以查看所有求职者简历信息、查看投递到本公司的简历信息并选择心仪的简历、查看统计共选择了多少份简历的功能,以及增删改查本公司的招聘信息;求职者可以投递简历,查阅公司发布的岗位信息,查阅公司信息,查询简历状态,增删改查自己的信息;管理员用户可以管理员可以查看所有求职者的简历信息、公司的基本信息、招聘信息以及所有的账号密码信息,具有删除指定用户、修改用户密码、直接添加新用户、对注册公司进行审核的功能,同时还可以统计平台的用户人数以及通过该平台成功就职的总人数。
2.需求分析
2.1 功能需求
系统功能表
业务流程图
3.数据库设计
表3.2.5公司信息表:com_infor
数据项名称 | 数据类型 | 允许非空 | 默认值 | 描述 |
c_id | int | N | 公司编号 | |
c_name | varchar(100) | N | 公司名称 | |
c_type | varchar(50) | Y | 无 | 公司类型 |
work_addr | varchar(100) | Y | 无 | 公司地址 |
c_tele | varchar(20) | Y | 无 | 公司联系电话 |
c_email | varchar(50) | Y | 无 | 公司联系电子邮箱 |
表3.2.6公司招聘消息表:recruit
数据项名称 | 数据类型 | 允许非空 | 默认值 | 描述 |
c_id | int | N | 公司编号 | |
company_type | varchar(50) | N | 公司类型 | |
company | varchar(100) | N | 公司名称 | |
position | varchar(50) | N | 工作名称 | |
position_require | varchar(100) | N | 工作需求 | |
job_duty | varchar(100) | N | 工作职责 | |
money | decimal(10,2) | N | 薪资 | |
job_place | varchar(100) | N | 工作地点 |
表3.2.7求职者信息表:jobseeker
数据项名称 | 数据类型 | 允许非空 | 默认值 | 描述 |
id | int | N | 求职者注册时获得的编号 | |
name | varchar(50) | N | 姓名 | |
sex | varchar(10) | N | 性别 | |
| varchar(50) | N | 电子邮箱 | |
phone | varchar(20) | N | 联系电话 | |
address | varchar(100) | N | 地址 | |
education | varchar(50) | N | 学历 | |
graduate_institutions | varchar(50) | N | 毕业院校 | |
work_experience | varchar(100) | Y | 工作经验 | |
skills | varchar(100) | Y | 专业技能 | |
intention | varchar(50) | N | 就业意向 | |
status | tinyint(1) | Y | 0 | 录取结果(1为已录,0为未录 |
创建表的sql语句
一、公司招聘信息表
CREATE TABLE `recruit` (
`c_id` int unsigned NOT NULL,
`company_type` varchar(50) NOT NULL DEFAULT '无',
`company` varchar(100) NOT NULL DEFAULT '无',
`position` varchar(50) NOT NULL DEFAULT '无',
`position_require` varchar(100) NOT NULL DEFAULT '无',
`job_duty` varchar(100) NOT NULL DEFAULT '无',
`money` decimal(10,2) NOT NULL DEFAULT '0.00',
`job_place` varchar(100) NOT NULL DEFAULT '无'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1.增加一条信息
INSERT INTO `recruit` (`c_id`, `company_type`, `company`, `position`, `position_require`, `job_duty`, `money`, `job_place`) VALUES
('1', 'IT', 'ABC公司', 'Java开发工程师', '本科及以上学历,精通Java编程,熟悉Spring、MyBatis等框架', '负责公司项目的开发和维护工作', '15K-20K', '北京市海淀区'),
('2', '金融', 'XYZ银行', '信用卡销售代表', '大专及以上学历,有销售经验者优先考虑', '负责银行信用卡的销售和推广工作', '底薪+提成', '上海市浦东新区'),
('3', '教育', 'EFG培训机构', '英语教师', '本科及以上学历,英语专业优先,有教学经验者优先考虑', '负责英语课程的教学和管理工作', '10K-15K', '广州市天河区');
2.更新一条招聘信息
UPDATE `recruit` SET `position_require`='本科及以上学历,有3年以上的工作经验' WHERE `c_id`=1;
3.删除一条招聘信息
DELETE FROM `recruit` WHERE `c_id`=1;
4.查询所有招聘信息
SELECT * FROM `recruit`;
5.按公司名称查询招聘信息
SELECT * FROM `recruit` WHERE `company`='ABC公司';
6.按职位名称和薪资范围查询招聘信息
SELECT * FROM `recruit` WHERE `position`='销售代表' AND `money`>=4000.00 AND `money`<=6000.00;
二、公司信息表
CREATE TABLE `com_infor` (
`c_id` int unsigned NOT NULL,
`c_name` varchar(100) NOT NULL,
`c_type` varchar(50) DEFAULT '无',
`work_addr` varchar(100) DEFAULT '无',
`c_tele` varchar(20) DEFAULT '无',
`c_email` varchar(50) DEFAULT '无',
PRIMARY KEY (`c_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
以下是增删改查的 SQL 语句:
1. 添加一家公司信息
INSERT INTO `com_infor` (`c_id`, `c_name`, `c_type`, `work_addr`, `c_tele`, `c_email`)
VALUES (1, 'ABC公司', '私营企业', '北京市朝阳区', '010-12345678', 'abc@example.com');
2. 更新一家公司信息
UPDATE `com_infor` SET `work_addr`='北京市海淀区' WHERE `c_id`=1;
3. 删除一家公司信息
DELETE FROM `com_infor` WHERE `c_id`=1;
4. 查询所有公司信息
SELECT * FROM `com_infor`;
5. 按公司名称查询公司信息
SELECT * FROM `com_infor` WHERE `c_name`='ABC公司';
6. 按公司类型和工作地点查询公司信息
SELECT * FROM `com_infor` WHERE `c_type`='外资企业' AND `work_addr`='北京市朝阳区';
三、求职者回应的招聘表
CREATE TABLE `applications` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`company` varchar(50) NOT NULL,
`position` varchar(50) NOT NULL,
`resume_status` varchar(20) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb3
以下是增删改查的 SQL 语句:
1. 添加一份简历投递记录
INSERT INTO `applications` (`name`, `company`, `position`, `resume_status`)
VALUES ('张三', 'ABC公司', '销售代表', '已投递');
2. 更新一份简历投递记录的状态
UPDATE `applications` SET `resume_status`='已面试' WHERE `id`=1;
3. 删除一份简历投递记录
DELETE FROM `applications` WHERE `id`=1;
4. 查询所有简历投递记录
SELECT * FROM `applications`;
5. 按姓名查询简历投递记录
SELECT * FROM `applications` WHERE `name`='张三';
6. 按公司和职位查询简历投递记录
SELECT * FROM `applications` WHERE `company`='ABC公司' AND `position`='销售代表';
求职者信息表
CREATE TABLE `jobseeker` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`sex` varchar(10) NOT NULL,
`email` varchar(50) NOT NULL,
`phone` varchar(20) NOT NULL,
`address` varchar(100) NOT NULL,
`education` varchar(50) NOT NULL,
`graduate_institutions` varchar(50) NOT NULL,
`work_experience` varchar(100) DEFAULT NULL,
`skills` varchar(100) DEFAULT NULL,
`intention` varchar(50) NOT NULL,
`status` tinyint(1) DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=47 DEFAULT CHARSET=utf8mb3
四、管理员账户密码表
CREATE TABLE `admins` (
`id` int NOT NULL,
`type` varchar(10) DEFAULT '管理员',
`username` text NOT NULL,
`password` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3
以下是增删改查的 SQL 语句:
1. 添加一个管理员账户
INSERT INTO `admins` (`id`, `type`, `username`, `password`)
VALUES (1, '管理员', 'admin', 'password123');
2. 更新管理员账户的密码
UPDATE `admins` SET `password`='newpassword123' WHERE `id`=1;
3. 删除一个管理员账户
DELETE FROM `admins` WHERE `id`=1;
4. 查询所有管理员账户
SELECT * FROM `admins`;
5. 按用户名查询管理员账户
SELECT * FROM `admins` WHERE `username`='admin';
6. 按账户类型查询管理员账户
SELECT * FROM `admins` WHERE `type`='管理员';
五、求职者账户密码表
CREATE TABLE `user_job_seekers` (
`id` int NOT NULL AUTO_INCREMENT,
`type` varchar(10) DEFAULT '求职者',
`job_seeker_name` varchar(50) NOT NULL,
`username` varchar(255) NOT NULL,
`password` text NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `username_unique` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb3
以下是增删改查的 SQL 语句:
1. 添加一份求职者信息
INSERT INTO `jobseeker` (`name`, `sex`, `email`, `phone`, `address`, `education`, `graduate_institutions`, `work_experience`, `skills`, `intention`, `status`)
VALUES ('张三', '男', 'zhangsan@example.com', '13812345678', '北京市朝阳区', '本科', '清华大学', '3年工作经验', '熟练掌握Java编程', '软件开发工程师', 0);
2. 更新一份求职者信息
UPDATE `jobseeker` SET `work_experience`='5年工作经验' WHERE `id`=1;
3. 删除一份求职者信息
DELETE FROM `jobseeker` WHERE `id`=1;
4. 查询所有求职者信息
SELECT * FROM `jobseeker`;
5. 按姓名查询求职者信息
SELECT * FROM `jobseeker` WHERE `name`='张三';
6. 按学历和求职意向查询求职者信息
SELECT * FROM `jobseeker` WHERE `education`='本科' AND `intention`='软件测试工程师';
六、公司HR用户账户密码表
CREATE TABLE `user_hrs` (
`id` int NOT NULL AUTO_INCREMENT,
`type` varchar(10) DEFAULT '公司HR',
`username` varchar(255) NOT NULL,
`password` text NOT NULL,
`company_name` varchar(50) NOT NULL,
`status` int DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `username_unique` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb3
以下是增删改查的 SQL 语句:
1. 添加一个公司 HR 账户
INSERT INTO `user_hrs` (`type`, `username`, `password`, `company_name`, `status`)
VALUES ('公司HR', 'hr@abc.com', 'password123', 'ABC公司', 1);
2. 更新公司 HR 账户的密码
UPDATE `user_hrs` SET `password`='newpassword123' WHERE `id`=1;
3. 删除一个公司 HR 账户
DELETE FROM `user_hrs` WHERE `id`=1;
4. 查询所有公司 HR 账户
SELECT * FROM `user_hrs`;
5. 按用户名查询公司 HR 账户
SELECT * FROM `user_hrs` WHERE `username`='hr@abc.com';
6. 按状态和公司名查询公司 HR 账户
SELECT * FROM `user_hrs` WHERE `status`=1 AND `company_name`='ABC公司';
4. 详细的设计与实现
4.1登入界面主界面
4.1.1定义初始化方法
首先通过pyqt5来使用python中的gui框架,定义一个login类,继承mainwindow和login_ui_form,用self.textEdit.toPlainText()去接收user,获取用户输入框中的用户名内容,用self.textEdit.text()去接收pwd,获取密码输入框中的密码内容,用user_type去选择用户类型是求职者,公司HR,还是管理员。
部分登入代码:towin.py
具体完整代码因为太长,会放在资源处,需修改代码中的数据库名称,用户名称和密码才可以运行
https://gitee.com/ink-ink0/hrm.git
#登入功能----------------------------------------------------------------
class Login(QMainWindow,login_Ui_Form):
def __init__(self):
super(Login, self).__init__()
self.setupUi(self)
self.buttonGroupuser_type.buttonClicked.connect(self.afterClickButton)#单选按钮设置
self.pushButton.clicked.connect(self.login_btn)
self.resign_first_win = None
self.pushButton_2.clicked.connect(self.Open_resign_first)
self.main_window =None
self.jobseeker_change_win=None
self.admin_main_window = None
self.company_window=None
def Open(self):
self.show()
def Open_resign_first(self):
if not self.resign_first_win:
self.resign_first_win=Resigin_first_Ui_Form()
self.resign_first_win.Open()
def jobseeker_login(self):
pass
def afterClickButton(self):
btn=self.buttonGroupuser_type.checkedButton()
type=btn.text()
#print(type)
return type
def resign(self):
print("注册")
def login(self):
print("login")
conn = pymysql.connect(host='localhost',
user='root',
password='123456',
database='myhrms',
charset='utf8')
user = self.lineEdit.text()
pwd = self.lineEdit_2.text()
user_type = self.afterClickButton()
print(user_type)
# 创建一个md5对象
md5 = hashlib.md5()
# 更新要加密的内容
md5.update(pwd.encode('utf-8'))
# 获取加密后的十六进制字符串
pwd_md5 = md5.hexdigest()
cur = conn.cursor() # 生成游标对象
result = None
if user_type == '求职者':
sql = "SELECT * FROM user_job_seekers WHERE username = %s AND password = %s "
params = (user,pwd_md5)
cur.execute(sql, params)
result = cur.fetchone()
elif user_type == '公司HR':
sql = "SELECT * FROM user_hrs WHERE username = %s AND password = %s "
params = (user,pwd_md5)
cur.execute(sql, params)
result = cur.fetchone()
elif user_type == '管理员':
sql = "SELECT * FROM admins WHERE username = %s AND password = %s "
params = (user,pwd_md5)
cur.execute(sql, params)
result = cur.fetchone()
cur.close()
conn.close()
return result, user_type
def login_btn(self):
try:
result, user_type = self.login()
print("login_btn_result", result)
if result:
print("成功登入")
login.hide()
type = result[1]
user = result[3]
print("result",result)
print("type,user", type, user)
if type == "求职者":
user = result[3]
self.Open_jobseeker(user)
elif type == "公司HR":
user = result[2]
conn = pymysql.connect(host='localhost',
user='root',
password='123456',
database='myhrms',
charset='utf8')
cur = conn.cursor() # 生成游标对象
sql1 = "select * from user_hrs where username =%s "
params = (user)
cur.execute(sql1, params)
data = cur.fetchall() # 通过fetchall方法获得数据
stu = data[0][6]
print("公司HR",data[0][6])
# 打开公司HR界面
if stu ==1:
print("公司HR登入")
self.Open_company(user)
else:
print("管理员还未同意账号登入")
QMessageBox.warning(self, '错误', '管理员还未同意账号登入')
elif type == "管理员": # 打开管理员界面
self.Open_admin()
print("管理员登入")
return type, user
else:
# self.textBrowser.setText("登录失败,请重试")
QMessageBox.warning(self, '错误', '用户名或密码错误!')
return None
except Exception as e:
print("登录失败,错误信息为:", e)
QMessageBox.warning(self, '错误', '登录失败,请重试!')
return None
login.py:此文件为设计登入界面的UI后编译成py文件
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'login.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class login_Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(905, 496)
self.pushButton = QtWidgets.QPushButton(Form)
self.pushButton.setGeometry(QtCore.QRect(440, 350, 111, 61))
self.pushButton.setObjectName("pushButton")
self.pushButton_2 = QtWidgets.QPushButton(Form)
self.pushButton_2.setGeometry(QtCore.QRect(170, 350, 111, 61))
self.pushButton_2.setObjectName("pushButton_2")
self.label = QtWidgets.QLabel(Form)
self.label.setGeometry(QtCore.QRect(90, 130, 72, 15))
self.label.setObjectName("label")
self.label_2 = QtWidgets.QLabel(Form)
self.label_2.setGeometry(QtCore.QRect(100, 210, 72, 15))
self.label_2.setObjectName("label_2")
self.label_3 = QtWidgets.QLabel(Form)
self.label_3.setGeometry(QtCore.QRect(90, 290, 72, 15))
self.label_3.setObjectName("label_3")
self.radioButton = QtWidgets.QRadioButton(Form)
self.radioButton.setGeometry(QtCore.QRect(200, 290, 115, 19))
self.radioButton.setObjectName("radioButton")
self.buttonGroupuser_type = QtWidgets.QButtonGroup(Form)
self.buttonGroupuser_type.setObjectName("buttonGroupuser_type")
self.buttonGroupuser_type.addButton(self.radioButton)
self.radioButton_2 = QtWidgets.QRadioButton(Form)
self.radioButton_2.setGeometry(QtCore.QRect(350, 290, 115, 19))
self.radioButton_2.setObjectName("radioButton_2")
self.buttonGroupuser_type.addButton(self.radioButton_2)
self.radioButton_3 = QtWidgets.QRadioButton(Form)
self.radioButton_3.setGeometry(QtCore.QRect(520, 290, 115, 19))
self.radioButton_3.setObjectName("radioButton_3")
self.buttonGroupuser_type.addButton(self.radioButton_3)
self.lineEdit = QtWidgets.QLineEdit(Form)
self.lineEdit.setGeometry(QtCore.QRect(190, 120, 341, 31))
self.lineEdit.setObjectName("lineEdit")
self.lineEdit_2 = QtWidgets.QLineEdit(Form)
self.lineEdit_2.setGeometry(QtCore.QRect(190, 200, 341, 31))
self.lineEdit_2.setEchoMode(QtWidgets.QLineEdit.Password)
self.lineEdit_2.setObjectName("lineEdit_2")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "登入界面"))
self.pushButton.setText(_translate("Form", "登入"))
self.pushButton_2.setText(_translate("Form", "注册"))
self.label.setText(_translate("Form", "用户名"))
self.label_2.setText(_translate("Form", "密码"))
self.label_3.setText(_translate("Form", "用户类型"))
self.radioButton.setText(_translate("Form", "求职者"))
self.radioButton_2.setText(_translate("Form", "公司HR"))
self.radioButton_3.setText(_translate("Form", "管理员"))
5.效果演示
5.1求职者模块
5.2公司HR用户模块
5.3管理员模块