java配置webSocket、前端使用uniapp连接
一、这个管理系统是基于若依框架,配置webSocKet的maven依赖
<!--websocket--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>
二、配置类配置webSocket的端点和相关的参数
1、WebSocketConfig - webSocket配置类
注意:ws://yourdomain:port/ws/order?token=yourTokenValue。
可以使用cpolar 工具把IP地址解析成可访问的域名。
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {@Autowiredprivate WebSocketHandler webSocketHandler;/*** 注册websocket的端点* 客户端连接格式: ws://yourdomain:port/ws/order?token=yourTokenValue* token参数必须提供,系统会通过token从Redis获取对应的openId用于用户识别* @param registry WebSocketHandlerRegistry*/@Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {registry.addHandler(webSocketHandler, "/ws/order").setAllowedOrigins("*"); // 允许跨域访问}/*** 配置WebSocket服务器的参数* 包括:连接超时时间、心跳超时时间、最大消息大小等* @return ServletServerContainerFactoryBean*/@Beanpublic ServletServerContainerFactoryBean createWebSocketContainer() {ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();// 设置异步发送超时时间为25秒container.setAsyncSendTimeout(25000L);// 设置最大会话空闲时间为60秒container.setMaxSessionIdleTimeout(60000L);// 设置最大文本消息缓冲区大小为8KBcontainer.setMaxTextMessageBufferSize(8192);// 设置最大二进制消息缓冲区大小为8KBcontainer.setMaxBinaryMessageBufferSize(8192);return container;}
}
2、WebSocketHandler - webSocket处理器
@Component
@Slf4j
public class WebSocketHandler extends TextWebSocketHandler {@Autowiredprivate StringRedisTemplate stringRedisTemplate;// 用线程安全的集合来管理所有连接的 WebSocket 会话private static final Set<WebSocketSession> sessions = new CopyOnWriteArraySet<>();// 使用ConcurrentHashMap来存储openId到session的映射关系private static final Map<String, WebSocketSession> userSessions = new ConcurrentHashMap<>();// 使用ConcurrentHashMap来存储session到openId的映射关系(反向映射)private static final Map<WebSocketSession, String> sessionUsers = new ConcurrentHashMap<>();// 记录每个session最后一次活跃时间private static final Map<String, Long> sessionLastActiveTime = new ConcurrentHashMap<>();// 心跳检查的定时任务执行器private final ScheduledExecutorService heartbeatScheduler = Executors.newSingleThreadScheduledExecutor();// 心跳超时时间,单位毫秒private static final long HEARTBEAT_TIMEOUT = 50000L; // 50秒// 用于解析JSON的对象映射器private static final ObjectMapper objectMapper = new ObjectMapper();/*** 构造方法,启动心跳检测任务*/public WebSocketHandler() {// 每15秒检查一次心跳heartbeatScheduler.scheduleAtFixedRate(this::checkHeartbeats, 15, 15, TimeUnit.SECONDS);}/*** 心跳检查方法,清理那些超时的连接*/private void checkHeartbeats() {long currentTime = System.currentTimeMillis();for (Map.Entry<String, Long> entry : sessionLastActiveTime.entrySet()) {String openId = entry.getKey();long lastActive = entry.getValue();// 如果超过超时时间没有活动,则关闭会话if (currentTime - lastActive > HEARTBEAT_TIMEOUT) {WebSocketSession session = userSessions.get(openId);if (session != null && session.isOpen()) {try {log.warn("会话心跳超时,主动断开连接 - openId: {}, 上次活跃: {}ms前", openId, currentTime - lastActive);session.close(CloseStatus.NORMAL);} catch (IOException e) {log.error("关闭超时WebSocket会话异常 - openId: {}, 错误: {}", openId, e.getMessage());} finally {// 确保从会话映射中移除sessions.remove(session);sessionUsers.remove(session);userSessions.remove(openId);sessionLastActiveTime.remove(openId);}} else {// 会话已关闭或不存在,直接清理userSessions.remove(openId);sessionLastActiveTime.remove(openId);}}}}/*** 新客户端连接时,加入到 sessions 集合中* @param session 会话*/@Overridepublic void afterConnectionEstablished(WebSocketSession session) throws Exception {sessions.add(session);// 从URL中获取token参数,格式应为 /ws/order?token=xxxString token = extractToken(session);if (token != null) {// 从Redis中获取对应的openIdString openId = getOpenIdFromToken(token);if (openId != null) {userSessions.put(openId, session);sessionUsers.put(session, openId);sessionLastActiveTime.put(openId, System.currentTimeMillis()); // 记录初始活跃时间log.info("WebSocket连接已建立 - token: {}, openId: {}, 当前连接数: {}", token, openId, sessions.size());} else {log.warn("找不到token对应的openId,token可能已过期 - token: {}", token);// 可以选择关闭这个无效的连接session.close(CloseStatus.NOT_ACCEPTABLE);}} else {log.warn("WebSocket连接未提供token参数,无法识别用户");// 可以选择关闭这个无效的连接session.close(CloseStatus.NOT_ACCEPTABLE);}}/*** 客户端断开连接时,从 sessions 集合中移除* @param session 会话* @param status*/@Overridepublic void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {sessions.remove(session);// 从用户会话映射中也移除String openId = sessionUsers.remove(session);if (openId != null) {userSessions.remove(openId);sessionLastActiveTime.remove(openId);log.info("WebSocket连接已关闭 - openId: {}, 状态: {}", openId, status);}}/*** 处理收到的文本消息* 对于心跳消息进行特殊处理*/@Overrideprotected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {String openId = sessionUsers.get(session);String payload = message.getPayload();try {// 尝试解析为JSONJsonNode jsonNode = objectMapper.readTree(payload);// 检查是否是心跳消息if (jsonNode.has("type") && "ping".equals(jsonNode.get("type").asText())) {// 更新最后活跃时间if (openId != null) {sessionLastActiveTime.put(openId, System.currentTimeMillis());}// 发送pong响应session.sendMessage(new TextMessage("{\"type\":\"pong\",\"time\":" + System.currentTimeMillis() + "}"));return;}} catch (Exception e) {// 不是JSON格式的消息,忽略错误继续处理}// 更新最后活跃时间if (openId != null) {sessionLastActiveTime.put(openId, System.currentTimeMillis());}log.debug("收到消息 - openId: {}, 内容: {}", openId, payload);// 在这里可以添加其他消息处理逻辑}/*** 从WebSocketSession中提取token* @param session WebSocket会话* @return token,如果不存在则返回null*/private String extractToken(WebSocketSession session) {String query = session.getUri().getQuery();if (query != null && query.contains("token=")) {String[] params = query.split("&");for (String param : params) {String[] keyValue = param.split("=");if (keyValue.length == 2 && "token".equals(keyValue[0])) {log.info("WebSocket连接已获取token - token: {}", keyValue[1]);return keyValue[1];}}}return null;}/*** 从token获取对应的openId* @param token 用户token* @return openId,如果token无效则返回null*/private String getOpenIdFromToken(String token) {if (token == null || token.isEmpty()) {return null;}try {// 从Redis中获取token对应的openIdreturn stringRedisTemplate.opsForValue().get(WECHAT_KEY + token);} catch (Exception e) {log.error("从Redis获取token信息异常 - token: {}, 错误: {}", token, e.getMessage());return null;}}/*** 发送支付成功的通知给所有连接的客户端* @param message 消息体*/public void sendPaymentSuccessNotification(String message) {for (WebSocketSession session : sessions) {try {// 通过 WebSocket 向每个客户端发送消息session.sendMessage(new TextMessage(message));} catch (IOException e) {log.error("发送支付成功通知失败", e);}}}/*** 向指定用户发送消息* @param openId 用户的openId* @param message 消息内容* @return 是否发送成功*/public boolean sendMessageToUser(String openId, String message) {WebSocketSession session = userSessions.get(openId);if (session != null && session.isOpen()) {try {session.sendMessage(new TextMessage(message));log.info("消息已发送给用户 - openId: {}", openId);return true;} catch (IOException e) {log.error("发送消息给用户失败 - openId: {}", openId, e);return false;}} else {log.info("用户未通过WebSocket连接 - openId: {}", openId);return false;}}/*** 向所有用户发送心跳检测消息*/public void sendHeartbeat() {String heartbeatMsg = "{\"type\":\"heartbeat\",\"time\":" + System.currentTimeMillis() + "}";for (WebSocketSession session : sessions) {if (session.isOpen()) {try {session.sendMessage(new TextMessage(heartbeatMsg));} catch (IOException e) {log.error("发送心跳消息失败", e);}}}}
}
注意:这里发送消息给指定用户需要前端传递token,获取存储在redis中的openId(微信小程序用户标识)
3、发送消息我定义了一个定时器发送消息和心跳测试
3.1、根据自己业务封装的消息体
@ApiModel(value = "MessageVo",discriminator = "websocket的消息体")
public class MessageVo {@ApiModelProperty(value = "消息标题",dataType = "string")private String title;@ApiModelProperty(value = "消息内容",dataType = "string")private String content;@ApiModelProperty(value = "车牌号码",dataType = "string")private String plateNumber;@ApiModelProperty(value = "订单编号",dataType = "string")private String orderNumber;@ApiModelProperty(value = "创建时间",dataType = "date")private Date createTime;}
/*** 定时发送提醒消息给待过磅状态的用户* 每1分钟执行一次,提醒用户进行过磅操作*/public void sendWeighingReminder() {log.info("开始执行待过磅用户提醒任务");try {// 查询所有待过磅的订单WeighingRecords pendingQuery = new WeighingRecords();pendingQuery.setStatus(0L); // 待过磅List<WeighingRecords> pendingWeighingOrders = weighingRecordsMapper.selectWeighingRecordsList(pendingQuery);// 如果没有待过磅订单,直接返回if (pendingWeighingOrders == null || pendingWeighingOrders.isEmpty()) {log.info("没有查询到待过磅订单,跳过发送提醒");return;}log.info("查询到 {} 条待过磅订单,开始发送提醒", pendingWeighingOrders.size());int successCount = 0;// 遍历所有待过磅订单,发送提醒消息for (WeighingRecords order : pendingWeighingOrders) {// 检查是否有有效的openIdString openId = order.getOpenId();if (openId == null || openId.trim().isEmpty()) {log.warn("订单 {} 缺少有效的openId,无法发送提醒", order.getOrderNumber());continue;}// 创建消息体MessageVo messageVo = new MessageVo();messageVo.setTitle("过磅提醒");messageVo.setContent("您有一条待过磅的订单,请及时前往过磅点进行过磅操作。");messageVo.setOrderNumber(order.getOrderNumber());messageVo.setPlateNumber(order.getPlateNumber()); // 设置车牌号messageVo.setCreateTime(DateUtils.getNowDate());try {// 转换为JSON字符串String messageJson = objectMapper.writeValueAsString(messageVo);// 直接使用openId发送消息(WebSocketHandler内部会通过openId查找对应的会话)boolean sent = webSocketHandler.sendMessageToUser(openId, messageJson);if (sent) {successCount++;log.info("成功向用户 {} 发送过磅提醒消息,订单号: {}", openId, order.getOrderNumber());} else {log.info("用户 {} 未连接WebSocket,无法发送过磅提醒消息,订单号: {}", openId, order.getOrderNumber());}} catch (JsonProcessingException e) {log.error("消息序列化异常,订单号: {}, 错误: {}", order.getOrderNumber(), e.getMessage());} catch (Exception e) {log.error("发送消息异常,订单号: {}, 错误: {}", order.getOrderNumber(), e.getMessage());}}log.info("过磅提醒任务完成,共尝试: {} 条,成功: {} 条", pendingWeighingOrders.size(), successCount);} catch (Exception e) {log.error("过磅提醒任务异常: {}", e.getMessage(), e);}}/*** 定期发送心跳消息,保持WebSocket连接活跃* 每25秒执行一次,低于WebSocketConfig中设置的60秒超时时间*/public void sendHeartbeat() {log.debug("开始执行WebSocket心跳任务");try {webSocketHandler.sendHeartbeat();log.debug("WebSocket心跳消息发送完成");} catch (Exception e) {log.error("WebSocket心跳任务异常: {}", e.getMessage(), e);}}
4、由于这个管理系统是基于若依所以需要配置鉴权,否则会被拦截
这个是部分配置代码
@Beanprotected SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception{return httpSecurity// CSRF禁用,因为不使用session.csrf(csrf -> csrf.disable())// 禁用HTTP响应标头.headers((headersCustomizer) -> {headersCustomizer.cacheControl(cache -> cache.disable()).frameOptions(options -> options.sameOrigin());})// 认证失败处理类.exceptionHandling(exception -> exception.authenticationEntryPoint(unauthorizedHandler))// 基于token,所以不需要session.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))// 注解标记允许匿名访问的url.authorizeHttpRequests((requests) -> {permitAllUrl.getUrls().forEach(url -> requests.antMatchers(url).permitAll());// 对于登录login 注册register 验证码captchaImage 允许匿名访问requests.antMatchers("/login", "/register", "/captchaImage","/weiXin/login","/weiXin/returnNotify","/ws/**").permitAll()
..........}
注意:端点配置的是“/ws/order",所以在这了配置为”/ws/**“
三、小程序端的部分代码配置
注意:需要在路径上面传递token,为了后端获取openId向指定用户发送消息
这个是小程序的webSocket的地址示例:“wss://5aa7e45c.r11.cpolar.top/ws/order?token=${this.token}”
相关文章:
java配置webSocket、前端使用uniapp连接
一、这个管理系统是基于若依框架,配置webSocKet的maven依赖 <!--websocket--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency> 二、配…...
01、java方法
前面与c都很相似,于是我决定从这一章开始复盘java的学习 一、方法 方法的好处主要体现在使用方便,可以在多处调用,不必反复造轮子 1、方法的使用 这就是一个简单的方法创建: public class java0517 {public static int ret(int …...
springboot实现幂等性
一 增加注解 import java.lang.annotation.*;Retention(RetentionPolicy.RUNTIME) Target({ElementType.METHOD}) Documented public interface ApiIdempotent { } 二 aop实现切面 import cn.hutool.extra.spring.SpringUtil; import com.alibaba.fastjson.JSONObject; import…...
Flink 快速入门
本文涉及到大量的底层原理知识,包括运行机制图解都非常详细,还有一些实战案例,所以导致本篇文章会比较长,内容比较多,由于内容太多,很多目录可能展示不出来,需要去细心的查看,非常适…...
MySQL 8.0 OCP 英文题库解析(五)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题31~40 试题31:…...
lovart design 设计类agent的系统提示词解读
文章目录 lovart 设计agent介绍角色定义工作规范工具调用任务复杂度指南任务移交指南其他ref lovart 设计agent介绍 lovart作为设计agent,产品功能包括: 全链路设计能力:可以快速生成完整的品牌视觉方案,包括标志、配色、品牌规范…...
C++11特性
一.C的发展历史 C11是C的第二个主要版本,从C98起的重要更新,引入了大量更改,从C11起C规律的进行每3年更新一次。 二.列表初始化 2.1 C98和C11中的 { } 传统的C98中使用 { } 来进行列表初始化,结构体函数体都使用此类方法&…...
鸿蒙PC操作系统:从Linux到自研微内核的蜕变
鸿蒙PC操作系统是否基于Linux内核,需要结合其技术架构、发展阶段和官方声明综合分析。以下从多个角度展开论述: 一、鸿蒙操作系统的多内核架构设计 多内核混合架构 根据资料,鸿蒙操作系统(HarmonyOS)采用分层多内核架构,内核层包含Linux内核、LiteOS-m内核、LiteOS-a内核…...
用 RefCounted + WeakPtr 构建线程安全的异步模块
在 Chromium 的多线程异步编程中,合理管理对象生命周期非常关键。本文深入介绍 base::RefCountedThreadSafe 和 base::WeakPtr 的组合使用方法,并通过示例分析其使用要点及易踩的坑。 🌱 基础概念回顾 1. RefCountedThreadSafe<T> 是 …...
ElasticSearch 8.x 快速上手并了解核心概念
目录 核心概念概念总结 常见操作索引的常见操作常见的数据类型指定索引库字段类型mapping查看索引库的字段类型最高频使用的数据类型 核心概念 在新版Elasticsearch中,文档document就是一行记录(json),而这些记录存在于索引库(index)中, 索引名称必须是…...
2025.5.19总结
工作:今天回归了3个问题单,测需求提交两个问题。然后再工作中慢慢有了自己的一些成就感,觉得工作越来越有干劲,因为感觉自己在工作上能做得越来越好,无论是在沟通方面,还是与同事的关系上,感觉都…...
C++(25): 标准库 <deque>
目录 1、 核心概念 2. 基本语法 3. 特点 4. 特有成员函数 5. 内存与性能 6. 示例代码 7. 成员函数列表 8. 使用场景 9. 注意事项 1、 核心概念 双端队列(Double-Ended Queue,deque) 是一种允许在队列头部和尾部高效插入和删除元素的线性数据结构,同时支持随机访问。…...
[ 计算机网络 ] | 宏观谈谈计算机网络
(目录占位) 网络间通信,本质是不同的两个用户通信;本质是两个不同主机上的两个进程间通信。 因为物理距离的提升,就衍生出了很多问题。TCP/IP协议栈 / OSI七层模型,将协议分层,每一层都是为了…...
会议动态|第十五届亚太燃烧学术年会精彩探析
ASPACC 2025第十五届亚太燃烧学术年会5月19日在新加坡隆重召开,本届盛会,以“构建零碳和可持续未来”为主题,汇聚了来自亚太的2000余位专家学者进行学术交流。会议聚焦燃烧反应动力学、火焰传播、燃烧效率等方向。 千眼狼在会议上展示了高速摄…...
Dify-3:系统架构
系统架构 概述了 Dify 的系统架构,解释主要组件如何协同工作以提供大语言模型(LLM)应用开发平台。内容涵盖高层架构、部署选项、核心子系统和外部集成。 1. 整体架构 Dify 采用基于微服务的架构,将前端 Web 应用与后端 API 服务…...
使用 docker-volume-backup 备份 Docker 卷
docker-volume-backup 是一个用于备份 Docker 卷的工具,在 Windows 10 上使用它,你可以按照以下步骤操作: 1. 确保 Docker 环境已安装并正常运行 在 Windows 10 上,你需要安装 Docker Desktop for Windows。可以从 Docker 官方网…...
分布式与集群:概念、区别与协同
分布式与集群:概念、区别与协同 在分布式系统与云计算领域,分布式(Distributed)和集群(Cluster)是两个高频出现的核心概念。它们常被混淆,但本质上属于不同维度的设计思想。本文将从定义、分类、实际应用及协同关系四个层面,结合 Dubbo、Git、Hadoop 等典型案例,系统…...
Matlab简单优化模型应用
一、目的 掌握优化模型的建立方法,能够借助Matlab工具对建立的优化模型进行求解。 二、内容与设计思想 1、分析:某石油设备制造厂每月需要100套压缩机用于维护和运营石油开采设备。这些零件由工厂内部生产,每月生产500套,每批压缩机的生产…...
板凳-------Mysql cookbook学习 (四)
综合对比与选择建议 维度 PHP Java Python Ruby Perl 学习门槛 低(适合新手) 高(语法复杂) 低(语法简洁) 中(需理解 Rails 理念) 中(特殊语法…...
C语言学习笔记之条件编译
编译器根据条件的真假决定是否编译相关的代码 常见的条件编译有两种方法: 一、根据宏是否定义,其语法如下: #ifdef <macro> …… #else …… #endif例子: #include <stdio.h>//def _DEBUG_ //定义_DEBUG_ int main(…...
网络安全-等级保护(等保) 2-7 GB/T 25058—2019 《信息安全技术 网络安全等级保护实施指南》-2019-08-30发布【现行】
################################################################################ GB/T 22239-2019 《信息安全技术 网络安全等级保护基础要求》包含安全物理环境、安全通信网络、安全区域边界、安全计算环境、安全管理中心、安全管理制度、安全管理机构、安全管理人员、安…...
Android设备 显示充电速度流程
整体逻辑:设备充电速度的判断 系统通过读取充电器的最大电流(Current)与最大电压(Voltage),计算最大充电功率(Wattage),以此判断当前是慢充、普通充还是快充:…...
megatron——EP并行
1、专家并行(Expert Parallelism, EP)适用场景 定义: 专家并行是指在混合专家模型(Mixture of Experts, MoE)中,将不同的专家(即子模型)分配到不同的设备上,每个设备只负…...
如何轻松删除电脑上的文件(无法恢复文件)
如果您想清理电脑上的存储空间,您可能需要轻松删除电脑上的文件以释放空间。此外,如果您打算出售或捐赠您的旧电脑,永久删除您的文件至关重要,这可以保护您的隐私。无论如何,您需要一种有效且可靠的方法来从计算机中删…...
搭建一个永久免费的博客
搭建永久免费的博客(1)基本介绍 HugoStackGitHub GitHub GitHub GitHub Build and ship software on a single, collaborative platform GitHub 下载安装git Git - Downloads Edge插件authenticator 2fa client Settings->Password and auth…...
计算机底层的多级缓存以及缓存带来的数据覆盖问题
没有多级缓存的情况 有多级缓存的情况 缓存带来的操作覆盖问题 锁总线带来的消耗太大了。...
ICRA 2024 PROGrasp——实用的人机交互物体抓取系统
在机器人抓取任务中,自然语言理解能够显著改善人机交互体验,尤其是在需要机器人根据人类指令进行环境交互的场景中。然而,现有的抓取系统往往要求用户明确指定目标对象的类别,限制了交互的自然性和灵活性。为了解决这一问题&#…...
【Vue篇】潮汐中的生命周期观测站
目录 引言 一、Vue生命周期 二、Vue生命周期钩子 三、、生命周期钩子实战 1.在created中发送数据 2.在mounted中获取焦点 四、综合案例-小黑记账清单 1.需求图示: 2.需求分析 3.思路分析 4.代码 5. 总结 引言 💬 欢迎讨论:如果…...
【OpenCV基础2】图像运算、水印、加密、摄像头
目录 一、图像运算 1、利用“” 2、cv2.add() 3、掩膜异或 二、摄像头 1、读取、视频流保存 2、人脸识别 三、数字水印 1、水印嵌入 2、水印提取 四、图像加密 一、图像运算 1、利用“” import cv2 利用""方法将两幅图像相加img1 cv2.imread(project…...
第 25 届中国全电展即将启幕,构建闭环能源生态系统推动全球能源转型
由 AI 算力爆发引发的能源消耗剧增,与碳中和目标、能源安全需求及电网转型压力形成叠加效应,使全球能源体系面临前所未有的挑战。在此背景下,第 25 届中国全电展(EPOWER EXPO)将于 2025 年 6 月 11 日至 13 日在上海新…...
vue3:十三、分类管理-表格--编辑、新增、详情、刷新
一、效果 实现封装表格的新增、编辑、详情查看,表格刷新功能 实现表格组件中表单的封装 1、新增 如下图,新增页面显示空白的下拉,文本框,文本域,并实现提交功能 2、编辑 如下图,点击行数据,可将行数据展示到编辑弹窗,并实现提交功能 3、详情 如下图,点击行数据,…...
一周快讯 | 银发文娱旅游一周新鲜事
银发文娱旅游一周新鲜事 一周银发文娱旅游产业资讯速览 星期一 5月19日 1 企业动态 同方全球人寿等共建一站式康养服务生态 东秀星健康养老产业等合作赋能康养产业,开发“旅居养老”项目 欧莱雅等合作将推出银发族形象管理课程 2 行业风向 总投资10亿&a…...
C++寻位映射的奇幻密码:哈希
文章目录 1.什么是哈希?2.哈希的常见实现方法2.1 直接定址法2.2 除留余数法 3.哈希冲突4.哈希冲突的解决4.1 闭散列4.1.1 线性探测4.1.1.1 哈希表的基本数据结构4.1.1.2 哈希表的key转换4.1.1.3 哈希表的插入4.1.1.4 哈希表的查找4.1.1.5 哈希表的删除 4.1.2 二次探…...
Spring Boot 集成 druid,实现 SQL 监控
文章目录 背景Druid 简介监控统计 StateFilter其它 Filter详细步骤第 1 步:添加依赖第 2 步:添加数据源配置【通用部分】第 3 步:添加监控配置【关键部分】第 3 步:访问 druid 页面参考背景 😂 在 Code Review 过程中发现,经常有开发会忘记给表加索引。这就导致,生产运…...
从零开始学习three.js(21):一文详解three.js中的矩阵Matrix和向量Vector
一、三维世界的数学基石 在Three.js的三维世界里,所有视觉效果的实现都建立在严密的数学基础之上。其中向量(Vector) 和矩阵(Matrix) 是最核心的数学工具,它们就像构建数字宇宙的原子与分子,支…...
无需笔墨之功,锦绣SQL自成桥——QuickAPI古法炼数据秘术
楔子:锦绣SQL,化身为桥 昔有匠人苦修代码之术,欲通数据库与前朝之界,然笔耕不辍,耗时弥久。今有秘器名曰QuickAPI,但凭三寸SQL文,顷刻间筑起数据虹桥。纵使不谙代码之道者,亦可挥毫…...
模块与包的导入
一、导入官方库 我们复盘下学习python的逻辑,所谓学习python就是学习python常见的基础语法学习你所处理任务需要用到的第三方库 类别典型库解决的问题学习门槛基础工具os、sys、json操作系统交互、序列化数据(如读写 JSON 文件)低科学计算n…...
智能文档抽取技术可以应用于哪些场景?
近日,合合信息编撰并发布了《2025智能文档技术与应用白皮书》。该书中不仅深度解析技术原理与创新突破,更聚焦金融、法律、制造等行业的典型场景,结合典型案例揭示技术如何赋能合同智能审查、票据自动化处理、知识库构建等业务场景࿰…...
实践促成长:成都理工大学华清远见成都中心实训
2025年5月, 华清远见成都中心迎来了成都理工大学大数据管理与应用专业23级以及电子商务22级的同学们,以实践为导向、以提升能力为目标的校企合作实训活动在此展开,为同学们开启了一段充满挑战与收获的学习之旅。 华清远见成都中心为两个专业的同学们量身…...
北京本地 SEO 推广:从技术成本到效果转化的深度拆解
在数字化营销的浪潮中,北京本地企业对 SEO 推广的需求日益增长。然而,SEO 推广服务的价格参差不齐,效果也难以预估。本文将从技术实现、成本构成等角度,深入剖析北京本地 SEO 推广服务的价格与效果,baidu0048为企业选择…...
JavaScript 中的五种继承方式进行深入对比
文章目录 前言JavaScript 五种继承方式对比原型链继承构造函数继承组合继承寄生组合继承ES6 class extends 继承五种继承方式对比表前言 对 JavaScript 中的五种继承方式进行深入对比:原型链继承、构造函数继承、组合继承、寄生组合继承、以及 ES6 的 class extends。 内容将…...
CAU数据库class2 SQL语言
SQL分类 DDL 数据库操作 查询数据库: 查询所有数据库 show databases; 查询名字里有t的数据库 show databases like %t%;查询名字以t为结尾的数据库 show databases like %t;查看数据库name是怎么创建出来的 show create database name;创建数据库 创建…...
软考教材重点内容 信息安全工程师 25章 移动安全 26章 大数据安全
第 25 章移动应用安全需求分析与安全保护工程 移动互联网技术基本组成如图 25-1 所示,包括三个部分:一是移动应用,简称 App;二是通信网络,包括无线网络、移动通信网络及互联网;三是应用服务端,由相关的服务器构成,负责…...
有关Groutine无限创建的分析
有关Groutine无限创建的分析 文章目录 有关Groutine无限创建的分析从操作系统分析进程、线程、协程的区别进程内存线程内存执行单元 cpu切换成本协程切换成本线程切换成本内存占用 Go程是否可以无限创建不控制go程创建引发的问题简单方式控制go程创建channel有buffersync.WaitG…...
FANUC发那科焊接机器人智能气阀
在现代工业生产中,焊接技术的发展日新月异,其中发那科(FANUC)焊接机器人以其高精度和稳定性受到了广泛应用。而智能气阀作为发那科焊接机器人的重要组成部分,在提升焊接效率和质量方面发挥着不可忽视的作用。 工作原理…...
软件架构风格系列(7):闭环控制架构
文章目录 引言一、闭环控制架构:让系统学会“自我调节”的魔法(一)从温控系统理解核心原理(二)核心组件解析 二、架构设计图:闭环控制的“四大核心环节”三、Java实战:手写一个智能温控系统&…...
Java合并两个列表到目标列表,并且进行排序
可以通过使用addAll()方法将两个列表合并到目标列表中。以下是实现代码: java 复制 下载 List<LedgerRecord> rkRecordList warehouseMapper.selectLedgerRkRecordByMaterialNo(materialNo); List<LedgerRecord> ckRecordList warehouseMapper.se…...
关于在Unity项目中使用Post Processing插件打包到web端出现的问题
关于在Unity项目中使用Post Processing插件打包到web端出现的问题 解决方法:是不激活摄像机上的Post Processing有关组件,拉低场景中的Directional Light平行光的强度进行web端打包。 (烘焙灯光时是可以激活。) web端支持这个Pos…...
智象科技:自动化模块驱动IT运维效能升级
智象自动化模块概览 智象科技的一站式IT运维平台中的自动化模块,是企业数字化转型的强大助推器。该模块集成了IT运维作业的流程编排、脚本编排,各类运维资源配置项目和脚本的合规巡检,以及基础信息、监控指标的巡检配置等自动化管理ÿ…...
GPU状态监控
GPU 状态监控 对比: GPU项目名称项目名称单机多 GPUGPU状态监控以时间为横轴展示GPU被占用的动态过程,但不显示具体时间单机多 GPUGPU 实时监控服务多卡GPU统一展示,数据简洁清晰多机多 GPU服务器集群监控面板可以同时监控多个服务器上的GPU…...