!3 chore(config): 更新RSA私钥和Base64密钥配置

Merge pull request !3 from Odboy/dev
This commit is contained in:
2026-01-14 04:47:22 +00:00
committed by Gitee
82 changed files with 268 additions and 401 deletions
+17 -5
View File
@@ -19,6 +19,8 @@ export default {
url: '',
// 查询数据的参数
params: {},
// 是否自定义参数
isCustomParams: false,
// 待查询的对象
query: {},
// 等待时间
@@ -76,11 +78,21 @@ export default {
Object.keys(this.params).length !== 0 && Object.keys(this.params).forEach(item => {
if (this.params[item] === null || this.params[item] === '') this.params[item] = undefined
})
return {
page: this.page,
size: this.size,
...this.query,
...this.params
if (this.isCustomParams) {
return {
page: this.page,
size: this.size,
args: {
...this.params
}
}
} else {
return {
page: this.page,
size: this.size,
...this.query,
...this.params
}
}
},
// 改变页码
@@ -73,7 +73,7 @@
<el-pagination
:total="total"
:current-page="page"
:page-size="6"
:page-size="size"
style="margin-top:8px;"
layout="total, prev, pager, next"
@size-change="sizeChange"
@@ -110,7 +110,13 @@ export default {
// 获取数据前设置好接口地址
beforeInit() {
this.url = 'api/quartzJob/searchQuartzLog'
this.size = 6
this.page = 1
this.isCustomParams = true
this.params = {
jobName: this.query.jobName,
createTime: this.query.createTime,
isSuccess: this.query.isSuccess
}
return true
},
// 异常详情
@@ -151,7 +151,7 @@
</template>
<script>
import crudRoles, {getCurrentUserRoleLevel} from '@/api/system/role'
import crudRoles from '@/api/system/role'
import { searchDept, searchDeptTree } from '@/api/system/dept'
import { listChildMenuSetByMenuId, listMenuByPid } from '@/api/system/menu'
import CRUD, { crud, form, header, presenter } from '@crud/crud'
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.odboy.annotation;
import java.lang.annotation.Documented;
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.odboy.annotation;
import java.lang.annotation.Documented;
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.odboy.annotation;
import java.lang.annotation.Documented;
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.odboy.annotation;
import java.lang.annotation.Documented;
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.odboy.annotation;
import java.lang.annotation.Documented;
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.odboy.base;
import jakarta.validation.constraints.NotNull;
@@ -13,12 +13,11 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.odboy.base;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModelProperty;
import java.util.Date;
import lombok.EqualsAndHashCode;
import lombok.Getter;
@@ -29,8 +28,7 @@ import lombok.Setter;
@EqualsAndHashCode(callSuper = false)
public class KitBaseCreateTimeTb extends KitObject {
@Schema(name = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true)
@TableField(fill = FieldFill.INSERT)
private Date
createTime;
@ApiModelProperty(value = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true)
private Date createTime;
}
@@ -13,12 +13,11 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.odboy.base;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModelProperty;
import java.util.Date;
import lombok.EqualsAndHashCode;
import lombok.Getter;
@@ -30,11 +29,9 @@ import lombok.Setter;
public class KitBaseTimeTb extends KitObject {
@TableField(fill = FieldFill.INSERT)
@Schema(name = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true)
private Date
createTime;
@ApiModelProperty(value = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
@Schema(name = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true)
@ApiModelProperty(value = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true)
private Date updateTime;
}
@@ -13,12 +13,11 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.odboy.base;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModelProperty;
import java.util.Date;
import lombok.EqualsAndHashCode;
import lombok.Getter;
@@ -29,7 +28,7 @@ import lombok.Setter;
@EqualsAndHashCode(callSuper = false)
public class KitBaseUpdateTimeTb extends KitObject {
@Schema(name = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true)
@TableField(fill = FieldFill.INSERT_UPDATE)
@ApiModelProperty(value = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true)
private Date updateTime;
}
@@ -13,12 +13,11 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.odboy.base;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModelProperty;
import java.lang.reflect.Field;
import java.util.Date;
import lombok.EqualsAndHashCode;
@@ -34,13 +33,12 @@ public class KitBaseUserCreateTimeTb extends KitObject {
@CreatedBy
@TableField(fill = FieldFill.INSERT)
@Schema(name = "创建人", hidden = true)
private String createBy;
@ApiModelProperty(value = "创建人", hidden = true)
private String
createBy;
@TableField(fill = FieldFill.INSERT)
@Schema(name = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true)
private Date
createTime;
@ApiModelProperty(value = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true)
private Date createTime;
@Override
public String toString() {
@@ -13,13 +13,12 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.odboy.base;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModelProperty;
import java.util.Date;
import lombok.Getter;
import lombok.Setter;
@@ -38,21 +37,21 @@ public class KitBaseUserTimeLogicTb extends KitObject {
@CreatedBy
@TableField(value = "create_by", fill = FieldFill.INSERT)
@Schema(name = "创建人", hidden = true)
@ApiModelProperty(value = "创建人", hidden = true)
private String createBy;
@LastModifiedBy
@TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE)
@Schema(name = "更新人", hidden = true)
@ApiModelProperty(value = "更新人", hidden = true)
private String updateBy;
@TableField(value = "create_time", fill = FieldFill.INSERT)
@Schema(name = "创建时间", hidden = true)
private Date
createTime;
@ApiModelProperty(value = "创建时间", hidden = true)
private Date createTime;
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
@Schema(name = "更新时间", hidden = true)
@ApiModelProperty(value = "更新时间", hidden = true)
private Date updateTime;
@Schema(name = "数据有效性", hidden = true)
@ApiModelProperty(value = "数据有效性", hidden = true)
@TableLogic
@TableField("available")
private Integer available;
private Integer
available;
}
@@ -13,12 +13,11 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.odboy.base;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModelProperty;
import java.lang.reflect.Field;
import java.util.Date;
import lombok.EqualsAndHashCode;
@@ -35,22 +34,18 @@ public class KitBaseUserTimeTb extends KitObject {
@CreatedBy
@TableField(fill = FieldFill.INSERT)
@Schema(name = "创建人", hidden = true)
private String createBy;
@ApiModelProperty(value = "创建人", hidden = true)
private String
createBy;
@LastModifiedBy
@TableField(fill = FieldFill.INSERT_UPDATE)
@Schema(name = "更新人", hidden = true)
private String
updateBy;
@ApiModelProperty(value = "更新人", hidden = true)
private String updateBy;
@TableField(fill = FieldFill.INSERT)
@Schema(name = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true)
private Date
createTime;
@ApiModelProperty(value = "创建时间: yyyy-MM-dd HH:mm:ss", hidden = true)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
@Schema(name = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true)
@ApiModelProperty(value = "更新时间: yyyy-MM-dd HH:mm:ss", hidden = true)
private Date updateTime;
@Override
@@ -13,10 +13,8 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.odboy.base;
import java.io.Serial;
import java.io.Serializable;
/**
@@ -27,6 +25,5 @@ import java.io.Serializable;
*/
public class KitObject implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
}
@@ -13,13 +13,12 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.odboy.base;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@@ -37,11 +36,11 @@ public class KitPageArgs<T> implements Serializable {
@NotNull(message = "参数page不能为空")
@Min(value = 1, message = "参数page最小值为1")
@Schema(name = "页码", example = "1")
@ApiModelProperty(value = "页码", example = "1")
private Integer page;
@NotNull(message = "参数size不能为空")
@Min(value = 1, message = "参数size最小值为1")
@Schema(name = "每页数据量", example = "10")
@ApiModelProperty(value = "每页数据量", example = "10")
private Integer size;
private T args;
}
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.odboy.base;
import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.odboy.base;
import java.util.Map;
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.odboy.constant;
/**
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.odboy.constant;
import lombok.AllArgsConstructor;
@@ -24,7 +23,6 @@ import lombok.Getter;
public enum FileTypeEnum {
/* 文件类型 */
IMAGE("image", "图片"), DOC("doc", "文档"), VOICE("voice", "音频"), VIDEO("video", "视频"), OTHER("other", "其他");
private final String code;
private final String description;
}
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.odboy.constant;
import lombok.AllArgsConstructor;
@@ -22,37 +21,30 @@ import lombok.Getter;
@Getter
@AllArgsConstructor
public enum RequestMethodEnum {
/**
* 搜寻 @AnonymousGetMapping
*/
GET("GET"),
/**
* 搜寻 @AnonymousPostMapping
*/
POST("POST"),
/**
* 搜寻 @AnonymousPutMapping
*/
PUT("PUT"),
/**
* 搜寻 @AnonymousPatchMapping
*/
PATCH("PATCH"),
/**
* 搜寻 @AnonymousDeleteMapping
*/
DELETE("DELETE"),
/**
* 否则就是所有 Request 接口都放行
*/
ALL("All");
/**
* Request 类型
*/
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.odboy.constant;
/**
@@ -25,22 +24,18 @@ public interface SystemConst {
* win 系统
*/
String WIN = "win";
/**
* mac 系统
*/
String MAC = "mac";
/**
* 请求头名称
*/
String HEADER_NAME = "Authorization";
/**
* Token前缀
*/
String TOKEN_PREFIX = "Bearer";
/**
* 小数点
*/
@@ -51,4 +46,6 @@ public interface SystemConst {
String SYMBOL_AT = "@";
String PROPERTY_OS_NAME = "os.name";
String OS_NAME_WINDOWS = "Windows";
String CURRENT_APP_NAME = "cutejava";
String CURRENT_APP_TITLE = "CuteJava";
}
@@ -41,7 +41,7 @@ public class KitSpringBeanHolder implements ApplicationContextAware, DisposableB
*/
public synchronized static void addCallBacks(CallBack callBack) {
if (addCallback) {
KitSpringBeanHolder.CALL_BACKS.add(callBack);
CALL_BACKS.add(callBack);
} else {
log.warn("CallBack:{} 已无法添加!立即执行", callBack.getCallBackName());
callBack.executor();
@@ -116,7 +116,7 @@ public class KitSpringBeanHolder implements ApplicationContextAware, DisposableB
* 清除SpringContextHolder中的ApplicationContext为Null.
*/
private static void clearHolder() {
log.debug("清除SpringContextHolder中的ApplicationContext:" + applicationContext);
log.debug("清除SpringContextHolder中的ApplicationContext:{}", applicationContext);
applicationContext = null;
}
@@ -137,8 +137,7 @@ public class KitSpringBeanHolder implements ApplicationContextAware, DisposableB
@Override
public void setApplicationContext(@NonNull ApplicationContext applicationContext) throws BeansException {
if (KitSpringBeanHolder.applicationContext != null) {
log.warn("SpringContextHolder中的ApplicationContext被覆盖, 原有ApplicationContext为:" +
KitSpringBeanHolder.applicationContext);
log.warn("SpringContextHolder中的ApplicationContext被覆盖, 原有ApplicationContext为:{}", KitSpringBeanHolder.applicationContext);
}
KitSpringBeanHolder.applicationContext = applicationContext;
if (addCallback) {
@@ -179,7 +179,7 @@ public class KitMpQUtil {
*/
private static <R> void handleBlurryQuery(QueryWrapper<R> queryWrapper, String blurry, Object fieldVal) {
List<String> blurryList =
Arrays.stream(blurry.split(",")).filter(StrUtil::isNotBlank).distinct().collect(Collectors.toList());
Arrays.stream(blurry.split(",")).filter(StrUtil::isNotBlank).distinct().toList();
queryWrapper.and(wrapper -> {
for (String blurryItem : blurryList) {
String column = StrUtil.toUnderlineCase(blurryItem);
@@ -280,8 +280,7 @@ public class KitRedisHelper {
if (value == null) {
return null;
}
if (value instanceof List<?>) {
List<?> list = (List<?>) value;
if (value instanceof List<?> list) {
// 检查每个元素是否为指定类型
if (list.stream().allMatch(clazz::isInstance)) {
return list.stream().map(clazz::cast).collect(Collectors.toList());
@@ -18,7 +18,6 @@ package cn.odboy.framework.server.core;
import cn.hutool.core.util.StrUtil;
import cn.odboy.constant.SystemConst;
import cn.odboy.util.KitSystemUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
@@ -36,26 +35,24 @@ public class KitFileLocalUploadHelper {
private static final String PATH_WINDOWS = "C:\\${appName}\\file\\";
private static final String PATH_MAC = "/Users${username}/${appName}/file/";
private static final String PATH_LINUX = "/home/${appName}/file/";
@Value("${spring.application.name}")
private String appName;
public String getPath() {
String os = System.getProperty("os.name");
if (os == null) {
// 默认使用 Linux 路径作为兜底方案
return PATH_LINUX.replace("${appName}", appName);
return PATH_LINUX.replace("${appName}", SystemConst.CURRENT_APP_NAME);
}
String lowerOs = os.toLowerCase();
if (lowerOs.startsWith(SystemConst.WIN)) {
return PATH_WINDOWS.replace("${appName}", appName);
return PATH_WINDOWS.replace("${appName}", SystemConst.CURRENT_APP_NAME);
} else if (lowerOs.startsWith(SystemConst.MAC)) {
String currentUserName = KitSystemUtil.getCurrentUserName();
if (StrUtil.isBlank(currentUserName)) {
return PATH_MAC.replace("${appName}", appName).replace("${username}", "");
return PATH_MAC.replace("${appName}", SystemConst.CURRENT_APP_NAME).replace("${username}", "");
}
return PATH_MAC.replace("${appName}", appName).replace("${username}", currentUserName);
return PATH_MAC.replace("${appName}", SystemConst.CURRENT_APP_NAME).replace("${username}", currentUserName);
}
return PATH_LINUX.replace("${appName}", appName);
return PATH_LINUX.replace("${appName}", SystemConst.CURRENT_APP_NAME);
}
public int getAvatarMaxSize() {
@@ -48,7 +48,7 @@ public class KitAnonTagUtil {
RequestMappingHandlerMapping requestMappingHandlerMapping =
(RequestMappingHandlerMapping) applicationContext.getBean("requestMappingHandlerMapping");
Map<RequestMappingInfo, HandlerMethod> handlerMethodMap = requestMappingHandlerMapping.getHandlerMethods();
Map<String, Set<String>> anonymousUrls = new HashMap<>(8);
Map<String, java.util.Set<String>> anonymousUrls = new HashMap<>(8);
// 获取匿名标记
Set<String> get = new HashSet<>();
Set<String> post = new HashSet<>();
@@ -17,6 +17,7 @@ package cn.odboy.util;
import cn.hutool.core.collection.CollUtil;
import cn.odboy.base.KitSelectOptionVo;
import cn.odboy.framework.exception.BadRequestException;
import com.alibaba.fastjson2.JSON;
import java.lang.reflect.Field;
import java.math.BigDecimal;
@@ -39,7 +40,7 @@ import lombok.experimental.UtilityClass;
* @date 2022-11-09
*/
@UtilityClass
public final class KitCollUtil extends CollUtil {
public final class KitCollUtil extends cn.hutool.core.collection.CollUtil {
private static <T, K> Predicate<T> distinctPredicate(Function<? super T, ? extends K> keyMapper) {
Map<Object, Boolean> map = new HashMap<>(3);
@@ -28,9 +28,6 @@ import cn.hutool.poi.excel.ExcelUtil;
import cn.odboy.constant.FileTypeEnum;
import cn.odboy.constant.SystemConst;
import cn.odboy.framework.exception.BadRequestException;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
@@ -45,6 +42,9 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.util.IOUtils;
@@ -40,7 +40,7 @@ public final class KitListUtil {
*/
public static <T, K> List<T> distinctByArgs(List<T> items, Function<? super T, ? extends K> classifier) {
return items.stream().collect(Collectors.groupingBy(classifier)).values().stream()
.map(monitorItem -> monitorItem.iterator().next()).collect(Collectors.toList());
.map(List::getFirst).collect(Collectors.toList());
}
/**
@@ -77,9 +77,9 @@ public class SystemQuartzJobController {
@ApiOperation("查询定时任务执行日志")
@PostMapping(value = "/searchQuartzLog")
@PreAuthorize("@el.check('quartzJob:list')")
public ResponseEntity<KitPageResult<SystemQuartzLogTb>> queryQuartzJobLog(SystemQueryQuartzJobArgs args) {
Page<SystemQuartzLogTb> page = new Page<>(args.getPage(), args.getSize());
return ResponseEntity.ok(systemQuartzJobService.searchQuartzLogByArgs(args, page));
public ResponseEntity<KitPageResult<SystemQuartzLogTb>> queryQuartzJobLog(@Validated @RequestBody KitPageArgs<SystemQueryQuartzJobArgs> pageArgs) {
Page<SystemQuartzLogTb> page = new Page<>(pageArgs.getPage(), pageArgs.getSize());
return ResponseEntity.ok(systemQuartzJobService.searchQuartzLogByArgs(pageArgs.getArgs(), page));
}
@OperationLog
@@ -72,9 +72,8 @@ public class SystemRoleController {
@ApiOperation("查询角色")
@PostMapping(value = "/searchRole")
@PreAuthorize("@el.check('roles:list')")
public ResponseEntity<KitPageResult<SystemRoleVo>> queryRoleByArgs(
@Validated @RequestBody KitPageArgs<SystemQueryRoleArgs> pageArgs) {
Page<Object> page = new Page<>(pageArgs.getPage(), pageArgs.getSize());
public ResponseEntity<KitPageResult<SystemRoleVo>> queryRoleByArgs(@Validated @RequestBody KitPageArgs<SystemQueryRoleArgs> pageArgs) {
Page<SystemRoleTb> page = new Page<>(pageArgs.getPage(), pageArgs.getSize());
return ResponseEntity.ok(systemRoleService.searchRoleByArgs(pageArgs.getArgs(), page));
}
@@ -23,8 +23,4 @@ public class SystemQueryDictArgs {
@ApiModelProperty(value = "模糊查询")
private String blurry;
@ApiModelProperty(value = "页码", example = "1")
private Integer page = 1;
@ApiModelProperty(value = "每页数据量", example = "10")
private Integer size = 10;
}
@@ -31,8 +31,4 @@ public class SystemQueryJobArgs {
private Boolean enabled;
@ApiModelProperty(value = "创建时间")
private List<Date> createTime;
@ApiModelProperty(value = "页码", example = "1")
private Integer page = 1;
@ApiModelProperty(value = "每页数据量", example = "10")
private Integer size = 10;
}
@@ -29,8 +29,4 @@ public class SystemQueryQuartzJobArgs {
private Boolean isSuccess;
@ApiModelProperty(value = "创建时间")
private List<Date> createTime;
@ApiModelProperty(value = "页码", example = "1")
private Integer page = 1;
@ApiModelProperty(value = "每页数据量", example = "10")
private Integer size = 10;
}
@@ -27,10 +27,4 @@ public class SystemQueryRoleArgs {
private String blurry;
@ApiModelProperty(value = "创建时间")
private List<Date> createTime;
@ApiModelProperty(value = "页码", example = "1")
private Integer page = 1;
@ApiModelProperty(value = "每页数据量", example = "10")
private Integer size = 10;
@ApiModelProperty(value = "偏移量", hidden = true)
private long offset;
}
@@ -40,8 +40,4 @@ public class SystemQueryUserArgs extends KitObject {
private Long deptId;
@ApiModelProperty(value = "创建时间")
private List<Date> createTime;
@ApiModelProperty(value = "页码", example = "1")
private Integer page = 1;
@ApiModelProperty(value = "每页数据量", example = "10")
private Integer size = 10;
}
@@ -18,7 +18,6 @@ package cn.odboy.system.dal.mysql;
import cn.odboy.system.dal.dataobject.SystemDictTb;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
/**
@@ -29,10 +28,6 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SystemDictMapper extends BaseMapper<SystemDictTb> {
default List<SystemDictTb> listAll() {
return selectList(null);
}
default SystemDictTb getByName(String dictName) {
LambdaQueryWrapper<SystemDictTb> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SystemDictTb::getName, dictName);
@@ -43,8 +43,8 @@ public class BizLockAspect {
public Object around(ProceedingJoinPoint joinPoint, BizLock bizLock) throws Throwable {
// 解析SpEL表达式生成最终的lockKey
String lockKey = parseLockKey(joinPoint, bizLock);
Boolean success = redisHelper.setIfAbsent(lockKey, lockKey, bizLock.leaseTime(), bizLock.timeUnit());
if (success == null || !success) {
boolean success = redisHelper.setIfAbsent(lockKey, lockKey, bizLock.leaseTime(), bizLock.timeUnit());
if (!success) {
throw new BadRequestException(bizLock.errorMessage());
}
try {
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.odboy.system.framework.mybatisplus;
import cn.hutool.core.date.DateTime;
@@ -55,4 +54,3 @@ public class MpMetaObjectHandler implements MetaObjectHandler {
this.strictUpdateFill(metaObject, "updateBy", String.class, username);
}
}
@@ -27,8 +27,8 @@ import cn.odboy.util.KitBrowserUtil;
import cn.odboy.util.KitIPUtil;
import com.alibaba.fastjson2.JSON;
import io.swagger.annotations.ApiOperation;
import jakarta.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
@@ -96,7 +96,7 @@ public class OperationLogAspect {
}
}
if (StrUtil.isBlank(bizName)) {
bizName = "Default";
bizName = "默认业务";
}
String method = joinPoint.getTarget().getClass().getName() + "." + signature.getName() + "()";
Object[] args = joinPoint.getArgs();
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.odboy.system.framework.storage;
import cn.odboy.framework.exception.BadRequestException;
@@ -13,16 +13,15 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.odboy.system.framework.storage.local;
import cn.odboy.constant.SystemConst;
import cn.odboy.framework.exception.BadRequestException;
import cn.odboy.framework.properties.AppProperties;
import jakarta.servlet.MultipartConfigElement;
import java.io.File;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -32,8 +31,6 @@ import org.springframework.util.unit.DataSize;
@Configuration
public class MultipartConfig {
@Value("${spring.application.name}")
private String name;
@Autowired
private AppProperties properties;
@@ -45,7 +42,7 @@ public class MultipartConfig {
MultipartConfigFactory factory = new MultipartConfigFactory();
factory.setMaxFileSize(DataSize.ofMegabytes(properties.getOss().getMaxSize()));
factory.setMaxRequestSize(DataSize.ofMegabytes(properties.getOss().getMaxSize()));
String location = System.getProperty("user.home") + "/" + name + "/tmp";
String location = System.getProperty("user.home") + "/" + SystemConst.CURRENT_APP_NAME + "/tmp";
File tmpFile = new File(location);
if (!tmpFile.exists()) {
if (!tmpFile.mkdirs()) {
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.odboy.system.framework.storage.minio;
import cn.hutool.core.io.FastByteArrayOutputStream;
@@ -44,13 +43,13 @@ import io.minio.Result;
import io.minio.http.Method;
import io.minio.messages.Bucket;
import io.minio.messages.Item;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -153,13 +152,11 @@ public class MinioRepository {
String type = FileTypeUtil.getType(tempFile);
String prefix = KitFileUtil.getPrefix(tempFile);
String suffix = KitFileUtil.getSuffix(tempFile);
String fileCode = IdUtil.fastSimpleUUID();
String fileName = fileCode + FileUtil.getSuffix(originalFilename);
String objectName = KitDateUtil.getNowDateStr() + "/" + fileName;
log.info("上传文件,原文件名:{},上传后文件名:{}", originalFilename, fileName);
String fileUrl = ossMinioConfig.getEndpoint() + "/" + ossMinioConfig.getBucketName() + "/" + objectName;
SystemOssStorageTb systemOssStorageTb = new SystemOssStorageTb();
systemOssStorageTb.setServiceType("minio");
systemOssStorageTb.setEndpoint(ossMinioConfig.getEndpoint());
@@ -173,7 +170,6 @@ public class MinioRepository {
systemOssStorageTb.setFileUrl(fileUrl);
systemOssStorageTb.setFileCode(fileCode);
systemOssStorageTb.setObjectName(objectName);
try (InputStream fileInputStream = KitFileUtil.getInputStream(tempFile)) {
PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(ossMinioConfig.getBucketName()).object(objectName)
.stream(fileInputStream, fileSize, -1).contentType(contentType).build();
@@ -203,14 +199,11 @@ public class MinioRepository {
if (StrUtil.isBlank(originalFilename)) {
throw new BadRequestException("文件名不能为空");
}
long size = file.getSize();
KitFileUtil.checkSize(properties.getOss().getMaxSize(), size);
String fileName = UUID.randomUUID() + FileUtil.getSuffix(originalFilename);
// yyyy/MM/dd/fileName.xxx
String objectName = KitDateUtil.getNowDateTimeStr() + "/" + fileName;
log.info("准备上传文件,原文件名:{},上传后文件名:{}", originalFilename, fileName);
try (InputStream fileInputStream = file.getInputStream()) {
PutObjectArgs objectArgs =
@@ -286,17 +279,14 @@ public class MinioRepository {
public void download(String fileName, HttpServletResponse res) {
GetObjectArgs objectArgs =
GetObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(fileName).build();
try (GetObjectResponse response = minioClient.getObject(objectArgs);
FastByteArrayOutputStream os = new FastByteArrayOutputStream()) {
byte[] buf = new byte[1024];
int len;
while ((len = response.read(buf)) != -1) {
os.write(buf, 0, len);
}
os.flush();
byte[] bytes = os.toByteArray();
res.setCharacterEncoding("utf-8");
res.addHeader("Content-Disposition", "attachment;fileName=" + fileName);
@@ -318,12 +308,10 @@ public class MinioRepository {
public void downloadOptimizedVersion(String fileName, HttpServletResponse res) {
GetObjectArgs objectArgs =
GetObjectArgs.builder().bucket(properties.getOss().getMinio().getBucketName()).object(fileName).build();
try (GetObjectResponse response = minioClient.getObject(objectArgs)) {
// 增大缓冲区
byte[] buf = new byte[1024 * 4];
int len;
// 分块下载并输出到响应流
try (ServletOutputStream stream = res.getOutputStream()) {
res.setCharacterEncoding("utf-8");
@@ -331,7 +319,6 @@ public class MinioRepository {
res.setHeader("Cache-Control", "no-store");
res.setHeader("Pragma", "no-cache");
res.setHeader("Expires", "0");
while ((len = response.read(buf)) != -1) {
stream.write(buf, 0, len);
// 确保实时写入
@@ -26,7 +26,6 @@ import cn.odboy.system.dal.model.response.SystemDictDetailVo;
import cn.odboy.system.dal.mysql.SystemDictMapper;
import cn.odboy.util.KitBeanUtil;
import cn.odboy.util.KitPageUtil;
import cn.odboy.util.KitValidUtil;
import cn.odboy.util.xlsx.KitExcelExporter;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -92,20 +91,21 @@ public class SystemDictService {
*/
public KitPageResult<SystemDictTb> searchDict(SystemQueryDictArgs args, Page<SystemDictTb> page) {
LambdaQueryWrapper<SystemDictTb> wrapper = new LambdaQueryWrapper<>();
injectQueryParams(args, wrapper);
this.injectQueryParams(args, wrapper);
Page<SystemDictTb> selectPage = systemDictMapper.selectPage(page, wrapper);
return KitPageUtil.toPage(selectPage);
}
private void injectQueryParams(SystemQueryDictArgs args, LambdaQueryWrapper<SystemDictTb> wrapper) {
KitValidUtil.notNull(args);
wrapper.and(StrUtil.isNotBlank(args.getBlurry()), c -> c.like(SystemDictTb::getName, args.getBlurry()).or()
.like(SystemDictTb::getDescription, args.getBlurry()));
if (args != null) {
wrapper.and(StrUtil.isNotBlank(args.getBlurry()), c -> c.like(SystemDictTb::getName, args.getBlurry()).or()
.like(SystemDictTb::getDescription, args.getBlurry()));
}
}
public List<SystemDictTb> queryDictByArgs(SystemQueryDictArgs args) {
LambdaQueryWrapper<SystemDictTb> wrapper = new LambdaQueryWrapper<>();
injectQueryParams(args, wrapper);
this.injectQueryParams(args, wrapper);
return systemDictMapper.selectList(wrapper);
}
@@ -19,6 +19,7 @@ import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.extra.mail.Mail;
import cn.hutool.extra.mail.MailAccount;
import cn.odboy.constant.SystemConst;
import cn.odboy.framework.exception.BadRequestException;
import cn.odboy.framework.properties.AppProperties;
import cn.odboy.framework.redis.KitRedisHelper;
@@ -32,7 +33,6 @@ import cn.odboy.util.KitResourceTemplateUtil;
import java.util.Collections;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -46,8 +46,6 @@ public class SystemEmailService {
private KitRedisHelper redisHelper;
@Autowired
private AppProperties properties;
@Value("${spring.application.title}")
private String applicationTitle;
/**
* 更新邮件配置
@@ -146,7 +144,7 @@ public class SystemEmailService {
KitResourceTemplateUtil.render(null, biEnum.getTemplateName(), Dict.create().set("code", oldCode));
}
SystemSendEmailArgs sendEmailRequest =
new SystemSendEmailArgs(Collections.singletonList(email), applicationTitle, content);
new SystemSendEmailArgs(Collections.singletonList(email), SystemConst.CURRENT_APP_TITLE, content);
sendEmail(sendEmailRequest);
}
@@ -26,7 +26,6 @@ import cn.odboy.system.dal.model.request.SystemQueryJobArgs;
import cn.odboy.system.dal.mysql.SystemJobMapper;
import cn.odboy.util.KitBeanUtil;
import cn.odboy.util.KitPageUtil;
import cn.odboy.util.KitValidUtil;
import cn.odboy.util.xlsx.KitExcelExporter;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -129,12 +128,13 @@ public class SystemJobService {
}
public void injectQueryParams(SystemQueryJobArgs args, LambdaQueryWrapper<SystemJobTb> wrapper) {
KitValidUtil.notNull(args);
wrapper.like(StrUtil.isNotBlank(args.getName()), SystemJobTb::getName, args.getName());
wrapper.eq(args.getEnabled() != null, SystemJobTb::getEnabled, args.getEnabled());
if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) {
wrapper.between(SystemJobTb::getCreateTime, args.getCreateTime().get(0),
args.getCreateTime().get(1));
if (args != null) {
wrapper.like(StrUtil.isNotBlank(args.getName()), SystemJobTb::getName, args.getName());
wrapper.eq(args.getEnabled() != null, SystemJobTb::getEnabled, args.getEnabled());
if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) {
wrapper.between(SystemJobTb::getCreateTime, args.getCreateTime().get(0),
args.getCreateTime().get(1));
}
}
wrapper.orderByDesc(SystemJobTb::getJobSort, SystemJobTb::getId);
}
@@ -33,7 +33,6 @@ import cn.odboy.system.dal.mysql.SystemLocalStorageMapper;
import cn.odboy.util.KitBeanUtil;
import cn.odboy.util.KitFileUtil;
import cn.odboy.util.KitPageUtil;
import cn.odboy.util.KitValidUtil;
import cn.odboy.util.xlsx.KitExcelExporter;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -140,15 +139,16 @@ public class SystemLocalStorageService {
}
private void injectQueryParams(SystemQueryStorageArgs args, LambdaQueryWrapper<SystemLocalStorageTb> wrapper) {
KitValidUtil.notNull(args);
wrapper.and(StrUtil.isNotBlank(args.getBlurry()),
c -> c.like(SystemLocalStorageTb::getName, args.getBlurry()).or()
.like(SystemLocalStorageTb::getSuffix, args.getBlurry()).or()
.like(SystemLocalStorageTb::getType, args.getBlurry()).or()
.like(SystemLocalStorageTb::getCreateBy, args.getBlurry()));
if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) {
wrapper.between(SystemLocalStorageTb::getUpdateTime, args.getCreateTime().get(0),
args.getCreateTime().get(1));
if (args != null) {
wrapper.and(StrUtil.isNotBlank(args.getBlurry()),
c -> c.like(SystemLocalStorageTb::getName, args.getBlurry()).or()
.like(SystemLocalStorageTb::getSuffix, args.getBlurry()).or()
.like(SystemLocalStorageTb::getType, args.getBlurry()).or()
.like(SystemLocalStorageTb::getCreateBy, args.getBlurry()));
if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) {
wrapper.between(SystemLocalStorageTb::getUpdateTime, args.getCreateTime().get(0),
args.getCreateTime().get(1));
}
}
wrapper.orderByDesc(SystemLocalStorageTb::getId);
}
@@ -219,11 +219,12 @@ public class SystemQuartzJobService {
}
private void injectQuartzLogQueryParams(SystemQueryQuartzJobArgs args, LambdaQueryWrapper<SystemQuartzLogTb> wrapper) {
KitValidUtil.notNull(args);
wrapper.like(StrUtil.isNotBlank(args.getJobName()), SystemQuartzLogTb::getJobName, args.getJobName());
wrapper.eq(args.getIsSuccess() != null, SystemQuartzLogTb::getIsSuccess, args.getIsSuccess());
if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) {
wrapper.between(SystemQuartzLogTb::getCreateTime, args.getCreateTime().get(0), args.getCreateTime().get(1));
if (args != null) {
wrapper.like(StrUtil.isNotBlank(args.getJobName()), SystemQuartzLogTb::getJobName, args.getJobName());
wrapper.eq(args.getIsSuccess() != null, SystemQuartzLogTb::getIsSuccess, args.getIsSuccess());
if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) {
wrapper.between(SystemQuartzLogTb::getCreateTime, args.getCreateTime().get(0), args.getCreateTime().get(1));
}
}
wrapper.orderByDesc(SystemQuartzLogTb::getId);
}
@@ -68,7 +68,7 @@ public class SystemRoleService {
@Transactional(rollbackFor = Exception.class)
public void saveRole(SystemCreateRoleArgs args) {
checkRoleLevels(args.getLevel());
if (this.getRoleByName(args.getName()) != null) {
if (this.countRoleByName(args.getName()) > 0) {
throw new BadRequestException("角色名称已存在");
}
SystemRoleTb roleTb = KitBeanUtil.copyToClass(args, SystemRoleTb.class);
@@ -85,6 +85,12 @@ public class SystemRoleService {
return systemRoleMapper.selectOne(wrapper);
}
private long countRoleByName(String name) {
LambdaQueryWrapper<SystemRoleTb> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SystemRoleTb::getName, name);
return systemRoleMapper.selectCount(wrapper);
}
/**
* 修改
*
@@ -166,10 +172,11 @@ public class SystemRoleService {
/**
* 根据条件查询全部角色
*
* @param args 条件
* @param args 条件
* @param rolePage 分页参数
* @return /
*/
public List<SystemRoleVo> queryRoleByArgs(SystemQueryRoleArgs args) {
public List<SystemRoleVo> queryRoleByArgs(SystemQueryRoleArgs args, Page<SystemRoleTb> rolePage) {
KitValidUtil.notNull(args);
// 查询角色基本信息
LambdaQueryWrapper<SystemRoleTb> wrapper = new LambdaQueryWrapper<>();
@@ -181,27 +188,25 @@ public class SystemRoleService {
args.getCreateTime().get(1));
}
wrapper.orderByAsc(SystemRoleTb::getLevel);
if (args.getSize() != null) {
Page<SystemRoleTb> rolePage = new Page<>(args.getPage(), args.getSize());
Page<SystemRoleTb> page = systemRoleMapper.selectPage(rolePage, wrapper);
List<SystemRoleTb> roles = page.getRecords();
return roles.stream().map(systemUserRoleService::convertToRoleVo).collect(Collectors.toList());
List<SystemRoleTb> roles;
if (rolePage == null) {
roles = systemRoleMapper.selectList(wrapper);
} else {
List<SystemRoleTb> roles = systemRoleMapper.selectList(wrapper);
return roles.stream().map(systemUserRoleService::convertToRoleVo).collect(Collectors.toList());
Page<SystemRoleTb> page = systemRoleMapper.selectPage(rolePage, wrapper);
roles = page.getRecords();
}
return roles.stream().map(systemUserRoleService::convertToRoleVo).collect(Collectors.toList());
}
/**
* 分页查询角色
*
* @param args 条件
* @param page 分页参数
* @param page 分页条件
* @return /
*/
public KitPageResult<SystemRoleVo> searchRoleByArgs(SystemQueryRoleArgs args, Page<Object> page) {
args.setOffset(page.offset());
List<SystemRoleVo> roles = this.queryRoleByArgs(args);
public KitPageResult<SystemRoleVo> searchRoleByArgs(SystemQueryRoleArgs args, Page<SystemRoleTb> page) {
List<SystemRoleVo> roles = this.queryRoleByArgs(args, page);
Long total = this.countRoleByArgs(args);
return KitPageUtil.toPage(roles, total);
}
@@ -280,7 +285,7 @@ public class SystemRoleService {
}
public void exportRoleXlsx(HttpServletResponse response, SystemQueryRoleArgs args) {
List<SystemRoleVo> systemRoleVos = this.queryRoleByArgs(args);
List<SystemRoleVo> systemRoleVos = this.queryRoleByArgs(args, null);
List<SystemRoleExportRowVo> rowVos = new ArrayList<>();
for (SystemRoleVo dataObject : systemRoleVos) {
SystemRoleExportRowVo rowVo = new SystemRoleExportRowVo();
@@ -343,20 +343,6 @@ public class SystemUserService {
return KitPageUtil.toPage(userVos, userPage.getTotal());
}
// /**
// * 查询全部不分页
// *
// * @param args 条件
// * @return /
// */
// public List<SystemUserVo> queryUserVoByArgs(SystemQueryUserArgs args) {
// // 查询用户基本信息
// LambdaQueryWrapper<SystemUserTb> wrapper = buildUserQueryWrapper(args);
// List<SystemUserTb> users = systemUserMapper.selectList(wrapper);
// // 转换为SystemUserVo并关联查询
// return users.stream().map(this::convertToUserVo).collect(Collectors.toList());
// }
public long countUserByArgs(SystemQueryUserArgs args) {
LambdaQueryWrapper<SystemUserTb> wrapper = buildUserQueryWrapper(args);
return systemUserMapper.selectCount(wrapper);
@@ -385,7 +371,7 @@ public class SystemUserService {
c.or();
c.like(SystemUserTb::getNickName, args.getBlurry());
});
return systemUserMapper.selectPage(new Page<>(args.getPage(), 50), wrapper).getRecords().stream().map(m -> {
return systemUserMapper.selectPage(new Page<>(pageArgs.getPage(), 50), wrapper).getRecords().stream().map(m -> {
Map<String, Object> ext = new HashMap<>(1);
ext.put("id", m.getId());
ext.put("deptId", m.getDeptId());
@@ -54,12 +54,12 @@ public final class KitSqlUtil {
try {
className = DriverManager.getDriver(jdbcUrl.trim()).getClass().getName();
} catch (SQLException e) {
throw new BadRequestException("Get class name error: =" + jdbcUrl);
throw new BadRequestException("获取驱动类名失败,jdbcUrl=" + jdbcUrl);
}
if (StringUtils.isEmpty(className)) {
DataTypeEnum dataTypeEnum = DataTypeEnum.urlOf(jdbcUrl);
if (null == dataTypeEnum) {
throw new BadRequestException("Not supported data type: jdbcUrl=" + jdbcUrl);
throw new BadRequestException("不支持的数据库类型,jdbcUrl=" + jdbcUrl);
}
druidDataSource.setDriverClassName(dataTypeEnum.getDriver());
} else {
@@ -82,12 +82,12 @@ public final class KitSqlUtil {
try {
int timeOut = 5;
if (null == connection || connection.isClosed() || !connection.isValid(timeOut)) {
log.info("connection is closed or invalid, retry get connection!");
log.info("连接已关闭或者错误,重试获取连接");
connection = dataSource.getConnection();
}
} catch (Exception e) {
log.error("create connection error, jdbcUrl: {}", jdbcUrl);
throw new BadRequestException("create connection error, jdbcUrl: " + jdbcUrl);
log.error("创建连接失败, jdbcUrl={}", jdbcUrl);
throw new BadRequestException("创建连接失败, jdbcUrl=" + jdbcUrl);
} finally {
KitCloseUtil.close(connection);
}
@@ -30,9 +30,6 @@ server:
# IMMEDIATE(立即): 当应用程序以"IMMEDIATE"模式关闭时,它会立即终止,而不管当前是否有任何活动任务或请求。这种方式适用于那些可以立即停止而不会造成严重问题的情况。
shutdown: graceful
spring:
application:
name: cutejava
title: CuteJava
lifecycle:
# 采用java.time.Duration格式的值,如果在这个时间内,优雅停机没有停掉应用,超过这个时间就会强制停止应用
timeout-per-shutdown-phase: 30s
@@ -149,10 +146,10 @@ mybatis-plus:
app:
# 密码加密传输,前端公钥加密,后端私钥解密
rsa:
private-key: MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8mp0f3FE0GYP3AYPaJF7jUd1M0XxFSE2ceK3k2kw20YvQ09NJKk+OMjWQl9WitG9pB6tSCQIDAQABAkA2SimBrWC2/wvauBuYqjCFwLvYiRYqZKThUS3MZlebXJiLB+Ue/gUifAAKIg1avttUZsHBHrop4qfJCwAI0+YRAiEA+W3NK/RaXtnRqmoUUkb59zsZUBLpvZgQPfj1MhyHDz0CIQDYhsAhPJ3mgS64NbUZmGWuuNKp5coY2GIj/zYDMJp6vQIgUueLFXv/eZ1ekgz2Oi67MNCk5jeTF2BurZqNLR3MSmUCIFT3Q6uHMtsB9Eha4u7hS31tj1UWE+D+ADzp59MGnoftAiBeHT7gDMuqeJHPL4b+kC+gzV4FGTfhR9q3tTbklZkD2A==
private-key: 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
# 鉴权
jwt:
# 必须使用最少88位的Base64对该令牌进行编码 cn.odboy.util.KitBase64SecretUtil
# 必须使用最少88位的Base64对该令牌进行编码 cn.odboy.util.CsBase64SecretUtil
base64-secret: YzE5ZWNjMjlkMGY4NDc4MDlmYzE0Y2I0MTk4YTQ4YjY5NTU0OGQxODNjNjQ0MmU1YjBmZTYwYjljYzI0M2M4MTJkZjk3Y2ZlYjg3ZTQxMjM4MjEwY2ZiYzE4YmFiYmZlZDVhM2M1YmI3M2FmNDFmNWJmM2MyMTM1ZDNhMmRmYzY=
# 令牌过期时间 此处单位/毫秒 ,默认4小时,可在此网站生成 https://www.convertworld.com/zh-hans/time/milliseconds.html
token-validity-in-seconds: 14400000
@@ -215,4 +212,4 @@ logging:
knife4j:
enable: true
setting:
language: zh_cn
language: zh_cn
@@ -30,9 +30,6 @@ server:
# IMMEDIATE(立即): 当应用程序以"IMMEDIATE"模式关闭时,它会立即终止,而不管当前是否有任何活动任务或请求。这种方式适用于那些可以立即停止而不会造成严重问题的情况。
shutdown: graceful
spring:
application:
name: cutejava
title: CuteJava
lifecycle:
# 采用java.time.Duration格式的值,如果在这个时间内,优雅停机没有停掉应用,超过这个时间就会强制停止应用
timeout-per-shutdown-phase: 30s
@@ -158,10 +155,10 @@ mybatis-plus:
app:
# 密码加密传输,前端公钥加密,后端私钥解密
rsa:
private-key: MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8mp0f3FE0GYP3AYPaJF7jUd1M0XxFSE2ceK3k2kw20YvQ09NJKk+OMjWQl9WitG9pB6tSCQIDAQABAkA2SimBrWC2/wvauBuYqjCFwLvYiRYqZKThUS3MZlebXJiLB+Ue/gUifAAKIg1avttUZsHBHrop4qfJCwAI0+YRAiEA+W3NK/RaXtnRqmoUUkb59zsZUBLpvZgQPfj1MhyHDz0CIQDYhsAhPJ3mgS64NbUZmGWuuNKp5coY2GIj/zYDMJp6vQIgUueLFXv/eZ1ekgz2Oi67MNCk5jeTF2BurZqNLR3MSmUCIFT3Q6uHMtsB9Eha4u7hS31tj1UWE+D+ADzp59MGnoftAiBeHT7gDMuqeJHPL4b+kC+gzV4FGTfhR9q3tTbklZkD2A==
private-key: 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
# 鉴权
jwt:
# 必须使用最少88位的Base64对该令牌进行编码 cn.odboy.util.KitBase64SecretUtil
# 必须使用最少88位的Base64对该令牌进行编码 cn.odboy.util.CsBase64SecretUtil
base64-secret: YzE5ZWNjMjlkMGY4NDc4MDlmYzE0Y2I0MTk4YTQ4YjY5NTU0OGQxODNjNjQ0MmU1YjBmZTYwYjljYzI0M2M4MTJkZjk3Y2ZlYjg3ZTQxMjM4MjEwY2ZiYzE4YmFiYmZlZDVhM2M1YmI3M2FmNDFmNWJmM2MyMTM1ZDNhMmRmYzY=
# 令牌过期时间 此处单位/毫秒 ,默认4小时,可在此网站生成 https://www.convertworld.com/zh-hans/time/milliseconds.html
token-validity-in-seconds: 14400000
@@ -224,4 +221,4 @@ logging:
knife4j:
enable: false
setting:
language: zh_cn
language: zh_cn
@@ -9,7 +9,7 @@ spring:
quartz:
scheduler:
# 必需,指定调度器实例的名称
instanceName: ${spring.application.name}
instanceName: cutejava
# 必需,指定调度器实例的 ID
instanceId: auto
threadPool:
@@ -46,4 +46,6 @@ public interface SystemConst {
String SYMBOL_AT = "@";
String PROPERTY_OS_NAME = "os.name";
String OS_NAME_WINDOWS = "Windows";
String CURRENT_APP_NAME = "cutejava";
String CURRENT_APP_TITLE = "CuteJava";
}
@@ -41,7 +41,7 @@ public class KitSpringBeanHolder implements ApplicationContextAware, DisposableB
*/
public synchronized static void addCallBacks(CallBack callBack) {
if (addCallback) {
KitSpringBeanHolder.CALL_BACKS.add(callBack);
CALL_BACKS.add(callBack);
} else {
log.warn("CallBack:{} 已无法添加!立即执行", callBack.getCallBackName());
callBack.executor();
@@ -116,7 +116,7 @@ public class KitSpringBeanHolder implements ApplicationContextAware, DisposableB
* 清除SpringContextHolder中的ApplicationContext为Null.
*/
private static void clearHolder() {
log.debug("清除SpringContextHolder中的ApplicationContext:" + applicationContext);
log.debug("清除SpringContextHolder中的ApplicationContext:{}", applicationContext);
applicationContext = null;
}
@@ -137,8 +137,7 @@ public class KitSpringBeanHolder implements ApplicationContextAware, DisposableB
@Override
public void setApplicationContext(@NonNull ApplicationContext applicationContext) throws BeansException {
if (KitSpringBeanHolder.applicationContext != null) {
log.warn("SpringContextHolder中的ApplicationContext被覆盖, 原有ApplicationContext为:" +
KitSpringBeanHolder.applicationContext);
log.warn("SpringContextHolder中的ApplicationContext被覆盖, 原有ApplicationContext为:{}", KitSpringBeanHolder.applicationContext);
}
KitSpringBeanHolder.applicationContext = applicationContext;
if (addCallback) {
@@ -18,7 +18,6 @@ package cn.odboy.framework.server.core;
import cn.hutool.core.util.StrUtil;
import cn.odboy.constant.SystemConst;
import cn.odboy.util.KitSystemUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
@@ -36,26 +35,24 @@ public class KitFileLocalUploadHelper {
private static final String PATH_WINDOWS = "C:\\${appName}\\file\\";
private static final String PATH_MAC = "/Users${username}/${appName}/file/";
private static final String PATH_LINUX = "/home/${appName}/file/";
@Value("${spring.application.name}")
private String appName;
public String getPath() {
String os = System.getProperty("os.name");
if (os == null) {
// 默认使用 Linux 路径作为兜底方案
return PATH_LINUX.replace("${appName}", appName);
return PATH_LINUX.replace("${appName}", SystemConst.CURRENT_APP_NAME);
}
String lowerOs = os.toLowerCase();
if (lowerOs.startsWith(SystemConst.WIN)) {
return PATH_WINDOWS.replace("${appName}", appName);
return PATH_WINDOWS.replace("${appName}", SystemConst.CURRENT_APP_NAME);
} else if (lowerOs.startsWith(SystemConst.MAC)) {
String currentUserName = KitSystemUtil.getCurrentUserName();
if (StrUtil.isBlank(currentUserName)) {
return PATH_MAC.replace("${appName}", appName).replace("${username}", "");
return PATH_MAC.replace("${appName}", SystemConst.CURRENT_APP_NAME).replace("${username}", "");
}
return PATH_MAC.replace("${appName}", appName).replace("${username}", "/" + currentUserName);
return PATH_MAC.replace("${appName}", SystemConst.CURRENT_APP_NAME).replace("${username}", "/" + currentUserName);
}
return PATH_LINUX.replace("${appName}", appName);
return PATH_LINUX.replace("${appName}", SystemConst.CURRENT_APP_NAME);
}
public int getAvatarMaxSize() {
@@ -77,9 +77,9 @@ public class SystemQuartzJobController {
@ApiOperation("查询定时任务执行日志")
@PostMapping(value = "/searchQuartzLog")
@PreAuthorize("@el.check('quartzJob:list')")
public ResponseEntity<KitPageResult<SystemQuartzLogTb>> queryQuartzJobLog(SystemQueryQuartzJobArgs args) {
Page<SystemQuartzLogTb> page = new Page<>(args.getPage(), args.getSize());
return ResponseEntity.ok(systemQuartzJobService.searchQuartzLogByArgs(args, page));
public ResponseEntity<KitPageResult<SystemQuartzLogTb>> queryQuartzJobLog(@Validated @RequestBody KitPageArgs<SystemQueryQuartzJobArgs> pageArgs) {
Page<SystemQuartzLogTb> page = new Page<>(pageArgs.getPage(), pageArgs.getSize());
return ResponseEntity.ok(systemQuartzJobService.searchQuartzLogByArgs(pageArgs.getArgs(), page));
}
@OperationLog
@@ -72,9 +72,8 @@ public class SystemRoleController {
@ApiOperation("查询角色")
@PostMapping(value = "/searchRole")
@PreAuthorize("@el.check('roles:list')")
public ResponseEntity<KitPageResult<SystemRoleVo>> queryRoleByArgs(
@Validated @RequestBody KitPageArgs<SystemQueryRoleArgs> pageArgs) {
Page<Object> page = new Page<>(pageArgs.getPage(), pageArgs.getSize());
public ResponseEntity<KitPageResult<SystemRoleVo>> queryRoleByArgs(@Validated @RequestBody KitPageArgs<SystemQueryRoleArgs> pageArgs) {
Page<SystemRoleTb> page = new Page<>(pageArgs.getPage(), pageArgs.getSize());
return ResponseEntity.ok(systemRoleService.searchRoleByArgs(pageArgs.getArgs(), page));
}
@@ -23,8 +23,4 @@ public class SystemQueryDictArgs {
@ApiModelProperty(value = "模糊查询")
private String blurry;
@ApiModelProperty(value = "页码", example = "1")
private Integer page = 1;
@ApiModelProperty(value = "每页数据量", example = "10")
private Integer size = 10;
}
@@ -31,8 +31,4 @@ public class SystemQueryJobArgs {
private Boolean enabled;
@ApiModelProperty(value = "创建时间")
private List<Date> createTime;
@ApiModelProperty(value = "页码", example = "1")
private Integer page = 1;
@ApiModelProperty(value = "每页数据量", example = "10")
private Integer size = 10;
}
@@ -29,8 +29,4 @@ public class SystemQueryQuartzJobArgs {
private Boolean isSuccess;
@ApiModelProperty(value = "创建时间")
private List<Date> createTime;
@ApiModelProperty(value = "页码", example = "1")
private Integer page = 1;
@ApiModelProperty(value = "每页数据量", example = "10")
private Integer size = 10;
}
@@ -27,10 +27,4 @@ public class SystemQueryRoleArgs {
private String blurry;
@ApiModelProperty(value = "创建时间")
private List<Date> createTime;
@ApiModelProperty(value = "页码", example = "1")
private Integer page = 1;
@ApiModelProperty(value = "每页数据量", example = "10")
private Integer size = 10;
@ApiModelProperty(value = "偏移量", hidden = true)
private long offset;
}
@@ -40,8 +40,4 @@ public class SystemQueryUserArgs extends KitObject {
private Long deptId;
@ApiModelProperty(value = "创建时间")
private List<Date> createTime;
@ApiModelProperty(value = "页码", example = "1")
private Integer page = 1;
@ApiModelProperty(value = "每页数据量", example = "10")
private Integer size = 10;
}
@@ -18,7 +18,6 @@ package cn.odboy.system.dal.mysql;
import cn.odboy.system.dal.dataobject.SystemDictTb;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
/**
@@ -29,10 +28,6 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SystemDictMapper extends BaseMapper<SystemDictTb> {
default List<SystemDictTb> listAll() {
return selectList(null);
}
default SystemDictTb getByName(String dictName) {
LambdaQueryWrapper<SystemDictTb> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SystemDictTb::getName, dictName);
@@ -43,8 +43,8 @@ public class BizLockAspect {
public Object around(ProceedingJoinPoint joinPoint, BizLock bizLock) throws Throwable {
// 解析SpEL表达式生成最终的lockKey
String lockKey = parseLockKey(joinPoint, bizLock);
Boolean success = redisHelper.setIfAbsent(lockKey, lockKey, bizLock.leaseTime(), bizLock.timeUnit());
if (success == null || !success) {
boolean success = redisHelper.setIfAbsent(lockKey, lockKey, bizLock.leaseTime(), bizLock.timeUnit());
if (!success) {
throw new BadRequestException(bizLock.errorMessage());
}
try {
@@ -15,6 +15,7 @@
*/
package cn.odboy.system.framework.storage.local;
import cn.odboy.constant.SystemConst;
import cn.odboy.framework.exception.BadRequestException;
import cn.odboy.framework.properties.AppProperties;
import java.io.File;
@@ -30,9 +31,6 @@ import org.springframework.util.unit.DataSize;
@Slf4j
@Configuration
public class MultipartConfig {
@Value("${spring.application.name}")
private String name;
@Autowired
private AppProperties properties;
@@ -44,7 +42,7 @@ public class MultipartConfig {
MultipartConfigFactory factory = new MultipartConfigFactory();
factory.setMaxFileSize(DataSize.ofMegabytes(properties.getOss().getMaxSize()));
factory.setMaxRequestSize(DataSize.ofMegabytes(properties.getOss().getMaxSize()));
String location = System.getProperty("user.home") + "/" + name + "/tmp";
String location = System.getProperty("user.home") + "/" + SystemConst.CURRENT_APP_NAME + "/tmp";
File tmpFile = new File(location);
if (!tmpFile.exists()) {
if (!tmpFile.mkdirs()) {
@@ -26,7 +26,6 @@ import cn.odboy.system.dal.model.response.SystemDictDetailVo;
import cn.odboy.system.dal.mysql.SystemDictMapper;
import cn.odboy.util.KitBeanUtil;
import cn.odboy.util.KitPageUtil;
import cn.odboy.util.KitValidUtil;
import cn.odboy.util.xlsx.KitExcelExporter;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -92,20 +91,21 @@ public class SystemDictService {
*/
public KitPageResult<SystemDictTb> searchDict(SystemQueryDictArgs args, Page<SystemDictTb> page) {
LambdaQueryWrapper<SystemDictTb> wrapper = new LambdaQueryWrapper<>();
injectQueryParams(args, wrapper);
this.injectQueryParams(args, wrapper);
Page<SystemDictTb> selectPage = systemDictMapper.selectPage(page, wrapper);
return KitPageUtil.toPage(selectPage);
}
private void injectQueryParams(SystemQueryDictArgs args, LambdaQueryWrapper<SystemDictTb> wrapper) {
KitValidUtil.notNull(args);
wrapper.and(StrUtil.isNotBlank(args.getBlurry()), c -> c.like(SystemDictTb::getName, args.getBlurry()).or()
.like(SystemDictTb::getDescription, args.getBlurry()));
if (args != null) {
wrapper.and(StrUtil.isNotBlank(args.getBlurry()), c -> c.like(SystemDictTb::getName, args.getBlurry()).or()
.like(SystemDictTb::getDescription, args.getBlurry()));
}
}
public List<SystemDictTb> queryDictByArgs(SystemQueryDictArgs args) {
LambdaQueryWrapper<SystemDictTb> wrapper = new LambdaQueryWrapper<>();
injectQueryParams(args, wrapper);
this.injectQueryParams(args, wrapper);
return systemDictMapper.selectList(wrapper);
}
@@ -19,6 +19,7 @@ import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.extra.mail.Mail;
import cn.hutool.extra.mail.MailAccount;
import cn.odboy.constant.SystemConst;
import cn.odboy.framework.exception.BadRequestException;
import cn.odboy.framework.properties.AppProperties;
import cn.odboy.framework.redis.KitRedisHelper;
@@ -32,7 +33,6 @@ import cn.odboy.util.KitResourceTemplateUtil;
import java.util.Collections;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -46,8 +46,6 @@ public class SystemEmailService {
private KitRedisHelper redisHelper;
@Autowired
private AppProperties properties;
@Value("${spring.application.title}")
private String applicationTitle;
/**
* 更新邮件配置
@@ -146,7 +144,7 @@ public class SystemEmailService {
KitResourceTemplateUtil.render(null, biEnum.getTemplateName(), Dict.create().set("code", oldCode));
}
SystemSendEmailArgs sendEmailRequest =
new SystemSendEmailArgs(Collections.singletonList(email), applicationTitle, content);
new SystemSendEmailArgs(Collections.singletonList(email), SystemConst.CURRENT_APP_TITLE, content);
sendEmail(sendEmailRequest);
}
@@ -26,7 +26,6 @@ import cn.odboy.system.dal.model.request.SystemQueryJobArgs;
import cn.odboy.system.dal.mysql.SystemJobMapper;
import cn.odboy.util.KitBeanUtil;
import cn.odboy.util.KitPageUtil;
import cn.odboy.util.KitValidUtil;
import cn.odboy.util.xlsx.KitExcelExporter;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -129,12 +128,13 @@ public class SystemJobService {
}
public void injectQueryParams(SystemQueryJobArgs args, LambdaQueryWrapper<SystemJobTb> wrapper) {
KitValidUtil.notNull(args);
wrapper.like(StrUtil.isNotBlank(args.getName()), SystemJobTb::getName, args.getName());
wrapper.eq(args.getEnabled() != null, SystemJobTb::getEnabled, args.getEnabled());
if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) {
wrapper.between(SystemJobTb::getCreateTime, args.getCreateTime().get(0),
args.getCreateTime().get(1));
if (args != null) {
wrapper.like(StrUtil.isNotBlank(args.getName()), SystemJobTb::getName, args.getName());
wrapper.eq(args.getEnabled() != null, SystemJobTb::getEnabled, args.getEnabled());
if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) {
wrapper.between(SystemJobTb::getCreateTime, args.getCreateTime().get(0),
args.getCreateTime().get(1));
}
}
wrapper.orderByDesc(SystemJobTb::getJobSort, SystemJobTb::getId);
}
@@ -33,7 +33,6 @@ import cn.odboy.system.dal.mysql.SystemLocalStorageMapper;
import cn.odboy.util.KitBeanUtil;
import cn.odboy.util.KitFileUtil;
import cn.odboy.util.KitPageUtil;
import cn.odboy.util.KitValidUtil;
import cn.odboy.util.xlsx.KitExcelExporter;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -140,15 +139,16 @@ public class SystemLocalStorageService {
}
private void injectQueryParams(SystemQueryStorageArgs args, LambdaQueryWrapper<SystemLocalStorageTb> wrapper) {
KitValidUtil.notNull(args);
wrapper.and(StrUtil.isNotBlank(args.getBlurry()),
c -> c.like(SystemLocalStorageTb::getName, args.getBlurry()).or()
.like(SystemLocalStorageTb::getSuffix, args.getBlurry()).or()
.like(SystemLocalStorageTb::getType, args.getBlurry()).or()
.like(SystemLocalStorageTb::getCreateBy, args.getBlurry()));
if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) {
wrapper.between(SystemLocalStorageTb::getUpdateTime, args.getCreateTime().get(0),
args.getCreateTime().get(1));
if (args != null) {
wrapper.and(StrUtil.isNotBlank(args.getBlurry()),
c -> c.like(SystemLocalStorageTb::getName, args.getBlurry()).or()
.like(SystemLocalStorageTb::getSuffix, args.getBlurry()).or()
.like(SystemLocalStorageTb::getType, args.getBlurry()).or()
.like(SystemLocalStorageTb::getCreateBy, args.getBlurry()));
if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) {
wrapper.between(SystemLocalStorageTb::getUpdateTime, args.getCreateTime().get(0),
args.getCreateTime().get(1));
}
}
wrapper.orderByDesc(SystemLocalStorageTb::getId);
}
@@ -219,11 +219,12 @@ public class SystemQuartzJobService {
}
private void injectQuartzLogQueryParams(SystemQueryQuartzJobArgs args, LambdaQueryWrapper<SystemQuartzLogTb> wrapper) {
KitValidUtil.notNull(args);
wrapper.like(StrUtil.isNotBlank(args.getJobName()), SystemQuartzLogTb::getJobName, args.getJobName());
wrapper.eq(args.getIsSuccess() != null, SystemQuartzLogTb::getIsSuccess, args.getIsSuccess());
if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) {
wrapper.between(SystemQuartzLogTb::getCreateTime, args.getCreateTime().get(0), args.getCreateTime().get(1));
if (args != null) {
wrapper.like(StrUtil.isNotBlank(args.getJobName()), SystemQuartzLogTb::getJobName, args.getJobName());
wrapper.eq(args.getIsSuccess() != null, SystemQuartzLogTb::getIsSuccess, args.getIsSuccess());
if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) {
wrapper.between(SystemQuartzLogTb::getCreateTime, args.getCreateTime().get(0), args.getCreateTime().get(1));
}
}
wrapper.orderByDesc(SystemQuartzLogTb::getId);
}
@@ -68,7 +68,7 @@ public class SystemRoleService {
@Transactional(rollbackFor = Exception.class)
public void saveRole(SystemCreateRoleArgs args) {
checkRoleLevels(args.getLevel());
if (this.getRoleByName(args.getName()) != null) {
if (this.countRoleByName(args.getName()) > 0) {
throw new BadRequestException("角色名称已存在");
}
SystemRoleTb roleTb = KitBeanUtil.copyToClass(args, SystemRoleTb.class);
@@ -85,6 +85,12 @@ public class SystemRoleService {
return systemRoleMapper.selectOne(wrapper);
}
private long countRoleByName(String name) {
LambdaQueryWrapper<SystemRoleTb> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SystemRoleTb::getName, name);
return systemRoleMapper.selectCount(wrapper);
}
/**
* 修改
*
@@ -166,10 +172,11 @@ public class SystemRoleService {
/**
* 根据条件查询全部角色
*
* @param args 条件
* @param args 条件
* @param rolePage 分页参数
* @return /
*/
public List<SystemRoleVo> queryRoleByArgs(SystemQueryRoleArgs args) {
public List<SystemRoleVo> queryRoleByArgs(SystemQueryRoleArgs args, Page<SystemRoleTb> rolePage) {
KitValidUtil.notNull(args);
// 查询角色基本信息
LambdaQueryWrapper<SystemRoleTb> wrapper = new LambdaQueryWrapper<>();
@@ -181,27 +188,25 @@ public class SystemRoleService {
args.getCreateTime().get(1));
}
wrapper.orderByAsc(SystemRoleTb::getLevel);
if (args.getSize() != null) {
Page<SystemRoleTb> rolePage = new Page<>(args.getPage(), args.getSize());
Page<SystemRoleTb> page = systemRoleMapper.selectPage(rolePage, wrapper);
List<SystemRoleTb> roles = page.getRecords();
return roles.stream().map(systemUserRoleService::convertToRoleVo).collect(Collectors.toList());
List<SystemRoleTb> roles;
if (rolePage == null) {
roles = systemRoleMapper.selectList(wrapper);
} else {
List<SystemRoleTb> roles = systemRoleMapper.selectList(wrapper);
return roles.stream().map(systemUserRoleService::convertToRoleVo).collect(Collectors.toList());
Page<SystemRoleTb> page = systemRoleMapper.selectPage(rolePage, wrapper);
roles = page.getRecords();
}
return roles.stream().map(systemUserRoleService::convertToRoleVo).collect(Collectors.toList());
}
/**
* 分页查询角色
*
* @param args 条件
* @param page 分页参数
* @param page 分页条件
* @return /
*/
public KitPageResult<SystemRoleVo> searchRoleByArgs(SystemQueryRoleArgs args, Page<Object> page) {
args.setOffset(page.offset());
List<SystemRoleVo> roles = this.queryRoleByArgs(args);
public KitPageResult<SystemRoleVo> searchRoleByArgs(SystemQueryRoleArgs args, Page<SystemRoleTb> page) {
List<SystemRoleVo> roles = this.queryRoleByArgs(args, page);
Long total = this.countRoleByArgs(args);
return KitPageUtil.toPage(roles, total);
}
@@ -280,7 +285,7 @@ public class SystemRoleService {
}
public void exportRoleXlsx(HttpServletResponse response, SystemQueryRoleArgs args) {
List<SystemRoleVo> systemRoleVos = this.queryRoleByArgs(args);
List<SystemRoleVo> systemRoleVos = this.queryRoleByArgs(args, null);
List<SystemRoleExportRowVo> rowVos = new ArrayList<>();
for (SystemRoleVo dataObject : systemRoleVos) {
SystemRoleExportRowVo rowVo = new SystemRoleExportRowVo();
@@ -371,7 +371,7 @@ public class SystemUserService {
c.or();
c.like(SystemUserTb::getNickName, args.getBlurry());
});
return systemUserMapper.selectPage(new Page<>(args.getPage(), 50), wrapper).getRecords().stream().map(m -> {
return systemUserMapper.selectPage(new Page<>(pageArgs.getPage(), 50), wrapper).getRecords().stream().map(m -> {
Map<String, Object> ext = new HashMap<>(1);
ext.put("id", m.getId());
ext.put("deptId", m.getDeptId());
@@ -54,12 +54,12 @@ public final class KitSqlUtil {
try {
className = DriverManager.getDriver(jdbcUrl.trim()).getClass().getName();
} catch (SQLException e) {
throw new BadRequestException("Get class name error: =" + jdbcUrl);
throw new BadRequestException("获取驱动类名失败,jdbcUrl=" + jdbcUrl);
}
if (StringUtils.isEmpty(className)) {
DataTypeEnum dataTypeEnum = DataTypeEnum.urlOf(jdbcUrl);
if (null == dataTypeEnum) {
throw new BadRequestException("Not supported data type: jdbcUrl=" + jdbcUrl);
throw new BadRequestException("不支持的数据库类型,jdbcUrl=" + jdbcUrl);
}
druidDataSource.setDriverClassName(dataTypeEnum.getDriver());
} else {
@@ -82,12 +82,12 @@ public final class KitSqlUtil {
try {
int timeOut = 5;
if (null == connection || connection.isClosed() || !connection.isValid(timeOut)) {
log.info("connection is closed or invalid, retry get connection!");
log.info("连接已关闭或者错误,重试获取连接");
connection = dataSource.getConnection();
}
} catch (Exception e) {
log.error("create connection error, jdbcUrl: {}", jdbcUrl);
throw new BadRequestException("create connection error, jdbcUrl: " + jdbcUrl);
log.error("创建连接失败, jdbcUrl={}", jdbcUrl);
throw new BadRequestException("创建连接失败, jdbcUrl=" + jdbcUrl);
} finally {
KitCloseUtil.close(connection);
}
@@ -55,8 +55,7 @@ public class TaskJobBean extends QuartzJobBean {
public void executeInternal(JobExecutionContext context) {
// ========================== 获取代理类 ==========================
TaskInstanceInfoService taskInstanceInfoService = KitSpringBeanHolder.getBean(TaskInstanceInfoService.class);
TaskInstanceDetailService taskInstanceDetailService =
KitSpringBeanHolder.getBean(TaskInstanceDetailService.class);
TaskInstanceDetailService taskInstanceDetailService = KitSpringBeanHolder.getBean(TaskInstanceDetailService.class);
// ========================== 获取参数 ==========================
JobDataMap dataMap = context.getMergedJobDataMap();
long id = dataMap.getLong(TaskJobKeys.ID);
@@ -69,8 +68,7 @@ public class TaskJobBean extends QuartzJobBean {
if (StrUtil.isBlank(retryNodeCode)) {
executeNormalTask(taskInstanceInfoService, taskInstanceDetailService, id, dataMap, taskTemplateNodeVos);
} else {
executeRetryTask(taskInstanceInfoService, taskInstanceDetailService, id, dataMap, taskTemplateNodeVos,
retryNodeCode);
executeRetryTask(taskInstanceInfoService, taskInstanceDetailService, id, dataMap, taskTemplateNodeVos, retryNodeCode);
}
}
@@ -83,19 +81,14 @@ public class TaskJobBean extends QuartzJobBean {
* @param dataMap 数据映射
* @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))
.collect(Collectors.toList());
List<TaskInstanceDetailTb> taskInstanceDetails = taskTemplateNodeVos.stream().map(taskTemplateNodeVo -> buildTaskInstanceDetail(id, taskTemplateNodeVo))
.collect(Collectors.toList());
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));
// ========================== 顺序执行 ==========================
executeTaskSteps(taskInstanceInfoService, taskInstanceDetailService, id, dataMap, taskTemplateNodeVos,
codeIdMap);
executeTaskSteps(taskInstanceInfoService, taskInstanceDetailService, id, dataMap, taskTemplateNodeVos, codeIdMap);
}
/**
@@ -178,16 +171,14 @@ public class TaskJobBean extends QuartzJobBean {
* @param taskTemplateNodes 需要执行的任务节点列表
* @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 {
boolean isTerminate = false;
for (TaskTemplateNodeVo taskTemplateNodeVo : taskTemplateNodes) {
String code = taskTemplateNodeVo.getCode();
while (true) {
TaskInstanceDetailTb currentTaskInstanceNode =
taskInstanceDetailService.getOneByInstanceIdAndCode(id, code);
ThreadUtil.safeSleep(5000);
TaskInstanceDetailTb currentTaskInstanceNode = taskInstanceDetailService.getOneByInstanceIdAndCode(id, code);
if (TaskStatusEnum.Fail.getCode().equals(currentTaskInstanceNode.getExecuteStatus())) {
log.info("任务节点执行失败, instanceId={}, bizCode={}", id, code);
isTerminate = true;
@@ -197,30 +188,30 @@ public class TaskJobBean extends QuartzJobBean {
break;
} else if (TaskStatusEnum.Pending.getCode().equals(currentTaskInstanceNode.getExecuteStatus())) {
log.info("任务节点由待执行变更为执行中, instanceId={}, bizCode={}", id, code);
try {
TaskStepExecutor executor = KitSpringBeanHolder.getBean("taskStep" + getBeanAlias(code));
taskInstanceDetailService.fastStart(id, code, dataMap);
executor.execute(codeIdMap.getOrDefault(code, null), dataMap, taskTemplateNodeVo);
taskInstanceDetailService.fastSuccessWithInfo(id, code, null);
} catch (Exception e) {
log.error("任务节点执行失败", e);
taskInstanceDetailService.fastFailWithInfo(id, code, e.getMessage());
throw new ServerException(e);
}
break;
ThreadUtil.execAsync(() -> {
try {
TaskStepExecutor executor = KitSpringBeanHolder.getBean("taskStep" + getBeanAlias(code));
taskInstanceDetailService.fastStart(id, code, dataMap);
executor.execute(codeIdMap.getOrDefault(code, null), dataMap, taskTemplateNodeVo);
taskInstanceDetailService.fastSuccessWithInfo(id, code, null);
} catch (Exception e) {
log.error("任务节点执行失败", e);
taskInstanceDetailService.fastFailWithInfo(id, code, e.getMessage());
}
});
} else if (TaskStatusEnum.Running.getCode().equals(currentTaskInstanceNode.getExecuteStatus())) {
ThreadUtil.safeSleep(5000);
log.info("任务节点执行中, instanceId={}, bizCode={}", id, code);
} else {
// 处理未知状态
log.warn("任务节点处于未知状态, instanceId={}, bizCode={}, status={}", id, code,
currentTaskInstanceNode.getExecuteStatus());
ThreadUtil.safeSleep(5000);
log.warn("任务节点处于未知状态, instanceId={}, bizCode={}, status={}", id, code, currentTaskInstanceNode.getExecuteStatus());
}
}
if (isTerminate) {
// 跳出任务线
break;
}
}
// 主动终止 或者 被动退出的
if (isTerminate) {
taskInstanceInfoService.fastFailWithMessageData(id, "任务执行失败", dataMap);
} else {
@@ -26,6 +26,5 @@ public interface TaskStepExecutor {
* @param jobDataMap 执行参数
* @param taskTemplateNode 任务节点信息
*/
void execute(Long instanceDetailId, JobDataMap jobDataMap, TaskTemplateNodeVo taskTemplateNode)
throws BadRequestException;
void execute(Long instanceDetailId, JobDataMap jobDataMap, TaskTemplateNodeVo taskTemplateNode) throws BadRequestException;
}
@@ -30,9 +30,6 @@ server:
# IMMEDIATE(立即): 当应用程序以"IMMEDIATE"模式关闭时,它会立即终止,而不管当前是否有任何活动任务或请求。这种方式适用于那些可以立即停止而不会造成严重问题的情况。
shutdown: graceful
spring:
application:
name: cutejava
title: CuteJava
lifecycle:
# 采用java.time.Duration格式的值,如果在这个时间内,优雅停机没有停掉应用,超过这个时间就会强制停止应用
timeout-per-shutdown-phase: 30s
@@ -160,7 +157,7 @@ mybatis-plus:
app:
# 密码加密传输,前端公钥加密,后端私钥解密
rsa:
private-key: MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8mp0f3FE0GYP3AYPaJF7jUd1M0XxFSE2ceK3k2kw20YvQ09NJKk+OMjWQl9WitG9pB6tSCQIDAQABAkA2SimBrWC2/wvauBuYqjCFwLvYiRYqZKThUS3MZlebXJiLB+Ue/gUifAAKIg1avttUZsHBHrop4qfJCwAI0+YRAiEA+W3NK/RaXtnRqmoUUkb59zsZUBLpvZgQPfj1MhyHDz0CIQDYhsAhPJ3mgS64NbUZmGWuuNKp5coY2GIj/zYDMJp6vQIgUueLFXv/eZ1ekgz2Oi67MNCk5jeTF2BurZqNLR3MSmUCIFT3Q6uHMtsB9Eha4u7hS31tj1UWE+D+ADzp59MGnoftAiBeHT7gDMuqeJHPL4b+kC+gzV4FGTfhR9q3tTbklZkD2A==
private-key: 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
# 鉴权
jwt:
# 必须使用最少88位的Base64对该令牌进行编码 cn.odboy.util.CsBase64SecretUtil
@@ -225,4 +222,4 @@ logging:
total-size-cap: 1GB
level:
# root: debug
cn.odboy: info
cn.odboy: info
@@ -30,9 +30,6 @@ server:
# IMMEDIATE(立即): 当应用程序以"IMMEDIATE"模式关闭时,它会立即终止,而不管当前是否有任何活动任务或请求。这种方式适用于那些可以立即停止而不会造成严重问题的情况。
shutdown: graceful
spring:
application:
name: cutejava
title: CuteJava
lifecycle:
# 采用java.time.Duration格式的值,如果在这个时间内,优雅停机没有停掉应用,超过这个时间就会强制停止应用
timeout-per-shutdown-phase: 30s
@@ -159,11 +156,11 @@ mybatis-plus:
app:
# 密码加密传输,前端公钥加密,后端私钥解密
rsa:
private-key: MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8mp0f3FE0GYP3AYPaJF7jUd1M0XxFSE2ceK3k2kw20YvQ09NJKk+OMjWQl9WitG9pB6tSCQIDAQABAkA2SimBrWC2/wvauBuYqjCFwLvYiRYqZKThUS3MZlebXJiLB+Ue/gUifAAKIg1avttUZsHBHrop4qfJCwAI0+YRAiEA+W3NK/RaXtnRqmoUUkb59zsZUBLpvZgQPfj1MhyHDz0CIQDYhsAhPJ3mgS64NbUZmGWuuNKp5coY2GIj/zYDMJp6vQIgUueLFXv/eZ1ekgz2Oi67MNCk5jeTF2BurZqNLR3MSmUCIFT3Q6uHMtsB9Eha4u7hS31tj1UWE+D+ADzp59MGnoftAiBeHT7gDMuqeJHPL4b+kC+gzV4FGTfhR9q3tTbklZkD2A==
private-key: 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
# 鉴权
jwt:
# 必须使用最少88位的Base64对该令牌进行编码
base64-secret: ZmQ0ZGI5NjQ0MDQwY2I4MjMxY2Y3ZmI3MjdhN2ZmMjNhODViOTg1ZGE0NTBjMGM4NDA5NzYxMjdjOWMwYWRmZTBlZjlhNGY3ZTg4Y2U3YTE1ODVkZDU5Y2Y3OGYwZWE1NzUzNWQ2YjFjZDc0NGMxZWU2MmQ3MjY1NzJmNTE0MzI=
# 必须使用最少88位的Base64对该令牌进行编码 cn.odboy.util.CsBase64SecretUtil
base64-secret: YzE5ZWNjMjlkMGY4NDc4MDlmYzE0Y2I0MTk4YTQ4YjY5NTU0OGQxODNjNjQ0MmU1YjBmZTYwYjljYzI0M2M4MTJkZjk3Y2ZlYjg3ZTQxMjM4MjEwY2ZiYzE4YmFiYmZlZDVhM2M1YmI3M2FmNDFmNWJmM2MyMTM1ZDNhMmRmYzY=
# 令牌过期时间 此处单位/毫秒 ,默认4小时,可在此网站生成 https://www.convertworld.com/zh-hans/time/milliseconds.html
token-validity-in-seconds: 14400000
# token 续期检查时间范围(默认30分钟,单位毫秒),在token即将过期的一段时间内用户操作了,则给用户的token续期
@@ -224,4 +221,4 @@ logging:
total-size-cap: 1GB
level:
# root: debug
cn.odboy: info
cn.odboy: info
@@ -9,7 +9,7 @@ spring:
quartz:
scheduler:
# 必需,指定调度器实例的名称
instanceName: ${spring.application.name}
instanceName: cutejava
# 必需,指定调度器实例的 ID
instanceId: auto
threadPool: