1. 项目概述:28960小型企业员工考勤管理系统
最近在整理代码仓库时,翻出一个五年前为本地连锁超市开发的员工考勤系统。这个采用Python+Django框架构建的管理系统,核心代码仅28960行,却完整覆盖了中小企业考勤管理的全流程需求。系统采用模块化设计,包含员工信息管理、排班调度、考勤记录、统计报表等核心模块,特别适合50-200人规模的企业使用。
关键提示:系统源码已通过GPL-3.0协议开源,商业使用需注意授权条款
这个项目的独特之处在于其"轻量级架构+完整功能"的设计平衡。相比市面上动辄数十万行的商业系统,它保留了以下核心功能:
- 多维度考勤统计(迟到/早退/缺勤可视化)
- 弹性排班规则配置
- 移动端打卡适配
- 三级审批工作流
- 薪资核算接口
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构与技术选型
2.1 后端技术栈解析
系统采用经典的MTV模式,主要技术组件包括:
python复制Django==2.2.24 # 核心框架
django-rest-framework==3.12.4 # API接口
Pillow==8.4.0 # 人脸识别图片处理
celery==5.2.7 # 异步任务队列
数据库设计上做了针对性优化:
sql复制/* 考勤记录表关键字段设计 */
CREATE TABLE `attendance` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`user_id` varchar(32) NOT NULL COMMENT '员工工号',
`clock_type` tinyint(4) NOT NULL COMMENT '1上班 2下班',
`device_id` varchar(64) DEFAULT NULL COMMENT '打卡设备标识',
`location` point DEFAULT NULL COMMENT 'GPS坐标',
`face_image` varchar(255) DEFAULT NULL COMMENT '人脸照片路径',
`status` tinyint(4) DEFAULT '0' COMMENT '0待审核 1有效 2无效',
PRIMARY KEY (`id`),
SPATIAL KEY `idx_location` (`location`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
2.2 前端交互方案
考虑到中小企业IT水平,前端采用最基础的Bootstrap+jQuery组合:
- 响应式布局适配PC/移动端
- ECharts实现考勤数据可视化
- WebSocket实时推送异常考勤提醒
- 本地缓存减少服务器压力
javascript复制// 打卡页面核心逻辑
$('#clockBtn').click(function(){
navigator.geolocation.getCurrentPosition(function(position){
const coords = position.coords;
if(!validateInFence(coords)) {
alert('超出允许打卡范围!');
return;
}
takeFacePhoto().then(uploadAttendance);
});
});
3. 核心业务逻辑实现
3.1 弹性考勤规则引擎
系统最大的亮点是可配置的考勤规则引擎,通过规则表+条件判断实现灵活配置:
python复制class AttendanceRule(models.Model):
rule_type = models.CharField(max_length=50) # 迟到/早退/加班等
condition = models.JSONField() # 判断条件
deduction = models.DecimalField(max_digits=5, decimal_places=2) # 扣款金额
def check_attendance(record):
rules = AttendanceRule.objects.filter(rule_type=record.clock_type)
for rule in rules:
if eval(rule.condition, {}, {'record': record}):
return rule.deduction
return 0
3.2 人脸识别打卡流程
考虑到中小企业预算,采用开源方案实现基础人脸识别:
- 员工录入时采集3张不同角度人脸照片
- 使用dlib提取128维特征向量
- 打卡时实时比对特征相似度
- 设置0.6的相似度阈值平衡安全与误判
python复制# 人脸特征比对核心代码
def compare_faces(known_encodings, test_image):
test_encoding = face_recognition.face_encodings(test_image)[0]
distances = face_recognition.face_distance(known_encodings, test_encoding)
return min(distances) < 0.6
4. 部署与二次开发指南
4.1 最小化部署方案
针对资源有限的环境,推荐以下配置:
- 服务器:2核4G云主机(实测支持200人并发)
- 数据库:MySQL 5.7+ 或 MariaDB
- 缓存:Redis 6.0+
- 存储:50GB SSD(考勤记录图片占用主要空间)
部署步骤:
bash复制# 1. 安装依赖
pip install -r requirements.txt
# 2. 数据库迁移
python manage.py migrate
# 3. 导入初始数据
python manage.py loaddata initial_data.json
# 4. 启动服务
celery -A core worker -l info & gunicorn core.wsgi -b 0.0.0.0:8000
4.2 常见定制需求实现
根据实施经验,企业最常需要修改的功能点包括:
-
对接企业微信/钉钉打卡
- 修改
api/attendance.py中的打卡接口 - 增加OAuth2.0认证模块
- 修改
-
特殊排班规则支持
- 扩展
rules/conditions.py中的判断逻辑 - 增加节假日规则表
- 扩展
-
定制报表导出
- 重写
reports/views.py中的Excel生成逻辑 - 添加PDF导出支持
- 重写
5. 问题排查与优化建议
5.1 高频问题解决方案
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| 打卡照片上传失败 | Nginx客户端最大body限制 | 调整client_max_body_size 10M |
| 考勤统计不准确 | 时区配置错误 | 检查MySQL的time_zone设置 |
| 人脸识别速度慢 | 服务器CPU性能不足 | 启用GPU加速或降低图片分辨率 |
5.2 性能优化实战记录
在连锁超市项目中,我们通过以下优化将响应时间从1.2s降至300ms:
- 考勤记录表按月份分表
- 高频查询字段添加复合索引
- 使用Redis缓存规则数据
- 静态文件通过CDN加速
python复制# 优化后的查询示例
def get_month_attendance(user_id, month):
cache_key = f'attendance_{user_id}_{month}'
data = cache.get(cache_key)
if not data:
table = f'attendance_{month.replace("-", "_")}'
data = list(Attendance.objects.raw(f'''
SELECT * FROM {table}
WHERE user_id=%s AND status=1
ORDER BY create_time DESC
''', [user_id]))
cache.set(cache_key, data, 3600)
return data
这套系统经过3年实际运行检验,日均处理考勤记录2000+条,最关键的教训是:中小企业考勤系统必须平衡功能完整性与维护成本。我们在后续迭代中逐步移除了指纹识别等使用率低的功能,强化了移动端体验和报表导出能力。源码中保留了完整的开发文档和接口说明,特别适合作为二次开发的基架。
