Python实现员工管理系统:从基础功能到完整应用开发指南

简介: 本文介绍如何用Python从零开发员工管理系统:基于SQLite实现员工信息、薪资计算、考勤记录等核心功能,支持命令行与Flask Web双界面,兼顾易用性与可扩展性,适合中小团队快速落地。(239字)

​免费python编程教程:https://pan.quark.cn/s/2c17aed36b72
引言:为什么需要员工管理系统?
想象你是一家快速成长的科技公司HR,每天要处理数十份员工入职、离职、调岗申请,管理数百名员工的薪资、考勤和绩效数据。用Excel表格记录?数据容易错乱且难以共享。纸质档案?查找效率低下且容易丢失。这时,一个电子化的员工管理系统就显得尤为重要。
探秘代理IP并发连接数限制的那点事 (1).png

Python凭借其简洁的语法和丰富的库支持,成为开发中小型管理系统的理想选择。本文将带你从零开始构建一个完整的员工管理系统,涵盖员工信息管理、薪资计算、考勤记录等核心功能,并提供Web界面和命令行两种交互方式。

一、系统设计:先画蓝图再施工

  1. 功能模块规划
    一个完整的员工管理系统通常包含:

员工信息管理:增删改查员工基本信息
薪资管理:计算月工资、生成薪资单
考勤管理:记录上下班时间、计算加班时长
部门管理:维护公司组织架构
报表生成:导出员工花名册、薪资汇总表

  1. 数据存储方案
    小型系统:使用SQLite数据库(无需安装,文件存储)
    中型系统:MySQL/PostgreSQL(支持多用户并发)
    快速原型:JSON文件(适合学习演示)
    本文选择SQLite作为存储方案,兼顾易用性和扩展性。

  2. 用户界面选择
    命令行界面(CLI):适合开发初期快速验证功能
    Web界面:提供更友好的用户体验
    桌面GUI:使用PyQt/Tkinter(适合本地部署)
    我们将先实现CLI版本,再扩展为Web应用。

二、基础实现:命令行版员工管理系统

  1. 环境准备

    安装所需库

    pip install tabulate flask # Web版本需要额外安装flask

  2. 数据库设计
    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()

  1. 核心功能实现
    员工信息管理
    def add_employee(conn, employee):
    """添加新员工"""
    sql = '''INSERT INTO employees(name, gender, birth_date, department,
          position, hire_date, salary, phone, email)
          VALUES(?,?,?,?,?,?,?,?,?)'''
    
    cur = conn.cursor()
    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
  1. 命令行交互界面
    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版员工管理系统

  1. 使用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')

其他路由处理(更新、删除等)类似实现

  1. 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)

  • 四、系统优化建议

    1. 安全性增强
      添加用户认证(使用Flask-Login)
      对敏感操作添加权限控制
      使用参数化查询防止SQL注入
    2. 功能扩展
      添加员工照片上传功能
      实现多条件搜索(按部门、职位等筛选)
      添加数据导入导出功能(Excel/CSV)
    3. 性能优化
      对频繁查询添加数据库索引
      实现数据分页显示
      使用缓存机制存储常用查询结果
    4. 部署方案
      开发环境:Flask内置服务器
      生产环境:Gunicorn + Nginx
      云部署:AWS/Azure/阿里云等云服务
      五、常见问题解决方案
    5. 数据库连接失败
      检查数据库文件路径是否正确
      确保有写入权限
      验证SQLite版本兼容性
    6. 中文显示乱码
      在连接数据库时添加detect_types=sqlite3.PARSE_DECLTYPES参数
      确保HTML模板设置正确的字符编码(UTF-8)
    7. Web界面样式问题
      引入Bootstrap等CSS框架快速美化界面
      使用Flask-WTF处理表单样式
    8. 数据一致性错误
      在关键操作中添加事务处理
      实现数据验证逻辑(如邮箱格式、薪资非负等)
      结语:从基础到进阶的系统开发路径
      通过本文的实现,你已经掌握了一个完整员工管理系统的开发流程:从命令行原型到Web应用,从基础CRUD到业务逻辑实现。这个系统可以根据实际需求进一步扩展:

    小型团队:使用命令行版本足够满足需求
    中小企业:部署Web版本提供多人协作
    大型企业:在现有架构上添加更多模块(招聘、培训等)
    Python的灵活性使得这样的系统可以轻松集成其他服务,比如通过API与考勤机对接,或与财务系统同步薪资数据。随着实践经验的积累,你可以逐步将这个基础系统演变为企业级的人力资源管理平台。

    目录
    相关文章
    |
    5月前
    |
    JSON 算法 API
    Python中的json模块:从基础到进阶的实用指南
    本文深入解析Python内置json模块的使用,涵盖序列化与反序列化核心函数、参数配置、中文处理、自定义对象转换及异常处理,并介绍性能优化与第三方库扩展,助你高效实现JSON数据交互。(238字)
    523 4
    |
    1月前
    |
    数据可视化 前端开发 JavaScript
    用Pyecharts绘制交互式中国地图:从数据到可视化全流程解析
    Pyecharts是基于ECharts的Python地图可视化利器:支持零代码交互(悬停、缩放)、多级行政区划(省/市/县)、高度定制化(20+样式参数)。本文详解安装配置、数据规范、三步绘图、分段配色、悬停高亮及3D扩展,助你快速生成专业级热力地图。(239字)
    283 0
    |
    3月前
    |
    开发者 Python
    Python编程实战:函数与模块化编程及内置模块探索
    本文深入讲解Python函数与模块化编程,结合math、os、sys、random等内置模块,通过实例演示代码复用、文件操作、随机数生成等核心技巧,并综合实现学生成绩管理系统,助你提升代码组织能力与开发效率。
    86 0
    |
    3月前
    |
    数据采集 前端开发 JavaScript
    实战:用Splash搞定JavaScript密集型网页渲染
    Splash是一款专为动态网页爬取设计的轻量级浏览器工具,可执行JavaScript并返回完整渲染后的页面。它通过HTTP API与Python爬虫无缝集成,支持截图、Lua脚本控制、代理配置和异步处理,轻松应对React、Vue等前端框架带来的爬取难题,是现代网络抓取的高效解决方案。(238字)
    103 0
    |
    3月前
    |
    缓存 监控 数据可视化
    Python文件目录比较全攻略:从基础到实战
    本文详解Python实现目录比较的多种方法,涵盖filecmp、pathlib、哈希校验及difflib文本差异分析,结合实战案例与性能优化技巧,助你高效完成代码对比、备份校验等任务,提升开发运维效率。
    161 0
    |
    1月前
    |
    数据采集 JSON 安全
    生产级Prompt自动化推理评估A/B实验结果的工程实践
    本文介绍了一套基于大语言模型的AB实验自动化评估系统,针对人工巡检效率低、规则引擎僵化、统计方法片面等痛点,设计六层优先级Prompt推理机制,实现精准、可解释的实验下线决策。试运行后,策略下线准确率提升至68%,人工耗时从6小时/天降至30分钟/天。
    生产级Prompt自动化推理评估A/B实验结果的工程实践
    |
    1月前
    |
    人工智能 数据挖掘 BI
    |
    1月前
    |
    数据采集 Java Go
    爬虫项目该选 Python 还是 Golang?看这篇就够了
    本文对比Python与Golang在爬虫开发中的七大维度:语法简洁性、第三方库丰富度(如Scrapy vs Colly)、并发性能(Goroutine vs GIL限制)、内存占用、代码可读性、数据处理能力(Pandas等优势)及部署便捷性(Go可直接编译为跨平台二进制),助你按需选型。
    159 10
    |
    1月前
    |
    SQL Oracle 关系型数据库
    PLSQL Developer 12.0.7 64位安装教程
    PL/SQL Developer 是专为Oracle数据库设计的高效IDE,支持PL/SQL代码编写、调试、SQL查询、对象浏览与性能分析。界面简洁,功能全面,是Oracle开发必备工具。文末附详细中文安装指南(含网盘下载链接)。
    |
    3月前
    |
    数据采集 监控 数据安全/隐私保护
    一文搞定 Python 正则表达式:常用场景速查表
    本文通过20个实战案例详解Python正则表达式在邮箱验证、数据提取、文本处理等场景的应用,涵盖基础语法、高级技巧与性能优化,助你高效掌握这一字符串处理利器。
    250 1

    热门文章

    最新文章