diff --git a/orion-ops-ui/src/components/menu/index.vue b/orion-ops-ui/src/components/menu/tree/index.vue
similarity index 93%
rename from orion-ops-ui/src/components/menu/index.vue
rename to orion-ops-ui/src/components/menu/tree/index.vue
index c57aff1b..692b69eb 100644
--- a/orion-ops-ui/src/components/menu/index.vue
+++ b/orion-ops-ui/src/components/menu/tree/index.vue
@@ -33,13 +33,22 @@
/**
* 跳转
*/
- const goto = (item: RouteRecordRaw) => {
+ const goto = (e: any, item: RouteRecordRaw) => {
// 打开外链
if (regexUrl.test(item.path)) {
openWindow(item.path);
selectedKey.value = [item.name as string];
return;
}
+ // 新页面打开
+ if (e.ctrlKey) {
+ const { href } = router.resolve({
+ name: item.name,
+ });
+ openWindow(href);
+ selectedKey.value = [item.name as string];
+ return;
+ }
// 设置 selectedKey
const { hideInMenu, activeMenu } = item.meta as RouteMeta;
if (route.name === item.name && !hideInMenu && !activeMenu) {
@@ -124,7 +133,7 @@
goto(element)}
+ onClick={($event: any) => goto($event, element)}
>
{element?.meta?.locale || ''}
diff --git a/orion-ops-ui/src/components/menu/use-menu-tree.ts b/orion-ops-ui/src/components/menu/tree/use-menu-tree.ts
similarity index 100%
rename from orion-ops-ui/src/components/menu/use-menu-tree.ts
rename to orion-ops-ui/src/components/menu/tree/use-menu-tree.ts
diff --git a/orion-ops-ui/src/components/navbar/index.vue b/orion-ops-ui/src/components/navbar/index.vue
index 7368488a..04184695 100644
--- a/orion-ops-ui/src/components/navbar/index.vue
+++ b/orion-ops-ui/src/components/navbar/index.vue
@@ -192,7 +192,7 @@
import useLocale from '@/hooks/locale';
import useUser from '@/hooks/user';
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';
const appStore = useAppStore();
diff --git a/orion-ops-ui/src/hooks/permission.ts b/orion-ops-ui/src/hooks/permission.ts
index 17c645fc..b6fe4216 100644
--- a/orion-ops-ui/src/hooks/permission.ts
+++ b/orion-ops-ui/src/hooks/permission.ts
@@ -1,6 +1,6 @@
import { RouteLocationNormalized, RouteRecordNormalized, RouteRecordRaw } from 'vue-router';
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() {
const appStore = useAppStore();
@@ -10,8 +10,12 @@ export default function usePermission() {
* 是否可访问路由
*/
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;
while (menuConfig.length && !exist) {
const element = menuConfig.shift();
diff --git a/orion-ops-ui/src/layout/default-layout.vue b/orion-ops-ui/src/layout/default-layout.vue
index d4063e4e..5e7c3872 100644
--- a/orion-ops-ui/src/layout/default-layout.vue
+++ b/orion-ops-ui/src/layout/default-layout.vue
@@ -52,7 +52,7 @@
import { useRoute, useRouter } from 'vue-router';
import { useAppStore } from '@/store';
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 TabBar from '@/components/tab-bar/index.vue';
import useResponsive from '@/hooks/responsive';
diff --git a/orion-ops-ui/src/router/constants.ts b/orion-ops-ui/src/router/constants.ts
index ecc7fc43..a3d74a6e 100644
--- a/orion-ops-ui/src/router/constants.ts
+++ b/orion-ops-ui/src/router/constants.ts
@@ -18,9 +18,15 @@ export const DEFAULT_ROUTE_FULL_PATH = '/dashboard/workplace';
*/
export const WHITE_ROUTER_LIST = [
{ name: LOGIN_ROUTE_NAME, children: [] },
+ { name: REDIRECT_ROUTE_NAME, children: [] },
+];
+
+/**
+ * 状态路由
+ */
+export const STATUS_ROUTER_LIST = [
{ name: NOT_FOUND_ROUTER_NAME, children: [] },
{ name: FORBIDDEN_ROUTER_NAME, children: [] },
- { name: REDIRECT_ROUTE_NAME, children: [] },
];
/**
diff --git a/orion-ops-ui/src/router/routes/base.ts b/orion-ops-ui/src/router/routes/base.ts
index 07d751fc..b0186ea4 100644
--- a/orion-ops-ui/src/router/routes/base.ts
+++ b/orion-ops-ui/src/router/routes/base.ts
@@ -53,7 +53,7 @@ export const REDIRECT_ROUTER: RouteRecordRaw = {
* 403 页面
*/
export const FORBIDDEN_ROUTE: RouteRecordRaw = {
- path: '/:pathMatch(.*)*',
+ path: '/403',
name: FORBIDDEN_ROUTER_NAME,
component: () => import('@/views/exception/forbidden/index.vue'),
};
@@ -62,7 +62,8 @@ export const FORBIDDEN_ROUTE: RouteRecordRaw = {
* 404 页面
*/
export const NOT_FOUND_ROUTE: RouteRecordRaw = {
- path: '/:pathMatch(.*)*',
+ // path: '/:pathMatch(.*)*',
+ path: '/404',
name: NOT_FOUND_ROUTER_NAME,
component: () => import('@/views/exception/not-found/index.vue'),
};
diff --git a/orion-ops-ui/src/router/routes/modules/user.ts b/orion-ops-ui/src/router/routes/modules/user.ts
index 8c8739f5..ed955d92 100644
--- a/orion-ops-ui/src/router/routes/modules/user.ts
+++ b/orion-ops-ui/src/router/routes/modules/user.ts
@@ -7,14 +7,14 @@ const USER: AppRouteRecordRaw = {
component: DEFAULT_LAYOUT,
children: [
{
- path: '/user/userChild1',
- name: 'userChild1',
- component: () => import('@/views/user/child1/index.vue'),
+ name: 'userRole',
+ path: '/user/role',
+ component: () => import('@/views/user/role/index.vue'),
},
{
- path: '/user/userChild2',
- name: 'userChild2',
- component: () => import('@/views/user/child2/index.vue'),
+ name: 'userUser',
+ path: '/user/user',
+ component: () => import('@/views/user/user/index.vue'),
},
],
};
diff --git a/orion-ops-ui/src/views/system/menu/components/menu-form-modal.vue b/orion-ops-ui/src/views/system/menu/components/menu-form-modal.vue
index 37b578f9..a04cf4f8 100644
--- a/orion-ops-ui/src/views/system/menu/components/menu-form-modal.vue
+++ b/orion-ops-ui/src/views/system/menu/components/menu-form-modal.vue
@@ -114,8 +114,9 @@
import { MenuTypeEnum, MenuVisibleEnum, MenuCacheEnum } from '../types/enum.types';
import { toOptions } from '@/utils/enum';
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 { Message } from '@arco-design/web-vue';
const { visible, setVisible } = useVisible();
const { loading, setLoading } = useLoading();
@@ -155,7 +156,11 @@
const openAdd = (record: any) => {
title.value = '添加菜单';
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);
};
@@ -185,13 +190,20 @@
if (error) {
return false;
}
+ if (formModel.parentId === 0
+ && (formModel.type === MenuTypeEnum.SUB_MENU.value || formModel.type === MenuTypeEnum.FUNCTION.value)) {
+ Message.error('创建子目录或功能时 父菜单不能为根目录');
+ return false;
+ }
if (isAddHandle.value) {
// 新增
await createMenu(formModel as any);
+ Message.success('创建成功');
emits('added');
} else {
// 修改
await updateMenu(formModel as any);
+ Message.success('修改成功');
emits('updated');
}
// 清空
diff --git a/orion-ops-ui/src/views/system/menu/components/menu-table.vue b/orion-ops-ui/src/views/system/menu/components/menu-table.vue
index 9a559baa..1f93e3a2 100644
--- a/orion-ops-ui/src/views/system/menu/components/menu-table.vue
+++ b/orion-ops-ui/src/views/system/menu/components/menu-table.vue
@@ -122,7 +122,7 @@
size="mini"
v-if="record.type !== MenuTypeEnum.FUNCTION.value"
v-permission="['infra:system-menu:create']"
- @click="emits('openAdd', { parentId: record.id })">
+ @click="emits('openAdd', { parentId: record.id, type: record.type })">
新增
@@ -276,7 +276,7 @@
await loadMenuData();
};
- // 卸载时清除 store
+ // 卸载时清除 menu cache
onUnmounted(() => {
cacheStore.resetMenu();
});
diff --git a/orion-ops-ui/src/views/system/menu/components/menu-tree-selector.vue b/orion-ops-ui/src/views/system/menu/components/menu-tree-selector.vue
index 525e982b..d620582c 100644
--- a/orion-ops-ui/src/views/system/menu/components/menu-tree-selector.vue
+++ b/orion-ops-ui/src/views/system/menu/components/menu-tree-selector.vue
@@ -4,7 +4,7 @@
:disabled="disabled"
:allow-search="true"
:filter-tree-node="filterTreeNode"
- placeholder="请选择上级菜单" />
+ placeholder="请选择菜单" />