| | |
| | | UserOutlined, |
| | | TranslationOutlined, |
| | | ApartmentOutlined, |
| | | CaretLeftOutlined, |
| | | CaretRightOutlined, |
| | | } from "@ant-design/icons-vue"; |
| | | import { formatMessage, loadData } from '@/utils/localeUtils.js'; |
| | | import AiView from '@/components/ai/index.vue' |
| | | |
| | | const globalState = inject('globalState'); |
| | | const selectedKeys = ref([]); |
| | |
| | | let isRouterAlive = ref(true); |
| | | const menuCache = ref([]); |
| | | const hostList = ref([]); |
| | | const tabsContent = ref(null); |
| | | |
| | | const components = { |
| | | ...Icons, |
| | |
| | | isRouterAlive.value = false; |
| | | nextTick(() => { |
| | | isRouterAlive.value = true; |
| | | message.success(formatMessage('common.success', '加载成功')); |
| | | // message.success(formatMessage('common.success', '加载成功')); |
| | | }) |
| | | } catch (error) { |
| | | message.error(formatMessage('common.fail', '加载失败')); |
| | |
| | | }) |
| | | } |
| | | |
| | | const licenseDays = ref(365); |
| | | getLicenseDays(); |
| | | function getLicenseDays() { |
| | | post('/api/license/getLicenseDays', {}).then((resp) => { |
| | | let result = resp.data; |
| | | let data = result.data; |
| | | if (result.code == 200) { |
| | | licenseDays.value = data; |
| | | } |
| | | }) |
| | | } |
| | | |
| | | const switchHost = (item) => { |
| | | globalState.currentHost = item; |
| | | postForm('/api/root/change/host/auth', { |
| | |
| | | window.location.reload(); |
| | | } |
| | | |
| | | const handleScroll = (data) => { |
| | | let position = tabsContent.value.scrollLeft; |
| | | let offset = position * 0.1 + 30; |
| | | if (data == 'left') { |
| | | tabsContent.value.scrollLeft = position - offset; |
| | | } else { |
| | | tabsContent.value.scrollLeft = position + offset; |
| | | } |
| | | } |
| | | |
| | | </script> |
| | | |
| | | <template> |
| | | <a-layout class="main"> |
| | | <a-layout-sider v-model:collapsed="collapsed" :trigger="null" collapsible theme="dark"> |
| | | <a-layout-sider class="main-sider" v-model:collapsed="collapsed" :trigger="null" collapsible theme="dark"> |
| | | <div class="logo" /> |
| | | <a-menu v-model:openKeys="openKeys" v-model:selectedKeys="selectedKeys" @select="menuSelect" theme="dark" mode="inline"> |
| | | <a-menu v-model:openKeys="openKeys" v-model:selectedKeys="selectedKeys" @select="menuSelect" theme="dark" |
| | | mode="inline"> |
| | | <div> |
| | | <a-menu-item key="/" name="主页"> |
| | | <HomeOutlined /> {{ formatMessage('common.home', '主页') }} |
| | |
| | | |
| | | </a-layout-sider> |
| | | <a-layout> |
| | | <a-layout-header style="background: #fff; padding: 0"> |
| | | <a-layout-header style="background: #fff; padding: 0;"> |
| | | <div class="header-top"> |
| | | <div class="header-top-left"> |
| | | <MenuUnfoldOutlined v-if="collapsed" class="trigger" @click="() => (collapsed = !collapsed)" /> |
| | | <MenuUnfoldOutlined v-if="collapsed" class="trigger triggerLarge" @click="() => (collapsed = !collapsed)" /> |
| | | <MenuFoldOutlined v-else class="trigger" @click="() => (collapsed = !collapsed)" /> |
| | | <RedoOutlined class="trigger" @click="windowReload()" /> |
| | | </div> |
| | | <div class="header-top-right"> |
| | | <div class="trigger" style="color: red;" v-if="licenseDays <= 30"> |
| | | 许可证有效期:{{ licenseDays }}天 |
| | | </div> |
| | | <div class="trigger" v-if="globalState.currentHost"> |
| | | <a-dropdown> |
| | | <div> |
| | |
| | | </a-layout-header> |
| | | <a-layout-content class="content-view"> |
| | | <div class="tabs-fixed"> |
| | | <div v-for="(item, index) in routerCacheList" :key="index" @click="switchTabs(item)" class="tabs-item" |
| | | :class="currentCache == item.name ? 'tabs-item-active' : ''"> |
| | | <div :class="currentCache == item.name ? '' : 'tabs-item-reload-none'" @click="reloadTabs" @click.stop> |
| | | <RedoOutlined /> |
| | | </div> |
| | | <div>{{ formatMessage(item.languageId, item.name) }}</div> |
| | | <div @click="closeTabs(item)" @click.stop> |
| | | <CloseOutlined /> |
| | | <div class="tabs-arrow-left" @click="handleScroll('left')"> |
| | | <CaretLeftOutlined /> |
| | | </div> |
| | | |
| | | <div class="tabs-content" ref="tabsContent"> |
| | | <div class="tabs-content-item"> |
| | | <div v-for="(item, index) in routerCacheList" :key="index" @click="switchTabs(item)" class="tabs-item" |
| | | :class="currentCache == item.name ? 'tabs-item-active' : ''"> |
| | | <div :class="currentCache == item.name ? '' : 'tabs-item-reload-none'" @click="reloadTabs" @click.stop> |
| | | <RedoOutlined /> |
| | | </div> |
| | | <div>{{ formatMessage(item.languageId, item.name) }}</div> |
| | | <div @click="closeTabs(item)" @click.stop> |
| | | <CloseOutlined /> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="tabs-arrow-right" @click="handleScroll('right')"> |
| | | <CaretRightOutlined /> |
| | | </div> |
| | | </div> |
| | | |
| | | <router-view v-slot="{ Component, route }" v-if="isRouterAlive"> |
| | | <keep-alive :include="routerCache"> |
| | | <component :is="Component" /> |
| | | <component :is="Component" @pageReload="reloadTabs" /> |
| | | </keep-alive> |
| | | </router-view> |
| | | </a-layout-content> |
| | | </a-layout> |
| | | </a-layout> |
| | | |
| | | <AiView /> |
| | | </template> |
| | | |
| | | <style scoped></style> |