lrf 10 mesiacov pred
rodič
commit
e106af65a8

+ 1 - 1
src/layout/parts/Header.vue

@@ -38,7 +38,7 @@ const router = useRouter()
 const logout = () => {
   userStore.logOut()
   tagsViewStore.delAllViews()
-  window.location.href = '/login'
+  window.location.href = `${import.meta.env.VITE_BASE_URL}/login`
 }
 // 个人中心
 const center = () => {

+ 2 - 123
src/router/guard.js

@@ -1,132 +1,11 @@
-import { AxiosWrapper } from '@/utils/axios-wrapper'
-import { UserStore } from '@/store/user'
-import { cloneDeep, get, isArray, omit } from 'lodash-es'
+import { hasNecessaryRoute, addUserRoutes, getUserMeta } from './register'
+import { get } from 'lodash-es'
 import NProgress from 'nprogress'
 import 'nprogress/nprogress.css'
 import { ElMessageBox } from 'element-plus'
 import i18n from '@/lang'
 const whiteList = ['/redirect', '/login', '/401', '/404']
 NProgress.configure({ showSpinner: false }) // 进度条
-// 检查路由是否存在
-const hasNecessaryRoute = (to, router) => {
-  // 将默认注册的路由平铺成一维数组
-  const routesOneDimensional = toOneDimensional(router.getRoutes())
-  return routesOneDimensional.find((f) => f.path === to.path)
-}
-// 获取用户信息,返回菜单
-const getUserMeta = async (token) => {
-  const userStore = UserStore()
-  const axios = new AxiosWrapper()
-  const result = await axios.$get(`/token/tokenView`, null, {
-    headers: {
-      token: token
-    }
-  })
-  if (result.errcode === 0) {
-    userStore.setUser(result.data)
-    const resetMenusResult = resetMenus(result.data.menus)
-    const storeMenus = toRaw(userStore.menus)
-    if (storeMenus.length <= 0) {
-      userStore.setMenus(resetMenusResult)
-    }
-    return { menus: result.data.menus, errcode: 0 }
-  }
-  return { errmsg: result.errmsg, errcode: result.errcode }
-}
-/**
- * 将路由数组一维化
- * @param {Array} routes 路由数组
- * @returns 一维路由数组
- */
-const toOneDimensional = (routes) => {
-  const result = []
-  for (const r of routes) {
-    const { children = [], ...others } = r
-    result.push(others)
-    if (children.length > 0) result.push(...toOneDimensional(children))
-  }
-  return result
-}
-// 添加路由
-const addUserRoutes = async (menus, router) => {
-  return new Promise((resolve, reject) => {
-    // 将用户菜单转换成普通对象
-    const menuArr = toRaw(menus)
-    // 将用户菜单平铺成一维数组,并将目录过滤出去.目录不需要注册,不是组件
-    const menuOneDimensional = toOneDimensional(menuArr)
-    // 将默认注册的路由平铺成一维数组
-    const routesOneDimensional = toOneDimensional(router.getRoutes())
-    routesRegister(menuOneDimensional, routesOneDimensional, router)
-    resolve()
-  })
-}
-/**
- * 注册路由
- * @param {Array} menus 一维数组菜单
- * @param {Array} defaultRoutes 默认路由一维数组
- * @param {*} router 路由实例
- */
-const routesRegister = (menus, defaultRoutes, router) => {
-  // 默认注册位置
-  const __def = 'Layout'
-  const loadComponent = import.meta.glob('../views/**/*.vue')
-  for (const route of menus) {
-    const { type, route_name, path, component, parent_id } = route
-    if (!path) {
-      // console.log(route)
-    }
-    // 检查路由是否已存在,存在跳过
-    const hasRoute = defaultRoutes.find((f) => f.path === path)
-    if (hasRoute) continue
-    if (type === '0') {
-      // 目录, 默认使用 `/${路由名称}`
-      const route = {
-        path: `/${route_name}`,
-        name: route_name,
-        meta: { title: route_name, type }
-      }
-      router.addRoute(__def, route)
-    } else if (type === '1' || type === '2') {
-      // 菜单 或 子菜单
-      const route = {
-        path: path,
-        name: route_name,
-        meta: {
-          title: route_name,
-          type
-        },
-        component: loadComponent[`../views${component}.vue`]
-      }
-      if (parent_id) {
-        const parent = menus.find((f) => f._id === parent_id)
-        if (!parent) continue
-        const pos = parent.route_name
-        router.addRoute(pos, route)
-        // try {
-        // } catch (error) {
-        //   console.log(pos, route)
-        //   console.error(error)
-        // }
-      } else {
-        router.addRoute(__def, route)
-      }
-    }
-  }
-}
-
-const resetMenus = (menus) => {
-  if (!isArray(menus) || menus.length <= 0) return []
-  const cMenus = cloneDeep(menus)
-  const result = []
-  for (const m of cMenus) {
-    const mid = omit(m, ['is_use', 'order_num', 'in_admin_frame'])
-    const { children } = mid
-    if (children) mid.children = resetMenus(children)
-    result.push(mid)
-  }
-  return result
-}
-
 const dontRedirectList = ['/login', '/', '/401', '/404']
 
 // 注册前置守卫

+ 126 - 0
src/router/register.js

@@ -0,0 +1,126 @@
+import { AxiosWrapper } from '@/utils/axios-wrapper'
+import { UserStore } from '@/store/user'
+import { cloneDeep, isArray, omit } from 'lodash-es'
+// 检查路由是否存在
+export const hasNecessaryRoute = (to, router) => {
+  // 将默认注册的路由平铺成一维数组
+  const routesOneDimensional = toOneDimensional(router.getRoutes())
+  return routesOneDimensional.find((f) => f.path === to.path)
+}
+
+/**
+ * 将路由数组一维化
+ * @param {Array} routes 路由数组
+ * @returns 一维路由数组
+ */
+const toOneDimensional = (routes) => {
+  const result = []
+  for (const r of routes) {
+    const { children = [], ...others } = r
+    result.push(others)
+    if (children.length > 0) result.push(...toOneDimensional(children))
+  }
+  return result
+}
+
+// 添加路由
+export const addUserRoutes = (menus, router) => {
+  return new Promise((resolve, reject) => {
+    // 将用户菜单转换成普通对象
+    const menuArr = toRaw(menus)
+    // 将用户菜单平铺成一维数组,并将目录过滤出去.目录不需要注册,不是组件
+    const menuOneDimensional = toOneDimensional(menuArr)
+    // 将默认注册的路由平铺成一维数组
+    const routesOneDimensional = toOneDimensional(router.getRoutes())
+    routesRegister(menuOneDimensional, routesOneDimensional, router)
+    resolve()
+  })
+}
+
+/**
+ * 注册路由
+ * @param {Array} menus 一维数组菜单
+ * @param {Array} defaultRoutes 默认路由一维数组
+ * @param {*} router 路由实例
+ */
+export const routesRegister = (menus, defaultRoutes, router) => {
+  // 默认注册位置
+  const __def = 'Layout'
+  const loadComponent = import.meta.glob('../views/**/*.vue')
+  for (const route of menus) {
+    const { type, route_name, path, component, parent_id } = route
+    if (!path) {
+      // console.log(route)
+    }
+    // 检查路由是否已存在,存在跳过
+    const hasRoute = defaultRoutes.find((f) => f.path === path)
+    if (hasRoute) continue
+    if (type === '0') {
+      // 目录, 默认使用 `/${路由名称}`
+      const route = {
+        path: `/${route_name}`,
+        name: route_name,
+        meta: { title: route_name, type }
+      }
+      router.addRoute(__def, route)
+    } else if (type === '1' || type === '2') {
+      // 菜单 或 子菜单
+      const route = {
+        path: path,
+        name: route_name,
+        meta: {
+          title: route_name,
+          type
+        },
+        component: loadComponent[`../views${component}.vue`]
+      }
+      if (parent_id) {
+        const parent = menus.find((f) => f._id === parent_id)
+        if (!parent) continue
+        const pos = parent.route_name
+        router.addRoute(pos, route)
+        // try {
+        // } catch (error) {
+        //   console.log(pos, route)
+        //   console.error(error)
+        // }
+      } else {
+        router.addRoute(__def, route)
+      }
+    }
+  }
+}
+
+// 获取用户信息,返回菜单
+export const getUserMeta = async (token) => {
+  const userStore = UserStore()
+  const axios = new AxiosWrapper()
+  const result = await axios.$get(`/token/tokenView`, null, {
+    headers: {
+      token: token
+    }
+  })
+  if (result.errcode === 0) {
+    userStore.setUser(result.data)
+    const resetMenusResult = resetMenus(result.data.menus)
+    const storeMenus = toRaw(userStore.menus)
+    if (storeMenus.length <= 0) {
+      userStore.setMenus(resetMenusResult)
+    }
+    return { menus: result.data.menus, errcode: 0 }
+  }
+  return { errmsg: result.errmsg, errcode: result.errcode }
+}
+
+const resetMenus = (menus) => {
+  if (!isArray(menus) || menus.length <= 0) return []
+  const cMenus = cloneDeep(menus)
+  const result = []
+  for (const m of cMenus) {
+    const mid = omit(m, ['is_use', 'order_num', 'in_admin_frame'])
+    const { children } = mid
+    if (children) mid.children = resetMenus(children)
+    result.push(mid)
+  }
+  return result
+}

+ 9 - 3
src/utils/axios-wrapper.js

@@ -81,7 +81,7 @@ export class AxiosWrapper {
       })
       // #region 加密部分
       // 加密,需要根据env文件判断是否启用加密
-      if (VITE_USE_CRYPTO) {
+      if (JSON.parse(VITE_USE_CRYPTO)) {
         // 生成随机字符串
         const reqCode = crypto.getRandomString()
         axios.interceptors.request.use(async (config) => {
@@ -90,12 +90,18 @@ export class AxiosWrapper {
           // 加密数据并替换
           config.transformRequest = (data) => {
             if (data) {
+              console.group('请求')
+              console.log(`加密串:${reqCode}`)
+              console.log(`原数据:`)
               // 加密 加密字符串
               const strData = JSON.stringify(data)
+              console.log(strData)
               // 加密数据
-              const enCodeData = crypto.encrypt(deReqCode, strData)
+              const enCodeData = crypto.encrypt(reqCode, strData)
+              console.log(`加密后数据:`)
+              console.log(enCodeData)
               // 替换数据位置
-              return { data: enCodeData }
+              return JSON.stringify({ data: enCodeData })
             }
             return undefined
           }