style(framework): 优化代码格式与注解配置

This commit is contained in:
2025-10-31 15:15:28 +08:00
parent dcf2528e5d
commit 4bf72f5a7f
187 changed files with 2598 additions and 2290 deletions
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent> <parent>
<artifactId>cutejava</artifactId> <artifactId>cutejava</artifactId>
@@ -29,7 +29,7 @@ import java.util.Date;
@Setter @Setter
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
public class CsBaseCreateTimeTb extends CsObject { public class CsBaseCreateTimeTb extends CsObject {
@Schema(name ="创建时间: yyyy-MM-dd HH:mm:ss", hidden = true) @Schema(name = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true)
@TableField(fill = FieldFill.INSERT) @TableField(fill = FieldFill.INSERT)
private Date createTime; private Date createTime;
} }
@@ -29,7 +29,7 @@ import java.util.Date;
@Setter @Setter
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
public class CsBaseUpdateTimeTb extends CsObject { public class CsBaseUpdateTimeTb extends CsObject {
@Schema(name ="更新时间: yyyy-MM-dd HH:mm:ss", hidden = true) @Schema(name = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true)
@TableField(fill = FieldFill.INSERT_UPDATE) @TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime; private Date updateTime;
} }
@@ -35,21 +35,13 @@ public class CsBaseUserCreateTimeTb extends CsObject {
@CreatedBy @CreatedBy
@TableField(fill = FieldFill.INSERT) @TableField(fill = FieldFill.INSERT)
@Schema(name ="创建人", hidden = true) @Schema(name = "创建人", hidden = true)
private String createBy; private String createBy;
@TableField(fill = FieldFill.INSERT) @TableField(fill = FieldFill.INSERT)
@Schema(name ="创建时间: yyyy-MM-dd HH:mm:ss", hidden = true) @Schema(name = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true)
private Date createTime; private Date createTime;
/* 分组校验 */
public @interface Create {
}
/* 分组校验 */
public @interface Update {
}
@Override @Override
public String toString() { public String toString() {
ToStringBuilder builder = new ToStringBuilder(this); ToStringBuilder builder = new ToStringBuilder(this);
@@ -64,4 +56,12 @@ public class CsBaseUserCreateTimeTb extends CsObject {
} }
return builder.toString(); return builder.toString();
} }
/* 分组校验 */
public @interface Create {
}
/* 分组校验 */
public @interface Update {
}
} }
@@ -38,19 +38,19 @@ import java.util.Date;
public class CsBaseUserTimeLogicTb extends CsObject { public class CsBaseUserTimeLogicTb extends CsObject {
@CreatedBy @CreatedBy
@TableField(value = "create_by", fill = FieldFill.INSERT) @TableField(value = "create_by", fill = FieldFill.INSERT)
@Schema(name ="创建人", hidden = true) @Schema(name = "创建人", hidden = true)
private String createBy; private String createBy;
@LastModifiedBy @LastModifiedBy
@TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE) @TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE)
@Schema(name ="更新人", hidden = true) @Schema(name = "更新人", hidden = true)
private String updateBy; private String updateBy;
@TableField(value = "create_time", fill = FieldFill.INSERT) @TableField(value = "create_time", fill = FieldFill.INSERT)
@Schema(name ="创建时间", hidden = true) @Schema(name = "创建时间", hidden = true)
private Date createTime; private Date createTime;
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
@Schema(name ="更新时间", hidden = true) @Schema(name = "更新时间", hidden = true)
private Date updateTime; private Date updateTime;
@Schema(name ="数据有效性", hidden = true) @Schema(name = "数据有效性", hidden = true)
@TableLogic @TableLogic
@TableField("available") @TableField("available")
private Integer available; private Integer available;
@@ -36,30 +36,22 @@ public class CsBaseUserTimeTb extends CsObject {
@CreatedBy @CreatedBy
@TableField(fill = FieldFill.INSERT) @TableField(fill = FieldFill.INSERT)
@Schema(name ="创建人", hidden = true) @Schema(name = "创建人", hidden = true)
private String createBy; private String createBy;
@LastModifiedBy @LastModifiedBy
@TableField(fill = FieldFill.INSERT_UPDATE) @TableField(fill = FieldFill.INSERT_UPDATE)
@Schema(name ="更新人", hidden = true) @Schema(name = "更新人", hidden = true)
private String updateBy; private String updateBy;
@TableField(fill = FieldFill.INSERT) @TableField(fill = FieldFill.INSERT)
@Schema(name ="创建时间: yyyy-MM-dd HH:mm:ss", hidden = true) @Schema(name = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true)
private Date createTime; private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE) @TableField(fill = FieldFill.INSERT_UPDATE)
@Schema(name ="更新时间: yyyy-MM-dd HH:mm:ss", hidden = true) @Schema(name = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true)
private Date updateTime; private Date updateTime;
/* 分组校验 */
public @interface Create {
}
/* 分组校验 */
public @interface Update {
}
@Override @Override
public String toString() { public String toString() {
ToStringBuilder builder = new ToStringBuilder(this); ToStringBuilder builder = new ToStringBuilder(this);
@@ -74,4 +66,12 @@ public class CsBaseUserTimeTb extends CsObject {
} }
return builder.toString(); return builder.toString();
} }
/* 分组校验 */
public @interface Create {
}
/* 分组校验 */
public @interface Update {
}
} }
@@ -37,11 +37,11 @@ import java.io.Serializable;
public class CsPageArgs<T> implements Serializable { public class CsPageArgs<T> implements Serializable {
@NotNull(message = "参数page不能为空") @NotNull(message = "参数page不能为空")
@Min(value = 1, message = "参数page最小值为1") @Min(value = 1, message = "参数page最小值为1")
@Schema(name ="页码", example = "1") @Schema(name = "页码", example = "1")
private Integer page; private Integer page;
@NotNull(message = "参数size不能为空") @NotNull(message = "参数size不能为空")
@Min(value = 1, message = "参数size最小值为1") @Min(value = 1, message = "参数size最小值为1")
@Schema(name ="每页数据量", example = "10") @Schema(name = "每页数据量", example = "10")
private Integer size; private Integer size;
private T args; private T args;
} }
@@ -23,11 +23,7 @@ import lombok.Getter;
@AllArgsConstructor @AllArgsConstructor
public enum FileTypeEnum { public enum FileTypeEnum {
/* 文件类型 */ /* 文件类型 */
IMAGE("image", "图片"), IMAGE("image", "图片"), DOC("doc", "文档"), VOICE("voice", "音频"), VIDEO("video", "视频"), OTHER("other", "其他");
DOC("doc", "文档"),
VOICE("voice", "音频"),
VIDEO("video", "视频"),
OTHER("other", "其他");
private final String code; private final String code;
private final String description; private final String description;
@@ -33,11 +33,6 @@ import java.net.UnknownHostException;
*/ */
@Slf4j @Slf4j
public class BootApplication { public class BootApplication {
@Bean
public CsSpringBeanHolder springBeanHolder() {
return new CsSpringBeanHolder();
}
protected static void inited(ConfigurableApplicationContext application) throws UnknownHostException { protected static void inited(ConfigurableApplicationContext application) throws UnknownHostException {
Environment env = application.getEnvironment(); Environment env = application.getEnvironment();
String ip = InetAddress.getLocalHost().getHostAddress(); String ip = InetAddress.getLocalHost().getHostAddress();
@@ -51,4 +46,9 @@ public class BootApplication {
\tSwagger文档: \thttp://{}:{}{}/doc.html \tSwagger文档: \thttp://{}:{}{}/doc.html
----------------------------------------------------------""", port, path, ip, port, path, ip, port, path); ----------------------------------------------------------""", port, path, ip, port, path, ip, port, path);
} }
@Bean
public CsSpringBeanHolder springBeanHolder() {
return new CsSpringBeanHolder();
}
} }
@@ -29,6 +29,6 @@ import java.util.Objects;
public class CsRequestHolder { public class CsRequestHolder {
public static HttpServletRequest getHttpServletRequest() { public static HttpServletRequest getHttpServletRequest() {
return ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); return ((ServletRequestAttributes)Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
} }
} }
@@ -32,8 +32,8 @@ import java.util.List;
@SuppressWarnings({"unchecked", "all"}) @SuppressWarnings({"unchecked", "all"})
public class CsSpringBeanHolder implements ApplicationContextAware, DisposableBean { public class CsSpringBeanHolder implements ApplicationContextAware, DisposableBean {
private static ApplicationContext applicationContext = null;
private static final List<CallBack> CALL_BACKS = new ArrayList<>(); private static final List<CallBack> CALL_BACKS = new ArrayList<>();
private static ApplicationContext applicationContext = null;
private static boolean addCallback = true; private static boolean addCallback = true;
/** /**
@@ -55,7 +55,7 @@ public class CsSpringBeanHolder implements ApplicationContextAware, DisposableBe
*/ */
public static <T> T getBean(String name) { public static <T> T getBean(String name) {
assertContextInjected(); assertContextInjected();
return (T) applicationContext.getBean(name); return (T)applicationContext.getBean(name);
} }
/** /**
@@ -110,8 +110,7 @@ public class CsSpringBeanHolder implements ApplicationContextAware, DisposableBe
private static void assertContextInjected() { private static void assertContextInjected() {
if (applicationContext == null) { if (applicationContext == null) {
throw new IllegalStateException( throw new IllegalStateException(
"applicaitonContext属性未注入, 请在applicationContext" + "applicaitonContext属性未注入, 请在applicationContext" + ".xml中定义SpringContextHolder或在SpringBoot启动类中注册SpringContextHolder.");
".xml中定义SpringContextHolder或在SpringBoot启动类中注册SpringContextHolder.");
} }
} }
@@ -123,6 +122,15 @@ public class CsSpringBeanHolder implements ApplicationContextAware, DisposableBe
applicationContext = null; applicationContext = null;
} }
/**
* 获取 @Service 的所有 bean 名称
*
* @return /
*/
public static List<String> getAllServiceBeanName() {
return new ArrayList<>(Arrays.asList(applicationContext.getBeanNamesForAnnotation(Service.class)));
}
@Override @Override
public void destroy() { public void destroy() {
CsSpringBeanHolder.clearHolder(); CsSpringBeanHolder.clearHolder();
@@ -131,8 +139,7 @@ public class CsSpringBeanHolder implements ApplicationContextAware, DisposableBe
@Override @Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if (CsSpringBeanHolder.applicationContext != null) { if (CsSpringBeanHolder.applicationContext != null) {
log.warn("SpringContextHolder中的ApplicationContext被覆盖, 原有ApplicationContext为:" + log.warn("SpringContextHolder中的ApplicationContext被覆盖, 原有ApplicationContext为:" + CsSpringBeanHolder.applicationContext);
CsSpringBeanHolder.applicationContext);
} }
CsSpringBeanHolder.applicationContext = applicationContext; CsSpringBeanHolder.applicationContext = applicationContext;
if (addCallback) { if (addCallback) {
@@ -144,15 +151,6 @@ public class CsSpringBeanHolder implements ApplicationContextAware, DisposableBe
CsSpringBeanHolder.addCallback = false; CsSpringBeanHolder.addCallback = false;
} }
/**
* 获取 @Service 的所有 bean 名称
*
* @return /
*/
public static List<String> getAllServiceBeanName() {
return new ArrayList<>(Arrays.asList(applicationContext.getBeanNamesForAnnotation(Service.class)));
}
interface CallBack { interface CallBack {
/** /**
@@ -27,6 +27,7 @@ import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.bind.annotation.RestControllerAdvice;
/** /**
* 全局异常处理 * 全局异常处理
* *
@@ -27,61 +27,49 @@ public enum CsMpQTypeEnum {
/** /**
* 大于等于 * 大于等于
*/ */
, , GREATER_THAN
GREATER_THAN
/** /**
* 小于等于 * 小于等于
*/ */
, , LESS_THAN
LESS_THAN
/** /**
* 中模糊查询 * 中模糊查询
*/ */
, , INNER_LIKE
INNER_LIKE
/** /**
* 左模糊查询 * 左模糊查询
*/ */
, , LEFT_LIKE
LEFT_LIKE
/** /**
* 右模糊查询 * 右模糊查询
*/ */
, , RIGHT_LIKE
RIGHT_LIKE
/** /**
* 小于 * 小于
*/ */
, , LESS_THAN_NQ
LESS_THAN_NQ
/** /**
* 包含 * 包含
*/ */
, , IN
IN
/** /**
* 不包含 * 不包含
*/ */
, , NOT_IN
NOT_IN
/** /**
* 不等于 * 不等于
*/ */
, , NOT_EQUAL
NOT_EQUAL
/** /**
* between(注:被注解的属性一定得是数组或者集合, 长度大于等于2) * between(注:被注解的属性一定得是数组或者集合, 长度大于等于2)
*/ */
, , BETWEEN
BETWEEN
/** /**
* 不为空 * 不为空
*/ */
, , NOT_NULL
NOT_NULL
/** /**
* 为空 * 为空
*/ */
, , IS_NULL
IS_NULL
} }
@@ -85,6 +85,7 @@ public enum DataTypeEnum {
* impala * impala
*/ */
IMPALA("impala", "impala", "com.cloudera.impala.jdbc41.Driver", "", "", "'", "'"); IMPALA("impala", "impala", "com.cloudera.impala.jdbc41.Driver", "", "", "'", "'");
private static final String JDBC_URL_PREFIX = "jdbc:";
private String feature; private String feature;
private String desc; private String desc;
private String driver; private String driver;
@@ -92,16 +93,8 @@ public enum DataTypeEnum {
private String keywordSuffix; private String keywordSuffix;
private String aliasPrefix; private String aliasPrefix;
private String aliasSuffix; private String aliasSuffix;
private static final String JDBC_URL_PREFIX = "jdbc:";
DataTypeEnum( DataTypeEnum(String feature, String desc, String driver, String keywordPrefix, String keywordSuffix, String aliasPrefix, String aliasSuffix) {
String feature,
String desc,
String driver,
String keywordPrefix,
String keywordSuffix,
String aliasPrefix,
String aliasSuffix) {
this.feature = feature; this.feature = feature;
this.desc = desc; this.desc = desc;
this.driver = driver; this.driver = driver;
@@ -61,6 +61,7 @@ public class MpCustomP6SpyLogger implements MessageFormattingStrategy {
sql = sql.replaceAll("\\s+", " ").trim(); sql = sql.replaceAll("\\s+", " ").trim();
} }
// 格式化并加上颜色 // 格式化并加上颜色
return String.format("CuteJava - %s%s%s %s[%s] %sREVIEW_SQL [Interval: %dms]%s -> %s;", RED, now, RESET, GREEN, Thread.currentThread().getName(), BLUE, elapsed, RESET, sql); return String.format("CuteJava - %s%s%s %s[%s] %sREVIEW_SQL [Interval: %dms]%s -> %s;", RED, now, RESET, GREEN, Thread.currentThread().getName(), BLUE,
elapsed, RESET, sql);
} }
} }
@@ -62,10 +62,9 @@ public class RemoveDruidAdConfig {
} }
@Override @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest)request;
HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse)response;
HttpServletResponse httpResponse = (HttpServletResponse) response;
if (httpRequest.getRequestURI().endsWith("js/common.js")) { if (httpRequest.getRequestURI().endsWith("js/common.js")) {
// 获取common.js // 获取common.js
String text = Utils.readFromResource(filePath); String text = Utils.readFromResource(filePath);
@@ -69,11 +69,7 @@ public class CsMpAnyQUtil {
return baseMapper.selectPage(page, queryWrapper); return baseMapper.selectPage(page, queryWrapper);
} }
public static <T, M> Page<M> selectPage( public static <T, M> Page<M> selectPage(BaseMapper<T> baseMapper, Page<T> page, Object queryParams, Class<M> mapperClazz) {
BaseMapper<T> baseMapper,
Page<T> page,
Object queryParams,
Class<M> mapperClazz) {
QueryWrapper<T> queryWrapper = CsMpQUtil.build(queryParams); QueryWrapper<T> queryWrapper = CsMpQUtil.build(queryParams);
Page<T> tPage = baseMapper.selectPage(page, queryWrapper); Page<T> tPage = baseMapper.selectPage(page, queryWrapper);
Page<M> mapperTarget = new Page<>(); Page<M> mapperTarget = new Page<>();
@@ -64,6 +64,69 @@ public class CsMpCmdGenUtil {
private String parentPackageName = "cn.odboy"; private String parentPackageName = "cn.odboy";
private String parentModuleName; private String parentModuleName;
private static Consumer<StrategyConfig.Builder> getEntityConfigConsumer() {
return strategyConfigBuilder -> strategyConfigBuilder.entityBuilder().enableLombok()
// 如果不需要生成注解, 去掉.enableTableFieldAnnotation()
.enableTableFieldAnnotation().enableFileOverride().naming(NamingStrategy.underline_to_camel).columnNaming(NamingStrategy.underline_to_camel)
.idType(IdType.AUTO);
}
private static Consumer<StrategyConfig.Builder> getStrategyConfigConsumer(List<String> tableNames) {
return strategyConfigBuilder -> strategyConfigBuilder.enableCapitalMode().enableSkipView().disableSqlFilter().addInclude(tableNames)
// 实体类生成策略
.entityBuilder().superClass(CsBaseUserTimeTb.class).addIgnoreColumns("create_time", "update_time", "create_by", "update_by")
// 开启生成实体时生成字段注解。
// 会在实体类的属性前,添加[@TableField("nickname")]
.enableTableFieldAnnotation().disableSerialVersionUID()
// 阶段2:Mapper策略配置
.mapperBuilder()
// 开启 @Mapper 注解。
// 会在mapper接口上添加注解[@Mapper]
// .enableMapperAnnotation()
// 启用 BaseResultMap 生成。
// 会在mapper.xml文件生成[通用查询映射结果]配置。
// .enableBaseResultMap()
// 启用 BaseColumnList。
// 会在mapper.xml文件生成[通用查询结果列 ]配置
// .enableBaseColumnList()
// 阶段4:Controller策略配置
.controllerBuilder()
// 会在控制类中加[@RestController]注解。
.enableRestStyle()
// 开启驼峰转连字符
.enableHyphenStyle().build();
}
private static Consumer<GlobalConfig.Builder> getGlobalConfigConsumer() {
String outputDir = projectRootPath + "CodeGen";
return globalConfigBuilder -> globalConfigBuilder.enableSwagger().outputDir(outputDir).author("codegen").commentDate("yyyy-MM-dd")
.dateType(DateType.TIME_PACK);
}
private static Consumer<StrategyConfig.Builder> getStrategyConfigConsumer() {
return strategyConfigBuilder -> strategyConfigBuilder.mapperBuilder().mapperAnnotation(Mapper.class).formatMapperFileName("%sMapper")
.formatXmlFileName("%sMapper").entityBuilder().formatFileName("%sTb");
}
private static Consumer<DataSourceConfig.Builder> getDataSourceConfigConsumer() {
return builder -> builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {
int typeCode = metaInfo.getJdbcType().TYPE_CODE;
if (typeCode == Types.SMALLINT) {
return DbColumnType.INTEGER;
}
if (typeCode == Types.DATE) {
return DbColumnType.DATE;
}
if (typeCode == Types.TIME) {
return DbColumnType.DATE;
}
if (typeCode == Types.TIMESTAMP) {
return DbColumnType.DATE;
}
return typeRegistry.getColumnType(metaInfo);
});
}
/** /**
* 代码生成函数 * 代码生成函数
* *
@@ -75,8 +138,7 @@ public class CsMpCmdGenUtil {
this.parentModuleName = moduleName; this.parentModuleName = moduleName;
// 1.数据库配置 // 1.数据库配置
DataSourceConfig.Builder dataSourceConfigBuilder = DataSourceConfig.Builder dataSourceConfigBuilder =
new DataSourceConfig.Builder(this.databaseUrl, this.databaseUsername, this.databasePassword).driverClassName( new DataSourceConfig.Builder(this.databaseUrl, this.databaseUsername, this.databasePassword).driverClassName(this.driverClassName);
this.driverClassName);
dataSourceConfigBuilder.dbQuery(DB_QUERY); dataSourceConfigBuilder.dbQuery(DB_QUERY);
dataSourceConfigBuilder.keyWordsHandler(new MySqlKeyWordsHandler()); dataSourceConfigBuilder.keyWordsHandler(new MySqlKeyWordsHandler());
// 1.1.快速生成器 // 1.1.快速生成器
@@ -116,13 +178,10 @@ public class CsMpCmdGenUtil {
fastAutoGenerator.strategyConfig(getEntityConfigConsumer()); fastAutoGenerator.strategyConfig(getEntityConfigConsumer());
// 5.2.Controller策略配置 // 5.2.Controller策略配置
// 开启生成@RestController控制器 // 开启生成@RestController控制器
fastAutoGenerator.strategyConfig(strategyConfigBuilder -> strategyConfigBuilder.controllerBuilder() fastAutoGenerator.strategyConfig(strategyConfigBuilder -> strategyConfigBuilder.controllerBuilder().enableRestStyle());
.enableRestStyle());
// 如果不需要生成Controller, fastAutoGenerator.templateConfig(templateConfig -> templateConfig.controller(""))。5.3.Service策略配置:格式化service接口和实现类的文件名称, 去掉默认的ServiceName前面的I // 如果不需要生成Controller, fastAutoGenerator.templateConfig(templateConfig -> templateConfig.controller(""))。5.3.Service策略配置:格式化service接口和实现类的文件名称, 去掉默认的ServiceName前面的I
fastAutoGenerator.strategyConfig( fastAutoGenerator.strategyConfig(
strategyConfigBuilder -> strategyConfigBuilder.serviceBuilder() strategyConfigBuilder -> strategyConfigBuilder.serviceBuilder().formatServiceFileName("%sService").formatServiceImplFileName("%sServiceImpl"));
.formatServiceFileName("%sService")
.formatServiceImplFileName("%sServiceImpl"));
// 5.4.Mapper策略配置 // 5.4.Mapper策略配置
// 格式化 mapper文件名,格式化xml实现类文件名称 // 格式化 mapper文件名,格式化xml实现类文件名称
fastAutoGenerator.strategyConfig(getStrategyConfigConsumer()); fastAutoGenerator.strategyConfig(getStrategyConfigConsumer());
@@ -130,99 +189,13 @@ public class CsMpCmdGenUtil {
fastAutoGenerator.execute(); fastAutoGenerator.execute();
} }
private static Consumer<StrategyConfig.Builder> getEntityConfigConsumer() {
return strategyConfigBuilder -> strategyConfigBuilder.entityBuilder()
.enableLombok()
// 如果不需要生成注解, 去掉.enableTableFieldAnnotation()
.enableTableFieldAnnotation()
.enableFileOverride()
.naming(NamingStrategy.underline_to_camel)
.columnNaming(NamingStrategy.underline_to_camel)
.idType(IdType.AUTO);
}
private static Consumer<StrategyConfig.Builder> getStrategyConfigConsumer(List<String> tableNames) {
return strategyConfigBuilder -> strategyConfigBuilder.enableCapitalMode()
.enableSkipView()
.disableSqlFilter()
.addInclude(tableNames)
// 实体类生成策略
.entityBuilder()
.superClass(CsBaseUserTimeTb.class)
.addIgnoreColumns("create_time", "update_time", "create_by", "update_by")
// 开启生成实体时生成字段注解。
// 会在实体类的属性前,添加[@TableField("nickname")]
.enableTableFieldAnnotation()
.disableSerialVersionUID()
// 阶段2:Mapper策略配置
.mapperBuilder()
// 开启 @Mapper 注解。
// 会在mapper接口上添加注解[@Mapper]
// .enableMapperAnnotation()
// 启用 BaseResultMap 生成。
// 会在mapper.xml文件生成[通用查询映射结果]配置。
// .enableBaseResultMap()
// 启用 BaseColumnList。
// 会在mapper.xml文件生成[通用查询结果列 ]配置
// .enableBaseColumnList()
// 阶段4:Controller策略配置
.controllerBuilder()
// 会在控制类中加[@RestController]注解。
.enableRestStyle()
// 开启驼峰转连字符
.enableHyphenStyle()
.build();
}
private Consumer<PackageConfig.Builder> getPackageConfigConsumer() { private Consumer<PackageConfig.Builder> getPackageConfigConsumer() {
String mapperPath = projectRootPath + "CodeGen/resources/mapper"; String mapperPath = projectRootPath + "CodeGen/resources/mapper";
if (StrUtil.isBlank(this.parentModuleName)) { if (StrUtil.isBlank(this.parentModuleName)) {
throw new BadRequestException("模块名称必填"); throw new BadRequestException("模块名称必填");
} }
return packageConfigBuilder -> packageConfigBuilder.parent(this.parentPackageName) return packageConfigBuilder -> packageConfigBuilder.parent(this.parentPackageName).moduleName(this.parentModuleName).entity("dal.dataobject")
.moduleName(this.parentModuleName) .mapper("dal.mysql").service("service").serviceImpl("service.impl").controller("controller")
.entity("dal.dataobject") .pathInfo(Collections.singletonMap(OutputFile.xml, mapperPath));
.mapper("dal.mysql")
.service("service")
.serviceImpl("service.impl")
.controller("controller")
.pathInfo(Collections.singletonMap(OutputFile.xml, mapperPath));
}
private static Consumer<GlobalConfig.Builder> getGlobalConfigConsumer() {
String outputDir = projectRootPath + "CodeGen";
return globalConfigBuilder -> globalConfigBuilder.enableSwagger()
.outputDir(outputDir)
.author("codegen")
.commentDate("yyyy-MM-dd")
.dateType(DateType.TIME_PACK);
}
private static Consumer<StrategyConfig.Builder> getStrategyConfigConsumer() {
return strategyConfigBuilder -> strategyConfigBuilder.mapperBuilder()
.mapperAnnotation(Mapper.class)
.formatMapperFileName("%sMapper")
.formatXmlFileName("%sMapper")
.entityBuilder()
.formatFileName("%sTb");
}
private static Consumer<DataSourceConfig.Builder> getDataSourceConfigConsumer() {
return builder -> builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {
int typeCode = metaInfo.getJdbcType().TYPE_CODE;
if (typeCode == Types.SMALLINT) {
return DbColumnType.INTEGER;
}
if (typeCode == Types.DATE) {
return DbColumnType.DATE;
}
if (typeCode == Types.TIME) {
return DbColumnType.DATE;
}
if (typeCode == Types.TIMESTAMP) {
return DbColumnType.DATE;
}
return typeRegistry.getColumnType(metaInfo);
});
} }
} }
@@ -163,19 +163,6 @@ public class CsMpQUtil {
return fields; return fields;
} }
@TableName("test_domain")
private static class TestDomain {
@NotNull(groups = CsBaseUserTimeTb.Update.class)
@TableId(value = "user_id", type = IdType.AUTO)
private Long id;
@TableField(value = "dept_id")
private Long deptId;
@NotBlank
private String username;
@NotBlank
private String nickName;
}
public static void main(String[] args) { public static void main(String[] args) {
QueryWrapper<TestDomain> query = new QueryWrapper<>(); QueryWrapper<TestDomain> query = new QueryWrapper<>();
query.or(wrapper -> wrapper.eq("username", 1).or().eq("nickname", 2)); query.or(wrapper -> wrapper.eq("username", 1).or().eq("nickname", 2));
@@ -192,4 +179,17 @@ public class CsMpQUtil {
System.err.println("getTargetSql================================="); System.err.println("getTargetSql=================================");
System.err.println(query.getTargetSql()); System.err.println(query.getTargetSql());
} }
@TableName("test_domain")
private static class TestDomain {
@NotNull(groups = CsBaseUserTimeTb.Update.class)
@TableId(value = "user_id", type = IdType.AUTO)
private Long id;
@TableField(value = "dept_id")
private Long deptId;
@NotBlank
private String username;
@NotBlank
private String nickName;
}
} }
@@ -157,10 +157,7 @@ public interface CsMpMapper<E> extends BaseMapper<E> {
* @param clazz 期望的对象类型 * @param clazz 期望的对象类型
* @return IPage<T> * @return IPage<T>
*/ */
default <T> CsPageResult<T> queryFeatureClazzPage( default <T> CsPageResult<T> queryFeatureClazzPage(Pageable pageable, LambdaQueryChainWrapper<E> wrapper, Class<T> clazz) {
Pageable pageable,
LambdaQueryChainWrapper<E> wrapper,
Class<T> clazz) {
int pageNumber = pageable.getPageNumber(); int pageNumber = pageable.getPageNumber();
int pageSize = pageable.getPageSize(); int pageSize = pageable.getPageSize();
pageNumber = pageNumber <= 0 ? 1 : pageNumber; pageNumber = pageNumber <= 0 ? 1 : pageNumber;
@@ -59,10 +59,7 @@ public interface CsMpService<T> extends IService<T> {
CsPageResult<T> queryClazzPageByArgs(LambdaQueryWrapper<T> wrapper, IPage<T> pageable); CsPageResult<T> queryClazzPageByArgs(LambdaQueryWrapper<T> wrapper, IPage<T> pageable);
<G> CsPageResult<G> queryFeatureClazzPageByArgs( <G> CsPageResult<G> queryFeatureClazzPageByArgs(LambdaQueryWrapper<T> wrapper, IPage<T> pageable, Class<G> targetClazz);
LambdaQueryWrapper<T> wrapper,
IPage<T> pageable,
Class<G> targetClazz);
<G, Q> CsPageResult<G> queryFeatureClazzPageByArgs(Q criteria, IPage<T> pageable, Class<G> targetClazz); <G, Q> CsPageResult<G> queryFeatureClazzPageByArgs(Q criteria, IPage<T> pageable, Class<G> targetClazz);
@@ -209,10 +209,7 @@ public class CsMpServiceImpl<M extends CsMpMapper<T>, T> extends ServiceImpl<M,
* @param pageable 分页参数 * @param pageable 分页参数
* @param targetClazz 目标类型 * @param targetClazz 目标类型
*/ */
public <G> CsPageResult<G> queryFeatureClazzPageByArgs( public <G> CsPageResult<G> queryFeatureClazzPageByArgs(LambdaQueryWrapper<T> wrapper, IPage<T> pageable, Class<G> targetClazz) {
LambdaQueryWrapper<T> wrapper,
IPage<T> pageable,
Class<G> targetClazz) {
if (wrapper == null) { if (wrapper == null) {
wrapper = new LambdaQueryWrapper<>(); wrapper = new LambdaQueryWrapper<>();
} }
@@ -33,8 +33,7 @@ public class QuartzRunnable implements Callable<Object> {
private final Method method; private final Method method;
private final String params; private final String params;
public QuartzRunnable(String beanName, String methodName, String params) public QuartzRunnable(String beanName, String methodName, String params) throws NoSuchMethodException, SecurityException {
throws NoSuchMethodException, SecurityException {
this.target = CsSpringBeanHolder.getBean(beanName); this.target = CsSpringBeanHolder.getBean(beanName);
this.params = params; this.params = params;
if (StringUtils.isNotBlank(params)) { if (StringUtils.isNotBlank(params)) {
@@ -31,7 +31,6 @@ import org.springframework.stereotype.Component;
import java.util.*; import java.util.*;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@Component @Component
@SuppressWarnings({"unchecked", "all"}) @SuppressWarnings({"unchecked", "all"})
@@ -205,9 +204,8 @@ public class CsRedisHelper {
public void scanDel(String pattern) { public void scanDel(String pattern) {
ScanOptions options = ScanOptions.scanOptions().match(pattern).build(); ScanOptions options = ScanOptions.scanOptions().match(pattern).build();
try (Cursor<byte[]> cursor = redisTemplate.executeWithStickyConnection( try (Cursor<byte[]> cursor = redisTemplate.executeWithStickyConnection(
(RedisCallback<Cursor<byte[]>>) connection -> (Cursor<byte[]>) new ConvertingCursor<>( (RedisCallback<Cursor<byte[]>>)connection -> (Cursor<byte[]>)new ConvertingCursor<>(connection.scan(options),
connection.scan(options), redisTemplate.getKeySerializer()::deserialize))) {
redisTemplate.getKeySerializer()::deserialize))) {
while (cursor.hasNext()) { while (cursor.hasNext()) {
redisTemplate.delete(cursor.next()); redisTemplate.delete(cursor.next());
} }
@@ -53,13 +53,7 @@ public class RedisConfiguration {
* 自动识别json对象白名单配置(仅允许解析的包名, 范围越小越安全)<br/> 未配置可能导致, 登录失败, 反复登录等问题 * 自动识别json对象白名单配置(仅允许解析的包名, 范围越小越安全)<br/> 未配置可能导致, 登录失败, 反复登录等问题
*/ */
private static final String[] WHITELIST_STR = private static final String[] WHITELIST_STR =
{ {"org.springframework", "cn.odboy.system.dal.dataobject", "cn.odboy.system.dal.model", "cn.odboy.task.dal.dataobject", "cn.odboy.task.dal.model",};
"org.springframework",
"cn.odboy.system.dal.dataobject",
"cn.odboy.system.dal.model",
"cn.odboy.task.dal.dataobject",
"cn.odboy.task.dal.model",
};
/** /**
* 设置 redis 数据默认过期时间,默认2小时 设置@cacheable 序列化方式 * 设置 redis 数据默认过期时间,默认2小时 设置@cacheable 序列化方式
@@ -49,14 +49,8 @@ public class AsyncTheadPoolConfig implements AsyncConfigurer {
// 自定义工厂 // 自定义工厂
ThreadFactory factory = r -> new Thread(r, "DefaultAsync-" + new AtomicInteger(1).getAndIncrement()); ThreadFactory factory = r -> new Thread(r, "DefaultAsync-" + new AtomicInteger(1).getAndIncrement());
// 自定义线程池 // 自定义线程池
return new ThreadPoolExecutor( return new ThreadPoolExecutor(asyncTaskPool.getCorePoolSize(), asyncTaskPool.getMaxPoolSize(), asyncTaskPool.getKeepAliveSeconds(), TimeUnit.SECONDS,
asyncTaskPool.getCorePoolSize(), new ArrayBlockingQueue<>(asyncTaskPool.getQueueCapacity()), factory, new ThreadPoolExecutor.CallerRunsPolicy());
asyncTaskPool.getMaxPoolSize(),
asyncTaskPool.getKeepAliveSeconds(),
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(asyncTaskPool.getQueueCapacity()),
factory,
new ThreadPoolExecutor.CallerRunsPolicy());
} }
/** /**
@@ -25,7 +25,6 @@ import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
@Component @Component
public class DateStringArraysToListDateConverter implements Converter<String[], List<Date>> { public class DateStringArraysToListDateConverter implements Converter<String[], List<Date>> {
@@ -91,17 +91,17 @@ public class ConfigurerAdapter implements WebMvcConfigurer {
config.setDateFormat("yyyy-MM-dd HH:mm:ss"); config.setDateFormat("yyyy-MM-dd HH:mm:ss");
// 开启引用检测, 枚举支持 // 开启引用检测, 枚举支持
/// 是否输出值为null的字段 /// 是否输出值为null的字段
// config.setWriterFeatures(JSONWriter.Feature.WriteMapNullValue); // config.setWriterFeatures(JSONWriter.Feature.WriteMapNullValue);
/// 字段如果为null,输出为false,而非null /// 字段如果为null,输出为false,而非null
// config.setWriterFeatures(JSONWriter.Feature.WriteNullBooleanAsFalse); // config.setWriterFeatures(JSONWriter.Feature.WriteNullBooleanAsFalse);
/// 字段如果为null,输出为[],而非null /// 字段如果为null,输出为[],而非null
// config.setWriterFeatures(JSONWriter.Feature.WriteNullListAsEmpty); // config.setWriterFeatures(JSONWriter.Feature.WriteNullListAsEmpty);
/// 字符类型字段如果为null,输出为"",而非null /// 字符类型字段如果为null,输出为"",而非null
// config.setWriterFeatures(JSONWriter.Feature.WriteNullStringAsEmpty); // config.setWriterFeatures(JSONWriter.Feature.WriteNullStringAsEmpty);
/// 太具体的数值会直接影响逻辑本身, 所以不要这个 /// 太具体的数值会直接影响逻辑本身, 所以不要这个
// config.setWriterFeatures(JSONWriter.Feature.WriteNullNumberAsZero); // config.setWriterFeatures(JSONWriter.Feature.WriteNullNumberAsZero);
/// 全局Long转字符串,会导致基础框架本身异常, 所以不要这个 /// 全局Long转字符串,会导致基础框架本身异常, 所以不要这个
// config.setWriterFeatures(JSONWriter.Feature.WriteLongAsString); // config.setWriterFeatures(JSONWriter.Feature.WriteLongAsString);
config.setWriterFeatures(JSONWriter.Feature.WriteEnumUsingToString); config.setWriterFeatures(JSONWriter.Feature.WriteEnumUsingToString);
config.setWriterFeatures(JSONWriter.Feature.ReferenceDetection); config.setWriterFeatures(JSONWriter.Feature.ReferenceDetection);
fastJsonConverter.setFastJsonConfig(config); fastJsonConverter.setFastJsonConfig(config);
@@ -19,6 +19,7 @@ package cn.odboy.framework.websocket.config;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter; import org.springframework.web.socket.server.standard.ServerEndpointExporter;
/** /**
* 自动注册使用了 @ServerEndpoint 注解声明的 WebSocket 端点对象 * 自动注册使用了 @ServerEndpoint 注解声明的 WebSocket 端点对象
* *
@@ -61,9 +61,7 @@ public final class CsCollUtil extends cn.hutool.core.collection.CollUtil {
* @param <U> / * @param <U> /
* @return / * @return /
*/ */
public static <T, U extends Comparable<? super U>> List<T> streamAscSort( public static <T, U extends Comparable<? super U>> List<T> streamAscSort(List<T> data, Function<? super T, ? extends U> keyExtractor) {
List<T> data,
Function<? super T, ? extends U> keyExtractor) {
return data.stream().sorted(Comparator.comparing(keyExtractor)).toList(); return data.stream().sorted(Comparator.comparing(keyExtractor)).toList();
} }
@@ -78,9 +76,7 @@ public final class CsCollUtil extends cn.hutool.core.collection.CollUtil {
* @param <U> / * @param <U> /
* @return / * @return /
*/ */
public static <T, U extends Comparable<? super U>> List<T> streamDescSort( public static <T, U extends Comparable<? super U>> List<T> streamDescSort(List<T> data, Function<? super T, ? extends U> keyExtractor) {
List<T> data,
Function<? super T, ? extends U> keyExtractor) {
return data.stream().sorted(Comparator.comparing(keyExtractor).reversed()).toList(); return data.stream().sorted(Comparator.comparing(keyExtractor).reversed()).toList();
} }
@@ -97,10 +93,7 @@ public final class CsCollUtil extends cn.hutool.core.collection.CollUtil {
* @param <U> / * @param <U> /
* @return / * @return /
*/ */
public static <T, K, U> Map<K, U> streamToMap( public static <T, K, U> Map<K, U> streamToMap(List<T> data, Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper) {
List<T> data,
Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends U> valueMapper) {
// 根据key去重再并流 // 根据key去重再并流
return streamDistinct(data, keyMapper).stream().collect(Collectors.toMap(keyMapper, valueMapper)); return streamDistinct(data, keyMapper).stream().collect(Collectors.toMap(keyMapper, valueMapper));
} }
@@ -150,7 +143,7 @@ public final class CsCollUtil extends cn.hutool.core.collection.CollUtil {
try { try {
Field field = m.getClass().getDeclaredField(elementName); Field field = m.getClass().getDeclaredField(elementName);
field.setAccessible(true); field.setAccessible(true);
that = (BigDecimal) field.get(m); that = (BigDecimal)field.get(m);
} catch (Exception e) { } catch (Exception e) {
// 忽略异常 // 忽略异常
that = BigDecimal.ZERO; that = BigDecimal.ZERO;
@@ -192,10 +185,7 @@ public final class CsCollUtil extends cn.hutool.core.collection.CollUtil {
* @return / * @return /
*/ */
public static BigDecimal streamBigDecimalAvg(List<BigDecimal> data) { public static BigDecimal streamBigDecimalAvg(List<BigDecimal> data) {
return data.stream() return data.stream().filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(data.size()), 6, RoundingMode.FLOOR);
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add)
.divide(BigDecimal.valueOf(data.size()), 6, RoundingMode.FLOOR);
} }
public static void main(String[] args) { public static void main(String[] args) {
@@ -214,8 +204,7 @@ public final class CsCollUtil extends cn.hutool.core.collection.CollUtil {
System.out.println(JSON.toJSONString(selectOptions2)); System.out.println(JSON.toJSONString(selectOptions2));
List<CsSelectOptionVo> selectOptions3 = CsCollUtil.streamDistinct(testData, CsSelectOptionVo::getValue); List<CsSelectOptionVo> selectOptions3 = CsCollUtil.streamDistinct(testData, CsSelectOptionVo::getValue);
System.out.println(JSON.toJSONString(selectOptions3)); System.out.println(JSON.toJSONString(selectOptions3));
Map<String, String> selectMap1 = Map<String, String> selectMap1 = CsCollUtil.streamToMap(testData, CsSelectOptionVo::getValue, CsSelectOptionVo::getLabel);
CsCollUtil.streamToMap(testData, CsSelectOptionVo::getValue, CsSelectOptionVo::getLabel);
System.out.println(JSON.toJSONString(selectMap1)); System.out.println(JSON.toJSONString(selectMap1));
// 这只是一个示范 // 这只是一个示范
BigDecimal total1 = CsCollUtil.streamBigDecimalAdd(testData, "value"); BigDecimal total1 = CsCollUtil.streamBigDecimalAdd(testData, "value");
@@ -89,7 +89,7 @@ public final class CsDesEncryptUtil {
byte[] b2 = new byte[b.length / 2]; byte[] b2 = new byte[b.length / 2];
for (int n = 0; n < b.length; n += size) { for (int n = 0; n < b.length; n += size) {
String item = new String(b, n, 2); String item = new String(b, n, 2);
b2[n / 2] = (byte) Integer.parseInt(item, 16); b2[n / 2] = (byte)Integer.parseInt(item, 16);
} }
return b2; return b2;
} }
@@ -87,13 +87,6 @@ public final class CsDistributedIdUtil {
*/ */
private final AtomicLong lastTimestamp = new AtomicLong(-1L); private final AtomicLong lastTimestamp = new AtomicLong(-1L);
/**
* 单例实例持有者类
*/
private static class InstanceHolder {
private static final CsDistributedIdUtil INSTANCE = new CsDistributedIdUtil(20, 12, 5, 5, 12);
}
/** /**
* 构造函数, 初始化数据中心 ID 和机器 ID * 构造函数, 初始化数据中心 ID 和机器 ID
* *
@@ -103,12 +96,7 @@ public final class CsDistributedIdUtil {
* @param workerIdBits 机器 ID 所占位数 * @param workerIdBits 机器 ID 所占位数
* @param sequenceBits 序列号所占位数 * @param sequenceBits 序列号所占位数
*/ */
public CsDistributedIdUtil( public CsDistributedIdUtil(long dataCenterId, long workerId, long dataCenterIdBits, long workerIdBits, long sequenceBits) {
long dataCenterId,
long workerId,
long dataCenterIdBits,
long workerIdBits,
long sequenceBits) {
this.dataCenterIdBits = dataCenterIdBits; this.dataCenterIdBits = dataCenterIdBits;
this.workerIdBits = workerIdBits; this.workerIdBits = workerIdBits;
this.sequenceBits = sequenceBits; this.sequenceBits = sequenceBits;
@@ -131,54 +119,6 @@ public final class CsDistributedIdUtil {
this.workerId = workerId; this.workerId = workerId;
} }
/**
* 生成下一个分布式 ID
*
* @return 生成的分布式 ID
*/
public long nextId() {
long currentTimestamp = System.currentTimeMillis();
// 如果当前时间戳小于上一次生成 ID 的时间戳, 说明时钟回拨,抛出异常
if (currentTimestamp < lastTimestamp.get()) {
throw new BadRequestException(
"Clock moved backwards. Refusing to generate id for " + (lastTimestamp.get() - currentTimestamp) +
" milliseconds");
}
long lastTimestampValue = lastTimestamp.get();
if (currentTimestamp == lastTimestampValue) {
// 同一毫秒内,序列号自增
long seq = sequence.incrementAndGet() & sequenceMask;
if (seq == 0) {
// 序列号溢出,等待下一毫秒
currentTimestamp = waitNextMillis(lastTimestampValue);
}
return ((currentTimestamp - START_TIMESTAMP) << timestampLeftShift) | (dataCenterId << dataCenterIdShift) |
(workerId << workerIdShift) | seq;
} else {
// 时间戳改变,重置序列号
sequence.set(0L);
lastTimestamp.set(currentTimestamp);
return ((currentTimestamp - START_TIMESTAMP) << timestampLeftShift) | (dataCenterId << dataCenterIdShift) |
(workerId << workerIdShift);
}
}
/**
* 等待下一毫秒
*
* @param lastTimestamp 上一次生成 ID 的时间戳
* @return 当前时间戳
*/
private long waitNextMillis(long lastTimestamp) {
long timestamp = System.currentTimeMillis();
while (timestamp <= lastTimestamp) {
timestamp = System.currentTimeMillis();
}
return timestamp;
}
/** /**
* 获取单例实例的下一个分布式 ID * 获取单例实例的下一个分布式 ID
* *
@@ -203,4 +143,55 @@ public final class CsDistributedIdUtil {
}).start(); }).start();
} }
} }
/**
* 生成下一个分布式 ID
*
* @return 生成的分布式 ID
*/
public long nextId() {
long currentTimestamp = System.currentTimeMillis();
// 如果当前时间戳小于上一次生成 ID 的时间戳, 说明时钟回拨,抛出异常
if (currentTimestamp < lastTimestamp.get()) {
throw new BadRequestException("Clock moved backwards. Refusing to generate id for " + (lastTimestamp.get() - currentTimestamp) + " milliseconds");
}
long lastTimestampValue = lastTimestamp.get();
if (currentTimestamp == lastTimestampValue) {
// 同一毫秒内,序列号自增
long seq = sequence.incrementAndGet() & sequenceMask;
if (seq == 0) {
// 序列号溢出,等待下一毫秒
currentTimestamp = waitNextMillis(lastTimestampValue);
}
return ((currentTimestamp - START_TIMESTAMP) << timestampLeftShift) | (dataCenterId << dataCenterIdShift) | (workerId << workerIdShift) | seq;
} else {
// 时间戳改变,重置序列号
sequence.set(0L);
lastTimestamp.set(currentTimestamp);
return ((currentTimestamp - START_TIMESTAMP) << timestampLeftShift) | (dataCenterId << dataCenterIdShift) | (workerId << workerIdShift);
}
}
/**
* 等待下一毫秒
*
* @param lastTimestamp 上一次生成 ID 的时间戳
* @return 当前时间戳
*/
private long waitNextMillis(long lastTimestamp) {
long timestamp = System.currentTimeMillis();
while (timestamp <= lastTimestamp) {
timestamp = System.currentTimeMillis();
}
return timestamp;
}
/**
* 单例实例持有者类
*/
private static class InstanceHolder {
private static final CsDistributedIdUtil INSTANCE = new CsDistributedIdUtil(20, 12, 5, 5, 12);
}
} }
@@ -41,7 +41,6 @@ import java.util.Date;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors;
import static cn.odboy.constant.SystemConst.*; import static cn.odboy.constant.SystemConst.*;
@@ -108,13 +107,13 @@ public final class CsFileUtil extends cn.hutool.core.io.FileUtil {
String resultSize; String resultSize;
if (size / GB >= 1) { if (size / GB >= 1) {
//如果当前Byte的值大于等于1GB //如果当前Byte的值大于等于1GB
resultSize = DF.format(size / (float) GB) + " GB"; resultSize = DF.format(size / (float)GB) + " GB";
} else if (size / MB >= 1) { } else if (size / MB >= 1) {
//如果当前Byte的值大于等于1MB //如果当前Byte的值大于等于1MB
resultSize = DF.format(size / (float) MB) + " MB"; resultSize = DF.format(size / (float)MB) + " MB";
} else if (size / KB >= 1) { } else if (size / KB >= 1) {
//如果当前Byte的值大于等于1KB //如果当前Byte的值大于等于1KB
resultSize = DF.format(size / (float) KB) + " KB"; resultSize = DF.format(size / (float)KB) + " KB";
} else { } else {
resultSize = size + " B"; resultSize = size + " B";
} }
@@ -190,9 +189,8 @@ public final class CsFileUtil extends cn.hutool.core.io.FileUtil {
map.forEach((key, value) -> { map.forEach((key, value) -> {
if (value instanceof String strValue) { if (value instanceof String strValue) {
// 检查并处理以特殊字符开头的值 // 检查并处理以特殊字符开头的值
if (strValue.startsWith(SYMBOL_EQUAL) || strValue.startsWith(SYMBOL_ADD) || if (strValue.startsWith(SYMBOL_EQUAL) || strValue.startsWith(SYMBOL_ADD) || strValue.startsWith(SYMBOL_SUBTRACT) || strValue.startsWith(
strValue.startsWith(SYMBOL_SUBTRACT) || strValue.startsWith( SYMBOL_AT)) {
SYMBOL_AT)) {
// 添加单引号前缀 // 添加单引号前缀
strValue = "'" + strValue; strValue = "'" + strValue;
} }
@@ -205,7 +203,7 @@ public final class CsFileUtil extends cn.hutool.core.io.FileUtil {
}).toList(); }).toList();
// 一次性写出内容, 使用默认样式,强制输出标题 // 一次性写出内容, 使用默认样式,强制输出标题
writer.write(sanitizedList, true); writer.write(sanitizedList, true);
SXSSFSheet sheet = (SXSSFSheet) writer.getSheet(); SXSSFSheet sheet = (SXSSFSheet)writer.getSheet();
//上面需要强转SXSSFSheet 不然没有trackAllColumnsForAutoSizing方法 //上面需要强转SXSSFSheet 不然没有trackAllColumnsForAutoSizing方法
sheet.trackAllColumnsForAutoSizing(); sheet.trackAllColumnsForAutoSizing();
//列宽自适应 //列宽自适应
@@ -277,7 +275,7 @@ public final class CsFileUtil extends cn.hutool.core.io.FileUtil {
* 获取文件字节数组 * 获取文件字节数组
*/ */
private static byte[] getByte(File file) { private static byte[] getByte(File file) {
byte[] b = new byte[(int) file.length()]; byte[] b = new byte[(int)file.length()];
InputStream in = null; InputStream in = null;
try { try {
in = Files.newInputStream(file.toPath()); in = Files.newInputStream(file.toPath());
@@ -324,11 +322,7 @@ public final class CsFileUtil extends cn.hutool.core.io.FileUtil {
* @param response / * @param response /
* @param file / * @param file /
*/ */
public static void downloadFile( public static void downloadFile(HttpServletRequest request, HttpServletResponse response, File file, boolean deleteOnExit) {
HttpServletRequest request,
HttpServletResponse response,
File file,
boolean deleteOnExit) {
response.setCharacterEncoding(request.getCharacterEncoding()); response.setCharacterEncoding(request.getCharacterEncoding());
response.setContentType("application/octet-stream"); response.setContentType("application/octet-stream");
FileInputStream fis = null; FileInputStream fis = null;
@@ -385,8 +379,7 @@ public final class CsFileUtil extends cn.hutool.core.io.FileUtil {
fileName = fileName.replaceAll("^\\.+/", ""); fileName = fileName.replaceAll("^\\.+/", "");
// 保留文件名中最后一个 "." 字符,过滤掉其他 "." // 保留文件名中最后一个 "." 字符,过滤掉其他 "."
fileName = fileName.replaceAll("^(.*)(\\.[^.]*)$", "$1").replaceAll("\\.", "") + fileName = fileName.replaceAll("^(.*)(\\.[^.]*)$", "$1").replaceAll("\\.", "") + fileName.replaceAll("^(.*)(\\.[^.]*)$", "$2");
fileName.replaceAll("^(.*)(\\.[^.]*)$", "$2");
return fileName; return fileName;
} }
@@ -55,12 +55,10 @@ public final class CsIPUtil {
try { try {
InetAddress candidateAddress = null; InetAddress candidateAddress = null;
// 遍历所有的网络接口 // 遍历所有的网络接口
for (Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces(); for (Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces(); interfaces.hasMoreElements(); ) {
interfaces.hasMoreElements(); ) {
NetworkInterface anInterface = interfaces.nextElement(); NetworkInterface anInterface = interfaces.nextElement();
// 在所有的接口下再遍历IP // 在所有的接口下再遍历IP
for (Enumeration<InetAddress> inetAddresses = anInterface.getInetAddresses(); for (Enumeration<InetAddress> inetAddresses = anInterface.getInetAddresses(); inetAddresses.hasMoreElements(); ) {
inetAddresses.hasMoreElements(); ) {
InetAddress inetAddr = inetAddresses.nextElement(); InetAddress inetAddr = inetAddresses.nextElement();
// 排除loopback类型地址 // 排除loopback类型地址
if (!inetAddr.isLoopbackAddress()) { if (!inetAddr.isLoopbackAddress()) {
@@ -34,7 +34,7 @@ import java.util.Set;
*/ */
public class CsReturnValueHandleUtil { public class CsReturnValueHandleUtil {
public static Object getDefaultValue(ProceedingJoinPoint joinPoint) { public static Object getDefaultValue(ProceedingJoinPoint joinPoint) {
MethodSignature signature = (MethodSignature) joinPoint.getSignature(); MethodSignature signature = (MethodSignature)joinPoint.getSignature();
Method method = signature.getMethod(); Method method = signature.getMethod();
// 获取目标方法的返回值类型 // 获取目标方法的返回值类型
Class<?> returnType = method.getReturnType(); Class<?> returnType = method.getReturnType();
@@ -183,8 +183,8 @@ public final class CsRsaEncryptUtil {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(1024); keyPairGenerator.initialize(1024);
KeyPair keyPair = keyPairGenerator.generateKeyPair(); KeyPair keyPair = keyPairGenerator.generateKeyPair();
RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic(); RSAPublicKey rsaPublicKey = (RSAPublicKey)keyPair.getPublic();
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate(); RSAPrivateKey rsaPrivateKey = (RSAPrivateKey)keyPair.getPrivate();
String publicKeyString = Base64.encodeBase64String(rsaPublicKey.getEncoded()); String publicKeyString = Base64.encodeBase64String(rsaPublicKey.getEncoded());
String privateKeyString = Base64.encodeBase64String(rsaPrivateKey.getEncoded()); String privateKeyString = Base64.encodeBase64String(rsaPrivateKey.getEncoded());
return new RsaKeyPair(publicKeyString, privateKeyString); return new RsaKeyPair(publicKeyString, privateKeyString);
@@ -46,9 +46,7 @@ public final class CsValidUtil {
public static <T> void validate(T object) { public static <T> void validate(T object) {
Set<ConstraintViolation<T>> violations = VALIDATOR.validate(object, Default.class); Set<ConstraintViolation<T>> violations = VALIDATOR.validate(object, Default.class);
if (!violations.isEmpty()) { if (!violations.isEmpty()) {
throw new BadRequestException(violations.stream() throw new BadRequestException(violations.stream().map(ConstraintViolation::getMessage).collect(Collectors.joining(",")));
.map(ConstraintViolation::getMessage)
.collect(Collectors.joining(",")));
} }
} }
} }
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent> <parent>
<artifactId>cutejava</artifactId> <artifactId>cutejava</artifactId>
@@ -36,7 +36,6 @@ import java.util.ArrayList;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors;
@RestController @RestController
@Tag(name = "系统:部门管理") @Tag(name = "系统:部门管理")
@@ -39,7 +39,6 @@ import java.io.IOException;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors;
@RestController @RestController
@Tag(name = "系统:角色管理") @Tag(name = "系统:角色管理")
@@ -132,8 +131,7 @@ public class SystemRoleController {
* @return / * @return /
*/ */
private int checkRoleLevels(Integer level) { private int checkRoleLevels(Integer level) {
List<Integer> levels = List<Integer> levels = systemRoleService.queryRoleByUsersId(CsSecurityHelper.getCurrentUserId()).stream().map(SystemRoleTb::getLevel).toList();
systemRoleService.queryRoleByUsersId(CsSecurityHelper.getCurrentUserId()).stream().map(SystemRoleTb::getLevel).toList();
int min = Collections.min(levels); int min = Collections.min(levels);
if (level != null) { if (level != null) {
if (level < min) { if (level < min) {
@@ -49,7 +49,6 @@ import org.springframework.web.multipart.MultipartFile;
import java.io.IOException; import java.io.IOException;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
@Tag(name = "系统:用户管理") @Tag(name = "系统:用户管理")
@RestController @RestController
@@ -142,8 +141,8 @@ public class SystemUserController {
@PreAuthorize("@el.check('user:del')") @PreAuthorize("@el.check('user:del')")
public ResponseEntity<Object> removeUserByIds(@RequestBody Set<Long> ids) { public ResponseEntity<Object> removeUserByIds(@RequestBody Set<Long> ids) {
for (Long id : ids) { for (Long id : ids) {
Integer currentLevel = Collections.min( Integer currentLevel =
systemRoleService.queryRoleByUsersId(CsSecurityHelper.getCurrentUserId()).stream().map(SystemRoleTb::getLevel).toList()); Collections.min(systemRoleService.queryRoleByUsersId(CsSecurityHelper.getCurrentUserId()).stream().map(SystemRoleTb::getLevel).toList());
Integer optLevel = Collections.min(systemRoleService.queryRoleByUsersId(id).stream().map(SystemRoleTb::getLevel).toList()); Integer optLevel = Collections.min(systemRoleService.queryRoleByUsersId(id).stream().map(SystemRoleTb::getLevel).toList());
if (currentLevel > optLevel) { if (currentLevel > optLevel) {
throw new BadRequestException("角色权限不足, 不能删除:" + systemUserService.getUserById(id).getUsername()); throw new BadRequestException("角色权限不足, 不能删除:" + systemUserService.getUserById(id).getUsername());
@@ -202,8 +201,8 @@ public class SystemUserController {
* @param args / * @param args /
*/ */
private void checkLevel(SystemUserTb args) { private void checkLevel(SystemUserTb args) {
Integer currentLevel = Collections.min( Integer currentLevel =
systemRoleService.queryRoleByUsersId(CsSecurityHelper.getCurrentUserId()).stream().map(SystemRoleTb::getLevel).toList()); Collections.min(systemRoleService.queryRoleByUsersId(CsSecurityHelper.getCurrentUserId()).stream().map(SystemRoleTb::getLevel).toList());
Integer optLevel = systemRoleService.getDeptLevelByRoles(args.getRoles()); Integer optLevel = systemRoleService.getDeptLevelByRoles(args.getRoles());
if (currentLevel > optLevel) { if (currentLevel > optLevel) {
throw new BadRequestException("角色权限不足"); throw new BadRequestException("角色权限不足");
@@ -39,33 +39,33 @@ public class SystemDeptTb extends CsBaseUserTimeTb {
@NotNull(groups = Update.class) @NotNull(groups = Update.class)
@TableId(value = "dept_id", type = IdType.AUTO) @TableId(value = "dept_id", type = IdType.AUTO)
@Schema(name ="ID", hidden = true) @Schema(name = "ID", hidden = true)
private Long id; private Long id;
@TableField(exist = false) @TableField(exist = false)
@JSONField(serialize = false) @JSONField(serialize = false)
@Schema(name ="角色") @Schema(name = "角色")
private Set<SystemRoleTb> roles; private Set<SystemRoleTb> roles;
@TableField(exist = false) @TableField(exist = false)
@Schema(name ="子部门") @Schema(name = "子部门")
private List<SystemDeptTb> children; private List<SystemDeptTb> children;
@Schema(name ="排序") @Schema(name = "排序")
private Integer deptSort; private Integer deptSort;
@NotBlank @NotBlank
@Schema(name ="部门名称") @Schema(name = "部门名称")
private String name; private String name;
@NotNull @NotNull
@Schema(name ="是否启用") @Schema(name = "是否启用")
private Boolean enabled; private Boolean enabled;
@Schema(name ="上级部门") @Schema(name = "上级部门")
private Long pid; private Long pid;
@Schema(name ="子节点数目", hidden = true) @Schema(name = "子节点数目", hidden = true)
private Integer subCount = 0; private Integer subCount = 0;
@Override @Override
@@ -85,17 +85,17 @@ public class SystemDeptTb extends CsBaseUserTimeTb {
return Objects.hash(id, name); return Objects.hash(id, name);
} }
@Schema(name ="是否有子节点") @Schema(name = "是否有子节点")
public Boolean getHasChildren() { public Boolean getHasChildren() {
return subCount > 0; return subCount > 0;
} }
@Schema(name ="是否为叶子") @Schema(name = "是否为叶子")
public Boolean getLeaf() { public Boolean getLeaf() {
return subCount <= 0; return subCount <= 0;
} }
@Schema(name ="标签名称") @Schema(name = "标签名称")
public String getLabel() { public String getLabel() {
return name; return name;
} }
@@ -30,15 +30,15 @@ import lombok.Setter;
public class SystemDictTb extends CsBaseUserTimeTb { public class SystemDictTb extends CsBaseUserTimeTb {
@NotNull(groups = Update.class) @NotNull(groups = Update.class)
@Schema(name ="ID", hidden = true) @Schema(name = "ID", hidden = true)
@TableId(value = "id", type = IdType.AUTO) @TableId(value = "id", type = IdType.AUTO)
private Long id; private Long id;
@NotBlank @NotBlank
@Schema(name ="名称") @Schema(name = "名称")
private String name; private String name;
@Schema(name ="描述") @Schema(name = "描述")
@TableField(updateStrategy = FieldStrategy.ALWAYS) @TableField(updateStrategy = FieldStrategy.ALWAYS)
private String description; private String description;
} }
@@ -36,22 +36,22 @@ public class SystemEmailConfigTb extends CsObject {
private Long id; private Long id;
@NotBlank @NotBlank
@Schema(name ="邮件服务器SMTP地址") @Schema(name = "邮件服务器SMTP地址")
private String host; private String host;
@NotBlank @NotBlank
@Schema(name ="邮件服务器 SMTP 端口") @Schema(name = "邮件服务器 SMTP 端口")
private String port; private String port;
@NotBlank @NotBlank
@Schema(name ="发件者用户名") @Schema(name = "发件者用户名")
private String user; private String user;
@NotBlank @NotBlank
@Schema(name ="密码") @Schema(name = "密码")
private String password; private String password;
@NotBlank @NotBlank
@Schema(name ="收件人") @Schema(name = "收件人")
private String fromUser; private String fromUser;
} }
@@ -35,19 +35,19 @@ public class SystemJobTb extends CsBaseUserTimeTb {
@NotNull(groups = Update.class) @NotNull(groups = Update.class)
@TableId(value = "id", type = IdType.AUTO) @TableId(value = "id", type = IdType.AUTO)
@Schema(name ="ID", hidden = true) @Schema(name = "ID", hidden = true)
private Long id; private Long id;
@NotBlank @NotBlank
@Schema(name ="岗位名称") @Schema(name = "岗位名称")
private String name; private String name;
@NotNull @NotNull
@Schema(name ="岗位排序") @Schema(name = "岗位排序")
private Long jobSort; private Long jobSort;
@NotNull @NotNull
@Schema(name ="是否启用") @Schema(name = "是否启用")
private Boolean enabled; private Boolean enabled;
@Override @Override
@@ -32,28 +32,28 @@ import lombok.Setter;
public class SystemLocalStorageTb extends CsBaseUserTimeTb { public class SystemLocalStorageTb extends CsBaseUserTimeTb {
@TableId(value = "id", type = IdType.AUTO) @TableId(value = "id", type = IdType.AUTO)
@Schema(name ="ID", hidden = true) @Schema(name = "ID", hidden = true)
private Long id; private Long id;
@Schema(name ="真实文件名") @Schema(name = "真实文件名")
private String realName; private String realName;
@Schema(name ="文件名") @Schema(name = "文件名")
private String name; private String name;
@Schema(name ="后缀") @Schema(name = "后缀")
private String suffix; private String suffix;
@Schema(name ="路径") @Schema(name = "路径")
private String path; private String path;
@Schema(name ="类型") @Schema(name = "类型")
private String type; private String type;
@Schema(name ="大小") @Schema(name = "大小")
private String size; private String size;
@Schema(name ="日期分组") @Schema(name = "日期分组")
private String dateGroup; private String dateGroup;
public void copy(SystemLocalStorageTb source) { public void copy(SystemLocalStorageTb source) {
@@ -38,55 +38,55 @@ public class SystemMenuTb extends CsBaseUserTimeTb {
@NotNull(groups = {Update.class}) @NotNull(groups = {Update.class})
@TableId(value = "menu_id", type = IdType.AUTO) @TableId(value = "menu_id", type = IdType.AUTO)
@Schema(name ="ID", hidden = true) @Schema(name = "ID", hidden = true)
private Long id; private Long id;
@TableField(exist = false) @TableField(exist = false)
@JSONField(serialize = false) @JSONField(serialize = false)
@Schema(name ="菜单角色") @Schema(name = "菜单角色")
private Set<SystemRoleTb> roles; private Set<SystemRoleTb> roles;
@TableField(exist = false) @TableField(exist = false)
private List<SystemMenuTb> children; private List<SystemMenuTb> children;
@Schema(name ="菜单标题") @Schema(name = "菜单标题")
private String title; private String title;
@TableField(value = "name") @TableField(value = "name")
@Schema(name ="菜单组件名称") @Schema(name = "菜单组件名称")
private String componentName; private String componentName;
@Schema(name ="排序") @Schema(name = "排序")
private Integer menuSort = 999; private Integer menuSort = 999;
@Schema(name ="组件路径") @Schema(name = "组件路径")
private String component; private String component;
@Schema(name ="路由地址") @Schema(name = "路由地址")
private String path; private String path;
@Schema(name ="菜单类型,目录、菜单、按钮") @Schema(name = "菜单类型,目录、菜单、按钮")
private Integer type; private Integer type;
@Schema(name ="权限标识") @Schema(name = "权限标识")
private String permission; private String permission;
@Schema(name ="菜单图标") @Schema(name = "菜单图标")
private String icon; private String icon;
@Schema(name ="缓存") @Schema(name = "缓存")
private Boolean cache; private Boolean cache;
@Schema(name ="是否隐藏") @Schema(name = "是否隐藏")
private Boolean hidden; private Boolean hidden;
@Schema(name ="上级菜单") @Schema(name = "上级菜单")
private Long pid; private Long pid;
@Schema(name ="子节点数目", hidden = true) @Schema(name = "子节点数目", hidden = true)
private Integer subCount = 0; private Integer subCount = 0;
@Schema(name ="外链菜单") @Schema(name = "外链菜单")
private Boolean iFrame; private Boolean iFrame;
@Override @Override
@@ -106,17 +106,17 @@ public class SystemMenuTb extends CsBaseUserTimeTb {
return Objects.hash(id); return Objects.hash(id);
} }
@Schema(name ="是否有子节点") @Schema(name = "是否有子节点")
public Boolean getHasChildren() { public Boolean getHasChildren() {
return subCount > 0; return subCount > 0;
} }
@Schema(name ="是否为叶子") @Schema(name = "是否为叶子")
public Boolean getLeaf() { public Boolean getLeaf() {
return subCount <= 0; return subCount <= 0;
} }
@Schema(name ="标签名称") @Schema(name = "标签名称")
public String getLabel() { public String getLabel() {
return title; return title;
} }
@@ -38,43 +38,43 @@ import lombok.Setter;
@TableName("system_oss_storage") @TableName("system_oss_storage")
@Schema(name = "SystemOssStorage对象", description = "OSS存储") @Schema(name = "SystemOssStorage对象", description = "OSS存储")
public class SystemOssStorageTb extends CsBaseUserTimeTb { public class SystemOssStorageTb extends CsBaseUserTimeTb {
@Schema(name="ID") @Schema(name = "ID")
@TableId(value = "id", type = IdType.AUTO) @TableId(value = "id", type = IdType.AUTO)
private Long id; private Long id;
@TableField("service_type") @TableField("service_type")
@Schema(name="类型,比如minio") @Schema(name = "类型,比如minio")
private String serviceType; private String serviceType;
@TableField("endpoint") @TableField("endpoint")
@Schema(name="服务地址") @Schema(name = "服务地址")
private String endpoint; private String endpoint;
@TableField("bucket_name") @TableField("bucket_name")
@Schema(name="存储桶名称") @Schema(name = "存储桶名称")
private String bucketName; private String bucketName;
@TableField("file_name") @TableField("file_name")
@Schema(name="完整文件名称") @Schema(name = "完整文件名称")
private String fileName; private String fileName;
@TableField("file_size") @TableField("file_size")
@Schema(name="文件大小, 单位:字节") @Schema(name = "文件大小, 单位:字节")
private Long fileSize; private Long fileSize;
@TableField("file_mime") @TableField("file_mime")
@Schema(name="文件类型") @Schema(name = "文件类型")
private String fileMime; private String fileMime;
@Schema(name="短文件名") @Schema(name = "短文件名")
@TableField("file_prefix") @TableField("file_prefix")
private String filePrefix; private String filePrefix;
@Schema(name="文件后缀") @Schema(name = "文件后缀")
@TableField("file_suffix") @TableField("file_suffix")
private String fileSuffix; private String fileSuffix;
@TableField("file_md5") @TableField("file_md5")
@Schema(name="文件md5") @Schema(name = "文件md5")
private String fileMd5; private String fileMd5;
@TableField("file_url") @TableField("file_url")
@Schema(name="文件链接") @Schema(name = "文件链接")
private String fileUrl; private String fileUrl;
@TableField("file_code") @TableField("file_code")
@Schema(name="文件编码") @Schema(name = "文件编码")
private String fileCode; private String fileCode;
@TableField("object_name") @TableField("object_name")
@Schema(name="对象路径") @Schema(name = "对象路径")
private String objectName; private String objectName;
} }
@@ -75,7 +75,7 @@ public class SystemRoleTb extends CsBaseUserTimeTb {
if (o == null || getClass() != o.getClass()) { if (o == null || getClass() != o.getClass()) {
return false; return false;
} }
SystemRoleTb role = (SystemRoleTb) o; SystemRoleTb role = (SystemRoleTb)o;
return Objects.equals(id, role.id); return Objects.equals(id, role.id);
} }
@@ -105,7 +105,7 @@ public class SystemUserTb extends CsBaseUserTimeTb {
if (o == null || getClass() != o.getClass()) { if (o == null || getClass() != o.getClass()) {
return false; return false;
} }
SystemUserTb user = (SystemUserTb) o; SystemUserTb user = (SystemUserTb)o;
return Objects.equals(id, user.id) && Objects.equals(username, user.username); return Objects.equals(id, user.id) && Objects.equals(username, user.username);
} }
@@ -36,11 +36,7 @@ public @interface BizLock {
String bizName() default ""; String bizName() default "";
/** /**
* 锁key,支持SpEL表达式 * 锁key,支持SpEL表达式 示例: #user.id - 获取参数user的id属性 #p0 - 获取第一个参数 #root.methodName - 获取方法名
* 示例:
* #user.id - 获取参数user的id属性
* #p0 - 获取第一个参数
* #root.methodName - 获取方法名
*/ */
String key() default ""; String key() default "";
@@ -60,11 +60,11 @@ public class BizLockAspect {
private String parseLockKey(ProceedingJoinPoint joinPoint, BizLock bizLock) { private String parseLockKey(ProceedingJoinPoint joinPoint, BizLock bizLock) {
// 如果key为空,使用默认格式: bizName:方法名 // 如果key为空,使用默认格式: bizName:方法名
if (bizLock.key().isEmpty()) { if (bizLock.key().isEmpty()) {
return String.format("%s:%s", bizLock.bizName(), ((MethodSignature) joinPoint.getSignature()).getMethod().getName()); return String.format("%s:%s", bizLock.bizName(), ((MethodSignature)joinPoint.getSignature()).getMethod().getName());
} }
// 解析SpEL表达式 // 解析SpEL表达式
MethodSignature signature = (MethodSignature) joinPoint.getSignature(); MethodSignature signature = (MethodSignature)joinPoint.getSignature();
Method method = signature.getMethod(); Method method = signature.getMethod();
// 创建SpEL上下文 // 创建SpEL上下文
@@ -18,7 +18,6 @@ package cn.odboy.system.framework.operalog;
import cn.hutool.core.date.TimeInterval; import cn.hutool.core.date.TimeInterval;
import cn.hutool.core.exceptions.ExceptionUtil; import cn.hutool.core.exceptions.ExceptionUtil;
import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.odboy.framework.context.CsRequestHolder; import cn.odboy.framework.context.CsRequestHolder;
import cn.odboy.system.dal.dataobject.SystemOperationLogTb; import cn.odboy.system.dal.dataobject.SystemOperationLogTb;
@@ -86,7 +85,7 @@ public class OperationLogAspect {
private SystemOperationLogTb getOperationLogTb(ProceedingJoinPoint joinPoint, OperationLog annotation, TimeInterval timeInterval) { private SystemOperationLogTb getOperationLogTb(ProceedingJoinPoint joinPoint, OperationLog annotation, TimeInterval timeInterval) {
long executeTime = timeInterval.intervalMs(); long executeTime = timeInterval.intervalMs();
MethodSignature signature = (MethodSignature) joinPoint.getSignature(); MethodSignature signature = (MethodSignature)joinPoint.getSignature();
String bizName = annotation.bizName(); String bizName = annotation.bizName();
if (StrUtil.isBlank(bizName)) { if (StrUtil.isBlank(bizName)) {
Method method = signature.getMethod(); Method method = signature.getMethod();
@@ -17,7 +17,6 @@ package cn.odboy.system.framework.operalog.core;
import cn.hutool.core.date.TimeInterval; import cn.hutool.core.date.TimeInterval;
import cn.hutool.core.exceptions.ExceptionUtil; import cn.hutool.core.exceptions.ExceptionUtil;
import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.odboy.framework.context.CsRequestHolder; import cn.odboy.framework.context.CsRequestHolder;
import cn.odboy.system.dal.dataobject.SystemOperationLogTb; import cn.odboy.system.dal.dataobject.SystemOperationLogTb;
@@ -22,7 +22,6 @@ import org.springframework.stereotype.Service;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
@Service(value = "el") @Service(value = "el")
public class AuthorityConfig { public class AuthorityConfig {
@@ -60,7 +60,7 @@ public class CsSecurityHelper {
public static List<Long> getCurrentUserDataScope() { public static List<Long> getCurrentUserDataScope() {
UserDetails userDetails = getCurrentUser(); UserDetails userDetails = getCurrentUser();
// 将 Java 对象转换为 JSONObject 对象 // 将 Java 对象转换为 JSONObject 对象
JSONObject jsonObject = (JSONObject) JSON.toJSON(userDetails); JSONObject jsonObject = (JSONObject)JSON.toJSON(userDetails);
JSONArray jsonArray = jsonObject.getJSONArray("dataScopes"); JSONArray jsonArray = jsonObject.getJSONArray("dataScopes");
return JSON.parseArray(jsonArray.toJSONString(), Long.class); return JSON.parseArray(jsonArray.toJSONString(), Long.class);
} }
@@ -122,7 +122,7 @@ public class CsSecurityHelper {
* @return / * @return /
*/ */
public static String getToken() { public static String getToken() {
HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); HttpServletRequest request = ((ServletRequestAttributes)Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
String bearerToken = request.getHeader(SystemConst.HEADER_NAME); String bearerToken = request.getHeader(SystemConst.HEADER_NAME);
if (bearerToken != null && bearerToken.startsWith(SystemConst.TOKEN_PREFIX)) { if (bearerToken != null && bearerToken.startsWith(SystemConst.TOKEN_PREFIX)) {
// 去掉令牌前缀 // 去掉令牌前缀
@@ -39,7 +39,7 @@ public class TokenFilter extends GenericFilterBean {
private final SystemUserOnlineInfoDAO systemUserOnlineInfoDAO; private final SystemUserOnlineInfoDAO systemUserOnlineInfoDAO;
/** /**
* @param tokenProvider Token * @param tokenProvider Token
* @param systemUserOnlineInfoDAO 用户在线 * @param systemUserOnlineInfoDAO 用户在线
*/ */
public TokenFilter(TokenProvider tokenProvider, SystemUserOnlineInfoDAO systemUserOnlineInfoDAO) { public TokenFilter(TokenProvider tokenProvider, SystemUserOnlineInfoDAO systemUserOnlineInfoDAO) {
@@ -49,7 +49,7 @@ public class TokenFilter extends GenericFilterBean {
@Override @Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws ServletException, IOException { public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws ServletException, IOException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; HttpServletRequest httpServletRequest = (HttpServletRequest)servletRequest;
String token = resolveToken(httpServletRequest); String token = resolveToken(httpServletRequest);
// 对于 Token 为空的不需要去查 Redis // 对于 Token 为空的不需要去查 Redis
if (StrUtil.isNotBlank(token)) { if (StrUtil.isNotBlank(token)) {
@@ -48,6 +48,8 @@ import java.util.concurrent.TimeUnit;
@Slf4j @Slf4j
@Component @Component
public class TokenProvider implements InitializingBean { public class TokenProvider implements InitializingBean {
public static final String AUTHORITIES_UUID_KEY = "uid";
public static final String AUTHORITIES_UID_KEY = "userId";
@Autowired @Autowired
private CsRedisHelper redisHelper; private CsRedisHelper redisHelper;
@Autowired @Autowired
@@ -57,8 +59,6 @@ public class TokenProvider implements InitializingBean {
// 0.12.x版本 // 0.12.x版本
private SecretKey signingKey; private SecretKey signingKey;
private JwtParser jwtParser; private JwtParser jwtParser;
public static final String AUTHORITIES_UUID_KEY = "uid";
public static final String AUTHORITIES_UID_KEY = "userId";
@Override @Override
public void afterPropertiesSet() { public void afterPropertiesSet() {
@@ -125,7 +125,7 @@ public class TokenProvider implements InitializingBean {
// 判断是否续期token,计算token的过期时间 // 判断是否续期token,计算token的过期时间
String loginKey = loginKey(token); String loginKey = loginKey(token);
long time = redisHelper.getExpire(loginKey) * 1000; long time = redisHelper.getExpire(loginKey) * 1000;
Date expireDate = DateUtil.offset(new Date(), DateField.MILLISECOND, (int) time); Date expireDate = DateUtil.offset(new Date(), DateField.MILLISECOND, (int)time);
// 判断当前时间与过期时间的时间差 // 判断当前时间与过期时间的时间差
long differ = expireDate.getTime() - System.currentTimeMillis(); long differ = expireDate.getTime() - System.currentTimeMillis();
// 如果在续期检查的范围内,则续期 // 如果在续期检查的范围内,则续期
@@ -52,7 +52,7 @@ public class ExecutionJobBean extends QuartzJobBean {
@Override @Override
public void executeInternal(JobExecutionContext context) { public void executeInternal(JobExecutionContext context) {
// 获取任务 // 获取任务
SystemQuartzJobTb quartzJob = (SystemQuartzJobTb) context.getMergedJobDataMap().get(SystemQuartzJobTb.JOB_KEY); SystemQuartzJobTb quartzJob = (SystemQuartzJobTb)context.getMergedJobDataMap().get(SystemQuartzJobTb.JOB_KEY);
// 获取spring bean // 获取spring bean
SystemQuartzLogMapper quartzLogMapper = CsSpringBeanHolder.getBean(SystemQuartzLogMapper.class); SystemQuartzLogMapper quartzLogMapper = CsSpringBeanHolder.getBean(SystemQuartzLogMapper.class);
SystemQuartzJobService systemQuartzJobService = CsSpringBeanHolder.getBean(SystemQuartzJobService.class); SystemQuartzJobService systemQuartzJobService = CsSpringBeanHolder.getBean(SystemQuartzJobService.class);
@@ -41,12 +41,13 @@ public class QuartzManage {
JobDetail jobDetail = JobBuilder.newJob(ExecutionJobBean.class).withIdentity(JOB_NAME + quartzJob.getId()).build(); JobDetail jobDetail = JobBuilder.newJob(ExecutionJobBean.class).withIdentity(JOB_NAME + quartzJob.getId()).build();
// 通过触发器名和cron 表达式创建 Trigger // 通过触发器名和cron 表达式创建 Trigger
Trigger trigger = TriggerBuilder.newTrigger().withIdentity(JOB_NAME + quartzJob.getId()).startNow().withSchedule(CronScheduleBuilder.cronSchedule(quartzJob.getCronExpression())).build(); Trigger trigger = TriggerBuilder.newTrigger().withIdentity(JOB_NAME + quartzJob.getId()).startNow()
.withSchedule(CronScheduleBuilder.cronSchedule(quartzJob.getCronExpression())).build();
trigger.getJobDataMap().put(SystemQuartzJobTb.JOB_KEY, quartzJob); trigger.getJobDataMap().put(SystemQuartzJobTb.JOB_KEY, quartzJob);
// 重置启动时间 // 重置启动时间
((CronTriggerImpl) trigger).setStartTime(new Date()); ((CronTriggerImpl)trigger).setStartTime(new Date());
// 执行定时任务,如果是持久化的,这里会报错,捕获输出 // 执行定时任务,如果是持久化的,这里会报错,捕获输出
try { try {
@@ -73,16 +74,16 @@ public class QuartzManage {
public void updateJobCron(SystemQuartzJobTb quartzJob) { public void updateJobCron(SystemQuartzJobTb quartzJob) {
try { try {
TriggerKey triggerKey = TriggerKey.triggerKey(JOB_NAME + quartzJob.getId()); TriggerKey triggerKey = TriggerKey.triggerKey(JOB_NAME + quartzJob.getId());
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); CronTrigger trigger = (CronTrigger)scheduler.getTrigger(triggerKey);
// 如果不存在则创建一个定时任务 // 如果不存在则创建一个定时任务
if (trigger == null) { if (trigger == null) {
addJob(quartzJob); addJob(quartzJob);
trigger = (CronTrigger) scheduler.getTrigger(triggerKey); trigger = (CronTrigger)scheduler.getTrigger(triggerKey);
} }
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(quartzJob.getCronExpression()); CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(quartzJob.getCronExpression());
trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build(); trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
// 重置启动时间 // 重置启动时间
((CronTriggerImpl) trigger).setStartTime(new Date()); ((CronTriggerImpl)trigger).setStartTime(new Date());
trigger.getJobDataMap().put(SystemQuartzJobTb.JOB_KEY, quartzJob); trigger.getJobDataMap().put(SystemQuartzJobTb.JOB_KEY, quartzJob);
scheduler.rescheduleJob(triggerKey, trigger); scheduler.rescheduleJob(triggerKey, trigger);
@@ -120,7 +121,7 @@ public class QuartzManage {
public void resumeJob(SystemQuartzJobTb quartzJob) { public void resumeJob(SystemQuartzJobTb quartzJob) {
try { try {
TriggerKey triggerKey = TriggerKey.triggerKey(JOB_NAME + quartzJob.getId()); TriggerKey triggerKey = TriggerKey.triggerKey(JOB_NAME + quartzJob.getId());
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); CronTrigger trigger = (CronTrigger)scheduler.getTrigger(triggerKey);
// 如果不存在则创建一个定时任务 // 如果不存在则创建一个定时任务
if (trigger == null) { if (trigger == null) {
addJob(quartzJob); addJob(quartzJob);
@@ -141,7 +142,7 @@ public class QuartzManage {
public void runJobNow(SystemQuartzJobTb quartzJob) { public void runJobNow(SystemQuartzJobTb quartzJob) {
try { try {
TriggerKey triggerKey = TriggerKey.triggerKey(JOB_NAME + quartzJob.getId()); TriggerKey triggerKey = TriggerKey.triggerKey(JOB_NAME + quartzJob.getId());
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); CronTrigger trigger = (CronTrigger)scheduler.getTrigger(triggerKey);
// 如果不存在则创建一个定时任务 // 如果不存在则创建一个定时任务
if (trigger == null) { if (trigger == null) {
addJob(quartzJob); addJob(quartzJob);
@@ -164,7 +164,9 @@ public class MinioRepository {
systemOssStorageTb.setObjectName(objectName); systemOssStorageTb.setObjectName(objectName);
try (InputStream fileInputStream = CsFileUtil.getInputStream(tempFile)) { try (InputStream fileInputStream = CsFileUtil.getInputStream(tempFile)) {
PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(ossMinioConfig.getBucketName()).object(objectName).stream(fileInputStream, fileSize, -1).contentType(contentType).build(); PutObjectArgs objectArgs =
PutObjectArgs.builder().bucket(ossMinioConfig.getBucketName()).object(objectName).stream(fileInputStream, fileSize, -1).contentType(contentType)
.build();
minioClient.putObject(objectArgs); minioClient.putObject(objectArgs);
log.info("文件上传成功,并删除临时文件,文件名:{}", originalFilename); log.info("文件上传成功,并删除临时文件,文件名:{}", originalFilename);
return systemOssStorageTb; return systemOssStorageTb;
@@ -201,7 +203,9 @@ public class MinioRepository {
log.info("准备上传文件,原文件名:{},上传后文件名:{}", originalFilename, fileName); log.info("准备上传文件,原文件名:{},上传后文件名:{}", originalFilename, fileName);
try (InputStream fileInputStream = file.getInputStream()) { try (InputStream fileInputStream = file.getInputStream()) {
PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(objectName).stream(fileInputStream, file.getSize(), -1).contentType(file.getContentType()).build(); PutObjectArgs objectArgs =
PutObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(objectName).stream(fileInputStream, file.getSize(), -1)
.contentType(file.getContentType()).build();
// 使用重试机制进行上传 // 使用重试机制进行上传
uploadWithRetry(objectArgs, 3); uploadWithRetry(objectArgs, 3);
log.info("文件上传成功,objectName: {}", objectName); log.info("文件上传成功,objectName: {}", objectName);
@@ -249,7 +253,8 @@ public class MinioRepository {
return null; return null;
} }
try { try {
GetPresignedObjectUrlArgs presignedUrlArgs = GetPresignedObjectUrlArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(fullFileName).method(Method.GET) GetPresignedObjectUrlArgs presignedUrlArgs =
GetPresignedObjectUrlArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(fullFileName).method(Method.GET)
// 设置 URL 过期时间为 7 天, 最大 7 天, 别挣扎了 // 设置 URL 过期时间为 7 天, 最大 7 天, 别挣扎了
.expiry(3600 * 24 * 7).build(); .expiry(3600 * 24 * 7).build();
String url = minioClient.getPresignedObjectUrl(presignedUrlArgs); String url = minioClient.getPresignedObjectUrl(presignedUrlArgs);
@@ -27,7 +27,6 @@ import org.springframework.stereotype.Service;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.stream.Collectors;
/** /**
* 数据权限 Service * 数据权限 Service
@@ -368,8 +368,7 @@ public class SystemDeptService {
private List<SystemProductLineVo> buildDeptSelectOptions(List<SystemDeptTb> depts) { private List<SystemProductLineVo> buildDeptSelectOptions(List<SystemDeptTb> depts) {
// 获取所有部门并按父子关系组织 // 获取所有部门并按父子关系组织
Map<Long, SystemDeptTb> deptMap = Map<Long, SystemDeptTb> deptMap = depts.stream().collect(Collectors.toMap(SystemDeptTb::getId, Function.identity()));
depts.stream().collect(Collectors.toMap(SystemDeptTb::getId, Function.identity()));
List<SystemProductLineVo> options = new ArrayList<>(); List<SystemProductLineVo> options = new ArrayList<>();
for (SystemDeptTb dept : depts) { for (SystemDeptTb dept : depts) {
// 构建部门ID路径 // 构建部门ID路径
@@ -420,8 +419,7 @@ public class SystemDeptService {
public List<SystemProductLineTreeVo> queryDeptSelectProDataSource() { public List<SystemProductLineTreeVo> queryDeptSelectProDataSource() {
List<SystemDeptTb> depts = findEnabledDepts(); List<SystemDeptTb> depts = findEnabledDepts();
// 获取所有部门并按父子关系组织 // 获取所有部门并按父子关系组织
Map<Long, SystemDeptTb> deptMap = Map<Long, SystemDeptTb> deptMap = depts.stream().collect(Collectors.toMap(SystemDeptTb::getId, Function.identity()));
depts.stream().collect(Collectors.toMap(SystemDeptTb::getId, Function.identity()));
List<SystemProductLineTreeVo> options = new ArrayList<>(); List<SystemProductLineTreeVo> options = new ArrayList<>();
// 构建树形结构 // 构建树形结构
for (SystemDeptTb dept : depts) { for (SystemDeptTb dept : depts) {
@@ -102,14 +102,10 @@ public class SystemEmailService {
// 发送 // 发送
try { try {
int size = sendEmailRequest.getTos().size(); int size = sendEmailRequest.getTos().size();
Mail.create(account) Mail.create(account).setTos(sendEmailRequest.getTos().toArray(new String[size])).setTitle(sendEmailRequest.getSubject()).setContent(content)
.setTos(sendEmailRequest.getTos().toArray(new String[size])) .setHtml(true)
.setTitle(sendEmailRequest.getSubject()) // 关闭session
.setContent(content) .setUseGlobalSession(false).send();
.setHtml(true)
// 关闭session
.setUseGlobalSession(false)
.send();
} catch (Exception e) { } catch (Exception e) {
log.error("邮件发送失败", e); log.error("邮件发送失败", e);
throw new BadRequestException("邮件发送失败"); throw new BadRequestException("邮件发送失败");
@@ -152,8 +148,7 @@ public class SystemEmailService {
} else { } else {
content = CsResourceTemplateUtil.render(null, biEnum.getTemplateName(), Dict.create().set("code", oldCode)); content = CsResourceTemplateUtil.render(null, biEnum.getTemplateName(), Dict.create().set("code", oldCode));
} }
SystemSendEmailArgs sendEmailRequest = SystemSendEmailArgs sendEmailRequest = new SystemSendEmailArgs(Collections.singletonList(email), applicationTitle, content);
new SystemSendEmailArgs(Collections.singletonList(email), applicationTitle, content);
sendEmail(sendEmailRequest); sendEmail(sendEmailRequest);
} }
@@ -123,8 +123,7 @@ public class SystemLocalStorageService {
* @param response / * @param response /
* @throws IOException / * @throws IOException /
*/ */
public void exportLocalStorageExcel(List<SystemLocalStorageTb> localStorages, HttpServletResponse response) public void exportLocalStorageExcel(List<SystemLocalStorageTb> localStorages, HttpServletResponse response) throws IOException {
throws IOException {
List<Map<String, Object>> list = new ArrayList<>(); List<Map<String, Object>> list = new ArrayList<>();
for (SystemLocalStorageTb localStorage : localStorages) { for (SystemLocalStorageTb localStorage : localStorages) {
Map<String, Object> map = new LinkedHashMap<>(); Map<String, Object> map = new LinkedHashMap<>();
@@ -146,9 +145,7 @@ public class SystemLocalStorageService {
* @param page 分页参数 * @param page 分页参数
* @return / * @return /
*/ */
public CsPageResult<SystemLocalStorageTb> queryLocalStorage( public CsPageResult<SystemLocalStorageTb> queryLocalStorage(SystemQueryStorageArgs criteria, Page<SystemLocalStorageTb> page) {
SystemQueryStorageArgs criteria,
Page<SystemLocalStorageTb> page) {
return CsPageUtil.toPage(systemLocalStorageMapper.selectLocalStorageByArgs(criteria, page)); return CsPageUtil.toPage(systemLocalStorageMapper.selectLocalStorageByArgs(criteria, page));
} }
@@ -159,7 +156,6 @@ public class SystemLocalStorageService {
* @return / * @return /
*/ */
public List<SystemLocalStorageTb> queryLocalStorage(SystemQueryStorageArgs criteria) { public List<SystemLocalStorageTb> queryLocalStorage(SystemQueryStorageArgs criteria) {
return systemLocalStorageMapper.selectLocalStorageByArgs(criteria, CsPageUtil.getCount(systemLocalStorageMapper)) return systemLocalStorageMapper.selectLocalStorageByArgs(criteria, CsPageUtil.getCount(systemLocalStorageMapper)).getRecords();
.getRecords();
} }
} }
@@ -46,6 +46,8 @@ import java.util.stream.Collectors;
@Service @Service
public class SystemMenuService { public class SystemMenuService {
private static final String YES_STR = "是";
private static final String NO_STR = "否";
@Autowired @Autowired
private SystemMenuMapper systemMenuMapper; private SystemMenuMapper systemMenuMapper;
@Autowired @Autowired
@@ -53,9 +55,6 @@ public class SystemMenuService {
@Autowired @Autowired
private SystemRoleService systemRoleService; private SystemRoleService systemRoleService;
private static final String YES_STR = "是";
private static final String NO_STR = "否";
/** /**
* 创建 * 创建
* *
@@ -75,7 +74,8 @@ public class SystemMenuService {
args.setPid(null); args.setPid(null);
} }
if (args.getIFrame()) { if (args.getIFrame()) {
if (!(args.getPath().toLowerCase().startsWith(TransferProtocolConst.PREFIX_HTTP) || args.getPath().toLowerCase().startsWith(TransferProtocolConst.PREFIX_HTTPS))) { if (!(args.getPath().toLowerCase().startsWith(TransferProtocolConst.PREFIX_HTTP) || args.getPath().toLowerCase()
.startsWith(TransferProtocolConst.PREFIX_HTTPS))) {
throw new BadRequestException(TransferProtocolConst.PREFIX_HTTPS_BAD_REQUEST); throw new BadRequestException(TransferProtocolConst.PREFIX_HTTPS_BAD_REQUEST);
} }
} }
@@ -99,7 +99,8 @@ public class SystemMenuService {
} }
SystemMenuTb menu = systemMenuMapper.selectById(args.getId()); SystemMenuTb menu = systemMenuMapper.selectById(args.getId());
if (args.getIFrame()) { if (args.getIFrame()) {
if (!(args.getPath().toLowerCase().startsWith(TransferProtocolConst.PREFIX_HTTP) || args.getPath().toLowerCase().startsWith(TransferProtocolConst.PREFIX_HTTPS))) { if (!(args.getPath().toLowerCase().startsWith(TransferProtocolConst.PREFIX_HTTP) || args.getPath().toLowerCase()
.startsWith(TransferProtocolConst.PREFIX_HTTPS))) {
throw new BadRequestException(TransferProtocolConst.PREFIX_HTTPS_BAD_REQUEST); throw new BadRequestException(TransferProtocolConst.PREFIX_HTTPS_BAD_REQUEST);
} }
} }
@@ -98,7 +98,7 @@ public class SystemMonitorService {
diskInfo.put("available", CsFileUtil.getSize(available)); diskInfo.put("available", CsFileUtil.getSize(available));
diskInfo.put("used", CsFileUtil.getSize(used)); diskInfo.put("used", CsFileUtil.getSize(used));
if (total != 0) { if (total != 0) {
diskInfo.put("usageRate", df.format(used / (double) total * 100)); diskInfo.put("usageRate", df.format(used / (double)total * 100));
} else { } else {
diskInfo.put("usageRate", 0); diskInfo.put("usageRate", 0);
} }
@@ -122,7 +122,7 @@ public class SystemMonitorService {
if (used == 0) { if (used == 0) {
swapInfo.put("usageRate", 0); swapInfo.put("usageRate", 0);
} else { } else {
swapInfo.put("usageRate", df.format(used / (double) total * 100)); swapInfo.put("usageRate", df.format(used / (double)total * 100));
} }
return swapInfo; return swapInfo;
} }
@@ -138,9 +138,7 @@ public class SystemMonitorService {
memoryInfo.put("total", FormatUtil.formatBytes(memory.getTotal())); memoryInfo.put("total", FormatUtil.formatBytes(memory.getTotal()));
memoryInfo.put("available", FormatUtil.formatBytes(memory.getAvailable())); memoryInfo.put("available", FormatUtil.formatBytes(memory.getAvailable()));
memoryInfo.put("used", FormatUtil.formatBytes(memory.getTotal() - memory.getAvailable())); memoryInfo.put("used", FormatUtil.formatBytes(memory.getTotal() - memory.getAvailable()));
memoryInfo.put( memoryInfo.put("usageRate", df.format((memory.getTotal() - memory.getAvailable()) / (double)memory.getTotal() * 100));
"usageRate",
df.format((memory.getTotal() - memory.getAvailable()) / (double) memory.getTotal() * 100));
return memoryInfo; return memoryInfo;
} }
@@ -171,16 +169,12 @@ public class SystemMonitorService {
} }
long user = ticks[CentralProcessor.TickType.USER.getIndex()] - prevTicks[CentralProcessor.TickType.USER.getIndex()]; long user = ticks[CentralProcessor.TickType.USER.getIndex()] - prevTicks[CentralProcessor.TickType.USER.getIndex()];
long nice = ticks[CentralProcessor.TickType.NICE.getIndex()] - prevTicks[CentralProcessor.TickType.NICE.getIndex()]; long nice = ticks[CentralProcessor.TickType.NICE.getIndex()] - prevTicks[CentralProcessor.TickType.NICE.getIndex()];
long sys = long sys = ticks[CentralProcessor.TickType.SYSTEM.getIndex()] - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()];
ticks[CentralProcessor.TickType.SYSTEM.getIndex()] - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()];
long idle = ticks[CentralProcessor.TickType.IDLE.getIndex()] - prevTicks[CentralProcessor.TickType.IDLE.getIndex()]; long idle = ticks[CentralProcessor.TickType.IDLE.getIndex()] - prevTicks[CentralProcessor.TickType.IDLE.getIndex()];
long ioWait = long ioWait = ticks[CentralProcessor.TickType.IOWAIT.getIndex()] - prevTicks[CentralProcessor.TickType.IOWAIT.getIndex()];
ticks[CentralProcessor.TickType.IOWAIT.getIndex()] - prevTicks[CentralProcessor.TickType.IOWAIT.getIndex()];
long irq = ticks[CentralProcessor.TickType.IRQ.getIndex()] - prevTicks[CentralProcessor.TickType.IRQ.getIndex()]; long irq = ticks[CentralProcessor.TickType.IRQ.getIndex()] - prevTicks[CentralProcessor.TickType.IRQ.getIndex()];
long softIrq = long softIrq = ticks[CentralProcessor.TickType.SOFTIRQ.getIndex()] - prevTicks[CentralProcessor.TickType.SOFTIRQ.getIndex()];
ticks[CentralProcessor.TickType.SOFTIRQ.getIndex()] - prevTicks[CentralProcessor.TickType.SOFTIRQ.getIndex()]; long steal = ticks[CentralProcessor.TickType.STEAL.getIndex()] - prevTicks[CentralProcessor.TickType.STEAL.getIndex()];
long steal =
ticks[CentralProcessor.TickType.STEAL.getIndex()] - prevTicks[CentralProcessor.TickType.STEAL.getIndex()];
long totalCpu = user + nice + sys + idle + ioWait + irq + softIrq + steal; long totalCpu = user + nice + sys + idle + ioWait + irq + softIrq + steal;
cpuInfo.put("used", df.format(100d * user / totalCpu + 100d * sys / totalCpu)); cpuInfo.put("used", df.format(100d * user / totalCpu + 100d * sys / totalCpu));
cpuInfo.put("idle", df.format(100d * idle / totalCpu)); cpuInfo.put("idle", df.format(100d * idle / totalCpu));
@@ -179,8 +179,7 @@ public class SystemQuartzJobService {
* @throws IOException / * @throws IOException /
*/ */
public void exportQuartzJobExcel(List<SystemQuartzJobTb> quartzJobs, HttpServletResponse response) public void exportQuartzJobExcel(List<SystemQuartzJobTb> quartzJobs, HttpServletResponse response) throws IOException {
throws IOException {
List<Map<String, Object>> list = new ArrayList<>(); List<Map<String, Object>> list = new ArrayList<>();
for (SystemQuartzJobTb quartzJob : quartzJobs) { for (SystemQuartzJobTb quartzJob : quartzJobs) {
Map<String, Object> map = new LinkedHashMap<>(); Map<String, Object> map = new LinkedHashMap<>();
@@ -205,8 +204,7 @@ public class SystemQuartzJobService {
* @throws IOException / * @throws IOException /
*/ */
public void exportQuartzLogExcel(List<SystemQuartzLogTb> queryAllLog, HttpServletResponse response) public void exportQuartzLogExcel(List<SystemQuartzLogTb> queryAllLog, HttpServletResponse response) throws IOException {
throws IOException {
List<Map<String, Object>> list = new ArrayList<>(); List<Map<String, Object>> list = new ArrayList<>();
for (SystemQuartzLogTb quartzLog : queryAllLog) { for (SystemQuartzLogTb quartzLog : queryAllLog) {
Map<String, Object> map = new LinkedHashMap<>(); Map<String, Object> map = new LinkedHashMap<>();
@@ -232,9 +230,7 @@ public class SystemQuartzJobService {
* @return / * @return /
*/ */
public CsPageResult<SystemQuartzJobTb> queryQuartzJobByArgs( public CsPageResult<SystemQuartzJobTb> queryQuartzJobByArgs(SystemQueryQuartzJobArgs criteria, Page<SystemQuartzJobTb> page) {
SystemQueryQuartzJobArgs criteria,
Page<SystemQuartzJobTb> page) {
return CsPageUtil.toPage(systemQuartzJobMapper.selectQuartzJobByArgs(criteria, page)); return CsPageUtil.toPage(systemQuartzJobMapper.selectQuartzJobByArgs(criteria, page));
} }
@@ -246,9 +242,7 @@ public class SystemQuartzJobService {
* @return / * @return /
*/ */
public CsPageResult<SystemQuartzLogTb> queryQuartzLogByArgs( public CsPageResult<SystemQuartzLogTb> queryQuartzLogByArgs(SystemQueryQuartzJobArgs criteria, Page<SystemQuartzLogTb> page) {
SystemQueryQuartzJobArgs criteria,
Page<SystemQuartzLogTb> page) {
return CsPageUtil.toPage(systemQuartzLogMapper.selectQuartzLogByArgs(criteria, page)); return CsPageUtil.toPage(systemQuartzLogMapper.selectQuartzLogByArgs(criteria, page));
} }
@@ -260,8 +254,7 @@ public class SystemQuartzJobService {
*/ */
public List<SystemQuartzJobTb> queryQuartzJobByArgs(SystemQueryQuartzJobArgs criteria) { public List<SystemQuartzJobTb> queryQuartzJobByArgs(SystemQueryQuartzJobArgs criteria) {
return systemQuartzJobMapper.selectQuartzJobByArgs(criteria, CsPageUtil.getCount(systemQuartzJobMapper)) return systemQuartzJobMapper.selectQuartzJobByArgs(criteria, CsPageUtil.getCount(systemQuartzJobMapper)).getRecords();
.getRecords();
} }
/** /**
@@ -272,8 +265,7 @@ public class SystemQuartzJobService {
*/ */
public List<SystemQuartzLogTb> queryQuartzLogByArgs(SystemQueryQuartzJobArgs criteria) { public List<SystemQuartzLogTb> queryQuartzLogByArgs(SystemQueryQuartzJobArgs criteria) {
return systemQuartzLogMapper.selectQuartzLogByArgs(criteria, CsPageUtil.getCount(systemQuartzLogMapper)) return systemQuartzLogMapper.selectQuartzLogByArgs(criteria, CsPageUtil.getCount(systemQuartzLogMapper)).getRecords();
.getRecords();
} }
public SystemQuartzJobTb getQuartzJobById(Long id) { public SystemQuartzJobTb getQuartzJobById(Long id) {
@@ -231,11 +231,8 @@ public class SystemRoleService {
return permissions.stream().map(SystemRoleCodeVo::new).toList(); return permissions.stream().map(SystemRoleCodeVo::new).toList();
} }
List<SystemRoleTb> roles = systemRoleMapper.selectRoleByUserId(user.getId()); List<SystemRoleTb> roles = systemRoleMapper.selectRoleByUserId(user.getId());
permissions = roles.stream() permissions =
.flatMap(role -> role.getMenus().stream()) roles.stream().flatMap(role -> role.getMenus().stream()).map(SystemMenuTb::getPermission).filter(StrUtil::isNotBlank).collect(Collectors.toSet());
.map(SystemMenuTb::getPermission)
.filter(StrUtil::isNotBlank)
.collect(Collectors.toSet());
return permissions.stream().map(SystemRoleCodeVo::new).toList(); return permissions.stream().map(SystemRoleCodeVo::new).toList();
} }
@@ -44,7 +44,6 @@ import org.springframework.web.multipart.MultipartFile;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
@Service @Service
public class SystemUserService { public class SystemUserService {
@@ -165,9 +165,7 @@ public final class SqlUtil {
private static List<String> readSqlList(File sqlFile) throws Exception { private static List<String> readSqlList(File sqlFile) throws Exception {
List<String> sqlList = Lists.newArrayList(); List<String> sqlList = Lists.newArrayList();
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
try (BufferedReader reader = new BufferedReader(new InputStreamReader( try (BufferedReader reader = new BufferedReader(new InputStreamReader(Files.newInputStream(sqlFile.toPath()), StandardCharsets.UTF_8))) {
Files.newInputStream(sqlFile.toPath()),
StandardCharsets.UTF_8))) {
String tmp; String tmp;
while ((tmp = reader.readLine()) != null) { while ((tmp = reader.readLine()) != null) {
log.info("line:{}", tmp); log.info("line:{}", tmp);
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent> <parent>
<artifactId>cutejava</artifactId> <artifactId>cutejava</artifactId>
@@ -27,22 +27,12 @@ import lombok.Getter;
@Getter @Getter
@AllArgsConstructor @AllArgsConstructor
public enum TaskChangeTypeEnum { public enum TaskChangeTypeEnum {
AppApply("AppApply", "申请应用"), AppApply("AppApply", "申请应用"), AppContainerRestart("AppContainerRestart", "容器应用重启"), AppContainerDeploy("AppContainerDeploy", "容器应用部署"),
AppContainerRestart("AppContainerRestart", "容器应用重启"), AppOffline("AppOffline", "应用下线"), AppChangeReplicas("AppChangeReplicas", "应用扩缩容"), AppUpgrade("AppUpgrade", "应用升配"),
AppContainerDeploy("AppContainerDeploy", "容器应用部署"), AppDowngrade("AppDowngrade", "应用降配"), AppHostRestart("AppHostRestart", "主机应用重启"), AppHostDeploy("AppHostDeploy", "主机应用部署"),
AppOffline("AppOffline", "应用下线"), AppContainerRollback("AppContainerRollback", "容器应用回滚"), AppHostRollback("AppHostRollback", "主机应用回滚"),
AppChangeReplicas("AppChangeReplicas", "应用扩缩容"), ResourceApply("ResourceApply", "申请资源"), ResourceOffline("ResourceOffline", "资源下线"), DataChange("DataChange", "数据变更"),
AppUpgrade("AppUpgrade", "应用升配"), HostnameApply("HostnameApply", "申请域名"), HostnameChange("HostnameChange", "域名变更");
AppDowngrade("AppDowngrade", "应用降配"),
AppHostRestart("AppHostRestart", "主机应用重启"),
AppHostDeploy("AppHostDeploy", "主机应用部署"),
AppContainerRollback("AppContainerRollback", "容器应用回滚"),
AppHostRollback("AppHostRollback", "主机应用回滚"),
ResourceApply("ResourceApply", "申请资源"),
ResourceOffline("ResourceOffline", "资源下线"),
DataChange("DataChange", "数据变更"),
HostnameApply("HostnameApply", "申请域名"),
HostnameChange("HostnameChange", "域名变更");
private final String code; private final String code;
private final String name; private final String name;
} }
@@ -27,9 +27,7 @@ import lombok.Getter;
@Getter @Getter
@AllArgsConstructor @AllArgsConstructor
public enum TaskStatusEnum { public enum TaskStatusEnum {
Running("running", "运行中"), Running("running", "运行中"), Success("success", "执行成功"), Fail("fail", "执行失败");
Success("success", "执行成功"),
Fail("fail", "执行失败");
private final String code; private final String code;
private final String name; private final String name;
@@ -40,7 +40,8 @@ public class TaskTestsController {
@AnonymousAccess @AnonymousAccess
@GetMapping(value = "/testCreate") @GetMapping(value = "/testCreate")
public ResponseEntity<?> testCreate() { public ResponseEntity<?> testCreate() {
TaskInstanceInfoTb instanceInfo = taskManage.createJob("cutejava", TaskChangeTypeEnum.AppContainerDeploy, "java", "daily", "cutejava", "功能测试", null); TaskInstanceInfoTb instanceInfo =
taskManage.createJob("cutejava", TaskChangeTypeEnum.AppContainerDeploy, "java", "daily", "cutejava", "功能测试", null);
log.info("任务创建成功,实例为:{}", JSON.toJSONString(instanceInfo)); log.info("任务创建成功,实例为:{}", JSON.toJSONString(instanceInfo));
return ResponseEntity.ok(instanceInfo); return ResponseEntity.ok(instanceInfo);
} }
@@ -48,7 +49,8 @@ public class TaskTestsController {
@AnonymousAccess @AnonymousAccess
@GetMapping(value = "/testCreateAfterStop") @GetMapping(value = "/testCreateAfterStop")
public ResponseEntity<?> testCreateAfterStop() { public ResponseEntity<?> testCreateAfterStop() {
TaskInstanceInfoTb instanceInfo = taskManage.createJob("cutejava", TaskChangeTypeEnum.AppContainerDeploy, "java", "daily", "cutejava", "功能测试", null); TaskInstanceInfoTb instanceInfo =
taskManage.createJob("cutejava", TaskChangeTypeEnum.AppContainerDeploy, "java", "daily", "cutejava", "功能测试", null);
log.info("任务创建成功,实例为:{}", JSON.toJSONString(instanceInfo)); log.info("任务创建成功,实例为:{}", JSON.toJSONString(instanceInfo));
Thread.startVirtualThread(() -> { Thread.startVirtualThread(() -> {
ThreadUtil.safeSleep(5000); ThreadUtil.safeSleep(5000);
@@ -84,9 +84,11 @@ public class TaskJobBean extends QuartzJobBean implements InterruptableJob {
* @param dataMap 数据映射 * @param dataMap 数据映射
* @param taskTemplateNodeVos 模板节点列表 * @param taskTemplateNodeVos 模板节点列表
*/ */
private void executeNormalTask(TaskInstanceInfoService taskInstanceInfoService, TaskInstanceDetailService taskInstanceDetailService, long id, JobDataMap dataMap, List<TaskTemplateNodeVo> taskTemplateNodeVos) { private void executeNormalTask(TaskInstanceInfoService taskInstanceInfoService, TaskInstanceDetailService taskInstanceDetailService, long id,
JobDataMap dataMap, List<TaskTemplateNodeVo> taskTemplateNodeVos) {
// ========================== 初始化执行明细 ========================== // ========================== 初始化执行明细 ==========================
List<TaskInstanceDetailTb> taskInstanceDetails = taskTemplateNodeVos.stream().map(taskTemplateNodeVo -> buildTaskInstanceDetail(id, taskTemplateNodeVo)).toList(); List<TaskInstanceDetailTb> taskInstanceDetails =
taskTemplateNodeVos.stream().map(taskTemplateNodeVo -> buildTaskInstanceDetail(id, taskTemplateNodeVo)).toList();
taskInstanceDetailService.saveBatch(taskInstanceDetails); taskInstanceDetailService.saveBatch(taskInstanceDetails);
Map<String, Long> codeIdMap = taskInstanceDetails.stream().collect(Collectors.toMap(TaskInstanceDetailTb::getBizCode, TaskInstanceDetailTb::getId)); Map<String, Long> codeIdMap = taskInstanceDetails.stream().collect(Collectors.toMap(TaskInstanceDetailTb::getBizCode, TaskInstanceDetailTb::getId));
// ========================== 顺序执行 ========================== // ========================== 顺序执行 ==========================
@@ -103,7 +105,8 @@ public class TaskJobBean extends QuartzJobBean implements InterruptableJob {
* @param taskTemplateNodeVos 模板节点列表 * @param taskTemplateNodeVos 模板节点列表
* @param retryNodeCode 重试节点编码 * @param retryNodeCode 重试节点编码
*/ */
private void executeRetryTask(TaskInstanceInfoService taskInstanceInfoService, TaskInstanceDetailService taskInstanceDetailService, long id, JobDataMap dataMap, List<TaskTemplateNodeVo> taskTemplateNodeVos, String retryNodeCode) { private void executeRetryTask(TaskInstanceInfoService taskInstanceInfoService, TaskInstanceDetailService taskInstanceDetailService, long id,
JobDataMap dataMap, List<TaskTemplateNodeVo> taskTemplateNodeVos, String retryNodeCode) {
boolean isFound = false; boolean isFound = false;
// ========================== 初始化执行明细 ========================== // ========================== 初始化执行明细 ==========================
List<TaskInstanceDetailTb> taskInstanceDetails = new ArrayList<>(); List<TaskInstanceDetailTb> taskInstanceDetails = new ArrayList<>();
@@ -165,7 +168,8 @@ public class TaskJobBean extends QuartzJobBean implements InterruptableJob {
* @param taskTemplateNodes 需要执行的任务节点列表 * @param taskTemplateNodes 需要执行的任务节点列表
* @param codeIdMap 节点编码与明细ID映射 * @param codeIdMap 节点编码与明细ID映射
*/ */
private void executeTaskSteps(TaskInstanceInfoService taskInstanceInfoService, TaskInstanceDetailService taskInstanceDetailService, Long id, JobDataMap dataMap, List<TaskTemplateNodeVo> taskTemplateNodes, Map<String, Long> codeIdMap) { private void executeTaskSteps(TaskInstanceInfoService taskInstanceInfoService, TaskInstanceDetailService taskInstanceDetailService, Long id,
JobDataMap dataMap, List<TaskTemplateNodeVo> taskTemplateNodes, Map<String, Long> codeIdMap) {
try { try {
for (TaskTemplateNodeVo taskTemplateNodeVo : taskTemplateNodes) { for (TaskTemplateNodeVo taskTemplateNodeVo : taskTemplateNodes) {
String code = taskTemplateNodeVo.getCode(); String code = taskTemplateNodeVo.getCode();
@@ -64,7 +64,8 @@ public class TaskManage {
* @param dataMap 任务参数 * @param dataMap 任务参数
*/ */
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public TaskInstanceInfoTb createJob(String contextName, TaskChangeTypeEnum changeTypeEnum, String language, String envAlias, String source, String reason, JobDataMap dataMap) { public TaskInstanceInfoTb createJob(String contextName, TaskChangeTypeEnum changeTypeEnum, String language, String envAlias, String source, String reason,
JobDataMap dataMap) {
if (StrUtil.isBlank(contextName)) { if (StrUtil.isBlank(contextName)) {
throw new BadRequestException("参数contextName必填"); throw new BadRequestException("参数contextName必填");
} }
@@ -101,7 +102,8 @@ public class TaskManage {
} }
// ========================== 创建任务 ========================== // ========================== 创建任务 ==========================
TaskManage taskManage = CsSpringBeanHolder.getBean(TaskManage.class); TaskManage taskManage = CsSpringBeanHolder.getBean(TaskManage.class);
TaskInstanceInfoTb newInstance = taskManage.saveTaskInstanceInfoTb(contextName, changeTypeEnum, language, envAlias, source, reason, dataMap, templateInfo); TaskInstanceInfoTb newInstance =
taskManage.saveTaskInstanceInfoTb(contextName, changeTypeEnum, language, envAlias, source, reason, dataMap, templateInfo);
dataMap.put(TaskJobKeys.ID, newInstance.getId()); dataMap.put(TaskJobKeys.ID, newInstance.getId());
// 应用名、资源类型 // 应用名、资源类型
dataMap.put(TaskJobKeys.CONTEXT_NAME, contextName); dataMap.put(TaskJobKeys.CONTEXT_NAME, contextName);
@@ -115,7 +117,8 @@ public class TaskManage {
} }
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public TaskInstanceInfoTb saveTaskInstanceInfoTb(String contextName, TaskChangeTypeEnum changeTypeEnum, String language, String envAlias, String source, String reason, JobDataMap dataMap, String templateInfo) { public TaskInstanceInfoTb saveTaskInstanceInfoTb(String contextName, TaskChangeTypeEnum changeTypeEnum, String language, String envAlias, String source,
String reason, JobDataMap dataMap, String templateInfo) {
TaskInstanceInfoTb newInstance = new TaskInstanceInfoTb(); TaskInstanceInfoTb newInstance = new TaskInstanceInfoTb();
newInstance.setContextName(contextName); newInstance.setContextName(contextName);
newInstance.setLanguage(language); newInstance.setLanguage(language);
@@ -35,6 +35,6 @@ public class TaskStepNodeMergeBranch implements TaskStepExecutor {
public void execute(Long instanceDetailId, JobDataMap jobDataMap, TaskTemplateNodeVo taskTemplateNode) throws BadRequestException { public void execute(Long instanceDetailId, JobDataMap jobDataMap, TaskTemplateNodeVo taskTemplateNode) throws BadRequestException {
ThreadUtil.sleep(3000); ThreadUtil.sleep(3000);
stepDetailService.fail(instanceDetailId, "执行失败测试"); stepDetailService.fail(instanceDetailId, "执行失败测试");
// stepDetailService.success(instanceDetailId, "执行成功"); // stepDetailService.success(instanceDetailId, "执行成功");
} }
} }
@@ -48,7 +48,7 @@ public class TaskInstanceDetailTb extends CsObject {
/** /**
* id * id
*/ */
@Schema(name="id") @Schema(name = "id")
@TableId(value = "id", type = IdType.ASSIGN_ID) @TableId(value = "id", type = IdType.ASSIGN_ID)
@JsonSerialize(using = ToStringSerializer.class) @JsonSerialize(using = ToStringSerializer.class)
@JSONField(format = "string") @JSONField(format = "string")
@@ -58,20 +58,20 @@ public class TaskInstanceDetailTb extends CsObject {
* 任务实例id * 任务实例id
*/ */
@TableField("instance_id") @TableField("instance_id")
@Schema(name="任务实例id") @Schema(name = "任务实例id")
private Long instanceId; private Long instanceId;
/** /**
* 开始时间 * 开始时间
*/ */
@Schema(name="开始时间") @Schema(name = "开始时间")
@TableField("start_time") @TableField("start_time")
private Date startTime; private Date startTime;
/** /**
* 结束时间 * 结束时间
*/ */
@Schema(name="结束时间") @Schema(name = "结束时间")
@TableField("finish_time") @TableField("finish_time")
private Date finishTime; private Date finishTime;
@@ -79,27 +79,27 @@ public class TaskInstanceDetailTb extends CsObject {
* 业务编码 * 业务编码
*/ */
@TableField("biz_code") @TableField("biz_code")
@Schema(name="业务编码") @Schema(name = "业务编码")
private String bizCode; private String bizCode;
/** /**
* 业务名称(步骤) * 业务名称(步骤)
*/ */
@TableField("biz_name") @TableField("biz_name")
@Schema(name="业务名称(步骤)") @Schema(name = "业务名称(步骤)")
private String bizName; private String bizName;
/** /**
* 执行参数 * 执行参数
*/ */
@Schema(name="执行参数") @Schema(name = "执行参数")
@TableField("execute_params") @TableField("execute_params")
private String executeParams; private String executeParams;
/** /**
* 执行信息 * 执行信息
*/ */
@Schema(name="执行信息") @Schema(name = "执行信息")
@TableField("execute_info") @TableField("execute_info")
private String executeInfo; private String executeInfo;
@@ -107,6 +107,6 @@ public class TaskInstanceDetailTb extends CsObject {
* 执行状态(running进行中 success成功 fail失败) * 执行状态(running进行中 success成功 fail失败)
*/ */
@TableField("execute_status") @TableField("execute_status")
@Schema(name="执行状态(running进行中 success成功 fail失败)") @Schema(name = "执行状态(running进行中 success成功 fail失败)")
private String executeStatus; private String executeStatus;
} }
@@ -58,7 +58,7 @@ public class TaskInstanceInfoTb extends CsObject {
/** /**
* id, @JsonSerialize和@JSONField,用于处理大数精度丢失问题 * id, @JsonSerialize和@JSONField,用于处理大数精度丢失问题
*/ */
@Schema(name="id") @Schema(name = "id")
@TableId(value = "id", type = IdType.ASSIGN_ID) @TableId(value = "id", type = IdType.ASSIGN_ID)
@JsonSerialize(using = ToStringSerializer.class) @JsonSerialize(using = ToStringSerializer.class)
@JSONField(format = "string") @JSONField(format = "string")
@@ -67,21 +67,21 @@ public class TaskInstanceInfoTb extends CsObject {
/** /**
* 名称 * 名称
*/ */
@Schema(name="名称") @Schema(name = "名称")
@TableField("context_name") @TableField("context_name")
private String contextName; private String contextName;
/** /**
* 语言 * 语言
*/ */
@Schema(name="语言") @Schema(name = "语言")
@TableField("`language`") @TableField("`language`")
private String language; private String language;
/** /**
* 变更类型 * 变更类型
*/ */
@Schema(name="变更类型") @Schema(name = "变更类型")
@TableField("change_type") @TableField("change_type")
private String changeType; private String changeType;
@@ -89,27 +89,27 @@ public class TaskInstanceInfoTb extends CsObject {
* 环境别名 * 环境别名
*/ */
@TableField("env_alias") @TableField("env_alias")
@Schema(name="环境别名") @Schema(name = "环境别名")
private String envAlias; private String envAlias;
/** /**
* 状态(running进行中 success成功 fail失败) * 状态(running进行中 success成功 fail失败)
*/ */
@TableField("`status`") @TableField("`status`")
@Schema(name="状态(running进行中 success成功 fail失败)") @Schema(name = "状态(running进行中 success成功 fail失败)")
private String status; private String status;
/** /**
* 完成时间 * 完成时间
*/ */
@Schema(name="完成时间") @Schema(name = "完成时间")
@TableField("finish_time") @TableField("finish_time")
private Date finishTime; private Date finishTime;
/** /**
* 来源 * 来源
*/ */
@Schema(name="来源") @Schema(name = "来源")
@TableField("`source`") @TableField("`source`")
private String source; private String source;
@@ -117,27 +117,27 @@ public class TaskInstanceInfoTb extends CsObject {
* 变更原因 * 变更原因
*/ */
@TableField("reason") @TableField("reason")
@Schema(name="变更原因") @Schema(name = "变更原因")
private String reason; private String reason;
/** /**
* 任务模板 * 任务模板
*/ */
@TableField("template") @TableField("template")
@Schema(name="template") @Schema(name = "template")
private String template; private String template;
/** /**
* QuartzJob参数 * QuartzJob参数
*/ */
@TableField("job_data") @TableField("job_data")
@Schema(name="QuartzJob参数") @Schema(name = "QuartzJob参数")
private String jobData; private String jobData;
/** /**
* 异常信息 * 异常信息
*/ */
@TableField("error_message") @TableField("error_message")
@Schema(name="异常信息") @Schema(name = "异常信息")
private String errorMessage; private String errorMessage;
} }
@@ -27,7 +27,6 @@ import lombok.ToString;
import java.util.Date; import java.util.Date;
/** /**
* <p> * <p>
* 任务实例步骤明细 * 任务实例步骤明细
@@ -49,7 +48,7 @@ public class TaskInstanceStepDetailTb extends CsObject {
/** /**
* id * id
*/ */
@Schema(name="id") @Schema(name = "id")
@TableId(value = "id", type = IdType.ASSIGN_ID) @TableId(value = "id", type = IdType.ASSIGN_ID)
@JsonSerialize(using = ToStringSerializer.class) @JsonSerialize(using = ToStringSerializer.class)
@JSONField(format = "string") @JSONField(format = "string")
@@ -59,20 +58,20 @@ public class TaskInstanceStepDetailTb extends CsObject {
* task_instance_detail表id * task_instance_detail表id
*/ */
@TableField("instance_detail_id") @TableField("instance_detail_id")
@Schema(name="task_instance_detail表id") @Schema(name = "task_instance_detail表id")
private Long instanceDetailId; private Long instanceDetailId;
/** /**
* 步骤描述 * 步骤描述
*/ */
@TableField("step_desc") @TableField("step_desc")
@Schema(name="步骤描述") @Schema(name = "步骤描述")
private String stepDesc; private String stepDesc;
/** /**
* 状态(success成功 fail失败) * 状态(success成功 fail失败)
*/ */
@TableField("step_status") @TableField("step_status")
@Schema(name="状态(success成功 fail失败)") @Schema(name = "状态(success成功 fail失败)")
private String stepStatus; private String stepStatus;
} }
@@ -25,7 +25,6 @@ import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import lombok.ToString; import lombok.ToString;
/** /**
* <p> * <p>
* 任务模板 * 任务模板
@@ -44,7 +43,7 @@ public class TaskTemplateInfoTb extends CsBaseUserTimeTb {
/** /**
* id * id
*/ */
@Schema(name="id") @Schema(name = "id")
@TableId(value = "id", type = IdType.AUTO) @TableId(value = "id", type = IdType.AUTO)
private Long id; private Long id;
@@ -52,13 +51,13 @@ public class TaskTemplateInfoTb extends CsBaseUserTimeTb {
* 数据有效性 * 数据有效性
*/ */
@TableField("available") @TableField("available")
@Schema(name="数据有效性") @Schema(name = "数据有效性")
private Boolean available; private Boolean available;
/** /**
* 变更类型 * 变更类型
*/ */
@Schema(name="变更类型") @Schema(name = "变更类型")
@TableField("change_type") @TableField("change_type")
private String changeType; private String changeType;
@@ -66,13 +65,13 @@ public class TaskTemplateInfoTb extends CsBaseUserTimeTb {
* 流水线名称 * 流水线名称
*/ */
@TableField("`name`") @TableField("`name`")
@Schema(name="流水线名称") @Schema(name = "流水线名称")
private String name; private String name;
/** /**
* 流水线描述 * 流水线描述
*/ */
@Schema(name="流水线描述") @Schema(name = "流水线描述")
@TableField("`description`") @TableField("`description`")
private String description; private String description;
@@ -80,20 +79,20 @@ public class TaskTemplateInfoTb extends CsBaseUserTimeTb {
* 流水线模板内容 * 流水线模板内容
*/ */
@TableField("template") @TableField("template")
@Schema(name="流水线模板内容") @Schema(name = "流水线模板内容")
private String template; private String template;
/** /**
* 环境别名 * 环境别名
*/ */
@TableField("env_alias") @TableField("env_alias")
@Schema(name="环境别名") @Schema(name = "环境别名")
private String envAlias; private String envAlias;
/** /**
* 应用为语言,资源为类型 * 应用为语言,资源为类型
*/ */
@TableField("`language`") @TableField("`language`")
@Schema(name="应用为语言,资源为类型") @Schema(name = "应用为语言,资源为类型")
private String language; private String language;
} }
@@ -38,10 +38,6 @@ public interface TaskTemplateInfoMapper extends BaseMapper<TaskTemplateInfoTb> {
* @param changeType 变更类型 * @param changeType 变更类型
* @return / * @return /
*/ */
TaskTemplateInfoVo selectTemplateInfoByECL( TaskTemplateInfoVo selectTemplateInfoByECL(@Param("envAlias") String envAlias, @Param("contextName") String contextName, @Param("language") String language,
@Param("envAlias") String envAlias, @Param("changeType") String changeType);
@Param("contextName") String contextName,
@Param("language") String language,
@Param("changeType") String changeType
);
} }
@@ -40,11 +40,8 @@ public class TaskInstanceInfoServiceImpl extends ServiceImpl<TaskInstanceInfoMap
@Override @Override
public TaskInstanceInfoTb getRunningById(Long id) { public TaskInstanceInfoTb getRunningById(Long id) {
return lambdaQuery() return lambdaQuery().eq(TaskInstanceInfoTb::getId, id).eq(TaskInstanceInfoTb::getStatus, TaskStatusEnum.Running.getCode())
.eq(TaskInstanceInfoTb::getId, id) .orderByDesc(TaskInstanceInfoTb::getId).one();
.eq(TaskInstanceInfoTb::getStatus, TaskStatusEnum.Running.getCode())
.orderByDesc(TaskInstanceInfoTb::getId)
.one();
} }
@Override @Override
@@ -83,25 +80,15 @@ public class TaskInstanceInfoServiceImpl extends ServiceImpl<TaskInstanceInfoMap
@Override @Override
public TaskInstanceInfoTb getLastRunningInstance(String contextName, String language, String envAlias, String changeType) { public TaskInstanceInfoTb getLastRunningInstance(String contextName, String language, String envAlias, String changeType) {
return lambdaQuery() return lambdaQuery().eq(TaskInstanceInfoTb::getContextName, contextName).eq(TaskInstanceInfoTb::getLanguage, language)
.eq(TaskInstanceInfoTb::getContextName, contextName) .eq(TaskInstanceInfoTb::getEnvAlias, envAlias).eq(TaskInstanceInfoTb::getChangeType, changeType)
.eq(TaskInstanceInfoTb::getLanguage, language) .eq(TaskInstanceInfoTb::getStatus, TaskStatusEnum.Running.getCode()).orderByDesc(TaskInstanceInfoTb::getId).one();
.eq(TaskInstanceInfoTb::getEnvAlias, envAlias)
.eq(TaskInstanceInfoTb::getChangeType, changeType)
.eq(TaskInstanceInfoTb::getStatus, TaskStatusEnum.Running.getCode())
.orderByDesc(TaskInstanceInfoTb::getId)
.one();
} }
@Override @Override
public TaskInstanceInfoTb getLastHistoryInstance(String contextName, String language, String envAlias, String changeType) { public TaskInstanceInfoTb getLastHistoryInstance(String contextName, String language, String envAlias, String changeType) {
return lambdaQuery() return lambdaQuery().eq(TaskInstanceInfoTb::getContextName, contextName).eq(TaskInstanceInfoTb::getLanguage, language)
.eq(TaskInstanceInfoTb::getContextName, contextName) .eq(TaskInstanceInfoTb::getEnvAlias, envAlias).eq(TaskInstanceInfoTb::getChangeType, changeType).orderByDesc(TaskInstanceInfoTb::getId)
.eq(TaskInstanceInfoTb::getLanguage, language) .last("LIMIT 1").one();
.eq(TaskInstanceInfoTb::getEnvAlias, envAlias)
.eq(TaskInstanceInfoTb::getChangeType, changeType)
.orderByDesc(TaskInstanceInfoTb::getId)
.last("LIMIT 1")
.one();
} }
} }
@@ -36,7 +36,8 @@ import java.util.List;
* @since 2025-09-28 * @since 2025-09-28
*/ */
@Service @Service
public class TaskInstanceStepDetailServiceImpl extends ServiceImpl<TaskInstanceStepDetailMapper, TaskInstanceStepDetailTb> implements TaskInstanceStepDetailService { public class TaskInstanceStepDetailServiceImpl extends ServiceImpl<TaskInstanceStepDetailMapper, TaskInstanceStepDetailTb>
implements TaskInstanceStepDetailService {
@Override @Override
public void success(Long instanceDetailId, String stepDesc) { public void success(Long instanceDetailId, String stepDesc) {
@@ -62,8 +63,6 @@ public class TaskInstanceStepDetailServiceImpl extends ServiceImpl<TaskInstanceS
if (CollUtil.isEmpty(instanceDetailIds)) { if (CollUtil.isEmpty(instanceDetailIds)) {
return; return;
} }
remove(new LambdaQueryWrapper<TaskInstanceStepDetailTb>() remove(new LambdaQueryWrapper<TaskInstanceStepDetailTb>().in(TaskInstanceStepDetailTb::getInstanceDetailId, instanceDetailIds));
.in(TaskInstanceStepDetailTb::getInstanceDetailId, instanceDetailIds)
);
} }
} }
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent> <parent>
<artifactId>cutejava</artifactId> <artifactId>cutejava</artifactId>
@@ -26,7 +26,6 @@ import java.net.UnknownHostException;
@EnableCaching @EnableCaching
@SpringBootApplication @SpringBootApplication
public class AppRun extends BootApplication { public class AppRun extends BootApplication {
public static void main(String[] args) throws UnknownHostException { public static void main(String[] args) throws UnknownHostException {
SpringApplication springApplication = new SpringApplication(AppRun.class); SpringApplication springApplication = new SpringApplication(AppRun.class);
inited(springApplication.run(args)); inited(springApplication.run(args));
@@ -41,11 +41,6 @@ public class GenCode {
} }
private static void genTaskCode(CsMpCmdGenUtil generator) { private static void genTaskCode(CsMpCmdGenUtil generator) {
generator.gen("task", "", List.of( generator.gen("task", "", List.of("task_instance_info", "task_instance_detail", "task_template_info", "task_instance_step_detail"));
"task_instance_info",
"task_instance_detail",
"task_template_info",
"task_instance_step_detail"
));
} }
} }
@@ -61,8 +61,8 @@ spring:
# sql监控 # sql监控
driverClassName: com.p6spy.engine.spy.P6SpyDriver driverClassName: com.p6spy.engine.spy.P6SpyDriver
url: jdbc:p6spy:mysql://192.168.100.128:23306/cutejava?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true url: jdbc:p6spy:mysql://192.168.100.128:23306/cutejava?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
# driverClassName: com.mysql.cj.jdbc.Driver # driverClassName: com.mysql.cj.jdbc.Driver
# url: jdbc:mysql://192.168.100.128:23306/cutejava?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true # url: jdbc:mysql://192.168.100.128:23306/cutejava?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
username: root username: root
password: kd123456 password: kd123456
# 初始连接数,建议设置为与最小空闲连接数相同 # 初始连接数,建议设置为与最小空闲连接数相同
@@ -1,10 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds" debug="false"> <configuration scan="true" scanPeriod="30 seconds" debug="false">
<contextName>CuteJava</contextName> <contextName>CuteJava</contextName>
<property name="log.name" value="cutejava" /> <property name="log.name" value="cutejava"/>
<property name="log.home" value="c:/logs" /> <property name="log.home" value="c:/logs"/>
<property name="log.charset" value="utf-8"/> <property name="log.charset" value="utf-8"/>
<property name="log.pattern" value="%red(%contextName) - %red(%d{yyyy-MM-dd HH:mm:ss.SSS}) - %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}) - %msg%n"/> <property name="log.pattern"
value="%red(%contextName) - %red(%d{yyyy-MM-dd HH:mm:ss.SSS}) - %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}) - %msg%n"/>
<!-- Spring 日志级别控制 --> <!-- Spring 日志级别控制 -->
<logger name="org.springframework" level="warn"/> <logger name="org.springframework" level="warn"/>
@@ -38,6 +39,6 @@
<!--普通日志输出到控制台--> <!--普通日志输出到控制台-->
<appender-ref ref="CONSOLE"/> <appender-ref ref="CONSOLE"/>
<!--普通日志输出到文件--> <!--普通日志输出到文件-->
<appender-ref ref="FILE" /> <appender-ref ref="FILE"/>
</root> </root>
</configuration> </configuration>
@@ -41,14 +41,10 @@ public class MyBatisMapperTests {
systemUserMapper.selectList(new LambdaQueryWrapper<SystemUserTb>().gt(SystemUserTb::getCreateTime, DateTime.now())); systemUserMapper.selectList(new LambdaQueryWrapper<SystemUserTb>().gt(SystemUserTb::getCreateTime, DateTime.now()));
// SELECT * FROM system_user WHERE (create_time > '2025-08-18 14:53:46'); // SELECT * FROM system_user WHERE (create_time > '2025-08-18 14:53:46');
systemUserMapper.selectList(new LambdaQueryWrapper<SystemUserTb>().gt( systemUserMapper.selectList(new LambdaQueryWrapper<SystemUserTb>().gt(SystemUserTb::getCreateTime, DateUtil.formatDateTime(new Date())));
SystemUserTb::getCreateTime,
DateUtil.formatDateTime(new Date())));
// SELECT * FROM system_user WHERE (create_time > '2025-08-18'); // SELECT * FROM system_user WHERE (create_time > '2025-08-18');
systemUserMapper.selectList(new LambdaQueryWrapper<SystemUserTb>().gt( systemUserMapper.selectList(new LambdaQueryWrapper<SystemUserTb>().gt(SystemUserTb::getCreateTime, DateUtil.formatDate(new Date())));
SystemUserTb::getCreateTime,
DateUtil.formatDate(new Date())));
} }
} }
@@ -26,7 +26,7 @@ public class CsFileUtilTest {
@Test @Test
public void testToFile() { public void testToFile() {
long retval = toFile(new MockMultipartFile("foo", (byte[]) null)).getTotalSpace(); long retval = toFile(new MockMultipartFile("foo", (byte[])null)).getTotalSpace();
assertEquals(500695072768L, retval); assertEquals(500695072768L, retval);
} }
+1 -1
View File
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>cn.odboy</groupId> <groupId>cn.odboy</groupId>
+1 -1
View File
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent> <parent>
<artifactId>cutejava</artifactId> <artifactId>cutejava</artifactId>
@@ -42,14 +42,6 @@ public class CsBaseUserCreateTimeTb extends CsObject {
@ApiModelProperty(value = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true) @ApiModelProperty(value = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true)
private Date createTime; private Date createTime;
/* 分组校验 */
public @interface Create {
}
/* 分组校验 */
public @interface Update {
}
@Override @Override
public String toString() { public String toString() {
ToStringBuilder builder = new ToStringBuilder(this); ToStringBuilder builder = new ToStringBuilder(this);
@@ -64,4 +56,12 @@ public class CsBaseUserCreateTimeTb extends CsObject {
} }
return builder.toString(); return builder.toString();
} }
/* 分组校验 */
public @interface Create {
}
/* 分组校验 */
public @interface Update {
}
} }
@@ -52,14 +52,6 @@ public class CsBaseUserTimeTb extends CsObject {
@ApiModelProperty(value = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true) @ApiModelProperty(value = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true)
private Date updateTime; private Date updateTime;
/* 分组校验 */
public @interface Create {
}
/* 分组校验 */
public @interface Update {
}
@Override @Override
public String toString() { public String toString() {
ToStringBuilder builder = new ToStringBuilder(this); ToStringBuilder builder = new ToStringBuilder(this);
@@ -74,4 +66,12 @@ public class CsBaseUserTimeTb extends CsObject {
} }
return builder.toString(); return builder.toString();
} }
/* 分组校验 */
public @interface Create {
}
/* 分组校验 */
public @interface Update {
}
} }
@@ -23,11 +23,7 @@ import lombok.Getter;
@AllArgsConstructor @AllArgsConstructor
public enum FileTypeEnum { public enum FileTypeEnum {
/* 文件类型 */ /* 文件类型 */
IMAGE("image", "图片"), IMAGE("image", "图片"), DOC("doc", "文档"), VOICE("voice", "音频"), VIDEO("video", "视频"), OTHER("other", "其他");
DOC("doc", "文档"),
VOICE("voice", "音频"),
VIDEO("video", "视频"),
OTHER("other", "其他");
private final String code; private final String code;
private final String description; private final String description;
@@ -33,22 +33,17 @@ import java.net.UnknownHostException;
*/ */
@Slf4j @Slf4j
public class BootApplication { public class BootApplication {
@Bean
public CsSpringBeanHolder springBeanHolder() {
return new CsSpringBeanHolder();
}
protected static void inited(ConfigurableApplicationContext application) throws UnknownHostException { protected static void inited(ConfigurableApplicationContext application) throws UnknownHostException {
Environment env = application.getEnvironment(); Environment env = application.getEnvironment();
String ip = InetAddress.getLocalHost().getHostAddress(); String ip = InetAddress.getLocalHost().getHostAddress();
String port = env.getProperty("server.port"); String port = env.getProperty("server.port");
String path = StrUtil.isEmpty(env.getProperty("config.servlet.context-path")) ? String path = StrUtil.isEmpty(env.getProperty("config.servlet.context-path")) ? "" : env.getProperty("config.servlet.context-path");
"" :
env.getProperty("config.servlet.context-path");
log.info( log.info(
"\n----------------------------------------------------------\n\t" + "\n----------------------------------------------------------\n\t" + "Application is running! Access URLs:\n\t" + "Local: \t\thttp://localhost:" + port + path + "/\n\t" + "External: \thttp://" + ip + ":" + port + path + "/\n\t" + "Swagger文档: \thttp://" + ip + ":" + port + path + "/doc.html\n" + "----------------------------------------------------------");
"Application is running! Access URLs:\n\t" + "Local: \t\thttp://localhost:" + port + path + "/\n\t" + }
"External: \thttp://" + ip + ":" + port + path + "/\n\t" + "Swagger文档: \thttp://" + ip + ":" + port +
path + "/doc.html\n" + "----------------------------------------------------------"); @Bean
public CsSpringBeanHolder springBeanHolder() {
return new CsSpringBeanHolder();
} }
} }
@@ -29,6 +29,6 @@ import java.util.Objects;
public class CsRequestHolder { public class CsRequestHolder {
public static HttpServletRequest getHttpServletRequest() { public static HttpServletRequest getHttpServletRequest() {
return ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); return ((ServletRequestAttributes)Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
} }
} }
@@ -32,8 +32,8 @@ import java.util.List;
@SuppressWarnings({"unchecked", "all"}) @SuppressWarnings({"unchecked", "all"})
public class CsSpringBeanHolder implements ApplicationContextAware, DisposableBean { public class CsSpringBeanHolder implements ApplicationContextAware, DisposableBean {
private static ApplicationContext applicationContext = null;
private static final List<CallBack> CALL_BACKS = new ArrayList<>(); private static final List<CallBack> CALL_BACKS = new ArrayList<>();
private static ApplicationContext applicationContext = null;
private static boolean addCallback = true; private static boolean addCallback = true;
/** /**
@@ -55,7 +55,7 @@ public class CsSpringBeanHolder implements ApplicationContextAware, DisposableBe
*/ */
public static <T> T getBean(String name) { public static <T> T getBean(String name) {
assertContextInjected(); assertContextInjected();
return (T) applicationContext.getBean(name); return (T)applicationContext.getBean(name);
} }
/** /**
@@ -110,8 +110,7 @@ public class CsSpringBeanHolder implements ApplicationContextAware, DisposableBe
private static void assertContextInjected() { private static void assertContextInjected() {
if (applicationContext == null) { if (applicationContext == null) {
throw new IllegalStateException( throw new IllegalStateException(
"applicaitonContext属性未注入, 请在applicationContext" + "applicaitonContext属性未注入, 请在applicationContext" + ".xml中定义SpringContextHolder或在SpringBoot启动类中注册SpringContextHolder.");
".xml中定义SpringContextHolder或在SpringBoot启动类中注册SpringContextHolder.");
} }
} }
@@ -123,6 +122,15 @@ public class CsSpringBeanHolder implements ApplicationContextAware, DisposableBe
applicationContext = null; applicationContext = null;
} }
/**
* 获取 @Service 的所有 bean 名称
*
* @return /
*/
public static List<String> getAllServiceBeanName() {
return new ArrayList<>(Arrays.asList(applicationContext.getBeanNamesForAnnotation(Service.class)));
}
@Override @Override
public void destroy() { public void destroy() {
CsSpringBeanHolder.clearHolder(); CsSpringBeanHolder.clearHolder();
@@ -131,8 +139,7 @@ public class CsSpringBeanHolder implements ApplicationContextAware, DisposableBe
@Override @Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if (CsSpringBeanHolder.applicationContext != null) { if (CsSpringBeanHolder.applicationContext != null) {
log.warn("SpringContextHolder中的ApplicationContext被覆盖, 原有ApplicationContext为:" + log.warn("SpringContextHolder中的ApplicationContext被覆盖, 原有ApplicationContext为:" + CsSpringBeanHolder.applicationContext);
CsSpringBeanHolder.applicationContext);
} }
CsSpringBeanHolder.applicationContext = applicationContext; CsSpringBeanHolder.applicationContext = applicationContext;
if (addCallback) { if (addCallback) {
@@ -144,15 +151,6 @@ public class CsSpringBeanHolder implements ApplicationContextAware, DisposableBe
CsSpringBeanHolder.addCallback = false; CsSpringBeanHolder.addCallback = false;
} }
/**
* 获取 @Service 的所有 bean 名称
*
* @return /
*/
public static List<String> getAllServiceBeanName() {
return new ArrayList<>(Arrays.asList(applicationContext.getBeanNamesForAnnotation(Service.class)));
}
interface CallBack { interface CallBack {
/** /**

Some files were not shown because too many files have changed in this diff Show More