SpringBootWeb案例_02

Web后端开发_05

SpringBootWeb案例_02

1.新增员工

1.1需求

在新增用户时,我们需要保存用户的基本信息,并且还需要上传的员工的图片,目前我们先完成第一步操作,保存用户的基本信息。

在这里插入图片描述

1.2 接口文档

基本信息

请求路径:/emps

请求方式:POST

接口描述:该接口用于添加员工的信息

请求参数

参数格式:application/json

参数说明:

名称类型是否必须备注
usernamestring必须用户名
namestring必须姓名
gendernumber必须性别, 说明: 1 男, 2 女
imagestring非必须图像
deptIdnumber非必须部门id
entrydatestring非必须入职日期
jobnumber非必须职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管, 5 咨询师

请求数据样例:

{
  "image": "https://web-framework.oss-cn-hangzhou.aliyuncs.com/2022-09-03-07-37-38222.jpg",
  "username": "linpingzhi",
  "name": "林平之",
  "gender": 1,
  "job": 1,
  "entrydate": "2022-09-18",
  "deptId": 1
}

响应数据

参数格式:application/json

参数说明:

参数名类型是否必须备注
codenumber必须响应码,1 代表成功,0 代表失败
msgstring非必须提示信息
dataobject非必须返回的数据

响应数据样例:

{
    "code":1,
    "msg":"success",
    "data":null
}

1.3思路

在这里插入图片描述

1.4功能开发

EmpController.java

@Slf4j
@RestController
@RequestMapping("/emps")
public class EmpController {
    @Autowired
    private EmpService empService;
    @PostMapping
    public Result save(@RequestBody Emp emp) {
        log.info("新增员工,emp:{}", emp);
        empService.save(emp);
        return Result.success();
    }
}

EmpService.java

public interface EmpService {
    /**
     * 新增员工
     * @param emp
     */
    void save(Emp emp);
}

EmpServiceImpl.java

@Service
public class EmpServiceImpl implements EmpService {
    @Autowired
    private EmpMapper empMapper;
    @Override
    public void save(Emp emp) {
        emp.setCreateTime(LocalDateTime.now());
        emp.setUpdateTime(LocalDateTime.now());
        empMapper.insert(emp);
    }
}

EmpMapper.java

@Mapper
public interface EmpMapper {
    /**
     * 新增员工
     * @param emp
     */
    void insert(Emp emp);
}

EmpMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bowen.mapper.EmpMapper">
    <insert id="insert">
        insert into tlias.emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time)
        VALUES (#{username}, #{name}, #{gender}, #{image}, #{job}, #{entrydate}, #{deptId}, #{createTime},#{updateTime})
    </insert>
</mapper>

1.5 功能测试

代码开发完成后,重启服务器,打开Postman发送 POST 请求,

请求路径:http://localhost:8080/emps

在这里插入图片描述

1.6 前后端联调

功能测试通过后,再进行通过打开浏览器,测试后端功能接口:

在这里插入图片描述

在这里插入图片描述

2.文件上传(阿里云OSS)

黑马程序员2023新版JavaWeb开发教程

(P146 Day11-02. 案例-文件上传-简介——P150 Day11-06. 案例-文件上传-阿里云OSS-集成)

2.1简介

  • 文件上传,是指将本地图片、视频、音频等文件上传到服务器,供其他用户浏览或下载的过程。
  • 文件上传在项目中应用非常广泛,例如发微博、发微信朋友圈都用到了文件上传功能

在这里插入图片描述

2.1.1前端页面三要素
  • 表单项file
  • post方式(由于上传文件较大,所以使用post)
  • 编码格式multipart/form-data(默认编码格式不适用于传输大型的二进制数据文件)

在这里插入图片描述

upload.html放在resources/static目录下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>上传文件</title>
</head>
<body>

    <form action="/upload" method="post" enctype="multipart/form-data">
        姓名: <input type="text" name="username"><br>
        年龄: <input type="text" name="age"><br>
        头像: <input type="file" name="image"><br>
        <input type="submit" value="提交">
    </form>

</body>
</html>

在这里插入图片描述

2.1.2服务端接收文件

UploadController.java

@Slf4j
@RestController
public class UploadController {
    @PostMapping("/upload")
    public Result upload(String username, Integer age, MultipartFile image) {
        log.info("文件上传:{},{},{}", username, age, image);
        return Result.success();
    }
}

打断点进行调试

在这里插入图片描述

使用谷歌浏览器进行上传文件

在这里插入图片描述

可以看到生成的临时文件的路径

在这里插入图片描述

location C:\Users\1900\AppData\Local\Temp\tomcat.8080.6952090206307874716\work\Tomcat\localhost\ROOT

在文件资源管理器中打开该目录

在这里插入图片描述

将三个临时文件复制到一个桌面新建的文件夹中,并将其改名为1.txt2.txt3.txt,用记事本打开三个文件,可以看到

在这里插入图片描述

放行断点,临时文件自动被删除,说明还需要在服务端写存储文件的方法

2.1.3小结

前端页面三要素

  • 表单项type= "file"
  • 表单提交方式post(由于上传文件较大,所以使用post)
  • 表单的enctype属性multipart/form-data(默认编码格式不适用于传输大型的二进制数据文件)

服务端接收文件

  • MultipartFile

2.2本地存储

在服务端,接收到上传上来的文件之后,将文件存储在本地服务器磁盘中。

UploadController.java上传文件的controller控制层

@Slf4j
@RestController
public class UploadController {
    @PostMapping("/upload")
    public Result upload(String username, Integer age, MultipartFile image) throws IOException {
        log.info("文件上传:{},{},{}", username, age, image);
        //获取原始文件名
        String filename = image.getOriginalFilename();

        //构建唯一的文件名(不能重复)- uuid(通用唯一识别码) 7e8c6178-3320-4638-b4d9-19de7cb733f4
        int index = filename.lastIndexOf(".");
        String extname = filename.substring(index);
        String newFileName = UUID.randomUUID().toString() + extname;

        //将文件存储在服务器的磁盘目录中 E:\images
        image.transferTo(new File("E:\\images\\" + newFileName));
        return Result.success();
    }
}

测试UUID,演示UUID的生成

@SpringBootTest
class TliasWebManagementApplicationTests {
    @Test
    public void testUuid() {
        for (int i = 0; i < 1000; i++) {
            String uuid = UUID.randomUUID().toString();
            System.out.println(uuid);
        }
    }
}

在这里插入图片描述

org.apache.tomcat.util.http.fileupload.impl.FileSizeLimitExceededException: The field image exceeds its maximum permitted size of 1048576 bytes.

在SpringBoot中,文件上传,默认单个文件允许最大大小为1M。如果需要上传大文件,可以进行如下配置:

application.properties

#配置单个文件最大上传大小
spring.servlet.multipart.max-file-size=10MB
#配置单个请求最大上传大小(一次请求可以上传多个文件)
spring.servlet.multipart.max-request-size=100MB

测试上传文件

在这里插入图片描述

MultipartFile提供的常见方法

  • String getOriginalFilename();//获取原始文件名
  • void transferTo(File dest);//将接收的文件转存到磁盘文件中
  • long getSize();//获取文件的大小,单位:字节
  • byte[] getBytes();//获取文件内容的字节组数
  • InputStream getInputStream();//或缺接收到的文件内容的输入流

2.3阿里云OSS

阿里云是阿里巴巴集团旗下全球领先的云计算公司,也是国内最大的云服务提供商。

阿里云对象存储OSS ( object Storage Service),是一款海量、安全、低成本、高可靠的云存储服务。使用OSS,您可以通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种文件。

2.3.1第三方服务-通用思路

在这里插入图片描述

2.3.2阿里云OSS-使用步骤

在这里插入图片描述

Bucket:存储空间是用户用于存储对象(Object,就是文件)的容器,所有的对象都必须隶属于某个存储空间。

SDK:Software Development Kit的缩写,软件开发工具包,包括辅助软件开发的依赖(jar包)、代码示例等,都可以叫做SDK。

2.3.2.1.注册阿里云

注册账号后需要实名认证,流程不在赘述。

2.3.2.2.充值

新账号可免费体验三个月OSS对象存储服务,40G的OSS资源包首年9¥,5年45¥

image-20231201163605975

image-20231201163230990

image-20231201163334721

2.3.2.3.开通对象存储服务OSS

免费使用三个月对象存储OSS

2.3.2.4.创建Bucket

打开对象存储oss控制台

在这里插入图片描述

创建OSS Bucket空间

在这里插入图片描述

进入Bucket

在这里插入图片描述

Bucket空间长这样

在这里插入图片描述

2.3.2.5.获取AccessKey

在这里插入图片描述

创建AccessKey,请务必保存好AccessKey

在这里插入图片描述

在这里插入图片描述

2.3.2.6.参照官方SDK编写入门程序

打开阿里云SDK

在这里插入图片描述

https://help.aliyun.com/zh/oss/developer-reference/java-installation?spm=a2c4g.11186623.0.0.15744f33WrUden

在这里插入图片描述

看上传文件SDK

在这里插入图片描述

拷贝文件代码到src/test/java/com/bowen文件夹中

在这里插入图片描述

对代码进行简单修改

image-20231129170705758

测试的图片

image-20231129170743052

测试结果

image-20231129170839686

2.4阿里云OSS-集成

1.基本流程

image-20231129190501762

步骤

  • 引入阿里云OSS上传文件工具类(由官方的示例代码改造而来)
  • 上传图片接口开发
2.AliOSSUtils.java工具类
/**
 * 阿里云 OSS 工具类
 */
@Component
public class AliOSSUtils {

    private String endpoint = "地域节点";
    private String accessKeyId = "AccessKey ID";
    private String accessKeySecret = "AccessKey Secret";
    private String bucketName = "存储空间名称";

    /**
     * 实现上传图片到OSS
     */
    public String upload(MultipartFile file) throws IOException {
        // 获取上传的文件的输入流
        InputStream inputStream = file.getInputStream();

        // 避免文件覆盖
        String originalFilename = file.getOriginalFilename();
        String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));

        //上传文件到 OSS
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        ossClient.putObject(bucketName, fileName, inputStream);

        //文件访问路径
        String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
        // 关闭ossClient
        ossClient.shutdown();
        return url;// 把上传到oss的路径返回
    }

}
3.UploadController.java
@Slf4j
@RestController
public class UploadController {
    @Autowired
    private AliOSSUtils aliOSSUtils;
    //阿里云OSS
    @PostMapping("/upload")
    public Result upload(MultipartFile image) throws IOException {
        log.info("文件上传,文件名:{}",image.getOriginalFilename());
        String url = aliOSSUtils.upload(image);//调用阿里云OSS工具类,将上传来的文件存入阿里云
        log.info("文件上传完成,文件访问的url:{}",url);
        return Result.success(url);//将图片上传完成的url返回,用于浏览器回显展示
    }
}
4.API测试

image-20231129195734184

5.前端联调,新增员工

image-20231129200020460

我这个前端好像有一丢丢问题

image-20231129200110737

6.查看数据库保存的url

image-20231129200311963

2.5小结

  1. 文件上床介绍

  2. 前端页面三要素(file表单项、post方式、multipart/form-data)

  3. 服务端接收文件(MultipartFile)

  4. 文件存储方式

    • 本地存储(问题:无法直接访问、磁盘空间限制、磁盘损坏)

    • 云存储OSS

3.修改员工

3.1需求

image-20231129202259264

3.2查询回显

3.2.1接口文档

根据ID查询

基本信息

请求路径:/emps/{id}

请求方式:GET

接口描述:该接口用于根据主键ID查询员工的信息

请求参数

参数格式:路径参数

参数说明:

参数名类型是否必须备注
idnumber必须员工ID

请求参数样例:

/emps/1
响应数据

参数格式:application/json

参数说明:

名称类型是否必须默认值备注其他信息
codenumber必须响应码, 1 成功 , 0 失败
msgstring非必须提示信息
dataobject必须返回的数据
|- idnumber非必须id
|- usernamestring非必须用户名
|- namestring非必须姓名
|- passwordstring非必须密码
|- entrydatestring非必须入职日期
|- gendernumber非必须性别 , 1 男 ; 2 女
|- imagestring非必须图像
|- jobnumber非必须职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管, 5 咨询师
|- deptIdnumber非必须部门id
|- createTimestring非必须创建时间
|- updateTimestring非必须更新时间

响应数据样例:

{
  "code": 1,
  "msg": "success",
  "data": {
    "id": 2,
    "username": "zhangwuji",
    "password": "123456",
    "name": "张无忌",
    "gender": 1,
    "image": "https://web-framework.oss-cn-hangzhou.aliyuncs.com/2022-09-02-00-27-53B.jpg",
    "job": 2,
    "entrydate": "2015-01-01",
    "deptId": 2,
    "createTime": "2022-09-01T23:06:30",
    "updateTime": "2022-09-02T00:29:04"
  }
}
3.2.2思路

3.2.3实现

EmpController.java控制层

@Slf4j
@RestController
@RequestMapping("/emps")
public class EmpController {
    @Autowired
    private EmpService empService;
	@GetMapping("/{id}")
    public Result getById(@PathVariable Integer id) {
        log.info("根据ID查询员工信息:{}", id);
        Emp emp = empService.getById(id);
        return Result.success(emp);
    }
}

EmpServiceImpl.java员工 接口的实现类

@Service
public class EmpServiceImpl implements EmpService {
    @Autowired
    private EmpMapper empMapper;
	@Override
    public Emp getById(Integer id) {
        return empMapper.getById(id);
    }
}

EmpService.java接口

public interface EmpService {
    /**
     * 根据id查询员工
     *
     * @param id
     * @return
     */
    Emp getById(Integer id);
}

EmpMapper.java员工的Mapper层,由于SQL语句比较简单,直接用注解@Select

@Mapper
public interface EmpMapper {
	/**
     * 根据ID查询员工
     *
     * @param id
     * @return
     */
    @Select("select * from emp where id = #{id};")
    Emp getById(@Param("id") Integer id);
}
3.2.4API测试

image-20231129205218105

3.2.5前端联调

image-20231129205332915

3.3修改员工

3.3.1需求

查询到回显数据后,需要修改信息

3.3.2接口文档
基本信息

请求路径:/emps

请求方式:PUT

接口描述:该接口用于修改员工的数据信息

请求参数

参数格式:application/json

参数说明:

名称类型是否必须备注
idnumber必须id
usernamestring必须用户名
namestring必须姓名
gendernumber必须性别, 说明: 1 男, 2 女
imagestring非必须图像
deptIdnumber非必须部门id
entrydatestring非必须入职日期
jobnumber非必须职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管, 5 咨询师

请求数据样例:

{
  "id": 1,
  "image": "https://web-framework.oss-cn-hangzhou.aliyuncs.com/2022-09-03-07-37-38222.jpg",
  "username": "linpingzhi",
  "name": "林平之",
  "gender": 1,
  "job": 1,
  "entrydate": "2022-09-18",
  "deptId": 1
}
响应数据

参数格式:application/json

参数说明:

参数名类型是否必须备注
codenumber必须响应码,1 代表成功,0 代表失败
msgstring非必须提示信息
dataobject非必须返回的数据

响应数据样例:

{
    "code":1,
    "msg":"success",
    "data":null
}
3.3.3思路

image-20231129210646247

3.3.4实现

EmpController.java控制层

@Slf4j
@RestController
@RequestMapping("/emps")
public class EmpController {
    @Autowired
    private EmpService empService;
    @PutMapping
    public Result update(@RequestBody Emp emp){
        log.info("更新员工信息,emp:{}", emp);
        empService.update(emp);
        return Result.success();
    }
}

EmpServiceImpl.java员工 接口的实现类

@Service
public class EmpServiceImpl implements EmpService {
    @Autowired
    private EmpMapper empMapper;
    @Override
    public void update(Emp emp) {
        emp.setUpdateTime(LocalDateTime.now());
        empMapper.update(emp);
    }
}

EmpService.java接口

public interface EmpService {
    /**
     * 更新员工数据
     * @param emp
     */
    void update(Emp emp);
}

EmpMapper.java员工的Mapper层

@Mapper
public interface EmpMapper {
    /**
     * 更新员工
     * @param emp
     */
    void update(Emp emp);
}

EmpMapper.xml由于要动态SQL,所以在xml文件中写SQL语句

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bowen.mapper.EmpMapper">
    <!--更新员工-->
    <update id="update">
        update emp
        <set>
            <if test="username != null and username != ''">
                username = #{username},
            </if>
            <if test="password != null and password != ''">
                password = #{password},
            </if>
            <if test="name != null and name != ''">
                name=#{name},
            </if>
            <if test="gender != null">
                gender=#{gender},
            </if>
            <if test="image != null and image !=''">
                image=#{image},
            </if>
            <if test="job != null">
                job=#{job},
            </if>
            <if test="entrydate != null">
                entrydate=#{entrydate},
            </if>
            <if test="deptId != null">
                dept_id=#{deptId},
            </if>
            <if test="updateTime != null">
                update_time=#{updateTime}
            </if>
        </set>
        where id = #{id};

    </update>
</mapper>
3.3.5API调试

image-20231129214416570

3.3.6前端联调

image-20231129214601275

image-20231129215010774

可以看到修改成功!!!

image-20231129215039207

4.配置文件

4.1参数配置化

4.1.1问题分析

项目中的参数配置过于分散,不方便集中的管理和维护

自定义的阿里云OSS配置信息application.properties

冷知识:alt + 鼠标左键 可以同时编辑多行

image-20231129221923936

image-20231129222217530

  • @value注解通常用于外部配置的属性注入,具体用法为:@Value("${配置文件中的key)")

image-20231129223800021

4.2yml配置文件

  • SpringBoot提供了多种属性配置方式

    • application.properties

      server.port=8080
      server.address=127.0.0.1
      
    • application.yml

      server:
        port: 9000
        address: 127.0.0.1
      
    • application.yaml

      server:
        port: 9000
        address: 127.0.0.1
      
  • 常见配置文件格式对比

4.3yml基本语法

  • 大小写敏感
  • 数值前边必须有空格,作为分隔符
  • 使用缩进表示层级关系,缩进时,不允许使用Tab键,只能用空格(idea中会自动将Tab转换为空格)缩进的空格
  • 数目不重要,只要相同层级的元素左侧对齐即可
  • #表示注释,从这个字符一直到行尾,都会被解析器忽略

4.4yml数据格式

  • 对象/Map集合

    user:
      name: zhangsan
      age: 18
      password: 123456
    
  • 数组/List/Set集合

    hobby:
      - java
      - game
      - sport
    

4.5yml配置

  • application.yml中的配置案例相关的配置项

    #端口配置
    server:
      port: 8080
    #mybatis的配置
    mybatis:
      mapper-locations: classpath:mappers/*xml
      type-aliases-package: com.bowen.mybatis.entity
      configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
        map-underscore-to-camel-case: true
    spring:
      #数据库连接信息
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/tlias
        username: root
        password: 密码
      #文件上传的配置
      servlet:
        multipart:
          max-file-size: 10MB
          max-request-size: 100MB
    #阿里云配置
    aliyun:
      oss:
        endpoint: 地域节点
        accessKeyId: AccessKey ID
        accessKeySecret: AccessKey Secret
        bucketName: 存储空间名称
    
    

4.6@ConfigurationProperties

4.6.1问题分析

image-20231129232209930

4.6.2解决方案

使用@ConfigurationProperties注解,前提:配置文件中key的名字=实体类中的属性名

image-20231129232442805

在utils下创建AliOSSProperties.java阿里云OSS的实体类

@Data
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class AliOSSProperties {
    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;
}

重新编写AliOSSUtils.java中的代码

@Component
public class AliOSSUtils {
    @Autowired
    private AliOSSProperties aliOSSProperties;

    /**
     * 实现上传图片到OSS
     */
    public String upload(MultipartFile file) throws IOException {
        //获取阿里云OSS参数
        String endpoint = aliOSSProperties.getEndpoint();
        String accessKeyId = aliOSSProperties.getAccessKeyId();
        String accessKeySecret = aliOSSProperties.getAccessKeySecret();
        String bucketName = aliOSSProperties.getBucketName();

        // 获取上传的文件的输入流
        InputStream inputStream = file.getInputStream();

        // 避免文件覆盖
        String originalFilename = file.getOriginalFilename();
        String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));

        //上传文件到 OSS
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        ossClient.putObject(bucketName, fileName, inputStream);

        //文件访问路径
        String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
        // 关闭ossClient
        ossClient.shutdown();
        return url;// 把上传到oss的路径返回
    }

}
4.6.3解决警告

image-20231129234451058

pom.xml文件中配置

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
</dependency>

引入依赖后可以看到灰色的提示

image-20231129235008044

application.yml中配置aliyun也有了提示信息

image-20231129235419040

@ConfigurationProperties@Value区别

相同点

  • 都是用来注入外部配置的属性的

不通点

  • @Value注解只能一个一个的进行外部属性的注入
        String originalFilename = file.getOriginalFilename();
        String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));

        //上传文件到 OSS
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        ossClient.putObject(bucketName, fileName, inputStream);

        //文件访问路径
        String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
        // 关闭ossClient
        ossClient.shutdown();
        return url;// 把上传到oss的路径返回
    }

}

解决警告

在这里插入图片描述

pom.xml文件中配置

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
</dependency>

引入依赖后可以看到灰色的提示

在这里插入图片描述

application.yml中配置aliyun也有了提示信息

在这里插入图片描述

4.7@ConfigurationProperties@Value区别

相同点

  • 都是用来注入外部配置的属性的

不同点

  • @Value注解只能一个一个的进行外部属性的注入
  • @ConfigurationProperties可以批量的将外部的属性配置注入到bean对象的属性中

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

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

相关文章

springboot + vue 企业级工位管理系统

qq&#xff08;2829419543&#xff09;获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;springboot 前端&#xff1a;采用vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xf…

【23-24 秋学期】NNDL 作业13 优化算法3D可视化

编程实现优化算法&#xff0c;并3D可视化 1. 函数3D可视化 分别画出和的3D图 NNDL实验 优化算法3D轨迹 鱼书例题3D版_优化算法3d展示-CSDN博客 2.加入优化算法&#xff0c;画出轨迹 分别画出和的3D轨迹图 从轨迹、速度等多个角度讲解各个算法优缺点 NNDL实验 优化算法3D轨…

Abaper入门实战篇 ——从 0 - 1 完成一个ALV

SAP ABAP 顾问&#xff08;开发工程师&#xff09;能力模型_Terry谈企业数字化的博客-CSDN博客文章浏览阅读516次。目标&#xff1a;基于对SAP abap 顾问能力模型的梳理&#xff0c;给一年左右经验的abaper 快速成长为三年经验提供超级燃料&#xff01;https://blog.csdn.net/j…

基于腾讯云手把手教你搭建网站

目录 前言前期准备工作具体搭建网站番外篇&#xff1a;网站开发及优化结束语 前言 在当今数字化时代浪潮之下&#xff0c;作为开发者拥有一个属于自己的网站是非常有必要的&#xff0c;也是展示个人形象、打造影响力和给别人提供服务的重要途径。网站不仅可以作为打造自己影响…

算法通关村-----跳跃游戏问题

跳跃游戏 问题描述 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 详见…

MySQL笔记-第02章_MySQL环境搭建

视频链接&#xff1a;【MySQL数据库入门到大牛&#xff0c;mysql安装到优化&#xff0c;百科全书级&#xff0c;全网天花板】 文章目录 第02章_MySQL环境搭建1. MySQL的卸载步骤1&#xff1a;停止MySQL服务步骤2&#xff1a;软件的卸载步骤3&#xff1a;残余文件的清理步骤4&am…

【网络安全技术】密钥管理

一、分级密钥概念 典型的密钥分级分为三级&#xff0c;三级密钥就是一次会话的session key&#xff0c;用来加密通信&#xff0c;所以通常使用对称密钥。 二级密钥就是分发三级密钥的密钥&#xff0c;用来加密三级密钥来分发三级密钥。 一级密钥就是分发二级密钥的密钥&…

Linux系统与python常用密码的加密解密方法

Linux系统与python常用加密&解密方法 文章目录 Linux系统与python常用加密&解密方法Linux系统加密解密方法一、openssl二、示例1、加密规则语法2、解密语法规则3、shell脚本 Python密码加密方法一、Base64加密1、加密2、解密 二、哈希算法加密三、Fernet对称加密算法1、…

运维03:LAMP

黄金架构LAMP 什么是LAMP LAMP是公认的最常见&#xff0c;最古老的黄金web技术栈 快速部署LAMP架构 #停止nginx&#xff0c;并且把nginx应用卸载了 systemctl stop nginx yum remove nginx -y#关闭防火墙 iptables -F #清空防火墙规则&#xff0c;比如哪些请求允许进入服…

7. 系统信息与系统资源

7. 系统信息与系统资源 1. 系统信息1.1 系统标识 uname()1.2 sysinfo()1.3 gethostname()1.4 sysconf() 2. 时间、日期2.1 Linux 系统中的时间2.1.1 Linux 怎么记录时间2.1.2 jiffies 的引入 2.2 获取时间 time/gettimeofday2.2.1 time()2.2.2 gettimeofday() 2.3 时间转换函数…

Java集合(二)

1. Map 1.1 HashMap 和 Hashtable 的区别 线程是否安全&#xff1a; HashMap 是非线程安全的&#xff0c;Hashtable 是线程安全的,因为 Hashtable 内部的方法基本都经过synchronized 修饰。&#xff08;如果你要保证线程安全的话就使用 ConcurrentHashMap 吧&#xff01;&…

[多线程]阻塞队列和生产者消费者模型

目录 1.阻塞队列 1.1引言 1.2Java标准库中的阻塞队列 1.3自主通过Java代码实现一个阻塞队列(泛型实现) 2.生产者消费者模型 1.阻塞队列 1.1引言 阻塞队列是多线程部分一个重要的概念,它相比于一般队列,有两个特点: 1.线程是安全的 2.带有阻塞功能 1) 队列为空,出队列就会阻…

鸿蒙HarmonyOS从零实现类微信app效果——基础界面搭建

最近鸿蒙HarmonyOS开发相关的消息非常的火&#xff0c;传言华为系手机后续将不再支持原生Android应用&#xff0c;所以对于原Android应用开发对应的Harmony版本也被一系列大厂提上了日程。作为一个名义上的移动端开发工程师&#xff08;(⊙o⊙)…&#xff0c;最近写python多过A…

应急响应-挖矿病毒处理

应急响应-挖矿病毒处理 使用top​命令实时监控占用CPU资源的是哪个进程&#xff0c;结果可以看到是2725这个进程。 ​​ 再使用netstat -anltp命令查看网络连接状态&#xff0c;定位到对应的PID号后&#xff0c;就拿到了远程地址 ​​ 拿到远程IP&#xff0c;结果是VPN入口…

JVM 运行时内存(三)

Java 堆从 GC 的角度还可以细分为: 新生代(Eden 区、From Survivor 区和 To Survivor 区)和老年代。 1. 新生代 是用来存放新生的对象。一般占据堆的 1/3 空间。由于频繁创建对象&#xff0c;所以新生代会频繁触发MinorGC 进行垃圾回收。新生代又分为 Eden 区、ServivorFrom、…

人工智能_机器学习059_非线性核函数_poly核函数_rbf核函数_以及linear核函数效果对比---人工智能工作笔记0099

人工智能_机器学习059_非线性核函数介绍---人工智能工作笔记0099 那么我们应该如何调整这个SVC的参数,也就是我们应该使用哪种核函数,比较合适呢?这取决于我们的数据,适合使用哪个核函数,正好我们有 提供的score = accuracy_score(y_test,y_pred) 这样的评分函数,我们可以根据…

B2B公司如何寻找意向客户的联系方式?

在B2B公司的营销过程中&#xff0c;少不了寻找意向客户的阶段&#xff0c;这也是销售过程中非常重要的一步。 很多新人都是拿到客户联系方式&#xff0c;就直接打电话拜访&#xff0c;俗话说不打没有准备的仗&#xff0c;因此在拜访客户之前就应该做好功课&#xff0c;充分了解…

AI医疗交流平台【Docola】申请823万美元纳斯达克IPO上市

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;总部位于美国的AI医疗交流平台Docola近期已向美国证券交易委员会&#xff08;SEC&#xff09;提交招股书&#xff0c;申请在纳斯达克IPO上市&#xff0c;股票代码为 (DOCO) &#xff0c;Docola计划…

【五分钟】熟练使用numpy的histogram函数(干货!!!)

histogram函数重要参数详解 def histogram(a, bins10, rangeNone, normedNone, weightsNone, densityNone):...位置参数a&#xff1a; The histogram is computed over the flattened array.&#xff08;源码对参数a的解释&#xff09; 从源码对参数a的解释来看&#xff0c;参…

从0开始使用Maven

文章目录 一.Maven的介绍即相关概念1.为什么使用Maven/Maven的作用2.Maven的坐标 二.Maven的安装三.IDEA编译器配置Maven环境1.在IDEA的单个工程中配置Maven环境2.方式2&#xff1a;配置Maven全局参数 四.IDEA编译器创建Maven项目五.IDEA中的Maven项目结构六.IDEA编译器导入Mav…