三、前后端分离通用权限系统(3)

news2024/11/16 14:22:49

🌻🌻目录

  • 一、角色管理
    • 1.1、测试 controller 层
    • 1.2、整合 Swagger2
      • 1.2.1、Swagger 介绍
      • 1.2.2、集成 knife4j
        • 1.2.2.1 添加依赖
        • 1.2.2.2 添加 knife4j 配置类
        • 1.2.2.3 Controller 层添加注解
        • 1.2.2.4、测试
    • 1.3、定义统一返回结果对象
      • 1.3.1、定义统一返回结果对象
      • 1.3.2、改造 controller 方法
    • 1.4、分页查询
      • 1.4.1、配置分页插件
      • 1.4.2、分页 controller
      • 1.4.3、service
      • 1.4.4、mapper
      • 1.4.5、xml
    • 1.5、其他 controller 方法
      • 1.5.1 添加角色接口
      • 1.5.2 根据id查询,修改,批量删除角色接口
    • 1.6、统一异常处理
      • 1.6.1、制造异常
      • 1.6.2、全局异常处理
      • 1.6.3、特定异常处理
      • 1.6.4、自定义异常类

一、角色管理

在这里插入图片描述

1.1、测试 controller 层

service-system下面创建包:com.gansu.system.controller,并创建类 SysRoleController

① 查询接口

在这里插入图片描述

package com.gansu.system.controller;


import com.gansu.model.system.SysRole;
import com.gansu.system.service.SysRoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/admin/system/sysrole")
public class SysRoleController {

    @Autowired
    private SysRoleService sysRoleService;

    @GetMapping("findAll")  //localhost:8800/admin/system/sysrole/findAll
    public List<SysRole>  findAll(){
        //调用service
        List<SysRole> list = sysRoleService.list();

        return list;
    }
}

测试:http://localhost:8800/admin/system/sysrole/findAll

在这里插入图片描述

② 逻辑删除接口

在这里插入图片描述

//2.逻辑删除接口
@DeleteMapping("remove/{id}")
public boolean remove(@PathVariable  Long id){

    boolean isRemove = sysRoleService.removeById(id);

    return  isRemove;
}

测试:http://localhost:8800/admin/system/sysrole/remove/1

问题:

在这里插入图片描述

分析:浏览器目前只支持get提交,其它的暂且不支持,所以得采用第三方测试接口。

idea中也可以测试,这个我前面总结中还没提到过:

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

1.2、整合 Swagger2

1.2.1、Swagger 介绍

前后端分离开发模式中,api文档是最好的沟通方式。

  • Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。
  • 1、及时性 (接口变更后,能够及时准确地通知相关前后端开发人员)
  • 2、规范性 (并且保证接口的规范性,如接口的地址,请求方式,参数及响应格式和错误信息)
  • 3、一致性 (接口信息一致,不会出现因开发人员拿到的文档版本不一致,而出现分歧)
  • 4、可测性 (直接在接口文档上进行测试,以方便理解业务)

1.2.2、集成 knife4j

文档地址:https://doc.xiaominfo.com/

knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案。

knife4j属于service模块公共资源,因此我们集成到service-uitl模块

1.2.2.1 添加依赖

操作模块:service-uitl

① 引入依赖

在这里插入图片描述

<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-spring-boot-starter</artifactId>
</dependency>

说明:gansu-auth-parent已加入版本管理

1.2.2.2 添加 knife4j 配置类

操作模块:service-uitl

创建包:com.gansu.system.config 创建类 :Knife4jConfig并导入如下配置:

在这里插入图片描述

package com.gansu.system.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;

import java.util.ArrayList;
import java.util.List;

/**
 * knife4j配置信息
 */
@Configuration
@EnableSwagger2WebMvc
public class Knife4jConfig {

    @Bean
    public Docket adminApiConfig(){
        List<Parameter> pars = new ArrayList<>();
        ParameterBuilder tokenPar = new ParameterBuilder();
        tokenPar.name("token")
                .description("用户token")
                .defaultValue("")
                .modelRef(new ModelRef("string"))
                .parameterType("header")
                .required(false)
                .build();
        pars.add(tokenPar.build());
        //添加head参数end

        Docket adminApi = new Docket(DocumentationType.SWAGGER_2)
                .groupName("adminApi")
                .apiInfo(adminApiInfo())
                .select()
                //只显示admin路径下的页面
                .apis(RequestHandlerSelectors.basePackage("com.gansu"))
                .paths(PathSelectors.regex("/admin/.*"))
                .build()
                .globalOperationParameters(pars);
        return adminApi;
    }

    private ApiInfo adminApiInfo(){

        return new ApiInfoBuilder()
                .title("后台管理系统-API文档")
                .description("本文档描述了后台管理系统微服务接口定义")
                .version("1.0")
                .contact(new Contact("gansu", "http://gansu.com", "gansu@qq.com"))
                .build();
    }
}
1.2.2.3 Controller 层添加注解

在这里插入图片描述

package com.gansu.system.controller;


import com.gansu.model.system.SysRole;
import com.gansu.system.service.SysRoleService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Api(tags = "角色管理")
@RestController
@RequestMapping("/admin/system/sysrole")
public class SysRoleController {

    @Autowired
    private SysRoleService sysRoleService;

    //2.逻辑删除接口
    @ApiOperation(value = "逻辑删除")
    @DeleteMapping("remove/{id}")
    public boolean remove(@PathVariable  Long id){

        boolean isRemove = sysRoleService.removeById(id);

        return  isRemove;
    }

    //1.查询所有记录
    @ApiOperation(value = "获取全部角色列表")
    @GetMapping("findAll")  //localhost:8800/admin/system/sysrole/findAll
    public List<SysRole>  findAll(){
        //调用service
        List<SysRole> list = sysRoleService.list();

        return list;
    }
}
1.2.2.4、测试

http://localhost:8800/doc.html

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

1.3、定义统一返回结果对象

  • 项目中我们会将响应封装成json返回,一般我们会将所有接口的数据格式统一, 使前端(iOS Android, Web)对数据的操作更一致、轻松。
  • 一般情况下,统一返回数据格式没有固定的格式,只要能描述清楚返回的数据状态以及要返回的具体数据就可以。但是一般会包含状态码、返回消息、数据这几部分内容

例如,我们的系统要求返回的基本数据格式如下:

列表:

{
  "code": 200,
  "message": "成功",
  "data": [
    {
      "id": 2,
      "roleName": "系统管理员"
    }
  ],
  "ok": true
}

分页:

{
  "code": 200,
  "message": "成功",
  "data": {
    "records": [
      {
        "id": 2,
        "roleName": "系统管理员"
      },
      {
        "id": 3,
        "name": "普通管理员"
      }
    ],
    "total": 10,
    "size": 3,
    "current": 1,
    "orders": [],
    "hitCount": false,
    "searchCount": true,
    "pages": 2
  },
  "ok": true
}

没有返回数据:

{
  "code": 200,
  "message": "成功",
  "data": null,
  "ok": true
}

失败:

{
  "code": 201,
  "message": "失败",
  "data": null,
  "ok": false
}

1.3.1、定义统一返回结果对象

操作模块:common-util

后续其他模块也会用到,故抽取到common-util模块

在模块 common-util 下面创建包 com.gansu.common.result 再分别创建工具类 ResultCodeEnumResult 并分导入下面代码:

在这里插入图片描述

ResultCodeEnum

统一返回结果状态信息类

下面的状态后续都会用到,所以直接引入了

package com.gansu.common.result;

import lombok.Getter;

/**
 * 统一返回结果状态信息类
 *
 */
@Getter
public enum ResultCodeEnum {

    SUCCESS(200,"成功"),
    FAIL(201, "失败"),
    SERVICE_ERROR(2012, "服务异常"),
    DATA_ERROR(204, "数据异常"),
    ILLEGAL_REQUEST(205, "非法请求"),
    REPEAT_SUBMIT(206, "重复提交"),
    ARGUMENT_VALID_ERROR(210, "参数校验异常"),

    LOGIN_AUTH(208, "未登陆"),
    PERMISSION(209, "没有权限"),
    ACCOUNT_ERROR(214, "账号不正确"),
    PASSWORD_ERROR(215, "密码不正确"),
    LOGIN_MOBLE_ERROR( 216, "账号不正确"),
    ACCOUNT_STOP( 217, "账号已停用"),
    NODE_ERROR( 218, "该节点下有子节点,不可以删除")
    ;

    private Integer code;

    private String message;

    private ResultCodeEnum(Integer code, String message) {
        this.code = code;
        this.message = message;
    }
}

Result

package com.gansu.common.result;


import lombok.Data;

/**
 * 全局统一返回结果类
 *
 */
@Data
public class Result<T> {
    //返回码
    private Integer code;

    //返回消息
    private String message;

    //返回数据
    private T data;

    public Result(){}

    // 返回数据
    protected static <T> Result<T> build(T data) {
        Result<T> result = new Result<T>();
        if (data != null)
            result.setData(data);
        return result;
    }

    public static <T> Result<T> build(T body, Integer code, String message) {
        Result<T> result = build(body);
        result.setCode(code);
        result.setMessage(message);
        return result;
    }

    public static <T> Result<T> build(T body, ResultCodeEnum resultCodeEnum) {
        Result<T> result = build(body);
        result.setCode(resultCodeEnum.getCode());
        result.setMessage(resultCodeEnum.getMessage());
        return result;
    }

    public static<T> Result<T> ok(){
        return Result.ok(null);
    }

    /**
     * 操作成功
     * @param data  baseCategory1List
     * @param <T>
     * @return
     */
    public static<T> Result<T> ok(T data){
        Result<T> result = build(data);
        return build(data, ResultCodeEnum.SUCCESS);
    }

    public static<T> Result<T> fail(){
        return Result.fail(null);
    }

    /**
     * 操作失败
     * @param data
     * @param <T>
     * @return
     */
    public static<T> Result<T> fail(T data){
        Result<T> result = build(data);
        return build(data, ResultCodeEnum.FAIL);
    }

    public Result<T> message(String msg){
        this.setMessage(msg);
        return this;
    }

    public Result<T> code(Integer code){
        this.setCode(code);
        return this;
    }
}

1.3.2、改造 controller 方法

可以手动引入 工具类common-util

在这里插入图片描述

遇到如下问题:idea右边maven模块是灰色的

在这里插入图片描述

解决:三、idea识别不出来项目中某些Maven模块,显示模块为“灰色”

在这里插入图片描述

package com.gansu.system.controller;


import com.gansu.common.result.Result;
import com.gansu.model.system.SysRole;
import com.gansu.system.service.SysRoleService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Api(tags = "角色管理")
@RestController
@RequestMapping("/admin/system/sysrole")
public class SysRoleController {

    @Autowired
    private SysRoleService sysRoleService;

    //2.逻辑删除接口
    @ApiOperation(value = "逻辑删除")
    @DeleteMapping("remove/{id}")
    public Result remove(@PathVariable  Long id){

        boolean isRemove = sysRoleService.removeById(id);

        if (isRemove) {
          return Result.ok();
        } else {
           return Result.fail();
        }
    }

    //1.查询所有记录
    @ApiOperation(value = "获取全部角色列表")
    @GetMapping("findAll")  //localhost:8800/admin/system/sysrole/findAll
    public Result<List<SysRole>> findAll(){
        //调用service
        List<SysRole> roleList = sysRoleService.list();
        return Result.ok(roleList);
    }
}

再次启动主启动类测试:

在这里插入图片描述

删除测试:

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

1.4、分页查询

1.4.1、配置分页插件

操作模块:service-uitlservice公共资源

分页插件

条件分页查询步骤:

  • 第一步 配置分页插件,通过配置类实现
  • 第二步 创建controller方法,:,创建service方法,创建mapper方法
  • 第三步 创建mapper的xml配置文件,编写sql语句实现

说明:我们将@MapperScan("com.gansu.system.mapper")提取到该配置类上面,统一管理,启动类就不需要了。

官网复制分页配置类:

在这里插入图片描述

在这里插入图片描述

package com.gansu.system.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@MapperScan("com.gansu.system.mapper")
public class MybatisPlusConfig {

    /**
     * 添加分页插件
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        // 如果配置多个插件, 切记分页最后添加
        // 如果有多数据源可以不配具体类型, 否则都建议配上具体的 DbType
        return interceptor;
    }
}

1.4.2、分页 controller

在这里插入图片描述

//3.条件分页查询  pageNum 当前页 limit 每页显示的条数  SysRoleQueryVo 封装条件的
@ApiOperation(value = "条件分页查询")
@GetMapping("{pageNum}/{limit}")
public Result findSysRoleByLimitPage(
       @ApiParam(name = "pageNum", value = "当前页码", required = true)
       @PathVariable Long pageNum,
       @ApiParam(name = "limit", value = "每页记录数", required = true)
       @PathVariable Long limit,
       @ApiParam(name = "roleQueryVo", value = "查询对象", required = true)
       SysRoleQueryVo roleQueryVo){

   Page<SysRole> pageParam = new Page<>(pageNum,limit);

   IPage<SysRole> pageModel = sysRoleService.selectByPageSysRole(pageParam,roleQueryVo);

   return Result.ok(pageModel);
}

1.4.3、service

在这里插入图片描述

/*条件分页查询*/
IPage<SysRole> selectByPageSysRole(Page<SysRole> pageParam, SysRoleQueryVo roleQueryVo);

在这里插入图片描述

@Override /*条件分页查询*/
public IPage<SysRole> selectByPageSysRole(Page<SysRole> pageParam, SysRoleQueryVo roleQueryVo) {

    IPage<SysRole> selectByPageSysRole =  baseMapper.selectByPageSysRole(pageParam,roleQueryVo);

    return selectByPageSysRole;
}

1.4.4、mapper

在这里插入图片描述

/*条件分页查询*/
IPage<SysRole> selectByPageSysRole(Page<SysRole> pageParam, @Param("vo") SysRoleQueryVo roleQueryVo);

1.4.5、xml

resources目录下创建mapper/SysRoleMapper.xml文件

  • 说明:分页我们统一定义到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.gansu.system.mapper.SysRoleMapper">
    <sql id="columns">
      role_name,role_code,description,create_time,update_time,is_deleted
    </sql>
    <resultMap id="sysRoleMap" type="com.gansu.model.system.SysRole" autoMapping="true">
    </resultMap>
    <select id="selectByPageSysRole" resultMap="sysRoleMap">
        SELECT <include  refid="columns"></include> FROM sys_role
        <where>
            <if test="vo.roleName != null and vo.roleName != ''">
               and  role_name like CONCAT('%',#{vo.roleName},'%')
            </if>
            and is_deleted = 0
        </where>
        order by id desc
    </select>
</mapper>

启动主程序进行测试:

在这里插入图片描述

1.5、其他 controller 方法

1.5.1 添加角色接口

在这里插入图片描述

//4.添加角色的接口
@ApiOperation(value = "添加角色")
@PostMapping("addSysRole")
// @RequestBody 不能使用get提交方式 传递json格式数据,把json格式数据封装到对象里面{...}
public Result addSysRole(@RequestBody SysRole sysRole){

   boolean isSuccess = sysRoleService.save(sysRole);

   if (isSuccess){
       return Result.ok(sysRole);
   }else {
       return Result.fail(sysRole);
   }
}

在这里插入图片描述

在这里插入图片描述

1.5.2 根据id查询,修改,批量删除角色接口

在这里插入图片描述

//7.批量删除
@ApiOperation(value = "批量删除")
@DeleteMapping("batchDeleteById")
public Result batchDeleteById(@RequestBody  List<Long> ids){

    sysRoleService.removeByIds(ids);

    return Result.ok();
}


//6.根据id修改
@ApiOperation(value = "根据id修改")
@PutMapping("updateById")
public Result updateById(SysRole sysRole){

    boolean isSuccess = sysRoleService.updateById(sysRole);

    if (isSuccess){
        return Result.ok(sysRole);
    }else {
        return Result.fail(sysRole);
    }

}

//5.根据id查询
@ApiOperation(value = "根据id查询")
@GetMapping("findSysRoleById/{id}")
public Result findSysRoleById(@PathVariable long id){

    sysRoleService.getById(id);

    return Result.ok();
}

修改接口测试:

在这里插入图片描述

修改前:

在这里插入图片描述

修改后:

在这里插入图片描述

批量删除前后:

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

在这里插入图片描述

1.6、统一异常处理

在这里插入图片描述

1.6.1、制造异常

除以0

我们想让异常结果也显示为统一的返回结果对象,并且统一处理系统的异常信息,那么需要统一异常处理。

① 制造异常

在这里插入图片描述

1.6.2、全局异常处理

操作模块:service-util

② 全局异常处理:

在这里插入图片描述

package com.gansu.system.exception;


import com.gansu.common.result.Result;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    @ResponseBody
    public Result error(Exception e){

        e.printStackTrace();
        return Result.fail().message("执行了全局异常");

    }
}

测试:

在这里插入图片描述

1.6.3、特定异常处理

③ 特定异常处理:

在这里插入图片描述

@ExceptionHandler(ArithmeticException.class)
@ResponseBody
public Result error(ArithmeticException e){
    System.out.println("特定异常执行了。。。。。。。。。");
    e.printStackTrace();
    return Result.fail().message("执行了特定异常");
}

启动主程序进行测试:

在这里插入图片描述

在这里插入图片描述

1.6.4、自定义异常类

① 创建类 GansuException

在这里插入图片描述

package com.gansu.system.exception;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class GansuException extends RuntimeException {

    private Integer code; //异常状态码
    private String msg; //抛出异常的信息
}

② 添加自定义异常类,异常处理方法

在这里插入图片描述

@ExceptionHandler(GansuException.class)
@ResponseBody
public Result error(GansuException e){
    System.out.println("自定义异常执行了。。。。。。。。。");
    e.printStackTrace();
    return Result.fail().message(e.getMsg()).code(e.getCode());
}

③ 修改 controller,业务中需要位置抛出

在这里插入图片描述

//1.查询所有记录
@ApiOperation(value = "获取全部角色列表")
@GetMapping("findAll")  //localhost:8800/admin/system/sysrole/findAll
public Result<List<SysRole>> findAll(){
    try {
        int i = 9/0;
    }catch (Exception e){
        e.printStackTrace();
        throw new GansuException(200001,"执行了自定义异常");
    }
    //调用service
    List<SysRole> roleList = sysRoleService.list();
    return Result.ok(roleList);
}

④ 启动主启动类进行测试

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

备战秋招60天算法挑战,Day21

题目链接&#xff1a; https://leetcode.cn/problems/number-of-1-bits/ 视频题解&#xff1a; https://www.bilibili.com/video/BV1ir421M7XU/ LeetCode 191.位1的个数 题目描述 编写一个函数&#xff0c;输入是一个无符号整数 &#xff08;以二进制串的形式&#xff09;&am…

C语言 ——— 学习并使用calloc和realloc函数

目录 calloc函数的功能 学习并使用calloc函数​编辑 realloc函数的功能 学习并使用realloc函数​编辑 calloc函数的功能 calloc函数的功能和malloc函数的功能类似&#xff0c;于malloc函数的区别只在于calloc函数会再返回地址之前把申请的空间的每个字节初始化为全0 C语言…

tweens运动详解

linear 线性匀速运动效果Sine.easeIn 正弦曲线的缓动(sin(t))/ 从0开始加速的缓动,也就是先慢后快Sine.easeOut 正弦曲线的缓动(sin(t))/ 减速到0的缓动,也就是先快后慢Sine.easeInOut 正弦曲线的缓动(sin(t))/ 前半段从0开始加速,后半段减速到0的缓动Quad.easeIn 二次…

c语言基础-------指针变量和变量指针

在 C 语言中,“变量指针”和“指针变量”这两个术语虽然经常交替使用,但它们的侧重点有所不同。 指针变量 “指针变量”是指其值为内存地址的变量。指针变量的类型定义了它所指向的数据类型,例如 int * 是一个指向整型数据的指针变量。 以下是一个指针变量的例子: int v…

数据埋点系列 16| 数据可视化高级技巧:从洞察到视觉故事

数据可视化是将复杂数据转化为直观、易懂的视觉表现的艺术和科学。本文将探讨一些高级的数据可视化技巧&#xff0c;帮助您创建更具吸引力和洞察力的数据展示。 目录 1. 高级图表类型1.1 桑基图&#xff08;Sankey Diagram&#xff09;1.2 树状图&#xff08;Treemap&#xf…

3、目标定位(视觉测距)

目标定位的目的&#xff1a;获取物品相对于视觉模块的三维坐标&#xff0c;并将其转换为物品相对于机械臂坐标原点的三维坐标。 要获取物品三维坐标&#xff0c;则首先要测量物品距离摄像头的距离&#xff0c;又因为摄像头安装在机械臂末端上方&#xff0c;所以获取物品相对于摄…

基于springboot的高校学生服务平台的设计与实现--附源码91686

目录 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1系统开发流程 2.2.2 用户登录流程 2.2.3 系统操作流程 2.2.4 添加信息流程 2.2.5 修改信息流程 2.2.6 删除信息流程 2.3 系统功能分析 …

代码随想录算法训练营第二十天| 235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点

目录 一、LeetCode 235. 二叉搜索树的最近公共祖先思路&#xff1a;C代码 二、LeetCode 701.二叉搜索树中的插入操作思路C代码 三、LeetCode 450.删除二叉搜索树中的节点思路C代码 总结 一、LeetCode 235. 二叉搜索树的最近公共祖先 题目链接&#xff1a;LeetCode 235. 二叉搜…

C语言:for、while、do-while循环语句

目录 前言 一、while循环 1.1 while语句的执行流程 1.2 while循环的实践 1.3 while循环中的break和continue 1.3.1 break 1.3.2 continue 二、for循环 2.1 语法形式 2.2 for循环的执行流程 2.3 for循环的实践 2.4 for循环中的break和continue 2.4.1 break 2.4.2 …

Java数组03:数组边界、数组的使用

本节内容视频链接&#xff1a;https://www.bilibili.com/video/BV12J41137hu?p55&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5https://www.bilibili.com/video/BV12J41137hu?p55&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.数组边界 数组下标的合法区间[ 0, Len…

综合监管云平台存在信息泄露漏洞_中科智远综合监管云平台

0x01阅读须知 本文章仅供参考&#xff0c;此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考。本文章仅用于信息安全防御技术分享&#xff0c;因用于其他用途而产生不良后果,作者不承担任何法律责任&#…

昇腾 - 快速理解AscendCL(Ascend Computing Language)基础概念的HelloWord

昇腾 - 快速理解AscendCL&#xff08;Ascend Computing Language&#xff09;基础概念的HelloWord flyfish AscendCL&#xff08;Ascend Computing Language&#xff09;是一套用于在昇腾平台上开发深度神经网络应用的C语言API库&#xff0c;提供运行资源管理、内存管理、模型…

鸿蒙(API 12 Beta3版)【录像流二次处理(C/C++)】媒体相机开发指导

通过ImageReceiver创建录像输出&#xff0c;获取录像流实时数据&#xff0c;以供后续进行图像二次处理&#xff0c;比如应用可以对其添加滤镜算法等。 开发步骤 导入NDK接口&#xff0c;接口中提供了相机相关的属性和方法&#xff0c;导入方法如下。 // 导入NDK接口头文件#in…

ArcGIS Pro基础:软件的常用设置:中文语言、自动保存、默认底图

上图所示&#xff0c;在【选项】&#xff08;Options&#xff09;里找到【语言】设置&#xff0c;将语言切换为中文选项&#xff0c;记得在安装软件时&#xff0c;需要提前安装好ArcGIS语言包。 上图所示&#xff0c;在【选项】里找到【编辑】设置&#xff0c;可以更改软件默认…

Java面试八股之如何保证消息队列中消息不重复消费

如何保证消息队列中消息不重复消费 要保证消息队列中的消息不被重复消费&#xff0c;通常需要从以下几个方面来着手&#xff1a; 消息确认机制&#xff1a; 对于像RabbitMQ这样的消息队列系统&#xff0c;可以使用手动确认&#xff08;manual acknowledge&#xff09;机制来…

Eureka原理与实践:构建高效的微服务架构

Eureka原理与实践&#xff1a;构建高效的微服务架构 Eureka的核心原理Eureka Server&#xff1a;服务注册中心Eureka Client&#xff1a;服务提供者与服务消费者 Eureka的实践应用集成Eureka到Spring Cloud项目中创建Eureka Server创建Eureka Client&#xff08;服务提供者&…

ISA95 企业控制集成标准

ANSI/ISA-95 企业控制系统集成介绍及其全系列最新标准下载&#xff08;转&#xff09;https://www.cnblogs.com/TonyJia/p/17616347.html ANSI 1. 综述 ISA-95 简称S95&#xff0c;也有称作SP95。ISA-95 是企业系统与控制系统集成国际标准&#xff0c;由国际自动化学会(ISA…

react最好用的swiper插件和拖动插件 react-tiny-slider react-draggable

react移动端项目&#xff0c;其实有挺多的ui框架的&#xff0c;但是我们公司的项目&#xff0c;都是自己封装的ui库&#xff0c;又不可能为了一个轮播图就去再安装一个ui库 所以找了很多的轮播插件&#xff0c;都是不能满足需求 最后找到了它&#xff0c;react-tiny-slider&…

1 什么是linux驱动

1 目录 1 一、什么是linux驱动&#xff1f; 1、驱动的作用 2、 3、驱动的分类 4、linux源码 5、最简单的linux驱动 二、如何编译驱动程序 -- 有两种编译方法&#xff1a; -- 什么是Linux内核模块&#xff1f; -- Linux内核模块的编译 一、什么是linux驱动&#xff…

原生HTML5、CSS、JavaScript实现简易网易云音乐播放

1.效果图 2.源码 1.index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>网易云音乐</title><link rel"stylesheet" href"../CSS/index.css"> </head>…