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