Java高级 | 【实验四】Springboot 获取前端数据与返回Json数据

隶属文章: Java高级 | (二十二)Java常用类库-CSDN博客

系列文章: Java高级 | 【实验一】Spring Boot安装及测试 最新-CSDN博客

                   Java高级 | 【实验二】Springboot 控制器类+相关注解知识-CSDN博客

                   Java高级 | 【实验三】Springboot 静态资源访问-CSDN博客

目录

一、搭建项目

1.1 创建项目

1.2 创建实体类

1.3 创建控制类

1.4 解决在前后端分离项目中的跨域问题

1.5 主类扫描控制器类

二、Spring Boot接收前端参数方式

2.1 接收非JSON数据

1. 名称一致

①postman工具测试

②通过Axios发送请求

2、名称不一致

①postman工具测试

 ②通过Axios发送请求

3、接收前端传数组参数

①postman工具测试

②通过Axios发送请求

4、接收实体(对象)参数

①postman工具测试

②通过Axios发送请求

5、前端参数与后端方法处理参数不一致的情况(RESTful风格)

①postman工具测试

②通过Axios发送请求

6、通过HttpServletRequest对象获取前端数据

①postman工具测试

②通过Axios发送请求

2.2 接收JSON数据

1、接收单个实体

①postman工具测试

②通过Axios发送请求

2、接收多个实体(一个实体嵌套另外一个实体)

在UserController类中添加add7()请求处理方法

①postman工具测试

②通过Axios发送请求

3、接收多个实体(一个实体嵌套另外一个实体集合)

①postman工具测试

②通过Axios发送请求

4、接收Map集合参数

①postman工具测试

②通过Axios发送请求

三、Spring Boot返回Json数据

3.1 Json简介

3.2 spring boot注解

3.3 实验验证

3.3.1对象转换为json

1、单个实体转换json并返回

①postman工具测试

2、多个实体转换json并返回

①postman工具测试

3、map集合转换json并返回

①postman工具测试

3.3.2字符串转换为json

1、引入依赖

2、编写控制器

3、postman测试

3.3.3封装统一的JSON返回数据结构

1、新建包和相关类

2、控制器类中编写处理自定义返回数据的方法

3、postman测试


在前后端项目交互中,前端传递的数据可以通过HTTP请求发送到后端。

一、搭建项目

1.1 创建项目

说明:如果没有安装Lombok工具,请自行安装。

接下来的部分工程文件目录

1.2 创建实体类

在java包下创建一个名为“pojo”的包。并在该包中创建User和Car类

package pojo;import lombok.Data;
import org.springframework.stereotype.Component;
import java.util.Date;
@Data
@Component
public class User {private Integer id;private String name;private Integer age;private Boolean isMarried;private Date birth;private Car car;
}
package pojo;import lombok.Data;
import org.springframework.stereotype.Component;
@Data
@Component
public class Car {private String name;private Double price;
}

1.3 创建控制类

在java包下创建一个名为“controller”的包。并在该包中创建UserController类。

package controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("users")
@RestController
public class UserController {}

1.4 解决在前后端分离项目中的跨域问题

在controller包中创建一个名为CrossOriginConfig的java类。

通过实现WebMvcConfigurer接口,并重写addCorsMappings(CorsRegistry registry)方法来实现。

1.5 主类扫描控制器类

GetDatafromfrontApplication类中加入注解,使得该类启动时能扫描到我们自己创建的控制器类。

package com.example.getdatafromfront;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
@ComponentScan(basePackages = {"controller"})
@SpringBootApplication
public class GetDatafromfrontApplication {public static void main(String[] args) {SpringApplication.run(GetDatafromfrontApplication.class, args);}
}

二、Spring Boot接收前端参数方式

2.1 接收非JSON数据

@RequestParam主要用于在Spring MVC后台控制层获取参数,它有三个常用参数。

参数名

描述

defaultValue

表示设置默认值

required

表示该参数是否必传

value

值表示接收传入的参数的key

@PathVariable用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出URL模板中的变量作为参数。

1名称一致

前端请求参数的key需和后端控制层处理请求的方法参数名称一致。

在UserController类中添加add1()请求处理方法

说明:spring boot能够接收两个参数:usernamepassword

前端参数名必须为:usernamepassword。

GET和POST请求都支持

前端的get请求格式为:

http://localhost:8080/users/add1?username=xxx&password=xxxxx

postman工具测试

通过Axios发送请求

创建param01.html页面,通过Axios发送请求。

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"/><title>前后端参数传递</title><script src="https://unpkg.com/vue@next"></script><script src="https://unpkg.com/axios/dist/axios.min.js"></script><script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
</head>
<body>
<div id="app"></div><script>const app = {data() {return {username: '王小虎',password: '123456'}},mounted() {axios.get('http://localhost:8080/ users/add1', {params: {username: this.username,password: this.password}}).then(response => {console.log('success', response.data);}).catch(error => {console.log('fail', error.data);});}}Vue.createApp(app).mount('#app')
</script></body>
</html>

2、名称不一致

前端请求参数的key后端控制层处理请求的方法参数 名称不一致

在UserController类中添加add2()请求处理方法,该方法使用@RequestParam注解来解决前后端参数不一致。

package controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("users")
@RestController
public class UserController {@RequestMapping("add1")public void add1(String username, String password) {System.out.println("username=" + username + ", password=" + password);}@RequestMapping("add2")public void add2(@RequestParam("name") String username, @RequestParam("pwd") String password) {System.out.println("username=" + username + ", password=" + password);}
}

该方法对GET和POST请求都支持。

前端请求格式:http://localhost:8080/users/add2?name=xxx&pwd=xxx

postman工具测试

 通过Axios发送请求

创建param02.html页面,通过Axios发送请求。

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"/><title>前后端参数传递</title><script src="https://unpkg.com/vue@next"></script><script src="https://unpkg.com/axios/dist/axios.min.js"></script><script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
</head>
<body>
<div id="app"></div><script>const app = {data() {return {username: '张小三',password: '654321'}},mounted() {axios.get('http://localhost:8080/users/add2', {params: {name: this.username,pwd: this.password}}).then(response => {console.log('success', response.data);}).catch(error => {console.log('fail', error.data);});}}Vue.createApp(app).mount('#app')
</script>
</body>
</html>

3、接收前端传数组参数

在UserController类中添加delete1()请求处理方法。

//处理前端数组参数@DeleteMapping("batch_delete1")public void delete1(@RequestParam(name = "ids") List<Integer> ids) {for (Integer id : ids) {System.out.println(id);}}
postman工具测试

通过Axios发送请求

创建param03.html页面,通过Axios发送请求

<!DOCTYPE html>
<html>
<head><meta charset="utf-8" /><title>前后端参数传递</title><script src="https://unpkg.com/vue@next"></script><script src="https://unpkg.com/axios/dist/axios.min.js"></script><script src="https://unpkg.com/vue@next"></script><script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
</head>
<body>
<div id="app"></div><script>const app = {data() {return {ids: [3, 3, 5]}},mounted() {axios.delete('http://localhost:8080/users/batch_delete1', {params: {ids: this.ids.join(',')}}).then(response => {console.log('success', response.data);}).catch(error => {console.log('fail', error.data);});}}Vue.createApp(app).mount('#app')
</script>
</body>
</html>

4、接收实体(对象)参数

(1)前端请求参数的key需和后端控制层处理请求方法的参数pojo实体类的属性名称一致

在UserController类中添加add3()请求处理方法。

 //把前端数据封装到一个对象中@RequestMapping("add3")public void add3(Car car) {System.out.println(car);}
postman工具测试

通过Axios发送请求

创建param04.html页面,通过Axios发送请求

<!DOCTYPE html>
<html>
<head><meta charset="utf-8" /><title>前后端参数传递</title><script src="https://unpkg.com/vue@next"></script><script src="https://unpkg.com/axios/dist/axios.min.js"></script><script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
</head>
<body>
<div id="app">
</div>
<script>const app = {data() {return {name: '问界M9',price: 550000}},mounted() {axios.get('http://localhost:8080/users/add3', {params: {name: this.name,price: this.price}}).then(response => {console.log('success', response.data);}).catch(error => {console.log('fail', error.data);});}}Vue.createApp(app).mount('#app')
</script>
</body>
</html>

5、前端参数与后端方法处理参数不一致的情况(RESTful风格)

在UserController类中添加add4()请求处理方法。

@RequestMapping("add4/{username}/{pwd}")public void add4(@PathVariable String username, @PathVariable("pwd") String password) {System.out.println("username=" + username + ", password=" + password);}

使用@PathVariable注解将请求URL中的模板变量映射到功能处理方法的参数上,如果模板变量名称和方法的参数名称不同需要在@PathVariable注解上显示的指定映射关系。

postman工具测试

通过Axios发送请求

创建param05.html页面,通过Axios发送请求

<!DOCTYPE html>
<html>
<head><meta charset="utf-8" /><title>前后端参数传递</title><script src="https://unpkg.com/vue@next"></script><script src="https://unpkg.com/axios/dist/axios.min.js"></script><script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
</head>
<body>
<div id="app">前后端参数传递</div>
<script>const app = {data() {return {username: 'Jack',password: '123456'}},mounted() {axios.post(`http://localhost:8080/users/add4/${this.username}/${this.password}`).then(response => {console.log('success', response.data);}).catch(error => {console.log('fail', error.data);});}}Vue.createApp(app).mount('#app')
</script>
</body>
</html>

6、通过HttpServletRequest对象获取前端数据

在UserController类中添加add5()请求处理方法。

 @RequestMapping("add5")public void add5(HttpServletRequest request) {String username = request.getParameter("username");String password = request.getParameter("password");System.out.println("username=" + username + ", password=" + password);}

通过HttpServletRequest对象获取数据,前端请求参数的key需和getParameter(String name)方法传递的参数名称一致

postman工具测试

通过Axios发送请求

创建param06.html页面,通过Axios发送请求.

<!DOCTYPE html>
<html>
<head><meta charset="utf-8" /><title>前后端参数传递</title><script src="https://unpkg.com/vue@next"></script><script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head>
<body>
<div id="app"></div><script>const app = {data() {return {username: '章小花',password: '123456'}},mounted() {axios.post('http://localhost:8080/users/add5', null, {params: {username: this.username,password: this.password}}).then(response => {console.log('success', response.data);}).catch(error => {console.log('fail', error.data);});}}Vue.createApp(app).mount('#app')
</script>
</body>
</html>

2.2 接收JSON数据

 @RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用GET方式提交数据,而是用POST方式进行提交。

在后端的同一个接收方法里,@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。

如果前端通过application/json类型提交JSON格式的数据给后端控制层处理请求的方法,方法的参数必须使用@RequestBody注解进行修饰,才能接收来自前端提交的JSON数据。

1、接收单个实体

在UserController类中添加add6()请求处理方法。

@RequestMapping("add6")public Car add6(@RequestBody Car car){System.out.println(car);return car;}
postman工具测试

通过Axios发送请求

创建param07.html页面,通过Axios发送请求

<!DOCTYPE html>
<html>
<head><meta charset="utf-8" /><title>前后端参数传递</title><script src="https://unpkg.com/vue@next"></script><script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head>
<body>
<div id="app"></div><script>const app = {data() {return {car: {name: '奔驰',price: 20000}}},mounted() {axios.post('http://localhost:8080/users/add6', this.car).then(response => {console.log('success', response.data);}).catch(error => {console.log('fail', error.data);});}}Vue.createApp(app).mount('#app')
</script>
</body>
</html>

2、接收多个实体(一个实体嵌套另外一个实体)

在pojo包下创建Cat实体类,在pojo包下的Person实体类中声明Cat类型的属性

package pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
public class Cat {private Integer id;private String breed;private String name;
}
package pojo;import lombok.Data;
import lombok.ToString;@Data
@ToString
public class Person {private Integer id;private String username;private String password;private Cat cat;
}
在UserController类中添加add7()请求处理方法
@RequestMapping("add7")public Person add7(@RequestBody Person person) {System.out.println(person);return person;}
postman工具测试
{"id": 1,"username": "Jack","password": "123456","cat": {"id": 1,"breed": "波斯","name": "花花"}
}

通过Axios发送请求
<!DOCTYPE html>
<html>
<head><meta charset="utf-8" /><title>前后端参数传递</title><script src="https://unpkg.com/vue@3/dist/vue.global.js"></script><script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head>
<body>
<div id="app"></div><script>const app = {data() {return {user: {id: 1,username: '张三',password: '123456',cat: {id: 1,breed: '波斯',name: '花花'}}}},mounted() {axios.post('http://localhost:8080/users/add7', this.user).then(response => {console.log('success', response.data);}).catch(error => {console.log('fail', error.response.data);});}}Vue.createApp(app).mount('#app')
</script>
</body>
</html>

3、接收多个实体(一个实体嵌套另外一个实体集合)

  • 创建课程实体(Course):在pojo包下创建Course实体类,Student类,一个学生可以选修多门课程。
  • 创建学生实体(Student)
package pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
public class Course {private Integer id;private String courseName;private String lecturer;
}
package pojo;import lombok.Data;
import lombok.ToString;import java.util.List;@Data
@ToString
public class Student {private Integer id;private String username;private List<Course> courses;
}

在UserController类中添加add8()请求处理方法

@RequestMapping("add8")public Student add8(@RequestBody Student student) {System.out.println(student);return student;}
postman工具测试

通过Axios发送请求
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>前后端参数传递</title><!-- 使用单一Vue版本 --><script src="https://unpkg.com/vue@3/dist/vue.global.js"></script><script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head>
<body>
<div id="app"></div><script>const app = {data() {return {student: {id: 1,username: 'tom',courses: [{id: 1,courseName: "Java",lecturer: "李晓洪教授"},{id: 2,courseName: "Python",lecturer: "张晓东讲师"}]}}},mounted() {axios.post('http://localhost:8080/users/add8', this.student).then(response => {console.log('请求成功', response.data);}).catch(error => {console.error('请求失败', error.response?.data || error.message);});}}Vue.createApp(app).mount('#app');
</script>
</body>
</html>

4、接收Map集合参数

在UserController类中添加add9()请求处理方法

@RequestMapping("add9")public Map<String, Object> add9(@RequestBody Map<String, Object> map) {String username = (String) map.get("username");System.out.println("username : " + username);List<Map<String, Object>> courseMapList = (List<Map<String, Object>>) map.get("courses");for (Map<String, Object> courseMap : courseMapList) {Set<Map.Entry<String, Object>> courseSet = courseMap.entrySet();for (Map.Entry<String, Object> entry : courseSet) {String key = entry.getKey();Object value = entry.getValue();System.out.println(key + " : " + value);}}return map;}
postman工具测试

通过Axios发送请求
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>前后端参数传递</title><!-- 使用单一Vue版本 --><script src="https://unpkg.com/vue@3/dist/vue.global.js"></script><script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head>
<body>
<div id="app"></div><script>const app = {data() {return {user: {id: 1,username: 'tom',courses: [{id: 1,courseName: "Java",lecturer: "黄晓明副教授"},{id: 2,courseName: "Python",lecturer: "张晓东教授"},{id: 3,courseName: "数据结构与算法",lecturer: "潘晓婷教授"}]}}},mounted() {axios.post('http://localhost:8080/users/add9', this.user).then(response => {console.log('请求成功', response.data);}).catch(error => {console.error('请求失败', error.response?.data || error.message);});}}Vue.createApp(app).mount('#app');
</script>
</body>
</html>

三、Spring Boot返回Json数据

 通常在项目开发中,接口与接口之间,前后端之间的数据传输都是使用的JSON格式

3.1 Json简介

  • json是一种纯字符数据,不属于编程语言json的语法与js中object的语法几乎一致
  • json数据中的键值对可以使用编程语言中所谓的关键字
  • json的数据可以用花括号{}或中括号[]包裹,对应js中的object和array,例如:
{"name":"admin","age":18}或者["SpringBoot",3.1415,"json"]
  • json数据以键值对形式存在,多个键值对之间用逗号,隔开,但数据结束后,不允许出现没有意义的逗号,键值对的键和值之间用冒号连接,键值对的键部分,必须用双引号包裹,单引号都不行;键值对的值部分,不允许出现函数function,undefined,NaN,但是可以有null

3.2 spring boot注解

@RestController = @controller + @ResponseBody,而@ResponseBody注解的作用就是将返回的数据转换JSON格式。因此在SpringBoot中 使用@RestController 注解即可将返回的数据结构转换成 JSON 格式。

3.3 实验验证

3.3.1对象转换为json

1、单个实体转换json并返回

在UserController类中添加getCourse()请求处理方法。

@RequestMapping("/course")public Course getCourse(){return new Course(1001,"web开发技术","李华教授");}
postman工具测试

2、多个实体转换json并返回

在UserController类中添加getCourseList()请求处理方法。

@RequestMapping("/list")
public List<Course> getCourseList() {List<Course> courseList = new ArrayList<>();Course course1 = new Course(1001, "c程序设计", "黄忠教授");Course course2 = new Course(1002, "Java程序设计", "张菲教授");courseList.add(course1);courseList.add(course2);return courseList;
}
postman工具测试

3、map集合转换json并返回

在UserController类中添加getMap()请求处理方法。

@RequestMapping("/map")public Map<String, Object> getMap() {Map<String, Object> courseMap = new HashMap<>();Course course = new Course(1001, "c程序设计", "黄忠教授");courseMap.put("课程信息", course);courseMap.put("课程学分", 3);courseMap.put("课程性质", "专业选修课");courseMap.put("课程学时", 48);return courseMap;}
postman工具测试

3.3.2字符串转换为json

如何将String类型转换成json格式?

我们知道@Controller如果遇到字符串会去寻找view的路径映射,而@RestController如果遇到字符串就会直接返回字符串。因此,@RestController无法将字符串直接转换成json。

1、引入依赖

这里我们引入fastjso,在pom.xml中加入如下依赖

<!--  引入--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version></dependency>

2、编写控制器

在UserController类中添加getStringToJson()请求处理方法。

 @RequestMapping("/string-json")public String getStringToJson(){String str = "{'result': 'success','msg': '登陆成功'}";JSONObject jsonObject =  JSON.parseObject(str);System.out.println(jsonObject);//提取json部分内容System.out.println(jsonObject.getString("cases"));return jsonObject .toJSONString();}
3、postman测试

3.3.3封装统一的JSON返回数据结构

       在项目开发中,我们不仅需要封装数据,还需要在返回的JSON数据中添加一些其他信息,比如返回状态码code,返回信息msg等,这些信息有助于调用者进行一些简单的逻辑判断。因此,我们需要封装一个统一的JSON返回数据结构。

封装的JSON数据类型的不确定,所以我们在定义统一的JSON结构时,需要利用泛型。

1、新建包和相关类

创建common包和CommonConst、R类

package common;/**
定义Json数据返回的一些常量*/
public class CommonConst {public static final String SUCCESS_RESULT = "获取信息成功";public static final String ERROR_RESULT = "获取信息成功";
}
package common;import lombok.Data;
@Data
public class R<T> {/*** 编码:1成功,0和其它数字为失败*/private Integer code;/*** 信息返回*/private String msg;/*** 信息返回数据*/private T data;public static <T> R<T> success(T object) {R<T> r = new R<T>();r.data = object;r.code = 1;r.msg = CommonConst.SUCCESS_RESULT;return r;}public static <T> R<T> error(String msg) {R r = new R();r.msg = msg;r.code = 0;return r;}
}
2、控制器类中编写处理自定义返回数据的方法

在UserController类中添加getStringToJson()请求处理方法。

 @RequestMapping("/map-json")public R<Map<String, Object>> getMapJson() {Map<String, Object> courseMap = new HashMap<>();Course course = new Course(1001, "c程序设计", "黄忠教授");courseMap.put("课程信息", course);courseMap.put("课程学分", 3);courseMap.put("课程性质", "专业选修课");courseMap.put("课程学时", 48);return R.success(courseMap);}
3、postman测试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/82531.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零打造AI面试系统全栈开发

&#x1f916; AI面试系统开发完整教程 &#x1f4cb; 项目概述 本教程将带你从零开始构建一个完整的AI面试系统&#xff0c;包含前端、后端、AI集成和部署的全流程。 源码地址 技术栈 前端: React TypeScript Vite Vaadin Components后端: Spring Boot Spring Securi…

【硬件】PCIe协议 | 电脑的高速公路

文章目录 PCIe | 外围设备高速互联通道&#xff08;peripheral component interconnect express&#xff09;的核心概念和应用 基础概念 1.1 电脑内的”高速“&#xff0c;连接CPU、显卡、SSD&#xff08;固态硬盘&#xff09;等核心组件&#xff1b;数据传输速度极快&#xff…

【 Redis | 完结篇 缓存优化 】

前言&#xff1a;本节包含常见redis缓存问题&#xff0c;包含缓存一致性问题&#xff0c;缓存雪崩&#xff0c;缓存穿透&#xff0c;缓存击穿问题及其解决方案 1. 缓存一致性 我们先看下目前企业用的最多的缓存模型。缓存的通用模型有三种&#xff1a; 缓存模型解释Cache Asi…

MySQL访问控制与账号管理:原理、技术与最佳实践

MySQL的安全体系建立在精细的访问控制和账号管理机制上。本文基于MySQL 9.3官方文档,深入解析其核心原理、关键技术、实用技巧和行业最佳实践。 一、访问控制核心原理:双重验证机制 连接验证 (Connection Verification) 客户端发起连接时,MySQL依据user_name@host_name组合进…

Go语言爬虫系列教程4:使用正则表达式解析HTML内容

Go语言爬虫系列教程4&#xff1a;使用正则表达式解析HTML内容 正则表达式&#xff08;Regular Expression&#xff0c;简称RegEx&#xff09;是处理文本数据的利器。在网络爬虫中&#xff0c;我们经常需要从HTML页面中提取特定的信息&#xff0c;正则表达式就像一个智能的&quo…

笔记 | docker构建失败

笔记 | docker构建失败 构建报错LOG1 rootThinkPad-FLY:/mnt/e/02-docker/ubunutu-vm# docker build -t ubuntu16.04:v1 . [] Building 714.5s (6/11) docker:default> [internal] load …

CentOS 7.9 安装 宝塔面板

在 CentOS 7.9 上安装 宝塔面板&#xff08;BT Panel&#xff09; 的完整步骤如下&#xff1a; 1. 准备工作 系统要求&#xff1a; CentOS 7.x&#xff08;推荐 7.9&#xff09;内存 ≥ 1GB&#xff08;建议 2GB&#xff09;硬盘 ≥ 20GBroot 权限&#xff08;需使用 root 用户…

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…

【AI News | 20250604】每日AI进展

AI Repos 1、jaaz Jaaz是一款免费开源的AI设计代理&#xff0c;作为Lovart的本地替代品&#xff0c;它能实现图像、海报、故事板的设计、编辑和生成。Jaaz集成了LLM&#xff0c;可智能生成提示并批量生成图像&#xff0c;支持Ollama、Stable Diffusion等本地及API模型。用户可…

Docker load 后镜像名称为空问题的解决方案

在使用 docker load命令从存档文件中加载Docker镜像时&#xff0c;有时会遇到镜像名称为空的情况。这种情况通常是由于在保存镜像时未正确标记镜像名称和标签&#xff0c;或者在加载镜像时出现了意外情况。本文将介绍如何诊断和解决这一问题。 一、问题描述 当使用 docker lo…

SQL进阶之旅 Day 14:数据透视与行列转换技巧

【SQL进阶之旅 Day 14】数据透视与行列转换技巧 开篇 欢迎来到“SQL进阶之旅”系列的第14天&#xff01;今天我们将探讨数据透视与行列转换技巧&#xff0c;这是数据分析和报表生成中的核心技能。无论你是数据库开发工程师、数据分析师还是后端开发人员&#xff0c;行转列或列…

haribote原型系统改进方向

在时钟中断、计时器和键盘输入方面&#xff0c;一些创新性的改进方向&#xff1a; 时钟中断 (PIT / inthandler20) 动态节拍 (Tickless Kernel)&#xff1a;当前的 PIT 中断以固定频率&#xff08;约 100Hz&#xff09;触发&#xff0c;即使系统空闲或没有即将到期的计时器&…

LabVIEW基于 DataSocket从 OPC 服务器读取数据

LabVIEW 中基于 DataSocket 函数从 OPC 服务器读取数据的功能&#xff0c;为工业自动化等场景下的数据交互提供了解决方案。通过特定函数实现 URL 指定、连接建立与管理、数据读取&#xff0c;相比传统 Socket 通信和 RESTful API &#xff0c;在 OPC 服务器数据交互场景有适配…

SimpleDateFormat 和 DateTimeFormatter 的异同

在Java开发中Date类型转String类型是比较常见的&#xff0c;其中最常用的是以下几种方式&#xff1a; 1. 使用SimpleDateFormat&#xff08;Java 8之前&#xff09; import java.text.SimpleDateFormat; import java.util.Date;public class DateToStringExample {public sta…

《前端面试题:CSS对浏览器兼容性》

CSS浏览器兼容性完全指南&#xff1a;从原理到实战 跨浏览器兼容性是前端开发的核心挑战&#xff0c;也是面试中的高频考点。查看所有css属性对各个浏览器兼容网站&#xff1a;https://caniuse.com 一、浏览器兼容性为何如此重要&#xff1f; 在当今多浏览器生态中&#xff0c…

【stm32开发板】单片机最小系统原理图设计

一、批量添加网络标签 可以选择浮动工具中的N&#xff0c;单独为引脚添加网络标签。 当芯片引脚非常多的时候&#xff0c;选中芯片&#xff0c;右键选择扇出网络标签/非连接标识 按住ctrl键即可选中多个引脚 点击将引脚名称填入网络名 就完成了引脚标签的批量添加 二、电源引…

golang连接sm3认证加密(app)

文章目录 环境文档用途详细信息 环境 系统平台&#xff1a;Linux x86-64 Red Hat Enterprise Linux 7 版本&#xff1a;4.5 文档用途 golang连接安全版sm3认证加密数据库,驱动程序详见附件。 详细信息 1.下载Linux golang安装包 go1.17.3.linux-amd64.tar.gz 1.1. 解压安…

node实例应用

打开vscode,创建node项目,直接进入一个干净的文件夹&#xff0c;打开控制台 一 项目初始化 1. 初始化包管理 npm init -y2. 安装express npm install express4.17.1 3. 根目录下创建app.js,引入express // 引入expree const express require(express)// 创建实例 const …

Springboot——整合websocket并根据type区别处理

文章目录 前言架构思想项目结构代码实现依赖引入自定义注解定义具体的处理类定义 TypeAWebSocketHandler定义 TypeBWebSocketHandler 定义路由处理类配置类&#xff0c;绑定point制定前端页面编写测试接口方便跳转进入前端页面 测试验证结语 前言 之前写过一篇类似的博客&…

vscode命令行debug

vscode命令行debug 一般命令行debug会在远程连服务器的时候用上&#xff0c;命令行debug的本质是在执行时暴露一个监听端口&#xff0c;通过进入这个端口&#xff0c;像本地调试一样进行。 这里提供两种方式&#xff1a; 直接在命令行中添加debugpy&#xff0c;适用于python…