当前位置: 首页 > news >正文

《SpringBoot+Vue》Chapter04 SpringBoot整合Web开发

返回JSON数据

默认实现

依赖

 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>

在springboot web依赖中加入了jackson-databind作为JSON处理器

创建一个实体类对象

public class Book {private String name;private String author;@JsonIgnoreprivate Float price;@JsonFormat(pattern = "yyyy-MM-dd")private Date publicationDate;
}

创建BookController

@Controller
public class BookController {@GetMapping("/book")@ResponseBodypublic Book book() {Book book = new Book("bookName", "bookAuthor", 100f, new Date());return book;}
}

自定义Json转换器

Gson

Gson是google的一个开源JSON解析框架。使用Gson,需要加入Gson依赖,并去除默认的jackson-databind

 <dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId>
</dependency>

SpringBoot中默认提供了Gson自动转换,因此Gson的依赖添加后,就可以直接使用Gson。但是在Gson进行转换时,如果想对日期数据进行格式化。需要开发者自定义HttpMessageConverter自定义HttpMessageConverter

 @BeanGsonHttpMessageConverter gsonHttpMessageConverter() {GsonHttpMessageConverter converter = new GsonHttpMessageConverter();GsonBuilder gsonBuilder = new GsonBuilder();//设置时间格式gsonBuilder.setDateFormat("yyyy-MM-dd");//设置gson解析时遇到protected修饰的字段被过滤掉gsonBuilder.excludeFieldsWithModifiers(Modifier.PROTECTED);Gson gson = gsonBuilder.create();converter.setGson(gson);return converter;}
fastjson

fastjson是阿里巴巴的一个开源JSON解析框架。是目前最快的JSON解析框架

静态资源访问

默认策略

SpringBoot中对于SpringMVC的自动化配置都在WebMvcAutoConfiguration类
SpringBoot默认会过滤所有的静态资源、而静态资源的位置一共有5个:

  • classpath:/META-INF/resources
  • classpath:/resources/
  • classpath:/static/
  • classpath:/public/
  • /


    资源文件优先级

自定义策略

在配置文件中定义
spring.mvc.static-path-pattern=/static/**
spring.web.resources.static-locations=classpath:/static/
  • 过滤规则为/static/** 静态资源位置为classpath:/static/
Java编码定义
public class MyWebMvcConfig implements WebMvcConfigurer{@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry){registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/")
}
}

文件上传

单文件上传

首先创建一个SpringBoot项目并添加spring-boot-starter-web依赖
在resources目录下的static目录创建一个upload.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data"><input type="file" name="uploadFile" value="选择文件"><input type="submit" value="上传">
</form>
</body>
</html>

创建文件上传接口

 @PostMapping("/upload")public String upload(MultipartFile uploadFile, HttpServletRequest req) {String realPath = req.getSession().getServletContext().getRealPath("/uploadFile");String format = sdf.format(new Date());File folder = new File(realPath + format);if (!folder.isDirectory()) {folder.mkdirs();}String oldName = uploadFile.getOriginalFilename();String newName = UUID.randomUUID().toString() + oldName.substring(oldName.lastIndexOf("."), oldName.length());try {uploadFile.transferTo(new File(folder, newName));String filePath = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + "/uploadFile/" + format + newName;return filePath;} catch (IOException e) {e.printStackTrace();}return "上传失败";}

@ControllerAdvice

全局异常处理

@ControllerAdvice最常见的使用场景就是全局异常处理

@ControllerAdvice
public class CustomExceptionHandler {@ExceptionHandler(MaxUploadSizeExceededException.class)public void uploadException(MaxUploadSizeExceededException maxUploadSizeExceededException,HttpServletResponse resp){resp.setContentType("text/html;charset=utf-8");PrintWriter writer = null;try {writer = resp.getWriter();writer.write("超出文件大小限制");writer.flush();writer.close();} catch (IOException e) {throw new RuntimeException(e);}}
}

当系统启动时,标记@ControllerAdvice就会被扫描到Spring容器中,然后在方法上添加@ExceptionHandler注解,其中定义的MaxUploadSizeExceededException.class表明该方法用来处理MaxUploadSizeExceededExceptioon类型的异常。

添加全局数据

@ControllerAdvice是一个全局数据处理组件。可以在@ControllerAdvice中使用@ModelAttribute注解配置全局数据

@ControllerAdvice
public class GlobalConfig {@ModelAttribute(value = "info")public Map<String,String> userInfo() {HashMap<String, String> map = new HashMap<>();map.put("username", "lgz");map.put("gender", "男");return map;}
}
  • 在全局配置中添加userInfo方法,返回map,该方法有一个注解@ModelAttribute,其中的value属性表示这条返回数据的key,而方法的返回值是返回数据的value
  • 在任意请求的Controller中,通过Model参数可以获取map数据

请求参数预处理

@ControllerAdvice结合@InitBinder能实现请求参数预处理,即将表单中的数据绑定到实体类上时进行一些额外处理
例如有两个实体类Book和Author

public class Book {private String name;private String author;
//.....getter/setter
}
public class Author {private String name;private int age;
//......getter/setter
}

Controller

@RestController
public class InitBinderController {@GetMapping("/book")public String book(Book book, Author author) {return book.toString() + ">>>" + author.toString();}
}

这样在传递参数时,两个实体类中的name就会容易混淆。@ControllerAdvice结合@InitBinder可以顺利解决该问题

@RestController
public class InitBinderController {@GetMapping("/book")public String book(@ModelAttribute("a") Book book,@ModelAttribute("b") Author author) {return book.toString() + ">>>" + author.toString();}
}

配置@ControllerAdvice

  @InitBinder("a")public void init(WebDataBinder binder) {binder.setFieldDefaultPrefix("b.");}@InitBinder("b")public void init2(WebDataBinder binder) {binder.setFieldDefaultPrefix("a.");}
  • @InitBinder("b")表示该方法是处理@ModelAttribute("b")对应的参数的,第二个@InitBinder("a")表示该方法是处理@ModelAttribute("a")对应的参数的

然后在浏览器中访问:http://localhost:8080/book?b.name=bname&b.author=bauthor&a.name=aname&a.age=aAge即可成功地区分出name属性

  • WebDataBinder对象中,还可以设置允许的字段、禁止的字段、必填字段以及验证器等

自定义错误页

@ControllerAdvice可以处理应用级别的异常,有一些容器级别的错误就处理不了。
在SpringBoot中,默认情况下,404、500等会有统一的处理页面。
SpringBoot在返回错误信息时不一定返回HTML页面,而是根据实际情况返回HTML页面或者一段JSON
SpringBoot中的错误默认是由BasicErrorContoller类来处理的

@RequestMapping(produces = MediaType.TEXT_HTML_VALUE)public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) {HttpStatus status = getStatus(request);Map<String, Object> model = Collections.unmodifiableMap(getErrorAttributes(request, getErrorAttributeOptions(request, MediaType.TEXT_HTML)));response.setStatus(status.value());ModelAndView modelAndView = resolveErrorView(request, response, status, model);return (modelAndView != null) ? modelAndView : new ModelAndView("error", model);}@RequestMappingpublic ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {HttpStatus status = getStatus(request);if (status == HttpStatus.NO_CONTENT) {return new ResponseEntity<>(status);}Map<String, Object> body = getErrorAttributes(request, getErrorAttributeOptions(request, MediaType.ALL));return new ResponseEntity<>(body, status);}

errorHtml方法用来返回错误HTML页面,error用来返回错误JSON
DefaultErrorViewResolver是SpringBoot中默认的错误信息视图解析器,SpringBooot默认是在error目录下查找4xx、5xx的文件作为错误视图,找不到时会回到errorHtml中,然后使用error作为默认的错误页面视图名,如果error的视图也找不到,用户就会看到默认的错误提示页面

简单配置

如果想自定义错误页面,只需要提供4xx、5xx的页面即可。
如果不需要向用户展示详细的错误信息,可以把错误信息定义成静态页面,直接在resources/static目录下创建error目录,然后在error目录中创建错误展示页面,错误展示页面的命名规则有:

  • 4xx.html、5xx.html
  • 404.html、405.html、500.html
    此时当用户访问一个不存在的网站时,就会展示404.html中的内容
  • 动态页面
    如果采用视图模板技术,先添加依赖,然后在templates目录下创建error目录,然后创建错误展示页


    error目录

CORS支持

CORS:是一种跨域资源共享技术标准,目的就是为了解决前端的跨域请求。CORS支持多种HTTP请求
定义一个Controller

@RestController
@RequestMapping("/book")
public class BookController {@PostMapping("/")public String addBook(String bookName) {return "receive" + bookName;}@DeleteMapping("{id}")public String delBook(@PathVariable("id") Long id) {return String.valueOf("id");}
}

配置跨域

跨域有两个配置地方,

  • 一个是直接在相应的请求方法上加注解
@RestController
@RequestMapping("/book")
public class BookController {@PostMapping("/")@CrossOrigin(value = "http://localhost:8081",maxAge = 1800,allowedHeaders = "*")public String addBook(String bookName) {return "receive" + bookName;}@DeleteMapping("{id}")@CrossOrigin(value = "http://localhost:8081",maxAge = 1800,allowedHeaders = "*")public String delBook(@PathVariable("id") Long id) {return String.valueOf("id");}
}
  • @CrossOrigin中的value表示支持的域,这段代码中表示来自http://localhost:8081域的请求是支持跨域
  • maxAge表示探测请求的有效期 单位是秒
  • allowedHeaders表示允许的请求头,*表示所有请求头都被允许

使用全局配置 创建配置类Config

@Configuration
public class MyWebMvcConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/book/**").allowedHeaders("*").allowedMethods("*").maxAge(1800).allowedOrigins("http://localhost:8081");}
}

配置类与XML配置

SpringBoot的配置类需要添加@Configuration注解,@ComponentScan注解会扫描所有的Spring组件。也包括@Configuration

注册拦截器

创建拦截器实现HanlderInterceptor接口

public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandler>>>>");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandler>>>>");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afterCompletion>>>>");}
}

拦截器中的方法将按照

preHandle->Controller->postHandle->afterCompletion
  • 只有preHandle方法返回true时后面的方法才会执行,
  • 当拦截器内存在多个拦截器时postHandler在拦截器内的所有拦截器返回成功时才会调用
  • afterCompletion只有preHandler返回true才调用
  • 若拦截器内的第一个拦截器的preHandle返回false,则后面的方法都不执行
    配置拦截器
@Configuration
public class MyWebMvcConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/book/**").allowedHeaders("*").allowedMethods("*").maxAge(1800).allowedOrigins("http://localhost:8081");}@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").excludePathPatterns("/hello");}
}

启动系统任务

有一些特殊的任务需要在系统启动时执行,配置文件加载,数据库初始化等操作。SpringBoot对此提供了两种解决方案 CommandLineRunner 和 ApplicationRunner

CommandLineRunner

SpringBoot项目在启动时会遍历所有CommandLineRunner的实现类并调用其中的run方法,如果有多个实现类,那么可以使用@Order注解对这些实现类的调用顺序进行排序

@Component
@Order(1)
public class MyCommandLineRunner implements CommandLineRunner {@Overridepublic void run(String... args) throws Exception {System.out.println("first runner"+ Arrays.toString(args));}
}
@Component
@Order(2)
public class MyCommandLineRunner2 implements CommandLineRunner {@Overridepublic void run(String... args) throws Exception {System.out.println("second runner"+ Arrays.toString(args));}
}
  • @Order(1)注解用来描述CommandLineRunner的执行顺序,数字越小越先执行
  • run方法中是调用的核心逻辑,参数是系统启动时传入的参数

ApplicationRunner

ApplicationRunner和CommandLineRunner基本一致,区别主要体现在run方法的参数上

整合Servlet、Filter和Listener

  • @WebServlet标记HttpServlet
  • @WebListener标记Listener
  • @WebFilter标记Filter
  • 在项目入口类上添加@ServletComponentScan注解,实现对Servlet、Filter以及Listener的扫描

路径映射

在使用页面模板后,用户需要通过Controller才能访问页面,一些页面需要在控制器中加载数据,然后渲染,才能显示出来。还有一些页面在控制器中不需要加载数据,只是完成简单的跳转。对于这种页面,可以直接配置路径映射,提高访问速度

 @Overridepublic void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/login").setViewName("login");registry.addViewController("/index").setViewName("index");}

配置AOP

AOP中的概念

AOP中的概念

SpringBoot支持

SpringBoot在Spring的基础上对AOP的配置提供了自动化配置解决方案:spring-boot-starter-aop,使开发者能够更加便捷地在SpringBoot项目中使用AOP

  • 添加AOP依赖
 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>
  • 创建一个测试的业务Service类
@Service
public class UserService {public String getUserById(Integer id) {System.out.println("getUserById = " + id);return "user";}public void deleteUserById(Integer id) {System.out.println("deleteUserById"+ id);}
}
  • 创建切面
@Component
@Aspect
public class LogAspect {@Pointcut("execution(* com.probuing.springbootcros.service.*.* (..))")public void pc1() {}@Before(value = "pc1()")public void before(JoinPoint jp) {String name = jp.getSignature().getName();System.out.println(name + "方法开始执行");}@After(value = "pc1()")public void after(JoinPoint jp) {String name = jp.getSignature().getName();System.out.println(name + "方法执行结束");}@AfterReturning(value = "pc1()", returning = "result")public void afterRunning(JoinPoint jp, Object result) {String name = jp.getSignature().getName();System.out.println(name + "方法返回值为" + result);}@AfterThrowing(value = "pc1()", throwing = "e")public void afterThrowing(JoinPoint jp, Exception e) {String name = jp.getSignature().getName();System.out.println(name + "方法异常了" + e.getMessage());}@Around(value = "pc1()")public Object around(ProceedingJoinPoint pjp) throws Throwable {return pjp.proceed();}}
  • @Aspect表明这是一个切面类
  • @Pointcut 是切入点的定义,execution中的第一个表示方法返回任意值,第二个表示方法返回任意值,第二个* 表示service包下的任意类,第三个*表示类中的任意方法。括号中的两个点表示方法参数任意。这里的切点表达式表示切入点为service包下所有类中的所有方法
  • @Before表示这是一个前置哦通知,该方法在目标方法执行之前执行,通过JoinPoint参数可以获取目标方法的方法名,修饰符
  • @After表示这是一个后置通知,该方法在目标方法执行之后执行
  • @AfterReturning注解,表示这是一个返回通知,在该方法中可以获取目标方法的返回值。@AfterReturning注解的returning参数是指返回值的变量名,对应方法的参数。
  • @AfterThrowing,表示这是一个异常通知,即当目标方法发生异常时,该方法会被调用,异常类型为Exception表示所有的异常都会进入该方法中执行
  • @Around,表示这是一个环绕通知,环绕通知是所有通知里最强大的通知,可以实现前置通知、后置通知、异常通知以及返回通知的功能 目标方法进入环绕通知后,通过调用ProceedingJoinPoint对象的proceed方法使目标方法继续执行,开发者可以在此修改目标方法的执行参数、返回值等,并且可以在此处理目标方法的异常

其他设置

自定义欢迎页

SpringBoot项目在启动后,首先会去静态资源路径下查找index.html作为首页文件,若查找不到,则会去查找动态的index文件作为首页
如果使用静态的index.html作为项目首页,那么只需要在resources/static目录下创建index.html。如果使用动态页面作为项目首页则需要在resources/templates目录下创建index.html,然后在Controller中返回逻辑视图名。

自定义favicon

favicon.ico是浏览器选项卡左上角的图标,可以放在静态资源路径下或者类的路径下,静态资源路径下的favicon.ico优先级高于favicon.co
将图标文件复制到/resources/static 目录下



喜欢的朋友记得点赞、收藏、关注哦!!!

相关文章:

《SpringBoot+Vue》Chapter04 SpringBoot整合Web开发

返回JSON数据 默认实现 依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>在springboot web依赖中加入了jackson-databind作为JSON处理器 创建一个实体类对象…...

腾讯地图异步调用

<template><!-- 定义地图显示容器 --><div id"container"></div> </template><script setup>import { onMounted } from vue;const mapKeys import.meta.env.VITE_GLOB_TX_MAP_KEYS;function initMap() {// //定义地图中心点坐…...

通过docker overlay2 目录名查找占用磁盘空间最大的容器名和容器ID

有时候经常会有个别容器占用磁盘空间特别大&#xff0c; 这个时候就需要通过docker overlay2 目录名查找占用磁盘空间最大的容器名和容器ID&#xff1a; 1、 首先进入到 /var/lib/docker/overlay2 目录下,查看谁占用的较多 [rootPPS-97-8-ALI-HD1H overlay2]# cd /var/lib/doc…...

每周算法:有向图强连通分量

题目链接 受欢迎的牛 题目描述 每头奶牛都梦想成为牛棚里的明星。被所有奶牛喜欢的奶牛就是一头明星奶牛。所有奶牛都是自恋狂&#xff0c;每头奶牛总是喜欢自己的。奶牛之间的“喜欢”是可以传递的——如果 A A A 喜欢 B B B&#xff0c; B B B 喜欢 C C C&#xff0c;那…...

Python习题 053:在逻辑值检测时会被认为是真值的是?

...

基于RackNerd + CentOS 7 64 Bit + aaPanel 的那些事

本文涉及以下几个站点&#xff1a; RackNerd - Introducing Infrastructure Stability NameSilo - https://www.namesilo.com/ aaPanel - https://www.aapanel.com/ 遇到错误 Cannot find a valid baseurl for repo: base/7/x86_64 解决办法 一、切换 yum源 首先可以去…...

大数据期末复习——hadoop、hive等基础知识

一、题型分析 1、Hadoop环境搭建 2、hadoop的三大组件 HDFS&#xff1a;NameNode&#xff0c;DataNode&#xff0c;SecondaryNameNode YARN&#xff1a;ResourceManager&#xff0c;NodeManager &#xff08;Yarn的工作原理&#xff09; MapReduce&#xff1a;Map&#xff0…...

什么是客户体验自动化?

客户体验自动化是近年来在企业界备受关注的一个概念。那么&#xff0c;究竟什么是客户体验自动化呢&#xff1f;本文将为您详细解析这一话题&#xff0c;帮助您更好地理解并应用客户体验自动化。 我们要先明确什么是客户体验。客户体验是指客户在使用产品或服务过程中的感受和体…...

高效除氟:探索CH-87up树脂在氟化工废水处理中的应用

摘要 本研究旨在评估Tulsimer CH-87up树脂针对经钙镁预处理后的氟化工废水的深度处理效果。实验结果显示&#xff0c;CH-87up树脂能显著降低废水中的氟离子浓度&#xff0c;从43.4mg/L降至0.34mg/L&#xff0c;远低于行业排放标准的5mg/L。此外&#xff0c;该树脂表现出卓越的…...

【Git】LFS

什么是lfs Git 是分布式 版本控制系统&#xff0c;这意味着在克隆过程中会将仓库的整个历史记录传输到客户端。对于包涵大文件&#xff08;尤其是经常被修改的大文件&#xff09;的项目&#xff0c;初始克隆需要大量时间&#xff0c;因为客户端会下载每个文件的每个版本**。Gi…...

隐式转换的魔法:Scala中隐式转换的深度解析

隐式转换的魔法&#xff1a;Scala中隐式转换的深度解析 在Scala编程语言的丰富特性中&#xff0c;隐式转换是一个强大而微妙的工具。它允许开发者在不改变现有代码的情况下&#xff0c;扩展或修改类的行为。本文将深入探讨Scala中隐式转换的工作原理&#xff0c;并通过详细的代…...

外贸企业选择什么网络?

随着全球化的深入发展&#xff0c;越来越多的国内企业将市场拓展到海外。为了确保外贸业务的顺利进行&#xff0c;企业需要建立一个稳定、安全且高速的网络。那么&#xff0c;外贸企业应该选择哪种网络呢&#xff1f;本文将为您详细介绍。 外贸企业应选择什么网络&#xff1f; …...

Redis 7.x 系列【14】数据类型之流(Stream)

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 常用命令2.1 XADD2.2 XRANGE2.3 XREVRANGE2.4 XDEL2.5 XLEN2.6 XREAD2.7 XG…...

(四)opengl函数加载和错误处理

#include <glad/glad.h>//glad必须在glfw头文件之前包含 #include <GLFW/glfw3.h> #include <iostream>void frameBufferSizeCallbakc(GLFWwindow* window, int width, int height) {glViewport(0, 0, width, height);std::cout << width << &qu…...

RuoYi-Vue3不启动后端服务如何登陆?

RuoYi-Vue3不启动后端服务如何登陆?RuoYi-Vue3使用的前端技术栈 是:Vue3 + Element Plus + Vite。 github开源地址:https://github.com/yangzongzhuan/RuoYi-Vue3 前后的分离在线演示项目地址:https://vue.ruoyi.vip/ 这种方式是用若依提供的在线后端接口,可以在此基础上修…...

Typora(跨平台 Markdown 编辑器 )正版值得购买吗

Typora 是一款桌面 Markdown 编辑器&#xff0c;作为国人开发的优秀软件&#xff0c;一直深受用户的喜爱。 实时预览格式 Typora 是一款适配 Windows / macOS / Linux 平台的 Markdown 编辑器&#xff0c;编辑实时预览标记格式&#xff0c;所见即所得&#xff0c;轻巧而强大…...

springboot个人证书管理系统-计算机毕业设计源码16679

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了个人证书管理系统的开发全过程。通过分析个人证书管理系统管理的不足&#xff0c;创建了一个计算机管理个人证书管理系统的方案。文章介绍了个人证书管理系统的系…...

读-改-写操作

1 什么是读-改-写操作 “读-改-写”&#xff08;Read-Modify-Write&#xff0c;简称RMW&#xff09;是一种常见的操作模式&#xff0c;它通常用于需要更新数据的场景。 这个模式包含三个基本步骤&#xff1a; 1.读&#xff08;Read&#xff09;&#xff1a;首先读取当前的数据…...

海外仓系统应用教程:解决了小型海外仓哪些问题

大型海外仓通过对海外仓WMS系统的使用&#xff0c;大大提升了业务流程的效率和利润率。这也给很多小型海外仓造成了误区&#xff0c;觉得海外仓系统就是为大型海外仓设计的。其实小型海外仓对海外仓系统的需求同样强烈&#xff0c;现在也有很多专门转对中小型海外仓设计的WMS系…...

shell 脚本编程

简介&#xff1a; 用户通过shell向计算机发送指令的计算机通过shell给用户返回指令的执行结果 通过shell编程可以达到的效果 提高工作效率可以实现自动化 需要学习的内容&#xff1a; linuxshell的语法规范 编写shell的流程 第一步&#xff1a;用vi/vim创建一个.sh的文件…...

gin参数验证

一. 结构体验证 用gin框架的数据验证&#xff0c;可以不用解析数据&#xff0c;减少if else。如下面的代码&#xff0c;如果需要增加判断条件&#xff0c;就需要增加if或者if else。 type MyApi struct {a intb string }func checkMyApi(val *MyApi) bool {if val.a 0 {retur…...

【web3】分享一个web入门学习平台-HackQuest

前言 一直想进入web3行业&#xff0c;但是没有什么途径&#xff0c;偶然在电鸭平台看到HackQuest的共学营&#xff0c;发现真的不错&#xff0c;并且还接触到了黑客松这种形式。 链接地址&#xff1a;HackQuest 平台功能 学习路径&#xff1a;平台有完整的学习路径&#xff…...

Sectigo或RapidSSL DV通配符SSL证书哪个性价比更高?

在当前的网络安全领域&#xff0c;选择一款合适的SSL证书对于保护网站和用户数据至关重要。Sectigo和RapidSSL作为市场上知名的SSL证书提供商&#xff0c;以其高性价比和快速的服务响应而受到市场的青睐。本文将对Sectigo和RapidSSL DV通配符证书进行深入对比&#xff0c;帮助用…...

金蝶云星空字段之间连续触发值更新

文章目录 金蝶云星空字段之间连续触发值更新场景说明具体需求&#xff1a;解决方案 金蝶云星空字段之间连续触发值更新 场景说明 字段A配置了字段B的计算公式&#xff0c;字段B配置了自动C的计算公式&#xff0c;修改A的时候&#xff0c;触发了B的重算&#xff0c;但是C触发不…...

Python 获取字典中的值(八种方法)

Python 字典(dictionary)是一种可变容器模型&#xff0c;可以存储任意数量的任意类型的数据。字典通常用于存储键值对&#xff0c;每个元素由一个键&#xff08;key&#xff09;和一个值(value&#xff09;组成&#xff0c;键和值之间用冒号分隔。 以下是 Python 字典取值的几…...

Day49

Day49 代理模式proxy 概念&#xff1a; 代理(Proxy)是一种设计模式&#xff0c;提供了对目标对象另外的访问方式&#xff0c;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能. 代理模式分为静态代理和动态代理…...

OpenCV 车牌检测

OpenCV 车牌检测 级联分类器算法流程车牌检测相关链接 级联分类器 假设我们需要识别汽车图像中车牌的位置&#xff0c;利用深度学习目标检测技术可以采取基于锚框的模型&#xff0c;但这需要在大量图像上训练模型。 但是&#xff0c;级联分类器可以作为预训练文件直接使用&…...

机器学习/pytorch笔记:time2vec

1 概念部分 对于给定的标量时间概念 t&#xff0c;Time2Vec 的表示 t2v(t)是一个大小为 k1的向量&#xff0c;定义如下&#xff1a; 其中&#xff0c;t2v(t)[i]是 t2v(t)的第 i 个元素&#xff0c;F是一个周期性激活函数&#xff0c;ω和 ϕ是可学习的参数。 以下是个人理解&am…...

降低开关电源噪声的设计总结

开关电源的特征就是产生强电磁噪声&#xff0c;若不加严格控制&#xff0c;将产生极大的干扰。下面介绍的技术有助于降低开关电源噪声&#xff0c;能用于高灵敏度的模拟电路。 电路和器件的选择 一个关键点是保持dv/dt和di/dt在较低水平&#xff0c;有许多电路通过减小dv/dt和…...

rust嵌入式开发2024

老的rust embedded book 其实过时了. 正确的姿势是embassy 入手. 先说下以前rust写嵌入怎么教学小白的. 第一步,从这里 svd2rust 工具,自己生成库第二部,有了这个库,相当于就有了pac外设访问文件,然后其实就可以搞起来了. 那么为啥不好搞了. 因为太乱了. 小白喜欢你告我咋弄…...