diff --git a/main/manager-api/pom.xml b/main/manager-api/pom.xml
index 1b06bd7b..455ee6e1 100644
--- a/main/manager-api/pom.xml
+++ b/main/manager-api/pom.xml
@@ -21,14 +21,14 @@
5.10.1
1.2.20
3.5.17
- 5.8.24
- 1.19.1
+ 5.8.46
+ 1.22.2
4.6.0
2.8.8
- 3.18.0
+ 3.20.0
2.0.2
1.6.2
- 33.0.0-jre
+ 33.6.0-jre
4.20.0
4.1.0
3.4.0
diff --git a/main/manager-api/src/main/java/xiaozhi/common/utils/HashEncryptionUtil.java b/main/manager-api/src/main/java/xiaozhi/common/utils/HashEncryptionUtil.java
deleted file mode 100644
index 79b05192..00000000
--- a/main/manager-api/src/main/java/xiaozhi/common/utils/HashEncryptionUtil.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package xiaozhi.common.utils;
-
-import lombok.extern.slf4j.Slf4j;
-
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-
-/**
- * 哈希加密算法的工具类
- * @author zjy
- */
-@Slf4j
-public class HashEncryptionUtil {
- /**
- * 使用md5进行加密
- * @param context 被加密的内容
- * @return 哈希值
- */
- public static String Md5hexDigest(String context){
- return hexDigest(context,"MD5");
- }
-
- /**
- * 指定哈希算法进行加密
- * @param context 被加密的内容
- * @param algorithm 哈希算法
- * @return 哈希值
- */
- public static String hexDigest(String context,String algorithm ){
- // 获取MD5算法实例
- MessageDigest md = null;
- try {
- md = MessageDigest.getInstance(algorithm);
- } catch (NoSuchAlgorithmException e) {
- log.error("加密失败的算法:{}",algorithm);
- throw new RuntimeException("加密失败,"+ algorithm +"哈希算法系统不支持");
- }
- // 计算智能体id的MD5值
- byte[] messageDigest = md.digest(context.getBytes());
- // 将字节数组转换为十六进制字符串
- StringBuilder hexString = new StringBuilder();
- for (byte b : messageDigest) {
- String hex = Integer.toHexString(0xFF & b);
- if (hex.length() == 1) {
- hexString.append('0');
- }
- hexString.append(hex);
- }
- return hexString.toString();
- }
-
-}
diff --git a/main/manager-api/src/main/java/xiaozhi/common/utils/ToolUtil.java b/main/manager-api/src/main/java/xiaozhi/common/utils/ToolUtil.java
deleted file mode 100644
index 40888965..00000000
--- a/main/manager-api/src/main/java/xiaozhi/common/utils/ToolUtil.java
+++ /dev/null
@@ -1,89 +0,0 @@
-package xiaozhi.common.utils;
-
-import cn.hutool.core.util.ReUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.time.LocalDateTime;
-import java.time.ZoneId;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * 通用工具类
- */
-public class ToolUtil {
- private static final Logger logger = LoggerFactory.getLogger(ToolUtil.class);
-
- /**
- * 对象是否不为空(新增)
- */
- public static boolean isNotEmpty(Object o) {
- return !isEmpty(o);
- }
-
- /**
- * 对象是否为空
- */
- public static boolean isEmpty(Object o) {
- if (o == null) {
- return true;
- }
- if (o instanceof String) {
- if (o.toString().trim().equals("")) {
- return true;
- }
- } else if (o instanceof List) {
- if (((List) o).size() == 0) {
- return true;
- }
- } else if (o instanceof Map) {
- if (((Map) o).size() == 0) {
- return true;
- }
- } else if (o instanceof Set) {
- if (((Set) o).size() == 0) {
- return true;
- }
- } else if (o instanceof Object[]) {
- if (((Object[]) o).length == 0) {
- return true;
- }
- } else if (o instanceof int[]) {
- if (((int[]) o).length == 0) {
- return true;
- }
- } else if (o instanceof long[]) {
- if (((long[]) o).length == 0) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * 对象组中是否存在空对象
- */
- public static boolean isOneEmpty(Object... os) {
- for (Object o : os) {
- if (isEmpty(o)) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * 对象组中是否全是空对象
- */
- public static boolean isAllEmpty(Object... os) {
- for (Object o : os) {
- if (!isEmpty(o)) {
- return false;
- }
- }
- return true;
- }
-}
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentChatHistoryServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentChatHistoryServiceImpl.java
index 8337afae..14c55eac 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentChatHistoryServiceImpl.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentChatHistoryServiceImpl.java
@@ -5,6 +5,7 @@ import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
+import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.ListUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@@ -20,7 +21,6 @@ import xiaozhi.common.constant.Constant;
import xiaozhi.common.page.PageData;
import xiaozhi.common.utils.ConvertUtils;
import xiaozhi.common.utils.JsonUtils;
-import xiaozhi.common.utils.ToolUtil;
import xiaozhi.modules.agent.Enums.AgentChatHistoryType;
import xiaozhi.modules.agent.dao.AiAgentChatHistoryDao;
import xiaozhi.modules.agent.dto.AgentChatHistoryDTO;
@@ -107,7 +107,7 @@ public class AgentChatHistoryServiceImpl extends CrudRepository audioIds = baseMapper.getAudioIdsByAgentId(agentId);
- if (ToolUtil.isNotEmpty(audioIds)) {
+ if (CollUtil.isNotEmpty(audioIds)) {
// 每批删除1000条
List> batch = ListUtil.split(audioIds, 1000);
batch.forEach(dataList -> {
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentMcpAccessPointServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentMcpAccessPointServiceImpl.java
index 6ff84995..c67f7d7e 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentMcpAccessPointServiceImpl.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentMcpAccessPointServiceImpl.java
@@ -12,11 +12,11 @@ import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
+import cn.hutool.crypto.digest.DigestUtil;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import xiaozhi.common.constant.Constant;
import xiaozhi.common.utils.AESUtils;
-import xiaozhi.common.utils.HashEncryptionUtil;
import xiaozhi.common.utils.JsonUtils;
import xiaozhi.modules.agent.Enums.XiaoZhiMcpJsonRpcJson;
import xiaozhi.modules.agent.service.AgentMcpAccessPointService;
@@ -226,7 +226,7 @@ public class AgentMcpAccessPointServiceImpl implements AgentMcpAccessPointServic
*/
private static String encryptToken(String agentId, String key) {
// 使用md5对智能体id进行加密
- String md5 = HashEncryptionUtil.Md5hexDigest(agentId);
+ String md5 = DigestUtil.md5Hex(agentId);
// aes需要加密文本
String json = "{\"agentId\": \"%s\"}".formatted(md5);
// 加密后成token值
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java
index ecab5c09..8001c205 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java
@@ -18,6 +18,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.repository.IRepository;
+import cn.hutool.core.collection.CollUtil;
import lombok.AllArgsConstructor;
import xiaozhi.common.constant.Constant;
import xiaozhi.common.exception.ErrorCode;
@@ -29,7 +30,6 @@ import xiaozhi.common.service.impl.BaseServiceImpl;
import xiaozhi.common.user.UserDetail;
import xiaozhi.common.utils.ConvertUtils;
import xiaozhi.common.utils.JsonUtils;
-import xiaozhi.common.utils.ToolUtil;
import xiaozhi.modules.agent.dao.AgentDao;
import xiaozhi.modules.agent.dao.AgentTagDao;
import xiaozhi.modules.agent.dto.AgentCreateDTO;
@@ -243,13 +243,13 @@ public class AgentServiceImpl extends BaseServiceImpl imp
.map(DeviceEntity::getAgentId)
.distinct()
.collect(Collectors.toList());
- if (ToolUtil.isNotEmpty(agentIds)) {
+ if (CollUtil.isNotEmpty(agentIds)) {
w.or().in("id", agentIds);
}
// 按标签名搜索
List tagAgentIds = agentTagService.getAgentIdsByTagName(keyword);
- if (ToolUtil.isNotEmpty(tagAgentIds)) {
+ if (CollUtil.isNotEmpty(tagAgentIds)) {
w.or().in("id", tagAgentIds);
}
});
@@ -291,7 +291,7 @@ public class AgentServiceImpl extends BaseServiceImpl imp
// 获取标签列表
List tags = agentTagDao.selectByAgentId(agent.getId());
- if (ToolUtil.isNotEmpty(tags)) {
+ if (CollUtil.isNotEmpty(tags)) {
dto.setTags(tags.stream().map(this::convertTagToDTO).collect(Collectors.toList()));
}
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/controller/OTAMagController.java b/main/manager-api/src/main/java/xiaozhi/modules/device/controller/OTAMagController.java
index cfdf3913..868a31bc 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/device/controller/OTAMagController.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/device/controller/OTAMagController.java
@@ -5,8 +5,6 @@ import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@@ -31,6 +29,7 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
+import cn.hutool.crypto.digest.DigestUtil;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
@@ -288,7 +287,7 @@ public class OTAMagController {
// 返回文件路径
return new Result().ok(filePath.toString());
- } catch (IOException | NoSuchAlgorithmException e) {
+ } catch (IOException e) {
return new Result().error("文件上传失败:" + e.getMessage());
}
}
@@ -329,13 +328,7 @@ public class OTAMagController {
return result;
}
- private String calculateMD5(MultipartFile file) throws IOException, NoSuchAlgorithmException {
- MessageDigest md = MessageDigest.getInstance("MD5");
- byte[] digest = md.digest(file.getBytes());
- StringBuilder sb = new StringBuilder();
- for (byte b : digest) {
- sb.append(String.format("%02x", b));
- }
- return sb.toString();
+ private String calculateMD5(MultipartFile file) throws IOException {
+ return DigestUtil.md5Hex(file.getBytes());
}
}
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/service/impl/DeviceServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/device/service/impl/DeviceServiceImpl.java
index 2ed817b1..5acde875 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/device/service/impl/DeviceServiceImpl.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/device/service/impl/DeviceServiceImpl.java
@@ -31,6 +31,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
+import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
@@ -51,7 +52,6 @@ import xiaozhi.common.user.UserDetail;
import xiaozhi.common.utils.ConvertUtils;
import xiaozhi.common.utils.DateUtils;
import xiaozhi.common.utils.JsonUtils;
-import xiaozhi.common.utils.ToolUtil;
import xiaozhi.modules.device.dao.DeviceDao;
import xiaozhi.modules.device.dto.DeviceManualAddDTO;
import xiaozhi.modules.device.dto.DevicePageUserDTO;
@@ -103,15 +103,15 @@ public class DeviceServiceImpl extends BaseServiceImpl
throw new RenException(ErrorCode.ACTIVATION_CODE_EMPTY);
}
String deviceKey = RedisKeys.getOtaActivationCode(activationCode);
- Object cacheDeviceId = redisUtils.get(deviceKey);
- if (ToolUtil.isEmpty(cacheDeviceId)) {
+ String cacheDeviceId = (String) redisUtils.get(deviceKey);
+ if (StringUtils.isBlank(cacheDeviceId)) {
throw new RenException(ErrorCode.ACTIVATION_CODE_ERROR);
}
- String deviceId = (String) cacheDeviceId;
+ String deviceId = cacheDeviceId;
String safeDeviceId = deviceId.replace(":", "_").toLowerCase();
String cacheDeviceKey = RedisKeys.getOtaDeviceActivationInfo(safeDeviceId);
Map cacheMap = JsonUtils.toStringObjectMap(redisUtils.get(cacheDeviceKey));
- if (ToolUtil.isEmpty(cacheMap)) {
+ if (MapUtil.isEmpty(cacheMap)) {
throw new RenException(ErrorCode.ACTIVATION_CODE_ERROR);
}
String cachedCode = (String) cacheMap.get("activation_code");
@@ -181,7 +181,7 @@ public class DeviceServiceImpl extends BaseServiceImpl
.builder(new HashMap>())
.put("clientIds", deviceIds).build();
- if (ToolUtil.isNotEmpty(deviceIds)) {
+ if (CollUtil.isNotEmpty(deviceIds)) {
return postToMqttGateway(url, params);
}
// 返回响应
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/knowledge/controller/KnowledgeBaseController.java b/main/manager-api/src/main/java/xiaozhi/modules/knowledge/controller/KnowledgeBaseController.java
index 10aafdae..10e3d8dc 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/knowledge/controller/KnowledgeBaseController.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/knowledge/controller/KnowledgeBaseController.java
@@ -15,6 +15,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
+import cn.hutool.core.collection.CollUtil;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -23,7 +24,6 @@ import xiaozhi.common.exception.ErrorCode;
import xiaozhi.common.exception.RenException;
import xiaozhi.common.page.PageData;
import xiaozhi.common.utils.Result;
-import xiaozhi.common.utils.ToolUtil;
import xiaozhi.modules.knowledge.dto.KnowledgeBaseDTO;
import xiaozhi.modules.knowledge.service.KnowledgeBaseService;
import xiaozhi.modules.knowledge.service.KnowledgeManagerService;
@@ -140,7 +140,7 @@ public class KnowledgeBaseController {
List idList = Arrays.asList(ids.split(","));
List knowledgeBaseDTOs = Optional.ofNullable(knowledgeBaseService.getByDatasetIdList(idList))
.orElseGet(ArrayList::new);
- if (ToolUtil.isNotEmpty(knowledgeBaseDTOs)) {
+ if (CollUtil.isNotEmpty(knowledgeBaseDTOs)) {
knowledgeBaseDTOs.forEach(item -> {
// 检查权限:用户只能删除自己创建的知识库
if (item.getCreator() == null || !item.getCreator().equals(currentUserId)) {
@@ -160,4 +160,4 @@ public class KnowledgeBaseController {
List result = knowledgeBaseService.getRAGModels();
return new Result>().ok(result);
}
-}
\ No newline at end of file
+}
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/security/service/impl/CaptchaServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/security/service/impl/CaptchaServiceImpl.java
index 0d3666db..1c57364f 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/security/service/impl/CaptchaServiceImpl.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/security/service/impl/CaptchaServiceImpl.java
@@ -1,8 +1,7 @@
package xiaozhi.modules.security.service.impl;
import java.io.IOException;
-import java.util.Random;
-import java.util.concurrent.TimeUnit;
+import java.time.Duration;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
@@ -13,6 +12,7 @@ import com.google.common.cache.CacheBuilder;
import com.wf.captcha.SpecCaptcha;
import com.wf.captcha.base.Captcha;
+import cn.hutool.core.util.RandomUtil;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import xiaozhi.common.constant.Constant;
@@ -41,7 +41,7 @@ public class CaptchaServiceImpl implements CaptchaService {
* Local Cache 5分钟过期
*/
Cache localCache = CacheBuilder.newBuilder().maximumSize(1000)
- .expireAfterAccess(5, TimeUnit.MINUTES).build();
+ .expireAfterAccess(Duration.ofMinutes(5)).build();
@Override
public void create(HttpServletResponse response, String uuid) throws IOException {
@@ -113,7 +113,7 @@ public class CaptchaServiceImpl implements CaptchaService {
}
String key = RedisKeys.getSMSValidateCodeKey(phone);
- String validateCodes = generateValidateCode(6);
+ String validateCodes = RandomUtil.randomNumbers(6);
// 设置验证码
setCache(key, validateCodes);
@@ -135,22 +135,6 @@ public class CaptchaServiceImpl implements CaptchaService {
return validate(key, code, delete);
}
- /**
- * 生成指定数量的随机数验证码
- *
- * @param length 数量
- * @return 随机码
- */
- private String generateValidateCode(Integer length) {
- String chars = "0123456789"; // 字符范围可以自定义:数字
- Random random = new Random();
- StringBuilder code = new StringBuilder();
- for (int i = 0; i < length; i++) {
- code.append(chars.charAt(random.nextInt(chars.length())));
- }
- return code.toString();
- }
-
private void setCache(String key, String value) {
if (open) {
key = RedisKeys.getCaptchaKey(key);
@@ -180,4 +164,4 @@ public class CaptchaServiceImpl implements CaptchaService {
}
return captcha;
}
-}
\ No newline at end of file
+}
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysDictDataServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysDictDataServiceImpl.java
index 79d935fb..4d92096a 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysDictDataServiceImpl.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/impl/SysDictDataServiceImpl.java
@@ -12,6 +12,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
+import cn.hutool.core.collection.CollUtil;
import lombok.AllArgsConstructor;
import xiaozhi.common.exception.RenException;
import xiaozhi.common.exception.ErrorCode;
@@ -21,7 +22,6 @@ import xiaozhi.common.redis.RedisUtils;
import xiaozhi.common.service.impl.BaseServiceImpl;
import xiaozhi.common.utils.ConvertUtils;
import xiaozhi.common.utils.JsonUtils;
-import xiaozhi.common.utils.ToolUtil;
import xiaozhi.modules.sys.dao.SysDictDataDao;
import xiaozhi.modules.sys.dao.SysUserDao;
import xiaozhi.modules.sys.dto.SysDictDataDTO;
@@ -104,13 +104,13 @@ public class SysDictDataServiceImpl extends BaseServiceImpl idList = Arrays.asList(ids);
- if (ToolUtil.isNotEmpty(idList)) {
+ if (CollUtil.isNotEmpty(idList)) {
//批量删除redis字典
List redisKeyList = new ArrayList<>();
//批量获取字典类型
List dictTypeList = Optional.ofNullable(baseDao.getDictTypesByIdList(idList)).orElseGet(ArrayList::new);
dictTypeList.forEach(dictType -> redisKeyList.add(RedisKeys.getDictDataByTypeKey(dictType)));
- if (ToolUtil.isNotEmpty(redisKeyList)) {
+ if (CollUtil.isNotEmpty(redisKeyList)) {
//清除缓存
redisUtils.delete(redisKeyList);
}
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/voiceclone/service/impl/VoiceCloneServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/voiceclone/service/impl/VoiceCloneServiceImpl.java
index 34ed3d8a..17cd6ca5 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/voiceclone/service/impl/VoiceCloneServiceImpl.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/voiceclone/service/impl/VoiceCloneServiceImpl.java
@@ -17,6 +17,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
+import cn.hutool.core.collection.CollUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import xiaozhi.common.constant.Constant;
@@ -26,7 +27,6 @@ import xiaozhi.common.page.PageData;
import xiaozhi.common.service.impl.BaseServiceImpl;
import xiaozhi.common.utils.ConvertUtils;
import xiaozhi.common.utils.DateUtils;
-import xiaozhi.common.utils.ToolUtil;
import xiaozhi.modules.model.entity.ModelConfigEntity;
import xiaozhi.modules.model.service.ModelConfigService;
import xiaozhi.modules.sys.dao.SysUserDao;
@@ -120,7 +120,7 @@ public class VoiceCloneServiceImpl extends BaseServiceImpl