速通SpringBoot+vue全栈开发教程

news2024/12/13 2:48:02

本人的环境配置:
idea 2019
java(jdk8)
apache-maven 3.6.1
tomcat 8.5.5
mysql 8.0.12
navicat 16

一、SpringBoot快速上手——创建一个springboot项目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
进去之后报红
在这里插入图片描述
在设置里面修改maven的配置,改成自己下载的maven的地址
在这里插入图片描述
还因为依赖项的版本和springboot版本不兼容,于是将pom.xml文件里的版本号改一下,改完之后加载一下就好了
在这里插入图片描述
接着创建一个controller,实现在浏览器上显示“hello,world”
在这里插入图片描述
最后,运行可启动项HelloworldApplication,在浏览器url栏中输入“http://localhost:8080/hello”,就可以成功看到:
在这里插入图片描述

在实际的项目开发调试过程中会频繁地修改后台类文件,导致需要重新编译、启动,整个过程很麻烦,所以要使用到开发环境热部署
springboot提供了spring-boot-devtools组件,使得无需手动重启项目即可重新编译、启动项目
devtools会监听classpath下的文件变动,触发Restart类加载器重新加载该类,从而实现类文件和属性文件的热部署

1.在pom.xml配置文件中添加dev-tools依赖
使用optional=true表示依赖不会传递,即该项目依赖devtools,其他项目引入此项目生成的jar包,则不会包含devtools

	  <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>

2.在application.properties中配置devtools

#热部署生效
spring.devtools.restart.enabled=true
#设置重启目录
spring.devtools.restart.additional-paths=src/main/java
#设置classpath目录下的WEB-INF文件夹内容修改不重启
spring.devtools.restart.exclude=static/**

3.打开idea里的settings,勾选如图
在这里插入图片描述
然后按住ctrl+shift+alt+/快捷键调出maintenance页面,单击registry,勾选如图
在这里插入图片描述
做完这两步配置后,在idea中修改代码保存后,项目会自动重启

二、Web入门

Springboot将传统web开发的mvc、json、tomcat等框架整合,提供了spring-boot-starter-web组件,简化了web应用配置
spring-boot-starter-web启动器主要包括web、webmvc、json、tomcat等基础依赖组件,作用是提供web开发场景所需的所有底层依赖

Springboot提供了@Controller和@RestController两种注解来标识此类负责接收和处理HTTP请求
如果是页面和数据请求,使用@Controller注解即可。如果只是数据请求,则可以使用@RestController注解(以文本形式交给前端)

  • MVC设计模式

在这里插入图片描述

  • 路由映射
    @RequestMapping注解主要负责URL的路由映射。可以添加在Controller类或具体的方法上。如果添加在Controller类上,则这个Controller中的所有路由映射都将会加上此映射规则。 @RequestMapping注解支持使用通配符匹配URL,用于统一映射某些URL规则类似的请求,如@RequestMapping("/getJson/*.json)。 “*”匹配任意字符,“**”匹配任意路径(多级),“?”匹配单个字符。
    @RequestMapping(value = "/hello",method = RequestMethod.GET)等价于@GetMapping("/hello")
  • 参数传递
    @RequestParam将请求参数绑定在控制器的方法参数上,接收的参数来自HTTP请求体或请求url的QueryString。当请求的参数名称与Controller的业务方法参数名称一致时, @RequestParam可以省略
    @PathVaraible用来处理动态的url,url的值可以作为控制器中处理方法的参数
    @RequestBody接收的参数是来自requestBody中,即请求体。
    例如:
    在这里插入图片描述
    当要传的参数变多了,就需要把参数封装到一个对象里去。例如:创建一个User类,属性为username和password。然后测试在浏览器url中输入参数值检验是否能成功绑定。localhost:8080/postTest3?username=zzy&password=123
@RequestMapping(value = "/postTest3",method = RequestMethod.POST)
public String test3(User user){
        System.out.println(user);
        System.out.println(user.password+user.username);
        return "post请求";
    }

三、Springboot文件上传+拦截器

在application.properties中直接定义过滤规则和静态资源位置
spring.mvc.static-path-pattern=/static/**
spring.web.resources.static-locations=classpath:/static/
过滤规则为/static/**,静态资源位置为classpath:/static/

SpringBoot工程嵌入的tomcat限制了请求的文件大小,每个文件的配置最大为1MB,单次请求的文件的总数不能大于10MB
要更改这个默认值需要在配置文件中加入两个配置:
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request.size=10MB

表单的enctype属性规定在发送到服务器之前应该如何对表单数据进行编码。
当表单的enctype="multipart/form-data"时,可以使用MultipartFile获取上传的文件数据,再通过transferTo方法将其写入到磁盘中

报错异常,500一般是后端出问题了,404是url路径输错了

创建一个文件上传的Controller,此处因为还没有做前端的设计,所以用apipost工具进行测试
在这里插入图片描述

@RestController
public class FileUpLoadController {
    @PostMapping("/upload")
    public String up(String nickname, MultipartFile photo, HttpServletRequest request)throws IOException {
        System.out.println(nickname);
        System.out.println(photo.getOriginalFilename());
        System.out.println(photo.getContentType());//文件类型

        String path=request.getServletContext().getRealPath("/upload/");//获取web服务器的运行目录,也就是tomcat的运行路径
        System.out.println(path);
        saveFile(photo,path);
        return "上传成功";
    }

    public void saveFile(MultipartFile photo,String path)throws IOException{
        //判断存储的目录是否存在,不存在则创建
        File dir=new File(path);
        if(!dir.exists()){
            //创建目录
            dir.mkdir();
        }
        File file=new File(path+photo.getOriginalFilename());
        //将网络上传输过来的文件存储到以上目录当中
        photo.transferTo(file);
    }
}

在apipost当中上传文件
在这里插入图片描述
发送后,在控制台显示以下结果。分别是图片的名称,图片的原始名称,图片的类型,上传成功后存储的路径(在tomcat所运行的路径下,这是个动态路径)
在这里插入图片描述
但是我们在浏览器上并不能访问到这张图片,如果用户上传了这张图片后想通过浏览器浏览此图片呢,就需要在配置文件(application.properties)中添加此代码spring.web.resources.static-locations=/upload/。然后在浏览器url栏中直接输入http://localhost:8080/mebeforeu.jpg就可以访问了。

Springboot定义了HandlerInterceptor接口来实现自定义拦截器的功能
HandlerInterceptor接口定义了preHandle、postHandle、afterCompletion三种方法,通过重写这三种方法实现请求前、请求后等操作。

这里创建一个interceptor拦截器,LoginInterceptor类实现SpringBoot中的HandlerInterceptor接口。
在这里插入图片描述

import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class LoginInterceptor implements HandlerInterceptor{

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle");
        return false;
    }
}

再新建一个WebConfig类,实现WebMvcConfigurer接口,拦截请求。运行之后控制台打印preHandle,浏览器什么都不显示说明拦截成功,如果要放行就把上面的return false改成true。

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**");
    }
}

四、RESTful服务+Swagger

RESTful是目前流行的互联网软件服务架构设计风格
REST并不是一个标准,它更像一组客户端和服务端交互时的架构理念和设计原则,基于这种架构理念和设计原则的Web API更加简洁,更有层次。
SpringBoot提供的spring-boot-starter-web组件完全支持开发RESTful API,提供了与REST操作方式(GET,POST,PUT,DELETE)对应的注解。
@GetMapping:处理GET请求,获取资源
@PostMapping:处理POST请求,新增资源
@PutMapping:处理PUT请求,更新资源
@DeleteMapping:处理DELETE请求,删除资源
@PatchMapping:处理PATCH请求,用于部分更新资源

SpringBoot实现RESTful API代码如下

@RestController
public class UserController {
    @GetMapping("/user/{id}")
    public String getUserById(@PathVariable int id) {
        System.out.println(id);
        return "根据id获取用户信息";
    }

    @PostMapping("/user")
    public String save(User user) {
        return "添加用户";
    }

    @PutMapping("/user")
    public String update(User user){
        return "更新用户";
    }

    @DeleteMapping("/user/{id}")
    public String deleteById(@PathVariable int id) {
        System.out.println(id);
        return "根据id删除用户";
    }
}

Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格的Web服务,是非常流行的API表达工具。
Swagger能够自动生成完善的RESTful API文档,同时并根据后台代码的修改同步更新,同时提供完整的测试页面来调试API。

在SpringBoot项目中集成Swagger,引入以下依赖

		<dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger2</artifactId>
			<version>2.9.2</version>
		</dependency>
		<dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger-ui</artifactId>
			<version>2.9.2</version>
		</dependency>

然后配置Swagger。在config包里面创建一个SwaggerConfig配置类

@Configuration //告诉Spring容器,这是个配置类
@EnableSwagger2   //启用Swagger2功能
public class SwaggerConfig {
    //配置Swagger2相关的bean
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com"))//com包下所有api都交给swagger2管理
                .paths(PathSelectors.any()).build();
    }
    //此处是api文档页面显示信息
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("演示项目API") //标题
                .description("演示项目") //描述
                .version("1.0")  //版本
                .build();
    }
}

然后在appication.properties配置文件里加一行代码spring.mvc.pathmatch.matching-strategy=ant_path_matcher
最后输入在浏览器中输入http://localhost:8080/swagger-ui.html即可成功访问以下页面
在这里插入图片描述

Swagger还提供了一系列注解来描述接口信息,包括接口说明、请求方法、请求参数、返回信息等。如 @ApiOperation("添加用户")起到一个注释的效果。

在这里插入图片描述

在这里插入图片描述

五、MyBatisPlus快速上手

ORM(Object Relational Mapping,对象关系映射)是为了解决面向对象与关系数据库存在的互不匹配现象的一种技术。
ORM通过使用描述对象和数据库之间映射的元数据将程序中的对象自动持久化到关系数据库中。
ORM框架的本质是简化编程中操作数据库的编码。

MyBatis是一款优秀的数据持久层ORM框架,被广泛应用于系统中。MyBatis能够非常灵活地实现动态SQL,可以使用XML或注解来配置和映射原生信息,能够轻松地将Java的Pojo(Plain Ordinary Java Object,普通的Java对象)与数据库中的表和字段进行映射关联。
MyBatis-Plus是一个MyBatis的增强工具,在MyBatis的基础上做了增强,简化了开发。

添加依赖

<!--        MybatisPlus依赖-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.2</version>
        </dependency>
<!--        mysql驱动依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
<!--        数据库连接池druid-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.20</version>
        </dependency>

在application.properties里添加数据库配置

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

这里注意要用数据库软件创建一个叫mydb的数据库,库里创一个user表,属性为username,password,添加几条记录。对应的在实体类里创建User类。
再创一个mapper包,里面创一个UserMapper接口。

@Mapper
public interface UserMapper {
    //查询所有记录
    @Select("select * from user")
    public List<User> find();

    @Insert("insert into user values(#{username},#{password})")
    //这里的返回值代表插入了几条记录
    public int insert(User user);

    @Update("update user set username=#{username} where password=#{password}")
    public int update(User user);
}

在controller包里创一个UserTestController,测试是否能查询修改数据库里的数据。

@RestController
public class UserTestController {

    //自动注入
    @Autowired
    private UserMapper userMapper;

    @GetMapping("/userQuery")
    public List query(){
        List<User> userList= userMapper.find();
        System.out.println(userList);
        return userList;
    }

    @PostMapping("/userInsert")
    public String save(User user){
        //前端传过来的用户对象传到数据库里去
        int i=userMapper.insert(user);
        if(i>0){
            return "success";
        }else {
            return "fail";
        }
    }

    @PostMapping("userUpdate")
    public String update(User user){
        int i=userMapper.update(user);
        if(i>0){
            return "更新了"+i+"条数据";
        }else {
            return "更新失败";
        }
    }
}

最后记得在启动类里加一个包扫描@MapperScan("com.example.test3.mapper")
在这里插入图片描述
以上是mybatis的用法,接下来直接用mybatis-plus进行操作。上面的作为了解,可以删掉了(不是)
mysql里表的id设为自增,并且在实体类id上加上此注解@TableId(type = IdType.AUTO)(主键且自增),如果不加这个注解,数据库里的id会自增,但是代码里拿不到id值
如果实体类和数据库的表名对不上,就在User实体类里加个注解@TableName("t_user"),表明映射到数据库表tb_user
如果表里面叫name,数据库里叫username,就可以使用@TableField("username")注解。

直接public interface UserMapper extends BaseMapper<User>UserMapper继承BaseMapper,使用自带的方法进行增删改查。
例如查询,用List<User> userList= userMapper.selectList(null);获取查询到的数据列表。

六、MyBatisPlus多表查询及分页查询

实现复杂关系映射,可以使用@Results注解,@Result注解,@One注解,@Many注解组合完成复杂关系的配置

注意:MySQL数据库里的表的字段名要和Java类中的属性名一一对应,不然会报错。我数据库里id是后加进去的,这里重写的toString就报错了。于是我就把数据库里的id移到最上去就好了。
在这里插入图片描述
在这里插入图片描述
问题:根据user表的id查询所有用户及其订单记录(两表关联)
得出以下结果:
在这里插入图片描述

首先创建数据库,一张tb_user表 { id(主键),username,password },一张tb_order表{ id(主键),order_time,total,uid(外键,关联tb_user.id) } 然后添加几条记录,方便查询。
在这里插入图片描述

再在idea里创建对应的User类和Order类,注意数据类型要一一对应。

部分User类代码(这里的toString重写和构造函数就不用加orderList了,我就是因为加了然后一直报错500,索引越界。)

public class User {
    @TableId(type = IdType.AUTO)
    private int id;
    private String username;
    private String password;
    //描述用户所有的订单
//    @TableField(exist = false)//是说明orderList在user表里是不存在的。
//相当于select id,username,password,orderList from tb_user。
//需要自己映射,但是这是mp的用法,我们mapper里是自己写的sql语句,所以这个注解可不要
    private List<Order> orderList;

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }

部分Order类代码

public class Order {
    @TableId(type = IdType.AUTO)
    private int id;
    @TableField("order_time")//数据库里叫order_time
    private String orderTime;
    private String total;
    private int uid;

    @Override
    public String toString() {
        return "Order{" +
                "id=" + id +
                ", order_time='" + orderTime + '\'' +
                ", total='" + total + '\'' +
                ", uid=" + uid +
                '}';
    }

为什么没有加 @TableField(“order_time”) 也能查询出来?
MyBatis-Plus 有自动映射规则,它支持 驼峰命名法下划线命名法 的自动转换。例如:
数据库字段名 order_time 会被自动映射为 Java 类中的 orderTime(假设你用了驼峰命名)。
反之,orderTime 会自动映射为 order_time。

然后创建UserMapper接口

@Mapper
public interface UserMapper extends BaseMapper<User> {
    //查询用户及其所有订单
    @Select("select * from tb_user")
    @Results(
            {
                    @Result(column = "id",property = "id"),
                    @Result(column = "username",property = "username"),
                    @Result(column = "password",property = "password"),
                    // 映射订单列表的关联查询
                    @Result(column = "id",property = "orderList",javaType = List.class,
                    many=@Many(select = "com.example.test3.mapper.OrderMapper.selectByUid"))
                    //因为一个用户有多个订单,所以是一对多的关系,用注解@Many表示
            }
    )
    List<User> selectAllUserAndOrders();
}

OrderMapper接口

@Mapper
public interface OrderMapper extends BaseMapper<Order> {
    //根据用户的id查询所有的订单
    @Select("select * from tb_order where uid=#{uid}")
    List<Order> selectByUid(int uid);
}

最后创建一个UserTestController进行测试。输入http://localhost:8080/user/findAll就可以成功看到查询结果了。注意:①确保列顺序和字段名在 @Results 中正确映射,还有类的属性名是否填对。②检查 @One 和 @Many 注解的查询方法返回类型。

@RestController
public class UserTestController {
    //自动注入
    @Autowired
    private UserMapper userMapper;

    @GetMapping("/user/findAll")
    public List<User> findAll(){
        return userMapper.selectAllUserAndOrders();
    }
}

问题:根据订单id查询用户,跟上面那个不同的是,一个订单里只有一个用户,但一个用户可以有多个订单
在这里插入图片描述
在Order类里面增加private User user; 注意这里还要增加user的get和set方法,不然等会浏览器里不会显示user这个字段的内容。

为什么我没写orderTime的get和set方法,仍然可以出来order_time的结果?
在没有显式 getOrderTime 和 setOrderTime 方法的情况下,MyBatis 通过反射机制可以自动处理字段的映射,只要字段是私有的且能够通过反射访问。只要数据库中的列(如 order_time)和 Java 类的字段名(如 orderTime)通过配置或命名约定保持一致,MyBatis 就能正确地将数据从数据库映射到 Java 对象中。

在orderMapper里增加几行代码

//    查询所有的订单,同时查询订单的用户
    @Select("select * from tb_order")
    @Results(
            {
                    @Result(column = "id",property = "id"),//列名(字段名),属性名
                    @Result(column = "order_time",property = "orderTime"),
                    @Result(column = "total",property = "total"),
                    @Result(column = "uid",property = "user",javaType = User.class,
                    one = @One(select = "com.example.test3.mapper.UserMapper.selectById"))
            }
    )
    List<Order> findAllOrdersAndUser();

在UserMapper里增加几行代码

//根据id查询信息
    @Select("select * from tb_user where id=#{id}")
    User selectById(int id);

最后创建一个OrderTestController,输入http://localhost:8080/order/findOrder 即可成功运行。

@RestController
public class OrderTestController {
    @Autowired
    private OrderMapper orderMapper;
    @GetMapping("/order/findOrder")
    public List findOrder(){
        return orderMapper.findAllOrdersAndUser();
    }
}

问题:根据所选条件进行查询(用mybatis-plus自带的功能)

在UserTestController里增加以下代码,查询姓名为zzy的user信息

 //条件查询
    @GetMapping("/user/findBy")
    public List<User> findBy(){
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("username","zzy");
        return userMapper.selectList(queryWrapper);
    }

运行之后报错显示查询不到mydb.user表,因为User类上没有加注解@TableName("tb_user")。然后再运行报错说orderList不在user表里,因为@TableField(exist = false) 这个注解在前面被注释掉了,这里给它解注释即可。

为什么会之前能查询到数据,但是用mybatis-plus的方法就查询失败
①自己写的 SQL 语句能查询数据: 你自己写的 SQL 语句不依赖 MyBatis-Plus 的自动映射机制,所以它直接使用的是你在 SQL 中明确指定的表名(tb_user)。因此,你能够查询到数据。
②MyBatis-Plus 自带的 SQL 语句查找不到表: MyBatis-Plus 在生成 SQL 时会自动根据实体类的名称推测表名,如果没有加 @TableName(“tb_user”) 注解,MyBatis-Plus 会默认将 User 类映射到 user 表(类名 User 转为小写的 user)。但是你的数据库表名是 tb_user,所以 MyBatis-Plus 就会报错找不到 user 表。

修改代码后进行运行即可出现zzy的user信息。
在这里插入图片描述
mybatis-plus实现分页查询

在config包里创建一个MybatisPlusConfig类

@Configuration
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        //创建了一个mybatis-plus的分页拦截器
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
        interceptor.addInnerInterceptor(paginationInnerInterceptor);
        return interceptor;
    }
}

在UserTestController里测试

//分页查询
    @GetMapping("/user/findByPage")
    public IPage findByPage() {
        //设置起始值及每页条数。每页显示三条
        Page<User> page = new Page<>(0, 3);
        IPage iPage = userMapper.selectPage(page, null);
        return iPage;
    }

在这里插入图片描述

七、Vue框架快速上手

Vue是一套用于构建用户界面的渐进式框架。Vue.js提供了MVVM数据绑定和一个可组合的组件系统,具有简单、灵活的API。其目标是通过尽可能简单的API实现响应式的数据绑定和可组合的视图组件。
MVVM是Model-View-ViewModel的缩写,它是一种基于前端开发的架构模式,其核心是提供对View和ViewModel的双向数据绑定。
Vue提供了MVVM风格的双向数据绑定,核心是MVVM中的VM,也就是ViewModel,ViewModel负责连接View和Model,保证视图和数据的一致性。

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

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

相关文章

【开源代码】图像水印移除-依赖python-tensorflow

下载源码 git clone https://github.com/zuruoke/watermark-removal创建conda环境 conda create -n tensorflow_gpu python=3.7 conda activate tensorflow_gpu conda install tensorflow-gpu==1.15

MySQL导入.sql文件后数据库乱码问题

问题分析&#xff1a; 当导入.sql文件后&#xff0c;发现数据库中的备注出现乱码&#xff0c;通常是由于一下原因导致&#xff1a; 字符集不匹配&#xff1a;.sql文件、MySQL服务器、客户端连接使用的字符集不一致。备注内容编码问题&#xff1a;备注内容本身的编码格式与数据…

Qt 2D绘图之五:图形视图框架的结构、坐标系统和框架间的事件处理与传播

参考文章链接: Qt 2D绘图之五:图形视图框架的结构和坐标系统 Qt 2D绘图之六:图形视图框架的事件处理与传播 图形视图框架的结构 在前面讲的基本绘图中,我们可以自己绘制各种图形,并且控制它们。但是,如果需要同时绘制很多个相同或不同的图形,并且要控制它们的移动、…

大模型面试题:P-tuning、Prompt-tuning和Prefix-tuning区别是什么?

我整理了1000道算法面试题&#xff0c;可以在下面的地方获取&#xff0c;面试题还是有点多的 P-tuning、Prompt-tuning和Prefix-tuning区别是什么&#xff1f; prefix-tuning对比P-tuning&#xff1a;Prefix-Tuning是将额外的embedding加在开头&#xff0c;看起来更像模仿Inst…

数据结构初阶之顺序表的介绍与动态顺序表的实现

一、线性表 线性表&#xff08;linear list&#xff09;是由 n 个具有相同特性的数据元素组成的有限序列。线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构&#xff0c;也就说是连续…

学习日志020---qt信号与槽

作业 import sysfrom PySide6.QtWidgets import QApplication, QWidget,QPushButton,QLineEditfrom Form import Ui_Form from second import Ui_second from PySide6.QtCore import Qtclass MyWidget(QWidget,Ui_Form):def __init__(self):super().__init__()self.setupUi(se…

大语言模型技术相关知识-笔记整理

系列文章目录 这个系列攒了很久。主要是前段之间面试大语言模型方面的实习&#xff08;被拷打太多次了&#xff09;&#xff0c;然后每天根据面试官的问题进行扩展和补充的这个笔记。内容来源主要来自视频、个人理解以及官方文档中的记录。方便后面的回顾。 文章目录 系列文章…

9.13[debug]

这个错误表明 Git 尝试通过 HTTPS 协议连接到 Gitee 上的仓库时&#xff0c;实际上却尝试连接到了本地的 127.0.0.1&#xff08;即 localhost&#xff09;的 7890 端口&#xff0c;这通常是因为 HTTP 代理配置错误或全局 Git 配置中的代理设置不正确 如果这些命令返回了代理设…

Android笔记(三十四):onCreate执行Handler.post在onResume后才能执行?

背景 偶然发现一个点&#xff0c;就是在onCreate执行Handler.post在onResume后才执行&#xff0c;以下是测试代码 多次运行的结果一致&#xff0c;为什么execute runnable不是在onCreate和onResume之间执行的呢&#xff0c;带着疑问撸了一遍Activity启动流程 关键源码分析 …

Python基于 Opencv+wxPython 的人脸识别上课考勤系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Alogrithm:费式数列

1. 说明 Fibonacci 为1200年代的欧洲数学家&#xff0c;在他的著作中曾经提到&#xff1a;「若有一只免子每个月生一只小免子&#xff0c;一个月后小免子也开始生产。起初只有一只免子&#xff0c;一个月后就有两只免子&#xff0c;二个月后有三只免子&#xff0c;三个月后有五…

【机器学习】机器学习的基本分类-监督学习-决策树-CART(Classification and Regression Tree)

CART&#xff08;Classification and Regression Tree&#xff09; CART&#xff08;分类与回归树&#xff09;是一种用于分类和回归任务的决策树算法&#xff0c;提出者为 Breiman 等人。它的核心思想是通过二分法递归地将数据集划分为子集&#xff0c;从而构建一棵树。CART …

[高阶数据结构七]跳表的深度剖析

1.前言 跳表是一种查找结构&#xff0c;它有着与红黑树、AVL树和哈希表相同的作用&#xff0c;那么已经学习了红黑树和哈希表这种效率高的数据结构&#xff0c;那么为什么还需要学习跳表呢&#xff1f;--请听我娓娓道来。 本章重点&#xff1a; 本章着重讲解跳表的概念&#x…

基于MATLAB的信号处理工具:信号分析器

信号&#xff08;或时间序列&#xff09;是与特定时间相关的一系列数字或测量值&#xff0c;不同的行业和学科将这一与时间相关的数字序列称为信号或时间序列。生物医学或电气工程师会将其称为信号&#xff0c;而统计学家或金融定量分析师会使用时间序列这一术语。例如&#xf…

Linux Shell 脚本:一键在 Ubuntu 系统中打开和关闭网络代理

文章目录 shell脚本使用说明验证设置 shell脚本 以下是一个简单的 Shell 脚本&#xff0c;用于在 Ubuntu 系统中打开和关闭网络代理开关 #!/bin/bash# 检查传入的参数 if [ "$#" -ne 1 ]; thenecho "Usage: $0 <1|0>"echo "1: Enable proxy (…

Android ConstraintLayout 约束布局的使用手册

目录 前言 一、ConstraintLayout基本介绍 二、ConstraintLayout使用步骤 1、引入库 2、基本使用&#xff0c;实现按钮居中。相对于父布局的约束。 3、A Button 居中展示&#xff0c;B Button展示在A Button正下方&#xff08;距离A 46dp&#xff09;。相对于兄弟控件的约束…

【AI工具】强大的AI编辑器Cursor详细使用教程

目录 一、下载安装与注册 二、内置模型与配置 三、常用快捷键 四、项目开发与问答 五、注意事项与技巧 参考资料 近日&#xff0c;由四名麻省理工学院&#xff08;MIT&#xff09;本科生共同创立的Anysphere公司宣布&#xff0c;其开发的AI代码编辑器Cursor在成立短短两年…

Linux-GPIO应用编程

本章介绍应用层如何控制 GPIO&#xff0c;譬如控制 GPIO 输出高电平、或输出低电平。 只要是用到GPIO的外设&#xff0c;都有可能用得到这些操作方法。 照理说&#xff0c;GPIO的操作应该是由驱动层去做的&#xff0c;使用寄存器操作或者GPIO子系统之类的框架。 但是&#xff0…

前端开发 之 15个页面加载特效下【附完整源码】

文章目录 十二&#xff1a;铜钱3D圆环加载特效1.效果展示2.HTML完整代码 十三&#xff1a;扇形百分比加载特效1.效果展示2.HTML完整代码 十四&#xff1a;四色圆环显现加载特效1.效果展示2.HTML完整代码 十五&#xff1a;跷跷板加载特效1.效果展示2.HTML完整代码 十二&#xff…

STM32 DMA直接存储器存取原理及DMA转运模板代码

DMA简介&#xff1a; 存储器映像&#xff1a; 注意&#xff1a;FLASH是只读的&#xff0c;DMA不能写入&#xff0c;但是可以读取写到其他存储器里 变量是存在运行内存SRAM里的&#xff0c;常量&#xff08;const&#xff09;是放在程序存储器FLASH里的 DMA框图&#xff1a; …