【基于SpringBoot的图书购买系统】深度讲解 分页查询用户信息,分析前后端交互的原理
引言📚
在企业级应用开发中,用户管理系统是几乎所有后台管理系统的核心模块之一。它不仅需要实现用户数据的增删改查,还需要考虑数据分页展示、状态管理、前后端交互效率等问题。本文将以一个实际的用户管理系统为例,详细讲解基于Spring Boot后端与jQuery前端的全栈开发过程,涵盖接口设计、业务逻辑实现、代码分层架构以及前后端联调等关键环节。通过本文的实践,读者将掌握如何使用主流框架构建一个结构清晰、可维护性强的管理系统,并深入理解前后端分离开发模式的核心思想。
1. 前后端交互接口设计📡
1.1 接口定义与功能说明
本系统的核心接口为用户列表分页查询接口,其设计遵循RESTful风格,主要负责返回指定页码的用户数据及分页信息。接口的基本信息如下:
-
URL:
/user/getUserInfoList
-
请求方法:
GET
-
请求参数:通过查询字符串传递分页参数,参数封装在
PageRequest
对象中,具体字段包括:currentPage
:当前页码,默认值为1,需满足currentPage > 0
pageSize
:每页显示条数,默认值为10,需满足pageSize ≥ 1
offset
:数据偏移量,由(currentPage-1)*pageSize
自动计算得出
-
响应数据:统一通过
Result
对象返回,结构如下:{"status": "SUCCESS", // 状态码(SUCCESS/FAIL/UNLOGIN等)"data": {"total": 100, // 总记录数"bookInfoList": [ // 用户数据列表(注:此处字段名可能存在语义偏差,实际应为userInfoList){"id": 1,"userName": "admin","deleteStatus": "存在", // 由deleteFlag转换而来的状态描述"createTime": "2025-05-19T12:00:00"}],"pageRequest": { // 分页请求参数"currentPage": 1,"pageSize": 10,"offset": 0}} }
1.2 接口设计原则
- 参数校验:在后端接口入口(Controller层)对
currentPage
和pageSize
进行合法性校验,防止非法参数导致数据库查询异常。 - 数据封装:通过
PageResult
对象统一封装分页数据,避免在Controller层直接操作集合数据,提升代码复用性。 - 状态转换:在Service层将数据库字段
deleteFlag
(0/1)转换为前端易读的deleteStatus
(“存在”/“删除”),实现业务逻辑与数据持久化的解耦。
2. 后端代码逻辑架构🏗️
2.1 三层架构设计理念
本系统采用经典的MVC三层架构,将业务逻辑划分为Controller层(控制层)、Service层(服务层)和Mapper层(数据持久层),各层职责明确,依赖关系清晰:
- Controller层:负责接收前端请求,进行参数校验和格式转换,调用Service层接口,并将结果封装为统一响应格式返回给前端。
- Service层:实现核心业务逻辑,包括数据处理、事务管理、业务规则校验等,通过依赖注入调用Mapper层完成数据库操作。
- Mapper层:基于MyBatis框架实现数据库访问,通过SQL语句操作数据表,返回原始数据或集合。
2.2 关键技术栈
- 框架:Spring Boot 2.6.0(提供快速开发脚手架)
- 持久化:MyBatis(简化数据库操作)+ MySQL(存储用户数据)
- 日志:Slf4j(统一日志管理)
- 依赖管理:Maven(管理项目依赖)
3. 后端代码详解
3.1 Controller层:请求入口与响应封装
3.1.1 代码实现
@Slf4j
@RestController
@RequestMapping("/user")
public class UserInfoController {@Autowiredprivate UserInfoService userInfoService;@RequestMapping("/getUserInfoList")public Result userInfoList(PageRequest pageRequest) {// 参数校验:页码和每页条数必须合法if (pageRequest.getPageSize() < 1 || pageRequest.getCurrentPage() <= 0) {log.warn("分页参数不合法:currentPage={}, pageSize={}", pageRequest.getCurrentPage(), pageRequest.getPageSize());return Result.fail("参数验证失败"); // 使用Result工具方法快速构建失败响应}PageResult<UserInfo> pageResult = null;try {pageResult = userInfoService.queryNormalUserInfoList(pageRequest);} catch (Exception e) {log.error("用户列表查询失败:{}", e.getMessage(), e); // 记录完整异常堆栈return Result.fail("服务器内部错误");}// 使用Result.success()封装成功响应return Result.success(pageResult);}
}
3.1.2 核心逻辑分析
- 参数自动绑定:Spring MVC会自动将前端传递的查询参数(如
currentPage=1&pageSize=10
)绑定到PageRequest
对象,无需手动解析。 - 校验逻辑:通过判断
pageSize
和currentPage
的合法性,防止负数或零值导致数据库查询出错(如LIMIT -1, 10
会引发SQL语法错误)。 - 异常处理:使用try-catch捕获Service层可能抛出的异常,避免原始异常直接返回给前端,提升接口安全性和用户体验。
- 响应封装:通过
Result
工具类的静态方法success()
和fail()
统一响应格式,确保前端接收的数据结构一致。
3.2 Service层:业务逻辑核心
3.2.1 代码实现
@Slf4j
@Service
public class UserInfoService {@Autowiredprivate UserInfoMapper userInfoMapper;/*** 查询普通用户列表(分页)* @param pageRequest 分页参数* @return 分页结果对象*/@Transactional // 声明式事务管理(注:查询操作通常无需事务,此处可优化)public PageResult<UserInfo> queryNormalUserInfoList(PageRequest pageRequest) {if (pageRequest == null) {log.warn("接收到空的分页请求参数");return null;}// 1. 查询总记录数Integer total = userInfoMapper.queryNormalUserInfoCount();if (total == null || total < 0) {log.error("总记录数查询失败,返回非法值:{}", total);throw new RuntimeException("数据查询异常");}// 2. 查询当前页数据List<UserInfo> userInfoList = userInfoMapper.queryNormalUserInfoList(pageRequest);if (userInfoList == null) {log.warn("用户列表为空,currentPage={}, pageSize={}", pageRequest.getCurrentPage(), pageRequest.getPageSize());userInfoList = Collections.emptyList(); // 避免返回null引发前端空指针}// 3. 状态转换:数据库字段转业务描述for (UserInfo user : userInfoList) {user.setDeleteStatus(user.getDeleteFlag() == 0 ? "存在" : "删除");}// 4. 封装分页结果return new PageResult<>(total, userInfoList, pageRequest);}
}
3.2.2 核心逻辑分析
- 事务注解:
@Transactional
用于声明事务边界,通常用于增删改操作。此处查询操作无需事务,可移除该注解以提升性能(避免开启不必要的数据库事务)。 - 业务规则:
- 确保总记录数
total
为非负数,防止分页计算异常(如总页数为负数)。 - 将
userInfoList
转换为非空集合(Collections.emptyList()
),避免前端处理null
值。
- 确保总记录数
- 状态转换:通过遍历集合将数据库中的
deleteFlag
(0/1)转换为deleteStatus
(“存在”/“删除”),这种转换应在业务层完成,确保数据库字段与业务逻辑解耦。 - 参数校验:对
pageRequest
进行非空校验,防止空指针异常,增强方法的健壮性。
3.3 Mapper层:数据库操作实现
3.3.1 代码实现
@Mapper
public interface UserInfoMapper {/*** 查询普通用户总数* @return 总记录数*/@Select("SELECT COUNT(*) FROM normal_user_info")Integer queryNormalUserInfoCount();/*** 查询普通用户列表(分页)* @param pageRequest 分页参数(包含offset和pageSize)* @return 用户列表*/@Select("SELECT id, user_name, password, delete_flag, create_time, update_time " +"FROM normal_user_info " +"ORDER BY id ASC " +"LIMIT #{offset}, #{pageSize}")List<UserInfo> queryNormalUserInfoList(PageRequest pageRequest);
}
3.3.2 核心逻辑分析
- SQL写法:
- 使用
LIMIT #{offset}, #{pageSize}
实现分页查询,其中offset
为数据偏移量,pageSize
为每页条数。 - 通过
ORDER BY id ASC
确保数据按主键排序,避免分页结果不稳定(若不排序,数据库可能返回无序结果,导致分页错乱)。
- 使用
- 参数映射:MyBatis会自动将
PageRequest
对象中的offset
和pageSize
字段映射到SQL参数,无需手动设置@Param
注解(前提是字段名与参数名一致)。 - 字段映射:数据库表字段
user_name
、delete_flag
等通过MyBatis的自动映射机制填充到UserInfo
对象的对应属性(需注意驼峰命名规则,如create_time
映射为createTime
)。
3.4 分页的逻辑和封装的类
(1)假设每页10条数据,逻辑如下:
第一页,第1-10的数据
第二页,第11-20的数据
第三页,第21-30的数据…
(2)数据库中数据的索引是从0开始的,更新逻辑(假设每页10条数据):
第一页,索引为0-9的数据
第二页,索引为10-19的数据
第三页,索引为20-29的数据…
(3)要想实现这个功能, 从数据库中进行分页查询,我们要使用 LIMIT 关键字,格式为:limit 开始索引每页显示的条数(开始索引从0开始)
limit a,b
关键字:a是开始的索引,b是从a开始显示的条数
--第一页
select * from book_info limit 0,10;--第二页
select * from book_info limit 10,10;--第三页
select * from book_info limit 20,10;
观察以上SQL语句,发现: 开始索引⼀直在改变, 每每页显示条数是固定的
开始索引的计算公式: 开始索引 = (当前页码 - 1) * 每页显示条数
(3)从上述的分析得出,要实现一个分页的查询需要三个属性:当前页码、查询的条数、起始的索引
(4)创建一个类PageRequest,封装这三个属性。这三个属性的逻辑关系还需要另外的处理(开始索引 = (当前页码 - 1) * 每页显示条数),为了方便调用,直接在构造方法中实现三者的逻辑关系
@Data
public class PageRequest {// 请求的页数private int currentPage=1;//请求的该页条数private int pageSize=10;//开始的索引private int offset;public PageRequest(int currentPage){this.currentPage = currentPage;this.offset=(this.currentPage-1)* this.pageSize;}public PageRequest(){this.offset=(this.currentPage-1)*this.pageSize;}public PageRequest(int currentPage, int pageSize){this.currentPage=currentPage;this.pageSize=pageSize;this.offset=(this.currentPage-1)* this.pageSize;}//获取开始的索引public int getOffset(){return (this.currentPage-1)* this.pageSize;}
}
构造函数说明:
(1)当前端没有传来页码和该页的条数时,默认使用该类的缺省值
(2)当前端只传来页码而没有该页的条数时,默认使用每页10条数据。
(3)当前端传来页码和该页的条数时,进行逻辑处理求offset。
4. 前端代码实现
4.1 静态页面:基于Bootstrap的UI设计
4.1.1 HTML结构
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>用户管理列表</title><!-- 引入Bootstrap样式 --><link rel="stylesheet" href="css/bootstrap.min.css"><link rel="stylesheet" href="css/list.css"><!-- 引入jQuery和分页插件 --><script src="js/jquery.min.js"></script><script src="js/bootstrap.min.js"></script><script src="js/jq-paginator.js"></script>
</head>
<body>
<div class="bookContainer"><h2>用户管理列表</h2><div class="navbar-justify-between"><div><!-- 批量删除和添加用户按钮 --><button class="btn btn-outline-info" onclick="batchDeleteUser()">批量删除</button><button class="btn btn-outline-info" onclick="location.href='normal_user_add.html'">添加用户</button></div></div><table class="table table-hover"><thead><tr><th><input type="checkbox" id="selectAll"></th><th>用户ID</th><th>用户名</th><th>密码</th><th>状态</th><th>创建时间</th><th>更新时间</th><th>操作</th></tr></thead><tbody></tbody></table><!-- 分页容器 --><div class="demo"><ul id="pageContainer" class="pagination justify-content-center"></ul></div>
</div>
</body>
</html>
4.1.2 设计要点
- 响应式布局:通过Bootstrap的栅格系统和响应式类(如
container
、table-responsive
)确保页面在不同设备上正常显示。 - 交互组件:
- 批量删除按钮:通过
onclick
事件绑定batchDeleteUser
函数,实现多选删除功能。 - 添加用户按钮:直接跳转至添加页面
normal_user_add.html
。
- 批量删除按钮:通过
- 表格设计:使用Bootstrap的
.table-hover
类实现鼠标悬停高亮效果,提升可读性;操作列包含修改和删除按钮,通过JavaScript绑定事件。
4.2 JavaScript逻辑:前后端交互与页面渲染
4.2.1 核心函数:获取用户列表并渲染
$(function() {getUserList(); // 页面加载完成后立即请求数据
});function getUserList() {$.ajax({url: "/user/getUserInfoList" + location.search, // 拼接URL参数(如?currentPage=1)type: "GET",dataType: "json",success: function(result) {if (result.status === "FAIL" || result.status === "UNLOGIN") {// 处理失败或未登录状态,跳转至登录页location.href = "login_test.html";return;}const userList = result.data.bookInfoList; // 注意:此处字段名应为userInfoList(可能为后端代码笔误)const total = result.data.total;const pageRequest = result.data.pageRequest;// 渲染用户列表renderUserList(userList);// 初始化分页组件initPagination(total, pageRequest);},error: function(xhr, status, error) {console.error("请求失败:", status, error);alert("网络请求失败,请检查网络连接");}});
}function renderUserList(users) {let html = "";users.forEach(user => {html += `<tr><td><input type="checkbox" name="selectUser" value="${user.id}" class="user-select"></td><td>${user.id}</td><td>${user.userName}</td><td>${user.password}</td><td>${user.deleteStatus}</td><td>${formatDate(user.createTime)}</td><td>${formatDate(user.updateTime)}</td><td><button class="btn btn-primary btn-sm" onclick="location.href='normal_user_update.html?userId=${user.id}'">修改密码</button><button class="btn btn-danger btn-sm ml-2" onclick="deleteUser(${user.id})">删除</button></td></tr>`;});$("tbody").html(html);
}// 日期格式化函数
function formatDate(dateStr) {if (!dateStr) return "-";return new Date(dateStr).toLocaleString();
}
4.2.2 分页功能实现
function initPagination(total, pageRequest) {$("#pageContainer").jqPaginator({totalCounts: total, // 总记录数pageSize: pageRequest.pageSize, // 每页条数visiblePages: 5, // 显示5个页码currentPage: pageRequest.currentPage, // 当前页码// 自定义分页按钮样式(基于Bootstrap)first: '<li class="page-item"><a class="page-link">首页</a></li>',prev: '<li class="page-item"><a class="page-link">上一页</a></li>',next: '<li class="page-item"><a class="page-link">下一页</a></li>',last: '<li class="page-item"><a class="page-link">末页</a></li>',page: '<li class="page-item"><a class="page-link">{{page}}</a></li>',// 页码变化时的回调函数onPageChange: function(page, type) {if (type === "change") {// 跳转至指定页码,通过URL传递参数触发页面刷新location.href = `normal_user_list.html?currentPage=${page}`;}}});
}
4.2.3 数据交互细节
- URL参数处理:通过
location.search
获取当前URL的查询参数(如?currentPage=2
),确保分页切换时参数正确传递给后端。 - 跨域问题:若前后端部署在不同域名下,需在后端配置
@CrossOrigin
注解或全局CORS配置,否则会触发浏览器跨域限制。 - 性能优化:
- 分页组件使用
jqPaginator
实现前端分页渲染,避免重复请求全量数据。 - 日期格式化通过
toLocaleString()
方法处理,确保时间格式统一且易读。
- 分页组件使用
5. 系统优化与扩展建议
5.1 现有代码改进点
-
参数校验增强:
- 在
PageRequest
类中添加JSR-303校验注解(如@Min(1)
),利用Spring MVC的自动校验功能,简化Controller层的手动校验逻辑。
public class PageRequest {@Min(value = 1, message = "当前页码不能小于1")private int currentPage = 1;@Min(value = 1, message = "每页条数不能小于1")private int pageSize = 10;// ...其他字段 }
- 在Controller方法中添加
@Valid
注解,自动捕获校验异常并返回错误信息。
- 在
-
Service层事务优化:
- 查询操作无需开启事务,移除
@Transactional
注解,提升数据库查询性能。
- 查询操作无需开启事务,移除
-
前端安全增强:
- 对用户输入进行XSS过滤,避免恶意代码注入(如使用DOMPurify库)。
- 在批量删除功能中,对URL传递的
idList
参数长度进行限制,防止SQL注入(后端可通过正则校验参数格式)。
5.2 功能扩展方向
-
搜索与过滤:
- 添加用户名搜索框,后端接口支持
userName
模糊查询,修改SQL为:SELECT ... FROM normal_user_info WHERE user_name LIKE CONCAT('%', #{keyword}, '%') ORDER BY id ASC LIMIT #{offset}, #{pageSize}
- 前端增加搜索按钮,通过URL传递
keyword
参数,与分页参数结合使用。
- 添加用户名搜索框,后端接口支持
-
权限管理:
- 添加角色表(
role
)和用户角色关联表(user_role
),实现基于角色的访问控制(RBAC)。 - 在Controller层添加权限校验注解(如
@PreAuthorize("hasRole('ADMIN')")
),限制普通用户访问敏感操作。
- 添加角色表(
-
前端框架升级:
- 将jQuery替换为Vue.js或React.js,采用单页面应用(SPA)架构,提升用户体验。
- 使用Axios替代原生AJAX,简化异步请求处理,并集成请求拦截器处理Token验证。
总结🌟
本文通过一个完整的用户管理系统案例,详细讲解了Spring Boot后端与jQuery前端的开发流程,涵盖接口设计、三层架构实现、分页功能开发及前后端联调等核心环节。通过该实践,我们可以总结出以下关键经验:
- 后端设计:三层架构确保代码职责分离,参数校验和异常处理是接口健壮性的基础,MyBatis的动态SQL和分页功能简化了数据库操作。
- 前端开发:利用Bootstrap快速构建响应式界面,通过jQuery实现异步数据交互,分页插件的合理使用提升了用户体验。
- 交互设计:统一的响应格式(
Result
对象)和清晰的参数传递规则(分页参数通过URL传递)是前后端高效协作的关键。
在实际项目中,还需根据需求进一步优化代码,如添加单元测试、集成日志监控、实现接口文档(Swagger)等。全栈开发不仅需要掌握各层技术,更要理解前后端之间的数据流动和业务逻辑衔接,通过不断实践积累,才能构建出高质量的企业级应用系统💪。
结语🌈
技术的发展日新月异,但分层架构的设计思想和前后端交互的核心逻辑始终是软件开发的基石。希望本文能为读者提供一个可落地的全栈开发参考案例,在实际项目中灵活运用所学知识,不断优化代码结构,提升系统的可维护性和扩展性。未来,可以进一步探索微服务架构、分布式缓存、前端组件化等技术,持续提升技术能力,迎接更复杂的开发挑战🚀。
相关文章:
【基于SpringBoot的图书购买系统】深度讲解 分页查询用户信息,分析前后端交互的原理
引言📚 在企业级应用开发中,用户管理系统是几乎所有后台管理系统的核心模块之一。它不仅需要实现用户数据的增删改查,还需要考虑数据分页展示、状态管理、前后端交互效率等问题。本文将以一个实际的用户管理系统为例,详细讲解基于…...
机器学习算法-聚类K-Means
先来看看K-Means算法的核心流程吧 下面我们通过一个简单聚类来介绍K-Means算法迭代过程 如图(a)所示:表示初始化数据集。 如图(b)所示:假设K2,随机选择两个点作为类别质心,分别为图中的红色和蓝色质心。 如图©所示ÿ…...
初识Linux 进程:进程创建、终止与进程地址空间
目录 0.写在前面 1.进程创建 fork(): exec(): 2.进程地址空间 3.进程终止 正常终止(主动退出) 异常终止(被动终止) 0.写在前面 本文将对Linux环境下的进程:包括进程创建、终止与进程等待…...
2025年PMP 学习二十二 15章 项目绩效域
2025年PMP 学习二十二 15章 项目绩效域 文章目录 2025年PMP 学习二十二 15章 项目绩效域项目绩效域1.项目绩效域2.项目持续效域3.项目管理中的干系人管理 1.干系人持续效域促进干系人参与的步骤: 2 团队持续效域1 团队持续效域及项目团队人员有关系的活动和职能&…...
顶级流媒体服务商 Spotify 2025.04 故障复盘报告,吃他人的堑长自己的智
2025 年 4 月 16 日,Spotify 经历了一次影响全球用户的中断。以下就是发生了什么以及我们将如何解决它。 背景 我们使用 Envoy Proxy 作为我们的网络外围系统。外围是我们的软件接收用户(您!)网络流量的第一部分。然后ÿ…...
服装收银系统哪个好?服装店进销存管理软件全面评测
在服装批发零售行业,选择一款合适的收银系统和进销存管理软件至关重要。好的系统不仅能提高工作效率,还能帮助商家精准掌握库存、优化销售策略。 本文将全面分析服装收银系统的选择标准,并重点介绍秦丝进销存这一专业解决方案。 一、服装收…...
Java程序员从0学AI(二)
一、前言 在上一篇文章中,我们初步认识了 AI 领域的核心基础概念,如大语言模型(LLM)的参数量特征、提示词(Prompt)对交互效果的关键作用、文本处理单元 Token 的独特定义,以及通过向量转换实现…...
进阶知识:无参的函数装饰器之深入理解@wraps()
进阶知识:无参的函数装饰器之深入理解wraps(func) 一、wraps(func)的本质解析 1.1 核心作用 wraps(func)是functools模块提供的装饰器工具,用于保留被装饰函数的元信息。它通过将被装饰函数的名称(__name__)、文档字符串&#…...
《C 语言 sizeof 与 strlen 深度对比:原理、差异与实战陷阱》
目录 一. sizeof 和 strlen 的对比 1.1 sizeof 1.2 strlen 1.3 对比表格 二. 数组和指针笔试题解析 2.1 一维数组 2.2 字符数组 2.2.1 代码练习一 2.2.2 代码练习二 2.2.3 代码练习三 2.2.4 代码练习四 2.2.5 代码练习五 2.2.6 代码练习六 2.3 二维数组 …...
C++ 初阶 | 类和对象易错知识点(上)
目录 0.引言 1.访问限定符 2.域 3.类的实例化和声明 4.this指针 5.构造函数(自动执行) 6.拷贝构造 7.运算符重载 8.日期类的实现 9.总结 0.引言 今天,小邓儿和大家分享一下,C在类和对象中的易错知识点🤭&am…...
USB转TTL
USB转TTL模块是实现计算机USB接口与TTL电平串口设备(如单片机、嵌入式系统)通信的核心组件,其原理涉及协议转换和电平适配两大关键技术 一、核心功能与应用场景 功能:将计算机的USB信号(高速差分信号、USB协议&#…...
汽车生产中的测试台连接 – EtherCAT 转CANopen高效的网关通信
使用 EtherCAT 和 CANopen协议,实现对汽车零部件的高效生产线末端测试 某电动机、电桥和变速箱制造商之一,正在其生产线上使用ETHERCAT转canopen网关WL-ECAT-COP的解决方案。集成到测试线中的下线测试必须映射众多待测设备的测试应用。该制造商已指定 Et…...
汽车充电过程中--各个电压的关系(DeepSeek)
在电动汽车的充电过程中,电池的充电机制涉及多个电压参数的协调控制,以下从原理到实际应用逐步分析: 1. 充电基础原理 电动汽车电池(通常为锂离子电池组)的充电本质是通过外部电源向电池注入电能,使锂离子…...
基于HTML的Word风格编辑器实现:从零打造功能完备的富文本编辑器
引言 在Web开发中,实现一个功能完备的富文本编辑器是一个常见需求。本文将基于HTML5和JavaScript,结合第三方库,打造一个具有Word风格界面的富文本编辑器,支持格式设置、图片插入、表格创建、文件导入导出等核心功能。 完整代码…...
亚远景-汽车软件开发的“升级之路”:ASPICE各等级说明
ASPICE(Automotive SPICE)将汽车软件开发过程的成熟度划分为六个等级,从0级到5级,每个等级代表了组织在软件开发过程中的不同能力水平。以下是各等级的详细说明: 等级0:不完整(Incomplete&#…...
Unity Display 1 No cameras rendering
一个相机不能同时输出到屏幕和RenderTexture。 Output Texture,要么是 None (屏幕),要么是RenderTexture。 如果此时相机已经输出到RenderTexture,场景中又没有别的相机在渲染,屏幕将变黑并显示No cam…...
Python Selenium 使用指南
Selenium 是一个用于自动化 Web 浏览器交互的强大工具,常用于网页测试、数据抓取和自动化任务。以下是 Python 中 Selenium 的详细使用说明。 安装 Selenium 首先需要安装 Selenium 库和浏览器驱动: pip install selenium 然后下载对应浏览器的驱动&…...
Cribl 对数据源进行过滤-01
先说一个项目中实际的例子: Cribl 利用filter expression 来过滤 data, 举个例子: source1: sourcerouter=A, source 2: sourcerouter=B, 这个时候,可以要把他们合并起来: sourcerouter=A || sourcerouter=B 来进行过滤想要的数据。 最后可以使用一个pipeline 来对数据进行…...
python 通过 pymysql 获取 select count(*) xxx 的数量
在使用 pymysql 库来获取 SELECT COUNT(*) 语句的结果时,你可以通过以下步骤实现: 安装 pymysql:如果你还没有安装 pymysql,可以通过 pip 安装它。 pip install pymysql连接到数据库:使用 pymysql.connect() 方法连接…...
定时任务延迟任务
二者的区别: 定时任务:有固定周期的,有明确的触发时间。 延迟任务:没有固定的开始时间,它常常是由一个事件触发的,而在这个事件触发之后的一段时间内触发另一个事件,任务可以立即执行࿰…...
【动手学深度学习】1.1~1.2 机器学习及其关键组件
目录 一、引言1.1. 日常生活中的机器学习1.2. 机器学习中的关键组件1)数据2)模型3)目标函数4)优化算法 一、引言 1.1. 日常生活中的机器学习 应用场景: 以智能语音助手(如Siri、Alexa)的唤醒…...
LLaVA-MoD:基于MoE结构和蒸馏训练方法,训练轻量化多模态大模型!!
摘要:我们介绍了LLaVA-MoD,这是一个旨在高效训练小型多模态语言模型(s-MLLM)的创新框架,通过从大规模多模态语言模型(l-MLLM)中提取知识来实现。我们的方法解决了多模态语言模型(MLL…...
YOLOv8 的双 Backbone 架构:解锁目标检测新性能
一、开篇:为何踏上双 Backbone 探索之路 在目标检测的领域中,YOLOv8 凭借其高效与精准脱颖而出,成为众多开发者和研究者的得力工具。然而,传统的单 Backbone 架构,尽管已经在诸多场景中表现出色,但仍存在一…...
SSRF(服务器端请求伪造)基本原理靶场实现
1、漏洞原理 攻击者通过构造恶意请求,诱使服务器向内部系统或第三方服务发起非预期的网络请求。其核心在于 服务器信任了不可信的用户输入,并基于该输入发起网络操作。 2、攻击场景与利用方式 1. 基础利用 攻击类型示例Payload目标读取本地文件file://…...
自动化测试脚本点击运行后,打开Chrome很久??
亲爱的小伙伴们大家好。 小编最近刚换了电脑,这几天做自动化测试发现打开Chrome浏览器需要等待好长时间,起初还以为代码有问题,或者Chromedriver与Chrome不匹配造成的,但排查后发现并不是!! 在driver.py中…...
Oracle中如何解决FREE BUFFER WAITS
基于性能上的考虑,服务器进程在扫描LRU主列的同时,会将脏块移至LRU-W列,如果发现没有足够可用(可替换)的BUFFER CACHE,进程并不会无止尽地扫描整条LRU主列,而是在扫描到某个阀值(该阀…...
OpenHarmony开源鸿蒙兼容性测试常见问题解答分享
OpenHarmony 兼容性测评主要是验证合作伙伴的设备和业务应用满足 OpenHarmony 开源兼容性定义的技术要求,确保运行在 OpenHarmony 上的设备和业务应用能稳定、正常运行,同时使用 OpenHarmony 的设备和业务应用有一致性的接口和业务体验。 一、兼容性测评…...
Android trace presentFence屏幕显示的帧
Android trace presentFence屏幕显示的帧 presentFence :当帧成功显示到屏幕时,present fence就会signal。 FrameMissed/GpuFrameMissed/HwcFrameMissed表示上一次合成的结果,当SurfaceFlinger合成后显示到屏幕上,present fence就…...
【520特辑】情人节脑影像绘图
祝大家520快乐! 永远爱自己! 1.Brain Net基于节点画爱心 clear all; clc;t linspace(0, 2*pi, 30); x 16*sin(t).^3; y 13*cos(t)-5*cos(2*t)-2*cos(3*t)-cos(4*t); z zeros(size(t));[X,Y] meshgrid(linspace(-10,10,5), linspace(-10,10,5)); X …...
Linux服务器配置深度学习环境(Pytorch+Anaconda极简版)
前言: 最近做横向需要使用实验室服务器跑模型,之前用师兄的账号登录服务器跑yolo,3张3090一轮14秒,我本地一张4080laptop要40秒,效率还是快很多,(这么算一张4080桌面版居然算力能比肩3090&#…...
如何理解大模型的幻觉输出及RAG技术的应用与实战案例
导读:大语言模型(LLM)在当今技术领域中扮演着越来越重要的角色,但其“幻觉输出”问题却成为实际应用中的痛点。本文将带你深入剖析这一现象的定义、表现形式及成因,并探讨如何通过RAG(检索增强生成…...
std::vector<>.emplace_back
emplace_back() 详解:C 就地构造的效率革命 emplace_back() 是 C11 引入的容器成员函数,用于在容器尾部就地构造(而非拷贝或移动)元素。这一特性显著提升了复杂对象的插入效率,尤其适用于构造代价较高的类型。 一、核…...
卷积神经网络(CNN)学习率调整完全指南:从理论到PyTorch实践
引言 学习率是训练卷积神经网络(CNN)最重要的超参数之一,合理调整学习率可以显著提高模型性能、加速收敛并避免训练失败。本文将全面解析CNN学习率调整的技术与方法,涵盖基础概念、常用策略、PyTorch实现以及实用技巧。 一、学习率为什么如此重要&…...
KLEC--基于知识学习的演化计算算法
KLEC–基于知识学习的演化计算算法 title: Knowledge Learning for Evolutionary Computation author: Yi Jiang, Zhi-Hui Zhan, Kay Chen Tan, Jun Zhang. journal: IEEE TRANSACTIONS ON EVOLUTIONARY COMPUTATION (TEVC) DOIÿ…...
Git查看指定作者提交命令
要查看 Git 仓库中某个作者的提交记录,可以使用 git log 命令结合 --author 选项。以下是具体用法和示例: 基础命令 git log --author"作者名"作用:列出指定作者的所有提交记录。示例:查找作者名为 John Doe 的提交&am…...
隐形安全感
凌晨两点,手机突然震动。合作三年的化工原料供应商发来紧急消息:“一批次环氧树脂需要连夜从南京调往广州,但合作多年的物流公司临时爽约,能帮忙想想办法吗?” 我盯着屏幕愣了几秒。这类危险品运输从来不是简单的“拉…...
代码随想录算法训练营 Day52 图论Ⅲ 岛屿问题Ⅱ 面积 孤岛 水流 造岛
图论 题目 101. 孤岛的总面积 计算孤岛总面积,一个想法是将相邻的陆地的位置置为 0,最后计算孤岛面积中最小的一个 #include <iostream> #include <vector> #include <queue>using namespace std;int sum 0; int dir[4][2] {0,-1…...
实用 Git 学习工具推荐:Learn Git Branching
https://learngitbranching.js.org/?localezh_CN 网站概述 Learn Git Branching 是一个面向开发者的交互式 Git 学习平台,专为那些希望通过实践掌握 Git 高级用法的用户设计。网站采用游戏化的界面和渐进式挑战,让复杂的 Git 概念变得直观易懂。无论是…...
物流项目第三期(统一网关、工厂模式运用)
前两期: 物流项目第一期(登录业务)-CSDN博客 物流项目第二期(用户端登录与双token三验证)-CSDN博客 为什么要有网关? 通过前面的课程我们已经完成了四个端的登录,但是我们并没有对登录后的请…...
安卓settings单双屏显示
Settings/src/com/android/settings/homepage/SettingsHomepageActivity.java的onCreate方法中,创建布局之前会通过ActivityEmbeddingUtils.isEmbeddingActivityEnabled(this);去获取是否使用嵌入式显示。 mIsEmbeddingActivityEnabled ActivityEmbeddingUtils.is…...
SpringCloud+Vue实现大文件分片下载(支持开始、暂停、继续、取消)
1. 实现效果 http://localhost:8089/#/demo 所有代码已提交至 https://github.com/SJshenjian/cloud.git与 https://github.com/SJshenjian/cloud-web.git中,欢迎star 2. 后端核心代码 FeignClient(value "download", contextId "download"…...
RK3576 Android 14.0 SDK开发指南(第一集)
RK3576 Android 14.0 SDK代码编译 SDK下载到本地后大概70多个G 下载后要做个校验 解压后内核源码 kernel代码路径说明 Android14支持6.1 版本的kernel,kernel源码在工程中kernel-6.1目录下 Lunch项说明 一键编译命令 ./build.sh -UKAupSoc RK3576 SDK默认没有开…...
【C/C++】现代C++线程池:从入门到生产级实现
文章目录 现代C线程池:从入门到生产级实现🧠 What Is a Thread Pool?🧩 Why Use a Thread Pool?🔰 Part 1: Basic Thread Pool (Beginner)🔧 Minimal Working Code:✅ Usage: 🧑🔬 Part 2: …...
后期:daplink
问题描述: 问题一:总工程,USB插入能识别到dap,但有个黄色的感叹号!现在连感叹号都没有了。 重点跟踪了枚举的几个函数,差异点就是有个工厂描述符没有枚举到。 问题二: 下载后,目标板,没有自动复位。 问题三:未移植daplink的时候,虚拟串口是收发正常,貌似没有映射到…...
Android SharedPreferences:从零到一的全面解析与实战指南
简介 SharedPreferences是Android平台提供的一种轻量级键值对存储方案,虽然看似简单,但在实际开发中却蕴含着丰富的技术细节和最佳实践。本文将从基本概念出发,深入分析其源码实现原理,探讨企业级开发中的应用技巧,并提供完整的代码示例,帮助开发者全面掌握这一重要数据…...
推扫式高光谱相机VIX-N230重磅发布——开启精准成像新时代
随着各行业对高光谱成像技术需求的持续增长,市场对于高分辨率、高灵敏度以及快速成像的高光谱相机的需求愈发迫切。中达瑞和凭借多年的行业经验和技术积累,敏锐捕捉到这一市场趋势,正式推出全新一代推扫式可见光近红外高光谱相机——VIX-N230…...
实现rpc通信机制(待定)
一、概述 (1)rpc(remote procedure call, 远程接口调用),就像在本地调用函数一样,是应用组成服务内部分布式的基础功能。应用场景是在内网中的计算,比如:(a) 为上传的一张图片加水印、…...
STM32--串口函数
USART_GetFlagStatus() 用于获取某个串口的寄存器中的某个标志位的状态,和中断无关。 USART_ClearFlag() 用于清楚串口寄存器中的标志位的状态,和中断无关。 USART_ITConfig() 使能或禁用指定的 USART 中断。 USART_ITConfig(USART1, USART_IT_TXE, …...
Linux跨网络通信中IP与MAC的作用
是的,MAC地址和IP地址分别属于OSI模型的不同层次,并在数据封装过程中被添加到不同的位置: 1. MAC地址(数据链路层) 作用层级:数据链路层(第二层)。封装位置:添加到数据链…...
Facebook隐私保护的成与败:一场对用户信任的考验
引言 在这个信息爆炸的时代,Facebook作为全球最大的社交网络平台之一,其隐私保护政策和实践一直是公众关注的焦点。随着数据泄露事件的频发,Facebook在隐私保护方面的成与败,不仅关系到其自身的声誉,更是对用户信任的…...