了解Spring的统一功能
目录
一、统一数据返回格式
1.引入统一数据返回格式
2.学习使用统一数据返回格式
support方法
beforeBodyWrite方法
统一数据返回格式具体逻辑
使用统一数据返回格式存在的问题
解决方法:
统一数据返回格式的优点
统一数据返回格式代码实现(包含了拦截器):
二、统一异常处理
一、统一数据返回格式
在Spring框架中实现统一数据返回格式是构建规范化API的核心需求,它能让所有接口的响应保持一致的JSON结构,方便前端处理。
1.引入统一数据返回格式
- 添加统一数据返回格式之前:
不同的接口返回的格式不一样,杂乱无章,很混乱,对于前端来说不方便处理(上图只是其中一个接口)。
- 添加统一数据返回格式之后:
可以看到,添加之后, 不同接口的返回数据的格式变得更加规范,方便前端处理。
2.学习使用统一数据返回格式
统一的数据返回格式使用 @ControllerAdvice 和 ResponseBodyAdvice 的方式实现 @ControllerAdvice 表示控制器通知类。添加 ResponseAdvice 来实现 ResponseBodyAdvice 接口,并在类上添加 @ControllerAdvice 注解。
@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {@Overridepublic boolean supports(MethodParameter returnType, Class converterType) {return true;}@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType,
MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest
request, ServerHttpResponse response) {return Result.success(body);}
}
support方法
该方法是判断是否要执行 beforeBodyWrite 方法,true为执行,false不执行,通过该方法可以选择哪些类或哪些方法的response要进行处理,其他的不进行处理。
beforeBodyWrite方法
对响应数据结果进行统一处理
统一数据返回格式具体逻辑
以下面的代码为例:
@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {return Result.SUCCESS(body);}
补充:Result是一个实体类,封装了对应格式的属性(status,message...)以及静态方法,其中SUCCESS就是其中一个静态方法。
当controller的接口方法返回 不同类型的值时,会把该接口方法的返回值作为body参数,然后再调用Result.SUCCESS(body),让该接口方法的返回值被Result.SUCCESS(body)的值替代。总结就是:通过 ResponseBodyAdvice
将 Controller 方法的返回值统一包装为 Result
对象。
- 比如:
当接口返回类型boolean且返回true时,true作为body,然后再调用Result.SUCCESS(body),最后该接口返回值得到了封装后的结果。
使用统一数据返回格式存在的问题
当接口返回值类型为String时,会抛出异常:
异常表示为:Result类型的不能转换为String类型。其中只有返回结果为String类型时才会有这种错误发生。
原因:当接口返回的数据类型是String时,Spring会选择 StringHttpMessageConverter,该转换器只能处理 String 类型的返回值,又因为使用了统一数据返回格式,该接口实际返回的是Result类型的对象,而 StringHttpMessageConverter无法将 Result 对象转换为String,导致抛出异常:“Result cannot be cast to java.lang.String”。
解决方法:
- 可以手动序列化Result对象为JSON字符串,最终返回的是一个String类型的JSON字符串,与控制器中声明的String返回类型兼容。
- 同时我们还可以进行优化:把接口返回值类型为Result的进行单独处理,避免出现嵌套的情况。
@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {ObjectMapper mapper = new ObjectMapper();//supports方法是判断是否要执行beforeBodyWrite方法,true为执行,false不执行@Overridepublic boolean supports(MethodParameter returnType, Class converterType) {return true;}@SneakyThrows@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {//body为其他接口的返回结果//返回结果更加灵活,避免出现嵌套情况if (body instanceof Result){return body;}//如果返回结果为String类型,使用SpringBoot内置提供的Jackson来实现信息的序列化if (body instanceof String){return mapper.writeValueAsString(Result.SUCCESS(body));}//如果返回结果为其他类型,把返回结果作为参数return Result.SUCCESS(body);}
}
统一数据返回格式的优点
- 方便前端程序员能更好的接收和解析后端数据接口返回的数据;
- 降低前端程序员和后端程序员的沟通成本,按照某个格式实现就可以了,因为所有接口都是这样返回的;
- 有利于项目统一数据的维护和修改;
- 有利于后端技术部门的统一规范的标准制定,不会出现奇怪的返回内容。
统一数据返回格式代码实现(包含了拦截器):
- 常量层
public class Constants {public static final String SUCCESS = "SUCCESS";public static final String FAILURE = "FAILURE";
}
- 实现统一功能类:ResponseAdvice
@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {ObjectMapper mapper = new ObjectMapper();//supports方法是判断是否要执行beforeBodyWrite方法,true为执行,false不执行@Overridepublic boolean supports(MethodParameter returnType, Class converterType) {return true;}@SneakyThrows@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {//body为其他接口的返回结果//返回结果更加灵活if (body instanceof Result){return body;}//如果返回结果为String类型,使用SpringBoot内置提供的Jackson来实现信息的序列化if (body instanceof String){return mapper.writeValueAsString(Result.SUCCESS(body));}//如果返回结果为其他类型,把返回结果作为参数return Result.SUCCESS(body);}
}
- 实体层User
@Data
public class User {private String username;private String password;
}
- 实体层Result
@Data
public class Result<T> {private String status;private T message;public static <T>Result<T> SUCCESS(T message) {Result<T> result = new Result<>();result.setStatus(Constants.SUCCESS);result.setMessage(message);return result;}public static <T>Result<T> FAIL(T message) {Result<T> result = new Result<>();result.setStatus(Constants.FAILURE);result.setMessage(message);return result;}
}
- 控制层
@RestController
@RequestMapping("/user")
public class UserController {@AutowiredGetUser getUser;@RequestMapping("/login")public Result login(String username, String password, HttpServletRequest request) {User user = getUser.getUser(username, password);if (user == null) {return Result.FAIL("账号或密码错误");}request.getSession().setAttribute("user", user);return Result.SUCCESS("账号密码正确,登录成功!!");}@RequestMapping("/enter")public String Enter(){return "进入enter成功哈哈";}
}
- Service层
@Service
public class GetUser {public User getUser(String username, String password) {if (username == null || password == null) {return null;}if (!"zhangsan".equals(username) ||!"123".equals(password)) {return null;}User user = new User();user.setUsername("zhangsan");user.setPassword("123");return user;}
}
- 注册拦截器
@Configuration
public class WebConfig implements WebMvcConfigurer {//自定义拦截器对象@Autowiredprivate LoginInterceptor loginInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginInterceptor).addPathPatterns("/**")//排除拦截的页面,登录页.excludePathPatterns("/user/login");}
}
- 定义拦截器
@Slf4j
@Component
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {log.info("拦截开始");HttpSession session = request.getSession();User user = (User) session.getAttribute( "user");if (user == null) {log.info("被拦截");return false;}else {log.info("不拦截,放行");return true;}}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response,Object handler, ModelAndView modelAndView) throws Exception {log.info("enter方法执行后");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {log.info("LoginInterceptor 视图渲染完毕后执⾏,最后执⾏");}
}
二、统一异常处理
统一异常处理使用的是 @ControllerAdvice + @ExceptionHandler 来实现的,@ControllerAdvice 表示控制器通知类,@ExceptionHandler是异常处理器,两个结合表示出现异常的时候执行某个通知,也就是执行某个方法事件。
@ControllerAdvice
@ResponseBody
public class ErrorAdvice {@ExceptionHandlerpublic Object handler(Exception e) {return Result.fail(e.getMessage());}
}
类名,方法名和返回值可以自定义,重要的是注解
使用@ResponseBody 是为了处理返回数据的接口,让返回的结果为序列化的数据(JSON/XML),而不是视图(HTML页面)。
以上代码表示,如果代码出现Exception异常(包括Exception的子类),就返回一个Result的对象,Result对象的设置参考 Result.fail(e.getMessage())。
public static <T>Result<T> FAIL(T message) {Result<T> result = new Result<>();result.setStatus(Constants.FAILURE);result.setMessage(message);return result;}
在统一数据返回格式的代码基础上,我们可以针对不同的异常,返回不同的结果。
@ControllerAdvice
@ResponseBody
public class ErrorAdvice {@ExceptionHandlerpublic Object handler(Exception e) {return Result.FAIL(e.getMessage());}@ExceptionHandlerpublic Object handler(ArithmeticException e) {return Result.FAIL("发生ArithmeticException异常,异常信息:"+e.getMessage());}@ExceptionHandlerpublic Object handler(NullPointerException e) {return Result.FAIL("发生NullPointerException异常:"+e.getMessage());}
}
创建控制类模拟制造异常:
@RestController
@RequestMapping("/test")
public class TestController {@RequestMapping("/t1")public Integer t1(){String a = null;return a.length();}@RequestMapping("/t2")public Integer t2(){int a = 10/0;return a;}
}
运行结果:
当有多个异常通知时,匹配顺序为当前类及其子类向上一次匹配 。
相关文章:
了解Spring的统一功能
目录 一、统一数据返回格式 1.引入统一数据返回格式 2.学习使用统一数据返回格式 support方法 beforeBodyWrite方法 统一数据返回格式具体逻辑 使用统一数据返回格式存在的问题 解决方法: 统一数据返回格式的优点 统一数据返回格式代码实现(包含了…...
123213
根据道路在道路网的地位、交通功能、对沿线的服务功能划分可分为快速路、主干路、次干路及支路 快速路完全为交通功能服务, 主干路以交通功能为主, 次干路是城市区域性的交通干道,为区域交通集散服务,兼有服务功能,结合主干路组成干路网 …...
通过 axios 请求回来的 HTML 字符串渲染到 Vue 界面上并添加样式
1. 通过 axios 获取数据 使用 axios 发起请求,获取返回的 HTML 字符串数据。 2. 在 Vue 中处理和渲染数据 由于 HTML 字符串中可能包含一些标签和样式,直接插入到 Vue 的模板中可能会导致样式问题。可以通过以下方式处理: 方法一…...
P1162 填涂颜色(BFS)
题目描述 由数字 0 组成的方阵中,有一任意形状的由数字 1 构成的闭合圈。现要求把闭合圈内的所有空间都填写成 2。例如:66 的方阵(n6),涂色前和涂色后的方阵如下: 如果从某个 0 出发,只向上下…...
【笔记】VS中C#类库项目引用另一个类库项目的方法
VS中C#类库项目引用另一个类库项目的方法 在 C# 开发中,有时我们需要在一个类库项目中引用另一个类库项目,但另一个项目可能尚未编译成 DLL。在这种情况下,我们仍然可以通过 Visual Studio 提供的项目引用功能进行依赖管理。 🎯 …...
进程内存分布--之smaps呈现memory-layout.cpp内存分布
上一篇介绍了:进程内存分布--之单线程代码来内存分布呈现memory-layout.cpp 这里我们使用smaps将更加形象的的体现内存分布,smaps文件是Linux的proc文件系统提供的一种可以查看内存资源使用情况的方法,Linux系统中运行的库、堆、栈等信息都可在smaps中查…...
再看自适应RAG方法:SEAKR|PIKE-RAG|DeepRAG
当大语言模型开始"怀疑人生":一场关于知识检索的AI内心戏 各位看官,今天我们要聊一个AI界的"哲学难题"——当大语言模型突然意识到自己可能是个"半瓶子醋",会发生什么奇妙反应? 想象一下这个场景:某天深夜,ChatGPT正对着用户提问"如…...
DNS服务(Linux)
DNS 介绍 dns,Domain Name Server,它的作用是将域名解析为 IP 地址,或者将IP地址解析为域名。 这需要运行在三层和四层,也就是说它需要使用 TCP 或 UDP 协议,并且需要绑定端口,53。在使用时先通过 UDP 去…...
探秘PythonJSON解析深度剖析json.loads处理嵌套JSON字符串的奥秘
哈喽,大家好,我是木头左! 在当今数字化时代,数据以各种格式呈现,而JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,在众多领域广泛应用。Python作为一门强大的编程语言,其内置的json模块为处理JSON数据提供了便捷的方法。然而,当遇到像{"name&q…...
Day7 FIFO与鼠标控制
文章目录 1. harib04a例程(获取按键编码)2. harib04b例程(加快中断处理)3. harib04c例程(FIFO缓冲区)4. harib04d例程(改善FIFO缓冲区)5. harib04e例程(整理FIFO缓冲区&a…...
软件工程第一章习题
第1章软件与软件工程 1.选择题 (1)下列说法中正确的是( )o A.20世纪50年代提出了软件工程的概念 B.20世纪60年代提出了软件工程的概念 C.20世纪70年代出现了客户机/服务器技术 D.20世纪80年代软件工程学科达到成熟 (2)软件危机的主要原因是( Do B.软件生产…...
Ollama 手动高速下载Win/Linux/Mac安装包及安装方法
前言 Ollama下载速度太慢,按这个方式,速度嘎嘎的快----下载地址 手动安装 如果要从以前的版本升级,则应删除旧库。比如:sudo rm -rf /usr/lib/ollama 解压 tar -C /usr -xzf ollama-linux-amd64.tgz # 解压到/usr文件夹# 如…...
Jmeter+Jenkins+Ant自动化持续集成环境搭建
一、安装准备 1.JDK:jdk-8u121-windows-x64 2.jmeter工具:apache-jmeter-2.13 3.ANT工具:apache-ant-1.9.7-bin 4.jenkins工具:jenkins-2.32.2 二、软件安装 1.JDK的安装 >双击JDK安装包,选择安装路径(本人是…...
【11】Redis快速安装与Golang实战指南
文章目录 1 Redis 基础与安装部署1.1 Redis 核心特性解析1.2 Docker Compose 快速部署1.3 Redis 本地快速部署 2 Golang 与 Redis 集成实战2.1 环境准备与依赖安装2.2 核心操作与数据结构实践2.2.1 基础键值操作2.2.2 哈希结构存储用户信息 3 生产级应用场景实战3.1 分布式锁实…...
ISP算法.红外图像增强
在图像处理领域,常见的图像处理一般都是白光相机,实际红外相机也是常见的一种相机,它可以用来对发热的东西进行成像,也可以作为白光相机夜晚不可见的一种辅助手段,为白光相机赋能夜视能力。 红外相机的成像原理在于辐射…...
Spring Boot中使用RedisTemplate操作Redis的几种数据类型详解
Redis作为高性能的键值存储系统,在现代Java应用中扮演着重要角色。Spring Boot通过RedisTemplate为开发者提供了便捷的Redis操作方式。本文将详细介绍如何使用RedisTemplate操作Redis的五种主要数据类型。 一、RedisTemplate简介 RedisTemplate是Spring Data Redi…...
大数据与人工智能之大数据架构(Hadoop、Spark、Flink)
一、核心特性与架构设计 1. Hadoop:分布式批处理的基石 核心组件: HDFS:分布式文件系统,支持大规模数据存储。MapReduce:基于“分而治之”的批处理模型,适合离线分析。 架构特点: 批处理主导&…...
VSCode中Marp插件
VSCode神级插件Marp,用Markdown来做PPT 优秀教程:https://zhuanlan.zhihu.com/p/582872955...
C++20 数学常数:<numbers> 头文件的革新
文章目录 一、<numbers> 头文件中的数学常数二、使用示例三、优势与应用场景(一)提高代码可读性(二)提高精度(三)适用于多种数据类型(四)简化数学计算 四、总结 C20 标准引入了…...
OpenCV--图像平滑处理
在数字图像处理领域,图像平滑处理是一项极为重要的技术,广泛应用于计算机视觉、医学影像分析、安防监控等多个领域。在 OpenCV 这一强大的计算机视觉库的助力下,我们能便捷地实现多种图像平滑算法。本文将深入探讨图像平滑的原理,…...
【KMP】P7114 [NOIP2020] 字符串匹配|省选-
本文涉及知识点 较难理解的字符串查找算法KMP P7114 [NOIP2020] 字符串匹配 题目描述 小 C 学习完了字符串匹配的相关内容,现在他正在做一道习题。 对于一个字符串 S S S,题目要求他找到 S S S 的所有具有下列形式的拆分方案数: S A …...
C++20 统一容器擦除:std::erase 和 std::erase_if
文章目录 一、std::erase 的用法1.1 语法1.2 参数1.3 返回值1.4 示例 二、std::erase_if 的用法2.1 语法2.2 参数2.3 返回值2.4 示例 三、优势与应用场景3.1 统一的接口3.2 简化代码3.3 适用范围广 四、总结 C20 引入了两个非常实用的函数模板: std::erase 和 std…...
阿里云oss视频苹果端无法播放问题记录
记录一下苹果端视频不可以播放的原因. 看了一下其他视频可以正常播放,但是今天客户发来的视频无法正常播放.咨询过阿里云售后给出的原因是编码格式过高. 需要调整编码格式为:baseline, 下面记录如何使用ffmpeg修改视频的编码格式. 下载文件(可从官方下载) 配置环境变量(系统变…...
10-MySQL-性能优化思路
1、优化思路 当我们发现了一个慢SQL的问题的时候,需要做性能优化,一般我们是为了提高SQL查询更快,一个查询的流程由下图的各环节组成,每个环节都会消耗时间,要减少消耗时候需要从各个环节都分析一遍。 2 连接配置优化…...
Postman之参数化详解
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 小伙伴们,好久不见呀,今天呢笔者想和大家聊聊postman参数化,在接口测试中,部分参数每次发送请求是唯一的数值&a…...
【c++深入系列】:类和对象详解(下)
🔥 本文专栏:c 🌸作者主页:努力努力再努力wz 💪 今日博客励志语录: 你的人生剧本,不是父母的续集,不是子女的前传,更不是朋友的外传——你是自己故事的主角 ★★★ 本文前…...
浅谈「分词」:原理 + 方案对比 + 最佳实践
在文本搜索、自然语言处理、智能推荐等场景中,「分词」 是一个基础但至关重要的技术点。无论是用数据库做模糊查询,还是构建搜索引擎,分词都是提高效率和准确度的核心手段。 🔍 一、什么是分词? 分词(Tok…...
第十八:GC 垃圾回收
2.1 三色标记# 灰色:对象已被标记,但这个对象包含的子对象未标记黑色:对象已被标记,且这个对象包含的子对象也已标记,gcmarkBits对应的位为1(该对象不会在本次GC中被清理)白色:对象…...
【微机及接口技术】- 第七章 可编程定时/计数器
文章目录 第一节 定时/计数器的概述一、定时与计数二、定时方法 第二节 可编程定时/计数器8254一、8254-2的基本功能二、8254的内部结构和外部引脚三、8254 的工作方式1. 方式0:计数到零产生中断方式2. 方式1:硬件可重触发单稳方式3. 方式2:速…...
MES生产工单管理系统,Java+Vue,含源码与文档,实现生产工单全流程管理,提升制造执行效率与精准度
前言: MES生产工单管理系统是制造业数字化转型的核心工具,通过集成生产、数据、库存等模块,实现全流程数字化管理。以下是对各核心功能的详细解析: 一、生产管理 工单全生命周期管理 创建与派发:根据销售订单或生产计…...
【区块链安全 | 第三十五篇】溢出漏洞
文章目录 溢出上溢示例溢出漏洞溢出示例漏洞代码代码审计1. deposit 函数2. increaseLockTime 函数 攻击代码攻击过程总结修复建议审计思路 溢出 算术溢出(Arithmetic Overflow),简称溢出(Overflow),通常分…...
【自记录】ubuntu命令行下禁用指定声卡
设备上内置了一块声卡,出于某些原因我希望禁用他。 通过arecord -l可以查看到该设备 $ arecord -l **** List of CAPTURE Hardware Devices **** card 0: Device [USB PnP Sound Device], device 0: USB Audio [USB Audio]Subdevices: 1/1Subdevice #0: subdevice…...
设计模式 Day 4:观察者模式(Observer Pattern)深度解析
在经历了前三天的对象创建型设计模式学习之后,今天我们开始进入行为型设计模式的探索之旅。行为型模式聚焦于对象之间的通信机制与协作方式,其中最经典且应用最广泛的就是——观察者模式(Observer Pattern)。本文将用8000字篇幅&a…...
`QTabWidget` 的标签页头设置样式,可以通过在 QSS 文件中定义 `QTabBar::tab` 的样式
要为 QTabWidget 的标签页头设置样式,可以通过在 QSS 文件中定义 QTabBar::tab 的样式来实现。以下是完整的代码示例和 QSS 文件内容,展示如何为标签页头设置背景颜色、文本颜色、悬停效果和选中效果。 ### **代码示例** cpp #include <QApplication…...
低代码开发革命:用 ZKmall开源商城可视化逻辑编排实现业务流程再造
ZKmall开源商城通过可视化逻辑编排引擎与低代码开发范式,重新定义了企业级电商业务流程的构建与优化方式。本文将从技术架构、核心能力、实践案例及行业价值等维度,解析其如何以"低代码流程引擎"组合拳实现业务流程再造的革命性突破。 一、低代…...
CAN外设
目录 1. CAN外设结构 1.1 CAN外设发送流程 1.2 CAN外设接收流程 1.3 发送接受配置位 2. CAN外设过滤器 2.1 过滤器配置 2.2 测试模式 2.3 工作模式 2.4 过滤器对应中断 2.5 错误处理和离线恢复 1. CAN外设结构 以STM32F103为例。以下是它的内部结构框图。 其具体发…...
(七)安卓开发中的状态列表图形(StateListDrawable)详解
在安卓开发中,**状态列表图形(StateListDrawable)**是一种非常实用的资源,它允许开发者根据视图的不同状态(如按下、聚焦、选中等)来动态显示不同的图像或颜色。这种机制在创建交互式用户界面时尤为重要&am…...
2023年蓝桥杯第十四届CC++大学B组真题及代码
目录 1A:日期统计 解析代码_暴力_正解 2B:01串的熵 解析代码_暴力_正解 3C:冶炼金属 解析代码_暴力_正解 4D:飞机降落 解析代码_暴力dfs_正解 5E:接龙数列 解析代码_dp_正解 6F:岛屿个数 解析代…...
odo18实施——销售-仓库-采购-制造-制造外包-整个流程自动化单据功能的演示教程
安装模块 安装销售 、库存、采购、制造模块 2.开启外包功能 在进入制造应用点击 配置—>设置 勾选外包,点击保存 添加信息 一、添加客户信息 点击到销售应用 点击订单—>客户 点击新建 创建客户1,及其他客户相关信息,点…...
c++造轮子之REACTOR实战
本文实现的为单reactor 多线程(base) 非核心库 InetAddress 这个库简单而言 无疑是设置ip地址和端口 class InetAddress { public:struct sockaddr_in addr;socklen_t addr_len;InetAddress();InetAddress(const char* ip, uint16_t port);~InetAddress(); };具体而言: Ine…...
【Easylive】Elasticsearch搜索组件详解
【Easylive】项目常见问题解答(自用&持续更新中…) 汇总版 一、Elasticsearch基础介绍 Elasticsearch(简称ES)是一个分布式、RESTful风格的搜索和分析引擎,基于Apache Lucene构建。在视频平台中,它主要用于: 全…...
基于AT89C51单片机的加减乘除液晶计算机设计
点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/90574816?spm1001.2014.3001.5503 功能介绍: 可进行最高四位数的加减乘除运算,除法运算保留小数点后四位;4*4矩阵按键输入&…...
先进制造aps专题三十三 开源aps产品,frepple和dream对比分析
开源的两个aps产品,frepple和dream对比分析 frepple开源的基本不能用,第一它甘特图没开源,而且甘特图不允许你手工个修改,你想把它当成手工甘特图用也不行,第二,算法强制倒排,很少企业是倒排 …...
Vue3.2 项目打包成 Electron 桌面应用
本文将详细介绍如何将基于 Vue3.2 的项目打包成 Electron 桌面应用。通过结合 Electron 和 Vue CLI 工具链,可以轻松实现跨平台桌面应用的开发与发布。 1. 项目结构说明 项目主要分为以下几个部分: electron/main.js:Electron 主进程文件。…...
第16届蓝桥杯单片机模拟试题Ⅰ
试题 代码 sys.h #ifndef __SYS_H__ #define __SYS_H__#include <STC15F2K60S2.H> //onewire.c float getT(); //sys.c extern unsigned char UI; extern bit touch_mode; extern float jiaozhun; extern float canshu; extern float temper; void init74hc138(unsigned…...
ES:geoip_databases
如何查看 .geoip_databases 的内容 在Elasticsearch中,.geoip_databases 是一个特殊的索引,用于存储GeoIP数据库文件。这些文件通常用于地理信息的丰富(GeoIP enrichment)。以下是如何查看和管理这些数据库文件的方法:…...
企业级开发SpringBoost玩转Elasticsearch
案例 Spring Boot 提供了 spring-data-elasticsearch 模块,可以方便地集成 Elasticsearch。 下面我们将详细讲解如何在 Spring Boot 中使用 Elasticsearch 8,并提供示例代码。 1. 添加依赖: 首先,需要在 pom.xml 文件中添加 spring-data-e…...
边缘计算网关作用
一、数据采集与预处理 边缘计算网关作为物联网系统的“数据入口”,能够连接各种传感器和设备,实时采集数据。在数据传输到云端之前,它会对数据进行清洗、过滤和聚合,剔除重复、无效或冗余的信息,只将有价值的数据上传…...
利用本地 Express Web 服务解决复杂的 Electron 通信链路的问题
背景 Web 服务对前端同学来说并不陌生,你们开发其他前端界面请求的后端接口就是 Web 服务,你们 npm run dev启动的也是一个本地的 Web 服务,前端的 js,html,css 都有从这个服务上拉取到的资源。 我们在开发 Electron…...
《自然-计算科学》诚邀您投稿计算社会科学研究(computational social science)
李升伟 编译 近年来,运用计算方法和工具来深化对社会科学长期议题理解的"计算社会科学"发展迅猛。这一增长主要得益于社交媒体数据、移动通信数据、数字化图书与历史档案、医疗记录等海量数据的涌现,这些资源不仅为验证现有社会科学理论提供了…...