RuoYi 中使用 PageUtils.startPage() 实现分页查询的完整解析
文章目录
- 一、PageHelper 简介与基本用法
- 使用方式如下:
- 二、Mapper 接口返回类型对分页的影响
- 1. 返回 `Page<T>` 类型(推荐)
- 2. 返回 `List<T>` 类型(不推荐)
- 三、解析RuoYi 是如何使用 PageUtils.startPage()
- 1、简要回答:
- 2、 详细解析
- 1. RuoYi 中典型的 Controller 分页代码结构如下:
- 2. PageHelper 是如何工作的?
- (1)PageHelper 使用 ThreadLocal 存储分页参数
- (2)执行 SQL 查询时拦截并生成分页语句
- (3)使用 PageInfo 获取 total
- 3、 所以你看到的流程是这样的:
- 4、 总结:为什么返回 List<T> 还能分页?
- 5、注意事项
- 6、推荐做法(适用于复杂业务)
- 7、结论一句话:
- 三、Service 层中的常见错误:new ArrayList<>() 导致分页信息丢失
- 1、错误写法示例:
- 2、正确做法:
- 四、XML 文件中是否需要特殊设置?
- 五、TableDataInfo 标准返回格式定义
- 六、最佳实践总结
- 七、结语
在基于 RuoYi 框架开发过程中,我们经常需要实现分页查询功能。RuoYi 默认集成的是 MyBatis 分页插件 PageHelper,它通过拦截 SQL 查询语句,自动添加分页逻辑并封装结果,从而简化分页操作。
然而,在实际开发中,如果不理解其内部机制或处理不当,很容易导致分页信息丢失,尤其是最核心的 total
(总记录数)无法返回给前端。
本文将从原理出发,结合实际代码示例,深入分析 PageHelper 的工作方式,并指出一个常见的错误用法:Service 层中使用 new ArrayList<>()
造成分页信息丢失的问题。
一、PageHelper 简介与基本用法
PageHelper 是一个为 MyBatis 提供分页功能的第三方插件。它通过 ThreadLocal 存储当前线程的分页参数,并在执行下一条
查询语句时动态生成带 LIMIT
的 SQL,同时生成统计总数的 SQL。
使用方式如下:
// Controller 中调用
PageUtils.startPage(); // 内部调用 PageHelper.startPage(pageNum, pageSize)
List<AccountInfo> list = accountInfoMapper.selectAccountInfoList(request);
return getDataTable(list);
其中:
startPage()
方法会从请求参数中提取当前页码和每页大小;accountInfoMapper.selectAccountInfoList()
执行数据库查询;getDataTable()
将查询结果封装成TableDataInfo
返回给前端。
二、Mapper 接口返回类型对分页的影响
这是关键所在。
1. 返回 Page<T>
类型(推荐)
@Mapper
public interface AccountInfoMapper {Page<AccountInfo> selectAccountInfoList(AccountInfoRequest request);
}
此时,查询结果是一个 Page<T>
类型对象,它是 ArrayList<T>
的子类,扩展了以下属性:
pageNum
:当前页码;pageSize
:每页大小;total
:总记录数;pages
:总页数;hasPreviousPage
/hasNextPage
:是否包含上一页/下一页。
因此,你可以直接获取到这些信息,用于构建标准分页响应。
2. 返回 List<T>
类型(不推荐)
@Mapper
public interface AccountInfoMapper {List<AccountInfo> selectAccountInfoList(AccountInfoRequest request);
}
虽然底层确实执行了分页查询,但返回值被强转为 List<T>
,导致所有的分页元数据(如 total
)都被丢弃。
即使你在 Service 层遍历后重新封装为新的 List<T>
,也无法再恢复分页信息。
三、解析RuoYi 是如何使用 PageUtils.startPage()
但是纵观ruoyi框架,他在mapper层返回的就是list,代码如下:
但是还是可以分页的,这是为啥
1、简要回答:
虽然 Mapper 返回的是
List<T>
,但由于 PageHelper 的内部机制和 RuoYi 的封装设计,仍然可以获取到分页信息(如 total)。
但这并不是因为 List<T>
本身携带了分页信息,而是因为:
- PageHelper 在执行查询前设置了分页上下文;
- 查询后通过 ThreadLocal 缓存了分页结果;
- 最终通过
PageInfo
或其他工具类从缓存中取出total
。
2、 详细解析
1. RuoYi 中典型的 Controller 分页代码结构如下:
@GetMapping("/list")
public TableDataInfo list(ActiveDiscoveryRequest request) {startPage(); // 开启分页List<ActiveDiscovery> list = activeDiscoveryService.selectActiveDiscoveryList(request);return getDataTable(list);
}
其中:
startPage()
:调用PageHelper.startPage(pageNum, pageSize)
;selectActiveDiscoveryList()
:Mapper 方法返回的是List<T>
;getDataTable(list)
:构造并返回TableDataInfo
。
2. PageHelper 是如何工作的?
(1)PageHelper 使用 ThreadLocal 存储分页参数
当你调用:
PageUtils.startPage();
它内部会调用:
PageHelper.startPage(pageNum, pageSize);
此时 PageHelper 将当前线程的分页参数保存到 ThreadLocal 中。
(2)执行 SQL 查询时拦截并生成分页语句
当执行下一条查询语句时,PageHelper 会:
- 自动将 SQL 改写为带
LIMIT
的语句; - 同时生成一条统计总数的 SQL;
- 执行完成后将结果返回为
List<T>
; - 但同时也会把分页信息(如 total)缓存在 ThreadLocal 中。
(3)使用 PageInfo 获取 total
RuoYi 中通常有一个 BaseController.getDataTable()
方法,类似如下:
protected TableDataInfo getDataTable(List<?> list) {TableDataInfo rspData = new TableDataInfo();rspData.setRows(list);rspData.setTotal(new PageInfo<>(list).getTotal());return rspData;
}
这里的关键是:
new PageInfo<>(list).getTotal()
这个 PageInfo
是通过反射访问 ThreadLocal 中缓存的分页信息来获取 total
的。
3、 所以你看到的流程是这样的:
startPage() → 设置 ThreadLocal 分页参数
↓
执行 Mapper 查询 → 返回 List<T>
↓
new PageInfo<>(list) → 通过 ThreadLocal 获取 total
↓
构造 TableDataInfo 并返回给前端
4、 总结:为什么返回 List 还能分页?
原因 | 说明 |
---|---|
PageHelper 的 ThreadLocal 缓存机制 | 即使返回的是 List,分页信息仍被缓存 |
PageInfo 工具类自动读取缓存 | 能正确获取 total、pageNum、pageSize 等信息 |
RuoYi 的封装设计 | 提供了统一的 getDataTable() 方法简化分页返回 |
5、注意事项
虽然这种方式在 RuoYi 中可以正常工作,但有以下几点需要注意:
问题 | 风险 |
---|---|
多次查询干扰 | 如果一次请求中多次调用了分页查询,ThreadLocal 中的数据可能会被覆盖或混淆 |
异步线程丢失上下文 | 如果分页查询发生在子线程中,ThreadLocal 数据不会自动传递 |
PageInfo 依赖反射 | 性能略低于直接使用 Page |
不适用于复杂场景 | 如需处理多个分页结果、自定义分页逻辑时,推荐使用 Page |
6、推荐做法(适用于复杂业务)
如果你需要更清晰、可控的分页逻辑,建议:
@Mapper
public interface ActiveDiscoveryMapper {Page<ActiveDiscovery> selectActiveDiscoveryList(ActiveDiscoveryRequest request);
}
然后在 Service 层:
Page<ActiveDiscovery> page = activeDiscoveryMapper.selectActiveDiscoveryList(request);
TableDataInfo dataTable = new TableDataInfo();
dataTable.setRows(page);
dataTable.setTotal(page.getTotal());
return dataTable;
这样可以避免对 ThreadLocal 和 PageInfo 的依赖,逻辑更清晰。
7、结论一句话:
虽然 Mapper 返回的是 List,但在 RuoYi 中借助 PageHelper 的 ThreadLocal 缓存 + PageInfo 工具类,仍然可以正确获取 total 字段并实现分页功能。
这是 RuoYi 框架的一个巧妙封装设计,但也存在一定局限性,适合简单场景。对于复杂业务,建议使用 Page<T>
显式保留分页信息。
三、Service 层中的常见错误:new ArrayList<>() 导致分页信息丢失
这是本篇文章的重点部分。
1、错误写法示例:
@Override
public List<AccountInfoRespone> selectAccountInfoList(AccountInfoRequest request) {List<AccountInfoRespone> respList = new ArrayList<>();List<AccountInfo> accountInfos = accountInfoMapper.selectAccountInfoList(request);for (AccountInfo info : accountInfos) {//这里对数据进行处理AccountInfoRespone vo = dataFormat(info);respList.add(vo);}return respList;
}
在这个例子中:
accountInfos
是由 Mapper 返回的List<T>
;- 虽然底层确实是分页查询的结果,但由于没有保留原始的
Page<T>
对象; - 最终返回的是一个新的
ArrayList<>()
,分页信息完全丢失; - 前端无法知道总共有多少条记录,也就无法正常显示分页控件。
2、正确做法:
应在 Service 层中保持 Page<T>
类型,并在此基础上进行 VO 转换。
@Override
public TableDataInfo selectAccountInfoList(AccountInfoRequest request) {Page<AccountInfo> accountInfoPage = accountInfoMapper.selectAccountInfoList(request);List<AccountInfoRespone> respList = new ArrayList<>();for (AccountInfo info : accountInfoPage) {AccountInfoRespone vo = dataFormat(info);respList.add(vo);}TableDataInfo dataTable = new TableDataInfo();dataTable.setRows(respList);dataTable.setTotal(accountInfoPage.getTotal());return dataTable;
}
或者使用ruoyi的框架原理,使用new PageInfo
@Override
public TableDataInfo selectAccountInfoList(AccountInfoRequest request) {Page<AccountInfo> accountInfoPage = accountInfoMapper.selectAccountInfoList(request);long total = new PageInfo(accountInfoPage).getTotal();List<AccountInfoRespone> respList = new ArrayList<>();for (AccountInfo info : accountInfoPage) {AccountInfoRespone vo = dataFormat(info);respList.add(vo);}TableDataInfo rspData = new TableDataInfo();rspData.setCode(HttpStatus.SUCCESS);rspData.setRows(respList );rspData.setMsg("查询成功");rspData.setTotal(total);return dataTable;
}
这样可以确保:
- 数据转换完成;
- 分页信息(如
total
)未丢失; - 返回给前端的结构是完整的。
四、XML 文件中是否需要特殊设置?
不需要!
即使你的 XML 文件中 SQL 写法如下:
<select id="selectAccountInfoList" parameterType="com.example.dto.AccountInfoRequest" resultType="com.example.entity.AccountInfo">SELECT * FROM account_info<where><if test="delFlag != null"> AND del_flag = #{delFlag} </if></where>
</select>
只要接口方法返回的是 Page<T>
类型,PageHelper 会在运行时自动拦截该 SQL,生成两条语句:
- 统计总数:
SELECT COUNT(*) FROM account_info WHERE ...
- 分页查询:
SELECT * FROM account_info WHERE ... LIMIT pageNum, pageSize
因此,SQL 无需任何修改,只需关注业务逻辑即可。
五、TableDataInfo 标准返回格式定义
public class TableDataInfo {private long total; // 总记录数private List<?> rows; // 当前页数据// getter/setter
}
前端可以通过这个结构准确获取当前页的数据列表以及总记录数,从而正确渲染分页组件。
六、最佳实践总结
项目 | 推荐做法 |
---|---|
Mapper 接口返回类型 | ✅ Page<T> |
XML SQL 写法 | ❌ 不需要特殊修改 |
Service 层处理 | ✅ 使用 Page<T> 进行 VO 转换并封装 TableDataInfo |
Controller 层 | ✅ 只负责调用和返回 |
VO 转换方式 | ✅ 使用 MapStruct 替代 BeanUtils.copyProperties |
分页工具类 | ✅ 抽取通用分页转换工具类 |
七、结语
PageHelper 是一个强大且易用的分页插件,但在使用过程中必须注意:
- 不要随意丢弃
Page<T>
对象; - 避免在 Service 层中使用
new ArrayList<>()
包装分页结果; - 确保最终返回的
TableDataInfo
包含total
字段;
只有这样才能保证前后端协同工作的准确性,避免出现“前端分页失效”、“total 为 0”等常见问题。
如果你正在使用 RuoYi 开发后台管理系统,请务必重视分页逻辑的设计与实现,确保每一次查询都能正确携带分页信息。
相关文章:
RuoYi 中使用 PageUtils.startPage() 实现分页查询的完整解析
文章目录 一、PageHelper 简介与基本用法使用方式如下: 二、Mapper 接口返回类型对分页的影响1. 返回 Page<T> 类型(推荐)2. 返回 List<T> 类型(不推荐) 三、解析RuoYi 是如何使用 PageUtils.startPage()1…...
【番外】02:Windows 编译带 DNN_CUDA 功能的 OpenCV 动态链接库
文章目录 1. 环境准备2. 兼容性说明3. 算力查询4. 编译步骤5. 网盘资料 提示: 如果读者因网络环境受限,无法正常下载与本文相关的软件安装包、压缩包,以及编译时的依赖文件,可以从文章最后提供的网盘链接下载资源。 1. 环境准备 …...
Java详解LeetCode 热题 100(14):LeetCode 56. 合并区间(Merge Intervals)详解
文章目录 1. 题目描述2. 理解题目3. 解法一:排序 一次遍历法3.1 思路3.2 Java代码实现3.3 代码详解3.4 复杂度分析3.5 适用场景 4. 解法二:双指针法4.1 思路4.2 Java代码实现4.3 代码详解4.4 复杂度分析4.5 与解法一的比较 5. 解法三:TreeMa…...
回答 | 图形数据库neo4j社区版可以应用小型企业嘛?
刚在知乎上看到了一个提问,挺有意思,于是乎,贴到这里再简聊一二。 转自知乎提问 当然可以,不过成本问题不容小觑。另外还有性能上的考量。 就在最近,米国国家航空航天局——NASA因为人力成本问题,摒弃了使…...
2024年北理工Python123第六章测验题整理
测验题一般不会太难,但是这次的题目,未免太多了,有的还很难 一、选择题 二、编程题 1-10 列表和字符串 1-10都是和列表、字符串有关的题目,都很简单,我直接给出代码了 1.列表排序输出 import random random.seed(int(input()…...
常用的设计模式详解
常用的设计模式详解 在后端开发中,设计模式是提升代码可维护性、扩展性和灵活性的关键工具。通过合理应用设计模式,开发者能够高效解决复杂问题并优化系统架构。本文将结合实际案例,深入探讨后端开发中常用的设计模式及其核心应用场景。 一、…...
OFCMS代码审计-freemaker注入sql注入xxexss文件上传
环境搭建 下载地址:https://gitee.com/oufu/ofcms/repository/archive/V1.1.2?formatzip SSTI模板注入(freemaker) FreeMarker模板注入实现远程命令执行 - Eleven_Liu - 博客园 在admin中找到这个 发现请求的是这个 找到他 <#assign value"f…...
python与nodejs哪个性能高
在一般的Web开发和高并发场景中,Node.js的性能通常优于Python,特别是在处理大量异步任务和实时应用时更具优势;而在数据分析、机器学习及计算密集型任务中,Python则表现出更高的性能优势。 Node.js以事件驱动的非阻塞I/O模型著称&…...
云平台管理部署知识点——问题+答案
1、在k8s 中定义副本数量的关键字是那个?处于那个模块下? 关键字:replicas 模块:spec下 2、在k8s中,有状态应用和无状态应用的区别?创建有状态和无状态应用分别使用哪种资源对象类型? &#…...
数据结构(六)——树和二叉树
一、树和二叉树的定义与存储 1.树的定义 树是一种非线性的数据结构,它是由n个有限结点组成有层次关系的集合 树具有以下特点: (1)每个结点具有0个或多个子结点 (2)每个子结点只有一个父结点 ÿ…...
基于构件的开发方法与传统开发方法的区别
在软件开发领域,基于构件的开发方法和传统开发方法有着截然不同的特点与应用效果,这些差异显著影响着项目的实施过程与最终成果。下面,我们将从多个关键维度展开对比分析。 一、开发模式:线性搭建与模块组装 传统开发方法遵循线性的、自顶向下的流程,就像搭建一座高楼…...
cursor对话关键词技巧
提示词基本结构与原则 一个好的 Cursor 提示词通常包含三个部分:目标说明 上下文信息 具体要求。 例如: 创建一个React登录组件,使用Tailwind CSS样式,需要包含邮箱验证功能和记住密码选项。 效果演示: 提示词的的…...
克隆虚拟机组成集群
一、克隆虚拟机 1. 准备基础虚拟机 确保基础虚拟机已安装好操作系统(如 Ubuntu)、Java 和 Hadoop。关闭防火墙并禁用 SELinux(如适用): bash sudo ufw disable # Ubuntu sudo systemctl disable firewalld # CentO…...
添加购物车-02.代码开发
一.代码开发 购物车属于用户端功能,因此要在user下创建controller代码。 Controller层 package com.sky.controller.user;import com.sky.dto.ShoppingCartDTO; import com.sky.entity.ShoppingCart; import com.sky.result.Result; import com.sky.service.Shopp…...
2094. 找出 3 位偶数
from typing import Listclass Solution:def findEvenNumbers(self, digits: List[int]) -> List[int]:# 统计 digits 中每个数字(0-9)的出现次数。cnt [0] * 10for d in digits:cnt[d] 1ans []# i0 百位,i1 十位,i2 个位&a…...
外出充电不发愁,倍思便携式移动电源成出行新宠
电子设备已深度融入现代快节奏生活,成为出行必备。但随之而来的电量焦虑,却始终困扰着人们。无论是出差远行、户外探索,还是每日通勤,如何随时为设备充电,成了亟待解决的难题。倍思极客充伸缩数据线充电宝应运而生&…...
防火墙安全策略基础配置
拓朴图 设备基础配置 # AR1 路由器配置 [Huawei]interface GigabitEthernet0/0/0 [Huawei-GigabitEthernet0/0/0]ip address 1.1.1.2 255.255.255.0 [Huawei]ip route-static 192.168.1.0 255.255.255.0 1.1.1.1# FW1 防火墙配置 [USG6000V1]sysname FW1 [FW1]interface Gigab…...
系统架构-通信系统架构设计
通信网络系统架构 局域网 单一机构所拥有的专用计算机网络 局域网从早期只提供二层交换功能的简单网络发展到现在,还提供三层路由功能的复杂网络 局域网的典型架构风格: 单核心架构:由一台核心二层或三层交换设备充当网络的核心设备&…...
2.3 定积分
一、数学定义与核心公式 核心思想: 定积分是通过无限细分区间、累加微小矩形面积来逼近曲边图形面积的数学工具。其本质是极限过程下的误差控制与动态平衡。 公式与符号解析: 表达式:定积分写作 ∫ₐᵇ f(x)dx,表示在区间 [a, …...
TCPIP详解 卷1协议 八 ICMPv4和ICMPv6 Internet控制报文协议
8.1——ICMPv4和ICMPv6 Internet控制报文协议 IP 协议本身并没有为终端系统提供直接的方法来发现那些发往目的地址失败的IP数据包。此外,IP 没有提供直接的方式来获取诊断信息(例如,哪些路由器在沿途中被使用了或使用一种方法来估计往返时间…...
ik 分词器 设置自定义词典
进入 ES 的安装目录,进入 /elasticsearch-8.10.0/plugins/ik/config/ 文件夹目录,打开 IKAnalyzer.cfg.xml 文件进行配置。 一、添加 自定义扩展词典 扩展词:就是不想哪些词分开,让他们成为一个词,比如“蒙的全是对…...
RabbitMQ 工作模式
RabbitMQ 一共有 7 中工作模式,可以先去官网上了解一下(一下截图均来自官网):RabbitMQ 官网 Simple P:生产者,要发送消息的程序;C:消费者,消息的接受者;hell…...
sqlmap使用入门
sqlmap加速了sql注入的发展,需要掌握6点,其一是--dbs获得数据库名称,其二是-D 数据库名称 --tables 获得数据库中的所有表名,其三是-D 数据库名 -T 表名 -C 字段1,字段2 --dump 获得数据库中的表中的字段的值,其四是-r…...
C++23 中的 views::stride:让范围操作更灵活
文章目录 什么是 views::stride语法与用法参数与返回值实现细节适用场景编译器支持总结 什么是 views::stride views::stride 是 C23 引入的一个范围适配器。它允许我们从一个范围中以固定步长提取元素,从而生成一个新的范围视图。具体来说,给定一个范围…...
OSI 7层模型
OSI 7层模型: 1、物理层(光纤等把电脑连接起来的物理手段) 2、数据链路层(以太网,确认0和1电信号的分组方式,负责MAC地址,MAC地址用于在网络中唯一标示一个网卡,相当于网卡的身份证…...
向量组的维度是单个向量中元素的个数
在线性代数中,向量组的维数通常指的是单个向量中元素的个数,即每个向量的维度(dimension)。例如,一个由三维几何向量(如 ( x , y , z ) (x, y, z) (x,y,z))组成的向量组,其维数是3&…...
VM中 ubuntu 网卡不显示
1.添加网卡配置 #sudo nano /etc/netplan/01-netcfg.yaml network:version: 2renderer: networkdethernets:ens33:dhcp4: trueens37:dhcp4: trueens38:dhcp4: true#保存后 sudo netplan apply2.查看网络状态 sudo systemctl start systemd-networkd sudo systemctl status sy…...
Scratch基础-运动模块详解
一、本次任务 二、内容详解 1)点位坐标知识 1、什么是坐标? 答: 坐标是定位位置的数字,大家进教室是不是都有自己的座位?比如第3排第2列?这就像Scratch舞台的坐标,每个角色都有自己的‘座位号’…...
dp自动化登陆之hCaptcha 验证码
hCaptcha 是一种常见的验证码服务,用于区分人类用户和自动化程序。由于其基于图像识别和行为分析,下面介绍如何使用自动化点击验证码完成登陆。 思路:登陆目标网站触发验证码,截图并发给打码平台返回坐标,模拟人工点击…...
【002】renPy android端启动流程分析
接上篇分析 org.renpy.android.PythonSDLActivity#onCreate它先调用了 org.libsdl.app.SDLActivity#onCreate 源码如下: Override // android.app.Activity protected void onCreate(Bundle bundle0) {//1. 日志记录String s;Log.v("SDL", "Dev…...
基于注意力机制与iRMB模块的YOLOv11改进模型—高效轻量目标检测新范式
随着深度学习技术的发展,目标检测在自动驾驶、智能监控、工业质检等场景中得到了广泛应用。针对当前主流目标检测模型在边缘设备部署中所面临的计算资源受限和推理效率瓶颈问题,YOLO系列作为单阶段目标检测框架的代表,凭借其高精度与高速度的…...
suricata增加单元测试编译失败
一、环境 $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.5 LTS Release: 22.04 Codename: jammysuricata: suricata7.0.5 IDE: vscode 二、背景 在suricata中开发了某个功能后,增加unittest时,…...
如何查看电脑处理器配置 电脑处理器查看方法
电脑处理器(CPU)直接影响着电脑的运行速度和响应能力,无论是进行日常办公、娱乐,还是玩大型游戏,处理器的性能都至关重要。那么,电脑cpu在哪里看呢?本文将为你介绍几种简单的方法,帮…...
idea查看pom文件依赖
IDEA中查看依赖树的插件 很方便 能够分析源码中引入的注解是来自哪个jar包的...
图形化编程平台的破局之道:从工具同质化到生态差异化
一、同质化困局的底层逻辑剖析 在全球图形化编程市场中,工具功能趋同已成为行业共识。据 Statista 2024 年数据显示,主流平台的基础功能重合度高达 78%,核心模块(如条件判断、循环结构)的实现方式高度相似。这种现象的…...
Spring Boot动态配置修改全攻略
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 无需重启应用,实时更新配置的终极指南 在微服务架构中,动态配置管理是提高系统灵活性的关键技术。本文将通过4种主流方案,…...
基于STM32、HAL库的DPS368XTSA1气压传感器 驱动程序设计
一、简介: DPS368XTSA1 是 InvenSense(TDK 集团旗下公司)生产的一款高精度数字气压传感器,专为需要精确测量气压和温度的应用场景设计。它具有超低功耗、高精度、快速响应等特点,非常适合物联网、可穿戴设备和无人机等应用。 二、硬件接口: DPS368XTSA1 引脚STM32L4XX 引…...
VMware虚拟机实例-docker启动失败
DOCKER启动失败 错误消息 [rootlocalhost docker]# yum install docker......[rootlocalhost docker]# systemctl start dockerFailed to start docker.service: Unit is masked. 错误原因 # /var/log/messagesMay 12 18:14:04 localhost systemd: Started Session 11 of user…...
计算机图形学编程(使用OpenGL和C++)(第2版)学习笔记 09.天空和背景
天空和背景 对于 3D 场景,通常可以通过在远处的地平线附近创造一些逼真的效果,来增强其真实感。我们可以采用天空盒、天空柱(Skydome)或天空穹(Skydome)等技术来模拟天空。 天空盒 天空盒(Sk…...
CSDN博客粘贴图片失败如何解决
以前还好,最近越发的厉害了。 因为我最近恰好换了个网,所以我还以为是网络的问题。 网的问题我暂时解决不了,除非在加银子换个网,否则我搞不定。 终于找到一种貌似还行的方法,记录一下。 1,现象 CSDN博…...
USB学习【10】描述符-HID描述符
目录 1.前言2.HID描述符概述3.HID描述符组成4.报告描述符的概念和作用5.报告描述符中的通用项(Item) 1.前言 HID描述符功能上面相对独立一些,所以单分一篇专门整理。 原文链接:https://blog.csdn.net/weiaipan1314/article/detai…...
什么是Vim
Vim可是Linux中最强大、最受欢迎的文本编辑器之一,很多程序员、系统管理员都离不开它。要说清楚Vim的各种功能和用法,似乎有点长,但我会尽量用简单通俗的方式,把Vim的核心知识讲清楚,让你能一步一步开始使用它。 一、…...
【Unity3D插件】Unity3D插件之天气系统/日夜系统插件-UniStorm
推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享QQ群:398291828小红书小破站 一、前言 1.0136537.8,1.023651377.4,每天进步一点点,一年后就差了几十倍的差距,加油吧少年。 UniStorm是一款强大的动态昼夜天气系统&…...
AIGC时代的内容安全:AI检测技术如何应对新型风险挑战?
在数字时代,互联网内容以文本、图像、音频和视频等形式呈现爆发式增长,深刻塑造了信息传播的格局。然而,内容的快速传播也带来了严峻挑战:违法信息(如涉黄、涉政)、虚假广告、网络暴力等内容不仅威胁用户体…...
SAGAR线上网页程序生成准随机结构(SQS)
SAGAR线上网页程序地址 http://sagar.compphys.cn/sagar 页面最上方默认使用8个原子的Si为基础结构。 打开网页 选择C1模块 在下方填入结构信息,以及掺杂入原子和数量 这里则设置掺杂入4个C原子,然后点击submit,则会自动生成并让你下载一根压…...
Wi-Fi网络角色及功能详解
在 Wi-Fi 网络中,不同的角色和组件协同工作以实现无线通信。以下是 Wi-Fi 中的主要角色及其功能: 1. 基础设施模式(Infrastructure Mode) 这是最常见的 Wi-Fi 网络架构,包含以下核心角色: 接入点ÿ…...
18.three官方示例+编辑器+AI快速学习webgl_buffergeometry_points_interleaved
本实例主要讲解内容 这个Three.js示例展示了如何使用BufferGeometry和Points对象创建高效的粒子系统。通过共享内存缓冲区和交错存储顶点数据,实现了50万个粒子的流畅渲染,并为每个粒子设置基于位置的颜色。 核心技术包括: 使用ArrayBuffe…...
Oracle 19c 静默安装
文章目录 环境介绍安装包下载准备工作配置 yum 源安装依赖包创建用户和用户组创建必要目录关闭 SELinux配置内核参数配置资源限制配置环境变量 Oracle 19c 安装解压缩编辑相应文件执行静默安装配置监听静默创建数据库 数据库维护连接数据库 环境介绍 操作系统为 CentOS 7.9 O…...
vscode 默认环境路径
1.下面放在项目根目录上: .vscode/settings.json 2.settings.json内容: {"python.analysis.extraPaths": ["${workspaceFolder}"],"python.defaultInterpreterPath": "/shared_disk/users/lbg/envs/py310_see3d/b…...
电力系统静态安全因素与动态安全因素的区别及具体分类
电力系统的安全分析分为静态安全和动态安全两类。静态安全分析关注系统在稳态或小扰动下的安全裕度,动态安全分析则关注系统在大扰动或暂态过程中的稳定能力。 一、静态安全因素 频率静态安全 因素: 发电与负荷的静态平衡:需保证稳态下的发电…...