import qs from "qs" import Cookies from "js-cookie" import { ssoConfig } from "./ssoConfig" import { Modal } from "ant-design-vue" import { Context } from "@nuxt/types" import { SketonVue } from "../types/sketon.vue" type AuthRouteQuery = { projectId?: string, projectCode?: string, appToken?: string, clientId?: string, [key: string]: any } export default { methods: { async initAuth(this: SketonVue, ctx: Context) { // 判断是否需要登录 let { route, query } = ctx; let { projectId, projectCode, appToken }: AuthRouteQuery = query appToken && Cookies.set('user_token', appToken) if (this.isMockApp) { if (projectId) { this.mockProjectId = projectId this.projectCode = projectCode } if (!this.mockProjectId) { Modal.confirm({ title: '提示', content: '应用项目不存在请检查应用!', okText: '确认', cancelText: '取消', }); } } let status = 0; try { status = await this.getUser() await this.loadMenu(ctx, status) } catch (error: any) { if (error.request && error.request.status) { status = error.request.status } } finally { if (status !== 401 && this.user.logstatus) { this.useI18n & this.loadLocalI18n() if (appToken) { let { appToken, clientId, ...params } = query ctx.redirect(route.path, params) } } else if (status == 401) { this.goRedirectLoginPage() } } }, /** * @param {*} url url * @param {*} hasQuery 是否解析当前url参数 并拼凑appToken , clientId 参数 */ goRedirectLoginPage( this: SketonVue, url:string = '', hasQuery:boolean = true) :void{ this.removeUser() // 获取当前的url let currentUrl = window.location.href // 获取当前地址参数 let query = window.location.search if (hasQuery) { let { appToken, clientId, ...params } = qs.parse(query, { ignoreQueryPrefix: true }); currentUrl = currentUrl + '?' + qs.stringify(params) } let paramsUrl = encodeURIComponent(url || currentUrl); const callBackUrl = '&callBackUrl=' + paramsUrl const authLoginUrl = `${ssoConfig.loginHost}/login?clientId=${this.auth.clientId}`; window.location.replace(authLoginUrl + callBackUrl); }, logout(this:SketonVue) :void { // 删除国际化内容( localStorage.removeItem('langModule') window.location.replace(`${ssoConfig.loginHost}/logout?callback=${ssoConfig.loginHost}/login?clientId=${this.auth.clientId}`); } } }