zhuangyunsheng vor 1 Jahr
Ursprung
Commit
e587ab04f6
71 geänderte Dateien mit 4943 neuen und 4978 gelöschten Zeilen
  1. 20 20
      .eslintrc.cjs
  2. 11 11
      index.html
  3. 1 1
      package.json
  4. 2 2
      src/App.vue
  5. 27 27
      src/api/login.js
  6. 26 26
      src/api/system/dataList.js
  7. 23 23
      src/api/system/depart.js
  8. 29 29
      src/api/system/menu.js
  9. 23 23
      src/api/system/person.js
  10. 49 49
      src/api/system/role.js
  11. 22 22
      src/api/system/user.js
  12. 1 2
      src/assets/style/common.scss
  13. 47 47
      src/components/IconSelect/index.vue
  14. 5 5
      src/components/IconSelect/requireIcons.js
  15. 2 2
      src/components/ParentView/index.vue
  16. 26 27
      src/components/SvgIcon/index.vue
  17. 1 1
      src/components/SvgIcon/svgicon.js
  18. 18 18
      src/components/test.vue
  19. 2 2
      src/directive/index.js
  20. 21 22
      src/directive/permission/hasPermi.js
  21. 15 15
      src/i18n/index.js
  22. 4 4
      src/i18n/lang/en.js
  23. 3 3
      src/i18n/lang/zh-cn.js
  24. 7 7
      src/layout/components/Logo/index.vue
  25. 11 10
      src/layout/components/Main/index.vue
  26. 36 37
      src/layout/components/NavBar/components/Breadcrumb.vue
  27. 3 3
      src/layout/components/NavBar/components/FullScreenBtn.vue
  28. 6 6
      src/layout/components/NavBar/components/LayoutStyleSet.vue
  29. 119 119
      src/layout/components/NavBar/components/MenuSearch.vue
  30. 55 61
      src/layout/components/NavBar/index.vue
  31. 33 33
      src/layout/components/SideBar/index.vue
  32. 45 49
      src/layout/components/SideBar/indexH.vue
  33. 82 83
      src/layout/components/SideBar/sideBarItem.vue
  34. 158 157
      src/layout/components/TabsBar/index.vue
  35. 26 24
      src/layout/index.vue
  36. 1 1
      src/micro/index.js
  37. 36 36
      src/micro/index.vue
  38. 36 39
      src/otherLogin/bx.vue
  39. 36 41
      src/otherLogin/ssoSgzl.vue
  40. 29 28
      src/permission.js
  41. 96 96
      src/router/constantRoutes.js
  42. 67 67
      src/router/dynamicRoutes.js
  43. 4 4
      src/router/index.js
  44. 153 157
      src/store/permission.js
  45. 20 20
      src/store/settings.js
  46. 15 15
      src/store/tabsbar.js
  47. 159 159
      src/store/user.js
  48. 90 90
      src/utils/aes.js
  49. 9 9
      src/utils/auth.js
  50. 28 28
      src/utils/color.js
  51. 2 2
      src/utils/mittBus.js
  52. 45 45
      src/utils/request.js
  53. 14 14
      src/utils/tjmTools.js
  54. 0 1
      src/views/404.vue
  55. 235 241
      src/views/error/noPermission.vue
  56. 266 267
      src/views/login/index.vue
  57. 216 214
      src/views/login/index_old.vue
  58. 46 0
      src/views/policyShare/index.vue
  59. 1 1
      src/views/redirect/index.vue
  60. 354 357
      src/views/system/dataList.vue
  61. 281 288
      src/views/system/dept.vue
  62. 449 469
      src/views/system/menu.vue
  63. 425 434
      src/views/system/role.vue
  64. 441 451
      src/views/system/user.vue
  65. 236 236
      src/views/system/userInfo.vue
  66. 90 90
      src/views/test.vue
  67. 0 1
      src/views/test/index1.vue
  68. 0 1
      src/views/test/index2.vue
  69. 0 1
      src/views/test/index3.vue
  70. 0 1
      src/views/test/index4.vue
  71. 104 104
      vite.config.js

+ 20 - 20
.eslintrc.cjs

@@ -2,24 +2,24 @@
 require('@rushstack/eslint-patch/modern-module-resolution')
 
 module.exports = {
-  env: {
-    browser: true,
-    node: true,
-    es2021: true, 
-  },
-  root: true,
-  'extends': [
-    './.eslintrc-auto-import.json', 
-    'plugin:vue/vue3-essential',
-    'eslint:recommended', 
-    '@vue/eslint-config-prettier/skip-formatting' 
-  ],
-  parserOptions: {
-    ecmaVersion: 'latest'
-  },
-  rules:{
-    semi: ["warn", "never"], 
-    "no-debugger": "warn",
-    'vue/multi-word-component-names': 'off'
-  }
+    env: {
+        browser: true,
+        node: true,
+        es2021: true,
+    },
+    root: true,
+    'extends': [
+        './.eslintrc-auto-import.json',
+        'plugin:vue/vue3-essential',
+        'eslint:recommended',
+        '@vue/eslint-config-prettier/skip-formatting'
+    ],
+    parserOptions: {
+        ecmaVersion: 'latest'
+    },
+    rules: {
+        semi: ["warn", "never"],
+        "no-debugger": "warn",
+        'vue/multi-word-component-names': 'off'
+    }
 }

+ 11 - 11
index.html

@@ -1,13 +1,13 @@
 <!DOCTYPE html>
 <html lang="en">
-  <head>
-    <meta charset="UTF-8">
-    <link rel="icon" href="/yh.ico">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <title>玉衡-Admin</title>
-  </head>
-  <body>
-    <div id="app"></div>
-    <script type="module" src="/src/main.js"></script>
-  </body>
-</html>
+    <head>
+        <meta charset="UTF-8">
+        <link rel="icon" href="/yh.ico">
+        <meta name="viewport" content="width=device-width, initial-scale=1.0">
+        <title>玉衡-Admin</title>
+    </head>
+    <body>
+        <div id="app"></div>
+        <script type="module" src="/src/main.js"></script>
+    </body>
+</html>

+ 1 - 1
package.json

@@ -43,4 +43,4 @@
     "vite": "^4.4.9",
     "vite-plugin-svg-icons": "^2.0.1"
   }
-}
+}

+ 2 - 2
src/App.vue

@@ -3,7 +3,7 @@ const route = useRoute()
 </script>
 
 <template>
-  <router-view />
+    <router-view />
 </template>
 
-<style scoped></style>
+<style scoped></style>

+ 27 - 27
src/api/login.js

@@ -1,40 +1,40 @@
-import request from '@/utils/request'
+import request from "@/utils/request"
 
 // 登录方法
 export function login(data) {
-  return request({
-    url: '/qdport-auth/oauth/token',
-    method: 'post',
-    headers: {
-      'Content-Type': 'application/x-www-form-urlencoded'
-    },
-    data: data
-  })
+    return request({
+        url: "/qdport-auth/oauth/token",
+        method: "post",
+        headers: {
+            "Content-Type": "application/x-www-form-urlencoded"
+        },
+        data: data
+    })
 }
 
 export function passwordChange(data) {
-  return request({
-    url: '/qdport-auth/oauth/forceChangePassword',
-    method: 'post',
-    headers: {
-      'Content-Type': 'application/x-www-form-urlencoded'
-    },
-    data: data
-  })
+    return request({
+        url: "/qdport-auth/oauth/forceChangePassword",
+        method: "post",
+        headers: {
+            "Content-Type": "application/x-www-form-urlencoded"
+        },
+        data: data
+    })
 }
 
 export function sendSmsCode(data) {
-  return request({
-    url: '/qdport-auth/oauth/sendSmsCode',
-    method: 'get',
-    params: data
-  })
+    return request({
+        url: "/qdport-auth/oauth/sendSmsCode",
+        method: "get",
+        params: data
+    })
 }
 
 export function userUnlock(data) {
-  return request({
-    url: '/qdport-auth/oauth/unlock',
-    method: 'post',
-    params: data
-  })
+    return request({
+        url: "/qdport-auth/oauth/unlock",
+        method: "post",
+        params: data
+    })
 }

+ 26 - 26
src/api/system/dataList.js

@@ -1,46 +1,46 @@
-import request from '@/utils/request'
+import request from "@/utils/request"
 
 // 主列表
 export function getMainList(params) {
-  return request({
-    url: `/qdport-system/sys/menu/menuManage`,
-    method: 'GET',
-    params
-  })
+    return request({
+        url: `/qdport-system/sys/menu/menuManage`,
+        method: "GET",
+        params
+    })
 }
 
 // 权限列表
 export function getPowerList(params) {
-  return request({
-    url: `/qdport-system/data-scope/list`,
-    method: 'get',
-    params
-  })
+    return request({
+        url: `/qdport-system/data-scope/list`,
+        method: "get",
+        params
+    })
 }
 
 // 新增权限
 export function scopeSave(data) {
-  return request({
-    url: `/qdport-system/data-scope/save`,
-    method: 'post',
-    data
-  })
+    return request({
+        url: `/qdport-system/data-scope/save`,
+        method: "post",
+        data
+    })
 }
 
 // 修改权限
 export function scopeUpdate(data) {
-  return request({
-    url: `/qdport-system/data-scope/update`,
-    method: 'post',
-    data
-  })
+    return request({
+        url: `/qdport-system/data-scope/update`,
+        method: "post",
+        data
+    })
 }
 
 // 删除权限  ids:record.id
 export function scopeRemove(data) {
-  return request({
-    url: `/qdport-system/data-scope/remove`,
-    method: 'post',
-    params: data
-  })
+    return request({
+        url: `/qdport-system/data-scope/remove`,
+        method: "post",
+        params: data
+    })
 }

+ 23 - 23
src/api/system/depart.js

@@ -1,39 +1,39 @@
-import request from '@/utils/request'
+import request from "@/utils/request"
 
 //部门列表
 export function getMainList(params) {
-  return request({
-    url: '/qdport-system/sys/dept/tree',
-    method: 'GET',
-    params
-  })
+    return request({
+        url: "/qdport-system/sys/dept/tree",
+        method: "GET",
+        params
+    })
 }
 
 // 更新部门
 export function setDepart(data) {
-  return request({
-    url: `/qdport-system/sys/dept/update`,
-    method: 'post',
-    params: data
-  })
+    return request({
+        url: `/qdport-system/sys/dept/update`,
+        method: "post",
+        params: data
+    })
 }
 
 // 新增部门
 export function addDepart(data) {
-  return request({
-    url: `/qdport-system/sys/dept/add`,
-    method: 'post',
-    params: data
-  })
+    return request({
+        url: `/qdport-system/sys/dept/add`,
+        method: "post",
+        params: data
+    })
 }
 
 // 删除部门
 export function deleteDepart(id) {
-  return request({
-    url: `/qdport-system/sys/dept/delete`,
-    method: 'post',
-    params: {
-      id
-    }
-  })
+    return request({
+        url: `/qdport-system/sys/dept/delete`,
+        method: "post",
+        params: {
+            id
+        }
+    })
 }

+ 29 - 29
src/api/system/menu.js

@@ -1,42 +1,42 @@
-import request from '@/utils/request'
+import request from "@/utils/request"
 
 // 获取菜单树
 export function getMenuTree(systemCode) {
-  return request({
-    url: '/qdport-system/sys/menu/menuManage',
-    method: 'GET',
-    params:{
-      systemCode
-    },
-  })
+    return request({
+        url: "/qdport-system/sys/menu/menuManage",
+        method: "GET",
+        params: {
+            systemCode
+        },
+    })
 }
 //新增
 export function addMenu(data) {
-  return request({
-    url: '/qdport-system/sys/menu/add',
-    method: 'post',
-    headers: {
-      'Content-Type': 'application/x-www-form-urlencoded'
-    },
-    data
-  })
+    return request({
+        url: "/qdport-system/sys/menu/add",
+        method: "post",
+        headers: {
+            "Content-Type": "application/x-www-form-urlencoded"
+        },
+        data
+    })
 }
 //修改
 export function modMenu(data) {
-  return request({
-    url: '/qdport-system/sys/menu/update',
-    method: 'post',
-    headers: {
-      'Content-Type': 'application/x-www-form-urlencoded'
-    },
-    data
-  })
+    return request({
+        url: "/qdport-system/sys/menu/update",
+        method: "post",
+        headers: {
+            "Content-Type": "application/x-www-form-urlencoded"
+        },
+        data
+    })
 }
 //删除
 export function delMenu(params) {
-  return request({
-    url: '/qdport-system/sys/menu/delete',
-    method: 'post',
-    params
-  })
+    return request({
+        url: "/qdport-system/sys/menu/delete",
+        method: "post",
+        params
+    })
 }

+ 23 - 23
src/api/system/person.js

@@ -1,36 +1,36 @@
-import request from '@/utils/request'
+import request from "@/utils/request"
 
 // 获取用户信息
 export function getUserInfo() {
-  return request({
-    url: '/qdport-system/sys/user/ownInfo',
-    method: 'GET',
-  })
+    return request({
+        url: "/qdport-system/sys/user/ownInfo",
+        method: "GET",
+    })
 }
 // 上传用户信息
 export function updateUserInfo(params) {
-  return request({
-    url: '/qdport-system/sys/user/changeOwnInfo',
-    method: 'POST',
-    params
-  })
+    return request({
+        url: "/qdport-system/sys/user/changeOwnInfo",
+        method: "POST",
+        params
+    })
 }
 
 export function uploadPhoto(params) {
-  return request({
-    url: '/qdport-resource/oss/endpoint/put-file',
-    method: 'POST',
-    data: params,
-    headers: {
-      'Content-Type': 'multipart/form-data'
-    }
-  })
+    return request({
+        url: "/qdport-resource/oss/endpoint/put-file",
+        method: "POST",
+        data: params,
+        headers: {
+            "Content-Type": "multipart/form-data"
+        }
+    })
 }
 
 export function upChangePassword(params) {
-  return request({
-    url: '/qdport-system/sys/user/changePassword',
-    method: 'POST',
-    params
-  })
+    return request({
+        url: "/qdport-system/sys/user/changePassword",
+        method: "POST",
+        params
+    })
 }

+ 49 - 49
src/api/system/role.js

@@ -1,89 +1,89 @@
-import request from '@/utils/request'
+import request from "@/utils/request"
 
 //角色列表
 export function getRoleList(params) {
-  return request({
-    url: '/qdport-system/sys/role/list',
-    method: 'GET',
-    params
-  })
+    return request({
+        url: "/qdport-system/sys/role/list",
+        method: "GET",
+        params
+    })
 }
 
 // 获取菜单树
 export function getMenuTree() {
-  return request({
-    url: '/qdport-system/sys/menu/basicList',
-    method: 'get',
-  })
+    return request({
+        url: "/qdport-system/sys/menu/basicList",
+        method: "get",
+    })
 }
 
 // 获取角色的菜单数
 export function getRoleMenuTree(id) {
-  return request({
-    url: `/qdport-system/sys/role/${id}/menu/list`,
-    method: 'get',
-  })
+    return request({
+        url: `/qdport-system/sys/role/${id}/menu/list`,
+        method: "get",
+    })
 }
 
 // 接口权限树
 export function getPortTree() {
-  return request({
-    url: `/qdport-system/sys/menu/assignDataMenu`,
-    method: 'get',
-  })
+    return request({
+        url: `/qdport-system/sys/menu/assignDataMenu`,
+        method: "get",
+    })
 }
 
 // 角色接口权限树
 export function getRolePortTree(id) {
-  return request({
-    url: `/qdport-system/sys/role/${id}/menu/data/list`,
-    method: 'get',
-  })
+    return request({
+        url: `/qdport-system/sys/role/${id}/menu/data/list`,
+        method: "get",
+    })
 }
 
 // 更新角色菜单树
 export function setRoleMenuTree(id, data) {
-  return request({
-    url: `/qdport-system/sys/role/${id}/menu/update`,
-    method: 'post',
-    params: data
-  })
+    return request({
+        url: `/qdport-system/sys/role/${id}/menu/update`,
+        method: "post",
+        params: data
+    })
 }
 
 // 更新角色接口树
 export function setRolePortTree(data) {
-  return request({
-    url: `/qdport-system/sys/role/assignAuth`,
-    method: 'post',
-    params: data
-  })
+    return request({
+        url: `/qdport-system/sys/role/assignAuth`,
+        method: "post",
+        params: data
+    })
 }
 
 // 更新角色
 export function setRole(data) {
-  return request({
-    url: `/qdport-system/sys/role/update`,
-    method: 'post',
-    params: data
-  })
+    return request({
+        url: `/qdport-system/sys/role/update`,
+        method: "post",
+        params: data
+    })
 }
 
 // 新增角色
 export function addRole(data) {
-  return request({
-    url: `/qdport-system/sys/role/add`,
-    method: 'post',
-    params: data
-  })
+    return request({
+        url: `/qdport-system/sys/role/add`,
+        method: "post",
+        params: data
+    })
 }
 
 // 删除角色
 export function deleteRole(id) {
-  return request({
-    url: `/qdport-system/sys/role/delete`,
-    method: 'post',
-    params: {
-      id
-    }
-  })
+    return request({
+        url: `/qdport-system/sys/role/delete`,
+        method: "post",
+        params: {
+            id
+        }
+    })
 }

+ 22 - 22
src/api/system/user.js

@@ -1,18 +1,18 @@
-import request from '@/utils/request'
+import request from "@/utils/request"
 
 // 获取部门树
 export function getDeptTree() {
     return request({
-        url: '/qdport-system/sys/dept/tree',
-        method: 'GET',
+        url: "/qdport-system/sys/dept/tree",
+        method: "GET",
 
     })
 }
 //用户列表
 export function getUserList(params) {
     return request({
-        url: '/qdport-system/sys/user/list',
-        method: 'GET',
+        url: "/qdport-system/sys/user/list",
+        method: "GET",
         params
     })
 }
@@ -21,8 +21,8 @@ export function getUserList(params) {
 //角色表
 export function getRoleList(params) {
     return request({
-        url: '/qdport-system/sys/role/list',
-        method: 'GET',
+        url: "/qdport-system/sys/role/list",
+        method: "GET",
         params
     })
 }
@@ -31,16 +31,16 @@ export function getRoleList(params) {
 export function byUserIdfnRole(userId) {
     return request({
         url: `/qdport-system/sys/user/${userId}/role/list`,
-        method: 'GET',
+        method: "GET",
     })
 }
 //更新用户角色
 export function byUserIduPRole(userId, data) {
     return request({
         url: `/qdport-system/sys/user/${userId}/role/update`,
-        method: 'post',
+        method: "post",
         headers: {
-            'Content-Type': 'application/x-www-form-urlencoded'
+            "Content-Type": "application/x-www-form-urlencoded"
         },
         data
     })
@@ -50,10 +50,10 @@ export function byUserIduPRole(userId, data) {
 //新增
 export function addUser(data) {
     return request({
-        url: '/qdport-system/sys/user/add',
-        method: 'post',
+        url: "/qdport-system/sys/user/add",
+        method: "post",
         headers: {
-            'Content-Type': 'application/x-www-form-urlencoded'
+            "Content-Type": "application/x-www-form-urlencoded"
         },
         data
     })
@@ -61,10 +61,10 @@ export function addUser(data) {
 //修改
 export function modUser(data) {
     return request({
-        url: '/qdport-system/sys/user/update',
-        method: 'post',
+        url: "/qdport-system/sys/user/update",
+        method: "post",
         headers: {
-            'Content-Type': 'application/x-www-form-urlencoded'
+            "Content-Type": "application/x-www-form-urlencoded"
         },
         data
     })
@@ -72,10 +72,10 @@ export function modUser(data) {
 //批量删除
 export function delUser(data) {
     return request({
-        url: '/qdport-system/sys/user/delete/ids',
-        method: 'post',
+        url: "/qdport-system/sys/user/delete/ids",
+        method: "post",
         headers: {
-            'Content-Type': 'application/x-www-form-urlencoded'
+            "Content-Type": "application/x-www-form-urlencoded"
         },
         data
     })
@@ -83,10 +83,10 @@ export function delUser(data) {
 //批量重置密码
 export function restPwdUser(data) {
     return request({
-        url: '/qdport-system/sys/user/resetPassword',
-        method: 'post',
+        url: "/qdport-system/sys/user/resetPassword",
+        method: "post",
         headers: {
-            'Content-Type': 'application/x-www-form-urlencoded'
+            "Content-Type": "application/x-www-form-urlencoded"
         },
         data
     })

+ 1 - 2
src/assets/style/common.scss

@@ -116,14 +116,13 @@
         margin-top: 20px;
         display: flex;
         justify-content: flex-end;
-
     }   
 }
 
 //统一按钮内icon距右文字
 .tjm_btn_icon_right {
     margin-right: 8px;
-    font-size: 24px;
+    font-size: 16px;
 }
 
 // 横排列弹性盒子

+ 47 - 47
src/components/IconSelect/index.vue

@@ -1,73 +1,73 @@
 <template>
-  <div class="icon-body">
-    <el-input
-      v-model="iconName"
-      class="icon-search"
-      clearable
-      placeholder="请输入图标名称"
-      @clear="filterIcons"
-      @input="filterIcons"
-    >
-      <template #suffix><i class="el-icon-search el-input__icon" /></template>
-    </el-input>
-    <div class="icon-list">
-      <div class="list-container">
-        <div
-          v-for="(item, index) in iconList"
-          class="icon-item-wrapper"
-          :key="index"
-          @click="selectedIcon(item)"
+    <div class="icon-body">
+        <el-input
+            v-model="iconName"
+            class="icon-search"
+            clearable
+            placeholder="请输入图标名称"
+            @clear="filterIcons"
+            @input="filterIcons"
         >
-          <div :class="['icon-item', { active: activeIcon === item }]">
-            <el-icon size="16" class="icon" v-if="item.indexOf('ep')!==-1">
-              <component :is="item.slice(2)" />
-            </el-icon>
-            <svg-icon
-              v-if="item.indexOf('tjm')!==-1"
-              :icon-class="item.slice(4)"
-              class-name="icon"
-              style="height: 16px; width: 16px"
-            />
-            <span>{{ item.indexOf('ep')!==-1?item.slice(2):item.slice(4) }}</span>
-          </div>
+            <template #suffix><i class="el-icon-search el-input__icon" /></template>
+        </el-input>
+        <div class="icon-list">
+            <div class="list-container">
+                <div
+                    v-for="(item, index) in iconList"
+                    class="icon-item-wrapper"
+                    :key="index"
+                    @click="selectedIcon(item)"
+                >
+                    <div :class="['icon-item', { active: activeIcon === item }]">
+                        <el-icon size="16" class="icon" v-if="item.indexOf('ep') !== -1">
+                            <component :is="item.slice(2)" />
+                        </el-icon>
+                        <svg-icon
+                            v-if="item.indexOf('tjm') !== -1"
+                            :icon-class="item.slice(4)"
+                            class-name="icon"
+                            style="height: 16px; width: 16px"
+                        />
+                        <span>{{ item.indexOf('ep') !== -1 ? item.slice(2) : item.slice(4) }}</span>
+                    </div>
+                </div>
+            </div>
         </div>
-      </div>
     </div>
-  </div>
 </template>
 
 <script setup>
-import icons from './requireIcons'
+import icons from "./requireIcons"
 
 const props = defineProps({
-  activeIcon: {
-    type: String
-  }
+    activeIcon: {
+        type: String
+    }
 })
 
-const iconName = ref('')
+const iconName = ref("")
 const iconList = ref(icons)
-const emit = defineEmits(['selected'])
+const emit = defineEmits(["selected"])
 
 function filterIcons() {
-  iconList.value = icons
-  if (iconName.value) {
-    iconList.value = icons.filter(item => item.indexOf(iconName.value) !== -1)
-  }
+    iconList.value = icons
+    if (iconName.value) {
+        iconList.value = icons.filter(item => item.indexOf(iconName.value) !== -1)
+    }
 }
 
 function selectedIcon(name) {
-  emit('selected', name)
-  document.body.click()
+    emit("selected", name)
+    document.body.click()
 }
 
 function reset() {
-  iconName.value = ''
-  iconList.value = icons
+    iconName.value = ""
+    iconList.value = icons
 }
 
 defineExpose({
-  reset
+    reset
 })
 </script>
 

+ 5 - 5
src/components/IconSelect/requireIcons.js

@@ -1,12 +1,12 @@
 let icons = []
-const modules = import.meta.glob('./../../assets/svg/*.svg');
-import * as components from '@element-plus/icons-vue'
+const modules = import.meta.glob("./../../assets/svg/*.svg");
+import * as components from "@element-plus/icons-vue"
 for (const path in modules) {
-  const p = path.split('assets/svg/')[1].split('.svg')[0];
-  icons.push('tjm-'+p);
+    const p = path.split("assets/svg/")[1].split(".svg")[0];
+    icons.push("tjm-" + p);
 }
 for (const key in components) {
-  icons.push("ep-"+key);
+    icons.push("ep-" + key);
 }
 
 export default icons

+ 2 - 2
src/components/ParentView/index.vue

@@ -1,3 +1,3 @@
 <template >
-  <router-view />
-</template>
+    <router-view />
+</template>

+ 26 - 27
src/components/SvgIcon/index.vue

@@ -1,42 +1,41 @@
 <template>
-  <svg :class="svgClass" aria-hidden="true">
-    <use :xlink:href="iconName" :fill="color" />
-  </svg>
+    <svg :class="svgClass" aria-hidden="true">
+        <use :xlink:href="iconName" :fill="color" />
+    </svg>
 </template>
 
 <script>
 export default defineComponent({
-  props: {
-    iconClass: {
-      type: String,
-      required: true
+    props: {
+        iconClass: {
+            type: String,
+            required: true
+        },
+        className: {
+            type: String,
+            default: ''
+        },
+        color: {
+            type: String,
+            default: ''
+        },
     },
-    className: {
-      type: String,
-      default: ''
-    },
-    color: {
-      type: String,
-      default: ''
-    },
-  },
- 
-  setup(props) {
-    return {
-      iconName: computed(() => `#icon-${props.iconClass}`),
-      svgClass: computed(() => {
-        if (props.className) {
-          return `svg-icon ${props.className}`
+
+    setup(props) {
+        return {
+            iconName: computed(() => `#icon-${props.iconClass}`),
+            svgClass: computed(() => {
+                if (props.className) {
+                    return `svg-icon ${props.className}`
+                }
+                return 'svg-icon'
+            })
         }
-        return 'svg-icon'
-      })
     }
-  }
 })
 </script>
 
 <style scope lang="scss">
-
 .svg-icon {
   width: 24px;
   height: 24px;

+ 1 - 1
src/components/SvgIcon/svgicon.js

@@ -6,4 +6,4 @@ export default {
             app.component(componentConfig.name, componentConfig);
         }
     },
-};
+};

+ 18 - 18
src/components/test.vue

@@ -2,24 +2,24 @@
 const name = ref('tjm')
 31231313
 </script>
-<template>
-   <el-table mb-1 :data="[]" />
-      <el-pagination :total="100" />
-  <div>hello {{ name }}, this is helloworld components</div>
-  <div>hello {{ name }}, this is helloworld components</div>
-  <div>hello {{ name }}, this is helloworld components</div>
-  <div>hello {{ name }}, this is helloworld components</div>
-  <div>hello {{ name }}, this is helloworld components</div>
-  <div>hello {{ name }}, this is helloworld components</div>
-  <div>hello {{ name }}, this is helloworld components</div>
-  <div>hello {{ name }}, this is helloworld components</div>
-  <el-icon color="red" size="22">
-    <tjm-icon-ep-expand />
-  </el-icon>
-  <tjm-icon-mdi-account-circle class=""/>
-  <tjm-icon-user-test></tjm-icon-user-test>
-  <tjm-icon-home-test></tjm-icon-home-test>
 
+<template>
+    <el-table mb-1 :data="[]" />
+    <el-pagination :total="100" />
+    <div>hello {{ name }}, this is helloworld components</div>
+    <div>hello {{ name }}, this is helloworld components</div>
+    <div>hello {{ name }}, this is helloworld components</div>
+    <div>hello {{ name }}, this is helloworld components</div>
+    <div>hello {{ name }}, this is helloworld components</div>
+    <div>hello {{ name }}, this is helloworld components</div>
+    <div>hello {{ name }}, this is helloworld components</div>
+    <div>hello {{ name }}, this is helloworld components</div>
+    <el-icon color="red" size="22">
+        <tjm-icon-ep-expand />
+    </el-icon>
+    <tjm-icon-mdi-account-circle class=""/>
+    <tjm-icon-user-test></tjm-icon-user-test>
+    <tjm-icon-home-test></tjm-icon-home-test>
 </template>
 
-<style scoped></style>
+<style scoped></style>

+ 2 - 2
src/directive/index.js

@@ -1,5 +1,5 @@
 
 import hasPermi from './permission/hasPermi'
-export default function directive(app){
-  app.directive('hasPermi', hasPermi)
+export default function directive(app) {
+    app.directive('hasPermi', hasPermi)
 }

+ 21 - 22
src/directive/permission/hasPermi.js

@@ -1,22 +1,21 @@
- 
- import { useUserStore } from '@/store/user.js'
- export default {
-   mounted(el, binding, vnode) {
-     const { value } = binding
-     const all_permission = "*:*:*";
-     const permissions = useUserStore().permissions
-     if (value && value instanceof Array && value.length > 0) {
-       const permissionFlag = value
-       const hasPermissions = permissions.some(permission => {
-         return all_permission === permission || permissionFlag.includes(permission)
-       })
- 
-       if (!hasPermissions) {
-         el.parentNode && el.parentNode.removeChild(el)
-       }
-     } else {
-       throw new Error(`请设置操作权限标签值`)
-     }
-   }
- }
- 
+
+import { useUserStore } from '@/store/user.js'
+export default {
+    mounted(el, binding, vnode) {
+        const { value } = binding
+        const all_permission = "*:*:*";
+        const permissions = useUserStore().permissions
+        if (value && value instanceof Array && value.length > 0) {
+            const permissionFlag = value
+            const hasPermissions = permissions.some(permission => {
+                return all_permission === permission || permissionFlag.includes(permission)
+            })
+
+            if (!hasPermissions) {
+                el.parentNode && el.parentNode.removeChild(el)
+            }
+        } else {
+            throw new Error(`请设置操作权限标签值`)
+        }
+    }
+}

+ 15 - 15
src/i18n/index.js

@@ -1,25 +1,25 @@
 import { createI18n } from 'vue-i18n'
-import {getConfig} from "@/config/config"
+import { getConfig } from "@/config/config"
 import zhCnLocale from 'element-plus/dist/locale/zh-cn.mjs'
 import enLocale from 'element-plus/dist/locale/en.mjs'
 import nextZhCn from './lang/zh-cn'
 import nextEn from './lang/en'
 const messages = {
-	"zh-cn": {
-		...zhCnLocale,
-		noep: { ...nextZhCn},
-	},
-	"en": {
-		...enLocale,
-		noep: { ...nextEn, },
-	},
+    "zh-cn": {
+        ...zhCnLocale,
+        noep: { ...nextZhCn },
+    },
+    "en": {
+        ...enLocale,
+        noep: { ...nextEn, },
+    },
 }
 
- const i18n = createI18n({
-	legacy: false, 
-	globalInjection: true, 
-	locale: getConfig('globalI18n'),
-	fallbackLocale: "zh-cn",
-	messages,
+const i18n = createI18n({
+    legacy: false,
+    globalInjection: true,
+    locale: getConfig('globalI18n'),
+    fallbackLocale: "zh-cn",
+    messages,
 })
 export default i18n

+ 4 - 4
src/i18n/lang/en.js

@@ -1,6 +1,6 @@
 export default {
-	test: {
-		home: 'home',
-		docsLink: 'System Docs ',
-	},
+    test: {
+        home: 'home',
+        docsLink: 'System Docs ',
+    },
 }

+ 3 - 3
src/i18n/lang/zh-cn.js

@@ -1,6 +1,6 @@
 export default {
     test: {
-		home: '首页',
-		docsLink: '系统指南',
-	},
+        home: '首页',
+        docsLink: '系统指南',
+    },
 }

+ 7 - 7
src/layout/components/Logo/index.vue

@@ -7,11 +7,11 @@ const projectName = ref(getConfig('projectName'))
 </script>
 
 <template>
-  <div class="tjm_logo_container">
-    <img class="logo"  v-if="!collapse && layoutStyle=='vertical'" src="../../../assets/images/menu_img.png" alt="" />
-    <img class="onlyLogo" v-else src="../../../assets/images/loading-logo-old.png" alt="" srcset="">
-    <!-- <h1 class="title" v-if="!collapse">{{ projectName }}</h1> -->
-  </div>
+    <div class="tjm_logo_container">
+        <img class="logo"  v-if="!collapse && layoutStyle=='vertical'" src="../../../assets/images/menu_img.png" alt="" />
+        <img class="onlyLogo" v-else src="../../../assets/images/loading-logo-old.png" alt="" srcset="">
+        <!-- <h1 class="title" v-if="!collapse">{{ projectName }}</h1> -->
+    </div>
 </template>
 
 <style lang="scss" scoped>
@@ -29,7 +29,7 @@ const projectName = ref(getConfig('projectName'))
     height: 32px;
     vertical-align: middle;
   }
-  .onlyLogo{
+  .onlyLogo {
     width: 60px;
   }
   .title {
@@ -42,4 +42,4 @@ const projectName = ref(getConfig('projectName'))
     vertical-align: middle;
   }
 }
-</style>
+</style>

+ 11 - 10
src/layout/components/Main/index.vue

@@ -3,16 +3,17 @@
   const cachedViews = useTabsBarStore().cachedViews
   // v-if="!route.meta.link"
 </script>
+
 <template>
-  <section class="tjm_main_content_container">
-    <router-view v-slot="{ Component, route }">
-      <transition appear name="fade-transform" mode="out-in">
-        <keep-alive :include="cachedViews">
-          <component  :is="Component" :key="route.path"/>
-        </keep-alive>  
-      </transition>
-    </router-view>
-  </section>
+    <section class="tjm_main_content_container">
+        <router-view v-slot="{ Component, route }">
+            <transition-group appear name="fade-transform" mode="out-in">
+                <keep-alive :include="cachedViews">
+                    <component :is="Component" :key="route.path" />
+                </keep-alive>  
+            </transition-group>
+        </router-view>
+    </section>
 </template>
 
 <style lang="scss" scoped>
@@ -21,4 +22,4 @@
   background-color: inherit;
   padding: $base-padding;
 }
-</style>
+</style>

+ 36 - 37
src/layout/components/NavBar/components/Breadcrumb.vue

@@ -1,16 +1,15 @@
 <template>
-  <el-breadcrumb class="tjm-breadcrumb" separator="/">
-    <transition-group name="breadcrumb">
-      <el-breadcrumb-item v-for="(item, index) in levelList" :key="item.path">
-        <span
-          v-if="item.redirect === 'noRedirect' || index == levelList.length - 1"
-          class="no-redirect"
-          >{{ item.meta.title }}</span
-        >
-        <a v-else @click.prevent="handleLink(item)">{{ item.meta.title }}</a>
-      </el-breadcrumb-item>
-    </transition-group>
-  </el-breadcrumb>
+    <el-breadcrumb class="tjm-breadcrumb" separator="/">
+        <transition-group name="breadcrumb">
+            <el-breadcrumb-item v-for="(item, index) in levelList" :key="item.path">
+                <span
+                    v-if="item.redirect === 'noRedirect' || index == levelList.length - 1"
+                    class="no-redirect"
+                >{{ item.meta.title }}</span>
+                <a v-else @click.prevent="handleLink(item)">{{ item.meta.title }}</a>
+            </el-breadcrumb-item>
+        </transition-group>
+    </el-breadcrumb>
 </template>
 
 <script setup>
@@ -19,38 +18,38 @@ const router = useRouter()
 const levelList = ref([])
 
 function getBreadcrumb() {
- 
-  let matched = route.matched.filter(item => item.meta && item.meta.title)
 
-  const first = matched[0]
-  if (!isDashboard(first)) {
-    matched = [{ path: '/home/index', meta: { title: '首页' } }].concat(matched)
-  }
-  levelList.value = matched.filter(
-    item => item.meta && item.meta.title && item.meta.breadcrumb !== false
-  )
+    let matched = route.matched.filter(item => item.meta && item.meta.title)
+
+    const first = matched[0]
+    if (!isDashboard(first)) {
+        matched = [{ path: '/home/index', meta: { title: '首页' } }].concat(matched)
+    }
+    levelList.value = matched.filter(
+        item => item.meta && item.meta.title && item.meta.breadcrumb !== false
+    )
 }
 function isDashboard(route) {
-  const name = route && route.name
-  if (!name) {
-    return false
-  }
-  return name.trim() === 'Index'
+    const name = route && route.name
+    if (!name) {
+        return false
+    }
+    return name.trim() === 'Index'
 }
 function handleLink(item) {
-  const { redirect, path } = item
-  if (redirect) {
-    router.push(redirect)
-    return
-  }
-  // router.push(path)
+    const { redirect, path } = item
+    if (redirect) {
+        router.push(redirect)
+        return
+    }
+    // router.push(path)
 }
 
 watchEffect(() => {
-  if (route.path.startsWith('/redirect/')) {
-    return
-  }
-  getBreadcrumb()
+    if (route.path.startsWith('/redirect/')) {
+        return
+    }
+    getBreadcrumb()
 })
 getBreadcrumb()
 </script>
@@ -67,4 +66,4 @@ getBreadcrumb()
     cursor: text;
   }
 }
-</style>
+</style>

+ 3 - 3
src/layout/components/NavBar/components/FullScreenBtn.vue

@@ -1,7 +1,7 @@
 <template>
-  <el-icon class="tjm_tools_icon" size="24" @click="toggle" :color="layoutStyle=='vertical'?'':'#fff'">
-    <tjm-icon-ep-FullScreen />
-  </el-icon>
+    <el-icon class="tjm_tools_icon" size="24" @click="toggle" :color="layoutStyle=='vertical'?'':'#fff'">
+        <tjm-icon-ep-FullScreen />
+    </el-icon>
 </template>
 
 <script setup>

+ 6 - 6
src/layout/components/NavBar/components/LayoutStyleSet.vue

@@ -1,9 +1,9 @@
 <template>
-  <div class="layoutStyleSet">
-    <el-icon class="tjm_tools_icon" size="24" :color="layoutStyle=='vertical'?'':'#fff'">
-      <tjm-icon-ep-Grid @click="microShowClick"/>
-    </el-icon>
-  </div>
+    <div class="layoutStyleSet">
+        <el-icon class="tjm_tools_icon" size="24" :color="layoutStyle=='vertical'?'':'#fff'">
+            <tjm-icon-ep-Grid @click="microShowClick"/>
+        </el-icon>
+    </div>
 </template>
 
 <script setup>
@@ -15,7 +15,7 @@ const settingStore = useSettingStore()
 const { layoutStyle } = storeToRefs(settingStore)
 
 function microShowClick() {
-  layoutStyle.value = layoutStyle.value =='vertical'?'horizontal':'vertical'
+    layoutStyle.value = layoutStyle.value =='vertical'?'horizontal':'vertical'
 }
 </script>
 

+ 119 - 119
src/layout/components/NavBar/components/MenuSearch.vue

@@ -1,28 +1,28 @@
 <template>
-  <div :class="{ show: show }" class="menu_search">
-    <el-icon class="tjm_tools_icon" size="24" :color="layoutStyle=='vertical'?'':'#fff'">
-      <tjm-icon-ep-Search @click.stop="click" />
-    </el-icon>
-    <el-select
-      v-model="search"
-      :remote-method="querySearch"
-      filterable
-      default-first-option
-      remote
-      placeholder="Select"
-      ref="menuSearchSelectRef"
-      class="menu_search_select"
-      auto-complete="off"
-      @change="change"
-    >
-      <el-option
-        v-for="option in options"
-        :key="option.item.path"
-        :value="option.item"
-        :label="option.item.title.join(' > ')"
-      />
-    </el-select>
-  </div>
+    <div :class="{ show: show }" class="menu_search">
+        <el-icon class="tjm_tools_icon" size="24" :color="layoutStyle=='vertical'?'':'#fff'">
+            <tjm-icon-ep-Search @click.stop="click" />
+        </el-icon>
+        <el-select
+            v-model="search"
+            :remote-method="querySearch"
+            filterable
+            default-first-option
+            remote
+            placeholder="Select"
+            ref="menuSearchSelectRef"
+            class="menu_search_select"
+            auto-complete="off"
+            @change="change"
+        >
+            <el-option
+                v-for="option in options"
+                :key="option.item.path"
+                :value="option.item"
+                :label="option.item.title.join(' > ')"
+            />
+        </el-select>
+    </div>
 </template>
 
 <script setup>
@@ -40,134 +40,134 @@ import { useSettingStore } from '@/store/settings.js'
 const settingStore = useSettingStore()
 const { layoutStyle } = storeToRefs(settingStore)
 function change(val) {
-  const path = val.path
-  const query = val.query
-  if (isHttp(path)) {
-    // http(s):// 路径新窗口打开
-    const pindex = path.indexOf('http')
-    window.open(path.substr(pindex, path.length), '_blank')
-  }
-  if (path.startsWith('/tjmchild')) {
-    const parts = path.split('/')
-    router.push({
-      name: parts[2],
-      params: { page: parts.slice(3).join('/') }
-    })
-  } else {
-    if (query) {
-      router.push({ path: path, query: JSON.parse(query) })
+    const path = val.path
+    const query = val.query
+    if (isHttp(path)) {
+        // http(s):// 路径新窗口打开
+        const pindex = path.indexOf('http')
+        window.open(path.substr(pindex, path.length), '_blank')
+    }
+    if (path.startsWith('/tjmchild')) {
+        const parts = path.split('/')
+        router.push({
+            name: parts[2],
+            params: { page: parts.slice(3).join('/') }
+        })
     } else {
-      router.push(path)
+        if (query) {
+            router.push({ path: path, query: JSON.parse(query) })
+        } else {
+            router.push(path)
+        }
     }
-  }
 
-  search.value = ''
-  options.value = []
-  nextTick(() => {
-    show.value = false
-  })
+    search.value = ''
+    options.value = []
+    nextTick(() => {
+        show.value = false
+    })
 }
 function isHttp(url) {
-  return url.indexOf('http://') !== -1 || url.indexOf('https://') !== -1
+    return url.indexOf('http://') !== -1 || url.indexOf('https://') !== -1
 }
 
 function initFuse(list) {
-  fuse.value = new Fuse(list, {
-    shouldSort: true, // 是否对结果进行排序
-    threshold: 0.4, // 阈值控制匹配的敏感度
-    location: 0, // 匹配的位置,0 表示开头匹配
-    distance: 100, // 搜索的最大距离
-    minMatchCharLength: 1, // 最小匹配字符长度
-    keys: [
-      {
-        name: 'title',
-        weight: 0.7
-      },
-      {
-        name: 'path',
-        weight: 0.3
-      }
-    ]
-  })
+    fuse.value = new Fuse(list, {
+        shouldSort: true, // 是否对结果进行排序
+        threshold: 0.4, // 阈值控制匹配的敏感度
+        location: 0, // 匹配的位置,0 表示开头匹配
+        distance: 100, // 搜索的最大距离
+        minMatchCharLength: 1, // 最小匹配字符长度
+        keys: [
+            {
+                name: 'title',
+                weight: 0.7
+            },
+            {
+                name: 'path',
+                weight: 0.3
+            }
+        ]
+    })
 }
 watch(searchPool, list => {
-  initFuse(list)
+    initFuse(list)
 })
 onMounted(() => {
-  searchPool.value = generateRoutes(sidebarRouters.value)
+    searchPool.value = generateRoutes(sidebarRouters.value)
 })
 
 watchEffect(() => {
-  searchPool.value = generateRoutes(sidebarRouters.value)
+    searchPool.value = generateRoutes(sidebarRouters.value)
 })
 
 function getNormalPath(p) {
-  if (p.length === 0 || !p || p == 'undefined') {
-    return p
-  }
-  let res = p.replace('//', '/')
-  if (res[res.length - 1] === '/') {
-    return res.slice(0, res.length - 1)
-  }
-  return res
+    if (p.length === 0 || !p || p == 'undefined') {
+        return p
+    }
+    let res = p.replace('//', '/')
+    if (res[res.length - 1] === '/') {
+        return res.slice(0, res.length - 1)
+    }
+    return res
 }
 
 function generateRoutes(routes, basePath = '', prefixTitle = []) {
-  let res = []
-  for (const r of routes) {
-    if (r.hidden) {
-      continue
-    }
-    const p = r.path.length > 0 && r.path[0] === '/' ? r.path : '/' + r.path
-    const data = {
-      path: !isHttp(r.path) ? getNormalPath(basePath + p) : r.path,
-      title: [...prefixTitle]
-    }
-    if (r.meta && r.meta.title) {
-      data.title = [...data.title, r.meta.title]
-      if (r.redirect !== 'noRedirect') {
-        res.push(data)
-      }
+    let res = []
+    for (const r of routes) {
+        if (r.hidden) {
+            continue
+        }
+        const p = r.path.length > 0 && r.path[0] === '/' ? r.path : '/' + r.path
+        const data = {
+            path: !isHttp(r.path) ? getNormalPath(basePath + p) : r.path,
+            title: [...prefixTitle]
+        }
+        if (r.meta && r.meta.title) {
+            data.title = [...data.title, r.meta.title]
+            if (r.redirect !== 'noRedirect') {
+                res.push(data)
+            }
+        }
+        if (r.query) {
+            data.query = r.query
+        }
+        if (r.children) {
+            const tempRoutes = generateRoutes(r.children, '', data.title)
+            if (tempRoutes.length >= 1) {
+                res = [...res, ...tempRoutes]
+            }
+        }
     }
-    if (r.query) {
-      data.query = r.query
-    }
-    if (r.children) {
-      const tempRoutes = generateRoutes(r.children, '', data.title)
-      if (tempRoutes.length >= 1) {
-        res = [...res, ...tempRoutes]
-      }
-    }
-  }
-  return res
+    return res
 }
 
 function click() {
-  show.value = !show.value
-  if (show.value) {
-    menuSearchSelectRef.value && menuSearchSelectRef.value.focus()
-  }
+    show.value = !show.value
+    if (show.value) {
+        menuSearchSelectRef.value && menuSearchSelectRef.value.focus()
+    }
 }
 function close() {
-  menuSearchSelectRef.value && menuSearchSelectRef.value.blur()
-  options.value = []
-  show.value = false
+    menuSearchSelectRef.value && menuSearchSelectRef.value.blur()
+    options.value = []
+    show.value = false
 }
 
 function querySearch(query) {
-  if (query !== '') {
-    options.value = fuse.value.search(query)
-  } else {
-    options.value = []
-  }
+    if (query !== '') {
+        options.value = fuse.value.search(query)
+    } else {
+        options.value = []
+    }
 }
 
 watch(show, value => {
-  if (value) {
-    document.body.addEventListener('click', close)
-  } else {
-    document.body.removeEventListener('click', close)
-  }
+    if (value) {
+        document.body.addEventListener('click', close)
+    } else {
+        document.body.removeEventListener('click', close)
+    }
 })
 </script>
 

+ 55 - 61
src/layout/components/NavBar/index.vue

@@ -1,42 +1,42 @@
 <template>
-  <div :class="{'tjm_navbar_container':true,'layoutStyleHorizontal':layoutStyle=='horizontal'}">
-    <div class="tjm_navbar_left" v-if="layoutStyle=='vertical'">
-      <el-icon
-        class="tjm_collapse_icon"
-        size="28"
-        @click="collapse = !collapse"
-      >
-        <tjm-icon-ep-fold v-if="!collapse" />
-        <tjm-icon-ep-expand v-else />
-      </el-icon>
-      &nbsp; &nbsp; &nbsp;
-      <Breadcrumb />
+    <div :class="{'tjm_navbar_container':true,'layoutStyleHorizontal':layoutStyle=='horizontal'}">
+        <div class="tjm_navbar_left" v-if="layoutStyle=='vertical'">
+            <el-icon
+                class="tjm_collapse_icon"
+                size="28"
+                @click="collapse = !collapse"
+            >
+                <tjm-icon-ep-fold v-if="!collapse" />
+                <tjm-icon-ep-expand v-else />
+            </el-icon>
+            &nbsp; &nbsp; &nbsp;
+            <Breadcrumb />
+        </div>
+        <div class="tjm_navbar_left" v-else>
+            <tjm-side-bar/>
+        </div>
+        <div class="tjm_navbar_right">
+            <div class="tjm_tools_container">
+                <full-screen-btn></full-screen-btn>
+                <menu-search></menu-search>
+                <layout-style-set></layout-style-set>
+            </div>
+            <div class="tjm_user_container">
+                <el-dropdown>
+                    <el-avatar
+                        :size="36"
+                        src="https://cube.elemecdn.com/3/7c/3ea6beec64369c2642b92c6726f1epng.png"
+                    />
+                    <template #dropdown>
+                        <el-dropdown-menu>
+                        <el-dropdown-item @click='goUserInfo'>个人信息</el-dropdown-item>
+                        <el-dropdown-item @click="logout">退出登录</el-dropdown-item>
+                        </el-dropdown-menu>
+                    </template>
+                </el-dropdown>
+            </div>
+        </div>
     </div>
-    <div class="tjm_navbar_left" v-else>
-      <tjm-side-bar/>
-    </div>
-    <div class="tjm_navbar_right">
-      <div class="tjm_tools_container">
-        <full-screen-btn></full-screen-btn>
-        <menu-search></menu-search>
-        <layout-style-set></layout-style-set>
-      </div>
-      <div class="tjm_user_container">
-        <el-dropdown>
-          <el-avatar
-            :size="36"
-            src="https://cube.elemecdn.com/3/7c/3ea6beec64369c2642b92c6726f1epng.png"
-          />
-          <template #dropdown>
-            <el-dropdown-menu>
-              <el-dropdown-item @click='goUserInfo'>个人信息</el-dropdown-item>
-              <el-dropdown-item @click="logout">退出登录</el-dropdown-item>
-            </el-dropdown-menu>
-          </template>
-        </el-dropdown>
-      </div>
-    </div>
-  </div>
 </template>
 
 <script setup>
@@ -47,31 +47,25 @@ import MenuSearch from '@/layout/components/NavBar/components/MenuSearch.vue'
 import LayoutStyleSet from '@/layout/components/NavBar/components/LayoutStyleSet.vue'
 import { useSettingStore } from '@/store/settings.js'
 const settingStore = useSettingStore()
-const { collapse,layoutStyle } = storeToRefs(settingStore)
+const { collapse, layoutStyle } = storeToRefs(settingStore)
 import { useUserStore } from '@/store/user.js'
 const router = useRouter()
-function goUserInfo(){
-  router.push('/userInfo')
+function goUserInfo() {
+    router.push('/userInfo')
 }
 const logout = () => {
-  ElMessageBox.confirm('确定注销并退出系统吗?', '提示', {
-    confirmButtonText: '确定',
-    cancelButtonText: '取消',
-    type: 'warning'
-  })
-    .then(() => {
-      useUserStore()
-        .logOut()
-        .then(() => {
-          location.href = '/index'
+    ElMessageBox.confirm('确定注销并退出系统吗?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+    }).then(() => {
+        useUserStore().logOut().then(() => {
+            location.href = '/index'
         })
-    })
-    .catch(() => {})
+    }).catch(() => { })
 }
-
 </script>
 
-
 <style lang="scss" scoped>
 .tjm_navbar_container {
   position: relative;
@@ -85,10 +79,10 @@ const logout = () => {
   display: flex;
   align-items: center;
   justify-content: space-between;
-  .tjm_navbar_left{
-     display: flex;
-     align-items: center;  
-      flex: 1;
+  .tjm_navbar_left {
+    display: flex;
+    align-items: center;
+    flex: 1;
   }
   .tjm_navbar_right {
     padding-left: 80px;
@@ -103,12 +97,12 @@ const logout = () => {
         cursor: pointer;
       }
     }
-    .tjm_user_container{
+    .tjm_user_container {
       cursor: pointer;
     }
   }
 }
-.layoutStyleHorizontal{
+.layoutStyleHorizontal {
   background: #283a5e;
 }
-</style>
+</style>

+ 33 - 33
src/layout/components/SideBar/index.vue

@@ -15,41 +15,41 @@ const sidebarRouters = computed(() => usePermissionStore().sidebarRouters)
 const theme = computed(() => useSettingStore().theme)
 
 const activeMenu = computed(() => {
-  const { meta, path } = route
-  if (meta.activeMenu) {
-    return meta.activeMenu
-  }
-  let dealPath= decodeURIComponent(path)
-  if(dealPath.startsWith('/workflow')){
-      dealPath  =  '/tjmchild'+dealPath   
-      return dealPath
-  }
-  return path
+    const { meta, path } = route
+    if (meta.activeMenu) {
+        return meta.activeMenu
+    }
+    let dealPath = decodeURIComponent(path)
+    if (dealPath.startsWith('/workflow')) {
+        dealPath = '/tjmchild' + dealPath
+        return dealPath
+    }
+    return path
 })
 </script>
 
 <template>
-  <div class="tjm_sidebar_container" :class="{ 'is-collapse': !collapse }">
-    <Logo />
-    <el-scrollbar style="height: calc(100% - 60px)">
-      <el-menu
-        :default-active="activeMenu"
-        :collapse="collapse"
-        background-color="#283a5e"
-        text-color="#fff"
-        :unique-opened="true"
-        :active-text-color="theme"
-        :collapse-transition="false"
-        mode="vertical"
-      >
-        <sideBarItem
-          v-for="(route, index) in sidebarRouters"
-          :key="route.path + index"
-          :item="route"
-        />
-      </el-menu>
-    </el-scrollbar>
-  </div>
+    <div class="tjm_sidebar_container" :class="{ 'is-collapse': !collapse }">
+        <Logo />
+        <el-scrollbar style="height: calc(100% - 60px)">
+            <el-menu
+                :default-active="activeMenu"
+                :collapse="collapse"
+                background-color="#283a5e"
+                text-color="#fff"
+                :unique-opened="true"
+                :active-text-color="theme"
+                :collapse-transition="false"
+                mode="vertical"
+            >
+                <sideBarItem
+                    v-for="(route, index) in sidebarRouters"
+                    :key="route.path + index"
+                    :item="route"
+                />
+            </el-menu>
+        </el-scrollbar>
+    </div>
 </template>
 
 <style lang="scss" scoped>
@@ -88,8 +88,8 @@ const activeMenu = computed(() => {
     .el-menu {
       border: 0;
     }
-    .el-sub-menu.is-active > .el-sub-menu__title{
-      color: #409EFF !important;
+    .el-sub-menu.is-active > .el-sub-menu__title {
+      color: #409eff !important;
     }
     .el-menu-item,
     .el-submenu__title {

+ 45 - 49
src/layout/components/SideBar/indexH.vue

@@ -15,64 +15,60 @@ const sidebarRouters = computed(() => usePermissionStore().sidebarRouters)
 const theme = computed(() => useSettingStore().theme)
 
 const activeMenu = computed(() => {
-  const { meta, path } = route
-  if (meta.activeMenu) {
-    return meta.activeMenu
-  }
-  let dealPath= decodeURIComponent(path)
-  if(dealPath.startsWith('/workflow')){
-      dealPath  =  '/tjmchild'+dealPath   
-      return dealPath
-  }
-  return path
+    const { meta, path } = route
+    if (meta.activeMenu) {
+        return meta.activeMenu
+    }
+    let dealPath = decodeURIComponent(path)
+    if (dealPath.startsWith('/workflow')) {
+        dealPath = '/tjmchild' + dealPath
+        return dealPath
+    }
+    return path
 })
 </script>
 
 <template>
-  <div class="tjm_sidebar_container">
-    <div class="logo-container">  
-         <Logo />
+    <div class="tjm_sidebar_container">
+        <div class="logo-container">  
+            <Logo />
+        </div>
+        <el-scrollbar  class="sidebar-scrollbar">
+            <el-menu
+                :default-active="activeMenu"
+                background-color="#283a5e"
+                text-color="#fff"
+                :unique-opened="true"
+                :active-text-color="theme"
+                :collapse-transition="false"
+                mode="horizontal"
+                :ellipsis='false'
+            >
+                <sideBarItem
+                    v-for="(route, index) in sidebarRouters"
+                    :key="route.path + index"
+                    :item="route"
+                />
+            </el-menu>
+        </el-scrollbar>
     </div>
-    <el-scrollbar  class="sidebar-scrollbar">
-      <el-menu
-        :default-active="activeMenu"
-        background-color="#283a5e"
-        text-color="#fff"
-        :unique-opened="true"
-        :active-text-color="theme"
-        :collapse-transition="false"
-        mode="horizontal"
-        :ellipsis='false'
-      >
-        <sideBarItem
-          v-for="(route, index) in sidebarRouters"
-          :key="route.path + index"
-          :item="route"
-        />
-      </el-menu>
-    </el-scrollbar>
-  </div>
 </template>
 
 <style lang="scss" scoped>
-
 .tjm_sidebar_container {
-    display: flex;
-    width: 100%;
-     height: $base-navbar-height;
-    .logo-container{
-        
-    }
-    .sidebar-scrollbar{
-        // width: 400px;
-        // border:1px solid red;
+  display: flex;
+  width: 100%;
+  height: $base-navbar-height;
+  .logo-container {
+  }
+  .sidebar-scrollbar {
+    // width: 400px;
+    // border:1px solid red;
+  }
+  :deep(.el-scrollbar__wrap) {
+    .el-menu--horizontal.el-menu {
+      border-bottom: none;
     }
-      :deep(.el-scrollbar__wrap) {
-        .el-menu--horizontal.el-menu {
-            border-bottom:none;
-        }
-        
-      }
-
+  }
 }
 </style>

+ 82 - 83
src/layout/components/SideBar/sideBarItem.vue

@@ -1,104 +1,103 @@
 <script setup>
 const props = defineProps({
-  item: {
-    type: Object,
-    required: true
-  }
+    item: {
+        type: Object,
+        required: true
+    }
 })
 const onlyOneChild = ref(null)
 function fatherHasOneSonOrMenu(children = [], parent) {
-  if (!children) {
-    children = []
-  }
-  const showingChildren = children.filter(item => {
-    if (item.hidden) {
-      return false
-    } else {
-      onlyOneChild.value = item
-      return true
+    if (!children) {
+        children = []
+    }
+    const showingChildren = children.filter(item => {
+        if (item.hidden) {
+            return false
+        } else {
+            onlyOneChild.value = item
+            return true
+        }
+    })
+    if (showingChildren.length === 1) {
+        return true
     }
-  })
-  if (showingChildren.length === 1) {
-    return true
-  }
-  if (showingChildren.length === 0) {
-    onlyOneChild.value = { ...parent, noShowingChildren: true }
-    return true
-  }
-  return false
+    if (showingChildren.length === 0) {
+        onlyOneChild.value = { ...parent, noShowingChildren: true }
+        return true
+    }
+    return false
 }
 function isExternal(path) {
-  return /^(https?:|mailto:|tel:)/.test(path)
+    return /^(https?:|mailto:|tel:)/.test(path)
 }
 
 const router = useRouter()
 const handleClickMenu = item => {
-  console.log(item.path)
-  if (isExternal(item.path)) {
-    window.open(item.path, '_blank')
-  } else {
-    if (item.path.startsWith('/tjmchild')) {
-      const parts = item.path.split('/') // 使用斜杠分割路径
-      console.log(parts.slice(3).join('/'))
-      router.push({
-        name: parts[2],
-        params: { page: parts.slice(3).join('/') }
-      })
+    console.log(item.path)
+    if (isExternal(item.path)) {
+        window.open(item.path, '_blank')
     } else {
-      router.push(item.path)
+        if (item.path.startsWith('/tjmchild')) {
+            const parts = item.path.split('/') // 使用斜杠分割路径
+            console.log(parts.slice(3).join('/'))
+            router.push({
+                name: parts[2],
+                params: { page: parts.slice(3).join('/') }
+            })
+        } else {
+            router.push(item.path)
+        }
     }
-  }
 }
 </script>
 
 <template>
-  <template v-if="!item.hidden">
-    <template v-if="fatherHasOneSonOrMenu(item.children, item) && !item.alwaysShow">
-      <el-menu-item
-        :index="onlyOneChild.path"
-        @click="handleClickMenu(onlyOneChild)"
-      >
-        <el-icon
-          size="16"
-          class="icon"
-          v-if="onlyOneChild.meta.icon.indexOf('ep') !== -1"
-        >
-          <component :is="onlyOneChild.meta.icon.slice(2)" />
-        </el-icon>
-        <svg-icon
-          v-if="onlyOneChild.meta.icon.indexOf('tjm') !== -1"
-          :icon-class="onlyOneChild.meta.icon.slice(4)"
-          class-name="icon"
-          style="height: 16px; width: 16px"
-        />
-
-        <template #title>{{ onlyOneChild.meta.title }}</template>
-      </el-menu-item>
+    <template v-if="!item.hidden">
+        <template v-if="fatherHasOneSonOrMenu(item.children, item) && !item.alwaysShow">
+            <el-menu-item
+                :index="onlyOneChild.path"
+                @click="handleClickMenu(onlyOneChild)"
+            >
+                <el-icon
+                    size="16"
+                    class="icon"
+                    v-if="onlyOneChild.meta.icon.indexOf('ep') !== -1"
+                >
+                    <component :is="onlyOneChild.meta.icon.slice(2)" />
+                </el-icon>
+                <svg-icon
+                    v-if="onlyOneChild.meta.icon.indexOf('tjm') !== -1"
+                    :icon-class="onlyOneChild.meta.icon.slice(4)"
+                    class-name="icon"
+                    style="height: 16px; width: 16px"
+                />
+                <template #title>{{ onlyOneChild.meta.title }}</template>
+            </el-menu-item>
+        </template>
+        <el-sub-menu v-else :index="item.path">
+            <template #title>
+                <el-icon
+                    size="16"
+                    class="icon"
+                    v-if="item.meta.icon.indexOf('ep') !== -1"
+                >
+                    <component :is="item.meta.icon.slice(2)" />
+                </el-icon>
+                <svg-icon
+                    v-if="item.meta.icon.indexOf('tjm') !== -1"
+                    :icon-class="item.meta.icon.slice(4)"
+                    class-name="icon"
+                    style="height: 16px; width: 16px"
+                />
+                <span>{{ item.meta.title }}</span>
+            </template>
+            <sideBarItem
+                v-for="(route, index) in item.children"
+                :key="route.path + index"
+                :item="route"
+            />
+        </el-sub-menu>
     </template>
-    <el-sub-menu v-else :index="item.path">
-      <template #title>
-        <el-icon
-          size="16"
-          class="icon"
-          v-if="item.meta.icon.indexOf('ep') !== -1"
-        >
-          <component :is="item.meta.icon.slice(2)" />
-        </el-icon>
-        <svg-icon
-          v-if="item.meta.icon.indexOf('tjm') !== -1"
-          :icon-class="item.meta.icon.slice(4)"
-          class-name="icon"
-          style="height: 16px; width: 16px"
-        />
-        <span>{{ item.meta.title }}</span>
-      </template>
-      <sideBarItem
-        v-for="(route, index) in item.children"
-        :key="route.path + index"
-        :item="route"
-      />
-    </el-sub-menu>
-  </template>
 </template>
 
-<style lang="scss" scoped></style>
+<style lang="scss" scoped></style>

+ 158 - 157
src/layout/components/TabsBar/index.vue

@@ -1,46 +1,47 @@
 
 <template>
-  <div class="tjm_tabsbar_container">
-    <el-scrollbar
-      ref="scrollContainer"
-      :vertical="false"
-      class="tjm_tabs-content"
-      @wheel.prevent="handleScroll"
-    >
-      <router-link
-        v-for="tag in visitedViews"
-        :key="tag.path"
-        :data-path="tag.path"
-        :class="isActive(tag) ? 'active' : ''"
-        :to="{ path: tag.path, query: tag.query, fullPath: tag.fullPath }"
-        class="tags-view-item"
-        :style="activeStyle(tag)"
-        @click.middle="!isAffix(tag) ? closeSelectedTag(tag) : ''"
-        @contextmenu.prevent="openMenu(tag, $event)"
-      >
-        {{ tag.title }}
-        <span v-if="!isAffix(tag)" @click.prevent.stop="closeSelectedTag(tag)">
-          <close
-            class="el-icon-close"
-            style="width: 1em; height: 1em; vertical-align: middle"
-          />
-        </span>
-      </router-link>
-    </el-scrollbar>
-    <ul
-      v-show="visible"
-      :style="{ left: left + 'px', top: top + 'px' }"
-      class="contextmenu"
-    >
-      <li v-if="!isAffix(selectedTag)" @click="closeSelectedTag(selectedTag)">
-        <close style="width: 1em; height: 1em;" /> 关闭当前
-      </li>
-       <li @click="closeOthersTags">
-        <circle-close style="width: 1em; height: 1em;" /> 关闭其他
-      </li>
-    </ul>
-  </div>
+    <div class="tjm_tabsbar_container">
+        <el-scrollbar
+            ref="scrollContainer"
+            :vertical="false"
+            class="tjm_tabs-content"
+            @wheel.prevent="handleScroll"
+        >
+            <router-link
+                v-for="tag in visitedViews"
+                :key="tag.path"
+                :data-path="tag.path"
+                :class="isActive(tag) ? 'active' : ''"
+                :to="{ path: tag.path, query: tag.query, fullPath: tag.fullPath }"
+                class="tags-view-item"
+                :style="activeStyle(tag)"
+                @click.middle="!isAffix(tag) ? closeSelectedTag(tag) : ''"
+                @contextmenu.prevent="openMenu(tag, $event)"
+            >
+                {{ tag.title }}
+                <span v-if="!isAffix(tag)" @click.prevent.stop="closeSelectedTag(tag)">
+                <close
+                    class="el-icon-close"
+                    style="width: 1em; height: 1em; vertical-align: middle"
+                />
+                </span>
+            </router-link>
+        </el-scrollbar>
+        <ul
+            v-show="visible"
+            :style="{ left: left + 'px', top: top + 'px' }"
+            class="contextmenu"
+        >
+            <li v-if="!isAffix(selectedTag)" @click="closeSelectedTag(selectedTag)">
+                <close style="width: 1em; height: 1em;" /> 关闭当前
+            </li>
+            <li @click="closeOthersTags">
+                <circle-close style="width: 1em; height: 1em;" /> 关闭其他
+            </li>
+        </ul>
+    </div>
 </template>
+
 <script setup>
 import { useTabsBarStore } from '@/store/tabsbar.js'
 import { usePermissionStore } from '@/store/permission.js'
@@ -60,161 +61,161 @@ const selectedTag = ref({})
 
 const { proxy } = getCurrentInstance()
 watch(route, () => {
-  addTags()
-  // moveToCurrentTag()
+    addTags()
+    // moveToCurrentTag()
 })
 onMounted(() => {
-  initTags()
-  addTags()
+    initTags()
+    addTags()
 })
 
 
 function addTags() {
-  const { name } = route
-  if (name) {
-    useTabsBarStore().addView(route)
-  }
-  return false
+    const { name } = route
+    if (name) {
+        useTabsBarStore().addView(route)
+    }
+    return false
 }
 
 function initTags() {
-  const res = filterAffixTags(routes.value)
-  affixTags.value = res
-  for (const tag of res) {
-    if (tag.name) {
-      useTabsBarStore().addVisitedView(tag)
+    const res = filterAffixTags(routes.value)
+    affixTags.value = res
+    for (const tag of res) {
+        if (tag.name) {
+            useTabsBarStore().addVisitedView(tag)
+        }
     }
-  }
 }
 
 function moveToCurrentTag() {
-  nextTick(() => {
-    for (const r of visitedViews.value) {
-      if (r.path === route.path) {
-        scrollPaneRef.value.moveToTarget(r)
-        if (r.fullPath !== route.fullPath) {
-          useTagsViewStore().updateVisitedView(route)
+    nextTick(() => {
+        for (const r of visitedViews.value) {
+            if (r.path === route.path) {
+                scrollPaneRef.value.moveToTarget(r)
+                if (r.fullPath !== route.fullPath) {
+                    useTagsViewStore().updateVisitedView(route)
+                }
+            }
         }
-      }
-    }
-  })
+    })
 }
 
 function filterAffixTags(routes, basePath = '') {
-  let tags = []
-  routes.forEach(route => {
-    if (route.meta && route.meta.affix) {
-      const tagPath = getNormalPath(basePath + '/' + route.path)
-      tags.push({
-        fullPath: tagPath,
-        path: tagPath,
-        name: route.name,
-        meta: { ...route.meta }
-      })
-    }
-    if (route.children) {
-      const tempTags = filterAffixTags(route.children, route.path)
-      if (tempTags.length >= 1) {
-        tags = [...tags, ...tempTags]
-      }
-    }
-  })
-  return tags
+    let tags = []
+    routes.forEach(route => {
+        if (route.meta && route.meta.affix) {
+            const tagPath = getNormalPath(basePath + '/' + route.path)
+            tags.push({
+                fullPath: tagPath,
+                path: tagPath,
+                name: route.name,
+                meta: { ...route.meta }
+            })
+        }
+        if (route.children) {
+            const tempTags = filterAffixTags(route.children, route.path)
+            if (tempTags.length >= 1) {
+                tags = [...tags, ...tempTags]
+            }
+        }
+    })
+    return tags
 }
 
 
 function getNormalPath(p) {
-  if (p.length === 0 || !p || p == 'undefined') {
-    return p
-  }
-  let res = p.replace('//', '/')
-  if (res[res.length - 1] === '/') {
-    return res.slice(0, res.length - 1)
-  }
-  return res
+    if (p.length === 0 || !p || p == 'undefined') {
+        return p
+    }
+    let res = p.replace('//', '/')
+    if (res[res.length - 1] === '/') {
+        return res.slice(0, res.length - 1)
+    }
+    return res
 }
 
 
 
 function closeMenu() {
-  visible.value = false
+    visible.value = false
 }
 
 function handleScroll() {
-  closeMenu()
+    closeMenu()
 }
 watch(visible, (value) => {
-  if (value) {
-    document.body.addEventListener('click', closeMenu)
-  } else {
-    document.body.removeEventListener('click', closeMenu)
-  }
+    if (value) {
+        document.body.addEventListener('click', closeMenu)
+    } else {
+        document.body.removeEventListener('click', closeMenu)
+    }
 })
 
 function openMenu(tag, e) {
-  const menuMinWidth = 105
-  const offsetLeft = proxy.$el.getBoundingClientRect().left 
-  const offsetWidth = proxy.$el.offsetWidth // container width
-  const maxLeft = offsetWidth - menuMinWidth // left boundary
-  const l = e.clientX - offsetLeft + 15 // 15: margin right
+    const menuMinWidth = 105
+    const offsetLeft = proxy.$el.getBoundingClientRect().left
+    const offsetWidth = proxy.$el.offsetWidth // container width
+    const maxLeft = offsetWidth - menuMinWidth // left boundary
+    const l = e.clientX - offsetLeft + 15 // 15: margin right
+
+    if (l > maxLeft) {
+        left.value = maxLeft
+    } else {
+        left.value = l
+    }
+
+    top.value = 15
+    visible.value = true
+    selectedTag.value = tag
 
-  if (l > maxLeft) {
-    left.value = maxLeft
-  } else {
-    left.value = l
-  }
-  
-  top.value = 15
-  visible.value = true
-  selectedTag.value = tag
- 
 }
 
 
 function isActive(r) {
-  return r.path === decodeURIComponent(route.path)
+    return r.path === decodeURIComponent(route.path)
 }
 
 
 
 function activeStyle(tag) {
-  if (!isActive(tag)) return {}
-  return {
-    'background-color': theme.value,
-    'border-color': theme.value
-  }
+    if (!isActive(tag)) return {}
+    return {
+        'background-color': theme.value,
+        'border-color': theme.value
+    }
 }
 
 function isAffix(tag) {
-  // if(tag.name=="Index") return true
-  return tag.meta && tag.meta.affix
+    // if(tag.name=="Index") return true
+    return tag.meta && tag.meta.affix
 }
 
 function closeSelectedTag(view) {
-  useTabsBarStore()
-    .delView(view)
-    .then(({ visitedViews }) => {
-      if (isActive(view)) {
-        toLastView(visitedViews, view)
-      }
-    })
+    useTabsBarStore()
+        .delView(view)
+        .then(({ visitedViews }) => {
+            if (isActive(view)) {
+                toLastView(visitedViews, view)
+            }
+        })
 }
 function closeOthersTags() {
-  useTabsBarStore().delOthersViews(selectedTag.value).then(({visitedViews})=>{
-     toLastView(visitedViews, selectedTag.value)
-  })
+    useTabsBarStore().delOthersViews(selectedTag.value).then(({ visitedViews }) => {
+        toLastView(visitedViews, selectedTag.value)
+    })
 }
 function toLastView(visitedViews, view) {
-  const latestView = visitedViews.slice(-1)[0]
-  if (latestView) {
-    router.push(latestView.fullPath)
-  } else {
-    if (view.name === 'Index') {
-      router.replace({ path: '/redirect' + view.fullPath })
+    const latestView = visitedViews.slice(-1)[0]
+    if (latestView) {
+        router.push(latestView.fullPath)
     } else {
-      router.push('/')
+        if (view.name === 'Index') {
+            router.replace({ path: '/redirect' + view.fullPath })
+        } else {
+            router.push('/')
+        }
     }
-  }
 }
 </script>
  
@@ -276,27 +277,27 @@ function toLastView(visitedViews, view) {
       }
     }
   }
-   .contextmenu {
+  .contextmenu {
+    margin: 0;
+    background: #fff;
+    position: absolute;
+    z-index: 3000;
+    list-style-type: none;
+    padding: 5px 0;
+    border-radius: 4px;
+    font-size: 12px;
+    font-weight: 400;
+    color: #333;
+    box-shadow: 2px 2px 3px 0 rgba(0, 0, 0, 0.3);
+    li {
       margin: 0;
-      background: #fff;
-      position: absolute;
-      z-index: 3000;
-      list-style-type: none;
-      padding: 5px 0;
-      border-radius: 4px;
-      font-size: 12px;
-      font-weight: 400;
-      color: #333;
-      box-shadow: 2px 2px 3px 0 rgba(0, 0, 0, 0.3);
-      li {
-        margin: 0;
-        padding: 7px 16px;
-        cursor: pointer;
-        &:hover {
-          background: #eee;
-        }
+      padding: 7px 16px;
+      cursor: pointer;
+      &:hover {
+        background: #eee;
       }
     }
+  }
 }
 </style>
 <style lang="scss">

+ 26 - 24
src/layout/index.vue

@@ -1,25 +1,26 @@
 <template>
-  <!--  :locale="localeLang" -->
-  <el-config-provider :locale="localeLang">
-    <div class="tjm_wrapper">
-      <div class="tjm_warpper_container fixed">
-        <tjm-side-bar v-if="layoutStyle=='vertical'" />
-        <div class="tjm_container" :class="{ 'is-collapse': collapse,'is-layoutStyle':layoutStyle=='horizontal' }">
-          <div
-            class="header_container fixed-header"
-            :class="{ 'is-collapse': collapse,'is-layoutStyle':layoutStyle=='horizontal' }"
-          >
-            <tjm-nav-bar />
-            <tjm-tabs-bar />
-          </div>
-          <div class="content_container">
-            <tjm-main />
-          </div>
+    <!--  :locale="localeLang" -->
+    <el-config-provider :locale="localeLang">
+        <div class="tjm_wrapper">
+            <div class="tjm_warpper_container fixed">
+                <tjm-side-bar v-if="layoutStyle=='vertical'" />
+                <div class="tjm_container" :class="{ 'is-collapse': collapse,'is-layoutStyle':layoutStyle=='horizontal' }">
+                    <div
+                        class="header_container fixed-header"
+                        :class="{ 'is-collapse': collapse, 'is-layoutStyle': layoutStyle == 'horizontal' }"
+                    >
+                        <tjm-nav-bar />
+                        <tjm-tabs-bar />
+                    </div>
+                    <div class="content_container">
+                        <tjm-main />
+                    </div>
+                </div>
+            </div>
         </div>
-      </div>
-    </div>
-  </el-config-provider>
+    </el-config-provider>
 </template>
+
 <script setup>
 import { getConfig, setConfig } from '@/config/config'
 import TjmSideBar from './components/SideBar/index.vue'
@@ -34,12 +35,13 @@ const { messages, locale, t } = useI18n()
 const localeLang = ref(messages[getConfig('globalI18n')])
 // 修改element 和 i18n 默认语言
 const changeLanguage = () => {
-  locale.value = getConfig('globalI18n')
-  localeLang.value = messages.value[locale.value]
+    locale.value = getConfig('globalI18n')
+    localeLang.value = messages.value[locale.value]
 }
 // 监听修改语言实现element
 watchEffect(changeLanguage)
 </script>
+
 <style lang="scss" scoped>
 @mixin fix-header {
   position: fixed;
@@ -64,7 +66,7 @@ watchEffect(changeLanguage)
         margin-left: $base-sidebar-width-min;
         border-right: 0;
       }
-      &.is-layoutStyle{
+      &.is-layoutStyle {
         margin-left: 0;
         border-right: 0;
       }
@@ -76,8 +78,8 @@ watchEffect(changeLanguage)
         &.is-collapse {
           width: calc(100% - $base-sidebar-width-min);
         }
-        &.is-layoutStyle{
-           width:100%;
+        &.is-layoutStyle {
+          width: 100%;
         }
       }
       .content_container {

+ 1 - 1
src/micro/index.js

@@ -1,2 +1,2 @@
-import microApp from '@micro-zoe/micro-app'
+import microApp from "@micro-zoe/micro-app"
 microApp.start()

+ 36 - 36
src/micro/index.vue

@@ -1,60 +1,60 @@
 <template>
-  <div class="warp" v-loading="loading">
-    <!-- <h1>子应用👇</h1> -->
-    <!-- name:应用名称, url:应用地址 -->
-    <micro-app
-      name="my-app"
-      router-mode="native"
-      :url="url"
-      baseroute="/workflow/"
-      :data="dataForChild"
-      @created="created"
-      @beforemount="beforemount"
-      @mounted="mounted"
-      @unmount="unmount"
-      @error="error"
-    ></micro-app>
-  </div>
+    <div class="warp" v-loading="loading">
+        <!-- <h1>子应用👇</h1> -->
+        <!-- name:应用名称, url:应用地址 -->
+        <micro-app
+            name="my-app"
+            router-mode="native"
+            :url="url"
+            baseroute="/workflow/"
+            :data="dataForChild"
+            @created="created"
+            @beforemount="beforemount"
+            @mounted="mounted"
+            @unmount="unmount"
+            @error="error"
+        ></micro-app>
+    </div>
 </template>
 
 <script setup>
-import microApp from '@micro-zoe/micro-app'
-import { getRefreshToken } from '@/utils/auth'
+import microApp from "@micro-zoe/micro-app"
+import { getRefreshToken } from "@/utils/auth"
 const url = import.meta.env.VITE_WORKFLOW_URL
 const dataForChild = {
-  token: getRefreshToken()
+    token: getRefreshToken()
 }
 const router = useRouter()
 const loading = ref(true)
 function created() {
-  console.log('micro-app元素被创建')
+    console.log("micro-app元素被创建")
 }
 function beforemount() {
-  console.log('即将被渲染')
-  loading.value = true
+    console.log("即将被渲染")
+    loading.value = true
 }
 function mounted() {
-  console.log('渲染完成')
-  const url = decodeURIComponent(router.currentRoute.value.fullPath)
-  //  microApp.setData("app1", { path: path})
-  microApp.router.push({ name: 'my-app', path: url })
-  
-  loading.value = false
+    console.log("渲染完成")
+    const url = decodeURIComponent(router.currentRoute.value.fullPath)
+    //  microApp.setData("app1", { path: path})
+    microApp.router.push({ name: "my-app", path: url })
+    
+    loading.value = false
 }
 function unmount() {
-  console.log('已经卸载')
+    console.log("已经卸载")
 }
 function error() {
-  console.log('渲染出错')
-  ElMessage({
-    message: '工作流项目渲染出错请检查工作流项目',
-    type: 'error'
-  })
-  router.push('/index')
+    console.log("渲染出错")
+    ElMessage({
+        message: "工作流项目渲染出错请检查工作流项目",
+        type: "error"
+    })
+    router.push("/index")
 }
 </script>
 
-<style lang='scss' scoped>
+<style lang="scss" scoped>
 .warp {
   min-height: 600px;
 }

+ 36 - 39
src/otherLogin/bx.vue

@@ -1,8 +1,8 @@
 <template>
-  <!-- 宝信单点登录 -->
-  <div>
-    <div class="center_loading" v-loading:body="loading"></div>
-  </div>
+    <!-- 宝信单点登录 -->
+    <div>
+        <div class="center_loading" v-loading:body="loading"></div>
+    </div>
 </template>
 
 <script setup>
@@ -12,43 +12,40 @@ import { useUserStore } from '@/store/user.js'
 const loading = ref(true)
 const router = useRouter()
 onMounted(() => {
-  let geturl = window.location.href
-  console.log(geturl)
-  let getqyinfo = geturl.split('?')[1] //  截取到参数部分
-  let getqys = new URLSearchParams('?' + getqyinfo) //将参数放在URLSearchParams函数中
-  let code = getqys.get('code')
-  let redirect_url = getqys.get('redirect_url')
-  if (redirect_url) {
-    localStorage.setItem('edgeRedirect', redirect_url)
-  }
-  if (code) {
-    goLoginEplat(code)
-  } else {
-    let url =
-      VITE_BX_AUTH_URL +
-      '?response_type=code&client_id=' +
-      VITE_BX_CLIENT_ID +
-      '&redirect_uri=' +
-      VITE_BX_REDIRECT_URL +
-      '&scope=write'
-    console.log(url)
-    window.location.href = url
-  }
+    let geturl = window.location.href
+    console.log(geturl)
+    let getqyinfo = geturl.split('?')[1] //  截取到参数部分
+    let getqys = new URLSearchParams('?' + getqyinfo) //将参数放在URLSearchParams函数中
+    let code = getqys.get('code')
+    let redirect_url = getqys.get('redirect_url')
+    if (redirect_url) {
+        localStorage.setItem('edgeRedirect', redirect_url)
+    }
+    if (code) {
+        goLoginEplat(code)
+    } else {
+        let url =
+        VITE_BX_AUTH_URL +
+        '?response_type=code&client_id=' +
+        VITE_BX_CLIENT_ID +
+        '&redirect_uri=' +
+        VITE_BX_REDIRECT_URL +
+        '&scope=write'
+        console.log(url)
+        window.location.href = url
+    }
 })
 function goLoginEplat(code) {
-  console.log(code)
-  useUserStore()
-    .bxLogin(code)
-    .then(() => {
-      const redirect_url = localStorage.getItem('edgeRedirect')
-      if (redirect_url) {
-        router.push(redirect_url)
-        localStorage.removeItem('edgeRedirect')
-      } else {
-        router.push('/')
-      }
-    })
-    .catch(err => {
+    console.log(code)
+    useUserStore().bxLogin(code).then(() => {
+        const redirect_url = localStorage.getItem('edgeRedirect')
+        if (redirect_url) {
+            router.push(redirect_url)
+            localStorage.removeItem('edgeRedirect')
+        } else {
+            router.push('/')
+        }
+    }).catch(err => {
         router.push('/noPermission')
         //  console.log("登录成功")
     })

+ 36 - 41
src/otherLogin/ssoSgzl.vue

@@ -1,55 +1,50 @@
 <template>
- 
-  <div>
-    <div class="center_loading" v-loading:body="loading"></div>
-  </div>
+    <div>
+        <div class="center_loading" v-loading:body="loading"></div>
+    </div>
 </template>
 
 <script setup>
 import { onMounted } from 'vue'
-const { VITE_EDGE_AUTH_URL, VITE_EDGE_CLIENT_ID, VITE_EDGE_REDIRECT_URL } =
-  import.meta.env
+const { VITE_EDGE_AUTH_URL, VITE_EDGE_CLIENT_ID, VITE_EDGE_REDIRECT_URL } = import.meta.env
 import { useUserStore } from '@/store/user.js'
 const loading = ref(true)
 onMounted(() => {
-  let geturl = window.location.href
-  console.log(geturl)
-  let getqyinfo = geturl.split('?')[1] //  截取到参数部分
-  let getqys = new URLSearchParams('?' + getqyinfo) //将参数放在URLSearchParams函数中
-  let code = getqys.get('code')
-  let redirect_url = getqys.get('redirect_url')
-  if (redirect_url) {
-    localStorage.setItem('edgeRedirect', redirect_url)
-  }
-  if (code) {
-    goLoginEplat(code)
-  } else {
-    let url =
-      VITE_EDGE_AUTH_URL +
-      '?response_type=code&client_id=' +
-      VITE_EDGE_CLIENT_ID +
-      '&redirect_uri=' +
-      VITE_EDGE_REDIRECT_URL +
-      '&scope=all'
-    console.log(url)
-    window.location.href = url
-  }
+    let geturl = window.location.href
+    console.log(geturl)
+    let getqyinfo = geturl.split('?')[1] //  截取到参数部分
+    let getqys = new URLSearchParams('?' + getqyinfo) //将参数放在URLSearchParams函数中
+    let code = getqys.get('code')
+    let redirect_url = getqys.get('redirect_url')
+    if (redirect_url) {
+        localStorage.setItem('edgeRedirect', redirect_url)
+    }
+    if (code) {
+        goLoginEplat(code)
+    } else {
+        let url = 
+            VITE_EDGE_AUTH_URL +
+            '?response_type=code&client_id=' +
+            VITE_EDGE_CLIENT_ID +
+            '&redirect_uri=' +
+            VITE_EDGE_REDIRECT_URL +
+            '&scope=all'
+        console.log(url)
+        window.location.href = url
+    }
 })
 const router = useRouter()
 function goLoginEplat(code) {
-  console.log(code)
-  useUserStore()
-    .edgeLogin(code)
-    .then(() => {
-      const redirect_url = localStorage.getItem('edgeRedirect')
-      if (redirect_url) {
-        router.push(redirect_url)
-        localStorage.removeItem('edgeRedirect')
-      } else {
-        router.push('/middleBackstage')
-      }
-    })
-    .catch(err => {})
+    console.log(code)
+    useUserStore().edgeLogin(code).then(() => {
+        const redirect_url = localStorage.getItem('edgeRedirect')
+        if (redirect_url) {
+            router.push(redirect_url)
+            localStorage.removeItem('edgeRedirect')
+        } else {
+            router.push('/middleBackstage')
+        }
+    }).catch(err => {})
 }
 </script>
 

+ 29 - 28
src/permission.js

@@ -5,41 +5,42 @@ import { useSettingStore } from '@/store/settings.js'
 import { usePermissionStore } from '@/store/permission.js'
 import { dynamicRoutes } from '@/router/dynamicRoutes'
 
-const whiteList = ['/login','/yh','/ssoyh']
+const whiteList = ['/login', '/yh', '/ssoyh']
 router.beforeEach((to, from, next) => {
-  if (getToken()) {
-    to.meta.title && useSettingStore().setTitle(to.meta.title)
-    if (useUserStore().roles.length === 0) {
-      useUserStore().RefreshInfo().then(res => {
-        usePermissionStore().generateRoutes().then(accessRoutes => {
-          accessRoutes.forEach(item => {
-            router.addRoute(item)
-          })
-          router.addRoute({
-            path: "/:pathMatch(.*)*",
-            name: 'notFound',
-            redirect: '/notfound',
-        })
-          next({ ...to, replace: true }) // hack方法 确保addRoutes已完成
-        })
-      })
-    } else {
-      next()
+    if (getToken()) {
+        to.meta.title && useSettingStore().setTitle(to.meta.title)
+        if (useUserStore().roles.length === 0) {
+            useUserStore().RefreshInfo().then(res => {
+                usePermissionStore().generateRoutes().then(accessRoutes => {
+                    accessRoutes.forEach(item => {
+                        router.addRoute(item)
+                    })
+                    router.addRoute({
+                        path: "/:pathMatch(.*)*",
+                        name: 'notFound',
+                        redirect: '/notfound',
+                    })
+                    next({ ...to, replace: true }) // hack方法 确保addRoutes已完成
+                })
+            })
+        } else {
+            next()
+        }
+    } else { //登录
+        //白名单放行
+        if (whiteList.indexOf(to.path) !== -1) {
+            next()
+        } else {
+            next(`/login?redirect=${to.fullPath}`) // 否则全部重定向到登录页
+        }
     }
-  } else { //登录
-    //白名单放行
-    if (whiteList.indexOf(to.path) !== -1) {
-      next()
-    } else {
-      next(`/login?redirect=${to.fullPath}`) // 否则全部重定向到登录页
-    }
-  }
 
 })
 
 router.afterEach(() => {
 
 })
+
 router.onError((error) => {
-  console.warn('路由错误', error.message)
+    console.warn('路由错误', error.message)
 })

+ 96 - 96
src/router/constantRoutes.js

@@ -1,100 +1,100 @@
-const Layout = () => import('@/layout/index.vue')
+const Layout = () => import("@/layout/index.vue")
 export const staticRoutes = [
-  {
-    path: '/notfound',
-    name: 'notfound',
-    hidden: true,
-    component: () => import('@/views/404.vue')
-  },
-  {
-    path: '/redirect',
-    component: Layout,
-    hidden: true,
-    children: [
-      {
-        path: '/redirect/:path(.*)',
-        component: () => import('@/views/redirect/index.vue')
-      }
-    ]
-  },
-  {
-    path: '/login',
-    name: 'login',
-    hidden: true,
-    component: () => import('@/views/login/index.vue')
-  },
-  {
-    path: '/404',
-    name: '404',
-    hidden: true,
-    component: () => import('@/views/404.vue')
-  },
-  {
-    path: '/noPermission',
-    name: 'noPermission',
-    hidden: true,
-    component: () => import('@/views/error/noPermission.vue')
-  },
-  {
-    path: '/yh',
-    name: 'yhlogin',
-    hidden: true,
-    component: () => import('@/otherLogin/bx.vue'),
-  },
-  {
-    path: '/ssoyh',
-    name: 'ssoyh',
-    hidden: true,
-    component: () => import('@/otherLogin/ssoSgzl.vue'),
-  },
-  {
-    path: '',
-    component: Layout,
-    redirect: '/index',
-    alwaysShow: false,
-    children: [
-      
-      {
-        path: '/index',
-        name: 'Index',
-        component: () => import('@/views/home/home.vue'),
+    {
+        path: "/notfound",
+        name: "notfound",
+        hidden: true,
+        component: () => import("@/views/404.vue")
+    },
+    {
+        path: "/redirect",
+        component: Layout,
+        hidden: true,
+        children: [
+            {
+                path: "/redirect/:path(.*)",
+                component: () => import("@/views/redirect/index.vue")
+            }
+        ]
+    },
+    {
+        path: "/login",
+        name: "login",
+        hidden: true,
+        component: () => import("@/views/login/index.vue")
+    },
+    {
+        path: "/404",
+        name: "404",
+        hidden: true,
+        component: () => import("@/views/404.vue")
+    },
+    {
+        path: "/noPermission",
+        name: "noPermission",
+        hidden: true,
+        component: () => import("@/views/error/noPermission.vue")
+    },
+    {
+        path: "/yh",
+        name: "yhlogin",
+        hidden: true,
+        component: () => import("@/otherLogin/bx.vue"),
+    },
+    {
+        path: "/ssoyh",
+        name: "ssoyh",
+        hidden: true,
+        component: () => import("@/otherLogin/ssoSgzl.vue"),
+    },
+    {
+        path: "",
+        component: Layout,
+        redirect: "/index",
         alwaysShow: false,
-        meta: {
-          title: '首页',
-          icon: 'ep-Cpu',
-          affix: false
-        },
-        children: []
-      },
-      {
-        path: '/workflow/:page*', 
-        name: 'workflow',
-        component: () => import('@/micro/index.vue'),
-        alwaysShow: false,
-        hidden:true,
-        meta: {
-            title: '微前端',
-            icon: 'ep-Cpu',
-            affix: false,
-            micro:true  //底座必须加
-        },
-        children: []
-      },
-      {
-        path: '/userInfo',
-        name: 'userInfo',
-        component: () => import('@/views/system/userInfo.vue'),
-        alwaysShow: false,
-        hidden:true,
-        meta: {
-          title: '个人信息',
-          icon: 'ep-Cpu',
-          affix: false
-        },
-        children: []
-      }
-    ]
-  },
- 
+        children: [
+
+            {
+                path: "/index",
+                name: "Index",
+                component: () => import("@/views/home/home.vue"),
+                alwaysShow: false,
+                meta: {
+                    title: "首页",
+                    icon: "ep-Cpu",
+                    affix: false
+                },
+                children: []
+            },
+            {
+                path: "/workflow/:page*",
+                name: "workflow",
+                component: () => import("@/micro/index.vue"),
+                alwaysShow: false,
+                hidden: true,
+                meta: {
+                    title: "微前端",
+                    icon: "ep-Cpu",
+                    affix: false,
+                    micro: true  //底座必须加
+                },
+                children: []
+            },
+            {
+                path: "/userInfo",
+                name: "userInfo",
+                component: () => import("@/views/system/userInfo.vue"),
+                alwaysShow: false,
+                hidden: true,
+                meta: {
+                    title: "个人信息",
+                    icon: "ep-Cpu",
+                    affix: false
+                },
+                children: []
+            }
+        ]
+    },
+
 
 ]

+ 67 - 67
src/router/dynamicRoutes.js

@@ -3,71 +3,71 @@ const Layout = () => import('@/layout/index.vue')
 
 export const dynamicRoutes = [
 
-  // {
-  //     path: '/testManage',
-  //     component: Layout,
-  //     redirect: '/test',
-  //     meta: {
-  //         title: '测试',
-  //         icon: 'Box',
-  //     },
-  //     children: [
-  //         {
-  //             path: 'test',
-  //             name: 'Test',
-  //             component: () => import('@/views/test.vue'),
-  //             meta: {
-  //                 title: '测试',
-  //                 icon: 'Box',
-  //             },
-  //         }
-  //     ]
-  // },
-  // {
-  //     path: '/system',
-  //     component: Layout,
-  //     redirect: '/menu',
-  //     meta: {
-  //         title: '平台运维',
-  //         icon: 'Box',
-  //     },
-  //     children: [
-  //         {
-  //             path: 'user',
-  //             name: 'User',
-  //             component: () => import('@/views/system/user.vue'),
-  //             meta: {
-  //                 title: '用户管理',
-  //                 icon: 'Box',
-  //             },
-  //         },
-  //         {
-  //             path: 'dept',
-  //             name: 'Dept',
-  //             component: () => import('@/views/system/dept.vue'),
-  //             meta: {
-  //                 title: '部门管理',
-  //                 icon: 'Box',
-  //             },
-  //         },
-  //         {
-  //             path: 'role',
-  //             name: 'Role',
-  //             component: () => import('@/views/system/role.vue'),
-  //             meta: {
-  //                 title: '角色管理',
-  //                 icon: 'Box',
-  //             },
-  //         },
-  //         {
-  //             path: 'menu',
-  //             name: 'Menu',
-  //             component: () => import('@/views/system/menu.vue'),
-  //             meta: {
-  //                 title: '菜单管理',
-  //                 icon: 'Box',
-  //             },
-  //         }
-  //     ]
-  // }
+    // {
+    //     path: '/testManage',
+    //     component: Layout,
+    //     redirect: '/test',
+    //     meta: {
+    //         title: '测试',
+    //         icon: 'Box',
+    //     },
+    //     children: [
+    //         {
+    //             path: 'test',
+    //             name: 'Test',
+    //             component: () => import('@/views/test.vue'),
+    //             meta: {
+    //                 title: '测试',
+    //                 icon: 'Box',
+    //             },
+    //         }
+    //     ]
+    // },
+    // {
+    //     path: '/system',
+    //     component: Layout,
+    //     redirect: '/menu',
+    //     meta: {
+    //         title: '平台运维',
+    //         icon: 'Box',
+    //     },
+    //     children: [
+    //         {
+    //             path: 'user',
+    //             name: 'User',
+    //             component: () => import('@/views/system/user.vue'),
+    //             meta: {
+    //                 title: '用户管理',
+    //                 icon: 'Box',
+    //             },
+    //         },
+    //         {
+    //             path: 'dept',
+    //             name: 'Dept',
+    //             component: () => import('@/views/system/dept.vue'),
+    //             meta: {
+    //                 title: '部门管理',
+    //                 icon: 'Box',
+    //             },
+    //         },
+    //         {
+    //             path: 'role',
+    //             name: 'Role',
+    //             component: () => import('@/views/system/role.vue'),
+    //             meta: {
+    //                 title: '角色管理',
+    //                 icon: 'Box',
+    //             },
+    //         },
+    //         {
+    //             path: 'menu',
+    //             name: 'Menu',
+    //             component: () => import('@/views/system/menu.vue'),
+    //             meta: {
+    //                 title: '菜单管理',
+    //                 icon: 'Box',
+    //             },
+    //         }
+    //     ]
+    // }
 ]

+ 4 - 4
src/router/index.js

@@ -16,10 +16,10 @@ import { staticRoutes } from './constantRoutes'
 // },
 
 const router = createRouter({
-  history: createWebHistory(),
-  routes: staticRoutes,
-  // 刷新时,滚动条位置还原
-  scrollBehavior: () => ({ left: 0, top: 0 })
+    history: createWebHistory(),
+    routes: staticRoutes,
+    // 刷新时,滚动条位置还原
+    scrollBehavior: () => ({ left: 0, top: 0 })
 })
 
 

+ 153 - 157
src/store/permission.js

@@ -1,172 +1,168 @@
-import { staticRoutes } from '@/router/constantRoutes'
-import { dynamicRoutes } from '@/router/dynamicRoutes'
+import { staticRoutes } from "@/router/constantRoutes"
+import { dynamicRoutes } from "@/router/dynamicRoutes"
 
-const Micro = () => import('@/micro/index.vue')
-import { useUserStore } from '@/store/user.js'
-import Layout from '@/layout/index.vue'
-import ParentView from '@/components/ParentView/index.vue'
+const Micro = () => import("@/micro/index.vue")
+import { useUserStore } from "@/store/user.js"
+import Layout from "@/layout/index.vue"
+import ParentView from "@/components/ParentView/index.vue"
 
-const modules = import.meta.glob('./../views/**/*.vue')
+const modules = import.meta.glob("./../views/**/*.vue")
 export const usePermissionStore = defineStore(
-  'permission',
-  {
-    state: () => ({
-      routes: [],
-      addRoutes: [],
-      sidebarRouters: [],
-      defaultRoutes: []
-    }),
-    actions: {
-      setRoutes(routes) {
-        this.addRoutes = routes
-        this.routes = staticRoutes.concat(routes)
-      },
-      setSidebarRouters(routes) {
-        this.sidebarRouters = routes
-      },
-      setDefaultRoutes(routes) {
-        this.defaultRoutes = staticRoutes.concat(routes)
-      },
-      generateRoutes() {
-        return new Promise(resolve => {
-          const sidebarRoutes = filterAsyncRouter(useUserStore().menuList[0].children[0].children)
-          this.setSidebarRouters(staticRoutes.concat(sidebarRoutes))
-          const rewriteRoutes = filterAsyncRouter(useUserStore().menuList[0].children[0].children, false)
-          this.setRoutes(rewriteRoutes)
-          resolve(rewriteRoutes)
-        })
-      }
+    "permission",
+    {
+        state: () => ({
+            routes: [],
+            addRoutes: [],
+            sidebarRouters: [],
+            defaultRoutes: []
+        }),
+        actions: {
+            setRoutes(routes) {
+                this.addRoutes = routes
+                this.routes = staticRoutes.concat(routes)
+            },
+            setSidebarRouters(routes) {
+                this.sidebarRouters = routes
+            },
+            setDefaultRoutes(routes) {
+                this.defaultRoutes = staticRoutes.concat(routes)
+            },
+            generateRoutes() {
+                return new Promise(resolve => {
+                    const sidebarRoutes = filterAsyncRouter(useUserStore().menuList[0].children[0].children)
+                    this.setSidebarRouters(staticRoutes.concat(sidebarRoutes))
+                    const rewriteRoutes = filterAsyncRouter(useUserStore().menuList[0].children[0].children, false)
+                    this.setRoutes(rewriteRoutes)
+                    resolve(rewriteRoutes)
+                })
+            }
+        }
     }
-  }
 )
 // 
 function filterAsyncRouter(asyncRouterMap, httpSave = true) {
-  let arr = []
-  asyncRouterMap.filter(route => {
-    if (route.children != null && route.children && route.children.length && route.children[0].type != 2 && route.parentId == "1762659463383281665") {
-      let info = {
-        alwaysShow: true,
-        children: [],
-        component: Layout,
-        hidden: false,
-        meta: {
-          icon: route.icon,
-          link: '',
-          cache: false,
-          title: route.name
-        },
-        name: route.name,
-        path: route.path,
-        redirect: false
-      }
-      info.children = filterAsyncRouter(route.children)
-      if (info.children.length > 0) {
-        info.redirect = info.children[0].path
-      }
-      arr.push(info)
-    } else if (route.children != null && route.children && route.children.length && route.children[0].type != 2 && route.parentId != "1762659463383281665") {
-      let info = {
-        alwaysShow: true,
-        children: [],
-        component: ParentView,
-        hidden: false,
-        meta: {
-          icon: route.icon,
-          link: '',
-          cache: false,
-          title: route.name
-        },
-        name: route.name,
-        path: route.path,
-        redirect: false
-      }
-      info.children = filterAsyncRouter(route.children)
-      if (info.children.length > 0) {
-        info.redirect = info.children[0].path
-      }
-      arr.push(info)
-    } else if (route.children.length == 0 && route.parentId == "1762659463383281665") {
-      let info = {
-        path: '',
-        component: Layout,
-        redirect: route.path,
-        alwaysShow: false,
-        hidden: false,
-        meta: {
-          icon: route.icon,
-          title: route.name
-        },
-        children: [
-          {
-            // alwaysShow: false, //菜单不支持设置
-            children: [],
-            component: loadView(route.path),
-            hidden: false,
-            meta: {
-              icon: route.icon,
-              link: '',
-              cache: false,
-              title: route.name
-            },
-            name: route.name,
-            path: route.path,
-            redirect: false
-          }
-        ]
+    let arr = []
+    asyncRouterMap.filter(route => {
+        if (route.children != null && route.children && route.children.length && route.children[0].type != 2 && route.parentId == "1762659463383281665") {
+            let info = {
+                alwaysShow: true,
+                children: [],
+                component: Layout,
+                hidden: false,
+                meta: {
+                    icon: route.icon,
+                    link: "",
+                    cache: false,
+                    title: route.name
+                },
+                name: route.name,
+                path: route.path,
+                redirect: false
+            }
+            info.children = filterAsyncRouter(route.children)
+            if (info.children.length > 0) {
+                info.redirect = info.children[0].path
+            }
+            arr.push(info)
+        } else if (route.children != null && route.children && route.children.length && route.children[0].type != 2 && route.parentId != "1762659463383281665") {
+            let info = {
+                alwaysShow: true,
+                children: [],
+                component: ParentView,
+                hidden: false,
+                meta: {
+                    icon: route.icon,
+                    link: "",
+                    cache: false,
+                    title: route.name
+                },
+                name: route.name,
+                path: route.path,
+                redirect: false
+            }
+            info.children = filterAsyncRouter(route.children)
+            if (info.children.length > 0) {
+                info.redirect = info.children[0].path
+            }
+            arr.push(info)
+        } else if (route.children.length == 0 && route.parentId == "1762659463383281665") {
+            let info = {
+                path: "",
+                component: Layout,
+                redirect: route.path,
+                alwaysShow: false,
+                hidden: false,
+                meta: {
+                    icon: route.icon,
+                    title: route.name
+                },
+                children: [
+                    {
+                        // alwaysShow: false, //菜单不支持设置
+                        children: [],
+                        component: loadView(route.path),
+                        hidden: false,
+                        meta: {
+                            icon: route.icon,
+                            link: "",
+                            cache: false,
+                            title: route.name
+                        },
+                        name: route.name,
+                        path: route.path,
+                        redirect: false
+                    }
+                ]
 
-      }
-      if (route.path.startsWith('http') || route.path.startsWith('/tjmchild') || route.path.includes('queryParams')) {
-        if (httpSave) {
-          // const prefix = '/tjmchild'
-          // if (route.path.startsWith(prefix)) {
-          //   info.redirect = route.path.slice(prefix.length)
-          //   info.children[0].path = route.path.slice(prefix.length)
-          // }
-          arr.push(info)
-        }
-      } else {
-        arr.push(info)
-      }
-    } else if (route.type == 1) {
-      let info = {
-        // alwaysShow: false, //菜单不支持设置
-        children: [],
-        component: loadView(route.path),
-        hidden: false,
-        meta: {
-          icon: route.icon,
-          link: '',
-          cache: false,
-          title: route.name
-        },
-        name: route.name,
-        path: route.path,
-        redirect: false
-      }
-      if (route.path.startsWith('http') || route.path.startsWith('/tjmchild') || route.path.includes('queryParams')) {  
-        if (httpSave) {
-          // const prefix = '/tjmchild'
-          // if (route.path.startsWith(prefix)) {
-          //   info.redirect = route.path.slice(prefix.length)
-          //   info.path = route.path.slice(prefix.length)
-          // }
-          arr.push(info)
+            }
+            if (route.path.startsWith("http") || route.path.startsWith("/tjmchild") || route.path.includes("queryParams")) {
+                if (httpSave) {
+                    // const prefix = "/tjmchild"
+                    // if (route.path.startsWith(prefix)) {
+                    //   info.redirect = route.path.slice(prefix.length)
+                    //   info.children[0].path = route.path.slice(prefix.length)
+                    // }
+                    arr.push(info)
+                }
+            } else {
+                arr.push(info)
+            }
+        } else if (route.type == 1) {
+            let info = {
+                // alwaysShow: false, //菜单不支持设置
+                children: [],
+                component: loadView(route.path),
+                hidden: false,
+                meta: {
+                    icon: route.icon,
+                    link: "",
+                    cache: false,
+                    title: route.name
+                },
+                name: route.name,
+                path: route.path,
+                redirect: false
+            }
+            if (route.path.startsWith("http") || route.path.startsWith("/tjmchild") || route.path.includes("queryParams")) {
+                if (httpSave) {
+                    // const prefix = "/tjmchild"
+                    // if (route.path.startsWith(prefix)) {
+                    //   info.redirect = route.path.slice(prefix.length)
+                    //   info.path = route.path.slice(prefix.length)
+                    // }
+                    arr.push(info)
+                }
+            } else {
+                arr.push(info)
+            }
         }
-      } else {
-        arr.push(info)
-      }
-    }
-  })
-  return arr
+    })
+    return arr
 
 }
 
 function loadView(view) {
-  let res
-  for (const path in modules) {
-    const dir = '/' + path.split('views/')[1].split('.vue')[0]
-    if (dir === view) {
-      return modules[path]
+    for (const path in modules) {
+        if (path.includes(view)) return modules[path]
     }
-  }
 }

+ 20 - 20
src/store/settings.js

@@ -1,27 +1,27 @@
-import { getConfig } from '@/config/config'
+import { getConfig } from "@/config/config"
 
-export const useSettingStore = defineStore('userSetting', {
+export const useSettingStore = defineStore("userSetting", {
     state: () => ({
         collapse: false,
-        layoutStyle:'vertical',
-        title: '',
-        theme:'#409EFF'
+        layoutStyle: "vertical",
+        title: "",
+        theme: "#409EFF"
     }),
-  persist: {
-    enabled: true,
-    strategies: [
-      {
-        key: 'useSetting',
-        storage: localStorage,
-      },
-    ],
-  },
-  getters: {},
-  actions: {
-    setTitle(title) {
-      this.title = title
-      document.title = getConfig('projectName') + '-' + title
+    persist: {
+        enabled: true,
+        strategies: [
+            {
+                key: "useSetting",
+                storage: localStorage,
+            },
+        ],
+    },
+    getters: {},
+    actions: {
+        setTitle(title) {
+            this.title = title
+            document.title = getConfig("projectName") + "-" + title
+        }
     }
-  }
 })
 

+ 15 - 15
src/store/tabsbar.js

@@ -1,31 +1,31 @@
-import { usePermissionStore } from '@/store/permission.js'
-import {findObjectByPath} from '@/utils/tjmTools'
-export  const useTabsBarStore = defineStore(
-    'tabsbar',
+import { usePermissionStore } from "@/store/permission.js"
+import { findObjectByPath } from "@/utils/tjmTools"
+export const useTabsBarStore = defineStore(
+    "tabsbar",
     {
         state: () => ({
             visitedViews: [],  //已经访问
             cachedViews: [],   //缓存
             // iframeViews: [],  //弹出
-            sidebarRouters:computed(() => usePermissionStore().sidebarRouters)
+            sidebarRouters: computed(() => usePermissionStore().sidebarRouters)
         }),
         actions: {
-            
-            addVisitedView(view) {      
+
+            addVisitedView(view) {
                 if (this.visitedViews.some(v => v.path === view.path)) return
                 const viewDeal = JSON.parse(JSON.stringify(view))
-                if(view.meta.micro){
+                if (view.meta.micro) {
                     if (this.visitedViews.some(v => v.path === decodeURIComponent(view.path))) return
-                    view.meta.title =  findObjectByPath(this.sidebarRouters,view.path).meta.title
-                    let depath =decodeURIComponent(view.path)
+                    view.meta.title = findObjectByPath(this.sidebarRouters, view.path).meta.title
+                    let depath = decodeURIComponent(view.path)
                     viewDeal.path = depath
                     console.log(viewDeal)
                 }
                 this.visitedViews.push(
                     Object.assign({}, viewDeal, {
-                        title:view.meta.title || '未知'
+                        title: view.meta.title || "未知"
                     })
-                )  
+                )
             },
             addCachedView(view) {
                 if (this.cachedViews.includes(view.name)) return
@@ -37,11 +37,11 @@ export  const useTabsBarStore = defineStore(
             //     if (this.iframeViews.some(v => v.path === view.path)) return
             //     this.iframeViews.push(
             //         Object.assign({}, view, {
-            //             title: view.meta.title || '未知'
+            //             title: view.meta.title || "未知"
             //         })
             //     )
             // },
-           
+
             addView(view) {
                 this.addVisitedView(view)
                 this.addCachedView(view)
@@ -162,7 +162,7 @@ export  const useTabsBarStore = defineStore(
                         //     const fi = this.iframeViews.findIndex(v => v.path === item.path)
                         //     this.iframeViews.splice(fi, 1)
                         // }
-                        
+
                         return false
                     })
                     resolve([...this.visitedViews])

+ 159 - 159
src/store/user.js

@@ -1,168 +1,168 @@
-import { getToken, setToken, removeToken, setRefreshToken, getRefreshToken, removeRefreshToken } from '@/utils/auth'
-import { login } from '@/api/login'
-import CryptoJS from 'crypto-js'
-const { VITE_BX_CLIENT_ID, VITE_EDGE_CLIENT_ID } =import.meta.env
+import { getToken, setToken, removeToken, setRefreshToken, getRefreshToken, removeRefreshToken } from "@/utils/auth"
+import { login } from "@/api/login"
+import CryptoJS from "crypto-js"
+const { VITE_BX_CLIENT_ID, VITE_EDGE_CLIENT_ID } = import.meta.env
 export const useUserStore = defineStore(
-  'user',
-  {
-    state: () => ({
-      token: getToken(),
-      refreshToken: getRefreshToken(),
-      userInfo: {},
-      menuList: [],
-      roles: [],
-      permissions: []
-    }),
-    actions: {
-      //登录
-      login(userInfo) {
-        let data = {
-          username: userInfo.username,
-          password: CryptoJS.MD5(userInfo.password).toString(),
-          grant_type: 'password',
-          scope: 'all'
-        }
-        return new Promise((resolve, reject) => {
-          login(data).then(res => {
-            if (res.error_code == '400') {
-              ElMessage({
-                message: res.error_description,
-                type: 'warning'
-              })
-              reject('err')
-            } else if (res.error_code == '204') {
-              ElMessage({
-                message: '由于您长时间未登录,请修改密码后登录!',
-                type: 'warning'
-              })
-              reject(204)
-            } else if (res.error_code == '203') {
-              ElMessage({
-                message: '由于您长时间未登录,请校验手机号!',
-                type: 'warning'
-              })
-              reject( 203)
-            } else if (res.error_code == '500') {
-              ElMessage({
-                message: res.error_description,
-                type: 'warning'
-              })
-              reject('err')
-            } else {
-              setToken(res.access_token)
-              setRefreshToken(res.refresh_token)
-              this.userInfo = res.user
-              this.token = res.access_token
-              this.refreshToken = res.refresh_token
-              this.menuList = res.menus
-              this.permissions = getButtonPermiss([], res.menus)
-              resolve()
-            }
-          }).catch(error => {
-            reject(error)
-          })
-        })
-      },
-      //tips:获取信息(不需要实现持久化 刷新浏览器 重新调用接口获取最新的信息才是正确的处理方式)
-      RefreshInfo() {
-        return new Promise((resolve, reject) => {
-          let data = {
-            refresh_token: getRefreshToken(),
-            grant_type: 'refresh_token',
-            scope: 'all'
-          }
-          login(data).then(res => {
-            setToken(res.access_token)
-            setRefreshToken(res.refresh_token)
-            this.token = res.access_token
-            this.userInfo = res.user
-            this.refreshToken = res.refresh_token
-            this.roles = res.roles
-            this.menuList = res.menus
-            this.permissions = getButtonPermiss([], res.menus)
-            resolve(res)
-          }).catch(error => {
-            reject(error)
-          })
-        })
-      },
-       //宝信登录
-       bxLogin(code){
-        console.log("传递过code",code)
-        return new Promise((resolve, reject) => { 
-          login({
-            code,
-            source: VITE_BX_CLIENT_ID,
-            grant_type: "social",
-            scope: "all",
-          }).then(res => {
-            if (res.error_code == '400') {
-              ElMessage({
-                message: res.error_description,
-                type: 'warning'
-              })
-              reject('err')
-            } else{
-              setToken(res.access_token)
-              setRefreshToken(res.refresh_token)
-              this.userInfo = res.user
-              this.token = res.access_token
-              this.refreshToken = res.refresh_token
-              this.menuList = res.menus
-              this.permissions = getButtonPermiss([], res.menus)
-              resolve()
-            }
-          })
-        })
-      },
-       //边端登录
-       edgeLogin(code){
-        return new Promise((resolve, reject) => { 
-          login({
-            code,
-            source: VITE_EDGE_CLIENT_ID,
-            grant_type: "edge",
-            scope: "all",
-          }).then(res => {     
-            setToken(res.access_token)
-            setRefreshToken(res.refresh_token)
-            this.userInfo = res.user
-            this.token = res.access_token
-            this.refreshToken = res.refresh_token
-            this.menuList = res.menus
-            this.permissions = getButtonPermiss([], res.menus)
-            resolve()
-          })
-        })
-      },
-      // 退出系统
-      logOut() {
-        return new Promise((resolve, reject) => {
-          this.token = ''
-          this.refreshToken = ''
-          this.userInfo = {}
-          this.menuList = []
-          this.roles = []
-          this.permissions = []
-          removeToken()
-          removeRefreshToken()
-          resolve()
+    "user",
+    {
+        state: () => ({
+            token: getToken(),
+            refreshToken: getRefreshToken(),
+            userInfo: {},
+            menuList: [],
+            roles: [],
+            permissions: []
+        }),
+        actions: {
+            //登录
+            login(userInfo) {
+                let data = {
+                    username: userInfo.username,
+                    password: CryptoJS.MD5(userInfo.password).toString(),
+                    grant_type: "password",
+                    scope: "all"
+                }
+                return new Promise((resolve, reject) => {
+                    login(data).then(res => {
+                        if (res.error_code == "400") {
+                            ElMessage({
+                                message: res.error_description,
+                                type: "warning"
+                            })
+                            reject("err")
+                        } else if (res.error_code == "204") {
+                            ElMessage({
+                                message: "由于您长时间未登录,请修改密码后登录!",
+                                type: "warning"
+                            })
+                            reject(204)
+                        } else if (res.error_code == "203") {
+                            ElMessage({
+                                message: "由于您长时间未登录,请校验手机号!",
+                                type: "warning"
+                            })
+                            reject(203)
+                        } else if (res.error_code == "500") {
+                            ElMessage({
+                                message: res.error_description,
+                                type: "warning"
+                            })
+                            reject("err")
+                        } else {
+                            setToken(res.access_token)
+                            setRefreshToken(res.refresh_token)
+                            this.userInfo = res.user
+                            this.token = res.access_token
+                            this.refreshToken = res.refresh_token
+                            this.menuList = res.menus
+                            this.permissions = getButtonPermiss([], res.menus)
+                            resolve()
+                        }
+                    }).catch(error => {
+                        reject(error)
+                    })
+                })
+            },
+            //tips:获取信息(不需要实现持久化 刷新浏览器 重新调用接口获取最新的信息才是正确的处理方式)
+            RefreshInfo() {
+                return new Promise((resolve, reject) => {
+                    let data = {
+                        refresh_token: getRefreshToken(),
+                        grant_type: "refresh_token",
+                        scope: "all"
+                    }
+                    login(data).then(res => {
+                        setToken(res.access_token)
+                        setRefreshToken(res.refresh_token)
+                        this.token = res.access_token
+                        this.userInfo = res.user
+                        this.refreshToken = res.refresh_token
+                        this.roles = res.roles
+                        this.menuList = res.menus
+                        this.permissions = getButtonPermiss([], res.menus)
+                        resolve(res)
+                    }).catch(error => {
+                        reject(error)
+                    })
+                })
+            },
+            //宝信登录
+            bxLogin(code) {
+                console.log("传递过code", code)
+                return new Promise((resolve, reject) => {
+                    login({
+                        code,
+                        source: VITE_BX_CLIENT_ID,
+                        grant_type: "social",
+                        scope: "all",
+                    }).then(res => {
+                        if (res.error_code == "400") {
+                            ElMessage({
+                                message: res.error_description,
+                                type: "warning"
+                            })
+                            reject("err")
+                        } else {
+                            setToken(res.access_token)
+                            setRefreshToken(res.refresh_token)
+                            this.userInfo = res.user
+                            this.token = res.access_token
+                            this.refreshToken = res.refresh_token
+                            this.menuList = res.menus
+                            this.permissions = getButtonPermiss([], res.menus)
+                            resolve()
+                        }
+                    })
+                })
+            },
+            //边端登录
+            edgeLogin(code) {
+                return new Promise((resolve, reject) => {
+                    login({
+                        code,
+                        source: VITE_EDGE_CLIENT_ID,
+                        grant_type: "edge",
+                        scope: "all",
+                    }).then(res => {
+                        setToken(res.access_token)
+                        setRefreshToken(res.refresh_token)
+                        this.userInfo = res.user
+                        this.token = res.access_token
+                        this.refreshToken = res.refresh_token
+                        this.menuList = res.menus
+                        this.permissions = getButtonPermiss([], res.menus)
+                        resolve()
+                    })
+                })
+            },
+            // 退出系统
+            logOut() {
+                return new Promise((resolve, reject) => {
+                    this.token = ""
+                    this.refreshToken = ""
+                    this.userInfo = {}
+                    this.menuList = []
+                    this.roles = []
+                    this.permissions = []
+                    removeToken()
+                    removeRefreshToken()
+                    resolve()
 
-        })
-      }
+                })
+            }
+        }
     }
-  }
 )
 
 
 function getButtonPermiss(keys, List) {
-  for (let li of List) {
-    if (li.type == 2) {
-      keys.push(li.code)
-    }
-    if (li.children && li.children.length > 0) {
-      getButtonPermiss(keys, li.children)
+    for (let li of List) {
+        if (li.type == 2) {
+            keys.push(li.code)
+        }
+        if (li.children && li.children.length > 0) {
+            getButtonPermiss(keys, li.children)
+        }
     }
-  }
-  return keys
+    return keys
 }

+ 90 - 90
src/utils/aes.js

@@ -1,118 +1,118 @@
-import AES from 'crypto-js'
+import AES from "crypto-js"
 
 //加密方法
 export function Encrypt(word) {
-  //十六位十六进制数作为密钥
-  const key = AES.enc.Utf8.parse('0123456789ASDFGH')
-//十六位十六进制数作为密钥偏移量
-  const iv = AES.enc.Utf8.parse('ASDFGH0123456789')
+    //十六位十六进制数作为密钥
+    const key = AES.enc.Utf8.parse("0123456789ASDFGH")
+    //十六位十六进制数作为密钥偏移量
+    const iv = AES.enc.Utf8.parse("ASDFGH0123456789")
 
-  const src = AES.enc.Utf8.parse(word)
-  const encrypted = AES.AES.encrypt(
-    src,
-    key,
-    {
-      iv: iv,
-      mode: AES.mode.CBC,
-      padding: AES.pad.Pkcs7
-    })
-  return encrypted.ciphertext.toString().toUpperCase()
+    const src = AES.enc.Utf8.parse(word)
+    const encrypted = AES.AES.encrypt(
+        src,
+        key,
+        {
+            iv: iv,
+            mode: AES.mode.CBC,
+            padding: AES.pad.Pkcs7
+        })
+    return encrypted.ciphertext.toString().toUpperCase()
 }
 
 //解密方法
 export function Decrypt(word) {
-  const encryptedHexStr = AES.enc.Hex.parse(word)
-  const src = AES.enc.Base64.stringify(encryptedHexStr)
-  const decrypt = AES.AES.decrypt(
-    src,
-    key,
-    {
-      iv: iv,
-      mode: AES.mode.CBC,
-      padding: AES.pad.Pkcs7
-    })
-  const decryptedStr = decrypt.toString(AES.enc.Utf8)
-  return decryptedStr.toString()
+    const encryptedHexStr = AES.enc.Hex.parse(word)
+    const src = AES.enc.Base64.stringify(encryptedHexStr)
+    const decrypt = AES.AES.decrypt(
+        src,
+        key,
+        {
+            iv: iv,
+            mode: AES.mode.CBC,
+            padding: AES.pad.Pkcs7
+        })
+    const decryptedStr = decrypt.toString(AES.enc.Utf8)
+    return decryptedStr.toString()
 
 }
 
 // 节流
 export function throttle(fn, time) {
-  let timer = null
-  time = time || 1000
-  return function(...args) {
-    if (timer) {
-      return
+    let timer = null
+    time = time || 1000
+    return function (...args) {
+        if (timer) {
+            return
+        }
+        const _this = this
+        timer = setTimeout(() => {
+            timer = null
+        }, time)
+        fn.apply(_this, args)
     }
-    const _this = this
-    timer = setTimeout(() => {
-      timer = null
-    }, time)
-    fn.apply(_this, args)
-  }
 }
 
 // 防抖
 export function debounce(fn, time) {
-  time = time || 200
-  // 定时器
-  let timer = null
-  return function(...args) {
-    var _this = this
-    if (timer) {
-      clearTimeout(timer)
+    time = time || 200
+    // 定时器
+    let timer = null
+    return function (...args) {
+        var _this = this
+        if (timer) {
+            clearTimeout(timer)
+        }
+        timer = setTimeout(function () {
+            timer = null
+            fn.apply(_this, args)
+        }, time)
     }
-    timer = setTimeout(function() {
-      timer = null
-      fn.apply(_this, args)
-    }, time)
-  }
 }
 
 export function debounceMax(func, wait, immediate = false) {
-  let timeout
-  return function() {
-    let context = this
-    let args = arguments
-    if (timeout) clearTimeout(timeout)
-    if (immediate) {
-      var callNow = !timeout
-      timeout = setTimeout(() => {
-        timeout = null
-      }, wait)
-      if (callNow) func.apply(context, args)
-    } else {
-      timeout = setTimeout(function() {
-        func.apply(context, args)
-      }, wait)
+    let timeout
+    return function () {
+        let context = this
+        let args = arguments
+        if (timeout) clearTimeout(timeout)
+        if (immediate) {
+            var callNow = !timeout
+            timeout = setTimeout(() => {
+                timeout = null
+            }, wait)
+            if (callNow) func.apply(context, args)
+        } else {
+            timeout = setTimeout(function () {
+                func.apply(context, args)
+            }, wait)
+        }
     }
-  }
 }
 
 export function getClientIP(onNewIP) {
-  let MyPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection
-  let pc = new MyPeerConnection({
-    iceServers: []
-  })
-  let noop = () => {
-  }
-  let localIPs = {}
-  let ipRegex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g
-  let iterateIP = (ip) => {
-    if (!localIPs[ip]) onNewIP(ip)
-    localIPs[ip] = true
-  }
-  pc.createDataChannel('')
-  pc.createOffer().then((sdp) => {
-    sdp.sdp.split('\n').forEach(function(line) {
-      if (line.indexOf('candidate') < 0) return
-      line.match(ipRegex).forEach(iterateIP)
+    let MyPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection
+    let pc = new MyPeerConnection({
+        iceServers: []
+    })
+    let noop = () => {
+    }
+    let localIPs = {}
+    let ipRegex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g
+    let iterateIP = (ip) => {
+        if (!localIPs[ip]) onNewIP(ip)
+        localIPs[ip] = true
+    }
+    pc.createDataChannel("")
+    pc.createOffer().then((sdp) => {
+        sdp.sdp.split("\n").forEach(function (line) {
+            if (line.indexOf("candidate") < 0) return
+            line.match(ipRegex).forEach(iterateIP)
+        })
+        pc.setLocalDescription(sdp, noop, noop)
+    }).catch((reason) => {
     })
-    pc.setLocalDescription(sdp, noop, noop)
-  }).catch((reason) => {
-  })
-  pc.onicecandidate = (ice) => {
-    if (!ice || !ice.candidate || !ice.candidate.candidate || !ice.candidate.candidate.match(ipRegex)) return
-    ice.candidate.candidate.match(ipRegex).forEach(iterateIP)
-  }
+    pc.onicecandidate = (ice) => {
+        if (!ice || !ice.candidate || !ice.candidate.candidate || !ice.candidate.candidate.match(ipRegex)) return
+        ice.candidate.candidate.match(ipRegex).forEach(iterateIP)
+    }
 }

+ 9 - 9
src/utils/auth.js

@@ -1,27 +1,27 @@
-import Cookies from 'js-cookie'
+import Cookies from "js-cookie"
 
-const TokenKey = 'Tjm-Admin-Boot-Token'
-const RefreshTokenKey = 'Tjm-Refresh-Admin-Boot-Token'
+const TokenKey = "Tjm-Admin-Boot-Token"
+const RefreshTokenKey = "Tjm-Refresh-Admin-Boot-Token"
 export function getToken() {
-  return Cookies.get(TokenKey)
+    return Cookies.get(TokenKey)
 }
 
 export function setToken(token) {
-  return Cookies.set(TokenKey, token)
+    return Cookies.set(TokenKey, token)
 }
 
 export function removeToken() {
-  return Cookies.remove(TokenKey)
+    return Cookies.remove(TokenKey)
 }
 
 export function getRefreshToken() {
-  return Cookies.get(RefreshTokenKey)
+    return Cookies.get(RefreshTokenKey)
 }
 
 export function setRefreshToken(token) {
-  return Cookies.set(RefreshTokenKey, token)
+    return Cookies.set(RefreshTokenKey, token)
 }
 
 export function removeRefreshToken() {
-  return Cookies.remove(RefreshTokenKey)
+    return Cookies.remove(RefreshTokenKey)
 }

+ 28 - 28
src/utils/color.js

@@ -1,4 +1,4 @@
-import { ElMessage } from 'element-plus'
+import { ElMessage } from "element-plus"
 
 /**
  * hex颜色转rgb颜色
@@ -6,15 +6,15 @@ import { ElMessage } from 'element-plus'
  * @returns 返回处理后的颜色值
  */
 export function hexToRgb(str) {
-  let hexs = ''
-  const reg = /^\#?[0-9A-Fa-f]{6}$/
-  if (!reg.test(str)) return ElMessage.warning('输入错误的hex')
-  str = str.replace('#', '')
+    let hexs = ""
+    const reg = /^\#?[0-9A-Fa-f]{6}$/
+    if (!reg.test(str)) return ElMessage.warning("输入错误的hex")
+    str = str.replace("#", "")
 
-  hexs = str.match(/../g)
+    hexs = str.match(/../g)
 
-  for (let i = 0; i < 3; i++) hexs[i] = parseInt(hexs[i], 16)
-  return hexs
+    for (let i = 0; i < 3; i++) hexs[i] = parseInt(hexs[i], 16)
+    return hexs
 }
 
 /**
@@ -25,14 +25,14 @@ export function hexToRgb(str) {
  * @returns 返回处理后的颜色值
  */
 export function rgbToHex(r, g, b) {
-  const reg = /^\d{1,3}$/
-  if (!reg.test(r) || !reg.test(g) || !reg.test(b))
-    return ElMessage.warning('输入错误的rgb颜色值')
-  const hexs = [r.toString(16), g.toString(16), b.toString(16)]
+    const reg = /^\d{1,3}$/
+    if (!reg.test(r) || !reg.test(g) || !reg.test(b))
+        return ElMessage.warning("输入错误的rgb颜色值")
+    const hexs = [r.toString(16), g.toString(16), b.toString(16)]
 
-  for (let i = 0; i < 3; i++) if (hexs[i].length == 1) hexs[i] = `0${hexs[i]}`
+    for (let i = 0; i < 3; i++) if (hexs[i].length == 1) hexs[i] = `0${hexs[i]}`
 
-  return `#${hexs.join('')}`
+    return `#${hexs.join("")}`
 }
 
 /**
@@ -42,12 +42,12 @@ export function rgbToHex(r, g, b) {
  * @returns 返回处理后的颜色值
  */
 export function getDarkColor(color, level) {
-  const reg = /^\#?[0-9A-Fa-f]{6}$/
-  if (!reg.test(color)) return ElMessage.warning('输入错误的hex颜色值')
-  const rgb = hexToRgb(color)
-  for (let i = 0; i < 3; i++)
-    rgb[i] = Math.round(20.5 * level + rgb[i] * (1 - level))
-  return rgbToHex(rgb[0], rgb[1], rgb[2])
+    const reg = /^\#?[0-9A-Fa-f]{6}$/
+    if (!reg.test(color)) return ElMessage.warning("输入错误的hex颜色值")
+    const rgb = hexToRgb(color)
+    for (let i = 0; i < 3; i++)
+        rgb[i] = Math.round(20.5 * level + rgb[i] * (1 - level))
+    return rgbToHex(rgb[0], rgb[1], rgb[2])
 }
 
 /**
@@ -57,15 +57,15 @@ export function getDarkColor(color, level) {
  * @returns 返回处理后的颜色值
  */
 export function getLightColor(color, level) {
-  const reg = /^\#?[0-9A-Fa-f]{6}$/
-  if (!reg.test(color)) return ElMessage.warning('输入错误的hex颜色值')
-  const rgb = hexToRgb(color)
+    const reg = /^\#?[0-9A-Fa-f]{6}$/
+    if (!reg.test(color)) return ElMessage.warning("输入错误的hex颜色值")
+    const rgb = hexToRgb(color)
 
-  for (let i = 0; i < 3; i++) {
-    rgb[i] = Math.round(255 * level + rgb[i] * (1 - level))
-  }
+    for (let i = 0; i < 3; i++) {
+        rgb[i] = Math.round(255 * level + rgb[i] * (1 - level))
+    }
 
-  console.log(rgb)
+    console.log(rgb)
 
-  return rgbToHex(rgb[0], rgb[1], rgb[2])
+    return rgbToHex(rgb[0], rgb[1], rgb[2])
 }

+ 2 - 2
src/utils/mittBus.js

@@ -1,5 +1,5 @@
-import mitt from 'mitt'
+import mitt from "mitt"
 
 const mittBus = mitt()
 
-export default mittBus
+export default mittBus

+ 45 - 45
src/utils/request.js

@@ -1,60 +1,60 @@
-import axios from 'axios'
-import { getConfig } from '@/config/config'
-import { getToken } from '@/utils/auth'
+import axios from "axios"
+import { getConfig } from "@/config/config"
+import { getToken } from "@/utils/auth"
 import CryptoJS from "crypto-js"
-import { useUserStore } from '@/store/user.js'
+import { useUserStore } from "@/store/user.js"
 // 创建axios实例
 const request = axios.create({
-  baseURL: getConfig('baseUrl'),
-  timeout: 60000
+    baseURL: getConfig("baseUrl"),
+    timeout: 60000
 })
 
 request.interceptors.request.use(
-  config => {
-    if (getToken()) {
-      config.headers['qdport-Auth'] = 'bearer ' + getToken()
+    config => {
+        if (getToken()) {
+            config.headers["qdport-Auth"] = "bearer " + getToken()
+        }
+        config.headers["Authorization"] = `Basic ${CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(`${getConfig("clientId")}:${getConfig("clientSecret")}`))}`
+        return config
+    }, error => {
+        console.log(error)
+        return Promise.reject(error)
     }
-    config.headers['Authorization'] = `Basic ${CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(`${getConfig('clientId')}:${getConfig('clientSecret')}`))}`
-    return config
-  }, error => {
-    console.log(error)
-    return Promise.reject(error)
-  }
 )
 // 响应拦截器
 request.interceptors.response.use(
-  response => {
-    const code = response.data.code || 200
-    if (code == 200) {
-      return response.data
-    } else {
-      ElMessage({ message: response.data.msg || response.data.error_description || "异常,请联系管理员", type: 'error', duration: 5 * 1000 })
-      return Promise.reject('error')
-    }
+    response => {
+        const code = response.data.code || 200
+        if (code == 200) {
+            return response.data
+        } else {
+            ElMessage({ message: response.data.msg || response.data.error_description || "异常,请联系管理员", type: "error", duration: 5 * 1000 })
+            return Promise.reject("error")
+        }
 
-  }, error => {
-    let { message, response } = error
+    }, error => {
+        let { message, response } = error
 
-    if (error.response.data.code == 401|| error.response.status==401) {
-      ElMessageBox.confirm('登录状态已过期,请重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => {
-        useUserStore().logOut().then(() => {
-          location.href = '/index'
-        })
-      })
-    } else {
-      if (message == "Network Error") {
-        message = "后端接口连接异常"
-      } else if (message.includes("timeout")) {
-        message = "系统接口请求超时"
-      } else if (message.includes("Request failed with status code")) {
-        message = "系统接口" + message.substr(message.length - 3) + "异常" + response.data.msg
-      }
-      if (process.env.NODE_ENV != 'production') {
-        message = message + "==>" + response.config.url
-      }
-      ElMessage({ message: message || "异常,请联系管理员", type: 'error', duration: 5 * 1000 })
+        if (error.response.data.code == 401 || error.response.status == 401) {
+            ElMessageBox.confirm("登录状态已过期,请重新登录", "系统提示", { confirmButtonText: "重新登录", cancelButtonText: "取消", type: "warning" }).then(() => {
+                useUserStore().logOut().then(() => {
+                    location.href = "/index"
+                })
+            })
+        } else {
+            if (message == "Network Error") {
+                message = "后端接口连接异常"
+            } else if (message.includes("timeout")) {
+                message = "系统接口请求超时"
+            } else if (message.includes("Request failed with status code")) {
+                message = "系统接口" + message.substr(message.length - 3) + "异常" + response.data.msg
+            }
+            if (process.env.NODE_ENV != "production") {
+                message = message + "==>" + response.config.url
+            }
+            ElMessage({ message: message || "异常,请联系管理员", type: "error", duration: 5 * 1000 })
+        }
+        return Promise.reject(error)
     }
-    return Promise.reject(error)
-  }
 )
 export default request

+ 14 - 14
src/utils/tjmTools.js

@@ -1,16 +1,16 @@
-export  function findObjectByPath(arr, targetPath) {
-  targetPath = decodeURIComponent(targetPath)
-  for (let i = 0; i < arr.length; i++) {
-    const obj = arr[i];
-    if (obj.path.startsWith('/tjmchild'+targetPath)) {
-      return obj;
+export function findObjectByPath(arr, targetPath) {
+    targetPath = decodeURIComponent(targetPath)
+    for (let i = 0; i < arr.length; i++) {
+        const obj = arr[i];
+        if (obj.path.startsWith("/tjmchild" + targetPath)) {
+            return obj;
+        }
+        if (obj.children && obj.children.length > 0) {
+            const result = findObjectByPath(obj.children, targetPath);
+            if (result) {
+                return result;
+            }
+        }
     }
-    if (obj.children && obj.children.length > 0) {
-      const result = findObjectByPath(obj.children, targetPath);
-      if (result) {
-        return result;
-      }
-    }
-  }
-  return null;
+    return null;
 }

+ 0 - 1
src/views/404.vue

@@ -9,5 +9,4 @@
 </template>
 
 <style lang='scss' scoped>
-
 </style>

+ 235 - 241
src/views/error/noPermission.vue

@@ -1,254 +1,248 @@
 <template>
-  <div class="wscn-http404-container">
-    <div class="wscn-http404">
-      <!-- <div class="pic-404">
-          <img src="./midheaderlogo.png" alt="" />
-        </div> -->
-      <div class="bullshit">
-        <div class="bullshit__oops">该账户无权登录!</div>
-        <!-- <div class="bullshit__headline">
-           该账户无权登录!
+    <div class="wscn-http404-container">
+        <div class="wscn-http404">
+            <!-- <div class="pic-404">
+                <img src="./midheaderlogo.png" alt="" />
             </div> -->
-        <div class="bullshit__info">
-          对不起,您的账号无权登录系统。请联系系统管理员进行授权。
+            <div class="bullshit">
+                <div class="bullshit__oops">该账户无权登录!</div>
+                <!-- <div class="bullshit__headline">该账户无权登录!</div> -->
+                <div class="bullshit__info">对不起,您的账号无权登录系统。请联系系统管理员进行授权。</div>
+                <div class="bullshit__btn">
+                    <div class="bullshit__btn-return-home" id="returnHomeBtn" @click="go">返回重新登陆</div>
+                </div>
+            </div>
         </div>
-        <div class="bullshit__btn">
-          <div class="bullshit__btn-return-home" id="returnHomeBtn" @click="go">
-            返回重新登陆
-          </div>
-        </div>
-      </div>
     </div>
-  </div>
 </template>
 
 <script setup>
 function go() {
-  window.location.href = 'https://cloud.qdpi.net.cn'; 
+     window.location.href = "https://cloud.qdpi.net.cn"; 
 }
 </script>
 
-<style lang='scss' scoped>
+<style lang="scss" scoped>
 .wscn-http404-container {
-        transform: translate(-50%, -50%);
-        position: absolute;
-        top: 40%;
-        left: 50%;
-      }
-
-      .wscn-http404 {
-        position: relative;
-        width: 1200px;
-        padding: 0 50px;
-        overflow: hidden;
-        display: flex;
-        flex-direction: column;
-        align-items: center;
-      }
-
-      .wscn-http404 .pic-404 {
-        position: relative;
-        float: left;
-        width: 600px;
-        overflow: hidden;
-        display: flex;
-        justify-content: center;
-      }
-
-      .wscn-http404 .pic-404 img {
-        width: 120px;
-        height: 120px;
-      }
-
-      .wscn-http404 .pic-404__parent {
-        width: 100%;
-      }
-
-      .wscn-http404 .pic-404__child {
-        position: absolute;
-      }
-
-      .wscn-http404 .pic-404__child.left {
-        width: 80px;
-        top: 17px;
-        left: 220px;
-        opacity: 0;
-        animation-name: cloudLeft;
-        animation-duration: 2s;
-        animation-timing-function: linear;
-        animation-fill-mode: forwards;
-        animation-delay: 1s;
-      }
-
-      .wscn-http404 .pic-404__child.mid {
-        width: 46px;
-        top: 10px;
-        left: 420px;
-        opacity: 0;
-        animation-name: cloudMid;
-        animation-duration: 2s;
-        animation-timing-function: linear;
-        animation-fill-mode: forwards;
-        animation-delay: 1.2s;
-      }
-
-      .wscn-http404 .pic-404__child.right {
-        width: 62px;
-        top: 100px;
-        left: 500px;
-        opacity: 0;
-        animation-name: cloudRight;
-        animation-duration: 2s;
-        animation-timing-function: linear;
-        animation-fill-mode: forwards;
-        animation-delay: 1s;
-      }
-
-      @keyframes cloudLeft {
-        0% {
-          top: 17px;
-          left: 220px;
-          opacity: 0;
-        }
-        20% {
-          top: 33px;
-          left: 188px;
-          opacity: 1;
-        }
-        80% {
-          top: 81px;
-          left: 92px;
-          opacity: 1;
-        }
-        100% {
-          top: 97px;
-          left: 60px;
-          opacity: 0;
-        }
-      }
-
-      @keyframes cloudMid {
-        0% {
-          top: 10px;
-          left: 420px;
-          opacity: 0;
-        }
-        20% {
-          top: 40px;
-          left: 360px;
-          opacity: 1;
-        }
-        70% {
-          top: 130px;
-          left: 180px;
-          opacity: 1;
-        }
-        100% {
-          top: 160px;
-          left: 120px;
-          opacity: 0;
-        }
-      }
-
-      @keyframes cloudRight {
-        0% {
-          top: 100px;
-          left: 500px;
-          opacity: 0;
-        }
-        20% {
-          top: 120px;
-          left: 460px;
-          opacity: 1;
-        }
-        80% {
-          top: 180px;
-          left: 340px;
-          opacity: 1;
-        }
-        100% {
-          top: 200px;
-          left: 300px;
-          opacity: 0;
-        }
-      }
-
-      .wscn-http404 .bullshit {
-        position: relative;
-        float: left;
-        padding: 30px 0;
-        overflow: hidden;
-        text-align: center;
-      }
-
-      .wscn-http404 .bullshit__oops {
-        font-size: 32px;
-        font-weight: bold;
-        line-height: 40px;
-        color: #1482f0;
-        opacity: 0;
-        margin-bottom: 20px;
-        animation-name: slideUp;
-        animation-duration: 0.5s;
-        animation-fill-mode: forwards;
-      }
-
-      .wscn-http404 .bullshit__headline {
-        font-size: 20px;
-        line-height: 24px;
-        color: #222;
-        font-weight: bold;
-        opacity: 0;
-        margin-bottom: 10px;
-        animation-name: slideUp;
-        animation-duration: 0.5s;
-        animation-delay: 0.1s;
-        animation-fill-mode: forwards;
-      }
-
-      .wscn-http404 .bullshit__info {
-        font-size: 13px;
-        line-height: 21px;
-        color: grey;
-        opacity: 0;
-        margin-bottom: 30px;
-        animation-name: slideUp;
-        animation-duration: 0.5s;
-        animation-delay: 0.2s;
-        animation-fill-mode: forwards;
-      }
-
-      .wscn-http404 .bullshit__btn {
-        display: flex;
-        justify-content: center;
-      }
-
-      .wscn-http404 .bullshit__btn-return-home {
-        display: block;
-        width: 110px;
-        height: 36px;
-        background: #1482f0;
-        border-radius: 100px;
-        text-align: center;
-        color: #ffffff;
-        opacity: 0;
-        font-size: 14px;
-        line-height: 36px;
-        cursor: pointer;
-        animation-name: slideUp;
-        animation-duration: 0.5s;
-        animation-delay: 0.3s;
-        animation-fill-mode: forwards;
-      }
-
-      @keyframes slideUp {
-        0% {
-          transform: translateY(60px);
-          opacity: 0;
-        }
-        100% {
-          transform: translateY(0);
-          opacity: 1;
-        }
-      }
+  transform: translate(-50%, -50%);
+  position: absolute;
+  top: 40%;
+  left: 50%;
+}
+
+.wscn-http404 {
+  position: relative;
+  width: 1200px;
+  padding: 0 50px;
+  overflow: hidden;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+}
+
+.wscn-http404 .pic-404 {
+  position: relative;
+  float: left;
+  width: 600px;
+  overflow: hidden;
+  display: flex;
+  justify-content: center;
+}
+
+.wscn-http404 .pic-404 img {
+  width: 120px;
+  height: 120px;
+}
+
+.wscn-http404 .pic-404__parent {
+  width: 100%;
+}
+
+.wscn-http404 .pic-404__child {
+  position: absolute;
+}
+
+.wscn-http404 .pic-404__child.left {
+  width: 80px;
+  top: 17px;
+  left: 220px;
+  opacity: 0;
+  animation-name: cloudLeft;
+  animation-duration: 2s;
+  animation-timing-function: linear;
+  animation-fill-mode: forwards;
+  animation-delay: 1s;
+}
+
+.wscn-http404 .pic-404__child.mid {
+  width: 46px;
+  top: 10px;
+  left: 420px;
+  opacity: 0;
+  animation-name: cloudMid;
+  animation-duration: 2s;
+  animation-timing-function: linear;
+  animation-fill-mode: forwards;
+  animation-delay: 1.2s;
+}
+
+.wscn-http404 .pic-404__child.right {
+  width: 62px;
+  top: 100px;
+  left: 500px;
+  opacity: 0;
+  animation-name: cloudRight;
+  animation-duration: 2s;
+  animation-timing-function: linear;
+  animation-fill-mode: forwards;
+  animation-delay: 1s;
+}
+
+@keyframes cloudLeft {
+  0% {
+    top: 17px;
+    left: 220px;
+    opacity: 0;
+  }
+  20% {
+    top: 33px;
+    left: 188px;
+    opacity: 1;
+  }
+  80% {
+    top: 81px;
+    left: 92px;
+    opacity: 1;
+  }
+  100% {
+    top: 97px;
+    left: 60px;
+    opacity: 0;
+  }
+}
+
+@keyframes cloudMid {
+  0% {
+    top: 10px;
+    left: 420px;
+    opacity: 0;
+  }
+  20% {
+    top: 40px;
+    left: 360px;
+    opacity: 1;
+  }
+  70% {
+    top: 130px;
+    left: 180px;
+    opacity: 1;
+  }
+  100% {
+    top: 160px;
+    left: 120px;
+    opacity: 0;
+  }
+}
+
+@keyframes cloudRight {
+  0% {
+    top: 100px;
+    left: 500px;
+    opacity: 0;
+  }
+  20% {
+    top: 120px;
+    left: 460px;
+    opacity: 1;
+  }
+  80% {
+    top: 180px;
+    left: 340px;
+    opacity: 1;
+  }
+  100% {
+    top: 200px;
+    left: 300px;
+    opacity: 0;
+  }
+}
+
+.wscn-http404 .bullshit {
+  position: relative;
+  float: left;
+  padding: 30px 0;
+  overflow: hidden;
+  text-align: center;
+}
+
+.wscn-http404 .bullshit__oops {
+  font-size: 32px;
+  font-weight: bold;
+  line-height: 40px;
+  color: #1482f0;
+  opacity: 0;
+  margin-bottom: 20px;
+  animation-name: slideUp;
+  animation-duration: 0.5s;
+  animation-fill-mode: forwards;
+}
+
+.wscn-http404 .bullshit__headline {
+  font-size: 20px;
+  line-height: 24px;
+  color: #222;
+  font-weight: bold;
+  opacity: 0;
+  margin-bottom: 10px;
+  animation-name: slideUp;
+  animation-duration: 0.5s;
+  animation-delay: 0.1s;
+  animation-fill-mode: forwards;
+}
+
+.wscn-http404 .bullshit__info {
+  font-size: 13px;
+  line-height: 21px;
+  color: grey;
+  opacity: 0;
+  margin-bottom: 30px;
+  animation-name: slideUp;
+  animation-duration: 0.5s;
+  animation-delay: 0.2s;
+  animation-fill-mode: forwards;
+}
+
+.wscn-http404 .bullshit__btn {
+  display: flex;
+  justify-content: center;
+}
+
+.wscn-http404 .bullshit__btn-return-home {
+  display: block;
+  width: 110px;
+  height: 36px;
+  background: #1482f0;
+  border-radius: 100px;
+  text-align: center;
+  color: #ffffff;
+  opacity: 0;
+  font-size: 14px;
+  line-height: 36px;
+  cursor: pointer;
+  animation-name: slideUp;
+  animation-duration: 0.5s;
+  animation-delay: 0.3s;
+  animation-fill-mode: forwards;
+}
+
+@keyframes slideUp {
+  0% {
+    transform: translateY(60px);
+    opacity: 0;
+  }
+  100% {
+    transform: translateY(0);
+    opacity: 1;
+  }
+}
 </style>

+ 266 - 267
src/views/login/index.vue

@@ -1,159 +1,159 @@
 <template>
-  <div class="tjm_login">
-    <video id="bgvid" muted autoplay loop>
-      <source src="@/assets/video/loginBackground.mp4" type="video/mp4" />
-    </video>
-    <div class="left">
-      <div class="logo">
-        <img src="@/assets/images/welcomelogo.png" alt="" />
-      </div>
-    </div>
-    <div class="right">
-      <div class="title">欢迎登录</div>
-      <div class="select_login_type">
-        <div class="type_item type_item_active">
-          <span>密码登录</span>
-          <div class="select"></div>
+    <div class="tjm_login">
+        <video id="bgvid" muted autoplay loop>
+        <source src="@/assets/video/loginBackground.mp4" type="video/mp4" />
+        </video>
+        <div class="left">
+        <div class="logo">
+            <img src="@/assets/images/welcomelogo.png" alt="" />
         </div>
-        <div class="type_item">
-          <span>短信登录</span>
-          <div class="select"></div>
         </div>
-        <div class="type_item">
-          <span>扫码登录</span>
-          <div class="select"></div>
+        <div class="right">
+        <div class="title">欢迎登录</div>
+        <div class="select_login_type">
+            <div class="type_item type_item_active">
+            <span>密码登录</span>
+            <div class="select"></div>
+            </div>
+            <div class="type_item">
+            <span>短信登录</span>
+            <div class="select"></div>
+            </div>
+            <div class="type_item">
+            <span>扫码登录</span>
+            <div class="select"></div>
+            </div>
         </div>
-      </div>
-      <div class="input_tjm account_ctx">
-        <div>
-          <input v-model="username" placeholder="请输入用户名" />
+        <div class="input_tjm account_ctx">
+            <div>
+            <input v-model="username" placeholder="请输入用户名" />
+            </div>
+            <div class="tjm_input_icon">
+            <img src="@/assets/images/user.png" alt="" />
+            </div>
         </div>
-        <div class="tjm_input_icon">
-          <img src="@/assets/images/user.png" alt="" />
+        <div class="input_tjm pwd_ctx">
+            <div>
+            <input v-model="password" type="password" placeholder="请输入密码" />
+            </div>
+            <div class="tjm_input_icon">
+            <img src="@/assets/images/pwd.png" alt="" />
+            </div>
         </div>
-      </div>
-      <div class="input_tjm pwd_ctx">
-        <div>
-          <input v-model="password" type="password" placeholder="请输入密码" />
+        <div class="tjm_login_btn" @click="login">登录</div>
+        <div class="tjm_other_opea">
+            <span>操作手册</span><span>玉衡移动</span><span>忘记密码</span>
         </div>
-        <div class="tjm_input_icon">
-          <img src="@/assets/images/pwd.png" alt="" />
         </div>
-      </div>
-      <div class="tjm_login_btn" @click="login">登录</div>
-      <div class="tjm_other_opea">
-        <span>操作手册</span><span>玉衡移动</span><span>忘记密码</span>
-      </div>
     </div>
-  </div>
-  <!-- 强制修改密码 -->
-  <el-dialog
-    title="修改密码"
-    v-model="passwordOpen"
-    width="680px"
-    append-to-body
-  >
-    <el-form ref="userRef" :model="form" :rules="rules" label-width="100px">
-      <el-row>
-        <el-col :span="24">
-          <el-form-item label="用户名" prop="username">
-            <el-input
-              v-model="form.username"
-              placeholder="请输入用户名"
-              clearable
-            />
-          </el-form-item>
-        </el-col>
-        <el-col :span="24">
-          <el-form-item label="原密码" prop="oldPassword">
-            <el-input
-              v-model="form.oldPassword"
-              type="password"
-              placeholder="请输入原密码"
-              clearable
-            />
-          </el-form-item>
-        </el-col>
-        <el-col :span="24">
-          <el-form-item label="新密码" prop="newPassword">
-            <el-input
-              v-model="form.newPassword"
-              type="password"
-              placeholder="请输入新密码"
-              clearable
-            />
-          </el-form-item>
-        </el-col>
-        <el-col :span="24">
-          <el-form-item label="确认密码" prop="confirmPassword">
-            <el-input
-              v-model="form.confirmPassword"
-              placeholder="请再次确认密码"
-              clearable
-            />
-          </el-form-item>
-        </el-col>
-      </el-row>
-    </el-form>
-    <template #footer>
-      <div class="dialog-footer">
-        <el-button type="primary" @click="submitForm">确 定</el-button>
-        <el-button @click="cancel">取 消</el-button>
-      </div>
-    </template>
-  </el-dialog>
-  <!-- 强制验证手机号 -->
-  <el-dialog
-    title="手机号验证"
-    v-model="phoneOpen"
-    width="680px"
-    append-to-body
-  >
-    <el-form
-      ref="phoneRef"
-      :model="mobileForm"
-      :rules="mobileRules"
-      label-width="100px"
+    <!-- 强制修改密码 -->
+    <el-dialog
+        title="修改密码"
+        v-model="passwordOpen"
+        width="680px"
+        append-to-body
+    >
+        <el-form ref="userRef" :model="form" :rules="rules" label-width="100px">
+        <el-row>
+            <el-col :span="24">
+            <el-form-item label="用户名" prop="username">
+                <el-input
+                v-model="form.username"
+                placeholder="请输入用户名"
+                clearable
+                />
+            </el-form-item>
+            </el-col>
+            <el-col :span="24">
+            <el-form-item label="原密码" prop="oldPassword">
+                <el-input
+                v-model="form.oldPassword"
+                type="password"
+                placeholder="请输入原密码"
+                clearable
+                />
+            </el-form-item>
+            </el-col>
+            <el-col :span="24">
+            <el-form-item label="新密码" prop="newPassword">
+                <el-input
+                v-model="form.newPassword"
+                type="password"
+                placeholder="请输入新密码"
+                clearable
+                />
+            </el-form-item>
+            </el-col>
+            <el-col :span="24">
+            <el-form-item label="确认密码" prop="confirmPassword">
+                <el-input
+                v-model="form.confirmPassword"
+                placeholder="请再次确认密码"
+                clearable
+                />
+            </el-form-item>
+            </el-col>
+        </el-row>
+        </el-form>
+        <template #footer>
+        <div class="dialog-footer">
+            <el-button type="primary" @click="submitForm">确 定</el-button>
+            <el-button @click="cancel">取 消</el-button>
+        </div>
+        </template>
+    </el-dialog>
+    <!-- 强制验证手机号 -->
+    <el-dialog
+        title="手机号验证"
+        v-model="phoneOpen"
+        width="680px"
+        append-to-body
     >
-      <el-row>
-        <el-col :span="24">
-          <el-form-item label="手机号" prop="mobileNumber">
-            <el-input
-              v-model="mobileForm.mobileNumber"
-              placeholder="请输入手机号"
-              clearable
-            />
-          </el-form-item>
-        </el-col>
-        <el-col :span="24">
-          <el-form-item label="验证码" prop="verificationCode">
-            <el-input
-              v-model="mobileForm.verificationCode"
-              placeholder="请输入验证码"
-              class="input-with-select"
-            >
-              <template #append>
-                <el-button
-                  :disabled="countdown > 0"
-                  @click="sendVerificationCode"
+        <el-form
+        ref="phoneRef"
+        :model="mobileForm"
+        :rules="mobileRules"
+        label-width="100px"
+        >
+        <el-row>
+            <el-col :span="24">
+            <el-form-item label="手机号" prop="mobileNumber">
+                <el-input
+                v-model="mobileForm.mobileNumber"
+                placeholder="请输入手机号"
+                clearable
+                />
+            </el-form-item>
+            </el-col>
+            <el-col :span="24">
+            <el-form-item label="验证码" prop="verificationCode">
+                <el-input
+                v-model="mobileForm.verificationCode"
+                placeholder="请输入验证码"
+                class="input-with-select"
                 >
-                  {{
-                    countdown > 0 ? countdown + '秒后重新获取' : '获取验证码'
-                  }}
-                </el-button>
-              </template>
-            </el-input>
-          </el-form-item>
-        </el-col>
-      </el-row>
-    </el-form>
-    <template #footer>
-      <div class="dialog-footer">
-        <el-button type="primary" @click="submitPhoneForm">确 定</el-button>
-        <el-button @click="phoneCancel">取 消</el-button>
-      </div>
-    </template>
-  </el-dialog>
+                <template #append>
+                    <el-button
+                    :disabled="countdown > 0"
+                    @click="sendVerificationCode"
+                    >
+                    {{
+                        countdown > 0 ? countdown + '秒后重新获取' : '获取验证码'
+                    }}
+                    </el-button>
+                </template>
+                </el-input>
+            </el-form-item>
+            </el-col>
+        </el-row>
+        </el-form>
+        <template #footer>
+        <div class="dialog-footer">
+            <el-button type="primary" @click="submitPhoneForm">确 定</el-button>
+            <el-button @click="phoneCancel">取 消</el-button>
+        </div>
+        </template>
+    </el-dialog>
 </template>
 
 <script setup>
@@ -170,158 +170,157 @@ const { proxy } = getCurrentInstance()
 const countdown = ref(0) // 倒计时秒数
 
 const form = ref({
-  username: null,
-  oldPassword: null,
-  newPassword: null,
-  confirmPassword: null
+    username: null,
+    oldPassword: null,
+    newPassword: null,
+    confirmPassword: null
 })
 const mobileForm = ref({
-  mobileNumber: null,
-  verificationCode: null
+    mobileNumber: null,
+    verificationCode: null
 })
 const mobileRules = ref({
-  mobileNumber: [
-    { required: true, message: '手机号不能为空', trigger: 'blur' }
-  ],
-  verificationCode: [
-    { required: true, message: '验证码不能为空', trigger: 'blur' }
-  ]
+    mobileNumber: [
+        { required: true, message: '手机号不能为空', trigger: 'blur' }
+    ],
+    verificationCode: [
+        { required: true, message: '验证码不能为空', trigger: 'blur' }
+    ]
 })
 const rules = ref({
-  username: [{ required: true, message: '用户名不能为空', trigger: 'blur' }],
-  oldPassword: [{ required: true, message: '旧密码不能为空', trigger: 'blur' }],
-  newPassword: [
-    { required: true, message: '新密码不能为空', trigger: 'blur' },
-    {
-      pattern:
-        /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/,
-      message: '新密码必须至少8位,且必须包含大小写字母、数字和特殊符号',
-      trigger: 'blur'
-    }
-  ],
-  confirmPassword: [
-    { required: true, message: '请在此输入新密码', trigger: 'blur' },
-    {
-      validator: (rule, value, callback) => {
-        if (value !== form.value.newPassword) {
-          console.log(value, form.value.newPassword, 'Lingci')
-          callback(new Error('两次输入的密码不一致'))
-        } else {
-          callback()
+    username: [{ required: true, message: '用户名不能为空', trigger: 'blur' }],
+    oldPassword: [{ required: true, message: '旧密码不能为空', trigger: 'blur' }],
+    newPassword: [
+        { required: true, message: '新密码不能为空', trigger: 'blur' },
+        {
+            pattern:
+                /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/,
+            message: '新密码必须至少8位,且必须包含大小写字母、数字和特殊符号',
+            trigger: 'blur'
         }
-      },
-      trigger: 'blur'
-    }
-  ]
+    ],
+    confirmPassword: [
+        { required: true, message: '请在此输入新密码', trigger: 'blur' },
+        {
+            validator: (rule, value, callback) => {
+                if (value !== form.value.newPassword) {
+                    console.log(value, form.value.newPassword, 'Lingci')
+                    callback(new Error('两次输入的密码不一致'))
+                } else {
+                    callback()
+                }
+            },
+            trigger: 'blur'
+        }
+    ]
 })
 
 const login = () => {
-  useUserStore()
-    .login({
-      username: username.value,
-      password: password.value
-    })
-    .then(() => {
-      router.push('/')
-    })
-    .catch(code => {
-      console.log('错误进来了', code)
-      if (code === 204) {
-        console.log('强制修改密码')
-        password.value = ''
-        passwordOpen.value = true
-      } else if (code === 203) {
-        password.value = ''
-        phoneOpen.value = true
-      }
-    })
+    useUserStore()
+        .login({
+            username: username.value,
+            password: password.value
+        })
+        .then(() => {
+            router.push('/')
+        })
+        .catch(code => {
+            console.log('错误进来了', code)
+            if (code === 204) {
+                console.log('强制修改密码')
+                password.value = ''
+                passwordOpen.value = true
+            } else if (code === 203) {
+                password.value = ''
+                phoneOpen.value = true
+            }
+        })
 }
 
 function submitForm() {
-  proxy.$refs['userRef'].validate(valid => {
-    if (valid) {
-      passwordChange({
-        userName: form.value.username,
-        oldPassword: CryptoJS.MD5(form.value.oldPassword).toString(),
-        newPassword: CryptoJS.MD5(form.value.newPassword).toString(),
-        enterPassword: CryptoJS.MD5(form.value.confirmPassword).toString()
-      }).then(res => {
-        if (res.success) {
-          ElMessage({
-            message: '修改成功,请重新登录!',
-            type: 'success'
-          })
-          passwordOpen.value = false
+    proxy.$refs['userRef'].validate(valid => {
+        if (valid) {
+            passwordChange({
+                userName: form.value.username,
+                oldPassword: CryptoJS.MD5(form.value.oldPassword).toString(),
+                newPassword: CryptoJS.MD5(form.value.newPassword).toString(),
+                enterPassword: CryptoJS.MD5(form.value.confirmPassword).toString()
+            }).then(res => {
+                if (res.success) {
+                    ElMessage({
+                        message: '修改成功,请重新登录!',
+                        type: 'success'
+                    })
+                    passwordOpen.value = false
+                }
+            })
+        } else {
+            console.log('检验不通过')
         }
-      })
-    } else {
-      console.log('检验不通过')
-    }
-  })
+    })
 }
 
 function cancel() {
-  passwordOpen.value = false
-  form.value = {
-    username: null,
-    oldPassword: null,
-    newPassword: null,
-    confirmPassword: null
-  }
+    passwordOpen.value = false
+    form.value = {
+        username: null,
+        oldPassword: null,
+        newPassword: null,
+        confirmPassword: null
+    }
 }
 
 function sendVerificationCode() {
-  // 这里实现发送验证码的逻辑
-  if (!mobileForm.value.mobileNumber) return
-  sendSmsCode({ mobile: mobileForm.value.mobileNumber }).then(res => {
-    if (res.success) {
-      ElMessage({
-        message: '验证码发生成功!',
-        type: 'success'
-      })
-      // 发送成功后开始倒计时
-      countdown.value = 60
-      let interval = setInterval(() => {
-        countdown.value--
-        if (countdown.value <= 0) {
-          clearInterval(interval)
+    // 这里实现发送验证码的逻辑
+    if (!mobileForm.value.mobileNumber) return
+    sendSmsCode({ mobile: mobileForm.value.mobileNumber }).then(res => {
+        if (res.success) {
+            ElMessage({
+                message: '验证码发生成功!',
+                type: 'success'
+            })
+            // 发送成功后开始倒计时
+            countdown.value = 60
+            let interval = setInterval(() => {
+                countdown.value--
+                if (countdown.value <= 0) {
+                    clearInterval(interval)
+                }
+            }, 1000)
         }
-      }, 1000)
-    }
-  })
+    })
 }
 
 function submitPhoneForm() {
-  proxy.$refs['phoneRef'].validate(valid => {
-    if (valid) {
-      userUnlock({
-        mobile: mobileForm.value.mobileNumber,
-        code: mobileForm.value.verificationCode
-      }).then(res => {
-        if (res.success) {
-          ElMessage({
-            message: '校验成功,请重新登录',
-            type: 'success'
-          })
-          phoneOpen.value = false
+    proxy.$refs['phoneRef'].validate(valid => {
+        if (valid) {
+            userUnlock({
+                mobile: mobileForm.value.mobileNumber,
+                code: mobileForm.value.verificationCode
+            }).then(res => {
+                if (res.success) {
+                    ElMessage({
+                        message: '校验成功,请重新登录',
+                        type: 'success'
+                    })
+                    phoneOpen.value = false
+                }
+            })
+        } else {
+            console.log('校验不通过')
         }
-      })
-    } else {
-      console.log('校验不通过')
-    }
-  })
+    })
 }
 
 function phoneCancel() {
-  phoneOpen.value = false
-  mobileForm.value = {
-    mobileNumber: null,
-    verificationCode: null
-  }
+    phoneOpen.value = false
+    mobileForm.value = {
+        mobileNumber: null,
+        verificationCode: null
+    }
 }
 </script>
 
-
 <style lang='scss' scoped>
 .tjm_login {
   margin: 0;
@@ -341,7 +340,7 @@ function phoneCancel() {
     height: auto; //尺寸保持原视频大小
     z-index: -100; //z轴定位,小于0即可
   }
- 
+
   .left {
     position: fixed; //视频定位方式设为固定
     height: 100%;

+ 216 - 214
src/views/login/index_old.vue

@@ -1,108 +1,110 @@
 <template>
-  <div class="main">
-    <img src="@/assets/images/login_back.png" alt="" class="back-image">
-    <div class="login-box">
-      <img class="logo" src="@/assets/images/logo.png" alt="" />
-      <div class="change-bar">
-        <div class="checked">用户名登录</div>
-        <div style="margin-left: 32px; margin-right: 32px; color: #C4C4C4">|</div>
-        <div>验证码登录</div>
-      </div>
-      <div class="ipt">
-        <img src="@/assets/images/login_user.png" alt="" />
-        <input v-model="username" placeholder="请输入用户名">
-      </div>
-      <div class="ipt">
-        <img src="@/assets/images/login_lock.png" alt="" />
-        <input v-model="password" type="password" placeholder="请输入密码">
-      </div>
-      <el-button class="btn" type="primary" @click="login">登录</el-button>
-    </div>
-    <!-- 强制修改密码 -->
-    <el-dialog title="修改密码" v-model="passwordOpen" width="680px" append-to-body>
-      <el-form ref="userRef" :model="form" :rules="rules" label-width="100px">
-        <el-row>
-          <el-col :span="24">
-            <el-form-item label="用户名" prop="username">
-              <el-input
-                v-model="form.username"
-                placeholder="请输入用户名"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="24">
-            <el-form-item label="原密码" prop="oldPassword">
-              <el-input
-                v-model="form.oldPassword"
-                type="password"
-                placeholder="请输入原密码"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="24">
-            <el-form-item label="新密码" prop="newPassword">
-              <el-input
-                v-model="form.newPassword"
-                type="password"
-                placeholder="请输入新密码"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="24">
-            <el-form-item label="确认密码" prop="confirmPassword">
-              <el-input
-                v-model="form.confirmPassword"
-                placeholder="请再次确认密码"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-      </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="primary" @click="submitForm">确 定</el-button>
-          <el-button @click="cancel">取 消</el-button>
-        </div>
-      </template>
-    </el-dialog>
-    <!-- 强制验证手机号 -->
-    <el-dialog title="手机号验证" v-model="phoneOpen" width="680px" append-to-body>
-      <el-form ref="phoneRef" :model="mobileForm" :rules="mobileRules" label-width="100px">
-        <el-row>
-          <el-col :span="24">
-            <el-form-item label="手机号" prop="mobileNumber">
-              <el-input
-                v-model="mobileForm.mobileNumber"
-                placeholder="请输入手机号"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="24">
-            <el-form-item label="验证码" prop="verificationCode">
-              <el-input v-model="mobileForm.verificationCode" placeholder="请输入验证码" class="input-with-select">
-                <template #append>
-                  <el-button :disabled="countdown > 0" @click="sendVerificationCode">
-                    {{ countdown > 0 ? countdown + '秒后重新获取' : '获取验证码' }}
-                  </el-button>
-                </template>
-              </el-input>
-            </el-form-item>
-          </el-col>
-        </el-row>
-      </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="primary" @click="submitPhoneForm">确 定</el-button>
-          <el-button @click="phoneCancel">取 消</el-button>
+    <div class="main">
+        <img src="@/assets/images/login_back.png" alt="" class="back-image">
+        <div class="login-box">
+            <img class="logo" src="@/assets/images/logo.png" alt="" />
+            <div class="change-bar">
+                <div class="checked">用户名登录</div>
+                <div style="margin-left: 32px; margin-right: 32px; color: #C4C4C4">|</div>
+                <div>验证码登录</div>
+            </div>
+            <div class="ipt">
+                <img src="@/assets/images/login_user.png" alt="" />
+                <input v-model="username" placeholder="请输入用户名">
+            </div>
+            <div class="ipt">
+                <img src="@/assets/images/login_lock.png" alt="" />
+                <input v-model="password" type="password" placeholder="请输入密码">
+            </div>
+            <el-button class="btn" type="primary" @click="login">登录</el-button>
         </div>
-      </template>
-    </el-dialog>
-  </div>
+
+        <!-- 强制修改密码 -->
+        <el-dialog title="修改密码" v-model="passwordOpen" width="680px" append-to-body>
+            <el-form ref="userRef" :model="form" :rules="rules" label-width="100px">
+                <el-row>
+                    <el-col :span="24">
+                        <el-form-item label="用户名" prop="username">
+                            <el-input
+                                v-model="form.username"
+                                placeholder="请输入用户名"
+                                clearable
+                            />
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="24">
+                        <el-form-item label="原密码" prop="oldPassword">
+                            <el-input
+                                v-model="form.oldPassword"
+                                type="password"
+                                placeholder="请输入原密码"
+                                clearable
+                            />
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="24">
+                        <el-form-item label="新密码" prop="newPassword">
+                            <el-input
+                                v-model="form.newPassword"
+                                type="password"
+                                placeholder="请输入新密码"
+                                clearable
+                            />
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="24">
+                        <el-form-item label="确认密码" prop="confirmPassword">
+                            <el-input
+                                v-model="form.confirmPassword"
+                                placeholder="请再次确认密码"
+                                clearable
+                            />
+                        </el-form-item>
+                    </el-col>
+                </el-row>
+            </el-form>
+            <template #footer>
+                <div class="dialog-footer">
+                    <el-button type="primary" @click="submitForm">确 定</el-button>
+                    <el-button @click="cancel">取 消</el-button>
+                </div>
+            </template>
+        </el-dialog>
+
+        <!-- 强制验证手机号 -->
+        <el-dialog title="手机号验证" v-model="phoneOpen" width="680px" append-to-body>
+            <el-form ref="phoneRef" :model="mobileForm" :rules="mobileRules" label-width="100px">
+                <el-row>
+                    <el-col :span="24">
+                        <el-form-item label="手机号" prop="mobileNumber">
+                            <el-input
+                                v-model="mobileForm.mobileNumber"
+                                placeholder="请输入手机号"
+                                clearable
+                            />
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="24">
+                        <el-form-item label="验证码" prop="verificationCode">
+                            <el-input v-model="mobileForm.verificationCode" placeholder="请输入验证码" class="input-with-select">
+                                <template #append>
+                                    <el-button :disabled="countdown > 0" @click="sendVerificationCode">
+                                        {{ countdown > 0 ? countdown + '秒后重新获取' : '获取验证码' }}
+                                    </el-button>
+                                </template>
+                            </el-input>
+                        </el-form-item>
+                    </el-col>
+                </el-row>
+            </el-form>
+            <template #footer>
+                <div class="dialog-footer">
+                    <el-button type="primary" @click="submitPhoneForm">确 定</el-button>
+                    <el-button @click="phoneCancel">取 消</el-button>
+                </div>
+            </template>
+        </el-dialog>
+    </div>
 </template>
 
 <script setup>
@@ -120,145 +122,145 @@ const { proxy } = getCurrentInstance()
 const countdown = ref(0) // 倒计时秒数
 
 const form = ref({
-  username: null,
-  oldPassword: null,
-  newPassword: null,
-  confirmPassword: null
+    username: null,
+    oldPassword: null,
+    newPassword: null,
+    confirmPassword: null
 })
 const mobileForm = ref({
-  mobileNumber: null,
-  verificationCode: null
+    mobileNumber: null,
+    verificationCode: null
 })
 const mobileRules = ref({
-  mobileNumber: [{ required: true, message: '手机号不能为空', trigger: 'blur' }],
-  verificationCode: [{ required: true, message: '验证码不能为空', trigger: 'blur' }]
+    mobileNumber: [{ required: true, message: '手机号不能为空', trigger: 'blur' }],
+    verificationCode: [{ required: true, message: '验证码不能为空', trigger: 'blur' }]
 })
 const rules = ref({
-  username: [{ required: true, message: '用户名不能为空', trigger: 'blur' }],
-  oldPassword: [{ required: true, message: '旧密码不能为空', trigger: 'blur' }],
-  newPassword: [
-    { required: true, message: '新密码不能为空', trigger: 'blur' },
-    {
-      pattern: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/,
-      message: '新密码必须至少8位,且必须包含大小写字母、数字和特殊符号',
-      trigger: 'blur'
-    }
-  ],
-  confirmPassword: [
-    { required: true, message: '请在此输入新密码', trigger: 'blur' },
-    {
-      validator: (rule, value, callback) => {
-        if (value !== form.value.newPassword) {
-          console.log(value, form.value.newPassword,'Lingci')
-          callback(new Error('两次输入的密码不一致'))
-        } else {
-          callback()
+    username: [{ required: true, message: '用户名不能为空', trigger: 'blur' }],
+    oldPassword: [{ required: true, message: '旧密码不能为空', trigger: 'blur' }],
+    newPassword: [
+        { required: true, message: '新密码不能为空', trigger: 'blur' },
+        {
+            pattern: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/,
+            message: '新密码必须至少8位,且必须包含大小写字母、数字和特殊符号',
+            trigger: 'blur'
         }
-      },
-      trigger: 'blur'
-    }
-  ]
+    ],
+    confirmPassword: [
+        { required: true, message: '请在此输入新密码', trigger: 'blur' },
+        {
+            validator: (rule, value, callback) => {
+                if (value !== form.value.newPassword) {
+                    console.log(value, form.value.newPassword, 'Lingci')
+                    callback(new Error('两次输入的密码不一致'))
+                } else {
+                    callback()
+                }
+            },
+            trigger: 'blur'
+        }
+    ]
 })
 
 const login = () => {
-  useUserStore()
-    .login({
-      username: username.value,
-      password: password.value
-    })
-    .then(() => {
-      router.push('/')
-    }).catch((code) => {
-    console.log('错误进来了',code)
-    if (code === 204) {
-      console.log('强制修改密码')
-      password.value = ''
-      passwordOpen.value = true
-    } else if (code === 203) {
-      password.value = ''
-      phoneOpen.value = true
-    }
-  })
+    useUserStore()
+        .login({
+            username: username.value,
+            password: password.value
+        })
+        .then(() => {
+            router.push('/')
+        }).catch((code) => {
+            console.log('错误进来了', code)
+            if (code === 204) {
+                console.log('强制修改密码')
+                password.value = ''
+                passwordOpen.value = true
+            } else if (code === 203) {
+                password.value = ''
+                phoneOpen.value = true
+            }
+        })
 }
 
 function submitForm() {
-  proxy.$refs['userRef'].validate(valid => {
-    if (valid) {
-      passwordChange({
-        userName: form.value.username,
-        oldPassword: CryptoJS.MD5(form.value.oldPassword).toString(),
-        newPassword: CryptoJS.MD5(form.value.newPassword).toString(),
-        enterPassword: CryptoJS.MD5(form.value.confirmPassword).toString()
-      }).then(res => {
-        if (res.success) {
-          ElMessage({
-            message: '修改成功,请重新登录!',
-            type: 'success'
-          })
-          passwordOpen.value = false
+    proxy.$refs['userRef'].validate(valid => {
+        if (valid) {
+            passwordChange({
+                userName: form.value.username,
+                oldPassword: CryptoJS.MD5(form.value.oldPassword).toString(),
+                newPassword: CryptoJS.MD5(form.value.newPassword).toString(),
+                enterPassword: CryptoJS.MD5(form.value.confirmPassword).toString()
+            }).then(res => {
+                if (res.success) {
+                    ElMessage({
+                        message: '修改成功,请重新登录!',
+                        type: 'success'
+                    })
+                    passwordOpen.value = false
+                }
+            })
+        } else {
+            console.log('检验不通过')
         }
-      })
-    } else {
-      console.log('检验不通过')
-    }
-  })
+    })
 }
 
 function cancel() {
-  passwordOpen.value = false
-  form.value = {
-    username: null,
-    oldPassword: null,
-    newPassword: null,
-    confirmPassword: null
-  }
+    passwordOpen.value = false
+    form.value = {
+        username: null,
+        oldPassword: null,
+        newPassword: null,
+        confirmPassword: null
+    }
 }
 
 function sendVerificationCode() {
-  // 这里实现发送验证码的逻辑
-  if (!mobileForm.value.mobileNumber) return
-  sendSmsCode({ mobile: mobileForm.value.mobileNumber }).then((res) => {
-    if (res.success) {
-      ElMessage({
-        message: '验证码发生成功!',
-        type: 'success'
-      })
-      // 发送成功后开始倒计时
-      countdown.value = 60
-      let interval = setInterval(() => {
-        countdown.value--
-        if (countdown.value <= 0) {
-          clearInterval(interval)
+    // 这里实现发送验证码的逻辑
+    if (!mobileForm.value.mobileNumber) return
+    sendSmsCode({ mobile: mobileForm.value.mobileNumber }).then((res) => {
+        if (res.success) {
+            ElMessage({
+                message: '验证码发生成功!',
+                type: 'success'
+            })
+            // 发送成功后开始倒计时
+            countdown.value = 60
+            let interval = setInterval(() => {
+                countdown.value--
+                if (countdown.value <= 0) {
+                    clearInterval(interval)
+                }
+            }, 1000)
         }
-      }, 1000)
-    }
-  })
+    })
 }
 
 function submitPhoneForm() {
-  proxy.$refs['phoneRef'].validate(valid => {
-    if (valid) {
-      userUnlock({ mobile: mobileForm.value.mobileNumber, code: mobileForm.value.verificationCode }).then((res) => {
-        if (res.success) {
-          ElMessage({
-            message: '校验成功,请重新登录',
-            type: 'success'
-          })
-          phoneOpen.value = false
+    proxy.$refs['phoneRef'].validate(valid => {
+        if (valid) {
+            userUnlock({ mobile: mobileForm.value.mobileNumber, code: mobileForm.value.verificationCode }).then((res) => {
+                if (res.success) {
+                    ElMessage({
+                        message: '校验成功,请重新登录',
+                        type: 'success'
+                    })
+                    phoneOpen.value = false
+                }
+            })
+        } else {
+            console.log('校验不通过')
         }
-      })
-    } else {
-      console.log('校验不通过')
-    }
-  })
+    })
 }
 
 function phoneCancel() {
-  phoneOpen.value = false
-  mobileForm.value = {
-    mobileNumber: null,
-    verificationCode: null
-  }
+    phoneOpen.value = false
+    mobileForm.value = {
+        mobileNumber: null,
+        verificationCode: null
+    }
 }
 </script>
 

+ 46 - 0
src/views/policyShare/index.vue

@@ -0,0 +1,46 @@
+<template>
+    <el-card class="tjm_card_style_custom">
+        <div class="tjm_card_title">查询表格</div>
+        <div class="tjm_card_select">
+            <el-form class="tjm_card_select_left" :model="params" inline label-width="80px" label-position="left">
+                <el-form-item label="用户名称">
+                    <el-input v-model="params.userName" clearable></el-input>
+                </el-form-item>
+                <el-form-item label="姓名">
+                    <el-input v-model="params.realName" clearable></el-input>
+                </el-form-item>
+
+                <el-form-item>
+                    <el-button type="primary" icon="plus" @click="search">搜索</el-button>
+                    <el-button icon="refresh-right" @click="reset">重置</el-button>
+                </el-form-item>
+            </el-form>
+        </div>
+        <el-divider></el-divider>
+    </el-card>
+
+    <!-- <plan-detail v-if="dialog" ref="planDetail" @success="reloadTable" @closed="dialog = false"></plan-detail> -->
+</template>
+
+<script setup>
+// import {} from '@/api/system/user.js'
+const { proxy } = getCurrentInstance();
+
+const params = reactive({
+    page: 1,
+    size: 10,
+    userName: null,
+    realName: null
+});
+const total = ref(0);
+const tableData = reactive([]);
+
+// watch(deptName, val => {
+//   proxy.$refs['deptTreeRef'].filter(val)
+// });
+</script>
+
+<style lang="scss" scoped>
+.policy-container {
+}
+</style>

+ 1 - 1
src/views/redirect/index.vue

@@ -1,5 +1,5 @@
 <template>
-  <div></div>
+    <div></div>
 </template>
 
 <script setup>

+ 354 - 357
src/views/system/dataList.vue

@@ -1,180 +1,177 @@
 <template>
-  <div>
-    <el-card class="tjm_card_style_custom">
-      <div class="tjm_cart_table">
-        <el-table
-          header-cell-class-name="tjm_cart_table_header"
-          :data="tableData"
-          v-loading="tableLoading"
-          border
-          lazy
-          :load="loadTalbeTree"
-          :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
-          row-key="id"
+    <div>
+        <el-card class="tjm_card_style_custom">
+            <div class="tjm_cart_table">
+                <el-table
+                    header-cell-class-name="tjm_cart_table_header"
+                    :data="tableData"
+                    v-loading="tableLoading"
+                    border
+                    lazy
+                    :load="loadTalbeTree"
+                    :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
+                    row-key="id"
+                >
+                    <!-- <el-table-column type="selection" width="55" /> -->
+                    <el-table-column prop="name" width="300" label="菜单名称" />
+                    <el-table-column prop="path" width="350" label="菜单路由" />
+                    <el-table-column prop="code" label="菜单代码" />
+                    <el-table-column prop="type" label="类型">
+                        <template #default="scope">
+                            <el-tag :type="scope.row.type === 1 ? 'info' : 'success'">{{ scope.row.type === 1 ? '菜单' : '按钮' }}
+                            </el-tag>
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="menuType" label="设备">
+                        <template #default="scope">
+                            <el-tag :type="scope.row.menuType === 1 ? 'info' : 'success'">
+                                {{ scope.row.menuType === 1 ? 'Cloud端' : scope.row.menuType === 2 ? 'APP端' : 'Boot端' }}
+                            </el-tag>
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="icon" label="图标">
+                        <template #default="scope">
+                            <!-- <el-icon size="18">
+                                <component :is="scope.row.icon" />
+                            </el-icon> -->
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="sort" label="排序" />
+                    <el-table-column prop="ope" width="120" label="操作">
+                        <template #default="scope">
+                            <el-button link type="primary" icon="Edit" @click="editItem(scope.row)">权限配置</el-button>
+                        </template>
+                    </el-table-column>
+                </el-table>
+            </div>
+        </el-card>
+        <el-drawer
+            v-model="drawerShow"
+            title="权限配置"
+            direction="rtl"
+            size="50%"
         >
-          <!--          <el-table-column type="selection" width="55" />-->
-          <el-table-column prop="name" width="300" label="菜单名称" />
-          <el-table-column prop="path" width="350" label="菜单路由" />
-          <el-table-column prop="code" label="菜单代码" />
-          <el-table-column prop="type" label="类型">
-            <template #default="scope">
-              <el-tag :type="scope.row.type === 1 ? 'info' : 'success'">{{ scope.row.type === 1 ? '菜单' : '按钮' }}
-              </el-tag>
-            </template>
-          </el-table-column>
-          <el-table-column prop="menuType" label="设备">
-            <template #default="scope">
-              <el-tag :type="scope.row.menuType === 1 ? 'info' : 'success'">
-                {{ scope.row.menuType === 1 ? 'Cloud端' : scope.row.menuType === 2 ? 'APP端' : 'Boot端' }}
-              </el-tag>
-            </template>
-          </el-table-column>
-          <el-table-column prop="icon" label="图标">
-            <template #default="scope">
-<!--              <el-icon size="18">-->
-<!--                <component :is="scope.row.icon" />-->
-<!--              </el-icon>-->
-            </template>
-          </el-table-column>
-          <el-table-column prop="sort" label="排序" />
-          <el-table-column prop="ope" width="120" label="操作">
-            <template #default="scope">
-              <el-button link type="primary" icon="Edit" @click="editItem(scope.row)">权限配置</el-button>
+            <el-button style="margin-bottom: 20px" type="primary" @click="addPower">
+                <el-icon class="tjm_btn_icon_right"><tjm-icon-ep-Plus /></el-icon>
+                新增
+            </el-button>
+            <el-table
+                header-cell-class-name="tjm_cart_table_header"
+                :data="powerData"
+                border
+                width="100%"
+            >
+                <el-table-column type="index" label="序号" width="55" />
+                <el-table-column prop="scopeName" label="权限名称" />
+                <el-table-column prop="resourceCode" label="权限编号" />
+                <el-table-column prop="scopeColumn" label="权限字段" />
+                <el-table-column prop="scopeType" label="规则类型" />
+                <el-table-column prop="ope" label="操作">
+                    <template #default="scope">
+                        <el-tooltip content="查看" placement="top">
+                            <el-button
+                                link
+                                type="primary"
+                                icon="View"
+                                @click="checkPower(scope.row)"
+                            ></el-button>
+                        </el-tooltip>
+                        <el-tooltip content="编辑" placement="top">
+                            <el-button
+                                link
+                                type="primary"
+                                icon="Edit"
+                                @click="editPower(scope.row)"
+                            ></el-button>
+                        </el-tooltip>
+                        <el-tooltip content="删除" placement="top">
+                            <el-button
+                                link
+                                type="primary"
+                                icon="Delete"
+                                @click="deletePower(scope.row)"
+                            ></el-button>
+                        </el-tooltip>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <div style="margin-top: 20px; display: flex; justify-content: right">
+                <el-pagination background layout="prev, pager, next" :total="total" @current-change="currentChange" />
+            </div>
+        </el-drawer>
+
+        <el-dialog :title="dialogTitle" v-model="dialogShow" width="680px" append-to-body>
+            <el-form ref="menuRef" :model="form" :rules="rules" label-width="100px" :disabled="formLock">
+                <el-row>
+                    <el-col :span="12">
+                        <el-form-item label="权限名称" prop="scopeName">
+                            <el-input v-model="form.scopeName" placeholder="请输入权限名称" clearable></el-input>
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="12">
+                        <el-form-item label="权限编号" prop="resourceCode">
+                            <el-input
+                                v-model="form.resourceCode"
+                                placeholder="请输入权限编号"
+                                clearable
+                            />
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="12">
+                        <el-form-item label="权限字段" prop="scopeColumn">
+                            <el-input
+                                v-model="form.scopeColumn"
+                                placeholder="请输入权限字段"
+                                clearable
+                            />
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="12">
+                        <el-form-item label="规则类型" prop="scopeType">
+                            <el-select v-model="form.scopeType" clearable @change="scopeTypeSelect">
+                                <el-option v-for="(item, index) in ruleList" :key="index" :value="item.value" :label="item.label">{{ item.label }}</el-option>
+                            </el-select>
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="24">
+                        <el-form-item label="可见字段" prop="scopeField">
+                            <el-input
+                                v-model="form.scopeField"
+                                placeholder="请输入菜单描述"
+                                clearable
+                            />
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="24">
+                        <el-form-item label="权限类名" prop="scopeClass">
+                            <el-input
+                                v-model="form.scopeClass"
+                                placeholder="请输入权限类名"
+                                clearable
+                            />
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="24">
+                        <el-form-item label="备注" prop="remark">
+                            <el-input
+                                type="textarea"
+                                v-model="form.remark"
+                                placeholder="请输入备注"
+                                clearable
+                                autosize
+                            />
+                        </el-form-item>
+                    </el-col>
+                </el-row>
+            </el-form>
+            <template #footer>
+                <div class="dialog-footer">
+                    <el-button v-if="!formLock" type="primary" @click="submitForm">确 定</el-button>
+                    <el-button @click="cancel">取 消</el-button>
+                </div>
             </template>
-          </el-table-column>
-        </el-table>
-      </div>
-    </el-card>
-    <el-drawer
-      v-model="drawerShow"
-      title="权限配置"
-      direction="rtl"
-      size="50%"
-    >
-      <el-button style="margin-bottom: 20px" type="primary" @click="addPower">
-        <el-icon class="tjm_btn_icon_right" size="16"
-        >
-          <tjm-icon-ep-Plus
-          />
-        </el-icon>
-        新增
-      </el-button>
-      <el-table
-        header-cell-class-name="tjm_cart_table_header"
-        :data="powerData"
-        border
-        width="100%"
-      >
-        <el-table-column type="index" label="序号" width="55" />
-        <el-table-column prop="scopeName" label="权限名称" />
-        <el-table-column prop="resourceCode" label="权限编号" />
-        <el-table-column prop="scopeColumn" label="权限字段" />
-        <el-table-column prop="scopeType" label="规则类型" />
-        <el-table-column prop="ope" label="操作">
-          <template #default="scope">
-            <el-tooltip content="查看" placement="top">
-              <el-button
-                link
-                type="primary"
-                icon="View"
-                @click="checkPower(scope.row)"
-              ></el-button>
-            </el-tooltip>
-            <el-tooltip content="编辑" placement="top">
-              <el-button
-                link
-                type="primary"
-                icon="Edit"
-                @click="editPower(scope.row)"
-              ></el-button>
-            </el-tooltip>
-            <el-tooltip content="删除" placement="top">
-              <el-button
-                link
-                type="primary"
-                icon="Delete"
-                @click="deletePower(scope.row)"
-              ></el-button>
-            </el-tooltip>
-          </template>
-        </el-table-column>
-      </el-table>
-      <div style="margin-top: 20px; display: flex; justify-content: right">
-        <el-pagination background layout="prev, pager, next" :total="total" @current-change="currentChange" />
-      </div>
-    </el-drawer>
-    <el-dialog :title="dialogTitle" v-model="dialogShow" width="680px" append-to-body>
-      <el-form ref="menuRef" :model="form" :rules="rules" label-width="100px" :disabled="formLock">
-        <el-row>
-          <el-col :span="12">
-            <el-form-item label="权限名称" prop="scopeName">
-              <el-input v-model="form.scopeName" placeholder="请输入权限名称" clearable></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="权限编号" prop="resourceCode">
-              <el-input
-                v-model="form.resourceCode"
-                placeholder="请输入权限编号"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="权限字段" prop="scopeColumn">
-              <el-input
-                v-model="form.scopeColumn"
-                placeholder="请输入权限字段"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="规则类型" prop="scopeType">
-              <el-select v-model="form.scopeType" clearable @change="scopeTypeSelect">
-                <el-option v-for="(item, index) in ruleList" :key="index" :value="item.value" :label="item.label">{{ item.label }}</el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :span="24">
-            <el-form-item label="可见字段" prop="scopeField">
-              <el-input
-                v-model="form.scopeField"
-                placeholder="请输入菜单描述"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="24">
-            <el-form-item label="权限类名" prop="scopeClass">
-              <el-input
-                v-model="form.scopeClass"
-                placeholder="请输入权限类名"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="24">
-            <el-form-item label="备注" prop="remark">
-              <el-input
-                type="textarea"
-                v-model="form.remark"
-                placeholder="请输入备注"
-                clearable
-                autosize
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-      </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button v-if="!formLock" type="primary" @click="submitForm">确 定</el-button>
-          <el-button @click="cancel">取 消</el-button>
-        </div>
-      </template>
-    </el-dialog>
-  </div>
+        </el-dialog>
+    </div>
 </template>
 
 <script setup>
@@ -186,8 +183,8 @@ const drawerShow = ref(false)
 const total = ref(0)
 //查询
 const params = ref({
-  page: 1,
-  size: 10
+    page: 1,
+    size: 10
 })
 const tableData = ref([])
 const allTableData = ref([])
@@ -198,235 +195,235 @@ const dialogShow = ref(false)
 const formLock = ref(false)
 const { proxy } = getCurrentInstance()
 const ruleList = ref([
-  { label: '全部可见', value: 1 },
-  { label: '本人可见', value: 2 },
-  { label: '所在机构可见', value: 3 },
-  { label: '所在机构及子级可见', value: 4 },
-  { label: '自定义', value: 5 }
+    { label: '全部可见', value: 1 },
+    { label: '本人可见', value: 2 },
+    { label: '所在机构可见', value: 3 },
+    { label: '所在机构及子级可见', value: 4 },
+    { label: '自定义', value: 5 }
 ])
 const form = ref({
-  scopeName: '',
-  resourceCode: '',
-  scopeColumn: '-',
-  scopeType: '',
-  scopeField: "*",
-  scopeClass: '',
-  remark: 0
+    scopeName: '',
+    resourceCode: '',
+    scopeColumn: '-',
+    scopeType: '',
+    scopeField: "*",
+    scopeClass: '',
+    remark: 0
 })
 const rules = ref({
-  scopeName: [{ required: true, message: '权限名称不能为空', trigger: 'blur' }],
-  resourceCode: [{ required: true, message: '权限编号不能为空', trigger: 'blur' }],
-  scopeColumn: [{ required: true, message: '权限字段不能为空', trigger: 'blur' }],
-  scopeType: [{ required: true, message: '规则类型不能为空', trigger: 'blur' }],
-  scopeField: [{ required: true, message: '可见字段不能为空', trigger: 'blur' }],
-  scopeClass: [{ required: true, message: '权限类名不能为空', trigger: 'blur' }],
+    scopeName: [{ required: true, message: '权限名称不能为空', trigger: 'blur' }],
+    resourceCode: [{ required: true, message: '权限编号不能为空', trigger: 'blur' }],
+    scopeColumn: [{ required: true, message: '权限字段不能为空', trigger: 'blur' }],
+    scopeType: [{ required: true, message: '规则类型不能为空', trigger: 'blur' }],
+    scopeField: [{ required: true, message: '可见字段不能为空', trigger: 'blur' }],
+    scopeClass: [{ required: true, message: '权限类名不能为空', trigger: 'blur' }],
 })
 
 onMounted(() => {
-  getList()
+    getList()
 })
 
 function loadTalbeTree(tree, treeNode, resolve) {
-  const idCopy = JSON.parse(JSON.stringify(tree.idList))
-  let resolveArr = allTableData.value
-  let id = tree.idList.shift()
-  while (id) {
-    const tarItem = resolveArr.find(item => item.id === id)
-    if (tarItem) {
-      tarItem.loadedChildren = true
-      resolveArr = tarItem.children
+    const idCopy = JSON.parse(JSON.stringify(tree.idList))
+    let resolveArr = allTableData.value
+    let id = tree.idList.shift()
+    while (id) {
+        const tarItem = resolveArr.find(item => item.id === id)
+        if (tarItem) {
+            tarItem.loadedChildren = true
+            resolveArr = tarItem.children
+        }
+        id = tree.idList.shift()
     }
-    id = tree.idList.shift()
-  }
-  resolveArr = JSON.parse(JSON.stringify(resolveArr))
-  resolveArr.forEach(item => {
-    item.hasChildren = item.children && item.children.length > 0
-    item.children = null
-    item.idList = JSON.parse(JSON.stringify(idCopy))
-    item.idList.push(item.id)
-  })
-  tree.loadedChildren = true
-  resolve(resolveArr)
+    resolveArr = JSON.parse(JSON.stringify(resolveArr))
+    resolveArr.forEach(item => {
+        item.hasChildren = item.children && item.children.length > 0
+        item.children = null
+        item.idList = JSON.parse(JSON.stringify(idCopy))
+        item.idList.push(item.id)
+    })
+    tree.loadedChildren = true
+    resolve(resolveArr)
 }
 
 
 function getList() {
-  tableLoading.value = true
-  getMainList({ systemCode: 10001 }).then(res => {
-    tableLoading.value = false
-    if (res.code === 200) {
-      if (res.data.length && res.data[0].children) {
-        const array = []
-        res.data[0].children.forEach((item) => {
-          if (item.menuType === 3) {
-            array.push(item)
-          }
-        })
-        res.data = array
-      }
-      allTableData.value = res.data || []
-      tableData.value = JSON.parse(JSON.stringify(res.data)).map(item => {
-        item.hasChildren = item.children && item.children.length > 0
-        item.children = null
-        item.idList = [item.id]
-        return item
-      })
-    }
-  }).catch(() => {
-    tableLoading.value = false
-  })
+    tableLoading.value = true
+    getMainList({ systemCode: 10001 }).then(res => {
+        tableLoading.value = false
+        if (res.code === 200) {
+            if (res.data.length && res.data[0].children) {
+                const array = []
+                res.data[0].children.forEach((item) => {
+                    if (item.menuType === 3) {
+                        array.push(item)
+                    }
+                })
+                res.data = array
+            }
+            allTableData.value = res.data || []
+            tableData.value = JSON.parse(JSON.stringify(res.data)).map(item => {
+                item.hasChildren = item.children && item.children.length > 0
+                item.children = null
+                item.idList = [item.id]
+                return item
+            })
+        }
+    }).catch(() => {
+        tableLoading.value = false
+    })
 }
 
 function getSubList() {
-  getPowerList({ menuId: currentRow.value.id, ...params.value }).then(res => {
-    if (res.code === 200) {
-      powerData.value = res.data.records
-      total.value = res.data.total
-      drawerShow.value = true
-    }
-  })
+    getPowerList({ menuId: currentRow.value.id, ...params.value }).then(res => {
+        if (res.code === 200) {
+            powerData.value = res.data.records
+            total.value = res.data.total
+            drawerShow.value = true
+        }
+    })
 }
 
 function currentChange(e) {
-  params.value.page = e
-  getPowerList({ menuId: currentRow.value.id, ...params.value }).then(res => {
-    if (res.code === 200) {
-      powerData.value = res.data.records
-      total.value = res.data.total
-      drawerShow.value = true
-    }
-  })
+    params.value.page = e
+    getPowerList({ menuId: currentRow.value.id, ...params.value }).then(res => {
+        if (res.code === 200) {
+            powerData.value = res.data.records
+            total.value = res.data.total
+            drawerShow.value = true
+        }
+    })
 }
 
 function editItem(row) {
-  console.log(row)
-  currentRow.value = row
-  getPowerList({ menuId: row.id, current: params.value.page, size: params.value.size }).then(res => {
-    if (res.code === 200) {
-      powerData.value = res.data.records
-      total.value = res.data.total
-      drawerShow.value = true
-    }
-  })
+    console.log(row)
+    currentRow.value = row
+    getPowerList({ menuId: row.id, current: params.value.page, size: params.value.size }).then(res => {
+        if (res.code === 200) {
+            powerData.value = res.data.records
+            total.value = res.data.total
+            drawerShow.value = true
+        }
+    })
 }
 
 function checkPower(row) {
-  formLock.value = true
-  dialogTitle.value = '查看权限'
-  form.value = { ...row }
-  dialogShow.value = true
+    formLock.value = true
+    dialogTitle.value = '查看权限'
+    form.value = { ...row }
+    dialogShow.value = true
 }
 
 function editPower(row) {
-  formLock.value = false
-  form.value = { ...row }
-  dialogTitle.value = '修改权限'
-  dialogShow.value = true
+    formLock.value = false
+    form.value = { ...row }
+    dialogTitle.value = '修改权限'
+    dialogShow.value = true
 }
 
 function addPower() {
-  form.value = {
-    scopeName: null,
-    resourceCode: '',
-    scopeColumn: '-',
-    scopeType: null,
-    scopeField: "*",
-    scopeClass: null,
-    remark: 0
-  }
-  formLock.value = false
-  dialogTitle.value = '新增权限'
-  form.value.scopeName = currentRow.value.name + "[暂无]"
-  form.value.resourceCode = currentRow.value.code
-  dialogShow.value = true
+    form.value = {
+        scopeName: null,
+        resourceCode: '',
+        scopeColumn: '-',
+        scopeType: null,
+        scopeField: "*",
+        scopeClass: null,
+        remark: 0
+    }
+    formLock.value = false
+    dialogTitle.value = '新增权限'
+    form.value.scopeName = currentRow.value.name + "[暂无]"
+    form.value.resourceCode = currentRow.value.code
+    dialogShow.value = true
 }
-function scopeTypeSelect(value){
-  form.value.scopeName = currentRow.value.name +"["+ ruleList.value[value-1].label +"]"
+function scopeTypeSelect(value) {
+    form.value.scopeName = currentRow.value.name + "[" + ruleList.value[value - 1].label + "]"
 }
 function resetForm() {
-  form.value = {
-    scopeName: null,
-    resourceCode: '',
-    scopeColumn: '-',
-    scopeType: null,
-    scopeField: "*",
-    scopeClass: null,
-    remark: 0
-  }
-  if (proxy.$refs['menuRef']) {
-    proxy.$refs['menuRef'].resetFields()
-  }
-  console.log('重置表单')
+    form.value = {
+        scopeName: null,
+        resourceCode: '',
+        scopeColumn: '-',
+        scopeType: null,
+        scopeField: "*",
+        scopeClass: null,
+        remark: 0
+    }
+    if (proxy.$refs['menuRef']) {
+        proxy.$refs['menuRef'].resetFields()
+    }
+    console.log('重置表单')
 }
 
 function submitForm() {
-  proxy.$refs['menuRef'].validate(valid => {
-    if (valid) {
-      if (form.value.id) {
-        console.log('修改表单')
-        const params = {
-          ...form.value
-        }
-        scopeUpdate(params).then(res => {
-          if (res.code === 200) {
-            ElMessage({
-              message: '修改成功',
-              type: 'success'
-            })
-            dialogShow.value = false
-            resetForm()
-            getSubList()
-          }
-        })
-      } else {
-        console.log('新增表单')
-        const params = {
-          menuId: currentRow.value.id,
-          ...form.value
+    proxy.$refs['menuRef'].validate(valid => {
+        if (valid) {
+            if (form.value.id) {
+                console.log('修改表单')
+                const params = {
+                    ...form.value
+                }
+                scopeUpdate(params).then(res => {
+                    if (res.code === 200) {
+                        ElMessage({
+                            message: '修改成功',
+                            type: 'success'
+                        })
+                        dialogShow.value = false
+                        resetForm()
+                        getSubList()
+                    }
+                })
+            } else {
+                console.log('新增表单')
+                const params = {
+                    menuId: currentRow.value.id,
+                    ...form.value
+                }
+                scopeSave(params).then(res => {
+                    if (res.code === 200) {
+                        ElMessage({
+                            message: '新增成功',
+                            type: 'success'
+                        })
+                        dialogShow.value = false
+                        resetForm()
+                        getSubList()
+                    }
+                })
+            }
         }
-        scopeSave(params).then(res => {
-          if (res.code === 200) {
-            ElMessage({
-              message: '新增成功',
-              type: 'success'
-            })
-            dialogShow.value = false
-            resetForm()
-            getSubList()
-          }
-        })
-      }
-    }
-  })
+    })
 }
 
 function cancel() {
-  dialogShow.value = false
-  resetForm()
+    dialogShow.value = false
+    resetForm()
 }
 
 function deletePower(row) {
-  ElMessageBox.confirm('是否确认删除"' + row.scopeName + '"?', '删除警告', {
-    confirmButtonText: '确定',
-    cancelButtonText: '取消',
-    type: 'warning'
-  }).then(() => {
-    scopeRemove({ids: row.id}).then(res => {
-      if (res.code === 200) {
-        ElMessage({
-          message: '删除成功',
-          type: 'success'
-        })
-        getSubList()
-      } else {
-        ElMessage({
-          message: res.msg,
-          type: 'warning'
+    ElMessageBox.confirm('是否确认删除"' + row.scopeName + '"?', '删除警告', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+    }).then(() => {
+        scopeRemove({ ids: row.id }).then(res => {
+            if (res.code === 200) {
+                ElMessage({
+                    message: '删除成功',
+                    type: 'success'
+                })
+                getSubList()
+            } else {
+                ElMessage({
+                    message: res.msg,
+                    type: 'warning'
+                })
+            }
         })
-      }
     })
-  })
 }
 </script>
 
-<style lang="scss" scoped></style>
+<style lang="scss" scoped></style>

+ 281 - 288
src/views/system/dept.vue

@@ -1,171 +1,164 @@
 <template>
-  <div>
-    <el-card class="tjm_card_style_custom">
-<!--      <div class="tjm_card_title">查询表格</div>-->
-<!--      <div class="tjm_card_select">-->
-<!--        <div class="tjm_card_select_left">-->
-<!--          <el-form-->
-<!--            :inline="true"-->
-<!--            :model="formInline"-->
-<!--            label-width="80px"-->
-<!--            :label-position="'left'"-->
-<!--          >-->
-<!--            <el-form-item label="部门名称">-->
-<!--              <el-input-->
-<!--                v-model="formInline.name"-->
-<!--                placeholder="请输入"-->
-<!--                clearable-->
-<!--              />-->
-<!--            </el-form-item>-->
+    <div>
+        <el-card class="tjm_card_style_custom">
+    <!--      <div class="tjm_card_title">查询表格</div>-->
+    <!--      <div class="tjm_card_select">-->
+    <!--        <div class="tjm_card_select_left">-->
+    <!--          <el-form-->
+    <!--            :inline="true"-->
+    <!--            :model="formInline"-->
+    <!--            label-width="80px"-->
+    <!--            :label-position="'left'"-->
+    <!--          >-->
+    <!--            <el-form-item label="部门名称">-->
+    <!--              <el-input-->
+    <!--                v-model="formInline.name"-->
+    <!--                placeholder="请输入"-->
+    <!--                clearable-->
+    <!--              />-->
+    <!--            </el-form-item>-->
 
-<!--            <el-form-item label="创建时间">-->
-<!--              <el-date-picker-->
-<!--                v-model="formInline.date"-->
-<!--                type="daterange"-->
-<!--                placeholder="Pick a date"-->
-<!--                clearable-->
-<!--              />-->
-<!--            </el-form-item>-->
-<!--            <el-form-item label="部门状态">-->
-<!--              <el-select-->
-<!--                v-model="formInline.status"-->
-<!--                clearable-->
-<!--                placeholder="请选择"-->
-<!--              >-->
-<!--                <el-option label="启用" value="1" />-->
-<!--                <el-option label="禁用" value="2" />-->
-<!--              </el-select>-->
-<!--            </el-form-item>-->
-<!--          </el-form>-->
-<!--        </div>-->
-<!--        <div class="tjm_card_select_right">-->
-<!--          <div>-->
-<!--            <el-button type="primary">-->
-<!--              <el-icon class="tjm_btn_icon_right" size="16"-->
-<!--              ><tjm-icon-ep-Plus-->
-<!--              /></el-icon>-->
-<!--              搜索-->
-<!--            </el-button>-->
-<!--          </div>-->
+    <!--            <el-form-item label="创建时间">-->
+    <!--              <el-date-picker-->
+    <!--                v-model="formInline.date"-->
+    <!--                type="daterange"-->
+    <!--                placeholder="Pick a date"-->
+    <!--                clearable-->
+    <!--              />-->
+    <!--            </el-form-item>-->
+    <!--            <el-form-item label="部门状态">-->
+    <!--              <el-select-->
+    <!--                v-model="formInline.status"-->
+    <!--                clearable-->
+    <!--                placeholder="请选择"-->
+    <!--              >-->
+    <!--                <el-option label="启用" value="1" />-->
+    <!--                <el-option label="禁用" value="2" />-->
+    <!--              </el-select>-->
+    <!--            </el-form-item>-->
+    <!--          </el-form>-->
+    <!--        </div>-->
+    <!--        <div class="tjm_card_select_right">-->
+    <!--          <div>-->
+    <!--            <el-button type="primary">-->
+    <!--              <el-icon class="tjm_btn_icon_right"><tjm-icon-ep-Plus /></el-icon>-->
+    <!--              搜索-->
+    <!--            </el-button>-->
+    <!--          </div>-->
 
-<!--          <div>-->
-<!--            <el-button>-->
-<!--              <el-icon class="tjm_btn_icon_right" size="16"-->
-<!--              ><tjm-icon-ep-RefreshRight-->
-<!--              /></el-icon>-->
-<!--              重置-->
-<!--            </el-button>-->
-<!--          </div>-->
-<!--        </div>-->
-<!--      </div>-->
-<!--      <el-divider />-->
-<!--      <div class="tjm_card_tools">-->
-<!--        <div class="tjm_card_tools_left">-->
-<!--          <el-button type="primary">-->
-<!--            <el-icon class="tjm_btn_icon_right" size="16"-->
-<!--            ><tjm-icon-ep-Plus-->
-<!--            /></el-icon>-->
-<!--            新增-->
-<!--          </el-button>-->
-<!--        </div>-->
-<!--        <div class="tjm_card_tools_right">-->
-<!--          <el-button>-->
-<!--            <el-icon class="tjm_btn_icon_right" size="16"-->
-<!--            ><tjm-icon-ep-UploadFilled-->
-<!--            /></el-icon>-->
-<!--            上传-->
-<!--          </el-button>-->
-<!--        </div>-->
-<!--      </div>-->
-      <div class="tjm_cart_table">
-        <el-table
-          header-cell-class-name="tjm_cart_table_header"
-          height="400"
-          :data="tableData"
-          v-loading="loading"
-          border
-           lazy
-          :load="loadTalbeTree"
-          style="width: 100%"
-          :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
-          row-key="id"
-        >
-<!--          <el-table-column type="selection" width="55" />-->
-          <el-table-column prop="name" label="部门名称" />
-          <el-table-column prop="sort" label="排序" />
-          <el-table-column prop="ope" label="操作">
-            <template #default="scope">
-              <el-button link type="primary" icon="Edit" @click="editItem(scope.row)">修改</el-button>
-              <el-button link type="primary" icon="Plus" @click="addItem(scope.row)">新增</el-button>
-              <el-button link type="primary" icon="Delete" @click="deleteDepartClick(scope.row)">删除</el-button>
+    <!--          <div>-->
+    <!--            <el-button>-->
+    <!--              <el-icon class="tjm_btn_icon_right"><tjm-icon-ep-RefreshRight /></el-icon>-->
+    <!--              重置-->
+    <!--            </el-button>-->
+    <!--          </div>-->
+    <!--        </div>-->
+    <!--      </div>-->
+    <!--      <el-divider />-->
+    <!--      <div class="tjm_card_tools">-->
+    <!--        <div class="tjm_card_tools_left">-->
+    <!--          <el-button type="primary">-->
+    <!--            <el-icon class="tjm_btn_icon_right"><tjm-icon-ep-Plus /></el-icon>-->
+    <!--            新增-->
+    <!--          </el-button>-->
+    <!--        </div>-->
+    <!--        <div class="tjm_card_tools_right">-->
+    <!--          <el-button>-->
+    <!--            <el-icon class="tjm_btn_icon_right"><tjm-icon-ep-UploadFilled /></el-icon>-->
+    <!--            上传-->
+    <!--          </el-button>-->
+    <!--        </div>-->
+    <!--      </div>-->
+            <div class="tjm_cart_table">
+                <el-table
+                    header-cell-class-name="tjm_cart_table_header"
+                    height="400"
+                    :data="tableData"
+                    v-loading="loading"
+                    border
+                    lazy
+                    :load="loadTalbeTree"
+                    style="width: 100%"
+                    :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
+                    row-key="id"
+                >
+                    <!-- <el-table-column type="selection" width="55" /> -->
+                    <el-table-column prop="name" label="部门名称" />
+                    <el-table-column prop="sort" label="排序" />
+                    <el-table-column prop="ope" label="操作">
+                        <template #default="scope">
+                            <el-button link type="primary" icon="Edit" @click="editItem(scope.row)">修改</el-button>
+                            <el-button link type="primary" icon="Plus" @click="addItem(scope.row)">新增</el-button>
+                            <el-button link type="primary" icon="Delete" @click="deleteDepartClick(scope.row)">删除</el-button>
+                        </template>
+                    </el-table-column>
+                </el-table>
+            </div>
+            <!-- <div class="tjm_cart_pagination">
+                <el-pagination background layout="prev, pager, next" :total="total" @current-change="currentChange" />
+            </div> -->
+        </el-card>
+
+        <!-- 新增/编辑 -->
+        <el-dialog :title="dialogTitle" v-model="addShow" append-to-body @close="resetForm">
+            <el-form ref="userRef" :model="form" :rules="rules" label-width="100px">
+                <el-row>
+                    <el-col :span="24">
+                        <el-form-item label="父级节点" prop="parentId">
+                            <el-input
+                                v-model="form.parentId"
+                                placeholder="--"
+                                disabled
+                            />
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="24">
+                        <el-form-item label="部门名称" prop="name">
+                            <el-input
+                                v-model="form.name"
+                                placeholder="请输入部门名称"
+                                clearable
+                            />
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="24">
+                        <el-form-item label="部门代码" prop="code">
+                            <el-input
+                                v-model="form.code"
+                                placeholder="请输入部门代码"
+                                clearable
+                            />
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="24">
+                        <el-form-item label="部门描述" prop="description">
+                            <el-input
+                                v-model="form.description"
+                                placeholder="请输入部门描述"
+                                clearable
+                            />
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="24">
+                        <el-form-item label="部门排序" prop="sort">
+                            <el-input-number v-model="form.sort" :min="0" :max="1000" />
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="24">
+                        <el-form-item label="部门状态" prop="state">
+                            <el-switch v-model="form.state" />
+                        </el-form-item>
+                    </el-col>
+                </el-row>
+            </el-form>
+            <template #footer>
+                <div class="dialog-footer">
+                    <el-button type="primary" @click="submitForm">确 定</el-button>
+                    <el-button @click="addCancel">取 消</el-button>
+                </div>
             </template>
-          </el-table-column>
-        </el-table>
-      </div>
-      <!-- <div class="tjm_cart_pagination">
-        <el-pagination background layout="prev, pager, next" :total="total" @current-change="currentChange" />
-      </div> -->
-    </el-card>
-    <!-- 新增/编辑 -->
-    <el-dialog :title="dialogTitle" v-model="addShow" append-to-body @close="resetForm">
-      <el-form ref="userRef" :model="form" :rules="rules" label-width="100px">
-        <el-row>
-          <el-col :span="24">
-            <el-form-item label="父级节点" prop="parentId">
-              <el-input
-                v-model="form.parentId"
-                placeholder="--"
-                disabled
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="24">
-            <el-form-item label="部门名称" prop="name">
-              <el-input
-                v-model="form.name"
-                placeholder="请输入部门名称"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="24">
-            <el-form-item label="部门代码" prop="code">
-              <el-input
-                v-model="form.code"
-                placeholder="请输入部门代码"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="24">
-            <el-form-item label="部门描述" prop="description">
-              <el-input
-                v-model="form.description"
-                placeholder="请输入部门描述"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="24">
-            <el-form-item label="部门排序" prop="sort">
-              <el-input-number v-model="form.sort" :min="0" :max="1000" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="24">
-            <el-form-item label="部门状态" prop="state">
-              <el-switch v-model="form.state" />
-            </el-form-item>
-          </el-col>
-        </el-row>
-      </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="primary" @click="submitForm">确 定</el-button>
-          <el-button @click="addCancel">取 消</el-button>
-        </div>
-      </template>
-    </el-dialog>
-  </div>
+        </el-dialog>
+    </div>
 </template>
 
 <script setup>
@@ -174,8 +167,8 @@ const loading = ref(false) //加载
 const total = ref(0)
 //查询
 const params = ref({
-  page: 1,
-  size: 20
+    page: 1,
+    size: 20
 })
 const isExpandAll = ref(true) //展  开
 const tableData = ref([])  //展示数据
@@ -185,162 +178,162 @@ const dialogTitle = ref('新增')
 const addShow = ref(false)
 
 const form = ref({
-  name: null,
-  code: null,
-  state: true,
-  description: null,
-  sort: 0,
+    name: null,
+    code: null,
+    state: true,
+    description: null,
+    sort: 0,
 })
 const rules = ref({
-  name: [{ required: true, message: '部门名称不能为空', trigger: 'blur' }],
-  code: [{ required: true, message: '部门代码不能为空', trigger: 'blur' }],
+    name: [{ required: true, message: '部门名称不能为空', trigger: 'blur' }],
+    code: [{ required: true, message: '部门代码不能为空', trigger: 'blur' }],
 })
 
 const { proxy } = getCurrentInstance()
 
-function loadTalbeTree(tree, treeNode, resolve){
+function loadTalbeTree(tree, treeNode, resolve) {
     const idCopy = JSON.parse(JSON.stringify(tree.idList))
-      let resolveArr = allTableData.value 
-      let id
-      while (id = tree.idList.shift()) {
+    let resolveArr = allTableData.value
+    let id
+    while (id = tree.idList.shift()) {
         const tarItem = resolveArr.find(item => item.id === id)
         tarItem.loadedChildren = true
         resolveArr = tarItem.children
-      }      
-      resolveArr = JSON.parse(JSON.stringify(resolveArr))
-      resolveArr.forEach(item => {
+    }
+    resolveArr = JSON.parse(JSON.stringify(resolveArr))
+    resolveArr.forEach(item => {
         item.hasChildren = item.children && item.children.length > 0
         item.children = null
         item.idList = JSON.parse(JSON.stringify(idCopy))
         item.idList.push(item.id)
-      })
-      tree.loadedChildren = true
-      resolve(resolveArr)
+    })
+    tree.loadedChildren = true
+    resolve(resolveArr)
 }
 function getList() {
-  loading.value = true
-  getMainList().then(res=>{
-    loading.value = false
-    if (res.code === 200) {
-      allTableData.value = res.data || []
-      tableData.value = JSON.parse(JSON.stringify(res.data)).map(item => {
-        item.hasChildren = item.children && item.children.length > 0
-        item.children = null
-        item.idList = [item.id]
-        return item
-      })
-    }
-  }).catch(()=>{
-    loading.value = false
-  })
+    loading.value = true
+    getMainList().then(res => {
+        loading.value = false
+        if (res.code === 200) {
+            allTableData.value = res.data || []
+            tableData.value = JSON.parse(JSON.stringify(res.data)).map(item => {
+                item.hasChildren = item.children && item.children.length > 0
+                item.children = null
+                item.idList = [item.id]
+                return item
+            })
+        }
+    }).catch(() => {
+        loading.value = false
+    })
 }
-function currentChange(e){
-  params.value.page=e
-  getList()
+function currentChange(e) {
+    params.value.page = e
+    getList()
 }
 
-function addItem(row){
-  console.log(row)
-  form.value.parentId = row.id
-  dialogTitle.value = '新增'
-  addShow.value = true
+function addItem(row) {
+    console.log(row)
+    form.value.parentId = row.id
+    dialogTitle.value = '新增'
+    addShow.value = true
 }
 
-function editItem(row){
-  console.log(row)
-  form.value.parentId = row.parentId
-  form.value.id = row.id
-  form.value.name = row.name
-  form.value.code = row.code
-  form.value.description = row.description
-  form.value.sort = row.sort
-  form.value.state = row.state === 0
-  dialogTitle.value = '编辑'
-  addShow.value = true
+function editItem(row) {
+    console.log(row)
+    form.value.parentId = row.parentId
+    form.value.id = row.id
+    form.value.name = row.name
+    form.value.code = row.code
+    form.value.description = row.description
+    form.value.sort = row.sort
+    form.value.state = row.state === 0
+    dialogTitle.value = '编辑'
+    addShow.value = true
 }
 function addCancel() {
-  addShow.value = false
-  resetForm()
+    addShow.value = false
+    resetForm()
 }
 function resetForm() {
-  form.value = {
-    name: null,
-    code: null,
-    state: true,
-    description: null,
-    sort: 0
-  }
-  if (proxy.$refs['userRef']) {
-    proxy.$refs['userRef'].resetFields()
-  }
-  console.log('重置表单')
+    form.value = {
+        name: null,
+        code: null,
+        state: true,
+        description: null,
+        sort: 0
+    }
+    if (proxy.$refs['userRef']) {
+        proxy.$refs['userRef'].resetFields()
+    }
+    console.log('重置表单')
 }
 
 function submitForm() {
-  proxy.$refs['userRef'].validate(valid => {
-    if (valid) {
-      if (form.value.id) {
-        console.log('修改表单')
-        const params = {
-          ...form.value
+    proxy.$refs['userRef'].validate(valid => {
+        if (valid) {
+            if (form.value.id) {
+                console.log('修改表单')
+                const params = {
+                    ...form.value
+                }
+                params.state = params.state ? 0 : 1
+                setDepart(params).then(res => {
+                    if (res.code === 200) {
+                        ElMessage({
+                            message: '修改成功',
+                            type: 'success'
+                        })
+                        addShow.value = false
+                        resetForm()
+                        getList()
+                    }
+                })
+            } else {
+                console.log('新增表单')
+                const params = {
+                    ...form.value
+                }
+                params.state = params.state ? 0 : 1
+                addDepart(params).then(res => {
+                    if (res.code === 200) {
+                        ElMessage({
+                            message: '新增成功',
+                            type: 'success'
+                        })
+                        addShow.value = false
+                        resetForm()
+                        getList()
+                    }
+                })
+            }
         }
-        params.state = params.state ? 0 : 1
-        setDepart(params).then(res=>{
-          if (res.code === 200) {
-            ElMessage({
-              message: '修改成功',
-              type: 'success'
-            })
-            addShow.value = false
-            resetForm()
-            getList()
-          }
-        })
-      }else {
-        console.log('新增表单')
-        const params = {
-          ...form.value
-        }
-        params.state = params.state ? 0 : 1
-        addDepart(params).then(res=>{
-          if (res.code === 200) {
-            ElMessage({
-              message: '新增成功',
-              type: 'success'
-            })
-            addShow.value = false
-            resetForm()
-            getList()
-          }
-        })
-      }
-    }
-  })
+    })
 }
 
 function deleteDepartClick(row) {
-  ElMessageBox.confirm('是否确认删除"' + row.name + '"?', '删除警告', {
-    confirmButtonText: '确定',
-    cancelButtonText: '取消',
-    type: 'warning'
-  }).then(() => {
-    deleteDepart(row.id).then(res=>{
-      if (res.code === 200) {
-        ElMessage({
-          message: '删除成功',
-          type: 'success'
-        })
-        getList()
-      }else {
-        ElMessage({
-          message: res.msg,
-          type: 'error'
+    ElMessageBox.confirm('是否确认删除"' + row.name + '"?', '删除警告', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+    }).then(() => {
+        deleteDepart(row.id).then(res => {
+            if (res.code === 200) {
+                ElMessage({
+                    message: '删除成功',
+                    type: 'success'
+                })
+                getList()
+            } else {
+                ElMessage({
+                    message: res.msg,
+                    type: 'error'
+                })
+            }
         })
-      }
     })
-  })
 }
- getList()
+getList()
 </script>
 
-<style lang="scss" scoped></style>
+<style lang="scss" scoped></style>

+ 449 - 469
src/views/system/menu.vue

@@ -1,301 +1,282 @@
 <template>
-  <div>
-    <el-card class="tjm_card_style_custom">
-      <div class="tjm_card_title">查询表格</div>
-      <div class="tjm_card_select">
-        <div class="tjm_card_select_left">
-          <el-form
-            :inline="true"
-            :model="formInline"
-            label-width="80px"
-            :label-position="'left'"
-          >
-            <el-form-item label="菜单名称">
-              <el-input
-                style="width: 100%"
-                v-model="formInline.name"
-                placeholder="请输入"
-                clearable
-              />
-            </el-form-item>
-            <el-form-item label="创建时间">
-              <el-date-picker
-                v-model="formInline.date"
-                type="daterange"
-                placeholder="Pick a date"
-                clearable
-              />
-            </el-form-item>
-            <el-form-item label="菜单状态">
-              <el-select
-                v-model="formInline.status"
-                clearable
-                placeholder="请选择"
-              >
-                <el-option label="启用" value="1" />
-                <el-option label="禁用" value="2" />
-              </el-select>
-            </el-form-item>
-            <el-form-item>
-              <el-button type="primary">
-                <el-icon class="tjm_btn_icon_right" size="16"
+    <div>
+        <el-card class="tjm_card_style_custom">
+            <div class="tjm_card_title">查询表格</div>
+            <div class="tjm_card_select">
+                <div class="tjm_card_select_left">
+                <el-form
+                    :inline="true"
+                    :model="formInline"
+                    label-width="80px"
+                    :label-position="'left'"
                 >
-                  <tjm-icon-ep-Plus
-                  />
-                </el-icon>
-                搜索
-              </el-button>
-              <el-button>
-                <el-icon class="tjm_btn_icon_right" size="16"
-                >
-                  <tjm-icon-ep-RefreshRight
-                  />
-                </el-icon>
-                重置
-              </el-button>
-            </el-form-item>
-          </el-form>
-        </div>
-      </div>
-      <el-divider />
+                    <el-form-item label="菜单名称">
+                    <el-input
+                        style="width: 100%"
+                        v-model="formInline.name"
+                        placeholder="请输入"
+                        clearable
+                    />
+                    </el-form-item>
+                    <el-form-item label="创建时间">
+                    <el-date-picker
+                        v-model="formInline.date"
+                        type="daterange"
+                        placeholder="Pick a date"
+                        clearable
+                    />
+                    </el-form-item>
+                    <el-form-item label="菜单状态">
+                    <el-select
+                        v-model="formInline.status"
+                        clearable
+                        placeholder="请选择"
+                    >
+                        <el-option label="启用" value="1" />
+                        <el-option label="禁用" value="2" />
+                    </el-select>
+                    </el-form-item>
+                    <el-form-item>
+                    <el-button type="primary">
+                        <el-icon class="tjm_btn_icon_right">
+                        <tjm-icon-ep-Plus />
+                        </el-icon>
+                        搜索
+                    </el-button>
+                    <el-button>
+                        <el-icon class="tjm_btn_icon_right">
+                        <tjm-icon-ep-RefreshRight />
+                        </el-icon>
+                        重置
+                    </el-button>
+                    </el-form-item>
+                </el-form>
+                </div>
+            </div>
+            <el-divider />
 
-      <div class="tjm_card_table">
-        <el-table
-          header-cell-class-name="tjm_card_table_header"
-          :data="tableData"
-          v-loading="loading"
-          border
-          style="width: 100%"
-          :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
-          row-key="id"
-          :default-expand-all="isExpandAll"
-        >
-          <el-table-column type="selection" width="55" />
-          <el-table-column prop="name" label="菜单名称" width="180" />
-          <el-table-column prop="path" label="菜单路由" />
-          <el-table-column prop="type" label="类型" width="120">
-            <template #default="scope">
-              <el-button
-                :type="scope.row.type == 1 ? 'primary' : 'success'"
-                text
-              >
-                {{ scope.row.type == 1 ? '菜单' : '按钮' }}
-              </el-button
-              >
-            </template>
-          </el-table-column>
-          <el-table-column prop="type" label="设备" width="120">
-            <template #default="scope">
-              <el-button
-                :type="scope.row.menuType != 2 ? 'primary' : 'success'"
-                text
-              >
-                {{ scope.row.menuType == 1 ? 'Cloud端' : scope.row.menuType == 2 ? 'APP端' : 'Boot端' }}
-              </el-button
-              >
-            </template>
-          </el-table-column>
-          <el-table-column prop="icon" label="图标" width="150">
-            <!-- <template #default="scope">
-              <el-icon size="18">
-                <component :is="scope.row.icon" />
-              </el-icon>
-            </template> -->
-          </el-table-column>
-          <el-table-column prop="sort" label="排序" width="150" />
-          <el-table-column prop="ope" label="操作" width="220">
-            <template #default="scope">
-              <el-button
-                link
-                type="primary"
-                icon="Edit"
-                @click="handleUpdate(scope.row)"
-              >修改
-              </el-button
-              >
-              <el-button
-                link
-                type="primary"
-                icon="Plus"
-                @click="handleAdd(scope.row)"
-              >新增
-              </el-button
-              >
-              <el-button
-                link
-                type="primary"
-                icon="Delete"
-                @click="handleDelete(scope.row)"
-              >删除
-              </el-button
-              >
-            </template>
-          </el-table-column>
-        </el-table>
-      </div>
-    </el-card>
-    <!-- 编辑 -->
-    <el-dialog :title="title" v-model="open" width="680px" append-to-body>
-      <el-form ref="menuRef" :model="form" :rules="rules" label-width="100px">
-        <el-row>
-          <el-col :span="24">
-            <el-form-item label="上级菜单" prop="parentId">
-              <el-tree-select
-                style="width: 100%"
-                v-model="form.parentId"
-                :data="selectTableData"
-                :props="{ value: 'id', label: 'name', children: 'children' }"
-                value-key="id"
-                placeholder="选择上级菜单"
-                check-strictly
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="24">
-            <el-form-item label="菜单名称" prop="name">
-              <el-input
-                v-model="form.name"
-                placeholder="请输入菜单名称"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="24">
-            <el-form-item label="菜单代码" prop="code">
-              <el-input
-                v-model="form.code"
-                placeholder="请输入菜单代码"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="24">
-            <el-form-item label="菜单图标">
-              <el-popover
-                placement="bottom-start"
-                :width="540"
-                v-model:visible="showChooseIcon"
-                trigger="click"
-                @show="showSelectIcon"
-              >
-                <template #reference>
-                  <el-input
-                    v-model="form.icon"
-                    placeholder="点击选择图标"
-                    @blur="showSelectIcon"
-                    v-click-outside="hideSelectIcon"
-                    readonly
-                  >
-                    <template #prefix v-if="form.icon">
-                      <el-icon
-                        size="16"
-                        class="el-input__icon"
-                        v-if="form.icon.indexOf('ep') !== -1"
-                      >
-                        <component :is="form.icon.slice(2)" />
-                      </el-icon>
-                      <svg-icon
-                        v-else-if="form.icon.indexOf('tjm') !== -1"
-                        :icon-class="form.icon.slice(4)"
-                        class="el-input__icon"
-                        style="height: 16px; width: 16px"
-                      />
+            <div class="tjm_card_table">
+                <el-table
+                    header-cell-class-name="tjm_card_table_header"
+                    :data="tableData"
+                    v-loading="loading"
+                    border
+                    style="width: 100%"
+                    :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
+                    row-key="id"
+                    :default-expand-all="isExpandAll"
+                >
+                    <el-table-column type="selection" width="55" />
+                    <el-table-column prop="name" label="菜单名称" width="180" />
+                    <el-table-column prop="path" label="菜单路由" />
+                    <el-table-column prop="type" label="类型" width="120">
+                        <template #default="scope">
+                            <el-button :type="scope.row.type == 1 ? 'primary' : 'success'" text>
+                                {{ scope.row.type == 1 ? '菜单' : '按钮' }}
+                            </el-button>
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="type" label="设备" width="120">
+                        <template #default="scope">
+                            <el-button :type="scope.row.menuType != 2 ? 'primary' : 'success'" text>
+                                {{ scope.row.menuType == 1 ? 'Cloud端' : scope.row.menuType == 2 ? 'APP端' : 'Boot端' }}
+                            </el-button>
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="icon" label="图标" width="150">
+                        <!-- <template #default="scope">
+                            <el-icon size="18">
+                                <component :is="scope.row.icon" />
+                            </el-icon>
+                        </template> -->
+                    </el-table-column>
+                    <el-table-column prop="sort" label="排序" width="150" />
+                    <el-table-column prop="ope" label="操作" width="220">
+                        <template #default="scope">
+                            <el-button
+                                link
+                                type="primary"
+                                icon="Edit"
+                                @click="handleUpdate(scope.row)"
+                            >修改</el-button>
+                            <el-button
+                                link
+                                type="primary"
+                                icon="Plus"
+                                @click="handleAdd(scope.row)"
+                            >新增</el-button>
+                            <el-button
+                                link
+                                type="primary"
+                                icon="Delete"
+                                @click="handleDelete(scope.row)"
+                            >删除</el-button>
+                        </template>
+                    </el-table-column>
+                </el-table>
+            </div>
+        </el-card>
 
-                      <el-icon v-else style="height: 32px; width: 16px"
-                      >
-                        <search
-                        />
-                      </el-icon>
-                    </template>
-                  </el-input>
-                </template>
-                <icon-select
-                  ref="iconSelectRef"
-                  @selected="selected"
-                  :active-icon="form.icon"
-                />
-              </el-popover>
-            </el-form-item>
-          </el-col>
-          <el-col :span="24">
-            <el-form-item label="菜单描述">
-              <el-input
-                v-model="form.description"
-                placeholder="请输入菜单描述"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="24">
-            <el-form-item label="菜单状态">
-              <el-radio-group v-model="form.state" @change="changeType">
-                <el-radio :label="0">启用</el-radio>
-                <el-radio :label="1">禁用</el-radio>
-              </el-radio-group>
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="菜单路径" prop="path">
-              <el-input
-                v-model="form.path"
-                placeholder="菜单路径(需要与资源路径一致)"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="组件路径">
-              <el-input v-model="form.path" disabled clearable />
-            </el-form-item>
-          </el-col>
+        <!-- 编辑 -->
+        <el-dialog :title="title" v-model="open" width="680px" append-to-body>
+            <el-form ref="menuRef" :model="form" :rules="rules" label-width="100px">
+                <el-row>
+                    <el-col :span="24">
+                        <el-form-item label="上级菜单" prop="parentId">
+                            <el-tree-select
+                                style="width: 100%"
+                                v-model="form.parentId"
+                                :data="selectTableData"
+                                :props="{ value: 'id', label: 'name', children: 'children' }"
+                                value-key="id"
+                                placeholder="选择上级菜单"
+                                check-strictly
+                            />
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="24">
+                        <el-form-item label="菜单名称" prop="name">
+                            <el-input
+                                v-model="form.name"
+                                placeholder="请输入菜单名称"
+                                clearable
+                            />
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="24">
+                        <el-form-item label="菜单代码" prop="code">
+                            <el-input
+                                v-model="form.code"
+                                placeholder="请输入菜单代码"
+                                clearable
+                            />
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="24">
+                        <el-form-item label="菜单图标">
+                            <el-popover
+                                placement="bottom-start"
+                                :width="540"
+                                v-model:visible="showChooseIcon"
+                                trigger="click"
+                                @show="showSelectIcon"
+                            >
+                                <template #reference>
+                                    <el-input
+                                        v-model="form.icon"
+                                        placeholder="点击选择图标"
+                                        @blur="showSelectIcon"
+                                        v-click-outside="hideSelectIcon"
+                                        readonly
+                                    >
+                                        <template #prefix v-if="form.icon">
+                                            <el-icon
+                                                size="16"
+                                                class="el-input__icon"
+                                                v-if="form.icon.indexOf('ep') !== -1"
+                                            >
+                                                <component :is="form.icon.slice(2)" />
+                                            </el-icon>
+                                            <svg-icon
+                                                v-else-if="form.icon.indexOf('tjm') !== -1"
+                                                :icon-class="form.icon.slice(4)"
+                                                class="el-input__icon"
+                                                style="height: 16px; width: 16px"
+                                            />
+                                            <el-icon v-else style="height: 32px; width: 16px">
+                                                <search />
+                                            </el-icon>
+                                        </template>
+                                    </el-input>
+                                </template>
+                                <icon-select
+                                    ref="iconSelectRef"
+                                    @selected="selected"
+                                    :active-icon="form.icon"
+                                />
+                            </el-popover>
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="24">
+                        <el-form-item label="菜单描述">
+                            <el-input
+                                v-model="form.description"
+                                placeholder="请输入菜单描述"
+                                clearable
+                            />
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="24">
+                        <el-form-item label="菜单状态">
+                            <el-radio-group v-model="form.state" @change="changeType">
+                                <el-radio :label="0">启用</el-radio>
+                                <el-radio :label="1">禁用</el-radio>
+                            </el-radio-group>
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="12">
+                        <el-form-item label="菜单路径" prop="path">
+                            <el-input
+                                v-model="form.path"
+                                placeholder="菜单路径(需要与资源路径一致)"
+                                clearable
+                            />
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="12">
+                        <el-form-item label="组件路径">
+                            <el-input v-model="form.path" disabled clearable />
+                        </el-form-item>
+                    </el-col>
 
-          <el-col :span="12">
-            <el-form-item label="菜单类型">
-              <el-radio-group v-model="form.type" @change="changeType">
-                <el-radio :label="1">菜单</el-radio>
-                <el-radio :label="2">按钮</el-radio>
-              </el-radio-group>
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="设备类型">
-              <el-radio-group v-model="form.menuType" @change="changeType">
-                <!-- <el-radio :label="1">Cloud端</el-radio> -->
-                <el-radio :label="3">Boot端</el-radio>
-                <el-radio :label="2">APP端</el-radio>
-              </el-radio-group>
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="系统选择">
-              <el-input
-                v-model="form.systemCode"
-                disabled
-                placeholder="请选择系统"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="菜单排序">
-              <el-input
-                v-model="form.sort"
-                placeholder="请输入菜单排序"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-      </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="primary" @click="submitForm">确 定</el-button>
-          <el-button @click="cancel">取 消</el-button>
-        </div>
-      </template>
-    </el-dialog>
-  </div>
+                    <el-col :span="12">
+                        <el-form-item label="菜单类型">
+                            <el-radio-group v-model="form.type" @change="changeType">
+                                <el-radio :label="1">菜单</el-radio>
+                                <el-radio :label="2">按钮</el-radio>
+                            </el-radio-group>
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="12">
+                        <el-form-item label="设备类型">
+                            <el-radio-group v-model="form.menuType" @change="changeType">
+                                <!-- <el-radio :label="1">Cloud端</el-radio> -->
+                                <el-radio :label="3">Boot端</el-radio>
+                                <el-radio :label="2">APP端</el-radio>
+                            </el-radio-group>
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="12">
+                        <el-form-item label="系统选择">
+                            <el-input
+                                v-model="form.systemCode"
+                                disabled
+                                placeholder="请选择系统"
+                                clearable
+                            />
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="12">
+                        <el-form-item label="菜单排序">
+                            <el-input
+                                v-model="form.sort"
+                                placeholder="请输入菜单排序"
+                                clearable
+                            />
+                        </el-form-item>
+                    </el-col>
+                </el-row>
+            </el-form>
+            <template #footer>
+                <div class="dialog-footer">
+                    <el-button type="primary" @click="submitForm">确 定</el-button>
+                    <el-button @click="cancel">取 消</el-button>
+                </div>
+            </template>
+        </el-dialog>
+    </div>
 </template>
+
 <script setup>
 import { getMenuTree, addMenu, modMenu, delMenu } from '@/api/system/menu.js'
 import { watch } from 'vue'
@@ -313,84 +294,84 @@ const formInline = ref({})
 const open = ref(false)
 const title = ref('')
 const data = reactive({
-  form: {
-    parentId: '1',
-    type: 1,
-    state: 0,
-    menuType: 3,
-    systemCode: 10001,
-    sort: 0
-  },
-  rules: {
-    id: [{ required: true, message: '上级菜单不能为空', trigger: 'blur' }],
-    name: [{ required: true, message: '菜单名称不能为空', trigger: 'blur' }],
-    code: [{ required: true, message: '菜单代码不能为空', trigger: 'blur' }],
-    path: [{ required: true, message: '菜单路径不能为空', trigger: 'blur' }]
-  }
+    form: {
+        parentId: '1',
+        type: 1,
+        state: 0,
+        menuType: 3,
+        systemCode: 10001,
+        sort: 0
+    },
+    rules: {
+        id: [{ required: true, message: '上级菜单不能为空', trigger: 'blur' }],
+        name: [{ required: true, message: '菜单名称不能为空', trigger: 'blur' }],
+        code: [{ required: true, message: '菜单代码不能为空', trigger: 'blur' }],
+        path: [{ required: true, message: '菜单路径不能为空', trigger: 'blur' }]
+    }
 })
 
 function reset() {
-  form.value = {
-    parentId: '1',
-    type: 1,
-    state: 0,
-    menuType: 3,
-    systemCode: 10001,
-    sort: 0
-  }
-  if (proxy.$refs['menuRef']) {
-    proxy.$refs['menuRef'].resetFields()
-  }
+    form.value = {
+        parentId: '1',
+        type: 1,
+        state: 0,
+        menuType: 3,
+        systemCode: 10001,
+        sort: 0
+    }
+    if (proxy.$refs['menuRef']) {
+        proxy.$refs['menuRef'].resetFields()
+    }
 }
 
 const { form, rules } = toRefs(data)
 
 function submitForm() {
-  proxy.$refs['menuRef'].validate(valid => {
-    if (valid) {
-      if (form.value.id != undefined) {
-        modMenu(form.value).then(res => {
-          console.log(res)
-          if (res.code == 200) {
-            ElMessage({
-              message: res.msg,
-              type: 'success'
-            })
-            getMenuTreeList()
-            open.value = false
-          } else {
-            ElMessage({
-              message: res.msg,
-              type: warning
-            })
-          }
-        })
-      } else {
-        addMenu(form.value).then(res => {
-          console.log(res)
-          if (res.code == 200) {
-            getMenuTreeList()
-            open.value = false
-            ElMessage({
-              message: res.msg,
-              type: 'success'
-            })
-          } else {
-            ElMessage({
-              message: res.msg,
-              type: warning
-            })
-          }
-        })
-      }
-    } else {
-      console.log('检验不通过')
-    }
-  })
+    proxy.$refs['menuRef'].validate(valid => {
+        if (valid) {
+            if (form.value.id != undefined) {
+                modMenu(form.value).then(res => {
+                    console.log(res)
+                    if (res.code == 200) {
+                        ElMessage({
+                            message: res.msg,
+                            type: 'success'
+                        })
+                        getMenuTreeList()
+                        open.value = false
+                    } else {
+                        ElMessage({
+                            message: res.msg,
+                            type: warning
+                        })
+                    }
+                })
+            } else {
+                addMenu(form.value).then(res => {
+                    console.log(res)
+                    if (res.code == 200) {
+                        getMenuTreeList()
+                        open.value = false
+                        ElMessage({
+                            message: res.msg,
+                            type: 'success'
+                        })
+                    } else {
+                        ElMessage({
+                            message: res.msg,
+                            type: warning
+                        })
+                    }
+                })
+            }
+        } else {
+            console.log('检验不通过')
+        }
+    })
 }
 
 function cancel() {
-  open.value = false
+    open.value = false
 }
 
 //
@@ -398,55 +379,55 @@ onMounted(() => {
 })
 
 function getMenuTreeList() {
-  getMenuTree(10001).then(res => {
-    console.log("获取的菜单",res)
-    if (res.code === 200) {
-      if (res.data.length && res.data[0].children) {
-        // const array = []
-        // res.data[0].children.forEach((item) => {
-        //   if (item.menuType === 3) {
-        //     array.push(item)
-        //   }
-        // })
-        tableData.value = res.data
-      }else {
-        tableData.value = res.data
-      }
-    }
-  })
+    getMenuTree(10001).then(res => {
+        console.log("获取的菜单", res)
+        if (res.code === 200) {
+            if (res.data.length && res.data[0].children) {
+                // const array = []
+                // res.data[0].children.forEach((item) => {
+                //   if (item.menuType === 3) {
+                //     array.push(item)
+                //   }
+                // })
+                tableData.value = res.data
+            } else {
+                tableData.value = res.data
+            }
+        }
+    })
 }
 
 //处理添加菜单时选择父级 当选择父级拥有按钮子级时候不可同时作为按钮与菜单的父级
 watch(tableData, () => {
-  selectTableData.value = JSON.parse(JSON.stringify(tableData.value))
-  dealTreeRemBtn(selectTableData.value, true)
-  form.value.type = 1
+    selectTableData.value = JSON.parse(JSON.stringify(tableData.value))
+    dealTreeRemBtn(selectTableData.value, true)
+    form.value.type = 1
 })
 
 function dealTreeRemBtn(arr, disabled = false) {
-  arr.forEach(item => {
-    if (item.type == 2) {
-      item.disabled = true
-    } else if (
-      item.children &&
-      item.children.length > 0 &&
-      item.children[0].type == 2
-    ) {
-      item.disabled = disabled
-      dealTreeRemBtn(item.children, disabled)
-    } else {
-      dealTreeRemBtn(item.children, disabled)
-    }
-  })
+    arr.forEach(item => {
+        if (item.type == 2) {
+            item.disabled = true
+        } else if (
+            item.children &&
+            item.children.length > 0 &&
+            item.children[0].type == 2
+        ) {
+            item.disabled = disabled
+            dealTreeRemBtn(item.children, disabled)
+        } else {
+            dealTreeRemBtn(item.children, disabled)
+        }
+    })
 }
 
 //类型更改
 function changeType(e) {
-  if (e == 1) {
-    dealTreeRemBtn(selectTableData.value, true)
-  } else {
-    dealTreeRemBtn(selectTableData.value, false)
-  }
+    if (e == 1) {
+        dealTreeRemBtn(selectTableData.value, true)
+    } else {
+        dealTreeRemBtn(selectTableData.value, false)
+    }
 }
 
 //icon
@@ -455,102 +436,101 @@ const iconSelectRef = ref(null)
 
 // 展示下拉图标
 function showSelectIcon() {
-  iconSelectRef.value.reset()
-  showChooseIcon.value = true
+    iconSelectRef.value.reset()
+    showChooseIcon.value = true
 }
 
 // 选择图标
 function selected(name) {
-  form.value.icon = name
-  showChooseIcon.value = false
+    form.value.icon = name
+    showChooseIcon.value = false
 }
 
 // 图标外层点击隐藏下拉列表
 function hideSelectIcon(event) {
-  var elem =
-    event.relatedTarget ||
-    event.srcElement ||
-    event.target ||
-    event.currentTarget
-  var className = elem.className
-  if (className !== 'el-input__inner') {
-    showChooseIcon.value = false
-  }
+    var elem =
+        event.relatedTarget ||
+        event.srcElement ||
+        event.target ||
+        event.currentTarget
+    var className = elem.className
+    if (className !== 'el-input__inner') {
+        showChooseIcon.value = false
+    }
 }
 
 //新增
 function handleAdd(row) {
-  reset()
-  if (row != null && row.id) {
-    form.value.parentId = row.id
-  } else {
-    form.value.parentId = '1'
-  }
-  open.value = true
-  title.value = '添加菜单'
+    reset()
+    if (row != null && row.id) {
+        form.value.parentId = row.id
+    } else {
+        form.value.parentId = '1'
+    }
+    open.value = true
+    title.value = '添加菜单'
 }
 
 //修改
 async function handleUpdate(row) {
-  reset()
-  let {
-    code,
-    description,
-    icon,
-    id,
-    menuType,
-    name,
-    parentId,
-    path,
-    sort,
-    state,
-    type
-  } = row
-  form.value = {
-    code,
-    description,
-    icon,
-    id,
-    menuType,
-    name,
-    parentId: parentId.toString(),
-    path,
-    sort,
-    state,
-    type
-  }
-  console.log(form.value)
-  open.value = true
-  title.value = '修改菜单'
+    reset()
+    let {
+        code,
+        description,
+        icon,
+        id,
+        menuType,
+        name,
+        parentId,
+        path,
+        sort,
+        state,
+        type
+    } = row
+    form.value = {
+        code,
+        description,
+        icon,
+        id,
+        menuType,
+        name,
+        parentId: parentId.toString(),
+        path,
+        sort,
+        state,
+        type
+    }
+    console.log(form.value)
+    open.value = true
+    title.value = '修改菜单'
 }
 
 //删除
 function handleDelete(row) {
-  ElMessageBox.confirm('是否确认删除"' + row.name + '"?', '删除警告', {
-    confirmButtonText: '确定',
-    cancelButtonText: '取消',
-    type: 'warning'
-  }).then(() => {
-    delMenu({ id: row.id }).then(res => {
-      console.log(res)
-      if (res.code == 200) {
-        getMenuTreeList()
-        ElMessage({
-          message: res.msg,
-          type: 'success'
+    ElMessageBox.confirm('是否确认删除"' + row.name + '"?', '删除警告', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+    }).then(() => {
+        delMenu({ id: row.id }).then(res => {
+            console.log(res)
+            if (res.code == 200) {
+                getMenuTreeList()
+                ElMessage({
+                    message: res.msg,
+                    type: 'success'
+                })
+            } else {
+                ElMessage({
+                    message: res.msg,
+                    type: warning
+                })
+            }
         })
-      } else {
-        ElMessage({
-          message: res.msg,
-          type: warning
-        })
-      }
     })
-  })
 }
 
 getMenuTreeList()
 </script>
 
-
-<style lang="scss" scoped></style>
+<style lang="scss" scoped></style>

+ 425 - 434
src/views/system/role.vue

@@ -1,240 +1,231 @@
 <template>
-  <div>
-    <el-card class="tjm_card_style_custom">
-      <!--      <div class="tjm_card_title">查询表格</div>-->
-      <!--      <div class="tjm_card_select">-->
-      <!--        <div class="tjm_card_select_left">-->
-      <!--          <el-form-->
-      <!--            :inline="true"-->
-      <!--            :model="formInline"-->
-      <!--            label-width="80px"-->
-      <!--            :label-position="'left'"-->
-      <!--          >-->
-      <!--            <el-form-item label="角色名称">-->
-      <!--              <el-input-->
-      <!--                v-model="formInline.name"-->
-      <!--                placeholder="请输入"-->
-      <!--                clearable-->
-      <!--              />-->
-      <!--            </el-form-item>-->
-      <!--            <el-form-item label="角色编码">-->
-      <!--              <el-input-->
-      <!--                v-model="formInline.code"-->
-      <!--                placeholder="请输入"-->
-      <!--                clearable-->
-      <!--              />-->
-      <!--            </el-form-item>-->
-      <!--            <el-form-item label="创建时间">-->
-      <!--              <el-date-picker-->
-      <!--                v-model="formInline.date"-->
-      <!--                type="daterange"-->
-      <!--                placeholder="Pick a date"-->
-      <!--                clearable-->
-      <!--              />-->
-      <!--            </el-form-item>-->
-      <!--            <el-form-item label="角色状态">-->
-      <!--              <el-select-->
-      <!--                v-model="formInline.status"-->
-      <!--                clearable-->
-      <!--                placeholder="请选择"-->
-      <!--              >-->
-      <!--                <el-option label="启用" value="1" />-->
-      <!--                <el-option label="禁用" value="2" />-->
-      <!--              </el-select>-->
-      <!--            </el-form-item>-->
-      <!--          </el-form>-->
-      <!--        </div>-->
-      <!--        <div class="tjm_card_select_right">-->
-      <!--          <div>-->
-      <!--            <el-button type="primary">-->
-      <!--              <el-icon class="tjm_btn_icon_right" size="16"-->
-      <!--              >-->
-      <!--                <tjm-icon-ep-Plus-->
-      <!--                />-->
-      <!--              </el-icon>-->
-      <!--              搜索-->
-      <!--            </el-button>-->
-      <!--          </div>-->
+    <div>
+        <el-card class="tjm_card_style_custom">
+        <!--      <div class="tjm_card_title">查询表格</div>-->
+        <!--      <div class="tjm_card_select">-->
+        <!--        <div class="tjm_card_select_left">-->
+        <!--          <el-form-->
+        <!--            :inline="true"-->
+        <!--            :model="formInline"-->
+        <!--            label-width="80px"-->
+        <!--            :label-position="'left'"-->
+        <!--          >-->
+        <!--            <el-form-item label="角色名称">-->
+        <!--              <el-input-->
+        <!--                v-model="formInline.name"-->
+        <!--                placeholder="请输入"-->
+        <!--                clearable-->
+        <!--              />-->
+        <!--            </el-form-item>-->
+        <!--            <el-form-item label="角色编码">-->
+        <!--              <el-input-->
+        <!--                v-model="formInline.code"-->
+        <!--                placeholder="请输入"-->
+        <!--                clearable-->
+        <!--              />-->
+        <!--            </el-form-item>-->
+        <!--            <el-form-item label="创建时间">-->
+        <!--              <el-date-picker-->
+        <!--                v-model="formInline.date"-->
+        <!--                type="daterange"-->
+        <!--                placeholder="Pick a date"-->
+        <!--                clearable-->
+        <!--              />-->
+        <!--            </el-form-item>-->
+        <!--            <el-form-item label="角色状态">-->
+        <!--              <el-select-->
+        <!--                v-model="formInline.status"-->
+        <!--                clearable-->
+        <!--                placeholder="请选择"-->
+        <!--              >-->
+        <!--                <el-option label="启用" value="1" />-->
+        <!--                <el-option label="禁用" value="2" />-->
+        <!--              </el-select>-->
+        <!--            </el-form-item>-->
+        <!--          </el-form>-->
+        <!--        </div>-->
+        <!--        <div class="tjm_card_select_right">-->
+        <!--          <div>-->
+        <!--            <el-button type="primary">-->
+        <!--              <el-icon class="tjm_btn_icon_right">-->
+        <!--                <tjm-icon-ep-Plus />-->
+        <!--              </el-icon>-->
+        <!--              搜索-->
+        <!--            </el-button>-->
+        <!--          </div>-->
 
-      <!--          <div>-->
-      <!--            <el-button>-->
-      <!--              <el-icon class="tjm_btn_icon_right" size="16"-->
-      <!--              >-->
-      <!--                <tjm-icon-ep-RefreshRight-->
-      <!--                />-->
-      <!--              </el-icon>-->
-      <!--              重置-->
-      <!--            </el-button>-->
-      <!--          </div>-->
-      <!--        </div>-->
-      <!--      </div>-->
-      <!--      <el-divider />-->
-      <div class="tjm_card_tools">
-        <div class="tjm_card_tools_left">
-          <el-button type="primary" @click="addClick">
-            <el-icon class="tjm_btn_icon_right" size="16"
-            >
-              <tjm-icon-ep-Plus
-              />
-            </el-icon>
-            新增
-          </el-button>
-          <!--          <el-button type="danger">-->
-          <!--            <el-icon class="tjm_btn_icon_right" size="16"-->
-          <!--              ><tjm-icon-ep-delete-->
-          <!--            /></el-icon>-->
-          <!--            批量删除-->
-          <!--          </el-button>-->
-        </div>
-        <div class="tjm_card_tools_right">
-          <el-button>
-            <el-icon class="tjm_btn_icon_right" size="16"
-            >
-              <tjm-icon-ep-UploadFilled
-              />
-            </el-icon>
-            导出
-          </el-button>
-        </div>
-      </div>
-      <div class="tjm_cart_table">
-        <el-table
-          header-cell-class-name="tjm_cart_table_header"
-          height="400"
-          :data="tableData"
-          v-loading="loading"
-          border
-          style="width: 100%"
-          row-key="id"
-        >
-          <el-table-column type="selection" width="55" />
-          <el-table-column type="index" width="50" />
-          <el-table-column prop="name" label="角色名称" width="180" />
-          <el-table-column prop="code" label="角色代码" width="180" />
-          <el-table-column prop="description" label="角色描述" />
-          <el-table-column prop="state" label="角色状态">
-            <template #default="scope">
-              <el-tag
-                :type="scope.row.state === 1 ? 'danger' : 'success'"
-                disable-transitions
-              >{{ scope.row.state === 1 ? '禁用' : '启用' }}
-              </el-tag
-              >
+        <!--          <div>-->
+        <!--            <el-button>-->
+        <!--              <el-icon class="tjm_btn_icon_right">-->
+        <!--                <tjm-icon-ep-RefreshRight />-->
+        <!--              </el-icon>-->
+        <!--              重置-->
+        <!--            </el-button>-->
+        <!--          </div>-->
+        <!--        </div>-->
+        <!--      </div>-->
+        <!--      <el-divider />-->
+            <div class="tjm_card_tools">
+                <div class="tjm_card_tools_left">
+                    <el-button type="primary" @click="addClick">
+                        <el-icon class="tjm_btn_icon_right">
+                            <tjm-icon-ep-Plus />
+                        </el-icon>
+                        新增
+                    </el-button>
+                    <!-- <el-button type="danger">
+                        <el-icon class="tjm_btn_icon_right"><tjm-icon-ep-delete /></el-icon>
+                        批量删除
+                    </el-button> -->
+                </div>
+                <div class="tjm_card_tools_right">
+                    <el-button>
+                        <el-icon class="tjm_btn_icon_right">
+                            <tjm-icon-ep-UploadFilled />
+                        </el-icon>
+                        导出
+                    </el-button>
+                </div>
+            </div>
+            <div class="tjm_cart_table">
+                <el-table
+                    header-cell-class-name="tjm_cart_table_header"
+                    height="400"
+                    :data="tableData"
+                    v-loading="loading"
+                    border
+                    style="width: 100%"
+                    row-key="id"
+                >
+                    <el-table-column type="selection" width="55" />
+                    <el-table-column type="index" width="50" />
+                    <el-table-column prop="name" label="角色名称" width="180" />
+                    <el-table-column prop="code" label="角色代码" width="180" />
+                    <el-table-column prop="description" label="角色描述" />
+                    <el-table-column prop="state" label="角色状态">
+                        <template #default="scope">
+                            <el-tag
+                                :type="scope.row.state === 1 ? 'danger' : 'success'"
+                                disable-transitions>
+                                {{ scope.row.state === 1 ? '禁用' : '启用' }}
+                            </el-tag>
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="ope" width="240" label="操作">
+                        <template #default="scope">
+                            <el-button link type="primary" icon="Edit" @click="showChange(scope.row)">修改</el-button>
+                            <el-button link type="primary" icon="Plus" @click="sendPermissions(scope.row)">分配权限</el-button>
+                            <el-button link type="primary" icon="Delete" @click="deleteRoleClick(scope.row)">删除</el-button>
+                        </template>
+                    </el-table-column>
+                </el-table>
+            </div>
+            <div class="tjm_cart_pagination">
+                <el-pagination background layout="prev, pager, next" :total="total" @current-change="currentChange" />
+            </div>
+        </el-card>
+
+        <!-- 新增/编辑 -->
+        <el-dialog :title="dialogTitle" v-model="addShow" append-to-body @close="resetForm">
+            <el-form ref="userRef" :model="form" :rules="rules" label-width="100px">
+                <el-row>
+                    <el-col :span="24">
+                        <el-form-item label="角色名称" prop="name">
+                            <el-input
+                                v-model="form.name"
+                                placeholder="请输入角色名称"
+                                clearable
+                            />
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="24">
+                        <el-form-item label="角色代码" prop="code">
+                            <el-input
+                                v-model="form.code"
+                                placeholder="请输入角色代码"
+                                clearable
+                            />
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="24">
+                        <el-form-item label="角色描述" prop="description">
+                            <el-input
+                                v-model="form.description"
+                                placeholder="请输入角色描述"
+                                clearable
+                            />
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="24">
+                        <el-form-item label="是否启用" prop="state">
+                            <el-switch v-model="form.state" />
+                        </el-form-item>
+                    </el-col>
+                </el-row>
+            </el-form>
+            <template #footer>
+                <div class="dialog-footer">
+                    <el-button type="primary" @click="submitForm">确 定</el-button>
+                    <el-button @click="addCancel">取 消</el-button>
+                </div>
             </template>
-          </el-table-column>
-          <el-table-column prop="ope" width="240" label="操作">
-            <template #default="scope">
-              <el-button link type="primary" icon="Edit" @click="showChange(scope.row)">修改</el-button>
-              <el-button link type="primary" icon="Plus" @click="sendPermissions(scope.row)">分配权限</el-button>
-              <el-button link type="primary" icon="Delete" @click="deleteRoleClick(scope.row)">删除</el-button>
+        </el-dialog>
+
+        <!-- 分配权限 -->
+        <el-dialog title="分配权限" v-model="sendShow" append-to-body>
+            <el-tabs type="border-card" v-model="activeName" class="demo-tabs">
+                <el-tab-pane label="菜单权限" name="first">
+                    <el-tree
+                        :key="checkedMenuKeys"
+                        ref="treeRef"
+                        :data="treeData"
+                        show-checkbox
+                        node-key="id"
+                        default-expand-all
+                        :default-checked-keys="checkedMenuKeys"
+                        :props="defaultProps"
+                    />
+                </el-tab-pane>
+                <el-tab-pane label="数据权限" name="second">
+                    <el-tree
+                        :key="checkedMenuKeys2"
+                        ref="treeRef2"
+                        :data="treeData2"
+                        show-checkbox
+                        node-key="id"
+                        default-expand-all
+                        :default-checked-keys="checkedMenuKeys2"
+                        :props="defaultProps"
+                    />
+                </el-tab-pane>
+            </el-tabs>
+            <template #footer>
+                <div class="dialog-footer">
+                    <el-button type="primary" @click="saveAllTree">确 定</el-button>
+                    <el-button @click="sendShow = false">取 消</el-button>
+                </div>
             </template>
-          </el-table-column>
-        </el-table>
-      </div>
-      <div class="tjm_cart_pagination">
-        <el-pagination background layout="prev, pager, next" :total="total" @current-change="currentChange" />
-      </div>
-    </el-card>
-    <!-- 新增/编辑 -->
-    <el-dialog :title="dialogTitle" v-model="addShow" append-to-body @close="resetForm">
-      <el-form ref="userRef" :model="form" :rules="rules" label-width="100px">
-        <el-row>
-          <el-col :span="24">
-            <el-form-item label="角色名称" prop="name">
-              <el-input
-                v-model="form.name"
-                placeholder="请输入角色名称"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="24">
-            <el-form-item label="角色代码" prop="code">
-              <el-input
-                v-model="form.code"
-                placeholder="请输入角色代码"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="24">
-            <el-form-item label="角色描述" prop="description">
-              <el-input
-                v-model="form.description"
-                placeholder="请输入角色描述"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="24">
-            <el-form-item label="是否启用" prop="state">
-              <el-switch v-model="form.state" />
-            </el-form-item>
-          </el-col>
-        </el-row>
-      </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="primary" @click="submitForm">确 定</el-button>
-          <el-button @click="addCancel">取 消</el-button>
-        </div>
-      </template>
-    </el-dialog>
-    <!-- 分配权限 -->
-    <el-dialog title="分配权限" v-model="sendShow" append-to-body>
-      <el-tabs type="border-card" v-model="activeName" class="demo-tabs">
-        <el-tab-pane label="菜单权限" name="first">
-          <el-tree
-            :key="checkedMenuKeys"
-            ref="treeRef"
-            :data="treeData"
-            show-checkbox
-            node-key="id"
-            default-expand-all
-            :default-checked-keys="checkedMenuKeys"
-            :props="defaultProps"
-          />
-        </el-tab-pane>
-        <el-tab-pane label="数据权限" name="second">
-          <el-tree
-            :key="checkedMenuKeys2"
-            ref="treeRef2"
-            :data="treeData2"
-            show-checkbox
-            node-key="id"
-            default-expand-all
-            :default-checked-keys="checkedMenuKeys2"
-            :props="defaultProps"
-          />
-        </el-tab-pane>
-      </el-tabs>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="primary" @click="saveAllTree">确 定</el-button>
-          <el-button @click="sendShow = false">取 消</el-button>
-        </div>
-      </template>
-    </el-dialog>
-  </div>
+        </el-dialog>
+    </div>
 </template>
 
 <script setup>
 import {
-  addRole,
-  deleteRole,
-  getMenuTree, getPortTree,
-  getRoleList,
-  getRoleMenuTree,
-  getRolePortTree,
-  setRole,
-  setRoleMenuTree,
-  setRolePortTree
+    addRole,
+    deleteRole,
+    getMenuTree, getPortTree,
+    getRoleList,
+    getRoleMenuTree,
+    getRolePortTree,
+    setRole,
+    setRoleMenuTree,
+    setRolePortTree
 } from '@/api/system/role'
 
 const activeName = ref('first')
 const defaultProps = ref({
-  children: 'children',
-  label: 'name'
+    children: 'children',
+    label: 'name'
 })
 const treeData = ref([])
 const treeData2 = ref([])
@@ -247,14 +238,14 @@ const selectedRow = ref('')
 const tableData = ref([])
 
 const form = ref({
-  name: null,
-  code: null,
-  state: true,
-  description: null
+    name: null,
+    code: null,
+    state: true,
+    description: null
 })
 const rules = ref({
-  name: [{ required: true, message: '角色名称不能为空', trigger: 'blur' }],
-  code: [{ required: true, message: '角色代码不能为空', trigger: 'blur' }]
+    name: [{ required: true, message: '角色名称不能为空', trigger: 'blur' }],
+    code: [{ required: true, message: '角色代码不能为空', trigger: 'blur' }]
 })
 
 const checkedMenuKeys = ref([])
@@ -264,261 +255,261 @@ const { proxy } = getCurrentInstance()
 
 //查询
 const params = ref({
-  page: 1,
-  size: 10
+    page: 1,
+    size: 10
 })
 const total = ref(0)
 
 onMounted(() => {
-  getList()
+    getList()
 })
 
 function getList() {
-  loading.value = true
-  getRoleList(params.value).then(res => {
-    loading.value = false
-    if (res.code === 200) {
-      total.value = res.data.total
-      tableData.value = res.data.records
-    }
-  }).catch(() => {
-    loading.value = false
-  })
+    loading.value = true
+    getRoleList(params.value).then(res => {
+        loading.value = false
+        if (res.code === 200) {
+            total.value = res.data.total
+            tableData.value = res.data.records
+        }
+    }).catch(() => {
+        loading.value = false
+    })
 }
 
 function currentChange(e) {
-  params.value.page = e
-  getList()
+    params.value.page = e
+    getList()
 }
 
 function addClick() {
-  dialogTitle.value = '新增'
-  addShow.value = true
+    dialogTitle.value = '新增'
+    addShow.value = true
 }
 
 function showChange(row) {
-  console.log(row)
-  dialogTitle.value = '修改'
-  form.value.state = row.state === 0
-  form.value.description = row.description
-  form.value.code = row.code
-  form.value.name = row.name
-  form.value.id = row.id
-  addShow.value = true
+    console.log(row)
+    dialogTitle.value = '修改'
+    form.value.state = row.state === 0
+    form.value.description = row.description
+    form.value.code = row.code
+    form.value.name = row.name
+    form.value.id = row.id
+    addShow.value = true
 }
 
 function addCancel() {
-  addShow.value = false
-  resetForm()
+    addShow.value = false
+    resetForm()
 }
 
 function resetForm() {
-  form.value = {
-    name: null,
-    code: null,
-    state: true,
-    description: null
-  }
-  if (proxy.$refs['userRef']) {
-    proxy.$refs['userRef'].resetFields()
-  }
-  console.log('重置表单')
+    form.value = {
+        name: null,
+        code: null,
+        state: true,
+        description: null
+    }
+    if (proxy.$refs['userRef']) {
+        proxy.$refs['userRef'].resetFields()
+    }
+    console.log('重置表单')
 }
 
 function submitForm() {
-  proxy.$refs['userRef'].validate(valid => {
-    if (valid) {
-      if (form.value.id) {
-        console.log('修改表单')
-        const params = {
-          ...form.value
+    proxy.$refs['userRef'].validate(valid => {
+        if (valid) {
+            if (form.value.id) {
+                console.log('修改表单')
+                const params = {
+                    ...form.value
+                }
+                params.state = params.state ? 0 : 1
+                setRole(params).then(res => {
+                    if (res.code === 200) {
+                        ElMessage({
+                            message: '修改成功',
+                            type: 'success'
+                        })
+                        addShow.value = false
+                        resetForm()
+                        getList()
+                    }
+                })
+            } else {
+                console.log('新增表单')
+                const params = {
+                    ...form.value
+                }
+                params.state = params.state ? 0 : 1
+                addRole(params).then(res => {
+                    if (res.code === 200) {
+                        ElMessage({
+                            message: '新增成功',
+                            type: 'success'
+                        })
+                        addShow.value = false
+                        resetForm()
+                        getList()
+                    }
+                })
+            }
         }
-        params.state = params.state ? 0 : 1
-        setRole(params).then(res => {
-          if (res.code === 200) {
-            ElMessage({
-              message: '修改成功',
-              type: 'success'
-            })
-            addShow.value = false
-            resetForm()
-            getList()
-          }
-        })
-      } else {
-        console.log('新增表单')
-        const params = {
-          ...form.value
-        }
-        params.state = params.state ? 0 : 1
-        addRole(params).then(res => {
-          if (res.code === 200) {
-            ElMessage({
-              message: '新增成功',
-              type: 'success'
-            })
-            addShow.value = false
-            resetForm()
-            getList()
-          }
-        })
-      }
-    }
-  })
+    })
 }
 
 function sendPermissions(row) {
-  console.log(row)
-  selectedRow.value = row
+    console.log(row)
+    selectedRow.value = row
 
-  //获取菜单树
-  getMenuTree().then(res => {
-    if (res.code === 200) {
-      treeData.value = res.data
-      //获取角色菜单树
-      getRoleMenuTree(row.id).then(resp => {
-        checkedMenuKeys.value = []
-        if (!resp.data.length) {
-          proxy.$refs['treeRef'] && proxy.$refs['treeRef'].setCheckedNodes(checkedMenuKeys.value, false)
-          sendShow.value = true
-        } else {
-          //
-          let keys = []
-          for (let li of resp.data) {
-            keys.push(li.id)
-          }
-          // //解决
-          // //首先拿到 树形数据 所有的最深层的节点
-          let lastKeys = deepList([], treeData.value[0].children)
-          // //拿着接口返回的选中的 去所有深层节点查找  取交集  就是 最终选中的
-          checkedMenuKeys.value = [...new Set(lastKeys)].filter(item => {
-            return keys.includes(item)
-          })
-          sendShow.value = true
+    //获取菜单树
+    getMenuTree().then(res => {
+        if (res.code === 200) {
+            treeData.value = res.data
+            //获取角色菜单树
+            getRoleMenuTree(row.id).then(resp => {
+                checkedMenuKeys.value = []
+                if (!resp.data.length) {
+                    proxy.$refs['treeRef'] && proxy.$refs['treeRef'].setCheckedNodes(checkedMenuKeys.value, false)
+                    sendShow.value = true
+                } else {
+                    //
+                    let keys = []
+                    for (let li of resp.data) {
+                        keys.push(li.id)
+                    }
+                    // //解决
+                    // //首先拿到 树形数据 所有的最深层的节点
+                    let lastKeys = deepList([], treeData.value[0].children)
+                    // //拿着接口返回的选中的 去所有深层节点查找  取交集  就是 最终选中的
+                    checkedMenuKeys.value = [...new Set(lastKeys)].filter(item => {
+                        return keys.includes(item)
+                    })
+                    sendShow.value = true
+                }
+            })
         }
-      })
-    }
-  })
+    })
 
-  getPortTree().then(res => {
-    if (res.code === 200) {
-      treeData2.value = res.data
-      //获取角色接口菜单树
-      getRolePortTree(row.id).then(resp => {
-        checkedMenuKeys2.value = []
-        if (!resp.data.length) {
-          proxy.$refs['treeRef2'].setCheckedNodes(checkedMenuKeys2.value, false)
-          sendShow.value = true
-          console.log('都没选中接口')
-        } else {
-          //
-          let keys = []
-          for (let li of resp.data) {
-            keys.push(li.id)
-          }
-          // //解决
-          // //首先拿到 树形数据 所有的最深层的节点
-          let lastKeys = deepList([], treeData2.value[0].children)
-          // //拿着接口返回的选中的 去所有深层节点查找  取交集  就是 最终选中的
-          checkedMenuKeys2.value = [...new Set(lastKeys)].filter(item => {
-            return keys.includes(item)
-          })
-          console.log(checkedMenuKeys2.value, '123')
-          sendShow.value = true
+    getPortTree().then(res => {
+        if (res.code === 200) {
+            treeData2.value = res.data
+            //获取角色接口菜单树
+            getRolePortTree(row.id).then(resp => {
+                checkedMenuKeys2.value = []
+                if (!resp.data.length) {
+                    proxy.$refs['treeRef2'].setCheckedNodes(checkedMenuKeys2.value, false)
+                    sendShow.value = true
+                    console.log('都没选中接口')
+                } else {
+                    //
+                    let keys = []
+                    for (let li of resp.data) {
+                        keys.push(li.id)
+                    }
+                    // //解决
+                    // //首先拿到 树形数据 所有的最深层的节点
+                    let lastKeys = deepList([], treeData2.value[0].children)
+                    // //拿着接口返回的选中的 去所有深层节点查找  取交集  就是 最终选中的
+                    checkedMenuKeys2.value = [...new Set(lastKeys)].filter(item => {
+                        return keys.includes(item)
+                    })
+                    console.log(checkedMenuKeys2.value, '123')
+                    sendShow.value = true
+                }
+            })
         }
-      })
-    }
-  })
+    })
 }
 
 function deepList(lastKeys, data) {
-  data.map(item => {
-    if (item.children && item.children.length > 0) {
-      deepList(lastKeys, item.children)
-    } else {
-      lastKeys.push(item.id)
-    }
-  })
-  return lastKeys
+    data.map(item => {
+        if (item.children && item.children.length > 0) {
+            deepList(lastKeys, item.children)
+        } else {
+            lastKeys.push(item.id)
+        }
+    })
+    return lastKeys
 }
 
 function saveAllTree() {
-  saveTree()
-  savePortTree()
+    saveTree()
+    savePortTree()
 }
 
 function saveTree() {
-  // 获取所有选中的节点信息(包括未完全选中的父节点)
-  const halfCheckedKeys = proxy.$refs['treeRef'].getHalfCheckedKeys() // 获取半选中(即父节点未完全选中)节点的 keys
-  const checkedKeys = proxy.$refs['treeRef'].getCheckedKeys()
-  console.log(halfCheckedKeys, '半选菜单', checkedKeys, '选中的菜单')
-  // 合并已选中的节点和半选中的节点 keys,因为半选中的节点代表有子节点被选中,需要被包括在内
-  const allKeys = [...new Set([...halfCheckedKeys, ...checkedKeys])]
+    // 获取所有选中的节点信息(包括未完全选中的父节点)
+    const halfCheckedKeys = proxy.$refs['treeRef'].getHalfCheckedKeys() // 获取半选中(即父节点未完全选中)节点的 keys
+    const checkedKeys = proxy.$refs['treeRef'].getCheckedKeys()
+    console.log(halfCheckedKeys, '半选菜单', checkedKeys, '选中的菜单')
+    // 合并已选中的节点和半选中的节点 keys,因为半选中的节点代表有子节点被选中,需要被包括在内
+    const allKeys = [...new Set([...halfCheckedKeys, ...checkedKeys])]
 
-  // 调用 API,传递所有必要的节点
-  setRoleMenuTree(selectedRow.value.id, { menuIds: allKeys.join(','), roleId: selectedRow.value.id }).then(res => {
-    if (res.code === 200) {
-      // ElMessage({
-      //   message: '分配成功',
-      //   type: 'success'
-      // })
-      sendShow.value = false
-    } else {
-      ElMessage({
-        message: res.msg,
-        type: 'error'
-      })
-    }
-  })
+    // 调用 API,传递所有必要的节点
+    setRoleMenuTree(selectedRow.value.id, { menuIds: allKeys.join(','), roleId: selectedRow.value.id }).then(res => {
+        if (res.code === 200) {
+            // ElMessage({
+            //   message: '分配成功',
+            //   type: 'success'
+            // })
+            sendShow.value = false
+        } else {
+            ElMessage({
+                message: res.msg,
+                type: 'error'
+            })
+        }
+    })
 }
 
 function savePortTree() {
-  // 获取所有选中的节点信息(包括未完全选中的父节点)
-  const halfCheckedKeys = proxy.$refs['treeRef2'].getHalfCheckedKeys() // 获取半选中(即父节点未完全选中)节点的 keys
-  const checkedKeys = proxy.$refs['treeRef2'].getCheckedKeys()
-  console.log(halfCheckedKeys, '半选菜单', checkedKeys, '选中的菜单')
-  // 合并已选中的节点和半选中的节点 keys,因为半选中的节点代表有子节点被选中,需要被包括在内
-  const allKeys = [...new Set([...halfCheckedKeys, ...checkedKeys])]
+    // 获取所有选中的节点信息(包括未完全选中的父节点)
+    const halfCheckedKeys = proxy.$refs['treeRef2'].getHalfCheckedKeys() // 获取半选中(即父节点未完全选中)节点的 keys
+    const checkedKeys = proxy.$refs['treeRef2'].getCheckedKeys()
+    console.log(halfCheckedKeys, '半选菜单', checkedKeys, '选中的菜单')
+    // 合并已选中的节点和半选中的节点 keys,因为半选中的节点代表有子节点被选中,需要被包括在内
+    const allKeys = [...new Set([...halfCheckedKeys, ...checkedKeys])]
 
-  // 调用 API,传递所有必要的节点
-  setRolePortTree({ permissionType: 1, scopeIds: allKeys.join(','), roleId: selectedRow.value.id }).then(res => {
-    if (res.code === 200) {
-      ElMessage({
-        message: '分配成功',
-        type: 'success'
-      })
-      sendShow.value = false
-    } else {
-      ElMessage({
-        message: res.msg,
-        type: 'error'
-      })
-    }
-  })
+    // 调用 API,传递所有必要的节点
+    setRolePortTree({ permissionType: 1, scopeIds: allKeys.join(','), roleId: selectedRow.value.id }).then(res => {
+        if (res.code === 200) {
+            ElMessage({
+                message: '分配成功',
+                type: 'success'
+            })
+            sendShow.value = false
+        } else {
+            ElMessage({
+                message: res.msg,
+                type: 'error'
+            })
+        }
+    })
 }
 
 function deleteRoleClick(row) {
-  ElMessageBox.confirm('是否确认删除"' + row.name + '"?', '删除警告', {
-    confirmButtonText: '确定',
-    cancelButtonText: '取消',
-    type: 'warning'
-  }).then(() => {
-    deleteRole(row.id).then(res => {
-      if (res.code === 200) {
-        ElMessage({
-          message: '删除成功',
-          type: 'success'
-        })
-        getList()
-      } else {
-        ElMessage({
-          message: res.msg,
-          type: 'error'
+    ElMessageBox.confirm('是否确认删除"' + row.name + '"?', '删除警告', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+    }).then(() => {
+        deleteRole(row.id).then(res => {
+            if (res.code === 200) {
+                ElMessage({
+                    message: '删除成功',
+                    type: 'success'
+                })
+                getList()
+            } else {
+                ElMessage({
+                    message: res.msg,
+                    type: 'error'
+                })
+            }
         })
-      }
     })
-  })
 }
 </script>
 
-<style lang="scss" scoped></style>
+<style lang="scss" scoped></style>

+ 441 - 451
src/views/system/user.vue

@@ -1,14 +1,14 @@
 <script setup>
 import {
-  getDeptTree,
-  getUserList,
-  getRoleList,
-  addUser,
-  modUser,
-  byUserIdfnRole,
-  byUserIduPRole,
-  delUser,
-  restPwdUser
+    getDeptTree,
+    getUserList,
+    getRoleList,
+    addUser,
+    modUser,
+    byUserIdfnRole,
+    byUserIduPRole,
+    delUser,
+    restPwdUser
 } from '@/api/system/user.js'
 const { proxy } = getCurrentInstance()
 
@@ -17,72 +17,72 @@ const deptName = ref('')
 const deptOptions = ref([])
 const deptOptionsEdit = ref([])
 const filterNode = (value, data) => {
-  if (!value) return true
-  return data.name.indexOf(value) !== -1
+    if (!value) return true
+    return data.name.indexOf(value) !== -1
 }
 watch(deptName, val => {
-  proxy.$refs['deptTreeRef'].filter(val)
+    proxy.$refs['deptTreeRef'].filter(val)
 })
 
 //查询
 const params = ref({
-  deptId: null,
-  page: 1,
-  size: 20
+    deptId: null,
+    page: 1,
+    size: 20
 })
 const total = ref(0)
 const tableData = ref([])
 //用户列表
 function getUserListData() {
-  getUserList(params.value).then(res => {
-    tableData.value = res.data.records
-    total.value = res.data.total
-  })
+    getUserList(params.value).then(res => {
+        tableData.value = res.data.records
+        total.value = res.data.total
+    })
 }
 //查询按钮
 function searchUserListBtn() {
-  console.log(params.value)
-  getUserListData()
+    console.log(params.value)
+    getUserListData()
 }
 //重置
 function resetParamsBtn() {
-  params.value = {
-    deptId: null,
-    page: 1,
-    size: 20
-  }
-  getUserListData()
+    params.value = {
+        deptId: null,
+        page: 1,
+        size: 20
+    }
+    getUserListData()
 }
 function sizeChange(e) {
-  params.value.size = e
-  getUserListData()
+    params.value.size = e
+    getUserListData()
 }
 
 function currentChange(e) {
-  params.value.page = e
-  getUserListData()
+    params.value.page = e
+    getUserListData()
 }
 //部门点击
 function treeNodeClick(value) {
-  params.value.deptId = value.id
-  getUserListData()
+    params.value.deptId = value.id
+    getUserListData()
 }
 //部门数据
 function getDeptTreeData() {
-  getDeptTree().then(res => {
-    deptOptions.value = res.data
-    deptOptionsEdit.value = res.data
-  })
+    getDeptTree().then(res => {
+        deptOptions.value = res.data
+        deptOptionsEdit.value = res.data
+    })
 }
 //角色数据
 const roleData = ref([])
 function getRoleListData() {
-  getRoleList({
-    page: 1,
-    size: 100000
-  }).then(res => {
-    roleData.value = res.data.records
-  })
+    getRoleList({
+        page: 1,
+        size: 100000
+    }).then(res => {
+        roleData.value = res.data.records
+    })
 }
 getDeptTreeData()
 getUserListData()
@@ -91,460 +91,450 @@ getRoleListData()
 //编辑
 
 function filterMethod(value) {
-  deptOptionsEdit.value = [...deptOptions].filter(item =>
-    item.name.includes(value)
-  )
+    deptOptionsEdit.value = [...deptOptions].filter(item =>
+        item.name.includes(value)
+    )
 }
 
 const form = ref({
-  userName: null,
-  depId: null,
-  roleIds: null,
-  realName: null,
-  phone: null,
-  email: null
-})
-const rules = ref({
-  depId: [{ required: true, message: '部门不能为空', trigger: 'blur' }],
-  roleIds: [{ required: true, message: '角色不能为空', trigger: 'blur' }],
-  userName: [{ required: true, message: '用户名不能为空', trigger: 'blur' }]
-})
-
-function reset() {
-  form.value = {
     userName: null,
     depId: null,
     roleIds: null,
     realName: null,
     phone: null,
     email: null
-  }
-  if (proxy.$refs['userRef']) {
-    proxy.$refs['userRef'].resetFields()
-  }
+})
+const rules = ref({
+    depId: [{ required: true, message: '部门不能为空', trigger: 'blur' }],
+    roleIds: [{ required: true, message: '角色不能为空', trigger: 'blur' }],
+    userName: [{ required: true, message: '用户名不能为空', trigger: 'blur' }]
+})
+
+function reset() {
+    form.value = {
+        userName: null,
+        depId: null,
+        roleIds: null,
+        realName: null,
+        phone: null,
+        email: null
+    }
+    if (proxy.$refs['userRef']) {
+        proxy.$refs['userRef'].resetFields()
+    }
 }
 
 const title = ref('')
 const open = ref(false)
 
 function submitForm() {
-  proxy.$refs['userRef'].validate(valid => {
-    if (valid) {
-      if (form.value.id != undefined) {
-        modUser(form.value).then(res => {
-          if (res.code == 200) {
-            byUserIduPRole(form.value.id, {
-              roleIds: form.value.roleIds.join(',')
-            }).then(result => {
-              if (result.code == 200) {
-                getUserListData()
-                open.value = false
-                ElMessage({
-                  message: res.msg,
-                  type: 'success'
+    proxy.$refs['userRef'].validate(valid => {
+        if (valid) {
+            if (form.value.id != undefined) {
+                modUser(form.value).then(res => {
+                    if (res.code == 200) {
+                        byUserIduPRole(form.value.id, {
+                            roleIds: form.value.roleIds.join(',')
+                        }).then(result => {
+                            if (result.code == 200) {
+                                getUserListData()
+                                open.value = false
+                                ElMessage({
+                                    message: res.msg,
+                                    type: 'success'
+                                })
+                            } else {
+                                ElMessage({
+                                    message: res.msg,
+                                    type: warning
+                                })
+                            }
+                        })
+                    } else {
+                        ElMessage({
+                            message: res.msg,
+                            type: warning
+                        })
+                    }
                 })
-              } else {
-                ElMessage({
-                  message: res.msg,
-                  type: warning
-                })
-              }
-            })
-          } else {
-            ElMessage({
-              message: res.msg,
-              type: warning
-            })
-          }
-        })
-      } else {
-        addUser(form.value).then(res => {
-          if (res.code == 200) {
-            byUserIduPRole(res.data.id, {
-              roleIds: form.value.roleIds.join(',')
-            }).then(result => {
-              if (result.code == 200) {
-                getUserListData()
-                open.value = false
-                ElMessage({
-                  message: res.msg,
-                  type: 'success'
-                })
-              } else {
-                ElMessage({
-                  message: res.msg,
-                  type: warning
+            } else {
+                addUser(form.value).then(res => {
+                    if (res.code == 200) {
+                        byUserIduPRole(res.data.id, {
+                            roleIds: form.value.roleIds.join(',')
+                        }).then(result => {
+                            if (result.code == 200) {
+                                getUserListData()
+                                open.value = false
+                                ElMessage({
+                                    message: res.msg,
+                                    type: 'success'
+                                })
+                            } else {
+                                ElMessage({
+                                    message: res.msg,
+                                    type: warning
+                                })
+                            }
+                        })
+                    } else {
+                        ElMessage({
+                            message: res.msg,
+                            type: warning
+                        })
+                    }
                 })
-              }
-            })
-          } else {
-            ElMessage({
-              message: res.msg,
-              type: warning
-            })
-          }
-        })
-      }
-    } else {
-      console.log('检验不通过')
-    }
-  })
+            }
+        } else {
+            console.log('检验不通过')
+        }
+    })
 }
 function cancel() {
-  open.value = false
-  reset()
+    open.value = false
+    reset()
 }
 function addUserBtn() {
-  open.value = true
-  title.value = '新增'
+    open.value = true
+    title.value = '新增'
 }
 function modUserBtn(row) {
-  console.log(row)
-  reset()
-  let { userName, deptId, name, mobile, email, id } = row
-  form.value = {
-    userName,
-    depId: deptId,
-    realName: name,
-    phone: mobile,
-    email,
-    id
-  }
-  byUserIdfnRole(id).then(res => {
-    form.value.roleIds = res.data.map(item => item.id)
-    open.value = true
-    title.value = '修改'
-  })
+    console.log(row)
+    reset()
+    let { userName, deptId, name, mobile, email, id } = row
+    form.value = {
+        userName,
+        depId: deptId,
+        realName: name,
+        phone: mobile,
+        email,
+        id
+    }
+    byUserIdfnRole(id).then(res => {
+        form.value.roleIds = res.data.map(item => item.id)
+        open.value = true
+        title.value = '修改'
+    })
 }
 function delUserBtn(row) {
-  ElMessageBox.confirm('是否确认删除"' + row.userName + '"?', '删除警告', {
-    confirmButtonText: '确定',
-    cancelButtonText: '取消',
-    type: 'warning'
-  }).then(() => {
-    delUser({ ids: row.id }).then(res => {
-      console.log(res)
-      if (res.code == 200) {
-        getUserListData()
-        ElMessage({
-          message: res.msg,
-          type: 'success'
-        })
-      } else {
-        ElMessage({
-          message: res.msg,
-          type: warning
+    ElMessageBox.confirm('是否确认删除"' + row.userName + '"?', '删除警告', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+    }).then(() => {
+        delUser({ ids: row.id }).then(res => {
+            console.log(res)
+            if (res.code == 200) {
+                getUserListData()
+                ElMessage({
+                    message: res.msg,
+                    type: 'success'
+                })
+            } else {
+                ElMessage({
+                    message: res.msg,
+                    type: warning
+                })
+            }
         })
-      }
     })
-  })
 }
 const selectionChangeData = ref([])
 function selectionChange(value) {
-  selectionChangeData.value = value
+    selectionChangeData.value = value
 }
 function delUserMoreBtn() {
-  if (selectionChangeData.value.length <= 0) {
-    ElMessage({
-      message: '请先选择要删除的数据',
-      type: 'warning'
-    })
-    return
-  }
-  ElMessageBox.confirm('是否确认删除?', '删除警告', {
-    confirmButtonText: '确定',
-    cancelButtonText: '取消',
-    type: 'warning'
-  }).then(() => {
-    let arr = []
-    selectionChangeData.value.forEach(element => {
-      arr.push(element.id)
-    })
-    delUser({ ids: arr.join(',') }).then(res => {
-      console.log(res)
-      if (res.code == 200) {
-        getUserListData()
+    if (selectionChangeData.value.length <= 0) {
         ElMessage({
-          message: res.msg,
-          type: 'success'
+            message: '请先选择要删除的数据',
+            type: 'warning'
         })
-      } else {
-        ElMessage({
-          message: res.msg,
-          type: warning
+        return
+    }
+    ElMessageBox.confirm('是否确认删除?', '删除警告', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+    }).then(() => {
+        let arr = []
+        selectionChangeData.value.forEach(element => {
+            arr.push(element.id)
+        })
+        delUser({ ids: arr.join(',') }).then(res => {
+            console.log(res)
+            if (res.code == 200) {
+                getUserListData()
+                ElMessage({
+                    message: res.msg,
+                    type: 'success'
+                })
+            } else {
+                ElMessage({
+                    message: res.msg,
+                    type: warning
+                })
+            }
         })
-      }
     })
-  })
 }
 
 function resetUserPwdBtn(row) {
-  ElMessageBox.confirm('是否确认重置"' + row.userName + '"密码?', '删除警告', {
-    confirmButtonText: '确定',
-    cancelButtonText: '取消',
-    type: 'warning'
-  }).then(() => {
-    restPwdUser({ id: row.id }).then(res => {
-      if (res.code == 200) {
-        getUserListData()
-        ElMessage({
-          message: res.msg,
-          type: 'success'
-        })
-      } else {
-        ElMessage({
-          message: res.msg,
-          type: warning
+    ElMessageBox.confirm('是否确认重置"' + row.userName + '"密码?', '删除警告', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+    }).then(() => {
+        restPwdUser({ id: row.id }).then(res => {
+            if (res.code == 200) {
+                getUserListData()
+                ElMessage({
+                    message: res.msg,
+                    type: 'success'
+                })
+            } else {
+                ElMessage({
+                    message: res.msg,
+                    type: warning
+                })
+            }
         })
-      }
     })
-  })
 }
 </script>
 
 <template>
-  <div>
-    <el-card class="tjm_card_style_custom">
-      <div class="tjm_card_title">查询表格</div>
-      <div class="tjm_card_select">
-        <div class="tjm_card_select_left">
-          <el-form
-            :inline="true"
-            :model="params"
-            label-width="80px"
-            :label-position="'left'"
-          >
-            <!-- <el-form-item label="用户编号">
-              <el-input v-model="params.code" clearable />
-            </el-form-item> -->
-            <el-form-item label="用户名称">
-              <el-input v-model="params.userName" clearable />
-            </el-form-item>
-            <el-form-item label="姓名">
-              <el-input v-model="params.realName" clearable />
-            </el-form-item>
+    <div>
+        <el-card class="tjm_card_style_custom">
+            <div class="tjm_card_title">查询表格</div>
+            <div class="tjm_card_select">
+                <div class="tjm_card_select_left">
+                    <el-form
+                        :inline="true"
+                        :model="params"
+                        label-width="80px"
+                        :label-position="'left'"
+                    >
+                        <!-- <el-form-item label="用户编号">
+                            <el-input v-model="params.code" clearable />
+                        </el-form-item> -->
+                        <el-form-item label="用户名称">
+                            <el-input v-model="params.userName" clearable />
+                        </el-form-item>
+                        <el-form-item label="姓名">
+                            <el-input v-model="params.realName" clearable />
+                        </el-form-item>
 
-            <!-- <el-form-item label="创建时间">
-              <el-date-picker
-                v-model="params.date"
-                type="daterange"
-                placeholder="Pick a date"
-                clearable
-              />
-            </el-form-item>
-            <el-form-item label="用户状态">
-              <el-select
-                v-model="params.status"
-                clearable
-                placeholder="请选择"
-              >
-                <el-option label="启用" value="1" />
-                <el-option label="禁用" value="2" />
-              </el-select>
-            </el-form-item> -->
-            <el-form-item>
-              <el-button type="primary" @click="searchUserListBtn">
-                <el-icon class="tjm_btn_icon_right" size="16"
-                  ><tjm-icon-ep-Plus
-                /></el-icon>
-                搜索
-              </el-button>
-              <el-button @click="resetParamsBtn">
-                <el-icon class="tjm_btn_icon_right" size="16"
-                  ><tjm-icon-ep-RefreshRight
-                /></el-icon>
-                重置
-              </el-button>
-            </el-form-item>
-          </el-form>
-        </div>
-        
-      </div>
-      <el-divider />
-      <div class="tjm_card_tools">
-        <div class="tjm_card_tools_left">
-          <el-button type="primary" @click="addUserBtn">
-            <el-icon class="tjm_btn_icon_right" size="16"
-              ><tjm-icon-ep-Plus
-            /></el-icon>
-            新增
-          </el-button>
-          <el-button type="danger" @click="delUserMoreBtn">
-            <el-icon class="tjm_btn_icon_right" size="16"
-              ><tjm-icon-ep-delete
-            /></el-icon>
-            批量删除
-          </el-button>
-        </div>
-        <!-- <div class="tjm_card_tools_right">
-          <el-button>
-            <el-icon class="tjm_btn_icon_right" size="16"
-              ><tjm-icon-ep-UploadFilled
-            /></el-icon>
-            excel导出数据
-          </el-button>
-        </div> -->
-      </div>
-      <div class="tjm_card_table">
-        <div class="tjm_card_table_left" style="height: 450px; overflow: auto">
-          <el-input
-            v-model="deptName"
-            placeholder="请输入部门名称"
-            clearable
-            prefix-icon="Search"
-          />
-          <!--      default-expand-all -->
-          <el-tree
-            :data="deptOptions"
-            :props="{ label: 'name', children: 'children' }"
-            :expand-on-click-node="false"
-            ref="deptTreeRef"
-            node-key="id"
-            highlight-current
-            @node-click="treeNodeClick"
-            :filter-node-method="filterNode"
-            style="margin-top: 6px"
-          />
-        </div>
-        <div class="tjm_card_table_right">
-          <el-table
-            header-cell-class-name="tjm_cart_table_header"
-            :data="tableData"
-            border
-            width="100%"
-            @selection-change="selectionChange"
-          >
-            <el-table-column type="selection" width="55" />
-            <el-table-column type="index" label="序号" width="55" />
-            <el-table-column prop="userName" label="用户名" />
-            <el-table-column prop="deptName" label="所属部门" width="240" />
-            <el-table-column prop="name" label="姓名" />
-            <el-table-column prop="mobile" label="手机号" />
-            <el-table-column prop="email" label="电子邮箱" width="240" />
-            <el-table-column prop="state" label="用户状态">
-              <template #default="scope">
-                {{ ['启用', '禁用'][scope.row.state] }}
-              </template>
-            </el-table-column>
-            <el-table-column prop="ope" label="操作">
-              <template #default="scope">
-                <el-tooltip content="修改" placement="top">
-                  <el-button
-                    link
-                    type="primary"
-                    icon="Edit"
-                    @click="modUserBtn(scope.row)"
-                  ></el-button>
-                </el-tooltip>
-                <el-tooltip content="删除" placement="top">
-                  <el-button
-                    link
-                    type="primary"
-                    icon="Delete"
-                    @click="delUserBtn(scope.row)"
-                  ></el-button>
-                </el-tooltip>
-                <el-tooltip content="重置密码" placement="top">
-                  <el-button
-                    link
-                    type="primary"
-                    icon="Key"
-                    @click="resetUserPwdBtn(scope.row)"
-                  ></el-button>
-                </el-tooltip>
-              </template>
-            </el-table-column>
-          </el-table>
-        </div>
-      </div>
-      <div class="tjm_card_pagination">
-        <el-pagination
-          background
-          layout="total,sizes,prev, pager, next,"
-          :total="total"
-          :page-sizes="[20, 30, 100]"
-          @size-change="sizeChange"
-          @current-change="currentChange"
-        />
-      </div>
-    </el-card>
-    <!-- 编辑 -->
-    <el-dialog :title="title" v-model="open" width="680px" append-to-body>
-      <el-form ref="userRef" :model="form" :rules="rules" label-width="100px">
-        <el-row>
-          <el-col :span="24">
-            <el-form-item label="用户名" prop="userName">
-              <el-input
-                v-model="form.userName"
-                placeholder="请输入用户名"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="24">
-            <el-form-item label="所属部门" prop="depId">
-              <el-tree-select
-                style="width: 100%"
-                v-model="form.depId"
-                :data="deptOptions"
-                filterable
-                :props="{ value: 'id', label: 'name', children: 'children' }"
-                value-key="id"
-                placeholder="选择所属部门"
-                check-strictly
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="24">
-            <el-form-item label="角色" prop="roleIds">
-              <el-select
-                v-model="form.roleIds"
-                multiple
-                placeholder="请选择角色"
-                style="width: 100%"
-              >
-                <el-option
-                  v-for="item in roleData"
-                  :key="item.id"
-                  :label="item.name"
-                  :value="item.id"
+                        <!-- <el-form-item label="创建时间">
+                        <el-date-picker
+                            v-model="params.date"
+                            type="daterange"
+                            placeholder="Pick a date"
+                            clearable
+                        />
+                        </el-form-item>
+                        <el-form-item label="用户状态">
+                        <el-select
+                            v-model="params.status"
+                            clearable
+                            placeholder="请选择"
+                        >
+                            <el-option label="启用" value="1" />
+                            <el-option label="禁用" value="2" />
+                        </el-select>
+                        </el-form-item> -->
+                        <el-form-item>
+                            <el-button type="primary" @click="searchUserListBtn">
+                                <el-icon class="tjm_btn_icon_right"><tjm-icon-ep-Plus /></el-icon>
+                                搜索
+                            </el-button>
+                            <el-button @click="resetParamsBtn">
+                                <el-icon class="tjm_btn_icon_right"><tjm-icon-ep-RefreshRight /></el-icon>
+                                重置
+                            </el-button>
+                        </el-form-item>
+                    </el-form>
+                </div>
+            </div>
+            <el-divider />
+            <div class="tjm_card_tools">
+                <div class="tjm_card_tools_left">
+                    <el-button type="primary" @click="addUserBtn">
+                        <el-icon class="tjm_btn_icon_right"><tjm-icon-ep-Plus /></el-icon>
+                        新增
+                    </el-button>
+                    <el-button type="danger" @click="delUserMoreBtn">
+                        <el-icon class="tjm_btn_icon_right"><tjm-icon-ep-delete /></el-icon>
+                        批量删除
+                    </el-button>
+                </div>
+                <!-- <div class="tjm_card_tools_right">
+                    <el-button>
+                        <el-icon class="tjm_btn_icon_right"><tjm-icon-ep-UploadFilled /></el-icon>
+                        excel导出数据
+                    </el-button>
+                </div> -->
+            </div>
+            <div class="tjm_card_table">
+                <div class="tjm_card_table_left" style="height: 450px; overflow: auto">
+                    <el-input
+                        v-model="deptName"
+                        placeholder="请输入部门名称"
+                        clearable
+                        prefix-icon="Search"
+                    />
+                        <!-- default-expand-all -->
+                    <el-tree
+                        :data="deptOptions"
+                        :props="{ label: 'name', children: 'children' }"
+                        :expand-on-click-node="false"
+                        ref="deptTreeRef"
+                        node-key="id"
+                        highlight-current
+                        @node-click="treeNodeClick"
+                        :filter-node-method="filterNode"
+                        style="margin-top: 6px"
+                    />
+                </div>
+                <div class="tjm_card_table_right">
+                    <el-table
+                        header-cell-class-name="tjm_cart_table_header"
+                        :data="tableData"
+                        border
+                        width="100%"
+                        @selection-change="selectionChange"
+                    >
+                        <el-table-column type="selection" width="55" />
+                        <el-table-column type="index" label="序号" width="55" />
+                        <el-table-column prop="userName" label="用户名" />
+                        <el-table-column prop="deptName" label="所属部门" width="240" />
+                        <el-table-column prop="name" label="姓名" />
+                        <el-table-column prop="mobile" label="手机号" />
+                        <el-table-column prop="email" label="电子邮箱" width="240" />
+                        <el-table-column prop="state" label="用户状态">
+                            <template #default="scope">
+                                {{ ['启用', '禁用'][scope.row.state] }}
+                            </template>
+                        </el-table-column>
+                        <el-table-column prop="ope" label="操作">
+                            <template #default="scope">
+                                <el-tooltip content="修改" placement="top">
+                                    <el-button
+                                        link
+                                        type="primary"
+                                        icon="Edit"
+                                        @click="modUserBtn(scope.row)"
+                                    ></el-button>
+                                </el-tooltip>
+                                <el-tooltip content="删除" placement="top">
+                                    <el-button
+                                        link
+                                        type="primary"
+                                        icon="Delete"
+                                        @click="delUserBtn(scope.row)"
+                                    ></el-button>
+                                </el-tooltip>
+                                <el-tooltip content="重置密码" placement="top">
+                                    <el-button
+                                        link
+                                        type="primary"
+                                        icon="Key"
+                                        @click="resetUserPwdBtn(scope.row)"
+                                    ></el-button>
+                                </el-tooltip>
+                            </template>
+                        </el-table-column>
+                    </el-table>
+                </div>
+            </div>
+            <div class="tjm_card_pagination">
+                <el-pagination
+                    background
+                    layout="total,sizes,prev, pager, next,"
+                    :total="total"
+                    :page-sizes="[20, 30, 100]"
+                    @size-change="sizeChange"
+                    @current-change="currentChange"
                 />
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :span="24">
-            <el-form-item label="姓名" prop="realName">
-              <el-input
-                v-model="form.realName"
-                placeholder="请输入姓名"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="24">
-            <el-form-item label="手机号" prop="phone">
-              <el-input
-                v-model="form.phone"
-                placeholder="请输入手机号"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="24">
-            <el-form-item label="邮箱" prop="email">
-              <el-input v-model="form.email" placeholder="邮箱" clearable />
-            </el-form-item>
-          </el-col>
-        </el-row>
-      </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="primary" @click="submitForm">确 定</el-button>
-          <el-button @click="cancel">取 消</el-button>
-        </div>
-      </template>
-    </el-dialog>
-  </div>
+            </div>
+        </el-card>
+
+        <!-- 编辑 -->
+        <el-dialog :title="title" v-model="open" width="680px" append-to-body>
+            <el-form ref="userRef" :model="form" :rules="rules" label-width="100px">
+                <el-row>
+                    <el-col :span="24">
+                        <el-form-item label="用户名" prop="userName">
+                            <el-input
+                                v-model="form.userName"
+                                placeholder="请输入用户名"
+                                clearable
+                            />
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="24">
+                        <el-form-item label="所属部门" prop="depId">
+                            <el-tree-select
+                                style="width: 100%"
+                                v-model="form.depId"
+                                :data="deptOptions"
+                                filterable
+                                :props="{ value: 'id', label: 'name', children: 'children' }"
+                                value-key="id"
+                                placeholder="选择所属部门"
+                                check-strictly
+                            />
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="24">
+                        <el-form-item label="角色" prop="roleIds">
+                            <el-select
+                                v-model="form.roleIds"
+                                multiple
+                                placeholder="请选择角色"
+                                style="width: 100%"
+                            >
+                                <el-option
+                                    v-for="item in roleData"
+                                    :key="item.id"
+                                    :label="item.name"
+                                    :value="item.id"
+                                />
+                            </el-select>
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="24">
+                        <el-form-item label="姓名" prop="realName">
+                            <el-input
+                                v-model="form.realName"
+                                placeholder="请输入姓名"
+                                clearable
+                            />
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="24">
+                        <el-form-item label="手机号" prop="phone">
+                            <el-input
+                                v-model="form.phone"
+                                placeholder="请输入手机号"
+                                clearable
+                            />
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="24">
+                        <el-form-item label="邮箱" prop="email">
+                            <el-input v-model="form.email" placeholder="邮箱" clearable />
+                        </el-form-item>
+                    </el-col>
+                </el-row>
+            </el-form>
+            <template #footer>
+                <div class="dialog-footer">
+                    <el-button type="primary" @click="submitForm">确 定</el-button>
+                    <el-button @click="cancel">取 消</el-button>
+                </div>
+            </template>
+        </el-dialog>
+    </div>
 </template>
 
-<style lang="scss" scoped></style>
+<style lang="scss" scoped></style>

+ 236 - 236
src/views/system/userInfo.vue

@@ -1,123 +1,124 @@
 <template>
-  <div class="userInfoWarp">
-    <div class="left">
-      <div class="avater">
-        <el-upload
-          v-if="isEdit"
-          :show-file-list="false"
-          :http-request="customRequest"
-          :before-upload="beforeAvatarUpload"
-          :limit="1"
-        >
-          <img v-if="form.avatar" :src="form.avatar" class="avatar" />
-          <el-icon v-else class="avatar-uploader-icon">
-            <Plus />
-          </el-icon>
-        </el-upload>
-        <img
-          v-else
-          :src="originForm.avatar"
-          alt=""
-        />
-      </div>
-      <div class="desc">你好,尊敬的用户 {{ originForm.name }}</div>
-      <div class="info">
-        <div class="info_item">
-          <div class="item_icon">
-            <img src="../../assets/images/Slice12x.png" alt="" />
-          </div>
-          <div class="">用户名:{{ originForm.name }}</div>
+    <div class="userInfoWarp">
+        <div class="left">
+            <div class="avater">
+                <el-upload
+                    v-if="isEdit"
+                    :show-file-list="false"
+                    :http-request="customRequest"
+                    :before-upload="beforeAvatarUpload"
+                    :limit="1"
+                >
+                    <img v-if="form.avatar" :src="form.avatar" class="avatar" />
+                    <el-icon v-else class="avatar-uploader-icon">
+                        <Plus />
+                    </el-icon>
+                </el-upload>
+                <img
+                    v-else
+                    :src="originForm.avatar"
+                    alt=""
+                />
+            </div>
+            <div class="desc">你好,尊敬的用户 {{ originForm.name }}</div>
+            <div class="info">
+                <div class="info_item">
+                    <div class="item_icon">
+                        <img src="../../assets/images/Slice12x.png" alt="" />
+                    </div>
+                    <div class="">用户名:{{ originForm.name }}</div>
+                </div>
+                <div class="info_item">
+                    <div class="item_icon">
+                        <img src="../../assets/images/Slice22x.png" alt="" />
+                    </div>
+                    <div class="">用户ID:{{ originForm.userName }}</div>
+                </div>
+                <div class="info_item">
+                    <div class="item_icon">
+                        <img src="../../assets/images/Slice32x.png" alt="" />
+                    </div>
+                    <div class="">性别:隐藏</div>
+                </div>
+                <div class="info_item">
+                    <div class="item_icon">
+                        <img src="../../assets/images/Slice42x.png" alt="" />
+                    </div>
+                    <div class="">登录时间:{{ originForm.lastLoginDate }}</div>
+                </div>
+            </div>
         </div>
-        <div class="info_item">
-          <div class="item_icon">
-            <img src="../../assets/images/Slice22x.png" alt="" />
-          </div>
-          <div class="">用户ID:{{ originForm.userName }}</div>
+        <div class="middle"></div>
+        <div class="right">
+            <div class="title">
+                <div class="titlemodf"></div>
+                <div>账号信息</div>
+            </div>
+            <div class="setWarp">
+                <div class="setInput">
+                    <div class="name">姓名</div>
+                    <div class="gk"></div>
+                    <div class="ipt">
+                        <input v-if="isEdit" v-model="form.name" placeholder="请输入姓名" type="text" />
+                        <p v-else>{{ form.name || '--' }}</p>
+                    </div>
+                    <template v-if="!isEdit">
+                        <div v-if="form.name" class="idft">已设置</div>
+                        <div v-else class="idft red">未设置</div>
+                    </template>
+                </div>
+                <div class="setInput">
+                    <div class="name">安全手机</div>
+                    <div class="gk"></div>
+                    <div class="ipt">
+                        <input v-if="isEdit" v-model="form.mobile" placeholder="请输入手机号" type="text" />
+                        <p v-else>{{ form.mobile || '--' }}</p>
+                    </div>
+                    <template v-if="!isEdit">
+                        <div v-if="form.mobile" class="idft">已设置</div>
+                        <div v-else class="idft red">未设置</div>
+                    </template>
+                </div>
+                <div class="setInput">
+                    <div class="name">安全邮箱</div>
+                    <div class="gk"></div>
+                    <div class="ipt">
+                        <input v-if="isEdit" v-model="form.email" placeholder="请输入安全邮箱" type="text" />
+                        <p v-else>{{ form.email || '--' }}</p>
+                    </div>
+                    <template v-if="!isEdit">
+                        <div v-if="form.email" class="idft">已设置</div>
+                        <div v-else class="idft red">未设置</div>
+                    </template>
+                </div>
+            </div>
+            <div class="btnWarp">
+                <div class="editBtn" @click="changeInfo">{{ isEdit ? '保存' : '编辑用户信息' }}</div>
+                <div v-if="isEdit" class="editBtn cancel" @click="cancelInfo">取消</div>
+                <div class="modBtn" @click="isPwdDialogVisible = true">修改密码</div>
+            </div>
         </div>
-        <div class="info_item">
-          <div class="item_icon">
-            <img src="../../assets/images/Slice32x.png" alt="" />
-          </div>
-          <div class="">性别:隐藏</div>
-        </div>
-        <div class="info_item">
-          <div class="item_icon">
-            <img src="../../assets/images/Slice42x.png" alt="" />
-          </div>
-          <div class="">登录时间:{{ originForm.lastLoginDate }}</div>
-        </div>
-      </div>
-    </div>
-    <div class="middle"></div>
-    <div class="right">
-      <div class="title">
-        <div class="titlemodf"></div>
-        <div>账号信息</div>
-      </div>
-      <div class="setWarp">
-        <div class="setInput">
-          <div class="name">姓名</div>
-          <div class="gk"></div>
-          <div class="ipt">
-            <input v-if="isEdit" v-model="form.name" placeholder="请输入姓名" type="text" />
-            <p v-else>{{ form.name || '--' }}</p>
-          </div>
-          <template v-if="!isEdit">
-            <div v-if="form.name" class="idft">已设置</div>
-            <div v-else class="idft red">未设置</div>
-          </template>
-        </div>
-        <div class="setInput">
-          <div class="name">安全手机</div>
-          <div class="gk"></div>
-          <div class="ipt">
-            <input v-if="isEdit" v-model="form.mobile" placeholder="请输入手机号" type="text" />
-            <p v-else>{{ form.mobile || '--' }}</p>
-          </div>
-          <template v-if="!isEdit">
-            <div v-if="form.mobile" class="idft">已设置</div>
-            <div v-else class="idft red">未设置</div>
-          </template>
-        </div>
-        <div class="setInput">
-          <div class="name">安全邮箱</div>
-          <div class="gk"></div>
-          <div class="ipt">
-            <input v-if="isEdit" v-model="form.email" placeholder="请输入安全邮箱" type="text" />
-            <p v-else>{{ form.email || '--' }}</p>
-          </div>
-          <template v-if="!isEdit">
-            <div v-if="form.email" class="idft">已设置</div>
-            <div v-else class="idft red">未设置</div>
-          </template>
-        </div>
-      </div>
-      <div class="btnWarp">
-        <div class="editBtn" @click="changeInfo">{{ isEdit ? '保存' : '编辑用户信息' }}</div>
-        <div v-if="isEdit" class="editBtn cancel" @click="cancelInfo">取消</div>
-        <div class="modBtn" @click="isPwdDialogVisible = true">修改密码</div>
-      </div>
+
+        <el-dialog v-model="isPwdDialogVisible" title="修改密码" width="500">
+            <el-form ref="pwdFormRef" :model="pwdForm" :rules="pwdRules" label-width="120px">
+                <el-form-item label="旧密码" prop="oldPassword">
+                    <el-input v-model="pwdForm.oldPassword" type="password" autocomplete="off"></el-input>
+                </el-form-item>
+                <el-form-item label="新密码" prop="newPassword">
+                    <el-input v-model="pwdForm.newPassword" type="password" autocomplete="off"></el-input>
+                </el-form-item>
+                <el-form-item label="确认密码" prop="enterPassword">
+                    <el-input v-model="pwdForm.enterPassword" type="password" autocomplete="off"></el-input>
+                </el-form-item>
+            </el-form>
+            <template #footer>
+                <span class="dialog-footer">
+                    <el-button @click="cancelPassword">取消</el-button>
+                    <el-button type="primary" @click="changePassword">确定</el-button>
+                </span>
+            </template>
+        </el-dialog>
     </div>
-    <el-dialog v-model="isPwdDialogVisible" title="修改密码" width="500">
-      <el-form ref="pwdFormRef" :model="pwdForm" :rules="pwdRules" label-width="120px">
-        <el-form-item label="旧密码" prop="oldPassword">
-          <el-input v-model="pwdForm.oldPassword" type="password" autocomplete="off"></el-input>
-        </el-form-item>
-        <el-form-item label="新密码" prop="newPassword">
-          <el-input v-model="pwdForm.newPassword" type="password" autocomplete="off"></el-input>
-        </el-form-item>
-        <el-form-item label="确认密码" prop="enterPassword">
-          <el-input v-model="pwdForm.enterPassword" type="password" autocomplete="off"></el-input>
-        </el-form-item>
-      </el-form>
-      <template #footer>
-    <span class="dialog-footer">
-      <el-button @click="cancelPassword">取消</el-button>
-      <el-button type="primary" @click="changePassword">确定</el-button>
-    </span>
-      </template>
-    </el-dialog>
-  </div>
 </template>
 
 <script setup>
@@ -130,167 +131,166 @@ const pwdFormRef = ref(null)
 const isPwdDialogVisible = ref(false)
 const isEdit = ref(false)
 const pwdForm = ref({
-  oldPassword: '',
-  newPassword: '',
-  enterPassword: ''
+    oldPassword: '',
+    newPassword: '',
+    enterPassword: ''
 })
 const originForm = ref({
-  avatar: null,
-  email: '',
-  mobile: '',
-  userName: '',
-  name: ''
+    avatar: null,
+    email: '',
+    mobile: '',
+    userName: '',
+    name: ''
 })
 const form = ref({
-  avatar: null,
-  email: '',
-  mobile: '',
-  name: ''
+    avatar: null,
+    email: '',
+    mobile: '',
+    name: ''
 })
 
 const pwdRules = ref({
-  oldPassword: [
-    { required: true, message: '请输入旧密码', trigger: 'blur' }
-  ],
-  newPassword: [
-    { required: true, message: '请输入新密码', trigger: 'blur' },
-    { min: 6, message: '密码长度不能小于6位', trigger: 'blur' }
-  ],
-  enterPassword: [
-    { required: true, message: '请再次输入新密码', trigger: 'blur' },
-    { min: 6, message: '密码长度不能小于6位', trigger: 'blur' },
-    // 添加一个自定义校验规则来确保新密码和确认密码一致
-    {
-      validator: (rule, value, callback) => {
-        if (value !== pwdForm.value.newPassword) {
-          callback(new Error('两次输入的密码不一致'))
-        } else {
-          callback()
+    oldPassword: [
+        { required: true, message: '请输入旧密码', trigger: 'blur' }
+    ],
+    newPassword: [
+        { required: true, message: '请输入新密码', trigger: 'blur' },
+        { min: 6, message: '密码长度不能小于6位', trigger: 'blur' }
+    ],
+    enterPassword: [
+        { required: true, message: '请再次输入新密码', trigger: 'blur' },
+        { min: 6, message: '密码长度不能小于6位', trigger: 'blur' },
+        // 添加一个自定义校验规则来确保新密码和确认密码一致
+        {
+            validator: (rule, value, callback) => {
+                if (value !== pwdForm.value.newPassword) {
+                    callback(new Error('两次输入的密码不一致'))
+                } else {
+                    callback()
+                }
+            }, trigger: 'blur'
         }
-      }, trigger: 'blur'
-    }
-  ]
+    ]
 })
 
 onMounted(() => {
-  getList()
+    getList()
 })
 
 function getList() {
-  getUserInfo().then((res) => {
-    if (res.code == 200) {
-      originForm.value = res.data
-      form.value = { ...originForm.value }
-    } else {
-      ElMessage({
-        message: res.msg,
-        type: 'error'
-      })
-    }
-  })
+    getUserInfo().then((res) => {
+        if (res.code == 200) {
+            originForm.value = res.data
+            form.value = { ...originForm.value }
+        } else {
+            ElMessage({
+                message: res.msg,
+                type: 'error'
+            })
+        }
+    })
 }
 
 function changeInfo() {
-  if (!isEdit.value) {
-    form.value = { ...originForm.value }
-    form.value.avatar = null
-    isEdit.value = true
-  } else {
-    console.log('保存了')
-    // 保存
-    if (!form.value.mobile.length || !form.value.name.length || !form.value.email.length) {
-      ElMessage({
-        message: '信息填写不完整',
-        type: 'warning'
-      })
+    if (!isEdit.value) {
+        form.value = { ...originForm.value }
+        form.value.avatar = null
+        isEdit.value = true
     } else {
-      let { avatar, email, mobile, name } = form.value
-      updateUserInfo({
-          avatar,
-          email,
-          mobile,
-          name
-        }
-      ).then((res) => {
-        if (res.code == 200) {
-          isEdit.value = false
-          getList()
-          ElMessage({
-            message: '修改成功',
-            type: 'success'
-          })
+        console.log('保存了')
+        // 保存
+        if (!form.value.mobile.length || !form.value.name.length || !form.value.email.length) {
+            ElMessage({
+                message: '信息填写不完整',
+                type: 'warning'
+            })
+        } else {
+            let { avatar, email, mobile, name } = form.value
+            updateUserInfo({
+                avatar,
+                email,
+                mobile,
+                name
+            }
+            ).then((res) => {
+                if (res.code == 200) {
+                    isEdit.value = false
+                    getList()
+                    ElMessage({
+                        message: '修改成功',
+                        type: 'success'
+                    })
+                }
+            })
         }
-      })
     }
-  }
 }
 
 function cancelInfo() {
-  isEdit.value = false
-  form.value = { ...originForm.value }
+    isEdit.value = false
+    form.value = { ...originForm.value }
 }
 
 function changePassword() {
-  pwdFormRef.value.validate((valid) => {
-    if (valid) {
-      // 执行密码修改逻辑
-      upChangePassword({
-        oldPassword: Encrypt(pwdForm.value.oldPassword),
-        newPassword: Encrypt(pwdForm.value.newPassword),
-        enterPassword: Encrypt(pwdForm.value.enterPassword)
-      }).then((res) => {
-        if (res.code == 200) {
-          console.log('密码修改成功', pwdForm.value)
-          cancelPassword()
-          ElMessage.success('密码修改成功')
-          useUserStore().logOut().then(() => {
-            router.push('/login')
-          })
+    pwdFormRef.value.validate((valid) => {
+        if (valid) {
+            // 执行密码修改逻辑
+            upChangePassword({
+                oldPassword: Encrypt(pwdForm.value.oldPassword),
+                newPassword: Encrypt(pwdForm.value.newPassword),
+                enterPassword: Encrypt(pwdForm.value.enterPassword)
+            }).then((res) => {
+                if (res.code == 200) {
+                    console.log('密码修改成功', pwdForm.value)
+                    cancelPassword()
+                    ElMessage.success('密码修改成功')
+                    useUserStore().logOut().then(() => {
+                        router.push('/login')
+                    })
+                } else {
+                    ElMessage.error(res.msg)
+                }
+            })
         } else {
-          ElMessage.error(res.msg)
+            ElMessage.error('表单数据有误,请按提示修改后再提交')
+            return false
         }
-      })
-    } else {
-      ElMessage.error('表单数据有误,请按提示修改后再提交')
-      return false
-    }
-  })
+    })
 }
 
 function cancelPassword() {
-  pwdForm.value = {
-    oldPassword: '',
-    newPassword: '',
-    enterPassword: ''
-  }
-  isPwdDialogVisible.value = false
+    pwdForm.value = {
+        oldPassword: '',
+        newPassword: '',
+        enterPassword: ''
+    }
+    isPwdDialogVisible.value = false
 }
 
 function customRequest(content) {
-  const dFormData = new FormData()
-  dFormData.append('file', content.file)
-  console.log(content.file,'12312')
-  uploadPhoto(dFormData).then((res)=>{
-    if (res.code == '200') {
-      form.value.avatar = res.data.link
-    }
-  })
+    const dFormData = new FormData()
+    dFormData.append('file', content.file)
+    console.log(content.file, '12312')
+    uploadPhoto(dFormData).then((res) => {
+        if (res.code == '200') {
+            form.value.avatar = res.data.link
+        }
+    })
 }
 
 function beforeAvatarUpload(rawFile) {
-  if (rawFile.type !== 'image/jpeg' && rawFile.type !== 'image/png') { // 允许JPG和PNG格式
-    ElMessage.error('只能上传JPG或PNG格式的图片!')
-    return false
-  } else if (rawFile.size / 1024 / 1024 > 2) {
-    ElMessage.error('头像尺寸不可以大于2MB!')
-    return false
-  }
-  return true
+    if (rawFile.type !== 'image/jpeg' && rawFile.type !== 'image/png') { // 允许JPG和PNG格式
+        ElMessage.error('只能上传JPG或PNG格式的图片!')
+        return false
+    } else if (rawFile.size / 1024 / 1024 > 2) {
+        ElMessage.error('头像尺寸不可以大于2MB!')
+        return false
+    }
+    return true
 }
 </script>
 
 <style lang='scss' scoped>
-
 .avatar-uploader .el-upload {
   border: 1px dashed var(--el-border-color);
   border-radius: 6px;

+ 90 - 90
src/views/test.vue

@@ -1,43 +1,44 @@
 <template>
-  <!-- <div>
-      1
+    <!-- <div>
+        1
     </div> -->
 
-  <el-button type="primary" @click="toggle1">
-    <el-icon class="tjm_btn_icon_right" size="16"><tjm-icon-ep-setting /></el-icon>
-    新增
-  </el-button>
-  <el-config-provider :locale="localeLang">
-    <el-drawer title="主题设置" v-model="drawerVisible" size="300px">
-       <el-switch  @change="toggle" />
-      <el-switch v-model="theme1" @change="toggle2" />
-      <el-color-picker
-        :predefine="colorList"
-        @change="changePrimary"
-        v-model="color2"
-      />
-    </el-drawer>
-    {{ $t('noep.test.home') }}
-    <el-row class="mb-4">
-      <el-button>Default</el-button>
-      <el-button type="primary">Primary</el-button>
-      <el-button type="success">Success</el-button>
-      <el-button type="info">Info</el-button>
-      <el-button type="warning">Warning</el-button>
-      <el-button type="danger">Danger</el-button>
-    </el-row>
-    <el-date-picker type="date" size="small" />
-    <el-table :data="tableData" style="width: 100%">
-      <el-table-column prop="date" label="Date" width="180" />
-      <el-table-column prop="name" label="Name" width="180" />
-      <el-table-column prop="address" label="Address" />
-    </el-table>
-    <!-- <div class="warp">
-      <router-view></router-view>
-    </div> -->
-    <el-pagination background layout="total,sizes,prev, pager, next," :total="20"  :page-sizes="[20, 30, 100]"  />
-  </el-config-provider>
+    <el-button type="primary" @click="toggle1">
+        <el-icon class="tjm_btn_icon_right"><tjm-icon-ep-setting /></el-icon>
+        新增
+    </el-button>
+    <el-config-provider :locale="localeLang">
+        <el-drawer title="主题设置" v-model="drawerVisible" size="300px">
+            <el-switch  @change="toggle" />
+            <el-switch v-model="theme1" @change="toggle2" />
+            <el-color-picker
+                :predefine="colorList"
+                @change="changePrimary"
+                v-model="color2"
+            />
+        </el-drawer>
+        {{ $t('noep.test.home') }}
+        <el-row class="mb-4">
+            <el-button>Default</el-button>
+            <el-button type="primary">Primary</el-button>
+            <el-button type="success">Success</el-button>
+            <el-button type="info">Info</el-button>
+            <el-button type="warning">Warning</el-button>
+            <el-button type="danger">Danger</el-button>
+        </el-row>
+        <el-date-picker type="date" size="small" />
+        <el-table :data="tableData" style="width: 100%">
+            <el-table-column prop="date" label="Date" width="180" />
+            <el-table-column prop="name" label="Name" width="180" />
+            <el-table-column prop="address" label="Address" />
+        </el-table>
+        <!-- <div class="warp">
+            <router-view></router-view>
+        </div> -->
+        <el-pagination background layout="total,sizes,prev, pager, next," :total="20"  :page-sizes="[20, 30, 100]"  />
+    </el-config-provider>
 </template>
+
 <script setup>
 import { getConfig, setConfig } from '@/config/config'
 import { getDarkColor, getLightColor } from '@/utils/color.js'
@@ -50,83 +51,82 @@ const value1 = ref(true)
 const color2 = ref(null)
 // 修改element 和 i18n 默认语言
 const changeLanguage = () => {
-  locale.value = getConfig('globalI18n')
-  localeLang.value = messages.value[locale.value]
+    locale.value = getConfig('globalI18n')
+    localeLang.value = messages.value[locale.value]
 }
 const colorList = [
-  '#DAA96E',
-  '#0C819F',
-  '#722ed1',
-  '#27ae60',
-  '#ff5c93',
-  '#e74c3c',
-  '#fd726d',
-  '#f39c12',
-  '#9b59b6'
+    '#DAA96E',
+    '#0C819F',
+    '#722ed1',
+    '#27ae60',
+    '#ff5c93',
+    '#e74c3c',
+    '#fd726d',
+    '#f39c12',
+    '#9b59b6'
 ]
 const changePrimary = val => {
-  if (!val) {
-    val = '#9b59b6'
-    ElMessage({
-      type: 'success',
-      message: `主题颜色已重置为 #9b59b6`
-    })
-  }
-  console.log(val)
-  // return
-  document.documentElement.style.setProperty('--el-color-primary', val)
-  // 颜色加深或变浅
-  for (let i = 1; i <= 9; i++) {
-    document.documentElement.style.setProperty(
-      `--el-color-primary-light-${i}`,
-      theme1.value
-        ? `${getDarkColor(val, i / 10)}`
-        : `${getLightColor(val, i / 10)}`
-    )
-    document.documentElement.style.setProperty(
-      `--el-color-primary-dark-${i}`,
-      theme1.value
-        ? `${getDarkColor(val, i / 10)}`
-        : `${getLightColor(val, i / 10)}`
-    )
-  }
+    if (!val) {
+        val = '#9b59b6'
+        ElMessage({
+            type: 'success',
+            message: `主题颜色已重置为 #9b59b6`
+        })
+    }
+    console.log(val)
+    // return
+    document.documentElement.style.setProperty('--el-color-primary', val)
+    // 颜色加深或变浅
+    for (let i = 1; i <= 9; i++) {
+        document.documentElement.style.setProperty(
+            `--el-color-primary-light-${i}`,
+            theme1.value
+                ? `${getDarkColor(val, i / 10)}`
+                : `${getLightColor(val, i / 10)}`
+        )
+        document.documentElement.style.setProperty(
+            `--el-color-primary-dark-${i}`,
+            theme1.value
+                ? `${getDarkColor(val, i / 10)}`
+                : `${getLightColor(val, i / 10)}`
+        )
+    }
 }
 
 const switchDark = () => {
-  const body = document.documentElement
-  if (theme1.value) body.setAttribute('class', 'dark')
-  else body.setAttribute('class', '')
+    const body = document.documentElement
+    if (theme1.value) body.setAttribute('class', 'dark')
+    else body.setAttribute('class', '')
 }
 const toggle2 = e => {
-  console.log(e)
-  switchDark()
+    console.log(e)
+    switchDark()
 }
 
 
 const theme1 = ref(false)
 const isDark = useDark({
-  // 存储到localStorage/sessionStorage中的Key 根据自己的需求更改
-  storageKey: 'useDarkKEY',
-  // 暗黑class名字
-  valueDark: 'dark',
-  // 高亮class名字
-  valueLight: 'light'
+    // 存储到localStorage/sessionStorage中的Key 根据自己的需求更改
+    storageKey: 'useDarkKEY',
+    // 暗黑class名字
+    valueDark: 'dark',
+    // 高亮class名字
+    valueLight: 'light'
 })
 
 // const toggle2 = useToggle(isDark)
 
 const toggle1 = () => {
-  drawerVisible.value = true
+    drawerVisible.value = true
 }
 const toggle = () => {
-  setConfig({
-    globalI18n: getConfig('globalI18n') == 'en' ? 'zh-cn' : 'en'
-  })
-  changeLanguage()
+    setConfig({
+        globalI18n: getConfig('globalI18n') == 'en' ? 'zh-cn' : 'en'
+    })
+    changeLanguage()
 }
 // 监听修改语言实现element
 watchEffect(changeLanguage)
 </script>
-<style lang="scss" scoped>
 
-</style>
+<style lang="scss" scoped></style>

+ 0 - 1
src/views/test/index1.vue

@@ -9,5 +9,4 @@
 </template>
 
 <style lang='scss' scoped>
-
 </style>

+ 0 - 1
src/views/test/index2.vue

@@ -9,5 +9,4 @@
 </template>
 
 <style lang='scss' scoped>
-
 </style>

+ 0 - 1
src/views/test/index3.vue

@@ -9,5 +9,4 @@
 </template>
 
 <style lang='scss' scoped>
-
 </style>

+ 0 - 1
src/views/test/index4.vue

@@ -9,5 +9,4 @@
 </template>
 
 <style lang='scss' scoped>
-
 </style>

+ 104 - 104
vite.config.js

@@ -11,113 +11,113 @@ import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
 import path from 'path'
 // https://vitejs.dev/config/
 export default defineConfig(({ mode }) => {
-  const viteEnv = loadEnv(mode, './')
-  return {
-    base: viteEnv.VITE_BASE,
-    server: {
-      host: '0.0.0.0',
-      port: '8080',
-      open: true,
-      strictPort: true,   
-      cors: true, 
-      proxy: {
-        [viteEnv.VITE_BASE_URL]: {
-          target: viteEnv.VITE_BASE_SERVER_URL,
-          changeOrigin: true,
-          rewrite: path => path.replace(viteEnv.VITE_BASE_URL, '/')
+    const viteEnv = loadEnv(mode, './')
+    return {
+        base: viteEnv.VITE_BASE,
+        server: {
+            host: '0.0.0.0',
+            port: '8080',
+            open: true,
+            strictPort: true,
+            cors: true,
+            proxy: {
+                [viteEnv.VITE_BASE_URL]: {
+                    target: viteEnv.VITE_BASE_SERVER_URL,
+                    changeOrigin: true,
+                    rewrite: path => path.replace(viteEnv.VITE_BASE_URL, '/')
+                },
+                // '/api': {
+                //   target: "http://qdport.gateway.10.236.3.36.nip.io",
+                //   changeOrigin: true,
+                //   rewrite: path => path.replace('/api', '/')
+                // }
+            }
         },
-        // '/api': {
-        //   target: "http://qdport.gateway.10.236.3.36.nip.io",
-        //   changeOrigin: true,
-        //   rewrite: path => path.replace('/api', '/')
-        // }
-      }
-    },
-    build: {
-      outDir: 'dist',
-      assetsDir: 'static/assets',
-      chunkSizeWarningLimit: 2000, 
-      rollupOptions: { 
-        output: {
-          chunkFileNames: 'static/js/[name]-[hash].js',
-          entryFileNames: 'static/js/[name]-[hash].js',
-          assetFileNames: 'static/[ext]/[name]-[hash].[ext]'
-        }
-      }
-    },
-    resolve: {
-      alias: {
-        '~': path.resolve(__dirname, './'),
-        '@': path.resolve(__dirname, './src')
-      },
-    },
-    css: {
-      preprocessorOptions: {
-        scss: {
-          additionalData: '@import "@/assets/style/variable.scss";'
-        }
-      }
-    },
-    plugins: [
-      vue({
-        template: {
-          compilerOptions: {
-            isCustomElement: tag => /^micro-app/.test(tag)
-          }
-        }
-      }),
-      AutoImport({
-        include: [
-          /\.[tj]sx?$/,
-          /\.vue$/,
-          /\.vue\?vue/, 
-          /\.md$/ // 
-        ],
-        imports: ['vue', 'pinia', 'vue-router', '@vueuse/core'],
-        eslintrc: {
-          enabled: true,
-          filepath: './.eslintrc-auto-import.json',
-          globalsPropValue: true
+        build: {
+            outDir: 'dist',
+            assetsDir: 'static/assets',
+            chunkSizeWarningLimit: 2000,
+            rollupOptions: {
+                output: {
+                    chunkFileNames: 'static/js/[name]-[hash].js',
+                    entryFileNames: 'static/js/[name]-[hash].js',
+                    assetFileNames: 'static/[ext]/[name]-[hash].[ext]'
+                }
+            }
         },
-        resolvers: [
-          ElementPlusResolver(),
-          IconsResolver({ componentPrefix: "tjm-icon", enabledCollections: ["ep", "home", "user"], })
-        ],
-      }),
-      Components({
-        dirs: ['src/components/', 'src/view/'],
-        include: [/\.vue$/, /\.vue\?vue/, /\.md$/],
-        resolvers: [
-          ElementPlusResolver(),
-          VueUseComponentsResolver(),
-          VueUseDirectiveResolver(),
-          IconsResolver({
-            prefix: "tjm-icon",
-            customCollections: ["ep", "home", "user"],
-          }),
-        ],
-      }),
-      // 静态Icon 插件配置 https://icones.js.org/ https://icones.netlify.app/  vscode插件Iconify IntelliSense
-      Icons({
-        compiler: "vue3",
-        customCollections: {
-          home: FileSystemIconLoader("src/assets/svg/home", (svg) =>
-            svg.replace(/^<svg /, '<svg fill="currentColor" ')
-          ),
-          user: FileSystemIconLoader("src/assets/svg/user", (svg) =>
-            svg.replace(/^<svg /, '<svg fill="currentColor" ')
-          ),
+        resolve: {
+            alias: {
+                '~': path.resolve(__dirname, './'),
+                '@': path.resolve(__dirname, './src')
+            },
         },
-        autoInstall: true,
-      }),
-      createSvgIconsPlugin({
-        iconDirs: [path.resolve(process.cwd(), 'src/assets/svg')],
-        symbolId: 'icon-[dir]-[name]',
-        svgoOptions: true
-      })
-    ],
-    
-  }
+        css: {
+            preprocessorOptions: {
+                scss: {
+                    additionalData: '@import "@/assets/style/variable.scss";'
+                }
+            }
+        },
+        plugins: [
+            vue({
+                template: {
+                    compilerOptions: {
+                        isCustomElement: tag => /^micro-app/.test(tag)
+                    }
+                }
+            }),
+            AutoImport({
+                include: [
+                    /\.[tj]sx?$/,
+                    /\.vue$/,
+                    /\.vue\?vue/,
+                    /\.md$/ // 
+                ],
+                imports: ['vue', 'pinia', 'vue-router', '@vueuse/core'],
+                eslintrc: {
+                    enabled: true,
+                    filepath: './.eslintrc-auto-import.json',
+                    globalsPropValue: true
+                },
+                resolvers: [
+                    ElementPlusResolver(),
+                    IconsResolver({ componentPrefix: "tjm-icon", enabledCollections: ["ep", "home", "user"], })
+                ],
+            }),
+            Components({
+                dirs: ['src/components/', 'src/view/'],
+                include: [/\.vue$/, /\.vue\?vue/, /\.md$/],
+                resolvers: [
+                    ElementPlusResolver(),
+                    VueUseComponentsResolver(),
+                    VueUseDirectiveResolver(),
+                    IconsResolver({
+                        prefix: "tjm-icon",
+                        customCollections: ["ep", "home", "user"],
+                    }),
+                ],
+            }),
+            // 静态Icon 插件配置 https://icones.js.org/ https://icones.netlify.app/  vscode插件Iconify IntelliSense
+            Icons({
+                compiler: "vue3",
+                customCollections: {
+                    home: FileSystemIconLoader("src/assets/svg/home", (svg) =>
+                        svg.replace(/^<svg /, '<svg fill="currentColor" ')
+                    ),
+                    user: FileSystemIconLoader("src/assets/svg/user", (svg) =>
+                        svg.replace(/^<svg /, '<svg fill="currentColor" ')
+                    ),
+                },
+                autoInstall: true,
+            }),
+            createSvgIconsPlugin({
+                iconDirs: [path.resolve(process.cwd(), 'src/assets/svg')],
+                symbolId: 'icon-[dir]-[name]',
+                svgoOptions: true
+            })
+        ],
+
+    }
 }
 
 )