如何用Python+Django实现工作考勤系统?看完这篇你会发现比想象的简单

54 阅读4分钟

💖💖作者:计算机毕业设计江挽 💙💙个人简介:曾长期从事计算机专业培训教学,本人也热爱上课教学,语言擅长Java、微信小程序、Python、Golang、安卓Android等,开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 深度学习实战项目

基于企业微信的工作考勤系统介绍

工作考勤系统是一款基于B/S架构设计的综合性人事管理平台,采用Java/Python双语言支持,分别基于Spring Boot(Spring+SpringMVC+Mybatis)和Django框架开发,前端技术栈整合了uni-app、微信小程序及安卓应用,数据存储依托MySQL数据库实现。系统功能模块完善,包括直观的信息总览首页、精细化的用户管理、灵活的系统管理、全面的考勤信息管理、便捷的打卡管理、规范的请假信息管理以及高效的工作汇报管理,满足企业对员工出勤、请假、工作汇报等多方面管理需求。通过移动端与Web端的无缝结合,员工可随时随地进行打卡、请假申请和工作汇报提交,管理者则能够实时掌握团队考勤状况,查看统计数据,审批各类申请,大幅提升人事管理效率,降低管理成本,为企业提供科学、精准的人力资源决策依据。

基于企业微信的工作考勤系统演示视频

演示视频

基于企业微信的工作考勤系统演示图片

登录首页用户管理 通知公告 考勤信息 打卡管理 请假信息 工作汇报

基于企业微信的工作考勤系统代码展示

// 核心功能1: 打卡管理 - 处理用户打卡请求并进行地理位置验证
@RestController
@RequestMapping("/api/attendance")
public class AttendanceController {
    @Autowired
    private AttendanceService attendanceService;
    @Autowired
    private CompanySettingService companySettingService;
    @PostMapping("/clock")
    public ResponseEntity<?> clockIn(@RequestBody ClockInRequest request, 
                                    @RequestParam("userId") Long userId) {
        try {
            // 获取用户信息
            User user = userService.getUserById(userId);
            if (user == null) {
                return ResponseEntity.status(HttpStatus.NOT_FOUND)
                    .body(new ApiResponse(false, "用户不存在"));
            }
            // 获取公司考勤设置
            CompanySetting setting = companySettingService.getByCompanyId(user.getCompanyId());
            // 检查是否在工作时间内
            LocalTime currentTime = LocalTime.now();
            LocalTime startTime = setting.getWorkStartTime();
            LocalTime endTime = setting.getWorkEndTime();
            AttendanceRecord record = new AttendanceRecord();
            record.setUserId(userId);
            record.setClockTime(LocalDateTime.now());
            record.setLocation(request.getLocation());
            record.setDeviceInfo(request.getDeviceInfo());
            // 计算用户打卡位置与公司位置的距离
            double distance = calculateDistance(
                request.getLatitude(), 
                request.getLongitude(),
                setting.getCompanyLatitude(),
                setting.getCompanyLongitude()
            );
            // 判断是否在有效打卡范围内
            if (distance > setting.getAllowedDistance()) {
                record.setStatus(AttendanceStatus.LOCATION_INVALID);
                record.setRemark("打卡位置超出允许范围");
                attendanceService.saveRecord(record);
                return ResponseEntity.ok(new ApiResponse(false, "打卡失败,位置不在有效范围内"));
            }
            // 判断打卡类型(上班/下班)和状态(正常/迟到/早退)
            if (request.getType() == ClockType.CLOCK_IN) {
                if (currentTime.isAfter(startTime.plusMinutes(setting.getLateThreshold()))) {
                    record.setStatus(AttendanceStatus.LATE);
                    record.setRemark("迟到" + ChronoUnit.MINUTES.between(startTime, currentTime) + "分钟");
                } else {
                    record.setStatus(AttendanceStatus.NORMAL);
                }
            } else {
                if (currentTime.isBefore(endTime.minusMinutes(setting.getEarlyLeaveThreshold()))) {
                    record.setStatus(AttendanceStatus.EARLY_LEAVE);
                    record.setRemark("早退" + ChronoUnit.MINUTES.between(currentTime, endTime) + "分钟");
                } else {
                    record.setStatus(AttendanceStatus.NORMAL);
                }
            }
            // 保存打卡记录
            AttendanceRecord savedRecord = attendanceService.saveRecord(record);
            // 更新用户月度考勤统计
            attendanceService.updateMonthlyStatistics(userId, LocalDate.now().getYear(), 
                                                     LocalDate.now().getMonthValue());
            return ResponseEntity.ok(new ApiResponse(true, "打卡成功", savedRecord));
        } catch (Exception e) {
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                .body(new ApiResponse(false, "打卡处理失败: " + e.getMessage()));
        }
    }
    private double calculateDistance(double lat1, double lon1, double lat2, double lon2) {
        // 地球半径(米)
        final double EARTH_RADIUS = 6371000;
        // 将经纬度转换为弧度
        double radLat1 = Math.toRadians(lat1);
        double radLon1 = Math.toRadians(lon1);
        double radLat2 = Math.toRadians(lat2);
        double radLon2 = Math.toRadians(lon2);
        // 计算经纬度差值
        double deltaLat = radLat2 - radLat1;
        double deltaLon = radLon2 - radLon1;
        // 使用Haversine公式计算球面距离
        double a = Math.sin(deltaLat/2) * Math.sin(deltaLat/2) +
                  Math.cos(radLat1) * Math.cos(radLat2) *
                  Math.sin(deltaLon/2) * Math.sin(deltaLon/2);
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
        return EARTH_RADIUS * c;
    }
}

基于企业微信的工作考勤系统文档展示

在这里插入图片描述

💖💖作者:计算机毕业设计江挽 💙💙个人简介:曾长期从事计算机专业培训教学,本人也热爱上课教学,语言擅长Java、微信小程序、Python、Golang、安卓Android等,开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 深度学习实战项目