打卡系统是现代企业管理中的刚需工具。如何用 Python 和 OpenCV 打造一个全方位、高效智能的打卡系统?本篇文章将从 程序入口设计 入手,带你剖析一个智能打卡系统的架构布局!
设计思路:模块化是关键!
在企业级软件开发中,清晰的模块化设计能够提高扩展性、维护性。以下是我们的模块划分:
- 用户权限管理:定义用户角色与权限。
- 主菜单设计:入口界面,清晰导航。
- 人脸打卡功能:使用 OpenCV 实现人脸识别打卡。
- 删除员工全部数据:快速清除指定用户数据。
- 查询员工打卡记录:支持条件查询。
- 生成考勤报表:统计出勤信息并导出表格。
- 自定义上班下班时间:满足灵活考勤需求。
模块功能亮点
1. 用户权限管理
权限是系统安全的基石。本模块提供管理员和普通员工的两种角色。
亮点:
- 区分管理权限和普通操作权限。
- 配置基于 JSON 或数据库的权限存储。
2. 主菜单设计
主菜单是程序的门面,直接影响用户体验。一个好的设计不仅要操作流畅,更要符合逻辑。
亮点:
- 层级清晰、功能直观。
- 支持键盘快捷键操作,提高效率。
3. 人脸打卡功能
人脸识别技术是本系统的核心模块。使用 OpenCV 捕捉人脸并匹配数据库中的数据,完成自动化打卡。
亮点:
- 支持实时捕捉与验证。
- 提供失败提示,保障打卡成功率。
4. 删除员工全部数据
删除数据是维护系统的一部分,本模块提供快速清理功能,确保系统数据安全可控。
亮点:
- 支持按姓名或工号删除。
- 双重确认机制,避免误删。
5. 查询员工打卡记录
作为考勤系统,查询功能是核心需求。本模块支持灵活的条件查询。
亮点:
- 根据时间段、员工姓名、部门等条件筛选。
- 打印、导出多种格式支持。
6. 生成考勤报表
如何让 HR 不再手忙脚乱?一键生成报表是关键!
亮点:
- 支持 CSV、Excel 格式导出。
- 自定义字段与表格样式。
7. 自定义上班下班时间
企业灵活考勤管理的必备功能。
亮点:
- 允许用户设定不同时段的考勤规则。
- 自动更新系统判断逻辑。
架构图
程序入口
├── 用户权限管理
├── 主菜单
│ ├── 人脸打卡
│ ├── 查询打卡记录
│ ├── 删除数据
│ ├── 考勤报表生成
│ └── 上下班时间设置
开发小贴士
- 数据安全:敏感数据需加密存储,如员工照片和打卡记录。
- 模块解耦:避免不同功能之间的直接依赖。
- 性能优化:对于人脸识别等计算密集型任务,考虑多线程或 GPU 加速。
抛砖引玉
"""
主入口
"""
from util import camera
from util import public_tools as tool
from service import hr_service as hr
ADMIN_LOGIN = False # 管理员登录状态
# 管理员登录
def login():
while True:
username = input("请输入管理员账号(输入0取消操作):")
if username == "0": # 如果只输入0
return # 结束方法
passowrd = input("请输入管理员密码:")
if hr.valid_user(username.strip(), passowrd.strip()): # 校验账号密码
global ADMIN_LOGIN # 读取全局变量
ADMIN_LOGIN = True # 设置为管理员已登录状态
print(username + "登录成功!请选择重新选择功能菜单")
break
else:
print("账号或密码错误,请重新输入!")
print("---------------------------")
# 员工管理
def employee_management():
menu = """+-------------------------------------------------+
| 员工管理功能菜单 |
+-------------------------------------------------+
①录入新员工 ②删除员工 ③返回上级菜单
---------------------------------------------------"""
while True:
print(menu) # 打印菜单
option = input("请输入菜单序号:")
if option == "1": # 如果选择“录入新员工”
name = str(input("请输入新员工姓名(输入0取消操作):")).strip()
if name != "0": # 只要输入的不是0
code = hr.add_new_employee(name) # 人事服务添加新员工,并获得该员工的特征码
print("请面对摄像头,敲击三次回车键完成拍照!")
camera.register(code) # 打开摄像头为员工照相
print("录入成功!")
# return # 退出员工管理功能菜单
elif option == "2": # 如果选择“删除员工”
# show_employee_all() # 展示员工列表
print(hr.get_employee_report()) # 打印员工信息报表
id = int(input("请输入要删除的员工编号(输入0取消操作):"))
if id > 0: # 只要输入的不是0
if hr.check_id(id): # 若此编号有对应员工
verification = tool.randomNumber(4) # 生成随机4位验证码
inputVer = input("[" + str(verification) + "] 请输入验证码:") # 让用户输入验证码
if str(verification) == str(inputVer).strip(): # 如果验证码正确
hr.remove_employee(id) # 人事服务删除该员工
print(str(id) + "号员工已删除!")
else: # 无效编号
print("验证码有误,操作取消")
else:
print("无此员工,操作取消")
elif option == "3": # 如果选择“返回上级菜单”
return # 退出员工管理功能菜单
else:
print("输入的指令有误,请重新输入!")
# 查看记录
def check_record():
menu = """+-------------------------------------------------+
| 查看记录功能菜单 |
+-------------------------------------------------+
①查看员工列表 ②查看打卡记录 ③返回上级菜单
---------------------------------------------------"""
while True:
print(menu) # 打印菜单
option = input("请输入菜单序号:")
if option == "1": # 如果选择“查看员工列表”
print(hr.get_employee_report()) # 打印员工信息报表
elif option == "2": # 如果选择“查看打卡记录”
report = hr.get_record_all()
print(report)
elif option == "3": # 如果选择“返回上级菜单”
return # 退出查看记录功能菜单
else:
print("输入的指令有误,请重新输入!")
# 报表设置
def report_config():
menu = """+-------------------------------------------------+
| 报表设置功能菜单 |
+-------------------------------------------------+
①作息时间设置 ②返回上级菜单
---------------------------------------------------"""
while True:
print(menu) # 打印菜单
option = input("请输入菜单序号:")
if option == "1": # 如果选择“作息时间设置”
while True:
work_time = input("请设置上班时间,格式为(08:00:00):")
if tool.valid_time(work_time): # 如果时间格式正确
break # 结束循环
else: # 如果时间格式不对
print("上班时间格式错误,请重新输入")
while True:
close_time = input("请设置下班时间,格式为(23:59:59):")
if tool.valid_time(close_time): # 如果时间格式正确
break
else: # 如果时间格式不对
print("下班时间格式错误,请重新输入")
hr.save_work_time(work_time, close_time) # 保存用户设置的上班时间和下班时间
print("设置完成,上班时间:" + work_time + ",下班时间为:" + close_time)
elif option == "2": # 如果选择“返回上级菜单”
return # 退出查看记录功能菜单
else:
print("输入的指令有误,请重新输入!")
# 考勤报表
def check_report():
menu = """+-------------------------------------------------+
| 考勤报表功能菜单 |
+-------------------------------------------------+
①日报 ②月报 ③报表设置 ④返回上级菜单
---------------------------------------------------"""
while True:
print(menu) # 打印菜单
option = input("请输入菜单序号:")
if option == "1": # 如果选择“日报”
while True:
date = input("输入查询日期,格式为(2008-08-08),输入0则查询今天:")
if date == "0": # 如果只输入0
hr.get_today_report() # 打印今天的日报
break # 打印完之后结束循环
elif tool.valid_date(date): # 如果输入的日期格式有效
hr.get_day_report(date) # 打印指定日期的日报
break # 打印完之后结束循环
else: # 如果输入的日期格式无效
print("日期格式有误,请重新输入!")
elif option == "2": # 如果选择“月报”
while True:
date = input("输入查询月份,格式为(2008-08),输入0则查询上个月:")
if date == "0": # 如果只输入0
hr.get_pre_month_report() # 生成上个月的月报
break # 生成完毕之后结束循环
elif tool.valid_year_month(date): # 如果输入的月份格式有效
hr.get_month_report(date) # 生成指定月份的月报
break # 生成完毕之后结束循环
else:
print("日期格式有误,请重新输入!")
elif option == "3": # 如果选择“报表设置”
report_config() # 进入“报表设置”菜单
elif option == "4": # 如果选择“返回上级菜单”
return # 退出查看记录功能菜单
else:
print("输入的指令有误,请重新输入!")
# 人脸打卡
def face_clock():
print("请正面对准摄像头进行打卡")
name = camera.clock_in() # 开启摄像头,返回打卡员工名称
if name is not None: # 如果员工名称有效
hr.add_lock_record(name) # 保存打卡记录
print(name + " 打卡成功!")
# 启动方法
def start():
finish = False # 程序结束标志
menu = """
+--------------------------------------------------+
| 主功能菜单 |
+--------------------------------------------------+
①打卡 ②查看记录 ③员工管理 ④考勤报表 ⑤退出
---------------------------------------------------"""
while not finish:
print(menu) # 打印菜单
option = input("请输入菜单序号:")
if option == "1": # 如果选择“打卡”
face_clock() # 启动人脸打卡
elif option == "2": # 如果选择“查看记录”
if ADMIN_LOGIN: # 如果管理员已登录
check_record() # 进入查看记录方法
else:
login() # 先让管理员登录
elif option == "3": # 如果选择“员工管理”
if ADMIN_LOGIN:
employee_management() # 进入员工管理方法
else:
login()
elif option == "4": # 如果选择“考勤报表”
if ADMIN_LOGIN:
check_report() # 进入考勤报表方法
else:
login()
elif option == "5": # 如果选择“退出”
finish = True # 确认结束,循环停止
else:
print("输入的指令有误,请重新输入!")
print("Bye Bye !")
hr.load_emp_data() # 数据初始化
tital = """
***************************************************
* MR智能视频打卡系统 *
***************************************************"""
print(tital) # 打印标题
start() # 启动程序
总结
通过模块化设计,一个功能全面的智能打卡系统雏形已经展现在眼前。你是否有更好的创意或者实战经验?欢迎评论区交流!如果本文对你有所帮助,请点赞、收藏并分享给更多需要的人!
下一片会分享正哥源码和测试效果!!!