Mybatis-plus生成代码

news2024/12/24 20:37:50

生成类

package com.lbdj.user.service;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.lbdj.user.service.common.utils.EnhanceVelocityTemplateEngine;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class CodeGenerator {

    public static void main(String[] args) {
        // 数据源配置
        FastAutoGenerator.create("jdbc:mysql://000.000.000.00:0000/lbdj?useUnicode=true&characterEncoding=utf8&useSSL=true&", "root", "root")
                .globalConfig(builder -> {
                    // 设置作者
                    builder.author("作者")
                            //开启 swagger 模式 默认值:false
                            //.enableSwagger()
                            //禁止打开输出目录 默认值:true
                            .disableOpenDir()
                            //注释日期
                            .commentDate("yyyy-MM-dd")
                            //定义生成的实体类中日期类型 DateType.ONLY_DATE 默认值: DateType.TIME_PACK
                            .dateType(DateType.ONLY_DATE)
                            .outputDir(System.getProperty("user.dir")+"/src/main/java"); // 指定输出目录
                })

                .packageConfig(builder -> {
                    builder.parent("com.lbdj.user.service") // 父包模块名
                            .controller("controller")   //Controller 包名 默认值:controller
                            .entity("entity")           //Entity 包名 默认值:entity
                            .service("service")         //Service 包名 默认值:service
                            .serviceImpl("service.impl")
                            .mapper("mapper")           //Mapper 包名 默认值:mapper
                            .other("dto") // 设置dto包名
                            //.moduleName("xxx")        // 设置父包模块名 默认值:无
                            .pathInfo(Collections.singletonMap(OutputFile.xml, System.getProperty("user.dir")+"/src/main/resources/mybatis/mapper")); // 设置mapperXml生成路径
                    //默认存放在mapper的xml下
                })

                .injectionConfig(consumer -> {
                    Map<String, String> customFile = new HashMap<>();
                    // DTO、VO
                    customFile.put("DTO.java", "/templates/entityDTO.java.vm");
                    //customFile.put("VO.java", "/templates/entityVO.java.ftl");
                    consumer.customFile(customFile);
                })

                .strategyConfig(builder -> {
                    // 设置需要生成的表名
                    //如果无法输入请修改idea配置:help -> Edit Custom VM Options -> 最后追加:-Deditable.java.test.console=true  -> 重启idea
                    Scanner scanner = new Scanner(System.in);
                    System.out.println("请输入需要生成的表名,多个用逗号隔开:");
                    String tables = scanner.next();
                    scanner.close();
                    builder.addInclude(tables) // 设置需要生成的表名 可边长参数“user”, “user1”
                            //.addTablePrefix("tb_", "gms_") // 设置过滤表前缀
                            .serviceBuilder()//service策略配置
                            .formatServiceFileName("%sService")
                            .formatServiceImplFileName("%sServiceImpl")
                            .entityBuilder()// 实体类策略配置
                            //.idType(IdType.ASSIGN_ID)//主键策略  雪花算法自动生成的id
                            //.addTableFills(new Column("create_time", FieldFill.INSERT)) // 自动填充配置
                            //.addTableFills(new Property("update_time", FieldFill.INSERT_UPDATE))
                            .enableLombok() //开启lombok
                            .logicDeleteColumnName("deleted")// 说明逻辑删除是哪个字段
                            .enableTableFieldAnnotation()// 属性加上注解说明
                            .controllerBuilder() //controller 策略配置
                            .formatFileName("%sController")
                            .enableRestStyle() // 开启RestController注解
                            .mapperBuilder()// mapper策略配置
                            .formatMapperFileName("%sMapper")
                            .enableMapperAnnotation()//@mapper注解开启
                            .formatXmlFileName("%sMapper");
                })
                // 使用Freemarker引擎模板,默认的是Velocity引擎模板
                .templateEngine(new EnhanceVelocityTemplateEngine())
                .execute();
    }
}
package com.lbdj.user.service.common.utils;

import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;
import java.io.File;
import java.util.Map;

public class EnhanceVelocityTemplateEngine extends VelocityTemplateEngine {
    @Override
    protected void outputCustomFile(Map<String, String> customFile,
                                    TableInfo tableInfo, Map<String, Object> objectMap) {

        // 可以调用 tableInfo 的getFieldNames方法获得所有的列
        this.printTableColumn(tableInfo);

        // objectMap 里的key可以在ftl文件中直接引用
        String entityName = tableInfo.getEntityName();
        String otherPath = this.getPathInfo(OutputFile.other);
        customFile.forEach((key, value) -> {
            // 拼接路径
            String fileName = String.format(otherPath + File.separator + entityName + "%s", key);
            this.outputFile(new File(fileName), objectMap, value);
        });
    }

    /**
     * 获得所有的表列名
     *
     * @param tableInfo 表信息
     */
    private void printTableColumn(TableInfo tableInfo) {
    }

}

生成模板,放在resources/templates文件夹里

controller.java.vm

package ${package.Controller};
#set($entity = ${entity})
#set($lowerCaseEntity = $entity.substring(0,1).toLowerCase() + $entity.substring(1))
import org.springframework.web.bind.annotation.RequestMapping;
import ${package.Parent}.common.constant.NumberCons;
import ${package.Parent}.dto.${entity}DTO;
import ${package.Parent}.common.advice.exception.RRException;
import org.springframework.util.CollectionUtils;
import java.util.List;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.beans.factory.annotation.Autowired;
import ${package.Parent}.service.${entity}Service;
#if(${restControllerStyle})
import org.springframework.web.bind.annotation.RestController;
#else
import org.springframework.stereotype.Controller;
#end
#if(${superControllerClassPackage})
import ${superControllerClassPackage};
#end

/**
 * $!{table.comment} 前端控制器
 *
 * @author ${author}
 * @since ${date}
 */
#if(${restControllerStyle})
@RestController
#else
@Controller
#end
@RequestMapping("#if(${package.ModuleName})/${package.ModuleName}#end/#if(${controllerMappingHyphenStyle})${controllerMappingHyphen}#else${table.entityPath}#end")
#if(${kotlin})
class ${table.controllerName}#if(${superControllerClass}) : ${superControllerClass}()#end

#else
#if(${superControllerClass})
public class ${table.controllerName} extends ${superControllerClass} {
#else
public class ${table.controllerName} {
#end

    @Autowired
    private ${entity}Service ${lowerCaseEntity}Service;

    /**
     * 公共查询List
     * @param request
     * @return 返回多条信息
     */
    @PostMapping("/selectList")
    public List<${entity}DTO> selectList(@RequestBody ${entity}DTO request) {
        Integer limit = request.getLimit();
        if (null == limit) {
            request.setLimit(NumberCons.TWENTY);
        }
        List<${entity}DTO> result = ${lowerCaseEntity}Service.selectBase(request);
        return result;
    }

    /**
     * 公共查询One
     * @param request
     * @return 返回一条信息
     */
    @PostMapping("/selectOne")
    public ${entity}DTO selectOne(@RequestBody ${entity}DTO request) {
        request.setLimit(NumberCons.TWO);
        List<${entity}DTO> result = ${lowerCaseEntity}Service.selectBase(request);
        if (CollectionUtils.isEmpty(result)) {
            return null;
        }
        if (result.size() > NumberCons.ONE) {
        throw new RRException("记录存在多条!");
        }
        return result.get(NumberCons.zero);
    }
}
#end

 entity.java.vm

package ${package.Entity};

#foreach($pkg in ${table.importPackages})
import ${pkg};
#end
#if(${swagger})
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
#end
#if(${entityLombokModel})
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
#if(${chainModel})
import lombok.experimental.Accessors;
#end
#end

/**
 * $!{table.comment}
 *
 * @author ${author}
 * @since ${date}
 */
#if(${entityLombokModel})
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
  #if(${chainModel})
@Accessors(chain = true)
  #end
#end
#if(${table.convert})
@TableName("${schemaName}${table.name}")
#end
#if(${swagger})
@ApiModel(value = "${entity}对象", description = "$!{table.comment}")
#end
#if(${superEntityClass})
public class ${entity} extends ${superEntityClass}#if(${activeRecord})<${entity}>#end {
#elseif(${activeRecord})
public class ${entity} extends Model<${entity}> {
#elseif(${entitySerialVersionUID})
public class ${entity} implements Serializable {
#else
public class ${entity} {
#end
#if(${entitySerialVersionUID})

    private static final long serialVersionUID = 1L;
#end
## ----------  BEGIN 字段循环遍历  ----------
#foreach($field in ${table.fields})

#if(${field.keyFlag})
#set($keyPropertyName=${field.propertyName})
#end
#if("$!field.comment" != "")
  #if(${swagger})
    @ApiModelProperty("${field.comment}")
  #else
    /**
     * ${field.comment}
     */
  #end
#end
#if(${field.keyFlag})
## 主键
  #if(${field.keyIdentityFlag})
  @TableId(value = "${field.annotationColumnName}", type = IdType.AUTO)
  #elseif(!$null.isNull(${idType}) && "$!idType" != "")
    @TableId(value = "${field.annotationColumnName}", type = IdType.${idType})
  #elseif(${field.convert})
    @TableId("${field.annotationColumnName}")
  #end
## 普通字段
#elseif(${field.fill})
## -----   存在字段填充设置   -----
  #if(${field.convert})
    @TableField(value = "${field.annotationColumnName}", fill = FieldFill.${field.fill})
  #else
    @TableField(fill = FieldFill.${field.fill})
  #end
#elseif(${field.convert})
    @TableField("${field.annotationColumnName}")
#end
## 乐观锁注解
#if(${field.versionField})
    @Version
#end
## 逻辑删除注解
#if(${field.logicDeleteField})
    @TableLogic
#end
    private ${field.propertyType} ${field.propertyName};
#end
## ----------  END 字段循环遍历  ----------

#if(!${entityLombokModel})
#foreach($field in ${table.fields})
  #if(${field.propertyType.equals("boolean")})
    #set($getprefix="is")
  #else
    #set($getprefix="get")
  #end

    public ${field.propertyType} ${getprefix}${field.capitalName}() {
        return ${field.propertyName};
    }

  #if(${chainModel})
    public ${entity} set${field.capitalName}(${field.propertyType} ${field.propertyName}) {
  #else
    public void set${field.capitalName}(${field.propertyType} ${field.propertyName}) {
  #end
        this.${field.propertyName} = ${field.propertyName};
  #if(${chainModel})
        return this;
  #end
    }
#end
## --foreach end---
#end
## --end of #if(!${entityLombokModel})--

#if(${entityColumnConstant})
  #foreach($field in ${table.fields})
    public static final String ${field.name.toUpperCase()} = "${field.name}";

  #end
#end
#if(${activeRecord})
    @Override
    public Serializable pkVal() {
  #if(${keyPropertyName})
        return this.${keyPropertyName};
  #else
        return null;
  #end
    }

#end
#if(!${entityLombokModel})
    @Override
    public String toString() {
        return "${entity}{" +
  #foreach($field in ${table.fields})
    #if($!{foreach.index}==0)
        "${field.propertyName}=" + ${field.propertyName} +
    #else
        ", ${field.propertyName}=" + ${field.propertyName} +
    #end
  #end
        "}";
    }
#end
}

entityDTO.java.vm

package ${package.Other};

#foreach($pkg in ${table.importPackages})
import ${pkg};
#end
#if(${swagger})
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
#end
import com.lbdj.toolkit.utils.ReturnField;
import com.lbdj.toolkit.utils.SFunction;
#if(${entityLombokModel})
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
#if(${chainModel})
import lombok.experimental.Accessors;
#end
#end

/**
 * $!{table.comment} DTO
 *
 * @author ${author}
 * @since ${date}
 */
#if(${entityLombokModel})
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
  #if(${chainModel})
@Accessors(chain = true)
  #end
#end
#if(${superEntityClass})
public class ${entity}DTO extends ${superEntityClass}#if(${activeRecord})<${entity}>#end {
#elseif(${activeRecord})
public class ${entity}DTO extends Model<${entity}> {
#elseif(${entitySerialVersionUID})
public class ${entity}DTO implements Serializable {
#else
public class ${entity}DTO {
#end
#if(${entitySerialVersionUID})

    private static final long serialVersionUID = 1L;
#end
## ----------  BEGIN 字段循环遍历  ----------
#foreach($field in ${table.fields})

#if(${field.keyFlag})
#set($keyPropertyName=${field.propertyName})
#end
#if("$!field.comment" != "")
  #if(${swagger})
    @ApiModelProperty("${field.comment}")
  #else
    /**
     * ${field.comment}
     */
  #end
#end
    private ${field.propertyType} ${field.propertyName};
#end
## ----------  END 字段循环遍历  ----------

#if(!${entityLombokModel})
#foreach($field in ${table.fields})
  #if(${field.propertyType.equals("boolean")})
    #set($getprefix="is")
  #else
    #set($getprefix="get")
  #end

    public ${field.propertyType} ${getprefix}${field.capitalName}() {
        return ${field.propertyName};
    }

  #if(${chainModel})
    public ${entity} set${field.capitalName}(${field.propertyType} ${field.propertyName}) {
  #else
    public void set${field.capitalName}(${field.propertyType} ${field.propertyName}) {
  #end
        this.${field.propertyName} = ${field.propertyName};
  #if(${chainModel})
        return this;
  #end
    }
#end
## --foreach end---
#end
## --end of #if(!${entityLombokModel})--

#if(${entityColumnConstant})
  #foreach($field in ${table.fields})
    public static final String ${field.name.toUpperCase()} = "${field.name}";

  #end
#end

    /**
     * 查询条数
     */
    private Integer limit;

    /**
     * 需要返回的列(DTO列名)
     */
    private String columnStr;

    public <T> void setReturnField(SFunction<T, ?>... columns) {
        this.columnStr = ReturnField.select(columns);
    }

#if(${activeRecord})
    @Override
    public Serializable pkVal() {
  #if(${keyPropertyName})
        return this.${keyPropertyName};
  #else
        return null;
  #end
    }

#end
#if(!${entityLombokModel})
    @Override
    public String toString() {
        return "${entity}{" +
  #foreach($field in ${table.fields})
    #if($!{foreach.index}==0)
        "${field.propertyName}=" + ${field.propertyName} +
    #else
        ", ${field.propertyName}=" + ${field.propertyName} +
    #end
  #end
        "}";
    }
#end
}

mapper.java.vm

package ${package.Mapper};

import ${package.Entity}.${entity};
import com.github.yulichang.base.MPJBaseMapper;
#if(${mapperAnnotation})
import org.apache.ibatis.annotations.Mapper;
#end

/**
 * $!{table.comment} Mapper 接口
 *
 * @author ${author}
 * @since ${date}
 */
#if(${mapperAnnotation})
@Mapper
#end
#if(${kotlin})
interface ${table.mapperName} : ${superMapperClass}<${entity}>
#else
public interface ${table.mapperName} extends MPJBaseMapper<${entity}> {

}
#end

service.java.vm

package ${package.Service};

import ${package.Entity}.${entity};
import ${package.Parent}.dto.${entity}DTO;
import java.util.List;
import com.github.yulichang.base.MPJBaseService;

/**
 * $!{table.comment} 服务类
 *
 * @author ${author}
 * @since ${date}
 */
#if(${kotlin})
interface ${table.serviceName} : ${superServiceClass}<${entity}>
#else
public interface ${table.serviceName} extends MPJBaseService<${entity}> {

    List<${entity}DTO> selectBase(${entity}DTO request);

}
#end

serviceImpl.java.vm

package ${package.ServiceImpl};

import ${package.Entity}.${entity};
import ${package.Mapper}.${table.mapperName};
import ${package.Service}.${table.serviceName};
import ${package.Parent}.dto.${entity}DTO;
import org.springframework.stereotype.Service;
import com.github.yulichang.base.MPJBaseServiceImpl;
import ${package.Parent}.common.utils.InitCommonQueryUtils;
import ${package.Parent}.common.utils.BeanConvertUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.util.CollectionUtils;
import java.util.Arrays;
import java.util.List;

/**
 * $!{table.comment} 服务实现类
 *
 * @author ${author}
 * @since ${date}
 */
@Service
#if(${kotlin})
open class ${table.serviceImplName} : ${superServiceImplClass}<${table.mapperName}, ${entity}>(), ${table.serviceName} {

}
#else
public class ${table.serviceImplName}
        extends MPJBaseServiceImpl<${table.mapperName}, ${entity}>
        implements ${table.serviceName} {

    @Override
    public List<${entity}DTO> selectBase(${entity}DTO request) {
        ${entity} convert = BeanConvertUtils.convert(request, ${entity}::new, null);
        QueryWrapper<${entity}> queryWrapper = new QueryWrapper<>();
        //封装返回字段&查询条件
        InitCommonQueryUtils.initQuery(convert, request.getColumnStr(), queryWrapper);
        queryWrapper.last(" limit " + request.getLimit());
        List<${entity}> result = list(queryWrapper);
        if (CollectionUtils.isEmpty(result)) {
            return Arrays.asList();
        }
        return BeanConvertUtils.convertList(result, ${entity}DTO::new);
    }
}
#end

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

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

相关文章

K8s生产环境常见问题处理、答疑

文章目录 K8s 常见问题处理、答疑[1] calico一直处于未就绪状态[2] 删除dashboard 一直卡在delete[3] k8s-dashboard 修改tocken-ttl避免频繁输入tocken[4] kubectl 快捷指令[5] 解决UTC时间问题[6] kubectl命令自动补全[7] kubectl exec进入pod[8] 使用hostpath解决容器UTC时间…

轻松玩转Python正则表达式

引言 正则表达式是一种强大的文本匹配和处理工具&#xff0c;广泛应用于各种编程语言中。在Python中&#xff0c;我们可以使用内置的re模块来处理正则表达式。本文将带您从入门到精通&#xff0c;逐步介绍Python中的正则表达式用法&#xff0c;并提供实例演示。 1. 正则表达式…

电商兴起与电脑城衰退:利弊分析与展望

随着科技的飞速发展和互联网的普及&#xff0c;电子产品成为现代生活中不可或缺的一部分。在过去很长一段时间里&#xff0c;想要购买电子设备都逃不开一个叫“电脑城”的地方&#xff0c;那里鱼龙混杂良莠不齐&#xff0c;是令许多人记忆深刻分外难忘之处。然而&#xff0c;随…

U启动盘(NETBASE第十二课)

1.域环境组策略的应用规则 1&#xff09;策略的继承 继承&#xff1a;默认下级容器继承上级容器的组策略配置Default Domain Policy禁止更改桌面背景运行-dsa.msc创建OU并命名为caiwu&#xff0c;在caiwu的OU中创建新用户xmxm用户在win10客户端主机登录&#xff0c;验证不能更…

MongoDB比Mysql快的原因,为什么 MongoDB 索引选择B-树,而 Mysql 索引选择B+树

一、B树和B树的区别 很明显&#xff0c;我们想向弄清楚原因就要知道B树和B树的区别。为了不长篇大论。我们直接给出他们的形式总结他们的特点。 1、B树 B树是一种自平衡的搜索树&#xff0c;形式很简单&#xff1a; 这就是一颗B-树。针对我们这个问题的最核心的特点如下&#…

软件测试面试题(带答案)

1. 请自我介绍一下(需简单清楚的表述自已的基本情况&#xff0c;在这过程中要展现出自信&#xff0c;对工作有激情&#xff0c;上进&#xff0c;好学) 面试官您好&#xff0c;我叫###&#xff0c;今年26岁&#xff0c;来自广东深圳&#xff0c;就读专业是电子商务&#xff0c;…

TypeScript算法题实战——剑指 Offer篇(4)

目录 一、礼物的最大价值1.1、题目描述1.2、题解 二、最长不含重复字符的子字符串2.1、题目描述2.2、题解 三、丑数3.1、题目描述3.2、题解 四、第一个只出现一次的字符4.1、题目描述4.2、题解 五、数组中的逆序对5.1、题目描述5.2、题解 六、两个链表的第一个公共节点6.1、题目…

任务型对话对话策略学习的强化学习方法

任务型对话(TOD)系统旨在帮助用户解决从天气咨询到计划安排的一系列问题。完成任务的途径有二。 其一是端到端途径&#xff1a;直接将当前对话内容与系统的自然语言反映相关联。此种方法多是采用序列到序列的模型&#xff0c;然后进行监督训练。 第二种是模组途径&#xff1a…

can 相关背题

1 CAN FD 和CAN的 区别&#xff1a; CAN-FD&#xff1a;一帧数据最长64字节。以理解成CAN协议的升级版&#xff0c;只升级了协议&#xff0c;物理层未改变。传输速率不同、数据长度不同、帧格式不同、ID长度不同。 1&#xff09;速率不同&#xff1a; CAN&#xff1a;最大传…

机械臂的雅克比矩阵推导

1. 线速度和角速度的递推通式推导 p i p i − 1 R i − 1 r i − 1 , i i − 1 \mathbf{p}_{i}\mathbf{p}_{i-1}\mathbf{R}_{i-1} \mathbf{r}_{i-1, i}^{i-1} pi​pi−1​Ri−1​ri−1,ii−1​ p i − 1 \mathbf{p}_{i-1} pi−1​是 { i − 1 } \{i-1\} {i−1}坐标系的原点的…

获取全国各地行政区的genjson数据以及使用leaflet加载行政区数据

前言 在写代码之前&#xff0c;我们需要做一些准备工作&#xff0c;需要有一份某个行政区的geojson数据&#xff0c;如果你没有也没关系&#xff0c;我们可以去下载&#xff0c;地址&#xff1a;geojson数据下载网站 打开网站&#xff0c;选择自己想要获取的行政区&#xff0…

FPGA学习——按键控制LED流水灯(附源码 无按键消抖版本)

文章目录 一、前言二、开发板按键原理图三、源码四、实现效果 一、前言 在博主的cyclone4开发板上一共有4个按键&#xff0c;本次实验的目的是为了实现每按下一次按键&#xff0c;都会使开发板上的4个LED灯切换一次状态&#xff0c;博主一共设计了四种状态&#xff0c;分别是&…

滴水逆向三期笔记与作业——02C语言——04 IF语句逆向分析下

OneNote防丢失。 海哥牛逼。 目录 一、if…else...反汇编1、反汇编特点2、案例分析 二、作业1三、IF...ELSE IF...ELSE IF..多分支语句1、多分支反汇编2、案例分析 四、作业2 一、if…else…反汇编 1、反汇编特点 2、案例分析 二、作业1 解&#xff1a; 分析图&#xff1a; 分…

【基于矢量射线的衍射积分 (VRBDI)】基于矢量射线的衍射积分 (VRBDI) 和仿真工具(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

前端开发中常见的20个数组方法,你掌握了几个?

文章目录 前言一、常见的数组方法1.1 push (将指定的元素添加到数组的末尾&#xff0c;并返回新的数组长度)1.2 pop (从数组中删除最后一个元素&#xff0c;并返回该元素的值)1.3 shift (从数组中删除第一个元素&#xff0c;并返回该元素的值)1.4 unshift (向数组首位添加一个或…

路径规划算法:基于鹈鹕优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于鹈鹕优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于鹈鹕优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法鹈鹕…

VirtualBox单机版安装K8S+TF

本文参考自&#xff1a;kubernetes最新版安装单机版v1.21.5_kubernetes下载_qq759035366的博客-CSDN博客 只用一台VB虚拟机&#xff0c;装K8S加Tungsten Fabric。 0. 提前避坑&#xff1a; 0.1 Tungsten Fabric的VRouter对Linux内核版本有要求&#xff0c;以下内核版本才…

音视频——码率、帧率越高越清晰?分辨率、像素、dpi的关系

一 前言 本期我介绍一下视频的一些基础概念&#xff0c;如帧率、码率、分辨率、像素、dpi、视频帧、I帧、P帧、gop等。我i初步学习音视频&#xff0c;给这些专业词汇进行扫盲 会解释多少码率是清晰的&#xff0c;是否帧率越高越流畅等问题。 这些概念是比较杂乱的&#xff0c…

微信二维码登录,修改下面提示的字体和样式

背景 由于业务需要&#xff0c;需要把微信二维码下面默认的提示文字进行修改&#xff0c;如下图所示&#xff1a; 需要修改上面红色框内选择的字体&#xff0c;在研究的过程中&#xff0c;发现好多人都在查询这个问题&#xff0c;并且有些网友思路也是对的。可能只是方式没对。…