feat: 针对大模型 sso 改造
							parent
							
								
									0f9f99063e
								
							
						
					
					
						commit
						88c59ff076
					
				| 
						 | 
				
			
			@ -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']
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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() {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 } }
 | 
			
		||||
  })
 | 
			
		||||
}
 | 
			
		||||
// 测试连接
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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()
 | 
			
		||||
    })
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 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.replace(path)
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const { token, redirect = '/home' } = route.query
 | 
			
		||||
setToken(token)
 | 
			
		||||
router.push(redirect as string)
 | 
			
		||||
init()
 | 
			
		||||
</script>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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({
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue