diff --git "a/gm20241028\346\211\223\345\214\205.zip" "b/gm20241028\346\211\223\345\214\205.zip" new file mode 100644 index 0000000..b2cee12 --- /dev/null +++ "b/gm20241028\346\211\223\345\214\205.zip" Binary files differ diff --git "a/gm20241028\346\211\223\345\214\205.zip" "b/gm20241028\346\211\223\345\214\205.zip" new file mode 100644 index 0000000..b2cee12 --- /dev/null +++ "b/gm20241028\346\211\223\345\214\205.zip" Binary files differ diff --git a/public/config/config.json b/public/config/config.json index 84141e6..12a6978 100644 --- a/public/config/config.json +++ b/public/config/config.json @@ -10,5 +10,5 @@ "maxZoom": "13", "zoom": "10", "timeGap": 3000, - "systemType": "sm" + "systemType": "gm" } diff --git "a/gm20241028\346\211\223\345\214\205.zip" "b/gm20241028\346\211\223\345\214\205.zip" new file mode 100644 index 0000000..b2cee12 --- /dev/null +++ "b/gm20241028\346\211\223\345\214\205.zip" Binary files differ diff --git a/public/config/config.json b/public/config/config.json index 84141e6..12a6978 100644 --- a/public/config/config.json +++ b/public/config/config.json @@ -10,5 +10,5 @@ "maxZoom": "13", "zoom": "10", "timeGap": 3000, - "systemType": "sm" + "systemType": "gm" } diff --git a/src/api/index.ts b/src/api/index.ts index ae60549..244333e 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -65,11 +65,27 @@ } else if (response.data.code !== responseCode.success && response.data.code !== responseCode.hikSuccess) { if (response.data.code === responseCode.noPermission) { // token失效状态跳转到登录页 - toLogin() - if (useUserStore().isLogout === 0) { - ElMessage.error(response.data.message || '发生错误') + // toLogin() + // if (useUserStore().isLogout === 0) { + // ElMessage.error(response.data.message || '发生错误') + // } + // useUserStore().toLogout()// 携带token + const hrefIdx = localStorage.getItem('tokenBak') + if (hrefIdx === 'true') { + console.log('跳转到404') + router.push({ + path: '/noPage', + }) } - useUserStore().toLogout() + else { + // token失效状态跳转到登录页 + toLogin() + if (useUserStore().isLogout === 0) { + // ElMessage.error(response.data.message || '发生错误') + ElMessage.warning(response.data.message || '发生错误') + } + useUserStore().toLogout() + } } else if (response.data.code === 500 && response.data.message === '数据格式不正确' && response.data.data) { const mes = response.data.data.filter((item: any, index: number) => index < 2).join(',') diff --git "a/gm20241028\346\211\223\345\214\205.zip" "b/gm20241028\346\211\223\345\214\205.zip" new file mode 100644 index 0000000..b2cee12 --- /dev/null +++ "b/gm20241028\346\211\223\345\214\205.zip" Binary files differ diff --git a/public/config/config.json b/public/config/config.json index 84141e6..12a6978 100644 --- a/public/config/config.json +++ b/public/config/config.json @@ -10,5 +10,5 @@ "maxZoom": "13", "zoom": "10", "timeGap": 3000, - "systemType": "sm" + "systemType": "gm" } diff --git a/src/api/index.ts b/src/api/index.ts index ae60549..244333e 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -65,11 +65,27 @@ } else if (response.data.code !== responseCode.success && response.data.code !== responseCode.hikSuccess) { if (response.data.code === responseCode.noPermission) { // token失效状态跳转到登录页 - toLogin() - if (useUserStore().isLogout === 0) { - ElMessage.error(response.data.message || '发生错误') + // toLogin() + // if (useUserStore().isLogout === 0) { + // ElMessage.error(response.data.message || '发生错误') + // } + // useUserStore().toLogout()// 携带token + const hrefIdx = localStorage.getItem('tokenBak') + if (hrefIdx === 'true') { + console.log('跳转到404') + router.push({ + path: '/noPage', + }) } - useUserStore().toLogout() + else { + // token失效状态跳转到登录页 + toLogin() + if (useUserStore().isLogout === 0) { + // ElMessage.error(response.data.message || '发生错误') + ElMessage.warning(response.data.message || '发生错误') + } + useUserStore().toLogout() + } } else if (response.data.code === 500 && response.data.message === '数据格式不正确' && response.data.data) { const mes = response.data.data.filter((item: any, index: number) => index < 2).join(',') diff --git a/src/api/indexMedia.ts b/src/api/indexMedia.ts index b7e1652..72d60b2 100644 --- a/src/api/indexMedia.ts +++ b/src/api/indexMedia.ts @@ -67,11 +67,27 @@ } else if (response.data.code !== responseCode.success && response.data.code !== responseCode.hikSuccess && response.data.code !== responseCode.mediaSuccess && response.data.code !== responseCode.mediaError) { if (response.data.code === responseCode.noPermission) { // token失效状态跳转到登录页 - toLogin() - if (useUserStore().isLogout === 0) { - ElMessage.error(response.data.message || '发生错误') + // toLogin() + // if (useUserStore().isLogout === 0) { + // ElMessage.error(response.data.message || '发生错误') + // } + // useUserStore().toLogout() + const hrefIdx = localStorage.getItem('tokenBak') + if (hrefIdx === 'true') { + console.log('跳转到404') + router.push({ + path: '/noPage', + }) } - useUserStore().toLogout() + else { + // token失效状态跳转到登录页 + toLogin() + if (useUserStore().isLogout === 0) { + // ElMessage.error(response.data.message || '发生错误') + ElMessage.warning(response.data.message || '发生错误') + } + useUserStore().toLogout() + } } else if (response.data.code === 500 && response.data.message === '数据格式不正确' && response.data.data) { const mes = response.data.data.filter((item: any, index: number) => index < 2).join(',') diff --git "a/gm20241028\346\211\223\345\214\205.zip" "b/gm20241028\346\211\223\345\214\205.zip" new file mode 100644 index 0000000..b2cee12 --- /dev/null +++ "b/gm20241028\346\211\223\345\214\205.zip" Binary files differ diff --git a/public/config/config.json b/public/config/config.json index 84141e6..12a6978 100644 --- a/public/config/config.json +++ b/public/config/config.json @@ -10,5 +10,5 @@ "maxZoom": "13", "zoom": "10", "timeGap": 3000, - "systemType": "sm" + "systemType": "gm" } diff --git a/src/api/index.ts b/src/api/index.ts index ae60549..244333e 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -65,11 +65,27 @@ } else if (response.data.code !== responseCode.success && response.data.code !== responseCode.hikSuccess) { if (response.data.code === responseCode.noPermission) { // token失效状态跳转到登录页 - toLogin() - if (useUserStore().isLogout === 0) { - ElMessage.error(response.data.message || '发生错误') + // toLogin() + // if (useUserStore().isLogout === 0) { + // ElMessage.error(response.data.message || '发生错误') + // } + // useUserStore().toLogout()// 携带token + const hrefIdx = localStorage.getItem('tokenBak') + if (hrefIdx === 'true') { + console.log('跳转到404') + router.push({ + path: '/noPage', + }) } - useUserStore().toLogout() + else { + // token失效状态跳转到登录页 + toLogin() + if (useUserStore().isLogout === 0) { + // ElMessage.error(response.data.message || '发生错误') + ElMessage.warning(response.data.message || '发生错误') + } + useUserStore().toLogout() + } } else if (response.data.code === 500 && response.data.message === '数据格式不正确' && response.data.data) { const mes = response.data.data.filter((item: any, index: number) => index < 2).join(',') diff --git a/src/api/indexMedia.ts b/src/api/indexMedia.ts index b7e1652..72d60b2 100644 --- a/src/api/indexMedia.ts +++ b/src/api/indexMedia.ts @@ -67,11 +67,27 @@ } else if (response.data.code !== responseCode.success && response.data.code !== responseCode.hikSuccess && response.data.code !== responseCode.mediaSuccess && response.data.code !== responseCode.mediaError) { if (response.data.code === responseCode.noPermission) { // token失效状态跳转到登录页 - toLogin() - if (useUserStore().isLogout === 0) { - ElMessage.error(response.data.message || '发生错误') + // toLogin() + // if (useUserStore().isLogout === 0) { + // ElMessage.error(response.data.message || '发生错误') + // } + // useUserStore().toLogout() + const hrefIdx = localStorage.getItem('tokenBak') + if (hrefIdx === 'true') { + console.log('跳转到404') + router.push({ + path: '/noPage', + }) } - useUserStore().toLogout() + else { + // token失效状态跳转到登录页 + toLogin() + if (useUserStore().isLogout === 0) { + // ElMessage.error(response.data.message || '发生错误') + ElMessage.warning(response.data.message || '发生错误') + } + useUserStore().toLogout() + } } else if (response.data.code === 500 && response.data.message === '数据格式不正确' && response.data.data) { const mes = response.data.data.filter((item: any, index: number) => index < 2).join(',') diff --git a/src/router/index.ts b/src/router/index.ts index 579b155..0a2c6fc 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -10,6 +10,7 @@ import useUserStore from '@/store/modules/user' import useMenuStore from '@/store/modules/menu' import useRouteStore from '@/store/modules/route' +import { queryString, stripscript } from '@/utils/validate' const { isLoading } = useNProgress() @@ -19,112 +20,131 @@ }) router.beforeEach(async (to, from, next) => { - console.log('to:', to.path) - const settingsStore = useSettingsStore() - const userStore = useUserStore() - const menuStore = useMenuStore() - const routeStore = useRouteStore() - settingsStore.app.enableProgress && (isLoading.value = true) - // 是否已登录 - if (userStore.isLogin) { - if (to.name === 'login') { // 如果还要进入登录页,直接跳转 - next() - } - else { - if (!userStore.hasUserInfo) { - // 获取用户信息 - await userStore.getUserInfo() - - console.log('index.ts-after userinfo', localStorage.token, userStore.username) + if (to.name !== 'NoPage') { + console.log('to:', to.path) + const settingsStore = useSettingsStore() + const userStore = useUserStore() + const menuStore = useMenuStore() + const routeStore = useRouteStore() + settingsStore.app.enableProgress && (isLoading.value = true) + // 是否已登录 + if (userStore.isLogin) { + if (to.name === 'login') { // 如果还要进入登录页,直接跳转 + next() } - // 是否已根据权限动态生成并注册路由 - if (routeStore.isGenerate) { - // 导航栏如果不是 single 模式,则需要根据 path 定位主导航的选中状态 - settingsStore.menu.menuMode !== 'single' && menuStore.setActived(to.path) - // 如果已登录状态下,进入登录页会强制跳转到控制台页面 - if (to.name === 'login') { - next({ - name: 'index', - replace: true, - }) + else { + // 携带token 需要去掉 + const hrefIdx = window.location.href.indexOf('token') // url中是否携带token + if (hrefIdx > -1) { + const params = queryString(window.location.href) + const token = stripscript(params.token) + localStorage.setItem('token', token) + localStorage.setItem('tokenBak', 'true') + // 刷新页面并隐藏token + window.location.href = window.location.href.replace(`?token=${token}`, '') + // history.go(0) } - // 如果未开启控制台,但进入的是控制台页面,则会进入侧边栏导航第一个模块 - else if (!settingsStore.dashboard.enable && to.name === 'dashboard') { - if (menuStore.sidebarMenus.length > 0) { + else { + localStorage.setItem('tokenBak', 'false') + } + if (!userStore.hasUserInfo) { + // 获取用户信息 + await userStore.getUserInfo() + + console.log('index.ts-after userinfo', localStorage.token, userStore.username) + } + // 是否已根据权限动态生成并注册路由 + if (routeStore.isGenerate) { + // 导航栏如果不是 single 模式,则需要根据 path 定位主导航的选中状态 + settingsStore.menu.menuMode !== 'single' && menuStore.setActived(to.path) + // 如果已登录状态下,进入登录页会强制跳转到控制台页面 + if (to.name === 'login') { next({ - path: menuStore.sidebarMenusFirstDeepestPath, + name: 'index', replace: true, }) } - // 如果侧边栏导航第一个模块无法命中,则还是进入控制台页面 + // 如果未开启控制台,但进入的是控制台页面,则会进入侧边栏导航第一个模块 + else if (!settingsStore.dashboard.enable && to.name === 'dashboard') { + if (menuStore.sidebarMenus.length > 0) { + next({ + path: menuStore.sidebarMenusFirstDeepestPath, + replace: true, + }) + } + // 如果侧边栏导航第一个模块无法命中,则还是进入控制台页面 + else { + next() + } + } + // 正常访问页面 else { next() } } - // 正常访问页面 else { - next() - } - } - else { - // 生成动态路由 - switch (settingsStore.app.routeBaseOn) { - case 'frontend': - await routeStore.generateRoutesAtFront(asyncRoutes) - break - case 'backend': - await routeStore.generateRoutesAtBack() - break - case 'filesystem': - await routeStore.generateRoutesAtFilesystem(asyncRoutesByFilesystem) - // 文件系统生成的路由,需要手动生成导航数据 - switch (settingsStore.menu.baseOn) { - case 'frontend': - await menuStore.generateMenusAtFront() - break - case 'backend': - await menuStore.generateMenusAtBack() - break - } - break - } - // 注册并记录路由数据 - // 记录的数据会在登出时会使用到,不使用 router.removeRoute 是考虑配置的路由可能不一定有设置 name ,则通过调用 router.addRoute() 返回的回调进行删除 - const removeRoutes: Function[] = [] - routeStore.flatRoutes.forEach((route) => { - if (!/^(https?:|mailto:|tel:)/.test(route.path)) { - removeRoutes.push(router.addRoute(route as RouteRecordRaw)) + // 生成动态路由 + switch (settingsStore.app.routeBaseOn) { + case 'frontend': + await routeStore.generateRoutesAtFront(asyncRoutes) + break + case 'backend': + await routeStore.generateRoutesAtBack() + break + case 'filesystem': + await routeStore.generateRoutesAtFilesystem(asyncRoutesByFilesystem) + // 文件系统生成的路由,需要手动生成导航数据 + switch (settingsStore.menu.baseOn) { + case 'frontend': + await menuStore.generateMenusAtFront() + break + case 'backend': + await menuStore.generateMenusAtBack() + break + } + break } - }) - // 添加静态路由 - if (settingsStore.app.routeBaseOn !== 'filesystem') { - routeStore.flatSystemRoutes.forEach((route) => { - removeRoutes.push(router.addRoute(route as RouteRecordRaw)) + // 注册并记录路由数据 + // 记录的数据会在登出时会使用到,不使用 router.removeRoute 是考虑配置的路由可能不一定有设置 name ,则通过调用 router.addRoute() 返回的回调进行删除 + const removeRoutes: Function[] = [] + routeStore.flatRoutes.forEach((route) => { + if (!/^(https?:|mailto:|tel:)/.test(route.path)) { + removeRoutes.push(router.addRoute(route as RouteRecordRaw)) + } + }) + // 添加静态路由 + if (settingsStore.app.routeBaseOn !== 'filesystem') { + routeStore.flatSystemRoutes.forEach((route) => { + removeRoutes.push(router.addRoute(route as RouteRecordRaw)) + }) + } + routeStore.setCurrentRemoveRoutes(removeRoutes) + // 动态路由生成并注册后,重新进入当前路由 + next({ + path: to.path, + query: to.query, + replace: true, }) } - routeStore.setCurrentRemoveRoutes(removeRoutes) - // 动态路由生成并注册后,重新进入当前路由 + } + } + else { + // 未登录跳转到登录 + if (to.name !== 'login') { next({ - path: to.path, - query: to.query, - replace: true, + name: 'login', + query: { + redirect: to.fullPath, + }, }) } + else { + next() + } } } else { - // 未登录跳转到登录 - if (to.name !== 'login') { - next({ - name: 'login', - query: { - redirect: to.fullPath, - }, - }) - } - else { - next() - } + next() } }) diff --git "a/gm20241028\346\211\223\345\214\205.zip" "b/gm20241028\346\211\223\345\214\205.zip" new file mode 100644 index 0000000..b2cee12 --- /dev/null +++ "b/gm20241028\346\211\223\345\214\205.zip" Binary files differ diff --git a/public/config/config.json b/public/config/config.json index 84141e6..12a6978 100644 --- a/public/config/config.json +++ b/public/config/config.json @@ -10,5 +10,5 @@ "maxZoom": "13", "zoom": "10", "timeGap": 3000, - "systemType": "sm" + "systemType": "gm" } diff --git a/src/api/index.ts b/src/api/index.ts index ae60549..244333e 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -65,11 +65,27 @@ } else if (response.data.code !== responseCode.success && response.data.code !== responseCode.hikSuccess) { if (response.data.code === responseCode.noPermission) { // token失效状态跳转到登录页 - toLogin() - if (useUserStore().isLogout === 0) { - ElMessage.error(response.data.message || '发生错误') + // toLogin() + // if (useUserStore().isLogout === 0) { + // ElMessage.error(response.data.message || '发生错误') + // } + // useUserStore().toLogout()// 携带token + const hrefIdx = localStorage.getItem('tokenBak') + if (hrefIdx === 'true') { + console.log('跳转到404') + router.push({ + path: '/noPage', + }) } - useUserStore().toLogout() + else { + // token失效状态跳转到登录页 + toLogin() + if (useUserStore().isLogout === 0) { + // ElMessage.error(response.data.message || '发生错误') + ElMessage.warning(response.data.message || '发生错误') + } + useUserStore().toLogout() + } } else if (response.data.code === 500 && response.data.message === '数据格式不正确' && response.data.data) { const mes = response.data.data.filter((item: any, index: number) => index < 2).join(',') diff --git a/src/api/indexMedia.ts b/src/api/indexMedia.ts index b7e1652..72d60b2 100644 --- a/src/api/indexMedia.ts +++ b/src/api/indexMedia.ts @@ -67,11 +67,27 @@ } else if (response.data.code !== responseCode.success && response.data.code !== responseCode.hikSuccess && response.data.code !== responseCode.mediaSuccess && response.data.code !== responseCode.mediaError) { if (response.data.code === responseCode.noPermission) { // token失效状态跳转到登录页 - toLogin() - if (useUserStore().isLogout === 0) { - ElMessage.error(response.data.message || '发生错误') + // toLogin() + // if (useUserStore().isLogout === 0) { + // ElMessage.error(response.data.message || '发生错误') + // } + // useUserStore().toLogout() + const hrefIdx = localStorage.getItem('tokenBak') + if (hrefIdx === 'true') { + console.log('跳转到404') + router.push({ + path: '/noPage', + }) } - useUserStore().toLogout() + else { + // token失效状态跳转到登录页 + toLogin() + if (useUserStore().isLogout === 0) { + // ElMessage.error(response.data.message || '发生错误') + ElMessage.warning(response.data.message || '发生错误') + } + useUserStore().toLogout() + } } else if (response.data.code === 500 && response.data.message === '数据格式不正确' && response.data.data) { const mes = response.data.data.filter((item: any, index: number) => index < 2).join(',') diff --git a/src/router/index.ts b/src/router/index.ts index 579b155..0a2c6fc 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -10,6 +10,7 @@ import useUserStore from '@/store/modules/user' import useMenuStore from '@/store/modules/menu' import useRouteStore from '@/store/modules/route' +import { queryString, stripscript } from '@/utils/validate' const { isLoading } = useNProgress() @@ -19,112 +20,131 @@ }) router.beforeEach(async (to, from, next) => { - console.log('to:', to.path) - const settingsStore = useSettingsStore() - const userStore = useUserStore() - const menuStore = useMenuStore() - const routeStore = useRouteStore() - settingsStore.app.enableProgress && (isLoading.value = true) - // 是否已登录 - if (userStore.isLogin) { - if (to.name === 'login') { // 如果还要进入登录页,直接跳转 - next() - } - else { - if (!userStore.hasUserInfo) { - // 获取用户信息 - await userStore.getUserInfo() - - console.log('index.ts-after userinfo', localStorage.token, userStore.username) + if (to.name !== 'NoPage') { + console.log('to:', to.path) + const settingsStore = useSettingsStore() + const userStore = useUserStore() + const menuStore = useMenuStore() + const routeStore = useRouteStore() + settingsStore.app.enableProgress && (isLoading.value = true) + // 是否已登录 + if (userStore.isLogin) { + if (to.name === 'login') { // 如果还要进入登录页,直接跳转 + next() } - // 是否已根据权限动态生成并注册路由 - if (routeStore.isGenerate) { - // 导航栏如果不是 single 模式,则需要根据 path 定位主导航的选中状态 - settingsStore.menu.menuMode !== 'single' && menuStore.setActived(to.path) - // 如果已登录状态下,进入登录页会强制跳转到控制台页面 - if (to.name === 'login') { - next({ - name: 'index', - replace: true, - }) + else { + // 携带token 需要去掉 + const hrefIdx = window.location.href.indexOf('token') // url中是否携带token + if (hrefIdx > -1) { + const params = queryString(window.location.href) + const token = stripscript(params.token) + localStorage.setItem('token', token) + localStorage.setItem('tokenBak', 'true') + // 刷新页面并隐藏token + window.location.href = window.location.href.replace(`?token=${token}`, '') + // history.go(0) } - // 如果未开启控制台,但进入的是控制台页面,则会进入侧边栏导航第一个模块 - else if (!settingsStore.dashboard.enable && to.name === 'dashboard') { - if (menuStore.sidebarMenus.length > 0) { + else { + localStorage.setItem('tokenBak', 'false') + } + if (!userStore.hasUserInfo) { + // 获取用户信息 + await userStore.getUserInfo() + + console.log('index.ts-after userinfo', localStorage.token, userStore.username) + } + // 是否已根据权限动态生成并注册路由 + if (routeStore.isGenerate) { + // 导航栏如果不是 single 模式,则需要根据 path 定位主导航的选中状态 + settingsStore.menu.menuMode !== 'single' && menuStore.setActived(to.path) + // 如果已登录状态下,进入登录页会强制跳转到控制台页面 + if (to.name === 'login') { next({ - path: menuStore.sidebarMenusFirstDeepestPath, + name: 'index', replace: true, }) } - // 如果侧边栏导航第一个模块无法命中,则还是进入控制台页面 + // 如果未开启控制台,但进入的是控制台页面,则会进入侧边栏导航第一个模块 + else if (!settingsStore.dashboard.enable && to.name === 'dashboard') { + if (menuStore.sidebarMenus.length > 0) { + next({ + path: menuStore.sidebarMenusFirstDeepestPath, + replace: true, + }) + } + // 如果侧边栏导航第一个模块无法命中,则还是进入控制台页面 + else { + next() + } + } + // 正常访问页面 else { next() } } - // 正常访问页面 else { - next() - } - } - else { - // 生成动态路由 - switch (settingsStore.app.routeBaseOn) { - case 'frontend': - await routeStore.generateRoutesAtFront(asyncRoutes) - break - case 'backend': - await routeStore.generateRoutesAtBack() - break - case 'filesystem': - await routeStore.generateRoutesAtFilesystem(asyncRoutesByFilesystem) - // 文件系统生成的路由,需要手动生成导航数据 - switch (settingsStore.menu.baseOn) { - case 'frontend': - await menuStore.generateMenusAtFront() - break - case 'backend': - await menuStore.generateMenusAtBack() - break - } - break - } - // 注册并记录路由数据 - // 记录的数据会在登出时会使用到,不使用 router.removeRoute 是考虑配置的路由可能不一定有设置 name ,则通过调用 router.addRoute() 返回的回调进行删除 - const removeRoutes: Function[] = [] - routeStore.flatRoutes.forEach((route) => { - if (!/^(https?:|mailto:|tel:)/.test(route.path)) { - removeRoutes.push(router.addRoute(route as RouteRecordRaw)) + // 生成动态路由 + switch (settingsStore.app.routeBaseOn) { + case 'frontend': + await routeStore.generateRoutesAtFront(asyncRoutes) + break + case 'backend': + await routeStore.generateRoutesAtBack() + break + case 'filesystem': + await routeStore.generateRoutesAtFilesystem(asyncRoutesByFilesystem) + // 文件系统生成的路由,需要手动生成导航数据 + switch (settingsStore.menu.baseOn) { + case 'frontend': + await menuStore.generateMenusAtFront() + break + case 'backend': + await menuStore.generateMenusAtBack() + break + } + break } - }) - // 添加静态路由 - if (settingsStore.app.routeBaseOn !== 'filesystem') { - routeStore.flatSystemRoutes.forEach((route) => { - removeRoutes.push(router.addRoute(route as RouteRecordRaw)) + // 注册并记录路由数据 + // 记录的数据会在登出时会使用到,不使用 router.removeRoute 是考虑配置的路由可能不一定有设置 name ,则通过调用 router.addRoute() 返回的回调进行删除 + const removeRoutes: Function[] = [] + routeStore.flatRoutes.forEach((route) => { + if (!/^(https?:|mailto:|tel:)/.test(route.path)) { + removeRoutes.push(router.addRoute(route as RouteRecordRaw)) + } + }) + // 添加静态路由 + if (settingsStore.app.routeBaseOn !== 'filesystem') { + routeStore.flatSystemRoutes.forEach((route) => { + removeRoutes.push(router.addRoute(route as RouteRecordRaw)) + }) + } + routeStore.setCurrentRemoveRoutes(removeRoutes) + // 动态路由生成并注册后,重新进入当前路由 + next({ + path: to.path, + query: to.query, + replace: true, }) } - routeStore.setCurrentRemoveRoutes(removeRoutes) - // 动态路由生成并注册后,重新进入当前路由 + } + } + else { + // 未登录跳转到登录 + if (to.name !== 'login') { next({ - path: to.path, - query: to.query, - replace: true, + name: 'login', + query: { + redirect: to.fullPath, + }, }) } + else { + next() + } } } else { - // 未登录跳转到登录 - if (to.name !== 'login') { - next({ - name: 'login', - query: { - redirect: to.fullPath, - }, - }) - } - else { - next() - } + next() } }) diff --git a/src/router/routes.ts b/src/router/routes.ts index 917b909..7aa25c1 100644 --- a/src/router/routes.ts +++ b/src/router/routes.ts @@ -22,6 +22,14 @@ }, }, { + path: '/noPage', + name: 'NoPage', + component: () => import('@/views/noPage.vue'), + meta: { + title: '找不到页面', + }, + }, + { path: '/:all(.*)*', name: 'notFound', component: () => import('@/views/[...all].vue'), diff --git "a/gm20241028\346\211\223\345\214\205.zip" "b/gm20241028\346\211\223\345\214\205.zip" new file mode 100644 index 0000000..b2cee12 --- /dev/null +++ "b/gm20241028\346\211\223\345\214\205.zip" Binary files differ diff --git a/public/config/config.json b/public/config/config.json index 84141e6..12a6978 100644 --- a/public/config/config.json +++ b/public/config/config.json @@ -10,5 +10,5 @@ "maxZoom": "13", "zoom": "10", "timeGap": 3000, - "systemType": "sm" + "systemType": "gm" } diff --git a/src/api/index.ts b/src/api/index.ts index ae60549..244333e 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -65,11 +65,27 @@ } else if (response.data.code !== responseCode.success && response.data.code !== responseCode.hikSuccess) { if (response.data.code === responseCode.noPermission) { // token失效状态跳转到登录页 - toLogin() - if (useUserStore().isLogout === 0) { - ElMessage.error(response.data.message || '发生错误') + // toLogin() + // if (useUserStore().isLogout === 0) { + // ElMessage.error(response.data.message || '发生错误') + // } + // useUserStore().toLogout()// 携带token + const hrefIdx = localStorage.getItem('tokenBak') + if (hrefIdx === 'true') { + console.log('跳转到404') + router.push({ + path: '/noPage', + }) } - useUserStore().toLogout() + else { + // token失效状态跳转到登录页 + toLogin() + if (useUserStore().isLogout === 0) { + // ElMessage.error(response.data.message || '发生错误') + ElMessage.warning(response.data.message || '发生错误') + } + useUserStore().toLogout() + } } else if (response.data.code === 500 && response.data.message === '数据格式不正确' && response.data.data) { const mes = response.data.data.filter((item: any, index: number) => index < 2).join(',') diff --git a/src/api/indexMedia.ts b/src/api/indexMedia.ts index b7e1652..72d60b2 100644 --- a/src/api/indexMedia.ts +++ b/src/api/indexMedia.ts @@ -67,11 +67,27 @@ } else if (response.data.code !== responseCode.success && response.data.code !== responseCode.hikSuccess && response.data.code !== responseCode.mediaSuccess && response.data.code !== responseCode.mediaError) { if (response.data.code === responseCode.noPermission) { // token失效状态跳转到登录页 - toLogin() - if (useUserStore().isLogout === 0) { - ElMessage.error(response.data.message || '发生错误') + // toLogin() + // if (useUserStore().isLogout === 0) { + // ElMessage.error(response.data.message || '发生错误') + // } + // useUserStore().toLogout() + const hrefIdx = localStorage.getItem('tokenBak') + if (hrefIdx === 'true') { + console.log('跳转到404') + router.push({ + path: '/noPage', + }) } - useUserStore().toLogout() + else { + // token失效状态跳转到登录页 + toLogin() + if (useUserStore().isLogout === 0) { + // ElMessage.error(response.data.message || '发生错误') + ElMessage.warning(response.data.message || '发生错误') + } + useUserStore().toLogout() + } } else if (response.data.code === 500 && response.data.message === '数据格式不正确' && response.data.data) { const mes = response.data.data.filter((item: any, index: number) => index < 2).join(',') diff --git a/src/router/index.ts b/src/router/index.ts index 579b155..0a2c6fc 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -10,6 +10,7 @@ import useUserStore from '@/store/modules/user' import useMenuStore from '@/store/modules/menu' import useRouteStore from '@/store/modules/route' +import { queryString, stripscript } from '@/utils/validate' const { isLoading } = useNProgress() @@ -19,112 +20,131 @@ }) router.beforeEach(async (to, from, next) => { - console.log('to:', to.path) - const settingsStore = useSettingsStore() - const userStore = useUserStore() - const menuStore = useMenuStore() - const routeStore = useRouteStore() - settingsStore.app.enableProgress && (isLoading.value = true) - // 是否已登录 - if (userStore.isLogin) { - if (to.name === 'login') { // 如果还要进入登录页,直接跳转 - next() - } - else { - if (!userStore.hasUserInfo) { - // 获取用户信息 - await userStore.getUserInfo() - - console.log('index.ts-after userinfo', localStorage.token, userStore.username) + if (to.name !== 'NoPage') { + console.log('to:', to.path) + const settingsStore = useSettingsStore() + const userStore = useUserStore() + const menuStore = useMenuStore() + const routeStore = useRouteStore() + settingsStore.app.enableProgress && (isLoading.value = true) + // 是否已登录 + if (userStore.isLogin) { + if (to.name === 'login') { // 如果还要进入登录页,直接跳转 + next() } - // 是否已根据权限动态生成并注册路由 - if (routeStore.isGenerate) { - // 导航栏如果不是 single 模式,则需要根据 path 定位主导航的选中状态 - settingsStore.menu.menuMode !== 'single' && menuStore.setActived(to.path) - // 如果已登录状态下,进入登录页会强制跳转到控制台页面 - if (to.name === 'login') { - next({ - name: 'index', - replace: true, - }) + else { + // 携带token 需要去掉 + const hrefIdx = window.location.href.indexOf('token') // url中是否携带token + if (hrefIdx > -1) { + const params = queryString(window.location.href) + const token = stripscript(params.token) + localStorage.setItem('token', token) + localStorage.setItem('tokenBak', 'true') + // 刷新页面并隐藏token + window.location.href = window.location.href.replace(`?token=${token}`, '') + // history.go(0) } - // 如果未开启控制台,但进入的是控制台页面,则会进入侧边栏导航第一个模块 - else if (!settingsStore.dashboard.enable && to.name === 'dashboard') { - if (menuStore.sidebarMenus.length > 0) { + else { + localStorage.setItem('tokenBak', 'false') + } + if (!userStore.hasUserInfo) { + // 获取用户信息 + await userStore.getUserInfo() + + console.log('index.ts-after userinfo', localStorage.token, userStore.username) + } + // 是否已根据权限动态生成并注册路由 + if (routeStore.isGenerate) { + // 导航栏如果不是 single 模式,则需要根据 path 定位主导航的选中状态 + settingsStore.menu.menuMode !== 'single' && menuStore.setActived(to.path) + // 如果已登录状态下,进入登录页会强制跳转到控制台页面 + if (to.name === 'login') { next({ - path: menuStore.sidebarMenusFirstDeepestPath, + name: 'index', replace: true, }) } - // 如果侧边栏导航第一个模块无法命中,则还是进入控制台页面 + // 如果未开启控制台,但进入的是控制台页面,则会进入侧边栏导航第一个模块 + else if (!settingsStore.dashboard.enable && to.name === 'dashboard') { + if (menuStore.sidebarMenus.length > 0) { + next({ + path: menuStore.sidebarMenusFirstDeepestPath, + replace: true, + }) + } + // 如果侧边栏导航第一个模块无法命中,则还是进入控制台页面 + else { + next() + } + } + // 正常访问页面 else { next() } } - // 正常访问页面 else { - next() - } - } - else { - // 生成动态路由 - switch (settingsStore.app.routeBaseOn) { - case 'frontend': - await routeStore.generateRoutesAtFront(asyncRoutes) - break - case 'backend': - await routeStore.generateRoutesAtBack() - break - case 'filesystem': - await routeStore.generateRoutesAtFilesystem(asyncRoutesByFilesystem) - // 文件系统生成的路由,需要手动生成导航数据 - switch (settingsStore.menu.baseOn) { - case 'frontend': - await menuStore.generateMenusAtFront() - break - case 'backend': - await menuStore.generateMenusAtBack() - break - } - break - } - // 注册并记录路由数据 - // 记录的数据会在登出时会使用到,不使用 router.removeRoute 是考虑配置的路由可能不一定有设置 name ,则通过调用 router.addRoute() 返回的回调进行删除 - const removeRoutes: Function[] = [] - routeStore.flatRoutes.forEach((route) => { - if (!/^(https?:|mailto:|tel:)/.test(route.path)) { - removeRoutes.push(router.addRoute(route as RouteRecordRaw)) + // 生成动态路由 + switch (settingsStore.app.routeBaseOn) { + case 'frontend': + await routeStore.generateRoutesAtFront(asyncRoutes) + break + case 'backend': + await routeStore.generateRoutesAtBack() + break + case 'filesystem': + await routeStore.generateRoutesAtFilesystem(asyncRoutesByFilesystem) + // 文件系统生成的路由,需要手动生成导航数据 + switch (settingsStore.menu.baseOn) { + case 'frontend': + await menuStore.generateMenusAtFront() + break + case 'backend': + await menuStore.generateMenusAtBack() + break + } + break } - }) - // 添加静态路由 - if (settingsStore.app.routeBaseOn !== 'filesystem') { - routeStore.flatSystemRoutes.forEach((route) => { - removeRoutes.push(router.addRoute(route as RouteRecordRaw)) + // 注册并记录路由数据 + // 记录的数据会在登出时会使用到,不使用 router.removeRoute 是考虑配置的路由可能不一定有设置 name ,则通过调用 router.addRoute() 返回的回调进行删除 + const removeRoutes: Function[] = [] + routeStore.flatRoutes.forEach((route) => { + if (!/^(https?:|mailto:|tel:)/.test(route.path)) { + removeRoutes.push(router.addRoute(route as RouteRecordRaw)) + } + }) + // 添加静态路由 + if (settingsStore.app.routeBaseOn !== 'filesystem') { + routeStore.flatSystemRoutes.forEach((route) => { + removeRoutes.push(router.addRoute(route as RouteRecordRaw)) + }) + } + routeStore.setCurrentRemoveRoutes(removeRoutes) + // 动态路由生成并注册后,重新进入当前路由 + next({ + path: to.path, + query: to.query, + replace: true, }) } - routeStore.setCurrentRemoveRoutes(removeRoutes) - // 动态路由生成并注册后,重新进入当前路由 + } + } + else { + // 未登录跳转到登录 + if (to.name !== 'login') { next({ - path: to.path, - query: to.query, - replace: true, + name: 'login', + query: { + redirect: to.fullPath, + }, }) } + else { + next() + } } } else { - // 未登录跳转到登录 - if (to.name !== 'login') { - next({ - name: 'login', - query: { - redirect: to.fullPath, - }, - }) - } - else { - next() - } + next() } }) diff --git a/src/router/routes.ts b/src/router/routes.ts index 917b909..7aa25c1 100644 --- a/src/router/routes.ts +++ b/src/router/routes.ts @@ -22,6 +22,14 @@ }, }, { + path: '/noPage', + name: 'NoPage', + component: () => import('@/views/noPage.vue'), + meta: { + title: '找不到页面', + }, + }, + { path: '/:all(.*)*', name: 'notFound', component: () => import('@/views/[...all].vue'), diff --git a/src/utils/validate.ts b/src/utils/validate.ts index 472373c..0141862 100644 --- a/src/utils/validate.ts +++ b/src/utils/validate.ts @@ -7,6 +7,30 @@ return val !== '' } +// 提取url params参数 +export function queryString(str: string) { + const params = str.split('?')[1] // 截取?号后的字符串即name=itclanCoder&study=css + const param = params.split('&') // 通过&符号进行分割即["name=itclanCoder", "study=css"] + const obj: { [key: string]: string } = {} // 用一个对象存储目标值 + for (let i = 0; i < param.length; i++) { + // 循环遍历截取出来的param数组 + const paramsA = param[i].split('=') // 通过split,=继续对数组params每一项进行分割,生成数组["name", "itclanCoder"] + const key = paramsA[0] // 取数组项["name", "itclanCoder"]中第0位,即name + const value = paramsA[1] // 取数组项["name", "itclanCoder"]中第1位,即itclanCoder + obj[key] = value + } + return obj +} +// 去除字符串中的特殊符号 +export function stripscript(s: string) { + var pattern = /[[\]\/:*?"<>|#]/ + var rs = '' + for (var i = 0; i < s.length; i++) { + rs = rs + s.substr(i, 1).replace(pattern, '') + } + return rs +} + // /** * 判断是否为整数 @@ -23,7 +47,8 @@ * @returns 是否合法 */ export const isIp = (ip: string): boolean => { - var rep = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/ + var rep + = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/ return rep.test(ip) } @@ -96,7 +121,8 @@ * @returns {boolean} */ export function validateEmail(email: string) { - const re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ + const re + = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ return re.test(email) } @@ -116,7 +142,8 @@ * @returns */ export function validateIdCardNo(value: string) { - const re = /^[1-9]\d{5}(18|19|20|(3\d))\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/ + const re + = /^[1-9]\d{5}(18|19|20|(3\d))\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/ return re.test(value) } /** @@ -125,7 +152,8 @@ * @returns */ export function validatePhone(value: string) { - const re = /(\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1}))$/ + const re + = /(\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1}))$/ return re.test(value) } @@ -133,7 +161,8 @@ * 强类型密码验证 */ export function validatePasswordStrong(value: string) { - const re = /^(?![0-9]+$)(?![a-zA-Z]+$)(?![0-9a-zA-Z]+$)(?![0-9\\W]+$)(?![a-zA-Z\\W]+$)[0-9A-Za-z\\W]{6,18}$/ + const re + = /^(?![0-9]+$)(?![a-zA-Z]+$)(?![0-9a-zA-Z]+$)(?![0-9\\W]+$)(?![a-zA-Z\\W]+$)[0-9A-Za-z\\W]{6,18}$/ return re.test(value) } /** diff --git "a/gm20241028\346\211\223\345\214\205.zip" "b/gm20241028\346\211\223\345\214\205.zip" new file mode 100644 index 0000000..b2cee12 --- /dev/null +++ "b/gm20241028\346\211\223\345\214\205.zip" Binary files differ diff --git a/public/config/config.json b/public/config/config.json index 84141e6..12a6978 100644 --- a/public/config/config.json +++ b/public/config/config.json @@ -10,5 +10,5 @@ "maxZoom": "13", "zoom": "10", "timeGap": 3000, - "systemType": "sm" + "systemType": "gm" } diff --git a/src/api/index.ts b/src/api/index.ts index ae60549..244333e 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -65,11 +65,27 @@ } else if (response.data.code !== responseCode.success && response.data.code !== responseCode.hikSuccess) { if (response.data.code === responseCode.noPermission) { // token失效状态跳转到登录页 - toLogin() - if (useUserStore().isLogout === 0) { - ElMessage.error(response.data.message || '发生错误') + // toLogin() + // if (useUserStore().isLogout === 0) { + // ElMessage.error(response.data.message || '发生错误') + // } + // useUserStore().toLogout()// 携带token + const hrefIdx = localStorage.getItem('tokenBak') + if (hrefIdx === 'true') { + console.log('跳转到404') + router.push({ + path: '/noPage', + }) } - useUserStore().toLogout() + else { + // token失效状态跳转到登录页 + toLogin() + if (useUserStore().isLogout === 0) { + // ElMessage.error(response.data.message || '发生错误') + ElMessage.warning(response.data.message || '发生错误') + } + useUserStore().toLogout() + } } else if (response.data.code === 500 && response.data.message === '数据格式不正确' && response.data.data) { const mes = response.data.data.filter((item: any, index: number) => index < 2).join(',') diff --git a/src/api/indexMedia.ts b/src/api/indexMedia.ts index b7e1652..72d60b2 100644 --- a/src/api/indexMedia.ts +++ b/src/api/indexMedia.ts @@ -67,11 +67,27 @@ } else if (response.data.code !== responseCode.success && response.data.code !== responseCode.hikSuccess && response.data.code !== responseCode.mediaSuccess && response.data.code !== responseCode.mediaError) { if (response.data.code === responseCode.noPermission) { // token失效状态跳转到登录页 - toLogin() - if (useUserStore().isLogout === 0) { - ElMessage.error(response.data.message || '发生错误') + // toLogin() + // if (useUserStore().isLogout === 0) { + // ElMessage.error(response.data.message || '发生错误') + // } + // useUserStore().toLogout() + const hrefIdx = localStorage.getItem('tokenBak') + if (hrefIdx === 'true') { + console.log('跳转到404') + router.push({ + path: '/noPage', + }) } - useUserStore().toLogout() + else { + // token失效状态跳转到登录页 + toLogin() + if (useUserStore().isLogout === 0) { + // ElMessage.error(response.data.message || '发生错误') + ElMessage.warning(response.data.message || '发生错误') + } + useUserStore().toLogout() + } } else if (response.data.code === 500 && response.data.message === '数据格式不正确' && response.data.data) { const mes = response.data.data.filter((item: any, index: number) => index < 2).join(',') diff --git a/src/router/index.ts b/src/router/index.ts index 579b155..0a2c6fc 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -10,6 +10,7 @@ import useUserStore from '@/store/modules/user' import useMenuStore from '@/store/modules/menu' import useRouteStore from '@/store/modules/route' +import { queryString, stripscript } from '@/utils/validate' const { isLoading } = useNProgress() @@ -19,112 +20,131 @@ }) router.beforeEach(async (to, from, next) => { - console.log('to:', to.path) - const settingsStore = useSettingsStore() - const userStore = useUserStore() - const menuStore = useMenuStore() - const routeStore = useRouteStore() - settingsStore.app.enableProgress && (isLoading.value = true) - // 是否已登录 - if (userStore.isLogin) { - if (to.name === 'login') { // 如果还要进入登录页,直接跳转 - next() - } - else { - if (!userStore.hasUserInfo) { - // 获取用户信息 - await userStore.getUserInfo() - - console.log('index.ts-after userinfo', localStorage.token, userStore.username) + if (to.name !== 'NoPage') { + console.log('to:', to.path) + const settingsStore = useSettingsStore() + const userStore = useUserStore() + const menuStore = useMenuStore() + const routeStore = useRouteStore() + settingsStore.app.enableProgress && (isLoading.value = true) + // 是否已登录 + if (userStore.isLogin) { + if (to.name === 'login') { // 如果还要进入登录页,直接跳转 + next() } - // 是否已根据权限动态生成并注册路由 - if (routeStore.isGenerate) { - // 导航栏如果不是 single 模式,则需要根据 path 定位主导航的选中状态 - settingsStore.menu.menuMode !== 'single' && menuStore.setActived(to.path) - // 如果已登录状态下,进入登录页会强制跳转到控制台页面 - if (to.name === 'login') { - next({ - name: 'index', - replace: true, - }) + else { + // 携带token 需要去掉 + const hrefIdx = window.location.href.indexOf('token') // url中是否携带token + if (hrefIdx > -1) { + const params = queryString(window.location.href) + const token = stripscript(params.token) + localStorage.setItem('token', token) + localStorage.setItem('tokenBak', 'true') + // 刷新页面并隐藏token + window.location.href = window.location.href.replace(`?token=${token}`, '') + // history.go(0) } - // 如果未开启控制台,但进入的是控制台页面,则会进入侧边栏导航第一个模块 - else if (!settingsStore.dashboard.enable && to.name === 'dashboard') { - if (menuStore.sidebarMenus.length > 0) { + else { + localStorage.setItem('tokenBak', 'false') + } + if (!userStore.hasUserInfo) { + // 获取用户信息 + await userStore.getUserInfo() + + console.log('index.ts-after userinfo', localStorage.token, userStore.username) + } + // 是否已根据权限动态生成并注册路由 + if (routeStore.isGenerate) { + // 导航栏如果不是 single 模式,则需要根据 path 定位主导航的选中状态 + settingsStore.menu.menuMode !== 'single' && menuStore.setActived(to.path) + // 如果已登录状态下,进入登录页会强制跳转到控制台页面 + if (to.name === 'login') { next({ - path: menuStore.sidebarMenusFirstDeepestPath, + name: 'index', replace: true, }) } - // 如果侧边栏导航第一个模块无法命中,则还是进入控制台页面 + // 如果未开启控制台,但进入的是控制台页面,则会进入侧边栏导航第一个模块 + else if (!settingsStore.dashboard.enable && to.name === 'dashboard') { + if (menuStore.sidebarMenus.length > 0) { + next({ + path: menuStore.sidebarMenusFirstDeepestPath, + replace: true, + }) + } + // 如果侧边栏导航第一个模块无法命中,则还是进入控制台页面 + else { + next() + } + } + // 正常访问页面 else { next() } } - // 正常访问页面 else { - next() - } - } - else { - // 生成动态路由 - switch (settingsStore.app.routeBaseOn) { - case 'frontend': - await routeStore.generateRoutesAtFront(asyncRoutes) - break - case 'backend': - await routeStore.generateRoutesAtBack() - break - case 'filesystem': - await routeStore.generateRoutesAtFilesystem(asyncRoutesByFilesystem) - // 文件系统生成的路由,需要手动生成导航数据 - switch (settingsStore.menu.baseOn) { - case 'frontend': - await menuStore.generateMenusAtFront() - break - case 'backend': - await menuStore.generateMenusAtBack() - break - } - break - } - // 注册并记录路由数据 - // 记录的数据会在登出时会使用到,不使用 router.removeRoute 是考虑配置的路由可能不一定有设置 name ,则通过调用 router.addRoute() 返回的回调进行删除 - const removeRoutes: Function[] = [] - routeStore.flatRoutes.forEach((route) => { - if (!/^(https?:|mailto:|tel:)/.test(route.path)) { - removeRoutes.push(router.addRoute(route as RouteRecordRaw)) + // 生成动态路由 + switch (settingsStore.app.routeBaseOn) { + case 'frontend': + await routeStore.generateRoutesAtFront(asyncRoutes) + break + case 'backend': + await routeStore.generateRoutesAtBack() + break + case 'filesystem': + await routeStore.generateRoutesAtFilesystem(asyncRoutesByFilesystem) + // 文件系统生成的路由,需要手动生成导航数据 + switch (settingsStore.menu.baseOn) { + case 'frontend': + await menuStore.generateMenusAtFront() + break + case 'backend': + await menuStore.generateMenusAtBack() + break + } + break } - }) - // 添加静态路由 - if (settingsStore.app.routeBaseOn !== 'filesystem') { - routeStore.flatSystemRoutes.forEach((route) => { - removeRoutes.push(router.addRoute(route as RouteRecordRaw)) + // 注册并记录路由数据 + // 记录的数据会在登出时会使用到,不使用 router.removeRoute 是考虑配置的路由可能不一定有设置 name ,则通过调用 router.addRoute() 返回的回调进行删除 + const removeRoutes: Function[] = [] + routeStore.flatRoutes.forEach((route) => { + if (!/^(https?:|mailto:|tel:)/.test(route.path)) { + removeRoutes.push(router.addRoute(route as RouteRecordRaw)) + } + }) + // 添加静态路由 + if (settingsStore.app.routeBaseOn !== 'filesystem') { + routeStore.flatSystemRoutes.forEach((route) => { + removeRoutes.push(router.addRoute(route as RouteRecordRaw)) + }) + } + routeStore.setCurrentRemoveRoutes(removeRoutes) + // 动态路由生成并注册后,重新进入当前路由 + next({ + path: to.path, + query: to.query, + replace: true, }) } - routeStore.setCurrentRemoveRoutes(removeRoutes) - // 动态路由生成并注册后,重新进入当前路由 + } + } + else { + // 未登录跳转到登录 + if (to.name !== 'login') { next({ - path: to.path, - query: to.query, - replace: true, + name: 'login', + query: { + redirect: to.fullPath, + }, }) } + else { + next() + } } } else { - // 未登录跳转到登录 - if (to.name !== 'login') { - next({ - name: 'login', - query: { - redirect: to.fullPath, - }, - }) - } - else { - next() - } + next() } }) diff --git a/src/router/routes.ts b/src/router/routes.ts index 917b909..7aa25c1 100644 --- a/src/router/routes.ts +++ b/src/router/routes.ts @@ -22,6 +22,14 @@ }, }, { + path: '/noPage', + name: 'NoPage', + component: () => import('@/views/noPage.vue'), + meta: { + title: '找不到页面', + }, + }, + { path: '/:all(.*)*', name: 'notFound', component: () => import('@/views/[...all].vue'), diff --git a/src/utils/validate.ts b/src/utils/validate.ts index 472373c..0141862 100644 --- a/src/utils/validate.ts +++ b/src/utils/validate.ts @@ -7,6 +7,30 @@ return val !== '' } +// 提取url params参数 +export function queryString(str: string) { + const params = str.split('?')[1] // 截取?号后的字符串即name=itclanCoder&study=css + const param = params.split('&') // 通过&符号进行分割即["name=itclanCoder", "study=css"] + const obj: { [key: string]: string } = {} // 用一个对象存储目标值 + for (let i = 0; i < param.length; i++) { + // 循环遍历截取出来的param数组 + const paramsA = param[i].split('=') // 通过split,=继续对数组params每一项进行分割,生成数组["name", "itclanCoder"] + const key = paramsA[0] // 取数组项["name", "itclanCoder"]中第0位,即name + const value = paramsA[1] // 取数组项["name", "itclanCoder"]中第1位,即itclanCoder + obj[key] = value + } + return obj +} +// 去除字符串中的特殊符号 +export function stripscript(s: string) { + var pattern = /[[\]\/:*?"<>|#]/ + var rs = '' + for (var i = 0; i < s.length; i++) { + rs = rs + s.substr(i, 1).replace(pattern, '') + } + return rs +} + // /** * 判断是否为整数 @@ -23,7 +47,8 @@ * @returns 是否合法 */ export const isIp = (ip: string): boolean => { - var rep = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/ + var rep + = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/ return rep.test(ip) } @@ -96,7 +121,8 @@ * @returns {boolean} */ export function validateEmail(email: string) { - const re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ + const re + = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ return re.test(email) } @@ -116,7 +142,8 @@ * @returns */ export function validateIdCardNo(value: string) { - const re = /^[1-9]\d{5}(18|19|20|(3\d))\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/ + const re + = /^[1-9]\d{5}(18|19|20|(3\d))\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/ return re.test(value) } /** @@ -125,7 +152,8 @@ * @returns */ export function validatePhone(value: string) { - const re = /(\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1}))$/ + const re + = /(\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1}))$/ return re.test(value) } @@ -133,7 +161,8 @@ * 强类型密码验证 */ export function validatePasswordStrong(value: string) { - const re = /^(?![0-9]+$)(?![a-zA-Z]+$)(?![0-9a-zA-Z]+$)(?![0-9\\W]+$)(?![a-zA-Z\\W]+$)[0-9A-Za-z\\W]{6,18}$/ + const re + = /^(?![0-9]+$)(?![a-zA-Z]+$)(?![0-9a-zA-Z]+$)(?![0-9\\W]+$)(?![a-zA-Z\\W]+$)[0-9A-Za-z\\W]{6,18}$/ return re.test(value) } /** diff --git a/src/views/noPage.vue b/src/views/noPage.vue new file mode 100644 index 0000000..31a7e8b --- /dev/null +++ b/src/views/noPage.vue @@ -0,0 +1,52 @@ + +name: NoPage +meta: + title: 找不到页面 + constant: true + layout: false + + + + + + +