diff --git a/src/assets/icons/ic_blank.svg b/src/assets/icons/ic_blank.svg
new file mode 100644
index 00000000..d187ec29
--- /dev/null
+++ b/src/assets/icons/ic_blank.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/assets/icons/ic_external.svg b/src/assets/icons/ic_external.svg
new file mode 100644
index 00000000..d38340e5
--- /dev/null
+++ b/src/assets/icons/ic_external.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/locales/lang/en_US/sys.json b/src/locales/lang/en_US/sys.json
index 69c22cd6..cc55176f 100644
--- a/src/locales/lang/en_US/sys.json
+++ b/src/locales/lang/en_US/sys.json
@@ -97,7 +97,11 @@
"menulevel_2a": "Menu Level 2a",
"menulevel_2b": "Menu Level 2b",
"menulevel_3a": "Menu Level 3a",
- "menulevel_3b": "Menu Level 3b"
+ "menulevel_3b": "Menu Level 3b",
+ "frame": "External",
+ "external_link": "External Link",
+ "iframe": "Iframe",
+ "blank": "Blank"
}
}
}
diff --git a/src/locales/lang/zh_CN/sys.json b/src/locales/lang/zh_CN/sys.json
index e690ef18..7b1275a3 100644
--- a/src/locales/lang/zh_CN/sys.json
+++ b/src/locales/lang/zh_CN/sys.json
@@ -96,7 +96,11 @@
"menulevel_2a": "菜单 2a",
"menulevel_2b": "菜单 2b",
"menulevel_3a": "菜单 3a",
- "menulevel_3b": "菜单 3b"
+ "menulevel_3b": "菜单 3b",
+ "frame": "外部链接",
+ "external_link": "外链",
+ "iframe": "内嵌",
+ "blank": "空白"
}
}
}
diff --git a/src/pages/sys/iframe/external-link.tsx b/src/pages/sys/iframe/external-link.tsx
new file mode 100644
index 00000000..4b0a517e
--- /dev/null
+++ b/src/pages/sys/iframe/external-link.tsx
@@ -0,0 +1,15 @@
+import { useLayoutEffect } from 'react';
+
+import { useRouter } from '@/router/hooks';
+
+type Props = {
+ to: string;
+};
+export default function ExternalLink({ to }: Props) {
+ const { back } = useRouter();
+ useLayoutEffect(() => {
+ window.open(to, '_black');
+ back();
+ });
+ return
;
+}
diff --git a/src/pages/sys/iframe/index.tsx b/src/pages/sys/iframe/index.tsx
new file mode 100644
index 00000000..3d464279
--- /dev/null
+++ b/src/pages/sys/iframe/index.tsx
@@ -0,0 +1,10 @@
+type Props = {
+ src: string;
+};
+export default function Iframe({ src = '' }: Props) {
+ return (
+
+
+
+ );
+}
diff --git a/src/router/routes/modules/others.tsx b/src/router/routes/modules/others.tsx
new file mode 100644
index 00000000..e9801648
--- /dev/null
+++ b/src/router/routes/modules/others.tsx
@@ -0,0 +1,49 @@
+import { lazy } from 'react';
+
+import Card from '@/components/card';
+import { SvgIcon } from '@/components/icon';
+
+import { AppRouteObject } from '#/router';
+
+const ExternalLink = lazy(() => import('@/pages/sys/iframe/external-link'));
+const Iframe = lazy(() => import('@/pages/sys/iframe'));
+
+const others: AppRouteObject[] = [
+ {
+ path: 'frame',
+ meta: {
+ title: 'sys.menu.frame',
+ icon: ,
+ key: '/frame',
+ },
+ children: [
+ {
+ path: 'external_link',
+ element: ,
+ meta: {
+ title: 'sys.menu.external_link',
+ key: '/frame/external_link',
+ },
+ },
+ {
+ path: 'iframe',
+ element: ,
+ meta: {
+ title: 'sys.menu.iframe',
+ key: '/frame/iframe',
+ },
+ },
+ ],
+ },
+ {
+ path: 'blank',
+ element: ,
+ meta: {
+ title: 'sys.menu.blank',
+ icon: ,
+ key: '/blank',
+ },
+ },
+];
+
+export default others;
diff --git a/src/router/utils.ts b/src/router/utils.ts
index f8b8ea2b..48e2665e 100644
--- a/src/router/utils.ts
+++ b/src/router/utils.ts
@@ -8,7 +8,7 @@ import { AppRouteObject, RouteMeta } from '#/router';
export const menuFilter = (items: AppRouteObject[]) => {
return items
.filter((item) => {
- const show = !item.meta?.hideMenu && item.path;
+ const show = !item.meta?.hideMenu && item.meta?.key;
if (show && item.children) {
item.children = menuFilter(item.children);
}
diff --git a/types/router.ts b/types/router.ts
index bec03c0f..60e4df88 100644
--- a/types/router.ts
+++ b/types/router.ts
@@ -2,7 +2,7 @@ import { ReactNode } from 'react';
import { RouteObject } from 'react-router-dom';
export interface RouteMeta {
- // unique
+ // antd menu selectedKeys
key: string;
title: string;
icon?: ReactNode;
@@ -14,10 +14,7 @@ export interface RouteMeta {
auth?: boolean;
}
export type AppRouteObject = {
- index?: boolean;
- path?: RouteObject['path'];
- element?: RouteObject['element'];
- children?: AppRouteObject[];
- meta?: RouteMeta;
order?: number;
-};
+ meta?: RouteMeta;
+ children?: AppRouteObject[];
+} & Omit;