diff --git a/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/constant/RegExpConsts.java b/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/constant/RegexConsts.java similarity index 53% rename from continew-admin-common/src/main/java/top/charles7c/cnadmin/common/constant/RegExpConsts.java rename to continew-admin-common/src/main/java/top/charles7c/cnadmin/common/constant/RegexConsts.java index e3e04fb8..89ca0c43 100644 --- a/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/constant/RegExpConsts.java +++ b/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/constant/RegexConsts.java @@ -19,6 +19,8 @@ package top.charles7c.cnadmin.common.constant; import lombok.AccessLevel; import lombok.NoArgsConstructor; +import cn.hutool.core.lang.RegexPool; + /** * 正则相关常量 * @@ -26,10 +28,25 @@ import lombok.NoArgsConstructor; * @since 2023/1/10 20:06 */ @NoArgsConstructor(access = AccessLevel.PRIVATE) -public class RegExpConsts { +public class RegexConsts implements RegexPool { /** - * 密码正则(必须包含字母和数字的组合,可以使用特殊字符,长度在6-32之间) + * 用户名正则(长度为 4 到 16 位,可以包含字母、数字,下划线,以字母开头) + */ + public static final String USERNAME = "^[a-zA-Z][a-zA-Z0-9_]{3,15}$"; + + /** + * 密码正则(长度为 6 到 32 位,可以包含字母、数字、下划线,特殊字符,同时包含字母和数字) */ public static final String PASSWORD = "^(?=.*\\d)(?=.*[a-z]).{6,32}$"; + + /** + * 通用编码正则(长度为 2 到 16 位,可以包含字母、数字,下划线,以字母开头) + */ + public static final String GENERAL_CODE = "^[a-zA-Z][a-zA-Z0-9_]{1,15}$"; + + /** + * 通用名称正则(长度为 1 到 20 位,可以包含中文、字母、数字、下划线,短横线) + */ + public static final String GENERAL_NAME = "^[\\u4e00-\\u9fa5a-zA-Z0-9_-]{1,20}$"; } diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/DeptRequest.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/DeptRequest.java index b18c6385..79255caf 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/DeptRequest.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/DeptRequest.java @@ -18,6 +18,7 @@ package top.charles7c.cnadmin.system.model.request; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; import lombok.Data; @@ -26,6 +27,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import org.hibernate.validator.constraints.Length; import top.charles7c.cnadmin.common.base.BaseRequest; +import top.charles7c.cnadmin.common.constant.RegexConsts; import top.charles7c.cnadmin.common.enums.DisEnableStatusEnum; /** @@ -52,6 +54,7 @@ public class DeptRequest extends BaseRequest { */ @Schema(description = "部门名称") @NotBlank(message = "部门名称不能为空") + @Pattern(regexp = RegexConsts.GENERAL_NAME, message = "部门名称长度为 1 到 20 位,可以包含中文、字母、数字、下划线,短横线") private String name; /** diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/MenuRequest.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/MenuRequest.java index 86704d72..10f43ab2 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/MenuRequest.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/MenuRequest.java @@ -18,12 +18,14 @@ package top.charles7c.cnadmin.system.model.request; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; import lombok.Data; import io.swagger.v3.oas.annotations.media.Schema; import top.charles7c.cnadmin.common.base.BaseRequest; +import top.charles7c.cnadmin.common.constant.RegexConsts; import top.charles7c.cnadmin.common.enums.DisEnableStatusEnum; import top.charles7c.cnadmin.common.enums.MenuTypeEnum; @@ -57,6 +59,7 @@ public class MenuRequest extends BaseRequest { */ @Schema(description = "菜单标题") @NotBlank(message = "菜单标题不能为空") + @Pattern(regexp = RegexConsts.GENERAL_NAME, message = "菜单标题长度为 1 到 20 位,可以包含中文、字母、数字、下划线,短横线") private String title; /** diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/RoleRequest.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/RoleRequest.java index 98dae03c..8fb9c590 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/RoleRequest.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/RoleRequest.java @@ -21,6 +21,7 @@ import java.util.List; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; import lombok.Data; @@ -29,6 +30,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import org.hibernate.validator.constraints.Length; import top.charles7c.cnadmin.common.base.BaseRequest; +import top.charles7c.cnadmin.common.constant.RegexConsts; import top.charles7c.cnadmin.common.enums.DataScopeEnum; import top.charles7c.cnadmin.common.enums.DisEnableStatusEnum; @@ -49,12 +51,15 @@ public class RoleRequest extends BaseRequest { */ @Schema(description = "角色名称") @NotBlank(message = "角色名称不能为空") + @Pattern(regexp = RegexConsts.GENERAL_NAME, message = "角色名称长度为 1 到 20 位,可以包含中文、字母、数字、下划线,短横线") private String name; /** * 角色编码 */ @Schema(description = "角色编码") + @NotBlank(message = "角色编码不能为空") + @Pattern(regexp = RegexConsts.GENERAL_CODE, message = "角色编码长度为 2 到 16 位,可以包含字母、数字,下划线,以字母开头") private String code; /** diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/UpdateBasicInfoRequest.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/UpdateBasicInfoRequest.java index 4ad6e00d..1b904666 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/UpdateBasicInfoRequest.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/UpdateBasicInfoRequest.java @@ -20,13 +20,13 @@ import java.io.Serializable; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; import lombok.Data; import io.swagger.v3.oas.annotations.media.Schema; -import org.hibernate.validator.constraints.Length; - +import top.charles7c.cnadmin.common.constant.RegexConsts; import top.charles7c.cnadmin.common.enums.GenderEnum; /** @@ -46,7 +46,7 @@ public class UpdateBasicInfoRequest implements Serializable { */ @Schema(description = "昵称") @NotBlank(message = "昵称不能为空") - @Length(max = 32, message = "昵称长度不能超过 {max} 个字符") + @Pattern(regexp = RegexConsts.GENERAL_NAME, message = "昵称长度为 1 到 20 位,可以包含中文、字母、数字、下划线,短横线") private String nickname; /** diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/UpdateEmailRequest.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/UpdateEmailRequest.java index ee0b1132..5215a604 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/UpdateEmailRequest.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/UpdateEmailRequest.java @@ -27,7 +27,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import org.hibernate.validator.constraints.Length; -import cn.hutool.core.lang.RegexPool; +import top.charles7c.cnadmin.common.constant.RegexConsts; /** * 修改邮箱信息 @@ -46,7 +46,7 @@ public class UpdateEmailRequest implements Serializable { */ @Schema(description = "新邮箱") @NotBlank(message = "新邮箱不能为空") - @Pattern(regexp = RegexPool.EMAIL, message = "邮箱格式错误") + @Pattern(regexp = RegexConsts.EMAIL, message = "邮箱格式错误") private String newEmail; /** diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/UserRequest.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/UserRequest.java index 0511b59b..0589b823 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/UserRequest.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/UserRequest.java @@ -18,7 +18,9 @@ package top.charles7c.cnadmin.system.model.request; import java.util.List; -import javax.validation.constraints.*; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; import lombok.Data; @@ -26,9 +28,8 @@ import io.swagger.v3.oas.annotations.media.Schema; import org.hibernate.validator.constraints.Length; -import cn.hutool.core.lang.RegexPool; - import top.charles7c.cnadmin.common.base.BaseRequest; +import top.charles7c.cnadmin.common.constant.RegexConsts; import top.charles7c.cnadmin.common.enums.DisEnableStatusEnum; import top.charles7c.cnadmin.common.enums.GenderEnum; @@ -49,27 +50,29 @@ public class UserRequest extends BaseRequest { */ @Schema(description = "用户名") @NotBlank(message = "用户名不能为空") + @Pattern(regexp = RegexConsts.USERNAME, message = "用户名长度为 4 到 16 位,可以包含字母、数字,下划线,以字母开头") private String username; /** * 昵称 */ @Schema(description = "昵称") - @Length(max = 32, message = "昵称长度不能超过 {max} 个字符") + @NotBlank(message = "昵称不能为空") + @Pattern(regexp = RegexConsts.GENERAL_NAME, message = "昵称长度为 1 到 20 位,可以包含中文、字母、数字、下划线,短横线") private String nickname; /** * 邮箱 */ @Schema(description = "邮箱") - @Pattern(regexp = RegexPool.EMAIL, message = "邮箱格式错误") + @Pattern(regexp = RegexConsts.EMAIL, message = "邮箱格式错误") private String email; /** * 手机号码 */ @Schema(description = "手机号码") - @Pattern(regexp = RegexPool.MOBILE, message = "手机号码格式错误") + @Pattern(regexp = RegexConsts.MOBILE, message = "手机号码格式错误") private String phone; /** diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/UserService.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/UserService.java index a769acec..17049ae3 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/UserService.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/UserService.java @@ -23,6 +23,7 @@ import org.springframework.web.multipart.MultipartFile; import top.charles7c.cnadmin.common.base.BaseService; import top.charles7c.cnadmin.system.model.entity.UserDO; import top.charles7c.cnadmin.system.model.query.UserQuery; +import top.charles7c.cnadmin.system.model.request.UpdateBasicInfoRequest; import top.charles7c.cnadmin.system.model.request.UpdateUserRoleRequest; import top.charles7c.cnadmin.system.model.request.UserRequest; import top.charles7c.cnadmin.system.model.vo.UserDetailVO; @@ -47,6 +48,16 @@ public interface UserService extends BaseService @@ -70,12 +70,20 @@ required: true, message: t('userCenter.basicInfo.form.error.required.username'), }, + { + match: /^[a-zA-Z][a-zA-Z0-9_]{3,15}$/, + message: t('userCenter.basicInfo.form.error.match.username'), + }, ], nickname: [ { required: true, message: t('userCenter.basicInfo.form.error.required.nickname'), }, + { + match: /^[\u4e00-\u9fa5a-zA-Z0-9_-]{1,20}$/, + message: t('userCenter.basicInfo.form.error.match.nickname'), + }, ], }; }), diff --git a/continew-admin-ui/src/views/system/user/center/locale/en-US.ts b/continew-admin-ui/src/views/system/user/center/locale/en-US.ts index ed674c00..0ed53611 100644 --- a/continew-admin-ui/src/views/system/user/center/locale/en-US.ts +++ b/continew-admin-ui/src/views/system/user/center/locale/en-US.ts @@ -25,7 +25,9 @@ export default { 'userCenter.basicInfo.form.placeholder.nickname': 'Please enter nickname', 'userCenter.basicInfo.form.error.required.username': 'Please enter username', + 'userCenter.basicInfo.form.error.match.username': 'Username are 4 to 16 characters long and can contain letters, numbers, underscores, and start with a letter', 'userCenter.basicInfo.form.error.required.nickname': 'Please enter nickname', + 'userCenter.basicInfo.form.error.match.nickname': 'Nickname are 1 to 20 digits long and can contain Chinese, letters, numbers, underscores, dashes', 'userCenter.basicInfo.form.save': 'Save', 'userCenter.basicInfo.form.save.success': 'Save success', diff --git a/continew-admin-ui/src/views/system/user/center/locale/zh-CN.ts b/continew-admin-ui/src/views/system/user/center/locale/zh-CN.ts index c5a7eedb..592b19e4 100644 --- a/continew-admin-ui/src/views/system/user/center/locale/zh-CN.ts +++ b/continew-admin-ui/src/views/system/user/center/locale/zh-CN.ts @@ -25,7 +25,9 @@ export default { 'userCenter.basicInfo.form.placeholder.nickname': '请输入昵称', 'userCenter.basicInfo.form.error.required.username': '请输入用户名', + 'userCenter.basicInfo.form.error.match.username': '长度为 4 到 16 位,可以包含字母、数字,下划线,以字母开头', 'userCenter.basicInfo.form.error.required.nickname': '请输入昵称', + 'userCenter.basicInfo.form.error.match.nickname': '长度为 1 到 20 位,可以包含中文、字母、数字、下划线,短横线', 'userCenter.basicInfo.form.save': '保存', 'userCenter.basicInfo.form.save.success': '保存成功', @@ -44,12 +46,12 @@ export default { 'userCenter.securitySettings.updatePwd.form.label.rePassword': '确认新密码', 'userCenter.securitySettings.updatePwd.form.placeholder.oldPassword': '请输入当前密码', - 'userCenter.securitySettings.updatePwd.form.placeholder.newPassword': '密码长度 6 到 32 位,同时包含数字和字母', + 'userCenter.securitySettings.updatePwd.form.placeholder.newPassword': '长度为 6 到 32 位,同时包含字母和数字', 'userCenter.securitySettings.updatePwd.form.placeholder.rePassword': '请再次输入新密码', 'userCenter.securitySettings.updatePwd.form.error.required.oldPassword': '请输入当前密码', 'userCenter.securitySettings.updatePwd.form.error.required.newPassword': '请输入新密码', - 'userCenter.securitySettings.updatePwd.form.error.match.newPassword': '密码长度 6 到 32 位,同时包含数字和字母', + 'userCenter.securitySettings.updatePwd.form.error.match.newPassword': '长度为 6 到 32 位,同时包含字母和数字', 'userCenter.securitySettings.updatePwd.form.error.validator.newPassword': '新密码不能与当前密码相同', 'userCenter.securitySettings.updatePwd.form.error.required.rePassword': '请再次输入新密码', 'userCenter.securitySettings.updatePwd.form.error.validator.rePassword': '两次输入的密码不一致', diff --git a/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/common/CaptchaController.java b/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/common/CaptchaController.java index 63358749..d0f1a133 100644 --- a/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/common/CaptchaController.java +++ b/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/common/CaptchaController.java @@ -36,16 +36,18 @@ import com.wf.captcha.base.Captcha; import cn.dev33.satoken.annotation.SaIgnore; import cn.hutool.core.lang.Dict; -import cn.hutool.core.lang.RegexPool; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.RandomUtil; import top.charles7c.cnadmin.common.config.properties.CaptchaProperties; import top.charles7c.cnadmin.common.config.properties.ContiNewAdminProperties; import top.charles7c.cnadmin.common.constant.CacheConsts; +import top.charles7c.cnadmin.common.constant.RegexConsts; import top.charles7c.cnadmin.common.model.vo.CaptchaVO; import top.charles7c.cnadmin.common.model.vo.R; -import top.charles7c.cnadmin.common.util.*; +import top.charles7c.cnadmin.common.util.MailUtils; +import top.charles7c.cnadmin.common.util.RedisUtils; +import top.charles7c.cnadmin.common.util.TemplateUtils; import top.charles7c.cnadmin.common.util.validate.CheckUtils; /** @@ -86,7 +88,7 @@ public class CaptchaController { @Operation(summary = "获取邮箱验证码", description = "发送验证码到指定邮箱") @GetMapping("/mail") public R getMailCaptcha( - @NotBlank(message = "邮箱不能为空") @Pattern(regexp = RegexPool.EMAIL, message = "邮箱格式错误") String email) + @NotBlank(message = "邮箱不能为空") @Pattern(regexp = RegexConsts.EMAIL, message = "邮箱格式错误") String email) throws MessagingException { String limitKeyPrefix = CacheConsts.LIMIT_KEY_PREFIX; String captchaKeyPrefix = CacheConsts.CAPTCHA_KEY_PREFIX; diff --git a/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/system/UserCenterController.java b/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/system/UserCenterController.java index 1bce65be..d7b7af6f 100644 --- a/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/system/UserCenterController.java +++ b/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/system/UserCenterController.java @@ -27,11 +27,10 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ReUtil; import top.charles7c.cnadmin.common.constant.CacheConsts; -import top.charles7c.cnadmin.common.constant.RegExpConsts; +import top.charles7c.cnadmin.common.constant.RegexConsts; import top.charles7c.cnadmin.common.model.vo.R; import top.charles7c.cnadmin.common.util.ExceptionUtils; import top.charles7c.cnadmin.common.util.RedisUtils; @@ -41,7 +40,6 @@ import top.charles7c.cnadmin.common.util.validate.ValidationUtils; import top.charles7c.cnadmin.system.model.request.UpdateBasicInfoRequest; import top.charles7c.cnadmin.system.model.request.UpdateEmailRequest; import top.charles7c.cnadmin.system.model.request.UpdatePasswordRequest; -import top.charles7c.cnadmin.system.model.request.UserRequest; import top.charles7c.cnadmin.system.model.vo.AvatarVO; import top.charles7c.cnadmin.system.service.UserService; @@ -73,9 +71,7 @@ public class UserCenterController { @Operation(summary = "修改基础信息", description = "修改用户基础信息") @PatchMapping("/basic/info") public R updateBasicInfo(@Validated @RequestBody UpdateBasicInfoRequest updateBasicInfoRequest) { - UserRequest userRequest = new UserRequest(); - BeanUtil.copyProperties(updateBasicInfoRequest, userRequest); - userService.update(userRequest, LoginHelper.getUserId()); + userService.updateBasicInfo(updateBasicInfoRequest, LoginHelper.getUserId()); return R.ok("修改成功"); } @@ -88,7 +84,7 @@ public class UserCenterController { String rawNewPassword = ExceptionUtils.exToNull(() -> SecureUtils.decryptByRsaPrivateKey(updatePasswordRequest.getNewPassword())); ValidationUtils.throwIfBlank(rawNewPassword, "新密码解密失败"); - ValidationUtils.throwIf(!ReUtil.isMatch(RegExpConsts.PASSWORD, rawNewPassword), "密码长度 6 到 32 位,同时包含数字和字母"); + ValidationUtils.throwIf(!ReUtil.isMatch(RegexConsts.PASSWORD, rawNewPassword), "密码长度 6 到 32 位,同时包含字母和数字"); // 修改密码 userService.updatePassword(rawOldPassword, rawNewPassword, LoginHelper.getUserId());