Prechádzať zdrojové kódy

1. 租户打开页面之后存贮租户信息,下次打开主域名也进入租户登录页面
2. 动态更新网站 title 为租户名称, 其他页面的网站名称和 logo也使用租户信息
3. 操作退出登录之后也会跳转到刚刚使用的租户的登录页面
4. 租户管理增加复制租户登录地址操作

yanglzh 10 mesiacov pred
rodič
commit
19b8173518

+ 2 - 13
src/App.vue

@@ -12,6 +12,7 @@ import { computed, ref, getCurrentInstance, onBeforeMount, onMounted, onUnmounte
 import { useRoute } from 'vue-router';
 import { useStore } from '/@/store/index';
 import other from '/@/utils/other';
+import { setSystemInfo } from '/@/utils/auth';
 import { Local, Session } from '/@/utils/storage';
 import setIntroduction from '/@/utils/setIconfont';
 import LockScreen from '/@/layout/lockScreen/index.vue';
@@ -26,19 +27,7 @@ export default defineComponent({
 	name: 'app',
 	components: { LockScreen, Setings, CloseFull },
 	async created() {
-		api.sysinfo().then((res: any) => {
-			localStorage.setItem('sysinfo', JSON.stringify(res));
-			// 使用的事base64加密的,解决之后的值  sysPasswordChangePeriod + "|" + isSecurityControlEnabled + "|" + isRsaEnabled+ "|" + _tag+ "|" + isSSOEnabled
-			// 顺序是,密码变更周期,是否启动安全控制,是否启用rsa,中间你需要根据 | 切割一下
-			const [sysPasswordChangePeriod, isSecurityControlEnabled, isRsaEnabled, _tag, isSSOEnabled, isEnterprise] = window.atob(res.target).split('|')
-			// isEnterprise 是否为企业版,0代表专业版  1代表企业版
-			// 安全开关是否开启 按钮权限,列表权限,rsa权限在开启安全权限下才使用
-			sessionStorage.setItem('isSecurityControlEnabled', Number(isSecurityControlEnabled) ? '1' : '');
-			sessionStorage.setItem('isRsaEnabled', (Number(isSecurityControlEnabled) && Number(isRsaEnabled)) ? '1' : '');
-			sessionStorage.setItem('sysPasswordChangePeriod', sysPasswordChangePeriod);
-			sessionStorage.setItem('isSSOEnabled', Number(isSSOEnabled) ? '1' : '');
-			sessionStorage.setItem('isEnterprise', Number(isEnterprise) ? '1' : '');
-		});
+		api.sysinfo().then(setSystemInfo);
 	},
 	setup() {
 		// 监听屏幕尺寸变化

+ 1 - 1
src/api/system/index.ts

@@ -6,7 +6,7 @@ export default {
     // list: () => get(`/oauth/provider`),
     // login: (provider: string) => get(`/oauth/login`, { provider }),
     // // sso授权登录回调
-    // callback: (params: object) => get(`/oauth/callback`, params),
+    callback: (params: object) => get(`/oauth/callback`, params),
     // // 系统用户登录绑定授权用户
     // binding: (data: any) => post(`/oauth/binding`, data),
     list: (params?: object) => get('/system/oauthProvider/list', params),

+ 1 - 1
src/components/upload/index.vue

@@ -52,7 +52,7 @@ const props = defineProps({
 	},
 	accept: {
 		type: String,
-		default: '.jpg,.png,.jpeg,.gif',
+		default: '.jpg,.png,.jpeg,.gif,.svg',
 	},
 	limit: {
 		type: Number,

+ 5 - 2
src/layout/logo/index.vue

@@ -13,6 +13,7 @@ import { computed, defineComponent } from 'vue';
 import { useStore } from '/@/store/index';
 
 import logoMini from '/imgs/logo-mini.svg';
+import { getSystemInfo, getTenantInfo } from '/@/utils/auth';
 
 export default defineComponent({
 	name: 'layoutLogo',
@@ -26,7 +27,9 @@ export default defineComponent({
 		};
 	},
 	created() {
-		this.sysinfo = JSON.parse(localStorage.sysinfo || '{}');
+		const tenantInfo = getTenantInfo()
+		const sysinfo = getSystemInfo()
+		this.sysinfo = tenantInfo || sysinfo
 	},
 	setup() {
 		const store = useStore();
@@ -77,7 +80,7 @@ export default defineComponent({
 	.logo {
 		height: 32px;
 		width: auto;
-		padding-right: 5px;
+		margin-right: 10px;
 	}
 }
 

+ 3 - 5
src/layout/navBars/breadcrumb/user.vue

@@ -11,7 +11,7 @@
 					<el-dropdown-item command="small" :disabled="disabledSize === 'small'">{{ $t('message.user.dropdownSmall') }}</el-dropdown-item>
 				</el-dropdown-menu>
 			</template>
-		</el-dropdown> -->
+</el-dropdown> -->
     <!-- <el-dropdown :show-timeout="70" :hide-timeout="50" trigger="click" @command="onLanguageChange">
 			<div class="layout-navbars-breadcrumb-user-icon">
 				<i class="iconfont" :class="disabledI18n === 'en' ? 'icon-fuhao-yingwen' : 'icon-fuhao-zhongwen'" :title="$t('message.user.title1')"></i>
@@ -87,7 +87,7 @@ import { Local } from '/@/utils/storage';
 import UserNews from '/@/layout/navBars/breadcrumb/userNews.vue';
 import Search from '/@/layout/navBars/breadcrumb/search.vue';
 import api from '/@/api/system';
-import { removeToken } from "/@/utils/auth";
+import { cacheClear, removeToken } from "/@/utils/auth";
 
 export default defineComponent({
   name: 'layoutBreadcrumbUser',
@@ -172,8 +172,7 @@ export default defineComponent({
             await resetRoute(); // 删除/重置路由
             ElMessage.success(t('message.user.logOutSuccess'));
             setTimeout(() => {
-              localStorage.clear(); // 清除缓存/token等
-              sessionStorage.clear(); // 清除缓存/token等
+              cacheClear()
               removeToken(); // 清除缓存/token等
               window.location.href = ''; // 去登录页
             }, 500);
@@ -320,5 +319,4 @@ export default defineComponent({
     top: 12px;
   }
 }
-
 </style>

+ 4 - 2
src/router/index.ts

@@ -7,7 +7,7 @@ import { NextLoading } from '/@/utils/loading';
 import { staticRoutes, dynamicRoutes } from '/@/router/route';
 import { initFrontEndControlRoutes } from '/@/router/frontEnd';
 import { initBackEndControlRoutes } from '/@/router/backEnd';
-import { getToken } from "/@/utils/auth";
+import { getTenantInfo, getToken } from "/@/utils/auth";
 
 const whiteList = ['/login', '/ssoBack', '/:tenant/login']
 
@@ -223,7 +223,9 @@ router.beforeEach(async (to, from, next) => {
 			if (params) {
 				paramsStr = `&params=${JSON.stringify(Object.keys(to.query).length ? to.query : to.params)}`
 			}
-			next(`/login?redirect=${to.path}${paramsStr}`);
+			// 如果当前是租户,则跳转到租户登录页
+			const tenantCode = getTenantInfo()?.code
+			next(`${tenantCode ? '/' + tenantCode : ''}/login?redirect=${to.path}${paramsStr}`);
 			Session.clear();
 			resetRoute();
 			NProgress.done();

+ 38 - 0
src/utils/auth.ts

@@ -13,3 +13,41 @@ export function setToken(token: string) {
 export function removeToken() {
   return Cookies.remove(TokenKey)
 }
+
+export function setSystemInfo(data: any) {
+  localStorage.setItem('sysinfo', JSON.stringify(data));
+  // 使用的事base64加密的,解决之后的值  sysPasswordChangePeriod + "|" + isSecurityControlEnabled + "|" + isRsaEnabled+ "|" + _tag+ "|" + isSSOEnabled
+  // 顺序是,密码变更周期,是否启动安全控制,是否启用rsa,中间你需要根据 | 切割一下
+  const [sysPasswordChangePeriod, isSecurityControlEnabled, isRsaEnabled, _tag, isSSOEnabled, isEnterprise] = window.atob(data.target).split('|')
+  // isEnterprise 是否为企业版,0代表专业版  1代表企业版
+  // 安全开关是否开启 按钮权限,列表权限,rsa权限在开启安全权限下才使用
+  sessionStorage.setItem('isSecurityControlEnabled', Number(isSecurityControlEnabled) ? '1' : '');
+  sessionStorage.setItem('isRsaEnabled', (Number(isSecurityControlEnabled) && Number(isRsaEnabled)) ? '1' : '');
+  sessionStorage.setItem('sysPasswordChangePeriod', sysPasswordChangePeriod);
+  sessionStorage.setItem('isSSOEnabled', Number(isSSOEnabled) ? '1' : '');
+  sessionStorage.setItem('isEnterprise', Number(isEnterprise) ? '1' : '');
+}
+
+export function getSystemInfo() {
+  return JSON.parse(localStorage.sysinfo)
+}
+
+export function setTenantInfo(data?: any) {
+  if (!data) return localStorage.removeItem('temantInfo')
+  localStorage.setItem('temantInfo', JSON.stringify(data));
+}
+
+export function getTenantInfo() {
+  if (localStorage.temantInfo) {
+    return JSON.parse(localStorage.temantInfo)
+  } else {
+    return false
+  }
+}
+
+export function cacheClear() {
+  const tenant = getTenantInfo()
+  localStorage.clear()
+  sessionStorage.clear()
+  setTenantInfo(tenant)
+}

+ 4 - 2
src/utils/other.ts

@@ -6,6 +6,7 @@ import { store } from '/@/store/index';
 import { i18n } from '/@/i18n/index';
 import { Local } from '/@/utils/storage';
 import SvgIcon from '/@/components/svgIcon/index.vue';
+import { getSystemInfo, getTenantInfo } from './auth';
 
 
 /**
@@ -29,11 +30,12 @@ export function useTitle() {
 	nextTick(() => {
 		let webTitle = '';
 		// let globalTitle: string = store.state.themeConfig.themeConfig.globalTitle;
-		let globalTitle: string = JSON.parse(localStorage.sysinfo || '{}').systemName || '';
+		const globalTitle: string = getSystemInfo()?.systemName
+		const tenantTitle: string = getTenantInfo()?.systemName
 		router.currentRoute.value.path === '/login'
 			? (webTitle = router.currentRoute.value.meta?.title as any)
 			: (webTitle = i18n.global.t(router.currentRoute.value.meta?.title as any));
-		document.title = `${webTitle} - ${globalTitle || ''}` || globalTitle;
+		document.title = `${webTitle} - ${tenantTitle || globalTitle}`
 	});
 }
 

+ 2 - 3
src/utils/request.ts

@@ -1,7 +1,7 @@
 import axios from 'axios';
 import { ElMessage, ElMessageBox } from 'element-plus';
 import getOrigin from '/@/utils/origin'
-import { getToken, removeToken } from "/@/utils/auth";
+import { cacheClear, getToken, removeToken } from "/@/utils/auth";
 
 // 配置新建一个 axios 实例
 const service = axios.create({
@@ -35,8 +35,7 @@ service.interceptors.response.use(
 			ElMessageBox.alert('登录状态已过期,请重新登录', '提示',
 				{ confirmButtonText: '确定', showCancelButton: false, closeOnHashChange: false, closeOnPressEscape: false, closeOnClickModal: false, showClose: false })
 				.then(() => {
-					localStorage.clear(); // 清除缓存/token等
-					sessionStorage.clear(); // 清除缓存/token等
+					cacheClear()
 					removeToken()
 					window.location.href = '/'; // 去登录页
 				})

+ 2 - 3
src/utils/request_ice104.ts

@@ -1,7 +1,7 @@
 import axios from 'axios';
 import { ElMessage, ElMessageBox } from 'element-plus';
 import { getOtherServersOrigin } from '/@/utils/origin'
-import { getToken, removeToken } from "/@/utils/auth";
+import { cacheClear, getToken, removeToken } from "/@/utils/auth";
 
 // 配置新建一个 axios 实例
 const service = axios.create({
@@ -36,8 +36,7 @@ service.interceptors.response.use(
 			ElMessageBox.alert('登录状态已过期,请重新登录', '提示',
 				{ confirmButtonText: '确定', showCancelButton: false, closeOnHashChange: false, closeOnPressEscape: false, closeOnClickModal: false, showClose: false })
 				.then(() => {
-					localStorage.clear(); // 清除缓存/token等
-					sessionStorage.clear(); // 清除缓存/token等
+					cacheClear()
 					removeToken()
 					window.location.href = '/'; // 去登录页
 				})

+ 2 - 3
src/utils/request_modbus.ts

@@ -1,7 +1,7 @@
 import axios from 'axios';
 import { ElMessage, ElMessageBox } from 'element-plus';
 import { getOtherServersOrigin } from '/@/utils/origin'
-import { getToken, removeToken } from "/@/utils/auth";
+import { cacheClear, getToken, removeToken } from "/@/utils/auth";
 
 // 配置新建一个 axios 实例
 const service = axios.create({
@@ -35,8 +35,7 @@ service.interceptors.response.use(
 			ElMessageBox.alert('登录状态已过期,请重新登录', '提示',
 				{ confirmButtonText: '确定', showCancelButton: false, closeOnHashChange: false, closeOnPressEscape: false, closeOnClickModal: false, showClose: false })
 				.then(() => {
-					localStorage.clear(); // 清除缓存/token等
-					sessionStorage.clear(); // 清除缓存/token等
+					cacheClear()
 					removeToken()
 					window.location.href = '/'; // 去登录页
 				})

+ 2 - 3
src/utils/storage.ts

@@ -1,4 +1,4 @@
-import { removeToken } from "/@/utils/auth";
+import { cacheClear, removeToken } from "/@/utils/auth";
 /**
  * window.localStorage 浏览器永久缓存
  * @method set 设置永久缓存
@@ -22,8 +22,7 @@ export const Local = {
 	},
 	// 移除全部永久缓存
 	clear() {
-		localStorage.clear(); // 清除缓存/token等
-		sessionStorage.clear(); // 清除缓存/token等
+		cacheClear()
 		removeToken()
 	},
 };

+ 5 - 1
src/views/login/index.vue

@@ -31,6 +31,7 @@ import { Sunny, Moon } from '@element-plus/icons-vue';
 import dayjs from 'dayjs';
 import api from '/@/api/system';
 import axios from 'axios';
+import { setSystemInfo, setTenantInfo } from '/@/utils/auth';
 // import PackageJson from '/public/version.json';
 // 定义接口来定义对象的类型
 interface LoginState {
@@ -60,15 +61,18 @@ export default defineComponent({
 			},
 		};
 	},
+	created() {
+		setTenantInfo();
+	},
 	mounted() {
 		api.sysinfo().then((res: any) => {
+			setSystemInfo(res);
 			this.sysinfo = res
 			const isSSOEnabled = window.atob(res.target).split('|')[4]
 			if (isSSOEnabled == '1') {
 				this.showSSO = true
 			}
 		}).finally(() => this.showImg = true)
-
 	},
 	setup() {
 		const store = useStore();

+ 89 - 79
src/views/login/tenant.vue

@@ -1,5 +1,5 @@
 <template>
-	<div class="login-container flex-row" v-if="showImg" v-loading="loading">
+	<div class="login-container flex-row" v-if="showImg && isAllow" v-loading="loading">
 		<el-switch class="switch" v-model="getThemeConfig.isIsDark" size="large" inline-prompt @change="onAddDarkChange" :active-icon="Sunny" :inactive-icon="Moon" style="--el-switch-on-color: #fff; --el-switch-off-color: #151515"></el-switch>
 		<div class="part left">
 			<div class="flex logo">
@@ -8,11 +8,17 @@
 			</div>
 			<el-image class="img" fit="contain" :src="sysinfo.systemLoginPIC" />
 			<div>
-				<span class="text" v-if="sysinfo.buildTime">服务端版本:{{ sysinfo.buildVersion }} </span>
-				<span class="text" v-if="sysinfo.buildTime">{{ dayjs(sysinfo.buildTime).format('YYYY-MM-DD HH:mm:ss') }}</span>
-				<div style="height: 10px;"></div>
-				<span class="text" v-if="versionInfo.version">前端版本:{{ versionInfo.version }} </span>
-				<span class="text" v-if="versionInfo.updateTime">{{ versionInfo.updateTime }}</span>
+				<span class="text" v-if="sysinfo.buildTime">服务端版本:{{ sysinfo.buildVersion }}
+				</span>
+				<span class="text" v-if="sysinfo.buildTime">{{
+					dayjs(sysinfo.buildTime).format("YYYY-MM-DD HH:mm:ss")
+				}}</span>
+				<div style="height: 10px"></div>
+				<span class="text" v-if="versionInfo.version">前端版本:{{ versionInfo.version }}
+				</span>
+				<span class="text" v-if="versionInfo.updateTime">{{
+					versionInfo.updateTime
+				}}</span>
 			</div>
 		</div>
 		<div class="part">
@@ -23,72 +29,76 @@
 </template>
 
 <script lang="ts" setup>
-import { reactive, computed, ref } from 'vue';
-import Account from '/@/views/login/component/account-tenant.vue';
-import { useStore } from '/@/store/index';
-import { Sunny, Moon } from '@element-plus/icons-vue';
-import dayjs from 'dayjs';
-import api from '/@/api/system';
-import tenantApi from '/@/api/modules/tenant';
-import axios from 'axios';
-import { useRoute } from 'vue-router';
-import { ElMessage } from 'element-plus';
+import { reactive, computed, ref } from "vue";
+import Account from "/@/views/login/component/account-tenant.vue";
+import { useStore } from "/@/store/index";
+import { Sunny, Moon } from "@element-plus/icons-vue";
+import dayjs from "dayjs";
+import api from "/@/api/system";
+import tenantApi from "/@/api/modules/tenant";
+import axios from "axios";
+import { useRoute } from "vue-router";
+import { ElMessage } from "element-plus";
+import { setSystemInfo, setTenantInfo } from "/@/utils/auth";
+import other from "/@/utils/other";
 
 const store = useStore();
 const route = useRoute();
-const tenant = route.params?.tenant as string
-const isAllow = ref(true)
-const loading = ref(true)
+const tenant = route.params?.tenant as string;
+const isAllow = ref(true);
+const loading = ref(true);
 
-const showImg = ref(false)
-const showSSO = ref(false)
+const showImg = ref(false);
+const showSSO = ref(false);
 const sysinfo = reactive<any>({
-	buildVersion: '',
-	buildTime: '',
-	systemName: '',
-	systemLogo: '',
-	systemLoginPIC: '',
-})
-
-api.sysinfo().then((res: any) => {
-	// Object.assign(sysinfo, res)
-	sysinfo.buildVersion = res.buildVersion
-	sysinfo.buildTime = res.buildTime
-	const isSSOEnabled = window.atob(res.target).split('|')[4]
-	if (isSSOEnabled == '1') {
-		showSSO.value = true
-	}
-}).finally(() => showImg.value = true)
-
-// tenantApi.get(tenant).then((res: any) => {
-// 	console.log(res)
-// }).catch(() => {
-// 	isAllow.value = false
-// }).finally(() => {
-loading.value = false
-// })
-
-const res = {
-	"name": "测试租户",
-	"code": "ttt",
-	"description": "adsfasdfadsf",
-	"logoMini": "https://zhgy.sagoo.cn/base-api/upload_file/2024-11-11/d5jfenttbyhtxcsess.png",
-	"logoPic": "https://zhgy.sagoo.cn/base-api/upload_file/2024-11-12/d5k9gntb46f5yhfw8r.jpg",
-	"logo": "https://zhgy.sagoo.cn/base-api/upload_file/2024-11-11/d5jfepud0ajcbia9fw.png",
-	"systemName": "123",
-	"systemCopyright": "333",
-	"isDeleted": 0,
-	"status": 1,
-}
+	buildVersion: "",
+	buildTime: "",
+	systemName: "",
+	systemLogo: "",
+	systemLoginPIC: "",
+});
 
-if (res?.status) {
-	sysinfo.systemName = res.name
-	sysinfo.systemLogo = res.logo
-	sysinfo.systemLoginPIC = res.logoPic
-} else {
-	isAllow.value = false
-	ElMessage.error('租户不存在')
-}
+api
+	.sysinfo()
+	.then((res: any) => {
+		setSystemInfo(res);
+		sysinfo.buildVersion = res.buildVersion;
+		sysinfo.buildTime = res.buildTime;
+		const isSSOEnabled = window.atob(res.target).split("|")[4];
+		if (isSSOEnabled == "1") {
+			showSSO.value = true;
+		}
+	})
+	.finally(() => (showImg.value = true));
+
+tenantApi
+	.get(tenant)
+	.then((res: any) => {
+		if (res?.status) {
+			sysinfo.systemName = res.name;
+			sysinfo.systemLogo = res.logo;
+			sysinfo.systemLoginPIC = res.logoPic;
+
+			// 设置租户的全局名称和图标
+			setTenantInfo({
+				code: res.code,
+				systemName: res.name,
+				systemLogo: res.logo,
+				systemLogoMini: res.logoMini,
+				systemLoginPIC: res.logoPic,
+			})
+			other.useTitle()
+		} else {
+			isAllow.value = false;
+			ElMessage.error("租户不存在");
+		}
+	})
+	.catch(() => {
+		isAllow.value = false;
+	})
+	.finally(() => {
+		loading.value = false;
+	});
 
 // 获取布局配置信息
 const getThemeConfig = computed(() => {
@@ -96,31 +106,31 @@ const getThemeConfig = computed(() => {
 });
 
 const versionInfo = reactive<any>({
-	version: '',
-	updateTime: '',
-})
+	version: "",
+	updateTime: "",
+});
 // 加载版本信息
-axios.get('/versionInfo.json').then(res => {
-	versionInfo.version = res.data.version
-	versionInfo.updateTime = res.data.updateTime
-})
+axios.get("/versionInfo.json").then((res) => {
+	versionInfo.version = res.data.version;
+	versionInfo.updateTime = res.data.updateTime;
+});
 
 // 4、界面显示 --> 深色模式
 const onAddDarkChange = () => {
 	const body = document.documentElement as HTMLElement;
 	if (getThemeConfig.value.isIsDark) {
-		body.setAttribute('data-theme', 'dark');
-		document.querySelector('html')!.className = 'dark'
+		body.setAttribute("data-theme", "dark");
+		document.querySelector("html")!.className = "dark";
 	} else {
-		body.setAttribute('data-theme', '');
-		document.querySelector('html')!.className = ''
+		body.setAttribute("data-theme", "");
+		document.querySelector("html")!.className = "";
 	}
-	store.dispatch('themeConfig/setThemeConfig', getThemeConfig.value);
+	store.dispatch("themeConfig/setThemeConfig", getThemeConfig.value);
 };
 </script>
 
 <style scoped lang="scss">
-html[data-theme='dark'] {
+html[data-theme="dark"] {
 	.login-container {
 		background: #293146;
 	}

+ 8 - 2
src/views/modules/tenant/index.vue

@@ -38,11 +38,12 @@
 						</el-switch>
 					</template>
 				</el-table-column>
-				<el-table-column label="操作" width="120" align="center">
+				<el-table-column label="操作" width="210" align="center">
 					<template #default="scope">
 						<el-button size="small" text type="primary" @click="view(scope.row)">查看</el-button>
 						<el-button size="small" text type="warning" @click="addOrEdit(scope.row)" v-auth="'edit'">修改</el-button>
-						<el-button size="small" text type="info" @click="onDel(scope.row)" v-auth="'del'">删除</el-button>
+						<el-button size="small" text type="danger" @click="onDel(scope.row)" v-auth="'del'">删除</el-button>
+						<el-button size="small" text type="info" @click="copyUrl(scope.row.code)" v-auth="'del'">复制登录地址</el-button>
 					</template>
 				</el-table-column>
 			</el-table>
@@ -60,6 +61,7 @@ import viewVue from './view.vue'
 import api from '/@/api/modules/tenant'
 import { ElMessageBox, ElMessage } from 'element-plus'
 import { useSearch } from '/@/hooks/useCommon'
+import copy from '/@/utils/copy.ts'
 
 const editFormRef = ref()
 const viewRef = ref()
@@ -99,6 +101,10 @@ const onDel = (row: any) => {
 	})
 }
 
+const copyUrl = (code: any) => {
+	copy(`${window.origin}/${code}/login`)
+}
+
 // 状态修改
 const handleStatusChange = (row: any) => {
 	let text = row.status === 1 ? '启用' : '停用';

+ 5 - 2
src/views/sso/index.vue

@@ -21,7 +21,7 @@ import { Session, Local } from '/@/utils/storage';
 import { initFrontEndControlRoutes } from '/@/router/frontEnd';
 import { initBackEndControlRoutes } from '/@/router/backEnd';
 import { ElMessage } from 'element-plus';
-import { setToken } from "/@/utils/auth";
+import { setSystemInfo, setTenantInfo, setToken } from "/@/utils/auth";
 import Account from '/@/views/login/component/account.vue';
 
 // 定义接口来定义对象的类型
@@ -47,8 +47,11 @@ export default defineComponent({
 			},
 		};
 	},
+	created() {
+		setTenantInfo()
+	},
 	mounted() {
-		this.sysinfo = JSON.parse(localStorage.sysinfo || '{}');
+		api.sysinfo().then(setSystemInfo);
 	},
 	setup() {
 		const route = useRoute()