| | |
| | | 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, |
| | |
| | | post('/api/license/getLicenseDays', {}).then((resp) => { |
| | | let result = resp.data; |
| | | let data = result.data; |
| | | if(result.code == 200) { |
| | | if (result.code == 200) { |
| | | licenseDays.value = data; |
| | | } |
| | | }) |
| | |
| | | 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 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-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" @pageReload="reloadTabs" /> |
| | |
| | | </a-layout-content> |
| | | </a-layout> |
| | | </a-layout> |
| | | |
| | | <AiView /> |
| | | </template> |
| | | |
| | | <style scoped></style> |