From 92a75a7b157e6fd6423df17cfd32015017bdb8c9 Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期五, 14 八月 2026 09:21:58 +0800
Subject: [PATCH] update

---
 backend/src/main/java/com/tourguide/modules/user/service/AuthService.java |   55 +++++++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 41 insertions(+), 14 deletions(-)

diff --git a/backend/src/main/java/com/tourguide/modules/user/service/AuthService.java b/backend/src/main/java/com/tourguide/modules/user/service/AuthService.java
index 5c4af68..440aeec 100644
--- a/backend/src/main/java/com/tourguide/modules/user/service/AuthService.java
+++ b/backend/src/main/java/com/tourguide/modules/user/service/AuthService.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.tourguide.common.exception.BusinessException;
+import com.tourguide.modules.system.service.AdminPermissionService;
 import com.tourguide.modules.user.domain.ClientType;
 import com.tourguide.modules.user.domain.UserRole;
 import com.tourguide.modules.user.dto.AuthResponse;
@@ -22,25 +23,34 @@
 import org.springframework.transaction.annotation.Transactional;
 
 import java.nio.charset.StandardCharsets;
+import java.util.List;
 import java.util.UUID;
 
 /** 统一编排登录流程,但后台账号与小程序账号始终从不同数据表读取。 */
 @Service
 public class AuthService {
+    public static final int GUIDE_ACCOUNT_DISABLED_CODE = 40301;
+
     private final AdminUserService adminUserService;
+    private final AdminPermissionService adminPermissionService;
     private final MiniUserService miniUserService;
     private final GuideUserService guideUserService;
+    private final GuideAutoDisableService guideAutoDisableService;
     private final MiniUserMapper miniUserMapper;
     private final PasswordEncoder passwordEncoder;
     private final JwtTokenService jwtTokenService;
     private final TokenSessionService tokenSessionService;
 
-    public AuthService(AdminUserService adminUserService, MiniUserService miniUserService, GuideUserService guideUserService,
+    public AuthService(AdminUserService adminUserService, AdminPermissionService adminPermissionService,
+                       MiniUserService miniUserService,
+                       GuideUserService guideUserService, GuideAutoDisableService guideAutoDisableService,
                        MiniUserMapper miniUserMapper,
                        PasswordEncoder passwordEncoder, JwtTokenService jwtTokenService, TokenSessionService tokenSessionService) {
         this.adminUserService = adminUserService;
+        this.adminPermissionService = adminPermissionService;
         this.miniUserService = miniUserService;
         this.guideUserService = guideUserService;
+        this.guideAutoDisableService = guideAutoDisableService;
         this.miniUserMapper = miniUserMapper;
         this.passwordEncoder = passwordEncoder;
         this.jwtTokenService = jwtTokenService;
@@ -49,11 +59,14 @@
 
     public AuthResponse<UserResponse> loginAdmin(LoginRequest request) {
         AdminUser user = adminUserService.findByUsername(request.getUsername());
-        if (user == null || !passwordEncoder.matches(request.getPassword(), user.getPassword())) {
+        if (user == null || user.getStatus() == null || user.getStatus() != 1
+                || !passwordEncoder.matches(request.getPassword(), user.getPassword())) {
             throw new BusinessException(401, "用户名或密码错误");
         }
+        List<String> menuCodes = adminPermissionService.getMenuCodes(user.getRoleCode());
         String token = issueToken(user.getId(), user.getUsername(), user.getRoleCode(), ClientType.ADMIN);
-        return new AuthResponse<UserResponse>(token, jwtTokenService.getExpirationSeconds(), UserResponse.from(user));
+        return new AuthResponse<UserResponse>(token, jwtTokenService.getExpirationSeconds(),
+                UserResponse.from(user, menuCodes));
     }
 
     public AuthResponse<MiniUserResponse> loginMini(LoginRequest request) {
@@ -95,10 +108,14 @@
 
     public AuthResponse<GuideUserResponse> loginGuide(LoginRequest request) {
         GuideUser user = guideUserService.findByUsername(request.getUsername());
-        if (!isGuideLoginable(user) || !passwordEncoder.matches(request.getPassword(), user.getPassword())) {
+        validateGuideLoginStatus(user, "用户名不存在");
+        if (!passwordEncoder.matches(request.getPassword(), user.getPassword())) {
             throw new BusinessException(401, "用户名或密码错误");
         }
-        return issueGuideToken(user);
+        guideAutoDisableService.disableGuideIfEligible(user.getId());
+        GuideUser currentUser = guideUserService.findByUsername(request.getUsername());
+        validateGuideLoginStatus(currentUser, "用户名不存在");
+        return issueGuideToken(currentUser);
     }
 
     public AuthResponse<GuideUserResponse> loginGuideByPhone(String phone) {
@@ -111,17 +128,27 @@
 
     private GuideUser findLoginableGuideByPhone(String phone) {
         GuideUser user = guideUserService.findByPhone(phone);
-        if (!isGuideLoginable(user)) {
-            throw new BusinessException(401, "手机号未注册或账号已停用");
-        }
-        return user;
+        validateGuideLoginStatus(user, "手机号未注册");
+        guideAutoDisableService.disableGuideIfEligible(user.getId());
+        GuideUser currentUser = guideUserService.findByPhone(phone);
+        validateGuideLoginStatus(currentUser, "手机号未注册");
+        return currentUser;
     }
 
-    private boolean isGuideLoginable(GuideUser user) {
-        return user != null
-                && user.getStatus() != null
-                && (user.getStatus() == GuideUserService.STATUS_ENABLED
-                || user.getStatus() == GuideUserService.STATUS_PENDING);
+    private void validateGuideLoginStatus(GuideUser user, String notFoundMessage) {
+        if (user == null) {
+            throw new BusinessException(401, notFoundMessage);
+        }
+        if (Integer.valueOf(GuideUserService.STATUS_DISABLED).equals(user.getStatus())) {
+            throw new BusinessException(GUIDE_ACCOUNT_DISABLED_CODE, "账号已被禁用,请联系后台工作人员");
+        }
+        if (Integer.valueOf(GuideUserService.STATUS_CANCELLED).equals(user.getStatus())) {
+            throw new BusinessException(403, "账号已注销,无法登录");
+        }
+        if (!Integer.valueOf(GuideUserService.STATUS_ENABLED).equals(user.getStatus())
+                && !Integer.valueOf(GuideUserService.STATUS_PENDING).equals(user.getStatus())) {
+            throw new BusinessException(403, "账号状态异常,请联系后台工作人员");
+        }
     }
 
     private AuthResponse<GuideUserResponse> issueGuideToken(GuideUser user) {

--
Gitblit v1.7.1