Browse Source

初始化元宇宙构建工具后台

半生瓜 3 months ago
commit
320f646364
100 changed files with 4303 additions and 0 deletions
  1. 28 0
      .env.base
  2. 46 0
      .env.dev
  3. 38 0
      .env.gitee
  4. 45 0
      .env.pro
  5. 46 0
      .env.test
  6. 8 0
      .eslintignore
  7. 70 0
      .eslintrc.js
  8. 9 0
      .gitignore
  9. 10 0
      .prettierignore
  10. 6 0
      .stylelintignore
  11. 3 0
      .vscode/extensions.json
  12. 19 0
      .vscode/settings.json
  13. 837 0
      CHANGELOG.md
  14. 21 0
      LICENSE
  15. 135 0
      README.md
  16. 132 0
      README.zh-CN.md
  17. 28 0
      commitlint.config.js
  18. 154 0
      index.html
  19. 18 0
      mock/_createProductionServer.ts
  20. 150 0
      mock/role/index.mock.ts
  21. 249 0
      mock/table/index.mock.ts
  22. 90 0
      mock/user/index.mock.ts
  23. 134 0
      package.json
  24. 11 0
      plop/component/component.hbs
  25. 3 0
      plop/component/index.hbs
  26. 38 0
      plop/component/prompt.js
  27. 37 0
      plop/view/prompt.js
  28. 7 0
      plop/view/view.hbs
  29. 7 0
      plopfile.js
  30. 5 0
      postcss.config.js
  31. 19 0
      prettier.config.js
  32. BIN
      public/favicon.ico
  33. BIN
      public/logo.png
  34. 79 0
      src/App.vue
  35. 61 0
      src/api/System/index.ts
  36. 9 0
      src/api/System/types.ts
  37. 25 0
      src/api/audit/index.ts
  38. 9 0
      src/api/audit/types.ts
  39. 43 0
      src/api/login/index.ts
  40. 14 0
      src/api/login/types.ts
  41. 29 0
      src/api/resource/index.ts
  42. 9 0
      src/api/resource/types.ts
  43. 36 0
      src/api/role/index.ts
  44. 9 0
      src/api/role/types.ts
  45. 54 0
      src/api/table/index.ts
  46. 9 0
      src/api/table/types.ts
  47. 27 0
      src/api/user/index.ts
  48. 9 0
      src/api/user/types.ts
  49. BIN
      src/assets/imgs/avatar.jpg
  50. BIN
      src/assets/imgs/avatar.png
  51. BIN
      src/assets/imgs/dian.png
  52. BIN
      src/assets/imgs/diandian.png
  53. BIN
      src/assets/imgs/loginbg.png
  54. BIN
      src/assets/imgs/loginimg.png
  55. BIN
      src/assets/imgs/logo.png
  56. 1 0
      src/assets/svgs/403.svg
  57. 1 0
      src/assets/svgs/404.svg
  58. 1 0
      src/assets/svgs/500.svg
  59. 1 0
      src/assets/svgs/icon.svg
  60. 1 0
      src/assets/svgs/login-bg.svg
  61. 1 0
      src/assets/svgs/login-box-bg.svg
  62. 1 0
      src/assets/svgs/message.svg
  63. 1 0
      src/assets/svgs/money.svg
  64. 1 0
      src/assets/svgs/peoples.svg
  65. 1 0
      src/assets/svgs/shopping.svg
  66. 61 0
      src/axios/config.ts
  67. 56 0
      src/axios/index.ts
  68. 98 0
      src/axios/service.ts
  69. 31 0
      src/axios/types/index.ts
  70. 3 0
      src/components/Backtop/index.ts
  71. 15 0
      src/components/Backtop/src/Backtop.vue
  72. 3 0
      src/components/Breadcrumb/index.ts
  73. 126 0
      src/components/Breadcrumb/src/Breadcrumb.vue
  74. 31 0
      src/components/Breadcrumb/src/helper.ts
  75. 3 0
      src/components/Button/index.ts
  76. 121 0
      src/components/Button/src/Button.vue
  77. 3 0
      src/components/Collapse/index.ts
  78. 34 0
      src/components/Collapse/src/Collapse.vue
  79. 5 0
      src/components/ConfigGlobal/index.ts
  80. 62 0
      src/components/ConfigGlobal/src/ConfigGlobal.vue
  81. 5 0
      src/components/ConfigGlobal/src/types/index.ts
  82. 3 0
      src/components/ContentDetailWrap/index.ts
  83. 25 0
      src/components/ContentDetailWrap/src/ContentDetailWrap.vue
  84. 3 0
      src/components/ContentWrap/index.ts
  85. 33 0
      src/components/ContentWrap/src/ContentWrap.vue
  86. 12 0
      src/components/ContextMenu/index.ts
  87. 72 0
      src/components/ContextMenu/src/ContextMenu.vue
  88. 7 0
      src/components/ContextMenu/src/types/index.ts
  89. 5 0
      src/components/Descriptions/index.ts
  90. 161 0
      src/components/Descriptions/src/Descriptions.vue
  91. 15 0
      src/components/Descriptions/src/types/index.ts
  92. 3 0
      src/components/Dialog/index.ts
  93. 132 0
      src/components/Dialog/src/Dialog.vue
  94. 8 0
      src/components/Editor/index.ts
  95. 254 0
      src/components/Editor/src/Editor.vue
  96. 3 0
      src/components/Error/index.ts
  97. 58 0
      src/components/Error/src/Error.vue
  98. 3 0
      src/components/Footer/index.ts
  99. 14 0
      src/components/Footer/src/Footer.vue
  100. 0 0
      src/components/Form/index.ts

+ 28 - 0
.env.base

@@ -0,0 +1,28 @@
1
+###
2
+ # @Author: 半生瓜 1515706227@qq.com
3
+ # @Date: 2024-04-21 17:20:21
4
+ # @LastEditors: 半生瓜 1515706227@qq.com
5
+ # @LastEditTime: 2024-05-23 09:57:01
6
+ # @FilePath: \vue-element-plus-admin-mini\.env.base
7
+ # @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
8
+### 
9
+# 环境
10
+VITE_NODE_ENV=development
11
+
12
+# 接口前缀
13
+VITE_API_BASE_PATH='https://test.you07.com/link-server'
14
+
15
+# 打包路径
16
+VITE_BASE_PATH=/
17
+
18
+# 标题
19
+VITE_APP_TITLE='灵客管理后台'
20
+
21
+# 是否全量引入element-plus样式
22
+VITE_USE_ALL_ELEMENT_PLUS_STYLE=true
23
+
24
+# 是否开启mock
25
+VITE_USE_MOCK=true
26
+
27
+# 是否使用在线图标
28
+VITE_USE_ONLINE_ICON=true

+ 46 - 0
.env.dev

@@ -0,0 +1,46 @@
1
+###
2
+ # @Author: 半生瓜 1515706227@qq.com
3
+ # @Date: 2024-04-21 17:20:21
4
+ # @LastEditors: 半生瓜 1515706227@qq.com
5
+ # @LastEditTime: 2024-05-22 19:14:04
6
+ # @FilePath: \vue-element-plus-admin-mini\.env.dev
7
+ # @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
8
+### 
9
+# 环境
10
+VITE_NODE_ENV=production
11
+
12
+# 接口前缀
13
+VITE_API_BASE_PATH='https://test.you07.com/link-server'
14
+
15
+# 打包路径
16
+VITE_BASE_PATH=./
17
+
18
+# 是否删除debugger
19
+VITE_DROP_DEBUGGER=false
20
+
21
+# 是否删除console.log
22
+VITE_DROP_CONSOLE=true
23
+
24
+# 是否sourcemap
25
+VITE_SOURCEMAP=true
26
+
27
+# 输出路径
28
+VITE_OUT_DIR=dist-dev
29
+
30
+# 标题
31
+VITE_APP_TITLE='灵客管理后台'
32
+
33
+# 是否包分析
34
+VITE_USE_BUNDLE_ANALYZER=false
35
+
36
+# 是否全量引入element-plus样式
37
+VITE_USE_ALL_ELEMENT_PLUS_STYLE=false
38
+
39
+# 是否开启mock
40
+VITE_USE_MOCK=false
41
+
42
+# 是否切割css
43
+VITE_USE_CSS_SPLIT=true
44
+
45
+# 是否使用在线图标
46
+VITE_USE_ONLINE_ICON=true

+ 38 - 0
.env.gitee

@@ -0,0 +1,38 @@
1
+# 环境
2
+VITE_NODE_ENV=production
3
+
4
+# 接口前缀
5
+VITE_API_BASE_PATH='https://test.you07.com/link-server'
6
+
7
+# 打包路径
8
+VITE_BASE_PATH=/vue-element-plus-admin/
9
+
10
+# 是否删除debugger
11
+VITE_DROP_DEBUGGER=true
12
+
13
+# 是否删除console.log
14
+VITE_DROP_CONSOLE=true
15
+
16
+# 是否sourcemap
17
+VITE_SOURCEMAP=false
18
+
19
+# 输出路径
20
+VITE_OUT_DIR=dist-pro
21
+
22
+# 标题
23
+VITE_APP_TITLE='灵客管理后台'
24
+
25
+# 是否包分析
26
+VITE_USE_BUNDLE_ANALYZER=false
27
+
28
+# 是否全量引入element-plus样式
29
+VITE_USE_ALL_ELEMENT_PLUS_STYLE=false
30
+
31
+# 是否开启mock
32
+VITE_USE_MOCK=true
33
+
34
+# 是否切割css
35
+VITE_USE_CSS_SPLIT=true
36
+
37
+# 是否使用在线图标
38
+VITE_USE_ONLINE_ICON=true

+ 45 - 0
.env.pro

@@ -0,0 +1,45 @@
1
+###
2
+ # @Author: 半生瓜 1515706227@qq.com
3
+ # @Date: 2024-04-21 17:20:21
4
+ # @LastEditors: 半生瓜 1515706227@qq.com
5
+ # @LastEditTime: 2024-05-16 17:37:50
6
+ # @FilePath: \vue-element-plus-admin-mini\.env.pro
7
+ # @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
8
+### 
9
+# 环境
10
+VITE_NODE_ENV=production
11
+
12
+# 接口前缀
13
+VITE_API_BASE_PATH='https://test.you07.com/link-server'
14
+# 打包路径
15
+VITE_BASE_PATH=./
16
+
17
+# 是否删除debugger
18
+VITE_DROP_DEBUGGER=true
19
+
20
+# 是否删除console.log
21
+VITE_DROP_CONSOLE=true
22
+
23
+# 是否sourcemap
24
+VITE_SOURCEMAP=false
25
+
26
+# 输出路径
27
+VITE_OUT_DIR=dist-pro
28
+
29
+# 标题
30
+VITE_APP_TITLE='灵客管理后台'
31
+
32
+# 是否包分析
33
+VITE_USE_BUNDLE_ANALYZER=true
34
+
35
+# 是否全量引入element-plus样式
36
+VITE_USE_ALL_ELEMENT_PLUS_STYLE=false
37
+
38
+# 是否开启mock
39
+VITE_USE_MOCK=true
40
+
41
+# 是否切割css
42
+VITE_USE_CSS_SPLIT=true
43
+
44
+# 是否使用在线图标
45
+VITE_USE_ONLINE_ICON=true

+ 46 - 0
.env.test

@@ -0,0 +1,46 @@
1
+###
2
+ # @Author: 半生瓜 1515706227@qq.com
3
+ # @Date: 2024-04-21 17:20:21
4
+ # @LastEditors: 半生瓜 1515706227@qq.com
5
+ # @LastEditTime: 2024-05-10 16:02:33
6
+ # @FilePath: \vue-element-plus-admin-mini\.env.test
7
+ # @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
8
+### 
9
+# 环境
10
+VITE_NODE_ENV=production
11
+
12
+# 接口前缀
13
+VITE_API_BASE_PATH='https://test.you07.com/link-server'
14
+
15
+# 打包路径
16
+VITE_BASE_PATH=/dist-test/
17
+
18
+# 是否删除debugger
19
+VITE_DROP_DEBUGGER=false
20
+
21
+# 是否删除console.log
22
+VITE_DROP_CONSOLE=false
23
+
24
+# 是否sourcemap
25
+VITE_SOURCEMAP=true
26
+
27
+# 输出路径
28
+VITE_OUT_DIR=dist-test
29
+
30
+# 标题
31
+VITE_APP_TITLE='灵客管理后台'
32
+
33
+# 是否包分析
34
+VITE_USE_BUNDLE_ANALYZER=false
35
+
36
+# 是否全量引入element-plus样式
37
+VITE_USE_ALL_ELEMENT_PLUS_STYLE=false
38
+
39
+# 是否开启mock
40
+VITE_USE_MOCK=true
41
+
42
+# 是否切割css
43
+VITE_USE_CSS_SPLIT=false
44
+
45
+# 是否使用在线图标
46
+VITE_USE_ONLINE_ICON=true

+ 8 - 0
.eslintignore

@@ -0,0 +1,8 @@
1
+/build/
2
+/config/
3
+/dist/
4
+/*.js
5
+/test/unit/coverage/
6
+/node_modules/*
7
+/dist*
8
+/src/main.ts

+ 70 - 0
.eslintrc.js

@@ -0,0 +1,70 @@
1
+// @ts-check
2
+const { defineConfig } = require('eslint-define-config')
3
+module.exports = defineConfig({
4
+  root: true,
5
+  env: {
6
+    browser: true,
7
+    node: true,
8
+    es6: true
9
+  },
10
+  parser: 'vue-eslint-parser',
11
+  parserOptions: {
12
+    parser: '@typescript-eslint/parser',
13
+    ecmaVersion: 2020,
14
+    sourceType: 'module',
15
+    jsxPragma: 'React',
16
+    ecmaFeatures: {
17
+      jsx: true
18
+    }
19
+  },
20
+  extends: [
21
+    'plugin:vue/vue3-recommended',
22
+    'plugin:@typescript-eslint/recommended',
23
+    'prettier',
24
+    'plugin:prettier/recommended'
25
+  ],
26
+  rules: {
27
+    'vue/no-setup-props-destructure': 'off',
28
+    'vue/script-setup-uses-vars': 'error',
29
+    'vue/no-reserved-component-names': 'off',
30
+    '@typescript-eslint/ban-ts-ignore': 'off',
31
+    '@typescript-eslint/explicit-function-return-type': 'off',
32
+    '@typescript-eslint/no-explicit-any': 'off',
33
+    '@typescript-eslint/no-var-requires': 'off',
34
+    '@typescript-eslint/no-empty-function': 'off',
35
+    'vue/custom-event-name-casing': 'off',
36
+    'no-use-before-define': 'off',
37
+    '@typescript-eslint/no-use-before-define': 'off',
38
+    '@typescript-eslint/ban-ts-comment': 'off',
39
+    '@typescript-eslint/ban-types': 'off',
40
+    '@typescript-eslint/no-non-null-assertion': 'off',
41
+    '@typescript-eslint/explicit-module-boundary-types': 'off',
42
+    '@typescript-eslint/no-unused-vars': 'off',
43
+    'no-unused-vars': 'off',
44
+    'space-before-function-paren': 'off',
45
+
46
+    'vue/attributes-order': 'off',
47
+    'vue/one-component-per-file': 'off',
48
+    'vue/html-closing-bracket-newline': 'off',
49
+    'vue/max-attributes-per-line': 'off',
50
+    'vue/multiline-html-element-content-newline': 'off',
51
+    'vue/singleline-html-element-content-newline': 'off',
52
+    'vue/attribute-hyphenation': 'off',
53
+    'vue/require-default-prop': 'off',
54
+    'vue/require-explicit-emits': 'off',
55
+    'vue/html-self-closing': [
56
+      'error',
57
+      {
58
+        html: {
59
+          void: 'always',
60
+          normal: 'never',
61
+          component: 'always'
62
+        },
63
+        svg: 'always',
64
+        math: 'always'
65
+      }
66
+    ],
67
+    'vue/multi-word-component-names': 'off',
68
+    'vue/no-v-html': 'off'
69
+  }
70
+})

+ 9 - 0
.gitignore

@@ -0,0 +1,9 @@
1
+node_modules
2
+.DS_Store
3
+dist
4
+dist-ssr
5
+*.local
6
+/dist*
7
+*-lock.*
8
+pnpm-debug
9
+stats.html

+ 10 - 0
.prettierignore

@@ -0,0 +1,10 @@
1
+/node_modules/**
2
+/dist/
3
+/dist*
4
+/public/*
5
+/docs/*
6
+/vite.config.ts
7
+/src/types/env.d.ts
8
+/docs/**/*
9
+/plop/**/*
10
+CHANGELOG

+ 6 - 0
.stylelintignore

@@ -0,0 +1,6 @@
1
+/dist/*
2
+/public/*
3
+public/*
4
+/dist*
5
+/src/types/env.d.ts
6
+/docs/**/*

+ 3 - 0
.vscode/extensions.json

@@ -0,0 +1,3 @@
1
+{
2
+  "recommendations": ["vue.volar", "lokalise.i18n-ally"]
3
+}

+ 19 - 0
.vscode/settings.json

@@ -0,0 +1,19 @@
1
+{
2
+  "typescript.tsdk": "node_modules/typescript/lib",
3
+  "prettier.enable": false,
4
+  "editor.codeActionsOnSave": {
5
+    "source.fixAll.eslint": "explicit"
6
+  },
7
+  "[vue]": {
8
+    "editor.defaultFormatter": "octref.vetur"
9
+  },
10
+  "i18n-ally.localesPaths": ["src/locales"],
11
+  "i18n-ally.keystyle": "nested",
12
+  "i18n-ally.sortKeys": true,
13
+  "i18n-ally.namespace": false,
14
+  "i18n-ally.enabledParsers": ["ts"],
15
+  "i18n-ally.sourceLanguage": "en",
16
+  "i18n-ally.displayLanguage": "zh-CN",
17
+  "i18n-ally.enabledFrameworks": ["vue", "react"],
18
+  "god.tsconfig": "./tsconfig.json"
19
+}

+ 837 - 0
CHANGELOG.md

@@ -0,0 +1,837 @@
1
+# Changelog
2
+
3
+All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
+
5
+## [1.9.9](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.9.8...v1.9.9) (2023-04-13)
6
+
7
+
8
+### Bug Fixes
9
+
10
+* 使用动态路由时,多级路由只有一个子路且父路由未使用alwaysShow时,子路由未添加至路由中 ([9b330a1](https://github.com/kailong321200875/vue-element-plus-admin/commit/9b330a1f513d3af9233b9a9dde6bdfeeefbc3393))
11
+
12
+## [1.9.8](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.9.7...v1.9.8) (2023-04-12)
13
+
14
+
15
+### Bug Fixes
16
+
17
+* 修复已知问题 ([0a6f306](https://github.com/kailong321200875/vue-element-plus-admin/commit/0a6f306686ea024e30bcdccac34e485b8526e38f))
18
+
19
+## [1.9.7](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.9.6...v1.9.7) (2023-03-28)
20
+
21
+
22
+### Bug Fixes
23
+
24
+* 修复表格与搜索框字段不能不一致的问题 ([5c1cd29](https://github.com/kailong321200875/vue-element-plus-admin/commit/5c1cd298defefb36b858adc766b776a0a7b9bd66))
25
+
26
+## [1.9.6](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.9.5...v1.9.6) (2023-03-22)
27
+
28
+
29
+### Bug Fixes
30
+
31
+* 修改 Editor 的 z-index 使其不会遮挡『综合示例 - 新增』界面的下拉菜单 ([c046e45](https://github.com/kailong321200875/vue-element-plus-admin/commit/c046e4554ba8fd99614484d8fb636650072b833e))
32
+
33
+## [1.9.5](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.9.4...v1.9.5) (2023-03-13)
34
+
35
+
36
+### Bug Fixes
37
+
38
+* 面包屑:1.修复使用动态路由的时候,无法显示的bug ([8790c8c](https://github.com/kailong321200875/vue-element-plus-admin/commit/8790c8cbd8d63ea0f8f276fd5af006f39b06e7d3))
39
+
40
+## [1.9.4](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.9.3...v1.9.4) (2023-03-03)
41
+
42
+
43
+### Bug Fixes
44
+
45
+* 修复已知BUG ([782b8e2](https://github.com/kailong321200875/vue-element-plus-admin/commit/782b8e2f94c867c3ee282287c37c888fff93fc55))
46
+
47
+## [1.9.3](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.9.2...v1.9.3) (2023-03-01)
48
+
49
+
50
+### Types
51
+
52
+* 修复类型错误 ([297b2c6](https://github.com/kailong321200875/vue-element-plus-admin/commit/297b2c69a239b487126c3b9316645a1b5f06bb7c))
53
+
54
+
55
+### Styling
56
+
57
+* 抽屉弹出样式问题 ([16a3eef](https://github.com/kailong321200875/vue-element-plus-admin/commit/16a3eef85a1ffb296bd44f67d89a911ecaf1c25e))
58
+* 调整主题切换样式 ([6e6beef](https://github.com/kailong321200875/vue-element-plus-admin/commit/6e6beefc3c380f7297985adcabcf966fbd2c5197))
59
+
60
+## [1.9.2](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.9.1...v1.9.2) (2023-01-16)
61
+
62
+
63
+### Bug Fixes
64
+
65
+* 修复TS类型错误 ([1c06a27](https://github.com/kailong321200875/vue-element-plus-admin/commit/1c06a27b900a891cd0b47098062cebc984ff6505))
66
+
67
+## [1.9.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.9.0...v1.9.1) (2023-01-11)
68
+
69
+
70
+### Bug Fixes
71
+
72
+* dark mode toggle ([bbc7646](https://github.com/kailong321200875/vue-element-plus-admin/commit/bbc764601ec864c2fdbe3ad78c083c5ae80615e0))
73
+
74
+## [1.9.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.8.7...v1.9.0) (2022-12-28)
75
+
76
+
77
+### Features
78
+
79
+* 添加打包进度条 ([354e87f](https://github.com/kailong321200875/vue-element-plus-admin/commit/354e87f7c533ad8e93ef484b47d0fe16f17048c9))
80
+
81
+
82
+### Bug Fixes
83
+
84
+* husky ([6fe5b2e](https://github.com/kailong321200875/vue-element-plus-admin/commit/6fe5b2e6c781b251bff5f0ac936c04dcfe5ef95f))
85
+
86
+## [1.8.7](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.8.6...v1.8.7) (2022-12-05)
87
+
88
+
89
+### Bug Fixes
90
+
91
+* 解决iframe无法正常工作 ([4fcc46f](https://github.com/kailong321200875/vue-element-plus-admin/commit/4fcc46fccf747b47909e2079c4f2abc5dbfb1a0c))
92
+
93
+## [1.8.6](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.8.5...v1.8.6) (2022-11-21)
94
+
95
+
96
+### Bug Fixes
97
+
98
+* 修复Search组件无法默认值 ([3368fda](https://github.com/kailong321200875/vue-element-plus-admin/commit/3368fda251bd3ff5a8e0059b3b33f9c0339d236b))
99
+
100
+## [1.8.5](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.8.4...v1.8.5) (2022-11-17)
101
+
102
+
103
+### Bug Fixes
104
+
105
+* 修复Form赋值问题 ([f37cc1b](https://github.com/kailong321200875/vue-element-plus-admin/commit/f37cc1b5801add3ada168dbbcf4cd2c340f0e30d))
106
+
107
+## [1.8.4](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.8.3...v1.8.4) (2022-11-07)
108
+
109
+
110
+### Bug Fixes
111
+
112
+* 修复option禁用属性无效 ([0b671e9](https://github.com/kailong321200875/vue-element-plus-admin/commit/0b671e914e396c7666ad5e34768a6e29f7dfbd33))
113
+
114
+
115
+### Styling
116
+
117
+* input默认宽度与select对齐 ([0b671e9](https://github.com/kailong321200875/vue-element-plus-admin/commit/0b671e914e396c7666ad5e34768a6e29f7dfbd33))
118
+
119
+## [1.8.3](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.8.2...v1.8.3) (2022-10-28)
120
+
121
+
122
+### Performance Improvements
123
+
124
+* 优化描述组件 ([73ecc98](https://github.com/kailong321200875/vue-element-plus-admin/commit/73ecc98671d430013920246d98ce9ab1752e56eb))
125
+
126
+## [1.8.2](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.8.1...v1.8.2) (2022-10-18)
127
+
128
+
129
+### Bug Fixes
130
+
131
+* Correct spelling of words(aciton →action) ([eb405b2](https://github.com/kailong321200875/vue-element-plus-admin/commit/eb405b2a9041ca0ad4455db79bf617ec910dc485))
132
+* Correct spelling of words(tigger →trigger) ([c2ca2d7](https://github.com/kailong321200875/vue-element-plus-admin/commit/c2ca2d736c92e02380923a6741450844acb41a38))
133
+
134
+## [1.8.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.8.0...v1.8.1) (2022-10-11)
135
+
136
+
137
+### Bug Fixes
138
+
139
+* 修复cutMenu收起时 ([993af6b](https://github.com/kailong321200875/vue-element-plus-admin/commit/993af6bb6576249e66e0c0ea592ebf851f65ab8c))
140
+
141
+
142
+### Styling
143
+
144
+* cutMenu层级样式 ([32d2408](https://github.com/kailong321200875/vue-element-plus-admin/commit/32d2408588c487cff2cf73e3cc132e5105ff4459))
145
+
146
+## [1.8.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.7.1...v1.8.0) (2022-10-10)
147
+
148
+
149
+### Features
150
+
151
+* types优化 ([3351155](https://github.com/kailong321200875/vue-element-plus-admin/commit/33511553cd9055b036b2d7491f9c2eda123f8b22))
152
+
153
+
154
+### Styling
155
+
156
+* 优化第四种布局 ([122fa62](https://github.com/kailong321200875/vue-element-plus-admin/commit/122fa62d859413d16175e0d97c7bf13f232dbb3a))
157
+
158
+## [1.7.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.7.0...v1.7.1) (2022-10-10)
159
+
160
+
161
+### Bug Fixes
162
+
163
+* 修正types提示错误 ([ef3e006](https://github.com/kailong321200875/vue-element-plus-admin/commit/ef3e006859dcd8b93ffb7cffcaeae24cbb330f2a))
164
+
165
+## [1.7.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.6.6...v1.7.0) (2022-10-09)
166
+
167
+
168
+### Features
169
+
170
+* type抽离 ([8b4fa1a](https://github.com/kailong321200875/vue-element-plus-admin/commit/8b4fa1aa21aa2c1379288315ccd64a6f3375be51))
171
+
172
+## [1.6.6](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.6.5...v1.6.6) (2022-10-09)
173
+
174
+
175
+### Bug Fixes
176
+
177
+* table search params ([a62929a](https://github.com/kailong321200875/vue-element-plus-admin/commit/a62929a8dac21028d3dd1cddf98189492c33b093))
178
+
179
+## [1.6.5](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.6.4...v1.6.5) (2022-10-08)
180
+
181
+
182
+### Bug Fixes
183
+
184
+* The attribute of option does not work ([d946920](https://github.com/kailong321200875/vue-element-plus-admin/commit/d946920e61ed81beacf9f1f8be7ee1f50505f64d))
185
+
186
+
187
+### Performance Improvements
188
+
189
+* perf store ([d416178](https://github.com/kailong321200875/vue-element-plus-admin/commit/d416178d69ca6100be4b635922b1a22d27629f08))
190
+* token test ([b320e65](https://github.com/kailong321200875/vue-element-plus-admin/commit/b320e658d1a559a6eaebdf374d63649c223c2ecd))
191
+
192
+## [1.6.4](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.6.3...v1.6.4) (2022-09-21)
193
+
194
+
195
+### Bug Fixes
196
+
197
+* fix bug ([da39f3b](https://github.com/kailong321200875/vue-element-plus-admin/commit/da39f3bc904ca2d80f432a31709725f9a57deb19))
198
+
199
+## [1.6.3](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.6.2...v1.6.3) (2022-08-20)
200
+
201
+
202
+### Bug Fixes
203
+
204
+* 修复重定向错误 ([89d03fd](https://github.com/kailong321200875/vue-element-plus-admin/commit/89d03fd067e7aca565ceb84ea9276f340bbfcb60))
205
+
206
+
207
+### Styling
208
+
209
+* 调整样式 ([d29e151](https://github.com/kailong321200875/vue-element-plus-admin/commit/d29e151f8a660031a685f6ef9f789532b1b7b58b))
210
+
211
+## [1.6.2](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.6.1...v1.6.2) (2022-08-13)
212
+
213
+
214
+### Styling
215
+
216
+* Misspelling ([c43e833](https://github.com/kailong321200875/vue-element-plus-admin/commit/c43e833582e4f14ac78b0683f1eb3bdeb9fb4821))
217
+* perfect tableDemo ([c589edd](https://github.com/kailong321200875/vue-element-plus-admin/commit/c589edd960b23ad0c8b56d2c7880b61014114d45))
218
+
219
+
220
+### Code Refactoring
221
+
222
+* refactor axios ([0980640](https://github.com/kailong321200875/vue-element-plus-admin/commit/0980640f65fc80e3e58ba49e98db10b7b1b80077))
223
+
224
+## [1.6.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.6.0...v1.6.1) (2022-07-30)
225
+
226
+
227
+### Bug Fixes
228
+
229
+* fix menu active bug ([ff59fc7](https://github.com/kailong321200875/vue-element-plus-admin/commit/ff59fc7e133202945360a7e210f9cdf3a4a89dd7))
230
+* Pie chart data not updated ([55d4ce7](https://github.com/kailong321200875/vue-element-plus-admin/commit/55d4ce7e35ff9a0c5590bc3589160cfd304d3ae5))
231
+
232
+
233
+### Performance Improvements
234
+
235
+* add static router ([55522b0](https://github.com/kailong321200875/vue-element-plus-admin/commit/55522b0661a8df3ad3c8afafcc9f8fcb162c5a00))
236
+
237
+
238
+### Styling
239
+
240
+* tagviews styles update ([bff7d93](https://github.com/kailong321200875/vue-element-plus-admin/commit/bff7d9370db7a9c171828721bb99643dac2f235d))
241
+
242
+## [1.6.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.5.4...v1.6.0) (2022-07-18)
243
+
244
+
245
+### Features
246
+
247
+* 添加按钮权限 ([7bef662](https://github.com/kailong321200875/vue-element-plus-admin/commit/7bef662db1e91aa8164e9f7a92de3fe4480a3c3b))
248
+
249
+
250
+### Performance Improvements
251
+
252
+* 移除md5依赖 ([a123097](https://github.com/kailong321200875/vue-element-plus-admin/commit/a123097f1f38eac45e945c7d3fdccafc16ea9b69))
253
+
254
+
255
+### Styling
256
+
257
+* 压缩图片尺寸 ([ae3c565](https://github.com/kailong321200875/vue-element-plus-admin/commit/ae3c5657b604ffbdae5ce3ce3603626ad4acc5e5))
258
+
259
+
260
+### Docs
261
+
262
+* vite2 to vite3 ([b3918b9](https://github.com/kailong321200875/vue-element-plus-admin/commit/b3918b9c3c5de4b48811ec95967851cfb3c231e1))
263
+* vite2 to vite3 ([aaf07de](https://github.com/kailong321200875/vue-element-plus-admin/commit/aaf07de77aa600332880a894faa35757f787c012))
264
+
265
+## [1.6.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.5.4...v1.6.0) (2022-07-18)
266
+
267
+
268
+### Features
269
+
270
+* 添加按钮权限 ([7bef662](https://github.com/kailong321200875/vue-element-plus-admin/commit/7bef662db1e91aa8164e9f7a92de3fe4480a3c3b))
271
+
272
+
273
+### Performance Improvements
274
+
275
+* 移除md5依赖 ([a123097](https://github.com/kailong321200875/vue-element-plus-admin/commit/a123097f1f38eac45e945c7d3fdccafc16ea9b69))
276
+
277
+
278
+### Styling
279
+
280
+* 压缩图片尺寸 ([ae3c565](https://github.com/kailong321200875/vue-element-plus-admin/commit/ae3c5657b604ffbdae5ce3ce3603626ad4acc5e5))
281
+
282
+
283
+### Docs
284
+
285
+* vite2 to vite3 ([b3918b9](https://github.com/kailong321200875/vue-element-plus-admin/commit/b3918b9c3c5de4b48811ec95967851cfb3c231e1))
286
+* vite2 to vite3 ([aaf07de](https://github.com/kailong321200875/vue-element-plus-admin/commit/aaf07de77aa600332880a894faa35757f787c012))
287
+
288
+## [1.5.4](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.5.3...v1.5.4) (2022-07-16)
289
+
290
+
291
+### Bug Fixes
292
+
293
+* fix build:test error ([14530cf](https://github.com/kailong321200875/vue-element-plus-admin/commit/14530cf790bfbbe37c72fa831f0376bbb4209e9d))
294
+
295
+## [1.5.3](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.5.2...v1.5.3) (2022-07-01)
296
+
297
+
298
+### Bug Fixes
299
+
300
+* fix useCrudSchemas not work ([0a855b9](https://github.com/kailong321200875/vue-element-plus-admin/commit/0a855b93e282dfe7863b3fce31dde5d7e0d3e2b6))
301
+
302
+## [1.5.2](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.5.1...v1.5.2) (2022-07-01)
303
+
304
+
305
+### Performance Improvements
306
+
307
+* add useCrudSchemas demo ([ca3ce54](https://github.com/kailong321200875/vue-element-plus-admin/commit/ca3ce54630b723d87415b14c642440d6734876ff))
308
+
309
+## [1.5.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.5.0...v1.5.1) (2022-07-01)
310
+
311
+
312
+### Bug Fixes
313
+
314
+* change showMainRoute to canTo ([5e292f8](https://github.com/kailong321200875/vue-element-plus-admin/commit/5e292f8a2b2ded7297a2a76893e113ac81517d23))
315
+
316
+
317
+### Performance Improvements
318
+
319
+* dialog combine with form ([34aefb6](https://github.com/kailong321200875/vue-element-plus-admin/commit/34aefb64ab9237521a1225925264818eebff9ad3))
320
+* dynamic options demo ([1acb4d7](https://github.com/kailong321200875/vue-element-plus-admin/commit/1acb4d7e8f449ba342699f1b4387ac2404a4c1fb))
321
+* dynamic options demo ([9a3b617](https://github.com/kailong321200875/vue-element-plus-admin/commit/9a3b6177aa0fbc99c86c5073a1c6c696e1eaf890))
322
+* useCrudSchemas cutom label ([7864d83](https://github.com/kailong321200875/vue-element-plus-admin/commit/7864d830e2134d814609e722b7bad1754ea9460e))
323
+
324
+## [1.5.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.4.5...v1.5.0) (2022-06-25)
325
+
326
+
327
+### Features
328
+
329
+* refactoring API ([37b7583](https://github.com/kailong321200875/vue-element-plus-admin/commit/37b75839a591648b145065432efb1dc8c7a3b917))
330
+
331
+
332
+### Bug Fixes
333
+
334
+* 修复axios已知问题 ([537af57](https://github.com/kailong321200875/vue-element-plus-admin/commit/537af57a0aaa24c88ebe75acf52dc0403a58b04b))
335
+
336
+
337
+### Performance Improvements
338
+
339
+* perf axios config ([39edd84](https://github.com/kailong321200875/vue-element-plus-admin/commit/39edd84023109a84683c21ea33e41bd024756520))
340
+
341
+## [1.4.5](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.4.4...v1.4.5) (2022-06-09)
342
+
343
+
344
+### Bug Fixes
345
+
346
+* fix tagsview not work ([d88e051](https://github.com/kailong321200875/vue-element-plus-admin/commit/d88e0514349e877f1c5280a48f9b1bd2bfd622bf))
347
+* fix tagsview not work ([1bf2d4c](https://github.com/kailong321200875/vue-element-plus-admin/commit/1bf2d4c77287fdca7ed1cb8c9998a53f1375dc6f))
348
+
349
+
350
+### Types
351
+
352
+* fix types error ([586486a](https://github.com/kailong321200875/vue-element-plus-admin/commit/586486a68d4bf2a024e50a79945b4007324f642d))
353
+
354
+## [1.4.4](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.4.3...v1.4.4) (2022-06-06)
355
+
356
+
357
+### Types
358
+
359
+* fix type error ([d66f12e](https://github.com/kailong321200875/vue-element-plus-admin/commit/d66f12e0e77f6acf485bae06509d9ea4abcd1eaa))
360
+
361
+### [1.4.3](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.4.2...v1.4.3) (2022-06-01)
362
+
363
+
364
+### Bug Fixes
365
+
366
+* multiple requests when pageSize change and currentPage isn't 1 ([f71a250](https://github.com/kailong321200875/vue-element-plus-admin/commit/f71a2503bc521c01e7102feecf4ec39a5224a6bb))
367
+
368
+### [1.4.2](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.4.1...v1.4.2) (2022-05-15)
369
+
370
+
371
+### Styling
372
+
373
+* fix dark mode bug ([2f9fd5d](https://github.com/kailong321200875/vue-element-plus-admin/commit/2f9fd5d21550d771ec12ae3540b975e2eebcd25b))
374
+
375
+### [1.4.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.4.0...v1.4.1) (2022-05-12)
376
+
377
+
378
+### Bug Fixes
379
+
380
+* the warning of VSCode extensions ([a368c21](https://github.com/kailong321200875/vue-element-plus-admin/commit/a368c21fb9c41f98f31f51586a2023076a8a9132))
381
+
382
+## [1.4.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.3.2...v1.4.0) (2022-05-10)
383
+
384
+
385
+### Features
386
+
387
+* add dark mode ([0758a6a](https://github.com/kailong321200875/vue-element-plus-admin/commit/0758a6a9d83170e53d45d39c3313e52ff5885746))
388
+
389
+### [1.3.2](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.3.1...v1.3.2) (2022-05-07)
390
+
391
+
392
+### Bug Fixes
393
+
394
+* fix the problem that the page is stuck in top mode ([8d01f48](https://github.com/kailong321200875/vue-element-plus-admin/commit/8d01f48d5098195b10c03b3cb3a0f485ebc9e018))
395
+
396
+### [1.3.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.3.0...v1.3.1) (2022-05-06)
397
+
398
+
399
+### Bug Fixes
400
+
401
+* spelling 'useRenderChcekbox' ([ee92f03](https://github.com/kailong321200875/vue-element-plus-admin/commit/ee92f039bea4307ccfb819728d3e2ed04fa00e03))
402
+
403
+## [1.3.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.13...v1.3.0) (2022-04-26)
404
+
405
+
406
+### Features
407
+
408
+* add useCrudSchemas hook ([00d947e](https://github.com/kailong321200875/vue-element-plus-admin/commit/00d947e2f81105194b0622d33768f999e37ad28a))
409
+
410
+
411
+### Bug Fixes
412
+
413
+* fix Table slot warning ([0eac05d](https://github.com/kailong321200875/vue-element-plus-admin/commit/0eac05d4f973ff7b15e00973f6e96595a3cd6d43))
414
+
415
+
416
+### Code Refactoring
417
+
418
+* refactor useAxios ([185f1e6](https://github.com/kailong321200875/vue-element-plus-admin/commit/185f1e6e210ecaac28ebfdee4198b7ca2eaa0933))
419
+
420
+
421
+### Build System
422
+
423
+* add url ([ab0f59a](https://github.com/kailong321200875/vue-element-plus-admin/commit/ab0f59ac91a077cf060923fa76e6d57e05d0b21b))
424
+* update plugins ([c475a61](https://github.com/kailong321200875/vue-element-plus-admin/commit/c475a610c19094034306f2dc665e240c7c117f87))
425
+* update plugins ([dfedbc7](https://github.com/kailong321200875/vue-element-plus-admin/commit/dfedbc74fdb2c819a96b6263849bdaab59b9e337))
426
+
427
+### [1.2.13](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.12...v1.2.13) (2022-04-18)
428
+
429
+
430
+### Performance Improvements
431
+
432
+* Editor component support v-model ([d77f8e3](https://github.com/kailong321200875/vue-element-plus-admin/commit/d77f8e334d77ee43c9ee0f411733f7397b278bc0))
433
+
434
+### [1.2.12](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.11...v1.2.12) (2022-04-17)
435
+
436
+
437
+### Bug Fixes
438
+
439
+* fixed spelling 'ElememtPlusSzie' ([5dbbc60](https://github.com/kailong321200875/vue-element-plus-admin/commit/5dbbc608640d93fe68fec6f58fdb30a43e02aada))
440
+
441
+### [1.2.11](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.10...v1.2.11) (2022-04-14)
442
+
443
+
444
+### Bug Fixes
445
+
446
+* fix the error reported by the Editor component ([7dc6d8a](https://github.com/kailong321200875/vue-element-plus-admin/commit/7dc6d8a9d7289bfaf27f972e9ca1773c0a1ddd7d))
447
+* fix the error reported by the Editor component ([90ef985](https://github.com/kailong321200875/vue-element-plus-admin/commit/90ef9856a0885fa812339cb7047ecc98b86c7b73))
448
+
449
+
450
+### Performance Improvements
451
+
452
+* add tagsViewIcon setting ([d395f03](https://github.com/kailong321200875/vue-element-plus-admin/commit/d395f03a57a9265f1d39b3220fc7c9b983efee30))
453
+* add uniqueopened setting ([b060319](https://github.com/kailong321200875/vue-element-plus-admin/commit/b0603199a5ae0ee923483dad449f49220d36f444))
454
+
455
+
456
+### Build System
457
+
458
+* update plugins ([2ee4954](https://github.com/kailong321200875/vue-element-plus-admin/commit/2ee49549e7b601af26ef5204f7648d271f3348f2))
459
+
460
+
461
+### Styling
462
+
463
+* add layout background color ([9b614fe](https://github.com/kailong321200875/vue-element-plus-admin/commit/9b614fe89288538197c50f164586aeed7836b7a8))
464
+
465
+### [1.2.10](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.9...v1.2.10) (2022-04-12)
466
+
467
+
468
+### Bug Fixes
469
+
470
+* fix bug ([327522f](https://github.com/kailong321200875/vue-element-plus-admin/commit/327522f2b73ae0e11f8ebbc39394b06029ce0b65))
471
+
472
+
473
+### Styling
474
+
475
+* modify the commitlint package manager ([ba7e722](https://github.com/kailong321200875/vue-element-plus-admin/commit/ba7e7224ab58612548519415f5429c32827a61de))
476
+
477
+### [1.2.9](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.8...v1.2.9) (2022-04-12)
478
+
479
+
480
+### Docs
481
+
482
+* update changlog ([e37273d](https://github.com/kailong321200875/vue-element-plus-admin/commit/e37273d95d29a3bb752604658d550264aacdc979))
483
+
484
+### [1.2.8](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.7...v1.2.8) (2022-04-11)
485
+
486
+### Build System
487
+
488
+- update plugins ([00a573a](https://github.com/kailong321200875/vue-element-plus-admin/commit/00a573af3f455395b4ee2ab99a03f3103d466e9c))
489
+
490
+### Docs
491
+
492
+- update changlog ([62fc183](https://github.com/kailong321200875/vue-element-plus-admin/commit/62fc1839fdff3a4d06a7db4cf3f8ce2cb9aee681))
493
+
494
+### [1.2.7](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.6...v1.2.7) (2022-04-10)
495
+
496
+### Build System
497
+
498
+- update plugins ([f13a91d](https://github.com/kailong321200875/vue-element-plus-admin/commit/f13a91dd460b1dcdbd17aef723ab3ca2b01c34f0))
499
+
500
+### Styling
501
+
502
+- .bhs code formatting ([57b2707](https://github.com/kailong321200875/vue-element-plus-admin/commit/57b27071e9a33423c46542a5d0e5d5c2e9a3b718))
503
+
504
+### [1.2.6](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.5...v1.2.6) (2022-04-08)
505
+
506
+### Build System
507
+
508
+- update plugins ([d645892](https://github.com/kailong321200875/vue-element-plus-admin/commit/d645892cde2f7f43215a2ba1776ee94a322437bf))
509
+
510
+### [1.2.5](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.4...v1.2.5) (2022-04-08)
511
+
512
+### Performance Improvements
513
+
514
+- add plop ([fa54a17](https://github.com/kailong321200875/vue-element-plus-admin/commit/fa54a1704ffd93f7b42dbeb1229bc4868d2d3a6a))
515
+
516
+### Build System
517
+
518
+- update plugins ([18c6bd8](https://github.com/kailong321200875/vue-element-plus-admin/commit/18c6bd868622d954b51ea34e37516361ad4eb540))
519
+
520
+### Styling
521
+
522
+- fix padding and background color ([f8c9d54](https://github.com/kailong321200875/vue-element-plus-admin/commit/f8c9d54687edafd92f5b61bf5288bb1188c73f01))
523
+
524
+### [1.2.4](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.3...v1.2.4) (2022-04-06)
525
+
526
+### Bug Fixes
527
+
528
+- add Sticky props comment ([46133b3](https://github.com/kailong321200875/vue-element-plus-admin/commit/46133b3ff39d48d11cbcaa1f20a271118f48eb29))
529
+- fix bug ([179ca06](https://github.com/kailong321200875/vue-element-plus-admin/commit/179ca064ba8adbb3b063d9798ec1930ccc68e459))
530
+- fix remove unnecessary variables ([ca01cbf](https://github.com/kailong321200875/vue-element-plus-admin/commit/ca01cbfd98b63a0d76190fe8d43097fdc9df74e6))
531
+- fix style ([17c8fea](https://github.com/kailong321200875/vue-element-plus-admin/commit/17c8fea93811d9d9b708808484f5c907d761fcf1))
532
+- remove ContentDetailWrap style ([4ceaa9d](https://github.com/kailong321200875/vue-element-plus-admin/commit/4ceaa9d7816369d0dcaf3e18e4cdbbd6165cef88))
533
+
534
+### [1.2.3](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.2...v1.2.3) (2022-03-31)
535
+
536
+### Bug Fixes
537
+
538
+- fix refresh with query ([e94020f](https://github.com/kailong321200875/vue-element-plus-admin/commit/e94020ff541a061599486c0003258f1dbf13aba8))
539
+
540
+### [1.2.2](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.1...v1.2.2) (2022-03-30)
541
+
542
+### Bug Fixes
543
+
544
+- fix avatar height bug ([cd4ab76](https://github.com/kailong321200875/vue-element-plus-admin/commit/cd4ab767018941777174d7837045f5259d1cc403))
545
+- fix parmas to params ([2c7211c](https://github.com/kailong321200875/vue-element-plus-admin/commit/2c7211c89d7299ffc0a36bef8999b3c201dbaf4a))
546
+
547
+### [1.2.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.0...v1.2.1) (2022-03-29)
548
+
549
+### Bug Fixes
550
+
551
+- fix invalid paging ([ad184ee](https://github.com/kailong321200875/vue-element-plus-admin/commit/ad184ee9c0619da36f1ca3f26e67f18f88488523))
552
+
553
+### Build System
554
+
555
+- update plugins ([0c7276f](https://github.com/kailong321200875/vue-element-plus-admin/commit/0c7276feadaedef83e6a4ad9d457e26d408698a8))
556
+
557
+## [1.2.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.14...v1.2.0) (2022-03-27)
558
+
559
+### Features
560
+
561
+- add hooks demo ([c43f39e](https://github.com/kailong321200875/vue-element-plus-admin/commit/c43f39efef296266c64cc24690717d07fa0bcb85))
562
+- add inputPassword demo ([8f8b126](https://github.com/kailong321200875/vue-element-plus-admin/commit/8f8b1260e75df6998ebea617f62d4ab6be81d721))
563
+
564
+### Docs
565
+
566
+- update LICENSE ([69d3dcc](https://github.com/kailong321200875/vue-element-plus-admin/commit/69d3dcc7edf69e9b4e3042ddb11faa85ec7d39e2))
567
+
568
+### Styling
569
+
570
+- modify the function name to make it more semantic ([046ae51](https://github.com/kailong321200875/vue-element-plus-admin/commit/046ae512f02df2d3f08134949b9376a061c1eef3))
571
+- update Footer component presentation ([d4a9ba3](https://github.com/kailong321200875/vue-element-plus-admin/commit/d4a9ba3aa6758b8aac18b30e1a6b9501baff826c))
572
+- update Icon demo ([8597122](https://github.com/kailong321200875/vue-element-plus-admin/commit/85971227cd3055ea280cf493c7c42b250c1515da))
573
+
574
+### Tests
575
+
576
+- test push first commit ([a67bb48](https://github.com/kailong321200875/vue-element-plus-admin/commit/a67bb48f269651a2dcd01b9e33d10f20c42d76ee))
577
+
578
+### Build System
579
+
580
+- update plugins ([9c13d92](https://github.com/kailong321200875/vue-element-plus-admin/commit/9c13d92b36a2a7c95b9edb7821367fc8f0ac6658))
581
+- update server port ([d2be8c1](https://github.com/kailong321200875/vue-element-plus-admin/commit/d2be8c1a307a3c5daf363bd7f1d21e574598de5c))
582
+
583
+### [1.1.14](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.13...v1.1.14) (2022-03-22)
584
+
585
+### Bug Fixes
586
+
587
+- fix the bug that the form search function is invalid of the example-dialog page ([9ec30e7](https://github.com/kailong321200875/vue-element-plus-admin/commit/9ec30e719f89865497dbb1321be1df906f59f14e))
588
+
589
+### [1.1.13](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.12...v1.1.13) (2022-03-17)
590
+
591
+### Build System
592
+
593
+- update plugins ([a2d0313](https://github.com/kailong321200875/vue-element-plus-admin/commit/a2d03137899f9b16fc1d4a09a23576cd74e7950e))
594
+
595
+### [1.1.12](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.11...v1.1.12) (2022-03-15)
596
+
597
+### Build System
598
+
599
+- update plugins ([fee2252](https://github.com/kailong321200875/vue-element-plus-admin/commit/fee2252930b05b709d0c012e809568c4ed32bd89))
600
+
601
+### [1.1.11](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.10...v1.1.11) (2022-03-15)
602
+
603
+### Bug Fixes
604
+
605
+- fix the problem of blank bar when toggle the TagsView component ([b1d9771](https://github.com/kailong321200875/vue-element-plus-admin/commit/b1d9771c750709fe45061d13299a85dbbd6ead25))
606
+- fix the problem that no reaction when copy setting config in http page ([61e0e33](https://github.com/kailong321200875/vue-element-plus-admin/commit/61e0e33c64d6a889fe6ed80d27a10cf8b201d21a))
607
+
608
+### [1.1.10](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.9...v1.1.10) (2022-03-13)
609
+
610
+### Build System
611
+
612
+- update plugins ([0b525c8](https://github.com/kailong321200875/vue-element-plus-admin/commit/0b525c875075a28288e92243b205b337f85ab550))
613
+
614
+### [1.1.9](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.8...v1.1.9) (2022-03-07)
615
+
616
+### Build System
617
+
618
+- update plugins ([1456fd4](https://github.com/kailong321200875/vue-element-plus-admin/commit/1456fd49ec9abbfe1f25aeadfe5fed54fec07394))
619
+
620
+### [1.1.8](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.7...v1.1.8) (2022-03-07)
621
+
622
+### Docs
623
+
624
+- update changelog ([bf09441](https://github.com/kailong321200875/vue-element-plus-admin/commit/bf09441852e59b0d07d4949a33de75958696817f))
625
+
626
+### [1.1.7](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.6...v1.1.7) (2022-03-06)
627
+
628
+### Styling
629
+
630
+- add labelMessage attribute to Form component ([8c42790](https://github.com/kailong321200875/vue-element-plus-admin/commit/8c427907843ccb2dfd882d27c1e8a894c5616487))
631
+
632
+### [1.1.6](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.5...v1.1.6) (2022-03-04)
633
+
634
+### Bug Fixes
635
+
636
+- fix the problem that the tree data of Table component cannot be displayed ([bf83d3e](https://github.com/kailong321200875/vue-element-plus-admin/commit/bf83d3efbad9097f245c32cc07d1178580cec4e3))
637
+
638
+### [1.1.5](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.4...v1.1.5) (2022-03-02)
639
+
640
+### Bug Fixes
641
+
642
+- fix the problem of tagsview error when loginout ([835d76a](https://github.com/kailong321200875/vue-element-plus-admin/commit/835d76ae87b950106f957976ebc8f6f2e8842ddf))
643
+
644
+### Build System
645
+
646
+- update plugins ([de34bb1](https://github.com/kailong321200875/vue-element-plus-admin/commit/de34bb193d6c844dbc1cec38db5f61b3f95e19f2))
647
+
648
+### Styling
649
+
650
+- fix tabMenu z-index bug ([8b3be02](https://github.com/kailong321200875/vue-element-plus-admin/commit/8b3be02368a1bddb7dc78f18adbea7f4ebfe75d6))
651
+- fix tags-view style bug ([ebff817](https://github.com/kailong321200875/vue-element-plus-admin/commit/ebff81777b9c0b839256b83e321ecbdbff25fc73))
652
+
653
+### [1.1.4](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.3...v1.1.4) (2022-03-01)
654
+
655
+### CI
656
+
657
+- update workflow ([0490d18](https://github.com/kailong321200875/vue-element-plus-admin/commit/0490d18145cb0d9c4b066ab01a2c10cb527e38ba))
658
+- update workflow ([51f7bca](https://github.com/kailong321200875/vue-element-plus-admin/commit/51f7bca6034902b251d081ee383b0d796782d434))
659
+
660
+### [1.1.3](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.2...v1.1.3) (2022-03-01)
661
+
662
+### CI
663
+
664
+- update workflow ([91cc5c5](https://github.com/kailong321200875/vue-element-plus-admin/commit/91cc5c595cadc5695d8f54bdc4922d8f04439f24))
665
+
666
+### [1.1.2](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.1...v1.1.2) (2022-03-01)
667
+
668
+### Workflows
669
+
670
+- update workflow ([d9708aa](https://github.com/kailong321200875/vue-element-plus-admin/commit/d9708aae5bc0cb795bb0fbf8d17df753cc88ba1d))
671
+
672
+### [1.1.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.0...v1.1.1) (2022-03-01)
673
+
674
+### Workflows
675
+
676
+- update workflow ([085328a](https://github.com/kailong321200875/vue-element-plus-admin/commit/085328aba8c4f356bf7915a6bbdc1ec4f46ceeda))
677
+
678
+## [1.1.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.0.3...v1.1.0) (2022-03-01)
679
+
680
+### Features
681
+
682
+- 🎸 layout 三种布局重构完成 ([429e428](https://github.com/kailong321200875/vue-element-plus-admin/commit/429e42809cef33a33662e41ad50297217d128b8c))
683
+- 🎸 layout 布局重构 �[bd24b92](https://github.com/kailong321200875/vue-element-plus-admin/commit/bd24b92acb279343dbaf83b74f1ed2a3f57f1003))
684
+- 🎸 Table 组件重构完成并给出相应示 �[35879f8](https://github.com/kailong321200875/vue-element-plus-admin/commit/35879f8ecc0ffa76122a336e2eaa93ecfb408c1d))
685
+- 🎸 v0.0.4 发布 ([a58dc1b](https://github.com/kailong321200875/vue-element-plus-admin/commit/a58dc1b1c2774974782ef6d116b8805975b82b1c))
686
+- 🎸 初始化项 �[26d4c7c](https://github.com/kailong321200875/vue-element-plus-admin/commit/26d4c7c56894cf2031b3a7cce08d53c37f4a49e3))
687
+- 🎸 初版完成 ([5bfe4d2](https://github.com/kailong321200875/vue-element-plus-admin/commit/5bfe4d236fd9c2841da100f34c980b4572b67b20))
688
+- 🎸 新增 Detail 详情组件并给出相应示 �[e77a931](https://github.com/kailong321200875/vue-element-plus-admin/commit/e77a931ef2d2967a9717e27b187d68512c01284f))
689
+- 🎸 新增二维码组 �[85555ee](https://github.com/kailong321200875/vue-element-plus-admin/commit/85555eef7dc7d72cb701bdd81044ba8fb8e72acc))
690
+- 🎸 新增全局配置 ([f8405a6](https://github.com/kailong321200875/vue-element-plus-admin/commit/f8405a63c9b1288fbe95bae235b65a08e8fae8d2))
691
+- 🎸 新增固定 � 级菜单配 �[4c4903e](https://github.com/kailong321200875/vue-element-plus-admin/commit/4c4903e806c8818e320108cc3e5279d728061c29))
692
+- 🎸 新增权限管理及相关示例文 �[32b6583](https://github.com/kailong321200875/vue-element-plus-admin/commit/32b6583099646b2ee622ac7b35388468769b91b8))
693
+- 🎸 显示更多组建 � 发中 ([fa9f24d](https://github.com/kailong321200875/vue-element-plus-admin/commit/fa9f24d5da8d2e40d7c3661eabacb8f0474a7bf2))
694
+- 🎸 权限管理 � 发中 ([38f5211](https://github.com/kailong321200875/vue-element-plus-admin/commit/38f521174ba9eba750fee4516141d7a267f1c4ce))
695
+- 🎸 权限管理 � 发中 ([6d7ea66](https://github.com/kailong321200875/vue-element-plus-admin/commit/6d7ea6694d8299332018a6689bcd82502a9a552c))
696
+- 🎸 综合实例重构 �[5142e6e](https://github.com/kailong321200875/vue-element-plus-admin/commit/5142e6e323cb20c89a97398bf41d32c93ce42cad))
697
+- 🎸 重构 layout ([7ede021](https://github.com/kailong321200875/vue-element-plus-admin/commit/7ede02141e258ab4c88e9b4daad966513d4dbe68))
698
+- 🎸 重构 layout-classic 布局 ([29d9c98](https://github.com/kailong321200875/vue-element-plus-admin/commit/29d9c988605b822195900268da6bc3f3b0b9c770))
699
+- 🎸 重构 sider 组件 �[51313d7](https://github.com/kailong321200875/vue-element-plus-admin/commit/51313d7116c7ab2ded7e3a65514ea9ac413edecd))
700
+- Add analysis api ([83327ea](https://github.com/kailong321200875/vue-element-plus-admin/commit/83327ea763ebb233bb540513276ffa288fbcb4a1))
701
+- Add analysis demo ([cd06934](https://github.com/kailong321200875/vue-element-plus-admin/commit/cd069340fc5157535fdc82e792c6b6dce7d7a97e))
702
+- Add count-to demo ([d3fbd3a](https://github.com/kailong321200875/vue-element-plus-admin/commit/d3fbd3a06c3b802fc863b4dc8013122c14bd16f2))
703
+- Add Descriptions component and add Descriptions demo ([7ad46f8](https://github.com/kailong321200875/vue-element-plus-admin/commit/7ad46f828d626a87699cd4d3a959a5634577d580))
704
+- Add Dialog component and add dailog demo ([a18ad8f](https://github.com/kailong321200875/vue-element-plus-admin/commit/a18ad8f4a89b78c73e57d8d2543494243f656d05))
705
+- add doucment link ([53201ae](https://github.com/kailong321200875/vue-element-plus-admin/commit/53201ae97a425714871d99e8847a3672ba0d389f))
706
+- Add dynamic route ([9d926b2](https://github.com/kailong321200875/vue-element-plus-admin/commit/9d926b2760b75e1d8e71a68dc7ff6c5026223a43))
707
+- Add Editor component and add editor demo ([3fb3e8d](https://github.com/kailong321200875/vue-element-plus-admin/commit/3fb3e8da39d816bcf4aedb65d40c7052bdb6d8bf))
708
+- Add Error component ([7411dbc](https://github.com/kailong321200875/vue-element-plus-admin/commit/7411dbc9fd8f122187c86a11523b49c88cc71a8c))
709
+- Add example-dialog demo ([262f421](https://github.com/kailong321200875/vue-element-plus-admin/commit/262f4211cf53aef30a32f4b88e88fb1b9246ffcb))
710
+- Add example-page demo ([1492f91](https://github.com/kailong321200875/vue-element-plus-admin/commit/1492f9119aa2960cc05956218e6d151c8b316875))
711
+- Add form demo ([472f574](https://github.com/kailong321200875/vue-element-plus-admin/commit/472f574f42f8f31c4e6047043ac755ba5fb35b7b))
712
+- Add form demo ([e6f9580](https://github.com/kailong321200875/vue-element-plus-admin/commit/e6f95803316bb5df2d1060285c1d591a79340721))
713
+- Add form demo ([543156f](https://github.com/kailong321200875/vue-element-plus-admin/commit/543156f328350bd12e71a41c872e547e41cda7fe))
714
+- Add form demo ([7795d2a](https://github.com/kailong321200875/vue-element-plus-admin/commit/7795d2a4fe3dbc9849ddc7c1d3e2d9215dc66f56))
715
+- Add guide demo ([0832194](https://github.com/kailong321200875/vue-element-plus-admin/commit/0832194e6131051416edff7c2eac6b0a016ffd80))
716
+- Add highlight demo ([eb206b0](https://github.com/kailong321200875/vue-element-plus-admin/commit/eb206b0cc31ac7da3dfd8b3d4b874061c5c91d53))
717
+- Add Icon demo ([e4b7a76](https://github.com/kailong321200875/vue-element-plus-admin/commit/e4b7a769126d6f0fca424007c294ff229eefcb35))
718
+- Add ImageViewer component and add ImageViewer demo ([af9fc0a](https://github.com/kailong321200875/vue-element-plus-admin/commit/af9fc0a4aded3ec08746ddeaeabac4c3cfa9463d))
719
+- Add Infotip component ([e4b7a76](https://github.com/kailong321200875/vue-element-plus-admin/commit/e4b7a769126d6f0fca424007c294ff229eefcb35))
720
+- Add infotip demo ([dbf3b0f](https://github.com/kailong321200875/vue-element-plus-admin/commit/dbf3b0f5a333ccef524bbac825035b0c6dc78ec9))
721
+- Add Qrcode component and add qrcode demo ([535a31b](https://github.com/kailong321200875/vue-element-plus-admin/commit/535a31b35eb6a76589f602fd96dcf91f46f349b0))
722
+- Add Search component and add search demo ([33eca8a](https://github.com/kailong321200875/vue-element-plus-admin/commit/33eca8a97d59f5cc453e1a60ee81b1519527d0f1))
723
+- Add Table component and add useTable hook ([17e8e7c](https://github.com/kailong321200875/vue-element-plus-admin/commit/17e8e7cda9a009818f11cfa0429ce0f9adc00be5))
724
+- Add useScrollTo hook ([7d7fd9e](https://github.com/kailong321200875/vue-element-plus-admin/commit/7d7fd9ed646d2b68cec0547ad8e65b0404bb95bb))
725
+- Add useWatermark hook and add useWatermark demo ([d3fbd3a](https://github.com/kailong321200875/vue-element-plus-admin/commit/d3fbd3a06c3b802fc863b4dc8013122c14bd16f2))
726
+- Add workplace api ([cb558f8](https://github.com/kailong321200875/vue-element-plus-admin/commit/cb558f8af9dfef2ba2879f021db395ee79e8c8d4))
727
+- **Animate:** Add animate.css ([1436543](https://github.com/kailong321200875/vue-element-plus-admin/commit/1436543a5c599f651ed7805165ea83b9ebcddef5))
728
+- **Breadcrumbe:** Add Breadcrumb component ([4612e55](https://github.com/kailong321200875/vue-element-plus-admin/commit/4612e5544bcd626d686972e5cb874d0aa4af08b3))
729
+- **component:** Add CountTo component and Echart component ([e20fa76](https://github.com/kailong321200875/vue-element-plus-admin/commit/e20fa76cad0894a69fd04c81c2108faabf392684))
730
+- **component:** Add Footer component ([dad7330](https://github.com/kailong321200875/vue-element-plus-admin/commit/dad733063413c79eca61c6cb5ff671b35933a85f))
731
+- **component:** Add Footer component ([f81e996](https://github.com/kailong321200875/vue-element-plus-admin/commit/f81e996a426538aeaa2aa37a540395dcf360a09c))
732
+- **Component:** Add Highlight component ([c53fa56](https://github.com/kailong321200875/vue-element-plus-admin/commit/c53fa562e540447df082e35c7f26e56f2426e430))
733
+- **component:** Add namespace of class ([d847ccb](https://github.com/kailong321200875/vue-element-plus-admin/commit/d847ccb098edc72fe55c1f8459bf149453a3b73d))
734
+- **Component:** Setting component add copy button ([e496096](https://github.com/kailong321200875/vue-element-plus-admin/commit/e496096539e6a56b0761a625c9d59210facc5432))
735
+- **ContextMenu:** Add ContextMenu component ([349ac9d](https://github.com/kailong321200875/vue-element-plus-admin/commit/349ac9d3989d77e5246cecf0006dd8d83c489990))
736
+- Detail 组件重构完成 ([7f5ef99](https://github.com/kailong321200875/vue-element-plus-admin/commit/7f5ef99ccc32b03f7be21f70c333bb8e679c7d93))
737
+- Highlight 组件重构 ([34221f3](https://github.com/kailong321200875/vue-element-plus-admin/commit/34221f387f5e15a08cdc21edd76ce8d8c5c20fbc))
738
+- **hooks:** Add useIntro hook ([0832194](https://github.com/kailong321200875/vue-element-plus-admin/commit/0832194e6131051416edff7c2eac6b0a016ffd80))
739
+- **hooks:** Add useTimeAgo hook ([c53fa56](https://github.com/kailong321200875/vue-element-plus-admin/commit/c53fa562e540447df082e35c7f26e56f2426e430))
740
+- **I18n:** Add Ii8n ([3810b8c](https://github.com/kailong321200875/vue-element-plus-admin/commit/3810b8c3b26f86c27aa7db479dfb7b0d283d970f))
741
+- **Layout:** Add classic layout ([839b601](https://github.com/kailong321200875/vue-element-plus-admin/commit/839b6015b8e31bf70e6f0bf0608fa729b028729b))
742
+- **Layout:** Add cutMenu layout ([ff4dd3a](https://github.com/kailong321200875/vue-element-plus-admin/commit/ff4dd3afbf5c0c7a439c71b0c494b81e0f2c70d4))
743
+- **Layout:** Add topLeft layout ([71b1c5e](https://github.com/kailong321200875/vue-element-plus-admin/commit/71b1c5e10cade8d1c018d0c5f63c98ba9357bab8))
744
+- **LocaleDropdown:** Add LocaleDropdown Component ([3810b8c](https://github.com/kailong321200875/vue-element-plus-admin/commit/3810b8c3b26f86c27aa7db479dfb7b0d283d970f))
745
+- **Logo:** Add Logo component ([958edef](https://github.com/kailong321200875/vue-element-plus-admin/commit/958edefe7bc2bf3ae77520a5d885a9d47e8a37b9))
746
+- **mock:** Add mock ([3fc7d4d](https://github.com/kailong321200875/vue-element-plus-admin/commit/3fc7d4d39a72056fcf419fe19a9d41d90f945bad))
747
+- **router:** Add dynamic routing ([b218ccc](https://github.com/kailong321200875/vue-element-plus-admin/commit/b218ccc9cce2ce1363c4a21d22b4d69c43c7b2dc))
748
+- Search component add expand attribute and expandField attribute ([9b4b317](https://github.com/kailong321200875/vue-element-plus-admin/commit/9b4b31781765d31dec50acc40e2eed91401502d4))
749
+- **store:** Add localeStore ([3810b8c](https://github.com/kailong321200875/vue-element-plus-admin/commit/3810b8c3b26f86c27aa7db479dfb7b0d283d970f))
750
+- **store:** Add tagsView store ([349ac9d](https://github.com/kailong321200875/vue-element-plus-admin/commit/349ac9d3989d77e5246cecf0006dd8d83c489990))
751
+- Table 组件重构 ([07adefb](https://github.com/kailong321200875/vue-element-plus-admin/commit/07adefb89b7555280e6217e09cf81ba7aa5b93c2))
752
+- **TagsView:** Add TagsView component ([349ac9d](https://github.com/kailong321200875/vue-element-plus-admin/commit/349ac9d3989d77e5246cecf0006dd8d83c489990))
753
+- **useForm:** Add useForm ([357fc44](https://github.com/kailong321200875/vue-element-plus-admin/commit/357fc44e519c5829567c17f611fcaadee3f9f933))
754
+- **useNProgress:** Add useNProgress ([c5ab359](https://github.com/kailong321200875/vue-element-plus-admin/commit/c5ab3599c8ea001ff7831b72fefc9e274163fbbb))
755
+- **useTitle:** Add useTitle ([c5ab359](https://github.com/kailong321200875/vue-element-plus-admin/commit/c5ab3599c8ea001ff7831b72fefc9e274163fbbb))
756
+- **utils:** Add color utils ([71dfba2](https://github.com/kailong321200875/vue-element-plus-admin/commit/71dfba21c5bc0276689b5aecf0d75e53efdda09f))
757
+- **VForm:** Add VForm component ([448ac52](https://github.com/kailong321200875/vue-element-plus-admin/commit/448ac5293e48a03840df2bb0b399a8f02aae666e))
758
+- **VInputPassword:** Add VInputPassword Component ([a1bf7e9](https://github.com/kailong321200875/vue-element-plus-admin/commit/a1bf7e9b552f75d3b87c64904ac9e7c99fc936a5))
759
+- **Workplace:** Add wrokplace demo ([c53fa56](https://github.com/kailong321200875/vue-element-plus-admin/commit/c53fa562e540447df082e35c7f26e56f2426e430))
760
+- 综合实例、权限管理重 �[a4bd206](https://github.com/kailong321200875/vue-element-plus-admin/commit/a4bd2068a5d40d146b5b45cb3727ced990147b68))
761
+- 部分组件重构完成 ([3d96229](https://github.com/kailong321200875/vue-element-plus-admin/commit/3d9622978dc234ef12dbce63e18caf3440563aa0))
762
+
763
+### Bug Fixes
764
+
765
+- 🐛 删除 Editor 双向绑定,改 �props 传参 ([c395e27](https://github.com/kailong321200875/vue-element-plus-admin/commit/c395e27f67af9f60b151a5484ab5a3c90c4c1d1e))
766
+- fix Form component setProps not work bug ([48ffc52](https://github.com/kailong321200875/vue-element-plus-admin/commit/48ffc52ca8fa26d8e6a5fa4b8b3001701a1f0732))
767
+- fix useScrollTo not work bug ([53201ae](https://github.com/kailong321200875/vue-element-plus-admin/commit/53201ae97a425714871d99e8847a3672ba0d389f))
768
+- 修复 tagsView 无动画效 �[0e3eb4b](https://github.com/kailong321200875/vue-element-plus-admin/commit/0e3eb4ba8b1503e1d221dfda59a3a0001dbdcb56))
769
+
770
+### Performance Improvements
771
+
772
+- update useForm hook ([8a958cd](https://github.com/kailong321200875/vue-element-plus-admin/commit/8a958cd71d9afbd32b243aac0814bfa3281477cd))
773
+
774
+### Code Refactoring
775
+
776
+- 💡 综合实例查看详情重构 ([9c26edd](https://github.com/kailong321200875/vue-element-plus-admin/commit/9c26edd5d599b5fb5a832fb547e3d95b6bfa9a98))
777
+
778
+### Build System
779
+
780
+- Add conventional-changelog-cli plugin ([384485f](https://github.com/kailong321200875/vue-element-plus-admin/commit/384485f6994c6ac33abee506508ab9d35fe658a9))
781
+- Add conventional-github-releaser plugin ([3cd5c71](https://github.com/kailong321200875/vue-element-plus-admin/commit/3cd5c71899dde3ac3910aef0180d8b39fad51f1b))
782
+- Add standard-version plugin ([110ce25](https://github.com/kailong321200875/vue-element-plus-admin/commit/110ce257841648e29b247a0338624a188694b6e9))
783
+- Add vite-plugin-html plugin ([d5b6e2a](https://github.com/kailong321200875/vue-element-plus-admin/commit/d5b6e2a7770eb59aa32839f69da5be37397e3538))
784
+- delete useless plugin ([c756761](https://github.com/kailong321200875/vue-element-plus-admin/commit/c756761dfc3200156acb228474d3539197ef413b))
785
+- **pinia:** Add pinia ([2040500](https://github.com/kailong321200875/vue-element-plus-admin/commit/2040500af14d277a79f01eba5eca2a440203cecf))
786
+- **types:** Add vue-types ([2c41826](https://github.com/kailong321200875/vue-element-plus-admin/commit/2c41826c572268b74a663a6966c548628ac7e280))
787
+- **unplugin-auto-import:** Delete unplugin-auto-import ([2040500](https://github.com/kailong321200875/vue-element-plus-admin/commit/2040500af14d277a79f01eba5eca2a440203cecf))
788
+- **unplugin-vue-components:** Delete unplugin-vue-components ([2040500](https://github.com/kailong321200875/vue-element-plus-admin/commit/2040500af14d277a79f01eba5eca2a440203cecf))
789
+- update plugin ([8d08bc6](https://github.com/kailong321200875/vue-element-plus-admin/commit/8d08bc6fc92258674abdd12834eaa4530ec276dd))
790
+- update plugins ([3c58042](https://github.com/kailong321200875/vue-element-plus-admin/commit/3c580420a20121845f02c0dd3caca5a74f06a89d))
791
+- **vite-plugin-style-import:** Add vite-plugin-style-import ([2040500](https://github.com/kailong321200875/vue-element-plus-admin/commit/2040500af14d277a79f01eba5eca2a440203cecf))
792
+- **vite-plugin-vue-setup-extend:** Delete vite-plugin-vue-setup-extend ([2040500](https://github.com/kailong321200875/vue-element-plus-admin/commit/2040500af14d277a79f01eba5eca2a440203cecf))
793
+- 修改 vite 配置 ([9991fb4](https://github.com/kailong321200875/vue-element-plus-admin/commit/9991fb4e5c46b9e4016beaade7232e28dc272797))
794
+- 设置多语 �([45e879e](https://github.com/kailong321200875/vue-element-plus-admin/commit/45e879edeef677b6aa1d2cfe4dd8dc5b76c83c59))
795
+- 配置代码格式 �[ffdb556](https://github.com/kailong321200875/vue-element-plus-admin/commit/ffdb556a096db247306eae8eecc1b85718314cdd))
796
+- 集成基础配置 ([ced99de](https://github.com/kailong321200875/vue-element-plus-admin/commit/ced99de9b113a01d9d0b190f6d2c6adc983a3102))
797
+- 集成基础配置 ([5dbcf23](https://github.com/kailong321200875/vue-element-plus-admin/commit/5dbcf2397ccdec80c695c113f49e8aa9bb6d012c))
798
+
799
+### Styling
800
+
801
+- 💄 优化 layout 样式 ([37ec378](https://github.com/kailong321200875/vue-element-plus-admin/commit/37ec378f0b2bf83d73ddf0e472aada6aab248f09))
802
+- 💄 微调样式 ([612b486](https://github.com/kailong321200875/vue-element-plus-admin/commit/612b48673c3389779ccfdd161e2ca80b21d265b2))
803
+- Add elNamespace ([d847ccb](https://github.com/kailong321200875/vue-element-plus-admin/commit/d847ccb098edc72fe55c1f8459bf149453a3b73d))
804
+- **appStore:** code style ([641ed68](https://github.com/kailong321200875/vue-element-plus-admin/commit/641ed684fefeb52e2f91e8baab7b610fc74c8d88))
805
+- **Breadcrumb:** fix Breadcrumb style bug ([8755c86](https://github.com/kailong321200875/vue-element-plus-admin/commit/8755c862b837d90a25b27c01fabe64abf81fc4a2))
806
+- **breadcrumb:** update disabled text color ([1522e92](https://github.com/kailong321200875/vue-element-plus-admin/commit/1522e925bae37cb9df4de2252d81f717788f4537))
807
+- change function to arrow function ([4612e55](https://github.com/kailong321200875/vue-element-plus-admin/commit/4612e5544bcd626d686972e5cb874d0aa4af08b3))
808
+- delete console.log ([49a6bfe](https://github.com/kailong321200875/vue-element-plus-admin/commit/49a6bfe9d81a40e2f5f15b68d7289e1787e89b54))
809
+- **Icon:** delete default color ([95a2bd8](https://github.com/kailong321200875/vue-element-plus-admin/commit/95a2bd884dd9846a56cda7c4c3ee4a41ce631b7c))
810
+- level demo style beautification ([dbf3b0f](https://github.com/kailong321200875/vue-element-plus-admin/commit/dbf3b0f5a333ccef524bbac825035b0c6dc78ec9))
811
+- lint code style ([b292419](https://github.com/kailong321200875/vue-element-plus-admin/commit/b2924190b8996e8208f951e3fadbcb09baddb8df))
812
+- **Login:** update login styles ([eb68f1d](https://github.com/kailong321200875/vue-element-plus-admin/commit/eb68f1d919e13c07b7d200e9aec53804b2a6dc7b))
813
+- modify menu z-index attribute ([0d7a778](https://github.com/kailong321200875/vue-element-plus-admin/commit/0d7a7781ce0b5e39f01355d3acdb3f364cabf76d))
814
+- **TagView:** Vertical center tag ([41281c4](https://github.com/kailong321200875/vue-element-plus-admin/commit/41281c4d541a2744e5df5dff2764cc85465b6a4c))
815
+
816
+### Types
817
+
818
+- add ImportMetaEnv ([38e0257](https://github.com/kailong321200875/vue-element-plus-admin/commit/38e0257487e4138a74ad1bb4ee4ba004abcfaa12))
819
+- Adding BfFrom Component types ([8e036f5](https://github.com/kailong321200875/vue-element-plus-admin/commit/8e036f54b56ce8521eb8ec4b7ca21aa9c24f43f2))
820
+- **BfForm:** Adding BfForm types ([bc9195b](https://github.com/kailong321200875/vue-element-plus-admin/commit/bc9195b21eeb79629a82a04d90e2ac5aa6592928))
821
+- **BfForm:** Adding BfForm types ([184b468](https://github.com/kailong321200875/vue-element-plus-admin/commit/184b468cd41dcd1cdae11477b9ee2d6e17de1481))
822
+- **BfForm:** Adding BfForm types ([58cb24d](https://github.com/kailong321200875/vue-element-plus-admin/commit/58cb24d9f8a50be80b5ea793387d582a77a59137))
823
+- delete useless types ([3fc79c0](https://github.com/kailong321200875/vue-element-plus-admin/commit/3fc79c0ae7acd0929f47e33f96c8d45a90d8f762))
824
+- **VForm:** Adding VForm types ([7528fe6](https://github.com/kailong321200875/vue-element-plus-admin/commit/7528fe6da60368213d28d9f1b6310d02d3d53282))
825
+
826
+### Docs
827
+
828
+- ✏️ 修改 readme ([8edb2a3](https://github.com/kailong321200875/vue-element-plus-admin/commit/8edb2a3493dca975036859b5d2c52afaa91f5dbb))
829
+- ✏️ 更新 readme ([62eeb55](https://github.com/kailong321200875/vue-element-plus-admin/commit/62eeb55330dd4af2a46801c7a19f38a3ef312bbf))
830
+- Add README.md ([21dcf88](https://github.com/kailong321200875/vue-element-plus-admin/commit/21dcf88ba31957bbdb50c6207d010650daab70fc))
831
+- Error modifying readme name ([25d5c84](https://github.com/kailong321200875/vue-element-plus-admin/commit/25d5c84e92e68aa72362a14f55aacd946fa5b1b2))
832
+- update description ([be6ff98](https://github.com/kailong321200875/vue-element-plus-admin/commit/be6ff9899b25cc00519210950d27ee56ac5112e6))
833
+- update description ([c15aa87](https://github.com/kailong321200875/vue-element-plus-admin/commit/c15aa8755c9c937512c7380a6d03c4d877ef4d87))
834
+- update README ([27979dc](https://github.com/kailong321200875/vue-element-plus-admin/commit/27979dc6def7d9d8cea62a08d49a6c828be2258b))
835
+- update README.md ([53201ae](https://github.com/kailong321200875/vue-element-plus-admin/commit/53201ae97a425714871d99e8847a3672ba0d389f))
836
+- update README.md ([c11823a](https://github.com/kailong321200875/vue-element-plus-admin/commit/c11823abd8a033e14b4c20d17ac941195d39bcfe))
837
+- 修改 README ([b79a567](https://github.com/kailong321200875/vue-element-plus-admin/commit/b79a56753df55976e749c4494266df052d315416))

+ 21 - 0
LICENSE

@@ -0,0 +1,21 @@
1
+MIT License
2
+
3
+Copyright (c) 2021-present Archer
4
+
5
+Permission is hereby granted, free of charge, to any person obtaining a copy
6
+of this software and associated documentation files (the "Software"), to deal
7
+in the Software without restriction, including without limitation the rights
8
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+copies of the Software, and to permit persons to whom the Software is
10
+furnished to do so, subject to the following conditions:
11
+
12
+The above copyright notice and this permission notice shall be included in all
13
+copies or substantial portions of the Software.
14
+
15
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+SOFTWARE.

File diff suppressed because it is too large
+ 135 - 0
README.md


File diff suppressed because it is too large
+ 132 - 0
README.zh-CN.md


+ 28 - 0
commitlint.config.js

@@ -0,0 +1,28 @@
1
+module.exports = {
2
+  extends: ['@commitlint/config-conventional'],
3
+  rules: {
4
+    'type-enum': [
5
+      2,
6
+      'always',
7
+      [
8
+        'feat', // 新功能(feature)
9
+        'fix', // 修补bug
10
+        'docs', // 文档(documentation)
11
+        'style', // 格式、样式(不影响代码运行的变动)
12
+        'refactor', // 重构(即不是新增功能,也不是修改BUG的代码)
13
+        'perf', // 优化相关,比如提升性能、体验
14
+        'test', // 添加测试
15
+        'ci', // 持续集成修改
16
+        'chore', // 构建过程或辅助工具的变动
17
+        'revert', // 回滚到上一个版本
18
+        'workflow', // 工作流改进
19
+        'mod', // 不确定分类的修改
20
+        'wip', // 开发中
21
+        'types', // 类型修改
22
+        'release' // 版本发布
23
+      ]
24
+    ],
25
+    'subject-full-stop': [0, 'never'],
26
+    'subject-case': [0, 'never']
27
+  }
28
+}

+ 154 - 0
index.html

@@ -0,0 +1,154 @@
1
+<!--
2
+ * @Author: 半生瓜 1515706227@qq.com
3
+ * @Date: 2024-04-21 17:20:21
4
+ * @LastEditors: 半生瓜 1515706227@qq.com
5
+ * @LastEditTime: 2024-05-16 01:34:43
6
+ * @FilePath: \vue-element-plus-admin-mini\index.html
7
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
8
+-->
9
+<!DOCTYPE html>
10
+<html lang="en">
11
+  <head>
12
+    <meta charset="UTF-8" />
13
+    <link rel="icon" href="/favicon.ico" />
14
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
15
+    <title><%= title %></title>
16
+    <script>
17
+     window.VITE_API_BASE_PATH='https://test.you07.com/link-server'
18
+    </script>
19
+
20
+  </head>
21
+  <body>
22
+    <div id="app">
23
+      <style>
24
+        .app-loading {
25
+          display: flex;
26
+          width: 100%;
27
+          height: 100%;
28
+          justify-content: center;
29
+          align-items: center;
30
+          flex-direction: column;
31
+          background: #f0f2f5;
32
+        }
33
+
34
+        .app-loading .app-loading-wrap {
35
+          position: absolute;
36
+          top: 50%;
37
+          left: 50%;
38
+          display: flex;
39
+          -webkit-transform: translate3d(-50%, -50%, 0);
40
+          transform: translate3d(-50%, -50%, 0);
41
+          justify-content: center;
42
+          align-items: center;
43
+          flex-direction: column;
44
+        }
45
+
46
+        .app-loading .app-loading-title {
47
+          margin-bottom: 30px;
48
+          font-size: 20px;
49
+          font-weight: bold;
50
+          text-align: center;
51
+        }
52
+
53
+        .app-loading .app-loading-logo {
54
+          width: 100px;
55
+          margin: 0 auto 15px auto;
56
+        }
57
+
58
+        .app-loading .app-loading-item {
59
+          position: relative;
60
+          display: inline-block;
61
+          width: 60px;
62
+          height: 60px;
63
+          vertical-align: middle;
64
+          border-radius: 50%;
65
+        }
66
+
67
+        .app-loading .app-loading-outter {
68
+          position: absolute;
69
+          width: 100%;
70
+          height: 100%;
71
+          border: 4px solid #2d8cf0;
72
+          border-bottom: 0;
73
+          border-left-color: transparent;
74
+          border-radius: 50%;
75
+          animation: loader-outter 1s cubic-bezier(0.42, 0.61, 0.58, 0.41) infinite;
76
+        }
77
+
78
+        .app-loading .app-loading-inner {
79
+          position: absolute;
80
+          top: calc(50% - 20px);
81
+          left: calc(50% - 20px);
82
+          width: 40px;
83
+          height: 40px;
84
+          border: 4px solid #87bdff;
85
+          border-right: 0;
86
+          border-top-color: transparent;
87
+          border-radius: 50%;
88
+          animation: loader-inner 1s cubic-bezier(0.42, 0.61, 0.58, 0.41) infinite;
89
+        }
90
+
91
+        @-webkit-keyframes loader-outter {
92
+          0% {
93
+            -webkit-transform: rotate(0deg);
94
+            transform: rotate(0deg);
95
+          }
96
+
97
+          100% {
98
+            -webkit-transform: rotate(360deg);
99
+            transform: rotate(360deg);
100
+          }
101
+        }
102
+
103
+        @keyframes loader-outter {
104
+          0% {
105
+            -webkit-transform: rotate(0deg);
106
+            transform: rotate(0deg);
107
+          }
108
+
109
+          100% {
110
+            -webkit-transform: rotate(360deg);
111
+            transform: rotate(360deg);
112
+          }
113
+        }
114
+
115
+        @-webkit-keyframes loader-inner {
116
+          0% {
117
+            -webkit-transform: rotate(0deg);
118
+            transform: rotate(0deg);
119
+          }
120
+
121
+          100% {
122
+            -webkit-transform: rotate(-360deg);
123
+            transform: rotate(-360deg);
124
+          }
125
+        }
126
+
127
+        @keyframes loader-inner {
128
+          0% {
129
+            -webkit-transform: rotate(0deg);
130
+            transform: rotate(0deg);
131
+          }
132
+
133
+          100% {
134
+            -webkit-transform: rotate(-360deg);
135
+            transform: rotate(-360deg);
136
+          }
137
+        }
138
+      </style>
139
+      <div class="app-loading">
140
+        <div class="app-loading-wrap">
141
+          <div class="app-loading-title">
142
+            <img src="/logo.png" class="app-loading-logo" alt="Logo" />
143
+            <div class="app-loading-title"><%= title %></div>
144
+          </div>
145
+          <div class="app-loading-item">
146
+            <div class="app-loading-outter"></div>
147
+            <div class="app-loading-inner"></div>
148
+          </div>
149
+        </div>
150
+      </div>
151
+    </div>
152
+    <script type="module" src="/src/main.ts"></script>
153
+  </body>
154
+</html>

+ 18 - 0
mock/_createProductionServer.ts

@@ -0,0 +1,18 @@
1
+import { createProdMockServer } from 'vite-plugin-mock/es/createProdMockServer'
2
+
3
+const modules = import.meta.glob('./**/*.mock.ts', {
4
+  import: 'default',
5
+  eager: true
6
+})
7
+
8
+const mockModules: any[] = []
9
+Object.keys(modules).forEach(async (key) => {
10
+  if (key.includes('_')) {
11
+    return
12
+  }
13
+  mockModules.push(...(modules[key] as any))
14
+})
15
+
16
+export function setupProdMockServer() {
17
+  createProdMockServer(mockModules)
18
+}

+ 150 - 0
mock/role/index.mock.ts

@@ -0,0 +1,150 @@
1
+/*
2
+ * @Author: 半生瓜 1515706227@qq.com
3
+ * @Date: 2024-04-21 17:20:21
4
+ * @LastEditors: 半生瓜 1515706227@qq.com
5
+ * @LastEditTime: 2024-05-07 15:55:12
6
+ * @FilePath: \vue-element-plus-admin-mini\mock\role\index.mock.ts
7
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
8
+ */
9
+import { MockMethod } from 'vite-plugin-mock'
10
+import { SUCCESS_CODE } from '@/constants'
11
+
12
+const timeout = 1000
13
+
14
+const adminList = [
15
+  {
16
+    path: '/Template',
17
+    component: '#',
18
+    redirect: '/Template/TemplateManage',
19
+    name: 'Template',
20
+    meta: {
21
+      title: 'router.level',
22
+    },
23
+    children: [
24
+      {
25
+        path: 'TemplateManage',
26
+        name: 'TemplateManage',
27
+        component: 'views/Template/TemplateManage',
28
+        meta: {
29
+          title: '模板管理',
30
+          icon: 'ant-design:dashboard-filled',
31
+        }
32
+      }
33
+    ]
34
+  },
35
+  {
36
+    path: '/Resource',
37
+    component: '#',
38
+    redirect: '/Resource/ResourceManage',
39
+    name: 'Resource',
40
+    meta: {
41
+      title: 'router.level'
42
+    },
43
+    children: [
44
+      {
45
+        path: 'ResourceManage',
46
+        name: 'ResourceManage',
47
+        component: 'views/Resource/ResourceManage',
48
+        meta: {
49
+          title: '资源管理',
50
+          icon: 'carbon:skill-level-advanced'   
51
+        }
52
+      }
53
+    ]
54
+  },
55
+  {
56
+    path: '/Audit',
57
+    component: '#',
58
+    redirect: '/Audit/AuditManage',
59
+    name: 'Audit',
60
+    meta: {
61
+      title: '审核管理',
62
+    },
63
+    children: [
64
+      {
65
+        path: 'AuditManage',
66
+        name: 'AuditManage',
67
+        component: 'views/Audit/AuditManage',
68
+        meta: {
69
+          icon: 'ri:function-fill',
70
+          title: '审核管理'
71
+        }
72
+      }
73
+    ]
74
+  },
75
+  {
76
+    path: '/Authority',
77
+    component: '#',
78
+    redirect: '/Authority/AuditManage',
79
+    name: 'Authority',
80
+    meta: {
81
+      title: '权限管理',
82
+      icon: 'eos-icons:role-binding',
83
+    },
84
+    children: [
85
+      {
86
+        path: 'User',
87
+        name: 'User',
88
+        component: 'views/Authority/User',
89
+        meta: {
90
+          title: '用户管理'
91
+        }
92
+      },
93
+      {
94
+        path: 'Role',
95
+        name: 'Role',
96
+        component: 'views/Authority/Role',
97
+        meta: {
98
+          title: '角色管理'
99
+        }
100
+      },
101
+    ]
102
+  },
103
+  {
104
+    path: '/System',
105
+    component: '#',
106
+    redirect: '/System/SystemSetting',
107
+    name: 'System',
108
+    meta: {
109
+      title: '系统设置',
110
+    },
111
+    children: [
112
+      {
113
+        path: 'SystemSetting',
114
+        name: 'SystemSetting',
115
+        component: 'views/System/SystemSetting',
116
+        meta: {
117
+          icon: 'ic:outline-webhook',
118
+          title: '系统设置'
119
+        }
120
+      }
121
+    ]
122
+  }
123
+]
124
+
125
+const testList: string[] = [
126
+  '/level',
127
+  '/zy',
128
+  '/zy/Menu12',
129
+  '/level/menu1',
130
+  '/level/menu1/menu1-1',
131
+  '/level/menu1/menu1-1/menu1-1-1',
132
+  '/level/menu1/menu1-2',
133
+  '/level/menu2'
134
+]
135
+
136
+export default [
137
+  // 列表接口
138
+  {
139
+    url: '/mock/role/list',
140
+    method: 'get',
141
+    timeout,
142
+    response: ({ query }) => {
143
+      const { roleName } = query
144
+      return {
145
+        code: SUCCESS_CODE,
146
+        data: roleName === 'admin' ? adminList : testList
147
+      }
148
+    }
149
+  }
150
+] as MockMethod[]

+ 249 - 0
mock/table/index.mock.ts

@@ -0,0 +1,249 @@
1
+import Mock from 'mockjs'
2
+import { SUCCESS_CODE } from '@/constants'
3
+import { toAnyString } from '@/utils'
4
+
5
+const timeout = 1000
6
+const count = 100
7
+
8
+const baseContent =
9
+  '<p>I am testing data, I am testing data.</p><p><img src="https://wpimg.wallstcn.com/4c69009c-0fd4-4153-b112-6cb53d1cf943"></p>'
10
+
11
+interface ListProps {
12
+  id: string
13
+  author: string
14
+  title: string
15
+  content: string
16
+  importance: number
17
+  display_time: any
18
+  pageviews: number
19
+  image_uri: string
20
+  video_uri?: string
21
+}
22
+
23
+interface TreeListProps {
24
+  id: string
25
+  author: string
26
+  title: string
27
+  content: string
28
+  importance: number
29
+  display_time: any
30
+  image_uri: string
31
+  pageviews: number
32
+  video_uri?: string
33
+  children?: TreeListProps[]
34
+}
35
+
36
+let List: ListProps[] = []
37
+
38
+for (let i = 0; i < count; i++) {
39
+  List.push(
40
+    Mock.mock({
41
+      id: toAnyString(),
42
+      // timestamp: +Mock.Random.date('T'),
43
+      author: '@first',
44
+      title: '@title(5, 10)',
45
+      content: baseContent,
46
+      importance: '@integer(1, 3)',
47
+      display_time: '@datetime',
48
+      pageviews: '@integer(100, 500)',
49
+      image_uri: Mock.Random.image('@integer(100, 500)x@integer(100, 500)'),
50
+      video_uri:
51
+        '//sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/mp4/xgplayer-demo-720p.mp4'
52
+    })
53
+  )
54
+}
55
+
56
+const treeList: TreeListProps[] = []
57
+
58
+for (let i = 0; i < count; i++) {
59
+  treeList.push(
60
+    Mock.mock({
61
+      id: toAnyString(),
62
+      // timestamp: +Mock.Random.date('T'),
63
+      author: '@first',
64
+      title: '@title(5, 10)',
65
+      content: baseContent,
66
+      importance: '@integer(1, 3)',
67
+      display_time: '@datetime',
68
+      pageviews: '@integer(300, 5000)',
69
+      image_uri: Mock.Random.image('@integer(100, 500)x@integer(100, 500)'),
70
+      // image_uri
71
+    })
72
+  )
73
+}
74
+
75
+const cardList = [
76
+  {
77
+    logo: 'https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png',
78
+    name: 'Alipay',
79
+    desc: '在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。'
80
+  },
81
+  {
82
+    logo: 'https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png',
83
+    name: 'Angular',
84
+    desc: '在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。'
85
+  },
86
+  {
87
+    logo: 'https://gw.alipayobjects.com/zos/rmsportal/siCrBXXhmvTQGWPNLBow.png',
88
+    name: 'Bootstrap',
89
+    desc: '在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。'
90
+  },
91
+  {
92
+    logo: 'https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png',
93
+    name: 'React',
94
+    desc: '在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。'
95
+  },
96
+  {
97
+    logo: 'https://gw.alipayobjects.com/zos/rmsportal/ComBAopevLwENQdKWiIn.png',
98
+    name: 'Vue',
99
+    desc: '在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。'
100
+  },
101
+  {
102
+    logo: 'https://gw.alipayobjects.com/zos/rmsportal/nxkuOJlFJuAUhzlMTCEe.png',
103
+    name: 'Webpack',
104
+    desc: '在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。'
105
+  }
106
+]
107
+
108
+export default [
109
+  // 树形列表接口
110
+  {
111
+    url: '/mock/example/treeList',
112
+    method: 'get',
113
+    timeout,
114
+    response: ({ query }) => {
115
+      const { title, pageIndex, pageSize } = query
116
+      const mockList = treeList.filter((item) => {
117
+        if (title && item.title.indexOf(title) < 0) return false
118
+        return true
119
+      })
120
+      const pageList = mockList.filter(
121
+        (_, index) => index < pageSize * pageIndex && index >= pageSize * (pageIndex - 1)
122
+      )
123
+      return {
124
+        code: SUCCESS_CODE,
125
+        data: {
126
+          total: mockList.length,
127
+          list: pageList
128
+        }
129
+      }
130
+    }
131
+  },
132
+  // 列表接口
133
+  {
134
+    url: '/mock/example/list',
135
+    method: 'get',
136
+    timeout,
137
+    response: ({ query }) => {
138
+      const { title, pageIndex, pageSize } = query
139
+      const mockList = List.filter((item) => {
140
+        if (title && item.title.indexOf(title) < 0) return false
141
+        return true
142
+      })
143
+      const pageList = mockList.filter(
144
+        (_, index) => index < pageSize * pageIndex && index >= pageSize * (pageIndex - 1)
145
+      )
146
+      return {
147
+        code: SUCCESS_CODE,
148
+        data: {
149
+          total: mockList.length,
150
+          list: pageList
151
+        }
152
+      }
153
+    }
154
+  },
155
+  // 保存接口
156
+  {
157
+    url: '/mock/example/save',
158
+    method: 'post',
159
+    timeout,
160
+    response: ({ body }) => {
161
+      if (!body.id) {
162
+        List = [
163
+          Object.assign(body, {
164
+            id: toAnyString()
165
+          })
166
+        ].concat(List)
167
+        return {
168
+          code: SUCCESS_CODE,
169
+          data: 'success'
170
+        }
171
+      } else {
172
+        List.map((item) => {
173
+          if (item.id === body.id) {
174
+            for (const key in item) {
175
+              item[key] = body[key]
176
+            }
177
+          }
178
+        })
179
+        return {
180
+          code: SUCCESS_CODE,
181
+          data: 'success'
182
+        }
183
+      }
184
+    }
185
+  },
186
+  // 详情接口
187
+  {
188
+    url: '/mock/example/detail',
189
+    method: 'get',
190
+    response: ({ query }) => {
191
+      const { id } = query
192
+      for (const example of List) {
193
+        if (example.id === id) {
194
+          return {
195
+            code: SUCCESS_CODE,
196
+            data: example
197
+          }
198
+        }
199
+      }
200
+    }
201
+  },
202
+  // 删除接口
203
+  {
204
+    url: '/mock/example/delete',
205
+    method: 'post',
206
+    response: ({ body }) => {
207
+      const ids = body.ids
208
+      if (!ids) {
209
+        return {
210
+          code: 500,
211
+          message: '请选择需要删除的数据'
212
+        }
213
+      } else {
214
+        let i = List.length
215
+        while (i--) {
216
+          if (ids.indexOf(List[i].id) !== -1) {
217
+            List.splice(i, 1)
218
+          }
219
+        }
220
+        return {
221
+          code: SUCCESS_CODE,
222
+          data: 'success'
223
+        }
224
+      }
225
+    }
226
+  },
227
+  {
228
+    url: '/mock/card/list',
229
+    method: 'get',
230
+    timeout,
231
+    response: ({ query }) => {
232
+      const { name, pageIndex, pageSize } = query
233
+      const mockList = cardList.filter((item) => {
234
+        if (name && item.name.indexOf(name) < 0) return false
235
+        return true
236
+      })
237
+      const pageList = mockList.filter(
238
+        (_, index) => index < pageSize * pageIndex && index >= pageSize * (pageIndex - 1)
239
+      )
240
+      return {
241
+        code: SUCCESS_CODE,
242
+        data: {
243
+          total: mockList.length,
244
+          list: pageList
245
+        }
246
+      }
247
+    }
248
+  }
249
+]

+ 90 - 0
mock/user/index.mock.ts

@@ -0,0 +1,90 @@
1
+import { SUCCESS_CODE } from '@/constants'
2
+
3
+const timeout = 1000
4
+
5
+const List: {
6
+  username: string
7
+  password: string
8
+  role: string
9
+  roleId: string
10
+  permissions: string | string[]
11
+}[] = [
12
+  {
13
+    username: 'admin',
14
+    password: 'admin',
15
+    role: 'admin',
16
+    roleId: '1',
17
+    permissions: ['*.*.*']
18
+  },
19
+  {
20
+    username: 'test',
21
+    password: 'test',
22
+    role: 'test',
23
+    roleId: '2',
24
+    permissions: ['example:dialog:create', 'example:dialog:delete']
25
+  }
26
+]
27
+
28
+export default [
29
+  // 列表接口
30
+  {
31
+    url: '/mock/user/list',
32
+    method: 'get',
33
+    response: ({ query }) => {
34
+      const { username, pageIndex, pageSize } = query
35
+
36
+      const mockList = List.filter((item) => {
37
+        if (username && item.username.indexOf(username) < 0) return false
38
+        return true
39
+      })
40
+      const pageList = mockList.filter(
41
+        (_, index) => index < pageSize * pageIndex && index >= pageSize * (pageIndex - 1)
42
+      )
43
+
44
+      return {
45
+        code: SUCCESS_CODE,
46
+        data: {
47
+          total: mockList.length,
48
+          list: pageList
49
+        }
50
+      }
51
+    }
52
+  },
53
+  // 登录接口
54
+  {
55
+    url: '/mock/user/login',
56
+    method: 'post',
57
+    timeout,
58
+    response: ({ body }) => {
59
+      const data = body
60
+      let hasUser = false
61
+      for (const user of List) {
62
+        if (user.username === data.username && user.password === data.password) {
63
+          hasUser = true
64
+          return {
65
+            code: SUCCESS_CODE,
66
+            data: user
67
+          }
68
+        }
69
+      }
70
+      if (!hasUser) {
71
+        return {
72
+          code: 500,
73
+          message: '账号或密码错误'
74
+        }
75
+      }
76
+    }
77
+  },
78
+  // 退出接口
79
+  {
80
+    url: '/mock/user/loginOut',
81
+    method: 'get',
82
+    timeout,
83
+    response: () => {
84
+      return {
85
+        code: SUCCESS_CODE,
86
+        data: null
87
+      }
88
+    }
89
+  }
90
+]

+ 134 - 0
package.json

@@ -0,0 +1,134 @@
1
+{
2
+  "name": "vue-element-plus-admin",
3
+  "version": "2.5.6",
4
+  "description": "一套基于vue3、element-plus、typesScript、vite4的后台集成方案。",
5
+  "author": "Archer <502431556@qq.com>",
6
+  "private": false,
7
+  "scripts": {
8
+    "i": "pnpm install",
9
+    "dev": "pnpm vite --mode base",
10
+    "ts:check": "pnpm vue-tsc --noEmit --skipLibCheck",
11
+    "build:pro": "pnpm vite build --mode pro",
12
+    "build:gitee": "pnpm vite build --mode gitee",
13
+    "build:dev": "pnpm vite build --mode dev",
14
+    "build:test": "pnpm vite build --mode test",
15
+    "serve:pro": "pnpm vite preview --mode pro",
16
+    "serve:dev": "pnpm vite preview --mode dev",
17
+    "serve:test": "pnpm vite preview --mode test",
18
+    "npm:check": "pnpx npm-check-updates -u",
19
+    "clean": "pnpx rimraf node_modules",
20
+    "clean:cache": "pnpx rimraf node_modules/.cache",
21
+    "lint:eslint": "eslint --fix --ext .js,.ts,.vue ./src",
22
+    "lint:format": "prettier --write --loglevel warn \"src/**/*.{js,ts,json,tsx,css,less,vue,html,md}\"",
23
+    "lint:style": "stylelint --fix \"**/*.{vue,less,postcss,css,scss}\" --cache --cache-location node_modules/.cache/stylelint/",
24
+    "lint:lint-staged": "lint-staged -c ./.husky/lintstagedrc.js",
25
+    "prepare": "husky install",
26
+    "p": "plop"
27
+  },
28
+  "dependencies": {
29
+    "@faker-js/faker": "^8.4.0",
30
+    "@iconify/iconify": "^3.1.1",
31
+    "@iconify/vue": "^4.1.1",
32
+    "@vueuse/core": "^10.7.2",
33
+    "@wangeditor/editor": "^5.1.23",
34
+    "@wangeditor/editor-for-vue": "^5.1.10",
35
+    "@zxcvbn-ts/core": "^3.0.4",
36
+    "animate.css": "^4.1.1",
37
+    "axios": "^1.6.7",
38
+    "cropperjs": "^1.6.1",
39
+    "crypto-js": "^4.2.0",
40
+    "dayjs": "^1.11.10",
41
+    "driver.js": "^1.3.1",
42
+    "echarts": "^5.4.3",
43
+    "echarts-wordcloud": "^2.1.0",
44
+    "element-plus": "2.5.5",
45
+    "lodash-es": "^4.17.21",
46
+    "mitt": "^3.0.1",
47
+    "nprogress": "^0.2.0",
48
+    "pinia": "^2.1.7",
49
+    "pinia-plugin-persistedstate": "^3.2.1",
50
+    "qrcode": "^1.5.3",
51
+    "qs": "^6.11.2",
52
+    "url": "^0.11.3",
53
+    "vue": "3.4.15",
54
+    "vue-draggable-plus": "^0.3.5",
55
+    "vue-i18n": "9.9.1",
56
+    "vue-json-pretty": "^2.3.0",
57
+    "vue-router": "^4.2.5",
58
+    "vue-types": "^5.1.1",
59
+    "xgplayer": "^3.0.12"
60
+  },
61
+  "devDependencies": {
62
+    "@commitlint/cli": "^18.6.0",
63
+    "@commitlint/config-conventional": "^18.6.0",
64
+    "@iconify/json": "^2.2.180",
65
+    "@intlify/unplugin-vue-i18n": "^2.0.0",
66
+    "@types/fs-extra": "^11.0.4",
67
+    "@types/inquirer": "^9.0.7",
68
+    "@types/lodash-es": "^4.17.12",
69
+    "@types/node": "^20.11.16",
70
+    "@types/nprogress": "^0.2.3",
71
+    "@types/qrcode": "^1.5.5",
72
+    "@types/qs": "^6.9.11",
73
+    "@types/sortablejs": "^1.15.7",
74
+    "@typescript-eslint/eslint-plugin": "^6.21.0",
75
+    "@typescript-eslint/parser": "^6.21.0",
76
+    "@unocss/transformer-variant-group": "^0.58.5",
77
+    "@vitejs/plugin-legacy": "^5.3.0",
78
+    "@vitejs/plugin-vue": "^5.0.3",
79
+    "@vitejs/plugin-vue-jsx": "^3.1.0",
80
+    "autoprefixer": "^10.4.17",
81
+    "chalk": "^5.3.0",
82
+    "consola": "^3.2.3",
83
+    "eslint": "^8.56.0",
84
+    "eslint-config-prettier": "^9.1.0",
85
+    "eslint-define-config": "^2.1.0",
86
+    "eslint-plugin-prettier": "^5.1.3",
87
+    "eslint-plugin-vue": "^9.21.1",
88
+    "esno": "^4.0.0",
89
+    "fs-extra": "^11.2.0",
90
+    "husky": "^9.0.10",
91
+    "inquirer": "^9.2.14",
92
+    "less": "^4.2.0",
93
+    "lint-staged": "^15.2.2",
94
+    "plop": "^4.0.1",
95
+    "postcss": "^8.4.34",
96
+    "postcss-html": "^1.6.0",
97
+    "postcss-less": "^6.0.0",
98
+    "prettier": "^3.2.5",
99
+    "rimraf": "^5.0.5",
100
+    "rollup": "^4.9.6",
101
+    "rollup-plugin-visualizer": "^5.12.0",
102
+    "stylelint": "^16.2.1",
103
+    "stylelint-config-html": "^1.1.0",
104
+    "stylelint-config-recommended": "^14.0.0",
105
+    "stylelint-config-standard": "^36.0.0",
106
+    "stylelint-order": "^6.0.4",
107
+    "terser": "^5.27.0",
108
+    "typescript": "5.3.3",
109
+    "unocss": "^0.58.5",
110
+    "vite": "5.0.12",
111
+    "vite-plugin-ejs": "^1.7.0",
112
+    "vite-plugin-eslint": "^1.8.1",
113
+    "vite-plugin-mock": "2.9.6",
114
+    "vite-plugin-progress": "^0.0.7",
115
+    "vite-plugin-purge-icons": "^0.10.0",
116
+    "vite-plugin-style-import": "2.0.0",
117
+    "vite-plugin-svg-icons": "^2.0.1",
118
+    "vue-tsc": "^1.8.27"
119
+  },
120
+  "packageManager": "pnpm@9.0.4",
121
+  "engines": {
122
+    "node": ">=18.0.0",
123
+    "pnpm": ">=8.1.0"
124
+  },
125
+  "license": "MIT",
126
+  "repository": {
127
+    "type": "git",
128
+    "url": "git+https://github.com/kailong321200875/vue-element-plus-admin.git"
129
+  },
130
+  "bugs": {
131
+    "url": "https://github.com/kailong321200875/vue-element-plus-admin/issues"
132
+  },
133
+  "homepage": "https://github.com/kailong321200875/vue-element-plus-admin"
134
+}

+ 11 - 0
plop/component/component.hbs

@@ -0,0 +1,11 @@
1
+<script setup lang="ts">
2
+import { useDesign } from '@/hooks/web/useDesign'
3
+
4
+const { getPrefixCls } = useDesign()
5
+
6
+const prefixCls = getPrefixCls('{{ name }}')
7
+</script>
8
+
9
+<template>
10
+  <div :class="`${prefixCls}-{{ name }}`">{{ upperFirstName }}</div>
11
+</template>

+ 3 - 0
plop/component/index.hbs

@@ -0,0 +1,3 @@
1
+import {{ upperFirstName }} from './src/{{ upperFirstName }}.vue'
2
+
3
+export { {{ upperFirstName }} }

+ 38 - 0
plop/component/prompt.js

@@ -0,0 +1,38 @@
1
+const toUpperCase = (str) => str.charAt(0).toUpperCase() + str.slice(1)
2
+
3
+module.exports = {
4
+  description: 'Create vue component',
5
+  prompts: [
6
+    {
7
+      type: 'input',
8
+      name: 'name',
9
+      message: '请输入组件名称(Please enter the component name)'
10
+    }
11
+  ],
12
+  actions: (data) => {
13
+    const { name } = data
14
+    const upperFirstName = toUpperCase(name)
15
+
16
+    const actions = []
17
+    if (name) {
18
+      actions.push({
19
+        type: 'add',
20
+        path: `./src/components/${upperFirstName}/src/${upperFirstName}.vue`,
21
+        templateFile: './plop/component/component.hbs',
22
+        data: {
23
+          name,
24
+          upperFirstName
25
+        }
26
+      }, {
27
+        type: 'add',
28
+        path: `./src/components/${upperFirstName}/index.ts`,
29
+        templateFile: './plop/component/index.hbs',
30
+        data: {
31
+          upperFirstName
32
+        }
33
+      })
34
+    }
35
+
36
+    return actions
37
+  }
38
+}

+ 37 - 0
plop/view/prompt.js

@@ -0,0 +1,37 @@
1
+const toUpperCase = (str) => str.charAt(0).toUpperCase() + str.slice(1)
2
+
3
+module.exports = {
4
+  description: 'Create vue view',
5
+  prompts: [
6
+    {
7
+      type: 'input',
8
+      name: 'path',
9
+      message: '请输入路径(Please enter a path)',
10
+      default: 'views'
11
+    },
12
+    {
13
+      type: 'input',
14
+      name: 'name',
15
+      message: '请输入模块名称(Please enter module name)'
16
+    }
17
+  ],
18
+  actions: (data) => {
19
+    const { name, path } = data
20
+    const upperFirstName = toUpperCase(name)
21
+
22
+    const actions = []
23
+    if (name) {
24
+      actions.push({
25
+        type: 'add',
26
+        path: `./src/${path}/${upperFirstName}.vue`,
27
+        templateFile: './plop/view/view.hbs',
28
+        data: {
29
+          name,
30
+          upperFirstName
31
+        }
32
+      })
33
+    }
34
+
35
+    return actions
36
+  }
37
+}

+ 7 - 0
plop/view/view.hbs

@@ -0,0 +1,7 @@
1
+<script setup lang="ts">
2
+import { ContentWrap } from '@/components/ContentWrap'
3
+</script>
4
+
5
+<template>
6
+  <ContentWrap title="{{ upperFirstName }}"> {{ name }} </ContentWrap>
7
+</template>

+ 7 - 0
plopfile.js

@@ -0,0 +1,7 @@
1
+const viewGenerator = require('./plop/view/prompt.js')
2
+const componentGenerator = require('./plop/component/prompt.js')
3
+
4
+module.exports = function (plop) {
5
+  plop.setGenerator('view', viewGenerator)
6
+  plop.setGenerator('component', componentGenerator)
7
+}

+ 5 - 0
postcss.config.js

@@ -0,0 +1,5 @@
1
+module.exports = {
2
+  plugins: {
3
+    autoprefixer: {}
4
+  }
5
+}

+ 19 - 0
prettier.config.js

@@ -0,0 +1,19 @@
1
+module.exports = {
2
+  printWidth: 100,
3
+  tabWidth: 2,
4
+  useTabs: false,
5
+  semi: false,
6
+  vueIndentScriptAndStyle: false,
7
+  singleQuote: true,
8
+  quoteProps: 'as-needed',
9
+  bracketSpacing: true,
10
+  trailingComma: 'none',
11
+  jsxSingleQuote: false,
12
+  arrowParens: 'always',
13
+  insertPragma: false,
14
+  requirePragma: false,
15
+  proseWrap: 'never',
16
+  htmlWhitespaceSensitivity: 'strict',
17
+  endOfLine: 'auto',
18
+  rangeStart: 0
19
+}

BIN
public/favicon.ico


BIN
public/logo.png


+ 79 - 0
src/App.vue

@@ -0,0 +1,79 @@
1
+<script setup lang="ts">
2
+import { computed, onMounted } from 'vue'
3
+import { useAppStore } from '@/store/modules/app'
4
+import { ConfigGlobal } from '@/components/ConfigGlobal'
5
+import { useDesign } from '@/hooks/web/useDesign'
6
+import { useUserStore } from '@/store/modules/user'
7
+import router from './router'
8
+import { loginApi, getRsaKey, getTestRoleApi, getAdminRoleApi, getRefreshToken } from '@/api/login'
9
+
10
+const { getPrefixCls } = useDesign()
11
+
12
+const prefixCls = getPrefixCls('app')
13
+
14
+const appStore = useAppStore()
15
+const userStore = useUserStore()
16
+
17
+const currentSize = computed(() => appStore.getCurrentSize)
18
+
19
+const greyMode = computed(() => appStore.getGreyMode)
20
+
21
+// Method to handle token check and refresh
22
+const checkTokenAndRefresh = () => {
23
+  const token = userStore.getToken
24
+  if (!token) {
25
+    router.push('/login') // Redirect to login if token is not found
26
+  } else {
27
+    setInterval(function () {
28
+      console.log('ssssssssss1111')
29
+      if (userStore.getToken) {
30
+        getRefreshToken(userStore.getToken)
31
+          .then((res) => {
32
+            userStore.setToken(res.data)
33
+          })
34
+          .catch(() => {
35
+            localStorage.clear()
36
+            window.location.href = '/'
37
+          })
38
+      }
39
+    }, 480000)
40
+  }
41
+}
42
+
43
+appStore.initTheme()
44
+
45
+onMounted(() => {
46
+  checkTokenAndRefresh() // Check token and start token refresh
47
+})
48
+</script>
49
+
50
+<template>
51
+  <ConfigGlobal :size="currentSize">
52
+    <RouterView :class="greyMode ? `${prefixCls}-grey-mode` : ''" />
53
+  </ConfigGlobal>
54
+</template>
55
+
56
+<style lang="less">
57
+@prefix-cls: ~'@{namespace}-app';
58
+
59
+.size {
60
+  width: 100%;
61
+  height: 100%;
62
+}
63
+
64
+html,
65
+body {
66
+  padding: 0 !important;
67
+  margin: 0;
68
+  overflow: hidden;
69
+  .size;
70
+
71
+  #app {
72
+    .size;
73
+  }
74
+}
75
+
76
+.@{prefix-cls}-grey-mode {
77
+  filter: grayscale(100%);
78
+}
79
+</style>

+ 61 - 0
src/api/System/index.ts

@@ -0,0 +1,61 @@
1
+/*
2
+ * @Author: 半生瓜 1515706227@qq.com
3
+ * @Date: 2024-05-07 10:39:27
4
+ * @LastEditors: 半生瓜 1515706227@qq.com
5
+ * @LastEditTime: 2024-05-15 10:11:30
6
+ * @FilePath: \vue-element-plus-admin-mini\src\api\table\index.ts
7
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
8
+ */
9
+import request from '@/axios'
10
+import type { TableData } from './types'
11
+
12
+export const getTableListApi = (params: any) => {
13
+  return request.get({ url: '/mock/example/list', params })
14
+}
15
+
16
+export const getCardTableListApi = (params: any) => {
17
+  return request.get({ url: '/mock/card/list', params })
18
+}
19
+
20
+export const getTreeTableListApi = (params: any) => {
21
+  return request.get({ url: '/mock/example/treeList', params })
22
+}
23
+
24
+//查询全部产品配置参数接口
25
+export const getSystem = () => {
26
+  return request.post({ url: '/config/manage/all' })
27
+}
28
+//查询活动公告接口
29
+export const getBulletin = () => {
30
+  return request.post({ url: '/bulletin/manage/all' })
31
+}
32
+//保存活动公告接口
33
+export const saveBulletin = (params) => {
34
+  return request.post({ url: '/bulletin/manage/save', data: params })
35
+}
36
+
37
+//模板上传接口
38
+export const upTemplate = (params: any) => {
39
+  return request.post({ url: '/zone/template/uploadTemplateZip', params })
40
+}
41
+
42
+//保存系统设置接口
43
+export const saveSystem = (params: any) => {
44
+  return request.post({ url: '/config/manage/update', data: params })
45
+}
46
+//删除活动公告
47
+export const deleteBulletin = (params: any) => {
48
+  return request.post({ url: '/bulletin/manage/delete', params })
49
+}
50
+
51
+export const saveTableApi = (data: Partial<TableData>): Promise<IResponse> => {
52
+  return request.post({ url: '/mock/example/save', data })
53
+}
54
+
55
+export const getTableDetApi = (id: string): Promise<IResponse<TableData>> => {
56
+  return request.get({ url: '/mock/example/detail', params: { id } })
57
+}
58
+
59
+export const delTableListApi = (ids: string[] | number[]): Promise<IResponse> => {
60
+  return request.post({ url: '/mock/example/delete', data: { ids } })
61
+}

+ 9 - 0
src/api/System/types.ts

@@ -0,0 +1,9 @@
1
+export type TableData = {
2
+  id: string
3
+  author: string
4
+  title: string
5
+  content: string
6
+  importance: number
7
+  display_time: string
8
+  pageviews: number
9
+}

+ 25 - 0
src/api/audit/index.ts

@@ -0,0 +1,25 @@
1
+/*
2
+ * @Author: 半生瓜 1515706227@qq.com
3
+ * @Date: 2024-05-07 10:39:27
4
+ * @LastEditors: 半生瓜 1515706227@qq.com
5
+ * @LastEditTime: 2024-05-13 14:49:52
6
+ * @FilePath: \vue-element-plus-admin-mini\src\api\table\index.ts
7
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
8
+ */
9
+import request from '@/axios'
10
+
11
+//审核记录分页接口
12
+export const getAudit = (params: any) => {
13
+  params.page = params.page - 1
14
+  return request.post({ url: '/audit/manage/pageQuery', params })
15
+}
16
+
17
+//审核记录删除接口
18
+export const deleteAudit = (params: any) => {
19
+  return request.post({ url: '/audit/manage/delete', params })
20
+}
21
+
22
+//保存模板接口
23
+export const saveTemplate = (params: any) => {
24
+  return request.post({ url: '/zone/template/save', params })
25
+}

+ 9 - 0
src/api/audit/types.ts

@@ -0,0 +1,9 @@
1
+export type TableData = {
2
+  id: string
3
+  author: string
4
+  title: string
5
+  content: string
6
+  importance: number
7
+  display_time: string
8
+  pageviews: number
9
+}

+ 43 - 0
src/api/login/index.ts

@@ -0,0 +1,43 @@
1
+/*
2
+ * @Author: 半生瓜 1515706227@qq.com
3
+ * @Date: 2024-04-21 17:20:21
4
+ * @LastEditors: 半生瓜 1515706227@qq.com
5
+ * @LastEditTime: 2024-05-17 11:20:19
6
+ * @FilePath: \vue-element-plus-admin-mini\src\api\login\index.ts
7
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
8
+ */
9
+import request from '@/axios'
10
+import type { UserType } from './types'
11
+
12
+interface RoleParams {
13
+  roleName: string
14
+}
15
+
16
+export const loginApi = (data): Promise<IResponse> => {
17
+  return request.post({ url: '/jwt/token', data })
18
+}
19
+
20
+export const loginOutApi = (): Promise<IResponse> => {
21
+  return request.get({ url: '/mock/user/loginOut' })
22
+}
23
+
24
+export const getAdminRoleApi = (): Promise<IResponse<AppCustomRouteRecordRaw[]>> => {
25
+  return request.post({ url: '/user/authList' })
26
+}
27
+
28
+export const getTestRoleApi = (params: RoleParams): Promise<IResponse<string[]>> => {
29
+  return request.get({ url: '/mock/role/list2', params })
30
+}
31
+
32
+export const getRsaKey = (): Promise<IResponse> => {
33
+  return request.post({ url: '/encrypt/rsaKey' })
34
+}
35
+//获取登录用户信息
36
+export const getuesrinfo = (): Promise<IResponse> => {
37
+  return request.post({ url: '/user/v1/detail' })
38
+}
39
+//获取刷新token
40
+
41
+export const getRefreshToken = (data: any): Promise<IResponse> => {
42
+  return request.post({ url: '/jwt/refreshToken', data })
43
+}

+ 14 - 0
src/api/login/types.ts

@@ -0,0 +1,14 @@
1
+export type UserLoginType = {
2
+  username: string
3
+  password: string
4
+  authCode: string
5
+}
6
+
7
+export type UserType = {
8
+  username: string
9
+  password: string
10
+  authCode: string
11
+  role: string
12
+  roleId: string
13
+  permissions: string | string[]
14
+}

+ 29 - 0
src/api/resource/index.ts

@@ -0,0 +1,29 @@
1
+/*
2
+ * @Author: 半生瓜 1515706227@qq.com
3
+ * @Date: 2024-05-07 10:39:27
4
+ * @LastEditors: 半生瓜 1515706227@qq.com
5
+ * @LastEditTime: 2024-05-13 20:58:53
6
+ * @FilePath: \vue-element-plus-admin-mini\src\api\table\index.ts
7
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
8
+ */
9
+import request from '@/axios'
10
+
11
+//资源管理分页接口
12
+export const getResource = (params: any) => {
13
+  params.page = params.page - 1
14
+  return request.post({ url: '/resource/manage/pageQuery', params })
15
+}
16
+
17
+//上传资源图标接口
18
+export const upIcon = (params: any) => {
19
+  return request.post({ url: '/resource/manage/uploadImg', params })
20
+}
21
+
22
+//保存模板接口
23
+export const saveResource = (params: any) => {
24
+  return request.post({ url: '/resource/manage/save', data: params })
25
+}
26
+//删除资源接口
27
+export const deleteResource = (params: any) => {
28
+  return request.post({ url: '/resource/manage/delete', params })
29
+}

+ 9 - 0
src/api/resource/types.ts

@@ -0,0 +1,9 @@
1
+export type TableData = {
2
+  id: string
3
+  author: string
4
+  title: string
5
+  content: string
6
+  importance: number
7
+  display_time: string
8
+  pageviews: number
9
+}

+ 36 - 0
src/api/role/index.ts

@@ -0,0 +1,36 @@
1
+/*
2
+ * @Author: 半生瓜 1515706227@qq.com
3
+ * @Date: 2024-05-07 10:39:27
4
+ * @LastEditors: 半生瓜 1515706227@qq.com
5
+ * @LastEditTime: 2024-05-14 14:11:40
6
+ * @FilePath: \vue-element-plus-admin-mini\src\api\table\index.ts
7
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
8
+ */
9
+import request from '@/axios'
10
+
11
+//角色分页接口
12
+export const getRole = (params: any) => {
13
+  params.page = params.page - 1
14
+  return request.post({ url: '/role/pageQuery', params })
15
+}
16
+//角色接口
17
+export const getRoleAll = () => {
18
+  return request.post({ url: '/role/all' })
19
+}
20
+
21
+//权限树接口
22
+export const getAuthTree = () => {
23
+  return request.post({ url: '/role/authTree' })
24
+}
25
+//角色保存接口
26
+export const saveRole = (params: any) => {
27
+  return request.post({ url: '/role/save', data: params })
28
+}
29
+//角色删除接口
30
+export const deleteRole = (params: any) => {
31
+  return request.post({ url: '/role/delete', params })
32
+}
33
+//角色详情接口
34
+export const getRoleDetail = (params: any) => {
35
+  return request.post({ url: '/role/detail', params })
36
+}

+ 9 - 0
src/api/role/types.ts

@@ -0,0 +1,9 @@
1
+export type TableData = {
2
+  id: string
3
+  author: string
4
+  title: string
5
+  content: string
6
+  importance: number
7
+  display_time: string
8
+  pageviews: number
9
+}

+ 54 - 0
src/api/table/index.ts

@@ -0,0 +1,54 @@
1
+/*
2
+ * @Author: 半生瓜 1515706227@qq.com
3
+ * @Date: 2024-05-07 10:39:27
4
+ * @LastEditors: 半生瓜 1515706227@qq.com
5
+ * @LastEditTime: 2024-05-11 20:56:53
6
+ * @FilePath: \vue-element-plus-admin-mini\src\api\table\index.ts
7
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
8
+ */
9
+import request from '@/axios'
10
+import type { TableData } from './types'
11
+
12
+export const getTableListApi = (params: any) => {
13
+  return request.get({ url: '/mock/example/list', params })
14
+}
15
+
16
+export const getCardTableListApi = (params: any) => {
17
+  return request.get({ url: '/mock/card/list', params })
18
+}
19
+
20
+export const getTreeTableListApi = (params: any) => {
21
+  return request.get({ url: '/mock/example/treeList', params })
22
+}
23
+
24
+//模板管理分页接口
25
+export const getTemplate = (params: any) => {
26
+  params.page = params.page - 1
27
+  return request.post({ url: '/zone/template/pageQuery', params })
28
+}
29
+
30
+//模板上传接口
31
+export const upTemplate = (params: any) => {
32
+  return request.post({ url: '/zone/template/uploadTemplateZip', params })
33
+}
34
+
35
+//保存模板接口
36
+export const saveTemplate = (params: any) => {
37
+  return request.post({ url: '/zone/template/save', data: params })
38
+}
39
+//删除模板接口
40
+export const deleteTemplate = (params: any) => {
41
+  return request.post({ url: '/zone/template/delete', params })
42
+}
43
+
44
+export const saveTableApi = (data: Partial<TableData>): Promise<IResponse> => {
45
+  return request.post({ url: '/mock/example/save', data })
46
+}
47
+
48
+export const getTableDetApi = (id: string): Promise<IResponse<TableData>> => {
49
+  return request.get({ url: '/mock/example/detail', params: { id } })
50
+}
51
+
52
+export const delTableListApi = (ids: string[] | number[]): Promise<IResponse> => {
53
+  return request.post({ url: '/mock/example/delete', data: { ids } })
54
+}

+ 9 - 0
src/api/table/types.ts

@@ -0,0 +1,9 @@
1
+export type TableData = {
2
+  id: string
3
+  author: string
4
+  title: string
5
+  content: string
6
+  importance: number
7
+  display_time: string
8
+  pageviews: number
9
+}

+ 27 - 0
src/api/user/index.ts

@@ -0,0 +1,27 @@
1
+/*
2
+ * @Author: 半生瓜 1515706227@qq.com
3
+ * @Date: 2024-05-07 10:39:27
4
+ * @LastEditors: 半生瓜 1515706227@qq.com
5
+ * @LastEditTime: 2024-05-13 19:00:35
6
+ * @FilePath: \vue-element-plus-admin-mini\src\api\table\index.ts
7
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
8
+ */
9
+import request from '@/axios'
10
+
11
+//用户分页接口
12
+export const getUser = (params: any) => {
13
+  params.page = params.page - 1
14
+  return request.post({ url: '/user/manage/pageQuery', params })
15
+}
16
+//用户分页接口
17
+export const saveUser = (params: any) => {
18
+  return request.post({ url: '/user/manage/save', data: params })
19
+}
20
+//删除用户接口
21
+export const deleteUser = (params: any) => {
22
+  return request.post({ url: '/user/manage/delete', params })
23
+}
24
+//用户详情接口
25
+export const getUserDetail = (params: any) => {
26
+  return request.post({ url: '/user/manage/detail', params })
27
+}

+ 9 - 0
src/api/user/types.ts

@@ -0,0 +1,9 @@
1
+export type TableData = {
2
+  id: string
3
+  author: string
4
+  title: string
5
+  content: string
6
+  importance: number
7
+  display_time: string
8
+  pageviews: number
9
+}

BIN
src/assets/imgs/avatar.jpg


BIN
src/assets/imgs/avatar.png


BIN
src/assets/imgs/dian.png


BIN
src/assets/imgs/diandian.png


BIN
src/assets/imgs/loginbg.png


BIN
src/assets/imgs/loginimg.png


BIN
src/assets/imgs/logo.png


File diff suppressed because it is too large
+ 1 - 0
src/assets/svgs/403.svg


File diff suppressed because it is too large
+ 1 - 0
src/assets/svgs/404.svg


File diff suppressed because it is too large
+ 1 - 0
src/assets/svgs/500.svg


File diff suppressed because it is too large
+ 1 - 0
src/assets/svgs/icon.svg


File diff suppressed because it is too large
+ 1 - 0
src/assets/svgs/login-bg.svg


File diff suppressed because it is too large
+ 1 - 0
src/assets/svgs/login-box-bg.svg


File diff suppressed because it is too large
+ 1 - 0
src/assets/svgs/message.svg


+ 1 - 0
src/assets/svgs/money.svg

@@ -0,0 +1 @@
1
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M54.122 127.892v-28.68H7.513V87.274h46.609v-12.4H7.513v-12.86h38.003L.099 0h22.6l32.556 45.07c3.617 5.144 6.44 9.611 8.487 13.385 1.788-3.05 4.89-7.779 9.301-14.186L103.93 0h24.01L82.385 62.013h38.34v12.862h-46.41v12.4h46.41v11.937h-46.41v28.68H54.123z"/></svg>

File diff suppressed because it is too large
+ 1 - 0
src/assets/svgs/peoples.svg


File diff suppressed because it is too large
+ 1 - 0
src/assets/svgs/shopping.svg


+ 61 - 0
src/axios/config.ts

@@ -0,0 +1,61 @@
1
+/*
2
+ * @Author: 半生瓜 1515706227@qq.com
3
+ * @Date: 2024-04-21 17:20:21
4
+ * @LastEditors: 半生瓜 1515706227@qq.com
5
+ * @LastEditTime: 2024-05-11 15:25:31
6
+ * @FilePath: \vue-element-plus-admin-mini\src\axios\config.ts
7
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
8
+ */
9
+import { AxiosResponse, InternalAxiosRequestConfig } from './types'
10
+import { ElMessage } from 'element-plus'
11
+import qs from 'qs'
12
+import { SUCCESS_CODE, TRANSFORM_REQUEST_DATA } from '@/constants'
13
+import { useUserStoreWithOut } from '@/store/modules/user'
14
+import { objToFormData } from '@/utils'
15
+
16
+const defaultRequestInterceptors = (config: InternalAxiosRequestConfig) => {
17
+  if (
18
+    config.method === 'post' &&
19
+    config.headers['Content-Type'] === 'application/x-www-form-urlencoded'
20
+  ) {
21
+    config.data = qs.stringify(config.data)
22
+  } else if (
23
+    TRANSFORM_REQUEST_DATA &&
24
+    config.method === 'post' &&
25
+    config.headers['Content-Type'] === 'multipart/form-data'
26
+  ) {
27
+    config.data = objToFormData(config.data)
28
+  }
29
+  if (config.method === 'get' && config.params) {
30
+    let url = config.url as string
31
+    url += '?'
32
+    const keys = Object.keys(config.params)
33
+    for (const key of keys) {
34
+      if (config.params[key] !== void 0 && config.params[key] !== null) {
35
+        url += `${key}=${encodeURIComponent(config.params[key])}&`
36
+      }
37
+    }
38
+    url = url.substring(0, url.length - 1)
39
+    config.params = {}
40
+    config.url = url
41
+  }
42
+  return config
43
+}
44
+
45
+const defaultResponseInterceptors = (response: AxiosResponse) => {
46
+  if (response?.config?.responseType === 'blob') {
47
+    // 如果是文件流,直接过
48
+    return response
49
+  } else if (response.data.code === SUCCESS_CODE) {
50
+    return response.data
51
+  } else {
52
+    console.log('kankandddd', response)
53
+    ElMessage.error(response?.data?.message)
54
+    if (response?.data?.code === 401 || response?.data?.code === 403) {
55
+      const userStore = useUserStoreWithOut()
56
+      userStore.logout()
57
+    }
58
+  }
59
+}
60
+
61
+export { defaultResponseInterceptors, defaultRequestInterceptors }

+ 56 - 0
src/axios/index.ts

@@ -0,0 +1,56 @@
1
+/*
2
+ * @Author: 半生瓜 1515706227@qq.com
3
+ * @Date: 2024-04-21 17:20:21
4
+ * @LastEditors: 半生瓜 1515706227@qq.com
5
+ * @LastEditTime: 2024-05-10 20:59:46
6
+ * @FilePath: \vue-element-plus-admin-mini\src\axios\index.ts
7
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
8
+ */
9
+import service from './service'
10
+import { CONTENT_TYPE } from '@/constants'
11
+import { useUserStoreWithOut } from '@/store/modules/user'
12
+
13
+const request = (option: AxiosConfig) => {
14
+  const { url, method, params, data, headers, responseType } = option
15
+  console.log('kankanknasss', option)
16
+  const userStore = useUserStoreWithOut()
17
+  return service.request({
18
+    url: url,
19
+    method,
20
+    params,
21
+    data,
22
+    responseType: responseType,
23
+    headers:
24
+      option.url == '/encrypt/rsaKey'
25
+        ? {
26
+            'Content-Type': CONTENT_TYPE,
27
+            ...headers
28
+          }
29
+        : {
30
+            'Content-Type': CONTENT_TYPE,
31
+            [userStore.getTokenKey ?? 'Authorization']: 'Bearer ' + userStore.getToken ?? '',
32
+            ...headers
33
+          }
34
+  })
35
+}
36
+
37
+export default {
38
+  get: <T = any>(option: AxiosConfig) => {
39
+    return request({ method: 'get', ...option }) as Promise<IResponse<T>>
40
+  },
41
+  post: <T = any>(option: AxiosConfig) => {
42
+    return request({ method: 'post', ...option }) as Promise<IResponse<T>>
43
+  },
44
+  delete: <T = any>(option: AxiosConfig) => {
45
+    return request({ method: 'delete', ...option }) as Promise<IResponse<T>>
46
+  },
47
+  put: <T = any>(option: AxiosConfig) => {
48
+    return request({ method: 'put', ...option }) as Promise<IResponse<T>>
49
+  },
50
+  cancelRequest: (url: string | string[]) => {
51
+    return service.cancelRequest(url)
52
+  },
53
+  cancelAllRequest: () => {
54
+    return service.cancelAllRequest()
55
+  }
56
+}

+ 98 - 0
src/axios/service.ts

@@ -0,0 +1,98 @@
1
+/*
2
+ * @Author: 半生瓜 1515706227@qq.com
3
+ * @Date: 2024-04-21 17:20:21
4
+ * @LastEditors: 半生瓜 1515706227@qq.com
5
+ * @LastEditTime: 2024-05-28 01:10:53
6
+ * @FilePath: \vue-element-plus-admin-mini\src\axios\service.ts
7
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
8
+ */
9
+import axios, { AxiosError } from 'axios'
10
+import { defaultRequestInterceptors, defaultResponseInterceptors } from './config'
11
+
12
+import { AxiosInstance, InternalAxiosRequestConfig, RequestConfig, AxiosResponse } from './types'
13
+import { ElMessage } from 'element-plus'
14
+import { REQUEST_TIMEOUT } from '@/constants'
15
+import router from '@/router'
16
+
17
+export const PATH_URL = window.VITE_API_BASE_PATH
18
+
19
+const abortControllerMap: Map<string, AbortController> = new Map()
20
+
21
+const axiosInstance: AxiosInstance = axios.create({
22
+  timeout: REQUEST_TIMEOUT,
23
+  baseURL: PATH_URL
24
+})
25
+
26
+axiosInstance.interceptors.request.use((res: InternalAxiosRequestConfig) => {
27
+  const controller = new AbortController()
28
+  const url = res.url || ''
29
+  res.signal = controller.signal
30
+  abortControllerMap.set(url, controller)
31
+  return res
32
+})
33
+
34
+axiosInstance.interceptors.response.use(
35
+  (res: AxiosResponse) => {
36
+    const url = res.config.url || ''
37
+    abortControllerMap.delete(url)
38
+    // 这里不能做任何处理,否则后面的 interceptors 拿不到完整的上下文了
39
+    return res
40
+  },
41
+  (error: AxiosError) => {
42
+    if (error.response && (error.response.status === 403 || error.response.status === 401)) {
43
+      // Clear localStorage here
44
+      localStorage.clear()
45
+
46
+      setTimeout(() => {
47
+        console.log('daozelllll11112222')
48
+        router.push('/login') // Redirect to login if token is not found
49
+      }, 2000)
50
+    }
51
+    console.log('er22r: ' + error) // for debug
52
+    ElMessage.error(error.message)
53
+    return Promise.reject(error)
54
+  }
55
+)
56
+
57
+axiosInstance.interceptors.request.use(defaultRequestInterceptors)
58
+axiosInstance.interceptors.response.use(defaultResponseInterceptors)
59
+
60
+const service = {
61
+  request: (config: RequestConfig) => {
62
+    return new Promise((resolve, reject) => {
63
+      if (config.interceptors?.requestInterceptors) {
64
+        config = config.interceptors.requestInterceptors(config as any)
65
+      }
66
+
67
+      axiosInstance
68
+        .request(config)
69
+        .then((res) => {
70
+          resolve(res)
71
+        })
72
+        .catch((err: any) => {
73
+          localStorage.clear()
74
+
75
+          setTimeout(() => {
76
+            console.log('daozelllll1111')
77
+            router.push('/login') // Redirect to login if token is not found
78
+          }, 2000)
79
+          reject(err)
80
+        })
81
+    })
82
+  },
83
+  cancelRequest: (url: string | string[]) => {
84
+    const urlList = Array.isArray(url) ? url : [url]
85
+    for (const _url of urlList) {
86
+      abortControllerMap.get(_url)?.abort()
87
+      abortControllerMap.delete(_url)
88
+    }
89
+  },
90
+  cancelAllRequest() {
91
+    for (const [_, controller] of abortControllerMap) {
92
+      controller.abort()
93
+    }
94
+    abortControllerMap.clear()
95
+  }
96
+}
97
+
98
+export default service

+ 31 - 0
src/axios/types/index.ts

@@ -0,0 +1,31 @@
1
+import type {
2
+  InternalAxiosRequestConfig,
3
+  AxiosResponse,
4
+  AxiosRequestConfig,
5
+  AxiosInstance,
6
+  AxiosRequestHeaders,
7
+  AxiosError
8
+} from 'axios'
9
+
10
+interface RequestInterceptors<T> {
11
+  // 请求拦截
12
+  requestInterceptors?: (config: InternalAxiosRequestConfig) => InternalAxiosRequestConfig
13
+  requestInterceptorsCatch?: (err: any) => any
14
+  // 响应拦截
15
+  responseInterceptors?: (config: T) => T
16
+  responseInterceptorsCatch?: (err: any) => any
17
+}
18
+
19
+interface RequestConfig<T = AxiosResponse> extends AxiosRequestConfig {
20
+  interceptors?: RequestInterceptors<T>
21
+}
22
+
23
+export {
24
+  AxiosResponse,
25
+  RequestInterceptors,
26
+  RequestConfig,
27
+  AxiosInstance,
28
+  InternalAxiosRequestConfig,
29
+  AxiosRequestHeaders,
30
+  AxiosError
31
+}

+ 3 - 0
src/components/Backtop/index.ts

@@ -0,0 +1,3 @@
1
+import Backtop from './src/Backtop.vue'
2
+
3
+export { Backtop }

+ 15 - 0
src/components/Backtop/src/Backtop.vue

@@ -0,0 +1,15 @@
1
+<script setup lang="ts">
2
+import { ElBacktop } from 'element-plus'
3
+import { useDesign } from '@/hooks/web/useDesign'
4
+
5
+const { getPrefixCls, variables } = useDesign()
6
+
7
+const prefixCls = getPrefixCls('backtop')
8
+</script>
9
+
10
+<template>
11
+  <ElBacktop
12
+    :class="`${prefixCls}-backtop`"
13
+    :target="`.${variables.namespace}-layout-content-scrollbar .${variables.elNamespace}-scrollbar__wrap`"
14
+  />
15
+</template>

+ 3 - 0
src/components/Breadcrumb/index.ts

@@ -0,0 +1,3 @@
1
+import Breadcrumb from './src/Breadcrumb.vue'
2
+
3
+export { Breadcrumb }

+ 126 - 0
src/components/Breadcrumb/src/Breadcrumb.vue

@@ -0,0 +1,126 @@
1
+<script lang="tsx">
2
+import { ElBreadcrumb, ElBreadcrumbItem } from 'element-plus'
3
+import { ref, watch, computed, unref, defineComponent, TransitionGroup } from 'vue'
4
+import { useRouter } from 'vue-router'
5
+import { usePermissionStore } from '@/store/modules/permission'
6
+import { filterBreadcrumb } from './helper'
7
+import { filter, treeToList } from '@/utils/tree'
8
+import type { RouteLocationNormalizedLoaded, RouteMeta } from 'vue-router'
9
+import { useI18n } from '@/hooks/web/useI18n'
10
+import { Icon } from '@/components/Icon'
11
+import { useAppStore } from '@/store/modules/app'
12
+import { useDesign } from '@/hooks/web/useDesign'
13
+
14
+const { getPrefixCls } = useDesign()
15
+
16
+const prefixCls = getPrefixCls('breadcrumb')
17
+
18
+const appStore = useAppStore()
19
+
20
+// 面包屑图标
21
+const breadcrumbIcon = computed(() => appStore.getBreadcrumbIcon)
22
+
23
+export default defineComponent({
24
+  name: 'Breadcrumb',
25
+  setup() {
26
+    const { currentRoute } = useRouter()
27
+
28
+    const { t } = useI18n()
29
+
30
+    const levelList = ref<AppRouteRecordRaw[]>([])
31
+
32
+    const permissionStore = usePermissionStore()
33
+
34
+    const menuRouters = computed(() => {
35
+      const routers = permissionStore.getRouters
36
+      return filterBreadcrumb(routers)
37
+    })
38
+
39
+    const getBreadcrumb = () => {
40
+      const currentPath = currentRoute.value.matched.slice(-1)[0].path
41
+      levelList.value = filter<AppRouteRecordRaw>(unref(menuRouters), (node: AppRouteRecordRaw) => {
42
+        return node.path === currentPath
43
+      })
44
+    }
45
+
46
+    const renderBreadcrumb = () => {
47
+      const breadcrumbList = treeToList<AppRouteRecordRaw[]>(unref(levelList))
48
+      return breadcrumbList.map((v) => {
49
+        const disabled = !v.redirect || v.redirect === 'noredirect'
50
+        const meta = v.meta as RouteMeta
51
+        return (
52
+          <ElBreadcrumbItem to={{ path: disabled ? '' : v.path }} key={v.name}>
53
+            {meta?.icon && breadcrumbIcon.value ? (
54
+              <>
55
+                <Icon icon={meta.icon} class="mr-[5px]"></Icon> {t(v?.meta?.title)}
56
+              </>
57
+            ) : (
58
+              t(v?.meta?.title)
59
+            )}
60
+          </ElBreadcrumbItem>
61
+        )
62
+      })
63
+    }
64
+
65
+    watch(
66
+      () => currentRoute.value,
67
+      (route: RouteLocationNormalizedLoaded) => {
68
+        if (route.path.startsWith('/redirect/')) {
69
+          return
70
+        }
71
+        getBreadcrumb()
72
+      },
73
+      {
74
+        immediate: true
75
+      }
76
+    )
77
+
78
+    return () => (
79
+      <ElBreadcrumb separator="/" class={`${prefixCls} flex items-center h-full ml-[10px]`}>
80
+        <TransitionGroup appear enter-active-class="animate__animated animate__fadeInRight">
81
+          {renderBreadcrumb()}
82
+        </TransitionGroup>
83
+      </ElBreadcrumb>
84
+    )
85
+  }
86
+})
87
+</script>
88
+
89
+<style lang="less" scoped>
90
+@prefix-cls: ~'@{elNamespace}-breadcrumb';
91
+
92
+.@{prefix-cls} {
93
+  :deep(&__item) {
94
+    display: flex;
95
+    .@{prefix-cls}__inner {
96
+      display: flex;
97
+      align-items: center;
98
+      color: var(--top-header-text-color);
99
+
100
+      &:hover {
101
+        color: var(--el-color-primary);
102
+      }
103
+    }
104
+  }
105
+
106
+  :deep(&__item):not(:last-child) {
107
+    .@{prefix-cls}__inner {
108
+      color: var(--top-header-text-color);
109
+
110
+      &:hover {
111
+        color: var(--el-color-primary);
112
+      }
113
+    }
114
+  }
115
+
116
+  :deep(&__item):last-child {
117
+    .@{prefix-cls}__inner {
118
+      color: var(--el-text-color-placeholder);
119
+
120
+      &:hover {
121
+        color: var(--el-text-color-placeholder);
122
+      }
123
+    }
124
+  }
125
+}
126
+</style>

+ 31 - 0
src/components/Breadcrumb/src/helper.ts

@@ -0,0 +1,31 @@
1
+import { pathResolve } from '@/utils/routerHelper'
2
+import type { RouteMeta } from 'vue-router'
3
+
4
+export const filterBreadcrumb = (
5
+  routes: AppRouteRecordRaw[],
6
+  parentPath = ''
7
+): AppRouteRecordRaw[] => {
8
+  const res: AppRouteRecordRaw[] = []
9
+
10
+  for (const route of routes) {
11
+    const meta = route?.meta as RouteMeta
12
+    if (meta.hidden && !meta.canTo) {
13
+      continue
14
+    }
15
+
16
+    const data: AppRouteRecordRaw =
17
+      !meta.alwaysShow && route.children?.length === 1
18
+        ? { ...route.children[0], path: pathResolve(route.path, route.children[0].path) }
19
+        : { ...route }
20
+
21
+    data.path = pathResolve(parentPath, data.path)
22
+
23
+    if (data.children) {
24
+      data.children = filterBreadcrumb(data.children, data.path)
25
+    }
26
+    if (data) {
27
+      res.push(data)
28
+    }
29
+  }
30
+  return res
31
+}

+ 3 - 0
src/components/Button/index.ts

@@ -0,0 +1,3 @@
1
+import BaseButton from './src/Button.vue'
2
+
3
+export { BaseButton }

+ 121 - 0
src/components/Button/src/Button.vue

@@ -0,0 +1,121 @@
1
+<script setup lang="ts">
2
+import { useDesign } from '@/hooks/web/useDesign'
3
+import { ElButton, ComponentSize, ButtonType } from 'element-plus'
4
+import { PropType, Component, computed, unref } from 'vue'
5
+import { useAppStore } from '@/store/modules/app'
6
+
7
+const appStore = useAppStore()
8
+
9
+const getTheme = computed(() => appStore.getTheme)
10
+
11
+const { getPrefixCls } = useDesign()
12
+
13
+const prefixCls = getPrefixCls('button')
14
+
15
+const props = defineProps({
16
+  size: {
17
+    type: String as PropType<ComponentSize>,
18
+    default: undefined
19
+  },
20
+  type: {
21
+    type: String as PropType<ButtonType>,
22
+    default: 'default'
23
+  },
24
+  disabled: {
25
+    type: Boolean,
26
+    default: false
27
+  },
28
+  plain: {
29
+    type: Boolean,
30
+    default: false
31
+  },
32
+  text: {
33
+    type: Boolean,
34
+    default: false
35
+  },
36
+  bg: {
37
+    type: Boolean,
38
+    default: false
39
+  },
40
+  link: {
41
+    type: Boolean,
42
+    default: false
43
+  },
44
+  round: {
45
+    type: Boolean,
46
+    default: false
47
+  },
48
+  circle: {
49
+    type: Boolean,
50
+    default: false
51
+  },
52
+  loading: {
53
+    type: Boolean,
54
+    default: false
55
+  },
56
+  loadingIcon: {
57
+    type: [String, Object] as PropType<String | Component>,
58
+    default: undefined
59
+  },
60
+  icon: {
61
+    type: [String, Object] as PropType<String | Component>,
62
+    default: undefined
63
+  },
64
+  autofocus: {
65
+    type: Boolean,
66
+    default: false
67
+  },
68
+  nativeType: {
69
+    type: String as PropType<'button' | 'submit' | 'reset'>,
70
+    default: 'button'
71
+  },
72
+  autoInsertSpace: {
73
+    type: Boolean,
74
+    default: false
75
+  },
76
+  color: {
77
+    type: String,
78
+    default: ''
79
+  },
80
+  darker: {
81
+    type: Boolean,
82
+    default: false
83
+  },
84
+  tag: {
85
+    type: [String, Object] as PropType<String | Component>,
86
+    default: 'button'
87
+  }
88
+})
89
+
90
+const emits = defineEmits(['click'])
91
+
92
+const color = computed(() => {
93
+  const { type } = props
94
+  if (type === 'primary') {
95
+    return unref(getTheme).elColorPrimary
96
+  }
97
+  return ''
98
+})
99
+
100
+const style = computed(() => {
101
+  const { type } = props
102
+  if (type === 'primary') {
103
+    return '--el-button-text-color: #fff; --el-button-hover-text-color: #fff'
104
+  }
105
+  return ''
106
+})
107
+</script>
108
+
109
+<template>
110
+  <ElButton
111
+    :class="`${prefixCls} color-#fff`"
112
+    v-bind="{ ...props }"
113
+    :color="color"
114
+    :style="style"
115
+    @click="() => emits('click')"
116
+  >
117
+    <slot></slot>
118
+    <slot name="icon"></slot>
119
+    <slot name="loading"></slot>
120
+  </ElButton>
121
+</template>

+ 3 - 0
src/components/Collapse/index.ts

@@ -0,0 +1,3 @@
1
+import Collapse from './src/Collapse.vue'
2
+
3
+export { Collapse }

+ 34 - 0
src/components/Collapse/src/Collapse.vue

@@ -0,0 +1,34 @@
1
+<script setup lang="ts">
2
+import { computed, unref } from 'vue'
3
+import { useAppStore } from '@/store/modules/app'
4
+import { propTypes } from '@/utils/propTypes'
5
+import { useDesign } from '@/hooks/web/useDesign'
6
+
7
+const { getPrefixCls } = useDesign()
8
+
9
+const prefixCls = getPrefixCls('collapse')
10
+
11
+defineProps({
12
+  color: propTypes.string.def('')
13
+})
14
+
15
+const appStore = useAppStore()
16
+
17
+const collapse = computed(() => appStore.getCollapse)
18
+
19
+const toggleCollapse = () => {
20
+  const collapsed = unref(collapse)
21
+  appStore.setCollapse(!collapsed)
22
+}
23
+</script>
24
+
25
+<template>
26
+  <div :class="prefixCls" @click="toggleCollapse">
27
+    <Icon
28
+      :size="18"
29
+      :icon="collapse ? 'ant-design:menu-unfold-outlined' : 'ant-design:menu-fold-outlined'"
30
+      :color="color"
31
+      class="cursor-pointer"
32
+    />
33
+  </div>
34
+</template>

+ 5 - 0
src/components/ConfigGlobal/index.ts

@@ -0,0 +1,5 @@
1
+import ConfigGlobal from './src/ConfigGlobal.vue'
2
+
3
+export type { ConfigGlobalTypes } from './src/types'
4
+
5
+export { ConfigGlobal }

+ 62 - 0
src/components/ConfigGlobal/src/ConfigGlobal.vue

@@ -0,0 +1,62 @@
1
+<script setup lang="ts">
2
+import { provide, computed, watch, onMounted } from 'vue'
3
+import { propTypes } from '@/utils/propTypes'
4
+import { ComponentSize, ElConfigProvider } from 'element-plus'
5
+import { useLocaleStore } from '@/store/modules/locale'
6
+import { useWindowSize } from '@vueuse/core'
7
+import { useAppStore } from '@/store/modules/app'
8
+import { setCssVar } from '@/utils'
9
+import { useDesign } from '@/hooks/web/useDesign'
10
+
11
+const { variables } = useDesign()
12
+
13
+const appStore = useAppStore()
14
+
15
+const props = defineProps({
16
+  size: propTypes.oneOf<ComponentSize>(['default', 'small', 'large']).def('default')
17
+})
18
+
19
+provide('configGlobal', props)
20
+
21
+// 初始化所有主题色
22
+onMounted(() => {
23
+  appStore.setCssVarTheme()
24
+})
25
+
26
+const { width } = useWindowSize()
27
+
28
+// 监听窗口变化
29
+watch(
30
+  () => width.value,
31
+  (width: number) => {
32
+    if (width < 768) {
33
+      !appStore.getMobile ? appStore.setMobile(true) : undefined
34
+      setCssVar('--left-menu-min-width', '0')
35
+      appStore.setCollapse(true)
36
+      appStore.getLayout !== 'classic' ? appStore.setLayout('classic') : undefined
37
+    } else {
38
+      appStore.getMobile ? appStore.setMobile(false) : undefined
39
+      setCssVar('--left-menu-min-width', '64px')
40
+    }
41
+  },
42
+  {
43
+    immediate: true
44
+  }
45
+)
46
+
47
+// 多语言相关
48
+const localeStore = useLocaleStore()
49
+
50
+const currentLocale = computed(() => localeStore.currentLocale)
51
+</script>
52
+
53
+<template>
54
+  <ElConfigProvider
55
+    :namespace="variables.elNamespace"
56
+    :locale="currentLocale.elLocale"
57
+    :message="{ max: 1 }"
58
+    :size="size"
59
+  >
60
+    <slot></slot>
61
+  </ElConfigProvider>
62
+</template>

+ 5 - 0
src/components/ConfigGlobal/src/types/index.ts

@@ -0,0 +1,5 @@
1
+import { ComponentSize } from 'element-plus'
2
+
3
+export interface ConfigGlobalTypes {
4
+  size?: ComponentSize
5
+}

+ 3 - 0
src/components/ContentDetailWrap/index.ts

@@ -0,0 +1,3 @@
1
+import ContentDetailWrap from './src/ContentDetailWrap.vue'
2
+
3
+export { ContentDetailWrap }

+ 25 - 0
src/components/ContentDetailWrap/src/ContentDetailWrap.vue

@@ -0,0 +1,25 @@
1
+<script setup lang="ts">
2
+import { ElCard } from 'element-plus'
3
+import { propTypes } from '@/utils/propTypes'
4
+import { useDesign } from '@/hooks/web/useDesign'
5
+
6
+const { getPrefixCls } = useDesign()
7
+
8
+const prefixCls = getPrefixCls('content-detail-wrap')
9
+
10
+defineProps({
11
+  title: propTypes.string.def(''),
12
+  message: propTypes.string.def('')
13
+})
14
+</script>
15
+
16
+<template>
17
+  <div :class="[`${prefixCls}-container`, 'relative']">
18
+    <ElCard :class="[`${prefixCls}-body`, 'mb-20px']" shadow="never">
19
+      <div class="mb-20px pb-20px" style="border-bottom: 1px solid var(--el-border-color)">
20
+        <slot name="header"></slot>
21
+      </div>
22
+      <slot></slot>
23
+    </ElCard>
24
+  </div>
25
+</template>

+ 3 - 0
src/components/ContentWrap/index.ts

@@ -0,0 +1,3 @@
1
+import ContentWrap from './src/ContentWrap.vue'
2
+
3
+export { ContentWrap }

+ 33 - 0
src/components/ContentWrap/src/ContentWrap.vue

@@ -0,0 +1,33 @@
1
+<script setup lang="ts">
2
+import { ElCard, ElTooltip } from 'element-plus'
3
+import { propTypes } from '@/utils/propTypes'
4
+import { useDesign } from '@/hooks/web/useDesign'
5
+
6
+const { getPrefixCls } = useDesign()
7
+
8
+const prefixCls = getPrefixCls('content-wrap')
9
+
10
+defineProps({
11
+  title: propTypes.string.def(''),
12
+  message: propTypes.string.def('')
13
+})
14
+</script>
15
+
16
+<template>
17
+  <ElCard :class="[prefixCls]" shadow="never">
18
+    <template v-if="title" #header>
19
+      <div class="flex items-center">
20
+        <span class="text-16px font-700">{{ title }}</span>
21
+        <ElTooltip v-if="message" effect="dark" placement="right">
22
+          <template #content>
23
+            <div class="max-w-200px">{{ message }}</div>
24
+          </template>
25
+          <Icon class="ml-5px" icon="bi:question-circle-fill" :size="14" />
26
+        </ElTooltip>
27
+      </div>
28
+    </template>
29
+    <div>
30
+      <slot></slot>
31
+    </div>
32
+  </ElCard>
33
+</template>

+ 12 - 0
src/components/ContextMenu/index.ts

@@ -0,0 +1,12 @@
1
+import ContextMenu from './src/ContextMenu.vue'
2
+import { ElDropdown } from 'element-plus'
3
+import type { RouteLocationNormalizedLoaded } from 'vue-router'
4
+
5
+export type { ContextMenuSchema } from './src/types'
6
+
7
+export interface ContextMenuExpose {
8
+  elDropdownMenuRef: ComponentRef<typeof ElDropdown>
9
+  tagItem: RouteLocationNormalizedLoaded
10
+}
11
+
12
+export { ContextMenu }

+ 72 - 0
src/components/ContextMenu/src/ContextMenu.vue

@@ -0,0 +1,72 @@
1
+<script setup lang="ts">
2
+import { ElDropdown, ElDropdownMenu, ElDropdownItem } from 'element-plus'
3
+import { PropType, ref } from 'vue'
4
+import { useI18n } from '@/hooks/web/useI18n'
5
+import { useDesign } from '@/hooks/web/useDesign'
6
+import type { RouteLocationNormalizedLoaded } from 'vue-router'
7
+import { ContextMenuSchema } from './types'
8
+const { getPrefixCls } = useDesign()
9
+
10
+const prefixCls = getPrefixCls('context-menu')
11
+
12
+const { t } = useI18n()
13
+
14
+const emit = defineEmits(['visibleChange'])
15
+
16
+const props = defineProps({
17
+  schema: {
18
+    type: Array as PropType<ContextMenuSchema[]>,
19
+    default: () => []
20
+  },
21
+  trigger: {
22
+    type: String as PropType<'click' | 'hover' | 'focus' | 'contextmenu'>,
23
+    default: 'contextmenu'
24
+  },
25
+  tagItem: {
26
+    type: Object as PropType<RouteLocationNormalizedLoaded>,
27
+    default: () => ({})
28
+  }
29
+})
30
+
31
+const command = (item: ContextMenuSchema) => {
32
+  item.command && item.command(item)
33
+}
34
+
35
+const visibleChange = (visible: boolean) => {
36
+  emit('visibleChange', visible, props.tagItem)
37
+}
38
+
39
+const elDropdownMenuRef = ref<ComponentRef<typeof ElDropdown>>()
40
+
41
+defineExpose({
42
+  elDropdownMenuRef,
43
+  tagItem: props.tagItem
44
+})
45
+</script>
46
+
47
+<template>
48
+  <ElDropdown
49
+    ref="elDropdownMenuRef"
50
+    :class="prefixCls"
51
+    :trigger="trigger"
52
+    placement="bottom-start"
53
+    @command="command"
54
+    @visible-change="visibleChange"
55
+    popper-class="v-context-menu-popper"
56
+  >
57
+    <slot></slot>
58
+    <template #dropdown>
59
+      <ElDropdownMenu>
60
+        <ElDropdownItem
61
+          v-for="(item, index) in schema"
62
+          :key="`dropdown${index}`"
63
+          :divided="item.divided"
64
+          :disabled="item.disabled"
65
+          :command="item"
66
+        >
67
+          <Icon :icon="item.icon" /> {{ t(item.label) }}
68
+        </ElDropdownItem>
69
+      </ElDropdownMenu>
70
+    </template>
71
+  </ElDropdown>
72
+</template>

+ 7 - 0
src/components/ContextMenu/src/types/index.ts

@@ -0,0 +1,7 @@
1
+export interface ContextMenuSchema {
2
+  disabled?: boolean
3
+  divided?: boolean
4
+  icon?: string
5
+  label: string
6
+  command?: (item: ContextMenuSchema) => void
7
+}

+ 5 - 0
src/components/Descriptions/index.ts

@@ -0,0 +1,5 @@
1
+import Descriptions from './src/Descriptions.vue'
2
+
3
+export type { DescriptionsSchema } from './src/types'
4
+
5
+export { Descriptions }

+ 161 - 0
src/components/Descriptions/src/Descriptions.vue

@@ -0,0 +1,161 @@
1
+<script lang="tsx">
2
+import { ElCollapseTransition, ElDescriptions, ElDescriptionsItem, ElTooltip } from 'element-plus'
3
+import { useDesign } from '@/hooks/web/useDesign'
4
+import { propTypes } from '@/utils/propTypes'
5
+import { ref, unref, PropType, computed, defineComponent } from 'vue'
6
+import { useAppStore } from '@/store/modules/app'
7
+import { DescriptionsSchema } from './types'
8
+import { Icon } from '@/components/Icon'
9
+import { get } from 'lodash-es'
10
+
11
+const appStore = useAppStore()
12
+
13
+const mobile = computed(() => appStore.getMobile)
14
+
15
+const { getPrefixCls } = useDesign()
16
+
17
+const prefixCls = getPrefixCls('descriptions')
18
+
19
+export default defineComponent({
20
+  name: 'Descriptions',
21
+  props: {
22
+    title: propTypes.string.def(''),
23
+    message: propTypes.string.def(''),
24
+    collapse: propTypes.bool.def(true),
25
+    border: propTypes.bool.def(true),
26
+    column: propTypes.number.def(2),
27
+    size: propTypes.oneOf(['large', 'default', 'small']).def('default'),
28
+    direction: propTypes.oneOf(['horizontal', 'vertical']).def('horizontal'),
29
+    extra: propTypes.string.def(''),
30
+    schema: {
31
+      type: Array as PropType<DescriptionsSchema[]>,
32
+      default: () => []
33
+    },
34
+    data: {
35
+      type: Object as PropType<any>,
36
+      default: () => ({})
37
+    }
38
+  },
39
+  setup(props, { slots, attrs }) {
40
+    const getBindValue = computed((): any => {
41
+      const delArr: string[] = ['title', 'message', 'collapse', 'schema', 'data', 'class']
42
+      const obj = { ...attrs, ...props }
43
+      for (const key in obj) {
44
+        if (delArr.indexOf(key) !== -1) {
45
+          delete obj[key]
46
+        }
47
+      }
48
+      if (unref(mobile)) {
49
+        obj.direction = 'vertical'
50
+      }
51
+      return obj
52
+    })
53
+
54
+    const getBindItemValue = (item: DescriptionsSchema) => {
55
+      const delArr: string[] = ['field']
56
+      const obj = { ...item }
57
+      for (const key in obj) {
58
+        if (delArr.indexOf(key) !== -1) {
59
+          delete obj[key]
60
+        }
61
+      }
62
+      return obj
63
+    }
64
+
65
+    // 折叠
66
+    const show = ref(true)
67
+
68
+    const toggleClick = () => {
69
+      if (props.collapse) {
70
+        show.value = !unref(show)
71
+      }
72
+    }
73
+
74
+    return () => {
75
+      return (
76
+        <div
77
+          class={[
78
+            prefixCls,
79
+            'bg-[var(--el-color-white)] dark:bg-[var(--el-bg-color)] dark:border-[var(--el-border-color)] dark:border-1px'
80
+          ]}
81
+        >
82
+          {props.title ? (
83
+            <div
84
+              class={[
85
+                `${prefixCls}-header`,
86
+                'relative h-50px flex justify-between items-center layout-border__bottom px-10px cursor-pointer'
87
+              ]}
88
+              onClick={toggleClick}
89
+            >
90
+              <div class={[`${prefixCls}-header__title`, 'relative font-18px font-bold ml-10px']}>
91
+                <div class="flex items-center">
92
+                  {props.title}
93
+                  {props.message ? (
94
+                    <ElTooltip content={props.message} placement="right">
95
+                      <Icon icon="bi:question-circle-fill" class="ml-5px" size={14} />
96
+                    </ElTooltip>
97
+                  ) : null}
98
+                </div>
99
+              </div>
100
+              {props.collapse ? <Icon icon={show.value ? 'ep:arrow-down' : 'ep:arrow-up'} /> : null}
101
+            </div>
102
+          ) : null}
103
+
104
+          <ElCollapseTransition>
105
+            <div v-show={unref(show)} class={[`${prefixCls}-content`]}>
106
+              <ElDescriptions {...unref(getBindValue)}>
107
+                {{
108
+                  extra: () => (slots['extra'] ? slots['extra']() : props.extra),
109
+                  default: () => {
110
+                    return props.schema.map((item) => {
111
+                      return (
112
+                        <ElDescriptionsItem key={item.field} {...getBindItemValue(item)}>
113
+                          {{
114
+                            label: () => (item.slots?.label ? item.slots?.label(item) : item.label),
115
+                            default: () =>
116
+                              item.slots?.default
117
+                                ? item.slots?.default(props.data)
118
+                                : get(props.data, item.field)
119
+                          }}
120
+                        </ElDescriptionsItem>
121
+                      )
122
+                    })
123
+                  }
124
+                }}
125
+              </ElDescriptions>
126
+            </div>
127
+          </ElCollapseTransition>
128
+        </div>
129
+      )
130
+    }
131
+  }
132
+})
133
+</script>
134
+
135
+<style lang="less" scoped>
136
+@prefix-cls: ~'@{namespace}-descriptions';
137
+
138
+:deep(.@{elNamespace}-descriptions__header) {
139
+  display: none !important;
140
+}
141
+
142
+.@{prefix-cls}-header {
143
+  &__title {
144
+    &::after {
145
+      position: absolute;
146
+      top: 3px;
147
+      left: -10px;
148
+      width: 4px;
149
+      height: 70%;
150
+      background: var(--el-color-primary);
151
+      content: '';
152
+    }
153
+  }
154
+}
155
+
156
+.@{prefix-cls}-content {
157
+  :deep(.@{elNamespace}-descriptions__cell) {
158
+    width: 0;
159
+  }
160
+}
161
+</style>

+ 15 - 0
src/components/Descriptions/src/types/index.ts

@@ -0,0 +1,15 @@
1
+export interface DescriptionsSchema {
2
+  span?: number // 占多少分
3
+  field: string // 字段名
4
+  label?: string // label名
5
+  width?: string | number
6
+  minWidth?: string | number
7
+  align?: 'left' | 'center' | 'right'
8
+  labelAlign?: 'left' | 'center' | 'right'
9
+  className?: string
10
+  labelClassName?: string
11
+  slots?: {
12
+    default?: (...args: any[]) => JSX.Element | null
13
+    label?: (...args: any[]) => JSX.Element | null
14
+  }
15
+}

+ 3 - 0
src/components/Dialog/index.ts

@@ -0,0 +1,3 @@
1
+import Dialog from './src/Dialog.vue'
2
+
3
+export { Dialog }

+ 132 - 0
src/components/Dialog/src/Dialog.vue

@@ -0,0 +1,132 @@
1
+<script setup lang="ts">
2
+import { ElDialog, ElScrollbar } from 'element-plus'
3
+import { propTypes } from '@/utils/propTypes'
4
+import { computed, useAttrs, ref, unref, useSlots, watch, nextTick } from 'vue'
5
+import { isNumber } from '@/utils/is'
6
+
7
+const slots = useSlots()
8
+
9
+const props = defineProps({
10
+  modelValue: propTypes.bool.def(false),
11
+  title: propTypes.string.def('Dialog'),
12
+  fullscreen: propTypes.bool.def(true),
13
+  maxHeight: propTypes.oneOfType([String, Number]).def('400px')
14
+})
15
+
16
+const getBindValue = computed(() => {
17
+  const delArr: string[] = ['fullscreen', 'title', 'maxHeight']
18
+  const attrs = useAttrs()
19
+  const obj = { ...attrs, ...props }
20
+  for (const key in obj) {
21
+    if (delArr.indexOf(key) !== -1) {
22
+      delete obj[key]
23
+    }
24
+  }
25
+  return obj
26
+})
27
+
28
+const isFullscreen = ref(false)
29
+
30
+const toggleFull = () => {
31
+  isFullscreen.value = !unref(isFullscreen)
32
+}
33
+
34
+const dialogHeight = ref(isNumber(props.maxHeight) ? `${props.maxHeight}px` : props.maxHeight)
35
+
36
+watch(
37
+  () => isFullscreen.value,
38
+  async (val: boolean) => {
39
+    await nextTick()
40
+    if (val) {
41
+      const windowHeight = document.documentElement.offsetHeight
42
+      dialogHeight.value = `${windowHeight - 55 - 60 - (slots.footer ? 63 : 0)}px`
43
+    } else {
44
+      dialogHeight.value = isNumber(props.maxHeight) ? `${props.maxHeight}px` : props.maxHeight
45
+    }
46
+  },
47
+  {
48
+    immediate: true
49
+  }
50
+)
51
+
52
+const dialogStyle = computed(() => {
53
+  return {
54
+    height: unref(dialogHeight)
55
+  }
56
+})
57
+</script>
58
+
59
+<template>
60
+  <ElDialog
61
+    v-bind="getBindValue"
62
+    :fullscreen="isFullscreen"
63
+    destroy-on-close
64
+    lock-scroll
65
+    draggable
66
+    top="0"
67
+    :close-on-click-modal="false"
68
+    :show-close="false"
69
+  >
70
+    <template #header="{ close }">
71
+      <div class="flex justify-between items-center h-54px pl-15px pr-15px relative">
72
+        <slot name="title">
73
+          {{ title }}
74
+        </slot>
75
+        <div
76
+          class="h-54px flex justify-between items-center absolute top-[50%] right-15px translate-y-[-50%]"
77
+        >
78
+          <Icon
79
+            v-if="fullscreen"
80
+            class="cursor-pointer is-hover !h-54px mr-10px"
81
+            :icon="isFullscreen ? 'radix-icons:exit-full-screen' : 'radix-icons:enter-full-screen'"
82
+            color="var(--el-color-info)"
83
+            hover-color="var(--el-color-primary)"
84
+            @click="toggleFull"
85
+          />
86
+          <Icon
87
+            class="cursor-pointer is-hover !h-54px"
88
+            icon="ep:close"
89
+            hover-color="var(--el-color-primary)"
90
+            color="var(--el-color-info)"
91
+            @click="close"
92
+          />
93
+        </div>
94
+      </div>
95
+    </template>
96
+
97
+    <ElScrollbar :style="dialogStyle">
98
+      <slot></slot>
99
+    </ElScrollbar>
100
+
101
+    <template v-if="slots.footer" #footer>
102
+      <slot name="footer"></slot>
103
+    </template>
104
+  </ElDialog>
105
+</template>
106
+
107
+<style lang="less">
108
+.@{elNamespace}-overlay-dialog {
109
+  display: flex;
110
+  justify-content: center;
111
+  align-items: center;
112
+}
113
+
114
+.@{elNamespace}-dialog {
115
+  margin: 0 !important;
116
+  &__header {
117
+    margin-right: 0 !important;
118
+    border-bottom: 1px solid var(--el-border-color);
119
+    padding: 0;
120
+    height: 54px;
121
+  }
122
+  &__body {
123
+    padding: 15px !important;
124
+  }
125
+  &__footer {
126
+    border-top: 1px solid var(--el-border-color);
127
+  }
128
+  &__headerbtn {
129
+    top: 0;
130
+  }
131
+}
132
+</style>

+ 8 - 0
src/components/Editor/index.ts

@@ -0,0 +1,8 @@
1
+import Editor from './src/Editor.vue'
2
+import { IDomEditor } from '@wangeditor/editor'
3
+
4
+export interface EditorExpose {
5
+  getEditorRef: () => Promise<IDomEditor>
6
+}
7
+
8
+export { Editor }

+ 254 - 0
src/components/Editor/src/Editor.vue

@@ -0,0 +1,254 @@
1
+<script setup lang="ts">
2
+import { onBeforeUnmount, computed, PropType, unref, nextTick, ref, watch, shallowRef } from 'vue'
3
+import { Editor, Toolbar } from '@wangeditor/editor-for-vue'
4
+import { IDomEditor, IEditorConfig, i18nChangeLanguage } from '@wangeditor/editor'
5
+import { propTypes } from '@/utils/propTypes'
6
+import { isNumber } from '@/utils/is'
7
+import { useUserStore } from '@/store/modules/user'
8
+import { ElMessage } from 'element-plus'
9
+import { useLocaleStore } from '@/store/modules/locale'
10
+
11
+const userStore = useUserStore()
12
+const token = userStore.getToken
13
+const Authorization = `Bearer ${token}`
14
+
15
+const localeStore = useLocaleStore()
16
+const headers = ref({ Authorization: Authorization })
17
+const currentLocale = computed(() => localeStore.getCurrentLocale)
18
+
19
+i18nChangeLanguage(unref(currentLocale).lang)
20
+
21
+const props = defineProps({
22
+  editorId: propTypes.string.def('wangeEditor-1'),
23
+  height: propTypes.oneOfType([Number, String]).def('500px'),
24
+  editorConfig: {
25
+    type: Object as PropType<IEditorConfig>,
26
+    default: () => undefined
27
+  },
28
+  modelValue: propTypes.string.def('')
29
+})
30
+
31
+const emit = defineEmits(['change', 'update:modelValue'])
32
+
33
+// 编辑器实例,必须用 shallowRef
34
+const editorRef = shallowRef<IDomEditor>()
35
+
36
+const valueHtml = ref('')
37
+
38
+watch(
39
+  () => props.modelValue,
40
+  (val: string) => {
41
+    if (val === unref(valueHtml)) return
42
+    valueHtml.value = val
43
+  },
44
+  {
45
+    immediate: true
46
+  }
47
+)
48
+
49
+// 监听
50
+watch(
51
+  () => valueHtml.value,
52
+  (val: string) => {
53
+    emit('update:modelValue', val)
54
+  }
55
+)
56
+
57
+const handleCreated = (editor: IDomEditor) => {
58
+  editorRef.value = editor
59
+}
60
+
61
+// 编辑器配置
62
+const editorConfig = computed((): IEditorConfig => {
63
+  return Object.assign(
64
+    {
65
+      readOnly: false,
66
+      customAlert: (s: string, t: string) => {
67
+        switch (t) {
68
+          case 'success':
69
+            ElMessage.success(s)
70
+            break
71
+          case 'info':
72
+            ElMessage.info(s)
73
+            break
74
+          case 'warning':
75
+            ElMessage.warning(s)
76
+            break
77
+          case 'error':
78
+            ElMessage.error(s)
79
+            break
80
+          default:
81
+            ElMessage.info(s)
82
+            break
83
+        }
84
+      },
85
+      autoFocus: false,
86
+      scroll: true,
87
+      uploadImgShowBase64: true,
88
+      MENU_CONF: {
89
+        uploadImage: {
90
+          server: window.VITE_API_BASE_PATH + '/config/manage/uploadImg',
91
+          fieldName: 'file',
92
+          maxFileSize: 2 * 1024 * 1024, // 2MB
93
+          maxNumberOfFiles: 5,
94
+          allowedFileTypes: ['image/*'],
95
+          metaWithUrl: true,
96
+          withCredentials: false,
97
+          headers: {
98
+            Authorization: `Bearer ${token}`
99
+          },
100
+          onBeforeUpload(file: File) {
101
+            // TS 语法
102
+            // onBeforeUpload(file) {    // JS 语法
103
+            // file 选中的文件,格式如 { key: file }
104
+            console.log('knaknak===', file)
105
+            return file
106
+
107
+            // 可以 return
108
+            // 1. return file 或者 new 一个 file ,接下来将上传
109
+            // 2. return false ,不上传这个 file
110
+          },
111
+          // 自定义插入图片
112
+          customInsert(res: any, insertFn: InsertFnType) {
113
+            // TS 语法
114
+            // customInsert(res, insertFn) {                  // JS 语法
115
+            // res 即服务端的返回结果
116
+            console.log('kankankan0000', res)
117
+            let url = window.VITE_API_BASE_PATH + res.data
118
+            let alt = '图片'
119
+            let href = '图片'
120
+            // 从 res 中找到 url alt href ,然后插入图片
121
+            insertFn(url, alt, href)
122
+          },
123
+
124
+          // 上传进度的回调函数
125
+          onProgress(progress: number) {
126
+            // TS 语法
127
+            // onProgress(progress) {       // JS 语法
128
+            // progress 是 0-100 的数字
129
+            console.log('progress', progress)
130
+          },
131
+
132
+          // 单个文件上传成功之后
133
+          onSuccess(file: File, res: any) {
134
+            // TS 语法
135
+            // onSuccess(file, res) {          // JS 语法
136
+            console.log(`${file.name} 上传成功`, res)
137
+          },
138
+
139
+          // 单个文件上传失败
140
+          onFailed(file: File, res: any) {
141
+            // TS 语法
142
+            // onFailed(file, res) {           // JS 语法
143
+            console.log(`${file.name} 上传失败`, res)
144
+          },
145
+
146
+          // 上传错误,或者触发 timeout 超时
147
+          onError(file: File, err: any, res: any) {
148
+            // TS 语法
149
+            // onError(file, err, res) {               // JS 语法
150
+            console.log(`${file.name} 上传出错`, err, res)
151
+          }
152
+        },
153
+        uploadVideo: {
154
+          server: window.VITE_API_BASE_PATH + '/geom/v1/uploadVideo',
155
+          fieldName: 'file',
156
+          maxFileSize: 50 * 1024 * 1024, // 50MB
157
+          maxNumberOfFiles: 1,
158
+          allowedFileTypes: ['video/*'],
159
+          withCredentials: false,
160
+          headers: {
161
+            Authorization: `Bearer ${token}`
162
+          },
163
+          onBeforeUpload(file: File) {
164
+            ElMessage({
165
+              message: '视频正在上传中,请耐心等待',
166
+              duration: 0,
167
+              customClass: 'uploadTip',
168
+              showClose: true
169
+            })
170
+            return file
171
+          },
172
+
173
+          // 自定义插入视频
174
+          customInsert(res, insertFn) {
175
+            // 因为自定义插入导致onSuccess与onFailed回调函数不起作用,自己手动处理
176
+            // 先关闭等待的Message
177
+            ElMessage.closeAll()
178
+            if (res.code === 1) {
179
+              ElMessage.success({
180
+                message: `上传成功`
181
+              })
182
+            } else {
183
+              ElMessage.error({
184
+                message: `上传失败,请重新尝试`
185
+              })
186
+            }
187
+            insertFn(window.VITE_API_BASE_PATH + res.data, window.VITE_API_BASE_PATH + res.data)
188
+          },
189
+          onSuccess(file: File, res: any) {
190
+            console.log(`${file.name} uploaded successfully`, res)
191
+          },
192
+          onFailed(file: File, res: any) {
193
+            console.log(`${file.name} upload failed`, res)
194
+          },
195
+          onError(file: File, err: any, res: any) {
196
+            console.log(`${file.name} upload error`, err, res)
197
+          }
198
+        }
199
+      }
200
+    },
201
+    props.editorConfig || {}
202
+  )
203
+})
204
+
205
+const editorStyle = computed(() => {
206
+  return {
207
+    height: isNumber(props.height) ? `${props.height}px` : props.height
208
+  }
209
+})
210
+
211
+// 回调函数
212
+const handleChange = (editor: IDomEditor) => {
213
+  emit('change', editor)
214
+}
215
+
216
+// 组件销毁时,及时销毁编辑器
217
+onBeforeUnmount(() => {
218
+  const editor = unref(editorRef.value)
219
+
220
+  // 销毁,并移除 editor
221
+  editor?.destroy()
222
+})
223
+
224
+const getEditorRef = async (): Promise<IDomEditor> => {
225
+  await nextTick()
226
+  return unref(editorRef.value) as IDomEditor
227
+}
228
+
229
+defineExpose({
230
+  getEditorRef
231
+})
232
+</script>
233
+
234
+<template>
235
+  <div class="border-1 border-solid border-[var(--el-border-color)] z-10">
236
+    <!-- 工具栏 -->
237
+    <Toolbar
238
+      :editor="editorRef"
239
+      :editorId="editorId"
240
+      class="border-0 b-b-1 border-solid border-[var(--el-border-color)]"
241
+    />
242
+    <!-- 编辑器 -->
243
+    <Editor
244
+      v-model="valueHtml"
245
+      :editorId="editorId"
246
+      :defaultConfig="editorConfig"
247
+      :style="editorStyle"
248
+      @on-change="handleChange"
249
+      @on-created="handleCreated"
250
+    />
251
+  </div>
252
+</template>
253
+
254
+<style src="@wangeditor/editor/dist/css/style.css"></style>

+ 3 - 0
src/components/Error/index.ts

@@ -0,0 +1,3 @@
1
+import Error from './src/Error.vue'
2
+
3
+export { Error }

+ 58 - 0
src/components/Error/src/Error.vue

@@ -0,0 +1,58 @@
1
+<script setup lang="ts">
2
+import pageError from '@/assets/svgs/404.svg'
3
+import networkError from '@/assets/svgs/500.svg'
4
+import noPermission from '@/assets/svgs/403.svg'
5
+import { propTypes } from '@/utils/propTypes'
6
+import { useI18n } from '@/hooks/web/useI18n'
7
+import { ElButton } from 'element-plus'
8
+
9
+interface ErrorMap {
10
+  url: string
11
+  message: string
12
+  buttonText: string
13
+}
14
+
15
+const { t } = useI18n()
16
+
17
+const errorMap: {
18
+  [key: string]: ErrorMap
19
+} = {
20
+  '404': {
21
+    url: pageError,
22
+    message: t('error.pageError'),
23
+    buttonText: t('error.returnToHome')
24
+  },
25
+  '500': {
26
+    url: networkError,
27
+    message: t('error.networkError'),
28
+    buttonText: t('error.returnToHome')
29
+  },
30
+  '403': {
31
+    url: noPermission,
32
+    message: t('error.noPermission'),
33
+    buttonText: t('error.returnToHome')
34
+  }
35
+}
36
+
37
+const props = defineProps({
38
+  type: propTypes.string.validate((v: string) => ['404', '500', '403'].includes(v)).def('404')
39
+})
40
+
41
+const emit = defineEmits(['errorClick'])
42
+
43
+const btnClick = () => {
44
+  emit('errorClick', props.type)
45
+}
46
+</script>
47
+
48
+<template>
49
+  <div class="flex justify-center">
50
+    <div class="text-center">
51
+      <img width="350" :src="errorMap[type].url" alt="" />
52
+      <div class="text-14px text-[var(--el-color-info)]">{{ errorMap[type].message }}</div>
53
+      <div class="mt-20px">
54
+        <ElButton type="primary" @click="btnClick">{{ errorMap[type].buttonText }}</ElButton>
55
+      </div>
56
+    </div>
57
+  </div>
58
+</template>

+ 3 - 0
src/components/Footer/index.ts

@@ -0,0 +1,3 @@
1
+import Footer from './src/Footer.vue'
2
+
3
+export { Footer }

+ 14 - 0
src/components/Footer/src/Footer.vue

@@ -0,0 +1,14 @@
1
+<script setup lang="ts">
2
+import { useDesign } from '@/hooks/web/useDesign'
3
+const { getPrefixCls } = useDesign()
4
+
5
+const prefixCls = getPrefixCls('footer')
6
+</script>
7
+
8
+<template>
9
+  <div
10
+    :class="prefixCls"
11
+    class="shrink-0 text-center text-[var(--el-text-color-placeholder)] bg-[var(--app-content-bg-color)] h-[var(--app-footer-height)] leading-[var(--app-footer-height)] dark:bg-[var(--el-bg-color)]"
12
+  >
13
+  </div>
14
+</template>

+ 0 - 0
src/components/Form/index.ts


Some files were not shown because too many files changed in this diff