免费python编程教程:https://pan.quark.cn/s/2c17aed36b72
引言:为什么需要员工管理系统?
想象你是一家快速成长的科技公司HR,每天要处理数十份员工入职、离职、调岗申请,管理数百名员工的薪资、考勤和绩效数据。用Excel表格记录?数据容易错乱且难以共享。纸质档案?查找效率低下且容易丢失。这时,一个电子化的员工管理系统就显得尤为重要。
Python凭借其简洁的语法和丰富的库支持,成为开发中小型管理系统的理想选择。本文将带你从零开始构建一个完整的员工管理系统,涵盖员工信息管理、薪资计算、考勤记录等核心功能,并提供Web界面和命令行两种交互方式。
一、系统设计:先画蓝图再施工
- 功能模块规划
一个完整的员工管理系统通常包含:
员工信息管理:增删改查员工基本信息
薪资管理:计算月工资、生成薪资单
考勤管理:记录上下班时间、计算加班时长
部门管理:维护公司组织架构
报表生成:导出员工花名册、薪资汇总表
数据存储方案
小型系统:使用SQLite数据库(无需安装,文件存储)
中型系统:MySQL/PostgreSQL(支持多用户并发)
快速原型:JSON文件(适合学习演示)
本文选择SQLite作为存储方案,兼顾易用性和扩展性。用户界面选择
命令行界面(CLI):适合开发初期快速验证功能
Web界面:提供更友好的用户体验
桌面GUI:使用PyQt/Tkinter(适合本地部署)
我们将先实现CLI版本,再扩展为Web应用。
二、基础实现:命令行版员工管理系统
环境准备
安装所需库
pip install tabulate flask # Web版本需要额外安装flask
数据库设计
import sqlite3
from sqlite3 import Error
def create_connection(db_file):
"""创建数据库连接"""
conn = None
try:
conn = sqlite3.connect(db_file)
print(f"成功连接到SQLite数据库,版本: {sqlite3.version}")
return conn
except Error as e:
print(e)
return conn
def create_tables(conn):
"""创建数据表"""
try:
sql_create_employees_table = """
CREATE TABLE IF NOT EXISTS employees (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
gender TEXT,
birth_date TEXT,
department TEXT,
position TEXT,
hire_date TEXT,
salary REAL,
phone TEXT,
email TEXT
);
"""
sql_create_attendance_table = """
CREATE TABLE IF NOT EXISTS attendance (
id INTEGER PRIMARY KEY AUTOINCREMENT,
employee_id INTEGER,
date TEXT,
check_in TEXT,
check_out TEXT,
overtime_hours REAL,
FOREIGN KEY (employee_id) REFERENCES employees (id)
);
"""
conn.execute(sql_create_employees_table)
conn.execute(sql_create_attendance_table)
print("数据表创建成功")
except Error as e:
print(e)
初始化数据库
conn = create_connection("employee_management.db")
if conn is not None:
create_tables(conn)
conn.close()
- 核心功能实现
员工信息管理
def add_employee(conn, employee):
"""添加新员工"""
sql = '''INSERT INTO employees(name, gender, birth_date, department,
cur = conn.cursor()position, hire_date, salary, phone, email) VALUES(?,?,?,?,?,?,?,?,?)'''
cur.execute(sql, employee)
conn.commit()
return cur.lastrowid
def get_all_employees(conn):
"""获取所有员工"""
cur = conn.cursor()
cur.execute("SELECT * FROM employees")
rows = cur.fetchall()
return rows
def update_employee(conn, employee_id, updated_data):
"""更新员工信息"""
columns = ", ".join([f"{key} = ?" for key in updated_data.keys()])
values = list(updated_data.values())
values.append(employee_id)
sql = f"UPDATE employees SET {columns} WHERE id = ?"
cur = conn.cursor()
cur.execute(sql, values)
conn.commit()
return cur.rowcount
def delete_employee(conn, employee_id):
"""删除员工"""
sql = 'DELETE FROM employees WHERE id=?'
cur = conn.cursor()
cur.execute(sql, (employee_id,))
conn.commit()
return cur.rowcount
薪资计算
def calculate_salary(conn, employee_id, month):
"""计算月工资"""
# 获取员工基本信息
cur = conn.cursor()
cur.execute("SELECT salary, department FROM employees WHERE id=?", (employee_id,))
employee = cur.fetchone()
if not employee:
return None
base_salary, department = employee
# 获取当月考勤记录
cur.execute("""
SELECT SUM(overtime_hours) FROM attendance
WHERE employee_id=? AND strftime('%Y-%m', date)=?
""", (employee_id, month))
overtime = cur.fetchone()[0] or 0
# 简单薪资计算规则(可根据部门调整)
overtime_pay = overtime * (base_salary / 21.75 / 8 * 1.5) # 1.5倍加班费
# 部门补贴(示例)
dept_bonus = {
'技术部': 1000,
'市场部': 800,
'人事部': 500
}.get(department, 0)
total_salary = base_salary + overtime_pay + dept_bonus
return {
'base_salary': base_salary,
'overtime_pay': overtime_pay,
'dept_bonus': dept_bonus,
'total_salary': total_salary
}
考勤管理
def record_attendance(conn, employee_id, date, check_in, check_out):
"""记录考勤"""
# 计算工作时长(简化版)
from datetime import datetime
try:
in_time = datetime.strptime(check_in, "%H:%M")
out_time = datetime.strptime(check_out, "%H:%M")
work_hours = (out_time - in_time).total_seconds() / 3600
# 超过8小时算加班(简化计算)
overtime = max(0, work_hours - 8)
sql = '''INSERT INTO attendance(employee_id, date, check_in, check_out, overtime_hours)
VALUES(?,?,?,?,?)'''
cur = conn.cursor()
cur.execute(sql, (employee_id, date, check_in, check_out, overtime))
conn.commit()
return cur.lastrowid
except ValueError:
print("时间格式错误,请使用HH:MM格式")
return None
- 命令行交互界面
from tabulate import tabulate
def print_menu():
"""打印菜单"""
print("\n=== 员工管理系统 ===")
print("1. 添加员工")
print("2. 查看所有员工")
print("3. 更新员工信息")
print("4. 删除员工")
print("5. 记录考勤")
print("6. 计算薪资")
print("7. 退出系统")
def main():
conn = create_connection("employee_management.db")
if conn is None:
print("无法连接数据库")
return
while True:
print_menu()
choice = input("请选择操作: ")
if choice == '1':
# 添加员工
print("\n添加新员工")
name = input("姓名: ")
gender = input("性别: ")
birth_date = input("出生日期(YYYY-MM-DD): ")
department = input("部门: ")
position = input("职位: ")
hire_date = input("入职日期(YYYY-MM-DD): ")
salary = float(input("基本工资: "))
phone = input("电话: ")
email = input("邮箱: ")
employee = (name, gender, birth_date, department, position,
hire_date, salary, phone, email)
employee_id = add_employee(conn, employee)
print(f"员工添加成功,ID: {employee_id}")
elif choice == '2':
# 查看所有员工
employees = get_all_employees(conn)
if employees:
headers = ["ID", "姓名", "性别", "出生日期", "部门", "职位",
"入职日期", "基本工资", "电话", "邮箱"]
print(tabulate(employees, headers=headers, tablefmt="grid"))
else:
print("没有员工记录")
elif choice == '3':
# 更新员工信息
employee_id = int(input("输入要更新的员工ID: "))
field = input("输入要更新的字段(name/gender/department/salary等): ")
value = input(f"输入新的{field}值: ")
# 根据字段类型转换
if field in ['salary', 'id']:
value = float(value) if '.' in value else int(value)
updated = update_employee(conn, employee_id, {field: value})
if updated:
print("更新成功")
else:
print("未找到该员工或更新失败")
elif choice == '4':
# 删除员工
employee_id = int(input("输入要删除的员工ID: "))
if delete_employee(conn, employee_id):
print("删除成功")
else:
print("删除失败,未找到该员工")
elif choice == '5':
# 记录考勤
employee_id = int(input("员工ID: "))
date = input("日期(YYYY-MM-DD): ")
check_in = input("签到时间(HH:MM): ")
check_out = input("签退时间(HH:MM): ")
if record_attendance(conn, employee_id, date, check_in, check_out):
print("考勤记录成功")
else:
print("考勤记录失败")
elif choice == '6':
# 计算薪资
employee_id = int(input("员工ID: "))
month = input("计算月份(YYYY-MM): ")
salary_info = calculate_salary(conn, employee_id, month)
if salary_info:
print("\n薪资明细:")
for k, v in salary_info.items():
print(f"{k.replace('_', ' ').title()}: {v:.2f}")
else:
print("未找到该员工或计算失败")
elif choice == '7':
print("退出系统")
break
else:
print("无效选择,请重新输入")
conn.close()
if name == "main":
main()
三、系统升级:Web版员工管理系统
- 使用Flask构建Web界面
from flask import Flask, render_template, request, redirect, url_for
app = Flask(name)
数据库连接函数(同上)
def get_db_connection():
conn = sqlite3.connect("employee_management.db")
conn.row_factory = sqlite3.Row # 使查询结果以字典形式返回
return conn
@app.route('/')
def index():
conn = get_db_connection()
employees = conn.execute('SELECT * FROM employees').fetchall()
conn.close()
return render_template('index.html', employees=employees)
@app.route('/employee/add', methods=['GET', 'POST'])
def add_employee_web():
if request.method == 'POST':
# 获取表单数据
name = request.form['name']
department = request.form['department']
salary = float(request.form['salary'])
conn = get_db_connection()
employee_id = add_employee(conn, (name, None, None, department,
None, None, salary, None, None))
conn.close()
return redirect(url_for('index'))
return render_template('add_employee.html')
其他路由处理(更新、删除等)类似实现
HTML模板示例(templates/index.html)
<!DOCTYPE html>
员工列表
添加新员工
ID
姓名
部门
基本工资
操作
{% for employee in employees %}
{ { employee['id'] }}
{ { employee['name'] }}
{ { employee['department'] }}
{ { employee['salary'] }}
编辑
删除
{% endfor %}
运行Web应用
if name == 'main':
app.run(debug=True)
四、系统优化建议
- 安全性增强
添加用户认证(使用Flask-Login)
对敏感操作添加权限控制
使用参数化查询防止SQL注入 - 功能扩展
添加员工照片上传功能
实现多条件搜索(按部门、职位等筛选)
添加数据导入导出功能(Excel/CSV) - 性能优化
对频繁查询添加数据库索引
实现数据分页显示
使用缓存机制存储常用查询结果 - 部署方案
开发环境:Flask内置服务器
生产环境:Gunicorn + Nginx
云部署:AWS/Azure/阿里云等云服务
五、常见问题解决方案 - 数据库连接失败
检查数据库文件路径是否正确
确保有写入权限
验证SQLite版本兼容性 - 中文显示乱码
在连接数据库时添加detect_types=sqlite3.PARSE_DECLTYPES参数
确保HTML模板设置正确的字符编码(UTF-8) - Web界面样式问题
引入Bootstrap等CSS框架快速美化界面
使用Flask-WTF处理表单样式 - 数据一致性错误
在关键操作中添加事务处理
实现数据验证逻辑(如邮箱格式、薪资非负等)
结语:从基础到进阶的系统开发路径
通过本文的实现,你已经掌握了一个完整员工管理系统的开发流程:从命令行原型到Web应用,从基础CRUD到业务逻辑实现。这个系统可以根据实际需求进一步扩展:
小型团队:使用命令行版本足够满足需求
中小企业:部署Web版本提供多人协作
大型企业:在现有架构上添加更多模块(招聘、培训等)
Python的灵活性使得这样的系统可以轻松集成其他服务,比如通过API与考勤机对接,或与财务系统同步薪资数据。随着实践经验的积累,你可以逐步将这个基础系统演变为企业级的人力资源管理平台。