refactor(framework): 优化代码结构和性能

This commit is contained in:
2026-02-26 14:40:43 +08:00
parent 643a211f95
commit aa4f062026
24 changed files with 153 additions and 111 deletions
@@ -51,6 +51,7 @@ public class KitSpringBeanHolder implements ApplicationContextAware, DisposableB
/** /**
* 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型. * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.
*/ */
@SuppressWarnings("all")
public static <T> T getBean(String name) { public static <T> T getBean(String name) {
assertContextInjected(); assertContextInjected();
return (T) applicationContext.getBean(name); return (T) applicationContext.getBean(name);
@@ -261,13 +261,11 @@ public class KitRedisHelper {
return null; return null;
} }
// 如果 value 不是目标类型, 则尝试将其反序列化为 clazz 类型 // 如果 value 不是目标类型, 则尝试将其反序列化为 clazz 类型
if (!clazz.isInstance(value)) { boolean isInstance = clazz.isInstance(value);
return JSON.parseObject(value.toString(), clazz); if (isInstance) {
} else if (clazz.isInstance(value)) {
return clazz.cast(value); return clazz.cast(value);
} else {
return null;
} }
return JSON.parseObject(value.toString(), clazz);
} }
/** /**
@@ -631,7 +629,7 @@ public class KitRedisHelper {
public long setRemove(String key, Object... values) { public long setRemove(String key, Object... values) {
try { try {
Long count = redisTemplate.opsForSet().remove(key, values); Long count = redisTemplate.opsForSet().remove(key, values);
return count; return count == null ? 0 : count;
} catch (Exception e) { } catch (Exception e) {
log.error(e.getMessage(), e); log.error(e.getMessage(), e);
return 0; return 0;
@@ -87,6 +87,15 @@ public class ConfigurerAdapter implements WebMvcConfigurer {
FastJsonHttpMessageConverter fastJsonConverter = new FastJsonHttpMessageConverter(); FastJsonHttpMessageConverter fastJsonConverter = new FastJsonHttpMessageConverter();
List<MediaType> supportMediaTypeList = new ArrayList<>(); List<MediaType> supportMediaTypeList = new ArrayList<>();
supportMediaTypeList.add(MediaType.APPLICATION_JSON); supportMediaTypeList.add(MediaType.APPLICATION_JSON);
FastJsonConfig config = this.getFastJsonConfig();
fastJsonConverter.setFastJsonConfig(config);
fastJsonConverter.setSupportedMediaTypes(supportMediaTypeList);
fastJsonConverter.setDefaultCharset(StandardCharsets.UTF_8);
// 将 FastJsonHttpMessageConverter 添加到列表末尾
converters.add(fastJsonConverter);
}
private FastJsonConfig getFastJsonConfig() {
FastJsonConfig config = new FastJsonConfig(); FastJsonConfig config = new FastJsonConfig();
config.setDateFormat("yyyy-MM-dd HH:mm:ss"); config.setDateFormat("yyyy-MM-dd HH:mm:ss");
// 开启引用检测, 枚举支持 // 开启引用检测, 枚举支持
@@ -104,11 +113,7 @@ public class ConfigurerAdapter implements WebMvcConfigurer {
// config.setWriterFeatures(JSONWriter.Feature.WriteLongAsString); // config.setWriterFeatures(JSONWriter.Feature.WriteLongAsString);
config.setWriterFeatures(JSONWriter.Feature.WriteEnumUsingToString); config.setWriterFeatures(JSONWriter.Feature.WriteEnumUsingToString);
config.setWriterFeatures(JSONWriter.Feature.ReferenceDetection); config.setWriterFeatures(JSONWriter.Feature.ReferenceDetection);
fastJsonConverter.setFastJsonConfig(config); return config;
fastJsonConverter.setSupportedMediaTypes(supportMediaTypeList);
fastJsonConverter.setDefaultCharset(StandardCharsets.UTF_8);
// 将 FastJsonHttpMessageConverter 添加到列表末尾
converters.add(fastJsonConverter);
} }
/** /**
@@ -42,7 +42,7 @@ public class BizLockAspect {
@Around("@annotation(bizLock)") @Around("@annotation(bizLock)")
public Object around(ProceedingJoinPoint joinPoint, BizLock bizLock) throws Throwable { public Object around(ProceedingJoinPoint joinPoint, BizLock bizLock) throws Throwable {
// 解析SpEL表达式生成最终的lockKey // 解析SpEL表达式生成最终的lockKey
String lockKey = parseLockKey(joinPoint, bizLock); String lockKey = this.parseLockKey(joinPoint, bizLock);
boolean success = redisHelper.setIfAbsent(lockKey, lockKey, bizLock.leaseTime(), bizLock.timeUnit()); boolean success = redisHelper.setIfAbsent(lockKey, lockKey, bizLock.leaseTime(), bizLock.timeUnit());
if (!success) { if (!success) {
throw new BadRequestException(bizLock.errorMessage()); throw new BadRequestException(bizLock.errorMessage());
@@ -32,11 +32,7 @@ public class MpMetaObjectHandler implements MetaObjectHandler {
this.strictInsertFill(metaObject, "createTime", Date.class, now); this.strictInsertFill(metaObject, "createTime", Date.class, now);
this.strictInsertFill(metaObject, "updateTime", Date.class, now); this.strictInsertFill(metaObject, "updateTime", Date.class, now);
/* 操作人 */ /* 操作人 */
String username = "System"; String username = KitSecurityHelper.safeGetUsername();
try {
username = KitSecurityHelper.getCurrentUsername();
} catch (Exception ignored) {
}
this.strictInsertFill(metaObject, "createBy", String.class, username); this.strictInsertFill(metaObject, "createBy", String.class, username);
this.strictInsertFill(metaObject, "updateBy", String.class, username); this.strictInsertFill(metaObject, "updateBy", String.class, username);
} }
@@ -46,11 +42,7 @@ public class MpMetaObjectHandler implements MetaObjectHandler {
/* 更新时间 */ /* 更新时间 */
this.strictUpdateFill(metaObject, "updateTime", Date.class, DateTime.now()); this.strictUpdateFill(metaObject, "updateTime", Date.class, DateTime.now());
/* 操作人 */ /* 操作人 */
String username = "System"; String username = KitSecurityHelper.safeGetUsername();
try {
username = KitSecurityHelper.getCurrentUsername();
} catch (Exception ignored) {
}
this.strictUpdateFill(metaObject, "updateBy", String.class, username); this.strictUpdateFill(metaObject, "updateBy", String.class, username);
} }
} }
@@ -26,8 +26,10 @@ import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UserDetailsService;
@@ -106,6 +108,19 @@ public class KitSecurityHelper {
return getCurrentUsername(getToken()); return getCurrentUsername(getToken());
} }
/**
* 获取系统用户名称
*
* @return 系统用户名称
*/
public static String safeGetUsername() {
try {
return getCurrentUsername(getToken());
} catch (Exception e) {
return "anonymous";
}
}
/** /**
* 获取系统用户名称 * 获取系统用户名称
* *
@@ -51,7 +51,7 @@ public class TokenFilter extends GenericFilterBean {
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws ServletException, IOException { throws ServletException, IOException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
String token = resolveToken(httpServletRequest); String token = this.resolveToken(httpServletRequest);
// 对于 Token 为空的不需要去查 Redis // 对于 Token 为空的不需要去查 Redis
if (StrUtil.isNotBlank(token)) { if (StrUtil.isNotBlank(token)) {
// 获取用户Token的Key // 获取用户Token的Key
@@ -105,8 +105,8 @@ public class TokenProvider implements InitializingBean {
* @param token / * @param token /
* @return / * @return /
*/ */
Authentication getAuthentication(String token) { protected Authentication getAuthentication(String token) {
Claims claims = getClaims(token); Claims claims = this.getClaims(token);
User principal = new User(claims.getSubject(), "******", new ArrayList<>()); User principal = new User(claims.getSubject(), "******", new ArrayList<>());
return new UsernamePasswordAuthenticationToken(principal, token, new ArrayList<>()); return new UsernamePasswordAuthenticationToken(principal, token, new ArrayList<>());
} }
@@ -123,7 +123,7 @@ public class TokenProvider implements InitializingBean {
*/ */
public void checkRenewal(String token) { public void checkRenewal(String token) {
// 判断是否续期token,计算token的过期时间 // 判断是否续期token,计算token的过期时间
String loginKey = loginKey(token); String loginKey = this.loginKey(token);
long time = redisHelper.getExpire(loginKey) * 1000; long time = redisHelper.getExpire(loginKey) * 1000;
Date expireDate = DateUtil.offset(new Date(), DateField.MILLISECOND, (int) time); Date expireDate = DateUtil.offset(new Date(), DateField.MILLISECOND, (int) time);
// 判断当前时间与过期时间的时间差 // 判断当前时间与过期时间的时间差
@@ -150,7 +150,7 @@ public class TokenProvider implements InitializingBean {
* @return key * @return key
*/ */
public String loginKey(String token) { public String loginKey(String token) {
Claims claims = getClaims(token); Claims claims = this.getClaims(token);
return SystemCacheKey.ONLINE_USER + claims.getSubject() + ":" + getId(token); return SystemCacheKey.ONLINE_USER + claims.getSubject() + ":" + getId(token);
} }
@@ -161,7 +161,7 @@ public class TokenProvider implements InitializingBean {
* @return / * @return /
*/ */
public String getId(String token) { public String getId(String token) {
Claims claims = getClaims(token); Claims claims = this.getClaims(token);
return claims.get(AUTHORITIES_UUID_KEY, String.class); return claims.get(AUTHORITIES_UUID_KEY, String.class);
} }
} }
@@ -87,7 +87,8 @@ public class QuartzManage {
*/ */
public void updateJobCron(SystemQuartzJobTb quartzJob) { public void updateJobCron(SystemQuartzJobTb quartzJob) {
try { try {
TriggerKey triggerKey = TriggerKey.triggerKey(JOB_NAME + quartzJob.getId()); String uuid = JOB_NAME + quartzJob.getId();
TriggerKey triggerKey = TriggerKey.triggerKey(uuid);
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
// 如果不存在则创建一个定时任务 // 如果不存在则创建一个定时任务
if (trigger == null) { if (trigger == null) {
@@ -117,7 +118,8 @@ public class QuartzManage {
*/ */
public void deleteJob(SystemQuartzJobTb quartzJob) { public void deleteJob(SystemQuartzJobTb quartzJob) {
try { try {
JobKey jobKey = JobKey.jobKey(JOB_NAME + quartzJob.getId()); String uuid = JOB_NAME + quartzJob.getId();
JobKey jobKey = JobKey.jobKey(uuid);
scheduler.pauseJob(jobKey); scheduler.pauseJob(jobKey);
scheduler.deleteJob(jobKey); scheduler.deleteJob(jobKey);
} catch (Exception e) { } catch (Exception e) {
@@ -133,13 +135,14 @@ public class QuartzManage {
*/ */
public void resumeJob(SystemQuartzJobTb quartzJob) { public void resumeJob(SystemQuartzJobTb quartzJob) {
try { try {
TriggerKey triggerKey = TriggerKey.triggerKey(JOB_NAME + quartzJob.getId()); String uuid = JOB_NAME + quartzJob.getId();
TriggerKey triggerKey = TriggerKey.triggerKey(uuid);
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
// 如果不存在则创建一个定时任务 // 如果不存在则创建一个定时任务
if (trigger == null) { if (trigger == null) {
addJob(quartzJob); addJob(quartzJob);
} }
JobKey jobKey = JobKey.jobKey(JOB_NAME + quartzJob.getId()); JobKey jobKey = JobKey.jobKey(uuid);
scheduler.resumeJob(jobKey); scheduler.resumeJob(jobKey);
} catch (Exception e) { } catch (Exception e) {
log.error("恢复定时任务失败", e); log.error("恢复定时任务失败", e);
@@ -178,7 +181,8 @@ public class QuartzManage {
*/ */
public void pauseJob(SystemQuartzJobTb quartzJob) { public void pauseJob(SystemQuartzJobTb quartzJob) {
try { try {
JobKey jobKey = JobKey.jobKey(JOB_NAME + quartzJob.getId()); String uuid = JOB_NAME + quartzJob.getId();
JobKey jobKey = JobKey.jobKey(uuid);
scheduler.pauseJob(jobKey); scheduler.pauseJob(jobKey);
} catch (Exception e) { } catch (Exception e) {
log.error("定时任务暂停失败", e); log.error("定时任务暂停失败", e);
@@ -573,7 +573,7 @@ public class SystemMenuService {
menuSet.add(menu); menuSet.add(menu);
List<SystemMenuTb> menus = this.listMenuByPid(menu.getId(), true); List<SystemMenuTb> menus = this.listMenuByPid(menu.getId(), true);
if (CollUtil.isNotEmpty(menus)) { if (CollUtil.isNotEmpty(menus)) {
queryChildMenuByArgs(menus, menuSet); this.queryChildMenuByArgs(menus, menuSet);
} }
} }
return menuSet; return menuSet;
@@ -37,6 +37,7 @@ import cn.odboy.util.KitValidUtil;
import cn.odboy.util.xlsx.KitExcelExporter; import cn.odboy.util.xlsx.KitExcelExporter;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.jetbrains.annotations.NotNull;
import org.quartz.CronExpression; import org.quartz.CronExpression;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -237,20 +238,26 @@ public class SystemQuartzJobService {
List<SystemQuartzJobTb> systemQuartzJobTbs = this.queryQuartzJobByArgs(args); List<SystemQuartzJobTb> systemQuartzJobTbs = this.queryQuartzJobByArgs(args);
List<SystemQuartzJobExportRowVo> rowVos = new ArrayList<>(); List<SystemQuartzJobExportRowVo> rowVos = new ArrayList<>();
for (SystemQuartzJobTb dataObject : systemQuartzJobTbs) { for (SystemQuartzJobTb dataObject : systemQuartzJobTbs) {
SystemQuartzJobExportRowVo rowVo = new SystemQuartzJobExportRowVo(); SystemQuartzJobExportRowVo rowVo = this.getExportRowVo(dataObject);
rowVo.setJobName(dataObject.getJobName());
rowVo.setBeanName(dataObject.getBeanName());
rowVo.setMethodName(dataObject.getMethodName());
rowVo.setParams(dataObject.getParams());
rowVo.setCronExpression(dataObject.getCronExpression());
rowVo.setIsPause(dataObject.getIsPause() ? "暂停中" : "运行中");
rowVo.setDescription(dataObject.getDescription());
rowVo.setCreateTime(dataObject.getCreateTime());
rowVos.add(rowVo); rowVos.add(rowVo);
} }
KitExcelExporter.exportSimple(response, "定时任务数据", SystemQuartzJobExportRowVo.class, rowVos); KitExcelExporter.exportSimple(response, "定时任务数据", SystemQuartzJobExportRowVo.class, rowVos);
} }
@NotNull
private SystemQuartzJobExportRowVo getExportRowVo(SystemQuartzJobTb dataObject) {
SystemQuartzJobExportRowVo rowVo = new SystemQuartzJobExportRowVo();
rowVo.setJobName(dataObject.getJobName());
rowVo.setBeanName(dataObject.getBeanName());
rowVo.setMethodName(dataObject.getMethodName());
rowVo.setParams(dataObject.getParams());
rowVo.setCronExpression(dataObject.getCronExpression());
rowVo.setIsPause(dataObject.getIsPause() ? "暂停中" : "运行中");
rowVo.setDescription(dataObject.getDescription());
rowVo.setCreateTime(dataObject.getCreateTime());
return rowVo;
}
/** /**
* 导出定时任务日志数据 * 导出定时任务日志数据
*/ */
@@ -51,6 +51,7 @@ public class KitSpringBeanHolder implements ApplicationContextAware, DisposableB
/** /**
* 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型. * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.
*/ */
@SuppressWarnings("all")
public static <T> T getBean(String name) { public static <T> T getBean(String name) {
assertContextInjected(); assertContextInjected();
return (T) applicationContext.getBean(name); return (T) applicationContext.getBean(name);
@@ -86,6 +86,7 @@ public class SwaggerConfig {
mappings.addAll(filteredMappings); mappings.addAll(filteredMappings);
} }
@SuppressWarnings("all")
private List<RequestMappingInfoHandlerMapping> getHandlerMappings(Object bean) { private List<RequestMappingInfoHandlerMapping> getHandlerMappings(Object bean) {
Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings"); Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings");
if (field != null) { if (field != null) {
@@ -20,6 +20,7 @@ import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSON;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
@@ -29,6 +30,7 @@ import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnection;
@@ -207,16 +209,18 @@ public class KitRedisHelper {
* *
* @param pattern / * @param pattern /
*/ */
@SuppressWarnings("all")
public void scanDel(String pattern) { public void scanDel(String pattern) {
ScanOptions options = ScanOptions.scanOptions().match(pattern).count(100).build(); ScanOptions options = ScanOptions.scanOptions().match(pattern).count(100).build();
try (Cursor<byte[]> cursor = redisTemplate.executeWithStickyConnection(connection -> { try (
try { Cursor<byte[]> cursor = redisTemplate.executeWithStickyConnection(connection -> {
return (Cursor<byte[]>) new ConvertingCursor<>( try {
connection.scan(options), redisTemplate.getKeySerializer()::deserialize); return (Cursor<byte[]>) new ConvertingCursor<>(connection.scan(options), redisTemplate.getKeySerializer()::deserialize);
} catch (Exception e) { } catch (Exception e) {
throw new RuntimeException("Redis scan operation failed", e); throw new RuntimeException("Redis scan operation failed", e);
} }
})) { })
) {
List<Object> keysToDelete = new ArrayList<>(); List<Object> keysToDelete = new ArrayList<>();
while (cursor.hasNext()) { while (cursor.hasNext()) {
Object key = cursor.next(); Object key = cursor.next();
@@ -259,13 +263,11 @@ public class KitRedisHelper {
return null; return null;
} }
// 如果 value 不是目标类型, 则尝试将其反序列化为 clazz 类型 // 如果 value 不是目标类型, 则尝试将其反序列化为 clazz 类型
if (!clazz.isInstance(value)) { boolean isInstance = clazz.isInstance(value);
return JSON.parseObject(value.toString(), clazz); if (isInstance) {
} else if (clazz.isInstance(value)) {
return clazz.cast(value); return clazz.cast(value);
} else {
return null;
} }
return JSON.parseObject(value.toString(), clazz);
} }
/** /**
@@ -629,7 +631,7 @@ public class KitRedisHelper {
public long setRemove(String key, Object... values) { public long setRemove(String key, Object... values) {
try { try {
Long count = redisTemplate.opsForSet().remove(key, values); Long count = redisTemplate.opsForSet().remove(key, values);
return count; return count == null ? 0 : count;
} catch (Exception e) { } catch (Exception e) {
log.error(e.getMessage(), e); log.error(e.getMessage(), e);
return 0; return 0;
@@ -86,6 +86,15 @@ public class ConfigurerAdapter implements WebMvcConfigurer {
FastJsonHttpMessageConverter fastJsonConverter = new FastJsonHttpMessageConverter(); FastJsonHttpMessageConverter fastJsonConverter = new FastJsonHttpMessageConverter();
List<MediaType> supportMediaTypeList = new ArrayList<>(); List<MediaType> supportMediaTypeList = new ArrayList<>();
supportMediaTypeList.add(MediaType.APPLICATION_JSON); supportMediaTypeList.add(MediaType.APPLICATION_JSON);
FastJsonConfig config = this.getFastJsonConfig();
fastJsonConverter.setFastJsonConfig(config);
fastJsonConverter.setSupportedMediaTypes(supportMediaTypeList);
fastJsonConverter.setDefaultCharset(StandardCharsets.UTF_8);
// 将 FastJsonHttpMessageConverter 添加到列表末尾
converters.add(fastJsonConverter);
}
private FastJsonConfig getFastJsonConfig() {
FastJsonConfig config = new FastJsonConfig(); FastJsonConfig config = new FastJsonConfig();
config.setDateFormat("yyyy-MM-dd HH:mm:ss"); config.setDateFormat("yyyy-MM-dd HH:mm:ss");
// 开启引用检测, 枚举支持 // 开启引用检测, 枚举支持
@@ -103,11 +112,7 @@ public class ConfigurerAdapter implements WebMvcConfigurer {
// config.setWriterFeatures(JSONWriter.Feature.WriteLongAsString); // config.setWriterFeatures(JSONWriter.Feature.WriteLongAsString);
config.setWriterFeatures(JSONWriter.Feature.WriteEnumUsingToString); config.setWriterFeatures(JSONWriter.Feature.WriteEnumUsingToString);
config.setWriterFeatures(JSONWriter.Feature.ReferenceDetection); config.setWriterFeatures(JSONWriter.Feature.ReferenceDetection);
fastJsonConverter.setFastJsonConfig(config); return config;
fastJsonConverter.setSupportedMediaTypes(supportMediaTypeList);
fastJsonConverter.setDefaultCharset(StandardCharsets.UTF_8);
// 将 FastJsonHttpMessageConverter 添加到列表末尾
converters.add(fastJsonConverter);
} }
/** /**
@@ -42,7 +42,7 @@ public class BizLockAspect {
@Around("@annotation(bizLock)") @Around("@annotation(bizLock)")
public Object around(ProceedingJoinPoint joinPoint, BizLock bizLock) throws Throwable { public Object around(ProceedingJoinPoint joinPoint, BizLock bizLock) throws Throwable {
// 解析SpEL表达式生成最终的lockKey // 解析SpEL表达式生成最终的lockKey
String lockKey = parseLockKey(joinPoint, bizLock); String lockKey = this.parseLockKey(joinPoint, bizLock);
boolean success = redisHelper.setIfAbsent(lockKey, lockKey, bizLock.leaseTime(), bizLock.timeUnit()); boolean success = redisHelper.setIfAbsent(lockKey, lockKey, bizLock.leaseTime(), bizLock.timeUnit());
if (!success) { if (!success) {
throw new BadRequestException(bizLock.errorMessage()); throw new BadRequestException(bizLock.errorMessage());
@@ -32,11 +32,7 @@ public class MpMetaObjectHandler implements MetaObjectHandler {
this.strictInsertFill(metaObject, "createTime", Date.class, now); this.strictInsertFill(metaObject, "createTime", Date.class, now);
this.strictInsertFill(metaObject, "updateTime", Date.class, now); this.strictInsertFill(metaObject, "updateTime", Date.class, now);
/* 操作人 */ /* 操作人 */
String username = "System"; String username = KitSecurityHelper.safeGetUsername();
try {
username = KitSecurityHelper.getCurrentUsername();
} catch (Exception ignored) {
}
this.strictInsertFill(metaObject, "createBy", String.class, username); this.strictInsertFill(metaObject, "createBy", String.class, username);
this.strictInsertFill(metaObject, "updateBy", String.class, username); this.strictInsertFill(metaObject, "updateBy", String.class, username);
} }
@@ -46,11 +42,7 @@ public class MpMetaObjectHandler implements MetaObjectHandler {
/* 更新时间 */ /* 更新时间 */
this.strictUpdateFill(metaObject, "updateTime", Date.class, DateTime.now()); this.strictUpdateFill(metaObject, "updateTime", Date.class, DateTime.now());
/* 操作人 */ /* 操作人 */
String username = "System"; String username = KitSecurityHelper.safeGetUsername();
try {
username = KitSecurityHelper.getCurrentUsername();
} catch (Exception ignored) {
}
this.strictUpdateFill(metaObject, "updateBy", String.class, username); this.strictUpdateFill(metaObject, "updateBy", String.class, username);
} }
} }
@@ -24,9 +24,11 @@ import cn.odboy.system.constant.SystemDataScopeEnum;
import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UserDetailsService;
@@ -105,6 +107,19 @@ public class KitSecurityHelper {
return getCurrentUsername(getToken()); return getCurrentUsername(getToken());
} }
/**
* 获取系统用户名称
*
* @return 系统用户名称
*/
public static String safeGetUsername() {
try {
return getCurrentUsername(getToken());
} catch (Exception e) {
return "anonymous";
}
}
/** /**
* 获取系统用户名称 * 获取系统用户名称
* *
@@ -50,7 +50,7 @@ public class TokenFilter extends GenericFilterBean {
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws ServletException, IOException { throws ServletException, IOException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
String token = resolveToken(httpServletRequest); String token = this.resolveToken(httpServletRequest);
// 对于 Token 为空的不需要去查 Redis // 对于 Token 为空的不需要去查 Redis
if (StrUtil.isNotBlank(token)) { if (StrUtil.isNotBlank(token)) {
// 获取用户Token的Key // 获取用户Token的Key
@@ -104,8 +104,8 @@ public class TokenProvider implements InitializingBean {
* @param token / * @param token /
* @return / * @return /
*/ */
Authentication getAuthentication(String token) { protected Authentication getAuthentication(String token) {
Claims claims = getClaims(token); Claims claims = this.getClaims(token);
User principal = new User(claims.getSubject(), "******", new ArrayList<>()); User principal = new User(claims.getSubject(), "******", new ArrayList<>());
return new UsernamePasswordAuthenticationToken(principal, token, new ArrayList<>()); return new UsernamePasswordAuthenticationToken(principal, token, new ArrayList<>());
} }
@@ -122,7 +122,7 @@ public class TokenProvider implements InitializingBean {
*/ */
public void checkRenewal(String token) { public void checkRenewal(String token) {
// 判断是否续期token,计算token的过期时间 // 判断是否续期token,计算token的过期时间
String loginKey = loginKey(token); String loginKey = this.loginKey(token);
long time = redisHelper.getExpire(loginKey) * 1000; long time = redisHelper.getExpire(loginKey) * 1000;
Date expireDate = DateUtil.offset(new Date(), DateField.MILLISECOND, (int) time); Date expireDate = DateUtil.offset(new Date(), DateField.MILLISECOND, (int) time);
// 判断当前时间与过期时间的时间差 // 判断当前时间与过期时间的时间差
@@ -149,7 +149,7 @@ public class TokenProvider implements InitializingBean {
* @return key * @return key
*/ */
public String loginKey(String token) { public String loginKey(String token) {
Claims claims = getClaims(token); Claims claims = this.getClaims(token);
return SystemCacheKey.ONLINE_USER + claims.getSubject() + ":" + getId(token); return SystemCacheKey.ONLINE_USER + claims.getSubject() + ":" + getId(token);
} }
@@ -160,7 +160,7 @@ public class TokenProvider implements InitializingBean {
* @return / * @return /
*/ */
public String getId(String token) { public String getId(String token) {
Claims claims = getClaims(token); Claims claims = this.getClaims(token);
return claims.get(AUTHORITIES_UUID_KEY, String.class); return claims.get(AUTHORITIES_UUID_KEY, String.class);
} }
} }
@@ -88,7 +88,8 @@ public class QuartzManage {
*/ */
public void updateJobCron(SystemQuartzJobTb quartzJob) { public void updateJobCron(SystemQuartzJobTb quartzJob) {
try { try {
TriggerKey triggerKey = TriggerKey.triggerKey(JOB_NAME + quartzJob.getId()); String uuid = JOB_NAME + quartzJob.getId();
TriggerKey triggerKey = TriggerKey.triggerKey(uuid);
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
// 如果不存在则创建一个定时任务 // 如果不存在则创建一个定时任务
if (trigger == null) { if (trigger == null) {
@@ -118,7 +119,8 @@ public class QuartzManage {
*/ */
public void deleteJob(SystemQuartzJobTb quartzJob) { public void deleteJob(SystemQuartzJobTb quartzJob) {
try { try {
JobKey jobKey = JobKey.jobKey(JOB_NAME + quartzJob.getId()); String uuid = JOB_NAME + quartzJob.getId();
JobKey jobKey = JobKey.jobKey(uuid);
scheduler.pauseJob(jobKey); scheduler.pauseJob(jobKey);
scheduler.deleteJob(jobKey); scheduler.deleteJob(jobKey);
} catch (Exception e) { } catch (Exception e) {
@@ -134,13 +136,14 @@ public class QuartzManage {
*/ */
public void resumeJob(SystemQuartzJobTb quartzJob) { public void resumeJob(SystemQuartzJobTb quartzJob) {
try { try {
TriggerKey triggerKey = TriggerKey.triggerKey(JOB_NAME + quartzJob.getId()); String uuid = JOB_NAME + quartzJob.getId();
TriggerKey triggerKey = TriggerKey.triggerKey(uuid);
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
// 如果不存在则创建一个定时任务 // 如果不存在则创建一个定时任务
if (trigger == null) { if (trigger == null) {
addJob(quartzJob); addJob(quartzJob);
} }
JobKey jobKey = JobKey.jobKey(JOB_NAME + quartzJob.getId()); JobKey jobKey = JobKey.jobKey(uuid);
scheduler.resumeJob(jobKey); scheduler.resumeJob(jobKey);
} catch (Exception e) { } catch (Exception e) {
log.error("恢复定时任务失败", e); log.error("恢复定时任务失败", e);
@@ -179,7 +182,8 @@ public class QuartzManage {
*/ */
public void pauseJob(SystemQuartzJobTb quartzJob) { public void pauseJob(SystemQuartzJobTb quartzJob) {
try { try {
JobKey jobKey = JobKey.jobKey(JOB_NAME + quartzJob.getId()); String uuid = JOB_NAME + quartzJob.getId();
JobKey jobKey = JobKey.jobKey(uuid);
scheduler.pauseJob(jobKey); scheduler.pauseJob(jobKey);
} catch (Exception e) { } catch (Exception e) {
log.error("定时任务暂停失败", e); log.error("定时任务暂停失败", e);
@@ -573,7 +573,7 @@ public class SystemMenuService {
menuSet.add(menu); menuSet.add(menu);
List<SystemMenuTb> menus = this.listMenuByPid(menu.getId(), true); List<SystemMenuTb> menus = this.listMenuByPid(menu.getId(), true);
if (CollUtil.isNotEmpty(menus)) { if (CollUtil.isNotEmpty(menus)) {
queryChildMenuByArgs(menus, menuSet); this.queryChildMenuByArgs(menus, menuSet);
} }
} }
return menuSet; return menuSet;
@@ -42,6 +42,8 @@ import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.jetbrains.annotations.NotNull;
import org.quartz.CronExpression; import org.quartz.CronExpression;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -237,20 +239,26 @@ public class SystemQuartzJobService {
List<SystemQuartzJobTb> systemQuartzJobTbs = this.queryQuartzJobByArgs(args); List<SystemQuartzJobTb> systemQuartzJobTbs = this.queryQuartzJobByArgs(args);
List<SystemQuartzJobExportRowVo> rowVos = new ArrayList<>(); List<SystemQuartzJobExportRowVo> rowVos = new ArrayList<>();
for (SystemQuartzJobTb dataObject : systemQuartzJobTbs) { for (SystemQuartzJobTb dataObject : systemQuartzJobTbs) {
SystemQuartzJobExportRowVo rowVo = new SystemQuartzJobExportRowVo(); SystemQuartzJobExportRowVo rowVo = this.getExportRowVo(dataObject);
rowVo.setJobName(dataObject.getJobName());
rowVo.setBeanName(dataObject.getBeanName());
rowVo.setMethodName(dataObject.getMethodName());
rowVo.setParams(dataObject.getParams());
rowVo.setCronExpression(dataObject.getCronExpression());
rowVo.setIsPause(dataObject.getIsPause() ? "暂停中" : "运行中");
rowVo.setDescription(dataObject.getDescription());
rowVo.setCreateTime(dataObject.getCreateTime());
rowVos.add(rowVo); rowVos.add(rowVo);
} }
KitExcelExporter.exportSimple(response, "定时任务数据", SystemQuartzJobExportRowVo.class, rowVos); KitExcelExporter.exportSimple(response, "定时任务数据", SystemQuartzJobExportRowVo.class, rowVos);
} }
@NotNull
private SystemQuartzJobExportRowVo getExportRowVo(SystemQuartzJobTb dataObject) {
SystemQuartzJobExportRowVo rowVo = new SystemQuartzJobExportRowVo();
rowVo.setJobName(dataObject.getJobName());
rowVo.setBeanName(dataObject.getBeanName());
rowVo.setMethodName(dataObject.getMethodName());
rowVo.setParams(dataObject.getParams());
rowVo.setCronExpression(dataObject.getCronExpression());
rowVo.setIsPause(dataObject.getIsPause() ? "暂停中" : "运行中");
rowVo.setDescription(dataObject.getDescription());
rowVo.setCreateTime(dataObject.getCreateTime());
return rowVo;
}
/** /**
* 导出定时任务日志数据 * 导出定时任务日志数据
*/ */
@@ -39,9 +39,11 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import java.io.File; import java.io.File;
import java.util.List; import java.util.List;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@@ -56,8 +58,7 @@ import org.springframework.web.multipart.MultipartFile;
* @since 2025-07-15 * @since 2025-07-15
*/ */
@Service @Service
public class SystemMinioStorageServiceImpl extends ServiceImpl<SystemOssStorageMapper, SystemOssStorageTb> public class SystemMinioStorageServiceImpl extends ServiceImpl<SystemOssStorageMapper, SystemOssStorageTb> implements SystemOssStorageService {
implements SystemOssStorageService {
@Autowired @Autowired
private MinioRepository minioRepository; private MinioRepository minioRepository;
@@ -69,10 +70,7 @@ public class SystemMinioStorageServiceImpl extends ServiceImpl<SystemOssStorageM
private SystemOssStorageMapper systemOssStorageMapper; private SystemOssStorageMapper systemOssStorageMapper;
@Override @Override
public KitPageResult<SystemOssStorageVo> searchOssStorage( public KitPageResult<SystemOssStorageVo> searchOssStorage(SystemQueryStorageArgs args, Page<SystemOssStorageTb> page) {
SystemQueryStorageArgs args,
Page<SystemOssStorageTb> page
) {
IPage<SystemOssStorageVo> ossStorageTbs = this.selectOssStorageByArgs(args, page); IPage<SystemOssStorageVo> ossStorageTbs = this.selectOssStorageByArgs(args, page);
for (SystemOssStorageVo storageVo : ossStorageTbs.getRecords()) { for (SystemOssStorageVo storageVo : ossStorageTbs.getRecords()) {
storageVo.setFileSizeDesc(KitFileUtil.getSize(storageVo.getFileSize())); storageVo.setFileSizeDesc(KitFileUtil.getSize(storageVo.getFileSize()));
@@ -85,19 +83,14 @@ public class SystemMinioStorageServiceImpl extends ServiceImpl<SystemOssStorageM
LambdaQueryWrapper<SystemOssStorageTb> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<SystemOssStorageTb> wrapper = new LambdaQueryWrapper<>();
wrapper.and( wrapper.and(
StrUtil.isNotBlank(args.getBlurry()), StrUtil.isNotBlank(args.getBlurry()),
c -> c.like(SystemOssStorageTb::getFileName, args.getBlurry()).or() c -> c.like(SystemOssStorageTb::getFileName, args.getBlurry()).or().like(SystemOssStorageTb::getFilePrefix, args.getBlurry()).or()
.like(SystemOssStorageTb::getFilePrefix, args.getBlurry()).or() .like(SystemOssStorageTb::getFileMime, args.getBlurry()).or().like(SystemOssStorageTb::getFileMd5, args.getBlurry())
.like(SystemOssStorageTb::getFileMime, args.getBlurry()).or()
.like(SystemOssStorageTb::getFileMd5, args.getBlurry())
); );
if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) { if (CollUtil.isNotEmpty(args.getCreateTime()) && args.getCreateTime().size() >= 2) {
wrapper.between(SystemOssStorageTb::getUpdateTime, args.getCreateTime().get(0), wrapper.between(SystemOssStorageTb::getUpdateTime, args.getCreateTime().get(0), args.getCreateTime().get(1));
args.getCreateTime().get(1)
);
} }
wrapper.orderByAsc(SystemOssStorageTb::getId); wrapper.orderByAsc(SystemOssStorageTb::getId);
return systemOssStorageMapper.selectPage(page, wrapper) return systemOssStorageMapper.selectPage(page, wrapper).convert(i -> KitBeanUtil.copyToClass(i, SystemOssStorageVo.class));
.convert(i -> KitBeanUtil.copyToClass(i, SystemOssStorageVo.class));
} }
@Override @Override
@@ -161,8 +154,7 @@ public class SystemMinioStorageServiceImpl extends ServiceImpl<SystemOssStorageM
List<SystemOssStorageVo> systemOssStorageVos = this.queryOssStorage(args); List<SystemOssStorageVo> systemOssStorageVos = this.queryOssStorage(args);
// KitXlsxExportUtil.exportFile(response, "OSS文件上传记录数据", systemOssStorageVos, SystemOssStorageExportRowVo.class, // KitXlsxExportUtil.exportFile(response, "OSS文件上传记录数据", systemOssStorageVos, SystemOssStorageExportRowVo.class,
// (dataObject) -> CollUtil.newArrayList(KitBeanUtil.copyProperties(dataObject, SystemOssStorageExportRowVo.class))); // (dataObject) -> CollUtil.newArrayList(KitBeanUtil.copyProperties(dataObject, SystemOssStorageExportRowVo.class)));
List<SystemOssStorageExportRowVo> rowVos = List<SystemOssStorageExportRowVo> rowVos = KitBeanUtil.copyToList(systemOssStorageVos, SystemOssStorageExportRowVo.class);
KitBeanUtil.copyToList(systemOssStorageVos, SystemOssStorageExportRowVo.class);
KitExcelExporter.exportSimple(response, "OSS文件上传记录数据", SystemOssStorageExportRowVo.class, rowVos); KitExcelExporter.exportSimple(response, "OSS文件上传记录数据", SystemOssStorageExportRowVo.class, rowVos);
} }