⬆️ 升级 arco 版本.
This commit is contained in:
@@ -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`
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
14
orion-ops-ui/pnpm-lock.yaml
generated
14
orion-ops-ui/pnpm-lock.yaml
generated
@@ -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)
|
||||||
|
|||||||
@@ -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';
|
||||||
|
|
||||||
|
|||||||
@@ -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" />
|
||||||
|
|||||||
@@ -1,21 +1,75 @@
|
|||||||
<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 appStore = useAppStore();
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
const { menuTree } = useMenuTree();
|
const { menuTree } = useMenuTree();
|
||||||
|
|
||||||
const collapsed = computed({
|
const collapsed = computed({
|
||||||
get() {
|
get() {
|
||||||
if (appStore.device === 'desktop') return appStore.menuCollapse;
|
if (appStore.device === 'desktop') return appStore.menuCollapse;
|
||||||
@@ -25,8 +79,8 @@
|
|||||||
appStore.updateSettings({ menuCollapse: value });
|
appStore.updateSettings({ menuCollapse: value });
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const topMenu = computed(() => appStore.topMenu);
|
const topMenu = computed(() => appStore.topMenu);
|
||||||
|
|
||||||
const openKeys = ref<string[]>([]);
|
const openKeys = ref<string[]>([]);
|
||||||
const selectedKey = ref<string[]>([]);
|
const selectedKey = ref<string[]>([]);
|
||||||
|
|
||||||
@@ -101,63 +155,6 @@
|
|||||||
appStore.updateSettings({ menuCollapse: val });
|
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>
|
</script>
|
||||||
|
|
||||||
<style lang="less" scoped>
|
<style lang="less" scoped>
|
||||||
|
|||||||
189
orion-ops-ui/src/components/system/menu/tree/index1.vue
Normal file
189
orion-ops-ui/src/components/system/menu/tree/index1.vue
Normal 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>
|
||||||
@@ -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);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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';
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建列表分页
|
* 创建列表分页
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
// 打开路由
|
// 打开路由
|
||||||
|
|||||||
Reference in New Issue
Block a user