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与考勤机对接,或与财务系统同步薪资数据。随着实践经验的积累,你可以逐步将这个基础系统演变为企业级的人力资源管理平台。

    目录
    相关文章
    |
    7天前
    |
    JSON API 数据格式
    OpenCode入门使用教程
    本教程介绍如何通过安装OpenCode并配置Canopy Wave API来使用开源模型。首先全局安装OpenCode,然后设置API密钥并创建配置文件,最后在控制台中连接模型并开始交互。
    3178 7
    |
    13天前
    |
    人工智能 JavaScript Linux
    【Claude Code 全攻略】终端AI编程助手从入门到进阶(2026最新版)
    Claude Code是Anthropic推出的终端原生AI编程助手,支持40+语言、200k超长上下文,无需切换IDE即可实现代码生成、调试、项目导航与自动化任务。本文详解其安装配置、四大核心功能及进阶技巧,助你全面提升开发效率,搭配GitHub Copilot使用更佳。
    |
    3天前
    |
    人工智能 API 开发者
    Claude Code 国内保姆级使用指南:实测 GLM-4.7 与 Claude Opus 4.5 全方案解
    Claude Code是Anthropic推出的编程AI代理工具。2026年国内开发者可通过配置`ANTHROPIC_BASE_URL`实现本地化接入:①极速平替——用Qwen Code v0.5.0或GLM-4.7,毫秒响应,适合日常编码;②满血原版——经灵芽API中转调用Claude Opus 4.5,胜任复杂架构与深度推理。
    |
    15天前
    |
    存储 人工智能 自然语言处理
    OpenSpec技术规范+实例应用
    OpenSpec 是面向 AI 智能体的轻量级规范驱动开发框架,通过“提案-审查-实施-归档”工作流,解决 AI 编程中的需求偏移与不可预测性问题。它以机器可读的规范为“单一真相源”,将模糊提示转化为可落地的工程实践,助力开发者高效构建稳定、可审计的生产级系统,实现从“凭感觉聊天”到“按规范开发”的跃迁。
    2240 18
    |
    7天前
    |
    人工智能 前端开发 Docker
    Huobao Drama 开源短剧生成平台:从剧本到视频
    Huobao Drama 是一个基于 Go + Vue3 的开源 AI 短剧自动化生成平台,支持剧本解析、角色与分镜生成、图生视频及剪辑合成,覆盖短剧生产全链路。内置角色管理、分镜设计、视频合成、任务追踪等功能,支持本地部署与多模型接入(如 OpenAI、Ollama、火山等),搭配 FFmpeg 实现高效视频处理,适用于短剧工作流验证与自建 AI 创作后台。
    1123 5
    |
    6天前
    |
    人工智能 运维 前端开发
    Claude Code 30k+ star官方插件,小白也能写专业级代码
    Superpowers是Claude Code官方插件,由核心开发者Jesse打造,上线3个月获3万star。它集成brainstorming、TDD、系统化调试等专业开发流程,让AI写代码更规范高效。开源免费,安装简单,实测显著提升开发质量与效率,值得开发者尝试。
    |
    17天前
    |
    人工智能 测试技术 开发者
    AI Coding后端开发实战:解锁AI辅助编程新范式
    本文系统阐述了AI时代开发者如何高效协作AI Coding工具,强调破除认知误区、构建个人上下文管理体系,并精准判断AI输出质量。通过实战流程与案例,助力开发者实现从编码到架构思维的跃迁,成为人机协同的“超级开发者”。
    1268 102
    |
    13天前
    |
    人工智能 JSON 自然语言处理
    【2026最新最全】一篇文章带你学会Qoder编辑器
    Qoder是一款面向程序员的AI编程助手,集智能补全、对话式编程、项目级理解、任务模式与规则驱动于一体,支持模型分级选择与CLI命令行操作,可自动生成文档、优化提示词,提升开发效率。
    1011 10
    【2026最新最全】一篇文章带你学会Qoder编辑器