diff --git a/src/layouts/Logo.vue b/src/layouts/Logo.vue index 980e78b39c073ab4113b2619fb3752055b12b284..f2b133ed67fd88b3bb3f4898b9f68212053ec55c 100644 --- a/src/layouts/Logo.vue +++ b/src/layouts/Logo.vue @@ -23,12 +23,14 @@ }, }, setup(props) { + const showRef = ref(!!props.showTitle); const { globSetting } = useSetting(); const go = useGo(); + function handleGoHome() { go(PageEnum.BASE_HOME); } - const showRef = ref(!!props.showTitle); + watch( () => props.showTitle, (show: boolean) => { @@ -41,6 +43,7 @@ } } ); + return { handleGoHome, globSetting, @@ -55,7 +58,6 @@ .app-logo { display: flex; - // justify-content: center; align-items: center; cursor: pointer; diff --git a/src/layouts/iframe/useFrameKeepAlive.ts b/src/layouts/iframe/useFrameKeepAlive.ts index 3eebfd61b36b387a039905dd5d2f2bd5b881068d..64ef99dd1452efec6b298824db7564efd12366e5 100644 --- a/src/layouts/iframe/useFrameKeepAlive.ts +++ b/src/layouts/iframe/useFrameKeepAlive.ts @@ -1,11 +1,12 @@ +import type { AppRouteRecordRaw } from '/@/router/types'; + import { computed, toRaw, unref } from 'vue'; +import { useRouter } from 'vue-router'; +import router from '/@/router'; import { tabStore } from '/@/store/modules/tab'; import { appStore } from '/@/store/modules/app'; -import { AppRouteRecordRaw } from '/@/router/types'; -import { useRouter } from 'vue-router'; -import router from '/@/router'; import { unique } from '/@/utils'; export function useFrameKeepAlive() { diff --git a/src/layouts/page/index.tsx b/src/layouts/page/index.tsx index 393dc81d36c628fdad53283740b915f853310ecc..0a445a41453df141cb24b9ab40a4f2dda332bf46 100644 --- a/src/layouts/page/index.tsx +++ b/src/layouts/page/index.tsx @@ -1,19 +1,17 @@ import { computed, defineComponent, unref, Transition, KeepAlive, toRaw } from 'vue'; +import { RouterView, RouteLocation } from 'vue-router'; -import { appStore } from '/@/store/modules/app'; +import FrameLayout from '/@/layouts/iframe/index.vue'; import { useTransition } from './useTransition'; +import { useSetting } from '/@/hooks/core/useSetting'; -import { RouterView, RouteLocation } from 'vue-router'; import { tabStore } from '/@/store/modules/tab'; -import FrameLayout from '/@/layouts/iframe/index.vue'; +import { appStore } from '/@/store/modules/app'; -import { useSetting } from '/@/hooks/core/useSetting'; -// import { useRouter } from 'vue-router'; export default defineComponent({ name: 'PageLayout', setup() { - // const { currentRoute } = useRouter(); const getProjectConfigRef = computed(() => { return appStore.getProjectConfig; }); diff --git a/src/router/constant.ts b/src/router/constant.ts index ffe6f9ef9bbe67d5770243d5920d9f38ec0a3d13..855bf141ace835e820440daf474b877acd1c9758 100644 --- a/src/router/constant.ts +++ b/src/router/constant.ts @@ -22,6 +22,7 @@ export const PAGE_NOT_FOUND_ROUTE: AppRouteRecordRaw = { hideBreadcrumb: true, }, }; + export const REDIRECT_ROUTE: AppRouteRecordRaw = { path: '/redirect/:path(.*)*', name: 'Redirect', @@ -31,16 +32,3 @@ export const REDIRECT_ROUTE: AppRouteRecordRaw = { hideBreadcrumb: true, }, }; - -// Whole site 404 -// export const FULL_PAGE_NOT_FOUND_ROUTE: AppRouteRecordRaw = { -// path: '/:path(.*)*', -// name: 'FullErrorPage', -// component: EXCEPTION_COMPONENT, -// props: { -// full: true, -// }, -// meta: { -// title: 'FullErrorPage', -// }, -// }; diff --git a/src/router/guard/index.ts b/src/router/guard/index.ts index b306e354588db0a1583169c1c9bda124803e45b9..e92725219194ae6bf678f041e417e5377da1538b 100644 --- a/src/router/guard/index.ts +++ b/src/router/guard/index.ts @@ -1,13 +1,16 @@ import type { Router } from 'vue-router'; import { Modal, notification } from 'ant-design-vue'; -import { AxiosCanceler } from '/@/utils/http/axios/axiosCancel'; + import { createProgressGuard } from './progressGuard'; import { createPermissionGuard } from './permissionGuard'; import { createPageLoadingGuard } from './pageLoadingGuard'; + import { useSetting } from '/@/hooks/core/useSetting'; + import { getIsOpenTab, setCurrentTo } from '/@/utils/helper/routeHelper'; import { setTitle } from '/@/utils/browser'; +import { AxiosCanceler } from '/@/utils/http/axios/axiosCancel'; const { projectSetting, globSetting } = useSetting(); export function createGuard(router: Router) { @@ -36,10 +39,7 @@ export function createGuard(router: Router) { router.afterEach((to) => { // change html title - - setTimeout(() => { - setTitle(to.meta.title, globSetting.title); - }, 0); + setTitle(to.meta.title, globSetting.title); }); openNProgress && createProgressGuard(router); diff --git a/src/router/guard/permissionGuard.ts b/src/router/guard/permissionGuard.ts index ad48f52f059e38b24be021c914dd8ef7deaf8a6a..0eef7d74cd971aee310f6767e9ca91e3f60e871d 100644 --- a/src/router/guard/permissionGuard.ts +++ b/src/router/guard/permissionGuard.ts @@ -2,12 +2,11 @@ import type { Router, RouteRecordRaw } from 'vue-router'; import { userStore } from '/@/store/modules/user'; import { permissionStore } from '/@/store/modules/permission'; + import { PageEnum } from '/@/enums/pageEnum'; import { getToken } from '/@/utils/auth'; -import { - // FULL_PAGE_NOT_FOUND_ROUTE, - PAGE_NOT_FOUND_ROUTE, -} from '/@/router/constant'; + +import { PAGE_NOT_FOUND_ROUTE } from '/@/router/constant'; import { RootRoute } from '../routes/index'; const LOGIN_PATH = PageEnum.BASE_LOGIN; @@ -60,6 +59,7 @@ export function createPermissionGuard(router: Router) { permissionStore.commitDynamicAddedRouteState(true); next(nextData); }); + router.afterEach((to) => { // Just enter the login page and clear the authentication information if (to.path === LOGIN_PATH) { diff --git a/src/router/guard/progressGuard.ts b/src/router/guard/progressGuard.ts index fb64379b759dd7ee6c93c6e7811aae164a2cca52..a5e060b72c2eea2fee4c9808e9d98d4aa1b574e8 100644 --- a/src/router/guard/progressGuard.ts +++ b/src/router/guard/progressGuard.ts @@ -11,6 +11,7 @@ export function createProgressGuard(router: Router) { !to.meta.inTab && NProgress.start(); return true; }); + router.afterEach(async (to) => { !to.meta.inTab && NProgress.done(); return true; diff --git a/src/router/index.ts b/src/router/index.ts index 77af375dcc6b39bffd226311be37f8bb13d5b054..71c52f224f94f6bafce7447fddca44c4b5349498 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -2,6 +2,7 @@ import type { RouteRecordRaw } from 'vue-router'; import type { App } from 'vue'; import { createRouter, createWebHashHistory } from 'vue-router'; + import { scrollWaiter } from '../utils/scrollWaiter'; import { createGuard } from './guard/'; @@ -24,6 +25,7 @@ const router = createRouter({ } }, }); + // reset router export function resetRouter() { const resetWhiteNameList = [ @@ -45,21 +47,4 @@ export function setupRouter(app: App) { createGuard(router); } -// // hmr -// if (import.meta.hot) { -// let removeRoutes: (() => void)[] = []; - -// for (let route of routes) { -// removeRoutes.push(router.addRoute(route as RouteRecordRaw)); -// } - -// import.meta.hot?.acceptDeps('./routes.ts', ({ routes }) => { -// for (let removeRoute of removeRoutes) removeRoute(); -// removeRoutes = []; -// for (let route of routes) { -// removeRoutes.push(router.addRoute(route)); -// } -// router.replace(''); -// }); -// } export default router; diff --git a/src/router/menus/index.ts b/src/router/menus/index.ts index 7161b4314ec5fa7e203ba3c38cdd314b1db58688..ebed4ce1070c47c5ecc4a82bdd3b9f30f3d66bb6 100644 --- a/src/router/menus/index.ts +++ b/src/router/menus/index.ts @@ -9,33 +9,7 @@ import { PermissionModeEnum } from '/@/enums/appEnum'; import { pathToRegexp } from 'path-to-regexp'; import modules from 'globby!/@/router/menus/modules/**/*.@(ts)'; -// =========================== -// ==========module import==== -// =========================== -// import dashboard from './modules/dashboard'; - -// import exceptionDemo from './modules/demo/exception'; -// import iframeDemo from './modules/demo/iframe'; -// import compDemo from './modules/demo/comp'; -// import permissionDemo from './modules/demo/permission'; -// import featDemo from './modules/demo/feat'; -// import chartsDemo from './modules/demo/charts'; -// import tableDemo from './modules/demo/table'; -// import formDemo from './modules/demo/form'; -// import treeDemo from './modules/demo/tree'; - -const menuModules: MenuModule[] = [ - // dashboard, - // featDemo, - // exceptionDemo, - // iframeDemo, - // compDemo, - // permissionDemo, - // chartsDemo, - // tableDemo, - // formDemo, - // treeDemo, -]; +const menuModules: MenuModule[] = []; Object.keys(modules).forEach((key) => { menuModules.push(modules[key]); diff --git a/src/router/routes/index.ts b/src/router/routes/index.ts index 5ea4d2ceb4d1de19750a732d8d0fb1f431731d69..4b056b86e2019b2ae4ac98a1c987695e6c34169c 100644 --- a/src/router/routes/index.ts +++ b/src/router/routes/index.ts @@ -4,30 +4,7 @@ import { DEFAULT_LAYOUT_COMPONENT, PAGE_NOT_FOUND_ROUTE, REDIRECT_ROUTE } from ' import { genRouteModule } from '/@/utils/helper/routeHelper'; import modules from 'globby!/@/router/routes/modules/**/*.@(ts)'; -// import dashboard from './modules/dashboard'; -// demo -// import exceptionDemo from './modules/demo/exception'; -// import iframeDemo from './modules/demo/iframe'; -// import compDemo from './modules/demo/comp'; -// import permissionDemo from './modules/demo/permission'; -// import featDemo from './modules/demo/feat'; -// import chartsDemo from './modules/demo/charts'; -// import tableDemo from './modules/demo/table'; -// import formDemo from './modules/demo/form'; -// import treeDemo from './modules/demo/tree'; - -const routeModuleList: AppRouteModule[] = [ - // exceptionDemo, - // dashboard, - // iframeDemo, - // compDemo, - // featDemo, - // permissionDemo, - // chartsDemo, - // tableDemo, - // formDemo, - // treeDemo, -]; +const routeModuleList: AppRouteModule[] = []; Object.keys(modules).forEach((key) => { routeModuleList.push(modules[key]); @@ -38,6 +15,7 @@ export const asyncRoutes = [ PAGE_NOT_FOUND_ROUTE, ...genRouteModule(routeModuleList), ]; + // 主框架根路由 export const RootRoute: AppRouteRecordRaw = { path: '/', diff --git a/src/setup/error-handle/index.ts b/src/setup/error-handle/index.ts index 143f5846cb59f9862b83bd3a13a776232071e5fe..ef792669b9c97e3ebf62c03c9d5c216bf13d17d2 100644 --- a/src/setup/error-handle/index.ts +++ b/src/setup/error-handle/index.ts @@ -66,25 +66,23 @@ export function scriptErrorHandler( if (event === 'Script error.' && !source) { return false; } - setTimeout(function () { - const errorInfo: Partial = {}; - colno = colno || (window.event && (window.event as any).errorCharacter) || 0; - errorInfo.message = event as string; - if (error && error.stack) { - errorInfo.stack = error.stack; - } else { - errorInfo.stack = ''; - } - const name = source ? source.substr(source.lastIndexOf('/') + 1) : 'script'; - errorStore.commitErrorInfoState({ - type: ErrorTypeEnum.SCRIPT, - name: name, - file: source as string, - detail: 'lineno' + lineno, - url: window.location.href, - ...(errorInfo as Pick), - }); - }, 0); + const errorInfo: Partial = {}; + colno = colno || (window.event && (window.event as any).errorCharacter) || 0; + errorInfo.message = event as string; + if (error && error.stack) { + errorInfo.stack = error.stack; + } else { + errorInfo.stack = ''; + } + const name = source ? source.substr(source.lastIndexOf('/') + 1) : 'script'; + errorStore.commitErrorInfoState({ + type: ErrorTypeEnum.SCRIPT, + name: name, + file: source as string, + detail: 'lineno' + lineno, + url: window.location.href, + ...(errorInfo as Pick), + }); return true; } diff --git a/src/store/index.ts b/src/store/index.ts index 4fab4a6e56174a4bb4bfa44fecbe9346a262f8f7..3559eda1bde53b8926ffe53b2d8b40219776a683 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -15,7 +15,9 @@ const store = createStore({ strict: isDev, // plugins, }); + export function setupStore(app: App) { app.use(store); } + export default store; diff --git a/src/store/modules/app.ts b/src/store/modules/app.ts index 57da0d4955b29e949b0d137beadc1704f58106b1..f4c50a8573c5eb50182251ed77e7507ae953eeee 100644 --- a/src/store/modules/app.ts +++ b/src/store/modules/app.ts @@ -1,13 +1,14 @@ -import store from '/@/store'; -import { hotModuleUnregisterModule } from '/@/utils/helper/vuexHelper'; +import type { ProjectConfig } from '/@/types/config'; + import { VuexModule, getModule, Module, Mutation, Action } from 'vuex-module-decorators'; +import store from '/@/store'; import { PROJ_CFG_KEY, LOCK_INFO_KEY } from '/@/enums/cacheEnum'; -import { ProjectConfig } from '/@/types/config'; -// import { userStore } from './user'; +import { hotModuleUnregisterModule } from '/@/utils/helper/vuexHelper'; import { setLocal, getLocal, removeLocal } from '/@/utils/helper/persistent'; import { deepMerge } from '/@/utils'; + import { userStore } from './user'; export interface LockInfo { @@ -20,12 +21,16 @@ const NAME = 'app'; hotModuleUnregisterModule(NAME); @Module({ dynamic: true, namespaced: true, store, name: NAME }) class App extends VuexModule { + // Page loading status private pageLoadingState = false; + // project config private projectConfigState: ProjectConfig | null = getLocal(PROJ_CFG_KEY); + // lock info private lockInfoState: LockInfo | null = getLocal(LOCK_INFO_KEY); + // set main overflow hidden private lockMainScrollState = false; get getPageLoading() { @@ -87,7 +92,7 @@ class App extends VuexModule { } // /** - // * @description: 解锁 + // * @description: unlock page // */ @Action public async unLockAction({ password, valid = true }: { password: string; valid?: boolean }) { diff --git a/src/store/modules/error.ts b/src/store/modules/error.ts index 9e1e402ac3b6eb3c0ee9ec2cf8b977ab977dcff8..ffc3149b99d4a0c289afb21b80afaceae087190d 100644 --- a/src/store/modules/error.ts +++ b/src/store/modules/error.ts @@ -25,7 +25,10 @@ const NAME = 'error'; hotModuleUnregisterModule(NAME); @Module({ dynamic: true, namespaced: true, store, name: NAME }) class Error extends VuexModule implements ErrorState { + // error log list errorInfoState: ErrorInfo[] = []; + + // error log count errorListCountState = 0; get getErrorInfoState() { diff --git a/src/store/modules/permission.ts b/src/store/modules/permission.ts index ccd62bd88bec0a4e9fc3d40a90a3a4b0ac4890fd..3b50634eb6d27ad1a0c37328519f86933afa4b77 100644 --- a/src/store/modules/permission.ts +++ b/src/store/modules/permission.ts @@ -26,16 +26,16 @@ const NAME = 'permission'; hotModuleUnregisterModule(NAME); @Module({ dynamic: true, namespaced: true, store, name: NAME }) class Permission extends VuexModule { - // private routesState: AppRouteRecordRaw[] = []; - - // 权限编码列表 + // Permission code list private permCodeListState: string[] = []; // Whether the route has been dynamically added private isDynamicAddedRouteState = false; + // To trigger a menu update private lastBuildMenuTimeState = 0; + // Backstage menu list private backMenuListState: Menu[] = []; get getPermCodeListState() { @@ -50,10 +50,6 @@ class Permission extends VuexModule { return this.lastBuildMenuTimeState; } - // get getRoutesState() { - // return this.routesState; - // } - get getIsDynamicAddedRouteState() { return this.isDynamicAddedRouteState; } @@ -73,11 +69,6 @@ class Permission extends VuexModule { this.lastBuildMenuTimeState = new Date().getTime(); } - // @Mutation - // commitRoutesState(routes: AppRouteRecordRaw[]): void { - // this.routesState = routes; - // } - @Mutation commitDynamicAddedRouteState(added: boolean): void { this.isDynamicAddedRouteState = added; diff --git a/src/store/modules/tab.ts b/src/store/modules/tab.ts index a4ae2eb7a2b5de089b15842331c446503daf1d53..8b7169715025be97fecf114a85a6ec5a6aecb23a 100644 --- a/src/store/modules/tab.ts +++ b/src/store/modules/tab.ts @@ -34,18 +34,15 @@ const getOpenKeepAliveRef = computed(() => appStore.getProjectConfig.openKeepAli @Module({ namespaced: true, name: NAME, dynamic: true, store }) class Tab extends VuexModule { - // tab列表 + // tab list tabsState: TabItem[] = []; - // 缓存列表 + // tab cache list keepAliveTabsState: CacheName[] = []; currentContextMenuIndexState = -1; currentContextMenuState: TabItem | null = null; - /** - * @description: 获取tabs - */ get getTabsState() { return this.tabsState; } @@ -58,9 +55,6 @@ class Tab extends VuexModule { return this.currentContextMenuState; } - /** - * @description: 获取缓存的tab列表 - */ get getKeepAliveTabsState() { return this.keepAliveTabsState; } diff --git a/src/store/modules/user.ts b/src/store/modules/user.ts index 8eba149eb4ad12477946a4c2e47d4ad5145e685c..699e35fca3a344166ffbdabec902bd1718915f70 100644 --- a/src/store/modules/user.ts +++ b/src/store/modules/user.ts @@ -58,7 +58,6 @@ class User extends VuexModule { this.userInfoState = null; this.tokenState = ''; this.roleListState = []; - // permissionStore.commitReset(); } @Mutation @@ -136,7 +135,6 @@ class User extends VuexModule { resetRouter(); clearSession(); clearLocal(); - // router.addRoute(FULL_PAGE_NOT_FOUND_ROUTE as RouteRecordRaw); permissionStore.commitResetState(); tabStore.commitResetState(); this.resetState(); diff --git a/src/types/config.d.ts b/src/types/config.d.ts index 4a32d04147ac430f2bed5d4c5aab22a0a3c352e7..6b21e2a6a8f232d6994c219acb198dc0e19af9ee 100644 --- a/src/types/config.d.ts +++ b/src/types/config.d.ts @@ -70,7 +70,6 @@ export interface ProjectConfig { headerSetting: HeaderSetting; // 菜单类型 // menuType: MenuTypeEnum; - menuSetting: MenuSetting; messageSetting: MessageSetting; @@ -88,15 +87,12 @@ export interface ProjectConfig { showBreadCrumbIcon: boolean; // 使用error-handler-plugin useErrorHandle: boolean; - // 开启页面切换动画 openRouterTransition: boolean; // 路由切换动画 routerTransition: RouterTransitionEnum; - // 是否开启登录安全校验 openLoginVerify: boolean; - // 是否监听网络变化 listenNetWork: boolean; // 是否开启页面切换loading @@ -116,23 +112,17 @@ export interface ProjectConfig { export interface GlobConfig { // 网站标题 title: string; - // 项目路径 apiUrl: string; - urlPrefix?: string; - shortName: string; } export interface GlobEnvConfig { // 网站标题 VITE_GLOB_APP_TITLE: string; - // 项目路径 VITE_GLOB_API_URL: string; - VITE_GLOB_API_URL_PREFIX?: string; - VITE_GLOB_APP_SHORT_NAME: string; } diff --git a/src/types/global.d.ts b/src/types/global.d.ts index 69645d681edb7fa986311937ce23ec1a68a880d1..ea395e1155848d8a05e2b294671fac375273dbea 100644 --- a/src/types/global.d.ts +++ b/src/types/global.d.ts @@ -9,6 +9,7 @@ declare interface IObj { } declare function parseInt(s: string | number, radix?: number): number; + declare function parseFloat(string: string | number): number; declare type Dictionary = Record; @@ -26,6 +27,7 @@ declare type CustomizedHTMLElement = HTMLElement & T; declare type Indexable = { [key: string]: T; }; + declare type Hash = Indexable; declare type DeepPartial = { diff --git a/src/types/module.d.ts b/src/types/module.d.ts index d8cd24b797a497e9bb2fb99e724a5ea7321a5971..9f3b5912a38e531e73755ee2cec911da407a9211 100644 --- a/src/types/module.d.ts +++ b/src/types/module.d.ts @@ -1,4 +1,7 @@ declare module 'ant-design-vue/es/locale/zh_CN'; + declare module 'globby!/@/router/routes/modules/**/*.@(ts)'; + declare module 'globby!/@/router/menus/modules/**/*.@(ts)'; + declare const React: string; diff --git a/src/types/shim-tsx.d.ts b/src/types/shim-tsx.d.ts index 2c6fd6e2e14017135833a300858276df5af99ed6..d9f0595ca63c50be3e487cd75df5f54d8eed6166 100644 --- a/src/types/shim-tsx.d.ts +++ b/src/types/shim-tsx.d.ts @@ -1,12 +1,8 @@ -// 文件: `shim-tsx.d.ts` -import Vue, { VNode } from 'vue'; -import type { ComponentRenderProxy } from '@vue/composition-api'; +import type { ComponentRenderProxy, VNode } from 'vue'; declare module '*.tsx' { import { defineComponent } from 'vue'; const component: ReturnType; - // import { ComponentOptions } from 'vue'; - // const component: ReturnType; export default component; }