JavaWeb项目【SpringBoot】——图书项目4.0【源码】:SpringBoot版本 springboot相关技术 项目应用

news/2024/4/26 9:24:25/文章来源:https://blog.csdn.net/Pireley/article/details/131720880

目录

  • 项目简介
  • 思考 & 改进
    • 1.Jsp都是同步请求---->改成异步Ajax【完成】
    • 2.前端用Jsp技术落后----->用Vue框架【完成】
    • 3.架构问题:配置数据和Java代码耦合【完成】
    • 3.SQL语句和Java代码耦合【完成】
    • 4.架构问题:servlet只能处理一个请求
    • 5.响应方式为响应一个Json,但是servlet写法很繁琐
    • 6.在servlet中接收前端传的参数都是String,用的时候还需要类型转换
    • 7.全局配置文件繁琐,xml和java必须一一对应
  • springBoot相关技术
    • Spring核心容器——从配置文件到注解开发 & 创建对象+成员变量赋值 & 增强方法
    • SpringMvc学习——在idea中新建springWeb项目 & 浏览器请求 和 服务器响应 & SpringMvc文件相关
    • springBoot学习——spring+springMVC & 集成mybatis & 拦截器
    • SpringBoot学习——追根溯源servlet是啥,tomcat是啥,maven是啥 & springBoot项目初步,maven构建,打包 & 测试
  • 上述问题SpringBoot的解决方案
    • 4.架构问题:servlet只能处理一个请求
    • 5.响应方式为响应一个Json,但是servlet写法很繁琐
    • 6.在servlet中接收前端传的参数都是String,用的时候还需要类型转换
    • 7.全局配置文件繁琐,xml和java必须一一对应
  • SpringBoot项目搭建
    • 1.项目总体结构
      • pom.xml文件
    • 2.主配置application.yml文件
    • 3.springMvc配置类:拦截器+静态资源映射
      • 拦截器实体类
    • 4.主启动类@SpringBootApplication


项目简介

本项目是一个简单的图书管理系统,本博客在tomcat中采用servlet 和vue和mybatis技术实现如下功能:

  • 用户登陆,输入用户名,密码,登陆成功后保存到session中,跳转到首页;
  • 用户注册,输入相关信息,以及验证码,注册成功到登陆页面;
  • 用户信息修改,昵称修改,密码修改;
  • 图书信息页面:展示所有信息,到数据分页显示,到分页展示+模糊查询+只看自己的书;
  • 新增图书信息,新增一条图书信息,类型下拉框选择,书名,简介输入,session中获取用户名和id,数据插入数据库中,再回到图书信息页面;
  • 删除图书信息:只能删除自己的书,删除成功再回到图书信息页面;
  • 修改图书信息:原有的信息进行回显,修改成功后再回到图书信息页面;
  • 图书类型分类统计:按照图书类型进行统计,数量为0显示0

在这里插入图片描述

思考 & 改进

1.Jsp都是同步请求---->改成异步Ajax【完成】

JavaWeb项目【源码】——图书项目1.0:Tomcat版本 + Servlet + Filter + Jsp + bootstrap & JavaScript初步 + Ajax初步

在这里插入图片描述

2.前端用Jsp技术落后----->用Vue框架【完成】

JavaWeb项目【源码】——图书项目2.0:Tomcat版本 & Vue + axios + Servlet + Lombok + JDBC + MySQL技术栈实现

在这里插入图片描述

3.架构问题:配置数据和Java代码耦合【完成】

3.SQL语句和Java代码耦合【完成】

JavaWeb项目【源码】——图书项目3.0:Tomcat版本 & Mybatis + vue + axios + js + mysql + log4j 技术栈实现

在这里插入图片描述在这里插入图片描述

4.架构问题:servlet只能处理一个请求

在这里插入图片描述

5.响应方式为响应一个Json,但是servlet写法很繁琐

resp.getWriter().write(JSON.toJSONString(new ResData(

        // 4.new PageInfo对象,共享页数等,以及查询到的数据List<Company> list = companyService.queryByLikeNameLimit(pageNum, pageSize,name);PageInfo<Company> pageInfo = new PageInfo<>(pageNum, pageSize, total, pages, list);resp.getWriter().write(JSON.toJSONString(new ResData(200, "ok", pageInfo)));

6.在servlet中接收前端传的参数都是String,用的时候还需要类型转换

        String name = req.getParameter("name");String typeId = req.getParameter("typeId");String birthday = req.getParameter("birthday");

当用的时候,如果想要的类型其实不是String,还需要自己转换格式

        // 日期类型转换private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");try {comUser.setBirthday(sdf.parse(birthday));} catch (ParseException e) {throw new RuntimeException(e);}// int类型转换opus.setTypeId(Integer.parseInt(typeId));

7.全局配置文件繁琐,xml和java必须一一对应

在这里插入图片描述

springBoot相关技术

在这里插入图片描述

Spring核心容器——从配置文件到注解开发 & 创建对象+成员变量赋值 & 增强方法

Spring核心容器——从配置文件到注解开发 & 创建对象+成员变量赋值 & 增强方法

在这里插入图片描述在这里插入图片描述

SpringMvc学习——在idea中新建springWeb项目 & 浏览器请求 和 服务器响应 & SpringMvc文件相关

SpringMvc学习——在idea中新建springWeb项目 & 浏览器请求 和 服务器响应 & SpringMvc文件相关

在这里插入图片描述
之前的模式下:
在这里插入图片描述
在spring中集成mybatis

在这里插入图片描述

配置文件application.xml文件,加入mybatis相关

server:port: 80# 1.连接数据库——对应之前 xml文件的数据库
spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/javaweb?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=trueusername: rootpassword: 123# mybatis其他配置
mybatis:# 2.给实体类起别名,首字母小写type-aliases-package: com.tianju.entityconfiguration:# 3.开启驼峰命名map-underscore-to-camel-case: true# 4.让日志生效log-impl: org.apache.ibatis.logging.stdout.StdOutImpl# 5.扫描sql的位置mapper-locations: classpath:/mapper/*Mapper.xml

springBoot学习——spring+springMVC & 集成mybatis & 拦截器

springBoot学习——spring+springMVC & 集成mybatis & 拦截器

在这里插入图片描述

SpringBoot学习——追根溯源servlet是啥,tomcat是啥,maven是啥 & springBoot项目初步,maven构建,打包 & 测试

SpringBoot学习——追根溯源servlet是啥,tomcat是啥,maven是啥 & springBoot项目初步,maven构建,打包 & 测试

上述问题SpringBoot的解决方案

4.架构问题:servlet只能处理一个请求

在这里插入图片描述

在这里插入图片描述

5.响应方式为响应一个Json,但是servlet写法很繁琐

resp.getWriter().write(JSON.toJSONString(new ResData(

        // 4.new PageInfo对象,共享页数等,以及查询到的数据List<Company> list = companyService.queryByLikeNameLimit(pageNum, pageSize,name);PageInfo<Company> pageInfo = new PageInfo<>(pageNum, pageSize, total, pages, list);resp.getWriter().write(JSON.toJSONString(new ResData(200, "ok", pageInfo)));

在springMvc下,响应一个json @ResponseBody;

要点:

  • 响应是json,要加@ResponseBody;

  • 时间显示的问题,要GMT+8:

  • @JsonFormat(pattern = “yyyy-MM-DD hh:mm:ss”, timezone = “GMT+8”)

  • 如果一个controller响应都是json则,可以用@RestController代替 @Controller 和 @ResponseBody

package com.tianju.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** 响应的json*/
@Data
@NoArgsConstructor
@AllArgsConstructorpublic class ResData {private Integer code;private String msg;private Object data;
}

注意这里,日期转换格式写错了,DD要改成小写dd

在这里插入图片描述

6.在servlet中接收前端传的参数都是String,用的时候还需要类型转换

        String name = req.getParameter("name");String typeId = req.getParameter("typeId");String birthday = req.getParameter("birthday");

当用的时候,如果想要的类型其实不是String,还需要自己转换格式

        // 日期类型转换private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");try {comUser.setBirthday(sdf.parse(birthday));} catch (ParseException e) {throw new RuntimeException(e);}// int类型转换opus.setTypeId(Integer.parseInt(typeId));

在springMvc下,参数自动进行了类型的匹配,通常前端传的是一个JSON队形,后端接收要加上@RequestBody注解

要点:

  • 前端传参用Json对象传;
  • 后端接收需要加上@RequestBody注解;
  • 实体类中规定日期的格式, @JsonFormat(pattern = “yyyy-MM-dd”)

在这里插入图片描述

前端发送对象的方式:

(1) user对象逐个赋值,发送post请求

let user = {}
user.username = this.username;
user.password = this.password;
user.sex = this.sex;
user.birthday = this.birthday;
axios.post("/user/register",user)

(2) 直接创建好user对象,发送post请求

let user = {"username":this.username,"password":this.password,"sex":this.sex,"birthday":this.birthday,
}
axios.post("/user/register",user)

后端接收要加上@RequestBody,在类上加 @JsonFormat(pattern = “yyyy-MM-dd”)

    // 在登陆页面,用户点击登陆按钮,处理请求@RequestMapping("register")@ResponseBody// 如果前端用json对象发,后端需要加上@RequestBodypublic ResData register(@RequestBody User user){System.out.println(user);return new ResData(200, "ok", null);}

7.全局配置文件繁琐,xml和java必须一一对应

在这里插入图片描述

在spring中集成mybatis

在这里插入图片描述

配置文件application.xml文件,加入mybatis相关

server:port: 80# 1.连接数据库——对应之前 xml文件的数据库
spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/javaweb?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=trueusername: rootpassword: 123# mybatis其他配置
mybatis:# 2.给实体类起别名,首字母小写type-aliases-package: com.tianju.entityconfiguration:# 3.开启驼峰命名map-underscore-to-camel-case: true# 4.让日志生效log-impl: org.apache.ibatis.logging.stdout.StdOutImpl# 5.扫描sql的位置mapper-locations: classpath:/mapper/*Mapper.xml

SpringBoot项目搭建

1.项目总体结构

在这里插入图片描述

pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>SpringBootOpus</artifactId><version>1.0-SNAPSHOT</version><!--    继承一个父--><parent><groupId>org.springframework.boot</groupId><version>2.3.0.RELEASE</version><artifactId>spring-boot-starter-parent</artifactId></parent><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!--        做web项目的包--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--        前端模板引擎,功能类似于jsp--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><!--        其他需要的包,fastjson commons-io --><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.2</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.22</version></dependency><!--        mybatis的包--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.1</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.16</version></dependency><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.2.12</version></dependency><!--        mysql --><!--        springboot内置了mysql的jar,不用写版本号,至于为什么不用spring-boot-strater-mysql--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--    工具包--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.11</version></dependency></dependencies><!--    构建--><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

2.主配置application.yml文件

# 注释
server:port: 80## spring相关的配置
spring:# 连接数据库datasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/javaweb?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=trueusername: rootpassword: 123## 设置上传文件大小servlet:multipart:max-file-size: 10MB # 设置单个文件最大大小为10MB
#  # 另一种解决方案
#  thymeleaf:
#    cache: false
#    prefix: classpath:/templates
#    suffix: .html## mybatis相关配置
mybatis:# 起别名的包在哪里type-aliases-package: com.tianju.entity# 写sql的xml文件,放在这个文件夹下mapper-locations: classpath:/mapper/*Mapper.xml# 驼峰命名 + 日志configuration:map-underscore-to-camel-case: truelog-impl: org.apache.ibatis.logging.stdout.StdOutImplimgLocation: D:/620/

3.springMvc配置类:拦截器+静态资源映射

package com.tianju.config;import com.tianju.interceptor.LoginAuthorInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** springMvc的配置类* 1.是配置类:@Configuration* 2.是springMvc的配置类:implements WebMvcConfigurer*/
@Configuration
public class SpringMvcConfig implements WebMvcConfigurer {@AutowiredLoginAuthorInterceptor loginAuthorInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginAuthorInterceptor).addPathPatterns("/**") // 拦截谁,表示都拦截.excludePathPatterns("/user/loginPage","/user/login","/user/registerPage","/user/register","/image/get","/js/**","/css/**","/bootstrap/**","/img/**");}// 静态资源映射@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {// 1.浏览器访问哪个链接,2.映射到哪里registry.addResourceHandler("/bookImg/**") // 访问的连接.addResourceLocations("file:D:/620/bookImg/"); // 映射的位置}
}

拦截器实体类

package com.tianju.interceptor;import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;/*** spring的拦截器* 1.在容器中,@Component* 2.是拦截器,实现接口 implements HandlerInterceptor*/
@Component
public class LoginAuthorInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 如果没有登陆,就去登陆页面; 如果登陆了,就放行;HttpSession session = request.getSession();Object user = session.getAttribute("user");if (user==null){// 没有登陆,重定向到登陆页面response.sendRedirect("/user/loginPage");return false;}// 登陆了,放行return true;}
}

4.主启动类@SpringBootApplication

package com.tianju;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class Main {public static void main(String[] args) {SpringApplication.run(Main.class);}
}

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

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

相关文章

[论文分享]MR-MAE:重构前的模拟:用特征模拟增强屏蔽自动编码器

论文题目&#xff1a;Mimic before Reconstruct: Enhancing Masked Autoencoders with Feature Mimicking 论文地址&#xff1a;https://arxiv.org/abs/2303.05475 代码地址&#xff1a;https://github.com/Alpha-VL/ConvMAE&#xff08;好像并未更新为MR-MAE模型&#xff09; …

从Vue2到Vue3【零】——Vue3简介及创建

系列文章目录 内容链接从Vue2到Vue3【零】Vue3简介及创建 文章目录 系列文章目录前言一、Vue3的发布带来了什么1.1 性能提升1.2 源码升级1.3 支持TypeScript1.4 新特性 二、创建Vue3.0工程2.1 什么是Vite2.2 利用Vite创建Vue3.0工程2.3 利用vue-cli脚手架创建Vue3.0工程 三、 …

美团JVM面试题

1. 请解释一下对象创建的过程? Java对象创建的过程主要分为以下五个步骤&#xff1a; 类加载检查 Java虚拟机在读取一条new指令时候&#xff0c;首先检查能否在常量池中定位到这个类的符号引用&#xff0c;并且检查这个符号引用代表的类是否被加载、解析和初始化。如果没有&a…

C#开发的OpenRA游戏之维修按钮

C#开发的OpenRA游戏之维修按钮 前面分析物品的变卖按钮,如果理解这个流程,再看其它按钮的流程,其实是一样的,所以前面的文章是关键,只有理解通透的基础之上,才能继续往下。 维修按钮的存在价值,就是当建筑物受到敌方破坏,还没有完全倒掉之前,可以使用金币来进行修理。…

快速排序的非递归实现、归并排序的递归和非递归实现、基数排序、排序算法的时间复杂度

文章目录 快速排序的非递归三数取中法选取key快速排序三路划分 归并排序的递归归并排序的非递归计数排序稳定性排序算法的时间复杂度 快速排序的非递归 我们使用一个栈来模拟函数的递归过程&#xff0c;这里就是在利用栈分区间。把一个区间分为 [left,keyi-1][key][keyi1,right…

Android 进程与进程之间的通信--AIDL详细教程,以传递对象为例,两个app实现

我这里案例是 通过 IPC 传递对象 &#xff08;以DemoBean类为例&#xff09; 如下&#xff1a; AIDL 使用一种简单语法&#xff0c;允许您通过一个或多个方法&#xff08;可接收参数和返回值&#xff09;来声明接口。参数和返回值可为任意类型&#xff0c;甚至是 AIDL 生成的其…

如何将jar 包下载到自定义maven仓库

下载命令 mvn install:install-file -Dfileartifactid-version.jar -DgroupIdgroupid -DartifactIdartifactid -Dversionversion -Dpackagingjar -DlocalRepositoryPath. -DcreateChecksumtrue参数解释 在上述命令中&#xff0c;需要替换以下参数&#xff1a; artifactid-vers…

计算机组成原理课程设计 报告

在我的博客查看&#xff1a;https://chenhaotian.top/study/computer-composition-principles-course-design/ 计算机组成原理课程设计 报告 一、目的和要求 深入了解计算机各种指令的执行过程&#xff0c;以及控制器的组成&#xff0c;指令系统微程序设计的具体知识&#xf…

【前端知识】React 基础巩固(二十六)——Portals 的使用

React 基础巩固(二十六)——Portals 的使用 Portals 通常&#xff0c;组件会渲染到 root 节点下。可使用 Portals 将组件渲染至其他节点。 添加 id 为 more、modal 的 div 元素 <div id"root"></div> <div id"more"></div> &l…

工作:三菱PLC之CC-Link IE Field Network通讯知识及应用

工作&#xff1a;三菱PLC之CC-Link IE Field Network通讯知识及应用 一、理论 1. 简介连接 CC-LINK-IE通讯分别有 CC-Link IE TSN&#xff0c;CC-Link IE Control Network&#xff0c;CC-Link IE Field Network&#xff0c;CC-Link IE Field Network Basic几种形式&#xff…

成功解决wget下载报错 : wget HTTP request sent, awaiting response... 403 Forbidden

成功解决wget下载报错 : wget HTTP request sent, awaiting response... 403 Forbidden 问题描述解决方案原理什么是User Agent解决 问题描述 –2023-07-15 02:32:57-- https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2023.03-Linux-x86_64.sh Resolving mi…

PyTorch: 池化-线性-激活函数层

文章和代码已经归档至【Github仓库&#xff1a;https://github.com/timerring/dive-into-AI 】或者公众号【AIShareLab】回复 pytorch教程 也可获取。 文章目录 nn网络层-池化-线性-激活函数层池化层最大池化&#xff1a;nn.MaxPool2d()nn.AvgPool2d()nn.MaxUnpool2d()线性层激…

linux 下如何安装 tar.gz包

linux 下如何安装 tar.gz包 解压缩进入解压后的文件目录下 解压缩 tar -zxvf pycharm-community-2023.1.3.tar.gz进入解压后的文件目录下 ./pycharm.sh可执行Pycharm 建议将目录转移到其他位置 我习惯使用2020版本的 下载地址

源码阅读: echo 回显程序

文章目录 1. 目的2. 原始代码3. 化简和跨平台支持4. 修改后代码的代码分析5. References 1. 目的 阅读 netbsd 9.3 的 echo.c, 练习 C 语言源码阅读的技能。 2. 原始代码 https://github.com/NetBSD/src/blob/trunk/bin/echo/echo.c /* $NetBSD: echo.c,v 1.23 2021/11/16 …

2023年Java最新面试题

由【后端面试题宝典】提供 和 equals 的区别是什么&#xff1f; 对于基本类型&#xff0c;比较的是值&#xff1b;对于引用类型&#xff0c;比较的是地址&#xff1b;equals不能用于基本类型的比较&#xff1b;如果没有重写equals&#xff0c;equals就相当于&#xff1b;如果重…

基于JavaSwing+Mysql的仓库销售管理系统

点击以下链接获取源码&#xff1a; https://download.csdn.net/download/qq_64505944/88049275 JDK1.8 MySQL5.7 功能&#xff1a;管理员与员工两个角色登录&#xff0c;基础数据查找&#xff0c;仓库查找&#xff0c;增删改查仓库信息、商品等 源码数据库文件配置文件课程设…

5分钟构建电商API接口服务 | python小知识

1. 什么是API 我们经常会使用一些API接口来完成特定的功能&#xff0c;比如查询天气的数据&#xff0c;下载股票的数据&#xff0c;亦或是调用ChatGPT模型的结构等等。 API全称是Application Programming Interface&#xff0c;即应用程序接口&#xff0c;它通常提供了一个功…

Mysql单表多表查询练习

题目要求&#xff1a; 1.查询student表的所有记录 2.查询student表的第2到4条记录 3.从student表查询所有的学生的学号&#xff08;id&#xff09;&#xff0c;姓名&#xff08;name&#xff09;&#xff0c;和院系&#xff08;department&#xff09;的信息 4.从student表…

SpringAMQP - 消息传输时,如何提高性能?解决 SQL 注入问题?

目录 一、问题背景 二、从消息转化器根源解决问题 1.引入依赖 2.在服务生产者和消费者中都重新定义一个 MessageConverter&#xff0c;注入到 Spring 容器中 一、问题背景 在SpringAMQP的发送方法中&#xff0c;接收消息的类型是Object&#xff0c;也就是说我们可以发送任意…

用 GPU 并行环境 Isaac Gym + 强化学习库 ElegantRL:训练机器人Ant,3小时6000分,最高12000分

前排提醒,目前我们能 “用 ppo 四分钟训练 ant 到 6000 分”,比本文的 3 小时快了很多很多,有空会更新代码 https://blog.csdn.net/sinat_39620217/article/details/131724602 介绍了 Isaac Gym 库 如何使用 GPU 做大规模并行仿真,对环境模块提速。这篇帖子,我们使用 1 …