【开源】SpringBoot框架开发班级考勤管理系统

在这里插入图片描述


目录

  • 一、摘要
    • 1.1 项目介绍
    • 1.2 项目录屏
  • 二、功能模块
    • 2.1 系统基础支持模块
    • 2.2 班级学生教师支持模块
    • 2.3 考勤签到管理
    • 2.4 学生请假管理
  • 三、系统设计
    • 3.1 功能设计
      • 3.1.1 系统基础支持模块
      • 3.1.2 班级学生教师档案模块
      • 3.1.3 考勤签到管理模块
      • 3.1.4 学生请假管理模块
    • 3.2 数据库设计
      • 3.2.1 用户配置表
      • 3.2.2 学生档案表
      • 3.2.3 教师档案表
      • 3.2.4 学生请假表
      • 3.2.5 考勤档案表
  • 四、系统展示
  • 五、核心代码
    • 5.1 发起考勤签到
    • 5.2 考勤补录
    • 5.3 学生请假
    • 5.4 考勤签到小程序界面
    • 5.5 小程序登录页面
  • 六、免责说明


一、摘要

1.1 项目介绍

基于JAVA+Vue+SpringBoot+MySQL的班级考勤管理系统,分为微信小程序端和管理后台,包含了学生档案、班级档案、教师档案、学生考勤、学生请假模块,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础模块,班级考勤管理系统基于角色的访问控制,给教师、学生使用,可将权限精确到按钮级别,您可以自定义角色并分配权限,系统适合设计精确的权限约束需求。

考勤是高校管理学生的基本方式,也是考核学生成绩的重要一环。随着高校考勤数量的快速增长,面对大类的考勤数据,人工记录的方式存在很多弊端。手动考勤很有可能出现记录错误、计算错误的情况,传统的考勤记录方式已经不能满足现有的需求,完善高校考勤管理模式势在必行。

开发一套基于 Vue.js 的班级考勤管理系统,正是为了解决考勤信息管理难的问题,系统化的管理模式可以减轻考勤人员的工作任务,提高考勤效率,系统还支持生成各式各样的图表,让原本枯燥的考勤工作变得简单而有趣。

1.2 项目录屏


二、功能模块

目前,高校对于班级考勤系统的需求包括打卡请假两大方面,另外还包括对班级、学生等基础档案的管理,因为还需要对考勤这样的数据进行合理存储,打卡数据的准确性在高校考勤事务中非常重要,接下来将详细阐述班级考勤管理系统的系统需求。

通过对高校实际需求的研究,我将班级考勤管理系统的功能模块分为系统基础支持模块、班级学生教师档案支持模块、考勤签到支持模块、学生请假支持模块,在使用场景上分为浏览器PC端和微信小程序端。

在这里插入图片描述

2.1 系统基础支持模块

系统基础支持模块包括支撑班级考勤管理系统运行的管理模块。比如系统的菜单管理,维护了菜单的名称、前端路由、前端组件信息,是支撑系统运行的基础内容。比如日志模块,用于基础学生的登陆、打卡、请假操作,用于留档。

2.2 班级学生教师支持模块

班级档案、学生档案、教师档案是班级考勤管理系统的基础档案信息。班级是学生的承载体,班级和学生是一对多的关系。
班级档案包括各个年级段行政班级的档案,包含了班级名称、班级代码、年级、班主任、学生数量、学习委员等,可以通过此模块进行班级基础数据的维护。
学生档案管理是对班级内学生的信息进行管理,其中包括各个班级下学生的档案,包含了学生姓名、性别、手机号、年龄等信息,可以通过此模块进行学生基础数据的维护。
教师档案管理是对高校在职教师的信息进行管理,其中包括各分院在职教师的档案,包含了教师姓名、学历、职称、开始工作时间等,可以通过此模块进行教师基础数据的维护。

2.3 考勤签到管理

考勤签到管理模块,录入了教师发起的考勤信息,包括考勤的开始时间、结束时间、考勤缘由、参与班级等,可以通过此模块来发起考勤、操作考勤补录、查询考勤报表。

2.4 学生请假管理

高校学生可以在此模块中发起请假,该学生所属班级的班主任可以对请假单进行审批,学习委员可以查看班级学生的请假情况,班级考勤系统所有关于请假的功能,都在学生请假管理下。

在这里插入图片描述


三、系统设计

3.1 功能设计

3.1.1 系统基础支持模块

系统基础支持模块的功能包括了登陆用户、用户角色、系统菜单、日志、数据字典的模块支持。

数据字典需要包括字典名称、字典ID、创建人、字典内容、字典类型字段,字典值和数据字典是一对多的关系,需要分为两张表进行存储。

日志需要包括操作名称、操作IP、操作人、记录时间字段,一张关系表存储即可。

系统菜单包括了菜单名称、菜单ID、菜单路由、菜单备注、创建人,一张关系表存储即可。

用户角色包括了角色名称、角色ID、菜单权限、备注信息,其中角色和菜单是一对多的关系,需要分两张表进行存储。

在这里插入图片描述

3.1.2 班级学生教师档案模块

该模块是对班级、学生、教师进行管理。包括对学习委员进行管理,主要有班级、学生、教师的信息以及学习委员的设置,其中包含了对班级、学生、教师的信息进行添加,搜索,该模块可以详细查看班主任的信息档案。

在这里插入图片描述

3.1.3 考勤签到管理模块

该模块是对考勤签到的管理,主要是教师发起考勤、修改考勤信息、取消考勤、学生参与考勤、考勤补录、考勤报表。该模块主要针对考勤的一些信息进行维护。

其中学生考勤打卡部分,位于微信小程序端,学生可以进入手机微信完成打卡操作,既方便又高校。管理人员可以对这些信息进行修改,包括了基础的增、删、改、查。

考勤补录部分,又具体详细显示了考勤的详细信息,具体包括了考勤的应参与人数、实际参与人数等,这样可以更好的分析班级的考勤状态。同时,管理人员也可以对这些考勤信息进行补录,也包括基础的增、删、改、查。

在这里插入图片描述

3.1.4 学生请假管理模块

该模块是维护学生的请假数据,该模块包含了高校学生发起的所有请假信息,经过学生所在行政班班主任审核后生效。同时,在该模块当中,也可以对这些请假数据进行搜索、查看以及修改。

3.2 数据库设计

3.2.1 用户配置表

在这里插入图片描述

3.2.2 学生档案表

在这里插入图片描述

3.2.3 教师档案表

在这里插入图片描述

3.2.4 学生请假表

在这里插入图片描述

3.2.5 考勤档案表

在这里插入图片描述


四、系统展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


五、核心代码

5.1 发起考勤签到

@RequestMapping(value = "/addAttendance", method = RequestMethod.GET)
@ApiOperation(value = "发起签到")
public Result<Attendance> addAttendance(@RequestParam String classId, @RequestParam String date, @RequestParam String type, @RequestParam String ansNumber, @RequestParam String startTime, @RequestParam String endTime, @RequestParam String title, @RequestParam String remark){
    User currUser = securityUtil.getCurrUser();
    ClassArchives ca = iClassArchivesService.getById(classId);
    if(ca == null) {
        return ResultUtil.error("班级不存在");
    }
    Attendance at = new Attendance();
    at.setTeacherId(currUser.getId());
    at.setTeacherName(currUser.getNickname());
    at.setTitle(title);
    at.setClassId(ca.getId());
    at.setClassTitle(ca.getClassName());
    at.setDate(date);
    at.setStartTime(startTime);
    at.setEndTime(endTime);
    at.setType(type);
    at.setNumber(ansNumber);
    at.setRemark(remark);
    at.setStatus("正常");
    iAttendanceService.saveOrUpdate(at);
    AttendanceClass ac = new AttendanceClass();
    ac.setAttendanceId(at.getId());
    ac.setClassId(classId);
    iAttendanceClassService.saveOrUpdate(ac);
    QueryWrapper<StudentArchives> stuQw = new QueryWrapper<>();
    stuQw.eq("class_id",classId);
    List<StudentArchives> studentArchivesList = iStudentArchivesService.list(stuQw);
    for (StudentArchives sa : studentArchivesList) {
        AttendanceItem item = new AttendanceItem();
        item.setAttendanceId(at.getId());
        item.setAttendanceName(at.getTitle());
        item.setStudentId(sa.getId());
        item.setStudentName(sa.getUserName());
        item.setStudentNumber(sa.getStudyNumber());
        item.setTeacherId(currUser.getId());
        item.setTeacherName(currUser.getNickname());
        item.setDate(date);
        item.setStartTime(startTime);
        item.setEndTime(endTime);
        item.setStatus("未参与");
        iAttendanceItemService.saveOrUpdate(item);
    }
    return ResultUtil.success();
}

5.2 考勤补录

@RequestMapping(value = "/buLu", method = RequestMethod.POST)
@ApiOperation(value = "考勤补录")
public Result<Object> buLu(@RequestParam String id){
    AttendanceItem ai = iAttendanceItemService.getById(id);
    if(ai != null) {
        ai.setStatus("已参与");
        iAttendanceItemService.saveOrUpdate(ai);
    }
    return ResultUtil.success();
}

5.3 学生请假

@RequestMapping(value = "/addStudentLeaveOnApp", method = RequestMethod.GET)
@ApiOperation(value = "新增请假-移动端")
public Result<Object> addStudentLeaveOnApp(@RequestParam String userId,@RequestParam String type,@RequestParam String startTime,@RequestParam String endTime,@RequestParam String reason,@RequestParam String remark) {
    User currUser = iUserService.getById(userId);
    if(currUser == null) {
        return ResultUtil.error("用户不存在");
    }
    QueryWrapper<StudentArchives> stuQw = new QueryWrapper<>();
    stuQw.eq("user_id",currUser.getId());
    StudentArchives sa = iStudentArchivesService.getOne(stuQw);
    if(sa == null) {
        return ResultUtil.error("非学生账号");
    }
    StudentLeave leave = new StudentLeave();
    leave.setType(type);
    leave.setStartTime(startTime);
    leave.setEndTime(endTime);
    leave.setStatus("待审批");
    leave.setReason(reason);
    leave.setStudentId(sa.getId());
    leave.setStudentName(sa.getUserName());
    leave.setRemark(remark);
    iStudentLeaveService.saveOrUpdate(leave);
    return ResultUtil.success();
}

5.4 考勤签到小程序界面

<view class="page-body">
  <view class="page-section page-section-gap">
    <map
      id="myMap"
      style="width: 100%; height: 300px;"
      latitude="{{latitude}}"
      longitude="{{longitude}}"
      markers="{{markers}}"
      covers="{{covers}}"
      show-location
    ></map>
  </view>
  <view class="page-body">
  <view class="page-section">
    <view class="weui-cells__title">考勤数字</view>
    <view class="weui-cells weui-cells_after-title">
      <view class="weui-cell weui-cell_input">
        <input class="weui-input" auto-focus placeholder="请输入老师约定的数字" value="{{myNumber}}" bindblur="changeInputNumber"/>
      </view>
    </view>
  </view>
  </view>
  <view class="btn-area" style="margin-top: 10px;">
    <button bindtap="moveToLocation2" class="page-body-button" type="primary">刷新定位</button>
    <button bindtap="moveToLocation" class="page-body-button" type="primary">完成打卡</button>
  </view>
  <view wx:for="{{cardList}}" wx:key="index" wx:for-item="item">
  待签到{{index}} : {{item.attendanceName}}
  </view>
</view>

5.5 小程序登录页面

<!-- 郑为中 -->
<!-- 登入界面的HTML文件 -->

<view class="page">
  <view class="page__hd">
    <view class="page__title">班级考勤系统</view>
    <view class="page__desc">请提供您的相关信息,帮助我们核对您的身份</view>
  </view>
  <view class="section">
  </view>
  <view class="swiper-tab">
    <view bindtap="swithNav" wx:for="{{tabCont}}" wx:key="item.index" class="swiper-tab-list {{currentTab==item.index?'active':''}}" data-current='{{item.index}}'>{{item.title}}</view>
  </view>
  <radio-group bindchange="changeRadioFx">
    <radio value="学生" checked>学生</radio>
    <radio value="学习委员">学习委员</radio>
    <radio value="教师">教师</radio>
  </radio-group>
  <swiper class="swiper-box" current="{{currentTab}}" duration="300" style="height:420px" bindchange="GetCurrentTab" data-current='6'>
    <swiper-item wx:for="{{tabCont}}" wx:key="item.index">
      <view wx:if="{{item.index==0}}">
        <view class="section">
        </view>
        <button type="primary" open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">
          手机一键登入
        </button>
      </view>
      <view wx:if="{{item.index==1}}">
        <view class="section">
          <input placeholder="登入账号" bindblur="logincode" />
        </view>
        <view class="section">
          <input placeholder="登入密码" bindblur="loginpassword" password="true" />
        </view>
        <view class="section"></view>
        <view wx:if='{{islogin==""}}' class='btn_box'>
          <button type="primary" bindtap="loginTo">登入</button>
        </view>
        <view wx:else class='btn_box'>
          <button type="primary" bindtap="returnmain">退出</button>
        </view>
      </view>
    </swiper-item>
  </swiper>
</view>

六、免责说明

  • 本项目仅供个人学习使用,商用授权请联系博主,否则后果自负。
  • 博主拥有本软件构建后的应用系统全部内容所有权及独立的知识产权,拥有最终解释权。
  • 如有问题,欢迎在仓库 Issue 留言,看到后会第一时间回复,相关意见会酌情考虑,但没有一定被采纳的承诺或保证。

下载本系统代码或使用本系统的用户,必须同意以下内容,否则请勿下载!

  1. 出于自愿而使用/开发本软件,了解使用本软件的风险,且同意自己承担使用本软件的风险。
  2. 利用本软件构建的网站的任何信息内容以及导致的任何版权纠纷和法律争议及后果和博主无关,博主对此不承担任何责任。
  3. 在任何情况下,对于因使用或无法使用本软件而导致的任何难以合理预估的损失(包括但不仅限于商业利润损失、业务中断与业务信息丢失),博主概不承担任何责任。
  4. 必须了解使用本软件的风险,博主不承诺提供一对一的技术支持、使用担保,也不承担任何因本软件而产生的难以预料的问题的相关责任。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/454988.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实战 | 基于YOLOv9和OpenCV实现车辆跟踪计数(步骤 + 源码)

导 读 本文主要介绍使用YOLOv9和OpenCV实现车辆跟踪计数&#xff08;步骤 源码&#xff09;。 实现步骤 监控摄像头可以有效地用于各种场景下的车辆计数和交通流量统计。先进的计算机视觉技术&#xff08;例如对象检测和跟踪&#xff09;可应用于监控录像&#xff0c;…

2023 收入最高的十大编程语言

本期共享的是 —— 地球上目前已知超过 200 种可用的编程语言&#xff0c;了解哪些语言在 2023 为开发者提供更高的薪水至关重要。 过去一年里&#xff0c;我分析了来自地球各地超过 1000 万个开发职位空缺&#xff0c;辅助我们了解市场&#xff0c;以及人气最高和收入最高的语…

C++_智能指针

目录 1、内存泄漏 1.1 什么是内存泄漏 1.2 内存泄漏的危害 1.3 如何避免内存泄漏 2、智能指针的应用场景 3、智能指针的原理 3.1 RAII 3.2 智能指针的使用 4、智能指针的拷贝问题 5、auto_ptr 6、unique_ptr 7、share_ptr 7.1 循环引用 7.2 weak_ptr 结…

Linux系统运维命令:查看系统的平均负载(查看CPU的负载)

目 录 一、要求 二、快速了解系统资源利用情况的Linux命令 &#xff08;一&#xff09;cat /proc/loadavg命令 1、命令介绍 2、命令输出 3、命令解释 &#xff08;1&#xff09;前三个数字&#xff1a; &#xff08;2&#xff09;第四个值&#xff1a; &…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:TextClock)

TextClock组件通过文本将当前系统时间显示在设备上。支持不同时区的时间显示&#xff0c;最高精度到秒级。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 TextClock(options?…

c++进阶(c++里的继承)

文章目录 1.继承的概念及定义1.1继承的概念1.2继承的定义1.2.1定义格式1.2.2继承关系和访问限定符1.2.3继承类成员访问方式的变化 2.基类和派生类对象赋值转化3.继承中的作用域4.派生类的默认成员函数5.继承与友元6.继承域静态成员 1.继承的概念及定义 1.1继承的概念 继承机制…

23、设计模式之访问者模式(Visitor)

一、什么是访问者模式 访问者模式是一种行为型设计模式&#xff0c;它可以用于在不修改已有对象结构的情况下&#xff0c;定义新的操作方式。简单地说就是在不改变数据结构的前提下&#xff0c;通过在数据结构中加入一个新的角色——访问者&#xff0c;来达到执行不同操作的目的…

防御安全(IPSec实验)

目录 需求&#xff1a; pc1 ping通 pc2 ,使用IPSec VPN 拓扑图&#xff1a; ​编辑实验配置&#xff1a; 注意&#xff1a; 直接在路由器r1和r2分别配置即可&#xff0c;路由器r1和r2要写一条缺省指向ISP 实验配置截图如下&#xff1a; 2. r1​编辑 3. r3​编辑 3.r…

【C++】—— 代理模式

目录 &#xff08;一&#xff09;什么是代理模式 &#xff08;二&#xff09;为什么使用代理模式 &#xff08;三&#xff09;代理模式实现步奏 &#xff08;四&#xff09;代码示例 &#xff08;五&#xff09;代理模式优缺点 &#xff08;一&#xff09;什么是代理模式 …

车辆路径优化问题(VRP)变体及数学模型

车辆路径优化问题变体及数学模型 一、旅行商问题&#xff08;Travelling salesman problem&#xff0c;TSP&#xff09;TSP问题数学模型TSP问题求解 二、车辆路径问题&#xff08;Vehicle Routing Problem&#xff0c;VRP&#xff09;三、带容量约束的车辆路径优化问题&#xf…

【项目】C++ 基于多设计模式下的同步异步日志系统

前言 一般而言&#xff0c;业务的服务都是周而复始的运行&#xff0c;当程序出现某些问题时&#xff0c;程序员要能够进行快速的修复&#xff0c;而修复的前提是要能够先定位问题。 因此为了能够更快的定位问题&#xff0c;我们可以在程序运行过程中记录一些日志&#xff0c;通…

MySQL8.0 通过data文件恢复数据库

情景&#xff1a; mysql突然访问不了&#xff0c;也启动不了&#xff0c;需要保存之前的数据库文件&#xff0c;在卸载重装恢复数据 步骤&#xff1a; 1、Mysql里的数据一般会自动保存到C:\ProgramData\MySQL\MySQL Server 8.0\Data目录下&#xff0c;卸载前要将其备份。这是…

数据结构之树(Topk问题, 链式二叉树)

一.topk问题 取N个数中最大(小)的前k个值,N远大于k 这道题可以用堆的方法来解决,首先取这N个数的前k个值,用它们建堆 时间复杂度O(k) 之后将剩余的N-k个数据依次与堆顶数据进行比较,如果比堆顶数据大,则将堆顶数据覆盖后向下调整 时间复杂度(N-k)*log(N) 总共的时间复杂度…

【05】消失的数字

hellohello~这里是土土数据结构学习笔记&#x1f973;&#x1f973; &#x1f4a5;个人主页&#xff1a;大耳朵土土垚的博客 &#x1f4a5;所属专栏&#xff1a;C语言函数实现 感谢大家的观看与支持&#x1f339;&#x1f339;&#x1f339; 有问题可以写在评论区或者私信我哦…

缓冲区与C库函数的实现

目录 一、缓冲区 二、C库函数的实现 一、缓冲区 缓冲区本质就是一块内存&#xff0c;而缓冲区存在的意义本质是提高使用者(用户)的效率【把缓冲区理解成寄送包裹的菜鸟驿站】 缓冲区的刷新策略 1. 无缓冲(立即刷新) 2. 行缓冲(行刷新) 3. 全缓冲(缓冲区满了&#xff0c;再刷…

春风吹又生的开源项目「GitHub 热点速览」

随着上周知名 Switch 开源模拟器 Yuzu&#xff08;柚子&#xff09;被任天堂起诉&#xff0c;该项目作者就删库了&#xff0c;但还是要赔偿任天堂数百万美元。此事还在 GitHub 上掀起了一波 Yuzu fork 项目的小浪潮&#xff0c;正所谓野火烧不尽&#xff0c;春风吹又生。 很多读…

Express学习(四)

使用Express写接口 创建基本的服务器 创建API路由模块 编写GET接口 编写POST接口 CORS跨域资源共享 什么是CORS CORS由一系列HTTP响应头组成&#xff0c;这些HTTP响应头决定浏览器是否阻止前端JS代码跨域获取资源。浏览器的同源安全策略默认会阻止网页“跨域”获取资源。但如…

十五、软考-系统架构设计师笔记-面向服务架构设计理论与实践

1、SOA相关概念 面向服务的架构(SOA)的定义 SOA 是一个组件模型&#xff0c;它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的&#xff0c;它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构…

狂揽Github—start19.7k☆开源OCR—Umi-OCR

文章目录 背景Umi-OCR—源码下载Umi-OCR—可执行程序下载页面介绍截图OCR识别批量OCR识别批量文档二维码全局设置 总结&#xff1a; 背景 大家都知道我是一个Python办公自动化的小小程序员&#xff0c;经常收集一些免费开源的OCR供大家使用&#xff0c;目前我已经写出来多家OCR…

(done) win11 如何安装 Anaconda3 ? 如何安装 jupyter notebook

首先是这个网站 https://www.anaconda.com/download/#windows 下载并安装 anaconda3 进入 anaconda3.navigator 后&#xff0c;会看到如下界面 点击下面这个 Launch 按钮&#xff0c;可以启动 jupyter notebook 如下图&#xff0c;jupyter 出来了