SpringBoot项目初始化搭建

news2024/9/20 18:52:11

SpringBoot项目搭建

  • 创建SpringBoot项目
  • 事务
    • 编程式事务
    • 声明式事务
  • PageHelper
    • 主要特点:
    • 依赖使用
    • 常用方法
  • 跨域问题
    • JSONP(JSON with Padding)
      • 工作原理:
      • 代码示例
    • CORS(Cross-Origin Resource Sharing)
      • 工作原理:
      • 代码示例
        • 1,全局CORS配置
        • 2. 使用Spring Boot
        • 3. 使用Servlet过滤器

创建SpringBoot项目

在这里插入图片描述
首先在IDEA编译器中创建SpringBoot项目,注意选择链接: 阿里云这个网址进行创建,可以选择Java17以下的版本,在这里插入图片描述
点击进行创建之后,这个页面可以选择需要引入的依赖,注意,我们这里SpringBoot的版本为2.6.13,不要选择3.0以上的版本,因为SpringBoot3.0版本需要Java17以上作为支持,我们在这个页面不需要选择任何依赖,阿里云作为镜像网站,其中代码会自动生成,我们不选择任何依赖就可以使用纯净版进行开发,进入项目以后我们可以手动进行依赖的引入。
在这里插入图片描述
进入项目,首先打开pom.xml文件,将依赖引入dependencies双标签中,引入依赖如下:

      <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

接下来我们就可以愉快的编程了。

事务

接下来我们可以先学习一下事务(transaction),在Java中,事务通常指的是数据库操作中的一个概念,它确保了数据库操作的原子性、一致性、隔离性和持久性(ACID属性)。在Java的数据库编程中,事务可以通过JDBC API来管理,也可以使用更高级的框架如JPA(Java Persistence API)或Spring Framework来简化事务管理。

  • 原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不完成,不会结束在中间某个点。

  • 一致性(Consistency):事务必须保证数据库从一个一致性状态转换到另一个一致性状态。

  • 隔离性(Isolation):并发执行的事务之间不会相互影响,每个事务都像是在独立运行。

  • 持久性(Durability):一旦事务提交,它对数据库的修改就是永久性的,即使系统发生故障也不会丢失。

在Java中,可以通过以下方式管理事务:

  • JPA:通过实体管理器(EntityManager)来管理事务,可以在实体管理器上调用beginTransaction()开始事务,commit()提交事务,rollback()回滚事务。

  • Spring Framework:Spring提供了声明式事务管理,可以通过注解(如@Transactional)或编程式事务管理来控制事务的边界。

事务管理是确保数据完整性和一致性的关键机制,特别是在多用户环境中进行并发数据库操作时。

编程式事务

首先来讲一下"编程式事务",指的是在编程过程中,通过代码显式地管理事务的开始、提交或回滚。在编程式事务中,开发者需要手动控制事务的生命周期,包括何时开始事务、何时提交事务以及在遇到错误时如何回滚事务。这种方法提供了更细粒度的控制,但同时也增加了代码的复杂性。
我们可以通过创建管理类来进行事务的开启,提交和回滚:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import org.springframework.transaction.support.TransactionTemplate;

@Service
public class MyService {

    private final TransactionTemplate transactionTemplate;

    @Autowired
    public MyService(PlatformTransactionManager transactionManager) {
        this.transactionTemplate = new TransactionTemplate(transactionManager);
    }

    public void performTransaction() {
        transactionTemplate.execute(status -> {
            // 执行业务逻辑
            try {
                // 业务逻辑代码,例如数据库操作
                // 如果一切顺利,事务将自动提交
            } catch (Exception e) {
                // 如果发生异常,回滚事务
                status.setRollbackOnly();
                throw e;
            }
            return null; // 返回值
        });
    }
}

声明式事务

声明式事务(Declarative Transaction Management)是一种通过配置来管理事务的方式,它允许开发者将事务管理的逻辑与业务逻辑分离,从而使得代码更加清晰和易于维护。在声明式事务中,事务的边界和行为是通过配置或注解来定义的,而不是通过代码来显式控制。
在编程的过程中,由于声明式事务的高可维护性,所以我们经常使用声明式事务。
以下为声明式事务的代码示例:

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class MyService {

    @Transactional
    public void myTransactionalMethod() {
        // 业务逻辑代码
    }
}

我们只需要在控制业务逻辑的代码之前进行注解**@Transactional**,就可以开启事务,但是声明式事务默认只会判断运行时异常自动回滚,对受检时异常无法进行判断,所以我们就需要在其后面进行代码的添加。

@Override
//@Transactional   默认 只有运行时异常  会自动回滚
@Transactional(rollbackFor = Exception.class)//遇见运行时异常 或者 非运行时异常。都会回滚,前提是该方法内的异常抛出而非捕获
public boolean updateAll(Person person) throws FileNotFoundException {
    Long row = personMapper.updateAll(person);
    //int i = 5 / 0;//运行时异常
    //FileInputStream fileInputStream = new FileInputStream("xx");//IOException 非运行时异常
    return row != 0 ? true : false;
}

通过定义异常的类型Exception.class,我们就可以将在业务中遇到的所有异常情况进行回滚,不会影响到数据库中的数据安全。

PageHelper

编程时在进行数据库操作时,我们经常会头疼limit分页操作,需要再SQL语句中定义,在业务层(Service)进行逻辑判断,所以在这里介绍一个关于数据分页的依赖PageHelper
PageHelper 是一个用于帮助在 Java 项目中实现 MyBatis 分页查询的插件。它通过拦截 MyBatis 的执行器来实现分页功能,无需修改原来的 SQL 语句,使得开发者可以非常方便地进行分页处理。

主要特点:

  • 简单易用:只需要在查询方法前调用 PageHelper.startPage() 方法,传入页码和每页显示的记录数,就可以实现分页。

  • 无需修改 SQL:PageHelper 通过拦截 MyBatis 的执行器来实现分页,不需要修改原有的 SQL 语句。

  • 支持多种数据库:PageHelper 支持多种数据库,如 MySQL、Oracle、SQL Server 等。

  • 自动处理:PageHelper 会自动处理分页参数,开发者无需手动编写分页逻辑。

  • 支持多种分页参数:除了基本的页码和每页记录数,PageHelper 还支持其他分页参数,如排序、跳过 count 查询等。

依赖使用

首先我们需要再pom.xml中添加依赖配置。

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>最新版本</version>
</dependency>

然后,在需要进行分页的查询方法前调用 PageHelper.startPage() 方法。

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class MyService {

    @Autowired
    private MyMapper myMapper; // MyBatis 的 Mapper 接口

    public PageInfo<MyEntity> selectPaged(int pageNum, int pageSize) {
        PageHelper.startPage(pageNum, pageSize);
        List<MyEntity> list = myMapper.selectAll(); // 执行查询
        return new PageInfo<>(list); // 返回分页信息
    }
}

最后,PageHelper 会自动处理分页,并将结果封装到 PageInfo 对象中,该对象包含了分页的详细信息,如总记录数、总页数、当前页码、每页记录数等。

常用方法

  1. startPage(int pageNum, int pageSize):

    • 开始分页,传入页码和每页数量。
    • pageNum 从 1 开始计数。
    • pageSize 表示每页显示的记录数。
  2. startPage(int pageNum, int pageSize, boolean count):

    • 开始分页,允许你选择是否进行 count 查询来获取总记录数。
    • count 参数默认为 true,如果设置为 false,则不会执行 count 查询。
  3. startPage(PageParams params):

    • 开始分页,使用 PageParams 对象来传递分页参数。
    • 允许更灵活的分页参数设置,如排序、是否进行 count 查询等。
  4. PageInfo getPageInfo(List list):

    • 将 MyBatis 查询的结果集合封装成 PageInfo 对象。
    • 通常与 startPage 方法配合使用。
  5. orderBy(String orderBy):

    • 设置排序参数,可以链式调用 startPage
    • 例如:PageHelper.orderBy("id asc, name desc").startPage(pageNum, pageSize)
  6. PageInfo getPageInfo():

    • 获取最近一次分页的 PageInfo 对象。
    • 如果没有进行分页查询,会抛出异常。
  7. getTotal():

    • 获取最近一次分页查询的总记录数。
    • 需要在 startPage 方法中启用 count 查询。
  8. setPageRowBounds(int pageSize):

    • 设置全局的分页参数,包括每页记录数。
    • 这个设置会影响之后所有的分页查询。
  9. setPageRowBounds(int offset, int limit):

    • 使用 SQL 风格的分页参数设置分页。
    • offset 表示起始位置,limit 表示查询记录数。
  10. supportMethodsPage:

    • 静态变量,设置为 true 时,支持无参的 PageInfo 获取方法。
  11. clearPage():

    • 清除 PageHelper 的分页参数,通常在测试中使用。
  12. execSelect(Select select):

    • 执行分页查询并返回 PageInfo 对象。
    • 可以传递一个 Select 对象来定义查询。

跨域问题

在了解跨域问题之前,我们首先需要了解什么是同源策略。

  • 浏览器的同源政策要求,如果两个 URL 的协议、域名和端口都相同,那么这两个 URL 才被认为是同一个源。
  • 出于安全考虑,浏览器限制了来自不同源的文档或脚本对当前文档的读取或设置权限。

跨域问题(Cross-Origin Resource Sharing,简称 CORS)是 Web 浏览器中的一种安全机制,它限制了 Web 页面对不同源(域名、协议或端口)的资源的访问。这个机制的目的是为了保护用户信息不被恶意网站窃取。

在我们进行本机的操作时,由于服务器端与客户端浏览器的协议,域名相同,都为http://127.0.0.1,端口一般为3306(数据库),与8080(浏览器),这样由于同源策略,响应就会被浏览器拦截,数据就无法响应在浏览器上,所以在开发过程中,我们就需要先解决一下跨越问题。

JSONP(JSON with Padding)

JSONP 是一种早期用来解决浏览器同源策略限制的方法,主要用在跨域 HTTP 请求中。由于 <script> 标签的加载不受同源政策的限制,JSONP 利用这一特性来实现跨域数据传输。

工作原理:

  1. 客户端:在客户端页面中,通过 JavaScript 动态创建一个 <script> 标签,并将其 src 属性设置为需要请求的跨域 URL。这个 URL 通常包含一个查询参数,如 callback,用于指定一个函数名,该函数用于处理返回的数据。
  2. 服务器:服务器接收到请求后,将数据包装在客户端指定的函数调用中,然后返回。例如,如果客户端请求的 URL 是 http://example.com/data?callback=myCallback,服务器会返回 myCallback({"key":"value"})
  3. 浏览器:浏览器解析这个脚本,执行其中的 myCallback 函数,并将数据作为参数传入。

代码示例

前端配置:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JSONP Example</title>
    <script>
        // 定义回调函数,用于处理从服务器返回的数据
        function handleData(data) {
            console.log('Received data:', data);
            // 在这里处理数据
        }
    </script>
</head>
<body>
    <!-- 动态创建script标签来发送JSONP请求 -->
    <script>
        var script = document.createElement('script');
        script.src = 'http://yourserver.com/jsonp?callback=handleData'; // 假设服务器端接受callback参数
        document.head.appendChild(script);
    </script>
</body>
</html>

后端配置:

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class JsonpServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String callback = request.getParameter("callback");
        if (callback == null || callback.isEmpty()) {
            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
            return;
        }

        // 创建一个简单的JSON对象
        String jsonpData = "{\"key\":\"value\"}";

        // 包装JSONP响应
        String responseData = callback + "(" + jsonpData + ");";

        // 设置响应类型为JavaScript
        response.setContentType("application/javascript");
        response.setCharacterEncoding("UTF-8");

        // 输出响应
        PrintWriter out = response.getWriter();
        out.print(responseData);
        out.flush();
    }
}

CORS(Cross-Origin Resource Sharing)

CORS 是现代浏览器支持的一种官方标准,用于允许或限制网页从不同源加载资源。它通过服务器设置特定的 HTTP 响应头来控制跨域请求的权限。

工作原理:

  1. 预检请求:对于可能对服务器数据产生副作用的请求(如 POST、PUT、DELETE),浏览器会先发送一个预检请求(OPTIONS 请求),询问服务器是否允许实际的请求。
  2. 服务器响应:服务器在响应中包含 Access-Control-Allow-Origin 头,指定哪些源可以访问资源。如果允许跨域请求,服务器还会处理其他相关的 CORS 头,如 Access-Control-Allow-MethodsAccess-Control-Allow-Headers
  3. 浏览器处理:浏览器根据服务器的响应头决定是否执行实际的请求。如果服务器允许,浏览器会执行请求并处理响应。

代码示例

在Spring框架中,可以使用@CrossOrigin注解来轻松配置CORS。这个注解可以添加到控制器、控制器方法或全局配置中。

1,全局CORS配置
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("http://example.com")
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                .allowedHeaders("*")
                .allowCredentials(true);
    }
}
}
2. 使用Spring Boot
spring.mvc.cors.allowed-origins=http://example.com
spring.mvc.cors.allowed-methods=GET,POST,PUT,DELETE
spring.mvc.cors.allowed-headers=*
spring.mvc.cors.allow-credentials=true
3. 使用Servlet过滤器
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class CorsFilter implements Filter {

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest request = (HttpServletRequest) req;
        response.setHeader("Access-Control-Allow-Origin", "http://example.com");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with, Content-Type");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Credentials", "true");

        if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
        } else {
            chain.doFilter(req, res);
        }
    }

    public void init(FilterConfig filterConfig) {}

    public void destroy() {}
}

然后在web.xml中注册过滤器:

<filter>
    <filter-name>CorsFilter</filter-name>
    <filter-class>com.example.CorsFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>CorsFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

总的来说,CORS 是现代 Web 开发中推荐使用的跨域解决方案,因为它提供了更好的安全性和灵活性。JSONP 虽然在某些情况下仍然有用,但其局限性和安全风险使其逐渐被 CORS 所取代。

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

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

相关文章

江协科技STM32学习- P11 中断系统,EXTI外部中断

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

网络ACL详解-从原理到实战模拟

引言 在复杂多变的网络环境中&#xff0c;保障网络安全和数据传输的合法性、高效性至关重要。访问控制列表&#xff08;Access Control Lists&#xff0c;简称ACL&#xff09;作为网络安全的重要组成部分&#xff0c;广泛应用于各种网络设备中&#xff0c;用以控制网络流量的流…

传输大咖39 | 半导体行业的FTP替代升级方案

在半导体行业&#xff0c;数据的快速、安全、稳定传输是研发和生产的关键。传统的FTP&#xff08;文件传输协议&#xff09;虽然在早期被广泛使用&#xff0c;但随着行业的发展&#xff0c;其局限性逐渐显现。本文将探讨传统FTP在半导体行业的不足&#xff0c;并介绍镭速提供的…

【JAVA入门】Day31 - 双列集合 —— Map 系列

【JAVA入门】Day31 - 双列集合 —— Map 系列 文章目录 【JAVA入门】Day31 - 双列集合 —— Map 系列一、双列集合体系结构二、Map 的遍历方式2.1 键找值2.2 键值对遍历2.3 Lambda 表达式遍历键值对 三、HashMap3.1 HashMap的创建 四、LinkedHashMap五、TreeMap 单列集合每次添…

Excel使用VLOOKUP公式匹配不出正确公式,返回#N/A

问题&#xff1a; Excel使用VLOOKUP公式匹配不出正确公式&#xff0c;返回#N/A 原因&#xff1a; 原数据和匹配的数据格式不一致 解决办法&#xff1a; 把格式都设置为文本。 例如添加一列&#xff0c;输入英文符号&#xff0c;然后把数据源拼接起来&#xff0c;转换为文…

3招解决苹果手机qq图片恢复问题,快速恢复原图

Q&#xff1a;我手机QQ上的图片打不开了&#xff0c;怎么办呢&#xff1f;你有什么方法可以帮我解决这个问题吗&#xff1f; A&#xff1a;当然有啦&#xff0c;小编在数据恢复这个方面可是很厉害的。今天&#xff0c;小编就告诉你3个超绝的QQ图片恢复的小妙计&#xff0c;可以…

九盾叉车U型区域警示灯,高效照明和安全警示

叉车运作的环境比较复杂&#xff0c;在方便人们物流运输的同时也存在着很大的安全隐患&#xff0c;特别是叉车碰撞人的事故发生率很高&#xff0c;那我们该怎么在减少成本的同时又能避免碰撞事故的发生呢&#xff1f; 九盾叉车U型区域警示灯&#xff0c;仅需一盏灯安装在叉车尾…

有人送出几百克黄金,有人搭上百万!现在快递也不敢收了?

还记得一年多前小柴遇到过个这样的事&#xff0c;有一天早上&#xff0c;小柴还没睡醒&#xff0c;就被一京东小哥的敲门声吵醒了&#xff01; 小柴当时揉着眼睛&#xff0c;稀里糊涂的签收了这小哥送来的两个快递&#xff0c;没成想&#xff0c;不到一分钟的时间&#xff0c;…

基于多模态大语言模型的摄像头实时感知交互

简介&#xff1a; 调用本地摄像头&#xff0c;通过多模态大语言模型实时感知世界&#xff0c;并进行交互 界面&#xff1a; 代码&#xff1a; import tkinter as tk from tkinter import ttk from PIL import Image, ImageTk import cv2 import requests# 定义处理函数 def…

从源码到应用:数字药店系统与医保购药APP的开发实践

本篇文章&#xff0c;我们将深入探讨数字药店系统的开发过程&#xff0c;并介绍医保购药APP如何通过源码设计实现从基础功能到完整应用的转化。 一、数字药店系统概述 数字药店系统是一种基于互联网技术开发的在线药品销售与管理平台&#xff0c;通常包括药品展示、在线购买、…

NAT技术介绍+缺陷(内网穿透+工具),NAPT(介绍,替换过程,原理,NAT转换表)

目录 NAT技术 介绍 NAT转换表 引入 介绍 NAPT技术介绍 NAPT替换过程 NAPT原理 注意点 NAT缺陷 无法直接访问其他内网主机 内网穿透 工具 其他 NAT技术 介绍 NAT 是一种网络技术&#xff0c;它允许在一个公共 IP 地址和多个私有 IP 地址(入口路由器的wan口地址 …

屋顶上的气膜体育馆:商场创新的引流利器—轻空间

现代都市生活中&#xff0c;商场已成为不可或缺的一部分。然而&#xff0c;在竞争激烈的市场环境中&#xff0c;能够脱颖而出的商场往往依赖于独特的经营策略和创新的理念。上海嘉定某商场正是凭借其巧妙的创新思路&#xff0c;成功吸引了大量顾客&#xff0c;成为区域内的商业…

cc-proxy 常见几种代理场景

背景&#xff1a; 某项目全部内网环境&#xff0c;只有跳板机有访问互联网的权限&#xff0c;现在需要给内网的服务器更新系统&#xff0c;以及在线下载docker镜像 之前&#xff0c;使用过cc-proxy 这样的工具&#xff0c;当然现在这个工具已经停止维护了&#xff0c;使用完之…

2024源代码加密软件推荐,11款超好用的源代码加密软件推荐!

在数字化时代&#xff0c;源代码加密软件成为了保护企业与开发者心血的坚实盾牌。随着网络安全威胁的日益增多&#xff0c;选择一款高效、可靠的源代码加密工具变得至关重要。2024年&#xff0c;技术的迭代让加密软件更加成熟&#xff0c; 1.安秉源代码加密软件 安秉源代码加…

手机玩赛博朋克2077教程 GameViewer远程助你手机随时随地玩3A大作 手机怎么玩赛博朋克

手机居然也能玩赛博朋克2077&#xff0c;实现手机玩主机3A大作&#xff1f;如果你想用手机随时随地玩赛博朋克2077&#xff0c;可以用网易GameViewer远程实现。GameViewer远程作为一款专为游戏玩家打造的远程控制软件&#xff0c;让你随时随地畅玩电脑游戏&#xff0c;无论是手…

云原生 | 在 Kubernetes 中使用 Cilium 替代 Calico 网络插件实践指南!

[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ] 0x00 简述介绍 什么是 Cilium? Cilium 是一款开源软件,它基于一种名为eBPF的新的Linux内核技术提供动力,用于透明地保护使用 Docker 和 Kubernetes 等Linux 容器管理平台中部署的应用程序服务之间的网络连接,Ciliu…

数据分析——基础

目录 一、什么是数据分析 1、什么是数据 2、数据分析 2.1 数据分析概念 2.2 数据分析要结合的维度 2.3 数据分析的目的 二、数据分析流程 三、不同需求下对应的数据呈现形式 四、数据分析的几种常见方法 一、什么是数据分析 1、什么是数据 是对客观事物的性质、状态以…

还不知道如何使用CHAT GPT?您 OUT 了!

别忘了&#xff0c;戳这个连接&#xff0c;重要的连接放三遍&#xff0c;你值得拥有&#xff01;&#xff01;&#xff01; https://ai.ashuiai.com/auth/register?inviteCodeXT16BKSO3Shttps://ai.ashuiai.com/auth/register?inviteCodeXT16BKSO3S https://ai.ashuiai.com…

别让质量问题拖垮您的企业,快看看这些隐藏的风险

质量问题的严重性 在企业运营中&#xff0c;质量问题往往是致命的隐患。一旦产品质量出现纰漏&#xff0c;可能会导致客户流失、品牌声誉受损&#xff0c;甚至带来巨大的经济损失。质量问题不仅影响短期业绩&#xff0c;更可能动摇企业的根基&#xff0c;拖垮整个业务。无论您是…

ByteTrack多目标跟踪(一)—理论基础

ByteTrack多目标跟踪 算法概述 github: https://github.com/ifzhang/ByteTrack ByteTrack是一种基于Tracking-by-Detection范式的多目标跟踪算法。 先前的多目标追踪算法一般在完成当前帧的目标检测后只会保留置信度比较大的检测框用于进行目标跟踪&#xff0c;比如图中置信度…