毕设焦虑症晚期?基于uni-app的微信小程序考勤系统让你重燃信心

50 阅读6分钟

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

@TOC

基于微信小程序的课堂考勤签到系统介绍

基于微信小程序的课堂考勤签到系统是一套采用现代化技术架构开发的教育管理应用,该系统以Java作为后端核心开发语言,结合SpringBoot框架构建稳定高效的服务端架构,通过Spring、SpringMVC和MyBatis的整合实现完整的MVC模式开发。系统前端采用uni-app跨平台开发框架,配合微信小程序原生开发工具,实现了小程序端和安卓移动端的双平台支持,为用户提供便捷的移动考勤体验。数据存储方面采用MySQL关系型数据库,确保数据的完整性和安全性,整体采用C/S和B/S混合架构模式,支持多终端访问和管理。系统功能涵盖完整的考勤管理流程,包括系统首页展示、教师信息管理、学生信息维护、课程信息设置、请假信息处理、考勤记录统计、成绩信息管理等核心功能,同时提供学习建议推荐、系统管理配置、个人信息维护等辅助功能,并集成公告信息发布、轮播图展示、公告分类管理等信息展示模块。该系统通过微信小程序的便民性和SpringBoot框架的技术优势,实现了传统纸质考勤向数字化智能考勤的转变,提高了考勤效率,减少了人工统计错误,为学校课堂管理提供了现代化的技术解决方案。

基于微信小程序的课堂考勤签到系统演示视频

演示视频

基于微信小程序的课堂考勤签到系统演示图片

成绩信息.png

登陆界面.png

考勤记录.png

课程信息.png

请假信息.png

学习建议.png

基于微信小程序的课堂考勤签到系统代码展示

import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;

@RestController
@RequestMapping("/attendance")
public class AttendanceController {
   
   @Autowired
   private AttendanceService attendanceService;
   
   // 大数据分析引擎初始化
   private SparkSession spark = SparkSession.builder()
           .appName("AttendanceAnalysis")
           .master("local[*]")
           .getOrCreate();
   
   // 核心功能1:学生考勤签到处理
   @PostMapping("/signin")
   public Map<String, Object> studentSignIn(@RequestBody Map<String, Object> signInData) {
       Map<String, Object> result = new HashMap<>();
       String studentId = (String) signInData.get("studentId");
       String courseId = (String) signInData.get("courseId");
       String signInTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
       String signInLocation = (String) signInData.get("location");
       
       // 验证学生是否有该课程的签到权限
       boolean hasPermission = attendanceService.validateStudentCourse(studentId, courseId);
       if (!hasPermission) {
           result.put("success", false);
           result.put("message", "您没有该课程的签到权限");
           return result;
       }
       
       // 检查是否重复签到
       boolean alreadySigned = attendanceService.checkDuplicateSignIn(studentId, courseId, signInTime.substring(0, 10));
       if (alreadySigned) {
           result.put("success", false);
           result.put("message", "今日已完成签到,请勿重复操作");
           return result;
       }
       
       // 计算签到状态(正常/迟到)
       String courseStartTime = attendanceService.getCourseStartTime(courseId);
       String attendanceStatus = calculateAttendanceStatus(signInTime, courseStartTime);
       
       // 保存签到记录
       Map<String, Object> attendanceRecord = new HashMap<>();
       attendanceRecord.put("studentId", studentId);
       attendanceRecord.put("courseId", courseId);
       attendanceRecord.put("signInTime", signInTime);
       attendanceRecord.put("attendanceStatus", attendanceStatus);
       attendanceRecord.put("signInLocation", signInLocation);
       attendanceRecord.put("recordType", "SIGN_IN");
       
       boolean saveSuccess = attendanceService.saveAttendanceRecord(attendanceRecord);
       if (saveSuccess) {
           result.put("success", true);
           result.put("message", "签到成功");
           result.put("status", attendanceStatus);
           result.put("time", signInTime);
       } else {
           result.put("success", false);
           result.put("message", "签到失败,请重试");
       }
       return result;
   }
   
   // 核心功能2:教师考勤统计分析
   @GetMapping("/statistics/{courseId}")
   public Map<String, Object> getAttendanceStatistics(@PathVariable String courseId, 
                                                     @RequestParam String startDate, 
                                                     @RequestParam String endDate) {
       Map<String, Object> result = new HashMap<>();
       
       // 使用大数据技术分析考勤数据
       Dataset<Row> attendanceData = spark.read()
               .format("jdbc")
               .option("url", "jdbc:mysql://localhost:3306/attendance_db")
               .option("dbtable", "attendance_record")
               .option("user", "root")
               .option("password", "123456")
               .load();
       
       // 筛选指定课程和时间范围的数据
       Dataset<Row> filteredData = attendanceData
               .filter(attendanceData.col("course_id").equalTo(courseId))
               .filter(attendanceData.col("sign_in_time").between(startDate, endDate));
       
       // 统计各种考勤状态的数量
       Dataset<Row> statusCount = filteredData.groupBy("attendance_status").count();
       Map<String, Long> statusStatistics = new HashMap<>();
       statusCount.collectAsList().forEach(row -> {
           statusStatistics.put(row.getString(0), row.getLong(1));
       });
       
       // 计算出勤率
       long totalRecords = filteredData.count();
       long normalAttendance = statusStatistics.getOrDefault("NORMAL", 0L);
       long lateAttendance = statusStatistics.getOrDefault("LATE", 0L);
       double attendanceRate = totalRecords > 0 ? (double)(normalAttendance + lateAttendance) / totalRecords * 100 : 0.0;
       
       // 分析每日出勤趋势
       Dataset<Row> dailyTrend = filteredData
               .select("sign_in_time", "attendance_status")
               .withColumn("date", filteredData.col("sign_in_time").substr(1, 10))
               .groupBy("date", "attendance_status")
               .count()
               .orderBy("date");
       
       List<Map<String, Object>> trendData = new ArrayList<>();
       dailyTrend.collectAsList().forEach(row -> {
           Map<String, Object> dayData = new HashMap<>();
           dayData.put("date", row.getString(0));
           dayData.put("status", row.getString(1));
           dayData.put("count", row.getLong(2));
           trendData.add(dayData);
       });
       
       result.put("success", true);
       result.put("statusStatistics", statusStatistics);
       result.put("attendanceRate", String.format("%.2f", attendanceRate));
       result.put("totalRecords", totalRecords);
       result.put("dailyTrend", trendData);
       result.put("courseId", courseId);
       result.put("dateRange", startDate + " 至 " + endDate);
       return result;
   }
   
   // 核心功能3:学生请假申请处理
   @PostMapping("/leave/apply")
   public Map<String, Object> applyForLeave(@RequestBody Map<String, Object> leaveData) {
       Map<String, Object> result = new HashMap<>();
       String studentId = (String) leaveData.get("studentId");
       String courseId = (String) leaveData.get("courseId");
       String leaveReason = (String) leaveData.get("leaveReason");
       String leaveStartDate = (String) leaveData.get("startDate");
       String leaveEndDate = (String) leaveData.get("endDate");
       String applyTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
       
       // 验证请假时间的合理性
       if (!validateLeaveDates(leaveStartDate, leaveEndDate)) {
           result.put("success", false);
           result.put("message", "请假时间设置不合理,请检查开始和结束日期");
           return result;
       }
       
       // 检查是否有重叠的请假申请
       boolean hasOverlapLeave = attendanceService.checkOverlapLeave(studentId, courseId, leaveStartDate, leaveEndDate);
       if (hasOverlapLeave) {
           result.put("success", false);
           result.put("message", "该时间段已有请假记录,请勿重复申请");
           return result;
       }
       
       // 生成请假申请记录
       String leaveId = "LEAVE_" + studentId + "_" + System.currentTimeMillis();
       Map<String, Object> leaveRecord = new HashMap<>();
       leaveRecord.put("leaveId", leaveId);
       leaveRecord.put("studentId", studentId);
       leaveRecord.put("courseId", courseId);
       leaveRecord.put("leaveReason", leaveReason);
       leaveRecord.put("startDate", leaveStartDate);
       leaveRecord.put("endDate", leaveEndDate);
       leaveRecord.put("applyTime", applyTime);
       leaveRecord.put("approvalStatus", "PENDING");
       leaveRecord.put("approvalTime", null);
       leaveRecord.put("approverComments", null);
       
       // 根据请假天数确定审批流程
       int leaveDays = calculateLeaveDays(leaveStartDate, leaveEndDate);
       String approvalLevel = leaveDays <= 3 ? "TEACHER" : "ADMIN";
       leaveRecord.put("approvalLevel", approvalLevel);
       
       // 保存请假申请
       boolean saveSuccess = attendanceService.saveLeaveApplication(leaveRecord);
       if (saveSuccess) {
           // 发送通知给相关教师或管理员
           attendanceService.sendApprovalNotification(leaveId, approvalLevel);
           result.put("success", true);
           result.put("message", "请假申请提交成功,等待审批");
           result.put("leaveId", leaveId);
           result.put("approvalLevel", approvalLevel);
           result.put("estimatedDays", leaveDays);
       } else {
           result.put("success", false);
           result.put("message", "请假申请提交失败,请重试");
       }
       return result;
   }
   
   private String calculateAttendanceStatus(String signInTime, String courseStartTime) {
       return signInTime.compareTo(courseStartTime) <= 0 ? "NORMAL" : "LATE";
   }
   
   private boolean validateLeaveDates(String startDate, String endDate) {
       return startDate.compareTo(endDate) <= 0;
   }
   
   private int calculateLeaveDays(String startDate, String endDate) {
       return (int) java.time.temporal.ChronoUnit.DAYS.between(
           java.time.LocalDate.parse(startDate), 
           java.time.LocalDate.parse(endDate)
       ) + 1;
   }
}

基于微信小程序的课堂考勤签到系统文档展示

文档.png

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