fixed: 进入404页面不会触发获取菜单.

This commit is contained in:
lijiahang
2023-08-15 18:34:09 +08:00
parent fa8dc6d8fa
commit 4facfc66cd
12 changed files with 54 additions and 22 deletions

View File

@@ -33,13 +33,22 @@
/** /**
* 跳转 * 跳转
*/ */
const goto = (item: RouteRecordRaw) => { const goto = (e: any, item: RouteRecordRaw) => {
// //
if (regexUrl.test(item.path)) { if (regexUrl.test(item.path)) {
openWindow(item.path); openWindow(item.path);
selectedKey.value = [item.name as string]; selectedKey.value = [item.name as string];
return; return;
} }
//
if (e.ctrlKey) {
const { href } = router.resolve({
name: item.name,
});
openWindow(href);
selectedKey.value = [item.name as string];
return;
}
// selectedKey // selectedKey
const { hideInMenu, activeMenu } = item.meta as RouteMeta; const { hideInMenu, activeMenu } = item.meta as RouteMeta;
if (route.name === item.name && !hideInMenu && !activeMenu) { if (route.name === item.name && !hideInMenu && !activeMenu) {
@@ -124,7 +133,7 @@
<a-menu-item <a-menu-item
key={element?.name} key={element?.name}
v-slots={{ icon }} v-slots={{ icon }}
onClick={() => goto(element)} onClick={($event: any) => goto($event, element)}
> >
{element?.meta?.locale || ''} {element?.meta?.locale || ''}
</a-menu-item> </a-menu-item>

View File

@@ -192,7 +192,7 @@
import useLocale from '@/hooks/locale'; import useLocale from '@/hooks/locale';
import useUser from '@/hooks/user'; import useUser from '@/hooks/user';
import { triggerMouseEvent } from '@/utils'; import { triggerMouseEvent } from '@/utils';
import Menu from '@/components/menu/index.vue'; import Menu from '@/components/menu/tree/index.vue';
import MessageBox from '../message-box/index.vue'; import MessageBox from '../message-box/index.vue';
const appStore = useAppStore(); const appStore = useAppStore();

View File

@@ -1,6 +1,6 @@
import { RouteLocationNormalized, RouteRecordNormalized, RouteRecordRaw } from 'vue-router'; import { RouteLocationNormalized, RouteRecordNormalized, RouteRecordRaw } from 'vue-router';
import { useAppStore, useUserStore } from '@/store'; import { useAppStore, useUserStore } from '@/store';
import { WHITE_ROUTER_LIST } from '@/router/constants'; import { STATUS_ROUTER_LIST, WHITE_ROUTER_LIST } from '@/router/constants';
export default function usePermission() { export default function usePermission() {
const appStore = useAppStore(); const appStore = useAppStore();
@@ -10,8 +10,12 @@ export default function usePermission() {
* 是否可访问路由 * 是否可访问路由
*/ */
accessRouter(route: RouteLocationNormalized | RouteRecordRaw) { accessRouter(route: RouteLocationNormalized | RouteRecordRaw) {
// 没有名字证明路由不存在
if (route.name === undefined) {
return false;
}
// 检查路由是否存在于授权路由中 // 检查路由是否存在于授权路由中
const menuConfig = [...appStore.appAsyncMenus, ...WHITE_ROUTER_LIST]; const menuConfig = [...appStore.appAsyncMenus, ...WHITE_ROUTER_LIST, ...STATUS_ROUTER_LIST];
let exist = false; let exist = false;
while (menuConfig.length && !exist) { while (menuConfig.length && !exist) {
const element = menuConfig.shift(); const element = menuConfig.shift();

View File

@@ -52,7 +52,7 @@
import { useRoute, useRouter } from 'vue-router'; import { useRoute, useRouter } from 'vue-router';
import { useAppStore } from '@/store'; import { useAppStore } from '@/store';
import NavBar from '@/components/navbar/index.vue'; import NavBar from '@/components/navbar/index.vue';
import Menu from '@/components/menu/index.vue'; import Menu from '@/components/menu/tree/index.vue';
import Footer from '@/components/footer/index.vue'; import Footer from '@/components/footer/index.vue';
import TabBar from '@/components/tab-bar/index.vue'; import TabBar from '@/components/tab-bar/index.vue';
import useResponsive from '@/hooks/responsive'; import useResponsive from '@/hooks/responsive';

View File

@@ -18,9 +18,15 @@ export const DEFAULT_ROUTE_FULL_PATH = '/dashboard/workplace';
*/ */
export const WHITE_ROUTER_LIST = [ export const WHITE_ROUTER_LIST = [
{ name: LOGIN_ROUTE_NAME, children: [] }, { name: LOGIN_ROUTE_NAME, children: [] },
{ name: REDIRECT_ROUTE_NAME, children: [] },
];
/**
* 状态路由
*/
export const STATUS_ROUTER_LIST = [
{ name: NOT_FOUND_ROUTER_NAME, children: [] }, { name: NOT_FOUND_ROUTER_NAME, children: [] },
{ name: FORBIDDEN_ROUTER_NAME, children: [] }, { name: FORBIDDEN_ROUTER_NAME, children: [] },
{ name: REDIRECT_ROUTE_NAME, children: [] },
]; ];
/** /**

View File

@@ -53,7 +53,7 @@ export const REDIRECT_ROUTER: RouteRecordRaw = {
* 403 页面 * 403 页面
*/ */
export const FORBIDDEN_ROUTE: RouteRecordRaw = { export const FORBIDDEN_ROUTE: RouteRecordRaw = {
path: '/:pathMatch(.*)*', path: '/403',
name: FORBIDDEN_ROUTER_NAME, name: FORBIDDEN_ROUTER_NAME,
component: () => import('@/views/exception/forbidden/index.vue'), component: () => import('@/views/exception/forbidden/index.vue'),
}; };
@@ -62,7 +62,8 @@ export const FORBIDDEN_ROUTE: RouteRecordRaw = {
* 404 页面 * 404 页面
*/ */
export const NOT_FOUND_ROUTE: RouteRecordRaw = { export const NOT_FOUND_ROUTE: RouteRecordRaw = {
path: '/:pathMatch(.*)*', // path: '/:pathMatch(.*)*',
path: '/404',
name: NOT_FOUND_ROUTER_NAME, name: NOT_FOUND_ROUTER_NAME,
component: () => import('@/views/exception/not-found/index.vue'), component: () => import('@/views/exception/not-found/index.vue'),
}; };

View File

@@ -7,14 +7,14 @@ const USER: AppRouteRecordRaw = {
component: DEFAULT_LAYOUT, component: DEFAULT_LAYOUT,
children: [ children: [
{ {
path: '/user/userChild1', name: 'userRole',
name: 'userChild1', path: '/user/role',
component: () => import('@/views/user/child1/index.vue'), component: () => import('@/views/user/role/index.vue'),
}, },
{ {
path: '/user/userChild2', name: 'userUser',
name: 'userChild2', path: '/user/user',
component: () => import('@/views/user/child2/index.vue'), component: () => import('@/views/user/user/index.vue'),
}, },
], ],
}; };

View File

@@ -114,8 +114,9 @@
import { MenuTypeEnum, MenuVisibleEnum, MenuCacheEnum } from '../types/enum.types'; import { MenuTypeEnum, MenuVisibleEnum, MenuCacheEnum } from '../types/enum.types';
import { toOptions } from '@/utils/enum'; import { toOptions } from '@/utils/enum';
import IconPicker from '@sanqi377/arco-vue-icon-picker'; import IconPicker from '@sanqi377/arco-vue-icon-picker';
import MenuTreeSelector from '@/views/system/menu/components/menu-tree-selector.vue'; import MenuTreeSelector from './menu-tree-selector.vue';
import { createMenu, updateMenu } from '@/api/system/menu'; import { createMenu, updateMenu } from '@/api/system/menu';
import { Message } from '@arco-design/web-vue';
const { visible, setVisible } = useVisible(); const { visible, setVisible } = useVisible();
const { loading, setLoading } = useLoading(); const { loading, setLoading } = useLoading();
@@ -155,7 +156,11 @@
const openAdd = (record: any) => { const openAdd = (record: any) => {
title.value = '添加菜单'; title.value = '添加菜单';
isAddHandle.value = true; isAddHandle.value = true;
renderForm({ ...defaultForm(), ...record }); renderForm({ ...defaultForm(), parentId: record.parentId });
// 如果是父菜单默认选中子菜单 如果是子菜单默认选中功能
if (record.type === 1 || record.type === 2) {
formModel.type = record.type + 1;
}
setVisible(true); setVisible(true);
}; };
@@ -185,13 +190,20 @@
if (error) { if (error) {
return false; return false;
} }
if (formModel.parentId === 0
&& (formModel.type === MenuTypeEnum.SUB_MENU.value || formModel.type === MenuTypeEnum.FUNCTION.value)) {
Message.error('创建子目录或功能时 父菜单不能为根目录');
return false;
}
if (isAddHandle.value) { if (isAddHandle.value) {
// 新增 // 新增
await createMenu(formModel as any); await createMenu(formModel as any);
Message.success('创建成功');
emits('added'); emits('added');
} else { } else {
// 修改 // 修改
await updateMenu(formModel as any); await updateMenu(formModel as any);
Message.success('修改成功');
emits('updated'); emits('updated');
} }
// 清空 // 清空

View File

@@ -122,7 +122,7 @@
size="mini" size="mini"
v-if="record.type !== MenuTypeEnum.FUNCTION.value" v-if="record.type !== MenuTypeEnum.FUNCTION.value"
v-permission="['infra:system-menu:create']" v-permission="['infra:system-menu:create']"
@click="emits('openAdd', { parentId: record.id })"> @click="emits('openAdd', { parentId: record.id, type: record.type })">
新增 新增
</a-button> </a-button>
<!-- 修改 --> <!-- 修改 -->
@@ -276,7 +276,7 @@
await loadMenuData(); await loadMenuData();
}; };
// 卸载时清除 store // 卸载时清除 menu cache
onUnmounted(() => { onUnmounted(() => {
cacheStore.resetMenu(); cacheStore.resetMenu();
}); });

View File

@@ -4,7 +4,7 @@
:disabled="disabled" :disabled="disabled"
:allow-search="true" :allow-search="true"
:filter-tree-node="filterTreeNode" :filter-tree-node="filterTreeNode"
placeholder="请选择上级菜单" /> placeholder="请选择菜单" />
</template> </template>
<script lang="ts"> <script lang="ts">
@@ -20,7 +20,7 @@
const props = defineProps({ const props = defineProps({
modelValue: Number, modelValue: Number,
disabled: Boolean disabled: Boolean,
}); });
const emits = defineEmits(['update:modelValue']); const emits = defineEmits(['update:modelValue']);

View File

@@ -4,7 +4,7 @@
<menu-table ref="table" <menu-table ref="table"
@openAdd="(e) => modal.openAdd(e)" @openAdd="(e) => modal.openAdd(e)"
@openUpdate="(e) => modal.openUpdate(e)" /> @openUpdate="(e) => modal.openUpdate(e)" />
<!-- 添加修改框 --> <!-- 添加修改模态 -->
<menu-form-modal ref="modal" <menu-form-modal ref="modal"
@added="() => table.addedCallback()" @added="() => table.addedCallback()"
@updated="() => table.updatedCallback()" /> @updated="() => table.updatedCallback()" />