⬆️ 升级 arco 版本.

This commit is contained in:
lijiahang
2024-03-22 20:01:05 +08:00
parent 27c1e16e57
commit a3d4420754
12 changed files with 373 additions and 174 deletions

View File

@@ -1,5 +1,15 @@
> 版本号严格遵循 Semver 规范。 > 版本号严格遵循 Semver 规范。
## v1.0.3
`2024-03-2` `release`
* 🚀 升级 `arco design``2.55.0`
* 🐞 修复 新创建的用户登录会跳转到 **404**
* 🐞 修复 分配菜单模态框没有子菜单不显示的问题
* 🐞 修复 `工作台` `快捷操作` 会展示隐藏的菜单
* 🔨 修改 系统菜单渲染逻辑 (移除 JSX 构建时不会提示 JSX.IntrinsicElements)
## v1.0.2 ## v1.0.2
`2024-03-22` `release` `2024-03-22` `release`

View File

@@ -29,7 +29,7 @@
] ]
}, },
"dependencies": { "dependencies": {
"@arco-design/web-vue": "^2.53.3", "@arco-design/web-vue": "^2.55.0",
"@dangojs/a-query-header": "^0.0.31", "@dangojs/a-query-header": "^0.0.31",
"@sanqi377/arco-vue-icon-picker": "^1.0.7", "@sanqi377/arco-vue-icon-picker": "^1.0.7",
"@vueuse/core": "^9.3.0", "@vueuse/core": "^9.3.0",

View File

@@ -11,11 +11,11 @@ overrides:
dependencies: dependencies:
'@arco-design/web-vue': '@arco-design/web-vue':
specifier: ^2.53.3 specifier: ^2.55.0
version: 2.53.3(vue@3.3.11) version: 2.55.0(vue@3.3.11)
'@dangojs/a-query-header': '@dangojs/a-query-header':
specifier: ^0.0.31 specifier: ^0.0.31
version: 0.0.31(@arco-design/web-vue@2.53.3)(@dangojs/digitforce-ui-utils@0.0.9)(lodash@4.17.21)(vue@3.3.11) version: 0.0.31(@arco-design/web-vue@2.55.0)(@dangojs/digitforce-ui-utils@0.0.9)(lodash@4.17.21)(vue@3.3.11)
'@sanqi377/arco-vue-icon-picker': '@sanqi377/arco-vue-icon-picker':
specifier: ^1.0.7 specifier: ^1.0.7
version: 1.0.7(vue@3.3.11) version: 1.0.7(vue@3.3.11)
@@ -254,8 +254,8 @@ packages:
color: 3.2.1 color: 3.2.1
dev: false dev: false
/@arco-design/web-vue@2.53.3(vue@3.3.11): /@arco-design/web-vue@2.55.0(vue@3.3.11):
resolution: {integrity: sha512-/9tMP2GrcGWPGcfRQcLMFMxRBm7s6jjFkCpXXnOpvMAIMe80+gzqjVS2dmgCv2a1FpvB9fy5ot7+evJ5zrsQiw==} resolution: {integrity: sha512-aMfg9dHiDsiJsxU2Mpa0V4WKjtdAdETBBrrVEHj1E7rJYF+PmrfZcSgIvAJSbdJZC/euqSCHyYOQezi3esSzxA==}
peerDependencies: peerDependencies:
vue: ^3.1.0 vue: ^3.1.0
dependencies: dependencies:
@@ -750,7 +750,7 @@ packages:
postcss-selector-parser: 6.0.13 postcss-selector-parser: 6.0.13
dev: true dev: true
/@dangojs/a-query-header@0.0.31(@arco-design/web-vue@2.53.3)(@dangojs/digitforce-ui-utils@0.0.9)(lodash@4.17.21)(vue@3.3.11): /@dangojs/a-query-header@0.0.31(@arco-design/web-vue@2.55.0)(@dangojs/digitforce-ui-utils@0.0.9)(lodash@4.17.21)(vue@3.3.11):
resolution: {integrity: sha512-hXLAU8oIQ1ULDY+qXKoKstqo3/m4HTjXcxNaFbPatTVMHwox4tBAIc5Nox1crvlWkNagUyk7PpnQuzLH73j9AQ==} resolution: {integrity: sha512-hXLAU8oIQ1ULDY+qXKoKstqo3/m4HTjXcxNaFbPatTVMHwox4tBAIc5Nox1crvlWkNagUyk7PpnQuzLH73j9AQ==}
peerDependencies: peerDependencies:
'@arco-design/web-vue': ^2.47.1 '@arco-design/web-vue': ^2.47.1
@@ -758,7 +758,7 @@ packages:
lodash: ^4.17.21 lodash: ^4.17.21
vue: ^3.3.2 vue: ^3.3.2
dependencies: dependencies:
'@arco-design/web-vue': 2.53.3(vue@3.3.11) '@arco-design/web-vue': 2.55.0(vue@3.3.11)
'@dangojs/digitforce-ui-utils': 0.0.9(typescript@4.9.5) '@dangojs/digitforce-ui-utils': 0.0.9(typescript@4.9.5)
lodash: 4.17.21 lodash: 4.17.21
vue: 3.3.11(typescript@4.9.5) vue: 3.3.11(typescript@4.9.5)

View File

@@ -21,7 +21,7 @@
</div> </div>
<!-- 顶部菜单 --> <!-- 顶部菜单 -->
<div class="center-side"> <div class="center-side">
<menu-tree v-if="topMenu" /> <system-menu-tree v-if="topMenu" />
</div> </div>
<!-- 右侧操作 --> <!-- 右侧操作 -->
<ul class="right-side"> <ul class="right-side">
@@ -214,7 +214,7 @@
import { preferenceTipsKey } from './const'; import { preferenceTipsKey } from './const';
import { REDIRECT_ROUTE_NAME, routerToTag } from '@/router/constants'; import { REDIRECT_ROUTE_NAME, routerToTag } from '@/router/constants';
import { openNewRoute } from '@/router'; import { openNewRoute } from '@/router';
import MenuTree from '@/components/system/menu/tree/index.vue'; import SystemMenuTree from '@/components/system/menu/tree/index.vue';
import MessageBox from '@/components/system/message-box/index.vue'; import MessageBox from '@/components/system/message-box/index.vue';
import UpdatePasswordModal from '@/components/user/user/update-password-modal/index.vue'; import UpdatePasswordModal from '@/components/user/user/update-password-modal/index.vue';

View File

@@ -4,7 +4,7 @@
<div class="tab-bar-box"> <div class="tab-bar-box">
<div class="tab-bar-scroll"> <div class="tab-bar-scroll">
<div class="tags-wrap"> <div class="tags-wrap">
<TabItem v-for="(tag, index) in tagList" <tab-item v-for="(tag, index) in tagList"
:key="tag.fullPath" :key="tag.fullPath"
:index="index" :index="index"
:item-data="tag" /> :item-data="tag" />

View File

@@ -1,163 +1,160 @@
<script lang="tsx"> <template>
<a-menu class="full"
:mode="topMenu ? 'horizontal' : 'vertical'"
v-model:collapsed="collapsed"
v-model:open-keys="openKeys"
v-model:selected-keys="selectedKey"
:show-collapse-button="appStore.device !== 'mobile'"
:auto-open="false"
:auto-open-selected="true"
:level-indent="34"
@collapse="setCollapse">
<template v-for="menu in menuTree">
<!-- 一级菜单 -->
<a-menu-item v-if="!menu.children?.length"
:key="menu.name"
@click="(e) => goto(e, menu)">
<!-- 图标 -->
<template #icon>
<component v-if="menu.meta?.icon" :is="menu.meta?.icon" />
</template>
<!-- 名称 -->
{{ menu.meta?.locale || '' }}
</a-menu-item>
<!-- 父菜单 -->
<a-sub-menu v-else :key="menu.name">
<!-- 图标 -->
<template #icon>
<component v-if="menu.meta?.icon" :is="menu.meta?.icon" />
</template>
<!-- 名称 -->
<template #title>
{{ menu.meta?.locale || '' }}
</template>
<!-- 子菜单 -->
<a-menu-item v-for="child in menu.children"
:key="child.name"
@click="(e) => goto(e, child)">
<!-- 图标 -->
<template #icon v-if="child.meta?.icon">
<component :is="child.meta?.icon" />
</template>
<!-- 名称 -->
{{ child.meta?.locale || '' }}
</a-menu-item>
</a-sub-menu>
</template>
</a-menu>
</template>
<script lang="ts">
export default {
name: 'systemMenuTree'
};
</script>
<script lang="ts" setup>
import type { RouteMeta, RouteRecordRaw } from 'vue-router'; import type { RouteMeta, RouteRecordRaw } from 'vue-router';
import { useRoute, useRouter } from 'vue-router'; import { useRoute, useRouter } from 'vue-router';
import { compile, computed, defineComponent, h, ref } from 'vue'; import { computed, ref } from 'vue';
import { useAppStore } from '@/store'; import { useAppStore } from '@/store';
import { listenerRouteChange } from '@/utils/route-listener'; import { listenerRouteChange } from '@/utils/route-listener';
import { openWindow, regexUrl } from '@/utils'; import { openWindow, regexUrl } from '@/utils';
import { openNewRoute } from '@/router'; import { openNewRoute } from '@/router';
import useMenuTree from './use-menu-tree'; import useMenuTree from './use-menu-tree';
export default defineComponent({ const emits = defineEmits(['collapse']);
name: 'menuTree',
emit: ['collapse'],
setup() {
const appStore = useAppStore();
const router = useRouter();
const route = useRoute();
const { menuTree } = useMenuTree();
const collapsed = computed({
get() {
if (appStore.device === 'desktop') return appStore.menuCollapse;
return false;
},
set(value: boolean) {
appStore.updateSettings({ menuCollapse: value });
},
});
const topMenu = computed(() => appStore.topMenu); const appStore = useAppStore();
const openKeys = ref<string[]>([]); const router = useRouter();
const selectedKey = ref<string[]>([]); const route = useRoute();
const { menuTree } = useMenuTree();
// 跳转路由 const collapsed = computed({
const goto = (e: any, item: RouteRecordRaw) => { get() {
// 打开外链 if (appStore.device === 'desktop') return appStore.menuCollapse;
if (regexUrl.test(item.path)) { return false;
openWindow(item.path); },
return; set(value: boolean) {
} appStore.updateSettings({ menuCollapse: value });
const { hideInMenu, activeMenu, newWindow } = item.meta as RouteMeta;
// 新页面打开
if (newWindow || e.ctrlKey) {
openNewRoute({
name: item.name,
});
return;
}
// 设置 selectedKey
if (route.name === item.name && !hideInMenu && !activeMenu) {
selectedKey.value = [item.name as string];
return;
}
// 触发跳转
router.push({
name: item.name,
});
};
const findMenuOpenKeys = (target: string) => {
const result: string[] = [];
let isFind = false;
const backtrack = (item: RouteRecordRaw, keys: string[]) => {
if (item.name === target) {
isFind = true;
result.push(...keys);
return;
}
if (item.children?.length) {
item.children.forEach((el) => {
backtrack(el, [...keys, el.name as string]);
});
}
};
menuTree.value.forEach((el: RouteRecordRaw) => {
if (isFind) return;
backtrack(el, [el.name as string]);
});
return result;
};
// 监听路由 设置打开的 key
listenerRouteChange((newRoute) => {
const { activeMenu, hideInMenu } = newRoute.meta;
if (!hideInMenu || activeMenu) {
const menuOpenKeys = findMenuOpenKeys(
(activeMenu || newRoute.name) as string
);
const keySet = new Set([...menuOpenKeys, ...openKeys.value]);
openKeys.value = [...keySet];
selectedKey.value = [
activeMenu || menuOpenKeys[menuOpenKeys.length - 1],
];
}
}, true);
// 展开菜单
const setCollapse = (val: boolean) => {
if (appStore.device === 'desktop')
appStore.updateSettings({ menuCollapse: val });
};
// 渲染菜单
const renderSubMenu = () => {
function travel(_route: RouteRecordRaw[], nodes = []) {
if (_route) {
_route.forEach((element) => {
// This is demo, modify nodes as needed
const icon = element?.meta?.icon
? () => h(compile(`<${element?.meta?.icon}/>`))
: null;
const node =
element?.children && element?.children.length !== 0 ? (
<a-sub-menu
key={element?.name}
v-slots={{
icon,
// 去除国际化 title: () => h(compile(t(element?.meta?.locale || ''))),
title: () => h(compile(element?.meta?.locale || '')),
}}
>
{travel(element?.children)}
</a-sub-menu>
) : (
<a-menu-item
key={element?.name}
v-slots={{ icon }}
onClick={($event: any) => goto($event, element)}
>
{element?.meta?.locale || ''}
</a-menu-item>
);
nodes.push(node as never);
});
}
return nodes;
}
return travel(menuTree.value);
};
return () => (
<a-menu
mode={topMenu.value ? 'horizontal' : 'vertical'}
v-model:collapsed={collapsed.value}
v-model:open-keys={openKeys.value}
show-collapse-button={appStore.device !== 'mobile'}
auto-open={false}
selected-keys={selectedKey.value}
auto-open-selected={true}
level-indent={34}
style="height: 100%; width:100%;"
onCollapse={setCollapse}
>
{renderSubMenu()}
</a-menu>
);
}, },
}); });
const topMenu = computed(() => appStore.topMenu);
const openKeys = ref<string[]>([]);
const selectedKey = ref<string[]>([]);
// 跳转路由
const goto = (e: any, item: RouteRecordRaw) => {
// 打开外链
if (regexUrl.test(item.path)) {
openWindow(item.path);
return;
}
const { hideInMenu, activeMenu, newWindow } = item.meta as RouteMeta;
// 新页面打开
if (newWindow || e.ctrlKey) {
openNewRoute({
name: item.name,
});
return;
}
// 设置 selectedKey
if (route.name === item.name && !hideInMenu && !activeMenu) {
selectedKey.value = [item.name as string];
return;
}
// 触发跳转
router.push({
name: item.name,
});
};
const findMenuOpenKeys = (target: string) => {
const result: string[] = [];
let isFind = false;
const backtrack = (item: RouteRecordRaw, keys: string[]) => {
if (item.name === target) {
isFind = true;
result.push(...keys);
return;
}
if (item.children?.length) {
item.children.forEach((el) => {
backtrack(el, [...keys, el.name as string]);
});
}
};
menuTree.value.forEach((el: RouteRecordRaw) => {
if (isFind) return;
backtrack(el, [el.name as string]);
});
return result;
};
// 监听路由 设置打开的 key
listenerRouteChange((newRoute) => {
const { activeMenu, hideInMenu } = newRoute.meta;
if (!hideInMenu || activeMenu) {
const menuOpenKeys = findMenuOpenKeys(
(activeMenu || newRoute.name) as string
);
const keySet = new Set([...menuOpenKeys, ...openKeys.value]);
openKeys.value = [...keySet];
selectedKey.value = [
activeMenu || menuOpenKeys[menuOpenKeys.length - 1],
];
}
}, true);
// 展开菜单
const setCollapse = (val: boolean) => {
if (appStore.device === 'desktop')
appStore.updateSettings({ menuCollapse: val });
};
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>

View File

@@ -0,0 +1,189 @@
<script lang="tsx">
import type { RouteMeta, RouteRecordRaw } from 'vue-router';
import { useRoute, useRouter } from 'vue-router';
import { compile, computed, defineComponent, h, ref } from 'vue';
import { useAppStore } from '@/store';
import { listenerRouteChange } from '@/utils/route-listener';
import { openWindow, regexUrl } from '@/utils';
import { openNewRoute } from '@/router';
import useMenuTree from './use-menu-tree';
export default defineComponent({
name: 'menuTree',
emit: ['collapse'],
setup() {
const appStore = useAppStore();
const router = useRouter();
const route = useRoute();
const { menuTree } = useMenuTree();
const collapsed = computed({
get() {
if (appStore.device === 'desktop') return appStore.menuCollapse;
return false;
},
set(value: boolean) {
appStore.updateSettings({ menuCollapse: value });
},
});
const topMenu = computed(() => appStore.topMenu);
const openKeys = ref<string[]>([]);
const selectedKey = ref<string[]>([]);
// 跳转路由
const goto = (e: any, item: RouteRecordRaw) => {
// 打开外链
if (regexUrl.test(item.path)) {
openWindow(item.path);
return;
}
const { hideInMenu, activeMenu, newWindow } = item.meta as RouteMeta;
// 新页面打开
if (newWindow || e.ctrlKey) {
openNewRoute({
name: item.name,
});
return;
}
// 设置 selectedKey
if (route.name === item.name && !hideInMenu && !activeMenu) {
selectedKey.value = [item.name as string];
return;
}
// 触发跳转
router.push({
name: item.name,
});
};
const findMenuOpenKeys = (target: string) => {
const result: string[] = [];
let isFind = false;
const backtrack = (item: RouteRecordRaw, keys: string[]) => {
if (item.name === target) {
isFind = true;
result.push(...keys);
return;
}
if (item.children?.length) {
item.children.forEach((el) => {
backtrack(el, [...keys, el.name as string]);
});
}
};
menuTree.value.forEach((el: RouteRecordRaw) => {
if (isFind) return;
backtrack(el, [el.name as string]);
});
return result;
};
// 监听路由 设置打开的 key
listenerRouteChange((newRoute) => {
const { activeMenu, hideInMenu } = newRoute.meta;
if (!hideInMenu || activeMenu) {
const menuOpenKeys = findMenuOpenKeys(
(activeMenu || newRoute.name) as string
);
const keySet = new Set([...menuOpenKeys, ...openKeys.value]);
openKeys.value = [...keySet];
selectedKey.value = [
activeMenu || menuOpenKeys[menuOpenKeys.length - 1],
];
}
}, true);
// 展开菜单
const setCollapse = (val: boolean) => {
if (appStore.device === 'desktop')
appStore.updateSettings({ menuCollapse: val });
};
// 渲染菜单
const renderSubMenu = () => {
function travel(_route: RouteRecordRaw[], nodes = []) {
if (_route) {
_route.forEach((element) => {
// This is demo, modify nodes as needed
const icon = element?.meta?.icon
? () => h(compile(`<${element?.meta?.icon}/>`))
: null;
const node =
element?.children && element?.children.length !== 0 ? (
<a-sub-menu
key={element?.name}
v-slots={{
icon,
// 去除国际化 title: () => h(compile(t(element?.meta?.locale || ''))),
title: () => h(compile(element?.meta?.locale || '')),
}}
>
{travel(element?.children)}
</a-sub-menu>
) : (
<a-menu-item
key={element?.name}
v-slots={{ icon }}
onClick={($event: any) => goto($event, element)}
>
{element?.meta?.locale || ''}
</a-menu-item>
);
nodes.push(node as never);
});
}
return nodes;
}
return travel(menuTree.value);
};
return () => (
<a-menu
mode={topMenu.value ? 'horizontal' : 'vertical'}
v-model:collapsed={collapsed.value}
v-model:open-keys={openKeys.value}
show-collapse-button={appStore.device !== 'mobile'}
auto-open={false}
selected-keys={selectedKey.value}
auto-open-selected={true}
level-indent={34}
style="height: 100%; width:100%;"
onCollapse={setCollapse}
>
{renderSubMenu()}
</a-menu>
);
},
});
</script>
<style lang="less" scoped>
:deep(.arco-menu-inner) {
.arco-menu-inline-header {
display: flex;
align-items: center;
}
.arco-icon {
&:not(.arco-icon-down) {
font-size: 18px;
}
}
.arco-menu-icon {
margin-right: 10px !important;
}
.arco-menu-indent-list {
width: 28px;
display: inline-block;
}
.arco-menu-title {
user-select: none;
}
}
</style>

View File

@@ -8,8 +8,10 @@ export default function useMenuTree() {
const appRoute = computed(() => { const appRoute = computed(() => {
return menuStore.appMenus; return menuStore.appMenus;
}); });
const menuTree = computed(() => { const menuTree = computed<RouteRecordNormalized[]>(() => {
const copyRouter = cloneDeep(appRoute.value) as RouteRecordNormalized[]; const copyRouter = cloneDeep(appRoute.value) as RouteRecordNormalized[];
// 排序
copyRouter.sort((a: RouteRecordNormalized, b: RouteRecordNormalized) => { copyRouter.sort((a: RouteRecordNormalized, b: RouteRecordNormalized) => {
return (a.meta.order || 0) - (b.meta.order || 0); return (a.meta.order || 0) - (b.meta.order || 0);
}); });

View File

@@ -10,11 +10,11 @@
<div class="pagination-wrapper"> <div class="pagination-wrapper">
<a-pagination v-if="pagination" <a-pagination v-if="pagination"
size="mini" size="mini"
v-model:current="(pagination as PaginationProps).current" v-model:current="(pagination as any).current"
v-model:page-size="(pagination as PaginationProps).pageSize" v-model:page-size="(pagination as any).pageSize"
v-bind="pagination as any" v-bind="pagination as any"
:auto-adjust="false" :auto-adjust="false"
@change="page => bubblesEmitter(HeaderEmitter.PAGE_CHANGE, page, (pagination as PaginationProps).pageSize)" @change="page => bubblesEmitter(HeaderEmitter.PAGE_CHANGE, page, (pagination as any).pageSize)"
@page-size-change="limit => bubblesEmitter(HeaderEmitter.PAGE_CHANGE, 1, limit)" /> @page-size-change="limit => bubblesEmitter(HeaderEmitter.PAGE_CHANGE, 1, limit)" />
</div> </div>
</div> </div>
@@ -104,7 +104,6 @@
</script> </script>
<script lang="ts" setup> <script lang="ts" setup>
import type { PaginationProps } from '@arco-design/web-vue';
import type { CardProps } from '../types/props'; import type { CardProps } from '../types/props';
import { ref, computed } from 'vue'; import { ref, computed } from 'vue';
import { useAppStore } from '@/store'; import { useAppStore } from '@/store';

View File

@@ -2,9 +2,9 @@
<a-layout class="layout" :class="{ mobile: appStore.hideMenu }"> <a-layout class="layout" :class="{ mobile: appStore.hideMenu }">
<!-- tab bar --> <!-- tab bar -->
<div v-if="navbar" class="layout-navbar"> <div v-if="navbar" class="layout-navbar">
<NavBar /> <nav-bar />
</div> </div>
<a-layout> <a-layout style="flex-direction: row;">
<!-- 左侧菜单栏 --> <!-- 左侧菜单栏 -->
<a-layout-sider v-if="renderMenu" <a-layout-sider v-if="renderMenu"
v-show="!hideMenu" v-show="!hideMenu"
@@ -17,7 +17,7 @@
:hide-trigger="true" :hide-trigger="true"
@collapse="setCollapsed"> @collapse="setCollapsed">
<div class="menu-wrapper"> <div class="menu-wrapper">
<menu-tree /> <system-menu-tree />
</div> </div>
</a-layout-sider> </a-layout-sider>
<!-- 顶部菜单栏 --> <!-- 顶部菜单栏 -->
@@ -29,12 +29,12 @@
mask-closable mask-closable
:closable="false" :closable="false"
@cancel="drawerCancel"> @cancel="drawerCancel">
<menu-tree style="padding: 12px 16px;" /> <system-menu-tree style="padding: 12px 16px;" />
</a-drawer> </a-drawer>
<!-- body --> <!-- body -->
<a-layout class="layout-content" :style="paddingStyle"> <a-layout class="layout-content" :style="paddingStyle">
<!-- 页签 --> <!-- 页签 -->
<TabBar v-if="appStore.tabBar" /> <tab-bar v-if="appStore.tabBar" />
<!-- 页面 --> <!-- 页面 -->
<a-layout-content style="height: 100%; width: 100%;"> <a-layout-content style="height: 100%; width: 100%;">
<!-- 水印 --> <!-- 水印 -->
@@ -43,11 +43,11 @@
:z-index="9999" :z-index="9999"
style="width: 100%; height: 100%;" style="width: 100%; height: 100%;"
:content="userStore.username || ''"> :content="userStore.username || ''">
<PageLayout /> <page-layout />
</a-watermark> </a-watermark>
</a-layout-content> </a-layout-content>
<!-- 页脚 --> <!-- 页脚 -->
<Footer v-if="visibleFooter" /> <footer v-if="visibleFooter" />
</a-layout> </a-layout>
</a-layout> </a-layout>
</a-layout> </a-layout>
@@ -60,17 +60,18 @@
import useResponsive from '@/hooks/responsive'; import useResponsive from '@/hooks/responsive';
import { toggleDrawerMenuKey } from '@/types/symbol'; import { toggleDrawerMenuKey } from '@/types/symbol';
import PageLayout from './page-layout.vue'; import PageLayout from './page-layout.vue';
import MenuTree from '@/components/system/menu/tree/index.vue';
import NavBar from '@/components/app/navbar/index.vue'; import NavBar from '@/components/app/navbar/index.vue';
import Footer from '@/components/app/footer/index.vue'; import Footer from '@/components/app/footer/index.vue';
import TabBar from '@/components/app/tab-bar/index.vue'; import TabBar from '@/components/app/tab-bar/index.vue';
import SystemMenuTree from '@/components/system/menu/tree/index.vue';
const isInit = ref(false);
const appStore = useAppStore(); const appStore = useAppStore();
const userStore = useUserStore(); const userStore = useUserStore();
const router = useRouter(); const router = useRouter();
const route = useRoute(); const route = useRoute();
useResponsive(true); useResponsive(true);
const isInit = ref(false);
const navbarHeight = `60px`; const navbarHeight = `60px`;
const navbar = computed(() => appStore.navbar); const navbar = computed(() => appStore.navbar);
const renderMenu = computed(() => appStore.menu && !appStore.topMenu); const renderMenu = computed(() => appStore.menu && !appStore.topMenu);

View File

@@ -1,9 +1,9 @@
import type { PaginationProps, TableRowSelection } from '@arco-design/web-vue'; import type { PaginationProps, TableRowSelection } from '@arco-design/web-vue';
import type { TableExpandable } from '@arco-design/web-vue/es/table/interface';
import { reactive } from 'vue'; import { reactive } from 'vue';
import { useAppStore } from '@/store'; import { useAppStore } from '@/store';
import { isNumber } from '@/utils/is'; import { isNumber } from '@/utils/is';
import { TablePageSizeOptions } from '@/types/const'; import { TablePageSizeOptions } from '@/types/const';
import { TableExpandable } from '@arco-design/web-vue/es/table/interface';
/** /**
* 创建列表分页 * 创建列表分页

View File

@@ -34,6 +34,7 @@
.flat(1) .flat(1)
.filter(s => s.meta) .filter(s => s.meta)
.map(s => s as RouteRecordNormalized) .map(s => s as RouteRecordNormalized)
.filter(s => s.meta.hideInMenu !== true)
.slice(0, 15); .slice(0, 15);
// 打开路由 // 打开路由