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