目 录
摘 要
随着信息技术的快速发展,传统考勤管理方式逐渐显露出效率低下和易出错等问题,许多企业开始寻求基于科技的现代化解决方案。因此,为了提高考勤管理的全面性和准确性,借助信息化技术设计并实现一套高效便捷的人脸识别考勤系统显得尤为重要。
本研究经过深入调研分析考勤管理现状和用户需求,采用面向对象的开发方法,基于Python开发系统,应用Django作为后端框架实现后端业务逻辑,配合MySQL数据库实现数据的高效管理和安全传输储存,实现了人脸识别、系统用户、部门名称管理、打卡签到管理、打卡签退管理、补签信息管理、员工考勤管理、部门考勤管理、操作日志等多元丰富的功能,最终构建和部署了一个功能完善且易于使用的人脸识别考勤系统。通过系统测试与用户反馈,证明该系统具备良好的稳定性和可扩展性,能够有效解决了传统考勤手段的诸多缺陷,从而实现了考勤数据的实时更新和准确统计。
本研究不仅能提高企业的考勤管理效率,还可以为人力资源管理提供可靠的数据支持,同时,能够推动企业管理的信息化和数字化转型,为类似考勤系统的开发提供技术参考和理论借鉴,具备广泛的推广应用前景和社会价值。
关键词:人脸识别考勤系统;Django框架;Python语言;考勤管理
Abstract
With the rapid development of information technology, traditional attendance management methods have gradually revealed problems such as low efficiency and easy errors, and many enterprises have begun to seek modern technology-based solutions. Therefore, in order to improve the comprehensiveness and accuracy of attendance management, it is particularly important to use information technology to design and implement an efficient and convenient facial recognition attendance system.
This study conducted in-depth research and analysis on the current status of attendance management and user needs. Using object-oriented development methods, a Python based system was developed, and Django was applied as the backend framework to implement backend business logic. In conjunction with MySQL database, efficient data management and secure transmission and storage were achieved, including facial recognition, system user and department name management, check-in and check-out management, make-up information management, employee attendance management, department attendance management, operation logs, and other diverse and rich functions. Finally, a fully functional and easy-to-use facial recognition attendance system was constructed and deployed. Through system testing and user feedback, it has been proven that the system has good stability and scalability, and can effectively solve many shortcomings of traditional attendance methods, thereby achieving real-time updates and accurate statistics of attendance data.
This study can not only improve the efficiency of attendance management in enterprises, but also provide reliable data support for human resource management. At the same time, it can promote the informatization and digital transformation of enterprise management, provide technical and theoretical references for the development of similar attendance systems, and have broad prospects for promotion and application as well as social value
Key Words:Facial Recognition Attendance System; Django Framework; Python Language; Attendance Management
1绪论
1.1研究背景与意义
1.1.1 研究背景
随着全球经济的快速发展和企业规模的迅速扩大,传统的考勤管理方式已逐渐难以满足现代企业在人员管理方面的需求。过去,许多企业依赖于人工考勤或传统的打卡机,这些方法虽然简单,但在准确性、可靠性和效率上存在明显短板。而且人工记录不仅容易出错,还容易导致缺勤、迟到等情况的判断失误。此外,常见的打卡机也往往面临被他人代打的风险。这些问题不仅影响员工的真实考勤情况,也对企业的管理造成一定困扰。为了提高考勤管理的智能化水平,信息技术的应用成为发展趋势。人脸识别技术近年来取得了显著进展,凭借其高效、准确的独特优势,越来越多地应用于各种考勤系统之中。因此,基于Python技术框架开发人脸识别考勤系统,对于解决传统考勤管理的难题具有重要的理论与现实意义。
1.1.2 研究意义
本研究针对传统考勤管理中的弊端,通过引入信息化技术设计和实现一套功能齐全和用户友好的人脸识别考勤系统,实现实时数据采集和自动化考勤流程,提升考勤管理效率和准确性。相较于传统考勤方式,基于Python的人脸识别考勤系统的开发,能够有效减少人为错误,提升考勤的准确性。同时,通过自动化的考勤流程,企业可大幅提升管理效率,减少人工成本。同时系统为企业提供了实时、可靠的考勤数据,能够帮助管理者更好地监控和考核员工的考勤情况,并为制定相关管理决策提供科学的数据支撑。本研究的成功构建和实施不仅为企业提供了一套有效的考勤管理方案和一种现代化的考勤管理工具,还体现了信息技术在企业管理中的广泛应用,实现管理的规范化、系统化和信息化,可以推动企业的数字化转型进程。并且随着人脸识别技术的不断成熟和普及,基于这一技术的考勤系统在各类企业和机构中具备良好的应用和推广前景,为后续相关研究和类似系统的开发应用提供提供了新的视角和思路,具有重要理论价值和实践意义。
1.2国内外研究现状
1.2.1国内研究现状
在国内,基于人脸识别技术的考勤系统已经得到了广泛应用和研究。随着对校园安全和企业管理效率的重视,市场对人脸识别考勤系统的需求增长迅速,促进了相关技术和产品的发展。各大企业和高校纷纷引入人脸识别考勤,以提高管理效率。例如华为和阿里巴巴等大型企业,在员工考勤管理中采用了人脸识别技术,实现无感知的出勤记录。人脸识别考勤系统在教育领域也应用广泛,对学生考勤进行了改革,采用人脸识别考勤。如清华大学和北京大学等高校也开始使用人脸识别考勤系统,以替代传统的刷卡机制,提升学生的考勤管理效率。同时,国内学者对人脸识别技术的研究侧重于算法的优化与应用。例如,对卷积神经网络(CNN)在图像识别中的应用进行了深入探讨,研究集中在提高人脸识别的准确率和实时性。此外,针对数据安全和隐私保护的问题,国内研究也开始关注如何确保考勤数据的保密性,避免数据滥用。
1.2.2国外研究现状
国外在人脸识别技术的研究和应用方面起步较早,已经形成了较为成熟的市场科技应用,尤其是在安防、金融等领域。而在考勤管理方面,人脸识别技术的应用开始逐渐普及,尤其在大型企业和高科技公司中被广泛使用。如美国的Amazon和Google等公司使用人脸识别考勤系统来管理员工。Amazon的无人超市也应用了类似的技术,以跟踪客户的购物行为。顾客进店后系统会识别其身份,并支持使用人脸识别进行购物结算,自动跟踪购买行为。日本在一些公共服务机构和IFS(Integrated Facility Services)行业,注重使用人脸识别系统进行考勤和身份验证。如苑田製作所,使用人脸识别系统来跟踪员工考勤,通过高精度的识别技术,确保员工考勤的准确性,提升了整体工作效率以及员工的满意度。同时,国外的研究机构和企业高度重视人脸识别技术的优化,专注于提高识别系统的安全性和准确性,包括对抗样本的研究和系统的隐私保护等。
综上所述,国内外在基于人脸识别技术的考勤管理系统方面都取得了显著进展,研究围绕如何提升系统的准确性和安全性展开,为本研究提供了丰富的参考与借鉴。
1.3论文章节安排
本文共分为七章,章节内容安排如下:
第一章:绪论,主要介绍人脸识别考勤系统领域研究的背景及研究意义,并概述研究的现状。
第二章:相关技术介绍,主要探讨和说明实现人脸识别考勤系统的关键技术。
第三章:需求分析,主要从人脸识别考勤系统的可行性、功能、性能等方面进行分析,为后续系统设计提供理论支持。
第四章:系统设计,主要对人脸识别考勤系统功能模块、数据库进行功能设计。
第五章:系统实现,主要介绍了人脸识别考勤系统各个用户的功能、系统界面的实现。
第六章:系统测试,主要对人脸识别考勤系统进行测试,验证功能完整性、稳定性和安全性,评估系统在实际运行中的性能表现。
第七章:总结与展望。总结全文研究内容,提出对人脸识别考勤系统领域未来发展的展望和建议,指出研究的不足和可优化之处,为相关领域的进一步探索提供参考。
2相关技术介绍
本人脸识别考勤系统使用Python语言,采用Django技术进行后端业务开发,数据方面主要采用的是微软的MySQL关系型数据库来作为数据存储媒介,配合HTML、CSS 技术完成系统的开发。
2.1Python
Python是一种高级编程语言,以其简洁和易读的语法而闻名[2]。Python支持多种编程模式,包括面向对象、命令式、函数式编程等,非常适合快速开发Web应用、数据分析、自动化脚本等多种用途,被广泛用于各种领域。同时,Python 有着强大的社区支持,提供了丰富的第三方库和框架,使得开发者可以高效地实现复杂功能[3]。在本项目中,Python被用作主要的后端开发语言,负责处理业务逻辑和数据操作,为服务提供稳定和高效的支持。
2.2MySQL
MySQL是一个开源的关系型数据库管理系统,因其性能稳定、易于使用而被广泛应用于各种规模的应用程序中[4]。MySQL支持SQL语言,允许开发者通过编写查询语句来执行数据的增删改查操作[5]。作为一种通用的数据库操作语言,MySQL简单易学,功能强大,在本项目中,MySQL主要用于存储系统中的所有重要信息,确保数据的安全性和一致性。
2.3Django
Django是一个基于Python的高级Web框架,遵循MTV(模型Model-视图View-模板Template)设计模式[6]。它提供了一种高效的方式来构建安全、维护性强的网站。Django内置了强大的管理界面生成工具,使得管理员可以轻松地进行内容管理;同时,其自带的用户认证系统也大大简化了注册登录功能的实现[7]。在本项目中,Django用于搭建整个系统的架构,包括前端展示层、业务逻辑层以及数据访问层的设计与实现。
2.4B/S
B/S模式(Browser/Server模式)是一种网络应用架构,其中浏览器(Browser)作为客户端与服务器(Server)进行通信[8]。这种模式使用户可以通过普通的Web浏览器访问应用程序,而无需安装额外的客户端软件。用户通过浏览器发送请求,服务器接收并处理这些请求,然后将结果返回给浏览器显示给用户[9]。
2.5HTML/CSS/JavaScript
尽管Django提供了模板引擎来生成HTML页面,但为了提升用户体验,我们还需要使用HTML、CSS和JavaScript来创建动态且美观的前端界面。HTML定义网页结构,CSS控制样式布局,而JavaScript则用来添加交互性,比如表单验证、动态加载内容等功能。这些技术与Django框架相结合,为用户提供了一个直观易用的操作界面。
3需求分析
3.1可行性分析
3.1.1经济可行性分析
从技术角度来看,Django作为一种轻量级、快速构建的Python框架,能够提高开发效率,降低系统的复杂程度,易于维护和升级。同时,MySQL作为关系型数据库,能够支持平台数据的存储与管理,保障系统的稳定性和高效性。因此,本系统具有技术可行性。
3.1.2技术可行性分析
从经济角度来看,基于Django搭建人脸识别考勤系统的投入成本相对较低,因为Django本身是一个免费、开源的框架,可以节省开发成本。同时,使用MySQL作为数据库也具有成本效益高的优势。因此,本系统具有经济可行性。
3.1.3操作可行性分析
从操作角度来看,Django的简洁性和高度集成的特点使得系统的部署和运行相对简单,容易维护和管理的同时,能够提供一个界面直观友好和操作简单高效的系统,能满足用户的各项要求,方便用户快速上手使用。因此,本系统具有操作可行性。
3.2功能需求分析
本人脸识别考勤系统设计分为两个主要用户角色:员工用户和管理员,以下是对每个角色的功能需求的详细描述。
人脸识别考勤系统员工用户角色用例图如下所示。

图3.1 员工用户角色用例图
系统员工用户具体功能说明如下所示。
- 登录:提供登录功能,员工账户由管理员创建,输入账号密码可登录系统后台,实现人脸识别,支持摄像头和上传图片进行识别(识别失败时提示重新采集)。
- 后台首页:员工用户登录后的主页,展示系统重要信息概览、个人资料。
- 打卡签到管理:员工用户可以管理自己的打卡签到,支持添加新的打卡签到,查询现有的打卡签到,确认考勤状态。
- 打卡签退管理:员工用户可以管理自己的打卡签退,支持添加新的打卡签退,查询现有的打卡签退,确认考勤状态。
- 补签信息管理:员工用户可以管理自己的补签信息,支持添加新的补签信息,查询现有的补签信息,确认审核状态。
- 员工考勤管理:员工用户可以管理自己的员工考勤,包括查询现有考勤信息,浏览和确认员工考勤详情。
人脸识别考勤系统管理员角色用例图如下所示。

图3.2 管理员角色用例图
系统管理管理员具体功能说明如下所示。
- 登录:提供登录功能,输入账号密码可登录系统后台,实现人脸识别,支持摄像头和上传图片进行识别(识别失败时提示重新采集)。
- 后台首页:管理员登录后的主页,展示系统的重要信息概览、个人资料及统计信息(包括部门名称、打卡签到、补签信息、员工考勤、部门考勤等统计图)。
- 系统用户:管理员可以管理系统用户(管理员和员工用户),包括增删查改用户信息,重置用户密码等,支持批量导出导入。
- 部门名称管理:管理员可以管理所有的部门名称,支持增加新的部门名称,修改和删除现有的部门名称。
- 打卡签到管理:管理员可以处理所有的打卡签到,包括浏览详情,实现增改删查操作,负责根据操作日志的实际打卡情况,判定员工是否正常或迟到,更新考勤状态。
- 打卡签退管理:管理员可以处理所有的打卡签退,包括浏览详情,实现增改删查操作,负责根据操作日志的实际打卡情况,判定员工是否正常或早退,更新考勤状态。
- 补签信息管理:管理员可以管理所有的补签信息,包括浏览详情,实现增改删查操作,负责审核员工提交的补签信息。
- 员工考勤管理:管理员可以管理所有的员工考勤,支持增加新的员工考勤,修改和删除现有的员工考勤,实现报表导出功能。
- 部门考勤管理:管理员可以管理所有的部门考勤,支持增加新的部门考勤,修改和删除现有的部门考勤,实现报表导出功能。
- 操作日志:管理员可以管理所有操作日志,支持查询和删除操作日志,浏览详情。
3.3非功能性需求分析
性能需求:系统应支持至少1000名用户同时在线操作,而不影响系统性能。数据相应处理时间应在2秒以内,确保用户体验。
可用性:系统应具备友好且易于使用的界面,方便用户能够快速上手进行数据管理和数据查看。
安全性:系统应采用HTTPS协议确保数据传输安全。用户密码加密存储,确保用户信息安全。
兼容性:系统应确保在主流浏览器(如Chrome、Firefox、Safari)上的良好兼容性,同时系统需适应不同设备,包括PC和移动端的访问。
扩展性:系统架构应留有扩展空间,以便未来能增加更多功能或模块。数据库设计应灵活,可以应对日后数据量的增长。
可靠性:系统应具备自动备份机制,以防数据丢失。应有良好的错误处理机制,确保在发生异常时系统能够正常运行,避免崩溃。
3.4系统流程分析
3.4.1用户流程图
用户访问平台的网站,进入登录页面页面,入其用户名和密码,后端服务接收登录请求,验证用户提供的用户名和密码是否匹配数据库中存储的信息,验证通过即可登录成功。登录流程图如下图所示。

图3.3 用户登录流程图
3.4.2添加打卡数据流程图
登录系统后,用户可对添加自己权限内的打卡数据,输入打卡数据提交后,系统会验证数据是否合法,合法后会保存并更新数据库,若不合法则提示重新输入。添加打卡数据流程图所示。

图3.4 添加打卡数据流程图
4系统设计
4.1系统架构设计
系统架构设计是构建应用程序的骨架,定义了系统的组件、模块及其交互方式。本人脸识别考勤系统的系统架构设计遵循分层架构原则,采用B/S架构,即浏览器/服务器架构,使得用户无需在本地安装客户端,通过Web浏览器直接访问系统,降低了用户的使用门槛,提高了系统的可维护性。具体主要分为表现层、业务逻辑层和数据访问层。表现层负责用户交互,通过前端技术实现动态页面;业务逻辑层采用Django处理业务逻辑、用户请求并进行数据处理;数据访问层通过MySQL实现数据的增删改查操作,保证数据的持久化及一致性。通过上述分层架构设计,系统能够实现职责分离,各层之间通过清晰的接口进行交互,可以提高系统的可维护性、可扩展性和重用性,有助于在未来进行功能扩展或系统升级。系统架构图如下所示。
图4.1 系统架构图
4.2功能模块设计
功能模块设计是系统开发过程中的重要阶段,它旨在将系统划分为不同的模块,每个模块负责完成特定的功能或任务。人脸识别考勤系统由多个功能模块组成,每个模块下又包含具体的功能操作。员工用户可进行在线签到、签退和补签,确认自己的考勤信息。系统管理员则负责管理系统所有数据,处理审批各类请求。根据前文功能需求分析,可以得出本系统的功能模块图如下所示。

图4.2 系统功能模块图
4.3数据库设计
4.3.1数据库E-R图设计
通过E-R图能够帮助用户理清系统中的数据结构和关系,为后续的数据库表结构设计提供指导。在进行数据库设计之前,首先需要先绘制实体-关系(E-R)图。E-R图将帮助理清业务中的实体(Entity)及它们之间的关系(Relationship),从而为后续的数据库表设计提供基础。根据前文可以得出本人脸识别考勤系统拥有多个实体,在此列举主要实体,各个实体之间联系总E-R图如下图所示。
图4.3 系统总体E-R图
4.3.2数据表结构设计
在E-R图确定后,接下来可以根据实体和关系的属性设计数据库表结构。在E-R图明确了实体和它们之间的关系后,接下来可以开始设计数据库表结构。每个实体对应一个数据库表,每个属性对应表中的字段,在此列举本人脸识别考勤系统的主要数据表结构。
表4.1 employee_attendance(员工考勤)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
| 1 | employee_attendance_id | int | 是 | 是 | 员工考勤ID | |
| 2 | employee_account_number | int | 否 | 否 | 员工账号 | |
| 3 | employee_name | varchar | 64 | 否 | 否 | 员工姓名 |
| 4 | employee_work_number | varchar | 64 | 否 | 否 | 员工工号 |
| 5 | statistics_title | varchar | 64 | 否 | 否 | 统计标题 |
| 6 | statistical_time | datetime | 否 | 否 | 统计时间 | |
| 7 | late_times | double | 否 | 否 | 迟到次数 | |
| 8 | early_leave_times | double | 否 | 否 | 早退次数 | |
| 9 | attendance | double | 否 | 否 | 出勤率% | |
| 10 | statistical_remarks | text | 65535 | 否 | 否 | 统计备注 |
| 11 | create_time | datetime | 是 | 否 | 创建时间 | |
| 12 | update_time | timestamp | 是 | 否 | 更新时间 |
表4.2 employee_user(员工用户)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
| 1 | employee_user_id | int | 是 | 是 | 员工用户ID | |
| 2 | employee_name | varchar | 64 | 否 | 否 | 员工姓名 |
| 3 | employee_photos | varchar | 255 | 否 | 否 | 员工照片 |
| 4 | employee_phone | varchar | 16 | 否 | 否 | 员工电话 |
| 5 | employee_work_number | varchar | 64 | 是 | 否 | 员工工号 |
| 6 | employee_gender | varchar | 64 | 否 | 否 | 员工性别 |
| 7 | department_of_inauguration | varchar | 64 | 否 | 否 | 就职部门 |
| 8 | examine_state | varchar | 16 | 是 | 否 | 审核状态 |
| 9 | user_id | int | 是 | 否 | 用户ID | |
| 10 | create_time | datetime | 是 | 否 | 创建时间 | |
| 11 | update_time | timestamp | 是 | 否 | 更新时间 |
表4.3 pin_and_sign_back(打卡签退)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
| 1 | pin_and_sign_back_id | int | 是 | 是 | 打卡签退ID | |
| 2 | employee_account_number | int | 否 | 否 | 员工账号 | |
| 3 | employee_name | varchar | 64 | 否 | 否 | 员工姓名 |
| 4 | employee_phone | varchar | 64 | 否 | 否 | 员工电话 |
| 5 | department_of_inauguration | varchar | 64 | 否 | 否 | 就职部门 |
| 6 | sign_off_time | datetime | 否 | 否 | 签退时间 | |
| 7 | attendance_status | varchar | 64 | 否 | 否 | 考勤状态 |
| 8 | sign_off_remarks | text | 65535 | 否 | 否 | 签退备注 |
| 9 | create_time | datetime | 是 | 否 | 创建时间 | |
| 10 | update_time | timestamp | 是 | 否 | 更新时间 |
表4.4 punch_in(打卡签到)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
| 1 | punch_in_id | int | 是 | 是 | 打卡签到ID | |
| 2 | employee_account_number | int | 否 | 否 | 员工账号 | |
| 3 | employee_name | varchar | 64 | 否 | 否 | 员工姓名 |
| 4 | employee_phone | varchar | 64 | 否 | 否 | 员工电话 |
| 5 | department_of_inauguration | varchar | 64 | 否 | 否 | 就职部门 |
| 6 | check_in_time | datetime | 否 | 否 | 签到时间 | |
| 7 | attendance_status | varchar | 64 | 否 | 否 | 考勤状态 |
| 8 | sign_in_remarks | text | 65535 | 否 | 否 | 签到备注 |
| 9 | create_time | datetime | 是 | 否 | 创建时间 | |
| 10 | update_time | timestamp | 是 | 否 | 更新时间 |
表4.5 supplementary_sign_information(补签信息)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
| 1 | supplementary_sign_information_id | int | 是 | 是 | 补签信息ID | |
| 2 | employee_account_number | int | 否 | 否 | 员工账号 | |
| 3 | employee_name | varchar | 64 | 否 | 否 | 员工姓名 |
| 4 | employee_phone | varchar | 64 | 否 | 否 | 员工电话 |
| 5 | department_of_inauguration | varchar | 64 | 否 | 否 | 就职部门 |
| 6 | replenishment_time | datetime | 否 | 否 | 补签时间 | |
| 7 | application_for_supplementary_signature | text | 65535 | 否 | 否 | 补签申请 |
| 8 | examine_state | varchar | 16 | 是 | 否 | 审核状态 |
| 9 | examine_reply | varchar | 255 | 否 | 否 | 审核回复 |
| 10 | create_time | datetime | 是 | 否 | 创建时间 | |
| 11 | update_time | timestamp | 是 | 否 | 更新时间 |
5系统实现
5.1员工用户功能模块实现
5.1.1登录模块
用户在登录页面输入用户名和密码,系统回检查输入的凭据是否与数据库中存储的信息匹配。若匹配,用户身份验证成功即可成功登录系统;若不匹配,系统会提示错误。实现人脸识别,支持摄像头和上传图片进行识别(识别失败时提示重新采集)界面布局如下图所示。
图5.1 登录界面图
5.1.2打卡签到管理模块
员工用户可以管理自己的打卡签到,支持添加新的打卡签到,查询现有的打卡签到,确认考勤状态。界面布局如下图所示。
图5.2 打卡签到添加界面图
5.1.3打卡签退管理模块
员工用户可以管理自己的打卡签退,支持添加新的打卡签退,查询现有的打卡签退,确认考勤状态。界面布局如下图所示。
图5.3 打卡签退管理界面图
5.1.4补签信息管理模块
员工用户可以管理自己的补签信息,支持添加新的补签信息,查询现有的补签信息,确认审核状态。界面布局如下图所示。
图5.4 补签信息添加界面图
5.1.5员工考勤管理模块
员工用户可以管理自己的员工考勤,包括查询现有考勤信息,浏览和确认员工考勤详情。界面布局如下图所示。
图5.5 员工考勤管理界面图
5.2管理员功能模块实现
5.2.1后台首页模块
管理员登录后的主页,展示系统的重要信息概览、个人资料及统计信息(包括部门名称、打卡签到、补签信息、员工考勤、部门考勤等统计图)。界面布局如下图所示。
图5.6 后台首页界面图
5.2.2系统用户管理模块
系统用户管理模块允许管理员管理系统的用户(管理员、员工用户),包括添加新用户、编辑用户信息、重置密码及封禁用户等操作,以确保系统的权限管理和安全性,并支持批量导出导入系统用户信息。界面布局如下图所示。
图5.7 系统用户管理界面图
5.2.3打卡签到管理模块
管理员可以处理所有的打卡签到,包括浏览详情,实现增改删查操作,负责根据操作日志的实际打卡情况,判定员工是否正常或迟到,更新考勤状态。界面布局如下图所示。
图5.8 打卡签到更新状态界面图
5.2.4打卡签退管理模块
管理员可以处理所有的打卡签退,包括浏览详情,实现增改删查操作,负责根据操作日志的实际打卡情况,判定员工是否正常或早退,更新考勤状态。界面布局如下图所示。
图5.9 打卡签退管理界面图
5.2.5补签信息管理模块
管理员可以管理所有的补签信息,包括浏览详情,实现增改删查操作,负责审核员工提交的补签信息。界面布局如下图所示。
图5.10 补签信息审核界面图
5.2.6员工考勤管理模块
管理员可以管理所有的员工考勤,支持增加新的员工考勤,修改和删除现有的员工考勤,实现报表导出功能。界面布局如下图所示。
图5.11 员工考勤管理界面图
6系统测试
6.1系统测试意义
系统测试的主要目的是确保软件系统的功能、性能和安全性符合设计要求。通过全面而系统的测试,发现系统潜在的缺陷和问题,以便在发布之前修复,确保系统功能的稳定性和可靠性,从而提高软件的整体质量,减少后续使用中的问题,以提升用户体验和满意度,增强用户信任[10]。同时在早期发现并修复缺陷,可以避免后期因缺陷引起的高额维护成本,降低维护成本
6.2系统测试用例
6.2.1功能测试用例
在系统的功能验证阶段,将对系统功能界面进行全面测试。具体而言,将模拟用户行为,输入各类数据并进行提交操作,随后仔细观察和分析每个页面的响应反馈。确保系统的每个功能模块按预期工作,用户能够顺利完成特定任务,具体功能测试用例如下所示。
验证登录操作是否正常,登录功能测试用例设计如下表所示。
表6.1 登录功能测试用例
| 测试编号 | 测试目的 | 测试步骤 | 预期结果 | 实际结果 |
| TC001 | 测试用户成功登录情况 | 1. 打开登录页面。2. 输入正确的用户名和密码。3. 人脸识别成功4. 提交登录信息 | 登录成功,登录至用户首页 | 登录成功,登录至用户首页 |
| TC002 | 测试登录失败情况 | 1. 打开登录页面。2. 输入错误的密码。3. 提交登录信息。 | 系统提示登录失败 | 系统提示登录失败 |
| TC003 | 测试登录失败情况 | 1. 打开登录页面。2. 输入正确用户名和密码。3. 人脸识别失败4. 提交登录信息 | 系统提示登录失败 | 系统提示登录失败 |
验证打卡签到管理的添加、修改、删除及查询等操作是否正常,打卡签到管理功能测试用例设计如下表所示。
表6.2 打卡签到管理功能测试用例
| 测试编号 | 测试目的 | 测试步骤 | 预期结果 | 实际结果 |
| TC001 | 测试打卡签到添加功能 | 1. 登录用户帐户。2. 进入打卡签到管理界面。3. 点击添加,输入新的打卡签到基本信息。4. 点击提交。 | 添加成功,新的打卡签到显示在列表中 | 添加成功,新的打卡签到显示在列表中 |
| TC003 | 测试打卡签到修改功能 | 1. 登录管理员帐户。2. 进入打卡签到管理界面。3. 进入详情页,修改打卡签到。4. 点击提交。 | 修改成功,更新的打卡签到显示在列表 | 修改成功,更新的打卡签到显示在列表 |
| TC002 | 测试打卡签到删除功能 | 1. 登录管理员帐户。2. 进入打卡签到管理界面。3. 选择一项或多项打卡签到。4. 点击删除,并确认。 | 删除成功,相关打卡签到不再显示在列表中 | 删除成功,相关打卡签到不再显示在列表中 |
| TC003 | 测试打卡签到搜索功能 | 1. 登录管理员帐户。2. 进入打卡签到管理界面。3. 在搜索框输入关键词搜索特定打卡签到。4. 点击搜索。 | 系统显示相关特定的打卡签到 | 系统显示相关特定的打卡签到 |
验证打卡签退管理的添加、修改、删除及查询等操作是否正常,打卡签退管理功能测试用例设计如下表所示。
表6.3 打卡签退管理功能测试用例
| 测试编号 | 测试目的 | 测试步骤 | 预期结果 | 实际结果 |
| TC001 | 测试打卡签退添加功能 | 1. 登录用户帐户。2. 进入打卡签退管理界面。3. 点击添加,输入新的打卡签退基本信息。4. 点击提交。 | 添加成功,新的打卡签退显示在列表中 | 添加成功,新的打卡签退显示在列表中 |
| TC003 | 测试打卡签退修改功能 | 1. 登录管理员帐户。2. 进入打卡签退管理界面。3. 进入详情页,修改打卡签退。4. 点击提交。 | 修改成功,更新的打卡签退显示在列表 | 修改成功,更新的打卡签退显示在列表 |
| TC002 | 测试打卡签退删除功能 | 1. 登录管理员帐户。2. 进入打卡签退管理界面。3. 选择一项或多项打卡签退。4. 点击删除,并确认。 | 删除成功,相关打卡签退不再显示在列表中 | 删除成功,相关打卡签退不再显示在列表中 |
| TC003 | 测试打卡签退搜索功能 | 1. 登录管理员帐户。2. 进入打卡签退管理界面。3. 在搜索框输入关键词搜索特定打卡签退。4. 点击搜索。 | 系统显示相关特定的打卡签退 | 系统显示相关特定的打卡签退 |
验证补签信息管理的添加、修改、删除及查询等操作是否正常,补签信息管理功能测试用例设计如下表所示。
表6.4 补签信息管理功能测试用例
| 测试编号 | 测试目的 | 测试步骤 | 预期结果 | 实际结果 |
| TC001 | 测试补签信息添加功能 | 1. 登录用户帐户。2. 进入补签信息管理界面。3. 点击添加,输入新的补签信息基本信息。4. 点击提交。 | 添加成功,新的补签信息显示在列表中 | 添加成功,新的补签信息显示在列表中 |
| TC003 | 测试补签信息修改功能 | 1. 登录管理员帐户。2. 进入补签信息管理界面。3. 进入详情页,修改补签信息。4. 点击提交。 | 修改成功,更新的补签信息显示在列表 | 修改成功,更新的补签信息显示在列表 |
| TC002 | 测试补签信息删除功能 | 1. 登录管理员帐户。2. 进入补签信息管理界面。3. 选择一项或多项补签信息。4. 点击删除,并确认。 | 删除成功,相关补签信息不再显示在列表中 | 删除成功,相关补签信息不再显示在列表中 |
| TC003 | 测试补签信息搜索功能 | 1. 登录管理员帐户。2. 进入补签信息管理界面。3. 在搜索框输入关键词搜索特定补签信息。4. 点击搜索。 | 系统显示相关特定的补签信息 | 系统显示相关特定的补签信息 |
| TC003 | 测试补签信息审核功能 | 1. 登录管理员帐户。2. 进入补签信息管理界面。3. 点击审核,更新审核状态。4. 点击提交。 | 审核成功,更新的审核状态保存至数据库 | 审核成功,更新的审核状态保存至数据库 |
验证员工考勤管理的添加、修改、删除及查询等操作是否正常,员工考勤管理功能测试用例设计如下表所示。
表6.5 员工考勤管理功能测试用例
| 测试编号 | 测试目的 | 测试步骤 | 预期结果 | 实际结果 |
| TC001 | 测试员工考勤添加功能 | 1. 登录管理员帐户。2. 进入员工考勤管理界面。3. 点击添加,输入新的员工考勤基本信息。4. 点击提交。 | 添加成功,新的员工考勤显示在列表中 | 添加成功,新的员工考勤显示在列表中 |
| TC003 | 测试员工考勤修改功能 | 1. 登录管理员帐户。2. 进入员工考勤管理界面。3. 进入详情页,修改员工考勤。4. 点击提交。 | 修改成功,更新的员工考勤显示在列表 | 修改成功,更新的员工考勤显示在列表 |
| TC002 | 测试员工考勤删除功能 | 1. 登录管理员帐户。2. 进入员工考勤管理界面。3. 选择一项或多项员工考勤。4. 点击删除,并确认。 | 删除成功,相关员工考勤不再显示在列表中 | 删除成功,相关员工考勤不再显示在列表中 |
| TC003 | 测试员工考勤搜索功能 | 1. 登录管理员帐户。2. 进入员工考勤管理界面。3. 在搜索框输入关键词搜索特定员工考勤。4. 点击搜索。 | 系统显示相关特定的员工考勤 | 系统显示相关特定的员工考勤 |
6.2.2非功能测试用例
兼容性测试主要从设备、浏览器、分辨率、操作系统等方面进行测试,系统兼容性测试用例如下表所示。
表6.6 性能测试用例
| 用例编号 | 测试类型 | 测试目标 | 操作过程 | 预期结果 |
| TC001 | 设备兼容性 | 测试系统在不同设备上的表现 | 在多种设备上访问系统并记录表现 | 系统在各种设备上都能正常加载和显示页面 |
| TC002 | 浏览器兼容性 | 测试系统在不同浏览器上的表现 | 在多种浏览器中访问系统并记录表现 | 系统在各种主流浏览器上都能正常加载和显示页面 |
| TC003 | 分辨率兼容性 | 测试系统在不同分辨率下的显示效果 | 在不同分辨率的设备上访问系统并记录表现 | 系统在各种分辨率下都能适应并正常显示内容 |
| TC004 | 操作系统兼容性 | 测试系统在不同操作系统上的运行情况 | 在不同操作系统上访问系统并记录表现 | 系统能够在常用操作系统上正常运行和显示 |
性能测试主要从负载、压力、并发、数据量方面进行测试,系统性能测试用例如下表所示。
表6.7 性能测试用例
| 用例编号 | 测试类型 | 测试目标 | 操作过程 | 预期结果 |
| TC001 | 负载测试 | 测试系统在正常负载下的性能 | 逐步增加用户数来模拟不同的负载情况 | 系统能够稳定处理并响应不同数量的用户请求 |
| TC002 | 压力测试 | 测试系统在极端负载下的性能 | 以超过系统承受极限的用户数来测试系统 | 系统能够在高负载情况下仍然保持正常运行 |
| TC003 | 并发测试 | 测试系统能同时处理多少并发用户请求 | 同时发送多个并发用户请求来测试系统性能 | 系统能够有效地处理多个并发请求 |
| TC004 | 数据量测试 | 测试系统在大数据量下的性能 | 向系统添加大量数据并测试系统响应时间 | 系统能够在大数据量情况下保持较快的响应时间 |
6.3系统测试结果
全部测试用例都已通过,本系统运行稳定,使用流畅,性能良好,实现了本研究开始时所作要求和期望。试运行后进行系统评估,可以认为该系统达到预定的目标要求,能够满足用户的需求,也满足了系统开发前所作目标。系统在经过大量重复测试后运行十分稳定,安全实用,功能模块已经达到预定目标所需。在规定的时间内实现系统的大部分功能,且满足要求,节省开发成本,有助于提高科学管理水平,符合本人经济情况。
简而言之,经过严格的测试,可以发现该系统的功能和性能非常出色,它的精度、可靠性、稳健性都以达到预期要求,而且系统支持快速、精细的点击操作,能够让用户的使用感受更加良好。此外,系统还支持各种主流浏览器,满足不同的使用要求。
7总结与展望
本文设计并实现的基于Python的人脸识别考勤系统能够有效地解决传统考勤方法的诸多不足,通过自动化的考勤记录和智能识别技术,大幅提高了考勤工作效率。在系统设计中,采用Django框架进行后台逻辑处理和数据库交互,并设计了简洁友好的用户界面,便于管理员和员工用户使用,提升用户体验。系统设计了包括系统用户、部门名称管理、打卡签到管理、打卡签退管理、补签信息管理、员工考勤管理、部门考勤管理、操作日志及人脸识别等功能,基本满足整个考勤管理业务流程,在实际应用中达到了预期的功能目标。
虽然该系统在功能上基本满足了用户的需求,但仍有许多需要改进的地方。在接下来的开发阶段,计划进行以下改进:
用户界面设计:目前的操作页面虽然满足了简易操作的要求,但在多样化设计方面还有提升空间。将考虑引入更多丰富的设计元素,使界面更加美观和用户友好。
安全性能优化:针对系统安全性能的增强,需要进一步优化系统的整体防护能力。具体而言,将要对程序退出的安全性进行加强,确保在退出过程中不存在数据泄露或系统不稳定的风险。同时,对系统的并发处理能力进行升级,以确保在高并发场景下系统能够保持稳定的运行状态。
性能优化:在性能优化方面,将着重于对程序的数据结构和代码逻辑进行精细化调整。优化后的系统应具备快速处理大量事务的能力,显著缩短事务处理时间,从而提高整体工作效率。同时,致力于降低服务器资源的占用率,以实现资源的高效利用和成本的有效控制。
参考文献
- 兰琳琳.基于MySQL-Django-Vue的在线考试系统[J].电脑知识与技术,2024,20(33):51-54.DOI:10.14004/j.cnki.ckt.2024.1702.
- 石也牧.浅谈如何写出整洁的Python代码[J].科技风,2025,(01):147-150.DOI:10.19392/j.cnki.1671-7341.202501048.
- 陈俊.基于Python的个性化在线学习系统的设计与实现[J].电脑知识与技术,2023,19(28):37-39.DOI:10.14004/j.cnki.ckt.2023.1502.
- 戴靓婕,王希.MYSQL数据库访问技术及Python运用研究[J].长江信息通信,2024,37(10):54-56.DOI:10.20153/j.issn.2096-9759.2024.10.014.
- 杨洪涛.基于Python+MySQL的学生成绩管理系统的设计与实现[J].电脑编程技巧与维护,2023,(05):86-89.DOI:10.16184/j.cnki.comprg.2023.05.036.
- 秋怡,郭盘江.基于Django的野生动物种群信息管理系统[J].物联网技术,2025,15(07):99-102.DOI:10.16667/j.issn.2095-1302.2025.07.020.
- 高迎.基于Django的健康宣教系统的设计与实现[J].科技与创新,2024,(13):80-83+90.DOI:10.15913/j.cnki.kjycx.2024.13.020.
- 李佳俊,何玥,钱嵩橙,等.“互联网+”背景下基于B/S的云教育系统设计[J].软件,2022,43(10):173-177.
- 马羽翔.Web辅助学习平台的设计与实现[J].福建电脑,2025,41(03):73-78.DOI:10.16707/j.cnki.fjpc.2025.03.015.
- 陈玲.基于Django的名著人物展示系统的设计与实现[J].中国信息界,2024,(07):188-190.
- 张亮敬,姚国鹏,吴作洲.基于人脸识别的课堂考勤系统设计与实现[J].无线互联科技,2024,21(22):23-27.
- T. T O ,T. F O ,J. A O .Development of an Attendance Management System Using Facial Recognition Technology[J].Journal of Engineering Research and Reports,2024,26(10):297-307.
- Alobaidy A A M ,Yosif M Z,Alsoufi S M, et al.Attendance System Based on Face Recognition Dependent on Deep Intelligent Techniques[J].Revue d'Intelligence Artificielle,2024,38(3):
- 汪涛.基于SpringBoot和人脸识别的企业考勤管理系统设计与实现[D].阜阳师范大学,2023.DOI:10.27846/d.cnki.gfysf.2023.000144.
- 管鑫,鲍康胜,王小艳.Python自动化在考勤打卡数据统计中的应用[J].电脑编程技巧与维护,2023,(02):88-90.DOI:10.16184/j.cnki.comprg.2023.02.011.
- 吴祥美.基于深度学习人脸识别的智慧课堂考勤系统[J].景德镇学院学报,2022,37(03):28-31.
- 邢东.基于云服务的人脸识别考勤系统的设计与实现[D].北京邮电大学,2022.DOI:10.26969/d.cnki.gbydu.2022.000636.
- 龚双.基于人脸识别的考勤系统的研究与实现[D].北京邮电大学,2022.DOI:10.26969/d.cnki.gbydu.2022.000931.
- 贾靖,孟祥,黄子峻,等.基于人脸识别的辅助实时考勤系统设计[J].现代工业经济和信息化,2022,12(01):110-111.DOI:10.16525/j.cnki.14-1362/n.2022.01.038.
- 贺一粒.基于人脸识别的移动签到考勤系统[D].北京林业大学,2021.DOI:10.26949/d.cnki.gblyu.2021.000108.
- 聂毓谣.基于数据库的员工考勤系统设计与实现[J].电脑知识与技术,2020,16(01):56-58+87.DOI:10.14004/j.cnki.ckt.2020.0026.
致 谢
这次毕业设计能够完成,最重要的就是来自指导老师的帮助,是导师不厌其烦的对我的论文及毕业设计提出非常有建设性的建议,我的毕设施能够完成离不开导师的帮助。在此,我对导师由衷的表示感谢。
其次要感谢大学四年里学院里所有的任课老师的教导,老师们在我整个大学四年里给予了我丰富的知识,让我能够在大学中不虚度光阴,踏踏实实的学习,没有这些老师不辞辛劳的教诲,我无法完成这四年的学业。
最后,我要感谢我的家人和同学们。感谢父母在物质与精神上给予我无限的支持和鼓励。感谢我的同学们,在论文写作期间,你们给予了我许多宝贵的建议和帮助,让我在学术研究的道路上不再孤单。
再次感谢所有在我大学生活中给予我帮助和支持的人们。您们的关怀和鼓励将永远铭刻在我的心中,成为我未来前行的动力。
由于自己的水平有限,毕设仍然存在着很大的缺陷,各位老师若提出意见,我会努力改正。
附 录
核心代码设计
数据库配置文件在app文件下的settings.py代码如下
WSGI_APPLICATION = "app.wsgi.application"
DATABASES = {
"default": {
"ENGINE": "django.db.backends.mysql",
"NAME": "project93355",
"USER": "root",
"PASSWORD": "root",
"HOST": "127.0.0.1",
"PORT": "3306",
}
}
Md5加密引入代码如下:
from hashlib import md5
def md5hash(key):
input_name = md5()
input_name.update(key.encode("utf-8"))
return input_name.hexdigest()
登录代码如下:
def Login(self, ctx):
print("===================登录=====================")
ret = {
"error": {
"code": 70000,
"message": "账户不存在",
}
}
body = ctx.body
password = md5hash(body["password"]) or ""
obj = service_select("user").Get_obj(
{"username": body["username"]}, {"like": False}
)
if obj:
user_group = service_select("user_group").Get_obj({'name': obj['user_group']}, {"like": False})
if user_group and user_group['source_table'] != '':
user_obj = service_select(user_group['source_table']).Get_obj({"user_id": obj['user_id']}, {"like": False})
if user_obj['examine_state'] == '未通过':
ret = {
"error": {
"code": 70000,
"message": "账户未通过审核",
}
}
return ret
if user_obj['examine_state'] == '未审核':
ret = {
"error": {
"code": 70000,
"message": "账户未审核",
}
}
return ret
if obj["state"] == 1:
if obj["password"] == password:
timeout = timezone.now()
timestamp = int(time.mktime(timeout.timetuple())) * 1000
token = md5hash(str(obj["user_id"]) + "_" + str(timestamp))
ctx.request.session[token] = obj["user_id"]
service_select("access_token").Add(
{"token": token, "user_id": obj["user_id"]}
)
obj["token"] = token
ret = {
"result": {"obj": obj}
}
else:
ret = {
"error": {
"code": 70000,
"message": "密码错误",
}
}
else:
ret = {
"error": {
"code": 70000,
"message": "用户账户不可用,请联系管理员",
}
}
return ctx.response(json.dumps(ret, ensure_ascii=False))
注册代码如下:
def Register(self, ctx):
print("===================注册=====================")
userService = service_select("user")
body = ctx.body
if "username" not in body and body["username"] == '':
return ctx.response(json.dumps({
"error": {
"code": 70000,
"message": "用户名不能为空",
}
}, ensure_ascii=False))
if "user_group" not in body and body["user_group"] == '':
return ctx.response(json.dumps({
"error": {
"code": 70000,
"message": "用户组不能为空",
}
}, ensure_ascii=False))
if "password" not in body and body["password"] == '':
return ctx.response(json.dumps({
"error": {
"code": 70000,
"message": "密码不能为空",
}
}, ensure_ascii=False))
post_param = body
post_param['nickname'] = body["nickname"] or ""
post_param['password'] = md5hash(body["password"])
obj = userService.Get_obj({"username": post_param['username']}, {"like": False})
if obj:
return ctx.response(json.dumps({
"error": {
"code": 70000,
"message": "用户名已存在",
}
}, ensure_ascii=False))
ret = {
"error": {
"code": 70000,
"message": "注册失败",
}
}
bl = userService.Add(post_param)
if bl:
ret = {
"result": {
"bl": True,
"message": "注册成功"
}
}
return ctx.response(json.dumps(ret, ensure_ascii=False))
找回密码代码如下:
def Forget_password(self, ctx):
print("===================修改密码=====================")
ret = {
"error": {
"code": 70000,
"message": "用户信息不能没有"
}
}
body = ctx.body
if not body["code"]:
return {
"error": {
"code": 70000,
"message": "验证码不存在或者错误"
}
}
obj = service_select("user").Get_obj(
{"username": body["username"]}, {"like": False}
)
if not obj:
return {
"error": {
"code": 70000,
"message": "用户名不存在或者错误"
}
}
password = md5hash(body["password"])
if not password:
return {
"error": {
"code": 70000,
"message": "密码不存在或者错误"
}
}
bl = service_select("user").Set({"user_id": obj["user_id"]}, {"password": password})
if bl:
ret = {"result": {"bl": True, "message": "修改成功"}}
else:
ret = {
"error": {
"code": 70000,
"message": "修改失败",
}
}
return ctx.response(json.dumps(ret, ensure_ascii=False))
修改密码代码如下:
def Change_password(self, ctx):
print("===================修改密码=====================")
ret = {
"error": {
"code": 70000,
"message": "账号未登录",
}
}
request = ctx.request
headers = request.headers
if ("x-auth-token" in headers) and headers["x-auth-token"]:
token = headers["x-auth-token"]
user_id = tokenGetUserId(token, request)
userService = service_select("user")
body = ctx.body
password = md5hash(body["o_password"])
obj = userService.Get_obj({"user_id": user_id, "password": password}, {"like": False})
if obj:
password = md5hash(body["password"])
bl = userService.Set({"user_id": user_id}, {"password": password})
if bl:
ret = {"result": {"bl": True, "message": "修改成功"}}
else:
ret = {
"error": {
"code": 70000,
"message": "修改失败",
}
}
else:
ret = {
"error": {
"code": 70000,
"message": "密码错误",
}
}
else:
ret = {
"error": {
"code": 70000,
"message": "账户未登录",
}
}
return ctx.response(json.dumps(ret, ensure_ascii=False))
增删查改代码如下:
增
def Add(self, ctx):
body = ctx.body
unique = self.config.get("unique")
obj = None
if unique:
qy = {}
for i in range(len(unique)):
key = unique[i]
qy[key] = body.get(key)
obj = self.service.Get_obj(qy)
if not obj:
error = self.Add_before(ctx)
if error["code"]:
return {"error": error}
error = self.Events("add_before", ctx, None)
if error["code"]:
return {"error": error}
result = self.service.Add(body, self.config)
if self.service.error:
return {"error": self.service.error}
res = self.Add_after(ctx, result)
if res:
result = res
res = self.Events("add_after", ctx, result)
if res:
result = res
return {"result": result}
else:
return {"error": {"code": 10000, "message": "已存在"}}
删
def Del(self, ctx):
if len(ctx.query) == 0:
errorMsg = {"code": 30000, "message": "删除条件不能为空!"}
return errorMsg
result = self.service.Del(ctx.query, self.config)
if self.service.error:
return {"error": self.service.error}
return {"result": result}
改
def Set(self, ctx):
error = self.Set_before(ctx)
if error["code"]:
return {"error": error}
error = self.Events("set_before", ctx, None)
if error["code"]:
return {"error": error}
query = ctx.query
if 'page' in query.keys():
del ctx.query['page']
if 'size' in query.keys():
del ctx.query['size']
if 'orderby' in query.keys():
del ctx.query['orderby']
result = self.service.Set(ctx.query, ctx.body, self.config)
if self.service.error:
return {"error": self.service.error}
res = self.Set_after(ctx, result)
if res:
result = res
res = self.Events("set_after", ctx, result)
if res:
result = res
return {"result": result}
查多条数据:
def Get_list(self, ctx):
query = dict(ctx.query)
config_plus = {}
if "field" in query:
field = query.pop("field")
config_plus["field"] = field
if "page" in query:
config_plus["page"] = query.pop("page")
if "size" in query:
config_plus["size"] = query.pop("size")
if "orderby" in query:
config_plus["orderby"] = query.pop("orderby")
if "like" in query:
config_plus["like"] = query.pop("like")
if "groupby" in query:
config_plus["groupby"] = query.pop("groupby")
count = self.service.Count(query)
lst = []
if self.service.error:
return {"error": self.service.error}
elif count:
lst = self.service.Get_list(query,
obj_update(self.config, config_plus))
if self.service.error:
return {"error": self.service.error}
self.interact_list(ctx, lst)
return {"result": {"list": lst, "count": count}}
查一条数据:
def Get_obj(self, ctx):
query = dict(ctx.query)
config_plus = {}
if "field" in query:
field = query.pop("field")
config_plus["field"] = field
obj = self.service.Get_obj(query, obj_update(self.config, config_plus))
if self.service.error:
return {"error": self.service.error}
if obj:
self.interact_obj(ctx, obj)
return {"result": {"obj": obj}}
免费领取项目源码,请关注❥点赞收藏并私信博主,谢谢~
180

被折叠的 条评论
为什么被折叠?



