Springboot开发的大学生寝室考勤系统刷脸进出宿舍系统技术文档
宿舍出入系统
1.2采集学生人脸信息和宿管人脸信息
前端使用navigator.mediaDevices.getUserMedia(考虑个浏览器的内核差异,此处以最新的标准API:navigator.mediaDevices.getUserMedia为例)获取用户浏览器的摄像头并开启视频,使用canvas获取某一帧视频的图像,并转化成base64格式的图片,使用ajax传入后台采集人脸的接口/jsp/student/addFaceData。该接口主要调用虹软的人脸采集接口getFaceEngine()方法,获取该用户的脸部特征数据,并存入数据库。核心代码如下(宿管和学生采集的过程一样,此处以学生采集为例):
演示视频:
https://www.bilibili.com/video/BV1Da4y117ep/?share_source=copy_web&vd_source=11344bb73ef9b33550b8202d07ae139b
1.3进出刷脸
进入和出去宿舍楼栋的刷脸逻辑一样,此处使用inout来表示,in表示进入,out表示出去。前端同样使用navigator.mediaDevices.getUserMedia开启用户浏览器的摄像头。生成用户脸部图片,调用/jsp/inoutDep/faceadd?inout=进出类型&department_id=宿舍楼栋id控制器,使用虹软人脸比对接口faceEngine.detectFaces()方法,将刚采集的用户人脸图片转化成人脸特征数据,并于数据库里已采集的学生宿舍脸部特征数据循环对比,根据特征相似值判断进出人的身份。该相似值推荐0.8以上,以此提高识别度。代码如下:
2健康上报和管理
2.1上报
该功能主要使用使用form表单提交到/web/health/save,根据提交的id是否为空,判断学生是添加数据还是编辑。调用healthService.add()或者update()进行数据库的插入或者更新操作。代码如下:
2.2管理
请求路径/web/healt/page,传入参数pageNo(默认第一页),根据session获取当前学生的登录信息,将该学生的id传入healthService.list()查询该学生上报的健康数据,使用pagehelper进行分页。并将查询结果封装到pageInfo实体,使用model传给jsp页面,代码如下:
3学生个人中心
3.1换寝申请
该功能主要使用使用form表单提交到/web/applyChange/apply,根据session获取当前学生的登录信息,将该学生的id传入学生实体,并在service里把该数据的审核状态设置未0(使用result字段标识审核状态:0标识待审核,1标识同意换寝室,-1标识不同意换寝室,-2标识学生撤回申请),调用applyChangeService.save()保存至数据库, 代码如下:
3.2我的换寝管理
请求路径/web/applyChange/page,传入参数pageNo(默认第一页),根据session获取当前学生的登录信息,将该学生的id传入applyChangeService.list()查询该学生的换寝申请数据,使用pagehelper进行分页。并将查询结果封装到pageInfo实体,使用model传给jsp页面,代码如下:
该页面使用el表达式和c:forEach标签循环展示数据,根据result审核状态判断该数据的撤回和删除按钮。当学生刚提交申请,该数据进入待审核状态,即result=0,此时学生可以进行撤回申请。当学生撤回申请或者学校不同意换寝时,该学生可以删除该记录,否则不能有任何操作。
3.3宿舍维修提交
该功能主要使用使用form表单提交到/web/repair/apply,使用multiple实现多图片上传,使用accept显示上传文件的格式。根据session获取当前学生的登录信息,将该学生的id传入学生实体,并在repairService里把该数据的维修状态设置未0(使用status字段标识维修状态:0等待为序,1已维修),调用repairService.save()保存至数据库, 代码如下:
3.4我的维修申请记录
请求路径/web/repair/page,传入参数pageNo(默认第一页),根据session获取当前学生的登录信息,将该学生的id传入repairService.list()查询该学生的换寝申请数据,使用pagehelper进行分页。并将查询结果封装到pageInfo实体,使用model传给jsp页面,当数据是待维修状态时可以进行删除。代码如下:
3.6提交宿舍考勤(寝室长)
请求/web/stuAttendance/toadd,会根据寝室长输入的日期查询改日内该寝室的所有成员是否提交考勤,若寝室长未输入日期,则默认查询今日考勤的情况,根据is_dq字段来判断寝室成员是否已经签到,若is_dq=0标识未签到,is_dq=1表示已签到。代码如下:
3.7考勤记录
请求路径/web/stuAttendance/page?type=类型,type=qs表示寝室长管理本寝室成员的考勤记录,type=w表示普通成员查看自己的考勤记录。采用pagehelper分页。代码如下:
3.8修改登录密码
请求路径/web/student/toupPwd,调用studentSrtvice.getById()获取学生老密码与他输入的原密码对比,若一致则判断新密码与确认密码是否一致,满足条件则调用studentSrtvice.update()修改该学生的密码。
3.9查看个人基本信息
根据session获取当前登录的学生id,调用studentService.getById()获取学生信息并放入model,前端jsp使用el表达式获取展示。
3.10退出登录
移除session里的学生对象,并重定向登录页面。
宿舍模块的实现
1.1宿舍分配和疫情隔离
宿舍楼栋添加时,根据is_normal判断该楼栋是否是隔离楼栋,is_normal=1表示正常楼栋,is_normal=0则表示隔离楼栋,若有需要隔离的学生,则直接进入隔离楼栋,选择需要分配的宿舍。请求路径/jsp/student/pageForRoom?room_id=宿舍id,先调用roomService.getById()获取该公寓的具体信息,根据该公寓的类型(分为男寝和女寝),查询出与之对应的男学生或者女学生。根据学生的room_id与前端传过来的room_id对比判断该学生是否属于本寝室的成员,根据学生room_id是否等于0或者null来判断该学生是否分配寝室。代码如下:
已分配的本寝室数据根据inThisRoom=1来判断并且已选中,其他宿舍的学生则需要先取消所在宿舍,才可以成功分配到本寝室。使用form表单提交至/jsp/student/setRoom?room_id=本寝室id,根据表单setudent_ids的长度判断人数是否符合本寝室的入住人数。而后循环setudent_ids为这些学生数据分配宿舍,修改room_id,并将这些学生的姓名和学号都存入对应的宿舍里,方便展示。代码如下:
1.2换寝申请
请求路径/jsp/applyChange/page,根据session获取当前登录的用户,而后根据该用户的role字段判断是管理员还是宿管,如果是宿管则根据宿管id查询他管理的寝室申请列表,管理员则查询所有列表 。调用applyChangeService.list()方法配合pagehelper分页插件,查询分页数据并放入model传入jsp页面。代码如下:
根据学生的提交信息选择审核通过或者不通过,一般是需要交换的双方同时申请(或者申请空的寝室),同意后可相互交换寝室。调用applyChangeService.update()修改result的值,以此实现换侵功能。 代码如下:
1.3维修处理
请求路径/jsp/repair/page,根据session获取当前登录的用户,而后根据该用户的role字段判断是管理员还是宿管,如果是宿管则根据宿管id查询他管理的寝室申请列表,管理员则查询所有列表 。调用repairService.list()配合pagehelper分页插件,查询分页数据并放入model传入jsp页面。代码如下:
点击处理按钮,请求/jsp/repair/saveOrUpdate,修改result=1,并调用repairService.update()保存至数据库。代码如下:
1.4发布公告
前端使用simditor.js富文本编辑框实现公告主题的多样式的灵活排班。使用forum提交公告主体到/jsp/tip/save控制器。根据id是否为空,调用tipService.save()保存或者update()更新公告。代码如下:
公告管理,根据session获取当前登录的用户,而后根据该用户的role字段判断是管理员还是宿管,如果是宿管则根据宿管id查询他自己发布的公告列表,管理员则查询所有列表 。调用tipService.list()查询数据,使用pagehelper插件分页实现。代码如下:
管理员模块
1.1健康监测
学生健康检测和宿管健康检测业务逻辑基本差不多,请求路径/jsp/health/page?type=类型,type=stu表示学生,type=user表示宿管。 此处以学生学生健康检测为例。根据session获取当前登录的用户,而后根据该用户的role字段判断是管理员还是宿管,如果是宿管则查询他所管理的公寓数,并放入list,而后使用in查询这些楼栋的学生健康数据,管理员则查询所有列表;如果是辅导员则根据辅导员的学院id查询该学院的学生健康数据查询条件根据role设定好后,调用healthService.list()获取健康检测数据,使用pagehelper插件分页和排序。代码如下:
1.2学生考勤管理
请求路径/jsp/stuAttendance/page。 根据session获取当前登录的用户,而后根据该用户的role字段判断是管理员还是宿管,如果是宿管则查询他所管理的公寓数,并放入list,而后使用in查询这些楼栋的学生考勤数据,管理员则查询所有学生的考勤;如果是辅导员则根据辅导员的学院id查询该学院的学生考勤数据查询条件根据role设定好后,调用inoutDepService.list()获取考勤数据,使用pagehelper插件分页,根据id倒叙排序。代码如下:
宿管还可以手动添加某一学生的考勤信息,在input输入某学生的学号,使用ajax请求查询查询该学生,点击提交按钮提交form表单至/jsp/stuAttendance/save,调用stuAttendanceService.isqd判断该学是否已提交签到信息,以免重复提交。若察隅结果为null则调用stuAttendanceService.insrt()方法保存该学的考勤数据到数据库。代码如下:
1.3学生进入宿舍记录查询
请求路径/jsp/inoutDep/page。 根据session获取当前登录的用户,而后根据该用户的role字段判断是管理员还是宿管,如果是宿管则查询他所管理的公寓数,并放入list,而后使用in查询这些楼栋的学生出入记录数据,管理员则查询所有学生和宿管的出入记录;如果是辅导员则根据辅导员的学院id查询该学院的学生出入记录数据。查询条件根据role设定好后,调用inoutDepService.list()获取考勤数据,使用pagehelper插件分页和排序。代码如下:
1.4通告管理
请求路径/jsp/bulletin/page,根据session获取登录用户的身份,若不是超级管理员则根据登录用户的id查询,管理员则查询所有通告。调用bulletionService.list查询,使用pagehelper插件分页。代码如下:
登录
学生灯枯和用户登录一样,军事form表单提交账号密码后台查询数据库,已学生登录为例,表单提交至/web/student/login,调用studentService.list()判断返回结果,若返回结构为空则表示登录失败,否则将该学生存入session,登录成功跳转个人中心页面。代码如下:
学生注册
学生信息由管理员添加,但是学生需要刷脸激活账号。先输入学号和设置密码,然后进入人脸采集和识别接口/web/student/HRfaceadd,将浏览器摄像头视频截取某一帧,用canvas转化base64的图片传入,调用虹软人脸比对接口faceEngine.detectFaces()方法进行比对,以此激活,代码如下:
相关文章:
Springboot开发的大学生寝室考勤系统刷脸进出宿舍系统技术文档
宿舍出入系统 1.2采集学生人脸信息和宿管人脸信息 前端使用navigator.mediaDevices.getUserMedia(考虑个浏览器的内核差异,此处以最新的标准API:navigator.mediaDevices.getUserMedia为例)获取用户浏览器的摄像头并开启视频,使用…...

网络共享服务
存储类型:直连式(DAS):距离最近,存储设备且直接连接到服务器上 存储区域网络(SAN):适用于大型应用或数据库系统,可以使用文件的空间, 以及管理空间…...

资本主义的市场竞争?IBM总监Jerry Chow 谈量子计算的未来
人物介绍:Jerry M.Chow博士在耶鲁大学取得物理博士学位。担任IBM量子系统总监,其研究重点是面向容错量子计算的多量子比特系统。他主要为IBM的量子系统路线图制定战略,与硬件团队领导者一起设定目标研究领域,同时也确保最佳的客…...

什么是残差矢量量化?
一、说明 基于残差矢量量化的神经音频压缩方法正在重塑现代音频编解码器的格局。在本指南中,了解 RVQ 背后的基本思想以及它如何增强神经压缩。 数据压缩在当今的数字世界中发挥着关键作用,促进信息的高效存储和传输。由于当今超过 80% 的互联网流量来自…...
计算机网络(第六版)复习提纲2
二、物理层 2.1 物理层基本概念 物理层协议常常成为物理层规程 物理层的主要任务为确定与传输媒体的接口有关的一些特性: 1.机械特性:指明接口所用接线器的尺寸等; 2.电气特性:指明接口电缆各条线上的电压范围; 3.功能…...
11k+star 开源笔记应用真香 centos部署教程
leanote binary installation on Mac and Linux (En) life edited this page on Jul 21, 2017 10 revisions Pages 26 Home How to develop leanote 如何开发leanote How to install leanote on Ubuntu? How to Upgrade Leanote Install Mongodb leanote api leanote …...

win下安装tensorflow
1首先ctrlaltdelete打开任务管理器查看GPU型号 2或者右键我的电脑然后如下方式查看显卡发现没有navida没有GPU...

SpringBoot 入门
1.SpringBoot介绍 1.1.什么是SpringBoot Spring Boot是由Pivotal团队提供的全新框架,其中“Boot”的意思就是“引导”,Spring Boot 并不是对 Spring 功能上的增强,而是提供了一种快速开发 Spring应用的方式。 1.2.Spring Boot 特点 • 嵌…...
使用WebFlux处理WebSocket连接的全生命周期案例
使用WebFlux处理WebSocket连接的全生命周期案例 简介: 在Web应用程序开发中,WebSocket是一种用于实现双向通信的协议。Spring WebFlux提供了对WebSocket的支持,使您能够轻松地处理WebSocket连接和消息。本博客将介绍如何使用WebFlux处理WebS…...

【REST2SQL】10 REST2SQL操作指南
【REST2SQL】01RDB关系型数据库REST初设计 【REST2SQL】02 GO连接Oracle数据库 【REST2SQL】03 GO读取JSON文件 【REST2SQL】04 REST2SQL第一版Oracle版实现 【REST2SQL】05 GO 操作 达梦 数据库 【REST2SQL】06 GO 跨包接口重构代码 【REST2SQL】07 GO 操作 Mysql 数据库 【RE…...
199_二叉树的右视图
描述 给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 思路 对树进行深度优先搜索,在搜索过程中,我们总是先访问右子树。那么对于每一层来说,…...
第七讲_css浮动
css浮动 1. 设置浮动2. 浮动的特点3. 浮动的影响4. 解决浮动的影响4.1 解决父元素高度塌陷的问题4.2 解决对兄弟元素影响问题 1. 设置浮动 浮动是通过float属性设置,float取值范围: none:不浮动,默认值。left:向左浮…...
2024秋招,顺丰科技测试开发工程师一面
前言 今天回顾一下,一个被捞的全流程面试经历 时间线 9月21日测评 10月26日技术一面,本来是11点半开始,我正做另一个笔试呢,突然给我打电话开面 20分钟结束,一开始以为KPI,结果给过了 10月31日技术二…...

基于apache的http文件服务配置
背景: 公司的产品使用的第三方模组可以OTA,厂家提供的是window开启软件,这样就可以在本机做http下载服务器,然后使用端口映射的方式,公开到外网,这样就可以进行4G网络访问内网服务器了。但这个有个弊端&am…...
连铸工艺和模铸工艺有什么区别。
问题描述:连铸工艺和模铸工艺有什么区别。 问题解答: 连铸工艺和模铸工艺在多个方面存在显著差异: 指代不同: 模铸是成批大量生产锻件的锻造方法。连铸即为连续铸钢的锻造方法。 工艺不同: 模铸在锻压机械的作用…...

pyqt treeWidget树生成
生成treeWidget树与获取treeWidget树节点的数据 # encodingUTF-8 import sys from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QApplication, QTreeWidgetItem, QLineEdit, QSpinBox, QComboBox from PyQt5.QtWidgets import QWidget from release_test import Ui_F…...

DataFunSummit:2023年云原生大数据峰会:核心内容与学习收获(附大会核心PPT下载)
随着数字化转型的深入推进,大数据技术已经成为企业获取竞争优势的关键因素之一。本次峰会汇聚了业界顶尖的大数据专家、企业领袖和技术精英,共同探讨云原生大数据领域的最新技术和趋势。本文将深入分析峰会的核心内容,并探讨参会者从中能学到…...

docker 容器添加指定网络地址
docker 容器添加指定网络地址 在搭建halo博客时,准备让 halo、mysql8.1、nginx 三个容器在同一个网段中,并指定IP。 实现docker内部容器之间网络互通。 查看容器网络信息命令 docker inspect 容器名各容器部署成功后网络效果如下: nginx …...
后端怎样防止重复提交订单?
参考文章 通常我们可以在前端通过防抖和节流来解决短时间内请求重复提交的问题, 如果因网络问题、Nginx重试机制、微服务Feign重试机制或者用户故意绕过前端防抖和节流设置,直接频繁发起请求,都会导致系统防重请求失败,甚至导致后…...
数据结构之二叉搜索树
二叉搜索树 满足条件: 1.对于根节点:左子树中所有节点的值小于右子树中所有节点的值 2.任意节点的左右子树也是二叉搜索树,同样满足条件1 二叉搜索树的常用操作 我们将二叉搜索树封装为一个类 BinarySearchTree ,并声明一个成员变…...

练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...

【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...

Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...