Просмотр исходного кода

更新 account-service 的 dto 和 po 数据约束, 以及 po 的数据库表结构

reghao 4 месяцев назад
Родитель
Сommit
e077f6b4f9
34 измененных файлов с 276 добавлено и 227 удалено
  1. 0 25
      account/account-api/src/main/java/cn/reghao/tnb/account/api/dto/VerifyCode.java
  2. 1 1
      account/account-service/src/main/java/cn/reghao/tnb/account/app/controller/AccountAuthController.java
  3. 3 3
      account/account-service/src/main/java/cn/reghao/tnb/account/app/controller/AccountCodeController.java
  4. 3 3
      account/account-service/src/main/java/cn/reghao/tnb/account/app/controller/AccountRegistryController.java
  5. 1 1
      account/account-service/src/main/java/cn/reghao/tnb/account/app/controller/AccountResourceController.java
  6. 2 2
      account/account-service/src/main/java/cn/reghao/tnb/account/app/model/constant/VerifyChannel.java
  7. 2 2
      account/account-service/src/main/java/cn/reghao/tnb/account/app/model/dto/AccountLoginDto.java
  8. 43 0
      account/account-service/src/main/java/cn/reghao/tnb/account/app/model/dto/AccountRegisterDto.java
  9. 0 17
      account/account-service/src/main/java/cn/reghao/tnb/account/app/model/dto/AccountStatDto.java
  10. 0 23
      account/account-service/src/main/java/cn/reghao/tnb/account/app/model/dto/AccountUpdateDto.java
  11. 3 3
      account/account-service/src/main/java/cn/reghao/tnb/account/app/model/dto/PasswordResetDto.java
  12. 0 34
      account/account-service/src/main/java/cn/reghao/tnb/account/app/model/dto/UserRegisterDto.java
  13. 32 0
      account/account-service/src/main/java/cn/reghao/tnb/account/app/model/dto/VerifyCodeDto.java
  14. 35 23
      account/account-service/src/main/java/cn/reghao/tnb/account/app/model/po/UserAccount.java
  15. 17 0
      account/account-service/src/main/java/cn/reghao/tnb/account/app/model/po/UserLogin.java
  16. 11 0
      account/account-service/src/main/java/cn/reghao/tnb/account/app/model/po/UserRegistry.java
  17. 7 0
      account/account-service/src/main/java/cn/reghao/tnb/account/app/model/po/UserRole.java
  18. 1 1
      account/account-service/src/main/java/cn/reghao/tnb/account/app/model/vo/AccountLoginRet.java
  19. 1 1
      account/account-service/src/main/java/cn/reghao/tnb/account/app/model/vo/AccountToken.java
  20. 1 3
      account/account-service/src/main/java/cn/reghao/tnb/account/app/rpc/AccountQueryImpl.java
  21. 2 2
      account/account-service/src/main/java/cn/reghao/tnb/account/app/security/handler/AuthSuccessHandlerImpl.java
  22. 1 4
      account/account-service/src/main/java/cn/reghao/tnb/account/app/service/AccountProfileService.java
  23. 2 2
      account/account-service/src/main/java/cn/reghao/tnb/account/app/service/AccountRegistryService.java
  24. 1 1
      account/account-service/src/main/java/cn/reghao/tnb/account/app/service/AccountTokenService.java
  25. 6 6
      account/account-service/src/main/java/cn/reghao/tnb/account/app/service/CodeService.java
  26. 2 3
      account/account-service/src/main/java/cn/reghao/tnb/account/app/service/impl/AccountLoginServiceImpl.java
  27. 21 29
      account/account-service/src/main/java/cn/reghao/tnb/account/app/service/impl/AccountRegistryServiceImpl.java
  28. 1 1
      account/account-service/src/main/java/cn/reghao/tnb/account/app/service/impl/AccountTokenServiceImpl.java
  29. 26 26
      account/account-service/src/main/resources/mapper/UserAccountMapper.xml
  30. 4 4
      account/account-service/src/main/resources/mapper/UserLoginMapper.xml
  31. 3 3
      account/account-service/src/main/resources/mapper/UserRegistryMapper.xml
  32. 4 4
      account/account-service/src/main/resources/mapper/UserRoleMapper.xml
  33. 3 0
      common/src/main/java/cn/reghao/tnb/common/util/ConstantId.java
  34. 37 0
      common/src/main/java/cn/reghao/tnb/common/util/StringRegexp.java

+ 0 - 25
account/account-api/src/main/java/cn/reghao/tnb/account/api/dto/VerifyCode.java

@@ -1,25 +0,0 @@
-package cn.reghao.tnb.account.api.dto;
-
-import cn.reghao.jutil.web.validator.ValidEnum;
-import cn.reghao.tnb.account.api.constant.VerifyChannel;
-import lombok.Getter;
-import lombok.Setter;
-
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
-import java.io.Serializable;
-
-/**
- * @author reghao
- * @date 2021-11-14 16:55:03
- */
-@Getter
-@Setter
-public class VerifyCode implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    @ValidEnum(value = VerifyChannel.class, message = "请选择正确的难度等级")
-    private Integer channel;
-    @NotBlank(message = "邮箱或手机号不能为空白字符串")
-    private String receiver;
-}

+ 1 - 1
account/account-service/src/main/java/cn/reghao/tnb/account/app/controller/AccountAuthController.java

@@ -2,7 +2,7 @@ package cn.reghao.tnb.account.app.controller;
 
 import cn.reghao.jutil.web.WebResult;
 import cn.reghao.jutil.jdk.serializer.JsonConverter;
-import cn.reghao.tnb.account.app.model.dto.AccountToken;
+import cn.reghao.tnb.account.app.model.vo.AccountToken;
 import cn.reghao.tnb.account.app.service.AccountTokenService;
 import com.google.gson.JsonObject;
 import io.swagger.v3.oas.annotations.tags.Tag;

+ 3 - 3
account/account-service/src/main/java/cn/reghao/tnb/account/app/controller/AccountCodeController.java

@@ -2,7 +2,7 @@ package cn.reghao.tnb.account.app.controller;
 
 import cn.reghao.jutil.jdk.result.Result;
 import cn.reghao.jutil.web.WebResult;
-import cn.reghao.tnb.account.api.dto.VerifyCode;
+import cn.reghao.tnb.account.app.model.dto.VerifyCodeDto;
 import cn.reghao.tnb.account.api.dto.RsaPubkey;
 import cn.reghao.tnb.account.app.service.CodeService;
 import cn.reghao.tnb.account.app.service.PubkeyService;
@@ -56,8 +56,8 @@ public class AccountCodeController {
 
     @Operation(summary = "获取短信/邮件验证码", description = "N")
     @PostMapping(value = "/code/verify", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String getVerifyCode(@RequestBody @Validated VerifyCode verifyCode) {
-        Result result = codeService.sendVerifyCode(verifyCode);
+    public String getVerifyCode(@RequestBody @Validated VerifyCodeDto verifyCodeDto) {
+        Result result = codeService.sendVerifyCode(verifyCodeDto);
         return WebResult.result(result);
     }
 

+ 3 - 3
account/account-service/src/main/java/cn/reghao/tnb/account/app/controller/AccountRegistryController.java

@@ -2,7 +2,7 @@ package cn.reghao.tnb.account.app.controller;
 
 import cn.reghao.jutil.jdk.result.Result;
 import cn.reghao.jutil.web.WebResult;
-import cn.reghao.tnb.account.app.model.dto.UserRegisterDto;
+import cn.reghao.tnb.account.app.model.dto.AccountRegisterDto;
 import cn.reghao.tnb.account.app.model.dto.PasswordResetDto;
 import cn.reghao.tnb.account.app.model.po.UserRegistry;
 import cn.reghao.tnb.account.app.service.AccountRegistryService;
@@ -41,8 +41,8 @@ public class AccountRegistryController {
 
     @Operation(summary = "注册用户", description = "N")
     @PostMapping(value = "/create", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String signup(@RequestBody @Validated UserRegisterDto userRegisterDto) {
-        Result result = accountRegistryService.createAccount(userRegisterDto);
+    public String signup(@RequestBody @Validated AccountRegisterDto accountRegisterDto) {
+        Result result = accountRegistryService.createAccount(accountRegisterDto);
         return WebResult.result(result);
     }
 

+ 1 - 1
account/account-service/src/main/java/cn/reghao/tnb/account/app/controller/AccountResourceController.java

@@ -1,7 +1,7 @@
 package cn.reghao.tnb.account.app.controller;
 
 import cn.reghao.jutil.web.WebResult;
-import cn.reghao.jutil.jdk.string.StringRegexp;
+import cn.reghao.tnb.common.util.StringRegexp;
 import cn.reghao.tnb.account.api.dto.AccountInfo;
 import cn.reghao.tnb.account.api.dto.OAuthAccountInfo;
 import cn.reghao.tnb.account.api.iface.AccountQuery;

+ 2 - 2
account/account-api/src/main/java/cn/reghao/tnb/account/api/constant/VerifyChannel.java → account/account-service/src/main/java/cn/reghao/tnb/account/app/model/constant/VerifyChannel.java

@@ -1,10 +1,10 @@
-package cn.reghao.tnb.account.api.constant;
+package cn.reghao.tnb.account.app.model.constant;
 
 import java.util.HashMap;
 import java.util.Map;
 
 /**
- * token 类型
+ * 验证码通道类型
  *
  * @author reghao
  * @date 2024-04-17 20:54:00

+ 2 - 2
account/account-service/src/main/java/cn/reghao/tnb/account/app/model/dto/AccountLoginDto.java

@@ -5,9 +5,9 @@ import cn.reghao.tnb.account.app.model.constant.LoginType;
 import cn.reghao.jutil.web.validator.ValidEnum;
 import lombok.Getter;
 import lombok.Setter;
-import org.hibernate.validator.constraints.Length;
 
 import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
 import java.io.Serializable;
 
 /**
@@ -27,7 +27,7 @@ public class AccountLoginDto implements Serializable {
     private String principal;
     @NotBlank
     private String credential;
-    @Length(min = 5, max = 5, message = "图形验证码应是 5 个字符")
+    @Size(min = 5, max = 5, message = "图形验证码应是 5 个字符")
     private String captchaCode;
     @ValidEnum(value = LoginPlat.class, message = "登入平台类型不正确")
     private Integer plat;

+ 43 - 0
account/account-service/src/main/java/cn/reghao/tnb/account/app/model/dto/AccountRegisterDto.java

@@ -0,0 +1,43 @@
+package cn.reghao.tnb.account.app.model.dto;
+
+import cn.reghao.tnb.account.app.model.constant.LoginPlat;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Pattern;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+
+/**
+ * 用户注册提交的数据
+ *
+ * @author reghao
+ * @date 2021-11-17 16:36:05
+ */
+@Setter
+@Getter
+public class AccountRegisterDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @NotBlank
+    @Size(min = 11, max = 11, message = "手机号长度应为 11 个字符")
+    @Pattern(regexp = "^1(3\\d|4[5-9]|5[0-35-9]|6[2567]|7[0-8]|8\\d|9[0-35-9])\\d{8}$", message = "手机号格式不正确")
+    // UserAccount 中的 mobile
+    private String principal;
+    @NotBlank
+    @Size(min = 1, max = 1024)
+    // 经 rsa 公钥加密后的密码
+    private String credential;
+    @NotBlank
+    @Size(min = 6, max = 6, message = "验证码长度应为 6 个字符")
+    private String verifyCode;
+    @NotBlank
+    @Size(min = 5, max = 5, message = "图形验证码长度应为 5 个字符")
+    private String captchaCode;
+    private String plat;
+
+    public AccountRegisterDto() {
+        this.plat = LoginPlat.web.getName();
+    }
+}

+ 0 - 17
account/account-service/src/main/java/cn/reghao/tnb/account/app/model/dto/AccountStatDto.java

@@ -1,17 +0,0 @@
-package cn.reghao.tnb.account.app.model.dto;
-
-import lombok.Getter;
-
-import javax.validation.constraints.NotNull;
-
-/**
- * @author reghao
- * @date 2023-10-28 22:40:49
- */
-@Getter
-public class AccountStatDto {
-    @NotNull
-    private Long userId;
-    @NotNull
-    private Boolean enabled;
-}

+ 0 - 23
account/account-service/src/main/java/cn/reghao/tnb/account/app/model/dto/AccountUpdateDto.java

@@ -1,23 +0,0 @@
-package cn.reghao.tnb.account.app.model.dto;
-
-import lombok.Getter;
-import lombok.Setter;
-
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
-import java.io.Serializable;
-
-/**
- * @author reghao
- * @date 2023-02-18 17:35:05
- */
-@Setter
-@Getter
-public class AccountUpdateDto implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    @NotNull
-    private Integer type;
-    @NotBlank
-    private String field;
-}

+ 3 - 3
account/account-service/src/main/java/cn/reghao/tnb/account/app/model/dto/PasswordResetDto.java

@@ -2,9 +2,9 @@ package cn.reghao.tnb.account.app.model.dto;
 
 import lombok.Getter;
 import lombok.Setter;
-import org.hibernate.validator.constraints.Length;
 
 import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
 import java.io.Serializable;
 
 /**
@@ -17,10 +17,10 @@ public class PasswordResetDto implements Serializable {
     private static final long serialVersionUID = 1L;
 
     private String principal;
-    @Length(min = 6, max = 6, message = "验证码长度应为 6 位")
+    @Size(min = 6, max = 6, message = "验证码长度应为 6 位")
     private String verifyCode;
     @NotBlank(message = "密码不能为空")
     private String newCredential;
-    @Length(min = 5, max = 5, message = "captcha 长度应为 5 位")
+    @Size(min = 5, max = 5, message = "captcha 长度应为 5 位")
     private String captchaCode;
 }

+ 0 - 34
account/account-service/src/main/java/cn/reghao/tnb/account/app/model/dto/UserRegisterDto.java

@@ -1,34 +0,0 @@
-package cn.reghao.tnb.account.app.model.dto;
-
-import cn.reghao.tnb.account.app.model.constant.LoginPlat;
-import lombok.Getter;
-import lombok.Setter;
-import org.hibernate.validator.constraints.Length;
-
-import javax.validation.constraints.NotBlank;
-import java.io.Serializable;
-
-/**
- * 用户注册提交的数据
- *
- * @author reghao
- * @date 2021-11-17 16:36:05
- */
-@Setter
-@Getter
-public class UserRegisterDto implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    private String principal;
-    @NotBlank(message = "密码不能为空")
-    private String credential;
-    @Length(min = 6, max = 6, message = "验证码长度应为 6 位")
-    private String verifyCode;
-    @Length(min = 5, max = 5, message = "captcha 长度应为 5 位")
-    private String captchaCode;
-    private String plat;
-
-    public UserRegisterDto() {
-        this.plat = LoginPlat.web.getName();
-    }
-}

+ 32 - 0
account/account-service/src/main/java/cn/reghao/tnb/account/app/model/dto/VerifyCodeDto.java

@@ -0,0 +1,32 @@
+package cn.reghao.tnb.account.app.model.dto;
+
+import cn.reghao.jutil.web.validator.ValidEnum;
+import cn.reghao.tnb.account.app.model.constant.VerifyChannel;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Pattern;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+
+/**
+ * 手机或邮箱验证码
+ *
+ * @author reghao
+ * @date 2021-11-14 16:55:03
+ */
+@Getter
+@Setter
+public class VerifyCodeDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ValidEnum(value = VerifyChannel.class, message = "验证码通道类型错误")
+    private Integer channel;
+    /*@NotBlank(message = "邮箱或手机号不能为空白字符串")
+    @Size(min = 1, max = 64, message = "帐号长度不应超过 64 个字符")*/
+    @NotBlank
+    @Size(min = 11, max = 11, message = "手机号长度应为 11 个字符")
+    @Pattern(regexp = "^1(3\\d|4[5-9]|5[0-35-9]|6[2567]|7[0-8]|8\\d|9[0-35-9])\\d{8}$", message = "手机号格式不正确")
+    private String receiver;
+}

+ 35 - 23
account/account-service/src/main/java/cn/reghao/tnb/account/app/model/po/UserAccount.java

@@ -1,14 +1,14 @@
 package cn.reghao.tnb.account.app.model.po;
 
 import cn.reghao.jutil.jdk.db.BaseObject;
-import cn.reghao.tnb.common.auth.AccountRole;
+import cn.reghao.tnb.common.util.ConstantId;
 import lombok.*;
-import org.hibernate.validator.constraints.Length;
 import org.springframework.security.core.GrantedAuthority;
 import org.springframework.security.core.userdetails.UserDetails;
 
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
 import java.time.LocalDateTime;
 import java.util.Collection;
 import java.util.Set;
@@ -26,22 +26,35 @@ public class UserAccount extends BaseObject<Integer> implements UserDetails {
     @NotNull
     private Long userId;
     @NotBlank
-    @Length(min = 4, max = 16, message = "用户名仅可包含数字,大小写字母和 '-' 等字符, 长度为 4 ~ 16 个字符")
+    @Size(min = 3, max = 10)
     private String username;
-    private String email;
+    @NotBlank
+    @Size(min = 11, max = 11)
     private String mobile;
-    @Length(min = 8, max = 20, message = "密码不能为空白字符串, 长度为 8 ~ 20 个字符")
+    @NotBlank
+    @Size(min = 1, max = 255)
     private String encodedPassword;
+    @NotBlank
+    @Size(min = 64, max = 64)
     private String salt;
+    @NotNull
     private LocalDateTime createAt;
-    private String screenName;
-    private String avatarUrl;
-
     // Spring Security 使用的字段
-    private Set<UserAuthority> authorities;
+    // 使用 UserRole 持久化到数据库
+    private transient Set<UserAuthority> authorities;
+    @NotNull
     private Boolean enabled;
+    @NotNull
     private Boolean locked;
 
+    @NotBlank
+    @Size(min = 1, max = 20)
+    private String screenName;
+    @NotBlank
+    @Size(min = 1, max = 64)
+    private String avatarUrl;
+    private String email;
+
     /**
      * 验证码登入创建的帐号
      *
@@ -49,29 +62,33 @@ public class UserAccount extends BaseObject<Integer> implements UserDetails {
      * @return
      * @date 2025-10-19 17:10:646
      */
-    public UserAccount(long userId, String avatarUrl) {
+    public UserAccount(String mobile, long userId) {
         this.userId = userId;
         this.username = String.format("tnb_%s", userId);
+        this.mobile = mobile;
         this.encodedPassword = "";
         this.salt = "";
         this.createAt = LocalDateTime.now();
         this.enabled = true;
         this.locked = false;
         this.screenName = this.username;
-        this.avatarUrl = avatarUrl;
+        this.avatarUrl = ConstantId.AVATAR_URL;
+        this.email = "";
         this.authorities = Set.of(new UserAuthority());
     }
 
-    public UserAccount(long userId, String encodedPassword, String salt, String avatarUrl, Set<UserAuthority> authorities) {
+    public UserAccount(String mobile, long userId, String encodedPassword, String salt, Set<UserAuthority> authorities) {
         this.userId = userId;
         this.username = String.format("tnb_%s", userId);
+        this.mobile = mobile;
         this.encodedPassword = encodedPassword;
         this.salt = salt;
         this.createAt = LocalDateTime.now();
         this.enabled = true;
         this.locked = false;
         this.screenName = this.username;
-        this.avatarUrl = avatarUrl;
+        this.avatarUrl = ConstantId.AVATAR_URL;
+        this.email = "";
         this.authorities = authorities;
     }
 
@@ -83,26 +100,21 @@ public class UserAccount extends BaseObject<Integer> implements UserDetails {
      * @date 2025-10-19 17:10:262
      */
     @Deprecated
-    public UserAccount(long userId, String email, String mobile, String encodedPassword, String salt, String username, String screenName, String avatarUrl) {
+    public UserAccount(String mobile, long userId, String username, String screenName, String avatarUrl) {
         this.userId = userId;
         this.username = username;
-        this.email = email;
+        this.mobile = mobile;
+        this.encodedPassword = ConstantId.ENCODED_PASSWORD;
+        this.salt = ConstantId.SALT;
         this.createAt = LocalDateTime.now();
         this.enabled = true;
         this.locked = false;
         this.screenName = screenName;
         this.avatarUrl = avatarUrl;
+        this.email = "";
         this.authorities = Set.of(new UserAuthority());
     }
 
-    public void setMobile(String mobile) {
-        this.mobile = mobile;
-    }
-
-    public void setEmail(String email) {
-        this.email = email;
-    }
-
     public Long getUserId() {
         return userId;
     }

+ 17 - 0
account/account-service/src/main/java/cn/reghao/tnb/account/app/model/po/UserLogin.java

@@ -3,6 +3,10 @@ package cn.reghao.tnb.account.app.model.po;
 import cn.reghao.jutil.jdk.db.BaseObject;
 import lombok.*;
 
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+
 /**
  * 用户登入日志
  *
@@ -14,14 +18,27 @@ import lombok.*;
 @Setter
 @Getter
 public class UserLogin extends BaseObject<Integer> {
+    @NotBlank
+    @Size(min = 1, max = 32)
     private String loginId;
+    @NotNull
     private Long userId;
+    @NotNull
     private Integer loginType;
+    @NotNull
     private Integer plat;
+    @NotNull
     private Long loginAt;
+    // 点分十进制的 IPv4 地址
+    @NotBlank
+    @Size(min = 7, max = 16)
     private String loginIp;
+    @NotBlank
+    @Size(min = 1, max = 255)
     private String userAgent;
+    @NotNull
     private Boolean rememberMe;
+    @NotNull
     private Boolean success;
 
     public UserLogin(String loginId, long userId, int plat, String loginIp,

+ 11 - 0
account/account-service/src/main/java/cn/reghao/tnb/account/app/model/po/UserRegistry.java

@@ -5,6 +5,10 @@ import cn.reghao.tnb.common.util.ConstantId;
 import lombok.Getter;
 import lombok.Setter;
 
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+
 /**
  * 帐号开放注册规则
  *
@@ -14,10 +18,17 @@ import lombok.Setter;
 @Setter
 @Getter
 public class UserRegistry extends BaseObject<Integer> {
+    @NotNull
     private Boolean enabled;
+    @NotBlank
+    @Size(min = 5, max = 5)
     private String captchaCode;
+    @NotNull
     private Boolean enableCaptcha;
+    @NotBlank
+    @Size(min = 6, max = 6)
     private String verifyCode;
+    @NotNull
     private Boolean enableVerify;
 
     public UserRegistry() {

+ 7 - 0
account/account-service/src/main/java/cn/reghao/tnb/account/app/model/po/UserRole.java

@@ -4,6 +4,10 @@ import cn.reghao.jutil.jdk.db.BaseObject;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
 
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+
 /**
  * 持久化到数据库版本的 UserAuthority
  *
@@ -13,7 +17,10 @@ import lombok.NoArgsConstructor;
 @NoArgsConstructor
 @Getter
 public class UserRole extends BaseObject<Integer> {
+    @NotNull
     private Long userId;
+    @NotBlank
+    @Size(min = 1, max = 20)
     private String name;
 
     public UserRole(long userId, String name) {

+ 1 - 1
account/account-service/src/main/java/cn/reghao/tnb/account/app/model/dto/AccountLoginRet.java → account/account-service/src/main/java/cn/reghao/tnb/account/app/model/vo/AccountLoginRet.java

@@ -1,4 +1,4 @@
-package cn.reghao.tnb.account.app.model.dto;
+package cn.reghao.tnb.account.app.model.vo;
 
 import cn.reghao.tnb.account.api.dto.AccountInfo;
 import lombok.Getter;

+ 1 - 1
account/account-service/src/main/java/cn/reghao/tnb/account/app/model/dto/AccountToken.java → account/account-service/src/main/java/cn/reghao/tnb/account/app/model/vo/AccountToken.java

@@ -1,4 +1,4 @@
-package cn.reghao.tnb.account.app.model.dto;
+package cn.reghao.tnb.account.app.model.vo;
 
 import lombok.AllArgsConstructor;
 import lombok.Getter;

+ 1 - 3
account/account-service/src/main/java/cn/reghao/tnb/account/app/rpc/AccountQueryImpl.java

@@ -112,9 +112,7 @@ public class AccountQueryImpl implements AccountQuery {
 
         String email = String.format("%s@tnb.cn", userId);
         String mobile = String.format("190%s", userId);
-        String password = "";
-        String salt = "";
-        UserAccount userAccount = new UserAccount(userId, email, mobile, password, salt, username, screenName, avatarUrl);
+        UserAccount userAccount = new UserAccount(mobile, userId, username, screenName, avatarUrl);
         accountRepository.saveAccount(userAccount);
         return userId;
     }

+ 2 - 2
account/account-service/src/main/java/cn/reghao/tnb/account/app/security/handler/AuthSuccessHandlerImpl.java

@@ -6,8 +6,8 @@ import cn.reghao.tnb.account.api.iface.AccountQuery;
 import cn.reghao.tnb.account.app.db.repository.AccountRepository;
 import cn.reghao.tnb.account.app.model.constant.LoginPlat;
 import cn.reghao.tnb.account.api.dto.AccountInfo;
-import cn.reghao.tnb.account.app.model.dto.AccountLoginRet;
-import cn.reghao.tnb.account.app.model.dto.AccountToken;
+import cn.reghao.tnb.account.app.model.vo.AccountLoginRet;
+import cn.reghao.tnb.account.app.model.vo.AccountToken;
 import cn.reghao.tnb.account.app.security.form.AccountAuthToken;
 import cn.reghao.tnb.account.app.service.AccountTokenService;
 import org.springframework.security.core.Authentication;

+ 1 - 4
account/account-service/src/main/java/cn/reghao/tnb/account/app/service/AccountProfileService.java

@@ -2,18 +2,15 @@ package cn.reghao.tnb.account.app.service;
 
 import cn.reghao.jutil.jdk.result.Result;
 import cn.reghao.jutil.jdk.security.RandomString;
-import cn.reghao.tnb.account.api.constant.VerifyChannel;
+import cn.reghao.tnb.account.app.model.constant.VerifyChannel;
 import cn.reghao.tnb.account.app.db.mapper.UserAccountMapper;
 import cn.reghao.tnb.account.app.db.repository.AccountRepository;
 import cn.reghao.tnb.account.app.model.dto.*;
 import cn.reghao.tnb.account.app.model.po.UserAccount;
 import cn.reghao.tnb.account.app.security.form.AccountAuthToken;
-import cn.reghao.tnb.common.auth.AccountRole;
 import org.springframework.security.crypto.password.PasswordEncoder;
 import org.springframework.stereotype.Service;
 
-import java.util.Set;
-
 /**
  * @author reghao
  * @date 2023-02-18 14:42:57

+ 2 - 2
account/account-service/src/main/java/cn/reghao/tnb/account/app/service/AccountRegistryService.java

@@ -1,7 +1,7 @@
 package cn.reghao.tnb.account.app.service;
 
 import cn.reghao.jutil.jdk.result.Result;
-import cn.reghao.tnb.account.app.model.dto.UserRegisterDto;
+import cn.reghao.tnb.account.app.model.dto.AccountRegisterDto;
 import cn.reghao.tnb.account.app.model.po.UserAccount;
 import cn.reghao.tnb.account.app.model.po.UserRegistry;
 
@@ -11,6 +11,6 @@ import cn.reghao.tnb.account.app.model.po.UserRegistry;
  */
 public interface AccountRegistryService {
     UserRegistry getUserRegistry();
-    Result createAccount(UserRegisterDto userRegisterDto);
+    Result createAccount(AccountRegisterDto accountRegisterDto);
     UserAccount createAccount(String principal, String password);
 }

+ 1 - 1
account/account-service/src/main/java/cn/reghao/tnb/account/app/service/AccountTokenService.java

@@ -1,6 +1,6 @@
 package cn.reghao.tnb.account.app.service;
 
-import cn.reghao.tnb.account.app.model.dto.AccountToken;
+import cn.reghao.tnb.account.app.model.vo.AccountToken;
 import cn.reghao.tnb.account.app.security.form.AccountAuthToken;
 import org.springframework.security.core.Authentication;
 

+ 6 - 6
account/account-service/src/main/java/cn/reghao/tnb/account/app/service/CodeService.java

@@ -2,9 +2,9 @@ package cn.reghao.tnb.account.app.service;
 
 import cn.reghao.jutil.jdk.result.Result;
 import cn.reghao.jutil.jdk.security.RandomString;
-import cn.reghao.jutil.jdk.string.StringRegexp;
-import cn.reghao.tnb.account.api.constant.VerifyChannel;
-import cn.reghao.tnb.account.api.dto.VerifyCode;
+import cn.reghao.tnb.common.util.StringRegexp;
+import cn.reghao.tnb.account.app.model.constant.VerifyChannel;
+import cn.reghao.tnb.account.app.model.dto.VerifyCodeDto;
 import cn.reghao.tnb.account.app.db.repository.AccountRepository;
 import cn.reghao.tnb.account.app.util.RabbitProducer;
 import cn.reghao.tnb.account.app.model.po.UserAccount;
@@ -61,9 +61,9 @@ public class CodeService {
         return redisString.get(RedisKeys.getCaptchaKey());
     }
 
-    public Result sendVerifyCode(VerifyCode verifyCode) {
-        Integer channel = verifyCode.getChannel();
-        String receiver = verifyCode.getReceiver();
+    public Result sendVerifyCode(VerifyCodeDto verifyCodeDto) {
+        Integer channel = verifyCodeDto.getChannel();
+        String receiver = verifyCodeDto.getReceiver();
 
         int type;
         if (StringRegexp.matchEmail(receiver)) {

+ 2 - 3
account/account-service/src/main/java/cn/reghao/tnb/account/app/service/impl/AccountLoginServiceImpl.java

@@ -1,8 +1,7 @@
 package cn.reghao.tnb.account.app.service.impl;
 
-import cn.reghao.tnb.account.api.constant.VerifyChannel;
+import cn.reghao.tnb.account.app.model.constant.VerifyChannel;
 import cn.reghao.tnb.account.app.db.repository.AccountRepository;
-import cn.reghao.tnb.account.app.model.constant.LoginType;
 import cn.reghao.tnb.account.app.model.dto.AccountLoginDto;
 import cn.reghao.tnb.account.app.model.po.UserAccount;
 import cn.reghao.tnb.account.app.service.AccountLoginService;
@@ -10,7 +9,7 @@ import cn.reghao.tnb.account.app.service.LoginAttemptService;
 import cn.reghao.tnb.account.app.security.exception.AccountLoginException;
 import cn.reghao.tnb.account.app.security.form.AccountAuthToken;
 import cn.reghao.tnb.account.app.service.*;
-import cn.reghao.jutil.jdk.string.StringRegexp;
+import cn.reghao.tnb.common.util.StringRegexp;
 import org.springframework.security.authentication.DisabledException;
 import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.security.core.userdetails.UsernameNotFoundException;

+ 21 - 29
account/account-service/src/main/java/cn/reghao/tnb/account/app/service/impl/AccountRegistryServiceImpl.java

@@ -3,9 +3,9 @@ package cn.reghao.tnb.account.app.service.impl;
 import cn.reghao.jutil.jdk.result.Result;
 import cn.reghao.jutil.jdk.result.ResultStatus;
 import cn.reghao.jutil.jdk.security.RandomString;
-import cn.reghao.jutil.jdk.string.StringRegexp;
-import cn.reghao.tnb.account.api.constant.VerifyChannel;
-import cn.reghao.tnb.account.app.model.dto.UserRegisterDto;
+import cn.reghao.tnb.common.util.StringRegexp;
+import cn.reghao.tnb.account.app.model.constant.VerifyChannel;
+import cn.reghao.tnb.account.app.model.dto.AccountRegisterDto;
 import cn.reghao.tnb.account.app.db.repository.AccountRepository;
 import cn.reghao.tnb.account.app.model.po.UserAuthority;
 import cn.reghao.tnb.account.app.model.po.UserRegistry;
@@ -48,13 +48,13 @@ public class AccountRegistryServiceImpl implements AccountRegistryService {
     }
 
     @Override
-    public synchronized Result createAccount(UserRegisterDto userRegisterDto) {
+    public synchronized Result createAccount(AccountRegisterDto accountRegisterDto) {
         UserRegistry userRegistry = accountRepository.getUserRegistry();
         if (!userRegistry.getEnabled()) {
             return Result.fail("系统当前未开放注册");
         }
 
-        String captchaCode = userRegisterDto.getCaptchaCode();
+        String captchaCode = accountRegisterDto.getCaptchaCode();
         String savedCaptchaCode = codeService.getCaptcha();
         if (savedCaptchaCode == null) {
             return Result.fail("当前会话已过期, 请刷新页面后重新登入. 或者检查浏览器是否禁用了 cookie");
@@ -62,8 +62,8 @@ public class AccountRegistryServiceImpl implements AccountRegistryService {
             return Result.fail("图形验证码不正确, 请刷新页面后重新获取");
         }
 
-        String principal = userRegisterDto.getPrincipal();
-        String verifyCode = userRegisterDto.getVerifyCode();
+        String principal = accountRegisterDto.getPrincipal();
+        String verifyCode = accountRegisterDto.getVerifyCode();
         String savedVerifyCode = codeService.getVerifyCode(VerifyChannel.registryChannel.getValue(), principal);
         if (savedVerifyCode == null) {
             return Result.fail("当前会话已过期, 请刷新页面后重新登入. 或者检查浏览器是否禁用了 cookie");
@@ -71,12 +71,16 @@ public class AccountRegistryServiceImpl implements AccountRegistryService {
             return Result.fail("短信验证码不正确, 请重新获取");
         }
 
-        String credential = userRegisterDto.getCredential();
+        String credential = accountRegisterDto.getCredential();
         String decryptCredential;
         try {
             decryptCredential = pubkeyService.decrypt(credential);
         } catch (Exception e) {
-            return Result.result(ResultStatus.FAIL, "密码不正确, 请刷新页面后重新注册");
+            return Result.result(ResultStatus.FAIL, "公钥不正确, 请刷新页面后重新注册");
+        }
+
+        if (!StringRegexp.matchPassword(decryptCredential)) {
+            return Result.result(ResultStatus.FAIL, "密码格式不正确, 密码必须包含大写字母, 数字, 特殊字符");
         }
 
         long userId = accountRepository.getNextUserId();
@@ -89,34 +93,22 @@ public class AccountRegistryServiceImpl implements AccountRegistryService {
                     new UserAuthority(AccountRole.oss.getValue()));
         }
 
-        UserAccount userAccount = new UserAccount(userId, encodedPassword, salt, ConstantId.AVATAR_URL, authorities);
-        if (StringRegexp.matchEmail(principal)) {
-            userAccount.setEmail(principal);
-        } else if (StringRegexp.matchMobile(principal)) {
-            userAccount.setMobile(principal);
-        } else {
-            throw new UsernameNotFoundException(String.format("username %s not found", principal));
-            //throw new Exception(String.format("username %s not found", principal));
+        if (StringRegexp.matchMobile(principal)) {
+            UserAccount userAccount = new UserAccount(principal, userId, encodedPassword, salt, authorities);
+            accountRepository.saveAccount(userAccount);
+            return Result.result(ResultStatus.SUCCESS, "帐号已创建");
         }
-
-        accountRepository.saveAccount(userAccount);
-        return Result.result(ResultStatus.SUCCESS, "帐号已创建");
+        throw new UsernameNotFoundException(String.format("%s is not mobile number", principal));
     }
 
     @Override
     public UserAccount createAccount(String principal, String password) {
         long userId = accountRepository.getNextUserId();
-        UserAccount userAccount = new UserAccount(userId, ConstantId.AVATAR_URL);
-        if (StringRegexp.matchEmail(principal)) {
-            userAccount.setEmail(principal);
-            accountRepository.saveAccount(userAccount);
-            return accountRepository.getUserAccountByEmail(principal);
-        } else if (StringRegexp.matchMobile(principal)) {
-            userAccount.setMobile(principal);
+        if (StringRegexp.matchMobile(principal)) {
+            UserAccount userAccount = new UserAccount(principal, userId);
             accountRepository.saveAccount(userAccount);
             return accountRepository.getUserAccountByMobile(principal);
         }
-
-        throw new UsernameNotFoundException(String.format("username %s not found", principal));
+        throw new UsernameNotFoundException(String.format("%s is not mobile number", principal));
     }
 }

+ 1 - 1
account/account-service/src/main/java/cn/reghao/tnb/account/app/service/impl/AccountTokenServiceImpl.java

@@ -9,7 +9,7 @@ import cn.reghao.tnb.account.app.model.po.UserLogin;
 import cn.reghao.tnb.account.app.service.AccountTokenService;
 import cn.reghao.tnb.account.app.redis.ds.RedisOps;
 import cn.reghao.jutil.web.ServletUtil;
-import cn.reghao.tnb.account.app.model.dto.AccountToken;
+import cn.reghao.tnb.account.app.model.vo.AccountToken;
 import cn.reghao.tnb.account.app.security.form.AccountAuthToken;
 import cn.reghao.tnb.account.app.service.PubkeyService;
 import cn.reghao.tnb.account.app.util.JwtUtil;

+ 26 - 26
account/account-service/src/main/resources/mapper/UserAccountMapper.xml

@@ -3,13 +3,13 @@
 
 <mapper namespace="cn.reghao.tnb.account.app.db.mapper.UserAccountMapper">
     <insert id="save">
-        insert into user_account
+        insert into account_user_account
         (`user_id`,`username`,`mobile`,`email`,`encoded_password`,`salt`,`create_at`,`enabled`,`locked`,`screen_name`,`avatar_url`)
         values
         (#{userId},#{username},#{mobile},#{email},#{encodedPassword},#{salt},#{createAt},#{enabled},#{locked},#{screenName},#{avatarUrl})
     </insert>
     <insert id="saveAll" useGeneratedKeys="true" keyProperty="id">
-        insert into user_account
+        insert into account_user_account
         (`user_id`,`username`,`mobile`,`email`,`encoded_password`,`salt`,`create_at`,`enabled`,`locked`,`screen_name`,`avatar_url`)
         values
         <foreach collection="list" item="item" index="index" separator=",">
@@ -18,93 +18,93 @@
     </insert>
 
     <update id="updateUserMobile">
-        update user_account
+        update account_user_account
         set update_time=now(),mobile=#{mobile}
         where user_id=#{userId}
     </update>
     <update id="updateUserEmail">
-        update user_account
+        update account_user_account
         set update_time=now(),email=#{email}
         where user_id=#{userId}
     </update>
     <update id="updateSetPassword">
-        update user_account set encoded_password=#{encodedPassword},salt=#{salt}
+        update account_user_account set encoded_password=#{encodedPassword},salt=#{salt}
         where user_id=#{userId}
     </update>
     <update id="updateUserProfile">
-        update user_account
+        update account_user_account
         set update_time=now(),username=#{username},screen_name=#{screenName}
         where user_id=#{userId}
     </update>
     <update id="updateUserScreenName">
-        update user_account
+        update account_user_account
         set update_time=now(),screen_name=#{screenName}
         where user_id=#{userId}
     </update>
     <update id="updateUserAvatar">
-        update user_account
+        update account_user_account
         set update_time=now(),avatar_url=#{avatarUrl}
         where user_id=#{userId}
     </update>
 
     <select id="findAll1" resultType="java.lang.Long">
         select user_id,count(user_id) as total
-        from user_account
+        from account_user_account
         group by screen_name
         order by total desc
         limit 236
     </select>
     <select id="findMaxUserId" resultType="java.lang.Long">
         select max(user_id)
-        from user_account
+        from account_user_account
     </select>
     <select id="findMaxMobile" resultType="java.lang.Long">
-        select max(mobile) from user_account
+        select max(mobile) from account_user_account
         where mobile like '129%'
     </select>
     <select id="findByUsername" resultType="cn.reghao.tnb.account.app.model.po.UserAccount">
         select *
-        from user_account
+        from account_user_account
         where username=#{username}
     </select>
     <select id="findByEmail" resultType="cn.reghao.tnb.account.app.model.po.UserAccount">
         select *
-        from user_account
+        from account_user_account
         where email=#{email}
     </select>
     <select id="findByMobile" resultType="cn.reghao.tnb.account.app.model.po.UserAccount">
         select *
-        from user_account
+        from account_user_account
         where mobile=#{mobile}
     </select>
     <select id="findUserIdByUsername" resultType="java.lang.Long">
         select user_id
-        from user_account
+        from account_user_account
         where username=#{username}
     </select>
     <select id="findAccountInfo" resultType="cn.reghao.tnb.account.api.dto.AccountInfo">
         select user_id,screen_name,avatar_url,username,mobile,email
-        from user_account
+        from account_user_account
         where user_id=#{userId}
     </select>
     <select id="findByUserId" resultType="cn.reghao.tnb.account.app.model.po.UserAccount">
         select *
-        from user_account
+        from account_user_account
         where user_id=#{userId}
     </select>
     <select id="findUserInfo" resultType="cn.reghao.tnb.account.api.dto.AccountInfo">
         select user_id,screen_name,avatar_url,username,mobile,email
-        from user_account
+        from account_user_account
         where user_id=#{userId}
     </select>
     <select id="findUserAvatar" resultType="cn.reghao.tnb.account.api.dto.AccountInfo">
         select user_id,screen_name,avatar_url,username,mobile,email
-        from user_account
+        from account_user_account
         where user_id=#{userId}
     </select>
     <select id="findUserAvatars" resultType="cn.reghao.tnb.account.api.dto.AccountInfo">
         select user_id,screen_name,avatar_url,username,mobile,email
-        from user_account
+        from account_user_account
         where user_id in
         <foreach collection="list" item="id" index="index" open="(" close=")" separator=",">
             #{id}
@@ -113,7 +113,7 @@
 
     <select id="findAccountInfos" resultType="cn.reghao.tnb.account.api.dto.AccountInfo">
         select user_id,screen_name,avatar_url,username,mobile,email
-        from user_account
+        from account_user_account
         where user_id in
         <foreach collection="list" item="id" index="index" open="(" close=")" separator=",">
             #{id}
@@ -122,28 +122,28 @@
 
     <select id="findAccountInfoByMobile" resultType="cn.reghao.tnb.account.api.dto.AccountInfo">
         select user_id,screen_name,avatar_url,username,mobile,email
-        from user_account
+        from account_user_account
         where mobile=#{mobile}
     </select>
     <select id="findAccountInfoByEmail" resultType="cn.reghao.tnb.account.api.dto.AccountInfo">
         select user_id,screen_name,avatar_url,username,mobile,email
-        from user_account
+        from account_user_account
         where email=#{email}
     </select>
     <select id="findAccountInfoByUsername" resultType="cn.reghao.tnb.account.api.dto.AccountInfo">
         select user_id,screen_name,avatar_url,username,mobile,email
-        from user_account
+        from account_user_account
         where username=#{username}
     </select>
 
     <select id="countByScreenName" resultType="java.lang.Integer">
         select count(*)
-        from user_account
+        from account_user_account
         where screen_name like concat('%',#{screenName},'%')
     </select>
     <select id="findScreenNameByPage" resultType="cn.reghao.tnb.account.api.dto.AccountInfo">
         select user_id,screen_name,avatar_url,username,mobile,email
-        from user_account
+        from account_user_account
         where screen_name like concat('%',#{screenName},'%')
     </select>
 </mapper>

+ 4 - 4
account/account-service/src/main/resources/mapper/UserLoginMapper.xml

@@ -3,21 +3,21 @@
 
 <mapper namespace="cn.reghao.tnb.account.app.db.mapper.UserLoginMapper">
     <insert id="save">
-        insert into user_login_attempts
+        insert into account_user_login
         (`login_id`,`user_id`,`login_type`,`user_agent`,`login_ip`,`login_at`,`plat`,`remember_me`,`success`)
         values
         (#{loginId},#{userId},#{loginType},#{userAgent},#{loginIp},#{loginAt},#{plat},#{rememberMe},#{success})
     </insert>
 
     <update id="updateSetFailed">
-        update user_login_attempts
+        update account_user_login
         set update_time=now(),`success`=0
         where login_id=#{loginId}
     </update>
 
     <select id="findByLoginIds" resultType="cn.reghao.tnb.account.app.model.po.UserLogin">
         select *
-        from user_login_attempts
+        from account_user_login
         where login_id in
         <foreach collection="list" item="id" index="index" open="(" close=")" separator=",">
             #{id}
@@ -25,7 +25,7 @@
     </select>
     <select id="findByUserId" resultType="cn.reghao.tnb.account.app.model.po.UserLogin">
         select *
-        from user_login_attempts
+        from account_user_login
         where user_id=#{userId}
         limit #{pageSize}
     </select>

+ 3 - 3
account/account-service/src/main/resources/mapper/UserRegistryMapper.xml

@@ -3,21 +3,21 @@
 
 <mapper namespace="cn.reghao.tnb.account.app.db.mapper.UserRegistryMapper">
     <insert id="save">
-        insert into user_registry
+        insert into account_user_registry
         (`enabled`,`captcha_code`,`enable_captcha`,`verify_code`,`enable_verify`)
         values
         (#{enabled},#{captchaCode},#{enableCaptcha},#{verifyCode},#{enableVerify})
     </insert>
     
     <update id="update">
-        update user_registry
+        update account_user_registry
         set update_time=now(),enabled=#{enabled},captcha_code=#{captchaCode},verify_code=#{verifyCode},enable_code=#{enableCode}
         where id=#{id}
     </update>
     
     <select id="findAll" resultType="cn.reghao.tnb.account.app.model.po.UserRegistry">
         select *
-        from user_registry
+        from account_user_registry
         limit 1
     </select>
 </mapper>

+ 4 - 4
account/account-service/src/main/resources/mapper/UserRoleMapper.xml

@@ -3,13 +3,13 @@
 
 <mapper namespace="cn.reghao.tnb.account.app.db.mapper.UserRoleMapper">
     <insert id="save">
-        insert into user_account_role
+        insert into account_user_role
         (`user_id`,`name`)
         values
         (#{userId},#{name})
     </insert>
     <insert id="saveAll" useGeneratedKeys="true" keyProperty="id">
-        insert into user_account_role
+        insert into account_user_role
         (`user_id`,`name`)
         values
         <foreach collection="list" item="item" index="index" separator=",">
@@ -19,12 +19,12 @@
 
     <select id="findRolesByUserId" resultType="cn.reghao.tnb.account.app.model.po.UserRole">
         select *
-        from user_account_role
+        from account_user_role
         where user_id=#{userId}
     </select>
     <select id="findUserIdsByRole" resultType="java.lang.Long">
         select user_id
-        from user_account_role
+        from account_user_role
         where `name`=#{role}
         order by user_id
         limit 1000

+ 3 - 0
common/src/main/java/cn/reghao/tnb/common/util/ConstantId.java

@@ -14,4 +14,7 @@ public class ConstantId {
     public static final String CAPTCHA_CODE = "tnb23";
     public static final String VERIFY_CODE = "220233";
     public static final String OSS_DOMAIN = "oss.reghao.cn";
+    public static final String RAW_PASSWORD = "UWA3kY.ltRAscO(KpZvC";
+    public static final String ENCODED_PASSWORD = "dee544231c7faacd88aaacfc4c951c55";
+    public static final String SALT = "nAyoy2hr+YCQKvQsUVwXptgwpqdc3N/0q+EXSbLKybKG2GhHsXx85ouuI8U9ubpAqV0tekj7pqQp1H4Phypfdw==";
 }

+ 37 - 0
common/src/main/java/cn/reghao/tnb/common/util/StringRegexp.java

@@ -0,0 +1,37 @@
+package cn.reghao.tnb.common.util;
+
+import java.util.regex.Pattern;
+
+/**
+ * @author reghao
+ * @date 2023-02-20 13:53:17
+ */
+public class StringRegexp {
+    private static final Pattern mobilePattern = Pattern.compile("^1(3\\d|4[5-9]|5[0-35-9]|6[2567]|7[0-8]|8\\d|9[0-35-9])\\d{8}$");
+    private static final Pattern emailPattern = Pattern.compile("^s*\\w+(?:\\.{0,1}[\\w-]+)*@[a-zA-Z0-9]+(?:[-.][a-zA-Z0-9]+)*\\.[a-zA-Z]+\\s*$");
+    private static final Pattern ipv4Pattern = Pattern.compile("^((2((5[0-5])|([0-4]\\d)))|([0-1]?\\d{1,2}))(\\.((2((5[0-5])|([0-4]\\d)))|([0-1]?\\d{1,2}))){3}$ ");
+    private static final Pattern passwordPattern = Pattern.compile("^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\\W_]+$)(?![a-z0-9]+$)(?![a-z\\W_]+$)(?![0-9\\W_]+$)[a-zA-Z0-9\\W_]{10,32}$");
+
+    public static boolean matchMobile(String str) {
+        return mobilePattern.matcher(str).matches();
+    }
+
+    public static boolean matchEmail(String str) {
+        return emailPattern.matcher(str).matches();
+    }
+
+    public static boolean matchIPv4Address(String str) {
+        return ipv4Pattern.matcher(str).matches();
+    }
+
+    /**
+     * 密码正则表达式, 密码必须包含大写字母, 数字, 特殊字符(四种里至少三种,且至少 10 个字符)
+     *
+     * @param
+     * @return
+     * @date 2025-10-23 11:46:10
+     */
+    public static boolean matchPassword(String str) {
+        return passwordPattern.matcher(str).matches();
+    }
+}