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

仿论坛项目--初识Spring Boot

1. 技术准备

技术架构

• Spring Boot
• Spring、Spring MVC、MyBatis
• Redis、Kafka、Elasticsearch
• Spring Security、Spring Actuator

开发环境

• 构建工具:Apache Maven
• 集成开发工具:IntelliJ IDEA
• 数据库:MySQL、Redis
• 应用服务器:Apache Tomcat
• 版本控制工具:Git
在这里插入图片描述

2. 搭建开发环境

Apache Maven
• 可以帮助我们构建项目、管理项目中的jar包
• Maven仓库:存放构件的位置

  • 本地仓库:默认是 ~/.m2/repository
  • 远程仓库:中央仓库、镜像仓库、私服仓库
    • 示例:安装、配置、常用命令
    http://maven.apache.org
    安装配置版本:apache-maven-3.6.1-bin.zip

改成阿里云的镜像仓库
在conf文件夹下修改settings.html

<mirror><id>alimaven</id><mirrorOf>central</mirrorOf><name>aliyun maven</name><url>https://maven.aliyun.com/repository/central</url>
</mirror>

配置好后在系统环境变量path上新建一条
E:\work\apache-maven-3.6.1-bin\apache-maven-3.6.1\bin

输入命令行:mvn -version 出现以下信息就是安装成功了。(首先要配置好JDK)
在这里插入图片描述

IntelliJ IDEA
• 目前最流行的Java集成开发工具
• 示例:安装、配置、创建项目
http://www.jetbrains.com/idea

Spring Initializr
• 创建 Spring Boot 项目的引导工具
• 示例:创建“论坛社区”项目
https://start.spring.io

Spring Boot 入门示例
• Spring Boot 核心作用

  • 起步依赖、自动配置、端点监控
    • 示例
  • 一个简单的处理客户端请求案例

@ResponseBody 是一个在 Spring 框架中常用的注解,主要用于 Web 层的控制器(Controller)方法上。它的主要功能是将方法的返回值直接写入 HTTP 响应的主体(Body)部分,而不是使用视图解析器(ViewResolver)生成视图。这意味着,当一个控制器方法被标注了 @ResponseBody,Spring 会将该方法的返回值转换成适合 HTTP 响应的内容类型,通常是 JSON 或 XML。

以下是 @ResponseBody 注解的一些关键点:

自动序列化:当方法的返回值是一个 Java 对象时,@ResponseBody 会使用一个合适的 HttpMessageConverter(如 MappingJackson2HttpMessageConverter 或 Jaxb2RootElementHttpMessageConverter)来将对象序列化为 JSON 或 XML 格式,具体取决于客户端请求头中的 Accept 字段或默认配置。避免视图渲染:在没有 @ResponseBody 的情况下,控制器方法的返回值通常会被视为视图名,然后通过视图解析器找到对应的视图模板进行渲染。但是,使用 @ResponseBody 后,这个流程被绕过,直接返回数据。支持多种数据类型:@ResponseBody 支持返回各种类型的数据,包括原始字符串、字节数组、基本数据类型、Java 对象等。对于非对象类型的简单数据,可以直接写入响应体;对于复杂对象,会进行序列化处理。AJAX 和 RESTful API:@ResponseBody 经常用于构建 AJAX 应用程序或 RESTful 服务,因为这些场景通常不需要完整的 HTML 页面作为响应,而是需要数据。

示例代码:

java

@RestController // 或者 @Controller + @ResponseBody 在类级别

public class MyController {

@GetMapping("/data")@ResponseBody // 也可以省略,因为类级别有 @RestControllerpublic MyData getData() {MyData data = new MyData();data.setValue("Hello, World!");return data;}

}

在这个示例中,getData() 方法的返回值 MyData 会被序列化成 JSON 格式(假设客户端请求接受 JSON),并直接写入 HTTP 响应的 Body 部分。

需要注意的是,@ResponseBody 通常与 @RestController 或 @Controller 结合使用,后者会应用于整个控制器类,意味着类中的所有方法都会默认使用 @ResponseBody 行为。如果某个方法不希望有这样的行为,可以在方法级别使用 @ModelAttribute 或直接返回一个 ModelAndView 对象。

3.Spring入门

Spring全家桶
• Spring Framework
• Spring Boot
• Spring Cloud
• Spring Cloud Data Flow
https://spring.io
在这里插入图片描述
Spring Framework
• Spring Core

  • IoC、AOP
    • Spring Data Access
  • Transactions、Spring MyBatis
    • Web Servlet
  • Spring MVC
    • Integration
  • Email、Scheduling、AMQP、Security

Spring IoC
• Inversion of Control

  • 控制反转,是一种面向对象编程的设计思想。
    • Dependency Injection
  • 依赖注入,是IoC思想的实现方式。
    • IoC Container
  • IoC容器,是实现依赖注入的关键,本质上是一个工厂。
    在这里插入图片描述
    Spring框架的IOC(Inversion of Control,控制反转)容器是其核心特性之一,它负责管理应用程序的组件和它们之间的依赖关系。IOC容器简化了组件的配置和管理,使得开发人员能够更专注于业务逻辑而非底层基础设施。

1. 控制反转 (Inversion of Control)

在传统的编程模式中,对象会主动地去创建依赖的实例或者从某个地方获取所需的实例,这种模式下,对象控制着依赖的创建和获取过程。而在控制反转中,这种控制权被“反转”了,对象不再控制依赖的创建和获取,而是由一个外部的容器(在Spring中就是IOC容器)来负责。对象只需要声明它所需要的依赖,剩下的工作都交给IOC容器来完成。

2. Spring的IOC容器

Spring框架提供了两种主要的IOC容器:

  • BeanFactory:这是最基本的IOC容器,它实现了BeanFactory接口。BeanFactory负责读取配置元数据,创建和管理bean以及处理bean之间的依赖注入。然而,BeanFactory并不提供按需加载和单例缓存等功能,这使得它在实际应用中不如ApplicationContext强大和方便。

  • ApplicationContext:这是一个高级的BeanFactory,它继承了BeanFactory的功能,并添加了更多的特性,比如国际化支持、事件发布机制、资源访问机制等。ApplicationContext是Spring推荐使用的容器,因为它提供了更多的企业级功能。

3. Bean的生命周期

在Spring中,bean的生命周期由容器控制。从bean的创建到销毁,Spring提供了多个回调方法,让开发者可以自定义bean的初始化和销毁逻辑。例如,你可以指定一个方法作为初始化方法,在bean创建完成后立即调用;同样,也可以指定一个销毁方法,在容器关闭时调用。

4. 依赖注入 (Dependency Injection)

依赖注入是IOC的一个重要实现方式,它允许在运行时将依赖关系注入到对象中,而不是在编译时就确定。Spring支持三种依赖注入方式:

  • 构造器注入:依赖通过构造函数传入。
  • 属性注入:依赖通过setter方法设置。
  • 字段注入:依赖直接注入到字段中,通常使用@Autowired注解。

5. 配置元数据

Spring的配置元数据可以通过XML文件、注解或Java配置类来提供。这些元数据描述了bean的定义、依赖关系以及配置信息,IOC容器会读取这些元数据来创建和装配bean。

Spring的IOC容器通过控制反转和依赖注入,使得应用程序的结构更加松耦合,提高了代码的可测试性和可维护性。

@EnableAutoConfiguration:自动配置,不用人工配置也能够启动服务
@ComponentScan:自动扫描,自动装配bean(扫描配置所在的包以及子包的bean)。还要有@controller和@service注解,@repository,@component才会被扫描

4.Spring MVC入门

HTTP

• HyperText Transfer Protocol
• 用于传输HTML等内容的应用层协议
• 规定了浏览器和服务器之间如何通信,以及通信时的数据格式。
https://www.ietf.org
https://developer.mozilla.org/zh-CN
在这里插入图片描述HTTP请求是客户端(通常是浏览器)向服务器发送的一种请求,以获取或操作资源。HTTP请求有两种主要类型:GET和POST。

GET请求:用于从服务器检索信息。信息在URL中可见,且有长度限制。GET请求可以被缓存,保留在浏览历史中,并在浏览器的"后退"按钮中保留。

POST请求:用于向服务器发送数据,通常用于表单提交。数据在请求体中发送,不显示在URL中,且没有长度限制。POST请求不会被缓存,也不会保留在浏览器的历史记录中。

三层架构(面试)

  • 表现层、业务层、数据访问层
    • MVC

  • Model:模型层

  • View:视图层

  • Controller:控制层
    • 核心组件

  • 前端控制器:DispatcherServlet
    在这里插入图片描述MVC,全称为Model-View-Controller,是一种广泛使用的软件架构模式,主要用于开发易于维护和修改的用户界面。MVC将应用程序分为三个核心组成部分:

    Model(模型):模型负责管理应用程序的数据逻辑,以及对数据的存储、读取和更新等操作。它是应用程序的核心,独立于任何用户界面。模型直接与数据打交道,当数据发生变化时,它会通知视图和控制器。

    View(视图):视图负责展示模型中的数据给用户,它是用户看到并交互的界面。视图从模型获取数据,然后以某种形式展示出来。当模型数据改变时,视图也会自动更新。

    Controller(控制器):控制器是模型和视图之间的协调者,它接收用户的输入并调用模型和视图去完成用户的需求。控制器处理用户请求,控制应用程序的流程,并决定使用哪个视图来展示数据。

MVC模式的主要优点包括:

提高了代码的复用性和可维护性。
分离了关注点,使得每个部分都专注于其核心功能,简化了开发和测试。
支持多个视图共享同一模型,使得数据可以在不同的界面展示。
控制器可以处理来自不同视图的请求,提高了程序的灵活性。

DispatcherServlet是Spring MVC框架中的核心组件,它扮演着前端控制器的角色。在Spring MVC架构中,所有的HTTP请求首先都会被转发到DispatcherServlet。它的主要职责包括:

初始化上下文:加载配置文件,初始化HandlerMapping、HandlerAdapter、ViewResolver等组件。请求分发:接收HTTP请求,通过HandlerMapping找到合适的处理器(Controller中的方法),并将其与请求映射起来。处理请求:调用相应的处理器处理请求。处理器处理完请求后,返回一个ModelAndView对象,其中包含了要渲染的视图名和模型数据。解析视图:通过ViewResolver找到具体的视图组件,将ModelAndView中的模型数据填充到视图中,生成最终的响应结果。生成响应:将视图渲染的结果返回给客户端。

DispatcherServlet的工作流程如下:

客户端发送HTTP请求到服务器,请求会被转发到DispatcherServlet。
DispatcherServlet根据请求的URL找到对应的HandlerMapping,从而确定处理该请求的Controller和方法。
DispatcherServlet调用HandlerAdapter执行Controller的方法。
Controller处理完请求后,返回一个ModelAndView对象给DispatcherServlet。
DispatcherServlet使用ViewResolver找到具体的视图组件,并将ModelAndView中的数据填充到视图中。
最终,视图渲染的结果被DispatcherServlet包装成HTTP响应,返回给客户端。

通过DispatcherServlet,Spring MVC能够很好地实现MVC模式,将业务逻辑、数据处理和视图渲染分离,提高代码的可读性和可维护性。
在这里插入图片描述
Thymeleaf
• 模板引擎

  • 生成动态的HTML。
    • Thymeleaf
  • 倡导自然模板,即以HTML文件为模板。
    • 常用语法
  • 标准表达式、判断与循环、模板的布局。
    https://www.thymeleaf.org
    在这里插入图片描述

相关代码:

package com.nowcoder.community.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.text.SimpleDateFormat;

@Configuration
public class AlphaConfig {

@Bean
public SimpleDateFormat simpleDateFormat() {return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
}

}

package com.nowcoder.community.controller;

import com.nowcoder.community.service.AlphaService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.*;

@Controller
@RequestMapping(“/alpha”)
public class AlphaController {

@Autowired
private AlphaService alphaService;@RequestMapping("/hello")
@ResponseBody
public String sayHello() {return "Hello Spring Boot.";
}@RequestMapping("/data")
@ResponseBody
public String getData() {return alphaService.find();
}@RequestMapping("/http")
public void http(HttpServletRequest request, HttpServletResponse response) {// 获取请求数据System.out.println(request.getMethod());System.out.println(request.getServletPath());Enumeration<String> enumeration = request.getHeaderNames();while (enumeration.hasMoreElements()) {String name = enumeration.nextElement();String value = request.getHeader(name);System.out.println(name + ": " + value);}System.out.println(request.getParameter("code"));// 返回响应数据response.setContentType("text/html;charset=utf-8");try (PrintWriter writer = response.getWriter();) {writer.write("<h1></h1>");} catch (IOException e) {e.printStackTrace();}
}// GET请求// /students?current=1&limit=20
@RequestMapping(path = "/students", method = RequestMethod.GET)
@ResponseBody
public String getStudents(@RequestParam(name = "current", required = false, defaultValue = "1") int current,@RequestParam(name = "limit", required = false, defaultValue = "10") int limit) {System.out.println(current);System.out.println(limit);return "some students";
}// /student/123
@RequestMapping(path = "/student/{id}", method = RequestMethod.GET)
@ResponseBody
public String getStudent(@PathVariable("id") int id) {System.out.println(id);return "a student";
}// POST请求
@RequestMapping(path = "/student", method = RequestMethod.POST)
@ResponseBody
public String saveStudent(String name, int age) {System.out.println(name);System.out.println(age);return "success";
}// 响应HTML数据@RequestMapping(path = "/teacher", method = RequestMethod.GET)
public ModelAndView getTeacher() {ModelAndView mav = new ModelAndView();mav.addObject("name", "张三");mav.addObject("age", 30);mav.setViewName("/demo/view");return mav;
}@RequestMapping(path = "/school", method = RequestMethod.GET)
public String getSchool(Model model) {model.addAttribute("name", "北京大学");model.addAttribute("age", 80);return "/demo/view";
}// 响应JSON数据(异步请求)
// Java对象 -> JSON字符串 -> JS对象

异步请求是一种在网络编程和Web开发中常见的技术,它允许在不阻塞主线程的情况下发送HTTP请求并处理响应。与同步请求相比,异步请求不会暂停程序的执行等待响应,而是继续执行后续的代码,直到响应到达后再处理结果。这种非阻塞的特性对于提高用户体验和程序响应速度至关重要,特别是在处理耗时的网络操作时。

异步请求的优点

提高应用性能:异步请求可以让应用在等待网络响应的同时执行其他任务,避免了长时间的等待导致的UI冻结或程序卡顿。改善用户体验:在Web应用中,用户可以继续与页面交互,即使某些数据正在后台加载。资源高效利用:异步处理可以更有效地利用系统资源,避免线程在等待I/O操作时处于空闲状态。@RequestMapping(path = "/emp", method = RequestMethod.GET)
@ResponseBody
public Map<String, Object> getEmp() {Map<String, Object> emp = new HashMap<>();emp.put("name", "张三");emp.put("age", 23);emp.put("salary", 8000.00);return emp;
}@RequestMapping(path = "/emps", method = RequestMethod.GET)
@ResponseBody
public List<Map<String, Object>> getEmps() {List<Map<String, Object>> list = new ArrayList<>();Map<String, Object> emp = new HashMap<>();emp.put("name", "张三");emp.put("age", 23);emp.put("salary", 8000.00);list.add(emp);emp = new HashMap<>();emp.put("name", "李四");emp.put("age", 24);emp.put("salary", 9000.00);list.add(emp);emp = new HashMap<>();emp.put("name", "王五");emp.put("age", 25);emp.put("salary", 10000.00);list.add(emp);return list;
}

}

package com.nowcoder.community.dao;

import org.springframework.stereotype.Repository;

@Repository(“alphaHibernate”)
public class AlphaDaoHibernateImpl implements AlphaDao {
@Override
public String select() {
return “Hibernate”;
}
}

package com.nowcoder.community.dao;

import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Repository;

@Repository
@Primary
public class AlphaDaoMyBatisImpl implements AlphaDao{
@Override
public String select() {
return “MyBatis”;
}
}

package com.nowcoder.community.service;

import com.nowcoder.community.dao.AlphaDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

@Service
//@Scope(“prototype”)
public class AlphaService {

@Autowired
private AlphaDao alphaDao;public AlphaService() {System.out.println("实例化AlphaService");
}@PostConstruct
public void init() {System.out.println("初始化AlphaService");
}@PreDestroy
public void destroy() {System.out.println("销毁AlphaService");
}public String find() {return alphaDao.select();
}

}

package com.nowcoder.community;

import com.nowcoder.community.dao.AlphaDao;
import com.nowcoder.community.service.AlphaService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;

import java.text.SimpleDateFormat;
import java.util.Date;

@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = CommunityApplication.class)
public class CommunityApplicationTests implements ApplicationContextAware {

private ApplicationContext applicationContext;@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;
}@Test
public void testApplicationContext() {System.out.println(applicationContext);AlphaDao alphaDao = applicationContext.getBean(AlphaDao.class);System.out.println(alphaDao.select());alphaDao = applicationContext.getBean("alphaHibernate", AlphaDao.class);System.out.println(alphaDao.select());
}@Test
public void testBeanManagement() {AlphaService alphaService = applicationContext.getBean(AlphaService.class);System.out.println(alphaService);alphaService = applicationContext.getBean(AlphaService.class);System.out.println(alphaService);
}@Test
public void testBeanConfig() {SimpleDateFormat simpleDateFormat =applicationContext.getBean(SimpleDateFormat.class);System.out.println(simpleDateFormat.format(new Date()));
}@Autowired
@Qualifier("alphaHibernate")
private AlphaDao alphaDao;@Autowired
private AlphaService alphaService;@Autowired
private SimpleDateFormat simpleDateFormat;@Test
public void testDI() {System.out.println(alphaDao);System.out.println(alphaService);System.out.println(simpleDateFormat);
}

}

增加学生
<form method="post" action="/community/alpha/student"><p>姓名: <input type="text" name="name"></p><p>年龄: <input type="text" name="age"></p><p><input type="submit" value="保存"></p>
</form>
Teacher

application
ServerProperties
server.port=8080
server.servlet.context-path=/community

ThymeleafProperties
spring.thymeleaf.cache=false

MyBatis入门

安装数据库
• 安装MySQL Server
• 安装MySQL Workbench
https://dev.mysql.com/downloads/mysql
https://dev.mysql.com/downloads/workbench

下载解压后,添加my.ini文件
在这里插入图片描述
[mysql]
default-character-set=utf8
[mysqld]
port=3306
basedir=E:\work\mysql-8.0.38-winx64\mysql-8.0.38-winx64(修改为MySQL的路径)
max_connections=20
character-set-server=utf8
default-storage-engine=INNODB

然后在系统变量path里配置环境变量
E:\work\mysql-8.0.38-winx64\mysql-8.0.38-winx64\bin

以管理员身份运行cmd
cd E:\work\mysql-8.0.38-winx64\mysql-8.0.38-winx64\bin

mysqld --initialize --console(保存好数据库密码password!!!)
A temporary password is generated for root@localhost: ixNM&0%99Crt
mysqld --install

在这里插入图片描述在这里插入图片描述得在管理员身份运行才能建表成功
MySQL服务启动失败,检查是否是端口号冲突!!!!

MyBatis

• 核心组件

  • SqlSessionFactory:用于创建SqlSession的工厂类。
  • SqlSession:MyBatis的核心组件,用于向数据库执行SQL。
  • 主配置文件:XML配置文件,可以对MyBatis的底层行为做出详细的配置。
  • Mapper接口:就是DAO接口,在MyBatis中习惯性的称之为Mapper。
  • Mapper映射器:用于编写SQL,并将SQL和实体类映射的组件,采用XML、注解均可实现。
    • 示例
  • 使用MyBatis对用户表进行CRUD操作。
    http://www.mybatis.org/mybatis-3
    http://www.mybatis.org/spring

到maven repository官网搜索MySQL复制依赖

com.mysql mysql-connector-j 8.0.33

继续搜索mybatis

org.mybatis.spring.boot mybatis-spring-boot-starter 3.0.3

package com.nowcoder.community;

import com.nowcoder.community.dao.UserMapper;
import com.nowcoder.community.entity.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.Date;

@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = CommunityApplication.class)
public class MapperTests {

@Autowired
private UserMapper userMapper;@Test
public void testSelectUser() {User user = userMapper.selectById(101);System.out.println(user);user = userMapper.selectByName("liubei");System.out.println(user);user = userMapper.selectByEmail("nowcoder101@sina.com");System.out.println(user);
}@Test
public void testInsertUser() {User user = new User();user.setUsername("test");user.setPassword("123456");user.setSalt("abc");user.setEmail("test@qq.com");user.setHeaderUrl("http://www.nowcoder.com/101.png");user.setCreateTime(new Date());int rows = userMapper.insertUser(user);System.out.println(rows);System.out.println(user.getId());
}@Test
public void updateUser() {int rows = userMapper.updateStatus(150, 1);System.out.println(rows);rows = userMapper.updateHeader(150, "http://www.nowcoder.com/102.png");System.out.println(rows);rows = userMapper.updatePassword(150, "hello");System.out.println(rows);
}

}

application
#ServerProperties
server.port=8080
server.servlet.context-path=/community

#ThymeleafProperties
spring.thymeleaf.cache=false

#DataSourceProperties
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/community?characterEncoding=utf-8&useSSL=false&serverTimezone=Hongkong
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.maximum-pool-size=15
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.idle-timeout=30000

#MybatisProperties
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.nowcoder.community.entity
mybatis.configuration.useGeneratedKeys=true
mybatis.configuration.mapUnderscoreToCamelCase=true

#logger
logging.level.com.nowcoder.community=debug

user-mapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<sql id="insertFields">username, password, salt, email, type, status, activation_code, header_url, create_time
</sql><sql id="selectFields">id, username, password, salt, email, type, status, activation_code, header_url, create_time
</sql><select id="selectById" resultType="User">select <include refid="selectFields"></include>from userwhere id = #{id}
</select><select id="selectByName" resultType="User">select <include refid="selectFields"></include>from userwhere username = #{username}
</select><select id="selectByEmail" resultType="User">select <include refid="selectFields"></include>from userwhere email = #{email}
</select><insert id="insertUser" parameterType="User" keyProperty="id">insert into user (<include refid="insertFields"></include>)values(#{username}, #{password}, #{salt}, #{email}, #{type}, #{status}, #{activationCode}, #{headerUrl}, #{createTime})
</insert><update id="updateStatus">update user set status = #{status} where id = #{id}
</update><update id="updateHeader">update user set header_url = #{headerUrl} where id = #{id}
</update><update id="updatePassword">update user set password = #{password} where id = #{id}
</update>

相关文章:

仿论坛项目--初识Spring Boot

1. 技术准备 技术架构 • Spring Boot • Spring、Spring MVC、MyBatis • Redis、Kafka、Elasticsearch • Spring Security、Spring Actuator 开发环境 • 构建工具&#xff1a;Apache Maven • 集成开发工具&#xff1a;IntelliJ IDEA • 数据库&#xff1a;MySQL、Redi…...

Spring boot 更改启动LOGO

在resources目录下创建banner.txt文件&#xff0c;然后编辑对应的图案即可 注释工具 Spring Boot Version: ${spring-boot.version},-.___,---.__ /|\ __,---,___,- \ -.____,- | -.____,- // -., | ~\ /~ | …...

python变成几个小程序

专家系统 需要建立‘capital_data.txt’ 空文件 from tkinter import Tk, simpledialog, messageboxdef read_from_file():with open(capital_data.txt) as file:for line in file:line line.rstrip(\n)country, city line.split(/)the_world[country] citydef write_to_fi…...

nginx配置stream代理

项目中遇到某些服务在内网&#xff0c;需要外网访问的情况&#xff0c;需要配置代理访问。可用nginx搭建代理服务。 TCP代理 通过nginx的stream模块可以直接代理TCP服务&#xff0c;步骤如下&#xff1a; 在/etc/nginx/下新建proxy文件夹&#xff0c;用于存放代理配置。此处…...

【瑞吉外卖 | day01】项目介绍+后台登录退出功能

文章目录 瑞吉外卖 — day011. 所需知识2. 软件开发整体介绍2.1 软件开发流程2.2 角色分工2.3 软件环境 3. 瑞吉外卖项目介绍3.1 项目介绍3.2 产品原型展示3.3 技术选型3.4 功能架构3.5 角色 4. 开发环境搭建4.1 数据库环境搭建4.2 Maven项目构建 5. 后台系统登录功能5.1 创建需…...

关于批量采集1688商品主图及链接的方式:软件采集/1688官方API接口数据采集

关于批量采集&#xff0c;我们通常用到的是软件 采集&#xff0c;或者通过1688官方API数据采集的形式&#xff1a;用户输入一组1688商品ID&#xff0c;一行一个&#xff0c;流程会自动逐个打开对应的1688商品详情页&#xff0c;采集主图的所有链接。 结果保存为表格的一行&…...

Shell 获取Hive表的location 信息

用shell 获取建表语句&#xff1a; hive -e "show create table ods_job.ods_job_tb"得到结果&#xff1a; CREATE TABLE ods_job.ods_job_tb(id bigint COMMENT id, auto int COMMENT job开启/关闭&#xff1a;0-关闭&#xff1b;1-开启, ....timeout_kill string…...

从零搭建教育管理系统:Java + Vue.js 教学-02

第三步:创建实体类和 Mapper 接口 现在我们已经设计好了数据库表,接下来使用 MyBatis-Plus 将这些表映射到 Java 对象,以便在代码中轻松地进行操作。 1. 创建实体类 在 src/main/java/<your_package>/entity 目录下 (如果没有该目录,请手动创建),创建与数据库表对应…...

VSCode + GDB + J-Link 单片机程序调试实践

VSCode GDB J-Link 单片机程序调试实践 本文介绍如何创建VSCode的调试配置&#xff0c;如何控制调试过程&#xff0c;如何查看修改各种变量。 安装调试插件 在 VSCode 扩展窗口搜索安装 Cortex-Debug插件 创建调试配置 在 Run and Debug 窗口点击 create a launch.json …...

grpc学习golang版( 五、多proto文件示例 )

系列文章目录 第一章 grpc基本概念与安装 第二章 grpc入门示例 第三章 proto文件数据类型 第四章 多服务示例 第五章 多proto文件示例 第六章 服务器流式传输 第七章 客户端流式传输 第八章 双向流示例 文章目录 一、前言二、定义proto文件2.1 公共proto文件2.2 语音唤醒proto文…...

LeetCode 106 从中序与后序遍历序列构造二叉树

根据中序遍历和后序遍历的性质&#xff0c;还原二叉树&#xff0c;详细见注释 TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {//空&#xff0c;直接返回nullif(inorder.size() 0) return nullptr;//一个&#xff0c;返回一个nod…...

Vue Router的深度解析

引言 在现代Web应用开发中&#xff0c;客户端路由已成为实现流畅用户体验的关键技术。与传统的服务器端路由不同&#xff0c;客户端路由通过JavaScript在浏览器中控制页面内容的更新&#xff0c;避免了页面的全量刷新。Vue Router作为Vue.js官方的路由解决方案&#xff0c;以其…...

YOLO-V2

一、V2版本细节升级 1、YOLO-V2&#xff1a; 更快&#xff01;更强 1.1 做的改进内容 1. YOLO-V2-Batch Normalization V2版本舍弃Dropout&#xff0c;卷积后每一层全部加入Batch Normalization网络的每一层的输入都做了归一化&#xff0c;收敛相对更容易经过Batch Norma…...

pmp考试的通过标准是什么?

PMP考试的是否通过并不是依据类似其他考试的数值成绩&#xff0c;是通过考生收到邮件通知后去主动查询具体的页面得知的。查询页除了电子证书的下载方式&#xff0c;还有成绩报告单的选项以及成绩饼状图&#xff0c;具体如下&#xff1a; 页面中显示“PASS”表示考试通过。 显…...

不懂PyQt5垂直布局?只需3分钟即可学会

PyQt5中实现垂直布局&#xff0c;主要使用QVBoxLayout类。该布局管理器将子控件垂直排列&#xff0c;并可以根据需要自动调整大小。使用QVBoxLayout可以方便地构建从上到下排列的界面元素。 import sys from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget, QPus…...

从零开始实现大语言模型(二):文本数据处理

1. 前言 神经网络不能直接处理自然语言文本&#xff0c;文本数据处理的核心是做tokenization&#xff0c;将自然语言文本分割成一系列tokens。 本文介绍tokenization的基本原理&#xff0c;OpenAI的GPT系列大语言模型使用的tokenization方法——字节对编码(BPE, byte pair en…...

生物分子生物学实验过程的自动化与智能监控系统设计

开题报告&#xff1a;生物分子生物学实验过程的自动化与智能监控系统设计 一、引言 随着生物科学技术的飞速发展&#xff0c;生物分子生物学实验在科研、医疗、农业等领域的应用日益广泛。然而&#xff0c;传统的生物分子生物学实验过程大多依赖于人工操作&#xff0c;存在操…...

linux的shell脚本编程详解

Shell 脚本是一种用于自动化任务的脚本语言&#xff0c;在 Linux 和其他类 Unix 操作系统中非常流行。它通常用于任务自动化、系统管理和批处理。编写 Shell 脚本并使其自动化编译过程&#xff08;例如使用 gcc 编译 C/C 程序&#xff09;是一种常见的任务。 以下是一个详细的…...

Redis 7.x 系列【11】数据类型之位图(Bitmap)

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 基本命令2.1 SETBIT2.2 GETBIT2.3 BITCOUNT2.4 BITPOS2.5 BITFIELD2.6 BITF…...

如何评定旅游卡的品质与服务?

评定旅游卡的品质与服务&#xff0c;可以从以下几个关键方面进行综合考量&#xff1a; 公司实力与资质&#xff1a;选择有实力、资质齐全的公司发行的旅游卡。查看公司背景&#xff0c;确认其是否长期稳定运营&#xff0c;是否具有旅游行业的专业资质&#xff0c;如旅行社许可证…...

适合学生暑假适用的护眼大路灯有哪些?五款好用护眼灯分享!

在护眼领域&#xff0c;护眼大路灯已经成为越来越多人的选择。这种具备实力的工具可以有效地缓解用眼疲劳、改善光线环境&#xff0c;是学生党和办公族的必备神器。然而&#xff0c;市面上的护眼大路灯品牌众多&#xff0c;如何选择一款性价比高、品质优良的产品呢&#xff1f;…...

linux服务器 部署jenkins

在 Linux 服务器上部署 Jenkins 通常包括以下几个步骤&#xff1a; 更新系统软件包&#xff1a; sudo apt update sudo apt upgrade 安装 Java&#xff1a; Jenkins 需要 Java 运行时环境。推荐使用 OpenJDK 11。 sudo apt install openjdk-11-jdk 添加 Jenkins 软件源并导入…...

电商控价:系统监测的必要性与优势

在品牌的发展进程中&#xff0c;会遭遇各种各样的渠道问题&#xff0c;控价乃是其中颇为关键的一环。品牌进行控价的目的无疑是为了妥善治理低价链接&#xff0c;低价链接的发现途径可以是人工&#xff0c;也可以是系统。力维网络在为上百个品牌提供服务的过程中察觉到&#xf…...

港股下半年能恢复上涨趋势吗?

今日港股两大指数涨跌不一&#xff0c;早盘盘初恒指冲高&#xff0c;涨幅一度扩大至1%。截至收盘&#xff0c;香港恒生指数涨0.57%。板块方面&#xff0c;电力、航空、石油、内险股、燃料电池、环保等板块涨幅居前&#xff1b;互动媒体与服务、生物科技、汽车零部件、新经济概念…...

软件测试项目实战:银行贷款业务测试介绍-2

1、利息计算 正常利息贷款本金*借款天数*贷款年利率/360 罚息逾期本金*逾期天数*逾期年利率/360 复利逾期利息*逾期天数*逾期年利率/360 2、贷款五级分类 正常贷款&#xff1a;正常及逾期60天以内 关注贷款&#xff1a;逾期60天及以上&#xff0c;不足90天 次级贷款&#xff1…...

如何将Hive表的分区字段插入PG表对应的时间戳字段?

文章目录 1、背景描述2、场景分析 1、背景描述 数据仓库的建设通常是为业务和决策服务的。在数仓开发的应用层阶段&#xff0c;BI可以直接从主题层/业务层取数&#xff0c;而前端需要根据具体的作图需求通过后端查询数据库 作图的指标需要根据主题层/业务层做查询计算&#xf…...

Spring Boot与MyBatis的集成应用

Spring Boot与MyBatis的集成应用 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来聊聊Spring Boot与MyBatis的集成应用。MyBatis是一款优秀的持久层框…...

在昇腾服务器上使用llama-factory对baichuan2-13b模型进行lora微调

什么是lora微调 LoRA 提出在预训练模型的参数矩阵上添加低秩分解矩阵来近似每层的参数更新&#xff0c;从而减少适配下游任务所需要训练的参数。 环境准备 这次使用到的微调框架是llama-factory。这个框架集成了对多种模型进行各种训练的代码&#xff0c;少量修改就可使用。 …...

Kafka 管理TCP连接

生产者管理TCP连接 Kafka生产者程序概览 Kafka的Java生产者API主要的对象就是KafkaProducer。通常我们开发一个生产者的步骤有4步&#xff1a; 第1步&#xff1a;构造生产者对象所需的参数对象。 第2步&#xff1a;利用第1步的参数对象&#xff0c;创建KafkaProducer对象实例…...

electron教程(一)创建项目

一、方式① 根据官网描述将electron/electron-quick-start项目克隆下来并启动 electron/electron-quick-start地址&#xff1a; GitHub - electron/electron-quick-start: Clone to try a simple Electron app git clone https://github.com/electron/electron-quick-start…...

如何在Oracle、MySQL、PostgreSQL上终止会话或取消SQL查询

How to Kill session or Cancel SQL query on Oracle , MySQL, PostgreSQL 数据库维护过程中难免会遇到一些不正常的SQL或会话进程正在占用系统大量资源&#xff0c;临时需要终止查询或kill会话&#xff0c;在Oracle, MySQL, Postgresql数据库中不同的操作。 Oracle KILL会话…...

3、FTL基本工作过程

上文描述了FTL的四大功能&#xff0c;这里简述一下每个功能的含义。 地址转换简述 FTL要维护一个地址转换表&#xff0c;这个转换表是主机读/写硬盘的逻辑地址到硬盘实际物理地址的转换关系。 假如SSD的容量是128G&#xff0c;SSD逻辑块的大小是4KB&#xff0c;那SSD的逻辑块…...

微信小程序的跳转页面

在微信小程序中&#xff0c;要实现从当前页面返回到指定页面的功能&#xff0c;通常不直接使用“返回上一页”的逻辑&#xff0c;而是利用小程序的页面栈管理和navigateBack或者重新定向到目标页面的API。下面我将介绍两种主要的方法&#xff1a; 方法一&#xff1a;使用 navi…...

深入理解 Java 中的线程间通信:`wait()`, `notify()`, `notifyAll()`

引言 在多线程编程中&#xff0c;线程间通信是一个重要且复杂的主题。Java 提供了一套基本的机制来实现线程间通信&#xff0c;即使用 wait(), notify(), 和 notifyAll() 方法。这些方法由 Object 类提供&#xff0c;用于协调多个线程对共享资源的访问。本文将详细介绍这些方法…...

23种设计模式【创建型模式】详细介绍之【单例模式】

23种设计模式【创建型模式】详细介绍之【单例模式】 设计模式的分类和应用场景总结单例模式1. 概述2. 实现方式2.1 饿汉式单例模式2.2 懒汉式单例模式&#xff08;非线程安全&#xff09;2.3 懒汉式单例模式&#xff08;线程安全&#xff09; 3. 单例模式的优缺点3.1 优点3.2 缺…...

某汽车配件制造公司任职资格体系项目成功案例纪实

——基于岗位特点和核心能力要求&#xff0c;分层分级能力测评&#xff0c;实现个性化人才培养 【客户行业】生产制造&#xff1b;汽车配件制造 【问题类型】任职资格体系建立&#xff1b;人才管理系统 【客户背景】 某汽车配件制造公司是一家专注于汽车配件研发、生产和销…...

【Linux】生物信息学常用基本命令

wget网址用于直接从网上下载某个文件到服务器&#xff0c;当然也可以直接从网上先把东西下到本地然后用filezilla这个软件来传输到服务器上。 当遇到不会的命令时候&#xff0c;可以使用man “不会的命令”来查看这个命令的详细信息。比如我想要看看ls这个命令的详细用法&…...

React Native V0.74 — 稳定版已发布

嗨,React Native开发者们, React Native 世界中令人兴奋的消息是,V0.74刚刚在几天前发布,有超过 1600 次提交。亮点如下: Yoga 3.0New Architecture: Bridgeless by DefaultNew Architecture: Batched onLayout UpdatesYarn 3 for New Projects让我们深入了解每一个新亮点…...

Python面试宝典第4题:环形链表

题目 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。如果存在环 &#xff0c;则返回 true 。 否则&#xff0c;返回 false 。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xf…...

Kubernetes (K8s) 底层原理

Kubernetes (K8s) 的底层原理涉及多个关键组件和概念&#xff0c;确保容器化应用程序的自动化部署、扩展和管理。以下是 Kubernetes 的底层原理及其关键组件的详细描述。 核心组件 Etcd 功能&#xff1a;分布式键值存储&#xff0c;用于存储集群的所有数据&#xff0c;包括配置…...

解析Kotlin中的委托(包括类委托,属性委托)【笔记摘要】

1.委托模式 委托模式&#xff1a;操作对象不会去处理某段逻辑&#xff0c;而是会把工作委托给另外一个辅助对象去处理。 例如我们要设计一个自定义类的来实现Set&#xff0c;可以将该实现委托给另一个对象&#xff1a; class MySet<T> (val helperSet: HashSet<T>…...

vue3+ts+uniapp+vite+pinia项目配置

开发环境&#xff1a; node >18&#xff0c;npm >8.10.2&#xff0c;vue < 3.2.31 安装项目 npx degit dcloudio/uni-preset-vue#vite-ts vue3-uniapp 1、引入样式规范 npm add -D eslint eslint-config-airbnb-base eslint-config-prettier eslint-import-resolv…...

大数据开发语言 Scala(四):面向对象编程

目录 1. 概述 2. 面向对象编程的基本概念 2.1 类和对象 2.2 继承和多态 2.3 封装和访问控制 3. 面向对象编程在大数据开发中的应用 3.1 Spark中的面向对象编程 3.2 面向对象编程在数据清洗和预处理中 3.3 面向对象编程在机器学习中的应用 4. 面向对象编程的高级特性 …...

C++ //练习 14.31 我们的StrBlobPtr类没有定义拷贝构造函数、赋值运算符及析构函数,为什么?

C Primer&#xff08;第5版&#xff09; 练习 14.31 练习 14.31 我们的StrBlobPtr类没有定义拷贝构造函数、赋值运算符及析构函数&#xff0c;为什么&#xff1f; 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 解释&#xff1a; 因为…...

通配符和正则表达式之间的关系

通配符和正则表达式&#xff08;正则&#xff09;都是用于匹配字符串的工具&#xff0c;但它们的复杂性和用途有所不同。下面是它们之间的主要关系和区别&#xff1a; 通配符 通配符主要用于简单的模式匹配&#xff0c;常见于文件系统操作中&#xff0c;例如在命令行中查找文…...

GY-30光照传感器软件I2C方式驱动代码,基于STM32Cube

GY-30光照传感器的具体资料可以去淘宝搜索然后问卖家要&#xff0c;网上也有&#xff0c;所以这里我就不多嘴了。 VCC连接3到5伏电压&#xff0c;根据文件开头的描述在STM32CubeMX中配置好外设。 STM32Cube开发方式就是4个字“简单直接”&#xff0c;直接上代码。 gy30.h #…...

双相元编程:一种新语言设计方法

本文讨论了编程语言的一种趋势&#xff0c;即允许相同的语法表达 在两个不同阶段或环境&#xff08;上下文&#xff09;中执行的计算同时保持跨阶段&#xff08;上下文&#xff09;的一致行为。这些阶段通常在时间上&#xff08;运行时间&#xff09;或空间上&#xff08;运行…...

基于SpringBoot校园外卖配送系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;…...

茗鹤APS高级计划排程系统,在集团多工厂协同生产下的应用

随着业务规模的扩大和市场的全球化&#xff0c;越来越多的企业选择“总部多工厂基地”的模式&#xff0c;此种模式大幅提升企业的产能与产量&#xff0c;有效分散风险。然后&#xff0c;与之而来的是对企业的管理提出更高的管理要求。多个生产基地不仅面临集团下发的周期性计划…...

分享六款免费u盘数据恢复工具,U盘恢复工具集合【工具篇】

U盘里面的数据丢失了怎么找回&#xff1f;随着数字化时代的深入发展&#xff0c;U盘已成为我们日常生活中不可或缺的数据存储工具。然而&#xff0c;由于各种原因&#xff0c;如误删除、格式化、病毒攻击等&#xff0c;U盘中的数据可能会丢失&#xff0c;给用户带来极大的困扰。…...

Python:一个挑选黑色棋盘的程序

import cv2 import numpy as np # 读取输入图像 image cv2.imread(grid_origin.png) # 将图像从 BGR 转换为灰度图 gray_image cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 设定阈值&#xff0c;保留深色矩形模块 thresh_value 100 ret, thresholded_image cv2.threshol…...

ABB PPC902AE1013BHE010751R0101控制器 处理器 模块

ABB PPC902AE1013BHE010751R0101 该模块是用于自动化和控制系统的高性能可编程控制器。它旨在与其他自动化和控制设备一起使用&#xff0c;以提供完整的系统解决方案 是一种数字输入/输出模块&#xff0c;提供了高水平的性能和可靠性。它专为苛刻的工业应用而设计&#xff0c…...

论文创新的几种思路

选题是论文创新的基石&#xff0c;它决定了研究的方向和深度。一个新颖的选题不仅能够吸引读者和评审的注意&#xff0c;还能为学术界带来新的视角和思考。选题创新要求研究者具有敏锐的洞察力&#xff0c;能够识别和捕捉到那些尚未被充分探索或有待深入研究的问题。 选题创新…...

【力扣】快乐数

&#x1f525;博客主页&#xff1a; 我要成为C领域大神&#x1f3a5;系列专栏&#xff1a;【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 编写一个算法来判断…...

转盘输入法-单独鼠标版本

序 转盘输入法&#xff0c;给你的聊天加点新意。它不用常见的九宫格或全键盘&#xff0c;而是把字母摆在圆盘上&#xff0c;一滑一滑&#xff0c;字就出来了&#xff0c;新鲜又直接。 单独鼠标版本GIF演示 演示软件下载 转盘输入法https://download.csdn.net/download/u0146…...

ELK优化之Elasticsearch

目录 1.ELK优化 2.优化 ES 索引设置 2.1 优化 fsync 2.2 优化 refresh 2.3 优化 merge 2.4 优化设置 2.5 打开索引 3.优化线程池配置 3.1 优化的方案 4.锁定内存&#xff0c;不让 JVM 使用 Swap 5.减少分片数、副本数 6.ES优化总结 1.ELK优化 ELK优化可以围绕着 li…...

荣威“D家族”首款SUV车型D5XDMH即将正式上市!

2024年5月10日,荣威DMH技术品牌大会,在上海举行。在大会上,荣威汽车官方正式公布了荣威D5X DMH将于5月20日正式上市。该款车在不久前的北京车展上正式开启了预售,其预售价格区间为11.98万元至14.68万元。在外观尺寸上,荣威D5X DMH的长宽高分别为4700mm、1890mm和1664mm,轴…...

Sylvester矩阵、子结式、辗转相除法的三者关系(第二部分)

【三者的关系】 首先&#xff0c;辗转相除法可以通过Sylvester矩阵进行&#xff0c;过程如下&#xff08;以 m 8 、 l 7 m 8、l 7 m8、l7为例子&#xff09;。 首先调整矩阵中 a a a系数到最后面几行&#xff0c;如下所示&#xff1a; S ( a 8 a 7 a 6 a 5 a 4 a 3 a 2 …...

SOL 交易机器人基本知识

有没有可以盈利的机器人&#xff1f; 是的&#xff0c;各行各业都有许多盈利机器人。在金融领域&#xff0c;交易机器人被广泛用于自动化投资策略并根据预定义的算法执行交易。这些机器人可以分析市场趋势并做出快速决策&#xff0c;从而可能带来可观的回报。同样&#xff0c;在…...

Sublime Text 基础教程(个人总结)

Sublime Text 是一款广受欢迎的代码编辑器&#xff0c;以其简洁的界面和强大的功能而著称。它支持多种编程语言&#xff0c;具有高效的代码编辑和管理功能。本教程将详细介绍如何使用 Sublime Text&#xff0c;从安装到高级使用技巧&#xff0c;帮助你充分利用这款工具。 目录…...

信息标记形式 (XML, JSON, YAML)

文章目录 &#x1f5a5;️介绍&#x1f5a5;️三种形式&#x1f3f7;️XML (Extensible Markup Language)&#x1f516;规范&#x1f516;注释&#x1f516;举例&#x1f516;其他 &#x1f3f7;️JSON (JavaScript Object Notation)&#x1f516;规范&#x1f516;注释&#x…...

Apache Doris 2.1.3 版本正式发布!

亲爱的社区小伙伴们&#xff0c;Apache Doris 2.1.3 版本已于 2024 年 5 月 20 日正式发布。该版本在功能特性上对数据湖、物化视图、负载管理等方面进行了多项更新&#xff0c;进一步简化湖仓一体架构、加速了查询性能&#xff1b;同时提交了若干改进项以及问题修复&#xff0…...