feat: 针对大模型 sso 改造

aiops_dev
时启龙 2025-08-06 17:32:03 +08:00
parent 0f9f99063e
commit 88c59ff076
6 changed files with 55 additions and 16 deletions

1
components.d.ts vendored
View File

@ -26,6 +26,7 @@ declare module 'vue' {
ASwitch: typeof import('ant-design-vue/es')['Switch']
ATextarea: typeof import('ant-design-vue/es')['Textarea']
ATooltip: typeof import('ant-design-vue/es')['Tooltip']
ElEmpty: typeof import('element-plus/es')['ElEmpty']
ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
Empty: typeof import('./src/components/empty/Empty.vue')['default']
ImageCropper: typeof import('./src/components/image-cropper/index.vue')['default']

View File

@ -1,12 +1,12 @@
<template>
<a-layout class="app-wrapper" :class="[{ hideSidebar: isCollapsed }, { 'font-big': isFontBig }, { 'expire-top': expire }]" @click="setTime">
<SystemTip />
<Header :match-path="matchPath"></Header>
<TagsView v-if="addRoutes"></TagsView>
<Header :match-path="matchPath" v-if="isNotIframeChild"></Header>
<TagsView v-if="addRoutes && isNotIframeChild"></TagsView>
<a-layout style="overflow: hidden">
<Sidebar v-if="showSidebar" @toggleCollapsed="toggleCollapsed" :isCollapsed="isCollapsed" :menuData="menuData" :isLimitLevel="true" :matchPath="matchPath" :basePath="basePath"></Sidebar>
<Sidebar v-if="showSidebar && isNotIframeChild" @toggleCollapsed="toggleCollapsed" :isCollapsed="isCollapsed" :menuData="menuData" :isLimitLevel="true" :matchPath="matchPath" :basePath="basePath"></Sidebar>
<a-layout class="main-container">
<ThirdMenu :menuData="thirdMenuData" v-if="thirdMenuData.children"></ThirdMenu>
<ThirdMenu :menuData="thirdMenuData" v-if="thirdMenuData.children && isNotIframeChild"></ThirdMenu>
<a-layout-content class="main-body">
<el-scrollbar class="custom-scrollbar" style="flex: 1">
<transition enter-active-class="fadeInUp" mode="out-in">
@ -42,7 +42,9 @@ export default {
},
data() {
return {
matchPath: ''
matchPath: '',
//
isNotIframeChild: window.top === window.self
}
},
setup() {

View File

@ -7,6 +7,16 @@ import { wrapperParams } from 'utils'
export function login(params) {
return request.post('/sms/v1/users/login', params)
}
/**
* IDP登录 返回数据结构和 login 接口一致
* @param ticket 票据
* @returns 用户信息
*/
export const idpLogin = (ticket) => {
// token 作为 url query 拼接
return request.post(`/sms/v1/login/idp?token=${ticket}`)
}
export function getTokenInfo(params) {
return request.post('/sms/v1/sso/token/info', params)
}
@ -21,12 +31,12 @@ export function logout() {
}
export function getConfig(params) {
return request.get('/sms/v1/logo', {
params: wrapperParams(params),
params: wrapperParams(params)
})
}
export function getDict(data) {
return request.get('/dict/children', {
params: wrapperParams(data),
params: wrapperParams(data)
})
}
export function getSysconf() {
@ -48,7 +58,7 @@ export function getPortal(params) {
}
export function getServiceQuota(tenantId, data) {
return request.get(`/cos/v1/tenants/${tenantId}/quotas`, {
params: wrapperParams(data),
params: wrapperParams(data)
})
}
export function replaceToken(params) {
@ -69,7 +79,7 @@ export function getSystemTreeConfigs(params) {
// 更新系统配置信息
export function updateSystemConfigs(params) {
return request.put('/sms/v1/system-configs', params, {
headers: { 'Content-Type': 'multipart/form-data', BsmAjaxHeader: true, options: { noSeri: true } },
headers: { 'Content-Type': 'multipart/form-data', BsmAjaxHeader: true, options: { noSeri: true } }
})
}
// 测试连接

View File

@ -167,7 +167,9 @@ const actions = {
// 重置标签信息
dispatch('tagsView/delAllViews', null, { root: true })
removeToken()
if (redirectToLogin) window.location.href = '/login'
// 正常云管环境
const isNotIframeChild = window.top === window.self
if (redirectToLogin && isNotIframeChild) window.location.href = '/login'
resolve()
})
}

View File

@ -1,15 +1,39 @@
<template>
<div></div>
<el-empty v-if="isError" :description="description" />
</template>
<script setup lang="ts">
import { ref } from 'vue'
import { setToken } from 'utils/auth'
import { useRoute, useRouter } from 'vue-router'
import { idpLogin } from 'services/index'
const route = useRoute()
const router = useRouter()
const { token, redirect = '/home' } = route.query
const isError = ref(false)
const description = ref('')
const init = async () => {
// sso?ticket=11&redirect=/cop-web/host-resource/vm
const { token, ticket, redirect = '/home' } = route.query
const path = decodeURIComponent(redirect as string)
if (token) {
setToken(token as string)
router.replace(path)
} else if (ticket) {
const res = await idpLogin(ticket).catch((err) => {
description.value = err.message
isError.value = true
return err
})
if (!res.success) {
isError.value = true
return
}
const userInfo = res.data
const { token } = userInfo
setToken(token)
router.push(redirect as string)
router.replace(path)
}
}
init()
</script>

View File

@ -12,7 +12,7 @@ function resolve(dir: string) {
}
const httpType = 'https://'
const proxyUrl = '10.10.33.172:60006' // EFC 3.0 代理地址设置
const proxyUrl = '10.10.33.214:60006' // AI_OPS
// https://vitejs.dev/config/
export default defineConfig({