当前位置: 首页 > news >正文

项目代码生成工具

代码生成工具

文章目录

  • 代码生成工具
    • 提取公共类
      • domain
        • bo
        • dto
        • entity
        • vo
        • Bean基类
    • 代码生成工厂
    • 连接配置
    • 模版
      • 1、基础类
        • 基类Entity
        • 添加DTO类
        • 分页查询DTO
        • 基础查询DTO
        • 修改DTO
        • 视图VO
      • 2、controller
      • 2、service接口
      • 3、service实现类
      • 4、Mapper接口
      • 5、Mapper的xml文件

提取公共类

比方说每个表中都有,ID,创建人,创建时间,修改人,等字段,我们可以将其提取出来,放到一个公共的core模块或者目录下面,我们的主体代码依赖中可以引入这个依赖,或者将core目录集成到我们业务代码中。我一般都是放到公共模块中,业务代码引入。

在这里插入图片描述

domain

bo
package com.hy.core.domain.bo;import com.hy.core.domain.BaseBean;
import lombok.Data;
import lombok.EqualsAndHashCode;/*** <p>* 基础BO* </p>** @author cento* @date 2021/9/1 17:21* @since JDK 1.8*/@EqualsAndHashCode(callSuper = true)
@Data
public abstract class BaseBO extends BaseBean {}
dto
package com.hy.core.domain.dto;import lombok.Data;
import lombok.EqualsAndHashCode;/*** <p>* 基础AddDTO* </p>** @author cento* @date 2021/9/1 17:25* @since JDK 1.8*/@EqualsAndHashCode(callSuper = true)
@Data
public abstract class BaseAddDTO extends BaseDTO{}
package com.hy.core.domain.dto;import com.hy.core.domain.BaseBean;
import lombok.Data;
import lombok.EqualsAndHashCode;/*** <p>* 基础DTO* </p>** @author cento* @date 2021/9/1 17:22* @since JDK 1.8*/@EqualsAndHashCode(callSuper = true)
@Data
public abstract class BaseDTO extends BaseBean {}
package com.hy.core.domain.dto;import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;/*** <p>* 基础Page* </p>** @author cento* @date 2021/9/1 17:33* @since JDK 1.8*/@EqualsAndHashCode(callSuper = true)
@Data
public abstract class BasePageSearchDTO extends BaseSearchDTO{@ApiModelProperty(value = "每页条数")private Long size;@ApiModelProperty(value = "当前页")private Long current;}
package com.hy.core.domain.dto;import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;import java.time.LocalDate;
import java.time.LocalDateTime;/*** <p>* 基础SearchDTO* </p>** @author cento* @date 2021/9/1 17:30* @since JDK 1.8*/@EqualsAndHashCode(callSuper = true)
@Data
public abstract class BaseSearchDTO extends BaseDTO{@ApiModelProperty(value = "查询开始时间")private LocalDateTime startTime;@ApiModelProperty(value = "查询结束时间")private LocalDateTime endTime;@ApiModelProperty(value = "查询开始日期")private LocalDate startDate;@ApiModelProperty(value = "查询结束日期")private LocalDate endDate;@ApiModelProperty(value = "是否拼租户")private Boolean tenant;}
package com.hy.core.domain.dto;import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;/*** <p>* 基础UpdateDTO* </p>** @author cento* @date 2021/9/1 17:30* @since JDK 1.8*/@EqualsAndHashCode(callSuper = true)
@Data
public abstract class BaseUpdateDTO extends BaseDTO{@ApiModelProperty(value = "主键id")private Long id;}
entity
package com.hy.core.domain.entity;import lombok.Data;
import lombok.EqualsAndHashCode;/*** <p>* 基础业务类* </p>** @author cento* @date 2021/5/26 19:40* @since JDK 1.8*/@EqualsAndHashCode(callSuper = true)
@Data
public abstract class BaseBiz<T extends BaseBiz<T>> extends BaseEntity<T> {}
package com.hy.core.domain.entity;import lombok.Data;
import lombok.EqualsAndHashCode;/*** <p>* 基础配置类* </p>** @author cento* @date 2021/5/26 19:40* @since JDK 1.8*/@EqualsAndHashCode(callSuper = true)
@Data
public abstract class BaseConfig<T extends BaseConfig<T>> extends BaseEntity<T> {/*** 配置类通用名称*/private String name;/*** 是否启用 默认0否/1是*/private Boolean enabled;}
package com.hy.core.domain.entity;import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Data;
import lombok.EqualsAndHashCode;import java.time.LocalDateTime;/*** <p>* 基础Entity* </p>** @author cento* @date 2021/9/1 18:04* @since JDK 1.8*/@EqualsAndHashCode(callSuper = true)
@Data
public abstract class BaseEntity<T extends BaseEntity<T>> extends Model<T> {/*** 数据唯一标识*/@TableId(type = IdType.AUTO)private Long id;/*** 创建人*/@TableField(fill = FieldFill.INSERT)private String createUser;/*** 创建时间*/@TableField(fill = FieldFill.INSERT)private LocalDateTime createTime;/*** 修改人*/@TableField(fill = FieldFill.UPDATE)private String updateUser;/*** 修改时间*/@TableField(fill = FieldFill.UPDATE)private LocalDateTime updateTime;/*** 是否逻辑删除,true:删除 false:未删除*/@TableLogic(value = "false", delval = "true")private Boolean del;/*** 全宗单位id*/private Long archiveCompanyId;}
vo
package com.hy.core.domain.vo;import com.hy.core.domain.BaseBean;
import com.hy.core.toolkit.util.CollectionUtil;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;import java.util.ArrayList;
import java.util.List;/*** <p>* 档案列表查询基础VO* </p>** @author chenhang* @date 2022/3/28 11:30* @since JDK 1.8*/
@EqualsAndHashCode(callSuper = true)
@Data
public abstract class BaseScheduleVO<T> extends BaseBean {private static final long serialVersionUID = 1L;@ApiModelProperty(value = "表头集合")private List<TableHeader> tableHeaderList;@ApiModelProperty(value = "行元素集合")private List<T> valueList;@Datapublic static class TableHeader{@ApiModelProperty(value = "表头名")private String label;@ApiModelProperty(value = "对应属性")private String prop;}public static List<TableHeader> getHeaders(String[] props, List<String> names) {List<TableHeader> headers = new ArrayList<>();if (CollectionUtil.isEmpty(names)) {return headers;}for (int i = 0; i < Math.min(names.size(), props.length); i++) {TableHeader header = new TableHeader();header.setLabel(names.get(i));header.setProp(props[i]);headers.add(header);}return headers;}
}
package com.hy.core.domain.vo;import com.hy.core.domain.BaseBean;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;/*** <p>* 基础VO* </p>** @author cento* @date 2021/9/1 18:18* @since JDK 1.8*/@EqualsAndHashCode(callSuper = true)
@Data
public abstract class BaseVO extends BaseBean {@ApiModelProperty(value = "数据唯一标识")private Long id;}
package com.hy.core.domain.vo;import com.hy.core.enums.enumable.IEnumHolder;
import com.hy.core.toolkit.util.CollectionUtil;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** <p>* 枚举对应 mapVO* </p>** @author cento* @date 2021/10/22 14:15* @since JDK 1.8*/@Data
public class EnumMapVO  {private Map<String, EnumVO> enumMapVO;@NoArgsConstructor@AllArgsConstructor@Datapublic static class EnumVO{@ApiModelProperty("枚举类名简称")private String cls;@ApiModelProperty("枚举类说明")private String name;@ApiModelProperty("枚举值集合")private List<EnumData> dataList;public static EnumVO newInstance(IEnumHolder<?> iEnumHolder, String enumDesc){EnumVO enumVO = new EnumVO();enumVO.setCls(iEnumHolder.getClass().getSimpleName());enumVO.setName(enumDesc);List<EnumData> dataList = new ArrayList<>();iEnumHolder.valueList().forEach(value -> dataList.add(EnumData.newInstance(value)));enumVO.setDataList(dataList);return enumVO;}}@NoArgsConstructor@AllArgsConstructor@Datapublic static class EnumData{@ApiModelProperty("枚举名称")private String enumName;@ApiModelProperty("枚举值code")private Integer code;@ApiModelProperty("枚举值名称")private String name;public static EnumData newInstance(IEnumHolder<?> iEnumHolder){return new EnumData(iEnumHolder.name(), iEnumHolder.getCode(), iEnumHolder.getName());}}public EnumMapVO map(IEnumHolder<?> iEnumHolder, String enumDesc){if (CollectionUtil.isEmpty(this.enumMapVO)){enumMapVO = new HashMap<>(48);}enumMapVO.put(iEnumHolder.getClass().getSimpleName(), EnumVO.newInstance(iEnumHolder, enumDesc));return this;}public EnumMapVO map(IEnumHolder<?> iEnumHolder, String enumDesc, String cardCode){if (CollectionUtil.isEmpty(this.enumMapVO)){enumMapVO = new HashMap<>(48);}enumMapVO.put(cardCode, EnumVO.newInstance(iEnumHolder, enumDesc));return this;}}
package com.hy.core.domain.vo;import io.swagger.annotations.ApiModelProperty;
import lombok.Data;import java.io.Serializable;
import java.util.List;/*** 枚举展示类** @Author: 刘昱* @E-mail: 517581971@qq.com* @Date: 2020年4月30日 下午5:25:18*/@SuppressWarnings("unused")
@Data
public class EnumVO implements Serializable {private static final long serialVersionUID = 1L;@ApiModelProperty("枚举类名")private String cls;@ApiModelProperty("枚举类注释")private String name;@ApiModelProperty("子类型")private List<EnumChildren> children;public EnumVO() {super();}public EnumVO(String cls, List<EnumChildren> children, String name) {this.cls = cls;this.name = name;this.children = children;}public String getCls() {return cls;}public void setCls(String cls) {this.cls = cls;}public String getName() {return name;}public void setName(String name) {this.name = name;}public List<EnumChildren> getChildren() {return children;}public void setChildren(List<EnumChildren> children) {this.children = children;}public static class EnumChildren implements Serializable {private static final long serialVersionUID = 1L;@ApiModelProperty("类型")private String type;@ApiModelProperty("类型名称")private String name;@ApiModelProperty("子集")private List<EnumChildren> children;public static class EnumChildrenAndParent extends EnumChildren {private static final long serialVersionUID = 1L;@ApiModelProperty("父级")private String parent;public EnumChildrenAndParent() {super();}public EnumChildrenAndParent(String type, String name, String parent) {setType(type);setName(name);this.parent = parent;}public String getParent() {return parent;}public void setParent(String parent) {this.parent = parent;}}public EnumChildren() {super();}public EnumChildren(String type, String name) {this.type = type;this.name = name;}public String getType() {return type;}public void setType(String type) {this.type = type;}public String getName() {return name;}public void setName(String name) {this.name = name;}public void setChildren(List<EnumChildren> children) {this.children = children;}public List<EnumChildren> getChildren() {return children;}}}
Bean基类
package com.hy.core.domain;import java.io.Serializable;/*** <p>* 除entity外的bean基类* </p>** @author Jshuai* @date 2025/04/27 17:15* @since JDK 1.8*/public abstract class BaseBean implements Serializable {}

代码生成工厂

package com.js.generator;import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableField;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.js.core.domain.entity.BaseEntity;
import com.js.core.mapper.IBaseMapper;
import com.js.core.service.BaseService;
import com.js.core.service.impl.BaseServiceImpl;import java.util.*;
import java.util.stream.Collectors;/*** <p>* 代码生成工厂* </p>** @author cento* @date 2021/5/7 16:13* @since JDK 1.8*/
public class CodeFactory {/*** 代码生成器对象*/private AutoGenerator generator = new AutoGenerator();/*** 全局配置对象*/private GlobalConfig globalConfig = new GlobalConfig();/*** 数据源配置对象*/private DataSourceConfig dataSourceConfig = new DataSourceConfig();/*** 包配置对象*/private PackageConfig packageConfig = new PackageConfig();/*** 模板配置对象*/private TemplateConfig templateConfig = new TemplateConfig();/*** 策略配置对象*/private StrategyConfig strategyConfig = new StrategyConfig();/*** 自定义输出配置对象*/private List<FileOutConfig> focList = new ArrayList<>();/*** 自定义配置对象*/private static InjectionConfig cfg;/*** 代码输出尾目录*/public static final String OUTPUT_DIR = "/src/main/java";/*** controller名*/private static final String CONTROLLER_NAME = "%sController";/*** service名*/private static final String SERVICE_NAME = "%sService";/*** serviceImpl名*/private static final String SERVICE_IMPL_NAME = "%sServiceImpl";/*** serviceImpl名*/private static final String MAPPER_NAME = "%sMapper";public CodeFactory(){}public CodeFactory(String author, String projectName, String dataSourceUrl, String driverName, String schemeName, String userName, String password,String packageName, String bizDesc, String bizUrl, Boolean biz, Boolean conf, String tableName){initGlobalConfig(author, projectName);initDataSourceConfig(dataSourceUrl, driverName, schemeName, userName, password);initPackageConfig(packageName);initCfg(bizDesc, bizUrl, biz, conf);generatorConfiguration();initFileOutConfig();initTemplateConfig();initStrategyConfig(tableName);generator.execute();}/*** 构造代码生成器*/private void generatorConfiguration() {cfg.setFileOutConfigList(focList);generator.setGlobalConfig(globalConfig).setDataSource(dataSourceConfig).setPackageInfo(packageConfig).setCfg(cfg).setTemplate(templateConfig).setStrategy(strategyConfig).setTemplateEngine(new FreemarkerTemplateEngine());}/*** 初始化全局配置*/private void initGlobalConfig(String author, String projectName) {String projectPath = System.getProperty("user.dir") + "/" + projectName;globalConfig.setFileOverride(true).setOutputDir(projectPath + OUTPUT_DIR).setAuthor(author).setOpen(false).setControllerName(CONTROLLER_NAME).setServiceName(SERVICE_NAME).setServiceImplName(SERVICE_IMPL_NAME).setMapperName(MAPPER_NAME);}/*** 初始化数据源配置*/private void initDataSourceConfig(String dataSourceUrl, String driverName, String schemeName, String userName, String password) {dataSourceConfig.setDriverName(driverName).setSchemaName(schemeName).setUrl(dataSourceUrl).setUsername(userName).setPassword(password);}/*** 初始化包配置*/private void initPackageConfig(String packageName) {packageConfig.setParent(packageName).setEntity("domain.entity");}/*** 初始化自定义配置*/private void initCfg(String bizDesc, String bizUrl, Boolean biz, Boolean conf) {cfg = new InjectionConfig() {@Overridepublic void initMap() {Map<String, Object> configMap = new HashMap<>(16);configMap.put("voPkg", packageConfig.getParent() + ".domain.vo");configMap.put("dtoPkg", packageConfig.getParent() + ".domain.dto");// 实体描述性信息configMap.put("bizDesc", bizDesc);// controller第二段路由configMap.put("bizUrl", bizUrl);// 是否业务类configMap.put("biz", biz == null ? Boolean.FALSE : biz);// 是否配置类configMap.put("conf", conf == null ? Boolean.FALSE : conf);setMap(configMap);}};}/*** 初始化自定义文件输出配置*/private void initFileOutConfig() {// 文件输出根目录String outputParentDir = globalConfig.getOutputDir() + "/" + packageConfig.getParent().replace(".", "/");// entity文件输出配置focList.add(new FileOutConfig("/template/entity.java.ftl") {@Overridepublic String outputFile(TableInfo tableInfo) {handleTableInfo(tableInfo);return outputParentDir + "/domain/entity/" + tableInfo.getEntityName() + ".java";}});// AddDTO文件输出配置focList.add(new FileOutConfig("/template/entityAddDTO.java.ftl") {@Overridepublic String outputFile(TableInfo tableInfo) {handleTableInfo(tableInfo);return outputParentDir + "/domain/dto/" + tableInfo.getEntityName() + "AddDTO.java";}});// UpdateDTO文件输出配置focList.add(new FileOutConfig("/template/entityUpdateDTO.java.ftl") {@Overridepublic String outputFile(TableInfo tableInfo) {handleTableInfo(tableInfo);return outputParentDir + "/domain/dto/" + tableInfo.getEntityName() + "UpdateDTO.java";}});// SearchDTO文件输出配置focList.add(new FileOutConfig("/template/entitySearchDTO.java.ftl") {@Overridepublic String outputFile(TableInfo tableInfo) {handleTableInfo(tableInfo);return outputParentDir + "/domain/dto/" + tableInfo.getEntityName() + "SearchDTO.java";}});// PageSearchDTO文件输出配置focList.add(new FileOutConfig("/template/entityPageSearchDTO.java.ftl") {@Overridepublic String outputFile(TableInfo tableInfo) {handleTableInfo(tableInfo);return outputParentDir + "/domain/dto/" + tableInfo.getEntityName() + "PageSearchDTO.java";}});// VO文件输出配置focList.add(new FileOutConfig("/template/entityVO.java.ftl") {@Overridepublic String outputFile(TableInfo tableInfo) {handleTableInfo(tableInfo);return outputParentDir + "/domain/vo/" + tableInfo.getEntityName() + "VO.java";}});}private void handleTableInfo(TableInfo tableInfo) {List<String> excludeFields = Arrays.asList("enabled", "del", "createUser", "createTime", "updateUser", "updateTime", "archiveCompanyId" );List<TableField> fields = tableInfo.getFields().stream().filter(field -> !excludeFields.contains(field.getPropertyName())).collect(Collectors.toList());tableInfo.setFields(fields);tableInfo.getImportPackages().clear();tableInfo.getFields().forEach(field -> {if (field.getColumnType().getPkg() != null) {tableInfo.getImportPackages().add(field.getColumnType().getPkg());}});}/*** 初始化模板配置*/private void initTemplateConfig() {templateConfig.setController("template/controller.java").setService("template/service.java").setServiceImpl("template/serviceImpl.java").setEntity("template/entity.java").setMapper("template/mapper.java").setXml(null).setEntity(null);}/*** 初始化策略配置*/private void initStrategyConfig(String tableName) {/* strategy.setInclude(scanner("表名,多个英文逗号分割").split(",")); */strategyConfig.setNaming(NamingStrategy.underline_to_camel).setColumnNaming(NamingStrategy.underline_to_camel).setEntityLombokModel(true).setRestControllerStyle(true).setSuperEntityClass(BaseEntity.class).setSuperServiceClass(BaseService.class).setSuperServiceImplClass(BaseServiceImpl.class).setSuperMapperClass(IBaseMapper.class.getName()).setSuperEntityColumns("id", "del", "createUser", "createTime", "updateUser", "updateTime", "archiveCompanyId").setInclude(tableName).setTablePrefix("conf_", "common_", "record_", "ref_");}}

连接配置

package com.js.generator;/*** asd** @author by*/
public class GeneratorApp {private final static  String AUTHOR = "JiangShuai";private final static String PROJECT_NAME = "数据库名称";private final static String DATA_SOURCE_URL = "jdbc:mysql://171.130.80.81:107/数据库名称";private final static String DRIVER_NAME = "com.mysql.cj.jdbc.Driver";private final static String SCHEMA_NAME = "数据库名称";private final static String USERNAME = "数据库账号";private final static String PASSWORD = "数据库密码";private final static String PACKAGE_NAME = "代码生成后存放在那个包路径下";private final static String BIZ_DESC = "表中文名";private final static String BIZ_URL = "";private final static Boolean BIZ = true;private final static Boolean CONF = false;private final static String TABLE_NAME = "表名称";public static void main(String[] args) {new CodeFactory(AUTHOR, PROJECT_NAME,DATA_SOURCE_URL, DRIVER_NAME, SCHEMA_NAME, USERNAME, PASSWORD,PACKAGE_NAME,BIZ_DESC, BIZ_URL, BIZ, CONF,TABLE_NAME);}}

模版

在resource目录下面创建下面如图所示.java.ftl结尾的文件

在这里插入图片描述

1、基础类

基类Entity
package ${package.Entity};<#list table.importPackages as pkg>
<#--import ${pkg};-->
</#list>
import com.baomidou.mybatisplus.annotation.TableName;
<#if cfg.biz>
import com.js.core.domain.entity.BaseBiz;
<#elseif cfg.conf>
import com.js.core.domain.entity.BaseConfig;
<#else>
import com.js.core.domain.entity.BaseEntity;
</#if>
<#if swagger2>
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
</#if>
<#if entityLombokModel>
import lombok.Data;
import lombok.EqualsAndHashCode;<#if chainModel>
import lombok.experimental.Accessors;</#if>
</#if>import java.time.LocalDate;
import java.time.LocalDateTime;/*** <p>* ${table.comment!}* </p>** @author ${author}* @date ${date}* @since JDK 1.8*/<#if swagger2>@ApiModel(value="${entity}对象", description="${table.comment!}")
</#if>
<#if entityLombokModel><#if superEntityClass??>
@EqualsAndHashCode(callSuper = true)<#else>
@EqualsAndHashCode(callSuper = false)</#if>
@Data<#if chainModel>
@Accessors(chain = true)</#if>
</#if>
@TableName("${table.name}")
<#if superEntityClass??><#if cfg.biz>
public class ${entity} extends BaseBiz<${entity}> {<#elseif cfg.conf>
public class ${entity} extends BaseConfig<${entity}> {<#else>
public class ${entity} extends BaseEntity<${entity}> {</#if>
<#elseif activeRecord>
public class ${entity} extends Model<${entity}> {
<#else>
public class ${entity} implements Serializable {
</#if><#if entitySerialVersionUID>private static final long serialVersionUID = 1L;
</#if>
<#-- ----------  BEGIN 字段循环遍历  ---------->
<#list table.fields as field><#if field.keyFlag><#assign keyPropertyName="${field.propertyName}"/></#if><#if field.comment!?length gt 0><#if swagger2>@ApiModelProperty(value = "${field.comment}")<#else>/*** ${field.comment}*/</#if></#if><#if field.keyFlag><#-- 主键 --><#if field.keyIdentityFlag>@TableId(value = "${field.annotationColumnName}", type = IdType.AUTO)<#elseif idType??>@TableId(value = "${field.annotationColumnName}", type = IdType.${idType})<#elseif field.convert>@TableId("${field.annotationColumnName}")</#if><#-- 普通字段 --><#elseif field.fill??><#-- -----   存在字段填充设置   -----><#if field.convert>@TableField(value = "${field.annotationColumnName}", fill = FieldFill.${field.fill})<#else>@TableField(fill = FieldFill.${field.fill})</#if><#elseif field.convert>@TableField("${field.annotationColumnName}")</#if><#-- 乐观锁注解 --><#if (versionFieldName!"") == field.name>@Version</#if><#-- 逻辑删除注解 --><#if (logicDeleteFieldName!"") == field.name>@TableLogic</#if>private ${field.propertyType} ${field.propertyName};
</#list>
<#------------  END 字段循环遍历  ----------><#if !entityLombokModel><#list table.fields as field><#if field.propertyType == "boolean"><#assign getprefix="is"/><#else><#assign getprefix="get"/></#if>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}) {</#if>this.${field.propertyName} = ${field.propertyName};<#if chainModel>return this;</#if>}</#list>
</#if><#if entityColumnConstant><#list table.fields as field>public static final String ${field.name?upper_case} = "${field.name}";</#list>
</#if>
<#if activeRecord>@Overrideprotected Serializable pkVal() {<#if keyPropertyName??>return this.${keyPropertyName};<#else>return null;</#if>}</#if>
<#if !entityLombokModel>@Overridepublic String toString() {return "${entity}{" +<#list table.fields as field><#if field_index==0>"${field.propertyName}=" + ${field.propertyName} +<#else>", ${field.propertyName}=" + ${field.propertyName} +</#if></#list>"}";}
</#if>
}
添加DTO类
package ${cfg.dtoPkg};import java.io.Serializable;
<#list table.importPackages as pkg>
import ${pkg};
</#list>
import com.js.core.domain.dto.BaseAddDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;/*** <p>* ${table.comment!} addDTO* </p>** @author ${author}* @date ${date}* @since JDK 1.8*/@ApiModel(value="${entity}新增对象", description="${table.comment!}")
@EqualsAndHashCode(callSuper = true)
@Data
public class ${entity}AddDTO extends BaseAddDTO {private static final long serialVersionUID = 1L;<#-- ----------  字段循环遍历  ---------->
<#list table.fields as field>@ApiModelProperty(value = "${field.comment!}")private ${field.propertyType} ${field.propertyName};
</#list>}
分页查询DTO
package ${cfg.dtoPkg};import java.io.Serializable;
<#list table.importPackages as pkg>
import ${pkg};
</#list>
import com.js.core.domain.dto.BasePageSearchDTO;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;/*** <p>* ${table.comment!} pageSearchDTO* </p>** @author ${author}* @date ${date}* @since JDK 1.8*/@ApiModel(value="${entity}分页查询对象", description="${table.comment!}")
@EqualsAndHashCode(callSuper = true)
@Data
public class ${entity}PageSearchDTO extends BasePageSearchDTO {private static final long serialVersionUID = 1L;<#-- ----------  字段循环遍历  ---------->
<#list table.fields as field>@ApiModelProperty(value = "${field.comment!}")private ${field.propertyType} ${field.propertyName};
</#list>}
基础查询DTO
package ${cfg.dtoPkg};import java.io.Serializable;
<#list table.importPackages as pkg>
import ${pkg};
</#list>
import com.js.core.domain.dto.BaseSearchDTO;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;/*** <p>* ${table.comment!} searchDTO* </p>** @author ${author}* @date ${date}* @since JDK 1.8*/@ApiModel(value="${entity}查询对象", description="${table.comment!}")
@EqualsAndHashCode(callSuper = true)
@Data
public class ${entity}SearchDTO extends BaseSearchDTO {private static final long serialVersionUID = 1L;<#-- ----------  字段循环遍历  ---------->
<#list table.fields as field>@ApiModelProperty(value = "${field.comment!}")private ${field.propertyType} ${field.propertyName};
</#list>}
修改DTO
package ${cfg.dtoPkg};import java.io.Serializable;
<#list table.importPackages as pkg>
import ${pkg};
</#list>
import com.js.core.domain.dto.BaseUpdateDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;/*** <p>* ${table.comment!} updateDTO* </p>** @author ${author}* @date ${date}* @since JDK 1.8*/@ApiModel(value="${entity}修改对象", description="${table.comment!}")
@EqualsAndHashCode(callSuper = true)
@Data
public class ${entity}UpdateDTO extends BaseUpdateDTO {private static final long serialVersionUID = 1L;<#-- ----------  字段循环遍历  ---------->
<#list table.fields as field>@ApiModelProperty(value = "${field.comment!}")private ${field.propertyType} ${field.propertyName};
</#list>}
视图VO
package ${cfg.voPkg};<#list table.importPackages as pkg>
import ${pkg};
</#list>
import com.js.core.domain.vo.BaseVO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;/*** <p>* ${table.comment!} VO* </p>** @author ${author}* @date ${date}* @since JDK 1.8*/@ApiModel(value="${entity}视图对象", description="${table.comment!}")
@EqualsAndHashCode(callSuper = true)
@Data
public class ${entity}VO extends BaseVO {private static final long serialVersionUID = 1L;<#-- ----------  字段循环遍历  ---------->
<#list table.fields as field>@ApiModelProperty(value = "${field.comment!}")private ${field.propertyType} ${field.propertyName};
</#list>}

2、controller

package ${package.Controller};import ${cfg.voPkg}.${entity}VO;
import ${cfg.dtoPkg}.${entity}AddDTO;
import ${cfg.dtoPkg}.${entity}UpdateDTO;
import ${cfg.dtoPkg}.${entity}SearchDTO;
import ${cfg.dtoPkg}.${entity}PageSearchDTO;
import ${package.Service}.${table.serviceName};
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.cloud.cloud.common.core.util.R;
import com.cloud.cloud.common.log.annotation.SysLog;
<#if cfg.biz></#if>
import io.swagger.annotations.*;
import org.springframework.web.bind.annotation.*;
import lombok.AllArgsConstructor;<#if cfg.biz>
import javax.servlet.http.HttpServletResponse;
</#if>
import javax.validation.constraints.NotNull;
<#if cfg.biz>
import java.io.IOException;
</#if>
import java.util.List;/*** <p>* TODO* </p>** @author ${author}* @date ${date}* @since JDK 1.8*/@AllArgsConstructor
@Api(value = "${table.comment!}", tags = "${cfg.bizDesc}管理")
@RestController
@RequestMapping("/${table.entityPath}")
public class ${table.controllerName} {private ${table.serviceName} ${table.entityPath}Service;<#if cfg.biz>
</#if>@SysLog("新增单条${cfg.bizDesc}")@ApiOperation("新增单条${cfg.bizDesc}")@PostMapping("/${cfg.bizUrl}/one")public R<${entity}VO> add(@RequestBody ${entity}AddDTO addDto){return R.ok(${table.entityPath}Service.addOne(addDto));}@SysLog("删除单条${cfg.bizDesc}")@ApiOperation("id删除单条${cfg.bizDesc}")@DeleteMapping("/${cfg.bizUrl}/one/{id}")public R<Boolean> delete${table.entityName}(@NotNull @PathVariable("id") Long id){return R.ok(${table.entityPath}Service.deleteOne(id));}@ApiOperation("ids批量删除多条${cfg.bizDesc}")@DeleteMapping("/${cfg.bizUrl}/list/{ids}")public R<Boolean> delete${table.entityName}Batch(@NotNull @PathVariable("ids") String ids){return R.ok(${table.entityPath}Service.deleteBatch(ids));}@ApiOperation("id修改单条${cfg.bizDesc}")@PostMapping("/${cfg.bizUrl}/update")public R<${entity}VO> update(@RequestBody ${entity}UpdateDTO updateDto) {return R.ok(${table.entityPath}Service.updateOne(updateDto));}@ApiOperation("id获取单条${cfg.bizDesc}")@GetMapping("/${cfg.bizUrl}/one/{id}")public R<${entity}VO> get${table.entityName}(@NotNull @PathVariable("id") Long id ) {return R.ok(${table.entityPath}Service.getOne(id));}@ApiOperation("dto条件查询获取${cfg.bizDesc}List")@GetMapping("/${cfg.bizUrl}/list")public R<List<${entity}VO>> get(${entity}SearchDTO searchDto) {return R.ok(${table.entityPath}Service.getList(searchDto));}@ApiOperation("dto条件查询获取${cfg.bizDesc}Page")@GetMapping("/${cfg.bizUrl}/page")public R<Page<${entity}VO>> get(${entity}PageSearchDTO pageSearchDto) {return R.ok(${table.entityPath}Service.getPage(pageSearchDto));}
<#if cfg.conf>@PutMapping("/${cfg.bizUrl}/disable/{id}")@ApiOperation("id禁用${cfg.bizDesc}")public R<${entity}VO> disable(@NotNull @PathVariable("id") Long id) {return R.ok(${table.entityPath}Service.disable(id));}@PutMapping("/${cfg.bizUrl}/enable/{id}")@ApiOperation("id启用${cfg.bizDesc}")public R<${entity}VO> enable(@NotNull @PathVariable("id") Long id) {return R.ok(${table.entityPath}Service.enable(id));}
</#if>
<#if cfg.biz>
</#if>}

2、service接口

package ${package.Service};import com.js.core.service.BaseService;
import ${package.Entity}.${entity};
import ${cfg.voPkg}.${entity}VO;
import ${cfg.dtoPkg}.${entity}AddDTO;
import ${cfg.dtoPkg}.${entity}UpdateDTO;
import ${cfg.dtoPkg}.${entity}SearchDTO;
import ${cfg.dtoPkg}.${entity}PageSearchDTO;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;import java.util.List;/*** <p>* ${table.comment!} 服务类* </p>** @author ${author}* @date ${date}* @since JDK 1.8*/<#if kotlin>
interface ${table.serviceName} : ${superServiceClass}<${entity}>
<#else>
public interface ${table.serviceName} extends BaseService<${entity}> {/*** 添加单条${cfg.bizDesc}** @author cento* @date ${date}* @param addDto 添加实体参数* @return ${entity}VO*/${entity}VO addOne(${entity}AddDTO addDto);/*** id删除单条${cfg.bizDesc}** @author cento* @date ${date}* @param id 主键id* @return Boolean*/Boolean deleteOne(Long id);/*** ids删除多条${cfg.bizDesc}** @author cento* @date ${date}* @param ids 主键id字符长串,逗号分隔* @return Boolean*/Boolean deleteBatch(String ids);/*** id修改单条${cfg.bizDesc}** @author cento* @date ${date}* @param updateDto 修改实体参数* @return ${entity}VO*/${entity}VO updateOne(${entity}UpdateDTO updateDto);/*** id查询单条${cfg.bizDesc}** @author cento* @date ${date}* @param id 主键id* @return ${entity}VO*/${entity}VO getOne(Long id);/*** dto条件查询获取${cfg.bizDesc}List** @author cento* @date ${date}* @param searchDto 查询实体参数* @return List<${entity}VO>*/List<${entity}VO> getList(${entity}SearchDTO searchDto);/*** dto条件查询获取${cfg.bizDesc}Page** @author cento* @date ${date}* @param pageSearchDto 分页查询实体参数* @return Page<${entity}VO>*/Page<${entity}VO> getPage(${entity}PageSearchDTO pageSearchDto);<#if cfg.conf>/*** id禁用${cfg.bizDesc}** @author cento* @date ${date}* @param id 主键id* @return Page<${entity}VO>*/${entity}VO disable(Long id);/*** id启用${cfg.bizDesc}** @author cento* @date ${date}* @param id 主键id* @return Page<${entity}VO>*/${entity}VO enable(Long id);
</#if><#if cfg.biz>
</#if>}
</#if>

3、service实现类

package ${package.ServiceImpl};import ${package.Entity}.${entity};
import ${cfg.voPkg}.${entity}VO;
import ${cfg.dtoPkg}.${entity}AddDTO;
import ${cfg.dtoPkg}.${entity}UpdateDTO;
import ${cfg.dtoPkg}.${entity}SearchDTO;
import ${cfg.dtoPkg}.${entity}PageSearchDTO;
import ${package.Mapper}.${table.mapperName};
import ${package.Service}.${table.serviceName};
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.js.core.domain.entity.BaseEntity;
import com.js.core.domain.entity.BaseBiz;
import com.js.core.service.impl.BaseServiceImpl;
import com.js.core.toolkit.StringTools;
import com.js.core.toolkit.StringPool;
import com.js.core.toolkit.Assert;
import com.js.core.toolkit.Mapper;
import com.js.archive.util.ThreadLocalUtil;
import org.springframework.stereotype.Service;import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;/*** <p>* ${table.comment!} 服务实现类* </p>** @author ${author}* @date ${date}* @since JDK 1.8*/@Service
<#if kotlin>
open class ${table.serviceImplName} : ${superServiceImplClass}<${table.mapperName}, ${entity}>(), ${table.serviceName} {}
<#else>
public class ${table.serviceImplName} extends BaseServiceImpl<${table.mapperName}, ${entity}> implements ${table.serviceName} {/*** 添加单条${cfg.bizDesc}** @author cento* @date ${date}* @param addDto 添加实体参数* @return ${entity}VO*/@Overridepublic ${entity}VO addOne(${entity}AddDTO addDto){${entity} entity = Mapper.map(addDto, ${entity}.class);entity.setArchiveCompanyId(ThreadLocalUtil.getArchiveCompanyId());save(entity);return Mapper.map(entity, ${entity}VO.class);}/*** id删除单条${cfg.bizDesc}** @author cento* @date ${date}* @param id 主键id* @return Boolean*/@Overridepublic Boolean deleteOne(Long id){return removeById(id);}/*** ids删除多条${cfg.bizDesc}** @author cento* @date ${date}* @param ids 主键id字符长串,逗号分隔* @return Boolean*/@Overridepublic Boolean deleteBatch(String ids){Assert.notEmpty(ids, "ids参数不能为空!");List<Long> idList = Arrays.stream(ids.split(StringPool.COMMA)).mapToLong(Long::parseLong).boxed().collect(Collectors.toList());return removeByIds(idList);}/*** id修改单条${cfg.bizDesc}** @author cento* @date ${date}* @param updateDto 修改实体参数* @return ${entity}VO*/@Overridepublic ${entity}VO updateOne(${entity}UpdateDTO updateDto){${entity} entity = Mapper.map(updateDto, ${entity}.class);updateById(entity);return Mapper.map(entity, ${entity}VO.class);}/*** id查询单条${cfg.bizDesc}** @author cento* @date ${date}* @param id 主键id* @return ${entity}VO*/@Overridepublic ${entity}VO getOne(Long id){return Mapper.map(getById(id), ${entity}VO.class);}/*** dto条件查询获取${cfg.bizDesc}List** @author cento* @date ${date}* @param searchDto 查询实体参数* @return List<${entity}VO>*/@Overridepublic List<${entity}VO> getList(${entity}SearchDTO searchDto){return Mapper.map(getLambdaWrapper(searchDto, ThreadLocalUtil.getArchiveCompanyId()).list(), ${entity}VO.class);}/*** dto条件查询获取${cfg.bizDesc}Page** @author cento* @date ${date}* @param pageSearchDto 分页查询实体参数* @return Page<${entity}VO>*/@Overridepublic Page<${entity}VO> getPage(${entity}PageSearchDTO pageSearchDto){return Mapper.map(getLambdaWrapper(pageSearchDto, ThreadLocalUtil.getArchiveCompanyId()).page(new Page<>(pageSearchDto.getCurrent(), pageSearchDto.getSize())), ${entity}VO.class);}
<#if cfg.conf>/*** id禁用${cfg.bizDesc}** @author cento* @date ${date}* @param id 主键id* @return Page<${entity}VO>*/@Overridepublic ${entity}VO disable(Long id){lambdaUpdate().eq(BaseEntity::getId, id).set(BaseConfig::getEnabled, false).update();return Mapper.map(getById(id), ${entity}VO.class);}/*** id启用${cfg.bizDesc}** @author cento* @date ${date}* @param id 主键id* @return Page<${entity}VO>*/@Overridepublic ${entity}VO enable(Long id){lambdaUpdate().eq(BaseEntity::getId, id).set(BaseConfig::getEnabled, true).update();return Mapper.map(getById(id), ${entity}VO.class);}
</#if><#if cfg.biz>
</#if>
}
</#if>

4、Mapper接口

package ${package.Mapper};import com.js.core.mapper.IBaseMapper;
import ${package.Entity}.${entity};
import org.apache.ibatis.annotations.Mapper;/*** <p>* ${table.comment!} Mapper 接口* </p>** @author ${author}* @date ${date}* @since JDK 1.8*/<#if kotlin>
interface ${table.mapperName} : ${superMapperClass}<${entity}>
<#else>
@Mapper
public interface ${table.mapperName} extends IBaseMapper<${entity}> {}
</#if>

5、Mapper的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="${package.Mapper}.${table.mapperName}"><#if enableCache><!-- 开启二级缓存 --><cache type="org.mybatis.caches.ehcache.LoggingEhcache"/></#if>
<#if baseResultMap><!-- 通用查询映射结果 --><resultMap id="BaseResultMap" type="${package.Entity}.${entity}">
<#list table.fields as field>
<#if field.keyFlag><#--生成主键排在第一位--><id column="${field.name}" property="${field.propertyName}" />
</#if>
</#list>
<#list table.commonFields as field><#--生成公共字段 --><result column="${field.name}" property="${field.propertyName}" />
</#list>
<#list table.fields as field>
<#if !field.keyFlag><#--生成普通字段 --><result column="${field.name}" property="${field.propertyName}" />
</#if>
</#list></resultMap></#if>
<#if baseColumnList><!-- 通用查询结果列 --><sql id="Base_Column_List">
<#list table.commonFields as field>${field.columnName},
</#list>${table.fieldNames}</sql></#if>
</mapper>

相关文章:

项目代码生成工具

代码生成工具 文章目录 代码生成工具提取公共类domainbodtoentityvoBean基类 代码生成工厂连接配置模版1、基础类基类Entity添加DTO类分页查询DTO基础查询DTO修改DTO视图VO 2、controller2、service接口3、service实现类4、Mapper接口5、Mapper的xml文件 提取公共类 比方说每个…...

【机器学习驱动的智能化电池管理技术与应用】

在人工智能与电池管理技术融合的背景下&#xff0c;电池科技的研究和应用正迅速发展&#xff0c;创新解决方案层出不穷。从电池性能的精确评估到复杂电池系统的智能监控&#xff0c;从数据驱动的故障诊断到电池寿命的预测优化&#xff0c;人工智能技术正以其强大的数据处理能力…...

【MySQL 】MySQL 安装自记录全程-详细 (mysql-installer-community-8.0.42.0.msi)

看了一些别人的文章&#xff0c;其实还有些困惑&#xff0c;根据不少都有一些跟我遇到的不太一样&#xff0c;记录一下自己的安装过程 MySQL 安装&#xff08;Windows&#xff09; 下载 MySQL 安装包 MySQL数据库官网链接 MySQL &#xff08;MySQL的https://www.mysql.com/ …...

构建事件驱动的云原生后端系统 —— 从设计到实践

📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:为什么需要事件驱动架构? 在现代互联网应用中,系统规模越来越大,功能模块越来越复杂,用户行为越来越不可预测。 传统的同步调用、强耦合的后端架构,面对大规模并发、高频变化、复杂交…...

时间复杂度和空间复杂度 [数据结构 初阶]

目录 算法效率 1. 时间复杂度 1.1 时间复杂度概念 1.2 大O 的渐进表示法 1.2.1 计算 func1 的基本操作执行了多少次 1.3 推导 大O 阶方法 2. 空间复杂度 算法效率 // 算法效率分析分为两种: 1) 时间效率: 时间复杂度, 用来衡量一个算法的运行速度; 2) 空间效率: 空间复…...

SpringMVC 通过ajax 前后端数据交互

在前端的开发过程中&#xff0c;经常在html页面通过ajax进行前后端数据的交互&#xff0c;SpringMVC的controller进行数据的接收&#xff0c;但是有的时候后端会出现数据无法接收到的情况&#xff0c;这个是因为我们的参数和前端ajax的contentType参数 类型不对应的情景&#x…...

Qt从零开始(1)了解

文章目录 1. Qt技术介绍2. 开发GUI的选择3. 框架的介绍4.Qt发展历程&#xff08;简单介绍&#xff09;5. Qt支持的系统6. Qt开发方式7.Qt优点总结 简介&#xff1a;这篇文章简单介绍下Qt的相关知识与应用场景&#xff0c;随便看看&#xff0c;了解了解即可。如果介绍有误或者描…...

当元数据遇见 AI 运维:智能诊断企业数据资产健康度

在数字化浪潮席卷全球的当下&#xff0c;企业数据资产规模呈指数级增长&#xff0c;然而传统数据监控方式却逐渐暴露出诸多弊端。想象一下&#xff0c;在某头部电商的晨会上&#xff0c;数据工程师小王正经历职业生涯最尴尬的时刻&#xff1a;“昨天促销活动的 UV 数据为什么比…...

关于OCP认证:有Oracle和MySQL两种

认证针对的数据库系统 MySQL OCP&#xff1a;是 Oracle 公司针对 MySQL 数据库管理员和开发者设计的认证&#xff0c;主要验证持证者在 MySQL 数据库管理、优化及安全等方面的技术能力。MySQL 是开源的关系数据库管理系统&#xff0c;以其简单、高性能和灵活性在中小型企业及开…...

Macos m系列芯片环境下python3安装mysqlclient系列问题

最近学习python3&#xff0c;在安装mysqlclient的时候遇到了一些问题&#xff0c;直接使用哦pip install mysqlclient 直接报错了&#xff0c;记录一下解决方案。 环境信息 设备&#xff1a;Macbook Pro m1 系统&#xff1a;macos Sequoia 15.3.2 最终成功的python版本&#xf…...

《代码整洁之道》第7章 错误处理 - 笔记

得墨忒耳定律 不要链式调用&#xff0c; 如 a.getB().getC().doSomething()。 直接获取对象调用方法 数据传输对象&#xff08;DTOs&#xff09; DTO (Data Transfer Object)&#xff1a; 数据传输对象。这是一种典型的数据结构。 里面没有任何业务逻辑代码。它的唯一作用就…...

java-mybatis01

对象/关系映射ORM ORM完成面向对象的编程语言DAO关系数据库的映射后&#xff0c;开发人员可以利用面向对象设计语言的建议易用性&#xff0c;也可利用关系数据库的技术优势。 ORM把关系数据库包装成面向对象的模型&#xff0c;采用ORM框架后&#xff0c;应用程序不再直接访问底…...

单片机之间的双向通信

具体功能实现 甲单片机通过按键可以控制乙单片机的LED灯&#xff0c;而乙单片机通过可以让连接甲单片机的数码管数字自增加一。 定时器资源 3个定时器 中断系统 执行现程序的过程中&#xff0c;出现某些急需处理的异常情况或特殊请求&#xff0c;cpu暂时中止现行程序&…...

量子纠缠式架构:当微服务同时存在于所有节点时,CAP定理是否依然成立?

一、CAP定理的经典困境 1. 传统分布式系统的三维束缚 经典权衡案例&#xff1a; 系统类型选择代价银行核心系统CP故障时拒绝服务社交网络AP短暂数据不一致物联网平台CA网络中断即崩溃 二、量子纠缠的降维打击 1. 量子微服务的超距同步 # 量子纠缠服务示例&#xff08;Qiski…...

使用rsync和inotidy-tools来进行实时备份文件夹数据

在工作中遇到这个这么个需求&#xff0c;就是我们有一个samba的文件共享服务器&#xff0c;里面存了很多文件&#xff0c;然后我想实时备份这个samba共享文件的。 1、概述 只需要在源服务器上操作&#xff0c;并在源服务器上安装好rsync和inotidy-tools&#xff0c;目标服务器…...

Spring AI 实现智能对话

1. 实现效果 2. Spring Boot 3 后端 2.1 pom.xml <!-- 管理包依赖。通过 Spring AI 的 BOM 文件统一管理所有 Spring AI 相关依赖的版本&#xff0c;确保版本一致性&#xff0c;减少冲突 --><dependencyManagement><dependencies><!-- Spring AI -->…...

2025 网络安全技术深水区探索:从 “攻防对抗” 到 “数字韧性” 的范式跃迁

引言&#xff1a;当攻击成本趋近于零&#xff0c;防御逻辑必须重构 2025 年&#xff0c;网络安全领域正经历三重根本性变革&#xff1a; 攻击者门槛坍缩&#xff1a;生成式 AI 将网络钓鱼开发效率提升 300%&#xff0c;勒索软件即服务&#xff08;RaaS&#xff09;订阅用户突破…...

学习笔记—双指针算法—移动零

双指针算法 移动零 283. 移动零 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进…...

计算机网络全栈精讲:从 TCP/UDP 原理到 Socket 编程与 HTTP 协议实战(含代码实现)

计算机网络作为现代信息技术的基石&#xff0c;支撑着互联网、物联网、云计算等众多领域的发展。无论是前端开发者、后端工程师&#xff0c;还是运维人员&#xff0c;深入理解计算机网络原理都至关重要。本文将从网络分层模型出发&#xff0c;逐步深入讲解 TCP/UDP 协议、Socke…...

IP地址如何切换到国内别的省份?一步步指导

使用换IP工具的主要目的是通过更换设备的公网IP地址来满足特定需求&#xff0c;例如绕过限制、保护隐私或完成特定任务。以下是常见的应用场景和原因&#xff1a; 一、ip应用场景 1. 绕过IP限制 访问地域限制内容&#xff1a;某些网站或服务&#xff08;如游戏、社交平台 &am…...

c++流对象

核心概念回顾&#xff1a; C 的流库 (<iostream>, <fstream>, <sstream>) 提供了一种统一的方式来处理输入和输出&#xff0c;无论数据是来自键盘、文件还是内存中的字符串。它们都基于 std::istream (输入流基类) 和 std::ostream (输出流基类)&#xff0c…...

华为IP(5)

交换机的堆叠与集群 堆叠和集群指的是同一件事 前言: 随着企业的发展&#xff0c;企业网络的规模越来越大&#xff0c;这对企业网络提出了更高的要求&#xff1a;更高的可靠性、更低的故障恢复时间、设备更加易于管理等。 传统的园区网高可靠性技术出现故障时很难做到毫秒级…...

零信任架构下的等保 2.0 与密评密改双合规

随着《网络安全等级保护2.0》和《商用密码应用安全性评估》的深入实施&#xff0c;企业面临双重合规压力&#xff1a;既要满足等保2.0对“主动防御”和“动态防护”的要求&#xff0c;又要通过密评密改强化密码技术的合规性。传统安全架构依赖边界防护和静态密码策略&#xff0…...

华为 MRAG:多模态检索增强生成技术论文阅读

GitHub项目链接&#xff1a;https://github.com/PanguIR/MRAGSurvey 总览 多模态检索增强生成&#xff08;MRAG&#xff09;通过将文本、图像、视频等多模态数据整合到检索与生成过程中&#xff0c;显著提升了多模态大语言模型&#xff08;MLLM&#xff09;的性能。传统检索增…...

文字光影扫过动效

列子1 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>光影扫过文字动效</title><styl…...

SpringBoot配置RestTemplate并理解单例模式详解

在日常开发中&#xff0c;RestTemplate 是一个非常常用的工具&#xff0c;用来发起HTTP请求。今天我们通过一个小例子&#xff0c;不仅学习如何在SpringBoot中配置RestTemplate&#xff0c;还会深入理解单例模式在Spring中的实际应用。 1. 示例代码 我们首先来看一个基础的配置…...

计算机网络应用层(5)-- P2P文件分发视频流和内容分发网

&#x1f493;个人主页&#xff1a;mooridy &#x1f493;专栏地址&#xff1a;《计算机网络&#xff1a;自顶向下方法》 大纲式阅读笔记_mooridy的博客-CSDN博客 &#x1f493;本博客内容为《计算机网络&#xff1a;自顶向下方法》第二章应用层第五、六节知识梳理 关注我&…...

C++ TCP通信原理与实现

C 中 TCP 通信的原理基于 TCP/IP 协议栈的实现&#xff0c;以下是核心原理和关键步骤的详细说明&#xff1a; 一、TCP 通信核心原理 面向连接 通信双方需通过 三次握手 建立可靠连接&#xff0c;确保通信通道稳定。通过 四次挥手 断开连接&#xff0c;保证数据完整性。 可靠传…...

计算机网络-运输层(1)

计算机网络-运输层(1) 文章目录 计算机网络-运输层(1)5.1 运输层概述5.2 运输层端口号、复用与分用端口号基本概念端口号特性端口号分类重要说明 5.3 UDP与TCP协议对比关键区别说明 5.1 运输层概述 计算机网络体系结构中的物理层、数据链路层以及网络层共同解决了主机通过异构…...

学习spark-streaming收获

1.流处理的核心概念 •实时 vs微批处理&#xff1a;理解了 Spark Streaming 的微批处理&#xff08;Micro-Batch&#xff09;模型&#xff0c;将流数据切分为小批次&#xff08;如1秒间隔&#xff09;进行处理&#xff0c;与真正的流处理&#xff08;如Flink&#xff09;的区…...

蓝桥杯 14. 奇怪的数列

奇怪的数列 原题目链接 题目描述 从 X 星截获一份电码&#xff0c;是一些数字&#xff0c;如下&#xff1a; 13 1113 3113 132113 1113122113 ⋯⋯YY 博士经彻夜研究&#xff0c;发现了规律&#xff1a; 第一行的数字随便是什么&#xff0c;以后每一行都是对上一行 “读出…...

前端高频面试题day2

如何在vue3中使用defineAsyncComponent实现异步组件加载 在 Vue 3 中&#xff0c;使用 defineAsyncComponent 实现异步组件加载的步骤如下&#xff1a; 引入方法&#xff1a;从 Vue 中导入 defineAsyncComponent。定义异步组件&#xff1a;通过 defineAsyncComponent 包装一个…...

Linux系统之设置开机启动运行桌面环境

Linux 开机运行级别介绍与 Ubuntu 桌面环境配置指南 一、Linux 开机运行级别(Runlevel) 在传统的 Linux 系统(如 SysV init 初始化系统)中,运行级别定义了系统启动时加载的服务和资源。常见的运行级别如下: 运行级别模式用途0Halt(停机模式)关闭系统1Single User Mode…...

Python PyAutoGUI库【GUI 自动化库】深度解析与实战指南

一、核心工作原理 底层驱动机制&#xff1a; 通过操作系统原生API模拟输入使用ctypes库调用Windows API/Mac Cocoa/Xlib屏幕操作依赖Pillow库进行图像处理 事件模拟流程&#xff1a; #mermaid-svg-1CGDRNzFNEffhvSa {font-family:"trebuchet ms",verdana,arial,sans…...

【MobaXterm】win10下载v25.1安装流程

【下载地址】 官网&#xff1a; https://mobaxterm.mobatek.net/ 下载安装版&#xff0c;解压使用更快一些 【v20.0中文安装包】 夸克网盘&#xff1a;https://pan.quark.cn/s/2ad5b59e6d8e#/list/share 对应的指导教程&#xff1a; MobaXterm中文版安装使用教程-附安装包…...

2025.4.22 JavaScript 常用事件学习笔记

一、事件概述 JavaScript 事件是指在用户与网页交互或网页状态发生变化时所触发的操作。通过使用事件&#xff0c;可以为网页添加丰富的动态功能&#xff0c;实现用户与页面之间的互动&#xff0c;让网页不再只是静态的展示内容。 二、常见鼠标事件 click 事件 简介 &#xf…...

Android 13.0 MTK Camera2 设置默认拍照尺寸功能实现

Android 13.0 MTK Camera2 设置默认拍照尺寸功能实现 文章目录 需求&#xff1a;参考资料架构图了解Camera相关专栏零散知识了解部分相机源码参考&#xff0c;学习API使用&#xff0c;梳理流程&#xff0c;偏应用层Camera2 系统相关 修改文件-修改方案修改文件&#xff1a;修改…...

Linux:基础IO 文件系统

Linux:基础IO && 文件系统 一、系统IO&#xff08;一&#xff09;系统文件操作接口1、open2、write3、read &#xff08;二&#xff09;文件描述符1、概念2、标准输入、标准输出、标准错误 &#xff08;三&#xff09;dup系统调用&#xff08;重定向原理&#xff09; 二…...

近期有哪些断链危机?如何提升供应链风险管理能力?

全球供应链格局正经历深刻变革&#xff0c;其网络架构愈发复杂&#xff0c;涉及多国企业主体且涵盖多个节点与复杂环节&#xff0c;管理难度显著增大。从原材料采购到终端交付&#xff0c;运输、仓储、加工等任一环节均存在潜在风险&#xff0c;单一环节效率滞后易引发系统性连…...

知识科普|褪黑素的发展历程及应用研究进展

睡眠作为维持人体健康的重要生理机制&#xff0c;其节律性受到精密调控。在昼夜节律系统的调控下&#xff0c;人类普遍遵循周期性单次睡眠模式&#xff0c;这一过程涉及复杂的神经-体液调控网络。其中神经元活动、神经递质传导、激素分泌及遗传调控机制共同作用于睡眠觉醒系统&…...

企业如何构建一个全面的Web安全防护体系

企业如何构建一个全面的Web安全防护体系 企业构建全面的Web安全防护体系需融合战略规划、技术防御、持续运营和风险治理四大维度&#xff0c;以下是基于行业最佳实践的系统化方案&#xff1a; 一、顶层设计&#xff1a;治理架构与安全战略 战略规划与合规驱动 制定网络安全愿…...

T8332FN凯钰LED驱动芯片多拓扑车规级AEC-Q100

T8332FN是一款支持多拓扑结构的恒流LED驱动控制芯片&#xff0c;适用于汽车照明及高功率LED应用&#xff0c;具备宽电压输入、高精度调光及多重保护功能。 核心特性 - 输入与拓扑&#xff1a;支持5-60V宽电压输入&#xff0c;适配Boost、Buck、Buck-Boost、SEPIC四种拓扑结构&…...

Redis一些小记录

Redis一些小记录 SpringData Redis&#xff1a;RedisTemplate配置与数据操作 操作String类型数据 String是Redis中最基本的数据类型&#xff0c;可以存储字符串、整数或浮点数。RedisTemplate提供了ValueOperations接口来操作String类型的数据&#xff0c;支持设置值、获取值、…...

Win10安装 P104-100 驱动

安装完之后总结一下, 之前做了不少功课, 在网上搜了很多教程, 视频的文字的, 但是很多已经比较陈旧了. 最后发现的这个 GitHub 项目 NVIDIA-patcher 是最有用的, 因为这是现在这些魔改驱动的来源. NVIDIA-patcher 仓库地址: https://github.com/dartraiden/NVIDIA-patcher 安…...

Android开机动画资源包制作(测试使用)

开机动画资源包需要采用仅存储的方式进行压缩&#xff0c;不能使用压缩软件直接压缩生成。 如果是系统开发人员&#xff0c;可以在源码目录中&#xff0c;采用bootanim程序提供的制作方式进行&#xff0c;下面可供测试人员自行制作。 制作流程 1&#xff09;基于设备中已有开…...

PWN基础-利用格式化字符串漏洞泄露canary结合栈溢出getshell

测试源码&#xff1a; #include<stdio.h> void exploit() {system("/bin/sh"); } void func() {char str[0x20];read(0, str, 0x50);printf(str);read(0, str, 0x50); } int main() {func();return 0; } 编译&#xff0c;开启 canary 保护&#xff0c;关闭 p…...

Kafka HA集群配置搭建与SpringBoot使用示例总结

Kafka HA集群配置搭建与SpringBoot使用示例总结 一、Kafka高可用(HA)集群搭建 1. 环境准备 至少3台服务器&#xff08;推荐奇数台&#xff0c;如3、5、7&#xff09;已安装Java环境&#xff08;JDK 1.8&#xff09;下载Kafka二进制包&#xff08;如kafka_2.13-3.2.1.tgz&…...

MSO-Player:基于vlc的Unity直播流播放器,支持主流RTSP、RTMP、HTTP等常见格式

MSO-Player 基于libVLC的Unity视频播放解决方案 支持2D视频和360度全景视频播放的Unity插件 &#x1f4d1; 目录 &#x1f3a5; MSO-Player &#x1f4cb; 功能概述&#x1f680; 快速入门&#x1f4da; 关键组件&#x1f4dd; 使用案例&#x1f50c; 依赖项&#x1f4cb; 注意…...

97A6-ASEMI无人机专用功率器件97A6

编辑&#xff1a;ll 97A6-ASEMI无人机专用功率器件97A6 型号&#xff1a;97A6 品牌&#xff1a;ASEMI 封装&#xff1a;SOT-23 批号&#xff1a;最新 引脚数量&#xff1a;3 特性&#xff1a;双向可控硅 工作温度&#xff1a;-40℃~150℃ ‌97A6双向可控硅&#xff1a…...

body Param Query 三个 不同的入参 分别是什么意思 在前端 要怎么传 这三种不同的参数

在 NestJS 中&#xff0c;Body()、Param() 和 Query() 用于处理不同类型的请求参数。以下是它们的含义及前端传递方式&#xff1a; Body()&#xff1a;请求体参数 • 含义&#xff1a;用于获取请求体中的数据&#xff08;如 POST/PUT 请求中提交的 JSON、表单数据等&#xff09…...