项目代码生成工具
代码生成工具
文章目录
- 代码生成工具
- 提取公共类
- 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文件 提取公共类 比方说每个…...
【机器学习驱动的智能化电池管理技术与应用】
在人工智能与电池管理技术融合的背景下,电池科技的研究和应用正迅速发展,创新解决方案层出不穷。从电池性能的精确评估到复杂电池系统的智能监控,从数据驱动的故障诊断到电池寿命的预测优化,人工智能技术正以其强大的数据处理能力…...
【MySQL 】MySQL 安装自记录全程-详细 (mysql-installer-community-8.0.42.0.msi)
看了一些别人的文章,其实还有些困惑,根据不少都有一些跟我遇到的不太一样,记录一下自己的安装过程 MySQL 安装(Windows) 下载 MySQL 安装包 MySQL数据库官网链接 MySQL (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 前后端数据交互
在前端的开发过程中,经常在html页面通过ajax进行前后端数据的交互,SpringMVC的controller进行数据的接收,但是有的时候后端会出现数据无法接收到的情况,这个是因为我们的参数和前端ajax的contentType参数 类型不对应的情景&#x…...
Qt从零开始(1)了解
文章目录 1. Qt技术介绍2. 开发GUI的选择3. 框架的介绍4.Qt发展历程(简单介绍)5. Qt支持的系统6. Qt开发方式7.Qt优点总结 简介:这篇文章简单介绍下Qt的相关知识与应用场景,随便看看,了解了解即可。如果介绍有误或者描…...
当元数据遇见 AI 运维:智能诊断企业数据资产健康度
在数字化浪潮席卷全球的当下,企业数据资产规模呈指数级增长,然而传统数据监控方式却逐渐暴露出诸多弊端。想象一下,在某头部电商的晨会上,数据工程师小王正经历职业生涯最尴尬的时刻:“昨天促销活动的 UV 数据为什么比…...
关于OCP认证:有Oracle和MySQL两种
认证针对的数据库系统 MySQL OCP:是 Oracle 公司针对 MySQL 数据库管理员和开发者设计的认证,主要验证持证者在 MySQL 数据库管理、优化及安全等方面的技术能力。MySQL 是开源的关系数据库管理系统,以其简单、高性能和灵活性在中小型企业及开…...
Macos m系列芯片环境下python3安装mysqlclient系列问题
最近学习python3,在安装mysqlclient的时候遇到了一些问题,直接使用哦pip install mysqlclient 直接报错了,记录一下解决方案。 环境信息 设备:Macbook Pro m1 系统:macos Sequoia 15.3.2 最终成功的python版本…...
《代码整洁之道》第7章 错误处理 - 笔记
得墨忒耳定律 不要链式调用, 如 a.getB().getC().doSomething()。 直接获取对象调用方法 数据传输对象(DTOs) DTO (Data Transfer Object): 数据传输对象。这是一种典型的数据结构。 里面没有任何业务逻辑代码。它的唯一作用就…...
java-mybatis01
对象/关系映射ORM ORM完成面向对象的编程语言DAO关系数据库的映射后,开发人员可以利用面向对象设计语言的建议易用性,也可利用关系数据库的技术优势。 ORM把关系数据库包装成面向对象的模型,采用ORM框架后,应用程序不再直接访问底…...
单片机之间的双向通信
具体功能实现 甲单片机通过按键可以控制乙单片机的LED灯,而乙单片机通过可以让连接甲单片机的数码管数字自增加一。 定时器资源 3个定时器 中断系统 执行现程序的过程中,出现某些急需处理的异常情况或特殊请求,cpu暂时中止现行程序&…...
量子纠缠式架构:当微服务同时存在于所有节点时,CAP定理是否依然成立?
一、CAP定理的经典困境 1. 传统分布式系统的三维束缚 经典权衡案例: 系统类型选择代价银行核心系统CP故障时拒绝服务社交网络AP短暂数据不一致物联网平台CA网络中断即崩溃 二、量子纠缠的降维打击 1. 量子微服务的超距同步 # 量子纠缠服务示例(Qiski…...
使用rsync和inotidy-tools来进行实时备份文件夹数据
在工作中遇到这个这么个需求,就是我们有一个samba的文件共享服务器,里面存了很多文件,然后我想实时备份这个samba共享文件的。 1、概述 只需要在源服务器上操作,并在源服务器上安装好rsync和inotidy-tools,目标服务器…...
Spring AI 实现智能对话
1. 实现效果 2. Spring Boot 3 后端 2.1 pom.xml <!-- 管理包依赖。通过 Spring AI 的 BOM 文件统一管理所有 Spring AI 相关依赖的版本,确保版本一致性,减少冲突 --><dependencyManagement><dependencies><!-- Spring AI -->…...
2025 网络安全技术深水区探索:从 “攻防对抗” 到 “数字韧性” 的范式跃迁
引言:当攻击成本趋近于零,防御逻辑必须重构 2025 年,网络安全领域正经历三重根本性变革: 攻击者门槛坍缩:生成式 AI 将网络钓鱼开发效率提升 300%,勒索软件即服务(RaaS)订阅用户突破…...
学习笔记—双指针算法—移动零
双指针算法 移动零 283. 移动零 - 力扣(LeetCode) 题目描述: 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进…...
计算机网络全栈精讲:从 TCP/UDP 原理到 Socket 编程与 HTTP 协议实战(含代码实现)
计算机网络作为现代信息技术的基石,支撑着互联网、物联网、云计算等众多领域的发展。无论是前端开发者、后端工程师,还是运维人员,深入理解计算机网络原理都至关重要。本文将从网络分层模型出发,逐步深入讲解 TCP/UDP 协议、Socke…...
IP地址如何切换到国内别的省份?一步步指导
使用换IP工具的主要目的是通过更换设备的公网IP地址来满足特定需求,例如绕过限制、保护隐私或完成特定任务。以下是常见的应用场景和原因: 一、ip应用场景 1. 绕过IP限制 访问地域限制内容:某些网站或服务(如游戏、社交平台 &am…...
c++流对象
核心概念回顾: C 的流库 (<iostream>, <fstream>, <sstream>) 提供了一种统一的方式来处理输入和输出,无论数据是来自键盘、文件还是内存中的字符串。它们都基于 std::istream (输入流基类) 和 std::ostream (输出流基类),…...
华为IP(5)
交换机的堆叠与集群 堆叠和集群指的是同一件事 前言: 随着企业的发展,企业网络的规模越来越大,这对企业网络提出了更高的要求:更高的可靠性、更低的故障恢复时间、设备更加易于管理等。 传统的园区网高可靠性技术出现故障时很难做到毫秒级…...
零信任架构下的等保 2.0 与密评密改双合规
随着《网络安全等级保护2.0》和《商用密码应用安全性评估》的深入实施,企业面临双重合规压力:既要满足等保2.0对“主动防御”和“动态防护”的要求,又要通过密评密改强化密码技术的合规性。传统安全架构依赖边界防护和静态密码策略࿰…...
华为 MRAG:多模态检索增强生成技术论文阅读
GitHub项目链接:https://github.com/PanguIR/MRAGSurvey 总览 多模态检索增强生成(MRAG)通过将文本、图像、视频等多模态数据整合到检索与生成过程中,显著提升了多模态大语言模型(MLLM)的性能。传统检索增…...
文字光影扫过动效
列子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并理解单例模式详解
在日常开发中,RestTemplate 是一个非常常用的工具,用来发起HTTP请求。今天我们通过一个小例子,不仅学习如何在SpringBoot中配置RestTemplate,还会深入理解单例模式在Spring中的实际应用。 1. 示例代码 我们首先来看一个基础的配置…...
计算机网络应用层(5)-- P2P文件分发视频流和内容分发网
💓个人主页:mooridy 💓专栏地址:《计算机网络:自顶向下方法》 大纲式阅读笔记_mooridy的博客-CSDN博客 💓本博客内容为《计算机网络:自顶向下方法》第二章应用层第五、六节知识梳理 关注我&…...
C++ TCP通信原理与实现
C 中 TCP 通信的原理基于 TCP/IP 协议栈的实现,以下是核心原理和关键步骤的详细说明: 一、TCP 通信核心原理 面向连接 通信双方需通过 三次握手 建立可靠连接,确保通信通道稳定。通过 四次挥手 断开连接,保证数据完整性。 可靠传…...
计算机网络-运输层(1)
计算机网络-运输层(1) 文章目录 计算机网络-运输层(1)5.1 运输层概述5.2 运输层端口号、复用与分用端口号基本概念端口号特性端口号分类重要说明 5.3 UDP与TCP协议对比关键区别说明 5.1 运输层概述 计算机网络体系结构中的物理层、数据链路层以及网络层共同解决了主机通过异构…...
学习spark-streaming收获
1.流处理的核心概念 •实时 vs微批处理:理解了 Spark Streaming 的微批处理(Micro-Batch)模型,将流数据切分为小批次(如1秒间隔)进行处理,与真正的流处理(如Flink)的区…...
蓝桥杯 14. 奇怪的数列
奇怪的数列 原题目链接 题目描述 从 X 星截获一份电码,是一些数字,如下: 13 1113 3113 132113 1113122113 ⋯⋯YY 博士经彻夜研究,发现了规律: 第一行的数字随便是什么,以后每一行都是对上一行 “读出…...
前端高频面试题day2
如何在vue3中使用defineAsyncComponent实现异步组件加载 在 Vue 3 中,使用 defineAsyncComponent 实现异步组件加载的步骤如下: 引入方法:从 Vue 中导入 defineAsyncComponent。定义异步组件:通过 defineAsyncComponent 包装一个…...
Linux系统之设置开机启动运行桌面环境
Linux 开机运行级别介绍与 Ubuntu 桌面环境配置指南 一、Linux 开机运行级别(Runlevel) 在传统的 Linux 系统(如 SysV init 初始化系统)中,运行级别定义了系统启动时加载的服务和资源。常见的运行级别如下: 运行级别模式用途0Halt(停机模式)关闭系统1Single User Mode…...
Python PyAutoGUI库【GUI 自动化库】深度解析与实战指南
一、核心工作原理 底层驱动机制: 通过操作系统原生API模拟输入使用ctypes库调用Windows API/Mac Cocoa/Xlib屏幕操作依赖Pillow库进行图像处理 事件模拟流程: #mermaid-svg-1CGDRNzFNEffhvSa {font-family:"trebuchet ms",verdana,arial,sans…...
【MobaXterm】win10下载v25.1安装流程
【下载地址】 官网: https://mobaxterm.mobatek.net/ 下载安装版,解压使用更快一些 【v20.0中文安装包】 夸克网盘:https://pan.quark.cn/s/2ad5b59e6d8e#/list/share 对应的指导教程: MobaXterm中文版安装使用教程-附安装包…...
2025.4.22 JavaScript 常用事件学习笔记
一、事件概述 JavaScript 事件是指在用户与网页交互或网页状态发生变化时所触发的操作。通过使用事件,可以为网页添加丰富的动态功能,实现用户与页面之间的互动,让网页不再只是静态的展示内容。 二、常见鼠标事件 click 事件 简介 …...
Android 13.0 MTK Camera2 设置默认拍照尺寸功能实现
Android 13.0 MTK Camera2 设置默认拍照尺寸功能实现 文章目录 需求:参考资料架构图了解Camera相关专栏零散知识了解部分相机源码参考,学习API使用,梳理流程,偏应用层Camera2 系统相关 修改文件-修改方案修改文件:修改…...
Linux:基础IO 文件系统
Linux:基础IO && 文件系统 一、系统IO(一)系统文件操作接口1、open2、write3、read (二)文件描述符1、概念2、标准输入、标准输出、标准错误 (三)dup系统调用(重定向原理) 二…...
近期有哪些断链危机?如何提升供应链风险管理能力?
全球供应链格局正经历深刻变革,其网络架构愈发复杂,涉及多国企业主体且涵盖多个节点与复杂环节,管理难度显著增大。从原材料采购到终端交付,运输、仓储、加工等任一环节均存在潜在风险,单一环节效率滞后易引发系统性连…...
知识科普|褪黑素的发展历程及应用研究进展
睡眠作为维持人体健康的重要生理机制,其节律性受到精密调控。在昼夜节律系统的调控下,人类普遍遵循周期性单次睡眠模式,这一过程涉及复杂的神经-体液调控网络。其中神经元活动、神经递质传导、激素分泌及遗传调控机制共同作用于睡眠觉醒系统&…...
企业如何构建一个全面的Web安全防护体系
企业如何构建一个全面的Web安全防护体系 企业构建全面的Web安全防护体系需融合战略规划、技术防御、持续运营和风险治理四大维度,以下是基于行业最佳实践的系统化方案: 一、顶层设计:治理架构与安全战略 战略规划与合规驱动 制定网络安全愿…...
T8332FN凯钰LED驱动芯片多拓扑车规级AEC-Q100
T8332FN是一款支持多拓扑结构的恒流LED驱动控制芯片,适用于汽车照明及高功率LED应用,具备宽电压输入、高精度调光及多重保护功能。 核心特性 - 输入与拓扑:支持5-60V宽电压输入,适配Boost、Buck、Buck-Boost、SEPIC四种拓扑结构&…...
Redis一些小记录
Redis一些小记录 SpringData Redis:RedisTemplate配置与数据操作 操作String类型数据 String是Redis中最基本的数据类型,可以存储字符串、整数或浮点数。RedisTemplate提供了ValueOperations接口来操作String类型的数据,支持设置值、获取值、…...
Win10安装 P104-100 驱动
安装完之后总结一下, 之前做了不少功课, 在网上搜了很多教程, 视频的文字的, 但是很多已经比较陈旧了. 最后发现的这个 GitHub 项目 NVIDIA-patcher 是最有用的, 因为这是现在这些魔改驱动的来源. NVIDIA-patcher 仓库地址: https://github.com/dartraiden/NVIDIA-patcher 安…...
Android开机动画资源包制作(测试使用)
开机动画资源包需要采用仅存储的方式进行压缩,不能使用压缩软件直接压缩生成。 如果是系统开发人员,可以在源码目录中,采用bootanim程序提供的制作方式进行,下面可供测试人员自行制作。 制作流程 1)基于设备中已有开…...
PWN基础-利用格式化字符串漏洞泄露canary结合栈溢出getshell
测试源码: #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; } 编译,开启 canary 保护,关闭 p…...
Kafka HA集群配置搭建与SpringBoot使用示例总结
Kafka HA集群配置搭建与SpringBoot使用示例总结 一、Kafka高可用(HA)集群搭建 1. 环境准备 至少3台服务器(推荐奇数台,如3、5、7)已安装Java环境(JDK 1.8)下载Kafka二进制包(如kafka_2.13-3.2.1.tgz&…...
MSO-Player:基于vlc的Unity直播流播放器,支持主流RTSP、RTMP、HTTP等常见格式
MSO-Player 基于libVLC的Unity视频播放解决方案 支持2D视频和360度全景视频播放的Unity插件 📑 目录 🎥 MSO-Player 📋 功能概述🚀 快速入门📚 关键组件📝 使用案例🔌 依赖项📋 注意…...
97A6-ASEMI无人机专用功率器件97A6
编辑:ll 97A6-ASEMI无人机专用功率器件97A6 型号:97A6 品牌:ASEMI 封装:SOT-23 批号:最新 引脚数量:3 特性:双向可控硅 工作温度:-40℃~150℃ 97A6双向可控硅:…...
body Param Query 三个 不同的入参 分别是什么意思 在前端 要怎么传 这三种不同的参数
在 NestJS 中,Body()、Param() 和 Query() 用于处理不同类型的请求参数。以下是它们的含义及前端传递方式: Body():请求体参数 • 含义:用于获取请求体中的数据(如 POST/PUT 请求中提交的 JSON、表单数据等)…...