style(framework): 优化代码格式与注解配置
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
+8
-8
@@ -42,14 +42,6 @@ public class CsBaseUserCreateTimeTb extends CsObject {
|
|||||||
@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 {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+8
-8
@@ -52,14 +52,6 @@ public class CsBaseUserTimeTb extends CsObject {
|
|||||||
@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 {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-5
@@ -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;
|
||||||
|
|||||||
+5
-5
@@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+12
-14
@@ -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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -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 {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+1
@@ -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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 全局异常处理
|
* 全局异常处理
|
||||||
*
|
*
|
||||||
|
|||||||
+12
-24
@@ -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
|
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-9
@@ -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;
|
||||||
|
|||||||
+2
-1
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+1
-2
@@ -62,8 +62,7 @@ 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")) {
|
||||||
|
|||||||
+1
-5
@@ -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<>();
|
||||||
|
|||||||
+68
-95
@@ -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")
|
|
||||||
.mapper("dal.mysql")
|
|
||||||
.service("service")
|
|
||||||
.serviceImpl("service.impl")
|
|
||||||
.controller("controller")
|
|
||||||
.pathInfo(Collections.singletonMap(OutputFile.xml, mapperPath));
|
.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);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
+13
-13
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-4
@@ -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;
|
||||||
|
|||||||
+1
-4
@@ -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);
|
||||||
|
|
||||||
|
|||||||
+1
-4
@@ -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<>();
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-2
@@ -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)) {
|
||||||
|
|||||||
+1
-3
@@ -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,8 +204,7 @@ 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());
|
||||||
|
|||||||
+1
-7
@@ -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 序列化方式
|
||||||
|
|||||||
+2
-8
@@ -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());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
-1
@@ -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>> {
|
||||||
|
|||||||
+1
@@ -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 端点对象
|
||||||
*
|
*
|
||||||
|
|||||||
+5
-16
@@ -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));
|
||||||
}
|
}
|
||||||
@@ -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");
|
||||||
|
|||||||
+52
-61
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-10
@@ -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.*;
|
||||||
|
|
||||||
@@ -190,8 +189,7 @@ 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;
|
||||||
@@ -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()) {
|
||||||
|
|||||||
+1
-3
@@ -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>
|
||||||
|
|||||||
-1
@@ -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 = "系统:部门管理")
|
||||||
|
|||||||
+1
-3
@@ -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) {
|
||||||
|
|||||||
+4
-5
@@ -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("角色权限不足");
|
||||||
|
|||||||
+1
-5
@@ -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 "";
|
||||||
|
|
||||||
|
|||||||
-1
@@ -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;
|
||||||
|
|||||||
-1
@@ -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;
|
||||||
|
|||||||
-1
@@ -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 {
|
||||||
|
|||||||
+2
-2
@@ -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() {
|
||||||
|
|||||||
+2
-1
@@ -41,7 +41,8 @@ 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);
|
||||||
|
|
||||||
|
|||||||
+8
-3
@@ -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);
|
||||||
|
|||||||
-1
@@ -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
|
||||||
|
|||||||
+2
-4
@@ -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) {
|
||||||
|
|||||||
+3
-8
@@ -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]))
|
|
||||||
.setTitle(sendEmailRequest.getSubject())
|
|
||||||
.setContent(content)
|
|
||||||
.setHtml(true)
|
.setHtml(true)
|
||||||
// 关闭session
|
// 关闭session
|
||||||
.setUseGlobalSession(false)
|
.setUseGlobalSession(false).send();
|
||||||
.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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+3
-7
@@ -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();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-5
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-11
@@ -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));
|
||||||
|
|||||||
+6
-14
@@ -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) {
|
||||||
|
|||||||
+2
-5
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
-1
@@ -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 {
|
||||||
|
|||||||
+1
-3
@@ -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>
|
||||||
|
|||||||
+6
-16
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-3
@@ -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;
|
||||||
|
|
||||||
|
|||||||
+4
-2
@@ -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);
|
||||||
|
|||||||
+8
-4
@@ -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();
|
||||||
|
|||||||
+6
-3
@@ -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);
|
||||||
|
|||||||
-1
@@ -27,7 +27,6 @@ import lombok.ToString;
|
|||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
* 任务实例步骤明细
|
* 任务实例步骤明细
|
||||||
|
|||||||
-1
@@ -25,7 +25,6 @@ import lombok.Getter;
|
|||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
import lombok.ToString;
|
import lombok.ToString;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
* 任务模板
|
* 任务模板
|
||||||
|
|||||||
+2
-6
@@ -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
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|||||||
+8
-21
@@ -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();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-4
@@ -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"
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,8 @@
|
|||||||
<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"/>
|
||||||
|
|||||||
+2
-6
@@ -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())));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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,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;
|
||||||
|
|||||||
+7
-12
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+12
-14
@@ -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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -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 {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+43
-53
@@ -58,25 +58,55 @@ public class SwaggerConfig {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private ApplicationContext applicationContext;
|
private ApplicationContext applicationContext;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 解决Springfox与SpringBoot集成后, WebMvcRequestHandlerProvider和WebFluxRequestHandlerProvider冲突问题
|
||||||
|
*
|
||||||
|
* @return /
|
||||||
|
*/
|
||||||
|
@Bean
|
||||||
|
@SuppressWarnings({"unchecked", "all"})
|
||||||
|
public static BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() {
|
||||||
|
return new BeanPostProcessor() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
|
||||||
|
if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) {
|
||||||
|
customizeSpringfoxHandlerMappings(getHandlerMappings(bean));
|
||||||
|
}
|
||||||
|
return bean;
|
||||||
|
}
|
||||||
|
|
||||||
|
private <T extends RequestMappingInfoHandlerMapping> void customizeSpringfoxHandlerMappings(List<T> mappings) {
|
||||||
|
List<T> filteredMappings = mappings.stream().filter(mapping -> mapping.getPatternParser() == null).collect(Collectors.toList());
|
||||||
|
mappings.clear();
|
||||||
|
mappings.addAll(filteredMappings);
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<RequestMappingInfoHandlerMapping> getHandlerMappings(Object bean) {
|
||||||
|
Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings");
|
||||||
|
if (field != null) {
|
||||||
|
field.setAccessible(true);
|
||||||
|
try {
|
||||||
|
return (List<RequestMappingInfoHandlerMapping>)field.get(bean);
|
||||||
|
} catch (IllegalAccessException e) {
|
||||||
|
throw new IllegalStateException("Failed to access handlerMappings field", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public Docket createRestApi() {
|
public Docket createRestApi() {
|
||||||
return new Docket(DocumentationType.SWAGGER_2).enable(properties.getSwagger().getEnabled())
|
return new Docket(DocumentationType.SWAGGER_2).enable(properties.getSwagger().getEnabled()).pathMapping("/").apiInfo(apiInfo()).select()
|
||||||
.pathMapping("/")
|
.paths(PathSelectors.regex("^(?!/error).*")).paths(PathSelectors.any()).build()
|
||||||
.apiInfo(apiInfo())
|
|
||||||
.select()
|
|
||||||
.paths(PathSelectors.regex("^(?!/error).*"))
|
|
||||||
.paths(PathSelectors.any())
|
|
||||||
.build()
|
|
||||||
//添加登陆认证
|
//添加登陆认证
|
||||||
.securitySchemes(securitySchemes())
|
.securitySchemes(securitySchemes()).securityContexts(securityContexts());
|
||||||
.securityContexts(securityContexts());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private ApiInfo apiInfo() {
|
private ApiInfo apiInfo() {
|
||||||
return new ApiInfoBuilder().description("一个简单且易上手的自动化运维平台")
|
return new ApiInfoBuilder().description("一个简单且易上手的自动化运维平台").title("CuteJava 接口文档").version("1.4.1").build();
|
||||||
.title("CuteJava 接口文档")
|
|
||||||
.version("1.4.1")
|
|
||||||
.build();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<SecurityScheme> securitySchemes() {
|
private List<SecurityScheme> securitySchemes() {
|
||||||
@@ -111,44 +141,4 @@ public class SwaggerConfig {
|
|||||||
securityReferences.add(new SecurityReference(SystemConst.HEADER_NAME, authorizationScopes));
|
securityReferences.add(new SecurityReference(SystemConst.HEADER_NAME, authorizationScopes));
|
||||||
return securityReferences;
|
return securityReferences;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 解决Springfox与SpringBoot集成后, WebMvcRequestHandlerProvider和WebFluxRequestHandlerProvider冲突问题
|
|
||||||
*
|
|
||||||
* @return /
|
|
||||||
*/
|
|
||||||
@Bean
|
|
||||||
@SuppressWarnings({"unchecked", "all"})
|
|
||||||
public static BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() {
|
|
||||||
return new BeanPostProcessor() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
|
|
||||||
if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) {
|
|
||||||
customizeSpringfoxHandlerMappings(getHandlerMappings(bean));
|
|
||||||
}
|
|
||||||
return bean;
|
|
||||||
}
|
|
||||||
|
|
||||||
private <T extends RequestMappingInfoHandlerMapping> void customizeSpringfoxHandlerMappings(List<T> mappings) {
|
|
||||||
List<T> filteredMappings =
|
|
||||||
mappings.stream().filter(mapping -> mapping.getPatternParser() == null).collect(Collectors.toList());
|
|
||||||
mappings.clear();
|
|
||||||
mappings.addAll(filteredMappings);
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<RequestMappingInfoHandlerMapping> getHandlerMappings(Object bean) {
|
|
||||||
Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings");
|
|
||||||
if (field != null) {
|
|
||||||
field.setAccessible(true);
|
|
||||||
try {
|
|
||||||
return (List<RequestMappingInfoHandlerMapping>) field.get(bean);
|
|
||||||
} catch (IllegalAccessException e) {
|
|
||||||
throw new IllegalStateException("Failed to access handlerMappings field", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return Collections.emptyList();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
+1
@@ -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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 全局异常处理
|
* 全局异常处理
|
||||||
*
|
*
|
||||||
|
|||||||
+12
-24
@@ -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
|
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-9
@@ -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;
|
||||||
|
|||||||
+2
-1
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+1
-2
@@ -62,8 +62,7 @@ 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")) {
|
||||||
|
|||||||
+1
-5
@@ -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<>();
|
||||||
|
|||||||
+68
-95
@@ -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")
|
|
||||||
.mapper("dal.mysql")
|
|
||||||
.service("service")
|
|
||||||
.serviceImpl("service.impl")
|
|
||||||
.controller("controller")
|
|
||||||
.pathInfo(Collections.singletonMap(OutputFile.xml, mapperPath));
|
.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);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
+16
-25
@@ -78,11 +78,7 @@ public class CsMpQUtil {
|
|||||||
return StrUtil.toUnderlineCase(attributeName);
|
return StrUtil.toUnderlineCase(attributeName);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static <R> void handleWrapper(
|
private static <R> void handleWrapper(CsMpQuery q, QueryWrapper<R> queryWrapper, String attributeName, Object fieldVal) {
|
||||||
CsMpQuery q,
|
|
||||||
QueryWrapper<R> queryWrapper,
|
|
||||||
String attributeName,
|
|
||||||
Object fieldVal) {
|
|
||||||
switch (q.type()) {
|
switch (q.type()) {
|
||||||
case EQUAL:
|
case EQUAL:
|
||||||
queryWrapper.eq(attributeName, fieldVal);
|
queryWrapper.eq(attributeName, fieldVal);
|
||||||
@@ -128,11 +124,7 @@ public class CsMpQUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static <R> void handleInOrNotQuery(
|
private static <R> void handleInOrNotQuery(boolean b, QueryWrapper<R> queryWrapper, String attributeName, Object fieldVal) {
|
||||||
boolean b,
|
|
||||||
QueryWrapper<R> queryWrapper,
|
|
||||||
String attributeName,
|
|
||||||
Object fieldVal) {
|
|
||||||
Collection<?> wrapNotInVal = (Collection<?>)fieldVal;
|
Collection<?> wrapNotInVal = (Collection<?>)fieldVal;
|
||||||
if (CollectionUtil.isNotEmpty(wrapNotInVal)) {
|
if (CollectionUtil.isNotEmpty(wrapNotInVal)) {
|
||||||
Optional<?> anyValOptional = wrapNotInVal.stream().findAny();
|
Optional<?> anyValOptional = wrapNotInVal.stream().findAny();
|
||||||
@@ -180,8 +172,7 @@ public class CsMpQUtil {
|
|||||||
* @param <R> /
|
* @param <R> /
|
||||||
*/
|
*/
|
||||||
private static <R> void handleBlurryQuery(QueryWrapper<R> queryWrapper, String blurry, Object fieldVal) {
|
private static <R> void handleBlurryQuery(QueryWrapper<R> queryWrapper, String blurry, Object fieldVal) {
|
||||||
List<String> blurryList =
|
List<String> blurryList = Arrays.stream(blurry.split(",")).filter(StrUtil::isNotBlank).distinct().collect(Collectors.toList());
|
||||||
Arrays.stream(blurry.split(",")).filter(StrUtil::isNotBlank).distinct().collect(Collectors.toList());
|
|
||||||
queryWrapper.and(wrapper -> {
|
queryWrapper.and(wrapper -> {
|
||||||
for (String blurryItem : blurryList) {
|
for (String blurryItem : blurryList) {
|
||||||
String column = StrUtil.toUnderlineCase(blurryItem);
|
String column = StrUtil.toUnderlineCase(blurryItem);
|
||||||
@@ -199,19 +190,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<TestDomain>();
|
QueryWrapper<TestDomain> query = new QueryWrapper<TestDomain>();
|
||||||
query.or(wrapper -> wrapper.eq("username", 1).or().eq("nickname", 2));
|
query.or(wrapper -> wrapper.eq("username", 1).or().eq("nickname", 2));
|
||||||
@@ -228,4 +206,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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-4
@@ -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;
|
||||||
|
|||||||
+1
-4
@@ -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);
|
||||||
|
|
||||||
|
|||||||
+1
-4
@@ -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<>();
|
||||||
}
|
}
|
||||||
|
|||||||
-1
@@ -20,7 +20,6 @@ import cn.hutool.core.util.StrUtil;
|
|||||||
import cn.odboy.base.CsObject;
|
import cn.odboy.base.CsObject;
|
||||||
import cn.odboy.constant.CaptchaCodeEnum;
|
import cn.odboy.constant.CaptchaCodeEnum;
|
||||||
import cn.odboy.framework.exception.BadRequestException;
|
import cn.odboy.framework.exception.BadRequestException;
|
||||||
import cn.odboy.util.CsStringUtil;
|
|
||||||
import com.wf.captcha.*;
|
import com.wf.captcha.*;
|
||||||
import com.wf.captcha.base.Captcha;
|
import com.wf.captcha.base.Captcha;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
|||||||
+1
-2
@@ -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)) {
|
||||||
|
|||||||
+1
-2
@@ -205,8 +205,7 @@ 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());
|
||||||
|
|||||||
+3
-8
@@ -54,13 +54,7 @@ public class RedisConfiguration extends CachingConfigurerSupport {
|
|||||||
* 自动识别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 序列化方式
|
||||||
@@ -69,7 +63,8 @@ public class RedisConfiguration extends CachingConfigurerSupport {
|
|||||||
public RedisCacheConfiguration redisCacheConfiguration() {
|
public RedisCacheConfiguration redisCacheConfiguration() {
|
||||||
FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class);
|
FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class);
|
||||||
RedisCacheConfiguration configuration = RedisCacheConfiguration.defaultCacheConfig();
|
RedisCacheConfiguration configuration = RedisCacheConfiguration.defaultCacheConfig();
|
||||||
configuration = configuration.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(fastJsonRedisSerializer)).entryTtl(Duration.ofHours(2));
|
configuration = configuration.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(fastJsonRedisSerializer))
|
||||||
|
.entryTtl(Duration.ofHours(2));
|
||||||
return configuration;
|
return configuration;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-8
@@ -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());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
-1
@@ -31,7 +31,6 @@ import org.springframework.http.converter.StringHttpMessageConverter;
|
|||||||
import org.springframework.web.cors.CorsConfiguration;
|
import org.springframework.web.cors.CorsConfiguration;
|
||||||
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
|
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
|
||||||
import org.springframework.web.filter.CorsFilter;
|
import org.springframework.web.filter.CorsFilter;
|
||||||
|
|
||||||
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
|
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
|
||||||
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
|
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
|
||||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
||||||
|
|||||||
+1
@@ -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 端点对象
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -42,8 +42,7 @@ public class CsAnonTagUtil {
|
|||||||
* @return /
|
* @return /
|
||||||
*/
|
*/
|
||||||
public static Map<String, Set<String>> getAnonymousUrl(final ApplicationContext applicationContext) {
|
public static Map<String, Set<String>> getAnonymousUrl(final ApplicationContext applicationContext) {
|
||||||
RequestMappingHandlerMapping requestMappingHandlerMapping =
|
RequestMappingHandlerMapping requestMappingHandlerMapping = (RequestMappingHandlerMapping)applicationContext.getBean("requestMappingHandlerMapping");
|
||||||
(RequestMappingHandlerMapping) applicationContext.getBean("requestMappingHandlerMapping");
|
|
||||||
Map<RequestMappingInfo, HandlerMethod> handlerMethodMap = requestMappingHandlerMapping.getHandlerMethods();
|
Map<RequestMappingInfo, HandlerMethod> handlerMethodMap = requestMappingHandlerMapping.getHandlerMethods();
|
||||||
Map<String, java.util.Set<String>> anonymousUrls = new HashMap<>(8);
|
Map<String, java.util.Set<String>> anonymousUrls = new HashMap<>(8);
|
||||||
// 获取匿名标记
|
// 获取匿名标记
|
||||||
@@ -58,9 +57,7 @@ public class CsAnonTagUtil {
|
|||||||
AnonymousAccess anonymousAccess = handlerMethod.getMethodAnnotation(AnonymousAccess.class);
|
AnonymousAccess anonymousAccess = handlerMethod.getMethodAnnotation(AnonymousAccess.class);
|
||||||
if (null != anonymousAccess && infoEntry.getKey() != null) {
|
if (null != anonymousAccess && infoEntry.getKey() != null) {
|
||||||
List<RequestMethod> requestMethods = new ArrayList<>(infoEntry.getKey().getMethodsCondition().getMethods());
|
List<RequestMethod> requestMethods = new ArrayList<>(infoEntry.getKey().getMethodsCondition().getMethods());
|
||||||
RequestMethodEnum request = RequestMethodEnum.find(requestMethods.isEmpty() ?
|
RequestMethodEnum request = RequestMethodEnum.find(requestMethods.isEmpty() ? RequestMethodEnum.ALL.getType() : requestMethods.get(0).name());
|
||||||
RequestMethodEnum.ALL.getType() :
|
|
||||||
requestMethods.get(0).name());
|
|
||||||
PatternsRequestCondition patternsCondition = infoEntry.getKey().getPatternsCondition();
|
PatternsRequestCondition patternsCondition = infoEntry.getKey().getPatternsCondition();
|
||||||
if (patternsCondition != null) {
|
if (patternsCondition != null) {
|
||||||
switch (Objects.requireNonNull(request)) {
|
switch (Objects.requireNonNull(request)) {
|
||||||
|
|||||||
@@ -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)).collect(Collectors.toList());
|
return data.stream().sorted(Comparator.comparing(keyExtractor)).collect(Collectors.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()).collect(Collectors.toList());
|
return data.stream().sorted(Comparator.comparing(keyExtractor).reversed()).collect(Collectors.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));
|
||||||
}
|
}
|
||||||
@@ -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");
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -191,8 +191,7 @@ public final class CsFileUtil extends cn.hutool.core.io.FileUtil {
|
|||||||
if (value instanceof String) {
|
if (value instanceof String) {
|
||||||
String strValue = (String)value;
|
String strValue = (String)value;
|
||||||
// 检查并处理以特殊字符开头的值
|
// 检查并处理以特殊字符开头的值
|
||||||
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;
|
||||||
@@ -325,11 +324,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;
|
||||||
@@ -386,8 +381,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()) {
|
||||||
|
|||||||
@@ -40,11 +40,7 @@ public final class CsListUtil {
|
|||||||
* @param classifier 对象T属性表达式, 比如: User::getName
|
* @param classifier 对象T属性表达式, 比如: User::getName
|
||||||
*/
|
*/
|
||||||
public static <T, K> List<T> distinctByArgs(List<T> items, Function<? super T, ? extends K> classifier) {
|
public static <T, K> List<T> distinctByArgs(List<T> items, Function<? super T, ? extends K> classifier) {
|
||||||
return items.stream()
|
return items.stream().collect(Collectors.groupingBy(classifier)).values().stream().map(monitorItem -> monitorItem.iterator().next())
|
||||||
.collect(Collectors.groupingBy(classifier))
|
|
||||||
.values()
|
|
||||||
.stream()
|
|
||||||
.map(monitorItem -> monitorItem.iterator().next())
|
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
-1
@@ -34,7 +34,6 @@ import cn.odboy.system.framework.permission.core.CsSecurityHelper;
|
|||||||
import cn.odboy.system.framework.permission.core.handler.TokenProvider;
|
import cn.odboy.system.framework.permission.core.handler.TokenProvider;
|
||||||
import cn.odboy.system.framework.permission.core.handler.UserDetailsHandler;
|
import cn.odboy.system.framework.permission.core.handler.UserDetailsHandler;
|
||||||
import cn.odboy.util.CsRsaEncryptUtil;
|
import cn.odboy.util.CsRsaEncryptUtil;
|
||||||
import cn.odboy.util.CsStringUtil;
|
|
||||||
import com.wf.captcha.base.Captcha;
|
import com.wf.captcha.base.Captcha;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
import io.swagger.annotations.ApiOperation;
|
import io.swagger.annotations.ApiOperation;
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user