From 95a503fee52795bf50a45b4fc89f0b71fba6dc0a Mon Sep 17 00:00:00 2001
From: “mitao” <“2763622819@qq.com”>
Date: 星期五, 27 三月 2026 10:45:17 +0800
Subject: [PATCH] feat:首页帐号设计、重置密码
---
backend/src/main/java/com/tcm/training/admin/auth/service/AuthService.java | 71 +++++++++++++++++++++++++++++++++--
1 files changed, 66 insertions(+), 5 deletions(-)
diff --git a/backend/src/main/java/com/tcm/training/admin/auth/service/AuthService.java b/backend/src/main/java/com/tcm/training/admin/auth/service/AuthService.java
index 3bd2481..b2ec3a4 100644
--- a/backend/src/main/java/com/tcm/training/admin/auth/service/AuthService.java
+++ b/backend/src/main/java/com/tcm/training/admin/auth/service/AuthService.java
@@ -1,7 +1,9 @@
package com.tcm.training.admin.auth.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.tcm.training.admin.auth.dto.ChangePasswordRequest;
import com.tcm.training.admin.auth.dto.LoginRequest;
+import com.tcm.training.admin.auth.dto.ProfileUpdateRequest;
import com.tcm.training.admin.auth.vo.LoginResponse;
import com.tcm.training.admin.auth.vo.UserVO;
import com.tcm.training.admin.user.entity.SysUser;
@@ -11,12 +13,18 @@
import cn.dev33.satoken.stp.StpUtil;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.List;
+import java.util.regex.Pattern;
@Service
public class AuthService {
+
+ private static final Pattern PASSWORD_PATTERN = Pattern.compile(
+ "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[^A-Za-z\\d]).{12,64}$"
+ );
private final SysUserService sysUserService;
private final BCryptPasswordEncoder passwordEncoder;
@@ -66,12 +74,33 @@
}
public UserVO me() {
- Long userId = StpUtil.getLoginIdAsLong();
- SysUser user = sysUserService.getById(userId);
- if (user == null || (user.getDeleted() != null && user.getDeleted() == 1)) {
- throw new IllegalArgumentException("用户不存在");
- }
+ return buildUserVO(requireCurrentUser());
+ }
+
+ @Transactional
+ public UserVO updateProfile(ProfileUpdateRequest req) {
+ SysUser user = requireCurrentUser();
+ user.setNickname(normalizeRequired(req.getNickname(), "请输入用户名"));
+ user.setAvatar(trimToNull(req.getAvatar()));
+ user.setUpdatedAt(LocalDateTime.now());
+ sysUserService.updateById(user);
return buildUserVO(user);
+ }
+
+ @Transactional
+ public void changePassword(ChangePasswordRequest req) {
+ SysUser user = requireCurrentUser();
+ if (!passwordEncoder.matches(req.getOldPassword(), user.getPassword())) {
+ throw new IllegalArgumentException("原密码错误");
+ }
+ if (!req.getNewPassword().equals(req.getConfirmPassword())) {
+ throw new IllegalArgumentException("两次密码输入不一致");
+ }
+ validatePassword(req.getNewPassword());
+ user.setPassword(passwordEncoder.encode(req.getNewPassword()));
+ user.setUpdatedAt(LocalDateTime.now());
+ sysUserService.updateById(user);
+ StpUtil.logout();
}
private UserVO buildUserVO(SysUser user) {
@@ -83,8 +112,40 @@
user.getNickname(),
user.getRealName(),
user.getPhone(),
+ user.getAvatar(),
roleCodes,
permissionKeys
);
}
+
+ private SysUser requireCurrentUser() {
+ Long userId = StpUtil.getLoginIdAsLong();
+ SysUser user = sysUserService.getById(userId);
+ if (user == null || (user.getDeleted() != null && user.getDeleted() == 1)) {
+ throw new IllegalArgumentException("用户不存在");
+ }
+ return user;
+ }
+
+ private void validatePassword(String password) {
+ if (!PASSWORD_PATTERN.matcher(password).matches()) {
+ throw new IllegalArgumentException("密码需至少12位,且包含大小写字母、数字和特殊字符");
+ }
+ }
+
+ private String normalizeRequired(String value, String message) {
+ String normalized = trimToNull(value);
+ if (normalized == null) {
+ throw new IllegalArgumentException(message);
+ }
+ return normalized;
+ }
+
+ private String trimToNull(String value) {
+ if (value == null) {
+ return null;
+ }
+ String trimmed = value.trim();
+ return trimmed.isEmpty() ? null : trimmed;
+ }
}
--
Gitblit v1.7.1