mirror of
https://github.com/pure-admin/vue-pure-admin.git
synced 2025-06-08 01:17:23 +08:00
feat: add iframe router
This commit is contained in:
parent
37762e45fd
commit
e3fda52801
@ -64,6 +64,38 @@ const permissionRouter = {
|
|||||||
]
|
]
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const frameRouter = {
|
||||||
|
path: "/iframe",
|
||||||
|
name: "reFrame",
|
||||||
|
redirect: "/iframe/pure",
|
||||||
|
meta: {
|
||||||
|
icon: "monitor",
|
||||||
|
title: "menus.hsExternalPage",
|
||||||
|
i18n: true,
|
||||||
|
rank: 10
|
||||||
|
},
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
path: "/frame/pure",
|
||||||
|
name: "reFramePure",
|
||||||
|
meta: {
|
||||||
|
i18n: true,
|
||||||
|
title: "menus.hsPureDocument",
|
||||||
|
frameSrc: "https://pure-admin-doc.vercel.app"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: "/iframe/ep",
|
||||||
|
name: "reFrameEp",
|
||||||
|
meta: {
|
||||||
|
i18n: true,
|
||||||
|
title: "menus.hsEpDocument",
|
||||||
|
frameSrc: "https://element-plus.gitee.io/zh-CN/"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
const tabsRouter = {
|
const tabsRouter = {
|
||||||
path: "/tabs",
|
path: "/tabs",
|
||||||
name: "reTabs",
|
name: "reTabs",
|
||||||
@ -72,7 +104,7 @@ const tabsRouter = {
|
|||||||
icon: "IF-team-icontabs",
|
icon: "IF-team-icontabs",
|
||||||
title: "menus.hstabs",
|
title: "menus.hstabs",
|
||||||
i18n: true,
|
i18n: true,
|
||||||
rank: 10
|
rank: 11
|
||||||
},
|
},
|
||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
@ -113,6 +145,7 @@ export default [
|
|||||||
code: 0,
|
code: 0,
|
||||||
info: [
|
info: [
|
||||||
tabsRouter,
|
tabsRouter,
|
||||||
|
frameRouter,
|
||||||
systemRouter,
|
systemRouter,
|
||||||
setDifAuthority("v-admin", permissionRouter)
|
setDifAuthority("v-admin", permissionRouter)
|
||||||
]
|
]
|
||||||
|
@ -24,6 +24,7 @@ import Location from "@iconify-icons/ep/location";
|
|||||||
import Tickets from "@iconify-icons/ep/tickets";
|
import Tickets from "@iconify-icons/ep/tickets";
|
||||||
import OfficeBuilding from "@iconify-icons/ep/office-building";
|
import OfficeBuilding from "@iconify-icons/ep/office-building";
|
||||||
import Notebook from "@iconify-icons/ep/notebook";
|
import Notebook from "@iconify-icons/ep/notebook";
|
||||||
|
import Monitor from "@iconify-icons/ep/monitor";
|
||||||
addIcon("check", Check);
|
addIcon("check", Check);
|
||||||
addIcon("menu", Menu);
|
addIcon("menu", Menu);
|
||||||
addIcon("home-filled", HomeFilled);
|
addIcon("home-filled", HomeFilled);
|
||||||
@ -46,6 +47,7 @@ addIcon("location", Location);
|
|||||||
addIcon("tickets", Tickets);
|
addIcon("tickets", Tickets);
|
||||||
addIcon("office-building", OfficeBuilding);
|
addIcon("office-building", OfficeBuilding);
|
||||||
addIcon("notebook", Notebook);
|
addIcon("notebook", Notebook);
|
||||||
|
addIcon("monitor", Monitor);
|
||||||
|
|
||||||
// remixicon
|
// remixicon
|
||||||
import arrowRightSLine from "@iconify-icons/ri/arrow-right-s-line";
|
import arrowRightSLine from "@iconify-icons/ri/arrow-right-s-line";
|
||||||
|
58
src/layout/frameView.vue
Normal file
58
src/layout/frameView.vue
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
<template>
|
||||||
|
<div class="frame" v-loading="loading">
|
||||||
|
<iframe :src="frameSrc" class="frame-iframe" ref="frameRef"></iframe>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import { ref, unref, onMounted, nextTick } from "vue";
|
||||||
|
import { useRoute } from "vue-router";
|
||||||
|
|
||||||
|
const currentRoute = useRoute();
|
||||||
|
const loading = ref(false);
|
||||||
|
const frameRef = ref<HTMLElement | null>(null);
|
||||||
|
const frameSrc = ref<string>("");
|
||||||
|
|
||||||
|
if (unref(currentRoute.meta)?.frameSrc) {
|
||||||
|
frameSrc.value = unref(currentRoute.meta)?.frameSrc as string;
|
||||||
|
}
|
||||||
|
|
||||||
|
function hideLoading() {
|
||||||
|
loading.value = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function init() {
|
||||||
|
nextTick(() => {
|
||||||
|
const iframe = unref(frameRef);
|
||||||
|
if (!iframe) return;
|
||||||
|
const _frame = iframe as any;
|
||||||
|
if (_frame.attachEvent) {
|
||||||
|
_frame.attachEvent("onload", () => {
|
||||||
|
hideLoading();
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
iframe.onload = () => {
|
||||||
|
hideLoading();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
loading.value = true;
|
||||||
|
init();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.frame {
|
||||||
|
height: 100vh;
|
||||||
|
|
||||||
|
&-iframe {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
border: 0;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
@ -36,5 +36,8 @@ export default {
|
|||||||
externalLink: "External Link",
|
externalLink: "External Link",
|
||||||
hsAble: "Able",
|
hsAble: "Able",
|
||||||
hsMenuTree: "Menu Tree",
|
hsMenuTree: "Menu Tree",
|
||||||
hsWatermark: "Water Mark"
|
hsWatermark: "Water Mark",
|
||||||
|
hsExternalPage: "External Page",
|
||||||
|
hsPureDocument: "Pure Document",
|
||||||
|
hsEpDocument: "Element Plus Document"
|
||||||
};
|
};
|
||||||
|
@ -36,5 +36,8 @@ export default {
|
|||||||
externalLink: "外链",
|
externalLink: "外链",
|
||||||
hsAble: "功能",
|
hsAble: "功能",
|
||||||
hsMenuTree: "菜单树结构",
|
hsMenuTree: "菜单树结构",
|
||||||
hsWatermark: "水印"
|
hsWatermark: "水印",
|
||||||
|
hsExternalPage: "外部页面",
|
||||||
|
hsPureDocument: "平台文档",
|
||||||
|
hsEpDocument: "Element Plus文档"
|
||||||
};
|
};
|
||||||
|
@ -13,6 +13,7 @@ import { RouteConfigs } from "/@/layout/types";
|
|||||||
import { buildHierarchyTree } from "/@/utils/tree";
|
import { buildHierarchyTree } from "/@/utils/tree";
|
||||||
import { usePermissionStoreHook } from "/@/store/modules/permission";
|
import { usePermissionStoreHook } from "/@/store/modules/permission";
|
||||||
const Layout = () => import("/@/layout/index.vue");
|
const Layout = () => import("/@/layout/index.vue");
|
||||||
|
const IFrame = () => import("/@/layout/frameView.vue");
|
||||||
// https://cn.vitejs.dev/guide/features.html#glob-import
|
// https://cn.vitejs.dev/guide/features.html#glob-import
|
||||||
const modulesRoutes = import.meta.glob("/src/views/**/*.{vue,tsx}");
|
const modulesRoutes = import.meta.glob("/src/views/**/*.{vue,tsx}");
|
||||||
|
|
||||||
@ -218,6 +219,8 @@ function addAsyncRoutes(arrRoutes: Array<RouteRecordRaw>) {
|
|||||||
arrRoutes.forEach((v: RouteRecordRaw) => {
|
arrRoutes.forEach((v: RouteRecordRaw) => {
|
||||||
if (v.redirect) {
|
if (v.redirect) {
|
||||||
v.component = Layout;
|
v.component = Layout;
|
||||||
|
} else if (v.meta?.frameSrc) {
|
||||||
|
v.component = IFrame;
|
||||||
} else {
|
} else {
|
||||||
const index = modulesRoutesKeys.findIndex(ev => ev.includes(v.path));
|
const index = modulesRoutesKeys.findIndex(ev => ev.includes(v.path));
|
||||||
v.component = modulesRoutes[modulesRoutesKeys[index]];
|
v.component = modulesRoutes[modulesRoutesKeys[index]];
|
||||||
|
Loading…
x
Reference in New Issue
Block a user