mirror of
				https://github.com/pure-admin/vue-pure-admin.git
				synced 2025-11-03 13:44:47 +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