permsSet = new HashSet<>();
if (user.getSuperAdmin() == SuperAdminEnum.YES.value()) {
permsSet.add("sys:role:superAdmin");
@@ -68,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/ShiroService.java b/main/manager-api/src/main/java/xiaozhi/modules/security/service/ShiroService.java
index 980645d6..b9d18889 100644
--- a/main/manager-api/src/main/java/xiaozhi/modules/security/service/ShiroService.java
+++ b/main/manager-api/src/main/java/xiaozhi/modules/security/service/ShiroService.java
@@ -1,22 +1,14 @@
package xiaozhi.modules.security.service;
-import xiaozhi.common.user.UserDetail;
import xiaozhi.modules.security.entity.SysUserTokenEntity;
import xiaozhi.modules.sys.entity.SysUserEntity;
-import java.util.List;
-import java.util.Set;
-
/**
* shiro相关接口
* Copyright (c) 人人开源 All rights reserved.
* Website: https://www.renren.io
*/
public interface ShiroService {
- /**
- * 获取用户权限列表
- */
- Set getUserPermissions(UserDetail user);
SysUserTokenEntity getByToken(String token);
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 fdc0d5b5..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,20 +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 jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
import xiaozhi.common.redis.RedisKeys;
import xiaozhi.common.redis.RedisUtils;
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;
/**
* 验证码
@@ -26,9 +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();
+ Cache localCache = CacheBuilder.newBuilder().maximumSize(1000)
+ .expireAfterAccess(5, TimeUnit.MINUTES).build();
@Override
public void create(HttpServletResponse response, String uuid) throws IOException {
@@ -37,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());
}
@@ -52,10 +55,10 @@ public class CaptchaServiceImpl implements CaptchaService {
if (StringUtils.isBlank(code)) {
return false;
}
- //获取验证码
+ // 获取验证码
String captcha = getCache(uuid);
- //效验成功
+ // 效验成功
if (code.equalsIgnoreCase(captcha)) {
return true;
}
@@ -76,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);
}
@@ -85,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 128d9b9d..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,23 +15,6 @@ public class ShiroServiceImpl implements ShiroService {
private final SysUserDao sysUserDao;
private final SysUserTokenDao sysUserTokenDao;
- @Override
- public Set getUserPermissions(UserDetail user) {
- //系统管理员,拥有最高权限
- // TODO: 暂时写死,后续改成从数据库查询
- List permissionsList = new ArrayList<>();
- //用户权限列表
- Set permsSet = new HashSet<>();
- for (String permissions : permissionsList) {
- if (StringUtils.isBlank(permissions)) {
- continue;
- }
- permsSet.addAll(Arrays.asList(permissions.trim().split(",")));
- }
-
- return permsSet;
- }
-
@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
deleted file mode 100644
index 9da7c62b..00000000
--- a/main/manager-api/src/main/java/xiaozhi/modules/sys/controller/SysUserController.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package xiaozhi.modules.sys.controller;
-
-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;
-
-/**
- * 用户管理
- */
-@AllArgsConstructor
-@RestController
-@RequestMapping("/sys/user")
-@Tag(name = "用户管理")
-public class SysUserController {
-
-}
\ No newline at end of file
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
new file mode 100644
index 00000000..7de3843a
--- /dev/null
+++ b/main/manager-api/src/main/java/xiaozhi/modules/sys/dto/AdminPageUserDTO.java
@@ -0,0 +1,24 @@
+package xiaozhi.modules.sys.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 管理员分页用户的参数DTO
+ *
+ * @author zjy
+ * @since 2025-3-21
+ */
+@Data
+@Schema(description = "音色分页参数")
+public class AdminPageUserDTO {
+
+ @Schema(description = "手机号码")
+ private String mobile;
+
+ @Schema(description = "页数")
+ private String page;
+
+ @Schema(description = "显示列数")
+ private String limit;
+}
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 08179409..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
@@ -1,10 +1,12 @@
package xiaozhi.modules.sys.service;
+import xiaozhi.common.page.PageData;
import xiaozhi.common.service.BaseService;
+import xiaozhi.modules.sys.dto.AdminPageUserDTO;
import xiaozhi.modules.sys.dto.PasswordDTO;
import xiaozhi.modules.sys.dto.SysUserDTO;
import xiaozhi.modules.sys.entity.SysUserEntity;
-
+import xiaozhi.modules.sys.vo.AdminPageUserVO;
/**
* 系统用户
@@ -19,5 +21,35 @@ public interface SysUserService extends BaseService {
void delete(Long[] ids);
+ /**
+ * 验证是否允许修改密码更改
+ *
+ * @param userId 用户id
+ * @param passwordDTO 验证密码的参数
+ */
void changePassword(Long userId, PasswordDTO passwordDTO);
+
+ /**
+ * 直接修改密码,不需要验证
+ *
+ * @param userId 用户id
+ * @param password 密码
+ */
+ void changePasswordDirectly(Long userId, String password);
+
+ /**
+ * 重置密码
+ *
+ * @param userId 用户id
+ * @return 随机生成符合规范的密码
+ */
+ String resetPassword(Long userId);
+
+ /**
+ * 管理员分页用户信息
+ *
+ * @param dto 分页查找参数
+ * @return 用户列表分页数据
+ */
+ PageData page(AdminPageUserDTO dto);
}
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 queryWrapper = new QueryWrapper<>();
return baseDao.selectCount(queryWrapper);
}
+ @Override
+ public PageData page(AdminPageUserDTO dto) {
+ Map params = new HashMap();
+ params.put(Constant.PAGE, dto.getPage());
+ params.put(Constant.LIMIT, dto.getLimit());
+ IPage page = baseDao.selectPage(
+ getPage(params, "id", true),
+ // 定义查询条件
+ new QueryWrapper()
+ // 必须按照手机号码查找
+ .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());
+ adminPageUserVO.setStatus(user.getStatus());
+ // TODO 2. 等设备功能写好,获取对应数据
+ adminPageUserVO.setDeviceCount("0");
+ return adminPageUserVO;
+ }).toList();
+ return new PageData<>(list, page.getTotal());
+ }
private boolean isStrongPassword(String password) {
// 弱密码的正则表达式
@@ -120,4 +171,21 @@ public class SysUserServiceImpl extends BaseServiceImpl> page(
+ @Parameter(hidden = true) @RequestParam Map params) {
+ TimbrePageDTO dto = new TimbrePageDTO();
+ dto.setTtsModelId((String) params.get("ttsModelId"));
+ dto.setName((String) params.get("name"));
+ dto.setLimit((String) params.get(Constant.LIMIT));
+ dto.setPage((String) params.get(Constant.PAGE));
+
+ ValidatorUtils.validateEntity(dto);
+ PageData page = timbreService.page(dto);
+ return new Result>().ok(page);
+ }
+
+ @PostMapping
+ @Operation(summary = "音色保存")
+ @RequiresPermissions("sys:role:superAdmin")
+ public Result save(@RequestBody TimbreDataDTO dto) {
+ ValidatorUtils.validateEntity(dto);
+ timbreService.save(dto);
+ return new Result<>();
+ }
+
+ @PutMapping("/{id}")
+ @Operation(summary = "音色修改")
+ @RequiresPermissions("sys:role:superAdmin")
+ public Result update(
+ @PathVariable String id,
+ @RequestBody TimbreDataDTO dto) {
+ ValidatorUtils.validateEntity(dto);
+ timbreService.update(id, dto);
+ return new Result<>();
+ }
+
+ @DeleteMapping("/{id}")
+ @Operation(summary = "音色删除")
+ @RequiresPermissions("sys:role:superAdmin")
+ public Result delete(@PathVariable String id) {
+ timbreService.delete(new String[] { 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
new file mode 100644
index 00000000..3656b4ea
--- /dev/null
+++ b/main/manager-api/src/main/java/xiaozhi/modules/timbre/dao/TimbreDao.java
@@ -0,0 +1,17 @@
+package xiaozhi.modules.timbre.dao;
+
+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
+ */
+@Mapper
+public interface TimbreDao extends BaseMapper {
+}
\ No newline at end of file
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
new file mode 100644
index 00000000..ed737db9
--- /dev/null
+++ b/main/manager-api/src/main/java/xiaozhi/modules/timbre/dto/TimbreDataDTO.java
@@ -0,0 +1,45 @@
+package xiaozhi.modules.timbre.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+/**
+ * 音色表数据DTO
+ *
+ * @author zjy
+ * @since 2025-3-21
+ */
+@Data
+@Schema(description = "音色表信息")
+public class TimbreDataDTO {
+
+ @Schema(description = "语言")
+ @NotBlank(message = "{timbre.languages.require}")
+ private String languages;
+
+ @Schema(description = "音色名称")
+ @NotBlank(message = "{timbre.name.require}")
+ private String name;
+
+ @Schema(description = "备注")
+ @NotBlank(message = "{timbre.remark.require}")
+ private String remark;
+
+ @Schema(description = "排序")
+ @Min(value = 0, message = "{sort.number}")
+ private long sort;
+
+ @Schema(description = "对应 TTS 模型主键")
+ @NotBlank(message = "{timbre.ttsModelId.require}")
+ private String ttsModelId;
+
+ @Schema(description = "音色编码")
+ @NotBlank(message = "{timbre.ttsVoice.require}")
+ private String ttsVoice;
+
+ @Schema(description = "音频播放地址")
+ @NotBlank(message = "{timbre.voiceDemo.require}")
+ private String voiceDemo;
+}
\ No newline at end of file
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
new file mode 100644
index 00000000..9c2aaf24
--- /dev/null
+++ b/main/manager-api/src/main/java/xiaozhi/modules/timbre/dto/TimbrePageDTO.java
@@ -0,0 +1,29 @@
+package xiaozhi.modules.timbre.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+/**
+ * 音色分页参数DTO
+ *
+ * @author zjy
+ * @since 2025-3-21
+ */
+@Data
+@Schema(description = "音色分页参数")
+public class TimbrePageDTO {
+
+ @Schema(description = "对应 TTS 模型主键")
+ @NotBlank(message = "{timbre.ttsModelId.require}")
+ private String ttsModelId;
+
+ @Schema(description = "音色名称")
+ private String name;
+
+ @Schema(description = "页数")
+ private String page;
+
+ @Schema(description = "显示列数")
+ private String limit;
+}
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
new file mode 100644
index 00000000..3d6e5ba1
--- /dev/null
+++ b/main/manager-api/src/main/java/xiaozhi/modules/timbre/entity/TimbreEntity.java
@@ -0,0 +1,65 @@
+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;
+
+/**
+ * 音色表实体类
+ *
+ * @author zjy
+ * @since 2025-3-21
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("ai_tts_voice")
+@Schema(description = "音色信息")
+public class TimbreEntity {
+
+ @Schema(description = "id")
+ private String id;
+
+ @Schema(description = "语言")
+ private String languages;
+
+ @Schema(description = "音色名称")
+ private String name;
+
+ @Schema(description = "备注")
+ private String remark;
+
+ @Schema(description = "排序")
+ private long sort;
+
+ @Schema(description = "对应 TTS 模型主键")
+ private String ttsModelId;
+
+ @Schema(description = "音色编码")
+ private String ttsVoice;
+
+ @Schema(description = "音频播放地址")
+ private String voiceDemo;
+
+ @Schema(description = "更新者")
+ @TableField(fill = FieldFill.UPDATE)
+ private Long updater;
+
+ @Schema(description = "更新时间")
+ @TableField(fill = FieldFill.UPDATE)
+ private Date updateDate;
+
+ @Schema(description = "创建者")
+ @TableField(fill = FieldFill.INSERT)
+ private Long creator;
+
+ @Schema(description = "创建时间")
+ @TableField(fill = FieldFill.INSERT)
+ private Date createDate;
+
+}
\ 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
new file mode 100644
index 00000000..4519e17a
--- /dev/null
+++ b/main/manager-api/src/main/java/xiaozhi/modules/timbre/service/TimbreService.java
@@ -0,0 +1,58 @@
+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;
+import xiaozhi.modules.timbre.dto.TimbrePageDTO;
+import xiaozhi.modules.timbre.entity.TimbreEntity;
+import xiaozhi.modules.timbre.vo.TimbreDetailsVO;
+
+/**
+ * 音色的业务层的定义
+ *
+ * @author zjy
+ * @since 2025-3-21
+ */
+public interface TimbreService extends BaseService {
+ /**
+ * 分页获取音色指定tts的下的音色
+ *
+ * @param dto 分页查找参数
+ * @return 音色列表分页数据
+ */
+ PageData page(TimbrePageDTO dto);
+
+ /**
+ * 获取音色指定id的详情信息
+ *
+ * @param timbreId 音色表id
+ * @return 音色信息
+ */
+ TimbreDetailsVO get(Long timbreId);
+
+ /**
+ * 保存音色信息
+ *
+ * @param dto 需要保存数据
+ */
+ void save(TimbreDataDTO dto);
+
+ /**
+ * 保存音色信息
+ *
+ * @param timbreId 需要修改的id
+ * @param dto 需要修改的数据
+ */
+ void update(String timbreId, TimbreDataDTO dto);
+
+ /**
+ * 批量删除音色
+ *
+ * @param ids 需要被删除的音色id列表
+ */
+ void delete(String[] ids);
+
+ List getVoiceNames(String ttsModelId, String voiceName);
+}
\ No newline at end of file
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
new file mode 100644
index 00000000..9496b6d5
--- /dev/null
+++ b/main/manager-api/src/main/java/xiaozhi/modules/timbre/service/impl/TimbreServiceImpl.java
@@ -0,0 +1,107 @@
+package xiaozhi.modules.timbre.service.impl;
+
+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;
+import xiaozhi.common.utils.ConvertUtils;
+import xiaozhi.modules.timbre.dao.TimbreDao;
+import xiaozhi.modules.timbre.dto.TimbreDataDTO;
+import xiaozhi.modules.timbre.dto.TimbrePageDTO;
+import xiaozhi.modules.timbre.entity.TimbreEntity;
+import xiaozhi.modules.timbre.service.TimbreService;
+import xiaozhi.modules.timbre.vo.TimbreDetailsVO;
+
+/**
+ * 音色的业务层的实现
+ *
+ * @author zjy
+ * @since 2025-3-21
+ */
+@AllArgsConstructor
+@Service
+public class TimbreServiceImpl extends BaseServiceImpl implements TimbreService {
+
+ private final TimbreDao timbreDao;
+
+ @Override
+ public PageData