从头开始开发基于虹软SDK的人脸识别考勤系统(python+RTSP开源)(五)完整源码已上传!
本篇是对照之前代码剩余的部分代码做补充,分享给大家,便于对照运行测试。
完整版的全功能单文件版本已上传!https://download.csdn.net/download/xiaomage_cn/90484179
人脸识别抽象层,这个大家应该都知道,就是为了方便使用其他的人脸识别算法设置的。
# 人脸识别服务抽象层
class FaceServiceBase:def __init__(self, db_service):self.db = db_serviceself.known_features = []self.known_ids = []def refresh_data(self):"""从数据库加载特征数据"""raise NotImplementedErrordef recognize(self, frame):"""识别图像中的人脸"""raise NotImplementedError@staticmethoddef get_face_feature(image_path):"""从图片提取特征"""raise NotImplementedError
为了增强识别效果,对图片进行处理。效果怎么样这个还真不明显。水平有限,走这步有点画蛇添足
def preprocess_image(frame):# 灰度化gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 直方图均衡化equalized = cv2.equalizeHist(gray)# 高斯模糊blurred = cv2.GaussianBlur(equalized, (5, 5), 0)# 将单通道灰度图转换为三通道图像blurred = cv2.cvtColor(blurred, cv2.COLOR_GRAY2BGR)return blurred
绘制识别人脸框,原来是个蓝色的框框太扎眼,换了个橙色半透明的。
# 提取绘制人脸框的代码为独立函数,修改为半透明橙色
def draw_face_boxes(pixmap, face_rects):painter = QPainter(pixmap)pen = QPen(QColor(255, 165, 0, 128), 2) # 半透明橙色painter.setPen(pen)for rect in face_rects:if isinstance(rect, MRECT):painter.drawRect(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top)else:top, right, bottom, left = rectpainter.drawRect(left, top, right - left, bottom - top)painter.end()return pixmap
看方法名就知道了!
def update_frame(self, frame):if not self.camera_worker.running: # 仅在运行状态下更新returntry:self.frame_mutex.lock()self.current_frame = frame.copy()# 显示帧(添加空指针检查)if self.current_frame is not None:h, w, ch = self.current_frame.shapebytes_per_line = ch * wq_img = QImage(self.current_frame.data,w, h, bytes_per_line,QImage.Format_RGB888)pixmap = QPixmap.fromImage(q_img)# 人脸检测与绘制人脸框face_rects = self._detect_faces_arcsoft(self.current_frame)pixmap = draw_face_boxes(pixmap, face_rects)self.current_pixmap = pixmap # 存储当前的 QPixmap# print("Updating video label pixmap")self._update_video_label_pixmap(pixmap)else:print("接收到的帧数据为空")finally:self.frame_mutex.unlock()
调整摄像头随同窗口大小按比例改变
#调整摄像头随同窗口大小按比例改变def _update_video_label_pixmap(self, pixmap):label_size = self.video_label.size()if pixmap.width() > label_size.width() or pixmap.height() > label_size.height():pixmap = pixmap.scaled(label_size, Qt.KeepAspectRatio, Qt.SmoothTransformation)self.video_label.setPixmap(pixmap)def resizeEvent(self, event):width = self.width()if width > 1300:self.num_records = 20else:self.num_records = 15self.update_attendance_list(self.num_records)self.attendance_label.adjustSize() # 调整 QLabel 大小super().resizeEvent(event)
识别时候的提示框,忽闪忽闪的。
def reset_status_label(self):default_style = f"color: white; font-size: 30px; font-weight: bold; background-color: transparent;"self.status_label.setStyleSheet(default_style)self.status_label.setText("等待识别...")
人脸识别逻辑,不是考勤规则,注释里有详细的说明,比较啰嗦一点
def get_check_type(self):current_time = datetime.now()current_hour = current_time.hourcurrent_minute = current_time.minute# 第一次打卡时间:每天的11点30分之前(不包括11点30)只记录最早的一次打卡if current_hour < 11 or (current_hour == 11 and current_minute < 30):return'morning'# 第二次打卡时间:每天的11点30分之后,14点之前(包括11点30和14点)时间区间内只记录最早的一次,后续不更新elif (current_hour > 11 or (current_hour == 11 and current_minute >= 30)) and current_hour <= 14:return 'noon'# 第三次打卡时间:每天的14点之后均可打卡,多次打卡,自动更新为最后一次打卡时间elif current_hour > 14:return 'night'else:return 'other'
配套的数据库写入
def record_attendance(self, staff_id, check_type, is_holiday=False):with self.lock:try:current_date = datetime.now().strftime('%Y-%m-%d')cursor = self.conn.cursor()# 检查该员工在当前日期、当前考勤时间段内是否已经有考勤记录cursor.execute('''SELECT id, check_time FROM attendance WHERE staff_id =? AND check_type =? AND date =?''', (staff_id, check_type, current_date))existing_record = cursor.fetchone()if existing_record:record_id, existing_check_time = existing_recordexisting_check_time = datetime.strptime(existing_check_time, "%Y-%m-%d %H:%M:%S.%f")current_time = datetime.now()if check_type in ('morning', 'noon'):# 第一次和第二次打卡取首次打卡时间,不更新passelif check_type == 'night':# 第三次打卡更新为最新时间cursor.execute('''UPDATE attendance SET check_time =? WHERE id =?''', (current_time, record_id))self.conn.commit()else:# 没有记录则插入新记录cursor.execute('''INSERT INTO attendance (staff_id, check_time, date, check_type, is_holiday)VALUES (?,?,?,?,?)''', (staff_id, datetime.now(), current_date, check_type, is_holiday))self.conn.commit()except sqlite3.Error as e:print(f"记录考勤失败: {e}")raise
显示倒序排列的考勤列表,就是摄像头画面旁边的那个白色框框。
def update_attendance_list(self,num_records):# 从数据库中获取最新的 num_records 条考勤记录last_attendances = self.db.get_last_attendances(num_records)# 构建表格的 HTML 内容,添加白色单细线边框样式和自适应宽度样式table_html = '<table style="width: 100%; height: auto;border-collapse: collapse; border: 1px solid white; table-layout: fixed;">'table_html += '<tr><th style="text-align: center; border: 1px solid white; padding: 8px; word-wrap: break-word;">倒序</th><th style="text-align: center; border: 1px solid white; padding: 8px; word-wrap: break-word;">姓 名</th><th style="text-align: center; border: 1px solid white; padding: 8px; word-wrap: break-word;">识别时间</th></tr>'for index, (name, check_time) in enumerate(last_attendances, start=1):time_str = check_time.strftime("%Y-%m-%d %H:%M:%S")table_html += f'<tr><td style="border: 1px solid white; padding: 8px; word-wrap: break-word;">{index}</td><td style="border: 1px solid white; padding: 8px; word-wrap: break-word;">{name}</td><td style="border: 1px solid white; padding: 8px; word-wrap: break-word;">{time_str}</td></tr>'table_html += '</table>'# 设置 QLabel 以富文本格式显示self.attendance_label.setTextFormat(Qt.RichText)# 设置考勤记录内容self.attendance_label.setText(table_html)# 手动刷新界面self.attendance_label.repaint()
这里才是考勤规则,在查询中设置
def show_attendance_results(self, results):dialog = QDialog(self)dialog.setWindowTitle("考勤查询结果")dialog.resize(640, 360)layout = QVBoxLayout()table = QTableWidget()table.setColumnCount(8)table.setHorizontalHeaderLabels(["姓名", "日期", "上午打卡时间", "上午状态", "中午打卡时间", "中午状态", "下午打卡时间", "下午状态"])table.setRowCount(len(results))from datetime import datetimefor i, (name, date, morning_check_time, noon_check_time, night_check_time) in enumerate(results):table.setItem(i, 0, QTableWidgetItem(name))table.setItem(i, 1, QTableWidgetItem(date))# 处理上午打卡时间和状态if morning_check_time:try:morning_check_time = datetime.strptime(morning_check_time, '%Y-%m-%d %H:%M:%S.%f')morning_check_time_str = morning_check_time.strftime('%H:%M:%S')morning_status = "正常"if morning_check_time.time() > self.morning_end_time:morning_status = "迟到"except ValueError:morning_check_time_str = morning_check_timemorning_status = "异常"else:morning_check_time_str = '未打卡'morning_status = "未打卡"table.setItem(i, 2, QTableWidgetItem(morning_check_time_str))table.setItem(i, 3, QTableWidgetItem(morning_status))# 处理中午打卡时间和状态if noon_check_time:try:noon_check_time = datetime.strptime(noon_check_time, '%Y-%m-%d %H:%M:%S.%f')noon_check_time_str = noon_check_time.strftime('%H:%M:%S')noon_status = "正常"except ValueError:noon_check_time_str = noon_check_timenoon_status = "异常"else:noon_check_time_str = '未打卡'noon_status = "未打卡"table.setItem(i, 4, QTableWidgetItem(noon_check_time_str))table.setItem(i, 5, QTableWidgetItem(noon_status))# 处理下午打卡时间和状态if night_check_time:try:night_check_time = datetime.strptime(night_check_time, '%Y-%m-%d %H:%M:%S.%f')night_check_time_str = night_check_time.strftime('%H:%M:%S')night_status = "正常"if night_check_time.time() < self.night_end_time:night_status = "早退"except ValueError:night_check_time_str = night_check_timenight_status = "异常"else:night_check_time_str = '未打卡'night_status = "未打卡"table.setItem(i, 6, QTableWidgetItem(night_check_time_str))table.setItem(i, 7, QTableWidgetItem(night_status))layout.addWidget(table)button_box = QDialogButtonBox(QDialogButtonBox.Save | QDialogButtonBox.Close)button_box.accepted.connect(lambda: self.export_attendance_results(table))button_box.rejected.connect(dialog.reject)layout.addWidget(button_box)dialog.setLayout(layout)dialog.exec_()
异步人脸识别
# ==================== 异步人脸识别处理 ====================
class RecognitionWorker(QThread):result_ready = pyqtSignal(list)def __init__(self, frame, face_service):super().__init__()self.frame = frame.copy()self.face_service = face_servicedef run(self):try:# print("RecognitionWorker开始运行")results = self.face_service.recognize(self.frame)# print(f"识别结果: {results}")self.result_ready.emit(results)# print("RecognitionWorker运行结束")except Exception as e:print(f"RecognitionWorker运行出错: {e}")
增加人员时的写入数据库和同步复制图片到目录
def validate_input(self):if not self.name_input.text().strip():QMessageBox.warning(self, "输入错误", "请输入姓名")returnif not self.photo_path:QMessageBox.warning(self, "输入错误", "请选择照片")returnfeature = ArcSoftService.get_face_feature(self.photo_path)if feature is None:QMessageBox.warning(self, "错误", "未检测到人脸")returntry:# 保存照片到指定目录os.makedirs(config.face_img_dir, exist_ok=True)filename = f"{datetime.now().strftime('%Y%m%d%H%M%S')}.jpg"save_path = os.path.join(config.face_img_dir, filename)shutil.copy(self.photo_path, save_path)# 添加记录到数据库self.db.add_staff(self.name_input.text().strip(),self.dept_input.text().strip(),save_path,feature)self.accept()except Exception as e:QMessageBox.critical(self, "保存失败", f"发生错误:{str(e)}")
大约差不多就这些了吧
程序入口
# ==================== 应用程序入口 ====================
if __name__ == "__main__":# 初始化应用程序app = QApplication(sys.argv)app.setStyle(QStyleFactory.create("Fusion"))# 主窗口main_window = MainWindow()main_window.show()# 运行应用程序sys.exit(app.exec_())
项目结束。欢迎讨论。
目前程序在低端机器上运行就是感觉识别的时候卡顿,大家有什么优化建议都来说哈,我是小白,欢迎大家指导,谢谢。
相关文章:
从头开始开发基于虹软SDK的人脸识别考勤系统(python+RTSP开源)(五)完整源码已上传!
本篇是对照之前代码剩余的部分代码做补充,分享给大家,便于对照运行测试。 完整版的全功能单文件版本已上传!https://download.csdn.net/download/xiaomage_cn/90484179 人脸识别抽象层,这个大家应该都知道,就是为了方…...
PySide(PyQT)的mouseMoveEvent()和hoverMoveEvent()的区别
在 PySide中,mouseMoveEvent 和 hoverMoveEvent 都是用于处理鼠标移动相关操作的事件,但它们之间存在明显的区别: 事件触发条件 • mouseMoveEvent: 当鼠标在对应的图形项(如 QGraphicsPixmapItem)…...
【通缩螺旋的深度解析与科技破局路径】
通缩螺旋的深度解析与科技破局路径 一、通缩螺旋的形成机制与恶性循环 通缩螺旋(Deflationary Spiral)是经济学中描述价格持续下跌与经济衰退相互强化的动态过程,其核心逻辑可拆解为以下链条: 需求端萎缩:居民消费信…...
【如何使用云服务器与API搭建专属聊天系统:宝塔面板 + Openwebui 完整教程】
文章目录 不挑电脑、不用技术,云服务器 API 轻松搭建专属聊天系统,对接 200 模型,数据全在自己服务器,安全超高一、前置准备:3 分钟快速上手指南云服务器准备相关账号注册 二、手把手部署教程(含代码块&a…...
Oracle数据库存储结构--逻辑存储结构
数据库存储结构:分为物理存储结构和逻辑存储结构。 物理存储结构:操作系统层面如何组织和管理数据 逻辑存储结构:Oracle数据库内部数据组织和管理数据,数据库管理系统层面如何组织和管理数据 Oracle逻辑存储结构 数据库的逻…...
C++ 左值(lvalue)和右值(rvalue)
在 C 中,左值(lvalue)和右值(rvalue)是指对象的不同类别,区分它们对于理解 C 中的表达式求值和资源管理非常重要,尤其在现代 C 中涉及到移动语义(Move Semantics)和完美转…...
《实战AI智能体》DeepSearcher 的架构设计
DeepSearcher 的架构设计 一个通往搜索AGI的Agentic RAG应该如何设计? 从架构上看,DeepSearcher 主要分为两大模块。 一个是数据接入模块,通过Milvus向量数据库来接入各种第三方的私有知识。这也是DeepSearcher相比OpenAI的原本DeepResearc…...
Kotlin 继承
Kotlin 继承 概述 Kotlin 是一种现代的编程语言,它具有简洁、安全、互操作性等特点。在面向对象编程中,继承是一种非常重要的特性,它允许我们创建具有共同属性和方法的类。本文将详细介绍 Kotlin 中的继承机制,包括继承的基本概…...
【6】树状数组学习笔记
前言 树状数组是我学的第一个高级数据结构,属于 log \log log 级数据结构。 其实现在一般不会单独考察数据结构,主要是其在其他算法(如贪心,DP)中起到优化作用。 长文警告:本文一共 995 995 995 行…...
【RISCV LAB】0x01-安装实验仿真辅助工具
安装实验辅助工具 实验环境搭建安装 Verilator编译依赖下载源码编译安装测试安装 安装 RISC-V 交叉编译工具链编译依赖下载源码编译安装编译并安装添加环境变量并测试 安装 GTKWave其他模拟器推荐RARSemulsiV FAQ 实验环境搭建 Verilator 是一款开源的支持 Verilog 和 SystemV…...
OSPF-2 邻接建立关系
上一期我们说了OSPF的邻居建立关系以及OSPF邻居关系建立中建立失败的因素以及相关实验案例 这一期我们来说说OSPF的邻接关系建立时需要交互哪些报文以及失败因素及原因和相关实验案例 一、概述 在运行了OSPF的网络当中为了交互链路状态信息和路由信息,互相之间需要建立邻接关…...
操作系统知识点29
1.当用户使用外部设备时,其控制设备的命令传递途径依次为用户应用层->设备独立层->设备驱动层->设备硬件 2.通常用于管理空闲物理内存的方法:空闲快链表法;位示图法;空闲页面表 3. 可用于文件的存取控制和保护的方法&a…...
【Java篇】行云流水,似风分岔:编程结构中的自然法则
文章目录 Java 程序逻辑控制:顺序、分支与循环结构全面解析一、顺序结构二、分支结构2.1 if 语句2.1.1 基本语法2.1.2 if-else 语句2.1.3 if-else if-else 语句 2.2 switch 语句 三、循环结构3.1 while 循环3.2 break 语句3.3 continue 语句3.4 for 循环 四、输入输…...
代码块与设计模式
文章目录 1.代码块1.1基本介绍基本语法 1.2代码块的好处和案例演示1.3代码块使用注意事项和细节讨论!!! 2.单例设计模式2.1什么是设计模式2.2什么是单例模式2.2.1饿汉式2.2.2懒汉式2.2.3比较 1.代码块 1.1基本介绍 代码化块又称为初始化块,属于类中的成员[即是类的一部分]&am…...
要登录的设备ip未知时的处理方法
目录 1 应用场景... 1 2 解决方法:... 1 2.1 wireshark设置... 1 2.2 获取网口mac地址,wireshark抓包前预过滤掉自身mac地址的影响。... 2 2.3 pc网口和设备对接... 3 2.3.1 情况1:... 3 2.3.2 情…...
CentOS 系统安装 docker 以及常用插件
博主用的的是WindTerm软件链接的服务器,因为好用 1.链接上服务器登入后,在/root/目录下 2.执行以下命令安装docker sudo yum install -y yum-utilssudo yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.reposudo…...
统计字符(字符串)(gets与fgets的区别)
统计字符 #include<stdio.h> #include<string.h> int main(){char str1[5],str2[80];while(gets(str1)){if(strcmp(str1,"#")0)break;gets(str2);for(int i0;i<strlen(str1);i){int sum0;for(int j0;j<strlen(str2);j){if(str1[i]str2[j])sum;}p…...
Node.js REPL 深入解析
Node.js REPL 深入解析 引言 Node.js 作为一种流行的 JavaScript 运行环境,在服务器端开发中扮演着重要角色。REPL(Read-Eval-Print Loop,读取-求值-打印循环)是 Node.js 的一个核心特性,它允许开发者在一个交互式环境中执行 JavaScript 代码。本文将深入探讨 Node.js R…...
【测试语言基础篇】Python基础之List列表
一、Python 列表(List) 序列是Python中最基本的数据结构。序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推。 Python有6个序列的内置类型,但最常见的是列表和元组。序列都可…...
中山六院团队发表可解释多模态融合模型Brim,可以在缺少分子数据时借助病理图像模拟生成伪基因组特征|顶刊解读·25-02-14
小罗碎碎念 在癌症诊疗领域,精准预测患者预后对临床决策意义重大。传统的癌症分期系统,如TNM分期,因无法充分考量肿瘤异质性,难以准确预测患者的临床结局。而基于人工智能的多模态融合模型虽有潜力,但在实际临床应用中…...
《基於Python的网络爬虫抓包技术研究与应用》
## 摘要 本文探讨了基于Python的网络爬虫抓包技术及其应用。随着互联网数据的快速增长,网络爬虫技术在数据采集和分析中扮演着越来越重要的角色。本研究首先介绍了网络爬虫的基本概念和Python在爬虫开发中的优势,然后深入分析了抓包技术的原理和常用工具…...
从零开始探索C++游戏开发:性能、控制与无限可能
一、为何选择C开发游戏? 在虚幻引擎5渲染的次世代画面背后,在《巫师3》的庞大开放世界中,在《毁灭战士》的丝滑60帧战斗里,C始终扮演着核心技术角色。这门诞生于1983年的语言,至今仍占据着游戏引擎开发语言使用率榜首…...
TypeScript 高级类型 vs JavaScript:用“杂交水稻”理解类型编程
如果把 JavaScript 比作乐高积木,TypeScript 就是一套智能积木系统。本文将用最生活化的比喻,带你理解 TypeScript 那些看似复杂的高级类型。 一、先看痛点:JavaScript 的“薛定谔类型” // 场景:用户信息处理 function getUserI…...
几款可用于绘制工艺原理图的开源框架
一、LogicFlow 由滴滴团队开发的开源流程图框架,支持高度定制的工艺原理图绘制。 • 核心特性: • 提供拖拽式界面和丰富的节点类型(矩形、圆形、多边形等),支持自定义节点形状、样式和交互逻辑。 • 支持插件扩展&am…...
STM32如何精准控制步进电机?
在工业自动化、机器人控制等场合,步进电机以其高精度、开环控制的特性得到了广泛应用。而在嵌入式系统中,使用STM32进行步进电机的精确控制,已成为开发者的首选方案之一。 本文将从嵌入式开发者的角度,深入探讨如何基于STM32 MCU…...
Go语言入门基础详解
一、语言历史背景 Go语言由Google工程师Robert Griesemer、Rob Pike和Ken Thompson于2007年设计,2009年正式开源。设计目标: 兼具Python的开发效率与C的执行性能内置并发支持(goroutine/channel)简洁的类型系统现代化的包管理跨…...
WPF窗口读取、显示、修改、另存excel文件——CAD c#二次开发
效果如下: using System.Data; using System.IO; using System.Windows; using Microsoft.Win32; using ExcelDataReader; using System.Text; using ClosedXML.Excel;namespace IfoxDemo {public partial class SimpleWindow : Window{public SimpleWindow(){Initi…...
Ubuntu 服务器安装 Python 环境 的详细指南
以下是 在 Ubuntu 上安装 Python 3.10 的详细步骤(兼容 Ubuntu 20.04/22.04): 方法一:通过 PPA 仓库安装(推荐) 1. 添加 deadsnakes PPA sudo apt update sudo apt install software-properties-common s…...
鸿蒙next 多行文字加图片后缀实现方案
需求 实现类似iOS的YYLabel之类的在文字后面加上图片作为后缀的样式,多行时文字使用…省略超出部分,但必须保证图片的展现。 系统方案 在当前鸿蒙next系统提供的文字排版方法基本没有合适使用的接口,包括imagespan和RichEditor,根据AI的回…...
STM32---FreeRTS队列集
一、简介 一个队列只允许任务间传递的消息为同一种数据类型,如果需要在任务间传递不同数据类型的消息时,那么就可以使用队列集 ! 作用:用于对多个队列或信号量进行“监听”,其中不管哪一个消息到来,都可让…...
oracle11.2.0.4 RAC 保姆级静默安装(二) DB数据库软件
1.响应文件配置 [rootdb11g1 software]# su - oracle [oracledb11g1 ~]$ cd /software/database/ [oracledb11g1 database]$ cd response/ [oracledb11g1 response]$ vi db_install.rsp oracle.install.optionINSTALL_DB_SWONLY ORACLE_HOSTNAMEdb11g1 UNIX_GROUP_NAME…...
用python代码将excel中的数据批量写入Json中的某个字段,生成新的Json文件
需求 需求: 1.将execl文件中的A列赋值给json中的TrackId,B列赋值给json中的OId 要求 execl的每一行,对应json中的每一个OId json 如下: {"List": [{"BatchNumber": "181-{{var}}",// "Bat…...
【每日学点HarmonyOS Next知识】状态变量、动画UI残留、Tab控件显示、ob前缀问题、文字背景拉伸
1、HarmonyOS 怎么用一个变量观察其他很多个变量的变化? 有一个提交按钮的颜色,需要很多个值非空才变为红色,否则变为灰色,可不可以用一个变量统一观察这很多个值,去判断按钮该显示什么颜色,比如Button().…...
【第五节】windows sdk编程:windows 控件基础
目录 一、控件概述 二、标准控件 三、通用控件 四、控件的创建 五、控件风格 六、控件相关的消息 6.1 控件控制消息 6.2 控件通知消息 一、控件概述 控件是 Windows 系统内置的窗口类,它们只能是某个窗口的子窗口。因此,创建控件时必须使用 WS_C…...
架构师论文《论云原生架构及其应用》
【摘要】 2022年3月,我作为系统架构师参与了某大型零售企业“智能化供应链管理平台”项目的设计与实施工作。该平台旨在整合企业分散在不同区域的仓储、物流、库存及订单系统,构建统一管理的云原生架构,以应对业务季节性峰值带来的弹性伸缩需…...
Centos 7 安装达梦数据库
一、环境准备 1. 确认操作系统的版本和数据库的版本是否一致 cat /etc/redhat-release 2. 关闭防火墙 查看防火墙状态 firewall-cmd --state 停止firewall systemctl stop firewalld.service 禁止firewall开机启动 systemctl disable firewalld.service 3. 修改文件l…...
46.全排列
46.全排列 力扣题目链接 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1: 输入:nums [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2:…...
RabbitMQ (Java)学习笔记
目录 一、概述 ①核心组件 ②工作原理 ③优势 ④应用场景 二、入门 1、docker 安装 MQ 2、Spring AMQP 3、代码实现 pom 依赖 配置RabbitMQ服务端信息 发送消息 接收消息 三、基础 work Queue 案例 消费者消息推送限制(解决消息堆积方案之一&#…...
2-002:MySQL 索引的最左前缀匹配原则是什么?
MySQL 索引的最左前缀匹配原则 最左前缀匹配原则(Leftmost Prefix Matching) 是指: 当 查询使用了复合索引(联合索引) 时,MySQL 会优先匹配索引的 最左列,然后逐步向右匹配,直到遇到…...
【Python 数据结构 15.哈希表】
目录 一、哈希表的基本概念 1.哈希表的概念 2.键值对的概念 3.哈希函数的概念 4.哈希冲突的概念 5.常用的哈希函数 Ⅰ、直接定址法 Ⅱ、平方取中法 Ⅲ、折叠法 Ⅳ、除留余数法 Ⅴ、位与法 6.哈希冲突的解决方案 Ⅰ、开放定址法 Ⅱ、链地址法 7.哈希表的初始化 8.哈希表的元素插…...
校园安全用电怎么保障?防触电装置来帮您
引言 随着教育设施的不断升级和校园用电需求的日益增长,校园电力系统的安全性和可靠性成为了学校管理的重要课题。三相智能安全配电装置作为一种电力管理设备,其在校园中的应用不仅能够提高电力系统的安全性,还能有效保障师生的用电安全&am…...
疗养院管理系统设计与实现(代码+数据库+LW)
摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装疗养院管理系统软件来发挥其高效地信息处理的作用…...
基于 Redis Stream 实现消息队列功能
好长时间没更新了。。。。。。 背景:举个例子在某个接口执行完成后只需要前半段返回结果,后半段可能是日志记录、下游系统调用等功能的情况下,将耗时的消息进行异步发送就显得很有必要,这时就有很多种选择,单体项目甚至…...
单元测试、系统测试、集成测试、回归测试的步骤、优点、缺点、注意点梳理说明
单元测试、系统测试、集成测试、回归测试的梳理说明 单元测试 步骤: 编写测试用例,覆盖代码的各个分支和边界条件。使用测试框架(如JUnit、NUnit)执行测试。检查测试结果,确保代码按预期运行。修复发现的缺陷并重新测…...
深入理解 HTML 中的<div>和元素:构建网页结构与样式的基石
一、引言 在 HTML 的世界里,<div>和元素虽看似普通,却扮演着极为关键的角色。它们就像网页搭建过程中的万能积木,能够将各种 HTML 元素巧妙地组合起来,无论是构建页面布局,还是对局部内容进行样式调整ÿ…...
网络安全信息收集[web子目录]:dirsearch子目录爆破全攻略以及爆破字典结合
目录 一、dirsearch 工具详细使用攻略 1. 安装 前提条件 安装步骤 可选:直接下载预编译版本 2. 基本用法 命令格式 参数说明 示例 3. 核心功能与高级用法 3.1 多线程加速 3.2 自定义字典 3.3 递归扫描 3.4 过滤响应 3.5 添加请求头 3.6 代理支持 3…...
Mybaties批量操作
1、批量插入 <!--批量操作-插入--><!-- 相当于INSERT INTO t_goods (c1,c2,c3) VALUES (a1,a2,a3),(b1,b2,b3),(d1,d2,d3),...--><insert id"batchInsert" parameterType"java.util.List">INSERT INTO t_goods (title,sub_title,origina…...
27.卷2的答案
CSP-J离我们不远了,加加油啦! 1.堆排序最坏时间复杂度是? 解析:平时多多练习可知,最坏时间复杂度是O(n log n)。 2.哪条能将s中的数值保留一位,并将第二位四舍五入? 解析:经过试…...
【 Manus平替开源项目】
文章目录 Manus平替开源项目1 OpenManus1.1 简介1.2 安装教程1.3 运行 2 OWL2.1 简介2.2 安装教程2.3 运行 3 OpenHands(原OpenDevin)3.1 简介3.2 安装教程和运行 Manus平替开源项目 1 OpenManus 1.1 简介 开发团队: MetaGPT 核心贡献者(5…...
【WEB APIs】DOM-事件基础
目录 1. 事件监听(绑定) 案例—关闭广告 案例-随机点名 2. 事件类型 2.1 鼠标事件 2.2 焦点事件 2.3 文本事件 3. 事件对象 案例—评论回车发布 4. 环境对象 5. 回调函数 6. 综合案例—tab栏切换 1. 事件监听(绑定) …...