src/components/HeaderSearch/index.vue
@@ -36,7 +36,7 @@ const fuse = ref(); const headerSearchSelectRef = ref<ElSelectInstance>(); const router = useRouter(); const routes = computed(() => usePermissionStore().routes); const routes = computed(() => usePermissionStore().getRoutes()); const click = () => { show.value = !show.value; @@ -149,7 +149,7 @@ } }); watch(searchPool, (list) => { watch(searchPool, (list: Router) => { initFuse(list); }); </script> src/components/ImageUpload/index.vue
@@ -81,14 +81,14 @@ watch( () => props.modelValue, async (val) => { async (val: string) => { if (val) { // 首先将值转为数组 let list: OssVO[] = []; if (Array.isArray(val)) { list = val as OssVO[]; } else { const res = await listByIds(val as string); const res = await listByIds(val); list = res.data; } // 然后将数组转为对象数组 src/components/TopNav/index.vue
@@ -43,7 +43,7 @@ // 主题颜色 const theme = computed(() => settingsStore.theme); // 所有的路由信息 const routers = computed(() => permissionStore.topbarRouters); const routers = computed(() => permissionStore.getTopbarRoutes()); // 顶部显示菜单 const topMenus = computed(() => { src/layout/components/AppMain.vue
@@ -12,8 +12,9 @@ </template> <script setup name="AppMain" lang="ts"> import useTagsViewStore from '@/store/modules/tagsView'; import useSettingsStore from '@/store/modules/settings'; import useTagsViewStore from '@/store/modules/tagsView'; import IframeToggle from './IframeToggle/index.vue'; const { proxy } = getCurrentInstance() as ComponentInternalInstance; const tagsViewStore = useTagsViewStore(); src/layout/components/IframeToggle/index.vue
@@ -10,6 +10,7 @@ <script setup lang="ts"> import InnerLink from '../InnerLink/index.vue'; import useTagsViewStore from '@/store/modules/tagsView'; const route = useRoute(); src/layout/components/Sidebar/index.vue
@@ -35,7 +35,7 @@ const appStore = useAppStore(); const settingsStore = useSettingsStore(); const permissionStore = usePermissionStore(); const sidebarRouters = computed<RouteRecordRaw[]>(() => permissionStore.sidebarRouters); const sidebarRouters = computed<RouteRecordRaw[]>(() => permissionStore.getSidebarRoutes()); const showLogo = computed(() => settingsStore.sidebarLogo); const sideTheme = computed(() => settingsStore.sideTheme); const theme = computed(() => settingsStore.theme); src/layout/components/TagsView/ScrollPane.vue
@@ -5,13 +5,13 @@ </template> <script setup lang="ts"> import { RouteLocationNormalized } from 'vue-router'; import useTagsViewStore from '@/store/modules/tagsView'; import { TagView } from 'vue-router'; const tagAndTagSpacing = ref(4); const scrollContainerRef = ref<ElScrollbarInstance>(); const scrollWrapper = computed(() => scrollContainerRef.value?.$refs.wrapRef as any); const scrollWrapper = computed(() => scrollContainerRef.value?.$refs.wrapRef); onMounted(() => { scrollWrapper.value?.addEventListener('scroll', emitScroll, true); @@ -33,7 +33,7 @@ const tagsViewStore = useTagsViewStore(); const visitedViews = computed(() => tagsViewStore.visitedViews); const moveToTarget = (currentTag: TagView) => { const moveToTarget = (currentTag: RouteLocationNormalized) => { const $container = scrollContainerRef.value?.$el; const $containerWidth = $container.offsetWidth; const $scrollWrapper = scrollWrapper.value; src/layout/components/TagsView/index.vue
@@ -32,24 +32,24 @@ <script setup lang="ts"> import ScrollPane from './ScrollPane.vue'; import { getNormalPath } from '@/utils/ruoyi'; import useTagsViewStore from '@/store/modules/tagsView'; import useSettingsStore from '@/store/modules/settings'; import usePermissionStore from '@/store/modules/permission'; import { RouteRecordRaw, TagView } from 'vue-router'; import useTagsViewStore from '@/store/modules/tagsView'; import { RouteRecordRaw, RouteLocationNormalized } from 'vue-router'; const visible = ref(false); const top = ref(0); const left = ref(0); const selectedTag = ref<TagView>({}); const affixTags = ref<TagView[]>([]); const selectedTag = ref<RouteLocationNormalized>(); const affixTags = ref<RouteLocationNormalized[]>([]); const scrollPaneRef = ref<InstanceType<typeof ScrollPane>>(); const { proxy } = getCurrentInstance() as ComponentInternalInstance; const route = useRoute(); const router = useRouter(); const visitedViews = computed(() => useTagsViewStore().visitedViews); const routes = computed(() => usePermissionStore().routes); const visitedViews = computed(() => useTagsViewStore().getVisitedViews()); const routes = computed(() => usePermissionStore().getRoutes()); const theme = computed(() => useSettingsStore().theme); watch(route, () => { @@ -64,18 +64,18 @@ } }); const isActive = (r: TagView): boolean => { const isActive = (r: RouteLocationNormalized): boolean => { return r.path === route.path; }; const activeStyle = (tag: TagView) => { const activeStyle = (tag: RouteLocationNormalized) => { if (!isActive(tag)) return {}; return { 'background-color': theme.value, 'border-color': theme.value }; }; const isAffix = (tag: TagView) => { return tag.meta && tag.meta.affix; const isAffix = (tag: RouteLocationNormalized) => { return tag?.meta && tag?.meta?.affix; }; const isFirstView = () => { try { @@ -92,12 +92,17 @@ } }; const filterAffixTags = (routes: RouteRecordRaw[], basePath = '') => { let tags: TagView[] = []; let tags: RouteLocationNormalized[] = []; routes.forEach((route) => { if (route.meta && route.meta.affix) { const tagPath = getNormalPath(basePath + '/' + route.path); tags.push({ hash: '', matched: [], params: undefined, query: undefined, redirectedFrom: undefined, fullPath: tagPath, path: tagPath, name: route.name as string, @@ -114,7 +119,7 @@ return tags; }; const initTags = () => { const res = filterAffixTags(routes.value as any); const res = filterAffixTags(routes.value); affixTags.value = res; for (const tag of res) { // Must have tag name @@ -143,19 +148,19 @@ scrollPaneRef.value?.moveToTarget(r); // when query is different then update if (r.fullPath !== route.fullPath) { useTagsViewStore().updateVisitedView(route as any); useTagsViewStore().updateVisitedView(route); } } } }); }; const refreshSelectedTag = (view: TagView) => { const refreshSelectedTag = (view: RouteLocationNormalized) => { proxy?.$tab.refreshPage(view); if (route.meta.link) { useTagsViewStore().delIframeView(route as any); useTagsViewStore().delIframeView(route); } }; const closeSelectedTag = (view: TagView) => { const closeSelectedTag = (view: RouteLocationNormalized) => { proxy?.$tab.closePage(view).then(({ visitedViews }: any) => { if (isActive(view)) { toLastView(visitedViews, view); @@ -163,15 +168,15 @@ }); }; const closeRightTags = () => { proxy?.$tab.closeRightPage(selectedTag.value).then((visitedViews: TagView[]) => { if (!visitedViews.find((i: TagView) => i.fullPath === route.fullPath)) { proxy?.$tab.closeRightPage(selectedTag.value).then((visitedViews: RouteLocationNormalized[]) => { if (!visitedViews.find((i: RouteLocationNormalized) => i.fullPath === route.fullPath)) { toLastView(visitedViews); } }); }; const closeLeftTags = () => { proxy?.$tab.closeLeftPage(selectedTag.value).then((visitedViews: TagView[]) => { if (!visitedViews.find((i: TagView) => i.fullPath === route.fullPath)) { proxy?.$tab.closeLeftPage(selectedTag.value).then((visitedViews: RouteLocationNormalized[]) => { if (!visitedViews.find((i: RouteLocationNormalized) => i.fullPath === route.fullPath)) { toLastView(visitedViews); } }); @@ -182,7 +187,7 @@ moveToCurrentTag(); }); }; const closeAllTags = (view: TagView) => { const closeAllTags = (view: RouteLocationNormalized) => { proxy?.$tab.closeAllPage().then(({ visitedViews }) => { if (affixTags.value.some((tag) => tag.path === route.path)) { return; @@ -190,7 +195,7 @@ toLastView(visitedViews, view); }); }; const toLastView = (visitedViews: TagView[], view?: TagView) => { const toLastView = (visitedViews: RouteLocationNormalized[], view?: RouteLocationNormalized) => { const latestView = visitedViews.slice(-1)[0]; if (latestView) { router.push(latestView.fullPath as string); @@ -205,7 +210,7 @@ } } }; const openMenu = (tag: TagView, e: MouseEvent) => { const openMenu = (tag: RouteLocationNormalized, e: MouseEvent) => { const menuMinWidth = 105; const offsetLeft = proxy?.$el.getBoundingClientRect().left; // container margin left const offsetWidth = proxy?.$el.offsetWidth; // container width src/plugins/tab.ts
@@ -1,19 +1,29 @@ import { useTagsViewStore } from '@/store/modules/tagsView'; import router from '@/router'; import { TagView, RouteLocationMatched } from 'vue-router'; import { RouteLocationMatched, RouteLocationNormalized } from 'vue-router'; import useTagsViewStore from '@/store/modules/tagsView'; export default { /** * 刷新当前tab页签 * @param obj 标签对象 */ async refreshPage(obj?: TagView): Promise<void> { async refreshPage(obj?: RouteLocationNormalized): Promise<void> { const { path, query, matched } = router.currentRoute.value; if (obj === undefined) { matched.forEach((m: RouteLocationMatched) => { if (m.components && m.components.default && m.components.default.name) { if (!['Layout', 'ParentView'].includes(m.components.default.name)) { obj = { name: m.components.default.name, path: path, query: query }; obj = { name: m.components.default.name, path: path, query: query, matched: undefined, fullPath: undefined, hash: undefined, params: undefined, redirectedFrom: undefined, meta: undefined }; } } }); @@ -31,20 +41,20 @@ }); }, // 关闭当前tab页签,打开新页签 closeOpenPage(obj: TagView): void { useTagsViewStore().delView(router.currentRoute.value as any); closeOpenPage(obj: RouteLocationNormalized): void { useTagsViewStore().delView(router.currentRoute.value); if (obj !== undefined) { router.push(obj); } }, // 关闭指定tab页签 async closePage(obj?: TagView): Promise<{ visitedViews: TagView[]; cachedViews: string[] } | any> { async closePage(obj?: RouteLocationNormalized): Promise<{ visitedViews: RouteLocationNormalized[]; cachedViews: string[] } | any> { if (obj === undefined) { // prettier-ignore const { visitedViews } = await useTagsViewStore().delView(router.currentRoute.value as any) const { visitedViews } = await useTagsViewStore().delView(router.currentRoute.value) const latestView = visitedViews.slice(-1)[0]; if (latestView) { return router.push(latestView.fullPath as any); return router.push(latestView.fullPath); } return router.push('/'); } @@ -55,16 +65,16 @@ return useTagsViewStore().delAllViews(); }, // 关闭左侧tab页签 closeLeftPage(obj?: TagView) { return useTagsViewStore().delLeftTags(obj || (router.currentRoute.value as any)); closeLeftPage(obj?: RouteLocationNormalized) { return useTagsViewStore().delLeftTags(obj || router.currentRoute.value); }, // 关闭右侧tab页签 closeRightPage(obj?: TagView) { return useTagsViewStore().delRightTags(obj || (router.currentRoute.value as any)); closeRightPage(obj?: RouteLocationNormalized) { return useTagsViewStore().delRightTags(obj || router.currentRoute.value); }, // 关闭其他tab页签 closeOtherPage(obj?: TagView) { return useTagsViewStore().delOthersViews(obj || (router.currentRoute.value as any)); closeOtherPage(obj?: RouteLocationNormalized) { return useTagsViewStore().delOthersViews(obj || router.currentRoute.value); }, /** * 打开tab页签 @@ -80,7 +90,7 @@ * 修改tab页签 * @param obj 标签对象 */ updatePage(obj: TagView) { updatePage(obj: RouteLocationNormalized) { return useTagsViewStore().updateVisitedView(obj); } }; src/store/modules/permission.ts
@@ -18,6 +18,16 @@ const topbarRouters = ref<RouteRecordRaw[]>([]); const sidebarRouters = ref<RouteRecordRaw[]>([]); const getRoutes = (): RouteRecordRaw[] => { return routes.value; }; const getSidebarRoutes = (): RouteRecordRaw[] => { return sidebarRouters.value; }; const getTopbarRoutes = (): RouteRecordRaw[] => { return topbarRouters.value; }; const setRoutes = (newRoutes: RouteRecordRaw[]): void => { addRoutes.value = newRoutes; routes.value = constantRoutes.concat(newRoutes); @@ -108,7 +118,20 @@ }); return children; }; return { routes, setRoutes, generateRoutes, setSidebarRouters, topbarRouters, sidebarRouters, defaultRoutes }; return { routes, topbarRouters, sidebarRouters, defaultRoutes, getRoutes, getSidebarRoutes, getTopbarRoutes, setRoutes, generateRoutes, setSidebarRouters }; }); // 动态路由遍历,验证是否具备权限 src/store/modules/tagsView.ts
@@ -1,38 +1,53 @@ import { TagView, RouteRecordNormalized, RouteLocationNormalized } from 'vue-router'; import { RouteLocationNormalized } from 'vue-router'; export const useTagsViewStore = defineStore('tagsView', () => { const visitedViews = ref<TagView[]>([]); const visitedViews = ref<RouteLocationNormalized[]>([]); const cachedViews = ref<string[]>([]); const iframeViews = ref<TagView[]>([]); const iframeViews = ref<RouteLocationNormalized[]>([]); const addView = (view: TagView) => { const getVisitedViews = (): RouteLocationNormalized[] => { return visitedViews.value; }; const getIframeViews = (): RouteLocationNormalized[] => { return iframeViews.value; }; const getCachedViews = (): string[] => { return cachedViews.value; }; const addView = (view: RouteLocationNormalized) => { addVisitedView(view); addCachedView(view); }; const addIframeView = (view: TagView): void => { if (iframeViews.value.some((v: TagView) => v.path === view.path)) return; const addIframeView = (view: RouteLocationNormalized): void => { if (iframeViews.value.some((v: RouteLocationNormalized) => v.path === view.path)) return; iframeViews.value.push( Object.assign({}, view, { title: view.meta?.title || 'no-name' }) ); }; const delIframeView = (view: TagView): Promise<TagView[]> => { const delIframeView = (view: RouteLocationNormalized): Promise<RouteLocationNormalized[]> => { return new Promise((resolve) => { iframeViews.value = iframeViews.value.filter((item: TagView) => item.path !== view.path); iframeViews.value = iframeViews.value.filter((item: RouteLocationNormalized) => item.path !== view.path); resolve([...iframeViews.value]); }); }; const addVisitedView = (view: TagView): void => { if (visitedViews.value.some((v: TagView) => v.path === view.path)) return; const addVisitedView = (view: RouteLocationNormalized): void => { if (visitedViews.value.some((v: RouteLocationNormalized) => v.path === view.path)) return; visitedViews.value.push( Object.assign({}, view, { title: view.meta?.title || 'no-name' }) ); }; const delView = (view: TagView): Promise<{ visitedViews: TagView[]; cachedViews: string[] }> => { const delView = ( view: RouteLocationNormalized ): Promise<{ visitedViews: RouteLocationNormalized[]; cachedViews: string[]; }> => { return new Promise((resolve) => { delVisitedView(view); if (!isDynamicRoute(view)) { @@ -45,7 +60,7 @@ }); }; const delVisitedView = (view: TagView): Promise<TagView[]> => { const delVisitedView = (view: RouteLocationNormalized): Promise<RouteLocationNormalized[]> => { return new Promise((resolve) => { for (const [i, v] of visitedViews.value.entries()) { if (v.path === view.path) { @@ -56,7 +71,7 @@ resolve([...visitedViews.value]); }); }; const delCachedView = (view?: TagView): Promise<string[]> => { const delCachedView = (view?: RouteLocationNormalized): Promise<string[]> => { let viewName = ''; if (view) { viewName = view.name as string; @@ -67,7 +82,12 @@ resolve([...cachedViews.value]); }); }; const delOthersViews = (view: TagView): Promise<{ visitedViews: TagView[]; cachedViews: string[] }> => { const delOthersViews = ( view: RouteLocationNormalized ): Promise<{ visitedViews: RouteLocationNormalized[]; cachedViews: string[]; }> => { return new Promise((resolve) => { delOthersVisitedViews(view); delOthersCachedViews(view); @@ -78,15 +98,15 @@ }); }; const delOthersVisitedViews = (view: TagView): Promise<TagView[]> => { const delOthersVisitedViews = (view: RouteLocationNormalized): Promise<RouteLocationNormalized[]> => { return new Promise((resolve) => { visitedViews.value = visitedViews.value.filter((v: TagView) => { visitedViews.value = visitedViews.value.filter((v: RouteLocationNormalized) => { return v.meta?.affix || v.path === view.path; }); resolve([...visitedViews.value]); }); }; const delOthersCachedViews = (view: TagView): Promise<string[]> => { const delOthersCachedViews = (view: RouteLocationNormalized): Promise<string[]> => { const viewName = view.name as string; return new Promise((resolve) => { const index = cachedViews.value.indexOf(viewName); @@ -99,7 +119,7 @@ }); }; const delAllViews = (): Promise<{ visitedViews: TagView[]; cachedViews: string[] }> => { const delAllViews = (): Promise<{ visitedViews: RouteLocationNormalized[]; cachedViews: string[] }> => { return new Promise((resolve) => { delAllVisitedViews(); delAllCachedViews(); @@ -109,9 +129,9 @@ }); }); }; const delAllVisitedViews = (): Promise<TagView[]> => { const delAllVisitedViews = (): Promise<RouteLocationNormalized[]> => { return new Promise((resolve) => { visitedViews.value = visitedViews.value.filter((tag: TagView) => tag.meta?.affix); visitedViews.value = visitedViews.value.filter((tag: RouteLocationNormalized) => tag.meta?.affix); resolve([...visitedViews.value]); }); }; @@ -123,7 +143,7 @@ }); }; const updateVisitedView = (view: TagView): void => { const updateVisitedView = (view: RouteLocationNormalized): void => { for (let v of visitedViews.value) { if (v.path === view.path) { v = Object.assign(v, view); @@ -131,13 +151,13 @@ } } }; const delRightTags = (view: TagView): Promise<TagView[]> => { const delRightTags = (view: RouteLocationNormalized): Promise<RouteLocationNormalized[]> => { return new Promise((resolve) => { const index = visitedViews.value.findIndex((v: TagView) => v.path === view.path); const index = visitedViews.value.findIndex((v: RouteLocationNormalized) => v.path === view.path); if (index === -1) { return; } visitedViews.value = visitedViews.value.filter((item: TagView, idx: number) => { visitedViews.value = visitedViews.value.filter((item: RouteLocationNormalized, idx: number) => { if (idx <= index || (item.meta && item.meta.affix)) { return true; } @@ -150,13 +170,13 @@ resolve([...visitedViews.value]); }); }; const delLeftTags = (view: TagView): Promise<TagView[]> => { const delLeftTags = (view: RouteLocationNormalized): Promise<RouteLocationNormalized[]> => { return new Promise((resolve) => { const index = visitedViews.value.findIndex((v: TagView) => v.path === view.path); const index = visitedViews.value.findIndex((v: RouteLocationNormalized) => v.path === view.path); if (index === -1) { return; } visitedViews.value = visitedViews.value.filter((item: TagView, idx: number) => { visitedViews.value = visitedViews.value.filter((item: RouteLocationNormalized, idx: number) => { if (idx >= index || (item.meta && item.meta.affix)) { return true; } @@ -170,7 +190,7 @@ }); }; const addCachedView = (view: TagView): void => { const addCachedView = (view: RouteLocationNormalized): void => { const viewName = view.name as string; if (!viewName) return; if (cachedViews.value.includes(viewName)) return; @@ -179,15 +199,20 @@ } }; const isDynamicRoute = (view: any): boolean => { const isDynamicRoute = (view: RouteLocationNormalized): boolean => { // 检查匹配的路由记录中是否有动态段 return view.matched.some((m: RouteRecordNormalized) => m.path.includes(':')); return view.matched.some((m) => m.path.includes(':')); }; return { visitedViews, cachedViews, iframeViews, getVisitedViews, getIframeViews, getCachedViews, addVisitedView, addCachedView, delVisitedView, @@ -205,5 +230,4 @@ delIframeView }; }); export default useTagsViewStore; src/store/modules/user.ts
@@ -1,9 +1,9 @@ import { to } from 'await-to-js'; import defAva from '@/assets/images/profile.jpg'; import store from '@/store'; import { getToken, removeToken, setToken } from '@/utils/auth'; import { login as loginApi, logout as logoutApi, getInfo as getUserInfo } from '@/api/login'; import { LoginData } from '@/api/types'; import defAva from '@/assets/images/profile.jpg'; import store from '@/store'; export const useUserStore = defineStore('user', () => { const token = ref(getToken()); src/types/element.d.ts
@@ -1,6 +1,6 @@ import type * as ep from 'element-plus'; declare global { declare type ElTagType = '' | 'success' | 'warning' | 'info' | 'danger' | 'default' | 'primary'; declare type ElTagType = 'success' | 'info' | 'warning' | 'danger' | ''; declare type ElFormInstance = ep.FormInstance; declare type ElTableInstance = ep.TableInstance; declare type ElUploadInstance = ep.UploadInstance; @@ -32,5 +32,4 @@ declare type ElFormRules = ep.FormRules; declare type DateModelType = ep.DateModelType; declare type UploadFile = ep.UploadFile; } src/types/router.d.ts
@@ -22,6 +22,7 @@ interface _RouteLocationBase { children?: _RouteRecordBase[]; path?: string; title?: string; } interface TagView { @@ -33,3 +34,5 @@ query?: LocationQuery; } } export {}; src/views/system/dict/data.vue
@@ -131,6 +131,7 @@ import { listData, getData, delData, addData, updateData } from '@/api/system/dict/data'; import { DictTypeVO } from '@/api/system/dict/type/types'; import { DictDataForm, DictDataQuery, DictDataVO } from '@/api/system/dict/data/types'; import { RouteLocationNormalized } from 'vue-router'; const { proxy } = getCurrentInstance() as ComponentInternalInstance; const route = useRoute(); @@ -168,7 +169,7 @@ dictLabel: '', dictValue: '', cssClass: '', listClass: 'default', listClass: '', dictSort: 0, remark: '' }; @@ -228,7 +229,17 @@ }; /** 返回按钮操作 */ const handleClose = () => { const obj = { path: '/system/dict' }; const obj: RouteLocationNormalized = { fullPath: '', hash: '', matched: [], meta: undefined, name: undefined, params: undefined, query: undefined, redirectedFrom: undefined, path: '/system/dict' }; proxy?.$tab.closeOpenPage(obj); }; /** 重置按钮操作 */ src/views/system/role/authUser.vue
@@ -69,6 +69,7 @@ import { UserQuery } from '@/api/system/user/types'; import { UserVO } from '@/api/system/user/types'; import SelectUser from './selectUser.vue'; import { RouteLocationNormalized } from 'vue-router'; const route = useRoute(); const { proxy } = getCurrentInstance() as ComponentInternalInstance; @@ -102,7 +103,17 @@ }; // 返回按钮 const handleClose = () => { const obj = { path: '/system/role' }; const obj: RouteLocationNormalized = { path: '/system/role', fullPath: '', hash: '', matched: [], meta: undefined, name: undefined, params: undefined, query: undefined, redirectedFrom: undefined }; proxy?.$tab.closeOpenPage(obj); }; /** 搜索按钮操作 */ src/views/system/user/authRole.vue
@@ -58,6 +58,7 @@ import { RoleVO } from '@/api/system/role/types'; import { getAuthRole, updateAuthRole } from '@/api/system/user'; import { UserForm } from '@/api/system/user/types'; import { RouteLocationNormalized } from 'vue-router'; const route = useRoute(); const { proxy } = getCurrentInstance() as ComponentInternalInstance; @@ -91,7 +92,17 @@ }; /** 关闭按钮 */ const close = () => { const obj = { path: '/system/user' }; const obj: RouteLocationNormalized = { fullPath: '', hash: '', matched: [], meta: undefined, name: undefined, params: undefined, query: undefined, redirectedFrom: undefined, path: '/system/user' }; proxy?.$tab.closeOpenPage(obj); }; /** 提交按钮 */ src/views/tool/gen/editTable.vue
@@ -119,6 +119,7 @@ import { DictTypeVO } from '@/api/system/dict/type/types'; import BasicInfoForm from './basicInfoForm.vue'; import GenInfoForm from './genInfoForm.vue'; import { RouteLocationNormalized } from 'vue-router'; const route = useRoute(); const { proxy } = getCurrentInstance() as ComponentInternalInstance; @@ -167,7 +168,17 @@ }); }; const close = () => { const obj = { path: '/tool/gen', query: { t: Date.now(), pageNum: route.query.pageNum } }; const obj: RouteLocationNormalized = { path: '/tool/gen', fullPath: '', hash: '', matched: [], meta: undefined, name: undefined, params: undefined, redirectedFrom: undefined, query: { t: Date.now().toString(), pageNum: route.query.pageNum } }; proxy?.$tab.closeOpenPage(obj); }; src/views/tool/gen/index.vue
@@ -143,7 +143,10 @@ dataName: '' }); const preview = ref<any>({ const preview = ref<{ data: Record<string, string>; activeName: string; }>({ data: {}, activeName: 'domain.java' });