liujie
2026-07-10 bedff910eb2394a8ce68762a8f3a413d81187ac1
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
@@ -1,7 +1,9 @@
package com.ruoyi.web.controller.system;
import com.alibaba.fastjson.JSON;
import com.ruoyi.common.annotation.Anonymous;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysMenu;
import com.ruoyi.common.core.domain.entity.SysRole;
@@ -13,8 +15,11 @@
import com.ruoyi.framework.web.service.SysLoginService;
import com.ruoyi.framework.web.service.SysPermissionService;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.framework.manager.AsyncManager;
import com.ruoyi.framework.manager.factory.AsyncFactory;
import com.ruoyi.system.service.ISysMenuService;
import com.ruoyi.system.service.ISysRoleService;
import com.ruoyi.web.controller.tool.MiddlePlatformDataQuery;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
@@ -24,6 +29,7 @@
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
import java.util.List;
import java.util.Set;
@@ -50,6 +56,8 @@
    private TokenService tokenService;
    @Autowired
    private ISysRoleService roleService;
    @Autowired
    private RuoYiConfig ruoyiConfig;
    /**
     * 账号密码登录
@@ -61,10 +69,61 @@
    public AjaxResult login(@RequestBody String param)
    {
        LoginBody loginBody = JSON.parseObject(param, LoginBody.class);
        AjaxResult ajax = AjaxResult.success();
        // 生成令牌
        return buildLoginResult(loginBody);
    }
    @Anonymous
    @ApiOperation(value = "中台优先账号密码登录", notes = "集群中台模式下先判断中台用户,未命中时由前端回落本地登录")
    @PostMapping("/api/middle-platform/login")
    public AjaxResult middlePlatformLogin(@RequestBody String param)
    {
        LoginBody loginBody = JSON.parseObject(param, LoginBody.class);
        if (!ruoyiConfig.isConnectMiddlePlatform())
        {
            return buildLoginResult(loginBody);
        }
        loginService.validateCaptcha(loginBody.getUsername(), loginBody.getCode(), loginBody.getUuid());
        try
        {
            String middlePlatformToken = MiddlePlatformDataQuery.login(loginBody.getUsername(), loginBody.getPassword());
            if (middlePlatformToken == null)
            {
                return buildLocalFallbackLoginResult(loginBody);
            }
            AjaxResult ajax = buildLoginResult(loginService.loginByTrustedUsername(
                    loginBody.getUsername(), "middlePlatform", middlePlatformToken));
            ajax.put("loginSource", "middlePlatform");
            return ajax;
        }
        catch (IOException e)
        {
            if (loginBody != null)
            {
                return buildLocalFallbackLoginResult(loginBody);
            }
            return AjaxResult.error("中台登录失败:" + e.getMessage());
        }
    }
    private AjaxResult buildLocalFallbackLoginResult(LoginBody loginBody)
    {
        AjaxResult ajax = buildLoginResult(loginService.loginWithoutCaptcha(loginBody.getUsername(), loginBody.getPassword()));
        ajax.put("loginSource", "local");
        ajax.put("middlePlatformFallback", true);
        return ajax;
    }
    private AjaxResult buildLoginResult(LoginBody loginBody)
    {
        LoginUser loginUser = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
                loginBody.getUuid());
        return buildLoginResult(loginUser);
    }
    private AjaxResult buildLoginResult(LoginUser loginUser)
    {
        AjaxResult ajax = AjaxResult.success();
        // 生成令牌
        ajax.put(Constants.TOKEN, tokenService.createToken(loginUser));
        List<SysRole> roles = loginUser.getUser().getRoles();
        if(CollectionUtils.isEmpty(roles)){
@@ -82,6 +141,30 @@
        return ajax;
    }
    @PostMapping("/api/middle-platform/logout")
    public AjaxResult middlePlatformLogout()
    {
        AjaxResult ajax = AjaxResult.success("退出成功");
        LoginUser loginUser = SecurityUtils.getLoginUser();
        if (loginUser == null)
        {
            return ajax;
        }
        try
        {
            MiddlePlatformDataQuery.logout(loginUser.getMiddlePlatformToken());
            ajax.put("middlePlatformLogoutSuccess", true);
        }
        catch (IOException e)
        {
            ajax.put("middlePlatformLogoutSuccess", false);
            ajax.put("middlePlatformLogoutMessage", e.getMessage());
        }
        tokenService.delLoginUser(loginUser.getToken());
        AsyncManager.me().execute(AsyncFactory.recordLogininfor(loginUser.getUsername(), Constants.LOGOUT, "退出成功"));
        return ajax;
    }
    /**
     * 账号密码登录
     *