mirror of
https://github.com/continew-org/continew-admin.git
synced 2025-10-02 10:57:10 +08:00
优化:优化部分校验类型(业务验证迁移到 Service 层,使用 CheckUtils 来验证)
This commit is contained in:
@@ -35,7 +35,6 @@ import top.charles7c.cnadmin.auth.model.request.LoginRequest;
|
||||
import top.charles7c.cnadmin.auth.model.vo.LoginVO;
|
||||
import top.charles7c.cnadmin.auth.model.vo.UserInfoVO;
|
||||
import top.charles7c.cnadmin.auth.service.LoginService;
|
||||
import top.charles7c.cnadmin.common.config.properties.CaptchaProperties;
|
||||
import top.charles7c.cnadmin.common.consts.CacheConstants;
|
||||
import top.charles7c.cnadmin.common.model.dto.LoginUser;
|
||||
import top.charles7c.cnadmin.common.model.vo.R;
|
||||
@@ -58,7 +57,6 @@ import top.charles7c.cnadmin.common.util.validate.ValidationUtils;
|
||||
public class LoginController {
|
||||
|
||||
private final LoginService loginService;
|
||||
private final CaptchaProperties captchaProperties;
|
||||
|
||||
@SaIgnore
|
||||
@Operation(summary = "用户登录", description = "根据用户名和密码进行登录认证")
|
||||
|
@@ -47,7 +47,7 @@ import top.charles7c.cnadmin.common.consts.CacheConstants;
|
||||
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.validate.ValidationUtils;
|
||||
import top.charles7c.cnadmin.common.util.validate.CheckUtils;
|
||||
|
||||
/**
|
||||
* 验证码 API
|
||||
@@ -89,12 +89,11 @@ public class CaptchaController {
|
||||
public R getMailCaptcha(
|
||||
@NotBlank(message = "邮箱不能为空") @Pattern(regexp = RegexPool.EMAIL, message = "邮箱格式错误") String email)
|
||||
throws MessagingException {
|
||||
// 校验
|
||||
String limitCacheKey = CacheConstants.LIMIT_CACHE_KEY;
|
||||
String captchaCacheKey = CacheConstants.CAPTCHA_CACHE_KEY;
|
||||
String limitCaptchaKey = RedisUtils.formatKey(limitCacheKey, captchaCacheKey, email);
|
||||
long limitTimeInMillisecond = RedisUtils.getTimeToLive(limitCaptchaKey);
|
||||
ValidationUtils.throwIf(() -> limitTimeInMillisecond > 0,
|
||||
CheckUtils.throwIf(() -> limitTimeInMillisecond > 0,
|
||||
String.format("发送邮箱验证码过于频繁,请您 %ds 后再试", limitTimeInMillisecond / 1000));
|
||||
|
||||
// 生成验证码
|
||||
|
@@ -43,7 +43,6 @@ import top.charles7c.cnadmin.system.service.DeptService;
|
||||
* @since 2023/1/22 21:48
|
||||
*/
|
||||
@Tag(name = "公共 API")
|
||||
@Validated
|
||||
@RestController
|
||||
@RequiredArgsConstructor
|
||||
@RequestMapping(value = "/common", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
@@ -51,7 +50,7 @@ public class CommonController {
|
||||
|
||||
private final DeptService deptService;
|
||||
|
||||
@Operation(summary = "查询部门树")
|
||||
@Operation(summary = "查询部门树", description = "查询树结构的部门列表")
|
||||
@GetMapping("/tree/dept")
|
||||
public R<List<Tree<Long>>> deptTree(@Validated DeptQuery query) {
|
||||
List<DeptVO> list = deptService.list(query);
|
||||
|
@@ -47,7 +47,6 @@ import top.charles7c.cnadmin.monitor.service.LogService;
|
||||
* @since 2023/1/18 23:55
|
||||
*/
|
||||
@Tag(name = "日志管理 API")
|
||||
@Validated
|
||||
@RestController
|
||||
@RequiredArgsConstructor
|
||||
@RequestMapping(value = "/monitor/log", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
|
@@ -43,7 +43,7 @@ import top.charles7c.cnadmin.common.model.dto.LoginUser;
|
||||
import top.charles7c.cnadmin.common.model.query.PageQuery;
|
||||
import top.charles7c.cnadmin.common.model.vo.PageInfo;
|
||||
import top.charles7c.cnadmin.common.model.vo.R;
|
||||
import top.charles7c.cnadmin.common.util.validate.ValidationUtils;
|
||||
import top.charles7c.cnadmin.common.util.validate.CheckUtils;
|
||||
import top.charles7c.cnadmin.monitor.model.query.OnlineUserQuery;
|
||||
import top.charles7c.cnadmin.monitor.model.vo.*;
|
||||
|
||||
@@ -54,7 +54,6 @@ import top.charles7c.cnadmin.monitor.model.vo.*;
|
||||
* @since 2023/1/20 21:51
|
||||
*/
|
||||
@Tag(name = "在线用户 API")
|
||||
@Validated
|
||||
@RestController
|
||||
@RequiredArgsConstructor
|
||||
@RequestMapping(value = "/monitor/online/user", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
@@ -67,7 +66,7 @@ public class OnlineUserController {
|
||||
List<String> tokenKeyList = StpUtil.searchTokenValue("", 0, -1, false);
|
||||
for (String tokenKey : tokenKeyList) {
|
||||
String token = StrUtil.subAfter(tokenKey, ":", true);
|
||||
// 忽略已过期或失效 token
|
||||
// 忽略已过期或失效 Token
|
||||
if (StpUtil.stpLogic.getTokenActivityTimeoutByToken(token) < SaTokenDao.NEVER_EXPIRE) {
|
||||
continue;
|
||||
}
|
||||
@@ -118,7 +117,7 @@ public class OnlineUserController {
|
||||
@DeleteMapping("/{token}")
|
||||
public R kickout(@PathVariable String token) {
|
||||
String currentToken = StpUtil.getTokenValue();
|
||||
ValidationUtils.throwIfEqual(token, currentToken, "不能强退当前登录");
|
||||
CheckUtils.throwIfEqual(token, currentToken, "不能强退当前登录");
|
||||
|
||||
StpUtil.kickoutByTokenValue(token);
|
||||
return R.ok("强退成功");
|
||||
|
@@ -43,7 +43,6 @@ import top.charles7c.cnadmin.system.service.DeptService;
|
||||
* @since 2023/1/22 17:50
|
||||
*/
|
||||
@Tag(name = "部门管理 API")
|
||||
@Validated
|
||||
@RestController
|
||||
@RequiredArgsConstructor
|
||||
@RequestMapping(value = "/system/dept", produces = MediaType.APPLICATION_JSON_VALUE)
|
||||
@@ -61,17 +60,12 @@ public class DeptController {
|
||||
@Operation(summary = "新增部门")
|
||||
@PostMapping
|
||||
public R<Long> create(@Validated @RequestBody CreateDeptRequest request) {
|
||||
// 校验
|
||||
String deptName = request.getDeptName();
|
||||
boolean isExist = deptService.checkDeptNameExist(deptName, request.getParentId(), null);
|
||||
if (isExist) {
|
||||
return R.fail(String.format("新增失败,'%s'已存在", deptName));
|
||||
}
|
||||
|
||||
return R.ok("新增成功", deptService.create(request));
|
||||
Long id = deptService.create(request);
|
||||
return R.ok("新增成功", id);
|
||||
}
|
||||
|
||||
@Operation(summary = "修改部门状态")
|
||||
@Parameter(name = "ids", description = "ID 列表", in = ParameterIn.PATH)
|
||||
@PatchMapping("/{ids}")
|
||||
public R updateStatus(@PathVariable List<Long> ids, @Validated @RequestBody UpdateStatusRequest request) {
|
||||
deptService.updateStatus(ids, request.getStatus());
|
||||
|
@@ -29,13 +29,9 @@ import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.io.file.FileNameUtil;
|
||||
import cn.hutool.core.util.ReUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
|
||||
import top.charles7c.cnadmin.common.config.properties.LocalStorageProperties;
|
||||
import top.charles7c.cnadmin.common.consts.CacheConstants;
|
||||
import top.charles7c.cnadmin.common.consts.FileConstants;
|
||||
import top.charles7c.cnadmin.common.consts.RegExpConstants;
|
||||
import top.charles7c.cnadmin.common.model.vo.R;
|
||||
import top.charles7c.cnadmin.common.util.ExceptionUtils;
|
||||
@@ -64,20 +60,11 @@ import top.charles7c.cnadmin.system.service.UserService;
|
||||
public class UserCenterController {
|
||||
|
||||
private final UserService userService;
|
||||
private final LocalStorageProperties localStorageProperties;
|
||||
|
||||
@Operation(summary = "上传头像", description = "用户上传个人头像")
|
||||
@PostMapping("/avatar")
|
||||
public R<AvatarVO> uploadAvatar(@NotNull(message = "头像不能为空") MultipartFile avatarFile) {
|
||||
// 校验
|
||||
ValidationUtils.throwIf(avatarFile::isEmpty, "头像不能为空");
|
||||
Long avatarMaxSizeInMb = localStorageProperties.getAvatarMaxSizeInMb();
|
||||
ValidationUtils.throwIf(() -> avatarFile.getSize() > avatarMaxSizeInMb * 1024 * 1024,
|
||||
String.format("请上传小于 %s MB 的图片", avatarMaxSizeInMb));
|
||||
String avatarImageType = FileNameUtil.extName(avatarFile.getOriginalFilename());
|
||||
String[] avatarSupportImgTypes = FileConstants.AVATAR_SUPPORTED_IMG_TYPES;
|
||||
ValidationUtils.throwIf(() -> !StrUtil.equalsAnyIgnoreCase(avatarImageType, avatarSupportImgTypes),
|
||||
String.format("头像仅支持 %s 格式的图片", String.join(",", avatarSupportImgTypes)));
|
||||
|
||||
// 上传头像
|
||||
String newAvatar = userService.uploadAvatar(avatarFile, LoginHelper.getUserId());
|
||||
@@ -97,18 +84,14 @@ public class UserCenterController {
|
||||
@Operation(summary = "修改密码", description = "修改用户登录密码")
|
||||
@PatchMapping("/password")
|
||||
public R updatePassword(@Validated @RequestBody UpdatePasswordRequest updatePasswordRequest) {
|
||||
// 解密
|
||||
String rawOldPassword =
|
||||
ExceptionUtils.exToNull(() -> SecureUtils.decryptByRsaPrivateKey(updatePasswordRequest.getOldPassword()));
|
||||
ValidationUtils.throwIfBlank(rawOldPassword, "当前密码解密失败");
|
||||
String rawNewPassword =
|
||||
ExceptionUtils.exToNull(() -> SecureUtils.decryptByRsaPrivateKey(updatePasswordRequest.getNewPassword()));
|
||||
ValidationUtils.throwIfBlank(rawNewPassword, "新密码解密失败");
|
||||
|
||||
// 校验
|
||||
ValidationUtils.throwIf(() -> !ReUtil.isMatch(RegExpConstants.PASSWORD, rawNewPassword),
|
||||
"密码长度 6 到 32 位,同时包含数字和字母");
|
||||
ValidationUtils.throwIfEqual(rawNewPassword, rawOldPassword, "新密码不能与当前密码相同");
|
||||
|
||||
// 修改密码
|
||||
userService.updatePassword(rawOldPassword, rawNewPassword, LoginHelper.getUserId());
|
||||
@@ -118,12 +101,11 @@ public class UserCenterController {
|
||||
@Operation(summary = "修改邮箱", description = "修改用户邮箱")
|
||||
@PatchMapping("/email")
|
||||
public R updateEmail(@Validated @RequestBody UpdateEmailRequest updateEmailRequest) {
|
||||
// 解密
|
||||
String rawCurrentPassword =
|
||||
ExceptionUtils.exToNull(() -> SecureUtils.decryptByRsaPrivateKey(updateEmailRequest.getCurrentPassword()));
|
||||
ValidationUtils.throwIfBlank(rawCurrentPassword, "当前密码解密失败");
|
||||
|
||||
// 校验
|
||||
// 校验验证码
|
||||
String captchaKey = RedisUtils.formatKey(CacheConstants.CAPTCHA_CACHE_KEY, updateEmailRequest.getNewEmail());
|
||||
String captcha = RedisUtils.getCacheObject(captchaKey);
|
||||
ValidationUtils.throwIfBlank(captcha, "验证码已失效");
|
||||
|
Reference in New Issue
Block a user