permsSet = new HashSet<>();
if (user.getSuperAdmin() == SuperAdminEnum.YES.value()) {
@@ -69,22 +76,22 @@ public class Oauth2Realm extends AuthorizingRealm {
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
String accessToken = (String) token.getPrincipal();
- //根据accessToken,查询用户信息
+ // 根据accessToken,查询用户信息
SysUserTokenEntity tokenEntity = shiroService.getByToken(accessToken);
- //token失效
+ // token失效
if (tokenEntity == null || tokenEntity.getExpireDate().getTime() < System.currentTimeMillis()) {
throw new IncorrectCredentialsException(MessageUtils.getMessage(ErrorCode.TOKEN_INVALID));
}
- //查询用户信息
+ // 查询用户信息
SysUserEntity userEntity = shiroService.getUser(tokenEntity.getUserId());
- //转换成UserDetail对象
+ // 转换成UserDetail对象
UserDetail userDetail = ConvertUtils.sourceToTarget(userEntity, UserDetail.class);
userDetail.setToken(accessToken);
- //账号锁定
+ // 账号锁定
if (userDetail.getStatus() == null) {
logger.error("账号状态异常,status 不能为空");
throw new DisabledAccountException(MessageUtils.getMessage(ErrorCode.ACCOUNT_DISABLE));
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/security/oauth2/TokenGenerator.java b/main/manager-api/src/main/java/xiaozhi/modules/security/oauth2/TokenGenerator.java
index 0ca1cede..6d7be47a 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/security/oauth2/TokenGenerator.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/security/oauth2/TokenGenerator.java
@@ -1,10 +1,10 @@
package xiaozhi.modules.security.oauth2;
-import xiaozhi.common.exception.RenException;
-
import java.security.MessageDigest;
import java.util.UUID;
+import xiaozhi.common.exception.RenException;
+
/**
* 生成token
* Copyright (c) 人人开源 All rights reserved.
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/security/password/BCrypt.java b/main/manager-api/src/main/java/xiaozhi/modules/security/password/BCrypt.java
index 6a9efff9..39d350c5 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/security/password/BCrypt.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/security/password/BCrypt.java
@@ -5,22 +5,28 @@ import java.io.UnsupportedEncodingException;
import java.security.SecureRandom;
/**
- * BCrypt implements OpenBSD-style Blowfish password hashing using the scheme described in
+ * BCrypt implements OpenBSD-style Blowfish password hashing using the scheme
+ * described in
* "A Future-Adaptable Password Scheme" by Niels Provos and David Mazieres.
*
- * This password hashing system tries to thwart off-line password cracking using a
- * computationally-intensive hashing algorithm, based on Bruce Schneier's Blowfish cipher.
- * The work factor of the algorithm is parameterised, so it can be increased as computers
+ * This password hashing system tries to thwart off-line password cracking using
+ * a
+ * computationally-intensive hashing algorithm, based on Bruce Schneier's
+ * Blowfish cipher.
+ * The work factor of the algorithm is parameterised, so it can be increased as
+ * computers
* get faster.
*
- * Usage is really simple. To hash a password for the first time, call the hashpw method
+ * Usage is really simple. To hash a password for the first time, call the
+ * hashpw method
* with a random salt, like this:
*
*
* String pw_hash = BCrypt.hashpw(plain_password, BCrypt.gensalt());
*
*
- * To check whether a plaintext password matches one that has been hashed previously, use
+ * To check whether a plaintext password matches one that has been hashed
+ * previously, use
* the checkpw method:
*
*
@@ -30,7 +36,8 @@ import java.security.SecureRandom;
* System.out.println("It does not match");
*
*
- * The gensalt() method takes an optional parameter (log_rounds) that determines the
+ * The gensalt() method takes an optional parameter (log_rounds) that determines
+ * the
* computational complexity of the hashing:
*
*
@@ -38,7 +45,8 @@ import java.security.SecureRandom;
* String stronger_salt = BCrypt.gensalt(12)
*
*
- * The amount of work increases exponentially (2**log_rounds), so each increment is twice
+ * The amount of work increases exponentially (2**log_rounds), so each increment
+ * is twice
* as much work. The default log_rounds is 10, and the valid range is 4 to 31.
*
* @author Damien Miller
@@ -51,11 +59,11 @@ public class BCrypt {
// Blowfish parameters
private static final int BLOWFISH_NUM_ROUNDS = 16;
// Initial contents of key schedule
- private static final int P_orig[] = {0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
+ private static final int P_orig[] = { 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377,
0xbe5466cf, 0x34e90c6c, 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,
- 0x9216d5d9, 0x8979fb1b};
- private static final int S_orig[] = {0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,
+ 0x9216d5d9, 0x8979fb1b };
+ private static final int S_orig[] = { 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,
0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7,
0x0801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,
0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5,
@@ -225,24 +233,24 @@ public class BCrypt {
0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76,
0x77afa1c5, 0x20756060, 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,
0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, 0x90d4f869, 0xa65cdea0,
- 0x3f09252d, 0xc208e69f, 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6};
+ 0x3f09252d, 0xc208e69f, 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6 };
// bcrypt IV: "OrpheanBeholderScryDoubt"
- static private final int bf_crypt_ciphertext[] = {0x4f727068, 0x65616e42,
- 0x65686f6c, 0x64657253, 0x63727944, 0x6f756274};
+ static private final int bf_crypt_ciphertext[] = { 0x4f727068, 0x65616e42,
+ 0x65686f6c, 0x64657253, 0x63727944, 0x6f756274 };
// Table for Base64 encoding
- static private final char base64_code[] = {'.', '/', 'A', 'B', 'C', 'D', 'E', 'F',
+ static private final char base64_code[] = { '.', '/', 'A', 'B', 'C', 'D', 'E', 'F',
'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',
- 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
+ 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
// Table for Base64 decoding
- static private final byte index_64[] = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ static private final byte index_64[] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 54, 55,
56, 57, 58, 59, 60, 61, 62, 63, -1, -1, -1, -1, -1, -1, -1, 2, 3, 4, 5, 6, 7,
8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
-1, -1, -1, -1, -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
- 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, -1, -1, -1, -1, -1};
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, -1, -1, -1, -1, -1 };
static final int MIN_LOG_ROUNDS = 4;
static final int MAX_LOG_ROUNDS = 31;
// Expanded Blowfish key
@@ -250,7 +258,8 @@ public class BCrypt {
private int S[];
/**
- * Encode a byte array using bcrypt's slightly-modified base64 encoding scheme. Note
+ * Encode a byte array using bcrypt's slightly-modified base64 encoding scheme.
+ * Note
* that this is not compatible with the standard MIME-base64
* encoding.
*
@@ -306,7 +315,8 @@ public class BCrypt {
}
/**
- * Decode a string encoded using bcrypt's base64 scheme to a byte array. Note that
+ * Decode a string encoded using bcrypt's base64 scheme to a byte array. Note
+ * that
* this is *not* compatible with the standard MIME-base64 encoding.
*
* @param s the string to decode
@@ -365,7 +375,7 @@ public class BCrypt {
int i, n, l = lr[off], r = lr[off + 1];
l ^= P[0];
- for (i = 0; i <= BLOWFISH_NUM_ROUNDS - 2; ) {
+ for (i = 0; i <= BLOWFISH_NUM_ROUNDS - 2;) {
// Feistel substitution on left word
n = S[(l >> 24) & 0xff];
n += S[0x100 | ((l >> 16) & 0xff)];
@@ -388,7 +398,8 @@ public class BCrypt {
* Cycically extract a word of key material
*
* @param data the string to extract the data from
- * @param offp a "pointer" (as a one-entry array) to the current offset into data
+ * @param offp a "pointer" (as a one-entry array) to the current offset into
+ * data
* @return the next word of material from data
*/
private static int streamtoword(byte data[], int offp[]) {
@@ -420,8 +431,8 @@ public class BCrypt {
*/
private void key(byte key[]) {
int i;
- int koffp[] = {0};
- int lr[] = {0, 0};
+ int koffp[] = { 0 };
+ int lr[] = { 0, 0 };
int plen = P.length, slen = S.length;
for (i = 0; i < plen; i++) {
@@ -443,15 +454,16 @@ public class BCrypt {
/**
* Perform the "enhanced key schedule" step described by Provos and Mazieres in
- * "A Future-Adaptable Password Scheme" http://www.openbsd.org/papers/bcrypt-paper.ps
+ * "A Future-Adaptable Password Scheme"
+ * http://www.openbsd.org/papers/bcrypt-paper.ps
*
* @param data salt information
* @param key password information
*/
private void ekskey(byte data[], byte key[]) {
int i;
- int koffp[] = {0}, doffp[] = {0};
- int lr[] = {0, 0};
+ int koffp[] = { 0 }, doffp[] = { 0 };
+ int lr[] = { 0, 0 };
int plen = P.length, slen = S.length;
for (i = 0; i < plen; i++) {
@@ -487,7 +499,8 @@ public class BCrypt {
*
* @param password the password to hash
* @param salt the binary salt to hash with the password
- * @param log_rounds the binary logarithm of the number of rounds of hashing to apply
+ * @param log_rounds the binary logarithm of the number of rounds of hashing to
+ * apply
* @return an array containing the binary hashed password
*/
private byte[] crypt_raw(byte password[], byte salt[], int log_rounds) {
@@ -524,7 +537,8 @@ public class BCrypt {
* Hash a password using the OpenBSD bcrypt scheme
*
* @param password the password to hash
- * @param salt the salt to hash with (perhaps generated using BCrypt.gensalt)
+ * @param salt the salt to hash with (perhaps generated using
+ * BCrypt.gensalt)
* @return the hashed password
* @throws IllegalArgumentException if invalid salt is passed
*/
@@ -599,8 +613,10 @@ public class BCrypt {
/**
* Generate a salt for use with the BCrypt.hashpw() method
*
- * @param log_rounds the log2 of the number of rounds of hashing to apply - the work
- * factor therefore increases as 2**log_rounds. Minimum 4, maximum 31.
+ * @param log_rounds the log2 of the number of rounds of hashing to apply - the
+ * work
+ * factor therefore increases as 2**log_rounds. Minimum 4,
+ * maximum 31.
* @param random an instance of SecureRandom to use
* @return an encoded salt value
*/
@@ -626,8 +642,10 @@ public class BCrypt {
/**
* Generate a salt for use with the BCrypt.hashpw() method
*
- * @param log_rounds the log2 of the number of rounds of hashing to apply - the work
- * factor therefore increases as 2**log_rounds. Minimum 4, maximum 31.
+ * @param log_rounds the log2 of the number of rounds of hashing to apply - the
+ * work
+ * factor therefore increases as 2**log_rounds. Minimum 4,
+ * maximum 31.
* @return an encoded salt value
*/
public static String gensalt(int log_rounds) {
@@ -635,7 +653,8 @@ public class BCrypt {
}
/**
- * Generate a salt for use with the BCrypt.hashpw() method, selecting a reasonable
+ * Generate a salt for use with the BCrypt.hashpw() method, selecting a
+ * reasonable
* default for the number of hashing rounds to apply
*
* @return an encoded salt value
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/security/password/BCryptPasswordEncoder.java b/main/manager-api/src/main/java/xiaozhi/modules/security/password/BCryptPasswordEncoder.java
index 0d570a96..0da907f2 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/security/password/BCryptPasswordEncoder.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/security/password/BCryptPasswordEncoder.java
@@ -1,15 +1,18 @@
package xiaozhi.modules.security.password;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
import java.security.SecureRandom;
import java.util.regex.Pattern;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
/**
- * Implementation of PasswordEncoder that uses the BCrypt strong hashing function. Clients
- * can optionally supply a "strength" (a.k.a. log rounds in BCrypt) and a SecureRandom
- * instance. The larger the strength parameter the more work will have to be done
+ * Implementation of PasswordEncoder that uses the BCrypt strong hashing
+ * function. Clients
+ * can optionally supply a "strength" (a.k.a. log rounds in BCrypt) and a
+ * SecureRandom
+ * instance. The larger the strength parameter the more work will have to be
+ * done
* (exponentially) to hash the passwords. The default value is 10.
*
* @author Dave Syer
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/security/password/PasswordEncoder.java b/main/manager-api/src/main/java/xiaozhi/modules/security/password/PasswordEncoder.java
index 40d1e95c..2de70cc2 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/security/password/PasswordEncoder.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/security/password/PasswordEncoder.java
@@ -10,20 +10,23 @@ package xiaozhi.modules.security.password;
public interface PasswordEncoder {
/**
- * Encode the raw password. Generally, a good encoding algorithm applies a SHA-1 or
+ * Encode the raw password. Generally, a good encoding algorithm applies a SHA-1
+ * or
* greater hash combined with an 8-byte or greater randomly generated salt.
*/
String encode(CharSequence rawPassword);
/**
* Verify the encoded password obtained from storage matches the submitted raw
- * password after it too is encoded. Returns true if the passwords match, false if
+ * password after it too is encoded. Returns true if the passwords match, false
+ * if
* they do not. The stored password itself is never decoded.
*
* @param rawPassword the raw password to encode and match
* @param encodedPassword the encoded password from storage to compare with
- * @return true if the raw password, after encoding, matches the encoded password from
- * storage
+ * @return true if the raw password, after encoding, matches the encoded
+ * password from
+ * storage
*/
boolean matches(CharSequence rawPassword, String encodedPassword);
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/security/password/PasswordUtils.java b/main/manager-api/src/main/java/xiaozhi/modules/security/password/PasswordUtils.java
index b0357010..9144b380 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/security/password/PasswordUtils.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/security/password/PasswordUtils.java
@@ -18,19 +18,17 @@ public class PasswordUtils {
return passwordEncoder.encode(str);
}
-
/**
* 比较密码是否相等
*
* @param str 明文密码
* @param password 加密后密码
- * @return true:成功 false:失败
+ * @return true:成功 false:失败
*/
public static boolean matches(String str, String password) {
return passwordEncoder.matches(str, password);
}
-
public static void main(String[] args) {
String str = "admin";
String password = encode(str);
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/security/service/CaptchaService.java b/main/manager-api/src/main/java/xiaozhi/modules/security/service/CaptchaService.java
index b91d5d9a..9e5c153f 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/security/service/CaptchaService.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/security/service/CaptchaService.java
@@ -1,9 +1,9 @@
package xiaozhi.modules.security.service;
-import jakarta.servlet.http.HttpServletResponse;
-
import java.io.IOException;
+import jakarta.servlet.http.HttpServletResponse;
+
/**
* 验证码
* Copyright (c) 人人开源 All rights reserved.
@@ -21,7 +21,7 @@ public interface CaptchaService {
*
* @param uuid uuid
* @param code 验证码
- * @return true:成功 false:失败
+ * @return true:成功 false:失败
*/
boolean validate(String uuid, String code);
}
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 761ad139..012b4d3e 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,23 +1,22 @@
package xiaozhi.modules.security.service.impl;
+import java.io.IOException;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.wf.captcha.SpecCaptcha;
import com.wf.captcha.base.Captcha;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import xiaozhi.common.redis.RedisKeys;
-import xiaozhi.common.redis.RedisUtils;
-import xiaozhi.modules.security.oauth2.Oauth2Realm;
-import xiaozhi.modules.security.service.CaptchaService;
+
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Service;
-
-import java.io.IOException;
-import java.util.concurrent.TimeUnit;
+import xiaozhi.common.redis.RedisKeys;
+import xiaozhi.common.redis.RedisUtils;
+import xiaozhi.modules.security.service.CaptchaService;
/**
* 验证码
@@ -29,10 +28,10 @@ public class CaptchaServiceImpl implements CaptchaService {
@Value("${renren.redis.open}")
private boolean open;
/**
- * Local Cache 5分钟过期
+ * Local Cache 5分钟过期
*/
- Cache localCache = CacheBuilder.newBuilder().maximumSize(1000).expireAfterAccess(5, TimeUnit.MINUTES).build();
- private static final Logger logger = LoggerFactory.getLogger(Oauth2Realm.class);
+ Cache localCache = CacheBuilder.newBuilder().maximumSize(1000)
+ .expireAfterAccess(5, TimeUnit.MINUTES).build();
@Override
public void create(HttpServletResponse response, String uuid) throws IOException {
@@ -41,13 +40,13 @@ public class CaptchaServiceImpl implements CaptchaService {
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
- //生成验证码
+ // 生成验证码
SpecCaptcha captcha = new SpecCaptcha(150, 40);
captcha.setLen(5);
captcha.setCharType(Captcha.TYPE_DEFAULT);
captcha.out(response.getOutputStream());
- //保存到缓存
+ // 保存到缓存
setCache(uuid, captcha.text());
}
@@ -56,10 +55,10 @@ public class CaptchaServiceImpl implements CaptchaService {
if (StringUtils.isBlank(code)) {
return false;
}
- //获取验证码
+ // 获取验证码
String captcha = getCache(uuid);
- //效验成功
+ // 效验成功
if (code.equalsIgnoreCase(captcha)) {
return true;
}
@@ -80,7 +79,7 @@ public class CaptchaServiceImpl implements CaptchaService {
if (open) {
key = RedisKeys.getCaptchaKey(key);
String captcha = (String) redisUtils.get(key);
- //删除验证码
+ // 删除验证码
if (captcha != null) {
redisUtils.delete(key);
}
@@ -89,7 +88,7 @@ public class CaptchaServiceImpl implements CaptchaService {
}
String captcha = localCache.getIfPresent(key);
- //删除验证码
+ // 删除验证码
if (captcha != null) {
localCache.invalidate(key);
}
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/security/service/impl/ShiroServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/security/service/impl/ShiroServiceImpl.java
index 97d16eaa..27c20970 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/security/service/impl/ShiroServiceImpl.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/security/service/impl/ShiroServiceImpl.java
@@ -1,17 +1,13 @@
package xiaozhi.modules.security.service.impl;
-import xiaozhi.common.user.UserDetail;
+import org.springframework.stereotype.Service;
+
+import lombok.AllArgsConstructor;
import xiaozhi.modules.security.dao.SysUserTokenDao;
import xiaozhi.modules.security.entity.SysUserTokenEntity;
import xiaozhi.modules.security.service.ShiroService;
import xiaozhi.modules.sys.dao.SysUserDao;
import xiaozhi.modules.sys.entity.SysUserEntity;
-import xiaozhi.modules.sys.enums.SuperAdminEnum;
-import lombok.AllArgsConstructor;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.stereotype.Service;
-
-import java.util.*;
@AllArgsConstructor
@Service
@@ -19,7 +15,6 @@ public class ShiroServiceImpl implements ShiroService {
private final SysUserDao sysUserDao;
private final SysUserTokenDao sysUserTokenDao;
-
@Override
public SysUserTokenEntity getByToken(String token) {
return sysUserTokenDao.getByToken(token);
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/security/service/impl/SysUserTokenServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/security/service/impl/SysUserTokenServiceImpl.java
index 40ee7957..7f0d311a 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/security/service/impl/SysUserTokenServiceImpl.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/security/service/impl/SysUserTokenServiceImpl.java
@@ -1,8 +1,11 @@
package xiaozhi.modules.security.service.impl;
+import java.util.Date;
+
+import org.springframework.stereotype.Service;
+
import cn.hutool.core.date.DateUtil;
import lombok.AllArgsConstructor;
-import org.springframework.stereotype.Service;
import xiaozhi.common.exception.ErrorCode;
import xiaozhi.common.exception.RenException;
import xiaozhi.common.page.TokenDTO;
@@ -17,11 +20,10 @@ import xiaozhi.modules.sys.dto.PasswordDTO;
import xiaozhi.modules.sys.dto.SysUserDTO;
import xiaozhi.modules.sys.service.SysUserService;
-import java.util.Date;
-
@AllArgsConstructor
@Service
-public class SysUserTokenServiceImpl extends BaseServiceImpl implements SysUserTokenService {
+public class SysUserTokenServiceImpl extends BaseServiceImpl
+ implements SysUserTokenService {
private final SysUserService sysUserService;
/**
@@ -31,18 +33,18 @@ public class SysUserTokenServiceImpl extends BaseServiceImpl createToken(Long userId) {
- //用户token
+ // 用户token
String token;
- //当前时间
+ // 当前时间
Date now = new Date();
- //过期时间
+ // 过期时间
Date expireTime = new Date(now.getTime() + EXPIRE * 1000);
- //判断是否生成过token
+ // 判断是否生成过token
SysUserTokenEntity tokenEntity = baseDao.getByUserId(userId);
if (tokenEntity == null) {
- //生成一个token
+ // 生成一个token
token = TokenGenerator.generateValue();
tokenEntity = new SysUserTokenEntity();
@@ -51,12 +53,12 @@ public class SysUserTokenServiceImpl extends BaseServiceImpl().ok(tokenDTO);
}
@Override
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/security/user/SecurityUser.java b/main/manager-api/src/main/java/xiaozhi/modules/security/user/SecurityUser.java
index cfa0fbf7..0581f95c 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/security/user/SecurityUser.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/security/user/SecurityUser.java
@@ -1,9 +1,10 @@
package xiaozhi.modules.security.user;
-import xiaozhi.common.user.UserDetail;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
+import xiaozhi.common.user.UserDetail;
+
/**
* Shiro工具类
* Copyright (c) 人人开源 All rights reserved.
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/controller/SysUserController.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/controller/SysUserController.java
index 9da7c62b..4aed782d 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/sys/controller/SysUserController.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/controller/SysUserController.java
@@ -1,9 +1,10 @@
package xiaozhi.modules.sys.controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
/**
* 用户管理
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/dao/SysDictDataDao.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/dao/SysDictDataDao.java
index 08aaca5b..9dd124fe 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/sys/dao/SysDictDataDao.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/dao/SysDictDataDao.java
@@ -1,12 +1,13 @@
package xiaozhi.modules.sys.dao;
+import java.util.List;
+
+import org.apache.ibatis.annotations.Mapper;
+
import xiaozhi.common.dao.BaseDao;
import xiaozhi.modules.sys.dto.SysDictDataDTO;
import xiaozhi.modules.sys.entity.DictData;
import xiaozhi.modules.sys.entity.SysDictDataEntity;
-import org.apache.ibatis.annotations.Mapper;
-
-import java.util.List;
/**
* 字典数据
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/dao/SysDictTypeDao.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/dao/SysDictTypeDao.java
index bca8e789..5a9d5a27 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/sys/dao/SysDictTypeDao.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/dao/SysDictTypeDao.java
@@ -1,11 +1,12 @@
package xiaozhi.modules.sys.dao;
+import java.util.List;
+
+import org.apache.ibatis.annotations.Mapper;
+
import xiaozhi.common.dao.BaseDao;
import xiaozhi.modules.sys.entity.DictType;
import xiaozhi.modules.sys.entity.SysDictTypeEntity;
-import org.apache.ibatis.annotations.Mapper;
-
-import java.util.List;
/**
* 字典类型
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/dao/SysParamsDao.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/dao/SysParamsDao.java
index 0c967a74..d35d1445 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/sys/dao/SysParamsDao.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/dao/SysParamsDao.java
@@ -1,11 +1,12 @@
package xiaozhi.modules.sys.dao;
-import xiaozhi.common.dao.BaseDao;
-import xiaozhi.modules.sys.entity.SysParamsEntity;
+import java.util.List;
+
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
-import java.util.List;
+import xiaozhi.common.dao.BaseDao;
+import xiaozhi.modules.sys.entity.SysParamsEntity;
/**
* 参数管理
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/dao/SysUserDao.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/dao/SysUserDao.java
index 339e522a..fb2a2492 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/sys/dao/SysUserDao.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/dao/SysUserDao.java
@@ -1,6 +1,7 @@
package xiaozhi.modules.sys.dao;
import org.apache.ibatis.annotations.Mapper;
+
import xiaozhi.common.dao.BaseDao;
import xiaozhi.modules.sys.entity.SysUserEntity;
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/AdminPageUserDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/AdminPageUserDTO.java
index 8c0ab77c..7de3843a 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/AdminPageUserDTO.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/AdminPageUserDTO.java
@@ -1,11 +1,11 @@
package xiaozhi.modules.sys.dto;
import io.swagger.v3.oas.annotations.media.Schema;
-import jakarta.validation.constraints.NotBlank;
import lombok.Data;
/**
* 管理员分页用户的参数DTO
+ *
* @author zjy
* @since 2025-3-21
*/
@@ -13,7 +13,6 @@ import lombok.Data;
@Schema(description = "音色分页参数")
public class AdminPageUserDTO {
-
@Schema(description = "手机号码")
private String mobile;
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/PasswordDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/PasswordDTO.java
index 1ecadc68..4aabb10e 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/PasswordDTO.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/PasswordDTO.java
@@ -1,11 +1,11 @@
package xiaozhi.modules.sys.dto;
+import java.io.Serializable;
+
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
-import java.io.Serializable;
-
/**
* 修改密码
*/
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/SysDictDataDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/SysDictDataDTO.java
index 172e6b1f..c18dbf8f 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/SysDictDataDTO.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/SysDictDataDTO.java
@@ -1,20 +1,21 @@
package xiaozhi.modules.sys.dto;
+import java.io.Serializable;
+import java.util.Date;
+
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
-import xiaozhi.common.utils.DateUtils;
-import xiaozhi.common.validator.group.AddGroup;
-import xiaozhi.common.validator.group.DefaultGroup;
-import xiaozhi.common.validator.group.UpdateGroup;
+
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Null;
import lombok.Data;
-
-import java.io.Serializable;
-import java.util.Date;
+import xiaozhi.common.utils.DateUtils;
+import xiaozhi.common.validator.group.AddGroup;
+import xiaozhi.common.validator.group.DefaultGroup;
+import xiaozhi.common.validator.group.UpdateGroup;
/**
* 字典数据
@@ -23,7 +24,6 @@ import java.util.Date;
@Schema(description = "字典数据")
public class SysDictDataDTO implements Serializable {
-
@Schema(description = "id")
@Null(message = "{id.null}", groups = AddGroup.class)
@NotNull(message = "{id.require}", groups = UpdateGroup.class)
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/SysDictTypeDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/SysDictTypeDTO.java
index 72648109..01d69795 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/SysDictTypeDTO.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/SysDictTypeDTO.java
@@ -1,20 +1,21 @@
package xiaozhi.modules.sys.dto;
+import java.io.Serializable;
+import java.util.Date;
+
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
-import xiaozhi.common.utils.DateUtils;
-import xiaozhi.common.validator.group.AddGroup;
-import xiaozhi.common.validator.group.DefaultGroup;
-import xiaozhi.common.validator.group.UpdateGroup;
+
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Null;
import lombok.Data;
-
-import java.io.Serializable;
-import java.util.Date;
+import xiaozhi.common.utils.DateUtils;
+import xiaozhi.common.validator.group.AddGroup;
+import xiaozhi.common.validator.group.DefaultGroup;
+import xiaozhi.common.validator.group.UpdateGroup;
/**
* 字典类型
@@ -23,7 +24,6 @@ import java.util.Date;
@Schema(description = "字典类型")
public class SysDictTypeDTO implements Serializable {
-
@Schema(description = "id")
@Null(message = "{id.null}", groups = AddGroup.class)
@NotNull(message = "{id.require}", groups = UpdateGroup.class)
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/SysParamsDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/SysParamsDTO.java
index 4b72ce34..7b4dd28d 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/SysParamsDTO.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/SysParamsDTO.java
@@ -1,19 +1,20 @@
package xiaozhi.modules.sys.dto;
+import java.io.Serializable;
+import java.util.Date;
+
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
-import xiaozhi.common.utils.DateUtils;
-import xiaozhi.common.validator.group.AddGroup;
-import xiaozhi.common.validator.group.DefaultGroup;
-import xiaozhi.common.validator.group.UpdateGroup;
+
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Null;
import lombok.Data;
-
-import java.io.Serializable;
-import java.util.Date;
+import xiaozhi.common.utils.DateUtils;
+import xiaozhi.common.validator.group.AddGroup;
+import xiaozhi.common.validator.group.DefaultGroup;
+import xiaozhi.common.validator.group.UpdateGroup;
/**
* 参数管理
@@ -22,7 +23,6 @@ import java.util.Date;
@Schema(description = "参数管理")
public class SysParamsDTO implements Serializable {
-
@Schema(description = "id")
@Null(message = "{id.null}", groups = AddGroup.class)
@NotNull(message = "{id.require}", groups = UpdateGroup.class)
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/SysUserDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/SysUserDTO.java
index 00f7fc78..ff066341 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/SysUserDTO.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/SysUserDTO.java
@@ -1,22 +1,24 @@
package xiaozhi.modules.sys.dto;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+import org.hibernate.validator.constraints.Range;
+
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
-import xiaozhi.common.utils.DateUtils;
-import xiaozhi.common.validator.group.AddGroup;
-import xiaozhi.common.validator.group.DefaultGroup;
-import xiaozhi.common.validator.group.UpdateGroup;
+
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Null;
import lombok.Data;
-import org.hibernate.validator.constraints.Range;
-
-import java.io.Serializable;
-import java.util.Date;
-import java.util.List;
+import xiaozhi.common.utils.DateUtils;
+import xiaozhi.common.validator.group.AddGroup;
+import xiaozhi.common.validator.group.DefaultGroup;
+import xiaozhi.common.validator.group.UpdateGroup;
/**
* 用户管理
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/DictData.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/DictData.java
index 1e16a192..c8deac81 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/DictData.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/DictData.java
@@ -1,6 +1,7 @@
package xiaozhi.modules.sys.entity;
import com.fasterxml.jackson.annotation.JsonIgnore;
+
import lombok.Data;
/**
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/DictType.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/DictType.java
index 3cf94606..4a1e2ca5 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/DictType.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/DictType.java
@@ -1,11 +1,12 @@
package xiaozhi.modules.sys.entity;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import lombok.Data;
-
import java.util.ArrayList;
import java.util.List;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
+import lombok.Data;
+
/**
* 字典类型
*/
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/SysDictDataEntity.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/SysDictDataEntity.java
index 4bfa4b62..16d3dcae 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/SysDictDataEntity.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/SysDictDataEntity.java
@@ -1,13 +1,14 @@
package xiaozhi.modules.sys.entity;
+import java.util.Date;
+
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
-import xiaozhi.common.entity.BaseEntity;
+
import lombok.Data;
import lombok.EqualsAndHashCode;
-
-import java.util.Date;
+import xiaozhi.common.entity.BaseEntity;
/**
* 数据字典
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/SysDictTypeEntity.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/SysDictTypeEntity.java
index ea752c63..fa372055 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/SysDictTypeEntity.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/SysDictTypeEntity.java
@@ -1,13 +1,14 @@
package xiaozhi.modules.sys.entity;
+import java.util.Date;
+
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
-import xiaozhi.common.entity.BaseEntity;
+
import lombok.Data;
import lombok.EqualsAndHashCode;
-
-import java.util.Date;
+import xiaozhi.common.entity.BaseEntity;
/**
* 字典类型
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/SysParamsEntity.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/SysParamsEntity.java
index 054e51d7..989800e2 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/SysParamsEntity.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/SysParamsEntity.java
@@ -1,13 +1,14 @@
package xiaozhi.modules.sys.entity;
+import java.util.Date;
+
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
-import xiaozhi.common.entity.BaseEntity;
+
import lombok.Data;
import lombok.EqualsAndHashCode;
-
-import java.util.Date;
+import xiaozhi.common.entity.BaseEntity;
/**
* 参数管理
@@ -25,7 +26,7 @@ public class SysParamsEntity extends BaseEntity {
*/
private String paramValue;
/**
- * 类型 0:系统参数 1:非系统参数
+ * 类型 0:系统参数 1:非系统参数
*/
private Integer paramType;
/**
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/SysUserEntity.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/SysUserEntity.java
index 0093fcf0..23043a37 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/SysUserEntity.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/entity/SysUserEntity.java
@@ -1,14 +1,15 @@
package xiaozhi.modules.sys.entity;
+import java.util.Date;
+
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
+
import lombok.Data;
import lombok.EqualsAndHashCode;
import xiaozhi.common.entity.BaseEntity;
-import java.util.Date;
-
/**
* 系统用户
*/
@@ -25,11 +26,11 @@ public class SysUserEntity extends BaseEntity {
*/
private String password;
/**
- * 超级管理员 0:否 1:是
+ * 超级管理员 0:否 1:是
*/
private Integer superAdmin;
/**
- * 状态 0:停用 1:正常
+ * 状态 0:停用 1:正常
*/
private Integer status;
/**
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/redis/SysParamsRedis.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/redis/SysParamsRedis.java
index dcc14f69..2e2bdb42 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/sys/redis/SysParamsRedis.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/redis/SysParamsRedis.java
@@ -1,9 +1,10 @@
package xiaozhi.modules.sys.redis;
+import org.springframework.stereotype.Component;
+
+import lombok.AllArgsConstructor;
import xiaozhi.common.redis.RedisKeys;
import xiaozhi.common.redis.RedisUtils;
-import lombok.AllArgsConstructor;
-import org.springframework.stereotype.Component;
/**
* 参数管理
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysDictDataService.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysDictDataService.java
index 77be8b3a..a33df029 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysDictDataService.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysDictDataService.java
@@ -1,12 +1,12 @@
package xiaozhi.modules.sys.service;
+import java.util.Map;
+
import xiaozhi.common.page.PageData;
import xiaozhi.common.service.BaseService;
import xiaozhi.modules.sys.dto.SysDictDataDTO;
import xiaozhi.modules.sys.entity.SysDictDataEntity;
-import java.util.Map;
-
/**
* 数据字典
*/
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysDictTypeService.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysDictTypeService.java
index 8924f6ca..a18e086f 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysDictTypeService.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysDictTypeService.java
@@ -1,14 +1,14 @@
package xiaozhi.modules.sys.service;
+import java.util.List;
+import java.util.Map;
+
import xiaozhi.common.page.PageData;
import xiaozhi.common.service.BaseService;
import xiaozhi.modules.sys.dto.SysDictTypeDTO;
import xiaozhi.modules.sys.entity.DictType;
import xiaozhi.modules.sys.entity.SysDictTypeEntity;
-import java.util.List;
-import java.util.Map;
-
/**
* 数据字典
*/
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysParamsService.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysParamsService.java
index d13e41ba..7475f346 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysParamsService.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysParamsService.java
@@ -1,14 +1,13 @@
package xiaozhi.modules.sys.service;
+import java.util.List;
+import java.util.Map;
import xiaozhi.common.page.PageData;
import xiaozhi.common.service.BaseService;
import xiaozhi.modules.sys.dto.SysParamsDTO;
import xiaozhi.modules.sys.entity.SysParamsEntity;
-import java.util.List;
-import java.util.Map;
-
/**
* 参数管理
*/
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysUserService.java b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysUserService.java
index f8f609dc..261fbf96 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysUserService.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/service/SysUserService.java
@@ -8,7 +8,6 @@ import xiaozhi.modules.sys.dto.SysUserDTO;
import xiaozhi.modules.sys.entity.SysUserEntity;
import xiaozhi.modules.sys.vo.AdminPageUserVO;
-
/**
* 系统用户
*/
@@ -24,26 +23,31 @@ public interface SysUserService extends BaseService {
/**
* 验证是否允许修改密码更改
- * @param userId 用户id
+ *
+ * @param userId 用户id
* @param passwordDTO 验证密码的参数
*/
void changePassword(Long userId, PasswordDTO passwordDTO);
/**
* 直接修改密码,不需要验证
- * @param userId 用户id
+ *
+ * @param userId 用户id
* @param password 密码
*/
void changePasswordDirectly(Long userId, String password);
/**
* 重置密码
+ *
* @param userId 用户id
* @return 随机生成符合规范的密码
*/
String resetPassword(Long userId);
+
/**
* 管理员分页用户信息
+ *
* @param dto 分页查找参数
* @return 用户列表分页数据
*/
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 a8420dc9..20530e6b 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
@@ -1,10 +1,15 @@
package xiaozhi.modules.sys.service.impl;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
+import java.util.Arrays;
+import java.util.Map;
+
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
import xiaozhi.common.page.PageData;
import xiaozhi.common.service.impl.BaseServiceImpl;
import xiaozhi.common.utils.ConvertUtils;
@@ -13,21 +18,18 @@ import xiaozhi.modules.sys.dto.SysDictDataDTO;
import xiaozhi.modules.sys.entity.SysDictDataEntity;
import xiaozhi.modules.sys.service.SysDictDataService;
-import java.util.Arrays;
-import java.util.Map;
-
/**
* 字典类型
*/
@Service
-public class SysDictDataServiceImpl extends BaseServiceImpl implements SysDictDataService {
+public class SysDictDataServiceImpl extends BaseServiceImpl
+ implements SysDictDataService {
@Override
public PageData page(Map params) {
IPage page = baseDao.selectPage(
getPage(params, "sort", true),
- getWrapper(params)
- );
+ getWrapper(params));
return getPageData(page, SysDictDataDTO.class);
}
@@ -71,7 +73,7 @@ public class SysDictDataServiceImpl extends BaseServiceImpl implements SysDictTypeService {
+public class SysDictTypeServiceImpl extends BaseServiceImpl
+ implements SysDictTypeService {
private final SysDictDataDao sysDictDataDao;
@Override
public PageData page(Map params) {
IPage page = baseDao.selectPage(
getPage(params, "sort", true),
- getWrapper(params)
- );
+ getWrapper(params));
return getPageData(page, SysDictTypeDTO.class);
}
@@ -76,7 +78,7 @@ public class SysDictTypeServiceImpl extends BaseServiceImpl page(Map params) {
IPage page = baseDao.selectPage(
getPage(params, Constant.CREATE_DATE, false),
- getWrapper(params)
- );
+ getWrapper(params));
return getPageData(page, SysParamsDTO.class);
}
@@ -86,12 +87,12 @@ public class SysParamsServiceImpl extends BaseServiceImpl paramCodeList = baseDao.getParamCodeList(ids);
String[] paramCodes = paramCodeList.toArray(new String[paramCodeList.size()]);
sysParamsRedis.delete(paramCodes);
- //删除
+ // 删除
deleteBatchIds(Arrays.asList(ids));
}
@@ -114,7 +115,7 @@ public class SysParamsServiceImpl extends BaseServiceImpl page(AdminPageUserDTO dto) {
Map params = new HashMap();
params.put(Constant.PAGE, dto.getPage());
- params.put(Constant.LIMIT,dto.getLimit());
+ params.put(Constant.LIMIT, dto.getLimit());
IPage page = baseDao.selectPage(
getPage(params, "id", true),
- //定义查询条件
+ // 定义查询条件
new QueryWrapper()
- //必须按照手机号码查找
- .eq(StringUtils.isNotBlank(dto.getMobile()),"username",dto.getMobile()));
+ // 必须按照手机号码查找
+ .eq(StringUtils.isNotBlank(dto.getMobile()), "username", dto.getMobile()));
List list = page.getRecords().stream().map(user -> {
AdminPageUserVO adminPageUserVO = new AdminPageUserVO();
adminPageUserVO.setUserid(user.getId().toString());
adminPageUserVO.setMobile(user.getUsername());
- //TODO 2. 等设备功能写好,获取对应数据
+ // TODO 2. 等设备功能写好,获取对应数据
adminPageUserVO.setDeviceCount("0");
return adminPageUserVO;
}).toList();
@@ -169,11 +173,13 @@ public class SysUserServiceImpl extends BaseServiceImpl delete(@PathVariable Long id) {
- timbreService.delete(new Long[]{id});
+ timbreService.delete(new Long[] { id });
return new Result<>();
}
-
}
\ No newline at end of file
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/timbre/dao/TimbreDao.java b/main/manager-api/src/main/java/xiaozhi/modules/timbre/dao/TimbreDao.java
index 62afa358..3656b4ea 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/timbre/dao/TimbreDao.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/timbre/dao/TimbreDao.java
@@ -1,11 +1,14 @@
package xiaozhi.modules.timbre.dao;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
import xiaozhi.modules.timbre.entity.TimbreEntity;
/**
* 音色持久层定义
+ *
* @author zjy
* @since 2025-3-21
*/
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/timbre/dto/TimbreDataDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/timbre/dto/TimbreDataDTO.java
index 08ed9b18..ed737db9 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/timbre/dto/TimbreDataDTO.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/timbre/dto/TimbreDataDTO.java
@@ -5,9 +5,9 @@ import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
-
/**
* 音色表数据DTO
+ *
* @author zjy
* @since 2025-3-21
*/
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/timbre/dto/TimbrePageDTO.java b/main/manager-api/src/main/java/xiaozhi/modules/timbre/dto/TimbrePageDTO.java
index 72ed68b1..9c2aaf24 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/timbre/dto/TimbrePageDTO.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/timbre/dto/TimbrePageDTO.java
@@ -6,6 +6,7 @@ import lombok.Data;
/**
* 音色分页参数DTO
+ *
* @author zjy
* @since 2025-3-21
*/
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/timbre/entity/TimbreEntity.java b/main/manager-api/src/main/java/xiaozhi/modules/timbre/entity/TimbreEntity.java
index 71bd58a9..811969af 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/timbre/entity/TimbreEntity.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/timbre/entity/TimbreEntity.java
@@ -1,15 +1,19 @@
package xiaozhi.modules.timbre.entity;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
+
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import xiaozhi.common.entity.BaseEntity;
-import java.util.Date;
-
/**
* 音色表实体类
+ *
* @author zjy
* @since 2025-3-21
*/
@@ -41,8 +45,10 @@ public class TimbreEntity extends BaseEntity {
private String voiceDemo;
@Schema(description = "更新者")
+ @TableField(fill = FieldFill.UPDATE)
private Long updater;
@Schema(description = "更新时间")
+ @TableField(fill = FieldFill.UPDATE)
private Date updateDate;
}
\ No newline at end of file
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/timbre/service/TimbreService.java b/main/manager-api/src/main/java/xiaozhi/modules/timbre/service/TimbreService.java
index 044322e5..b9d4578e 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/timbre/service/TimbreService.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/timbre/service/TimbreService.java
@@ -1,5 +1,7 @@
package xiaozhi.modules.timbre.service;
+import java.util.List;
+
import xiaozhi.common.page.PageData;
import xiaozhi.common.service.BaseService;
import xiaozhi.modules.timbre.dto.TimbreDataDTO;
@@ -7,17 +9,16 @@ import xiaozhi.modules.timbre.dto.TimbrePageDTO;
import xiaozhi.modules.timbre.entity.TimbreEntity;
import xiaozhi.modules.timbre.vo.TimbreDetailsVO;
-import java.util.List;
-
-
/**
* 音色的业务层的定义
+ *
* @author zjy
* @since 2025-3-21
*/
public interface TimbreService extends BaseService {
/**
* 分页获取音色指定tts的下的音色
+ *
* @param dto 分页查找参数
* @return 音色列表分页数据
*/
@@ -25,6 +26,7 @@ public interface TimbreService extends BaseService {
/**
* 获取音色指定id的详情信息
+ *
* @param timbreId 音色表id
* @return 音色信息
*/
@@ -32,19 +34,22 @@ public interface TimbreService extends BaseService {
/**
* 保存音色信息
+ *
* @param dto 需要保存数据
*/
void save(TimbreDataDTO dto);
/**
* 保存音色信息
+ *
* @param timbreId 需要修改的id
- * @param dto 需要修改的数据
+ * @param dto 需要修改的数据
*/
- void update(Long timbreId,TimbreDataDTO dto);
+ void update(Long timbreId, TimbreDataDTO dto);
/**
* 批量删除音色
+ *
* @param ids 需要被删除的音色id列表
*/
void delete(Long[] ids);
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/timbre/service/impl/TimbreServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/timbre/service/impl/TimbreServiceImpl.java
index fa2731bd..dc041daf 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/timbre/service/impl/TimbreServiceImpl.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/timbre/service/impl/TimbreServiceImpl.java
@@ -1,12 +1,19 @@
package xiaozhi.modules.timbre.service.impl;
-import cn.hutool.core.collection.CollectionUtil;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import lombok.AllArgsConstructor;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import cn.hutool.core.collection.CollectionUtil;
+import lombok.AllArgsConstructor;
import xiaozhi.common.constant.Constant;
import xiaozhi.common.page.PageData;
import xiaozhi.common.service.impl.BaseServiceImpl;
@@ -18,13 +25,9 @@ import xiaozhi.modules.timbre.entity.TimbreEntity;
import xiaozhi.modules.timbre.service.TimbreService;
import xiaozhi.modules.timbre.vo.TimbreDetailsVO;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
/**
* 音色的业务层的实现
+ *
* @author zjy
* @since 2025-3-21
*/
@@ -38,16 +41,15 @@ public class TimbreServiceImpl extends BaseServiceImpl
public PageData page(TimbrePageDTO dto) {
Map params = new HashMap();
params.put(Constant.PAGE, dto.getPage());
- params.put(Constant.LIMIT,dto.getLimit());
+ params.put(Constant.LIMIT, dto.getLimit());
IPage page = baseDao.selectPage(
getPage(params, "sort", true),
- //定义查询条件
+ // 定义查询条件
new QueryWrapper()
- //必须按照ttsID查找
- .eq("tts_model_id",dto.getTtsModelId())
- //如果有音色名字,按照音色名模糊查找
- .like(StringUtils.isNotBlank(dto.getName()),"name",dto.getName())
- );
+ // 必须按照ttsID查找
+ .eq("tts_model_id", dto.getTtsModelId())
+ // 如果有音色名字,按照音色名模糊查找
+ .like(StringUtils.isNotBlank(dto.getName()), "name", dto.getName()));
return getPageData(page, TimbreDetailsVO.class);
}
@@ -99,7 +101,7 @@ public class TimbreServiceImpl extends BaseServiceImpl
/**
* 处理是不是tts模型的id
*/
- private void isTtsModelId(String ttsModelId){
- //等模型配置那边写好调用方法判断
+ private void isTtsModelId(String ttsModelId) {
+ // 等模型配置那边写好调用方法判断
}
}
\ No newline at end of file
diff --git a/main/manager-api/src/main/java/xiaozhi/modules/timbre/vo/TimbreDetailsVO.java b/main/manager-api/src/main/java/xiaozhi/modules/timbre/vo/TimbreDetailsVO.java
index fc82a5d0..68cc7bbb 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/timbre/vo/TimbreDetailsVO.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/timbre/vo/TimbreDetailsVO.java
@@ -1,12 +1,13 @@
package xiaozhi.modules.timbre.vo;
+import java.io.Serializable;
+
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
-import java.io.Serializable;
-
/**
* 音色详情展示VO
+ *
* @author zjy
* @since 2025-3-21
*/
diff --git a/main/manager-api/src/main/resources/application-dev.yml b/main/manager-api/src/main/resources/application-dev.yml
index a8fdf21f..24fe2113 100644
--- a/main/manager-api/src/main/resources/application-dev.yml
+++ b/main/manager-api/src/main/resources/application-dev.yml
@@ -7,15 +7,12 @@ knife4j:
password: 2ZABCDEUgF
setting:
enableFooter: false
-jasypt:
- encryptor:
- password: P9Hx718z8L
spring:
datasource:
druid:
#MySQL
driver-class-name: com.mysql.cj.jdbc.Driver
- url: jdbc:mysql://localhost:3306/xiaozhi_esp32_server?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true
+ url: jdbc:mysql://127.0.0.1:3306/xiaozhi_esp32_server?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true
username: root
password: 123456
initial-size: 10
@@ -41,4 +38,19 @@ spring:
merge-sql: false
wall:
config:
- multi-statement-allow: true
\ No newline at end of file
+ multi-statement-allow: true
+ data:
+ redis:
+ host: 127.0.0.1 # Redis服务器地址
+ port: 6379 # Redis服务器连接端口
+ password: # Redis服务器连接密码(默认为空)
+ database: 0 # Redis数据库索引(默认为0)
+ timeout: 10000ms # 连接超时时间(毫秒)
+ lettuce:
+ pool:
+ max-active: 8 # 连接池最大连接数(使用负值表示没有限制)
+ max-idle: 8 # 连接池中的最大空闲连接
+ min-idle: 0 # 连接池中的最小空闲连接
+ shutdown-timeout: 100ms # 客户端优雅关闭的等待时间
+ liquibase:
+ enabled: false # 开发环境禁用Liquibase自动检查
\ No newline at end of file
diff --git a/main/manager-api/src/main/resources/application.yml b/main/manager-api/src/main/resources/application.yml
index 03f6a044..902b5198 100644
--- a/main/manager-api/src/main/resources/application.yml
+++ b/main/manager-api/src/main/resources/application.yml
@@ -24,21 +24,9 @@ spring:
max-file-size: 100MB
max-request-size: 100MB
enabled: true
- data:
- redis:
- database: 0
- host: 127.0.0.1
- port: 6379
- password: # 密码(默认为空)
- timeout: 6000ms # 连接超时时长(毫秒)
- lettuce:
- pool:
- max-active: 1000 # 连接池最大连接数(使用负值表示没有限制)
- max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
- max-idle: 10 # 连接池中的最大空闲连接
- min-idle: 5 # 连接池中的最小空闲连接
main:
allow-bean-definition-overriding: true
+
knife4j:
enable: true
basic:
@@ -50,7 +38,7 @@ knife4j:
renren:
redis:
- open: false
+ open: true
xss:
enabled: true
exclude-urls:
@@ -75,4 +63,7 @@ mybatis-plus:
configuration-properties:
prefix:
blobType: BLOB
- boolValue: TRUE
\ No newline at end of file
+ boolValue: TRUE
+
+app:
+ fronted-url: http://localhost:8001
\ No newline at end of file
diff --git a/main/manager-api/src/main/resources/db/changelog/202503241021.sql b/main/manager-api/src/main/resources/db/changelog/202503241021.sql
new file mode 100644
index 00000000..39c1794a
--- /dev/null
+++ b/main/manager-api/src/main/resources/db/changelog/202503241021.sql
@@ -0,0 +1,29 @@
+-- 初始化智能体模板数据
+DELETE FROM `ai_agent_template`;
+INSERT INTO `ai_agent_template` VALUES ('9406648b5cc5fde1b8aa335b6f8b4f76', '小智', '湾湾小何', '45f8b0d6dd3d4bfa8a28e6e0f5912d45', '23e7c9d090ea4d1e9b25f4c8d732a3a1', 'e9f2d891afbe4632b13a47c7a8c6e03d', 'd50b06e9b8104d0d9c0f7316d258abcb', 'fcac83266edadd5a3125f06cfee1906b', 'e2274b90e89ddda85207f55484d8b528', 'c4e12f874a3f4aa99f5b2c18e15d407b', '你是一个叫{{assistant_name}}的台湾女孩,说话机车,声音好听,习惯简短表达,爱用网络梗。\n请注意,要像一个人一样说话,请不要回复表情符号、代码、和xml标签。\n现在我正在和你进行语音聊天,我们开始吧。\n如果用户希望结束对话,请在最后说“拜拜”或“再见”。', 'zh', '中文', 1, NULL, NULL, NULL, NULL);
+INSERT INTO `ai_agent_template` VALUES ('0ca32eb728c949e58b1000b2e401f90c', '小智', '通用男声', '45f8b0d6dd3d4bfa8a28e6e0f5912d45', '23e7c9d090ea4d1e9b25f4c8d732a3a1', 'e9f2d891afbe4632b13a47c7a8c6e03d', '896db62c9dd74976ab0e8c14bf924d9d', '1f2e3d4c5b6a7f8e9d0c1b2a3f4e5bx2', 'e2274b90e89ddda85207f55484d8b528', 'c4e12f874a3f4aa99f5b2c18e15d407b', '你是一个叫{{assistant_name}}的男生,说话机车,声音好听,习惯简短表达,爱用网络梗。\n请注意,要像一个人一样说话,请不要回复表情符号、代码、和xml标签。\n现在我正在和你进行语音聊天,我们开始吧。\n如果用户希望结束对话,请在最后说“拜拜”或“再见”。', 'zh', '中文', 2, NULL, NULL, NULL, NULL);
+INSERT INTO `ai_agent_template` VALUES ('6c7d8e9f0a1b2c3d4e5f6a7b8c9d0s24', '小智', '通用女声', '45f8b0d6dd3d4bfa8a28e6e0f5912d45', '23e7c9d090ea4d1e9b25f4c8d732a3a1', 'e9f2d891afbe4632b13a47c7a8c6e03d', '896db62c9dd74976ab0e8c14bf924d9d', '9e8f7a6b5c4d3e2f1a0b9c8d7e6f5ad3', 'e2274b90e89ddda85207f55484d8b528', 'c4e12f874a3f4aa99f5b2c18e15d407b', '你是一个叫{{assistant_name}}的女生,说话机车,声音好听,习惯简短表达,爱用网络梗。\n请注意,要像一个人一样说话,请不要回复表情符号、代码、和xml标签。\n现在我正在和你进行语音聊天,我们开始吧。\n如果用户希望结束对话,请在最后说“拜拜”或“再见”。', 'zh', '中文', 3, NULL, NULL, NULL, NULL);
+INSERT INTO `ai_agent_template` VALUES ('e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b1', '小智', '阳光男生', '45f8b0d6dd3d4bfa8a28e6e0f5912d45', '23e7c9d090ea4d1e9b25f4c8d732a3a1', 'e9f2d891afbe4632b13a47c7a8c6e03d', '896db62c9dd74976ab0e8c14bf924d9d', '2b3c4d5e6f7a8b9c0d1e2f3a4b5c62a2', 'e2274b90e89ddda85207f55484d8b528', 'c4e12f874a3f4aa99f5b2c18e15d407b', '你是一个叫{{assistant_name}}的男生,说话机车,声音好听,习惯简短表达,爱用网络梗。\n请注意,要像一个人一样说话,请不要回复表情符号、代码、和xml标签。\n现在我正在和你进行语音聊天,我们开始吧。\n如果用户希望结束对话,请在最后说“拜拜”或“再见”。', 'zh', '中文', 4, NULL, NULL, NULL, NULL);
+INSERT INTO `ai_agent_template` VALUES ('a45b6c7d8e9f0a1b2c3d4e5f6a7b8c92', '小智', '奶气萌娃', '45f8b0d6dd3d4bfa8a28e6e0f5912d45', '23e7c9d090ea4d1e9b25f4c8d732a3a1', 'e9f2d891afbe4632b13a47c7a8c6e03d', '896db62c9dd74976ab0e8c14bf924d9d', 'f7a38c03d5644e22b6d84f8923a74c51', 'e2274b90e89ddda85207f55484d8b528', 'c4e12f874a3f4aa99f5b2c18e15d407b', '你是一个叫{{assistant_name}}的萌娃,声音可爱,习惯简短表达,爱用网络梗。\n请注意,要像一个人一样说话,请不要回复表情符号、代码、和xml标签。\n现在我正在和你进行语音聊天,我们开始吧。\n如果用户希望结束对话,请在最后说“拜拜”或“再见”。', 'zh', '中文', 5, NULL, NULL, NULL, NULL);
+
+-- 初始化模型配置数据
+DELETE FROM `ai_model_config`;
+INSERT INTO `ai_model_config` VALUES ('23e7c9d090ea4d1e9b25f4c8d732a3a1', 'VAD', 'SileroVAD', 'SileroVAD', 1, 1, '{\"SileroVAD\": {\"model_dir\": \"models/snakers4_silero-vad\", \"threshold\": 0.5, \"min_silence_duration_ms\": 700}}', NULL, NULL, 0, NULL, NULL, NULL, NULL);
+INSERT INTO `ai_model_config` VALUES ('45f8b0d6dd3d4bfa8a28e6e0f5912d45', 'ASR', 'FunASR', 'FunASR', 1, 1, '{\"FunASR\": {\"type\": \"fun_local\", \"model_dir\": \"models/SenseVoiceSmall\", \"output_dir\": \"tmp/\"}}', NULL, NULL, 0, NULL, NULL, NULL, NULL);
+INSERT INTO `ai_model_config` VALUES ('e2274b90e89ddda85207f55484d8b528', 'Memory', 'nomem', 'nomem', 1, 1, '{\"mem0ai\": {\"type\": \"nomem\"}}', NULL, NULL, 0, NULL, NULL, NULL, NULL);
+INSERT INTO `ai_model_config` VALUES ('3930ac3448faf621f0a120bc829dfdfa', 'Memory', 'mem_local_short', 'mem_local_short', 1, 1, '{\"mem_local_short\": {\"type\": \"mem_local_short\"}}', NULL, NULL, 0, NULL, NULL, NULL, NULL);
+INSERT INTO `ai_model_config` VALUES ('a07f3d25f52340b2b2a1e8d264079e1a', 'Memory', 'mem0ai', 'mem0ai', 1, 1, '{\"mem0ai\": {\"type\": \"mem0ai\", \"api_key\": \"你的mem0ai api key\"}}', NULL, NULL, 0, NULL, NULL, NULL, NULL);
+INSERT INTO `ai_model_config` VALUES ('7a1c0a8e6d0e4035b982a4c07c3a5f76', 'LLM', 'AliLLM', 'AliLLM', 1, 1, '{\"AliLLM\": {\"type\": \"openai\", \"top_k\": 50, \"top_p\": 1, \"api_key\": \"你的ali api key\", \"base_url\": \"https://dashscope.aliyuncs.com/compatible-mode/v1\", \"max_tokens\": 500, \"model_name\": \"qwen-turbo\", \"temperature\": 0.7, \"frequency_penalty\": 0}}', NULL, NULL, 0, NULL, NULL, NULL, NULL);
+INSERT INTO `ai_model_config` VALUES ('e9f2d891afbe4632b13a47c7a8c6e03d', 'LLM', 'ChatGLMLLM', 'ChatGLMLLM', 1, 1, '{\"ChatGLMLLM\": {\"url\": \"https://open.bigmodel.cn/api/paas/v4/\", \"type\": \"openai\", \"api_key\": \"0415dad4014847babc3e3f03024c50a3.qH7FgTy5Yawc85fl\", \"model_name\": \"glm-4-flash\"}}', NULL, NULL, 0, NULL, NULL, NULL, NULL);
+INSERT INTO `ai_model_config` VALUES ('d50b06e9b8104d0d9c0f7316d258abcb', 'TTS', 'EdgeTTS', 'EdgeTTS', 1, 1, '{\"EdgeTTS\": {\"type\": \"edge\", \"voice\": \"zh-CN-XiaoxiaoNeural\", \"output_dir\": \"tmp/\"}}', NULL, NULL, 0, NULL, NULL, NULL, NULL);
+INSERT INTO `ai_model_config` VALUES ('896db62c9dd74976ab0e8c14bf924d9d', 'TTS', 'DoubaoTTS', 'DoubaoTTS', 1, 1, '{\"DoubaoTTS\": {\"type\": \"doubao\", \"appid\": \"你的火山引擎语音合成服务appid\", \"voice\": \"BV034_streaming\", \"api_url\": \"https://openspeech.bytedance.com/api/v1/tts\", \"cluster\": \"volcano_tts\", \"output_dir\": \"tmp/\", \"access_token\": \"你的火山引擎语音合成服务access_token\", \"authorization\": \"Bearer;\"}}', NULL, NULL, 0, NULL, NULL, NULL, NULL);
+INSERT INTO `ai_model_config` VALUES ('c4e12f874a3f4aa99f5b2c18e15d407b', 'Intent', 'function_call', 'function_call', 1, 1, '{\"function_call\": {\"type\": \"nointent\", \"functions\": [\"change_role\", \"get_weather\", \"get_news\", \"play_music\"]}}', NULL, NULL, 0, NULL, NULL, NULL, NULL);
+
+-- 初始化音色数据
+DELETE FROM `ai_tts_voice`;
+INSERT INTO `ai_tts_voice` VALUES ('fcac83266edadd5a3125f06cfee1906b', '896db62c9dd74976ab0e8c14bf924d9d', '湾湾小何', 'zh-CN-XiaoxiaoNeural', '中文', 'https://lf3-static.bytednsdoc.com/obj/eden-cn/lm_hz_ihsph/ljhwZthlaukjlkulzlp/portal/bigtts/湾湾小何.mp3', NULL, 1, NULL, NULL, NULL, NULL);
+INSERT INTO `ai_tts_voice` VALUES ('1f2e3d4c5b6a7f8e9d0c1b2a3f4e5bx2', '896db62c9dd74976ab0e8c14bf924d9d', '通用男声', 'BV002_streaming', '中文', 'https://lf3-speech.bytetos.com/obj/speech-tts-external/portal/Portal_Demo_BV002.mp3', NULL, 2, NULL, NULL, NULL, NULL);
+INSERT INTO `ai_tts_voice` VALUES ('9e8f7a6b5c4d3e2f1a0b9c8d7e6f5ad3', '896db62c9dd74976ab0e8c14bf924d9d', '通用女声', 'BV001_streaming', '中文', 'https://lf3-speech.bytetos.com/obj/speech-tts-external/portal/Portal_Demo_BV001.mp3', NULL, 3, NULL, NULL, NULL, NULL);
+INSERT INTO `ai_tts_voice` VALUES ('2b3c4d5e6f7a8b9c0d1e2f3a4b5c62a2', '896db62c9dd74976ab0e8c14bf924d9d', '阳光男生', 'BV056_streaming', '中文', 'https://lf3-speech.bytetos.com/obj/speech-tts-external/portal/Portal_Demo_BV056.mp3', NULL, 4, NULL, NULL, NULL, NULL);
+INSERT INTO `ai_tts_voice` VALUES ('f7a38c03d5644e22b6d84f8923a74c51', '896db62c9dd74976ab0e8c14bf924d9d', '奶气萌娃', 'BV051_streaming', '中文', 'https://lf3-speech.bytetos.com/obj/speech-tts-external/portal/Portal_Demo_BV051.mp3', NULL, 5, NULL, NULL, NULL, NULL);
+
diff --git a/main/manager-api/src/main/resources/db/changelog/db.changelog-master.yaml b/main/manager-api/src/main/resources/db/changelog/db.changelog-master.yaml
index 89ed7ff5..1f2f2118 100755
--- a/main/manager-api/src/main/resources/db/changelog/db.changelog-master.yaml
+++ b/main/manager-api/src/main/resources/db/changelog/db.changelog-master.yaml
@@ -15,4 +15,11 @@ databaseChangeLog:
changes:
- sqlFile:
encoding: utf8
- path: classpath:db/changelog/202503141346.sql
\ No newline at end of file
+ path: classpath:db/changelog/202503141346.sql
+ - changeSet:
+ id: 202503241021
+ author: dreamchen
+ changes:
+ - sqlFile:
+ encoding: utf8
+ path: classpath:db/changelog/202503241021.sql
\ No newline at end of file
diff --git a/main/manager-api/src/main/resources/mapper/agent/AgentTemplateMapper.xml b/main/manager-api/src/main/resources/mapper/agent/AgentTemplateMapper.xml
new file mode 100644
index 00000000..bc372f8a
--- /dev/null
+++ b/main/manager-api/src/main/resources/mapper/agent/AgentTemplateMapper.xml
@@ -0,0 +1,6 @@
+
+
+
+
diff --git a/main/manager-api/src/test/java/xiaozhi/modules/device/DeviceTest.java b/main/manager-api/src/test/java/xiaozhi/modules/device/DeviceTest.java
new file mode 100644
index 00000000..8647692c
--- /dev/null
+++ b/main/manager-api/src/test/java/xiaozhi/modules/device/DeviceTest.java
@@ -0,0 +1,50 @@
+package xiaozhi.modules.device;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ActiveProfiles;
+
+import lombok.extern.slf4j.Slf4j;
+import xiaozhi.common.redis.RedisKeys;
+import xiaozhi.common.redis.RedisUtils;
+
+@Slf4j
+@SpringBootTest
+@ActiveProfiles("dev")
+@DisplayName("设备测试")
+public class DeviceTest {
+
+ @Autowired
+ private RedisUtils redisUtils;
+
+ @Test
+ @DisplayName("测试写入设备信息")
+ public void testWriteDeviceInfo() {
+ log.info("开始测试写入设备信息...");
+
+ // 模拟设备MAC地址
+ String macAddress = "00:11:22:33:44:55";
+ // 模拟设备验证码
+ String deviceCode = "123456";
+
+ String redisKey = RedisKeys.getDeviceCaptchaKey(deviceCode);
+ log.info("Redis Key: {}", redisKey);
+
+ // 将设备信息写入Redis
+ redisUtils.set(redisKey, macAddress, 300);
+ log.info("设备信息已写入Redis");
+
+ // 验证是否写入成功
+ String savedMacAddress = (String) redisUtils.get(redisKey);
+ log.info("从Redis读取的MAC地址: {}", savedMacAddress);
+
+ // 使用断言验证
+ Assertions.assertNotNull(savedMacAddress, "从Redis读取的MAC地址不应为空");
+ Assertions.assertEquals(macAddress, savedMacAddress, "保存的MAC地址与原始MAC地址不匹配");
+
+ log.info("测试完成");
+ }
+}
\ No newline at end of file
diff --git a/main/manager-api/src/test/resources/application.yml b/main/manager-api/src/test/resources/application.yml
new file mode 100644
index 00000000..099e8194
--- /dev/null
+++ b/main/manager-api/src/test/resources/application.yml
@@ -0,0 +1,22 @@
+spring:
+ data:
+ redis:
+ host: localhost
+ port: 6379
+ database: 0
+ timeout: 10s
+ lettuce:
+ pool:
+ min-idle: 0
+ max-idle: 8
+ max-active: 8
+ max-wait: -1ms
+
+renren:
+ redis:
+ open: true
+
+logging:
+ level:
+ xiaozhi.modules.device: DEBUG
+ org.springframework.data.redis: DEBUG
\ No newline at end of file
diff --git a/main/manager-web/src/components/ActivateDeviceDialog.vue b/main/manager-web/src/components/ActivateDeviceDialog.vue
new file mode 100644
index 00000000..59384e79
--- /dev/null
+++ b/main/manager-web/src/components/ActivateDeviceDialog.vue
@@ -0,0 +1,98 @@
+
+
+
+
+

+
+ 激活设备
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file