跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
TypeScript大前端java

ruoyi-vue-pro 数据大屏纯前端单点登录方案

介绍如何在 ruoyi-vue-pro 项目中集成 go-view 数据大屏模块并实现纯前端单点登录。通过注册 OAuth2 应用、新增回调组件与路由、配置 SSO API 及路由守卫拦截,用户无需手动输入密码即可访问大屏页面。修改 URL 参数 sso=true 即可触发授权流程,实现无缝跳转。

板砖工程师发布于 2026/4/6更新于 2026/7/2444 浏览
ruoyi-vue-pro 数据大屏纯前端单点登录方案

ruoyi-vue-pro 数据大屏纯前端单点登录方案

ruoyi-vue-pro 已集成数据大屏模块 go-view,支持通过拖拽生成精美的大屏应用。然而点击【报表管理->大屏设计】时仍需输入账号密码登录,体验不佳。ruoyi-vue-pro 已支持应用注册及 OAuth2 授权功能,以下介绍如何实现最后一公里的前端单点登录。

1. 在【三方授权->应用管理】中注册数据大屏应用 report

2. 改造 yudao-ui-go-view-master 项目支持断点登录

A) 新增 callback 组件

新增页面 src/views/sso/callback.vue,内容如下:

<template>
  <!-- 登录 -->
  <div></div>
</template>
<script lang="ts" setup>
import { reactive, ref, onMounted } from 'vue'
import { Router, useRoute } from 'vue-router'
import { ssoLoginCallbackApi } from '@/api/path'
import { useSystemStore } from '@/store/modules/systemStore/systemStore'
import { SystemStoreUserInfoEnum, SystemStoreEnum } from '@/store/modules/systemStore/systemStore.d'
import { StorageEnum } from '@/enums/storageEnum'
import { PageEnum, PreviewEnum } from '@/enums/pageEnum'
import { routerTurnByName } from 
 { getTenantIdByNameApi, getUserInfoApi, loginApi }  

 systemStore = ()
 t = []

( () => {
   route = ()
   code = route..
   (!code) {
    
  }
   loginRes =  (code.())
   (loginRes && loginRes.) {
    
     tokenValue = loginRes..
     tokenName = 
    systemStore.(., { :  })
    systemStore.(., {
      [.]: tokenValue,
      [.]: tokenName
    })
    
     profileRes =  ()
     id = profileRes?.?.
     username = profileRes?.?.
     nickname = profileRes?.?.
     (id && username && nickname) {
      
      systemStore.(., {
        [.]: tokenValue,
        [.]: tokenName,
        [.]: id,
        [.]: username,
        [.]: nickname
      })
      [].(())
       sso_url = .(.)
      .( + sso_url)
       (sso_url) {
        .(.)
        .. = sso_url
        
      }
      (sso_url || ., )
      
    }
    [].( + profileRes.)
    (., )
  }  {
    [].(loginRes.)
    [].( + loginRes.)
    (., )
  }
})

'@/utils'
import
from
'@/api/path'
const
useSystemStore
const
window
'$t'
onMounted
async
const
useRoute
const
query
code
if
return
var
await
ssoLoginCallbackApi
toString
if
data
// ① Token 信息(先存储下,保证可以加载个人信息)
const
data
access_token
const
'Authorization'
setItem
SystemStoreEnum
TENANT_INFO
tenantId
1
setItem
SystemStoreEnum
USER_INFO
SystemStoreUserInfoEnum
USER_TOKEN
SystemStoreUserInfoEnum
TOKEN_NAME
// 个人信息
const
await
getUserInfoApi
const
data
id
const
data
username
const
data
nickname
if
// 存储到 pinia
setItem
SystemStoreEnum
USER_INFO
SystemStoreUserInfoEnum
USER_TOKEN
SystemStoreUserInfoEnum
TOKEN_NAME
SystemStoreUserInfoEnum
USER_ID
SystemStoreUserInfoEnum
USER_NAME
SystemStoreUserInfoEnum
NICK_NAME
window
'$message'
success
t
'login.login_success'
var
localStorage
getItem
StorageEnum
GO_SSO_URL
console
log
"sso_url:"
if
localStorage
removeItem
StorageEnum
GO_SSO_URL
window
location
href
return
routerTurnByName
PageEnum
BASE_HOME_NAME
true
return
window
'$message'
error
'登录失败:'
msg
routerTurnByName
PageEnum
ERROR_PAGE_NAME_403
true
else
window
'$message'
success
msg
window
'$message'
error
'登录失败:'
msg
routerTurnByName
PageEnum
BASE_LOGIN_NAME
true
</script>

B) 新增 callback 路由

在 src/router/base.ts 中找到 LoginRoute,在后面新增代码:

export const SsoCallbackRoute: RouteRecordRaw = {
  path: PageEnum.SSO_CALL_BACK,
  name: PageEnum.SSO_CALL_BACK_NAME,
  component: () => import('@/views/sso/callback.vue'),
  meta: { title: '单点登录', },
};

在 src/router/index.ts 文件中导入。

C) 新增单点登录 API

数据大屏为内网环境,且后端使用 ruoyi-vue-pro,因此 appKey 和 appSecret 暂时写死在 JS 中,后期可根据需要配置到后端 application.yaml 中。

在 src/api/path/system.api.ts 中,找到 logoutApi,在其后新增单点登录 API 如下:

// * SSO 登录
// 可以改写成,你的 clientId
const clientId = 'yudao-sso-demo-by-code';
export const ssoLogin = () => {
  const redirectUri = encodeURIComponent('http://localhost:3000/callback'); // 注意,需要使用 encodeURIComponent 编码地址
  const responseType = 'code'; // 1)授权码模式,对应 code;2)简化模式,对应 token
  window.location.href = 'https://192.168.1.222:80/sso?client_id=' + clientId + '&redirect_uri=' + redirectUri + '&response_type=' + responseType;
}
// * SSO 登录
export const ssoLoginCallbackApi = async (code: String) => {
  try {
    const redirectUri = "http://localhost:3000/callback";
    const url = "https://192.168.1.222:80/admin-api/system/oauth2/token?grant_type=authorization_code&code="+ code+"&redirect_uri="+redirectUri;
    const params = { }
    const headers = {
      "Content-Type": ContentTypeEnum.JSON,
      "tenant-id": "1",
      "Authorization": "Basic " + encode(new TextEncoder().encode(clientId+":datav123"))
    };
    const config = { baseURL:'', headers: headers };
    var res = await axios.post(url, params, config)
    console.log(res)
    return res.data
  } catch (err) {
    httpErrorHandle()
  }
}
// 单点登录 callback 中调用,查询用户个人信息
export const getUserInfoApi = async () => {
  try {
    const res = await http(RequestHttpEnum.GET)<ProfileVO>(`${ModuleTypeEnum.SYSTEM}/oauth2/user/get`)
    return res
  } catch (err) {
    httpErrorHandle()
  }
}

D) 在路由守卫中拦截 sso

在 src/router/router-guards.ts 文件中判断白名单前,新增代码如下:

if(to && to.query && to.query.sso == 'true'){
  localStorage.setItem(StorageEnum.GO_SSO_URL, window.location.href)
  // @ts-ignore
  if (!routerAllowList.includes(to.name) && !loginCheck()) {
    ssoLogin();
    return;
  }
}

E) 处理后端返回未认证(状态码为 401)

在 src/api/axios.ts 中新增代码,如果 sso 访问但未登录成功或者 token 超时则发起单点登录。

3. 改造 yudao-vue-pro 中的【报表管理->大屏设计】中的页面

只需要在 url 上加一个参数 sso=true 就行了。

4. 验证访问数据大屏

A) 验证单点登录

重新启动 yudao-vue-pro,yudao-ui-go-view,或刷新【报表管理->大屏设计】,将会出现授权请求页面。这个页面是 yudao-vue-pro 中的 src\views\sso.vue,这里只是改了下样式,这个页面应该不需要改动。同意授权后页面会自动跳转到数据大屏的首页。

B) 验证在 yudao-vue-pro 中配置菜单直接访问数据看板

授权一次以后就可以访问了。

目录

  1. ruoyi-vue-pro 数据大屏纯前端单点登录方案
  2. 1. 在【三方授权->应用管理】中注册数据大屏应用 report
  3. 2. 改造 yudao-ui-go-view-master 项目支持断点登录
  4. A) 新增 callback 组件
  5. B) 新增 callback 路由
  6. C) 新增单点登录 API
  7. D) 在路由守卫中拦截 sso
  8. E) 处理后端返回未认证(状态码为 401)
  9. 3. 改造 yudao-vue-pro 中的【报表管理->大屏设计】中的页面
  10. 4. 验证访问数据大屏
  11. A) 验证单点登录
  12. B) 验证在 yudao-vue-pro 中配置菜单直接访问数据看板
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 苍穹外卖前端开发实战:Vue + TypeScript + ElementUI
  • SCADA Engine:基于 Vue3 的开源工业级组态引擎
  • Android MVVM 架构实战:DataBinding 中 BindingAdapter 的使用与原理
  • 2026 年主流 AI 生成 PPT 工具横评:6 款实测与选择指南
  • Milvus 向量数据库:核心原理与 Python 实战
  • 前端异常捕获与统一格式化:从 console.log 到服务端上报
  • Ubuntu 国内镜像源更换指南:阿里/清华/中科大对比
  • 基于 LLama-Factory 打造个性化 AI 角色的微调实战
  • VSCode Copilot 配置文件提示“未知工具”警告排查与解决
  • Windows 环境下 faster-whisper 部署:CUDA 加速与 PyAV 依赖配置
  • 前端状态管理实战:Redux Toolkit、Zustand 与 Jotai 对比
  • 前端加密 encrypt-labs 靶场:环境搭建与关卡解析
  • Flutter 组件 Spry 适配鸿蒙 HarmonyOS 实战:轻量化端侧 Web 框架
  • IntelliJ IDEA 配置 AI 插件实现 Java 俄罗斯方块游戏开发
  • WebODM完全指南:零基础掌握开源无人机地图制作
  • Java ArrayList 底层原理与核心方法手写实现
  • 树莓派智能家居中控系统构建指南
  • Manacher(马拉车)算法详解:求解最长回文子串
  • 2026 年主流 AI Agent 框架横评:OpenClaw 及九大衍生产品对比与场景推荐
  • 基于 YOLO 与 LLM 的 Web 视觉分析系统(Django+Vue3)

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online