hongk 2 viikkoa sitten
commit
e85410f3f6
100 muutettua tiedostoa jossa 7658 lisäystä ja 0 poistoa
  1. 10 0
      .gitignore
  2. 3 0
      .npmrc
  3. 43 0
      buildAll.js
  4. 81 0
      eslint.config.mjs
  5. 146 0
      package.json
  6. 7 0
      pnpm-workspace.yaml
  7. 5 0
      projects/base/.browserslistrc
  8. 22 0
      projects/base/.env.base
  9. 40 0
      projects/base/.env.dev
  10. 40 0
      projects/base/.env.pro
  11. 38 0
      projects/base/.env.test
  12. 10 0
      projects/base/.gitignore
  13. 9 0
      projects/base/.prettierignore
  14. 6 0
      projects/base/.stylelintignore
  15. 3 0
      projects/base/.vscode/extensions.json
  16. 19 0
      projects/base/.vscode/settings.json
  17. 1236 0
      projects/base/CHANGELOG.md
  18. 21 0
      projects/base/LICENSE
  19. 82 0
      projects/base/README.md
  20. 13 0
      projects/base/auto-imports.d.ts
  21. 28 0
      projects/base/commitlint.config.cjs
  22. 44 0
      projects/base/components.d.ts
  23. 81 0
      projects/base/eslint.config.mjs
  24. 143 0
      projects/base/index.html
  25. 40 0
      projects/base/package.json
  26. 11 0
      projects/base/plop/component/component.hbs
  27. 3 0
      projects/base/plop/component/index.hbs
  28. 38 0
      projects/base/plop/component/prompt.cjs
  29. 37 0
      projects/base/plop/view/prompt.cjs
  30. 7 0
      projects/base/plop/view/view.hbs
  31. 7 0
      projects/base/plopfile.cjs
  32. 5 0
      projects/base/postcss.config.cjs
  33. 19 0
      projects/base/prettier.config.cjs
  34. BIN
      projects/base/public/favicon.ico
  35. BIN
      projects/base/public/logo.png
  36. 555 0
      projects/base/src/locales/en.ts
  37. 543 0
      projects/base/src/locales/zh-CN.ts
  38. 64 0
      projects/base/src/main.ts
  39. 26 0
      projects/base/src/permission.ts
  40. 111 0
      projects/base/src/router/index.ts
  41. 5 0
      projects/base/src/utils/messageApi.ts
  42. 205 0
      projects/base/src/utils/routerHelper.ts
  43. 193 0
      projects/base/src/views/CurdPageTemplate/Page.vue
  44. 238 0
      projects/base/src/views/CurdPageTemplate/components/Detail.vue
  45. 186 0
      projects/base/src/views/CurdPageTemplate/components/Write.vue
  46. 226 0
      projects/base/src/views/CurdTemplate/Page.vue
  47. 19 0
      projects/base/src/views/CurdTemplate/components/Detail.vue
  48. 66 0
      projects/base/src/views/CurdTemplate/components/Write.vue
  49. 68 0
      projects/base/src/views/Demo.vue
  50. 231 0
      projects/base/stylelint.config.cjs
  51. 37 0
      projects/base/tsconfig.json
  52. 15 0
      projects/base/types/components.d.ts
  53. 7 0
      projects/base/types/ele.d.ts
  54. 14 0
      projects/base/types/env.d.ts
  55. 101 0
      projects/base/types/global.d.ts
  56. 78 0
      projects/base/types/router.d.ts
  57. 146 0
      projects/base/uno.config.ts
  58. 184 0
      projects/base/vite.config.ts
  59. 81 0
      projects/common/eslint.config.mjs
  60. 19 0
      projects/common/prettier.config.cjs
  61. 101 0
      projects/common/src/App.vue
  62. 46 0
      projects/common/src/api/index.ts
  63. 25 0
      projects/common/src/api/login/index.ts
  64. 22 0
      projects/common/src/api/login/types.ts
  65. 39 0
      projects/common/src/api/messageApi.ts
  66. 21 0
      projects/common/src/api/system-config/department/index.ts
  67. 32 0
      projects/common/src/api/system-config/department/types.ts
  68. 81 0
      projects/common/src/api/system-config/field/index.ts
  69. 44 0
      projects/common/src/api/system-config/field/types.ts
  70. 12 0
      projects/common/src/api/system-config/log.ts
  71. 39 0
      projects/common/src/api/system-config/lowcode.ts
  72. 29 0
      projects/common/src/api/system-config/role/index.ts
  73. 25 0
      projects/common/src/api/system-config/user/index.ts
  74. 0 0
      projects/common/src/api/system-config/user/types.ts
  75. 11 0
      projects/common/src/api/types/custom.ts
  76. 48 0
      projects/common/src/api/types/login.ts
  77. BIN
      projects/common/src/assets/imgs/add.png
  78. BIN
      projects/common/src/assets/imgs/avatar.png
  79. BIN
      projects/common/src/assets/imgs/del.png
  80. BIN
      projects/common/src/assets/imgs/location.png
  81. BIN
      projects/common/src/assets/imgs/logo.png
  82. BIN
      projects/common/src/assets/imgs/more.png
  83. 211 0
      projects/common/src/assets/svgs/403.svg
  84. 197 0
      projects/common/src/assets/svgs/404.svg
  85. 325 0
      projects/common/src/assets/svgs/500.svg
  86. 13 0
      projects/common/src/assets/svgs/del.svg
  87. 7 0
      projects/common/src/assets/svgs/guize.svg
  88. 3 0
      projects/common/src/assets/svgs/icon.svg
  89. 188 0
      projects/common/src/assets/svgs/login-box-bg.svg
  90. 3 0
      projects/common/src/assets/svgs/message.svg
  91. 12 0
      projects/common/src/assets/svgs/warning.svg
  92. 84 0
      projects/common/src/axios/config.ts
  93. 42 0
      projects/common/src/axios/index.ts
  94. 73 0
      projects/common/src/axios/service.ts
  95. 31 0
      projects/common/src/axios/types/index.ts
  96. 46 0
      projects/common/src/business-components/BackButton.vue
  97. 52 0
      projects/common/src/business-components/ButtonBottom.vue
  98. 34 0
      projects/common/src/business-components/DeptSelect.vue
  99. 44 0
      projects/common/src/business-components/DistrictSelect.vue
  100. 3 0
      projects/common/src/business-components/DynamicForm/index.ts

+ 10 - 0
.gitignore

@@ -0,0 +1,10 @@
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+/dist*
+*-lock.*
+pnpm-debug
+stats.html
+.idea

+ 3 - 0
.npmrc

@@ -0,0 +1,3 @@
+link-workspace-packages = true # 启用工作区内部的包链接
+prefer-workspace-packages = true # 优先选择工作区中的包
+recursive-install = true # 递归地安装工作区中所有项目的依赖

+ 43 - 0
buildAll.js

@@ -0,0 +1,43 @@
+import fs from 'fs';
+import path from 'path';
+import { execSync } from 'child_process';
+
+// 工程目录路径
+const projectDir = '/Users/hongkai/Documents/work/bolian/web/projects';
+
+// 获取命令行参数
+const args = process.argv.slice(2);
+const targetProject = args[0];
+
+// 读取工程目录下的所有子目录
+const directories = fs.readdirSync(projectDir).filter(file => {
+    const filePath = path.join(projectDir, file);
+    return fs.statSync(filePath).isDirectory();
+});
+
+directories.forEach(directory => {
+    // 如果指定了目标项目且当前目录不是目标项目,则跳过
+    if (targetProject && directory !== targetProject) {
+        console.log(`Skipping project ${directory} as it's not the target project...`);
+        return;
+    }
+
+    if (directory === 'base') {
+        console.log(`Skipping base project...`);
+        return;
+    }
+
+    const packageJsonPath = path.join(projectDir, directory, 'package.json');
+    if (fs.existsSync(packageJsonPath)) {
+        console.log(`Building project in ${directory}...`);
+        try {
+            // 添加调试信息
+            console.log(`Executing: pnpm run build in ${directory}`);
+            execSync('pnpm run build', { cwd: path.join(projectDir, directory), stdio: 'inherit' });
+        } catch (error) {
+            console.error(`Failed to build project in ${directory}:`, error.message);
+        }
+    } else {
+        console.log(`No package.json found in ${directory}, skipping...`);
+    }
+});

+ 81 - 0
eslint.config.mjs

@@ -0,0 +1,81 @@
+// 引入vue模版的eslint
+import pluginVue from 'eslint-plugin-vue'
+import eslint from '@eslint/js'
+// ts-eslint解析器,使 eslint 可以解析 ts 语法
+import tseslint from 'typescript-eslint'
+// vue文件解析器
+import vueParser from 'vue-eslint-parser'
+import prettier from 'eslint-plugin-prettier'
+
+export default tseslint.config({
+  // ignores: ['node_modules', 'prettier.config.cjs', 'dist*'],
+  files: ['src/**/*.ts', 'src/**/*.tsx', 'src/**/*.vue'],
+  // tseslint.config添加了extends扁平函数,直接用。否则是eslint9.0版本是没有extends的
+  extends: [
+    eslint.configs.recommended,
+    ...tseslint.configs.recommended,
+    ...pluginVue.configs['flat/essential']
+  ],
+  plugins: {
+    prettier
+  },
+  languageOptions: {
+    parser: vueParser, // 使用vue解析器,这个可以识别vue文件
+    parserOptions: {
+      parser: tseslint.parser, // 在vue文件上使用ts解析器
+      sourceType: 'module',
+      ecmaVersion: 2020,
+      ecmaFeatures: {
+        jsx: true
+      }
+    }
+  },
+  rules: {
+    'prettier/prettier': 'error',
+    'no-useless-escape': 0,
+    'no-undef': 0,
+    'vue/no-setup-props-destructure': 0,
+    'vue/script-setup-uses-vars': 1,
+    'vue/no-reserved-component-names': 0,
+    '@typescript-eslint/ban-ts-ignore': 0,
+    '@typescript-eslint/explicit-function-return-type': 0,
+    '@typescript-eslint/no-explicit-any': 0,
+    '@typescript-eslint/no-var-requires': 0,
+    '@typescript-eslint/no-empty-function': 0,
+    'vue/custom-event-name-casing': 0,
+    'no-use-before-define': 0,
+    '@typescript-eslint/no-use-before-define': 0,
+    '@typescript-eslint/ban-ts-comment': 0,
+    '@typescript-eslint/ban-types': 0,
+    '@typescript-eslint/no-non-null-assertion': 0,
+    '@typescript-eslint/explicit-module-boundary-types': 0,
+    '@typescript-eslint/no-unused-vars': 0,
+    'no-unused-vars': 0,
+    'space-before-function-paren': 0,
+
+    'vue/attributes-order': 0,
+    'vue/one-component-per-file': 0,
+    'vue/html-closing-bracket-newline': 0,
+    'vue/max-attributes-per-line': 0,
+    'vue/multiline-html-element-content-newline': 0,
+    'vue/singleline-html-element-content-newline': 0,
+    'vue/attribute-hyphenation': 0,
+    'vue/require-default-prop': 0,
+    'vue/require-explicit-emits': 0,
+    'vue/html-self-closing': [
+      1,
+      {
+        html: {
+          void: 'always',
+          normal: 'never',
+          component: 'always'
+        },
+        svg: 'always',
+        math: 'always'
+      }
+    ],
+    'vue/multi-word-component-names': 0,
+    'vue/no-v-html': 0,
+    'vue/require-toggle-inside-transition': 0
+  }
+})

+ 146 - 0
package.json

@@ -0,0 +1,146 @@
+{
+  "name": "main",
+  "version": "1.0.0",
+  "description": "一套基于vue3、element-plus、typesScript、vite4的后台集成方案。",
+  "private": true,
+  "type": "module",
+  "scripts": {
+    "i": "pnpm install",
+    "dev": "pnpm vite --mode base",
+    "ts:check": "pnpm vue-tsc --noEmit --skipLibCheck",
+    "build:pro": "pnpm vite build --mode pro",
+    "build:dev": "pnpm vite build --mode dev",
+    "build:test": "pnpm vite build --mode test",
+    "serve:pro": "pnpm vite preview --mode pro",
+    "serve:dev": "pnpm vite preview --mode dev",
+    "serve:test": "pnpm vite preview --mode test",
+    "npm:check": "pnpx npm-check-updates -u",
+    "clean": "pnpx rimraf node_modules",
+    "clean:cache": "pnpx rimraf node_modules/.cache",
+    "lint:eslint": "eslint . --fix \"src/**/*.{js,ts,tsx,vue,html}\"",
+    "lint:format": "prettier --write --loglevel warn \"src/**/*.{js,ts,json,tsx,css,less,vue,html,md}\"",
+    "lint:style": "stylelint --fix \"**/*.{vue,less,postcss,css,scss}\" --cache --cache-location node_modules/.cache/stylelint/",
+    "lint:lint-staged": "lint-staged -c ./.husky/lintstagedrc.cjs",
+    "p": "plop"
+  },
+  "dependencies": {
+    "@amap/amap-jsapi-loader": "^1.0.1",
+    "@common/package": "workspace:^",
+    "@common/src": "workspace:^",
+    "@common/utils": "workspace:^",
+    "@element-plus/icons": "^0.0.11",
+    "@element-plus/icons-vue": "^1.1.4",
+    "@iconify/iconify": "^3.1.1",
+    "@iconify/vue": "^4.1.2",
+    "@vueuse/core": "^12.0.0",
+    "@zxcvbn-ts/core": "^3.0.4",
+    "animate.css": "^4.1.1",
+    "axios": "^1.7.2",
+    "bpmn-js": "^8.10.0",
+    "bpmn-js-properties-panel": "^5.20.0",
+    "bpmn-js-task-resize": "^1.2.0",
+    "bpmn-js-token-simulation": "^0.10.0",
+    "codemirror": "^5.64.0",
+    "codemirror-editor-vue3": "^2.0.6",
+    "cropperjs": "^1.6.2",
+    "crypto-js": "^4.2.0",
+    "dayjs": "^1.11.11",
+    "diagram-js": "^14.8.0",
+    "diagram-js-minimap": "^2.1.1",
+    "driver.js": "^1.3.1",
+    "element-plus": "2.9.2",
+    "lodash-es": "^4.17.21",
+    "marked": "^15.0.8",
+    "min-dash": "^3.5.2",
+    "mitt": "^3.0.1",
+    "monaco-editor": "^0.50.0",
+    "nprogress": "^0.2.0",
+    "pinia": "^2.1.7",
+    "pinia-plugin-persistedstate": "^3.2.1",
+    "qs": "^6.12.3",
+    "url": "^0.11.3",
+    "uuid": "^9.0.1",
+    "vue": "3.5.13",
+    "vue-draggable-plus": "^0.5.3",
+    "vue-i18n": "9.13.1",
+    "vue-router": "^4.4.0",
+    "vue-types": "^5.1.3",
+    "xgplayer": "^3.0.18"
+  },
+  "devDependencies": {
+    "@commitlint/cli": "^19.3.0",
+    "@commitlint/config-conventional": "^19.2.2",
+    "@iconify/json": "^2.2.229",
+    "@intlify/unplugin-vue-i18n": "^4.0.0",
+    "@types/codemirror": "5.60.5",
+    "@types/fs-extra": "^11.0.4",
+    "@types/inquirer": "^9.0.7",
+    "@types/lodash-es": "^4.17.12",
+    "@types/mockjs": "^1.0.10",
+    "@types/node": "^20.14.11",
+    "@types/nprogress": "^0.2.3",
+    "@types/qs": "^6.9.15",
+    "@types/sortablejs": "^1.15.8",
+    "@typescript-eslint/eslint-plugin": "^7.16.1",
+    "@typescript-eslint/parser": "^7.16.1",
+    "@unocss/transformer-variant-group": "^0.61.5",
+    "@vitejs/plugin-legacy": "^5.4.1",
+    "@vitejs/plugin-vue": "^5.0.5",
+    "@vitejs/plugin-vue-jsx": "^4.0.0",
+    "autoprefixer": "^10.4.19",
+    "chalk": "^5.3.0",
+    "consola": "^3.2.3",
+    "eslint": "^9.7.0",
+    "eslint-config-prettier": "^9.1.0",
+    "eslint-define-config": "^2.1.0",
+    "eslint-plugin-prettier": "^5.2.1",
+    "eslint-plugin-vue": "^9.27.0",
+    "esno": "^4.7.0",
+    "fs-extra": "^11.2.0",
+    "globals": "^16.0.0",
+    "inquirer": "^10.0.3",
+    "less": "^4.2.0",
+    "lint-staged": "^15.2.7",
+    "mockjs": "^1.1.0",
+    "plop": "^4.0.1",
+    "postcss": "^8.4.39",
+    "postcss-html": "^1.7.0",
+    "postcss-less": "^6.0.0",
+    "prettier": "^3.3.3",
+    "rimraf": "^6.0.1",
+    "rollup": "^4.18.1",
+    "rollup-plugin-visualizer": "^5.12.0",
+    "stylelint": "^16.7.0",
+    "stylelint-config-html": "^1.1.0",
+    "stylelint-config-recommended": "^14.0.1",
+    "stylelint-config-standard": "^36.0.1",
+    "stylelint-order": "^6.0.4",
+    "terser": "^5.31.3",
+    "typescript": "5.5.3",
+    "typescript-eslint": "^7.16.1",
+    "unocss": "^0.61.5",
+    "unplugin-auto-import": "^0.18.3",
+    "unplugin-vue-components": "^0.27.4",
+    "vite": "5.4.11",
+    "vite-plugin-compression": "^0.5.1",
+    "vite-plugin-ejs": "^1.7.0",
+    "vite-plugin-eslint": "^1.8.1",
+    "vite-plugin-mock": "2.9.6",
+    "vite-plugin-progress": "^0.0.7",
+    "vite-plugin-purge-icons": "^0.10.0",
+    "vite-plugin-style-import": "2.0.0",
+    "vite-plugin-svg-icons": "^2.0.1",
+    "vite-plugin-url-copy": "^1.1.4",
+    "vue-tsc": "^2.0.26"
+  },
+  "packageManager": "pnpm@8.1.0",
+  "engines": {
+    "node": ">=18.0.0",
+    "pnpm": ">=8.1.0"
+  },
+  "license": "MIT",
+  "repository": {
+    "type": "git",
+    "url": "http://112.124.9.106:10300/one_health/web.git"
+  }
+}

+ 7 - 0
pnpm-workspace.yaml

@@ -0,0 +1,7 @@
+packages:
+  # 所有项目项目
+  - 'projects/*'
+  # 公共文件和组件等
+  - 'projects/common/*'
+  # 公共包
+  - 'projects/package/*'

+ 5 - 0
projects/base/.browserslistrc

@@ -0,0 +1,5 @@
+Android 4.1
+IOS 7.1
+Chrome > 31
+ff > 31
+ie >= 11

+ 22 - 0
projects/base/.env.base

@@ -0,0 +1,22 @@
+# 环境
+VITE_NODE_ENV=development
+
+# 接口前缀
+VITE_API_BASE_PATH=/openapi
+
+# 打包路径
+VITE_BASE_PATH=/
+
+# 标题
+VITE_APP_TITLE=基础模版
+
+# 是否全量引入element-plus样式
+VITE_USE_ALL_ELEMENT_PLUS_STYLE=false
+
+# 是否使用在线图标
+VITE_USE_ONLINE_ICON=false
+
+# 是否隐藏全局设置按钮
+VITE_HIDE_GLOBAL_SETTING=false
+
+VITE_API_SYS_CODE=WARNING

+ 40 - 0
projects/base/.env.dev

@@ -0,0 +1,40 @@
+# 环境
+VITE_NODE_ENV=production
+
+# 接口前缀
+VITE_API_BASE_PATH=/openapi
+
+# 打包路径
+VITE_BASE_PATH=./
+
+# 是否删除debugger
+VITE_DROP_DEBUGGER=true
+
+# 是否删除console.log
+VITE_DROP_CONSOLE=false
+
+# 是否sourcemap
+VITE_SOURCEMAP=false
+
+# 输出路径
+VITE_OUT_DIR=dist-dev
+
+# 标题
+VITE_APP_TITLE=同一健康·xxx
+
+# 是否包分析
+VITE_USE_BUNDLE_ANALYZER=true
+
+# 是否全量引入element-plus样式
+VITE_USE_ALL_ELEMENT_PLUS_STYLE=false
+
+# 是否切割css
+VITE_USE_CSS_SPLIT=true
+
+# 是否使用在线图标
+VITE_USE_ONLINE_ICON=false
+
+# 是否隐藏全局设置按钮
+VITE_HIDE_GLOBAL_SETTING=true
+
+VITE_API_SYS_CODE=xxx

+ 40 - 0
projects/base/.env.pro

@@ -0,0 +1,40 @@
+# 环境
+VITE_NODE_ENV=production
+
+# 接口前缀
+VITE_API_BASE_PATH=/openapi
+
+# 打包路径
+VITE_BASE_PATH=./
+
+# 是否删除debugger
+VITE_DROP_DEBUGGER=true
+
+# 是否删除console.log
+VITE_DROP_CONSOLE=true
+
+# 是否sourcemap
+VITE_SOURCEMAP=false
+
+# 输出路径
+VITE_OUT_DIR=dist-pro
+
+# 标题
+VITE_APP_TITLE=同一健康·xxx
+
+# 是否包分析
+VITE_USE_BUNDLE_ANALYZER=true
+
+# 是否全量引入element-plus样式
+VITE_USE_ALL_ELEMENT_PLUS_STYLE=false
+
+# 是否切割css
+VITE_USE_CSS_SPLIT=true
+
+# 是否使用在线图标
+VITE_USE_ONLINE_ICON=false
+
+# 是否隐藏全局设置按钮
+VITE_HIDE_GLOBAL_SETTING=true
+
+VITE_API_SYS_CODE=xxx

+ 38 - 0
projects/base/.env.test

@@ -0,0 +1,38 @@
+# 环境
+VITE_NODE_ENV=production
+
+# 接口前缀
+VITE_API_BASE_PATH=
+
+# 打包路径
+VITE_BASE_PATH=/dist-test/
+
+# 是否删除debugger
+VITE_DROP_DEBUGGER=false
+
+# 是否删除console.log
+VITE_DROP_CONSOLE=false
+
+# 是否sourcemap
+VITE_SOURCEMAP=true
+
+# 输出路径
+VITE_OUT_DIR=dist-test
+
+# 标题
+VITE_APP_TITLE=同一健康
+
+# 是否包分析
+VITE_USE_BUNDLE_ANALYZER=false
+
+# 是否全量引入element-plus样式
+VITE_USE_ALL_ELEMENT_PLUS_STYLE=false
+
+# 是否切割css
+VITE_USE_CSS_SPLIT=false
+
+# 是否使用在线图标
+VITE_USE_ONLINE_ICON=true
+
+# 是否隐藏全局设置按钮
+VITE_HIDE_GLOBAL_SETTING=false

+ 10 - 0
projects/base/.gitignore

@@ -0,0 +1,10 @@
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+/dist*
+*-lock.*
+pnpm-debug
+stats.html
+.idea

+ 9 - 0
projects/base/.prettierignore

@@ -0,0 +1,9 @@
+/node_modules/**
+/dist/
+/dist*
+/public/*
+/docs/*
+/src/types/env.d.ts
+/docs/**/*
+/plop/**/*
+CHANGELOG

+ 6 - 0
projects/base/.stylelintignore

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

+ 3 - 0
projects/base/.vscode/extensions.json

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

+ 19 - 0
projects/base/.vscode/settings.json

@@ -0,0 +1,19 @@
+{
+  "typescript.tsdk": "node_modules/typescript/lib",
+  "prettier.enable": true,
+  "editor.codeActionsOnSave": {
+    "source.fixAll.eslint": "explicit"
+  },
+  "[vue]": {
+    "editor.defaultFormatter": "esbenp.prettier-vscode"
+  },
+  "i18n-ally.localesPaths": ["src/locales"],
+  "i18n-ally.keystyle": "nested",
+  "i18n-ally.sortKeys": true,
+  "i18n-ally.namespace": false,
+  "i18n-ally.enabledParsers": ["ts"],
+  "i18n-ally.sourceLanguage": "en",
+  "i18n-ally.displayLanguage": "zh-CN",
+  "i18n-ally.enabledFrameworks": ["vue", "react"],
+  "god.tsconfig": "./tsconfig.json"
+}

+ 1236 - 0
projects/base/CHANGELOG.md

@@ -0,0 +1,1236 @@
+# Changelog
+
+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.
+
+## [2.8.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.8.0...v2.8.1) (2024-06-20)
+
+### Bug Fixes
+
+- [#458](https://github.com/kailong321200875/vue-element-plus-admin/issues/458) ([49451ae](https://github.com/kailong321200875/vue-element-plus-admin/commit/49451ae606009d1f5ab0b98f84535892d3fd7646))
+- [#481](https://github.com/kailong321200875/vue-element-plus-admin/issues/481) ([c77586c](https://github.com/kailong321200875/vue-element-plus-admin/commit/c77586c5670cdc63978b032bbda694a14e875838))
+- 修复 search组件的收起展开 和重置 Bug ([9a5c7bc](https://github.com/kailong321200875/vue-element-plus-admin/commit/9a5c7bcb5b51e76eac6bc1d3aebc287593b13ca1))
+- 修复css前缀无法应用问题([#482](https://github.com/kailong321200875/vue-element-plus-admin/issues/482)) ([4b43c87](https://github.com/kailong321200875/vue-element-plus-admin/commit/4b43c87949fe4a68b4be004a06dfff4c7f87fbd4))
+- 修复表格default-expand-all属性无效BUG ([6657bbc](https://github.com/kailong321200875/vue-element-plus-admin/commit/6657bbc9f11f22cbfb04a57f5629bc810575496e))
+- 修复表格合计报错问题 ([9c44006](https://github.com/kailong321200875/vue-element-plus-admin/commit/9c44006ec26bee446dc5c90b6a4546cdd84ba4dc))
+
+### Styling
+
+- 修改登录页样式 ([9f98b7b](https://github.com/kailong321200875/vue-element-plus-admin/commit/9f98b7be266825612f93135c460d7db2d6a8beb0))
+
+### Performance Improvements
+
+- 优化使用离线图标后运行慢问题 ([7e9c4a6](https://github.com/kailong321200875/vue-element-plus-admin/commit/7e9c4a6109b417a577d9ac9ecf02db52eb1964af))
+
+## [2.8.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.7.0...v2.8.0) (2024-06-01)
+
+### Types
+
+- 修复Table类型错误 ([79b917a](https://github.com/kailong321200875/vue-element-plus-admin/commit/79b917af4957aa4b47db46e034385477828f5fca))
+
+### Features
+
+- Add a new component CodeEditor ([#466](https://github.com/kailong321200875/vue-element-plus-admin/issues/466)) ([00989b7](https://github.com/kailong321200875/vue-element-plus-admin/commit/00989b7ac9b92685be495c15c1f11dd2546eb6be))
+
+### Bug Fixes
+
+- [#427](https://github.com/kailong321200875/vue-element-plus-admin/issues/427) ([a00d76e](https://github.com/kailong321200875/vue-element-plus-admin/commit/a00d76e4149b430e19c985a78b9d89ce992dba3f))
+- [#428](https://github.com/kailong321200875/vue-element-plus-admin/issues/428) ([97a1cd4](https://github.com/kailong321200875/vue-element-plus-admin/commit/97a1cd41de82dad8855c95cec6bb106541fd53a7))
+- [#432](https://github.com/kailong321200875/vue-element-plus-admin/issues/432) ([df5b716](https://github.com/kailong321200875/vue-element-plus-admin/commit/df5b7166b48b7e0e77a1fb10ab6dd353d186547e))
+- [#438](https://github.com/kailong321200875/vue-element-plus-admin/issues/438) ([f977fdb](https://github.com/kailong321200875/vue-element-plus-admin/commit/f977fdb05d018ee07baeb6db454b9a77acb89f07))
+- [#451](https://github.com/kailong321200875/vue-element-plus-admin/issues/451) ([08665a3](https://github.com/kailong321200875/vue-element-plus-admin/commit/08665a35ac606549322039d073daf8072053eef4))
+- [#465](https://github.com/kailong321200875/vue-element-plus-admin/issues/465) ([8996e01](https://github.com/kailong321200875/vue-element-plus-admin/commit/8996e01ca35bfad8c13bef321f86bdd711202e12))
+- less 变量命名与 css 关键字冲突 [#475](https://github.com/kailong321200875/vue-element-plus-admin/issues/475) ([1c56e13](https://github.com/kailong321200875/vue-element-plus-admin/commit/1c56e13c5523a86d77464eccee26b5408db028c7))
+- 修复 lint-staged 中 prettier 以 json 格式美化代码的无效命令问题 ([7b2eae1](https://github.com/kailong321200875/vue-element-plus-admin/commit/7b2eae1d6aa813e162c3ad4a0553d2df480c765f))
+- 修复 Transfer 组件 optionApi 不生效 ([198718b](https://github.com/kailong321200875/vue-element-plus-admin/commit/198718b8749a036263d756f928b5dd38cfb47701))
+- 修复富文本编辑器初始化时, 报错 Error: Cannot find a descendant at path [0,1] in node ([a65d5fd](https://github.com/kailong321200875/vue-element-plus-admin/commit/a65d5fd20334307a56cb469361e8f9bd838510c9))
+- 修复组件-查询界面:收起和展开功能bug [#473](https://github.com/kailong321200875/vue-element-plus-admin/issues/473) ([8e58eae](https://github.com/kailong321200875/vue-element-plus-admin/commit/8e58eaeed6ea9beb749afaed75edc5a4f6d9867a))
+
+### Performance Improvements
+
+- 已经是 FormData 对象的不用再次转换 ([d582ad4](https://github.com/kailong321200875/vue-element-plus-admin/commit/d582ad428f4b378014d063635c4afbbad944a71a))
+
+## [2.7.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.6.0...v2.7.0) (2024-02-29)
+
+### Features
+
+- 头像列表 ([3bf28a5](https://github.com/kailong321200875/vue-element-plus-admin/commit/3bf28a5d4555bf2a10754474db81d70b04ee432a))
+- 新增个人中心页 ([4146716](https://github.com/kailong321200875/vue-element-plus-admin/commit/4146716655bfbe4ae5b780e5b52a6377efd914ec))
+
+### Bug Fixes
+
+- 修复启动慢问题 ([61d7ef6](https://github.com/kailong321200875/vue-element-plus-admin/commit/61d7ef642a027e9e1f942bc84322233be3ca9a82))
+- 修复第四种布局样式层级问题([#424](https://github.com/kailong321200875/vue-element-plus-admin/issues/424)) ([78aeb89](https://github.com/kailong321200875/vue-element-plus-admin/commit/78aeb897fc93cfb998f94578d1fbe4480426843f))
+
+### Features
+
+- add vite-plugin-url-copy ([f5ab977](https://github.com/kailong321200875/vue-element-plus-admin/commit/f5ab9776a90e0136b243601571f4619c20da3ccd))
+
+### Bug Fixes
+
+- Table组件中size属性的validator设置错误 ([f30e37e](https://github.com/kailong321200875/vue-element-plus-admin/commit/f30e37ee777d4f30d4ae58c4a016a1392d41c25f))
+- Table组件注册为全局组件报错问题,存在对pinia的提前引用 ([1e209a7](https://github.com/kailong321200875/vue-element-plus-admin/commit/1e209a702a5114943a615063eefd0c00f1a6a003))
+- Table组件设置 align="center" 导致横向滚动条位置错误问题 ([22f071d](https://github.com/kailong321200875/vue-element-plus-admin/commit/22f071d9268806f7abd23ab2d08e9392e377a426))
+- 修复 element-plus 2.5版本以上,el-form-item inline模式下,select宽度问题 ([f44e48d](https://github.com/kailong321200875/vue-element-plus-admin/commit/f44e48d08d3f8dd347b829166107dd62e5e18c72))
+- 修复 prettier 报错 ([f5f08f8](https://github.com/kailong321200875/vue-element-plus-admin/commit/f5f08f8f87b063d489f55ea8f19c7c802acf15f7))
+- 修复 useCrudSchemas 详情组件数据结构文案不匹配问题 ([d94fc0a](https://github.com/kailong321200875/vue-element-plus-admin/commit/d94fc0a701bcbc9343ab3e7b630e3db8f6d61623))
+- 修复cutMenu布局刷新样式问题 ([03580b0](https://github.com/kailong321200875/vue-element-plus-admin/commit/03580b0ca0c8d088589ae1d8426b1535f654361b))
+- 修复Menu组件缩略菜单弹窗内样式不统一问题 ([d5dc4e3](https://github.com/kailong321200875/vue-element-plus-admin/commit/d5dc4e32d5978fcd271e841832c9cbf1e0c87db7))
+- 修复TagsView右键菜单逻辑错误 ([901c891](https://github.com/kailong321200875/vue-element-plus-admin/commit/901c891872ef6164e3517eb8e798d6039b7b7f4e))
+- 修复test打包VITE_USE_ONLINE_ICON无效问题 ([a3436a3](https://github.com/kailong321200875/vue-element-plus-admin/commit/a3436a32c6fd746e9e2af67c3cc5a8872aabf919))
+- 修复本地化图标空白问题 ([14ff83a](https://github.com/kailong321200875/vue-element-plus-admin/commit/14ff83affcd267fbdb405d2f46e9f929a1fbfaeb))
+- 修复请求示例中,mock开启时无法取消单个请求的问题 ([d6d70a4](https://github.com/kailong321200875/vue-element-plus-admin/commit/d6d70a443cccb2fe12161b57a1f227d1ed63384a))
+- 修改兼容方式,兼容Form 组件中contentMap中类输入框或下拉选择的所有组件,特殊兼容 InputNumber 组件 ([ab98ceb](https://github.com/kailong321200875/vue-element-plus-admin/commit/ab98ceb85f52c5f7b87c2114997c63f1b80f216f))
+- 更换判断条件 ([b5cb626](https://github.com/kailong321200875/vue-element-plus-admin/commit/b5cb626bfac4df8b1a0741b5000d5b22f6cd4555))
+
+### Docs
+
+- 修改群二维码 ([395ff68](https://github.com/kailong321200875/vue-element-plus-admin/commit/395ff68412ff71a9b8ce670c2399da285cfed67d))
+- 更新群二维码 ([c8ccaa8](https://github.com/kailong321200875/vue-element-plus-admin/commit/c8ccaa8d49b5bf7a2784a29af6e126657ce54cda))
+
+### Styling
+
+- 添加TabMenu边框 ([feb3d9a](https://github.com/kailong321200875/vue-element-plus-admin/commit/feb3d9a8d07f6444c39ca89f6eb63245c06783a0))
+
+## [2.5.6](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.5.5...v2.5.6) (2024-01-18)
+
+### Bug Fixes
+
+- [#396](https://github.com/kailong321200875/vue-element-plus-admin/issues/396) ([9b2b4d4](https://github.com/kailong321200875/vue-element-plus-admin/commit/9b2b4d42a6d5fffd5012506b7cac3892774c8595))
+- [#399](https://github.com/kailong321200875/vue-element-plus-admin/issues/399) ([59d4ed4](https://github.com/kailong321200875/vue-element-plus-admin/commit/59d4ed4dd9d6b6f0d5881b4d466e7a621770ad75))
+- 修复Form组件设置了hidden还是会出现占位空白 ([0f531fd](https://github.com/kailong321200875/vue-element-plus-admin/commit/0f531fd1d0469ddd56327b0a9a7956a0d6076c91))
+- 修复无法登录问题 ([8ce00ab](https://github.com/kailong321200875/vue-element-plus-admin/commit/8ce00ab247de4061cb56f9c2f6d3079abd39aefd))
+- 修复菜单管理回显问题 ([d9ca9ba](https://github.com/kailong321200875/vue-element-plus-admin/commit/d9ca9ba5e8111b7cc3758a8bba14f7fac45c9446))
+- 升级依赖,修复vue警告 ([eafb507](https://github.com/kailong321200875/vue-element-plus-admin/commit/eafb5075d587feac0501a1adae90a176a72c240f))
+
+### Docs
+
+- 更新README ([28bd10f](https://github.com/kailong321200875/vue-element-plus-admin/commit/28bd10f26373ad6e139b412e08d1e2afacc4ab92))
+
+### Styling
+
+- 调整样式 ([09b96c7](https://github.com/kailong321200875/vue-element-plus-admin/commit/09b96c75425cd2d931e7df4ef3f330b78bf74f9e))
+
+### Performance Improvements
+
+- request请求根据ContentType自动转换数据 ([ef9aa62](https://github.com/kailong321200875/vue-element-plus-admin/commit/ef9aa625724b754afc565b8b1f2589376f4d5c50))
+- 使用flex布局,优化section区域min-height的繁琐计算 ([fbb6f9a](https://github.com/kailong321200875/vue-element-plus-admin/commit/fbb6f9ad4b6d5fac9bb95d0a9250b5a318680d99))
+
+## [2.5.5](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.5.4...v2.5.5) (2024-01-06)
+
+### Bug Fixes
+
+- [#276](https://github.com/kailong321200875/vue-element-plus-admin/issues/276) ([6fbc2b0](https://github.com/kailong321200875/vue-element-plus-admin/commit/6fbc2b0243e4aec0463a734c37591dc3de40f7db))
+- el-button组件和其他部分使用到相关变量的组件无法适配主题色变化问题 ([00cac6a](https://github.com/kailong321200875/vue-element-plus-admin/commit/00cac6a831c2a0bb2f8a9df8b9264f1cad13ddde))
+
+### Styling
+
+- 菜单支持超出省略号 ([a926c56](https://github.com/kailong321200875/vue-element-plus-admin/commit/a926c5607a162145f77d35762b3d6730d67b23f6))
+- 菜单背景支持跟随暗黑模式 ([b34aeba](https://github.com/kailong321200875/vue-element-plus-admin/commit/b34aeba10a464a0f92752fc966386286443df53a))
+
+### Performance Improvements
+
+- 优化ImageCropping ([069777c](https://github.com/kailong321200875/vue-element-plus-admin/commit/069777c8801c51ab28c070b2ba3f10000e9c91b4))
+- 图标选择器逻辑优化 ([c2dde25](https://github.com/kailong321200875/vue-element-plus-admin/commit/c2dde252297c94036221d5d9971781182bc2998e))
+- 表格组件预览字段拆分 ([8c5858e](https://github.com/kailong321200875/vue-element-plus-admin/commit/8c5858e2c5d42db1de37d5290ea2ca784f4d4612))
+
+## [2.5.4](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.5.3...v2.5.4) (2023-12-26)
+
+### Types
+
+- 修复全局组件属性类型无法推导 ([94160c0](https://github.com/kailong321200875/vue-element-plus-admin/commit/94160c0418816e560f440e259e1f0fd4742e0143))
+
+### Bug Fixes
+
+- Menu菜单组件显示bug,renderMenuItem返回的数组存在undefined数据,导致省略菜单显示问题 ([1c63757](https://github.com/kailong321200875/vue-element-plus-admin/commit/1c63757d55076d15ffdf21d647de393ca3c6b0be))
+- useClipboard在ip地址下不能使用问题 ([f3593c4](https://github.com/kailong321200875/vue-element-plus-admin/commit/f3593c453a8b8d5eb8cbd0ed5402132b027461b9))
+- 修复request请求自定义headers类型错误 ([bf2cd72](https://github.com/kailong321200875/vue-element-plus-admin/commit/bf2cd720d0e5801603848a0b1520a928443ac549))
+- 修复切换主题色缓存失败 ([1074520](https://github.com/kailong321200875/vue-element-plus-admin/commit/10745207e64d2d444636cb9d877cec9a0bebf1eb))
+- 修复非正式环境打包报错 ([3a5db42](https://github.com/kailong321200875/vue-element-plus-admin/commit/3a5db42c97f382f3fc701b8f113385b38a214583))
+
+### Styling
+
+- 本地化图标 ([608bf50](https://github.com/kailong321200875/vue-element-plus-admin/commit/608bf50e1cae49b7f97587395f794ae351f833f0))
+- 添加常见问题链接 ([16b9375](https://github.com/kailong321200875/vue-element-plus-admin/commit/16b93757d32c8ce2f611a62d6015072b0ecfc09a))
+
+### Code Refactoring
+
+- 新增列设置 ([7314065](https://github.com/kailong321200875/vue-element-plus-admin/commit/7314065c907f8ef4d184c1f3c724b67c30410ab9))
+- 重写useEventBus ([8035151](https://github.com/kailong321200875/vue-element-plus-admin/commit/80351516ced0ec2d67c30405d4a644aca8ca4bc2))
+
+### Performance Improvements
+
+- 优化启动速度 ([379b340](https://github.com/kailong321200875/vue-element-plus-admin/commit/379b340750eb0d4f7816f5d7c25cbd2983fd33b9))
+- 还原mock.js ([83de387](https://github.com/kailong321200875/vue-element-plus-admin/commit/83de387e2a0124804a9c99080ac841a9d6676fca))
+
+## [2.5.3](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.5.2...v2.5.3) (2023-12-17)
+
+### Bug Fixes
+
+- [#374](https://github.com/kailong321200875/vue-element-plus-admin/issues/374) ([30fb2de](https://github.com/kailong321200875/vue-element-plus-admin/commit/30fb2de6f37fe0bb00b0f364da31b07a292d59a1))
+- 修复cutMenu布局和top布局内容高度计算错误问题 ([8badd48](https://github.com/kailong321200875/vue-element-plus-admin/commit/8badd48a699aabd8fe510052d098fa6848ff5cbd))
+- 修复动态路由多开标签页404问题 ([1c5b16f](https://github.com/kailong321200875/vue-element-plus-admin/commit/1c5b16f529d2e60a1eefcadf3f416585d1adb93b))
+- 修复类型推导错误 ([649fb17](https://github.com/kailong321200875/vue-element-plus-admin/commit/649fb17d000c0d500ffcfe1f9ab6ddd73ab7ecfa))
+- 修复项目配置清楚缓存无效 ([a09ee60](https://github.com/kailong321200875/vue-element-plus-admin/commit/a09ee60bb123f5bc4bbe6d80539145d5c4b94cb8))
+
+### Code Refactoring
+
+- 重构描述组件样式 ([c7658d8](https://github.com/kailong321200875/vue-element-plus-admin/commit/c7658d8c70618045a7527156444ba1d564963325))
+
+### Performance Improvements
+
+- 优化登录记住我流程 ([2009594](https://github.com/kailong321200875/vue-element-plus-admin/commit/2009594f089722151b739598dbad5ee7fb062b6e))
+
+## [2.5.2](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.5.1...v2.5.2) (2023-12-10)
+
+### Bug Fixes
+
+- 修复mock无法使用问题 ([319aaef](https://github.com/kailong321200875/vue-element-plus-admin/commit/319aaef7eec6287a0e80f25a479918d43c051810))
+
+## [2.5.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.5.0...v2.5.1) (2023-12-10)
+
+### Bug Fixes
+
+- 修复表单回车刷新页面 ([2f64836](https://github.com/kailong321200875/vue-element-plus-admin/commit/2f6483652b5d130057b4422b0f3350542b4b4b1d))
+- 表单布局方式为top时,查询组件按钮位置错位 ([ca98359](https://github.com/kailong321200875/vue-element-plus-admin/commit/ca983590da72cb13392cb8897f4045fbacbc6c8d))
+
+### Docs
+
+- 更新Readme ([81d2dc6](https://github.com/kailong321200875/vue-element-plus-admin/commit/81d2dc6a43df8fd5799461cdafc1b7e6054cf1e1))
+
+### Styling
+
+- 修改视频表格样式 ([93767b6](https://github.com/kailong321200875/vue-element-plus-admin/commit/93767b65aa7c41e28a8a79a82edd2a91d20bd176))
+- 抽离BaseButton,支持按钮修改主题色 ([69539ee](https://github.com/kailong321200875/vue-element-plus-admin/commit/69539ee2d34ddfcb83cbfb25e218b94891196e76))
+
+### Performance Improvements
+
+- [#344](https://github.com/kailong321200875/vue-element-plus-admin/issues/344) ([7fa533b](https://github.com/kailong321200875/vue-element-plus-admin/commit/7fa533b8ba0d886c0009b350a3b5fe4b027a9126))
+
+## [2.5.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.4.1...v2.5.0) (2023-12-03)
+
+### Types
+
+- 删除无用类型 ([30e4214](https://github.com/kailong321200875/vue-element-plus-admin/commit/30e421438793b8283a0113ba50eb9aef90cfed4e))
+
+### Features
+
+- VideoPlayer ([7b5bbed](https://github.com/kailong321200875/vue-element-plus-admin/commit/7b5bbedbccf56049ff611005ba17a0f07b07034d))
+- 持久化缓存 ([893459d](https://github.com/kailong321200875/vue-element-plus-admin/commit/893459da7cf819b6b94477cd76fdfeeecacc287f))
+- 新增ImageCropping ([b0a43a7](https://github.com/kailong321200875/vue-element-plus-admin/commit/b0a43a70e6c93690ba4b0779527316f40297a45d))
+- 新增userStore ([77c962e](https://github.com/kailong321200875/vue-element-plus-admin/commit/77c962ea91de68299a01680a7941cf7a73c7e4a7))
+- 新增表格视频预览 ([cfc2d54](https://github.com/kailong321200875/vue-element-plus-admin/commit/cfc2d54586e73353295e7b73e2bf39e4e4d03c96))
+- 替换mock-server插件 ([b8f9a99](https://github.com/kailong321200875/vue-element-plus-admin/commit/b8f9a9940d5eb3f532421b1b85aeb1f3d9afb4b1))
+- 替换mockjs ([7c76d94](https://github.com/kailong321200875/vue-element-plus-admin/commit/7c76d945be8c46b427fe65c728ae0e70ab7a5e91))
+- 重新整理目录结构,mock请求 ([179ab26](https://github.com/kailong321200875/vue-element-plus-admin/commit/179ab2672fe7fff55c8a9c55fae22a4b6c362623))
+
+### Bug Fixes
+
+- [#367](https://github.com/kailong321200875/vue-element-plus-admin/issues/367) ([c8400ab](https://github.com/kailong321200875/vue-element-plus-admin/commit/c8400abd9f37405127890be1c9a559edf9f251f8))
+
+### Styling
+
+- 格式化代码 ([31ea31d](https://github.com/kailong321200875/vue-element-plus-admin/commit/31ea31dde8a149f4fc805c08e4fca4e755c36752))
+- 表单项宽度默认100% ([416de2b](https://github.com/kailong321200875/vue-element-plus-admin/commit/416de2b4d644f68d7db379c7cb1139c8a17f64d7))
+
+### Performance Improvements
+
+- 新增token过期示例 ([bdc8d35](https://github.com/kailong321200875/vue-element-plus-admin/commit/bdc8d358a1ca8f5fc6b43990899834791364e4f2))
+
+## [2.4.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.4.0...v2.4.1) (2023-11-12)
+
+### Bug Fixes
+
+- [#361](https://github.com/kailong321200875/vue-element-plus-admin/issues/361) ([2e7797b](https://github.com/kailong321200875/vue-element-plus-admin/commit/2e7797be68b2469d979231e6588b43d0b5bdb88b))
+- Default currentSize ([af583c7](https://github.com/kailong321200875/vue-element-plus-admin/commit/af583c71b0d1760ba4ed4cfa12458820c3f4db52))
+- 修复瀑布流示例图片无法展示 ([3477173](https://github.com/kailong321200875/vue-element-plus-admin/commit/3477173b7649eb43a1e64c91135b0e657a3c7888))
+- 修复自动格式化无效 ([bd82108](https://github.com/kailong321200875/vue-element-plus-admin/commit/bd8210858126f945bad31b3f1e0416aa178afef1))
+
+### Styling
+
+- 修改样式 ([92d436b](https://github.com/kailong321200875/vue-element-plus-admin/commit/92d436b8bb95c94831fcfe30678d384c3debc052))
+
+### Performance Improvements
+
+- 优化权限管理 ([efc1c25](https://github.com/kailong321200875/vue-element-plus-admin/commit/efc1c25db86d28438a2c324a3dc302501e1fdf8f))
+- 优化瀑布流组件 ([82eb7f1](https://github.com/kailong321200875/vue-element-plus-admin/commit/82eb7f16ad3f663be602a747b55a78f6b986da30))
+
+## [2.4.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.3.0...v2.4.0) (2023-10-14)
+
+### Types
+
+- 修改类型错误 ([4760733](https://github.com/kailong321200875/vue-element-plus-admin/commit/4760733bbe39b547285894555754bae6539190f9))
+
+### Features
+
+- Waterfall ([d543e56](https://github.com/kailong321200875/vue-element-plus-admin/commit/d543e56efb3b3e5800ab3ec24eda25565311eda2))
+
+### Bug Fixes
+
+- [#342](https://github.com/kailong321200875/vue-element-plus-admin/issues/342) ([1c51221](https://github.com/kailong321200875/vue-element-plus-admin/commit/1c512216453b17c64a09f97263fd481816badf7c))
+- [#346](https://github.com/kailong321200875/vue-element-plus-admin/issues/346) ([d392868](https://github.com/kailong321200875/vue-element-plus-admin/commit/d392868c2799c2066ba606b0cdad95c011399559))
+- [#355](https://github.com/kailong321200875/vue-element-plus-admin/issues/355) ([03d5e13](https://github.com/kailong321200875/vue-element-plus-admin/commit/03d5e130146a662a8a312e6c49f995f85ea0f9d3))
+- **Descriptions:** Add a default value ([83b09f0](https://github.com/kailong321200875/vue-element-plus-admin/commit/83b09f09ffafb2a6273a1c5274e22f842c202c32))
+- table column 中定义 selectable 无效 ([b8e043c](https://github.com/kailong321200875/vue-element-plus-admin/commit/b8e043c09c74fe00521ac0d7390331b9f223c797))
+- Table的addColumn不能添加首列 ([240178f](https://github.com/kailong321200875/vue-element-plus-admin/commit/240178fd380402571fc056ddb9c8ae44ccb1e265))
+- 修复Waterfall列数错误BUG ([1c2befa](https://github.com/kailong321200875/vue-element-plus-admin/commit/1c2befa4ddc76c625774100e3f5dd5a68a6faa45))
+- 去除控制台警告 ([4d14246](https://github.com/kailong321200875/vue-element-plus-admin/commit/4d14246de50d2ba9d652ec5ef038f4fd3597006a))
+
+### Styling
+
+- Descriptions样式调整 ([be73f4d](https://github.com/kailong321200875/vue-element-plus-admin/commit/be73f4da3e4bbbacf3f748f7ebfd70f825e0d15e))
+- formDemo集成图标选择器 ([99ffe6a](https://github.com/kailong321200875/vue-element-plus-admin/commit/99ffe6a86ac9961ad5b9be0171b01acdfa0cf994))
+- 修改 Search 组件图标错误 ([7c93b74](https://github.com/kailong321200875/vue-element-plus-admin/commit/7c93b74e8f3e69d6c88ef2891eb6accc99a6a1e8))
+
+### Performance Improvements
+
+- IconPicker新增搜索功能 ([a4d1391](https://github.com/kailong321200875/vue-element-plus-admin/commit/a4d1391390bb33d498f2ec2cc64965f1a0b0aaab))
+- useClipboard ([1db2248](https://github.com/kailong321200875/vue-element-plus-admin/commit/1db22482b43f6fb7ca8321b838fb41a5b0aff62e))
+- useNetwork ([88be3ee](https://github.com/kailong321200875/vue-element-plus-admin/commit/88be3eea10196054596945af0eb9910e998dfd42))
+- 优化请求例子 ([6b3d2e1](https://github.com/kailong321200875/vue-element-plus-admin/commit/6b3d2e14985c1a7a3c68001e17820d0e7a833a56))
+- 完善demo ([2c4ff7d](https://github.com/kailong321200875/vue-element-plus-admin/commit/2c4ff7d190c816a92d92f9c2dbe048436b2bf964))
+- 新增请求示例 ([2762aaf](https://github.com/kailong321200875/vue-element-plus-admin/commit/2762aaf09b3616944476797a6e112c350c12a0ec))
+
+## [2.3.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.2.0...v2.3.0) (2023-09-24)
+
+### Features
+
+- IconPicker ([4490d5e](https://github.com/kailong321200875/vue-element-plus-admin/commit/4490d5eeeb4389f94f90c9c45a30343324db2250))
+- 表格工具栏新增列设置功能 ([9d10ba8](https://github.com/kailong321200875/vue-element-plus-admin/commit/9d10ba821feca414b9b020322859ca4a47291005))
+
+### Bug Fixes
+
+- [#326](https://github.com/kailong321200875/vue-element-plus-admin/issues/326) ([c95a4e0](https://github.com/kailong321200875/vue-element-plus-admin/commit/c95a4e0763838e843cf5ce174110a01f2baa8000))
+- default interceptor response return ([c3d8540](https://github.com/kailong321200875/vue-element-plus-admin/commit/c3d8540ab284312f24d9355072f6fb4506ed6d1d))
+- 修复IconPicker BUG ([1e3aa78](https://github.com/kailong321200875/vue-element-plus-admin/commit/1e3aa789260773b1caecdaa32e1cafede22733e3))
+- 修复useCrudSchemas无法自定义label ([aa5deb1](https://github.com/kailong321200875/vue-element-plus-admin/commit/aa5deb13904e45e7cb6ec7285e936b9ebae57273))
+
+### Docs
+
+- 更新README ([4947c82](https://github.com/kailong321200875/vue-element-plus-admin/commit/4947c82d6770f0dce2845682f0c41d853268cf82))
+- 更新README ([c3624ce](https://github.com/kailong321200875/vue-element-plus-admin/commit/c3624cee588457e7fedaab360746500337c1b2a7))
+- 更新群二维码 ([ead1ab8](https://github.com/kailong321200875/vue-element-plus-admin/commit/ead1ab8c88c05593d539b56a811809382675faf5))
+
+### Styling
+
+- 修复样式层级问题 ([f92d2b6](https://github.com/kailong321200875/vue-element-plus-admin/commit/f92d2b60a956e1963b63e23b446a9d42096704e0))
+- 修改登录样式 ([bdd31f0](https://github.com/kailong321200875/vue-element-plus-admin/commit/bdd31f0621712af89d89b87ac439c3e0b398605a))
+
+## [2.2.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.1.0...v2.2.0) (2023-08-27)
+
+### Features
+
+- 新增 useCrudSchemas demo ([ae0628e](https://github.com/kailong321200875/vue-element-plus-admin/commit/ae0628e3af3466c7c9d7b593b825f776843de5ec))
+- 新增useTagsView ([a869a45](https://github.com/kailong321200875/vue-element-plus-admin/commit/a869a457e6a8052531ce3040ae0d332d7afbb478))
+
+### Bug Fixes
+
+- [#316](https://github.com/kailong321200875/vue-element-plus-admin/issues/316) ([7582e4d](https://github.com/kailong321200875/vue-element-plus-admin/commit/7582e4d12f18ae86f5ef4ff36211c364afca5763))
+- [#317](https://github.com/kailong321200875/vue-element-plus-admin/issues/317) ([2095caa](https://github.com/kailong321200875/vue-element-plus-admin/commit/2095caaa854b686b57f47ee183419f42563a5a95))
+- [#318](https://github.com/kailong321200875/vue-element-plus-admin/issues/318) ([4169e52](https://github.com/kailong321200875/vue-element-plus-admin/commit/4169e52baaaa43765848c29c5ce222d019e81c35))
+- [#319](https://github.com/kailong321200875/vue-element-plus-admin/issues/319) ([b6ee4e5](https://github.com/kailong321200875/vue-element-plus-admin/commit/b6ee4e5d48deb3a07f289366ed3700baa3674cd6))
+- 修复useValidator报错 ([4912f6c](https://github.com/kailong321200875/vue-element-plus-admin/commit/4912f6c0586249b3de7ac7d365c8ea98af7923c7))
+- 修复动态路由无效 ([1452a1a](https://github.com/kailong321200875/vue-element-plus-admin/commit/1452a1afc77eb3f64cd3de91a05ddc15e40f4a06))
+
+### Docs
+
+- 更新README ([5b4defa](https://github.com/kailong321200875/vue-element-plus-admin/commit/5b4defa8c4be2de894b2cb50ae9ea739a10cf7d9))
+- 更新群二维码 ([13aa71c](https://github.com/kailong321200875/vue-element-plus-admin/commit/13aa71c5bd5b5076599501961a24a171a9133c57))
+- 更新群二维码 ([ae29e97](https://github.com/kailong321200875/vue-element-plus-admin/commit/ae29e974bfed2214d1beda703b976cdfa63070ab))
+
+### Styling
+
+- 修改Descriptions样式 ([cd0e05a](https://github.com/kailong321200875/vue-element-plus-admin/commit/cd0e05a6b9146af7ae64be62613724cd58e6c2a3))
+
+### Code Refactoring
+
+- 重构useValidator ([b8849da](https://github.com/kailong321200875/vue-element-plus-admin/commit/b8849dabe2b306831f69e84db167a367570d992a))
+
+### Performance Improvements
+
+- 优化动态路由 ([8793588](https://github.com/kailong321200875/vue-element-plus-admin/commit/879358821d02d5e4575dfee0d189b9fee7f2e217))
+- 完善useTagsView ([e0c55f4](https://github.com/kailong321200875/vue-element-plus-admin/commit/e0c55f40d4c1c47e29de6c4c7e9433efa978bf7f))
+- 完善useTagsView ([175abd0](https://github.com/kailong321200875/vue-element-plus-admin/commit/175abd0aa3388e8473f6ecbf63e28133fce55bd3))
+- 更新demo ([2c99cd2](https://github.com/kailong321200875/vue-element-plus-admin/commit/2c99cd20f0c25a740ac7a3a8319f7a112e69c0d3))
+
+## [2.1.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v2.0.0...v2.1.0) (2023-08-12)
+
+### Features
+
+- 新增多开标签页Demo ([5c253ce](https://github.com/kailong321200875/vue-element-plus-admin/commit/5c253ce803a9ef7ce03534ddd5f0865db4602378))
+
+### Bug Fixes
+
+- [#307](https://github.com/kailong321200875/vue-element-plus-admin/issues/307) ([4ce07e1](https://github.com/kailong321200875/vue-element-plus-admin/commit/4ce07e150c0bd3903cc5f43fcd88c2cb292d7690))
+- [#311](https://github.com/kailong321200875/vue-element-plus-admin/issues/311) ([bdde4cc](https://github.com/kailong321200875/vue-element-plus-admin/commit/bdde4ccd39d5d698d68b299c6e80546d4a8be89f))
+- 修复eslint错误 ([b5e47e0](https://github.com/kailong321200875/vue-element-plus-admin/commit/b5e47e04d8f5f889e0c46a2dced108d058ded94e))
+- 修复Table插槽传参错误 ([97344e6](https://github.com/kailong321200875/vue-element-plus-admin/commit/97344e68f5abb144d9e5d4ad273108858dbcfba2))
+- 修复Table组件插槽传参错误 ([c83a026](https://github.com/kailong321200875/vue-element-plus-admin/commit/c83a026d559e2854fead17d2e28fbebcf25490de))
+
+### Docs
+
+- 修改Readme ([ee059b7](https://github.com/kailong321200875/vue-element-plus-admin/commit/ee059b7619ad01ded9d3be20287086ddbcce3253))
+- 修改Readme ([e05f5a7](https://github.com/kailong321200875/vue-element-plus-admin/commit/e05f5a77edc175daa267e4fc6abbcfc8fec2e291))
+- 修改Readme ([b0e561d](https://github.com/kailong321200875/vue-element-plus-admin/commit/b0e561d8acd36e8780087e317cc34257956981fd))
+- 修改Readme ([fced2e0](https://github.com/kailong321200875/vue-element-plus-admin/commit/fced2e0087694445a89cf360e5e3e3013d8ca604))
+- 修改README ([dce76f0](https://github.com/kailong321200875/vue-element-plus-admin/commit/dce76f042d5243039540828a3fd982af25f37531))
+- 更新群二维码 ([607ef58](https://github.com/kailong321200875/vue-element-plus-admin/commit/607ef585d010c9ade6f54d96c2a12b36099ece74))
+
+### Styling
+
+- 修改TabMenu样式 ([e8cd6f9](https://github.com/kailong321200875/vue-element-plus-admin/commit/e8cd6f9e1c4387c582e461cde4d59796bf17c1bd))
+
+## [2.0.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.10.0...v2.0.0) (2023-08-06)
+
+### ⚠ BREAKING CHANGES
+
+- 重构完成
+
+### Features
+
+- 重构完成 ([76e971e](https://github.com/kailong321200875/vue-element-plus-admin/commit/76e971ef96ad4f5cc7df58abd0559898ce70207d))
+
+### Code Refactoring
+
+- 重构完成 ([85f8cda](https://github.com/kailong321200875/vue-element-plus-admin/commit/85f8cda19d8cafb951f211b845aad970a661dd1e))
+- 重构完成 ([5d55597](https://github.com/kailong321200875/vue-element-plus-admin/commit/5d55597cca6c9d2bc6cb6211a01c161fa5f086ba))
+
+## [1.10.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.9.9...v1.10.0) (2023-08-06)
+
+### Types
+
+- Form类型调整 ([a0f4aeb](https://github.com/kailong321200875/vue-element-plus-admin/commit/a0f4aebc5a685366cd56b1a7bb39fa614976e3bb))
+- Form类型调整 ([674d760](https://github.com/kailong321200875/vue-element-plus-admin/commit/674d760029b451c0c6fc23a2aeac5c83992a0b27))
+- 修改类型 ([c3ac191](https://github.com/kailong321200875/vue-element-plus-admin/commit/c3ac1915045d4d59bca09ec6d19151bc5da342f1))
+- 修改类型 ([7d0476f](https://github.com/kailong321200875/vue-element-plus-admin/commit/7d0476f47c5858019db871cff2bdd19f0210f0d4))
+- 类型优化 ([283bc58](https://github.com/kailong321200875/vue-element-plus-admin/commit/283bc58d46151a8954bb81ee6bf8f499177b15fc))
+- 调整类型 ([24c8af9](https://github.com/kailong321200875/vue-element-plus-admin/commit/24c8af91835fb2c8c00e7c2673fff01f098c9944))
+- 迁移types ([ccbec86](https://github.com/kailong321200875/vue-element-plus-admin/commit/ccbec865568b1c9b3c3321d7071c164fdc350a0f))
+- 迁移types ([46b35e4](https://github.com/kailong321200875/vue-element-plus-admin/commit/46b35e48b3e7876c74159625b5149ef663396f5c))
+
+### Features
+
+- axios 改造 ([3238140](https://github.com/kailong321200875/vue-element-plus-admin/commit/32381408bbe418eeaca2a975305bac80ddaa03f5))
+- axios 改造 ([5807db1](https://github.com/kailong321200875/vue-element-plus-admin/commit/5807db1dc12a7ff2dbf66801a742a78974ad8f9c))
+- Descriptions组件重构 ([49e415d](https://github.com/kailong321200875/vue-element-plus-admin/commit/49e415d27788cb468c96f2a828f1df7ae65b7a3c))
+- Dialog组件重构 ([3701a04](https://github.com/kailong321200875/vue-element-plus-admin/commit/3701a04231af02ec7f7ef73533f3a22e707380fb))
+- Form useForm 完成 ([3e4e27c](https://github.com/kailong321200875/vue-element-plus-admin/commit/3e4e27c21fd59c944229856bee929f005d2ee140))
+- Form改造 ([9c724dc](https://github.com/kailong321200875/vue-element-plus-admin/commit/9c724dc9aad18397d5ecd00e53c3c24e142a34b5))
+- Icon改版 ([882f162](https://github.com/kailong321200875/vue-element-plus-admin/commit/882f162ff21c74239b638f284f52161e5791722d))
+- Radio改造 ([deeee73](https://github.com/kailong321200875/vue-element-plus-admin/commit/deeee73bcb3ad912844fddee62b1155d95d4b42b))
+- Radio改造 ([83513d5](https://github.com/kailong321200875/vue-element-plus-admin/commit/83513d519d4b6b8fbfd48db266b9bd7b3a998d63))
+- Search组件重构 ([a7f3702](https://github.com/kailong321200875/vue-element-plus-admin/commit/a7f370214481577ab82bf2871191dda717c7978a))
+- SelectV2改造完成 ([4d04734](https://github.com/kailong321200875/vue-element-plus-admin/commit/4d04734e13f6926c16aeee421feecb0d339534f0))
+- Table重构 ([94800b0](https://github.com/kailong321200875/vue-element-plus-admin/commit/94800b0120ee05ca7d534dda3e59653f38d7fda0))
+- 完善search组件demo ([cdf44a4](https://github.com/kailong321200875/vue-element-plus-admin/commit/cdf44a43a05010dbcba3a3ec0cb7c8251f16fce3))
+- 拖拽表格 ([b69b8ed](https://github.com/kailong321200875/vue-element-plus-admin/commit/b69b8ed1bde36100fc86e51fcc63805d4ea21210))
+- 新增TreeSelect表单项 ([de0cb43](https://github.com/kailong321200875/vue-element-plus-admin/commit/de0cb43566b9065250abbc71548ffeca4c8e8bf1))
+- 新增Uload ([c181887](https://github.com/kailong321200875/vue-element-plus-admin/commit/c181887f7f0c5eecc9584edfe99e9065440bdc56))
+- 新增useStorage ([dfea91c](https://github.com/kailong321200875/vue-element-plus-admin/commit/dfea91c7e1d18fa299067c62557cac61723ea861))
+- 新增权限测试页 ([3fe40ba](https://github.com/kailong321200875/vue-element-plus-admin/commit/3fe40ba62df29c2ffea9adfd65fc559489481e24))
+- 新增锁屏功能 ([e2fd349](https://github.com/kailong321200875/vue-element-plus-admin/commit/e2fd349070147c57f9400fa9a413260b7707bda2))
+- 用户列表重构 ([755cea0](https://github.com/kailong321200875/vue-element-plus-admin/commit/755cea0990d9e3b64c936f29c02e4053393a1a19))
+- 登录页改造 ([5312951](https://github.com/kailong321200875/vue-element-plus-admin/commit/5312951359b5d919b6c1a03783aa6bbaf8ec0044))
+- 综合示例重构 ([9a0259d](https://github.com/kailong321200875/vue-element-plus-admin/commit/9a0259de5c47970502db95f4dda24998ad5d9efe))
+- 菜单管理 ([c72b3a3](https://github.com/kailong321200875/vue-element-plus-admin/commit/c72b3a33aab7d3605770a64d23b8a84ef4ad68d2))
+- 角色管理 ([47016a5](https://github.com/kailong321200875/vue-element-plus-admin/commit/47016a535f2b7a22ab498bee197bc30a983f507d))
+- 部门管理 ([28d0785](https://github.com/kailong321200875/vue-element-plus-admin/commit/28d0785be842022cae7808c23e1f19eaab5fb996))
+- 重构Dialog组件示例 ([9a78ac9](https://github.com/kailong321200875/vue-element-plus-admin/commit/9a78ac977eb0cfb3bd6c2a9b96e69d9f010017f4))
+
+### Bug Fixes
+
+- mock数据 ([8bdac71](https://github.com/kailong321200875/vue-element-plus-admin/commit/8bdac7152f463cd98c50c9893a46bb6c111fd428))
+- 修复Form已知问题 ([097b32e](https://github.com/kailong321200875/vue-element-plus-admin/commit/097b32e1a9d92a609a66179d68b3dabe12f96b66))
+- 修复Table组件已知问题 ([b1a83f6](https://github.com/kailong321200875/vue-element-plus-admin/commit/b1a83f601838cb82fb29c036654a4cdc729997cd))
+- 修复类型错误 ([26dc886](https://github.com/kailong321200875/vue-element-plus-admin/commit/26dc886f8ccb5cf1ffc10e1d9601c827a1f960c2))
+- 样式问题修复 ([cdc7c76](https://github.com/kailong321200875/vue-element-plus-admin/commit/cdc7c76eb5ac3ccb79f5f55ff5b7ce6b8c4955e1))
+- 解决类型检测报错 ([9d93496](https://github.com/kailong321200875/vue-element-plus-admin/commit/9d9349600b3d2008e4216d49c9fa1c1b9995fa79))
+- 解决类型检测报错 ([513108c](https://github.com/kailong321200875/vue-element-plus-admin/commit/513108c00e622812e2e70dfe833435f6b5462d6e))
+- 解决类型检测报错 ([28bf8be](https://github.com/kailong321200875/vue-element-plus-admin/commit/28bf8bee45e3cc8575a356623abdbe56e30991f8))
+
+### Styling
+
+- Table样式修改 ([5fc57bd](https://github.com/kailong321200875/vue-element-plus-admin/commit/5fc57bdb08488f6898eafd6f28289b0567d6d9e2))
+- Table样式修改 ([411c0f7](https://github.com/kailong321200875/vue-element-plus-admin/commit/411c0f792ae8359c49e81974d8193f049120985b))
+- Table样式修改 ([d487c6a](https://github.com/kailong321200875/vue-element-plus-admin/commit/d487c6a93ec0281d76a3938e6e23ea2a4a7940c1))
+- Table样式修改 ([c7d21e3](https://github.com/kailong321200875/vue-element-plus-admin/commit/c7d21e36d012377ba863ac848d77abb5db4f475a))
+- Table样式修改 ([7f5078a](https://github.com/kailong321200875/vue-element-plus-admin/commit/7f5078a436c4d5abcaf7a420df35d2be9b3680c5))
+- 修改Dialog样式 ([e451bfc](https://github.com/kailong321200875/vue-element-plus-admin/commit/e451bfcde6e5a47d4b3022e240ffcc0576ebb9a8))
+- 修改样式 ([207c5b3](https://github.com/kailong321200875/vue-element-plus-admin/commit/207c5b3fc4e52bb06baa36cd4b659e14893785ba))
+- 完善角色管理 ([c4576bd](https://github.com/kailong321200875/vue-element-plus-admin/commit/c4576bd57bcf504733f20188202ea7d33ab1c184))
+- 布局样式优化 ([962689a](https://github.com/kailong321200875/vue-element-plus-admin/commit/962689a8bd0ed5eb17d946b8a21dec4a197f13a7))
+- 样式布局调整完成 ([7193176](https://github.com/kailong321200875/vue-element-plus-admin/commit/719317694f71e22692256bb557070343f034ffe5))
+- 用户管理样式修改 ([57a5fa7](https://github.com/kailong321200875/vue-element-plus-admin/commit/57a5fa7b82ae9f3d7a1f8ec5391f14b1d1cd32e8))
+- 移除不必要样式 ([7ef1d1e](https://github.com/kailong321200875/vue-element-plus-admin/commit/7ef1d1e3013cc5bf7fc574e67c2004f50792e66d))
+- 移除不必要样式 ([366db45](https://github.com/kailong321200875/vue-element-plus-admin/commit/366db4528254d18659e6a922817702b5b92a57b0))
+- 调整Icon悬停样式 ([64c7e48](https://github.com/kailong321200875/vue-element-plus-admin/commit/64c7e48bd18ba83e605daccbc4c2f4cc6b58695d))
+- 调整工作台样式错乱 ([cc18f29](https://github.com/kailong321200875/vue-element-plus-admin/commit/cc18f297ef50655d5773d01fcfddabc365dc53e7))
+
+### Performance Improvements
+
+- Dialog默认高度修改 ([0e04fce](https://github.com/kailong321200875/vue-element-plus-admin/commit/0e04fce4367d6829e8de97a249318b0309e06fd5))
+- Form Table Search Descriptions 支持嵌套赋值 ([46ddf62](https://github.com/kailong321200875/vue-element-plus-admin/commit/46ddf62d2d4ce1a653f47695cb0bb3475aa16bd8))
+- ImageViewer组件优化 ([3b9c3d8](https://github.com/kailong321200875/vue-element-plus-admin/commit/3b9c3d8b757646eaf74625403112a969bfd15e55))
+- 优化Form事件传递 ([69cafb3](https://github.com/kailong321200875/vue-element-plus-admin/commit/69cafb3b7b2ce7ecbd9f2e8ef09e250817e9a55c))
+- 优化Search组件 ([e548668](https://github.com/kailong321200875/vue-element-plus-admin/commit/e548668ccef8c41d9ac7d9fe39ffe66471d160d2))
+- 优化表单组件 ([77a3866](https://github.com/kailong321200875/vue-element-plus-admin/commit/77a38662488ab9ff4cbe5ff3cf9b65eea34abca1))
+- 优化锁屏组件 ([4f8330a](https://github.com/kailong321200875/vue-element-plus-admin/commit/4f8330a4faf6cc98a9bac17bd3e1719ae1b30c81))
+
+## [1.9.9](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.9.8...v1.9.9) (2023-04-13)
+
+### Bug Fixes
+
+- 使用动态路由时,多级路由只有一个子路且父路由未使用alwaysShow时,子路由未添加至路由中 ([9b330a1](https://github.com/kailong321200875/vue-element-plus-admin/commit/9b330a1f513d3af9233b9a9dde6bdfeeefbc3393))
+
+## [1.9.8](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.9.7...v1.9.8) (2023-04-12)
+
+### Bug Fixes
+
+- 修复已知问题 ([0a6f306](https://github.com/kailong321200875/vue-element-plus-admin/commit/0a6f306686ea024e30bcdccac34e485b8526e38f))
+
+## [1.9.7](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.9.6...v1.9.7) (2023-03-28)
+
+### Bug Fixes
+
+- 修复表格与搜索框字段不能不一致的问题 ([5c1cd29](https://github.com/kailong321200875/vue-element-plus-admin/commit/5c1cd298defefb36b858adc766b776a0a7b9bd66))
+
+## [1.9.6](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.9.5...v1.9.6) (2023-03-22)
+
+### Bug Fixes
+
+- 修改 Editor 的 z-index 使其不会遮挡『综合示例 - 新增』界面的下拉菜单 ([c046e45](https://github.com/kailong321200875/vue-element-plus-admin/commit/c046e4554ba8fd99614484d8fb636650072b833e))
+
+## [1.9.5](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.9.4...v1.9.5) (2023-03-13)
+
+### Bug Fixes
+
+- 面包屑:1.修复使用动态路由的时候,无法显示的bug ([8790c8c](https://github.com/kailong321200875/vue-element-plus-admin/commit/8790c8cbd8d63ea0f8f276fd5af006f39b06e7d3))
+
+## [1.9.4](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.9.3...v1.9.4) (2023-03-03)
+
+### Bug Fixes
+
+- 修复已知BUG ([782b8e2](https://github.com/kailong321200875/vue-element-plus-admin/commit/782b8e2f94c867c3ee282287c37c888fff93fc55))
+
+## [1.9.3](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.9.2...v1.9.3) (2023-03-01)
+
+### Types
+
+- 修复类型错误 ([297b2c6](https://github.com/kailong321200875/vue-element-plus-admin/commit/297b2c69a239b487126c3b9316645a1b5f06bb7c))
+
+### Styling
+
+- 抽屉弹出样式问题 ([16a3eef](https://github.com/kailong321200875/vue-element-plus-admin/commit/16a3eef85a1ffb296bd44f67d89a911ecaf1c25e))
+- 调整主题切换样式 ([6e6beef](https://github.com/kailong321200875/vue-element-plus-admin/commit/6e6beefc3c380f7297985adcabcf966fbd2c5197))
+
+## [1.9.2](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.9.1...v1.9.2) (2023-01-16)
+
+### Bug Fixes
+
+- 修复TS类型错误 ([1c06a27](https://github.com/kailong321200875/vue-element-plus-admin/commit/1c06a27b900a891cd0b47098062cebc984ff6505))
+
+## [1.9.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.9.0...v1.9.1) (2023-01-11)
+
+### Bug Fixes
+
+- dark mode toggle ([bbc7646](https://github.com/kailong321200875/vue-element-plus-admin/commit/bbc764601ec864c2fdbe3ad78c083c5ae80615e0))
+
+## [1.9.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.8.7...v1.9.0) (2022-12-28)
+
+### Features
+
+- 添加打包进度条 ([354e87f](https://github.com/kailong321200875/vue-element-plus-admin/commit/354e87f7c533ad8e93ef484b47d0fe16f17048c9))
+
+### Bug Fixes
+
+- husky ([6fe5b2e](https://github.com/kailong321200875/vue-element-plus-admin/commit/6fe5b2e6c781b251bff5f0ac936c04dcfe5ef95f))
+
+## [1.8.7](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.8.6...v1.8.7) (2022-12-05)
+
+### Bug Fixes
+
+- 解决iframe无法正常工作 ([4fcc46f](https://github.com/kailong321200875/vue-element-plus-admin/commit/4fcc46fccf747b47909e2079c4f2abc5dbfb1a0c))
+
+## [1.8.6](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.8.5...v1.8.6) (2022-11-21)
+
+### Bug Fixes
+
+- 修复Search组件无法默认值 ([3368fda](https://github.com/kailong321200875/vue-element-plus-admin/commit/3368fda251bd3ff5a8e0059b3b33f9c0339d236b))
+
+## [1.8.5](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.8.4...v1.8.5) (2022-11-17)
+
+### Bug Fixes
+
+- 修复Form赋值问题 ([f37cc1b](https://github.com/kailong321200875/vue-element-plus-admin/commit/f37cc1b5801add3ada168dbbcf4cd2c340f0e30d))
+
+## [1.8.4](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.8.3...v1.8.4) (2022-11-07)
+
+### Bug Fixes
+
+- 修复option禁用属性无效 ([0b671e9](https://github.com/kailong321200875/vue-element-plus-admin/commit/0b671e914e396c7666ad5e34768a6e29f7dfbd33))
+
+### Styling
+
+- input默认宽度与select对齐 ([0b671e9](https://github.com/kailong321200875/vue-element-plus-admin/commit/0b671e914e396c7666ad5e34768a6e29f7dfbd33))
+
+## [1.8.3](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.8.2...v1.8.3) (2022-10-28)
+
+### Performance Improvements
+
+- 优化描述组件 ([73ecc98](https://github.com/kailong321200875/vue-element-plus-admin/commit/73ecc98671d430013920246d98ce9ab1752e56eb))
+
+## [1.8.2](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.8.1...v1.8.2) (2022-10-18)
+
+### Bug Fixes
+
+- Correct spelling of words(aciton →action) ([eb405b2](https://github.com/kailong321200875/vue-element-plus-admin/commit/eb405b2a9041ca0ad4455db79bf617ec910dc485))
+- Correct spelling of words(tigger →trigger) ([c2ca2d7](https://github.com/kailong321200875/vue-element-plus-admin/commit/c2ca2d736c92e02380923a6741450844acb41a38))
+
+## [1.8.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.8.0...v1.8.1) (2022-10-11)
+
+### Bug Fixes
+
+- 修复cutMenu收起时 ([993af6b](https://github.com/kailong321200875/vue-element-plus-admin/commit/993af6bb6576249e66e0c0ea592ebf851f65ab8c))
+
+### Styling
+
+- cutMenu层级样式 ([32d2408](https://github.com/kailong321200875/vue-element-plus-admin/commit/32d2408588c487cff2cf73e3cc132e5105ff4459))
+
+## [1.8.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.7.1...v1.8.0) (2022-10-10)
+
+### Features
+
+- types优化 ([3351155](https://github.com/kailong321200875/vue-element-plus-admin/commit/33511553cd9055b036b2d7491f9c2eda123f8b22))
+
+### Styling
+
+- 优化第四种布局 ([122fa62](https://github.com/kailong321200875/vue-element-plus-admin/commit/122fa62d859413d16175e0d97c7bf13f232dbb3a))
+
+## [1.7.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.7.0...v1.7.1) (2022-10-10)
+
+### Bug Fixes
+
+- 修正types提示错误 ([ef3e006](https://github.com/kailong321200875/vue-element-plus-admin/commit/ef3e006859dcd8b93ffb7cffcaeae24cbb330f2a))
+
+## [1.7.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.6.6...v1.7.0) (2022-10-09)
+
+### Features
+
+- type抽离 ([8b4fa1a](https://github.com/kailong321200875/vue-element-plus-admin/commit/8b4fa1aa21aa2c1379288315ccd64a6f3375be51))
+
+## [1.6.6](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.6.5...v1.6.6) (2022-10-09)
+
+### Bug Fixes
+
+- table search params ([a62929a](https://github.com/kailong321200875/vue-element-plus-admin/commit/a62929a8dac21028d3dd1cddf98189492c33b093))
+
+## [1.6.5](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.6.4...v1.6.5) (2022-10-08)
+
+### Bug Fixes
+
+- The attribute of option does not work ([d946920](https://github.com/kailong321200875/vue-element-plus-admin/commit/d946920e61ed81beacf9f1f8be7ee1f50505f64d))
+
+### Performance Improvements
+
+- perf store ([d416178](https://github.com/kailong321200875/vue-element-plus-admin/commit/d416178d69ca6100be4b635922b1a22d27629f08))
+- token test ([b320e65](https://github.com/kailong321200875/vue-element-plus-admin/commit/b320e658d1a559a6eaebdf374d63649c223c2ecd))
+
+## [1.6.4](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.6.3...v1.6.4) (2022-09-21)
+
+### Bug Fixes
+
+- fix bug ([da39f3b](https://github.com/kailong321200875/vue-element-plus-admin/commit/da39f3bc904ca2d80f432a31709725f9a57deb19))
+
+## [1.6.3](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.6.2...v1.6.3) (2022-08-20)
+
+### Bug Fixes
+
+- 修复重定向错误 ([89d03fd](https://github.com/kailong321200875/vue-element-plus-admin/commit/89d03fd067e7aca565ceb84ea9276f340bbfcb60))
+
+### Styling
+
+- 调整样式 ([d29e151](https://github.com/kailong321200875/vue-element-plus-admin/commit/d29e151f8a660031a685f6ef9f789532b1b7b58b))
+
+## [1.6.2](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.6.1...v1.6.2) (2022-08-13)
+
+### Styling
+
+- Misspelling ([c43e833](https://github.com/kailong321200875/vue-element-plus-admin/commit/c43e833582e4f14ac78b0683f1eb3bdeb9fb4821))
+- perfect tableDemo ([c589edd](https://github.com/kailong321200875/vue-element-plus-admin/commit/c589edd960b23ad0c8b56d2c7880b61014114d45))
+
+### Code Refactoring
+
+- refactor axios ([0980640](https://github.com/kailong321200875/vue-element-plus-admin/commit/0980640f65fc80e3e58ba49e98db10b7b1b80077))
+
+## [1.6.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.6.0...v1.6.1) (2022-07-30)
+
+### Bug Fixes
+
+- fix menu active bug ([ff59fc7](https://github.com/kailong321200875/vue-element-plus-admin/commit/ff59fc7e133202945360a7e210f9cdf3a4a89dd7))
+- Pie chart data not updated ([55d4ce7](https://github.com/kailong321200875/vue-element-plus-admin/commit/55d4ce7e35ff9a0c5590bc3589160cfd304d3ae5))
+
+### Performance Improvements
+
+- add static router ([55522b0](https://github.com/kailong321200875/vue-element-plus-admin/commit/55522b0661a8df3ad3c8afafcc9f8fcb162c5a00))
+
+### Styling
+
+- tagviews styles update ([bff7d93](https://github.com/kailong321200875/vue-element-plus-admin/commit/bff7d9370db7a9c171828721bb99643dac2f235d))
+
+## [1.6.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.5.4...v1.6.0) (2022-07-18)
+
+### Features
+
+- 添加按钮权限 ([7bef662](https://github.com/kailong321200875/vue-element-plus-admin/commit/7bef662db1e91aa8164e9f7a92de3fe4480a3c3b))
+
+### Performance Improvements
+
+- 移除md5依赖 ([a123097](https://github.com/kailong321200875/vue-element-plus-admin/commit/a123097f1f38eac45e945c7d3fdccafc16ea9b69))
+
+### Styling
+
+- 压缩图片尺寸 ([ae3c565](https://github.com/kailong321200875/vue-element-plus-admin/commit/ae3c5657b604ffbdae5ce3ce3603626ad4acc5e5))
+
+### Docs
+
+- vite2 to vite3 ([b3918b9](https://github.com/kailong321200875/vue-element-plus-admin/commit/b3918b9c3c5de4b48811ec95967851cfb3c231e1))
+- vite2 to vite3 ([aaf07de](https://github.com/kailong321200875/vue-element-plus-admin/commit/aaf07de77aa600332880a894faa35757f787c012))
+
+## [1.6.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.5.4...v1.6.0) (2022-07-18)
+
+### Features
+
+- 添加按钮权限 ([7bef662](https://github.com/kailong321200875/vue-element-plus-admin/commit/7bef662db1e91aa8164e9f7a92de3fe4480a3c3b))
+
+### Performance Improvements
+
+- 移除md5依赖 ([a123097](https://github.com/kailong321200875/vue-element-plus-admin/commit/a123097f1f38eac45e945c7d3fdccafc16ea9b69))
+
+### Styling
+
+- 压缩图片尺寸 ([ae3c565](https://github.com/kailong321200875/vue-element-plus-admin/commit/ae3c5657b604ffbdae5ce3ce3603626ad4acc5e5))
+
+### Docs
+
+- vite2 to vite3 ([b3918b9](https://github.com/kailong321200875/vue-element-plus-admin/commit/b3918b9c3c5de4b48811ec95967851cfb3c231e1))
+- vite2 to vite3 ([aaf07de](https://github.com/kailong321200875/vue-element-plus-admin/commit/aaf07de77aa600332880a894faa35757f787c012))
+
+## [1.5.4](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.5.3...v1.5.4) (2022-07-16)
+
+### Bug Fixes
+
+- fix build:test error ([14530cf](https://github.com/kailong321200875/vue-element-plus-admin/commit/14530cf790bfbbe37c72fa831f0376bbb4209e9d))
+
+## [1.5.3](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.5.2...v1.5.3) (2022-07-01)
+
+### Bug Fixes
+
+- fix useCrudSchemas not work ([0a855b9](https://github.com/kailong321200875/vue-element-plus-admin/commit/0a855b93e282dfe7863b3fce31dde5d7e0d3e2b6))
+
+## [1.5.2](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.5.1...v1.5.2) (2022-07-01)
+
+### Performance Improvements
+
+- add useCrudSchemas demo ([ca3ce54](https://github.com/kailong321200875/vue-element-plus-admin/commit/ca3ce54630b723d87415b14c642440d6734876ff))
+
+## [1.5.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.5.0...v1.5.1) (2022-07-01)
+
+### Bug Fixes
+
+- change showMainRoute to canTo ([5e292f8](https://github.com/kailong321200875/vue-element-plus-admin/commit/5e292f8a2b2ded7297a2a76893e113ac81517d23))
+
+### Performance Improvements
+
+- dialog combine with form ([34aefb6](https://github.com/kailong321200875/vue-element-plus-admin/commit/34aefb64ab9237521a1225925264818eebff9ad3))
+- dynamic options demo ([1acb4d7](https://github.com/kailong321200875/vue-element-plus-admin/commit/1acb4d7e8f449ba342699f1b4387ac2404a4c1fb))
+- dynamic options demo ([9a3b617](https://github.com/kailong321200875/vue-element-plus-admin/commit/9a3b6177aa0fbc99c86c5073a1c6c696e1eaf890))
+- useCrudSchemas cutom label ([7864d83](https://github.com/kailong321200875/vue-element-plus-admin/commit/7864d830e2134d814609e722b7bad1754ea9460e))
+
+## [1.5.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.4.5...v1.5.0) (2022-06-25)
+
+### Features
+
+- refactoring API ([37b7583](https://github.com/kailong321200875/vue-element-plus-admin/commit/37b75839a591648b145065432efb1dc8c7a3b917))
+
+### Bug Fixes
+
+- 修复axios已知问题 ([537af57](https://github.com/kailong321200875/vue-element-plus-admin/commit/537af57a0aaa24c88ebe75acf52dc0403a58b04b))
+
+### Performance Improvements
+
+- perf axios config ([39edd84](https://github.com/kailong321200875/vue-element-plus-admin/commit/39edd84023109a84683c21ea33e41bd024756520))
+
+## [1.4.5](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.4.4...v1.4.5) (2022-06-09)
+
+### Bug Fixes
+
+- fix tagsview not work ([d88e051](https://github.com/kailong321200875/vue-element-plus-admin/commit/d88e0514349e877f1c5280a48f9b1bd2bfd622bf))
+- fix tagsview not work ([1bf2d4c](https://github.com/kailong321200875/vue-element-plus-admin/commit/1bf2d4c77287fdca7ed1cb8c9998a53f1375dc6f))
+
+### Types
+
+- fix types error ([586486a](https://github.com/kailong321200875/vue-element-plus-admin/commit/586486a68d4bf2a024e50a79945b4007324f642d))
+
+## [1.4.4](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.4.3...v1.4.4) (2022-06-06)
+
+### Types
+
+- fix type error ([d66f12e](https://github.com/kailong321200875/vue-element-plus-admin/commit/d66f12e0e77f6acf485bae06509d9ea4abcd1eaa))
+
+### [1.4.3](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.4.2...v1.4.3) (2022-06-01)
+
+### Bug Fixes
+
+- multiple requests when pageSize change and currentPage isn't 1 ([f71a250](https://github.com/kailong321200875/vue-element-plus-admin/commit/f71a2503bc521c01e7102feecf4ec39a5224a6bb))
+
+### [1.4.2](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.4.1...v1.4.2) (2022-05-15)
+
+### Styling
+
+- fix dark mode bug ([2f9fd5d](https://github.com/kailong321200875/vue-element-plus-admin/commit/2f9fd5d21550d771ec12ae3540b975e2eebcd25b))
+
+### [1.4.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.4.0...v1.4.1) (2022-05-12)
+
+### Bug Fixes
+
+- the warning of VSCode extensions ([a368c21](https://github.com/kailong321200875/vue-element-plus-admin/commit/a368c21fb9c41f98f31f51586a2023076a8a9132))
+
+## [1.4.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.3.2...v1.4.0) (2022-05-10)
+
+### Features
+
+- add dark mode ([0758a6a](https://github.com/kailong321200875/vue-element-plus-admin/commit/0758a6a9d83170e53d45d39c3313e52ff5885746))
+
+### [1.3.2](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.3.1...v1.3.2) (2022-05-07)
+
+### Bug Fixes
+
+- fix the problem that the page is stuck in top mode ([8d01f48](https://github.com/kailong321200875/vue-element-plus-admin/commit/8d01f48d5098195b10c03b3cb3a0f485ebc9e018))
+
+### [1.3.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.3.0...v1.3.1) (2022-05-06)
+
+### Bug Fixes
+
+- spelling 'useRenderChcekbox' ([ee92f03](https://github.com/kailong321200875/vue-element-plus-admin/commit/ee92f039bea4307ccfb819728d3e2ed04fa00e03))
+
+## [1.3.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.13...v1.3.0) (2022-04-26)
+
+### Features
+
+- add useCrudSchemas hook ([00d947e](https://github.com/kailong321200875/vue-element-plus-admin/commit/00d947e2f81105194b0622d33768f999e37ad28a))
+
+### Bug Fixes
+
+- fix Table slot warning ([0eac05d](https://github.com/kailong321200875/vue-element-plus-admin/commit/0eac05d4f973ff7b15e00973f6e96595a3cd6d43))
+
+### Code Refactoring
+
+- refactor useAxios ([185f1e6](https://github.com/kailong321200875/vue-element-plus-admin/commit/185f1e6e210ecaac28ebfdee4198b7ca2eaa0933))
+
+### Build System
+
+- add url ([ab0f59a](https://github.com/kailong321200875/vue-element-plus-admin/commit/ab0f59ac91a077cf060923fa76e6d57e05d0b21b))
+- update plugins ([c475a61](https://github.com/kailong321200875/vue-element-plus-admin/commit/c475a610c19094034306f2dc665e240c7c117f87))
+- update plugins ([dfedbc7](https://github.com/kailong321200875/vue-element-plus-admin/commit/dfedbc74fdb2c819a96b6263849bdaab59b9e337))
+
+### [1.2.13](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.12...v1.2.13) (2022-04-18)
+
+### Performance Improvements
+
+- Editor component support v-model ([d77f8e3](https://github.com/kailong321200875/vue-element-plus-admin/commit/d77f8e334d77ee43c9ee0f411733f7397b278bc0))
+
+### [1.2.12](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.11...v1.2.12) (2022-04-17)
+
+### Bug Fixes
+
+- fixed spelling 'ElememtPlusSzie' ([5dbbc60](https://github.com/kailong321200875/vue-element-plus-admin/commit/5dbbc608640d93fe68fec6f58fdb30a43e02aada))
+
+### [1.2.11](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.10...v1.2.11) (2022-04-14)
+
+### Bug Fixes
+
+- fix the error reported by the Editor component ([7dc6d8a](https://github.com/kailong321200875/vue-element-plus-admin/commit/7dc6d8a9d7289bfaf27f972e9ca1773c0a1ddd7d))
+- fix the error reported by the Editor component ([90ef985](https://github.com/kailong321200875/vue-element-plus-admin/commit/90ef9856a0885fa812339cb7047ecc98b86c7b73))
+
+### Performance Improvements
+
+- add tagsViewIcon setting ([d395f03](https://github.com/kailong321200875/vue-element-plus-admin/commit/d395f03a57a9265f1d39b3220fc7c9b983efee30))
+- add uniqueopened setting ([b060319](https://github.com/kailong321200875/vue-element-plus-admin/commit/b0603199a5ae0ee923483dad449f49220d36f444))
+
+### Build System
+
+- update plugins ([2ee4954](https://github.com/kailong321200875/vue-element-plus-admin/commit/2ee49549e7b601af26ef5204f7648d271f3348f2))
+
+### Styling
+
+- add layout background color ([9b614fe](https://github.com/kailong321200875/vue-element-plus-admin/commit/9b614fe89288538197c50f164586aeed7836b7a8))
+
+### [1.2.10](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.9...v1.2.10) (2022-04-12)
+
+### Bug Fixes
+
+- fix bug ([327522f](https://github.com/kailong321200875/vue-element-plus-admin/commit/327522f2b73ae0e11f8ebbc39394b06029ce0b65))
+
+### Styling
+
+- modify the commitlint package manager ([ba7e722](https://github.com/kailong321200875/vue-element-plus-admin/commit/ba7e7224ab58612548519415f5429c32827a61de))
+
+### [1.2.9](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.8...v1.2.9) (2022-04-12)
+
+### Docs
+
+- update changlog ([e37273d](https://github.com/kailong321200875/vue-element-plus-admin/commit/e37273d95d29a3bb752604658d550264aacdc979))
+
+### [1.2.8](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.7...v1.2.8) (2022-04-11)
+
+### Build System
+
+- update plugins ([00a573a](https://github.com/kailong321200875/vue-element-plus-admin/commit/00a573af3f455395b4ee2ab99a03f3103d466e9c))
+
+### Docs
+
+- update changlog ([62fc183](https://github.com/kailong321200875/vue-element-plus-admin/commit/62fc1839fdff3a4d06a7db4cf3f8ce2cb9aee681))
+
+### [1.2.7](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.6...v1.2.7) (2022-04-10)
+
+### Build System
+
+- update plugins ([f13a91d](https://github.com/kailong321200875/vue-element-plus-admin/commit/f13a91dd460b1dcdbd17aef723ab3ca2b01c34f0))
+
+### Styling
+
+- .bhs code formatting ([57b2707](https://github.com/kailong321200875/vue-element-plus-admin/commit/57b27071e9a33423c46542a5d0e5d5c2e9a3b718))
+
+### [1.2.6](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.5...v1.2.6) (2022-04-08)
+
+### Build System
+
+- update plugins ([d645892](https://github.com/kailong321200875/vue-element-plus-admin/commit/d645892cde2f7f43215a2ba1776ee94a322437bf))
+
+### [1.2.5](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.4...v1.2.5) (2022-04-08)
+
+### Performance Improvements
+
+- add plop ([fa54a17](https://github.com/kailong321200875/vue-element-plus-admin/commit/fa54a1704ffd93f7b42dbeb1229bc4868d2d3a6a))
+
+### Build System
+
+- update plugins ([18c6bd8](https://github.com/kailong321200875/vue-element-plus-admin/commit/18c6bd868622d954b51ea34e37516361ad4eb540))
+
+### Styling
+
+- fix padding and background color ([f8c9d54](https://github.com/kailong321200875/vue-element-plus-admin/commit/f8c9d54687edafd92f5b61bf5288bb1188c73f01))
+
+### [1.2.4](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.3...v1.2.4) (2022-04-06)
+
+### Bug Fixes
+
+- add Sticky props comment ([46133b3](https://github.com/kailong321200875/vue-element-plus-admin/commit/46133b3ff39d48d11cbcaa1f20a271118f48eb29))
+- fix bug ([179ca06](https://github.com/kailong321200875/vue-element-plus-admin/commit/179ca064ba8adbb3b063d9798ec1930ccc68e459))
+- fix remove unnecessary variables ([ca01cbf](https://github.com/kailong321200875/vue-element-plus-admin/commit/ca01cbfd98b63a0d76190fe8d43097fdc9df74e6))
+- fix style ([17c8fea](https://github.com/kailong321200875/vue-element-plus-admin/commit/17c8fea93811d9d9b708808484f5c907d761fcf1))
+- remove ContentDetailWrap style ([4ceaa9d](https://github.com/kailong321200875/vue-element-plus-admin/commit/4ceaa9d7816369d0dcaf3e18e4cdbbd6165cef88))
+
+### [1.2.3](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.2...v1.2.3) (2022-03-31)
+
+### Bug Fixes
+
+- fix refresh with query ([e94020f](https://github.com/kailong321200875/vue-element-plus-admin/commit/e94020ff541a061599486c0003258f1dbf13aba8))
+
+### [1.2.2](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.1...v1.2.2) (2022-03-30)
+
+### Bug Fixes
+
+- fix avatar height bug ([cd4ab76](https://github.com/kailong321200875/vue-element-plus-admin/commit/cd4ab767018941777174d7837045f5259d1cc403))
+- fix parmas to params ([2c7211c](https://github.com/kailong321200875/vue-element-plus-admin/commit/2c7211c89d7299ffc0a36bef8999b3c201dbaf4a))
+
+### [1.2.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.2.0...v1.2.1) (2022-03-29)
+
+### Bug Fixes
+
+- fix invalid paging ([ad184ee](https://github.com/kailong321200875/vue-element-plus-admin/commit/ad184ee9c0619da36f1ca3f26e67f18f88488523))
+
+### Build System
+
+- update plugins ([0c7276f](https://github.com/kailong321200875/vue-element-plus-admin/commit/0c7276feadaedef83e6a4ad9d457e26d408698a8))
+
+## [1.2.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.14...v1.2.0) (2022-03-27)
+
+### Features
+
+- add hooks demo ([c43f39e](https://github.com/kailong321200875/vue-element-plus-admin/commit/c43f39efef296266c64cc24690717d07fa0bcb85))
+- add inputPassword demo ([8f8b126](https://github.com/kailong321200875/vue-element-plus-admin/commit/8f8b1260e75df6998ebea617f62d4ab6be81d721))
+
+### Docs
+
+- update LICENSE ([69d3dcc](https://github.com/kailong321200875/vue-element-plus-admin/commit/69d3dcc7edf69e9b4e3042ddb11faa85ec7d39e2))
+
+### Styling
+
+- modify the function name to make it more semantic ([046ae51](https://github.com/kailong321200875/vue-element-plus-admin/commit/046ae512f02df2d3f08134949b9376a061c1eef3))
+- update Footer component presentation ([d4a9ba3](https://github.com/kailong321200875/vue-element-plus-admin/commit/d4a9ba3aa6758b8aac18b30e1a6b9501baff826c))
+- update Icon demo ([8597122](https://github.com/kailong321200875/vue-element-plus-admin/commit/85971227cd3055ea280cf493c7c42b250c1515da))
+
+### Tests
+
+- test push first commit ([a67bb48](https://github.com/kailong321200875/vue-element-plus-admin/commit/a67bb48f269651a2dcd01b9e33d10f20c42d76ee))
+
+### Build System
+
+- update plugins ([9c13d92](https://github.com/kailong321200875/vue-element-plus-admin/commit/9c13d92b36a2a7c95b9edb7821367fc8f0ac6658))
+- update server port ([d2be8c1](https://github.com/kailong321200875/vue-element-plus-admin/commit/d2be8c1a307a3c5daf363bd7f1d21e574598de5c))
+
+### [1.1.14](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.13...v1.1.14) (2022-03-22)
+
+### Bug Fixes
+
+- 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))
+
+### [1.1.13](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.12...v1.1.13) (2022-03-17)
+
+### Build System
+
+- update plugins ([a2d0313](https://github.com/kailong321200875/vue-element-plus-admin/commit/a2d03137899f9b16fc1d4a09a23576cd74e7950e))
+
+### [1.1.12](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.11...v1.1.12) (2022-03-15)
+
+### Build System
+
+- update plugins ([fee2252](https://github.com/kailong321200875/vue-element-plus-admin/commit/fee2252930b05b709d0c012e809568c4ed32bd89))
+
+### [1.1.11](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.10...v1.1.11) (2022-03-15)
+
+### Bug Fixes
+
+- fix the problem of blank bar when toggle the TagsView component ([b1d9771](https://github.com/kailong321200875/vue-element-plus-admin/commit/b1d9771c750709fe45061d13299a85dbbd6ead25))
+- fix the problem that no reaction when copy setting config in http page ([61e0e33](https://github.com/kailong321200875/vue-element-plus-admin/commit/61e0e33c64d6a889fe6ed80d27a10cf8b201d21a))
+
+### [1.1.10](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.9...v1.1.10) (2022-03-13)
+
+### Build System
+
+- update plugins ([0b525c8](https://github.com/kailong321200875/vue-element-plus-admin/commit/0b525c875075a28288e92243b205b337f85ab550))
+
+### [1.1.9](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.8...v1.1.9) (2022-03-07)
+
+### Build System
+
+- update plugins ([1456fd4](https://github.com/kailong321200875/vue-element-plus-admin/commit/1456fd49ec9abbfe1f25aeadfe5fed54fec07394))
+
+### [1.1.8](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.7...v1.1.8) (2022-03-07)
+
+### Docs
+
+- update changelog ([bf09441](https://github.com/kailong321200875/vue-element-plus-admin/commit/bf09441852e59b0d07d4949a33de75958696817f))
+
+### [1.1.7](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.6...v1.1.7) (2022-03-06)
+
+### Styling
+
+- add labelMessage attribute to Form component ([8c42790](https://github.com/kailong321200875/vue-element-plus-admin/commit/8c427907843ccb2dfd882d27c1e8a894c5616487))
+
+### [1.1.6](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.5...v1.1.6) (2022-03-04)
+
+### Bug Fixes
+
+- fix the problem that the tree data of Table component cannot be displayed ([bf83d3e](https://github.com/kailong321200875/vue-element-plus-admin/commit/bf83d3efbad9097f245c32cc07d1178580cec4e3))
+
+### [1.1.5](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.4...v1.1.5) (2022-03-02)
+
+### Bug Fixes
+
+- fix the problem of tagsview error when loginout ([835d76a](https://github.com/kailong321200875/vue-element-plus-admin/commit/835d76ae87b950106f957976ebc8f6f2e8842ddf))
+
+### Build System
+
+- update plugins ([de34bb1](https://github.com/kailong321200875/vue-element-plus-admin/commit/de34bb193d6c844dbc1cec38db5f61b3f95e19f2))
+
+### Styling
+
+- fix tabMenu z-index bug ([8b3be02](https://github.com/kailong321200875/vue-element-plus-admin/commit/8b3be02368a1bddb7dc78f18adbea7f4ebfe75d6))
+- fix tags-view style bug ([ebff817](https://github.com/kailong321200875/vue-element-plus-admin/commit/ebff81777b9c0b839256b83e321ecbdbff25fc73))
+
+### [1.1.4](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.3...v1.1.4) (2022-03-01)
+
+### CI
+
+- update workflow ([0490d18](https://github.com/kailong321200875/vue-element-plus-admin/commit/0490d18145cb0d9c4b066ab01a2c10cb527e38ba))
+- update workflow ([51f7bca](https://github.com/kailong321200875/vue-element-plus-admin/commit/51f7bca6034902b251d081ee383b0d796782d434))
+
+### [1.1.3](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.2...v1.1.3) (2022-03-01)
+
+### CI
+
+- update workflow ([91cc5c5](https://github.com/kailong321200875/vue-element-plus-admin/commit/91cc5c595cadc5695d8f54bdc4922d8f04439f24))
+
+### [1.1.2](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.1...v1.1.2) (2022-03-01)
+
+### Workflows
+
+- update workflow ([d9708aa](https://github.com/kailong321200875/vue-element-plus-admin/commit/d9708aae5bc0cb795bb0fbf8d17df753cc88ba1d))
+
+### [1.1.1](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.1.0...v1.1.1) (2022-03-01)
+
+### Workflows
+
+- update workflow ([085328a](https://github.com/kailong321200875/vue-element-plus-admin/commit/085328aba8c4f356bf7915a6bbdc1ec4f46ceeda))
+
+## [1.1.0](https://github.com/kailong321200875/vue-element-plus-admin/compare/v1.0.3...v1.1.0) (2022-03-01)
+
+### Features
+
+- 🎸 layout 三种布局重构完成 ([429e428](https://github.com/kailong321200875/vue-element-plus-admin/commit/429e42809cef33a33662e41ad50297217d128b8c))
+- 🎸 layout 布局重构 �[bd24b92](https://github.com/kailong321200875/vue-element-plus-admin/commit/bd24b92acb279343dbaf83b74f1ed2a3f57f1003))
+- 🎸 Table 组件重构完成并给出相应示 �[35879f8](https://github.com/kailong321200875/vue-element-plus-admin/commit/35879f8ecc0ffa76122a336e2eaa93ecfb408c1d))
+- 🎸 v0.0.4 发布 ([a58dc1b](https://github.com/kailong321200875/vue-element-plus-admin/commit/a58dc1b1c2774974782ef6d116b8805975b82b1c))
+- 🎸 初始化项 �[26d4c7c](https://github.com/kailong321200875/vue-element-plus-admin/commit/26d4c7c56894cf2031b3a7cce08d53c37f4a49e3))
+- 🎸 初版完成 ([5bfe4d2](https://github.com/kailong321200875/vue-element-plus-admin/commit/5bfe4d236fd9c2841da100f34c980b4572b67b20))
+- 🎸 新增 Detail 详情组件并给出相应示 �[e77a931](https://github.com/kailong321200875/vue-element-plus-admin/commit/e77a931ef2d2967a9717e27b187d68512c01284f))
+- 🎸 新增二维码组 �[85555ee](https://github.com/kailong321200875/vue-element-plus-admin/commit/85555eef7dc7d72cb701bdd81044ba8fb8e72acc))
+- 🎸 新增全局配置 ([f8405a6](https://github.com/kailong321200875/vue-element-plus-admin/commit/f8405a63c9b1288fbe95bae235b65a08e8fae8d2))
+- 🎸 新增固定 � 级菜单配 �[4c4903e](https://github.com/kailong321200875/vue-element-plus-admin/commit/4c4903e806c8818e320108cc3e5279d728061c29))
+- 🎸 新增权限管理及相关示例文 �[32b6583](https://github.com/kailong321200875/vue-element-plus-admin/commit/32b6583099646b2ee622ac7b35388468769b91b8))
+- 🎸 显示更多组建 � 发中 ([fa9f24d](https://github.com/kailong321200875/vue-element-plus-admin/commit/fa9f24d5da8d2e40d7c3661eabacb8f0474a7bf2))
+- 🎸 权限管理 � 发中 ([38f5211](https://github.com/kailong321200875/vue-element-plus-admin/commit/38f521174ba9eba750fee4516141d7a267f1c4ce))
+- 🎸 权限管理 � 发中 ([6d7ea66](https://github.com/kailong321200875/vue-element-plus-admin/commit/6d7ea6694d8299332018a6689bcd82502a9a552c))
+- 🎸 综合实例重构 �[5142e6e](https://github.com/kailong321200875/vue-element-plus-admin/commit/5142e6e323cb20c89a97398bf41d32c93ce42cad))
+- 🎸 重构 layout ([7ede021](https://github.com/kailong321200875/vue-element-plus-admin/commit/7ede02141e258ab4c88e9b4daad966513d4dbe68))
+- 🎸 重构 layout-classic 布局 ([29d9c98](https://github.com/kailong321200875/vue-element-plus-admin/commit/29d9c988605b822195900268da6bc3f3b0b9c770))
+- 🎸 重构 sider 组件 �[51313d7](https://github.com/kailong321200875/vue-element-plus-admin/commit/51313d7116c7ab2ded7e3a65514ea9ac413edecd))
+- Add analysis api ([83327ea](https://github.com/kailong321200875/vue-element-plus-admin/commit/83327ea763ebb233bb540513276ffa288fbcb4a1))
+- Add analysis demo ([cd06934](https://github.com/kailong321200875/vue-element-plus-admin/commit/cd069340fc5157535fdc82e792c6b6dce7d7a97e))
+- Add count-to demo ([d3fbd3a](https://github.com/kailong321200875/vue-element-plus-admin/commit/d3fbd3a06c3b802fc863b4dc8013122c14bd16f2))
+- Add Descriptions component and add Descriptions demo ([7ad46f8](https://github.com/kailong321200875/vue-element-plus-admin/commit/7ad46f828d626a87699cd4d3a959a5634577d580))
+- Add Dialog component and add dailog demo ([a18ad8f](https://github.com/kailong321200875/vue-element-plus-admin/commit/a18ad8f4a89b78c73e57d8d2543494243f656d05))
+- add doucment link ([53201ae](https://github.com/kailong321200875/vue-element-plus-admin/commit/53201ae97a425714871d99e8847a3672ba0d389f))
+- Add dynamic route ([9d926b2](https://github.com/kailong321200875/vue-element-plus-admin/commit/9d926b2760b75e1d8e71a68dc7ff6c5026223a43))
+- Add Editor component and add editor demo ([3fb3e8d](https://github.com/kailong321200875/vue-element-plus-admin/commit/3fb3e8da39d816bcf4aedb65d40c7052bdb6d8bf))
+- Add Error component ([7411dbc](https://github.com/kailong321200875/vue-element-plus-admin/commit/7411dbc9fd8f122187c86a11523b49c88cc71a8c))
+- Add example-dialog demo ([262f421](https://github.com/kailong321200875/vue-element-plus-admin/commit/262f4211cf53aef30a32f4b88e88fb1b9246ffcb))
+- Add example-page demo ([1492f91](https://github.com/kailong321200875/vue-element-plus-admin/commit/1492f9119aa2960cc05956218e6d151c8b316875))
+- Add form demo ([472f574](https://github.com/kailong321200875/vue-element-plus-admin/commit/472f574f42f8f31c4e6047043ac755ba5fb35b7b))
+- Add form demo ([e6f9580](https://github.com/kailong321200875/vue-element-plus-admin/commit/e6f95803316bb5df2d1060285c1d591a79340721))
+- Add form demo ([543156f](https://github.com/kailong321200875/vue-element-plus-admin/commit/543156f328350bd12e71a41c872e547e41cda7fe))
+- Add form demo ([7795d2a](https://github.com/kailong321200875/vue-element-plus-admin/commit/7795d2a4fe3dbc9849ddc7c1d3e2d9215dc66f56))
+- Add guide demo ([0832194](https://github.com/kailong321200875/vue-element-plus-admin/commit/0832194e6131051416edff7c2eac6b0a016ffd80))
+- Add highlight demo ([eb206b0](https://github.com/kailong321200875/vue-element-plus-admin/commit/eb206b0cc31ac7da3dfd8b3d4b874061c5c91d53))
+- Add Icon demo ([e4b7a76](https://github.com/kailong321200875/vue-element-plus-admin/commit/e4b7a769126d6f0fca424007c294ff229eefcb35))
+- Add ImageViewer component and add ImageViewer demo ([af9fc0a](https://github.com/kailong321200875/vue-element-plus-admin/commit/af9fc0a4aded3ec08746ddeaeabac4c3cfa9463d))
+- Add Infotip component ([e4b7a76](https://github.com/kailong321200875/vue-element-plus-admin/commit/e4b7a769126d6f0fca424007c294ff229eefcb35))
+- Add infotip demo ([dbf3b0f](https://github.com/kailong321200875/vue-element-plus-admin/commit/dbf3b0f5a333ccef524bbac825035b0c6dc78ec9))
+- Add Qrcode component and add qrcode demo ([535a31b](https://github.com/kailong321200875/vue-element-plus-admin/commit/535a31b35eb6a76589f602fd96dcf91f46f349b0))
+- Add Search component and add search demo ([33eca8a](https://github.com/kailong321200875/vue-element-plus-admin/commit/33eca8a97d59f5cc453e1a60ee81b1519527d0f1))
+- Add Table component and add useTable hook ([17e8e7c](https://github.com/kailong321200875/vue-element-plus-admin/commit/17e8e7cda9a009818f11cfa0429ce0f9adc00be5))
+- Add useScrollTo hook ([7d7fd9e](https://github.com/kailong321200875/vue-element-plus-admin/commit/7d7fd9ed646d2b68cec0547ad8e65b0404bb95bb))
+- Add useWatermark hook and add useWatermark demo ([d3fbd3a](https://github.com/kailong321200875/vue-element-plus-admin/commit/d3fbd3a06c3b802fc863b4dc8013122c14bd16f2))
+- Add workplace api ([cb558f8](https://github.com/kailong321200875/vue-element-plus-admin/commit/cb558f8af9dfef2ba2879f021db395ee79e8c8d4))
+- **Animate:** Add animate.css ([1436543](https://github.com/kailong321200875/vue-element-plus-admin/commit/1436543a5c599f651ed7805165ea83b9ebcddef5))
+- **Breadcrumbe:** Add Breadcrumb component ([4612e55](https://github.com/kailong321200875/vue-element-plus-admin/commit/4612e5544bcd626d686972e5cb874d0aa4af08b3))
+- **component:** Add CountTo component and Echart component ([e20fa76](https://github.com/kailong321200875/vue-element-plus-admin/commit/e20fa76cad0894a69fd04c81c2108faabf392684))
+- **component:** Add Footer component ([dad7330](https://github.com/kailong321200875/vue-element-plus-admin/commit/dad733063413c79eca61c6cb5ff671b35933a85f))
+- **component:** Add Footer component ([f81e996](https://github.com/kailong321200875/vue-element-plus-admin/commit/f81e996a426538aeaa2aa37a540395dcf360a09c))
+- **Component:** Add Highlight component ([c53fa56](https://github.com/kailong321200875/vue-element-plus-admin/commit/c53fa562e540447df082e35c7f26e56f2426e430))
+- **component:** Add namespace of class ([d847ccb](https://github.com/kailong321200875/vue-element-plus-admin/commit/d847ccb098edc72fe55c1f8459bf149453a3b73d))
+- **Component:** Setting component add copy button ([e496096](https://github.com/kailong321200875/vue-element-plus-admin/commit/e496096539e6a56b0761a625c9d59210facc5432))
+- **ContextMenu:** Add ContextMenu component ([349ac9d](https://github.com/kailong321200875/vue-element-plus-admin/commit/349ac9d3989d77e5246cecf0006dd8d83c489990))
+- Detail 组件重构完成 ([7f5ef99](https://github.com/kailong321200875/vue-element-plus-admin/commit/7f5ef99ccc32b03f7be21f70c333bb8e679c7d93))
+- Highlight 组件重构 ([34221f3](https://github.com/kailong321200875/vue-element-plus-admin/commit/34221f387f5e15a08cdc21edd76ce8d8c5c20fbc))
+- **hooks:** Add useIntro hook ([0832194](https://github.com/kailong321200875/vue-element-plus-admin/commit/0832194e6131051416edff7c2eac6b0a016ffd80))
+- **hooks:** Add useTimeAgo hook ([c53fa56](https://github.com/kailong321200875/vue-element-plus-admin/commit/c53fa562e540447df082e35c7f26e56f2426e430))
+- **I18n:** Add Ii8n ([3810b8c](https://github.com/kailong321200875/vue-element-plus-admin/commit/3810b8c3b26f86c27aa7db479dfb7b0d283d970f))
+- **Layout:** Add classic layout ([839b601](https://github.com/kailong321200875/vue-element-plus-admin/commit/839b6015b8e31bf70e6f0bf0608fa729b028729b))
+- **Layout:** Add cutMenu layout ([ff4dd3a](https://github.com/kailong321200875/vue-element-plus-admin/commit/ff4dd3afbf5c0c7a439c71b0c494b81e0f2c70d4))
+- **Layout:** Add topLeft layout ([71b1c5e](https://github.com/kailong321200875/vue-element-plus-admin/commit/71b1c5e10cade8d1c018d0c5f63c98ba9357bab8))
+- **LocaleDropdown:** Add LocaleDropdown Component ([3810b8c](https://github.com/kailong321200875/vue-element-plus-admin/commit/3810b8c3b26f86c27aa7db479dfb7b0d283d970f))
+- **Logo:** Add Logo component ([958edef](https://github.com/kailong321200875/vue-element-plus-admin/commit/958edefe7bc2bf3ae77520a5d885a9d47e8a37b9))
+- **mock:** Add mock ([3fc7d4d](https://github.com/kailong321200875/vue-element-plus-admin/commit/3fc7d4d39a72056fcf419fe19a9d41d90f945bad))
+- **router:** Add dynamic routing ([b218ccc](https://github.com/kailong321200875/vue-element-plus-admin/commit/b218ccc9cce2ce1363c4a21d22b4d69c43c7b2dc))
+- Search component add expand attribute and expandField attribute ([9b4b317](https://github.com/kailong321200875/vue-element-plus-admin/commit/9b4b31781765d31dec50acc40e2eed91401502d4))
+- **store:** Add localeStore ([3810b8c](https://github.com/kailong321200875/vue-element-plus-admin/commit/3810b8c3b26f86c27aa7db479dfb7b0d283d970f))
+- **store:** Add tagsView store ([349ac9d](https://github.com/kailong321200875/vue-element-plus-admin/commit/349ac9d3989d77e5246cecf0006dd8d83c489990))
+- Table 组件重构 ([07adefb](https://github.com/kailong321200875/vue-element-plus-admin/commit/07adefb89b7555280e6217e09cf81ba7aa5b93c2))
+- **TagsView:** Add TagsView component ([349ac9d](https://github.com/kailong321200875/vue-element-plus-admin/commit/349ac9d3989d77e5246cecf0006dd8d83c489990))
+- **useForm:** Add useForm ([357fc44](https://github.com/kailong321200875/vue-element-plus-admin/commit/357fc44e519c5829567c17f611fcaadee3f9f933))
+- **useNProgress:** Add useNProgress ([c5ab359](https://github.com/kailong321200875/vue-element-plus-admin/commit/c5ab3599c8ea001ff7831b72fefc9e274163fbbb))
+- **useTitle:** Add useTitle ([c5ab359](https://github.com/kailong321200875/vue-element-plus-admin/commit/c5ab3599c8ea001ff7831b72fefc9e274163fbbb))
+- **utils:** Add color utils ([71dfba2](https://github.com/kailong321200875/vue-element-plus-admin/commit/71dfba21c5bc0276689b5aecf0d75e53efdda09f))
+- **VForm:** Add VForm component ([448ac52](https://github.com/kailong321200875/vue-element-plus-admin/commit/448ac5293e48a03840df2bb0b399a8f02aae666e))
+- **VInputPassword:** Add VInputPassword Component ([a1bf7e9](https://github.com/kailong321200875/vue-element-plus-admin/commit/a1bf7e9b552f75d3b87c64904ac9e7c99fc936a5))
+- **Workplace:** Add wrokplace demo ([c53fa56](https://github.com/kailong321200875/vue-element-plus-admin/commit/c53fa562e540447df082e35c7f26e56f2426e430))
+- 综合实例、权限管理重 �[a4bd206](https://github.com/kailong321200875/vue-element-plus-admin/commit/a4bd2068a5d40d146b5b45cb3727ced990147b68))
+- 部分组件重构完成 ([3d96229](https://github.com/kailong321200875/vue-element-plus-admin/commit/3d9622978dc234ef12dbce63e18caf3440563aa0))
+
+### Bug Fixes
+
+- 🐛 删除 Editor 双向绑定,改 �props 传参 ([c395e27](https://github.com/kailong321200875/vue-element-plus-admin/commit/c395e27f67af9f60b151a5484ab5a3c90c4c1d1e))
+- fix Form component setProps not work bug ([48ffc52](https://github.com/kailong321200875/vue-element-plus-admin/commit/48ffc52ca8fa26d8e6a5fa4b8b3001701a1f0732))
+- fix useScrollTo not work bug ([53201ae](https://github.com/kailong321200875/vue-element-plus-admin/commit/53201ae97a425714871d99e8847a3672ba0d389f))
+- 修复 tagsView 无动画效 �[0e3eb4b](https://github.com/kailong321200875/vue-element-plus-admin/commit/0e3eb4ba8b1503e1d221dfda59a3a0001dbdcb56))
+
+### Performance Improvements
+
+- update useForm hook ([8a958cd](https://github.com/kailong321200875/vue-element-plus-admin/commit/8a958cd71d9afbd32b243aac0814bfa3281477cd))
+
+### Code Refactoring
+
+- 💡 综合实例查看详情重构 ([9c26edd](https://github.com/kailong321200875/vue-element-plus-admin/commit/9c26edd5d599b5fb5a832fb547e3d95b6bfa9a98))
+
+### Build System
+
+- Add conventional-changelog-cli plugin ([384485f](https://github.com/kailong321200875/vue-element-plus-admin/commit/384485f6994c6ac33abee506508ab9d35fe658a9))
+- Add conventional-github-releaser plugin ([3cd5c71](https://github.com/kailong321200875/vue-element-plus-admin/commit/3cd5c71899dde3ac3910aef0180d8b39fad51f1b))
+- Add standard-version plugin ([110ce25](https://github.com/kailong321200875/vue-element-plus-admin/commit/110ce257841648e29b247a0338624a188694b6e9))
+- Add vite-plugin-html plugin ([d5b6e2a](https://github.com/kailong321200875/vue-element-plus-admin/commit/d5b6e2a7770eb59aa32839f69da5be37397e3538))
+- delete useless plugin ([c756761](https://github.com/kailong321200875/vue-element-plus-admin/commit/c756761dfc3200156acb228474d3539197ef413b))
+- **pinia:** Add pinia ([2040500](https://github.com/kailong321200875/vue-element-plus-admin/commit/2040500af14d277a79f01eba5eca2a440203cecf))
+- **types:** Add vue-types ([2c41826](https://github.com/kailong321200875/vue-element-plus-admin/commit/2c41826c572268b74a663a6966c548628ac7e280))
+- **unplugin-auto-import:** Delete unplugin-auto-import ([2040500](https://github.com/kailong321200875/vue-element-plus-admin/commit/2040500af14d277a79f01eba5eca2a440203cecf))
+- **unplugin-vue-components:** Delete unplugin-vue-components ([2040500](https://github.com/kailong321200875/vue-element-plus-admin/commit/2040500af14d277a79f01eba5eca2a440203cecf))
+- update plugin ([8d08bc6](https://github.com/kailong321200875/vue-element-plus-admin/commit/8d08bc6fc92258674abdd12834eaa4530ec276dd))
+- update plugins ([3c58042](https://github.com/kailong321200875/vue-element-plus-admin/commit/3c580420a20121845f02c0dd3caca5a74f06a89d))
+- **vite-plugin-style-import:** Add vite-plugin-style-import ([2040500](https://github.com/kailong321200875/vue-element-plus-admin/commit/2040500af14d277a79f01eba5eca2a440203cecf))
+- **vite-plugin-vue-setup-extend:** Delete vite-plugin-vue-setup-extend ([2040500](https://github.com/kailong321200875/vue-element-plus-admin/commit/2040500af14d277a79f01eba5eca2a440203cecf))
+- 修改 vite 配置 ([9991fb4](https://github.com/kailong321200875/vue-element-plus-admin/commit/9991fb4e5c46b9e4016beaade7232e28dc272797))
+- 设置多语 �([45e879e](https://github.com/kailong321200875/vue-element-plus-admin/commit/45e879edeef677b6aa1d2cfe4dd8dc5b76c83c59))
+- 配置代码格式 �[ffdb556](https://github.com/kailong321200875/vue-element-plus-admin/commit/ffdb556a096db247306eae8eecc1b85718314cdd))
+- 集成基础配置 ([ced99de](https://github.com/kailong321200875/vue-element-plus-admin/commit/ced99de9b113a01d9d0b190f6d2c6adc983a3102))
+- 集成基础配置 ([5dbcf23](https://github.com/kailong321200875/vue-element-plus-admin/commit/5dbcf2397ccdec80c695c113f49e8aa9bb6d012c))
+
+### Styling
+
+- 💄 优化 layout 样式 ([37ec378](https://github.com/kailong321200875/vue-element-plus-admin/commit/37ec378f0b2bf83d73ddf0e472aada6aab248f09))
+- 💄 微调样式 ([612b486](https://github.com/kailong321200875/vue-element-plus-admin/commit/612b48673c3389779ccfdd161e2ca80b21d265b2))
+- Add elNamespace ([d847ccb](https://github.com/kailong321200875/vue-element-plus-admin/commit/d847ccb098edc72fe55c1f8459bf149453a3b73d))
+- **appStore:** code style ([641ed68](https://github.com/kailong321200875/vue-element-plus-admin/commit/641ed684fefeb52e2f91e8baab7b610fc74c8d88))
+- **Breadcrumb:** fix Breadcrumb style bug ([8755c86](https://github.com/kailong321200875/vue-element-plus-admin/commit/8755c862b837d90a25b27c01fabe64abf81fc4a2))
+- **breadcrumb:** update disabled text color ([1522e92](https://github.com/kailong321200875/vue-element-plus-admin/commit/1522e925bae37cb9df4de2252d81f717788f4537))
+- change function to arrow function ([4612e55](https://github.com/kailong321200875/vue-element-plus-admin/commit/4612e5544bcd626d686972e5cb874d0aa4af08b3))
+- delete console.log ([49a6bfe](https://github.com/kailong321200875/vue-element-plus-admin/commit/49a6bfe9d81a40e2f5f15b68d7289e1787e89b54))
+- **Icon:** delete default color ([95a2bd8](https://github.com/kailong321200875/vue-element-plus-admin/commit/95a2bd884dd9846a56cda7c4c3ee4a41ce631b7c))
+- level demo style beautification ([dbf3b0f](https://github.com/kailong321200875/vue-element-plus-admin/commit/dbf3b0f5a333ccef524bbac825035b0c6dc78ec9))
+- lint code style ([b292419](https://github.com/kailong321200875/vue-element-plus-admin/commit/b2924190b8996e8208f951e3fadbcb09baddb8df))
+- **Login:** update login styles ([eb68f1d](https://github.com/kailong321200875/vue-element-plus-admin/commit/eb68f1d919e13c07b7d200e9aec53804b2a6dc7b))
+- modify menu z-index attribute ([0d7a778](https://github.com/kailong321200875/vue-element-plus-admin/commit/0d7a7781ce0b5e39f01355d3acdb3f364cabf76d))
+- **TagView:** Vertical center tag ([41281c4](https://github.com/kailong321200875/vue-element-plus-admin/commit/41281c4d541a2744e5df5dff2764cc85465b6a4c))
+
+### Types
+
+- add ImportMetaEnv ([38e0257](https://github.com/kailong321200875/vue-element-plus-admin/commit/38e0257487e4138a74ad1bb4ee4ba004abcfaa12))
+- Adding BfFrom Component types ([8e036f5](https://github.com/kailong321200875/vue-element-plus-admin/commit/8e036f54b56ce8521eb8ec4b7ca21aa9c24f43f2))
+- **BfForm:** Adding BfForm types ([bc9195b](https://github.com/kailong321200875/vue-element-plus-admin/commit/bc9195b21eeb79629a82a04d90e2ac5aa6592928))
+- **BfForm:** Adding BfForm types ([184b468](https://github.com/kailong321200875/vue-element-plus-admin/commit/184b468cd41dcd1cdae11477b9ee2d6e17de1481))
+- **BfForm:** Adding BfForm types ([58cb24d](https://github.com/kailong321200875/vue-element-plus-admin/commit/58cb24d9f8a50be80b5ea793387d582a77a59137))
+- delete useless types ([3fc79c0](https://github.com/kailong321200875/vue-element-plus-admin/commit/3fc79c0ae7acd0929f47e33f96c8d45a90d8f762))
+- **VForm:** Adding VForm types ([7528fe6](https://github.com/kailong321200875/vue-element-plus-admin/commit/7528fe6da60368213d28d9f1b6310d02d3d53282))
+
+### Docs
+
+- ✏️ 修改 readme ([8edb2a3](https://github.com/kailong321200875/vue-element-plus-admin/commit/8edb2a3493dca975036859b5d2c52afaa91f5dbb))
+- ✏️ 更新 readme ([62eeb55](https://github.com/kailong321200875/vue-element-plus-admin/commit/62eeb55330dd4af2a46801c7a19f38a3ef312bbf))
+- Add README.md ([21dcf88](https://github.com/kailong321200875/vue-element-plus-admin/commit/21dcf88ba31957bbdb50c6207d010650daab70fc))
+- Error modifying readme name ([25d5c84](https://github.com/kailong321200875/vue-element-plus-admin/commit/25d5c84e92e68aa72362a14f55aacd946fa5b1b2))
+- update description ([be6ff98](https://github.com/kailong321200875/vue-element-plus-admin/commit/be6ff9899b25cc00519210950d27ee56ac5112e6))
+- update description ([c15aa87](https://github.com/kailong321200875/vue-element-plus-admin/commit/c15aa8755c9c937512c7380a6d03c4d877ef4d87))
+- update README ([27979dc](https://github.com/kailong321200875/vue-element-plus-admin/commit/27979dc6def7d9d8cea62a08d49a6c828be2258b))
+- update README.md ([53201ae](https://github.com/kailong321200875/vue-element-plus-admin/commit/53201ae97a425714871d99e8847a3672ba0d389f))
+- update README.md ([c11823a](https://github.com/kailong321200875/vue-element-plus-admin/commit/c11823abd8a033e14b4c20d17ac941195d39bcfe))
+- 修改 README ([b79a567](https://github.com/kailong321200875/vue-element-plus-admin/commit/b79a56753df55976e749c4494266df052d315416))

+ 21 - 0
projects/base/LICENSE

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

+ 82 - 0
projects/base/README.md

@@ -0,0 +1,82 @@
+<div align="center"> <a href="https://github.com/kailong321200875/vue-element-plus-admin"> <img width="100" src="./public/logo.png"> </a> <br> <br>
+
+[![license](https://img.shields.io/github/license/kailong321200875/vue-element-plus-admin.svg)](LICENSE) [![repo-size](https://img.shields.io/github/repo-size/kailong321200875/vue-element-plus-admin.svg)](repo-size) [![last-commit](https://img.shields.io/github/last-commit/kailong321200875/vue-element-plus-admin.svg)](last-commit) [![stars](https://img.shields.io/github/stars/kailong321200875/vue-element-plus-admin.svg)](stars) [![forks](https://img.shields.io/github/forks/kailong321200875/vue-element-plus-admin.svg)](forks) [![release](https://img.shields.io/github/release/kailong321200875/vue-element-plus-admin.svg)](release) [![watchers](https://img.shields.io/github/watchers/kailong321200875/vue-element-plus-admin.svg)](watchers)
+
+<h1>vue-element-plus-admin</h1>
+</div>
+
+[English](./README.md) | **中文**
+
+## 介绍
+
+vue-element-plus-admin 是一个基于 `element-plus` 免费开源的中后台模版。使用了最新的`vue3`,`vite`,`TypeScript`等主流技术开发,开箱即用的中后台前端解决方案,可以用来作为项目的启动模版,也可用于学习参考。并且时刻关注着最新技术动向,尽可能的第一时间更新。
+
+vue-element-plus-admin 的定位是后台集成方案,不太适合当基础模板来进行二次开发。因为集成了很多你可能用不到的功能,会造成不少的代码冗余。如果你的项目不关注这方面的问题,也可以直接基于它进行二次开发。
+
+如需要基础模版,请切换到 `mini` 分支,`mini` 只简单集成了一些如:布局、动态菜单等常用布局功能,更适合开发者进行二次开发。
+
+## 特性
+
+- **最新技术栈**:使用 Vue3/vite4 等前端前沿技术开发
+- **TypeScript**: 应用程序级 JavaScript 的语言
+- **主题**: 可配置的主题
+- **国际化**:内置完善的国际化方案
+- **自定义数据** 内置 Mock 数据方案
+- **权限** 内置完善的动态路由权限生成方案
+- **组件** 二次封装了多个常用的组件
+- **示例** 内置丰富的示例
+
+## 预览
+
+- [vue-element-plus-admin](https://element-plus-admin.cn/) - 完整版 github 站点
+- [vue-element-plus-admin](https://kailong110120130.gitee.io/vue-element-plus-admin) - 完整版 gitee 站点
+
+帐号:**admin/admin**
+
+在线例子默认不适用菜单过滤,而是直接使用静态路由表
+
+## 文档
+
+[文档地址 Github](https://element-plus-admin-doc.cn/)
+
+[文档地址 Gitee](https://kailong110120130.gitee.io/vue-element-plus-admin-doc)
+
+## 前序准备
+
+- [node](http://nodejs.org/) 和 [git](https://git-scm.com/) - 项目开发环境
+- [Vite](https://vitejs.dev/) - 熟悉 vite 特性
+- [Vue3](https://v3.vuejs.org/) - 熟悉 Vue 基础语法
+- [TypeScript](https://www.typescriptlang.org/) - 熟悉 `TypeScript` 基本语法
+- [Es6+](http://es6.ruanyifeng.com/) - 熟悉 es6 基本语法
+- [Vue-Router-Next](https://next.router.vuejs.org/) - 熟悉 vue-router 基本使用
+- [Element-Plus](https://element-plus.org/) - element-plus 基本使用
+- [Mock.js](https://github.com/nuysoft/Mock) - mockjs 基本语法
+
+## 安装和使用
+
+- 获取代码
+
+```bash
+git clone https://github.com/kailong321200875/vue-element-plus-admin.git
+```
+
+- 安装依赖
+
+```bash
+cd vue-element-plus-admin
+
+pnpm install
+
+```
+
+- 运行
+
+```bash
+pnpm run dev
+```
+
+- 打包
+
+```bash
+pnpm run build:pro
+```

+ 13 - 0
projects/base/auto-imports.d.ts

@@ -0,0 +1,13 @@
+/* eslint-disable */
+/* prettier-ignore */
+// @ts-nocheck
+// noinspection JSUnusedGlobalSymbols
+// Generated by unplugin-auto-import
+// biome-ignore lint: disable
+export {}
+declare global {
+  const ElMessage: typeof import('element-plus/es')['ElMessage']
+  const ElMessageBox: typeof import('element-plus/es')['ElMessageBox']
+  const ElPopover: typeof import('element-plus/es')['ElPopover']
+  const ElTree: typeof import('element-plus/es')['ElTree']
+}

+ 28 - 0
projects/base/commitlint.config.cjs

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

+ 44 - 0
projects/base/components.d.ts

@@ -0,0 +1,44 @@
+/* eslint-disable */
+// @ts-nocheck
+// Generated by unplugin-vue-components
+// Read more: https://github.com/vuejs/core/pull/3399
+export {}
+
+/* prettier-ignore */
+declare module 'vue' {
+  export interface GlobalComponents {
+    ElBadge: typeof import('element-plus/es')['ElBadge']
+    ElButton: typeof import('element-plus/es')['ElButton']
+    ElButtonGroup: typeof import('element-plus/es')['ElButtonGroup']
+    ElCascader: typeof import('element-plus/es')['ElCascader']
+    ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
+    ElCollapse: typeof import('element-plus/es')['ElCollapse']
+    ElCollapseItem: typeof import('element-plus/es')['ElCollapseItem']
+    ElDialog: typeof import('element-plus/es')['ElDialog']
+    ElDivider: typeof import('element-plus/es')['ElDivider']
+    ElDrawer: typeof import('element-plus/es')['ElDrawer']
+    ElEmpty: typeof import('element-plus/es')['ElEmpty']
+    ElForm: typeof import('element-plus/es')['ElForm']
+    ElFormItem: typeof import('element-plus/es')['ElFormItem']
+    ElIcon: typeof import('element-plus/es')['ElIcon']
+    ElInput: typeof import('element-plus/es')['ElInput']
+    ElOption: typeof import('element-plus/es')['ElOption']
+    ElPopover: typeof import('element-plus/es')['ElPopover']
+    ElRadio: typeof import('element-plus/es')['ElRadio']
+    ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
+    ElSelect: typeof import('element-plus/es')['ElSelect']
+    ElSwitch: typeof import('element-plus/es')['ElSwitch']
+    ElTable: typeof import('element-plus/es')['ElTable']
+    ElTableColumn: typeof import('element-plus/es')['ElTableColumn']
+    ElTabPane: typeof import('element-plus/es')['ElTabPane']
+    ElTabs: typeof import('element-plus/es')['ElTabs']
+    ElText: typeof import('element-plus/es')['ElText']
+    ElTooltip: typeof import('element-plus/es')['ElTooltip']
+    ElTree: typeof import('element-plus/es')['ElTree']
+    RouterLink: typeof import('vue-router')['RouterLink']
+    RouterView: typeof import('vue-router')['RouterView']
+  }
+  export interface ComponentCustomProperties {
+    vLoading: typeof import('element-plus/es')['ElLoadingDirective']
+  }
+}

+ 81 - 0
projects/base/eslint.config.mjs

@@ -0,0 +1,81 @@
+// 引入vue模版的eslint
+import pluginVue from 'eslint-plugin-vue'
+import eslint from '@eslint/js'
+// ts-eslint解析器,使 eslint 可以解析 ts 语法
+import tseslint from 'typescript-eslint'
+// vue文件解析器
+import vueParser from 'vue-eslint-parser'
+import prettier from 'eslint-plugin-prettier'
+
+export default tseslint.config({
+  // ignores: ['node_modules', 'prettier.config.cjs', 'dist*'],
+  files: ['src/**/*.ts', 'src/**/*.tsx', 'src/**/*.vue'],
+  // tseslint.config添加了extends扁平函数,直接用。否则是eslint9.0版本是没有extends的
+  extends: [
+    eslint.configs.recommended,
+    ...tseslint.configs.recommended,
+    ...pluginVue.configs['flat/essential']
+  ],
+  plugins: {
+    prettier
+  },
+  languageOptions: {
+    parser: vueParser, // 使用vue解析器,这个可以识别vue文件
+    parserOptions: {
+      parser: tseslint.parser, // 在vue文件上使用ts解析器
+      sourceType: 'module',
+      ecmaVersion: 2020,
+      ecmaFeatures: {
+        jsx: true
+      }
+    }
+  },
+  rules: {
+    'prettier/prettier': 'error',
+    'no-useless-escape': 0,
+    'no-undef': 0,
+    'vue/no-setup-props-destructure': 0,
+    'vue/script-setup-uses-vars': 1,
+    'vue/no-reserved-component-names': 0,
+    '@typescript-eslint/ban-ts-ignore': 0,
+    '@typescript-eslint/explicit-function-return-type': 0,
+    '@typescript-eslint/no-explicit-any': 0,
+    '@typescript-eslint/no-var-requires': 0,
+    '@typescript-eslint/no-empty-function': 0,
+    'vue/custom-event-name-casing': 0,
+    'no-use-before-define': 0,
+    '@typescript-eslint/no-use-before-define': 0,
+    '@typescript-eslint/ban-ts-comment': 0,
+    '@typescript-eslint/ban-types': 0,
+    '@typescript-eslint/no-non-null-assertion': 0,
+    '@typescript-eslint/explicit-module-boundary-types': 0,
+    '@typescript-eslint/no-unused-vars': 0,
+    'no-unused-vars': 0,
+    'space-before-function-paren': 0,
+
+    'vue/attributes-order': 0,
+    'vue/one-component-per-file': 0,
+    'vue/html-closing-bracket-newline': 0,
+    'vue/max-attributes-per-line': 0,
+    'vue/multiline-html-element-content-newline': 0,
+    'vue/singleline-html-element-content-newline': 0,
+    'vue/attribute-hyphenation': 0,
+    'vue/require-default-prop': 0,
+    'vue/require-explicit-emits': 0,
+    'vue/html-self-closing': [
+      1,
+      {
+        html: {
+          void: 'always',
+          normal: 'never',
+          component: 'always'
+        },
+        svg: 'always',
+        math: 'always'
+      }
+    ],
+    'vue/multi-word-component-names': 0,
+    'vue/no-v-html': 0,
+    'vue/require-toggle-inside-transition': 0
+  }
+})

+ 143 - 0
projects/base/index.html

@@ -0,0 +1,143 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <link rel="icon" href="/favicon.ico" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <!-- <link rel="stylesheet" href="https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css" /> -->
+    <title><%= title %></title>
+  </head>
+  <body>
+    <div id="app">
+      <style>
+        .app-loading {
+          display: flex;
+          width: 100%;
+          height: 100%;
+          justify-content: center;
+          align-items: center;
+          flex-direction: column;
+          background: #f0f2f5;
+        }
+
+        .app-loading .app-loading-wrap {
+          position: absolute;
+          top: 50%;
+          left: 50%;
+          display: flex;
+          transform: translate3d(-50%, -50%, 0);
+          transform: translate3d(-50%, -50%, 0);
+          justify-content: center;
+          align-items: center;
+          flex-direction: column;
+        }
+
+        .app-loading .app-loading-title {
+          margin-bottom: 30px;
+          font-size: 20px;
+          font-weight: bold;
+          text-align: center;
+        }
+
+        .app-loading .app-loading-logo {
+          width: 100px;
+          margin: 0 auto 15px;
+        }
+
+        .app-loading .app-loading-item {
+          position: relative;
+          display: inline-block;
+          width: 60px;
+          height: 60px;
+          vertical-align: middle;
+          border-radius: 50%;
+        }
+
+        .app-loading .app-loading-outter {
+          position: absolute;
+          width: 100%;
+          height: 100%;
+          border: 4px solid #2d8cf0;
+          border-bottom: 0;
+          border-left-color: transparent;
+          border-radius: 50%;
+          animation: loader-outter 1s cubic-bezier(0.42, 0.61, 0.58, 0.41) infinite;
+        }
+
+        .app-loading .app-loading-inner {
+          position: absolute;
+          top: calc(50% - 20px);
+          left: calc(50% - 20px);
+          width: 40px;
+          height: 40px;
+          border: 4px solid #87bdff;
+          border-right: 0;
+          border-top-color: transparent;
+          border-radius: 50%;
+          animation: loader-inner 1s cubic-bezier(0.42, 0.61, 0.58, 0.41) infinite;
+        }
+
+        @keyframes loader-outter {
+          0% {
+            transform: rotate(0deg);
+            transform: rotate(0deg);
+          }
+
+          100% {
+            transform: rotate(360deg);
+            transform: rotate(360deg);
+          }
+        }
+
+        @keyframes loader-outter {
+          0% {
+            transform: rotate(0deg);
+            transform: rotate(0deg);
+          }
+
+          100% {
+            transform: rotate(360deg);
+            transform: rotate(360deg);
+          }
+        }
+
+        @keyframes loader-inner {
+          0% {
+            transform: rotate(0deg);
+            transform: rotate(0deg);
+          }
+
+          100% {
+            transform: rotate(-360deg);
+            transform: rotate(-360deg);
+          }
+        }
+
+        @keyframes loader-inner {
+          0% {
+            transform: rotate(0deg);
+            transform: rotate(0deg);
+          }
+
+          100% {
+            transform: rotate(-360deg);
+            transform: rotate(-360deg);
+          }
+        }
+      </style>
+      <div class="app-loading">
+        <div class="app-loading-wrap">
+          <div class="app-loading-title">
+            <img src="/logo.png" class="app-loading-logo" alt="Logo" />
+            <div class="app-loading-title"><%= title %></div>
+          </div>
+          <div class="app-loading-item">
+            <div class="app-loading-outter"></div>
+            <div class="app-loading-inner"></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <script type="module" src="/src/main.ts"></script>
+  </body>
+</html>

+ 40 - 0
projects/base/package.json

@@ -0,0 +1,40 @@
+{
+  "name": "base",
+  "version": "1.0.0",
+  "description": "一套基于vue3、element-plus、typesScript、vite4的后台集成方案。",
+  "private": true,
+  "type": "module",
+  "scripts": {
+    "i": "pnpm install",
+    "dev": "pnpm vite --mode base",
+    "ts:check": "pnpm vue-tsc --noEmit --skipLibCheck",
+    "build": "pnpm vite build --mode dev",
+    "build:pro": "pnpm vite build --mode pro",
+    "build:dev": "pnpm vite build --mode dev",
+    "build:test": "pnpm vite build --mode test",
+    "serve:pro": "pnpm vite preview --mode pro",
+    "serve:dev": "pnpm vite preview --mode dev",
+    "serve:test": "pnpm vite preview --mode test",
+    "npm:check": "pnpx npm-check-updates -u",
+    "clean": "pnpx rimraf node_modules",
+    "clean:cache": "pnpx rimraf node_modules/.cache",
+    "lint:eslint": "eslint . --fix \"src/**/*.{js,ts,tsx,vue,html}\"",
+    "lint:format": "prettier --write --loglevel warn \"src/**/*.{js,ts,json,tsx,css,less,vue,html,md}\"",
+    "lint:style": "stylelint --fix \"**/*.{vue,less,postcss,css,scss}\" --cache --cache-location node_modules/.cache/stylelint/",
+    "lint:lint-staged": "lint-staged -c ./.husky/lintstagedrc.cjs",
+    "p": "plop"
+  },
+  "packageManager": "pnpm@8.1.0",
+  "engines": {
+    "node": ">=18.0.0",
+    "pnpm": ">=8.1.0"
+  },
+  "license": "MIT",
+  "repository": {
+    "type": "git",
+    "url": "http://112.124.9.106:10300/one_health/web.git"
+  },
+  "dependencies": {
+    "ai-robot": "^1.0.1"
+  }
+}

+ 11 - 0
projects/base/plop/component/component.hbs

@@ -0,0 +1,11 @@
+<script setup lang="ts">
+import { useDesign } from '@common/src/hooks/web/useDesign'
+
+const { getPrefixCls } = useDesign()
+
+const prefixCls = getPrefixCls('{{ name }}')
+</script>
+
+<template>
+  <div :class="`${prefixCls}-{{ name }}`">{{ upperFirstName }}</div>
+</template>

+ 3 - 0
projects/base/plop/component/index.hbs

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

+ 38 - 0
projects/base/plop/component/prompt.cjs

@@ -0,0 +1,38 @@
+const toUpperCase = (str) => str.charAt(0).toUpperCase() + str.slice(1)
+
+module.exports = {
+  description: 'Create vue component',
+  prompts: [
+    {
+      type: 'input',
+      name: 'name',
+      message: '请输入组件名称(Please enter the component name)'
+    }
+  ],
+  actions: (data) => {
+    const { name } = data
+    const upperFirstName = toUpperCase(name)
+
+    const actions = []
+    if (name) {
+      actions.push({
+        type: 'add',
+        path: `./src/components/${upperFirstName}/src/${upperFirstName}.vue`,
+        templateFile: './plop/component/component.hbs',
+        data: {
+          name,
+          upperFirstName
+        }
+      }, {
+        type: 'add',
+        path: `./src/components/${upperFirstName}/index.ts`,
+        templateFile: './plop/component/index.hbs',
+        data: {
+          upperFirstName
+        }
+      })
+    }
+
+    return actions
+  }
+}

+ 37 - 0
projects/base/plop/view/prompt.cjs

@@ -0,0 +1,37 @@
+const toUpperCase = (str) => str.charAt(0).toUpperCase() + str.slice(1)
+
+module.exports = {
+  description: 'Create vue view',
+  prompts: [
+    {
+      type: 'input',
+      name: 'path',
+      message: '请输入路径(Please enter a path)',
+      default: 'views'
+    },
+    {
+      type: 'input',
+      name: 'name',
+      message: '请输入模块名称(Please enter module name)'
+    }
+  ],
+  actions: (data) => {
+    const { name, path } = data
+    const upperFirstName = toUpperCase(name)
+
+    const actions = []
+    if (name) {
+      actions.push({
+        type: 'add',
+        path: `./src/${path}/${upperFirstName}.vue`,
+        templateFile: './plop/view/view.hbs',
+        data: {
+          name,
+          upperFirstName
+        }
+      })
+    }
+
+    return actions
+  }
+}

+ 7 - 0
projects/base/plop/view/view.hbs

@@ -0,0 +1,7 @@
+<script setup lang="ts">
+import { ContentWrap } from '@common/src/components/ContentWrap'
+</script>
+
+<template>
+  <ContentWrap title="{{ upperFirstName }}"> {{ name }} </ContentWrap>
+</template>

+ 7 - 0
projects/base/plopfile.cjs

@@ -0,0 +1,7 @@
+const viewGenerator = require('./plop/view/prompt.cjs')
+const componentGenerator = require('./plop/component/prompt.cjs')
+
+module.exports = function (plop) {
+  plop.setGenerator('view', viewGenerator)
+  plop.setGenerator('component', componentGenerator)
+}

+ 5 - 0
projects/base/postcss.config.cjs

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

+ 19 - 0
projects/base/prettier.config.cjs

@@ -0,0 +1,19 @@
+module.exports = {
+  printWidth: 100,
+  tabWidth: 2,
+  useTabs: false,
+  semi: false,
+  vueIndentScriptAndStyle: false,
+  singleQuote: true,
+  quoteProps: 'as-needed',
+  bracketSpacing: true,
+  trailingComma: 'none',
+  jsxSingleQuote: false,
+  arrowParens: 'always',
+  insertPragma: false,
+  requirePragma: false,
+  proseWrap: 'never',
+  htmlWhitespaceSensitivity: 'strict',
+  endOfLine: 'auto',
+  rangeStart: 0
+}

BIN
projects/base/public/favicon.ico


BIN
projects/base/public/logo.png


+ 555 - 0
projects/base/src/locales/en.ts

@@ -0,0 +1,555 @@
+export default {
+  common: {
+    inputText: 'Please input',
+    selectText: 'Please select',
+    startTimeText: 'Start time',
+    endTimeText: 'End time',
+    login: 'Login',
+    required: 'This is required',
+    loginOut: 'Login out',
+    document: 'Document',
+    reminder: 'Reminder',
+    loginOutMessage: 'Exit the system?',
+    back: 'Back',
+    ok: 'OK',
+    cancel: 'Cancel',
+    reload: 'Reload current',
+    closeTab: 'Close current',
+    closeTheLeftTab: 'Close left',
+    closeTheRightTab: 'Close right',
+    closeOther: 'Close other',
+    closeAll: 'Close all',
+    prevLabel: 'Prev',
+    nextLabel: 'Next',
+    skipLabel: 'Jump',
+    doneLabel: 'End',
+    menu: 'Menu',
+    menuDes: 'Menu bar rendered in routed structure',
+    collapse: 'Collapse',
+    collapseDes: 'Expand and zoom the menu bar',
+    tagsView: 'Tags view',
+    tagsViewDes: 'Used to record routing history',
+    tool: 'Tool',
+    toolDes: 'Used to set up custom systems',
+    query: 'Query',
+    reset: 'Reset',
+    shrink: 'Put away',
+    expand: 'Expand',
+    delMessage: 'Delete the selected data?',
+    delWarning: 'Warning',
+    delOk: 'OK',
+    delCancel: 'Cancel',
+    delNoData: 'Please select the data to delete',
+    delSuccess: 'Deleted successfully',
+    refresh: 'Refresh',
+    fullscreen: 'Fullscreen',
+    size: 'Size',
+    columnSetting: 'Column setting',
+    lengthRange: 'The length should be between {min} and {max}',
+    notSpace: 'Spaces are not allowed',
+    notSpecialCharacters: 'Special characters are not allowed',
+    isEqual: 'The two are not equal',
+    // 列设置
+    setting: 'Setting'
+  },
+  lock: {
+    lockScreen: 'Lock screen',
+    lock: 'Lock',
+    lockPassword: 'Lock screen password',
+    unlock: 'Click to unlock',
+    backToLogin: 'Back to login',
+    entrySystem: 'Entry the system',
+    placeholder: 'Please enter the lock screen password',
+    message: 'Lock screen password error'
+  },
+  error: {
+    noPermission: `Sorry, you don't have permission to access this page.`,
+    pageError: 'Sorry, the page you visited does not exist.',
+    networkError: 'Sorry, the server reported an error.',
+    returnToHome: 'Return to home'
+  },
+  setting: {
+    projectSetting: 'Project setting',
+    theme: 'Theme',
+    layout: 'Layout',
+    systemTheme: 'System theme',
+    menuTheme: 'Menu theme',
+    interfaceDisplay: 'Interface display',
+    breadcrumb: 'Breadcrumb',
+    breadcrumbIcon: 'Breadcrumb icon',
+    collapseMenu: 'Collapse menu',
+    hamburgerIcon: 'Hamburger icon',
+    screenfullIcon: 'Screenfull icon',
+    sizeIcon: 'Size icon',
+    localeIcon: 'Locale icon',
+    tagsView: 'Tags view',
+    logo: 'Logo',
+    greyMode: 'Grey mode',
+    fixedHeader: 'Fixed header',
+    headerTheme: 'Header theme',
+    cutMenu: 'Cut Menu',
+    copy: 'Copy',
+    clearAndReset: 'Clear cache and reset',
+    copySuccess: 'Copy success',
+    copyFailed: 'Copy failed',
+    footer: 'Footer',
+    uniqueOpened: 'Unique opened',
+    tagsViewIcon: 'Tags view icon',
+    // 开启动态路由
+    dynamicRouter: 'Enable dynamic router',
+    serverDynamicRouter: 'Server dynamic router',
+    reExperienced: 'Please exit the login experience again',
+    fixedMenu: 'Fixed menu'
+  },
+  size: {
+    default: 'Default',
+    large: 'Large',
+    small: 'Small'
+  },
+  login: {
+    welcome: 'Welcome to the system',
+    message: 'Backstage management system',
+    username: 'Username',
+    password: 'Password',
+    register: 'Register',
+    checkPassword: 'Confirm password',
+    login: 'Sign in',
+    otherLogin: 'Sign in with',
+    remember: 'Remember me',
+    hasUser: 'Existing account? Go to login',
+    forgetPassword: 'Forget password',
+    usernamePlaceholder: 'Please input username',
+    passwordPlaceholder: 'Please input password',
+    code: 'Verification code',
+    codePlaceholder: 'Please input verification code',
+    getCode: 'Get code'
+  },
+  router: {
+    login: 'Login',
+    level: 'Multi level menu',
+    menu: 'Menu',
+    menu1: 'Menu1',
+    menu11: 'Menu1-1',
+    menu111: 'Menu1-1-1',
+    menu12: 'Menu1-2',
+    menu2: 'Menu2',
+    dashboard: 'Dashboard',
+    analysis: 'Analysis',
+    workplace: 'Workplace',
+    guide: 'Guide',
+    component: 'Component',
+    icon: 'Icon',
+    echart: 'Echart',
+    countTo: 'Count to',
+    watermark: 'Watermark',
+    highlight: 'Highlight',
+    infotip: 'Infotip',
+    form: 'Form',
+    defaultForm: 'All examples',
+    search: 'Search',
+    table: 'Table',
+    defaultTable: 'Basic example',
+    editor: 'Editor',
+    richText: 'Rich text',
+    codeEditor: 'Code Editor',
+    dialog: 'Dialog',
+    imageViewer: 'Image viewer',
+    descriptions: 'Descriptions',
+    example: 'Example',
+    exampleDialog: 'Example dialog',
+    examplePage: 'Example page',
+    exampleAdd: 'Example page - add',
+    exampleEdit: 'Example page - edit',
+    exampleDetail: 'Example page - detail',
+    errorPage: 'Error page',
+    authorization: 'Authorization',
+    user: 'User management',
+    role: 'Role management',
+    document: 'Document',
+    inputPassword: 'InputPassword',
+    sticky: 'Sticky',
+    treeTable: 'Tree table',
+    PicturePreview: 'Table Image Preview',
+    department: 'Department management',
+    menuManagement: 'Menu management',
+    // 权限测试页面
+    permission: 'Permission test page',
+    function: 'Function',
+    multipleTabs: 'Multiple tabs',
+    details: 'Details',
+    request: 'Request',
+    waterfall: 'Waterfall',
+    imageCropping: 'Image cropping',
+    videoPlayer: 'Video player',
+    // 表格视频预览
+    tableVideoPreview: 'Table video preview',
+    cardTable: 'Card table',
+    personalCenter: 'Personal center',
+    personal: 'Personal',
+    avatars: 'Avatars'
+  },
+  permission: {
+    hasPermission: 'Please set the operation permission value'
+  },
+  analysis: {
+    newUser: 'New user',
+    unreadInformation: 'Unread information',
+    transactionAmount: 'Transaction amount',
+    totalShopping: 'Total Shopping',
+    monthlySales: 'Monthly sales',
+    userAccessSource: 'User access source',
+    january: 'January',
+    february: 'February',
+    march: 'March',
+    april: 'April',
+    may: 'May',
+    june: 'June',
+    july: 'July',
+    august: 'August',
+    september: 'September',
+    october: 'October',
+    november: 'November',
+    december: 'December',
+    estimate: 'Estimate',
+    actual: 'Actual',
+    directAccess: 'Airect access',
+    mailMarketing: 'Mail marketing',
+    allianceAdvertising: 'Alliance advertising',
+    videoAdvertising: 'Video advertising',
+    searchEngines: 'Search engines',
+    weeklyUserActivity: 'Weekly user activity',
+    activeQuantity: 'Active quantity',
+    monday: 'Monday',
+    tuesday: 'Tuesday',
+    wednesday: 'Wednesday',
+    thursday: 'Thursday',
+    friday: 'Friday',
+    saturday: 'Saturday',
+    sunday: 'Sunday'
+  },
+  workplace: {
+    goodMorning: 'Good morning',
+    happyDay: 'Wish you happy every day!',
+    toady: `It's sunny today`,
+    project: 'Project',
+    access: 'Project access',
+    toDo: 'To do',
+    introduction: 'A serious introduction',
+    more: 'More',
+    shortcutOperation: 'Shortcut operation',
+    operation: 'Operation',
+    index: 'Index',
+    personal: 'Personal',
+    team: 'Team',
+    quote: 'Quote',
+    contribution: 'Contribution',
+    hot: 'Hot',
+    yield: 'Yield',
+    dynamic: 'Dynamic',
+    push: 'push',
+    pushCode: 'Archer push code to Github',
+    follow: 'Follow'
+  },
+  formDemo: {
+    input: 'Input',
+    inputNumber: 'InputNumber',
+    default: 'Default',
+    icon: 'Icon',
+    mixed: 'Mixed',
+    password: 'Password',
+    textarea: 'Textarea',
+    remoteSearch: 'Remote search',
+    slot: 'Slot',
+    position: 'Position',
+    autocomplete: 'Autocomplete',
+    select: 'Select',
+    optionSlot: 'Option Slot',
+    selectGroup: 'Select Group',
+    selectV2: 'SelectV2',
+    cascader: 'Cascader',
+    switch: 'Switch',
+    rate: 'Rate',
+    colorPicker: 'Color Picker',
+    transfer: 'Transfer',
+    render: 'Render',
+    radio: 'Radio',
+    radioGroup: 'Radio Group',
+    button: 'Button',
+    checkbox: 'Checkbox',
+    checkboxButton: 'Checkbox Button',
+    checkboxGroup: 'Checkbox Group',
+    slider: 'Slider',
+    datePicker: 'Date Picker',
+    shortcuts: 'Shortcuts',
+    today: 'Today',
+    yesterday: 'Yesterday',
+    aWeekAgo: 'A week ago',
+    week: 'Week',
+    year: 'Year',
+    month: 'Month',
+    dates: 'Dates',
+    daterange: 'Date Range',
+    monthrange: 'Month Range',
+    dateTimePicker: 'DateTimePicker',
+    dateTimerange: 'Datetime Range',
+    timePicker: 'Time Picker',
+    timeSelect: 'Time Select',
+    inputPassword: 'input Password',
+    passwordStrength: 'Password Strength',
+    defaultForm: 'All examples',
+    formDes:
+      'The secondary encapsulation of form components based on ElementPlus realizes data-driven and supports all Form parameters',
+    example: 'example',
+    operate: 'operate',
+    change: 'Change',
+    restore: 'Restore',
+    disabled: 'Disabled',
+    disablement: 'Disablement',
+    delete: 'Delete',
+    add: 'Add',
+    setValue: 'Set value',
+    resetValue: 'Reset value',
+    set: 'Set',
+    subitem: 'Subitem',
+    formValidation: 'Form validation',
+    verifyReset: 'Verify reset',
+    // 富文本编辑器
+    richText: 'Rich text',
+    form: 'Form',
+    // 远程加载
+    remoteLoading: 'Remote loading',
+    // 聚焦
+    focus: 'Focus',
+    treeSelect: 'Tree Select',
+    showCheckbox: 'Show Checkbox',
+    selectAnyLevel: 'Select Any Level',
+    multiple: 'Multiple',
+    filterable: 'Filterable',
+    // 自定义节点内容
+    customContent: 'Custom content',
+    // 懒加载
+    lazyLoad: 'Lazy load',
+    upload: 'Upload',
+    // 用户头像
+    userAvatar: 'User avatar'
+  },
+  guideDemo: {
+    guide: 'Guide',
+    start: 'Start',
+    message:
+      'The guide page is very useful for some people who enter the project for the first time. You can briefly introduce the functions of the project. The boot page is based on driver.js'
+  },
+  iconDemo: {
+    icon: 'Icon',
+    localIcon: 'Local Icon',
+    iconify: 'Iconify component',
+    recommendedUse: 'Recommended use',
+    recommendeDes:
+      'Iconify component basically contains all icons. You can query any icon you want. And packaging will only package the icons used.',
+    accessAddress: 'Access address'
+  },
+  echartDemo: {
+    echart: 'Echart',
+    echartDes:
+      'Based on the secondary packaging components of eckarts, the width is adaptive. The corresponding chart can be displayed by passing in the options and height attributes.'
+  },
+  countToDemo: {
+    countTo: 'CountTo',
+    countToDes:
+      'The transformation is based on vue-count-to and supports all vue-count-to parameters.',
+    suffix: 'Suffix',
+    prefix: 'Prefix',
+    separator: 'Separator',
+    duration: 'Duration',
+    endVal: 'End val',
+    startVal: 'Start val',
+    start: 'Start',
+    pause: 'Pause',
+    resume: 'Resume'
+  },
+  watermarkDemo: {
+    watermark: 'Watermark',
+    createdWatermark: 'Created watermark',
+    clearWatermark: 'Clear watermark',
+    resetWatermark: 'Reset watermark'
+  },
+  highlightDemo: {
+    highlight: 'Highlight',
+    message: 'The best time to plant a tree is ten years ago, followed by now.',
+    keys1: 'ten years ago',
+    keys2: 'now'
+  },
+  infotipDemo: {
+    infotip: 'Infotip',
+    infotipDes: 'Secondary packaging of components based on Highlight',
+    title: 'matters needing attention'
+  },
+  levelDemo: {
+    menu: 'Multi level menu cache'
+  },
+  searchDemo: {
+    search: 'Search',
+    searchDes:
+      'Based on the secondary encapsulation of form components, the functions of query and reset are realized',
+    operate: 'operate',
+    change: 'Change',
+    grid: 'grid',
+    button: 'Button',
+    restore: 'Restore',
+    inline: 'inline',
+    bottom: 'Bottom',
+    position: 'position',
+    left: 'left',
+    center: 'center',
+    right: 'right',
+    dynamicOptions: 'Dynamic options',
+    // 删除单选框
+    deleteRadio: 'Delete radio',
+    // 还原单选框
+    restoreRadio: 'Restore radio',
+    loading: 'Loading',
+    reset: 'Reset'
+  },
+  stickyDemo: {
+    sticky: 'Sticky'
+  },
+  tableDemo: {
+    table: 'Table',
+    tableDes: 'Secondary packaging of Table components based on ElementPlus',
+    index: 'Index',
+    title: 'Title',
+    author: 'Author',
+    displayTime: 'Display time',
+    importance: 'Importance',
+    pageviews: 'Pageviews',
+    action: 'Action',
+    important: 'Important',
+    good: 'Good',
+    commonly: 'Commonly',
+    operate: 'operate',
+    example: 'example',
+    show: 'Show',
+    hidden: 'Hidden',
+    pagination: 'pagination',
+    reserveIndex: 'Reserve index',
+    restoreIndex: 'Restore index',
+    showSelections: 'Show selections',
+    hiddenSelections: 'Restore selections',
+    showExpandedRows: 'Show expanded rows',
+    hiddenExpandedRows: 'Hidden expanded rows',
+    changeTitle: 'Change title',
+    header: 'Header',
+    selectAllNone: 'Select all / none',
+    delOrAddAction: 'Delete or add action',
+    showOrHiddenStripe: 'Show or hidden stripe',
+    showOrHiddenBorder: 'Show or hidden border',
+    fixedHeaderOrAuto: 'Fixed header or auto',
+    getSelections: 'Get selections',
+    preview: 'Preview',
+    showOrHiddenSortable: 'Show or hidden sortable',
+    videoPreview: 'Video preview',
+    cardTable: 'Card table'
+  },
+  richText: {
+    richText: 'Rich text',
+    richTextDes: 'Secondary packaging based on wangeditor',
+    codeEditor: 'Code Editor',
+    codeEditorDes: 'Secondary packaging based on monaco-editor'
+  },
+  dialogDemo: {
+    dialog: 'Dialog',
+    dialogDes: 'Secondary packaging of Dialog components based on ElementPlus',
+    open: 'Open',
+    close: 'Close',
+    combineWithForm: 'Combine with form',
+    submit: 'Submit'
+  },
+  imageViewerDemo: {
+    open: 'Open',
+    imageViewer: 'Image viewer',
+    imageViewerDes: 'Secondary packaging of ImageViewer components based on ElementPlus'
+  },
+  descriptionsDemo: {
+    descriptions: 'Descriptions',
+    descriptionsDes: 'Secondary packaging of Descriptions components based on ElementPlus',
+    username: 'Username',
+    nickName: 'NickName',
+    phone: 'Phone',
+    email: 'Email',
+    addr: 'Address',
+    form: 'Combined with Form component'
+  },
+  exampleDemo: {
+    title: 'Title',
+    add: 'Add',
+    del: 'Delete',
+    edit: 'Edit',
+    author: 'Author',
+    displayTime: 'Display time',
+    importance: 'Importance',
+    pageviews: 'Pageviews',
+    important: 'Important',
+    content: 'Content',
+    save: 'Save',
+    detail: 'Detail'
+  },
+  userDemo: {
+    title: 'User management',
+    message:
+      'Because it is simulated data, only two accounts with different permissions are provided, which can be modified and combined by developers according to the actual situation.',
+    index: 'Index',
+    action: 'Action',
+    username: 'Username',
+    password: 'Password',
+    role: 'Role',
+    remark: 'Remark',
+    remarkMessage1: 'Back end control routing permission',
+    remarkMessage2: 'Front end control routing permission',
+    // 部门列表
+    departmentList: 'Department list',
+    // 搜索部门
+    searchDepartment: 'Search department',
+    account: 'Account',
+    email: 'Email',
+    createTime: 'Create time',
+    // 所属部门
+    department: 'Department',
+    departmentName: 'Department name',
+    status: 'Status',
+    enable: 'Enable',
+    disable: 'Disable',
+    superiorDepartment: 'Superior department'
+  },
+  menu: {
+    menuName: 'Menu name',
+    icon: 'Icon',
+    // 权限
+    permission: 'Permission',
+    component: 'Component',
+    path: 'Path',
+    status: 'Status',
+    hidden: 'Hidden',
+    alwaysShow: 'Always show',
+    noCache: 'No cache',
+    breadcrumb: 'Breadcrumb',
+    affix: 'Affix',
+    noTagsView: 'No tags view',
+    activeMenu: 'Active menu',
+    canTo: 'Can to',
+    name: 'Name'
+  },
+  role: {
+    roleName: 'Role name',
+    role: 'Role',
+    // 菜单分配
+    menu: 'Menu allocation'
+  },
+  inputPasswordDemo: {
+    title: 'InputPassword',
+    inputPasswordDes: 'Secondary packaging of Input components based on ElementPlus'
+  },
+  avatarsDemo: {
+    title:
+      'Avatar component for avatar list, secondary packaging based on element plus Avatar component'
+  }
+}

+ 543 - 0
projects/base/src/locales/zh-CN.ts

@@ -0,0 +1,543 @@
+export default {
+  common: {
+    inputText: '请输入',
+    selectText: '请选择',
+    startTimeText: '开始时间',
+    endTimeText: '结束时间',
+    login: '登录',
+    required: '该项为必填项',
+    loginOut: '退出系统',
+    // document: '项目文档',
+    reminder: '温馨提示',
+    loginOutMessage: '是否退出本系统?',
+    back: '返回',
+    ok: '确定',
+    cancel: '取消',
+    reload: '重新加载',
+    closeTab: '关闭标签页',
+    closeTheLeftTab: '关闭左侧标签页',
+    closeTheRightTab: '关闭右侧标签页',
+    closeOther: '关闭其它标签页',
+    closeAll: '关闭全部标签页',
+    prevLabel: '上一步',
+    nextLabel: '下一步',
+    skipLabel: '跳过',
+    doneLabel: '结束',
+    menu: '菜单',
+    menuDes: '以路由的结构渲染的菜单栏',
+    collapse: '展开缩收',
+    collapseDes: '展开和缩放菜单栏',
+    tagsView: '标签页',
+    tagsViewDes: '用于记录路由历史记录',
+    tool: '工具',
+    toolDes: '用于设置定制系统',
+    query: '查询',
+    reset: '重置',
+    shrink: '收起',
+    expand: '展开',
+    delMessage: '是否删除所选中数据?',
+    delWarning: '提示',
+    delOk: '确定',
+    delCancel: '取消',
+    delNoData: '请选择需要删除的数据',
+    delSuccess: '删除成功',
+    refresh: '刷新',
+    fullscreen: '全屏',
+    size: '尺寸',
+    columnSetting: '列设置',
+    lengthRange: '长度在 {min} 到 {max} 个字符',
+    notSpace: '不能包含空格',
+    notSpecialCharacters: '不能包含特殊字符',
+    isEqual: '两次输入不一致',
+    setting: '设置'
+  },
+  lock: {
+    lockScreen: '锁定屏幕',
+    lock: '锁定',
+    lockPassword: '锁屏密码',
+    unlock: '点击解锁',
+    backToLogin: '返回登录',
+    entrySystem: '进入系统',
+    placeholder: '请输入锁屏密码',
+    message: '锁屏密码错误'
+  },
+  error: {
+    noPermission: `抱歉,您无权访问此页面。`,
+    pageError: '抱歉,您访问的页面不存在。',
+    networkError: '抱歉,服务器报告错误。',
+    returnToHome: '返回首页'
+  },
+  setting: {
+    projectSetting: '项目配置',
+    theme: '主题',
+    layout: '布局',
+    systemTheme: '系统主题',
+    menuTheme: '菜单主题',
+    interfaceDisplay: '界面显示',
+    breadcrumb: '面包屑',
+    breadcrumbIcon: '面包屑图标',
+    collapseMenu: '折叠菜单',
+    hamburgerIcon: '折叠图标',
+    screenfullIcon: '全屏图标',
+    sizeIcon: '尺寸图标',
+    localeIcon: '多语言图标',
+    tagsView: '标签页',
+    logo: 'Logo',
+    greyMode: '灰色模式',
+    fixedHeader: '固定头部',
+    headerTheme: '头部主题',
+    cutMenu: '切割菜单',
+    copy: '拷贝',
+    clearAndReset: '清除缓存并且重置',
+    copySuccess: '拷贝成功',
+    copyFailed: '拷贝失败',
+    footer: '页脚',
+    uniqueOpened: '菜单手风琴',
+    tagsViewIcon: '标签页图标',
+    dynamicRouter: '开启动态路由',
+    serverDynamicRouter: '服务端动态路由',
+    reExperienced: '请重新退出登录体验',
+    fixedMenu: '固定菜单'
+  },
+  size: {
+    default: '默认',
+    large: '大',
+    small: '小'
+  },
+  login: {
+    welcome: '欢迎使用本系统',
+    message: '开箱即用的中后台管理系统',
+    username: '用户名',
+    password: '密码',
+    register: '注册',
+    checkPassword: '确认密码',
+    login: '登录',
+    // otherLogin: '其它登录方式',
+    remember: '记住我',
+    hasUser: '已有账号?去登录',
+    forgetPassword: '忘记密码',
+    usernamePlaceholder: '请输入用户名',
+    passwordPlaceholder: '请输入密码',
+    code: '验证码',
+    codePlaceholder: '请输入验证码',
+    getCode: '获取验证码'
+  },
+  router: {
+    login: '登录',
+    level: '多级菜单',
+    menu: '菜单',
+    menu1: '菜单1',
+    menu11: '菜单1-1',
+    menu111: '菜单1-1-1',
+    menu12: '菜单1-2',
+    menu2: '菜单2',
+    dashboard: '首页',
+    analysis: '分析页',
+    workplace: '工作台',
+    guide: '引导',
+    component: '组件',
+    icon: '图标',
+    echart: '图表',
+    countTo: '数字动画',
+    watermark: '水印',
+    highlight: '高亮',
+    infotip: '信息提示',
+    form: '表单',
+    defaultForm: '全部示例',
+    search: '查询',
+    table: '表格',
+    defaultTable: '基础示例',
+    editor: '编辑器',
+    richText: '富文本',
+    codeEditor: '代码编辑器',
+    dialog: '弹窗',
+    imageViewer: '图片预览',
+    descriptions: '描述',
+    example: '综合示例',
+    exampleDialog: '综合示例 - 弹窗',
+    examplePage: '综合示例 - 页面',
+    exampleAdd: '综合示例 - 新增',
+    exampleEdit: '综合示例 - 编辑',
+    exampleDetail: '综合示例 - 详情',
+    errorPage: '错误页面',
+    authorization: '权限管理',
+    user: '用户管理',
+    role: '角色管理',
+    document: '文档',
+    inputPassword: '密码输入框',
+    sticky: '黏性',
+    treeTable: '树形表格',
+    PicturePreview: '表格图片预览',
+    department: '部门管理',
+    menuManagement: '菜单管理',
+    permission: '权限测试页',
+    function: '功能',
+    multipleTabs: '多开标签页',
+    details: '详情页',
+    request: '请求',
+    waterfall: '瀑布流',
+    imageCropping: '图片裁剪',
+    videoPlayer: '视频播放器',
+    tableVideoPreview: '表格视频预览',
+    cardTable: '卡片表格',
+    personalCenter: '个人中心',
+    personal: '个人',
+    avatars: '头像列表'
+  },
+  permission: {
+    hasPermission: '请设置操作权限值'
+  },
+  analysis: {
+    newUser: '新增用户',
+    unreadInformation: '未读消息',
+    transactionAmount: '成交金额',
+    totalShopping: '购物总量',
+    monthlySales: '每月销售额',
+    userAccessSource: '用户访问来源',
+    january: '一月',
+    february: '二月',
+    march: '三月',
+    april: '四月',
+    may: '五月',
+    june: '六月',
+    july: '七月',
+    august: '八月',
+    september: '九月',
+    october: '十月',
+    november: '十一月',
+    december: '十二月',
+    estimate: '预计',
+    actual: '实际',
+    directAccess: '直接访问',
+    mailMarketing: '邮件营销',
+    allianceAdvertising: '联盟广告',
+    videoAdvertising: '视频广告',
+    searchEngines: '搜索引擎',
+    weeklyUserActivity: '每周用户活跃量',
+    activeQuantity: '活跃量',
+    monday: '周一',
+    tuesday: '周二',
+    wednesday: '周三',
+    thursday: '周四',
+    friday: '周五',
+    saturday: '周六',
+    sunday: '周日'
+  },
+  workplace: {
+    goodMorning: '早安',
+    happyDay: '祝你开心每一天!',
+    toady: '今日晴',
+    project: '项目数',
+    access: '项目访问',
+    toDo: '待办',
+    introduction: '一个正经的简介',
+    more: '更多',
+    shortcutOperation: '快捷操作',
+    operation: '操作',
+    index: '指数',
+    personal: '个人',
+    team: '团队',
+    quote: '引用',
+    contribution: '贡献',
+    hot: '热度',
+    yield: '产量',
+    dynamic: '动态',
+    push: '推送',
+    pushCode: 'Archer 推送 代码到 Github',
+    follow: '关注'
+  },
+  formDemo: {
+    input: '输入框',
+    inputNumber: '数字输入框',
+    default: '默认',
+    icon: '图标',
+    mixed: '复合型',
+    password: '密码框',
+    textarea: '多行文本',
+    remoteSearch: '远程搜索',
+    slot: '插槽',
+    position: '位置',
+    autocomplete: '自动补全',
+    select: '选择器',
+    optionSlot: '选项插槽',
+    selectGroup: '选项分组',
+    selectV2: '虚拟列表选择器',
+    cascader: '级联选择器',
+    switch: '开关',
+    rate: '评分',
+    colorPicker: '颜色选择器',
+    transfer: '穿梭框',
+    render: '渲染器',
+    radio: '单选框',
+    radioGroup: '单选框组',
+    button: '按钮',
+    checkbox: '多选框',
+    checkboxButton: '多选框按钮',
+    checkboxGroup: '多选框组',
+    slider: '滑块',
+    datePicker: '日期选择器',
+    shortcuts: '快捷选项',
+    today: '今天',
+    yesterday: '昨天',
+    aWeekAgo: '一周前',
+    week: '周',
+    year: '年',
+    month: '月',
+    dates: '日期',
+    daterange: '日期范围',
+    monthrange: '月份范围',
+    dateTimePicker: '日期时间选择器',
+    dateTimerange: '日期时间范围',
+    timePicker: '时间选择器',
+    timeSelect: '时间选择',
+    inputPassword: '密码输入框',
+    passwordStrength: '密码强度',
+    defaultForm: '全部示例',
+    formDes: '基于 ElementPlus 的 Form 组件二次封装,实现数据驱动,支持所有 Form 参数',
+    example: '示例',
+    operate: '操作',
+    change: '更改',
+    restore: '还原',
+    disabled: '禁用',
+    disablement: '解除禁用',
+    delete: '删除',
+    add: '添加',
+    setValue: '设置值',
+    resetValue: '重置值',
+    set: '设置',
+    subitem: '子项',
+    formValidation: '表单验证',
+    verifyReset: '验证重置',
+    // 富文本编辑器
+    richText: '富文本编辑器',
+    form: '表单',
+    // 远程加载
+    remoteLoading: '远程加载',
+    // 聚焦
+    focus: '聚焦',
+    treeSelect: '树形选择器',
+    showCheckbox: '显示复选框',
+    selectAnyLevel: '选择任意级别',
+    multiple: '多选',
+    filterable: '可筛选',
+    customContent: '自定义内容',
+    lazyLoad: '懒加载',
+    upload: '上传',
+    userAvatar: '用户头像'
+  },
+  guideDemo: {
+    guide: '引导页',
+    start: '开始',
+    message:
+      '引导页对于一些第一次进入项目的人很有用,你可以简单介绍下项目的功能。引导页基于 driver.js'
+  },
+  iconDemo: {
+    icon: '图标',
+    localIcon: '本地图标',
+    iconify: 'Iconify组件',
+    recommendedUse: '推荐使用',
+    recommendeDes:
+      'Iconify组件基本包含所有的图标,你可以查询到你想要的任何图标。并且打包只会打包所用到的图标。',
+    accessAddress: '访问地址'
+  },
+  echartDemo: {
+    echart: '图表',
+    echartDes:
+      '基于 echarts 二次封装组件,自适应宽度,只需传入 options 与 height 属性即可展示对应的图表。'
+  },
+  countToDemo: {
+    countTo: '数字动画',
+    countToDes: '基于 vue-count-to 进行改造,支持所有 vue-count-to 参数。',
+    suffix: '后缀',
+    prefix: '前缀',
+    separator: '分割符号',
+    duration: '持续时间',
+    endVal: '结束值',
+    startVal: '开始值',
+    start: '开始',
+    pause: '暂停',
+    resume: '继续'
+  },
+  watermarkDemo: {
+    watermark: '水印',
+    createdWatermark: '创建水印',
+    clearWatermark: '清除水印',
+    resetWatermark: '重置水印'
+  },
+  highlightDemo: {
+    highlight: '高亮',
+    message: '种一棵树最好的时间是十年前,其次就是现在。',
+    keys1: '十年前',
+    keys2: '现在'
+  },
+  infotipDemo: {
+    infotip: '信息提示',
+    infotipDes: '基于 Highlight 组件二次封装',
+    title: '注意事项'
+  },
+  levelDemo: {
+    menu: '多级菜单缓存'
+  },
+  searchDemo: {
+    search: '查询',
+    searchDes: '基于 Form 组件二次封装,实现查询、重置功能',
+    operate: '操作',
+    change: '更改',
+    grid: '栅格',
+    button: '按钮',
+    restore: '还原',
+    inline: '内联',
+    bottom: '底部',
+    position: '位置',
+    left: '左',
+    center: '中',
+    right: '右',
+    dynamicOptions: '动态选项',
+    // 删除单选框
+    deleteRadio: '删除单选框',
+    // 还原单选框
+    restoreRadio: '还原单选框',
+    loading: '加载中',
+    reset: '重置'
+  },
+  stickyDemo: {
+    sticky: '黏性'
+  },
+  tableDemo: {
+    table: '表格',
+    tableDes: '基于 ElementPlus 的 Table 组件二次封装',
+    index: '序号',
+    title: '标题',
+    author: '作者',
+    displayTime: '创建时间',
+    importance: '重要性',
+    pageviews: '阅读数',
+    action: '操作',
+    important: '重要',
+    good: '良好',
+    commonly: '一般',
+    operate: '操作',
+    example: '示例',
+    show: '显示',
+    hidden: '隐藏',
+    pagination: '分页',
+    reserveIndex: '叠加序号',
+    restoreIndex: '还原序号',
+    showSelections: '显示多选',
+    hiddenSelections: '隐藏多选',
+    showExpandedRows: '显示展开行',
+    hiddenExpandedRows: '隐藏展开行',
+    changeTitle: '修改标题',
+    header: '头部',
+    selectAllNone: '全选/全不选',
+    delOrAddAction: '删除/添加操作列',
+    showOrHiddenStripe: '显示/隐藏斑马纹',
+    showOrHiddenBorder: '显示/隐藏边框',
+    fixedHeaderOrAuto: '固定头部/自动',
+    getSelections: '获取多选数据',
+    preview: '封面',
+    showOrHiddenSortable: '显示/隐藏排序',
+    videoPreview: '视频预览',
+    cardTable: '卡片表格'
+  },
+  richText: {
+    richText: '富文本',
+    richTextDes: '基于 wangeditor 二次封装',
+    codeEditor: '代码编辑器',
+    codeEditorDes: '基于 monaco-editor 二次封装'
+  },
+  dialogDemo: {
+    dialog: '弹窗',
+    dialogDes: '基于 ElementPlus 的 Dialog 组件二次封装',
+    open: '打开',
+    close: '关闭',
+    combineWithForm: '与表单结合',
+    submit: '提交'
+  },
+  imageViewerDemo: {
+    open: '打开',
+    imageViewer: '图片预览',
+    imageViewerDes: '基于 ElementPlus 的 ImageViewer 组件二次封装'
+  },
+  descriptionsDemo: {
+    descriptions: '描述',
+    descriptionsDes: '基于 ElementPlus 的 Descriptions 组件二次封装',
+    username: '用户名',
+    nickName: '昵称',
+    phone: '联系电话',
+    email: '邮箱',
+    addr: '地址',
+    form: '与 Form 组件组合'
+  },
+  exampleDemo: {
+    title: '标题',
+    add: '新增',
+    del: '删除',
+    edit: '编辑',
+    author: '作者',
+    displayTime: '创建时间',
+    importance: '重要性',
+    pageviews: '阅读数',
+    important: '重要',
+    content: '内容',
+    save: '保存',
+    detail: '详情'
+  },
+  userDemo: {
+    title: '用户管理',
+    message: '由于是模拟数据,所以只提供了两种不同权限的帐号,开发者可根据实际情况自行改造结合。',
+    index: '序号',
+    action: '操作',
+    username: '用户名',
+    password: '密码',
+    role: '角色',
+    remark: '备注',
+    remarkMessage1: '后端控制路由权限',
+    remarkMessage2: '前端控制路由权限',
+    // 部门列表
+    departmentList: '部门列表',
+    searchDepartment: '搜索部门',
+    account: '账号',
+    email: '邮箱',
+    createTime: '创建时间',
+    // 所属部门
+    department: '所属部门',
+    departmentName: '部门名称',
+    status: '状态',
+    // 启用
+    enable: '启用',
+    // 禁用
+    disable: '禁用',
+    // 上级部门
+    superiorDepartment: '上级部门'
+  },
+  menu: {
+    menuName: '菜单名称',
+    icon: '图标',
+    permission: '按钮权限',
+    component: '组件',
+    path: '路径',
+    status: '状态',
+    hidden: '是否隐藏',
+    alwaysShow: '是否一直显示',
+    noCache: '是否清除缓存',
+    breadcrumb: '是否显示面包屑',
+    affix: '是否固定在标签页',
+    noTagsView: '是否隐藏标签页',
+    activeMenu: '高亮菜单',
+    canTo: '是否可跳转',
+    name: '组件名称'
+  },
+  role: {
+    roleName: '角色名称',
+    role: '角色',
+    menu: '菜单分配'
+  },
+  inputPasswordDemo: {
+    title: '密码输入框',
+    inputPasswordDes: '基于 ElementPlus 的 Input 组件二次封装'
+  },
+  avatarsDemo: {
+    title: '头像列表组件,基于element-plus的Avatar组件二次封装'
+  }
+}

+ 64 - 0
projects/base/src/main.ts

@@ -0,0 +1,64 @@
+import 'vue/jsx'
+
+// 引入windi css
+import '@common/src/plugins/unocss'
+
+// 导入全局的svg图标
+import '@common/src/plugins/svgIcon'
+
+// 初始化多语言
+import { setupI18n } from '@common/src/plugins/vueI18n'
+
+// 引入状态管理
+import { setupStore } from '@common/src/store'
+
+// 全局组件
+import { setupGlobCom } from '@common/src/components'
+
+// 引入element-plus
+import { setupElementPlus } from '@common/src/plugins/elementPlus'
+
+// 引入全局样式
+import '@common/src/styles/index.less'
+
+// 引入动画
+import '@common/src/plugins/animate.css'
+
+// 路由
+import { setupRouter } from './router'
+
+// 权限
+import { setupPermission } from '@common/src/directives'
+
+import { createApp } from 'vue'
+
+import App from '@common/src/App.vue'
+
+import './permission'
+
+import * as icons from '@element-plus/icons'
+
+// 创建实例
+const setupAll = async () => {
+  const app = createApp(App)
+
+  Object.keys(icons).forEach((key) => {
+    app.component(key, icons[key])
+  })
+
+  await setupI18n(app)
+
+  setupStore(app)
+
+  setupGlobCom(app)
+
+  setupElementPlus(app)
+
+  setupRouter(app)
+
+  setupPermission(app)
+
+  app.mount('#app')
+}
+
+setupAll()

+ 26 - 0
projects/base/src/permission.ts

@@ -0,0 +1,26 @@
+import router from './router'
+import { useAppStoreWithOut } from '@common/src/store/modules/app'
+import { useTitle } from '@common/src/hooks/web/useTitle'
+import { useNProgress } from '@common/src/hooks/web/useNProgress'
+import { usePermissionStoreWithOut } from '@common/src/store/modules/permission'
+import { usePageLoading } from '@common/src/hooks/web/usePageLoading'
+import { NO_REDIRECT_WHITE_LIST } from '@common/src/constants'
+import { useUserStoreWithOut } from '@common/src/store/modules/user'
+import { codeLogin, getAuthBtn, getMenuList } from '@common/src/api/login'
+import { loginLoad } from '@common/utils'
+
+const SYS_CODE = import.meta.env.VITE_API_SYS_CODE
+
+const path = {
+  routePath: router,
+  storeMAppPath: useAppStoreWithOut,
+  hookProgressPath: useNProgress,
+  hookTitlePath: useTitle,
+  storeMPermissionPath: usePermissionStoreWithOut,
+  hookLoadingPath: usePageLoading,
+  constantsPath: NO_REDIRECT_WHITE_LIST,
+  storeMUserPath: useUserStoreWithOut,
+  apiLoginPath: { codeLogin, getAuthBtn, getMenuList }
+}
+
+loginLoad(SYS_CODE, path)

+ 111 - 0
projects/base/src/router/index.ts

@@ -0,0 +1,111 @@
+import { createRouter, createWebHashHistory } from 'vue-router'
+import type { RouteRecordRaw } from 'vue-router'
+import type { App } from 'vue'
+import { Layout } from '@/utils/routerHelper'
+import { useI18n } from '@common/src/hooks/web/useI18n'
+import { NO_RESET_WHITE_LIST } from '@common/src/constants'
+
+const { t } = useI18n()
+
+export const constantRouterMap: AppRouteRecordRaw[] = [
+  {
+    path: '/',
+    component: Layout,
+    name: 'Root',
+    meta: {
+      hidden: true
+    },
+    children: [
+      {
+        path: '/page',
+        component: () => import('@/views/Demo.vue'),
+        name: 'Page',
+        meta: {}
+      }
+    ]
+  },
+  {
+    path: '/redirect',
+    component: Layout,
+    name: 'Layout',
+    children: [
+      {
+        path: '/redirect/:path(.*)',
+        name: 'Redirect',
+        component: () => import('@common/src/views/Redirect/Redirect.vue'),
+        meta: {}
+      }
+    ],
+    meta: {
+      hidden: true,
+      noTagsView: true
+    }
+  },
+  {
+    path: '/login',
+    component: () => import('@common/src/views/Login/Login.vue'),
+    name: 'Login',
+    meta: {
+      hidden: true,
+      title: t('router.login'),
+      noTagsView: true
+    }
+  },
+  {
+    path: '/personal',
+    component: Layout,
+    redirect: '/personal/personal-center',
+    name: 'Personal',
+    meta: {
+      title: t('router.personal'),
+      hidden: true,
+      canTo: true
+    },
+    children: [
+      {
+        path: 'personal-center',
+        component: () => import('@common/src/views/Personal/PersonalCenter/PersonalCenter.vue'),
+        name: 'PersonalCenter',
+        meta: {
+          title: t('router.personalCenter'),
+          hidden: true,
+          canTo: true
+        }
+      }
+    ]
+  },
+  {
+    path: '/404',
+    component: () => import('@common/src/views/Error/404.vue'),
+    name: 'NoFind',
+    meta: {
+      hidden: true,
+      title: '404',
+      noTagsView: true
+    }
+  }
+]
+
+export const asyncRouterMap: AppRouteRecordRaw[] = []
+
+const router = createRouter({
+  history: createWebHashHistory(),
+  strict: true,
+  routes: constantRouterMap as RouteRecordRaw[],
+  scrollBehavior: () => ({ left: 0, top: 0 })
+})
+
+export const resetRouter = (): void => {
+  router.getRoutes().forEach((route) => {
+    const { name } = route
+    if (name && !NO_RESET_WHITE_LIST.includes(name as string)) {
+      router.hasRoute(name) && router.removeRoute(name)
+    }
+  })
+}
+
+export const setupRouter = (app: App<Element>) => {
+  app.use(router)
+}
+
+export default router

+ 5 - 0
projects/base/src/utils/messageApi.ts

@@ -0,0 +1,5 @@
+// 需要在调完接口之后 显示message的接口集合
+
+// 提交成功信息提示 接口路径白名单
+// 去除环境变量VITE_API_BASE_PATH并且不包含参数的部分
+export const API_URL_MESSAGE_TIP = ['/api/test/add']

+ 205 - 0
projects/base/src/utils/routerHelper.ts

@@ -0,0 +1,205 @@
+import { createRouter, createWebHashHistory } from 'vue-router'
+import type {
+  Router,
+  RouteLocationNormalized,
+  RouteRecordNormalized,
+  RouteRecordRaw
+} from 'vue-router'
+import { isUrl } from '@common/src/utils/is'
+import { omit, cloneDeep } from 'lodash-es'
+
+// 常规页面
+const modules = import.meta.glob('../views/**/*.{vue,tsx}')
+// @common/src 公共部分页面
+const modules2 = import.meta.glob('../../../../common/src/views/**/*.{vue,tsx}')
+
+/* Layout */
+export const Layout = () => import('@common/src/layout/Layout.vue')
+
+export const getParentLayout = () => {
+  return () =>
+    new Promise((resolve) => {
+      resolve({
+        name: 'ParentLayout'
+      })
+    })
+}
+
+export const getRawRoute = (route: RouteLocationNormalized): RouteLocationNormalized => {
+  if (!route) return route
+  const { matched, ...opt } = route
+  return {
+    ...opt,
+    matched: (matched
+      ? matched.map((item) => ({
+          meta: item.meta,
+          name: item.name,
+          path: item.path
+        }))
+      : undefined) as RouteRecordNormalized[]
+  }
+}
+
+// 前端控制路由生成
+export const generateRoutesByFrontEnd = (
+  routes: AppRouteRecordRaw[],
+  keys: string[],
+  basePath = '/'
+): AppRouteRecordRaw[] => {
+  const res: AppRouteRecordRaw[] = []
+
+  for (const route of routes) {
+    const meta = route.meta ?? {}
+    // skip some route
+    if (meta.hidden && !meta.canTo) {
+      continue
+    }
+
+    let data: Nullable<AppRouteRecordRaw> = null
+
+    let onlyOneChild: Nullable<string> = null
+    if (route.children && route.children.length === 1 && !meta.alwaysShow) {
+      onlyOneChild = (
+        isUrl(route.children[0].path)
+          ? route.children[0].path
+          : pathResolve(pathResolve(basePath, route.path), route.children[0].path)
+      ) as string
+    }
+
+    // 开发者可以根据实际情况进行扩展
+    for (const item of keys) {
+      // 通过路径去匹配
+      if (isUrl(item) && (onlyOneChild === item || route.path === item)) {
+        data = Object.assign({}, route)
+      } else {
+        const routePath = (onlyOneChild ?? pathResolve(basePath, route.path)).trim()
+        if (routePath === item || meta.followRoute === item) {
+          data = Object.assign({}, route)
+        }
+      }
+    }
+
+    // recursive child routes
+    if (route.children && data) {
+      data.children = generateRoutesByFrontEnd(
+        route.children,
+        keys,
+        pathResolve(basePath, data.path)
+      )
+    }
+    if (data) {
+      res.push(data as AppRouteRecordRaw)
+    }
+  }
+  return res
+}
+
+// 后端控制路由生成
+export const generateRoutesByServer = (routes: AppCustomRouteRecordRaw[]): AppRouteRecordRaw[] => {
+  const res: AppRouteRecordRaw[] = []
+  for (const route of routes) {
+    const data: AppRouteRecordRaw = {
+      path: route.path,
+      name: route.name,
+      redirect: route.redirect,
+      meta: route.meta
+    }
+    if (route.component) {
+      let comModule
+      if (route.component.includes('@common/src')) {
+        comModule = modules2[`../../../../${route.component.substr(1)}.vue`]
+      } else {
+        comModule = modules[`../${route.component}.vue`] || modules[`../${route.component}.tsx`]
+      }
+      const component = route.component as string
+      if (!comModule && !component.includes('#')) {
+        console.error(`未找到${route.component}.vue文件或${route.component}.tsx文件,请创建`)
+      } else {
+        // 动态加载路由文件,可根据实际情况进行自定义逻辑
+        data.component =
+          component === '#' ? Layout : component.includes('##') ? getParentLayout() : comModule
+        // data.component = Layout
+      }
+    }
+    // recursive child routes
+    if (route.children) {
+      data.children = generateRoutesByServer(route.children)
+    }
+    res.push(data as AppRouteRecordRaw)
+  }
+  return res
+}
+
+export const pathResolve = (parentPath: string, path: string) => {
+  if (isUrl(path)) return path
+  const childPath = path.startsWith('/') || !path ? path : `/${path}`
+  return `${parentPath}${childPath}`.replace(/\/\//g, '/').trim()
+}
+
+// 路由降级
+export const flatMultiLevelRoutes = (routes: AppRouteRecordRaw[]) => {
+  const modules: AppRouteRecordRaw[] = cloneDeep(routes)
+  for (let index = 0; index < modules.length; index++) {
+    const route = modules[index]
+    if (!isMultipleRoute(route)) {
+      continue
+    }
+    promoteRouteLevel(route)
+  }
+  return modules
+}
+
+// 层级是否大于2
+const isMultipleRoute = (route: AppRouteRecordRaw) => {
+  if (!route || !Reflect.has(route, 'children') || !route.children?.length) {
+    return false
+  }
+
+  const children = route.children
+
+  let flag = false
+  for (let index = 0; index < children.length; index++) {
+    const child = children[index]
+    if (child.children?.length) {
+      flag = true
+      break
+    }
+  }
+  return flag
+}
+
+// 生成二级路由
+const promoteRouteLevel = (route: AppRouteRecordRaw) => {
+  let router: Router | null = createRouter({
+    routes: [route as RouteRecordRaw],
+    history: createWebHashHistory()
+  })
+
+  const routes = router.getRoutes()
+  addToChildren(routes, route.children || [], route)
+  router = null
+
+  route.children = route.children?.map((item) => omit(item, 'children'))
+}
+
+// 添加所有子菜单
+const addToChildren = (
+  routes: RouteRecordNormalized[],
+  children: AppRouteRecordRaw[],
+  routeModule: AppRouteRecordRaw
+) => {
+  for (let index = 0; index < children.length; index++) {
+    const child = children[index]
+    const route = routes.find((item) => item.name === child.name)
+    if (!route) {
+      continue
+    }
+    routeModule.children = routeModule.children || []
+    if (!routeModule.children.find((item) => item.name === route.name)) {
+      routeModule.children?.push(route as unknown as AppRouteRecordRaw)
+    }
+    if (child.children?.length) {
+      addToChildren(routes, child.children, routeModule)
+    }
+  }
+}

+ 193 - 0
projects/base/src/views/CurdPageTemplate/Page.vue

@@ -0,0 +1,193 @@
+<script setup lang="tsx">
+import { ContentWrap } from '@common/src/components/ContentWrap'
+import { Search } from '@common/src/components/Search'
+import { Table, TableColumn } from '@common/src/components/Table'
+import { BaseButton } from '@common/src/components/Button'
+import { useTable } from '@common/src/hooks/web/useTable'
+import { FormSchema } from '@common/src/components/Form'
+import { ref, unref, reactive } from 'vue'
+import { list, del } from '@/api/xxx'
+import { useRouter } from 'vue-router'
+
+const { push } = useRouter()
+
+const props = defineProps({
+  tabName: {
+    type: String,
+    default: '1'
+  }
+})
+
+const { tableRegister, tableState, tableMethods } = useTable({
+  fetchDataApi: async () => {
+    const { currentPage, pageSize } = tableState
+    const res = await list({
+      current: unref(currentPage),
+      size: unref(pageSize),
+      ...unref(searchParams)
+    })
+    return {
+      list: res.data.list,
+      total: res.data.totalCount
+    }
+  }
+})
+const { loading, dataList, total, currentPage, pageSize } = tableState
+const { getList } = tableMethods
+
+interface ISearch {
+  caseId?: string
+  userName?: string
+  createTimeStart?: string
+  createTimeEnd?: string
+}
+const searchParams = ref<ISearch>({})
+const setSearchParams = (params: any) => {
+  searchParams.value = params
+  if (params.time) {
+    searchParams.value.createTimeStart = params.time[0]
+    searchParams.value.createTimeEnd = params.time[1]
+  }
+  getList()
+}
+const searchSchema = reactive<FormSchema[]>([
+  {
+    field: 'caseId',
+    label: '病例ID',
+    component: 'Input',
+    componentProps: {
+      placeholder: '请输入'
+    }
+  },
+  {
+    field: 'userName',
+    label: '对象名称',
+    component: 'Input',
+    componentProps: {
+      placeholder: '请输入'
+    }
+  },
+  {
+    field: 'time',
+    component: 'DatePicker',
+    label: '创建时间段',
+    componentProps: {
+      type: 'datetimerange',
+      ...window.dateRangeProps
+    }
+  }
+])
+const tableColumns = reactive<TableColumn[]>([
+  {
+    field: 'index',
+    label: '序号',
+    type: 'index'
+  },
+  {
+    field: 'caseId',
+    label: '病例ID'
+  },
+  {
+    field: 'userName',
+    label: '对象名称'
+  },
+  {
+    field: 'taskNo',
+    label: '关联事件编号'
+  },
+  {
+    field: 'createTime',
+    label: '创建时间'
+  },
+  {
+    field: 'action',
+    width: '220px',
+    label: '操作',
+    slots: {
+      default: (data: any) => {
+        return (
+          <>
+            <BaseButton size="small" type="primary" onClick={() => action(data.row, 'detail')}>
+              查看详情
+            </BaseButton>
+            <BaseButton size="small" type="primary" onClick={() => action(data.row, 'edit')}>
+              编辑
+            </BaseButton>
+            <BaseButton size="small" type="danger" onClick={() => delData(data.row)}>
+              删除
+            </BaseButton>
+          </>
+        )
+      }
+    }
+  }
+])
+
+const actionType = ref('')
+
+const AddAction = () => {
+  actionType.value = 'add'
+  push({
+    path: '/survey-case-manage/write',
+    query: {
+      actionType: 'add',
+      tabName: props.tabName
+    }
+  })
+}
+
+const delData = async (row) => {
+  ElMessageBox.confirm('确认删除?', '提示', {
+    confirmButtonText: '确认',
+    cancelButtonText: '取消',
+    type: 'warning'
+  }).then(async () => {
+    await del({
+      caseId: row?.caseId
+    })
+    getList()
+  })
+}
+
+const action = (row, type: string) => {
+  actionType.value = type
+  if (type === 'edit') {
+    push({
+      path: '/survey-case-manage/write',
+      query: {
+        actionType: 'edit',
+        caseId: row?.caseId
+      }
+    })
+  } else {
+    push({
+      path: '/survey-case-manage/detail',
+      query: {
+        caseId: row?.caseId
+      }
+    })
+  }
+}
+</script>
+
+<template>
+  <ContentWrap>
+    <Search :schema="searchSchema" @search="setSearchParams" @reset="setSearchParams" />
+
+    <div class="mb-10px">
+      <BaseButton type="primary" @click="AddAction">新增</BaseButton>
+    </div>
+
+    <Table
+      v-model:pageSize="pageSize"
+      v-model:currentPage="currentPage"
+      :columns="tableColumns"
+      :data="dataList"
+      :loading="loading"
+      :pagination="{
+        total: total
+      }"
+      @register="tableRegister"
+    />
+  </ContentWrap>
+</template>

+ 238 - 0
projects/base/src/views/CurdPageTemplate/components/Detail.vue

@@ -0,0 +1,238 @@
+<script setup lang="ts">
+import { ContentWrap } from '@common/src/components/ContentWrap'
+import { reactive, ref, watch } from 'vue'
+import { Descriptions, DescriptionsSchema } from '@common/src/components/Descriptions'
+import { useRouter, useRoute } from 'vue-router'
+import { personCaseFind } from '@/api/caseManage'
+import { getCodeByType } from '@common/src/utils'
+const { go } = useRouter()
+const { query } = useRoute()
+
+const detailSchema = reactive<DescriptionsSchema[]>([
+  {
+    field: 'caseId',
+    label: '病例ID'
+  },
+  {
+    field: 'taskNo',
+    label: '关联事件编号'
+  },
+  {
+    field: 'userName',
+    label: '姓名'
+  },
+  {
+    field: 'age',
+    label: '年龄'
+  },
+  {
+    field: 'sex',
+    label: '性别',
+    slots: {
+      default: (data) => {
+        return (data.sex && getCodeByType('SEX', data.sex)) || '-'
+      }
+    }
+  },
+  {
+    field: 'career',
+    label: '职业',
+    slots: {
+      default: (data) => {
+        return (data.career && getCodeByType('CAREER', data.career)) || '-'
+      }
+    }
+  },
+  {
+    field: 'educationDegree',
+    label: '文化程度',
+    slots: {
+      default: (data) => {
+        console.log(data)
+        return (
+          (data.educationDegree && getCodeByType('EDUCATION_DEGREE', data.educationDegree)) || '-'
+        )
+      }
+    }
+  },
+  {
+    field: 'currentAddress',
+    label: '现住址',
+    slots: {
+      default(data) {
+        return data.currentAddress && JSON.parse(data.currentAddress).value
+      }
+    }
+  },
+  {
+    field: 'currentDetail',
+    label: '详细地址'
+  },
+  {
+    field: 'resident',
+    label: '户口地'
+  },
+  {
+    field: 'workUnit',
+    label: '工作(学习)单位'
+  },
+  {
+    field: 'contacts',
+    label: '联系人'
+  },
+  {
+    field: 'telephone',
+    label: '联系电话'
+  }
+])
+
+const detail = ref({})
+const getDetail = async () => {
+  const { data } = await personCaseFind({
+    caseId: query.caseId
+  })
+  detail.value = data
+}
+getDetail()
+
+const activeName = ref('1')
+</script>
+
+<template>
+  <ContentWrap title="病例详情">
+    <el-tabs v-model="activeName" class="demo-tabs">
+      <el-tab-pane label="病例基本信息" name="1">
+        <Descriptions :schema="detailSchema" :data="detail" :column="1" />
+      </el-tab-pane>
+      <el-tab-pane label="疫苗接种记录" name="2">
+        <div class="record-list">
+          <div class="record-list-item">
+            <div class="record-list-item__row">
+              <div class="record-list-item__label">接种疫苗种类</div>
+              <div class="record-list-item__content">xxx</div>
+            </div>
+            <div class="record-list-item__row">
+              <div class="record-list-item__label">接种日期</div>
+              <div class="record-list-item__content">xxx</div>
+            </div>
+            <div class="record-list-item__row">
+              <div class="record-list-item__label">接种地点</div>
+              <div class="record-list-item__content">xxx</div>
+            </div>
+            <div class="record-list-item__row">
+              <div class="record-list-item__label">详细地址</div>
+              <div class="record-list-item__content">xxx</div>
+            </div>
+            <el-divider border-style="dashed" />
+          </div>
+        </div>
+      </el-tab-pane>
+      <el-tab-pane label="就诊记录" name="3">
+        <div class="record-list">
+          <div class="record-list-item">
+            <div class="record-list-item__row">
+              <div class="record-list-item__label">就诊原因</div>
+              <div class="record-list-item__content">xxx</div>
+            </div>
+            <div class="record-list-item__row">
+              <div class="record-list-item__label">诊断结果</div>
+              <div class="record-list-item__content">xxx</div>
+            </div>
+            <div class="record-list-item__row">
+              <div class="record-list-item__label">就诊日期</div>
+              <div class="record-list-item__content">xxx</div>
+            </div>
+            <div class="record-list-item__row">
+              <div class="record-list-item__label">就诊地点</div>
+              <div class="record-list-item__content">xxx</div>
+            </div>
+            <div class="record-list-item__row">
+              <div class="record-list-item__label">详细地址</div>
+              <div class="record-list-item__content">xxx</div>
+            </div>
+            <el-divider border-style="dashed" />
+          </div>
+        </div>
+      </el-tab-pane>
+      <el-tab-pane label="购药记录" name="4">
+        <div class="record-list">
+          <div class="record-list-item">
+            <div class="record-list-item__row">
+              <div class="record-list-item__label">购药原因</div>
+              <div class="record-list-item__content">xxx</div>
+            </div>
+            <div class="record-list-item__row">
+              <div class="record-list-item__label">购药清单</div>
+              <div class="record-list-item__content">xxx</div>
+            </div>
+            <div class="record-list-item__row">
+              <div class="record-list-item__label">购药日期</div>
+              <div class="record-list-item__content">xxx</div>
+            </div>
+            <div class="record-list-item__row">
+              <div class="record-list-item__label">购药地点</div>
+              <div class="record-list-item__content">xxx</div>
+            </div>
+            <div class="record-list-item__row">
+              <div class="record-list-item__label">详细地址</div>
+              <div class="record-list-item__content">xxx</div>
+            </div>
+            <el-divider border-style="dashed" />
+          </div>
+        </div>
+      </el-tab-pane>
+      <el-tab-pane label="检测记录" name="5">
+        <div class="record-list">
+          <div class="record-list-item">
+            <div class="record-list-item__row">
+              <div class="record-list-item__label">检测原因</div>
+              <div class="record-list-item__content">xxx</div>
+            </div>
+            <div class="record-list-item__row">
+              <div class="record-list-item__label">检测结果</div>
+              <div class="record-list-item__content">xxx</div>
+            </div>
+            <div class="record-list-item__row">
+              <div class="record-list-item__label">检测日期</div>
+              <div class="record-list-item__content">xxx</div>
+            </div>
+            <div class="record-list-item__row">
+              <div class="record-list-item__label">检测地点</div>
+              <div class="record-list-item__content">xxx</div>
+            </div>
+            <div class="record-list-item__row">
+              <div class="record-list-item__label">详细地址</div>
+              <div class="record-list-item__content">xxx</div>
+            </div>
+            <el-divider border-style="dashed" />
+          </div>
+        </div>
+      </el-tab-pane>
+      <el-tab-pane label="活动轨迹" name="6">待接入</el-tab-pane>
+    </el-tabs>
+
+    <div class="btns text-right mt10px">
+      <BaseButton @click="go(-1)">返回</BaseButton>
+    </div>
+  </ContentWrap>
+</template>
+
+<style lang="less">
+.record-list {
+  &-item {
+    &__row {
+      display: flex;
+      align-items: center;
+      padding: 10px 0;
+    }
+    &__label {
+      width: 150px;
+      text-align: right;
+      margin-right: 16px;
+    }
+    &__content {
+      color: var(--el-text-color-regular);
+    }
+  }
+}
+</style>

+ 186 - 0
projects/base/src/views/CurdPageTemplate/components/Write.vue

@@ -0,0 +1,186 @@
+<script setup lang="tsx">
+import { ContentWrap } from '@common/src/components/ContentWrap'
+import { Form, FormSchema } from '@common/src/components/Form'
+import { useForm } from '@common/src/hooks/web/useForm'
+import { PropType, reactive, watch, ref } from 'vue'
+import { useValidator } from '@common/src/hooks/web/useValidator'
+import { getCodeByType } from '@common/src/utils'
+import { useRouter, useRoute } from 'vue-router'
+import { personCaseCreate, personCaseUpdate, personCaseFind } from '@/api/xxx'
+import Map from '@common/src/business-components/DynamicForm/src/components/Map.vue'
+
+const { replace } = useRouter()
+const { query } = useRoute()
+
+const { required, phone } = useValidator()
+const rules = reactive({
+  telephone: [phone()]
+})
+const mapValue = ref('')
+const formSchema = reactive<FormSchema[]>([
+  {
+    field: 'taskNo',
+    label: '选择流调任务',
+    component: 'Select'
+  },
+  {
+    field: 'userName',
+    label: '姓名',
+    component: 'Input'
+  },
+  {
+    field: 'age',
+    label: '年龄',
+    component: 'Input'
+  },
+  {
+    field: 'sex',
+    label: '性别',
+    component: 'RadioGroup',
+    componentProps: {
+      options: getCodeByType('SEX')
+    }
+  },
+  {
+    field: 'career',
+    label: '职业',
+    component: 'Select',
+    componentProps: {
+      options: getCodeByType('CAREER')
+    }
+  },
+  {
+    field: 'educationDegree',
+    label: '文化程度',
+    component: 'Select',
+    componentProps: {
+      options: getCodeByType('EDUCATION_DEGREE')
+    }
+  },
+  {
+    field: 'currentAddress',
+    label: '现住址',
+    formItemProps: {
+      slots: {
+        default: () => {
+          return (
+            <>
+              <Map ref="MapRef" v-model={mapValue.value} />
+            </>
+          )
+        }
+      }
+    }
+  },
+  {
+    field: 'currentDetail',
+    label: '详细地址',
+    component: 'Input',
+    componentProps: {
+      placeholder: '请输入,如楼层、门牌号'
+    }
+  },
+  {
+    field: 'resident',
+    label: '户口地',
+    component: 'Input'
+  },
+  {
+    field: 'workUnit',
+    label: '工作(学习)单位',
+    component: 'Input'
+  },
+  {
+    field: 'contacts',
+    label: '联系人',
+    component: 'Input'
+  },
+  {
+    field: 'telephone',
+    label: '联系电话',
+    component: 'Input'
+  }
+])
+
+const { formRegister, formMethods } = useForm()
+const { setValues, getFormData, getElFormExpose, setSchema } = formMethods
+
+const detail = ref()
+const getDetail = async () => {
+  const { data } = await personCaseFind({
+    caseId: query.caseId
+  })
+  detail.value = data
+  if (data.currentAddress) {
+    mapValue.value = data.currentAddress
+  }
+  setValues(data)
+}
+
+watch(
+  () => query.caseId,
+  (val) => {
+    if (!val) return
+    getDetail()
+  },
+  {
+    immediate: true
+  }
+)
+
+const submit = async () => {
+  const elForm = await getElFormExpose()
+  const valid = await elForm?.validate().catch((err) => {
+    console.log(err)
+  })
+  if (valid) {
+    const formData = await getFormData()
+    console.log('formData', formData)
+    let data = formData
+    if (mapValue.value) {
+      const map = JSON.parse(mapValue.value)
+      data = {
+        ...data,
+        currentAddress: mapValue.value,
+        districtNo: map.district_no
+      }
+    }
+    let res
+    if (query.actionType === 'edit') {
+      res = await personCaseUpdate({
+        ...data,
+        caseId: query.caseId
+      })
+    } else {
+      res = await personCaseCreate(data)
+    }
+    if (res.success) {
+      back()
+    }
+  }
+}
+const back = () => {
+  replace({
+    path: '/survey-case-manage/page',
+    query: {
+      tabName: query.tabName
+    }
+  })
+}
+</script>
+
+<template>
+  <ContentWrap title="病例详情">
+    <Form
+      :rules="rules"
+      @register="formRegister"
+      :schema="formSchema"
+      :isCol="false"
+      class="w-700px"
+    />
+    <div class="btns text-right mt10px">
+      <BaseButton type="primary" @click="submit">确认并提交</BaseButton>
+      <BaseButton @click="back">返回</BaseButton>
+    </div>
+  </ContentWrap>
+</template>

+ 226 - 0
projects/base/src/views/CurdTemplate/Page.vue

@@ -0,0 +1,226 @@
+<script setup lang="tsx">
+import { ContentWrap } from '@common/src/components/ContentWrap'
+import { Search } from '@common/src/components/Search'
+import { Dialog } from '@common/src/components/Dialog'
+import { Table } from '@common/src/components/Table'
+import { BaseButton } from '@common/src/components/Button'
+import { useTable } from '@common/src/hooks/web/useTable'
+import { CrudSchema, useCrudSchemas } from '@common/src/hooks/web/useCrudSchemas'
+import Write from './components/Write.vue'
+import Detail from './components/Detail.vue'
+
+import { ref, unref, reactive } from 'vue'
+
+const { tableRegister, tableState, tableMethods } = useTable({
+  fetchDataApi: async () => {
+    const { currentPage, pageSize } = tableState
+    const res = await Api({
+      current: unref(currentPage),
+      size: unref(pageSize),
+      ...unref(searchParams)
+    })
+    return {
+      list: res.data.list,
+      total: res.data.totalCount
+    }
+  }
+})
+const { loading, dataList, total, currentPage, pageSize } = tableState
+const { getList } = tableMethods
+
+const searchParams = ref({})
+const setSearchParams = (params: any) => {
+  searchParams.value = params
+  getList()
+}
+
+const crudSchemas = reactive<CrudSchema[]>([
+  {
+    field: 'index',
+    label: '序号',
+    type: 'index',
+    search: {
+      hidden: true
+    },
+    form: {
+      hidden: true
+    },
+    detail: {
+      hidden: true
+    }
+  },
+  {
+    field: 'no',
+    label: '编号',
+    search: {
+      hidden: true
+    },
+    form: {
+      hidden: true
+    },
+    detail: {
+      hidden: true
+    }
+  },
+  {
+    field: 'serviceName',
+    label: '业务表名称',
+    search: {
+      hidden: true
+    },
+    table: {
+      slots: {
+        default: (data: any) => {
+          return <>{data.row.serviceName}</>
+        }
+      }
+    },
+    form: {
+      component: 'Input'
+    }
+  },
+  {
+    field: 'serviceNo',
+    label: '业务编码',
+    search: {
+      hidden: true
+    },
+    table: {
+      hidden: true
+    },
+    form: {
+      component: 'Input'
+    }
+  },
+  {
+    field: 'action',
+    width: '220px',
+    label: '操作',
+    search: {
+      hidden: true
+    },
+    form: {
+      hidden: true
+    },
+    detail: {
+      hidden: true
+    },
+    table: {
+      slots: {
+        default: (data: any) => {
+          return (
+            <>
+              <BaseButton size="small" type="primary" onClick={() => action(data.row, 'detail')}>
+                查看详情
+              </BaseButton>
+              <BaseButton size="small" type="primary" onClick={() => action(data.row, 'edit')}>
+                编辑
+              </BaseButton>
+              <BaseButton size="small" type="danger" onClick={() => delData(data.row)}>
+                删除
+              </BaseButton>
+            </>
+          )
+        }
+      }
+    }
+  }
+])
+
+// @ts-ignore
+const { allSchemas } = useCrudSchemas(crudSchemas)
+
+const dialogVisible = ref(false)
+const dialogTitle = ref('')
+
+const currentRow = ref()
+const actionType = ref('')
+
+const AddAction = () => {
+  dialogTitle.value = '新增'
+  currentRow.value = null
+  dialogVisible.value = true
+  actionType.value = 'add'
+}
+
+const delData = async (row) => {
+  ElMessageBox.confirm('确认删除?', '提示', {
+    confirmButtonText: '确认',
+    cancelButtonText: '取消',
+    type: 'warning'
+  }).then(async () => {
+    await del(row?.id)
+    getList()
+  })
+}
+
+const action = (row, type: string) => {
+  currentRow.value = row
+  actionType.value = type
+  dialogTitle.value = type === 'edit' ? '编辑' : '详情'
+  dialogVisible.value = true
+}
+
+const writeRef = ref<ComponentRef<typeof Write>>()
+
+const saveLoading = ref(false)
+
+const save = async () => {
+  const write = unref(writeRef)
+  const formData = await write?.submit()
+  if (formData) {
+    saveLoading.value = true
+    const res = await (actionType.value === 'add'
+      ? createBusinessTable(formData)
+      : updateBusinessTable(formData))
+    saveLoading.value = false
+    if (res.success) {
+      dialogVisible.value = false
+      getList()
+    }
+  }
+}
+</script>
+
+<template>
+  <ContentWrap>
+    <Search :schema="allSchemas.searchSchema" @search="setSearchParams" @reset="setSearchParams" />
+
+    <div class="mb-10px">
+      <BaseButton type="primary" @click="AddAction">新增</BaseButton>
+    </div>
+
+    <Table
+      v-model:pageSize="pageSize"
+      v-model:currentPage="currentPage"
+      :columns="allSchemas.tableColumns"
+      :data="dataList"
+      :loading="loading"
+      :pagination="{
+        total: total
+      }"
+      @register="tableRegister"
+    />
+  </ContentWrap>
+
+  <Dialog v-model="dialogVisible" :title="dialogTitle" width="600px">
+    <Detail
+      v-if="actionType === 'detail'"
+      :detail-schema="allSchemas.detailSchema"
+      :current-row="currentRow"
+    />
+    <Write
+      v-else
+      :action-type="actionType"
+      ref="writeRef"
+      :form-schema="allSchemas.formSchema"
+      :current-row="currentRow"
+    />
+    <template #footer>
+      <BaseButton v-if="actionType !== 'detail'" type="primary" :loading="saveLoading" @click="save"
+        >保存</BaseButton
+      >
+      <BaseButton @click="dialogVisible = false">关闭</BaseButton>
+    </template>
+  </Dialog>
+</template>

+ 19 - 0
projects/base/src/views/CurdTemplate/components/Detail.vue

@@ -0,0 +1,19 @@
+<script setup lang="ts">
+import { PropType } from 'vue'
+import { Descriptions, DescriptionsSchema } from '@common/src/components/Descriptions'
+
+defineProps({
+  currentRow: {
+    type: Object,
+    default: () => {}
+  },
+  detailSchema: {
+    type: Array as PropType<DescriptionsSchema[]>,
+    default: () => []
+  }
+})
+</script>
+
+<template>
+  <Descriptions :schema="detailSchema" :data="currentRow" />
+</template>

+ 66 - 0
projects/base/src/views/CurdTemplate/components/Write.vue

@@ -0,0 +1,66 @@
+<script setup lang="ts">
+import { Form, FormSchema } from '@common/src/components/Form'
+import { useForm } from '@common/src/hooks/web/useForm'
+import { PropType, reactive, watch } from 'vue'
+import { useValidator } from '@common/src/hooks/web/useValidator'
+
+const props = defineProps({
+  currentRow: {
+    type: Object,
+    default: () => null
+  },
+  formSchema: {
+    type: Array as PropType<FormSchema[]>,
+    default: () => []
+  },
+  actionType: {
+    type: String,
+    default: ''
+  }
+})
+const { required } = useValidator()
+const rules = reactive({
+  field: [required()]
+})
+
+const { formRegister, formMethods } = useForm()
+const { setValues, getFormData, getElFormExpose, setSchema } = formMethods
+
+const submit = async () => {
+  const elForm = await getElFormExpose()
+  const valid = await elForm?.validate().catch((err) => {
+    console.log(err)
+  })
+  if (valid) {
+    const formData = await getFormData()
+    return formData
+  }
+}
+
+const getDetail = async () => {
+  const { success, data } = await find(props.currentRow?.id || null)
+  if (success) {
+    setValues(data)
+  }
+}
+
+watch(
+  () => props.currentRow,
+  (currentRow) => {
+    if (!currentRow) return
+    getDetail()
+  },
+  {
+    deep: true,
+    immediate: true
+  }
+)
+
+defineExpose({
+  submit
+})
+</script>
+
+<template>
+  <Form :rules="rules" @register="formRegister" :schema="formSchema" :is-col="false" />
+</template>

+ 68 - 0
projects/base/src/views/Demo.vue

@@ -0,0 +1,68 @@
+<template>
+  <div>
+    Demo
+    <AIRobot ref="AIRobotRef" @onMessage="onMessage" />
+  </div>
+</template>
+
+<script setup lang="ts">
+import AIRobot from 'ai-robot'
+import request from 'axios'
+import { ref } from 'vue'
+
+/*
+ * AI机器人相关
+ * */
+const AIRobotRef = ref()
+// 用户输入的内容
+const onMessage = (message) => {
+  console.log('onMessage', message)
+  // dify的本地接口
+  const api_key = 'app-gy94avRz2btKlrDX1m1AXLmm'
+  request
+    .post(
+      'http://localhost/v1/chat-messages',
+      {
+        inputs: {},
+        query: message.body.text,
+        response_mode: 'blocking',
+        user: 'abc-123',
+        conversation_id: ''
+      },
+      {
+        headers: {
+          'Content-Type': 'application/json',
+          Authorization: `Bearer ${api_key}`
+        }
+      }
+    )
+    .then((res) => {
+      const answer = res.data.answer
+
+      // const res = await request.post('http://112.124.9.106:8092/chat', {
+      //   message: message.body.text,
+      //   session_id: sessionId.value
+      // })
+      // const answer = res.data.reply
+      // sessionId.value = res.data.session_id
+
+      let text = answer
+
+      // 模拟业务接口处理
+      if (answer.includes('"success')) {
+        const data = JSON.parse(answer)
+        if (data.success) {
+          text = data.data.map((i) => i.name).join(',')
+        } else text = data.message
+      }
+
+      AIRobotRef.value.handleResponse({ text })
+    })
+    .catch((err) => {
+      console.log(err)
+      AIRobotRef.value.handleResponse({ text: '开小差了~暂时无法回答您的问题' })
+    })
+}
+</script>
+
+<style scoped></style>

+ 231 - 0
projects/base/stylelint.config.cjs

@@ -0,0 +1,231 @@
+module.exports = {
+  root: true,
+  plugins: ['stylelint-order'],
+  customSyntax: 'postcss-html',
+  extends: ['stylelint-config-standard'],
+  rules: {
+    'selector-pseudo-class-no-unknown': [
+      true,
+      {
+        ignorePseudoClasses: ['global', 'deep']
+      }
+    ],
+    'at-rule-no-unknown': [
+      true,
+      {
+        ignoreAtRules: ['function', 'if', 'each', 'include', 'mixin']
+      }
+    ],
+    'media-query-no-invalid': null,
+    'function-no-unknown': null,
+    'no-empty-source': null,
+    'named-grid-areas-no-invalid': null,
+    'no-descending-specificity': null,
+    'font-family-no-missing-generic-family-keyword': null,
+    'rule-empty-line-before': [
+      'always',
+      {
+        ignore: ['after-comment', 'first-nested']
+      }
+    ],
+    'unit-no-unknown': [
+      true,
+      {
+        ignoreUnits: ['rpx']
+      }
+    ],
+    'order/order': [
+      [
+        'dollar-variables',
+        'custom-properties',
+        'at-rules',
+        'declarations',
+        {
+          type: 'at-rule',
+          name: 'supports'
+        },
+        {
+          type: 'at-rule',
+          name: 'media'
+        },
+        'rules'
+      ],
+      {
+        severity: 'warning'
+      }
+    ],
+    // Specify the alphabetical order of the attributes in the declaration block
+    'order/properties-order': [
+      'position',
+      'top',
+      'right',
+      'bottom',
+      'left',
+      'z-index',
+      'display',
+      'float',
+      'width',
+      'height',
+      'max-width',
+      'max-height',
+      'min-width',
+      'min-height',
+      'padding',
+      'padding-top',
+      'padding-right',
+      'padding-bottom',
+      'padding-left',
+      'margin',
+      'margin-top',
+      'margin-right',
+      'margin-bottom',
+      'margin-left',
+      'margin-collapse',
+      'margin-top-collapse',
+      'margin-right-collapse',
+      'margin-bottom-collapse',
+      'margin-left-collapse',
+      'overflow',
+      'overflow-x',
+      'overflow-y',
+      'clip',
+      'clear',
+      'font',
+      'font-family',
+      'font-size',
+      'font-smoothing',
+      'osx-font-smoothing',
+      'font-style',
+      'font-weight',
+      'hyphens',
+      'src',
+      'line-height',
+      'letter-spacing',
+      'word-spacing',
+      'color',
+      'text-align',
+      'text-decoration',
+      'text-indent',
+      'text-overflow',
+      'text-rendering',
+      'text-size-adjust',
+      'text-shadow',
+      'text-transform',
+      'word-break',
+      'word-wrap',
+      'white-space',
+      'vertical-align',
+      'list-style',
+      'list-style-type',
+      'list-style-position',
+      'list-style-image',
+      'pointer-events',
+      'cursor',
+      'background',
+      'background-attachment',
+      'background-color',
+      'background-image',
+      'background-position',
+      'background-repeat',
+      'background-size',
+      'border',
+      'border-collapse',
+      'border-top',
+      'border-right',
+      'border-bottom',
+      'border-left',
+      'border-color',
+      'border-image',
+      'border-top-color',
+      'border-right-color',
+      'border-bottom-color',
+      'border-left-color',
+      'border-spacing',
+      'border-style',
+      'border-top-style',
+      'border-right-style',
+      'border-bottom-style',
+      'border-left-style',
+      'border-width',
+      'border-top-width',
+      'border-right-width',
+      'border-bottom-width',
+      'border-left-width',
+      'border-radius',
+      'border-top-right-radius',
+      'border-bottom-right-radius',
+      'border-bottom-left-radius',
+      'border-top-left-radius',
+      'border-radius-topright',
+      'border-radius-bottomright',
+      'border-radius-bottomleft',
+      'border-radius-topleft',
+      'content',
+      'quotes',
+      'outline',
+      'outline-offset',
+      'opacity',
+      'filter',
+      'visibility',
+      'size',
+      'zoom',
+      'transform',
+      'box-align',
+      'box-flex',
+      'box-orient',
+      'box-pack',
+      'box-shadow',
+      'box-sizing',
+      'table-layout',
+      'animation',
+      'animation-delay',
+      'animation-duration',
+      'animation-iteration-count',
+      'animation-name',
+      'animation-play-state',
+      'animation-timing-function',
+      'animation-fill-mode',
+      'transition',
+      'transition-delay',
+      'transition-duration',
+      'transition-property',
+      'transition-timing-function',
+      'background-clip',
+      'backface-visibility',
+      'resize',
+      'appearance',
+      'user-select',
+      'interpolation-mode',
+      'direction',
+      'marks',
+      'page',
+      'set-link-source',
+      'unicode-bidi',
+      'speak'
+    ]
+  },
+  ignoreFiles: ['**/*.js', '**/*.jsx', '**/*.tsx', '**/*.ts'],
+  overrides: [
+    {
+      files: ['*.vue', '**/*.vue', '*.html', '**/*.html'],
+      extends: ['stylelint-config-recommended', 'stylelint-config-html'],
+      rules: {
+        'keyframes-name-pattern': null,
+        'selector-class-pattern': null,
+        'no-duplicate-selectors': null,
+        'selector-pseudo-class-no-unknown': [
+          true,
+          {
+            ignorePseudoClasses: ['deep', 'global']
+          }
+        ],
+        'selector-pseudo-element-no-unknown': [
+          true,
+          {
+            ignorePseudoElements: ['v-deep', 'v-global', 'v-slotted']
+          }
+        ]
+      }
+    }
+  ]
+}

+ 37 - 0
projects/base/tsconfig.json

@@ -0,0 +1,37 @@
+{
+  "compilerOptions": {
+    "target": "esnext",
+    "useDefineForClassFields": true,
+    "module": "esnext",
+    "moduleResolution": "node",
+    "strict": true,
+    "jsx": "preserve",
+    "sourceMap": true,
+    "resolveJsonModule": true,
+    "esModuleInterop": true,
+    "jsxImportSource": "vue",
+    "lib": ["esnext", "dom"],
+    "baseUrl": "./",
+    "allowJs": true,
+    "forceConsistentCasingInFileNames": true,
+    "allowSyntheticDefaultImports": true,
+    "strictFunctionTypes": false,
+    "noUnusedLocals": true,
+    "noUnusedParameters": true,
+    "experimentalDecorators": true,
+    "noImplicitAny": false,
+    "skipLibCheck": true,
+    // "allowImportingTsExtensions": true,
+    "paths": {
+      "@/*": ["src/*"]
+    },
+    "types": [
+      "@intlify/unplugin-vue-i18n/types",
+      "vite/client",
+      "element-plus/global",
+      "vite-plugin-svg-icons/client"
+    ]
+  },
+  "include": ["src", "types/**/*.d.ts"]
+  // "exclude": ["dist", "node_modules"]
+}

+ 15 - 0
projects/base/types/components.d.ts

@@ -0,0 +1,15 @@
+declare module 'vue' {
+  export interface GlobalComponents {
+    Icon: (typeof import('@common/src/components/Icon/index'))['Icon']
+    Permission: (typeof import('@common/src/components/Permission/index'))['Permission']
+    BaseButton: (typeof import('@common/src/components/Button/index'))['BaseButton']
+    BackButton: (typeof import('@common/src/business-components/BackButton.vue'))['BackButton']
+  }
+}
+
+export {}
+
+declare global {
+  const BaseButton: typeof import('@common/src/components/Button/index').BaseButton
+  const BackButton: typeof import('@common/src/business-components/BackButton.vue').BackButton
+}

+ 7 - 0
projects/base/types/ele.d.ts

@@ -0,0 +1,7 @@
+export {}
+
+// 忽略动态引入时的报错提示
+declare global {
+  const ElMessage: typeof import('element-plus').ElMessage
+  const ElMessageBox: typeof import('element-plus').ElMessageBox
+}

+ 14 - 0
projects/base/types/env.d.ts

@@ -0,0 +1,14 @@
+/// <reference types="vite/client" />
+
+declare module '*.vue' {
+  import { DefineComponent } from 'vue'
+
+  const component: DefineComponent<{}, {}, any>
+  export default component
+}
+
+declare global {
+  interface ImportMeta {
+    readonly env: ImportMetaEnv
+  }
+}

+ 101 - 0
projects/base/types/global.d.ts

@@ -0,0 +1,101 @@
+import type { CSSProperties } from 'vue'
+import { RawAxiosRequestHeaders } from 'axios'
+declare global {
+  declare interface Fn<T = any> {
+    (...arg: T[]): T
+  }
+
+  declare type Nullable<T> = T | null
+
+  declare type ElRef<T extends HTMLElement = HTMLDivElement> = Nullable<T>
+
+  declare type Recordable<T = any, K = string> = Record<K extends null | undefined ? string : K, T>
+
+  declare type RemoveReadonly<T> = {
+    -readonly [P in keyof T]: T[P]
+  }
+
+  declare type ComponentRef<T> = InstanceType<T>
+
+  declare type LocaleType = 'zh-CN' | 'en'
+
+  declare type TimeoutHandle = ReturnType<typeof setTimeout>
+  declare type IntervalHandle = ReturnType<typeof setInterval>
+
+  declare type ElementPlusInfoType = 'success' | 'info' | 'warning' | 'danger'
+
+  declare type LayoutType = 'classic' | 'topLeft' | 'top' | 'cutMenu'
+
+  declare type AxiosContentType =
+    | 'application/json'
+    | 'application/x-www-form-urlencoded'
+    | 'multipart/form-data'
+    | 'text/plain'
+
+  declare type AxiosMethod = 'get' | 'post' | 'delete' | 'put'
+
+  declare type AxiosResponseType = 'arraybuffer' | 'blob' | 'document' | 'json' | 'text' | 'stream'
+
+  declare interface AxiosConfig {
+    params?: any
+    data?: any
+    url?: string
+    method?: AxiosMethod
+    headers?: RawAxiosRequestHeaders
+    responseType?: AxiosResponseType
+  }
+
+  declare interface IResponse<T = any> {
+    code: number
+    data: T extends any ? T : T & any
+    success: boolean
+    message: string
+  }
+
+  declare interface ThemeTypes {
+    elColorPrimary?: string
+    leftMenuBorderColor?: string
+    leftMenuBgColor?: string
+    leftMenuBgLightColor?: string
+    leftMenuBgActiveColor?: string
+    leftMenuCollapseBgActiveColor?: string
+    leftMenuTextColor?: string
+    leftMenuTextActiveColor?: string
+    logoTitleTextColor?: string
+    logoBorderColor?: string
+    topHeaderBgColor?: string
+    topHeaderTextColor?: string
+    topHeaderHoverColor?: string
+    topToolBorderColor?: string
+  }
+
+  declare interface ImportMetaEnv {
+    readonly VITE_NODE_ENV: string
+    readonly VITE_APP_TITLE: string
+    readonly VITE_API_BASE_PATH: string
+    readonly VITE_BASE_PATH: string
+    readonly VITE_DROP_DEBUGGER: string
+    readonly VITE_DROP_CONSOLE: string
+    readonly VITE_SOURCEMAP: string
+    readonly VITE_OUT_DIR: string
+    readonly VITE_USE_BUNDLE_ANALYZER: string
+    readonly VITE_USE_ALL_ELEMENT_PLUS_STYLE: string
+    readonly VITE_USE_CSS_SPLIT: string
+    readonly VITE_USE_ONLINE_ICON: string
+    readonly VITE_ICON_PREFIX: string
+    readonly VITE_HIDE_GLOBAL_SETTING: string
+  }
+}
+
+// 代码字典的声明
+declare interface ICodeItem {
+  value: string
+  label: string
+}
+
+// 自定义的window全局属性
+declare interface Window {
+  CITY_CODE?: string;
+  dateRangeProps: Recordable // 根据实际类型调整
+  APP_FUN_ID: string
+}

+ 78 - 0
projects/base/types/router.d.ts

@@ -0,0 +1,78 @@
+import type { RouteRecordRaw } from 'vue-router'
+import { defineComponent } from 'vue'
+
+/**
+* redirect: noredirect        当设置 noredirect 的时候该路由在面包屑导航中不可被点击
+* name:'router-name'          设定路由的名字,一定要填写不然使用<keep-alive>时会出现各种问题
+* meta : {
+    hidden: true              当设置 true 的时候该路由不会再侧边栏出现 如404,login等页面(默认 false)
+
+    alwaysShow: true          当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式,
+                              只有一个时,会将那个子路由当做根路由显示在侧边栏,
+                              若你想不管路由下面的 children 声明的个数都显示你的根路由,
+                              你可以设置 alwaysShow: true,这样它就会忽略之前定义的规则,
+                              一直显示根路由(默认 false)
+
+    title: 'title'            设置该路由在侧边栏和面包屑中展示的名字
+
+    icon: 'svg-name'          设置该路由的图标
+
+    noCache: true             如果设置为true,则不会被 <keep-alive> 缓存(默认 false)
+
+    breadcrumb: false         如果设置为false,则不会在breadcrumb面包屑中显示(默认 true)
+
+    affix: true               如果设置为true,则会一直固定在tag项中(默认 false)
+
+    noTagsView: true          如果设置为true,则不会出现在tag中(默认 false)
+
+    activeMenu: '/dashboard'  显示高亮的路由路径
+
+    canTo: true               设置为true即使hidden为true,也依然可以进行路由跳转(默认 false)
+
+    permission: ['edit','add', 'delete']    设置该路由的权限
+  }
+**/
+
+interface RouteMetaCustom extends Record<string | number | symbol, unknown> {
+  hidden?: boolean
+  alwaysShow?: boolean
+  title?: string
+  icon?: string
+  noCache?: boolean
+  breadcrumb?: boolean
+  affix?: boolean
+  activeMenu?: string
+  noTagsView?: boolean
+  canTo?: boolean
+  permission?: string[]
+}
+
+declare module 'vue-router' {
+  interface RouteMeta extends RouteMetaCustom {}
+}
+
+type Component<T = any> =
+  | ReturnType<typeof defineComponent>
+  | (() => Promise<typeof import('*.vue')>)
+  | (() => Promise<T>)
+
+declare global {
+  declare interface AppRouteRecordRaw extends Omit<RouteRecordRaw, 'meta' | 'children'> {
+    name: string
+    meta: RouteMetaCustom
+    component?: Component | string
+    children?: AppRouteRecordRaw[]
+    props?: Recordable
+    fullPath?: string
+  }
+
+  declare interface AppCustomRouteRecordRaw
+    extends Omit<RouteRecordRaw, 'meta' | 'component' | 'children'> {
+    name: string
+    meta: RouteMetaCustom
+    component: string
+    path: string
+    redirect: string
+    children?: AppCustomRouteRecordRaw[]
+  }
+}

+ 146 - 0
projects/base/uno.config.ts

@@ -0,0 +1,146 @@
+import { defineConfig, toEscapedSelector as e, presetUno, presetIcons } from 'unocss'
+import transformerVariantGroup from '@unocss/transformer-variant-group'
+import { loadEnv } from 'vite'
+import { ICON_PREFIX } from '@common/src/constants'
+
+const root = process.cwd()
+
+const createPresetIcons = () => {
+  const isBuild = !!process.argv[4]
+  let env = {} as any
+  if (!isBuild) {
+    env = loadEnv(process.argv[3], root)
+  } else {
+    env = loadEnv(process.argv[4], root)
+  }
+  // @ts-ignore
+  if (env.VITE_USE_ONLINE_ICON === 'true') {
+    return []
+  } else {
+    return [
+      presetIcons({
+        autoInstall: false,
+        prefix: ICON_PREFIX
+      })
+    ]
+  }
+}
+
+export default defineConfig({
+  // ...UnoCSS options
+  rules: [
+    [
+      /^overflow-ellipsis$/,
+      ([], { rawSelector }) => {
+        const selector = e(rawSelector)
+        return `
+${selector} {
+  text-overflow: ellipsis;
+}
+`
+      }
+    ],
+    [
+      /^custom-hover$/,
+      ([], { rawSelector }) => {
+        const selector = e(rawSelector)
+        return `
+${selector} {
+  display: flex;
+  height: 100%;
+  padding: 1px 10px 0;
+  cursor: pointer;
+  align-items: center;
+  transition: background var(--transition-time-02);
+}
+/* you can have multiple rules */
+${selector}:hover {
+  background-color: var(--top-header-hover-color);
+}
+.dark ${selector}:hover {
+  background-color: var(--el-bg-color-overlay);
+}
+`
+      }
+    ],
+    [
+      /^layout-border__left$/,
+      ([], { rawSelector }) => {
+        const selector = e(rawSelector)
+        return `
+${selector}:before {
+  content: "";
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 1px;
+  height: 100%;
+  background-color: var(--el-border-color);
+  z-index: 3;
+}
+`
+      }
+    ],
+    [
+      /^layout-border__right$/,
+      ([], { rawSelector }) => {
+        const selector = e(rawSelector)
+        return `
+${selector}:after {
+  content: "";
+  position: absolute;
+  top: 0;
+  right: 0;
+  width: 1px;
+  height: 100%;
+  background-color: var(--el-border-color);
+  z-index: 3;
+}
+`
+      }
+    ],
+    [
+      /^layout-border__top$/,
+      ([], { rawSelector }) => {
+        const selector = e(rawSelector)
+        return `
+${selector}:before {
+  content: "";
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 1px;
+  background-color: var(--el-border-color);
+  z-index: 3;
+}
+`
+      }
+    ],
+    [
+      /^layout-border__bottom$/,
+      ([], { rawSelector }) => {
+        const selector = e(rawSelector)
+        return `
+${selector}:after {
+  content: "";
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  width: 100%;
+  height: 1px;
+  background-color: var(--el-border-color);
+  z-index: 3;
+}
+`
+      }
+    ]
+  ],
+  presets: [presetUno({ dark: 'class', attributify: false }), ...createPresetIcons()],
+  transformers: [transformerVariantGroup()],
+  content: {
+    pipeline: {
+      include: [/\.(vue|svelte|[jt]sx|mdx?|astro|elm|php|phtml|html|ts)($|\?)/]
+    }
+  }
+})

+ 184 - 0
projects/base/vite.config.ts

@@ -0,0 +1,184 @@
+import { resolve } from 'path'
+import { loadEnv } from 'vite'
+import type { UserConfig, ConfigEnv } from 'vite'
+import Vue from '@vitejs/plugin-vue'
+import VueJsx from '@vitejs/plugin-vue-jsx'
+import progress from 'vite-plugin-progress'
+import EslintPlugin from 'vite-plugin-eslint'
+import { ViteEjsPlugin } from 'vite-plugin-ejs'
+import PurgeIcons from 'vite-plugin-purge-icons'
+import ServerUrlCopy from 'vite-plugin-url-copy'
+import VueI18nPlugin from '@intlify/unplugin-vue-i18n/vite'
+import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
+import { createStyleImportPlugin, ElementPlusResolve } from 'vite-plugin-style-import'
+import UnoCSS from 'unocss/vite'
+import { visualizer } from 'rollup-plugin-visualizer'
+import viteCompression from 'vite-plugin-compression'
+// 自动引入组件
+import AutoImport from 'unplugin-auto-import/vite'
+import Components from 'unplugin-vue-components/vite'
+import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
+
+const root = process.cwd()
+
+function pathResolve(dir: string) {
+  return resolve(root, '.', dir)
+}
+
+export default ({ command, mode }: ConfigEnv): UserConfig => {
+  let env = {} as any
+  const isBuild = command === 'build'
+  if (!isBuild) {
+    env = loadEnv(process.argv[3] === '--mode' ? process.argv[4] : process.argv[3], root)
+  } else {
+    env = loadEnv(mode, root)
+  }
+  return {
+    base: env.VITE_BASE_PATH,
+    plugins: [
+      viteCompression(),
+      Vue({
+        script: {
+          // 开启defineModel
+          defineModel: true
+        }
+      }),
+      // VueJsx(),
+      VueJsx({ transformOn: true }), // 启用 Vue JSX 支持
+      ServerUrlCopy(),
+      progress(),
+      env.VITE_USE_ALL_ELEMENT_PLUS_STYLE === 'false'
+        ? createStyleImportPlugin({
+            resolves: [ElementPlusResolve()],
+            libs: [
+              {
+                libraryName: 'element-plus',
+                esModule: true,
+                resolveStyle: (name) => {
+                  if (name === 'click-outside') {
+                    return ''
+                  }
+                  return `element-plus/es/components/${name.replace(/^el-/, '')}/style/css`
+                }
+              }
+            ]
+          })
+        : undefined,
+      EslintPlugin({
+        cache: false,
+        failOnWarning: false,
+        failOnError: false,
+        include: ['src/**/*.vue', 'src/**/*.ts', 'src/**/*.tsx'] // 检查的文件
+      }),
+      VueI18nPlugin({
+        runtimeOnly: true,
+        compositionOnly: true,
+        include: [resolve(__dirname, 'src/locales/**')]
+      }),
+      createSvgIconsPlugin({
+        // iconDirs: [pathResolve('src/assets/svgs')],
+        iconDirs: [resolve(__dirname,'../../','common/src/assets/svgs')],
+        symbolId: 'icon-[dir]-[name]',
+        svgoOptions: true
+      }),
+      PurgeIcons(),
+      ViteEjsPlugin({
+        title: env.VITE_APP_TITLE
+      }),
+      UnoCSS(),
+      // 自动element-plus导入组件
+      AutoImport({
+        resolvers: [ElementPlusResolver()],
+      }),
+      Components({
+        resolvers: [ElementPlusResolver()],
+      })
+    ],
+
+    css: {
+      preprocessorOptions: {
+        less: {
+          additionalData: '@import "@common/src/styles/variables.module.less";',
+          javascriptEnabled: true
+        }
+      }
+    },
+    resolve: {
+      extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.less', '.css'],
+      alias: [
+        {
+          find: 'vue-i18n',
+          replacement: 'vue-i18n/dist/vue-i18n.cjs.js'
+        },
+        {
+          find: /\@\//,
+          replacement: `${pathResolve('src')}/`
+        }
+      ]
+    },
+    esbuild: {
+      pure: env.VITE_DROP_CONSOLE === 'true' ? ['console.log'] : undefined,
+      drop: env.VITE_DROP_DEBUGGER === 'true' ? ['debugger'] : undefined
+    },
+    build: {
+      target: 'es2015',
+      outDir: env.VITE_OUT_DIR || 'dist',
+      sourcemap: env.VITE_SOURCEMAP === 'true',
+      // brotliSize: false,
+      rollupOptions: {
+        plugins: env.VITE_USE_BUNDLE_ANALYZER === 'true' ? [visualizer()] : undefined,
+        // 拆包
+        output: {
+          manualChunks: {
+            'vue-chunks': ['vue', 'vue-router', 'pinia', 'vue-i18n'],
+            'element-plus': ['element-plus'],
+          },
+          chunkFileNames: 'js/[name]-[hash].js', // 引入文件名的名称
+          entryFileNames: 'js/[name]-[hash].js', // 包的入口文件名称
+          assetFileNames: (assetInfo) => {
+            const { name } = assetInfo;
+            const extType = name?.split('.').at(-1) || '';
+            if (/png|jpe?g|gif|webp|svg/.test(extType)) {
+              return 'img/[name]-[hash].[ext]';
+            } else if (/css/.test(extType)) {
+              return 'css/[name]-[hash].[ext]';
+            } else {
+              return 'assets/[name]-[hash].[ext]';
+            }
+          }
+        }
+      },
+      cssCodeSplit: !(env.VITE_USE_CSS_SPLIT === 'false'),
+      cssTarget: ['chrome31']
+    },
+    server: {
+      proxy: {
+        '/openapi': {
+          target: 'http://112.124.9.106:8000',
+          changeOrigin: true
+        }
+      },
+      hmr: {
+        overlay: false
+      },
+      host: '0.0.0.0'
+    },
+    optimizeDeps: {
+      include: [
+        'vue',
+        'vue-router',
+        'vue-types',
+        'element-plus/es/locale/lang/zh-cn',
+        'element-plus/es/locale/lang/en',
+        '@iconify/iconify',
+        '@vueuse/core',
+        'axios',
+        'qs',
+        'vue-json-pretty',
+        '@zxcvbn-ts/core',
+        'dayjs',
+        'cropperjs',
+      ]
+    }
+  }
+}

+ 81 - 0
projects/common/eslint.config.mjs

@@ -0,0 +1,81 @@
+// 引入vue模版的eslint
+import pluginVue from 'eslint-plugin-vue'
+import eslint from '@eslint/js'
+// ts-eslint解析器,使 eslint 可以解析 ts 语法
+import tseslint from 'typescript-eslint'
+// vue文件解析器
+import vueParser from 'vue-eslint-parser'
+import prettier from 'eslint-plugin-prettier'
+
+export default tseslint.config({
+    // ignores: ['node_modules', 'prettier.config.cjs', 'dist*'],
+    files: ['src/**/*.ts', 'src/**/*.tsx', 'src/**/*.vue'],
+    // tseslint.config添加了extends扁平函数,直接用。否则是eslint9.0版本是没有extends的
+    extends: [
+        eslint.configs.recommended,
+        ...tseslint.configs.recommended,
+        ...pluginVue.configs['flat/essential']
+    ],
+    plugins: {
+        prettier
+    },
+    languageOptions: {
+        parser: vueParser, // 使用vue解析器,这个可以识别vue文件
+        parserOptions: {
+            parser: tseslint.parser, // 在vue文件上使用ts解析器
+            sourceType: 'module',
+            ecmaVersion: 2020,
+            ecmaFeatures: {
+                jsx: true
+            }
+        }
+    },
+    rules: {
+        'prettier/prettier': 'error',
+        'no-useless-escape': 0,
+        'no-undef': 0,
+        'vue/no-setup-props-destructure': 0,
+        'vue/script-setup-uses-vars': 1,
+        'vue/no-reserved-component-names': 0,
+        '@typescript-eslint/ban-ts-ignore': 0,
+        '@typescript-eslint/explicit-function-return-type': 0,
+        '@typescript-eslint/no-explicit-any': 0,
+        '@typescript-eslint/no-var-requires': 0,
+        '@typescript-eslint/no-empty-function': 0,
+        'vue/custom-event-name-casing': 0,
+        'no-use-before-define': 0,
+        '@typescript-eslint/no-use-before-define': 0,
+        '@typescript-eslint/ban-ts-comment': 0,
+        '@typescript-eslint/ban-types': 0,
+        '@typescript-eslint/no-non-null-assertion': 0,
+        '@typescript-eslint/explicit-module-boundary-types': 0,
+        '@typescript-eslint/no-unused-vars': 0,
+        'no-unused-vars': 0,
+        'space-before-function-paren': 0,
+
+        'vue/attributes-order': 0,
+        'vue/one-component-per-file': 0,
+        'vue/html-closing-bracket-newline': 0,
+        'vue/max-attributes-per-line': 0,
+        'vue/multiline-html-element-content-newline': 0,
+        'vue/singleline-html-element-content-newline': 0,
+        'vue/attribute-hyphenation': 0,
+        'vue/require-default-prop': 0,
+        'vue/require-explicit-emits': 0,
+        'vue/html-self-closing': [
+            1,
+            {
+                html: {
+                    void: 'always',
+                    normal: 'never',
+                    component: 'always'
+                },
+                svg: 'always',
+                math: 'always'
+            }
+        ],
+        'vue/multi-word-component-names': 0,
+        'vue/no-v-html': 0,
+        'vue/require-toggle-inside-transition': 0
+    }
+})

+ 19 - 0
projects/common/prettier.config.cjs

@@ -0,0 +1,19 @@
+module.exports = {
+    printWidth: 100,
+    tabWidth: 2,
+    useTabs: false,
+    semi: false,
+    vueIndentScriptAndStyle: false,
+    singleQuote: true,
+    quoteProps: 'as-needed',
+    bracketSpacing: true,
+    trailingComma: 'none',
+    jsxSingleQuote: false,
+    arrowParens: 'always',
+    insertPragma: false,
+    requirePragma: false,
+    proseWrap: 'never',
+    htmlWhitespaceSensitivity: 'strict',
+    endOfLine: 'auto',
+    rangeStart: 0
+}

+ 101 - 0
projects/common/src/App.vue

@@ -0,0 +1,101 @@
+<script setup lang="ts">
+import { computed, watch } from 'vue'
+import { useAppStore } from './store/modules/app'
+import { ConfigGlobal } from './components/ConfigGlobal'
+import { useDesign } from './hooks/web/useDesign'
+import { getCodeList, getDeptTree, getDistrictTree } from './api'
+import { useUserStore } from './store/modules/user'
+
+const { getPrefixCls } = useDesign()
+
+const prefixCls = getPrefixCls('app')
+
+const appStore = useAppStore()
+
+const currentSize = computed(() => appStore.getCurrentSize)
+
+const greyMode = computed(() => appStore.getGreyMode)
+
+const userStore = useUserStore()
+
+appStore.initTheme()
+
+// 全局存一下字典数据
+const getGlobalCodeList = async () => {
+  const {
+    success,
+    data: { list }
+  } = await getCodeList({
+    current: 1,
+    size: 10000000
+  })
+  if (success) {
+    const formatter = list.map((i) => {
+      return {
+        codeName: i.codeName,
+        codeType: i.codeType,
+        codeValue: i.codeValue
+      }
+    })
+    sessionStorage.setItem('CODE_ENUM', JSON.stringify(formatter))
+  }
+}
+// 存一下公共部门树
+const getDeptTreeFunc = async () => {
+  const { data, success } = await getDeptTree()
+  if (success) {
+    sessionStorage.setItem('DEPT_TREE', JSON.stringify(data))
+  }
+}
+// 存一下行政区划
+const getDistrictFunc = async () => {
+  const { data, success } = await getDistrictTree()
+  if (success) {
+    sessionStorage.setItem('DISTRICT_TREE', JSON.stringify(data))
+  }
+}
+// watch(
+//   () => userStore.getToken,
+//   (val) => {
+//     if (val) {
+//       getGlobalCodeList()
+//       getDeptTreeFunc()
+//       getDistrictFunc()
+//     }
+//   },
+//   {
+//     immediate: true
+//   }
+// )
+</script>
+
+<template>
+  <ConfigGlobal :size="currentSize">
+    <RouterView :class="greyMode ? `${prefixCls}-grey-mode` : ''" />
+  </ConfigGlobal>
+</template>
+
+<style lang="less">
+@prefix-cls: ~'@{adminNamespace}-app';
+
+.size {
+  width: 100%;
+  height: 100%;
+}
+
+html,
+body {
+  padding: 0 !important;
+  margin: 0 !important;
+  overflow: hidden;
+  .size;
+
+  #app {
+    .size;
+  }
+}
+
+.@{prefix-cls}-grey-mode {
+  filter: grayscale(100%);
+}
+</style>

+ 46 - 0
projects/common/src/api/index.ts

@@ -0,0 +1,46 @@
+/*
+ * @Date: 2024-09-29 16:21:01
+ * @LastEditTime: 2024-11-18 14:24:09
+ * @FilePath: /web/common/src/api/index.ts
+ * @Description: common api 部分
+ */
+
+import request from '../axios'
+
+// 埋点记录进入路由
+export const saveCommonRoute = (data) => {
+  return request.post({ url: '/api/oauthConfig/applicationCommonFunction/access', data })
+}
+// 查询字典列表
+export const getCodeList = (data) => {
+  return request.post({ url: '/api/sys/code/query', data })
+}
+
+/**
+ * 获取部门树
+ * @param parentId 上级部门ID
+ * @param deptName    部门名称
+ */
+export const getDeptTree = (params = {}) => {
+  return request.get({ url: '/api/sys/dept/getDeptTree', params })
+}
+// 获取行政区划树
+export const getDistrictTree = (id: number = 0) => {
+  return request.get({
+    url: `/api/sys/district/getDistrictTree?parentId=${id}`
+  })
+}
+/**
+ * 获取系统用户列表
+ * @param deptId 部门ID
+ * @param userName    部门名称
+ * @param deptIdList 部门ID集合
+ */
+export const getUserList = (data) => {
+  return request.post({ url: '/api/sys/user/query', data })
+}
+
+// 修改密码
+export const changePassword = (data) => {
+  return request.post({ url: '/api/sys/token/changePassword', data })
+}

+ 25 - 0
projects/common/src/api/login/index.ts

@@ -0,0 +1,25 @@
+import request from '../../axios'
+
+export const loginOutApi = () => {
+  return request.get({ url: '/api/sys/token/logout' })
+}
+
+export const myLogin = (data) => {
+  return request.post({ url: '/api/sys/token/login', data })
+}
+
+export const getMenuList = (params) => {
+  return request.get({ url: '/api/sys/token/getUserMenuTree', params })
+}
+
+export const codeLogin = (params) => {
+  return request.get({ url: '/api/oauth/loginByCode', params })
+}
+
+export const getAuthBtn = (params) => {
+  return request.get({ url: '/api/sys/token/getPermissionList', params })
+}
+
+export const codeLogout = (params) => {
+  return request.get({ url: '/api/oauth/logout', params })
+}

+ 22 - 0
projects/common/src/api/login/types.ts

@@ -0,0 +1,22 @@
+export interface UserLoginType {
+  username: string
+  password: string
+}
+
+export interface UserType {
+  username: string
+  userNo: string
+  password: string
+  role?: string
+  roleId?: string
+  loginType?: number
+  phone?: string
+  deptList?: any[]
+}
+
+export interface myUserType {
+  username: string
+  password: string
+  loginType: number
+  phone: string
+}

+ 39 - 0
projects/common/src/api/messageApi.ts

@@ -0,0 +1,39 @@
+// 需要在调完接口之后 显示message的接口集合
+
+// 提交成功信息提示 接口路径白名单
+// 去除环境变量VITE_API_BASE_PATH并且不包含参数的部分
+export const API_URL_MESSAGE_TIP_COMMON = [
+  '/api/sys/dept/create',
+  '/api/sys/dept/update',
+  '/api/sys/role/create',
+  '/api/sys/role/update',
+  '/api/sys/role/allocateFunctions',
+  '/api/sys/role/allocateUsers',
+  '/api/sys/role/deleteById',
+  '/api/sys/role/allocateUserGroups',
+  '/api/sys/user/create',
+  '/api/sys/user/update',
+  '/api/sys/user/delete',
+  '/api/sys/user/deleteByIds',
+  '/api/sys/user/allocateRoles',
+  '/api/sys/user/resetPassword',
+  '/api/oauthConfig/applicationRole/create',
+  '/api/oauthConfig/applicationRole/update',
+  '/api/oauthConfig/applicationRole/deleteById',
+  '/api/oauthConfig/applicationRole/allocateFunctions',
+  '/api/oauthConfig/applicationRole/allocateUsers',
+  '/api/sys/loginLog/deleteById',
+  '/api/sys/errorLog/deleteById',
+  '/api/sys/bizLog/deleteById',
+  '/api/dynamicform/dynamicServiceTableClassify/create',
+  '/api/dynamicform/dynamicServiceTableClassify/update',
+  '/api/dynamicform/dynamicServiceTable/create',
+  '/api/dynamicform/dynamicServiceTable/update',
+  '/api/dynamicform/dynamicServiceTable/deleteById',
+  '/api/dynamicform/dynamicServiceTable/updateFieldConfig',
+  '/api/camunda/model/update',
+  '/api/camunda/model/create',
+  '/api/camunda/model/deleteById',
+  '/api/camunda/model/deleteByIds',
+  '/api/camunda/model/deployment'
+]

+ 21 - 0
projects/common/src/api/system-config/department/index.ts

@@ -0,0 +1,21 @@
+import request from '../../../axios'
+
+export const addDept = (data) => {
+    return request.post({url: '/api/sys/dept/create', data})
+}
+
+export const getDeptTree = (params) => {
+    return request.get({url: '/api/sys/dept/getDeptTree', params})
+}
+
+export const queryDept = (params) => {
+    return request.get({url: '/api/sys/dept/findById', params})
+}
+
+export const updateDept = (data) => {
+    return request.post({url: '/api/sys/dept/update', data})
+}
+
+export const delDeptTree = (params) => {
+    return request.get({url: '/api/sys/dept/deleteById', params})
+}

+ 32 - 0
projects/common/src/api/system-config/department/types.ts

@@ -0,0 +1,32 @@
+export interface DepartmentItem {
+    id: string
+    departmentName?: string
+    children?: DepartmentItem[]
+}
+
+export interface DepartmentListResponse {
+    list: DepartmentItem[]
+}
+
+export interface DepartmentUserParams {
+    pageSize: number
+    pageIndex: number
+    id: string
+    username?: string
+    account?: string
+}
+
+export interface DepartmentUserItem {
+    id: string
+    username: string
+    account: string
+    email: string
+    createTime: string
+    role: string
+    department: DepartmentItem
+}
+
+export interface DepartmentUserResponse {
+    list: DepartmentUserItem[]
+    total: number
+}

+ 81 - 0
projects/common/src/api/system-config/field/index.ts

@@ -0,0 +1,81 @@
+import request from '../../../axios'
+import { IBusiness } from './types'
+
+export const baseDataList = () => {
+  return request.get({ url: '/api/dynamicform/dynamicDataTable/findList' })
+}
+
+// 动态表单 - 业务表分类
+export const tree = () => {
+  return request.post({
+    url: `/api/dynamicform/dynamicServiceTableClassify/findList`
+  })
+}
+export const createBusinessType = (data) => {
+  return request.post({ url: '/api/dynamicform/dynamicServiceTableClassify/create', data })
+}
+export const updateBusinessType = (data) => {
+  return request.post({ url: '/api/dynamicform/dynamicServiceTableClassify/update', data })
+}
+export const findBusinessType = (leadServiceClassifyId: number) => {
+  return request.get({
+    url: `/api/dynamicform/dynamicServiceTableClassify/findById?leadServiceClassifyId=${leadServiceClassifyId}`
+  })
+}
+export const delBusinessType = (data) => {
+  return request.post({
+    url: `/api/dynamicform/dynamicServiceTableClassify/deleteById`,
+    data
+  })
+}
+// 业务表
+export const BusinessTableList = (data) => {
+  return request.post({
+    url: `/api/dynamicform/dynamicServiceTable/findListByPage`,
+    data
+  })
+}
+export const createBusinessTable = (data: IBusiness) => {
+  return request.post({ url: '/api/dynamicform/dynamicServiceTable/create', data })
+}
+export const updateBusinessTable = (data: IBusiness) => {
+  return request.post({ url: '/api/dynamicform/dynamicServiceTable/update', data })
+}
+export const findBusinessTable = (id: number | null) => {
+  return request.get({
+    url: `/api/dynamicform/dynamicServiceTable/findById?leadServiceTableId=${id}`
+  })
+}
+export const delBusinessTable = (id: number) => {
+  return request.post({
+    url: '/api/dynamicform/dynamicServiceTable/deleteById',
+    data: {
+      id
+    }
+  })
+}
+// 字段配置
+export const findFieldConfigById = (leadServiceTableId: number) => {
+  return request.get({
+    url: `/api/dynamicform/dynamicServiceTable/findFieldConfigById?leadServiceTableId=${leadServiceTableId}`
+  })
+}
+export const updateFieldConfig = (data) => {
+  return request.post({
+    url: `/api/dynamicform/dynamicServiceTable/updateFieldConfig`,
+    data
+  })
+}
+// 查询业务字典接口
+export const queryTypeList = () => {
+  return request.get({
+    url: `/api/sys/code/queryTypeList`
+  })
+}
+
+// 查询字段
+export const findFormById = (leadServiceTableId: number) => {
+  return request.get({
+    url: `/api/dynamicform/dynamicServiceTable/findFormById?leadServiceTableId=${leadServiceTableId}`
+  })
+}

+ 44 - 0
projects/common/src/api/system-config/field/types.ts

@@ -0,0 +1,44 @@
+// 列表行数据
+export interface IFieldRow {
+    id: number
+    tableDesc: string
+    tableName: string
+    tableRemark: string
+    version?: number
+}
+
+// 新增字段的类型
+export interface IField {
+    fieldName: string
+    fieldDesc: string
+    fieldLength: string
+    fieldType: number
+}
+
+// 分页查询参数
+export interface IFieldPage {
+    current: number
+    size: number
+    keyWord?: string
+}
+
+// 业务表
+export interface IBusiness {
+    id?: 0
+    serviceNo: string
+    serviceName: string
+    orderNo?: number
+    classifyId?: number
+    tableName?: string
+    pageTemplate?: string
+    pageType: number
+    isEnabled: number
+}
+
+// 业务分类
+export interface IBusinessType {
+    id?: number
+    taskCode: string
+    taskId: number
+    taskName: string
+}

+ 12 - 0
projects/common/src/api/system-config/log.ts

@@ -0,0 +1,12 @@
+import request from '../../axios'
+
+export const getWorkList = (data) => {
+  return request.post({ url: '/api/sys/bizLog/query', data })
+}
+
+export const delWorkLog = (params) => {
+  return request.get({ url: '/api/sys/bizLog/deleteById', params })
+}
+export const exportWorkList = (params) => {
+  return request.post({ url: '/api/sys/bizLog/export', params, responseType: 'blob' })
+}

+ 39 - 0
projects/common/src/api/system-config/lowcode.ts

@@ -0,0 +1,39 @@
+import request from '../../axios'
+
+export interface IFlowPage {
+    current: number
+    size: number
+}
+
+export const list = (data: IFlowPage) => {
+    return request.post({url: '/api/camunda/model/query', data})
+}
+
+export interface IFlowRow {
+    id?: number
+    jsonXml?: string
+    deployId?: string
+    deployIds?: string[]
+    ids?: number[]
+    version?: number
+}
+
+export const update = (data: IFlowRow) => {
+    return request.post({url: '/api/camunda/model/update', data})
+}
+
+export const create = (data: IFlowRow) => {
+    return request.post({url: '/api/camunda/model/create', data})
+}
+export const del = (id: number) => {
+    return request.get({url: `/api/camunda/model/deleteById?id=${id}`})
+}
+export const deleteMult = (data: IFlowRow) => {
+    return request.post({url: '/api/camunda/model/deleteByIds', data})
+}
+export const deployment = (id: number) => {
+    return request.get({url: `/api/camunda/model/deployment?id=${id}`})
+}
+export const find = (id: number) => {
+    return request.get({url: `/api/camunda/model/findById?id=${id}`})
+}

+ 29 - 0
projects/common/src/api/system-config/role/index.ts

@@ -0,0 +1,29 @@
+import request from '../../../axios'
+
+export const getRoleList = (data) => {
+    return request.post({url: '/api/oauthConfig/applicationRole/query', data})
+}
+export const addRole = (data) => {
+    return request.post({url: '/api/oauthConfig/applicationRole/create', data})
+}
+export const updateRole = (data) => {
+    return request.post({url: '/api/oauthConfig/applicationRole/update', data})
+}
+export const authRole = (data) => {
+    return request.post({url: '/api/oauthConfig/applicationRole/allocateFunctions', data})
+}
+export const getAuthTree = (params) => {
+    return request.get({url: '/api/oauthConfig/applicationRole/findAllocatedFunctions', params})
+}
+export const getAuthUsers = (params) => {
+    return request.get({url: '/api/oauthConfig/applicationRole/findAllocatedUsers', params})
+}
+export const authUsers = (data) => {
+    return request.post({url: '/api/oauthConfig/applicationRole/allocateUsers', data})
+}
+export const delAuthUsers = (params) => {
+    return request.get({url: '/api/oauthConfig/applicationRole/deleteById', params})
+}
+export const getUserList = (data) => {
+    return request.post({url: '/api/oauthConfig/application/queryUser', data})
+}

+ 25 - 0
projects/common/src/api/system-config/user/index.ts

@@ -0,0 +1,25 @@
+import request from '../../../axios'
+
+export const addUser = (data) => {
+    return request.post({url: '/api/sys/user/create', data})
+}
+
+export const getUserList = (data) => {
+    return request.post({url: '/api/sys/user/query', data})
+}
+
+export const queryUser = (params) => {
+    return request.get({url: '/api/sys/user/findById', params})
+}
+
+export const updateUser = (data) => {
+    return request.post({url: '/api/sys/user/update', data})
+}
+
+export const delUser = (params) => {
+    return request.get({url: '/api/sys/user/delete', params})
+}
+
+export const delUsers = (data) => {
+    return request.post({url: '/api/sys/user/deleteByIds', data})
+}

+ 0 - 0
projects/common/src/api/system-config/user/types.ts


+ 11 - 0
projects/common/src/api/types/custom.ts

@@ -0,0 +1,11 @@
+export interface DepartmentItem {
+    id: string
+    name: string
+    children?: DepartmentItem[]
+}
+
+// 字典列表
+export interface ICodeItem {
+    value: string
+    label: string
+}

+ 48 - 0
projects/common/src/api/types/login.ts

@@ -0,0 +1,48 @@
+export interface UserLoginType {
+    username: string
+    password: string
+}
+
+export interface UserState {
+    userInfo?: UserType
+    tokenKey: string
+    token: string
+    roleRouters?: string[] | AppCustomRouteRecordRaw[]
+    rememberMe: boolean
+    loginInfo?: UserLoginType
+    btnAuth?: any[]
+    appInfo: any
+}
+
+export interface UserType {
+    username: string
+    userNo: string
+    password: string
+    role?: string
+    roleId?: string
+    loginType?: number
+    phone?: string
+    deptList?: any[]
+    appInfo?: appInfoType | undefined
+}
+
+export interface appInfoType {
+    appCode: string
+    appName: string
+    appId: number
+}
+
+export interface myUserType {
+    username: string
+    password: string
+    loginType: number
+    phone: string
+}
+
+export interface IDeptType {
+    deptCode: string | null
+    deptId: number
+    deptName: string
+    deptType: string
+    fullPath: string
+}

BIN
projects/common/src/assets/imgs/add.png


BIN
projects/common/src/assets/imgs/avatar.png


BIN
projects/common/src/assets/imgs/del.png


BIN
projects/common/src/assets/imgs/location.png


BIN
projects/common/src/assets/imgs/logo.png


BIN
projects/common/src/assets/imgs/more.png


+ 211 - 0
projects/common/src/assets/svgs/403.svg

@@ -0,0 +1,211 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 800" enable-background="new 0 0 800 800">
+    <style>.st26{fill:#fff}</style>
+    <g id="图层_11">
+        <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="401.773" y1="162.104" x2="401.773"
+                        y2="717.596">
+            <stop offset="0" stop-color="#F4F2FB"/>
+            <stop offset="1" stop-color="#E1EEF5"/>
+        </linearGradient>
+        <path d="M485.03 203.46c-38.37 30.29-120.74 33.81-181.17-2.22s-172-31.38-202.22 34.87 37.19 131.33 12.78 178.98S8.66 530.13 64.45 611.49s126.6 60.62 169.22 52.45c84.17-16.13 189.79 115.67 308.62 16.13 68.47-57.35 170.44 42.09 210.17-81.36 32.78-101.86-85.67-139.5-49.97-208.03 37.96-72.88 30.67-159.24-10.46-201.06-38.31-38.96-140.75-38.46-207 13.84z"
+              style="fill:url(#SVGID_1_)"/>
+        <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="494.782" y1="599.604" x2="494.782"
+                        y2="428.659">
+            <stop offset=".34" stop-color="#B0B9E1"/>
+            <stop offset=".866" stop-color="#EAF0F8"/>
+        </linearGradient>
+        <path d="M406.65 428.66h216.44l-22.53 49.03s59.19 57.87-14.13 121.91c-134.28-44.17-221.74-37.1-219.98-38.87 1.77-1.76 40.2-132.07 40.2-132.07z"
+              style="fill:url(#SVGID_2_)"/>
+        <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="116.855" y1="542.49" x2="116.855" y2="405.316">
+            <stop offset=".227" stop-color="#B7ACE0"/>
+            <stop offset=".789" stop-color="#E8E7FA"/>
+        </linearGradient>
+        <path d="M117.64 405.56s-.22-.57-.52.04c-2.7 5.49-27.15 64.96-29.09 110.86 0 0-4.08 26.37 30.11 26.02 28.54-.29 27.78-24.6 27.68-32.79-.39-33.22-28.18-104.13-28.18-104.13z"
+              style="fill:url(#SVGID_3_)"/>
+        <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="116.857" y1="420.547" x2="116.857"
+                        y2="571.681">
+            <stop offset="0" stop-color="#ECF1FB"/>
+            <stop offset=".818" stop-color="#AFB0E7"/>
+        </linearGradient>
+        <path d="M116.86 571.68c-.55 0-1-.45-1-1V421.55c0-.55.45-1 1-1s1 .45 1 1v149.13c0 .55-.45 1-1 1z"
+              style="fill:url(#SVGID_4_)"/>
+        <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="617.984" y1="450.968" x2="617.984"
+                        y2="362.644">
+            <stop offset=".227" stop-color="#CCD4F4"/>
+            <stop offset=".789" stop-color="#ECF1FB"/>
+        </linearGradient>
+        <path d="M618.49 362.8s-.14-.37-.33.03c-1.74 3.53-17.48 41.83-18.73 71.38 0 0-2.63 16.98 19.39 16.76 18.38-.18 17.89-15.84 17.82-21.11-.25-21.4-18.15-67.06-18.15-67.06z"
+              style="fill:url(#SVGID_5_)"/>
+        <linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="617.985" y1="372.451" x2="617.985"
+                        y2="469.764">
+            <stop offset="0" stop-color="#ECF1FB"/>
+            <stop offset="1" stop-color="#A6A8E2"/>
+        </linearGradient>
+        <path d="M617.99 469.76c-.36 0-.64-.29-.64-.64V373.1c0-.36.29-.64.64-.64s.64.29.64.64v96.02c0 .36-.29.64-.64.64z"
+              style="fill:url(#SVGID_6_)"/>
+        <linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="463.902" y1="88.362" x2="429.148" y2="148.558">
+            <stop offset="0" stop-color="#FFDB80"/>
+            <stop offset="1" stop-color="#FFBB24"/>
+        </linearGradient>
+        <circle cx="446.52" cy="118.46" r="34.75" style="fill:url(#SVGID_7_)"/>
+        <linearGradient id="SVGID_8_" gradientUnits="userSpaceOnUse" x1="421.565" y1="118.828" x2="421.565"
+                        y2="176.282">
+            <stop offset="0" stop-color="#F9FAFE"/>
+            <stop offset="1" stop-color="#E5EDF7"/>
+        </linearGradient>
+        <path d="M466.3 137.41h-34.57c-2.23-10.61-11.65-18.58-22.93-18.58s-20.69 7.97-22.93 18.58h-9.05c-10.73 0-19.44 8.7-19.44 19.44 0 10.73 8.7 19.44 19.44 19.44h89.47c10.73 0 19.44-8.7 19.44-19.44.01-10.74-8.69-19.44-19.43-19.44z"
+              style="fill:url(#SVGID_8_)"/>
+        <g>
+            <linearGradient id="SVGID_9_" gradientUnits="userSpaceOnUse" x1="688.586" y1="540.208" x2="688.586"
+                            y2="512.38">
+                <stop offset=".227" stop-color="#AFB0E7"/>
+                <stop offset="1" stop-color="#ECF1FB"/>
+            </linearGradient>
+            <circle cx="688.59" cy="526.29" r="13.91" style="fill:url(#SVGID_9_)"/>
+            <linearGradient id="SVGID_10_" gradientUnits="userSpaceOnUse" x1="688.635" y1="515.894" x2="688.635"
+                            y2="560.69">
+                <stop offset="0" stop-color="#DDE1F6"/>
+                <stop offset=".818" stop-color="#A6A8E2"/>
+            </linearGradient>
+            <path d="M688.64 560.69c-.24 0-.43-.19-.43-.43v-43.94c0-.24.19-.43.43-.43s.43.19.43.43v43.94a.44.44 0 01-.43.43z"
+                  style="fill:url(#SVGID_10_)"/>
+        </g>
+        <g>
+            <linearGradient id="SVGID_11_" gradientUnits="userSpaceOnUse" x1="2622.045" y1="266.481" x2="2451.058"
+                            y2="562.64" gradientTransform="matrix(-1 0 0 1 2941.346 0)">
+                <stop offset="0" stop-color="#C8CBF2"/>
+                <stop offset="1" stop-color="#AFB0E7"/>
+            </linearGradient>
+            <path d="M248.82 393.99c0-24.52-.03-49.03.01-73.54.02-14.37 4.24-18.36 17.97-20.53 41.87-6.61 82.03-18.72 117.91-42.29 10.38-6.82 18.3-7.59 29.06-.47 34.85 23.06 73.26 37.11 114.55 42.8 13.12 1.81 16.84 5.88 16.85 19.25.04 45.72-.4 91.44.18 137.15.34 26.77-8.17 49.99-24.02 70.73-31.46 41.17-74.88 63.76-122.21 80.03-2.5.86-5.83.67-8.36-.23-38.47-13.74-74.58-31.84-104.15-61.09-22.97-22.73-37.84-49.56-37.79-83.22.03-22.87.01-45.73 0-68.59z"
+                  style="fill:url(#SVGID_11_)"/>
+            <linearGradient id="SVGID_12_" gradientUnits="userSpaceOnUse" x1="2625.25" y1="279.944" x2="2462.749"
+                            y2="561.403" gradientTransform="matrix(-1 0 0 1 2941.346 0)">
+                <stop offset=".116" stop-color="#DEE4FF"/>
+                <stop offset=".847" stop-color="#BACBEE"/>
+            </linearGradient>
+            <path d="M247.94 401.44c0-23.21-.03-46.42.01-69.63.02-13.61 4.06-17.38 17.23-19.43 40.15-6.26 78.67-17.72 113.07-40.04 9.95-6.46 17.55-7.18 27.86-.44 33.42 21.83 70.25 35.14 109.84 40.52 12.58 1.71 16.14 5.56 16.15 18.22.03 43.28-.38 86.57.18 129.84.33 25.34-7.83 47.33-23.03 66.96-30.17 38.98-71.81 60.36-117.19 75.77-2.4.81-5.59.64-8.01-.22-36.89-13.01-71.52-30.14-99.87-57.84-22.03-21.52-36.28-46.91-36.23-78.78.02-21.65-.01-43.29-.01-64.93z"
+                  style="fill:url(#SVGID_12_)"/>
+            <linearGradient id="SVGID_13_" gradientUnits="userSpaceOnUse" x1="361.421" y1="346.477" x2="449.513"
+                            y2="499.057">
+                <stop offset="0" stop-color="#C8CBF2"/>
+                <stop offset="1" stop-color="#AFB0E7"/>
+            </linearGradient>
+            <path d="M411.59 435.75c23.18-5.61 40.41-26.11 40.41-50.49 0-28.68-23.85-52.01-53.17-52.01s-53.17 23.33-53.17 52.01c0 24.38 17.24 44.88 40.41 50.49v85.2h25.52v-36.38h32.67v-24.96h-32.67v-23.86zm-40.41-50.49c0-14.91 12.41-27.05 27.65-27.05s27.65 12.14 27.65 27.05-12.41 27.05-27.65 27.05-27.65-12.14-27.65-27.05z"
+                  style="fill:url(#SVGID_13_)"/>
+            <path class="st26"
+                  d="M407.67 439.03c21.8-5.39 38.01-25.1 38.01-48.54 0-27.58-22.43-50.01-50.01-50.01s-50.01 22.43-50.01 50.01c0 23.44 16.21 43.15 38.01 48.54v81.92h24v-34.98h30.73v-24h-30.73v-22.94zm-38.01-48.55c0-14.34 11.67-26.01 26.01-26.01s26.01 11.67 26.01 26.01-11.67 26.01-26.01 26.01-26.01-11.67-26.01-26.01z"/>
+            <linearGradient id="SVGID_14_" gradientUnits="userSpaceOnUse" x1="484.836" y1="475.674" x2="565.754"
+                            y2="615.828">
+                <stop offset="0" stop-color="#C8CBF2"/>
+                <stop offset="1" stop-color="#AFB0E7"/>
+            </linearGradient>
+            <circle cx="525.3" cy="545.75" r="80.9" style="fill:url(#SVGID_14_)"/>
+            <linearGradient id="SVGID_15_" gradientUnits="userSpaceOnUse" x1="482.787" y1="483.323" x2="559.605"
+                            y2="616.376">
+                <stop offset=".116" stop-color="#DEE4FF"/>
+                <stop offset=".847" stop-color="#C6D5F4"/>
+            </linearGradient>
+            <circle cx="521.2" cy="549.85" r="76.81" style="fill:url(#SVGID_15_)"/>
+            <path class="st26"
+                  d="M538.5 547.62l23.01-23.01c4.44-4.44 4.44-11.63 0-16.06-4.44-4.44-11.63-4.44-16.06 0l-23.01 23.01-23.01-23.01c-4.44-4.44-11.63-4.44-16.06 0-4.44 4.44-4.44 11.63 0 16.06l23.01 23.01-23.01 23.01c-4.44 4.44-4.44 11.63 0 16.06 2.22 2.22 5.13 3.33 8.03 3.33 2.91 0 5.81-1.11 8.03-3.33l23.01-23.01 23.01 23.01c2.22 2.22 5.13 3.33 8.03 3.33s5.81-1.11 8.03-3.33c4.44-4.44 4.44-11.63 0-16.06l-23.01-23.01z"/>
+        </g>
+        <g>
+            <linearGradient id="SVGID_16_" gradientUnits="userSpaceOnUse" x1="232.569" y1="558.709" x2="232.569"
+                            y2="484.191">
+                <stop offset="0" stop-color="#C3D5FD"/>
+                <stop offset="1" stop-color="#1A90FC"/>
+            </linearGradient>
+            <path d="M224.88 484.54s-18.08-2.5-23.95 5.81-8.02 29.58-8.02 29.58l13.61-.72-1.15 24.78 25.11 14.72 35.77-19.24-5.44-22.45 11.43-2.98s-3.4-32.58-19.31-27.77c-8.17.87-10.74.73-10.74.73s-2.15 6.85-9.53 6.27c-7.38-.59-7.78-8.73-7.78-8.73z"
+                  style="fill:url(#SVGID_16_)"/>
+            <linearGradient id="SVGID_17_" gradientUnits="userSpaceOnUse" x1="233.602" y1="471.483" x2="233.602"
+                            y2="495.089">
+                <stop offset="0" stop-color="#F4AE98"/>
+                <stop offset="1" stop-color="#FAD1BB"/>
+            </linearGradient>
+            <path d="M226.69 474.3l-3.76 16.76c-.18.79.23 1.59.98 1.89 1.94.79 5.83 2.13 9.82 2.13 4.15 0 8.06-2.27 9.86-3.48.62-.42.88-1.19.64-1.9l-5.75-17.09a1.643 1.643 0 00-1.86-1.1l-8.61 1.53c-.65.11-1.18.61-1.32 1.26z"
+                  style="fill:url(#SVGID_17_)"/>
+            <linearGradient id="SVGID_18_" gradientUnits="userSpaceOnUse" x1="-816.068" y1="920.854" x2="-804.529"
+                            y2="839.612" gradientTransform="rotate(-8.082 -2795.015 -6505.71)">
+                <stop offset="0" stop-color="#C3D5FD"/>
+                <stop offset="1" stop-color="#1A90FC"/>
+            </linearGradient>
+            <path d="M204.24 487.44c5.26-1.75 12.4-.58 12.69 11.22s-11.28 30.62-7.13 37.16c4.2 6.63 13.17 16.05 18.89 21.41-1.33 6.3-4.91 11.61-4.91 11.61s-21.05-9.71-30.21-19.44c-9.17-9.73-4.54-32.03-.3-47.9 3.19-11.95 10.97-14.06 10.97-14.06z"
+                  style="fill:url(#SVGID_18_)"/>
+            <linearGradient id="SVGID_19_" gradientUnits="userSpaceOnUse" x1="-6575.898" y1="102.823" x2="-6564.359"
+                            y2="21.581" gradientTransform="scale(-1 1) rotate(-8.082 -118.103 -44396.273)">
+                <stop offset="0" stop-color="#C3D5FD"/>
+                <stop offset="1" stop-color="#1A90FC"/>
+            </linearGradient>
+            <path d="M259.39 487.44c-5.26-1.75-12.4-.58-12.69 11.22s11.28 30.62 7.13 37.16c-4.2 6.63-13.17 16.05-18.89 21.41 1.33 6.3 4.91 11.61 4.91 11.61s21.05-9.71 30.21-19.44c9.17-9.73 4.54-32.03.3-47.9-3.19-11.95-10.97-14.06-10.97-14.06z"
+                  style="fill:url(#SVGID_19_)"/>
+            <linearGradient id="SVGID_20_" gradientUnits="userSpaceOnUse" x1="232.569" y1="531.798" x2="232.569"
+                            y2="579.152">
+                <stop offset="0" stop-color="#275C89"/>
+                <stop offset="1" stop-color="#013F7C"/>
+            </linearGradient>
+            <path d="M206.79 579.15h51.1c2.31 0 4.38-1.75 5.19-4.4l10.3-33.89c1.34-4.4-1.33-9.07-5.19-9.07h-71.23c-3.82 0-6.48 4.6-5.21 8.98l9.84 33.89c.77 2.69 2.86 4.49 5.2 4.49z"
+                  style="fill:url(#SVGID_20_)"/>
+            <path class="st26"
+                  d="M204.75 594.74s-.79-1.74-1.4-1.93c-.61-.19-9.35-.54-12.53-1.36-3.19-.83-12.38-2.14-16.32 1.59-3.43 3.25-4.56 10.84.66 15.2 1.96 1.7 3.89 2.2 11.14 1.86 7.26-.34 17.78-.26 20.09-3.63-.07-5.55-1.64-11.73-1.64-11.73z"/>
+            <linearGradient id="SVGID_21_" gradientUnits="userSpaceOnUse" x1="-5720.751" y1="599.589" x2="-5703.986"
+                            y2="599.589" gradientTransform="matrix(-1 0 0 1 -5504.059 0)">
+                <stop offset="0" stop-color="#F4B9A4"/>
+                <stop offset=".652" stop-color="#FAD1BB"/>
+            </linearGradient>
+            <path d="M212.86 592.81s-8.44 1.9-11.45 1.62-.49 11.87-.49 11.87 8.05.56 15.18-1.51c2.4-9.3-3.24-11.98-3.24-11.98z"
+                  style="fill:url(#SVGID_21_)"/>
+            <linearGradient id="SVGID_22_" gradientUnits="userSpaceOnUse" x1="209.839" y1="581.112" x2="296.322"
+                            y2="581.112">
+                <stop offset="0" stop-color="#18264B"/>
+                <stop offset=".652" stop-color="#2D3C65"/>
+            </linearGradient>
+            <path d="M209.84 592.37l4.39 13.64s94.25-12.41 80.78-43c-11.27-25.57-85.17 29.36-85.17 29.36z"
+                  style="fill:url(#SVGID_22_)"/>
+            <linearGradient id="SVGID_23_" gradientUnits="userSpaceOnUse" x1="190.339" y1="591.445" x2="190.339"
+                            y2="609.24">
+                <stop offset="0" stop-color="#FFDB80"/>
+                <stop offset="1" stop-color="#FFBB24"/>
+            </linearGradient>
+            <path d="M203.66 593.42s3.45 1.35 3.89 6.17c.44 4.82-.99 8.05-8.33 8.94s-9.21.56-13.81.67-11.29.56-12.27-8.2c-.99-8.75 7.96-10.98 17.24-8.75 2.92.56 13.28 1.17 13.28 1.17z"
+                  style="fill:url(#SVGID_23_)"/>
+            <g>
+                <path class="st26"
+                      d="M263.56 594.74s.79-1.74 1.4-1.93c.61-.19 9.35-.54 12.53-1.36 3.19-.83 11.75-2.2 16.08 1.49 4.01 3.42 4.27 11-.29 15.18-1.96 1.7-4.02 2.32-11.28 1.98-7.26-.34-17.78-.26-20.09-3.63.09-5.55 1.65-11.73 1.65-11.73z"/>
+                <linearGradient id="SVGID_24_" gradientUnits="userSpaceOnUse" x1="251.623" y1="599.589" x2="268.387"
+                                y2="599.589">
+                    <stop offset="0" stop-color="#F4B9A4"/>
+                    <stop offset=".652" stop-color="#FAD1BB"/>
+                </linearGradient>
+                <path d="M255.45 592.81s8.44 1.9 11.45 1.62.49 11.87.49 11.87-8.05.56-15.18-1.51c-2.4-9.3 3.24-11.98 3.24-11.98z"
+                      style="fill:url(#SVGID_24_)"/>
+                <linearGradient id="SVGID_25_" gradientUnits="userSpaceOnUse" x1="171.993" y1="581.112" x2="258.476"
+                                y2="581.112">
+                    <stop offset="0" stop-color="#445677"/>
+                    <stop offset="1" stop-color="#293861"/>
+                </linearGradient>
+                <path d="M258.48 592.37L254.09 606s-94.25-12.41-80.78-43c11.26-25.56 85.17 29.37 85.17 29.37z"
+                      style="fill:url(#SVGID_25_)"/>
+                <linearGradient id="SVGID_26_" gradientUnits="userSpaceOnUse" x1="277.976" y1="591.445" x2="277.976"
+                                y2="609.24">
+                    <stop offset="0" stop-color="#FFDB80"/>
+                    <stop offset="1" stop-color="#FFBB24"/>
+                </linearGradient>
+                <path d="M264.66 593.42s-3.45 1.35-3.89 6.17.99 8.05 8.33 8.94c7.34.89 9.21.56 13.81.67s11.29.56 12.27-8.2c.99-8.75-7.96-10.98-17.24-8.75-2.92.56-13.28 1.17-13.28 1.17z"
+                      style="fill:url(#SVGID_26_)"/>
+            </g>
+            <linearGradient id="SVGID_27_" gradientUnits="userSpaceOnUse" x1="249.053" y1="466.067" x2="218.202"
+                            y2="466.067">
+                <stop offset="0" stop-color="#F4B9A4"/>
+                <stop offset=".652" stop-color="#FAD1BB"/>
+            </linearGradient>
+            <path d="M248.39 467.6c.56-.8.91-2.84.46-3.44-.83-.67-1.61-.28-2.21.3.14-4.88-.31-8.94-.41-9.97-.3-2.99-3.35-8.48-13.3-8.48-9.95 0-11.88 7.18-11.88 7.18s-.65 5.08-.46 11.24c-.59-.57-1.37-.93-2.18-.27-.46.6-.1 2.64.46 3.44.56.8.91 2.69 1.02 3.74.1.99-.62 3.65 2 3.31 1.56 6.25 7.89 11.47 11.82 11.47 4.3 0 10.01-5.26 11.63-11.48 2.68.37 1.95-2.31 2.04-3.31.09-1.04.45-2.93 1.01-3.73z"
+                  style="fill:url(#SVGID_27_)"/>
+            <linearGradient id="SVGID_28_" gradientUnits="userSpaceOnUse" x1="213.957" y1="454.142" x2="249.774"
+                            y2="454.142">
+                <stop offset="0" stop-color="#4F5C7C"/>
+                <stop offset="1" stop-color="#274168"/>
+            </linearGradient>
+            <path d="M240.1 443.88s-1.94-6.12-9.39-4.65c-7.44 1.46-7.95 4.98-10.87 5.12-4.99.23-8.97 6.45-2.58 13.03 2.85 2.93.44 4.19 1.79 6.78s1.34 5.12 1.34 5.12 2.38-7.6.81-10.84c-.81-1.67 2.77-2.13 7.24-1.73s11.51-1.08 12.06-4.12c1.32 6.23 2.64 6.88 4.31 7.83 1.68.95 1.78 8.48 1.78 8.48s.3-5.53 1.47-6.78c.96-2.04 2.85-10.07.72-12.02s-.32-8.19-8.68-6.22z"
+                  style="fill:url(#SVGID_28_)"/>
+        </g>
+    </g>
+</svg>

+ 197 - 0
projects/common/src/assets/svgs/404.svg

@@ -0,0 +1,197 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 800" enable-background="new 0 0 800 800">
+    <style>.st49{fill:#d4e4fe}</style>
+    <g id="图层_5">
+        <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="401.193" y1="159.763" x2="401.193"
+                        y2="715.254">
+            <stop offset="0" stop-color="#F4F2FB"/>
+            <stop offset="1" stop-color="#E1EEF5"/>
+        </linearGradient>
+        <path d="M484.45 201.12c-38.37 30.29-120.74 33.81-181.17-2.22s-172-31.38-202.22 34.87 37.19 131.33 12.78 178.98S8.08 527.79 63.87 609.15s126.6 60.62 169.22 52.45c84.17-16.13 189.79 115.67 308.62 16.13 68.47-57.35 170.44 42.09 210.17-81.36 32.78-101.86-85.67-139.5-49.97-208.03 37.96-72.88 30.67-159.24-10.46-201.06-38.31-38.96-140.75-38.46-207 13.84z"
+              style="fill:url(#SVGID_1_)"/>
+        <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="484.537" y1="604.68" x2="484.537" y2="493.367">
+            <stop offset=".34" stop-color="#B0B9E1"/>
+            <stop offset=".866" stop-color="#EAF0F8"/>
+        </linearGradient>
+        <path d="M285.1 583.44c1.77-1.63 77.74-90.07 77.74-90.07h321.13l-99.5 111.31-299.37-21.24z"
+              style="fill:url(#SVGID_2_)"/>
+        <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="616.023" y1="627.266" x2="657.332"
+                        y2="555.716">
+            <stop offset="0" stop-color="#B0B9E1"/>
+            <stop offset=".866" stop-color="#EAF0F8"/>
+        </linearGradient>
+        <path d="M604.49 620.61L659.43 556.93 633.22 624.12z" style="fill:url(#SVGID_3_)"/>
+        <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="116.275" y1="540.149" x2="116.275"
+                        y2="402.974">
+            <stop offset=".003" stop-color="#9A9ADB"/>
+            <stop offset=".789" stop-color="#CECDF1"/>
+        </linearGradient>
+        <path d="M117.06 403.22s-.22-.57-.52.04c-2.7 5.49-27.15 64.96-29.09 110.86 0 0-4.08 26.37 30.11 26.02 28.54-.29 27.78-24.6 27.68-32.79-.39-33.22-28.18-104.13-28.18-104.13z"
+              style="fill:url(#SVGID_4_)"/>
+        <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="116.277" y1="418.206" x2="116.277" y2="569.34">
+            <stop offset="0" stop-color="#ECF1FB"/>
+            <stop offset=".818" stop-color="#AFB0E7"/>
+        </linearGradient>
+        <path d="M116.28 569.34c-.55 0-1-.45-1-1V419.21c0-.55.45-1 1-1s1 .45 1 1v149.13c0 .55-.45 1-1 1z"
+              style="fill:url(#SVGID_5_)"/>
+        <linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="617.404" y1="448.627" x2="617.404"
+                        y2="360.303">
+            <stop offset=".227" stop-color="#CCD4F4"/>
+            <stop offset=".789" stop-color="#ECF1FB"/>
+        </linearGradient>
+        <path d="M617.91 360.46s-.14-.37-.33.03c-1.74 3.53-17.48 41.83-18.73 71.38 0 0-2.63 16.98 19.39 16.76 18.38-.18 17.89-15.84 17.82-21.11-.25-21.4-18.15-67.06-18.15-67.06z"
+              style="fill:url(#SVGID_6_)"/>
+        <linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="617.405" y1="370.11" x2="617.405" y2="467.422">
+            <stop offset="0" stop-color="#ECF1FB"/>
+            <stop offset="1" stop-color="#A6A8E2"/>
+        </linearGradient>
+        <path d="M617.41 467.42c-.36 0-.64-.29-.64-.64v-96.02c0-.36.29-.64.64-.64.36 0 .64.29.64.64v96.02c0 .35-.29.64-.64.64z"
+              style="fill:url(#SVGID_7_)"/>
+        <linearGradient id="SVGID_8_" gradientUnits="userSpaceOnUse" x1="463.322" y1="86.02" x2="428.568" y2="146.217">
+            <stop offset="0" stop-color="#FFDB80"/>
+            <stop offset="1" stop-color="#FFBB24"/>
+        </linearGradient>
+        <circle cx="445.95" cy="116.12" r="34.75" style="fill:url(#SVGID_8_)"/>
+        <linearGradient id="SVGID_9_" gradientUnits="userSpaceOnUse" x1="420.985" y1="116.487" x2="420.985"
+                        y2="173.941">
+            <stop offset="0" stop-color="#F9FAFE"/>
+            <stop offset="1" stop-color="#E5EDF7"/>
+        </linearGradient>
+        <path d="M465.72 135.07h-34.57c-2.23-10.61-11.65-18.58-22.93-18.58s-20.69 7.97-22.93 18.58h-9.05c-10.73 0-19.44 8.7-19.44 19.44 0 10.73 8.7 19.44 19.44 19.44h89.47c10.73 0 19.44-8.7 19.44-19.44.01-10.74-8.69-19.44-19.43-19.44z"
+              style="fill:url(#SVGID_9_)"/>
+        <g>
+            <linearGradient id="SVGID_10_" gradientUnits="userSpaceOnUse" x1="688.006" y1="537.867" x2="688.006"
+                            y2="510.039">
+                <stop offset=".227" stop-color="#AFB0E7"/>
+                <stop offset="1" stop-color="#ECF1FB"/>
+            </linearGradient>
+            <circle cx="688.01" cy="523.95" r="13.91" style="fill:url(#SVGID_10_)"/>
+            <linearGradient id="SVGID_11_" gradientUnits="userSpaceOnUse" x1="688.056" y1="513.553" x2="688.056"
+                            y2="558.349">
+                <stop offset="0" stop-color="#DDE1F6"/>
+                <stop offset=".818" stop-color="#A6A8E2"/>
+            </linearGradient>
+            <path d="M688.06 558.35c-.24 0-.43-.19-.43-.43v-43.94c0-.24.19-.43.43-.43s.43.19.43.43v43.94a.44.44 0 01-.43.43z"
+                  style="fill:url(#SVGID_11_)"/>
+        </g>
+        <g>
+            <linearGradient id="SVGID_12_" gradientUnits="userSpaceOnUse" x1="2879.853" y1="308.382" x2="2737.462"
+                            y2="450.774" gradientTransform="matrix(-1 0 0 1 3207.18 0)">
+                <stop offset="0" stop-color="#C8CBF2"/>
+                <stop offset="1" stop-color="#AFB0E7"/>
+            </linearGradient>
+            <path d="M270.73 392.79l91.4-73.3c7.43 11.92 20.65 19.87 35.7 19.87 16.43 0 30.69-9.48 37.6-23.26l92.11 76.85 10.83-12.98-98.5-82.19c0-.16.01-.31.01-.47 0-23.18-18.86-42.04-42.05-42.04-23.18 0-42.04 18.86-42.04 42.04 0 1.8.13 3.58.35 5.32l-95.98 76.97 10.57 13.19zm101.96-95.48c0-13.86 11.28-25.14 25.14-25.14s25.14 11.28 25.14 25.14-11.28 25.14-25.14 25.14-25.14-11.27-25.14-25.14z"
+                  style="fill:url(#SVGID_12_)"/>
+            <linearGradient id="SVGID_13_" gradientUnits="userSpaceOnUse" x1="2814.247" y1="259.815" x2="2814.247"
+                            y2="392.836" gradientTransform="matrix(-1 0 0 1 3207.18 0)">
+                <stop offset=".116" stop-color="#DEE4FF"/>
+                <stop offset=".847" stop-color="#C6D5F4"/>
+            </linearGradient>
+            <path d="M268.75 392.68l88.31-70.82c7.18 11.51 19.95 19.2 34.49 19.2 15.88 0 29.65-9.16 36.33-22.47l88.99 74.25 10.46-12.54-95.17-79.41c0-.15.01-.3.01-.46 0-22.4-18.22-40.62-40.62-40.62s-40.62 18.22-40.62 40.62c0 1.74.12 3.46.34 5.14l-92.73 74.37 10.21 12.74zm98.51-92.24c0-13.4 10.9-24.29 24.29-24.29 13.4 0 24.29 10.9 24.29 24.29 0 13.4-10.9 24.29-24.29 24.29-13.4 0-24.29-10.9-24.29-24.29z"
+                  style="fill:url(#SVGID_13_)"/>
+            <linearGradient id="SVGID_14_" gradientUnits="userSpaceOnUse" x1="2966.463" y1="329.794" x2="2654.707"
+                            y2="641.55" gradientTransform="matrix(-1 0 0 1 3203.43 0)">
+                <stop offset="0" stop-color="#C8CBF2"/>
+                <stop offset="1" stop-color="#AFB0E7"/>
+            </linearGradient>
+            <path d="M230.6 619.91h326.35c17.89 0 32.39-14.5 32.39-32.39V388.31c0-21.39-17.34-38.72-38.72-38.72H230.6c-17.89 0-32.39 14.5-32.39 32.39v205.54c-.01 17.88 14.5 32.39 32.39 32.39z"
+                  style="fill:url(#SVGID_14_)"/>
+            <linearGradient id="SVGID_15_" gradientUnits="userSpaceOnUse" x1="2716.773" y1="319.563" x2="2914.293"
+                            y2="661.678" gradientTransform="matrix(-1 0 0 1 3203.43 0)">
+                <stop offset="0" stop-color="#EBF2FA"/>
+                <stop offset=".525" stop-color="#FDFEFF"/>
+            </linearGradient>
+            <path d="M223.6 619.91h328.59c14.03 0 25.4-11.37 25.4-25.4V386.73c0-14.03-11.37-25.4-25.4-25.4H223.6c-14.03 0-25.4 11.37-25.4 25.4v207.78c0 14.03 11.38 25.4 25.4 25.4z"
+                  style="fill:url(#SVGID_15_)"/>
+            <linearGradient id="SVGID_16_" gradientUnits="userSpaceOnUse" x1="2815.495" y1="361.334" x2="2815.495"
+                            y2="425.526" gradientTransform="matrix(-1 0 0 1 3203.43 0)">
+                <stop offset=".116" stop-color="#DEE4FF"/>
+                <stop offset=".847" stop-color="#BACBEE"/>
+            </linearGradient>
+            <path d="M198.24 425.53h379.39v-38.79c0-14.03-11.37-25.4-25.4-25.4H223.64c-14.03 0-25.4 11.37-25.4 25.4v38.79z"
+                  style="fill:url(#SVGID_16_)"/>
+            <linearGradient id="SVGID_17_" gradientUnits="userSpaceOnUse" x1="276.445" y1="488.742" x2="350.685"
+                            y2="531.604">
+                <stop offset=".116" stop-color="#DEE4FF"/>
+                <stop offset=".847" stop-color="#BACBEE"/>
+            </linearGradient>
+            <path d="M328.82 457.46H307.7c-1.27 0-2.46.59-3.24 1.59L261.91 514c-.56.72-.86 1.6-.86 2.51v23.15c0 2.26 1.83 4.09 4.09 4.09h41.34c2.26 0 4.09 1.83 4.09 4.09v13.46c0 2.26 1.83 4.09 4.09 4.09h14.14c2.26 0 4.09-1.83 4.09-4.09v-13.46c0-2.26 1.83-4.09 4.09-4.09s4.09-1.83 4.09-4.09V525.5c0-2.26-1.83-4.09-4.09-4.09s-4.09-1.83-4.09-4.09v-55.77a4.059 4.059 0 00-4.07-4.09zm-39.3 57.35l13.74-17.74c2.39-3.08 7.33-1.4 7.33 2.51v17.74c0 2.26-1.83 4.09-4.09 4.09h-13.74c-3.41 0-5.33-3.91-3.24-6.6z"
+                  style="fill:url(#SVGID_17_)"/>
+            <linearGradient id="SVGID_18_" gradientUnits="userSpaceOnUse" x1="455.095" y1="488.742" x2="529.335"
+                            y2="531.604">
+                <stop offset=".116" stop-color="#DEE4FF"/>
+                <stop offset=".847" stop-color="#BACBEE"/>
+            </linearGradient>
+            <path d="M511.56 517.32v-55.77c0-2.26-1.83-4.09-4.09-4.09h-21.12c-1.27 0-2.46.59-3.24 1.59L440.56 514c-.56.72-.86 1.6-.86 2.51v23.15c0 2.26 1.83 4.09 4.09 4.09h41.34c2.26 0 4.09 1.83 4.09 4.09v13.46c0 2.26 1.83 4.09 4.09 4.09h14.14c2.26 0 4.09-1.83 4.09-4.09v-13.46c0-2.26 1.83-4.09 4.09-4.09s4.09-1.83 4.09-4.09V525.5c0-2.26-1.83-4.09-4.09-4.09-2.24 0-4.07-1.83-4.07-4.09zm-43.39-2.51l13.74-17.74c2.39-3.08 7.33-1.4 7.33 2.51v17.74c0 2.26-1.83 4.09-4.09 4.09H471.4c-3.4 0-5.32-3.91-3.23-6.6z"
+                  style="fill:url(#SVGID_18_)"/>
+            <linearGradient id="SVGID_19_" gradientUnits="userSpaceOnUse" x1="339.488" y1="482.174" x2="441.31"
+                            y2="540.961">
+                <stop offset=".116" stop-color="#DEE4FF"/>
+                <stop offset=".847" stop-color="#BACBEE"/>
+            </linearGradient>
+            <path d="M356.4 566.16h68c2.26 0 4.09-1.83 4.09-4.09v-101c0-2.26-1.83-4.09-4.09-4.09h-68c-2.26 0-4.09 1.83-4.09 4.09v101c0 2.26 1.83 4.09 4.09 4.09zm49.76-82.76v56.34c0 2.26-1.83 4.09-4.09 4.09h-23.34c-2.26 0-4.09-1.83-4.09-4.09V483.4c0-2.26 1.83-4.09 4.09-4.09h23.34c2.26 0 4.09 1.83 4.09 4.09z"
+                  style="fill:url(#SVGID_19_)"/>
+        </g>
+        <g>
+            <linearGradient id="SVGID_20_" gradientUnits="userSpaceOnUse" x1="871.514" y1="4485.232" x2="872.065"
+                            y2="4498.77" gradientTransform="rotate(2.333 95904.663 -3670.234)">
+                <stop offset="0" stop-color="#FFDB80"/>
+                <stop offset="1" stop-color="#FFBB24"/>
+            </linearGradient>
+            <path d="M605.95 610.6s3.25 4.88 10.55 1.06c3.91 2.72 8.92 4.97 12.39 5.88 3.47.91 3.68 5.4 3.12 6.61-4.66-.47-18.14.64-27.3-2.94.72-7.53 1.24-10.61 1.24-10.61z"
+                  style="fill:url(#SVGID_20_)"/>
+            <path class="st49"
+                  d="M604.06 623.84l.43-3.23s10.54 2.63 28.38 1.03c.17 1.66.35 2.48.35 2.48s-13.56 2.02-29.16-.28z"/>
+            <linearGradient id="SVGID_21_" gradientUnits="userSpaceOnUse" x1="-1427.263" y1="-235.579" x2="-1409.896"
+                            y2="-215.318" gradientTransform="rotate(40.6 -1575.457 2818.52)">
+                <stop offset="0" stop-color="#FFDB80"/>
+                <stop offset="1" stop-color="#FFBB24"/>
+            </linearGradient>
+            <path d="M520.47 596.12s-.05 5.81 7.27 7.94c1.95 5-3.73 11.79 5.37 12.42 3.34.23 1.75 5.12.73 5.63-10.95 4.01-14.63-10.12-19.62-18.98 4.32-5.09 6.25-7.01 6.25-7.01z"
+                  style="fill:url(#SVGID_21_)"/>
+            <linearGradient id="SVGID_22_" gradientUnits="userSpaceOnUse" x1="-3772.01" y1="604.486" x2="-3772.01"
+                            y2="502.198" gradientTransform="matrix(-1 0 0 1 -3222.68 0)">
+                <stop offset="0" stop-color="#445677"/>
+                <stop offset="1" stop-color="#293861"/>
+            </linearGradient>
+            <path d="M569.3 502.2s-14.44-.26-17.67 18.85c-3.23 19.11 1.57 23.66-5.38 37.29-3.62 7.1-27.15 41.12-27.15 41.12l6.83 5.03s37.94-34.72 43.52-48.71 9.83-28.83 10.13-41.46c.28-12.62-10.28-12.12-10.28-12.12z"
+                  style="fill:url(#SVGID_22_)"/>
+            <linearGradient id="SVGID_23_" gradientUnits="userSpaceOnUse" x1="-3839.642" y1="559.801" x2="-3786.238"
+                            y2="559.801" gradientTransform="matrix(-1 0 0 1 -3222.68 0)">
+                <stop offset="0" stop-color="#445677"/>
+                <stop offset="1" stop-color="#293861"/>
+            </linearGradient>
+            <path d="M572.72 506.19s14.87 3.53 15.75 3.98c.44.23 2.89 7.07 5.24 13.95 5.04 6.87 23.02 32.28 23.21 45.51.29 20.13-.96 43.67-.96 43.67l-9.24.11s-3.5-38.9-5.85-42.31c-.42-.61-1.29-1.95-2.42-3.74-5.14-6.22-16.5-16.65-28.16-27.07-16.45-14.66 2.43-34.1 2.43-34.1z"
+                  style="fill:url(#SVGID_23_)"/>
+            <linearGradient id="SVGID_24_" gradientUnits="userSpaceOnUse" x1="5317.908" y1="132.095" x2="5317.908"
+                            y2="56.817" gradientTransform="rotate(26.086 2112.504 -9908.036)">
+                <stop offset="0" stop-color="#C3D5FD"/>
+                <stop offset="1" stop-color="#1A90FC"/>
+            </linearGradient>
+            <path d="M603.14 448.91s-10.69-8.37-16.99-4.36c-6.3 4-14.27 18.91-14.27 18.91l8.85 4.38-23.8 39.67 40.69 21.83 14.6-42.28 11.79.69s7.96-25.24-3.62-27.43c-5.45-2.3-7.04-3.34-7.04-3.34s-3.49 4.27-7.99 1.18-2.22-9.25-2.22-9.25z"
+                  style="fill:url(#SVGID_24_)"/>
+            <linearGradient id="SVGID_25_" gradientUnits="userSpaceOnUse" x1="5161.945" y1="1134.369" x2="5171.26"
+                            y2="1068.78" gradientTransform="rotate(18.006 4848.87 -13687.47)">
+                <stop offset="0" stop-color="#C3D5FD"/>
+                <stop offset="1" stop-color="#1A90FC"/>
+            </linearGradient>
+            <path d="M589.15 443.6c3.88.61 8.04 4.05 4.56 12.85-3.48 8.8-16.66 18.5-16.06 24.82.6 6.4 3.37 16.58 5.33 22.6-2.8 4.17-6.72 6.78-6.72 6.78s-10.33-14.75-13.12-25.23 7.07-25.25 14.69-35.41c5.73-7.67 11.32-6.41 11.32-6.41z"
+                  style="fill:url(#SVGID_25_)"/>
+            <linearGradient id="SVGID_26_" gradientUnits="userSpaceOnUse" x1="-8924.659" y1="-865.525" x2="-8915.544"
+                            y2="-929.706" gradientTransform="scale(-1 1) rotate(-34.172 -2504.53 -13720.806)">
+                <stop offset="0" stop-color="#C3D5FD"/>
+                <stop offset="1" stop-color="#1A90FC"/>
+            </linearGradient>
+            <path d="M624.12 463.5c-2.79-3.19-7.68-4.9-11.53 3.69s-2.35 26.64-7.02 29.97c-4.72 3.37-13.34 7.07-18.62 8.96-1.12 5.12-.49 10.33-.49 10.33s16.36.44 25.19-3.42c8.83-3.86 12.82-21.97 15.06-35.2 1.69-9.97-2.59-14.33-2.59-14.33z"
+                  style="fill:url(#SVGID_26_)"/>
+            <linearGradient id="SVGID_27_" gradientUnits="userSpaceOnUse" x1="-3813.896" y1="480.898" x2="-3841.811"
+                            y2="423.883" gradientTransform="matrix(-1 0 0 1 -3222.68 0)">
+                <stop offset="0" stop-color="#4F5C7C"/>
+                <stop offset="1" stop-color="#274168"/>
+            </linearGradient>
+            <path d="M590.9 439.68c.43-4.69 4.5-7.9 9.3-7.17.4-1.31 4.44-2.98 5.38-4.6 3.5-6.03 9.26-7 14-3.56 9.79 2.79 8.01 12.2 4.75 21.55 2.8 5.61 1.52 12.41-.06 15.18 4.75 5.07 2.09 11.58-1.39 16.52-.4.56-.82 1.06-1.25 1.52-.21 5.85-8.34 7.86-11.32 4.89-3.17-3.16-3.57-4.49-9.32-1.76-5.75 2.73-11.24-1.54-11.3-7.34-.06-5.8-4.28-4.1-6.12-5.63-3.33-2.77-1.15-5.93-1.15-5.93s-4.85-.26-6.01-7.38c-1.33-16.99 11.95-17.08 14.49-16.29z"
+                  style="fill:url(#SVGID_27_)"/>
+            <path class="st49"
+                  d="M515.38 601.24s4.92 12.03 5.91 13.61 5.9 9.27 14.26 5.05c-.04 1.49-.11 2.43-.11 2.43s-9.42 6.26-15.33-4.62c-5.91-10.88-6.75-14.63-6.75-14.63l2.02-1.84z"/>
+        </g>
+    </g>
+</svg>

+ 325 - 0
projects/common/src/assets/svgs/500.svg

@@ -0,0 +1,325 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 800" enable-background="new 0 0 800 800">
+    <style>.st26{fill:#fff}</style>
+    <g id="图层_16">
+        <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="402.832" y1="159.843" x2="402.832"
+                        y2="715.335">
+            <stop offset="0" stop-color="#F4F2FB"/>
+            <stop offset="1" stop-color="#E1EEF5"/>
+        </linearGradient>
+        <path d="M486.09 201.2c-38.37 30.29-120.74 33.81-181.17-2.22s-172-31.38-202.22 34.87 37.19 131.33 12.78 178.98S9.72 527.87 65.5 609.23s126.6 60.62 169.22 52.45c84.17-16.13 189.79 115.67 308.62 16.13 68.47-57.35 170.44 42.09 210.17-81.36 32.78-101.86-85.67-139.5-49.97-208.03 37.96-72.88 30.67-159.24-10.46-201.06-38.3-38.96-140.75-38.46-206.99 13.84z"
+              style="fill:url(#SVGID_1_)"/>
+        <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="117.913" y1="540.229" x2="117.913"
+                        y2="403.055">
+            <stop offset=".227" stop-color="#B7ACE0"/>
+            <stop offset=".789" stop-color="#E8E7FA"/>
+        </linearGradient>
+        <path d="M118.7 403.3s-.22-.57-.52.04c-2.7 5.49-27.15 64.96-29.09 110.86 0 0-4.08 26.37 30.11 26.02 28.54-.29 27.78-24.6 27.68-32.79-.39-33.22-28.18-104.13-28.18-104.13z"
+              style="fill:url(#SVGID_2_)"/>
+        <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="117.915" y1="418.287" x2="117.915" y2="569.42">
+            <stop offset="0" stop-color="#ECF1FB"/>
+            <stop offset=".818" stop-color="#AFB0E7"/>
+        </linearGradient>
+        <path d="M117.92 569.42c-.55 0-1-.45-1-1V419.29c0-.55.45-1 1-1s1 .45 1 1v149.13c0 .55-.45 1-1 1z"
+              style="fill:url(#SVGID_3_)"/>
+        <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="619.042" y1="448.707" x2="619.042"
+                        y2="360.383">
+            <stop offset=".227" stop-color="#CCD4F4"/>
+            <stop offset=".789" stop-color="#ECF1FB"/>
+        </linearGradient>
+        <path d="M619.55 360.54s-.14-.37-.33.03c-1.74 3.53-17.48 41.83-18.73 71.38 0 0-2.63 16.98 19.39 16.76 18.38-.18 17.89-15.84 17.82-21.11-.26-21.4-18.15-67.06-18.15-67.06z"
+              style="fill:url(#SVGID_4_)"/>
+        <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="619.043" y1="370.19" x2="619.043" y2="467.503">
+            <stop offset="0" stop-color="#ECF1FB"/>
+            <stop offset="1" stop-color="#A6A8E2"/>
+        </linearGradient>
+        <path d="M619.04 467.5c-.36 0-.64-.29-.64-.64v-96.02c0-.36.29-.64.64-.64s.64.29.64.64v96.02c.01.35-.28.64-.64.64z"
+              style="fill:url(#SVGID_5_)"/>
+        <linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="464.96" y1="86.101" x2="430.206" y2="146.297">
+            <stop offset="0" stop-color="#FFDB80"/>
+            <stop offset="1" stop-color="#FFBB24"/>
+        </linearGradient>
+        <circle cx="447.58" cy="116.2" r="34.75" style="fill:url(#SVGID_6_)"/>
+        <linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="422.623" y1="116.567" x2="422.623"
+                        y2="174.021">
+            <stop offset="0" stop-color="#F9FAFE"/>
+            <stop offset="1" stop-color="#E5EDF7"/>
+        </linearGradient>
+        <path d="M467.36 135.15h-34.57c-2.23-10.61-11.65-18.58-22.93-18.58s-20.69 7.97-22.93 18.58h-9.05c-10.73 0-19.44 8.7-19.44 19.44 0 10.73 8.7 19.44 19.44 19.44h89.47c10.73 0 19.44-8.7 19.44-19.44.01-10.74-8.7-19.44-19.43-19.44z"
+              style="fill:url(#SVGID_7_)"/>
+        <linearGradient id="SVGID_8_" gradientUnits="userSpaceOnUse" x1="689.644" y1="537.948" x2="689.644"
+                        y2="510.119">
+            <stop offset=".227" stop-color="#AFB0E7"/>
+            <stop offset="1" stop-color="#ECF1FB"/>
+        </linearGradient>
+        <circle cx="689.64" cy="524.03" r="13.91" style="fill:url(#SVGID_8_)"/>
+        <linearGradient id="SVGID_9_" gradientUnits="userSpaceOnUse" x1="689.694" y1="513.633" x2="689.694"
+                        y2="558.429">
+            <stop offset="0" stop-color="#DDE1F6"/>
+            <stop offset=".818" stop-color="#A6A8E2"/>
+        </linearGradient>
+        <path d="M689.69 558.43c-.24 0-.43-.19-.43-.43v-43.94c0-.24.19-.43.43-.43s.43.19.43.43V558c0 .24-.19.43-.43.43z"
+              style="fill:url(#SVGID_9_)"/>
+        <linearGradient id="SVGID_10_" gradientUnits="userSpaceOnUse" x1="289.384" y1="477.19" x2="289.384"
+                        y2="411.226">
+            <stop offset="0" stop-color="#B0B9E1"/>
+            <stop offset="1" stop-color="#E7EFF7"/>
+        </linearGradient>
+        <path d="M202.07 451.28L270.1 411.23 376.7 411.23 315.15 477.19 237.41 476.01z" style="fill:url(#SVGID_10_)"/>
+        <linearGradient id="SVGID_11_" gradientUnits="userSpaceOnUse" x1="454.145" y1="502.809" x2="454.145"
+                        y2="420.65">
+            <stop offset="0" stop-color="#B0B9E1"/>
+            <stop offset="1" stop-color="#E7EFF7"/>
+        </linearGradient>
+        <path d="M386.71 479.55L431.76 420.65 521.58 420.65 423.81 502.81 394.37 495.15z" style="fill:url(#SVGID_11_)"/>
+        <linearGradient id="SVGID_12_" gradientUnits="userSpaceOnUse" x1="589.016" y1="472.132" x2="589.016"
+                        y2="397.68">
+            <stop offset="0" stop-color="#B0B9E1"/>
+            <stop offset="1" stop-color="#E7EFF7"/>
+        </linearGradient>
+        <path d="M501.26 458.64l64.79-60.96h110.72l-48.99 66.61a19.243 19.243 0 01-17.85 7.7l-108.67-13.35z"
+              style="fill:url(#SVGID_12_)"/>
+        <linearGradient id="SVGID_13_" gradientUnits="userSpaceOnUse" x1="314.267" y1="607.349" x2="314.267"
+                        y2="497.361">
+            <stop offset="0" stop-color="#B0B9E1"/>
+            <stop offset="1" stop-color="#E7EFF7"/>
+        </linearGradient>
+        <path d="M212.23 592.77L303.67 497.36 416.3 497.36 297.04 607.35 247.57 604.7z" style="fill:url(#SVGID_13_)"/>
+        <g>
+            <linearGradient id="SVGID_14_" gradientUnits="userSpaceOnUse" x1="515.604" y1="312.867" x2="613.092"
+                            y2="481.721">
+                <stop offset="0" stop-color="#C8CBF2"/>
+                <stop offset="1" stop-color="#AFB0E7"/>
+            </linearGradient>
+            <path d="M564.35 296.53c-41.79 0-75.67 33.6-75.67 75.05v51.43c0 41.45 33.88 75.05 75.67 75.05s75.67-33.6 75.67-75.05v-51.43c-.01-41.45-33.88-75.05-75.67-75.05zm23.82 137.83c0 13.05-10.67 23.63-23.82 23.63-13.16 0-23.82-10.58-23.82-23.63v-74.13c0-13.05 10.67-23.63 23.82-23.63 13.16 0 23.82 10.58 23.82 23.63v74.13z"
+                  style="fill:url(#SVGID_14_)"/>
+            <linearGradient id="SVGID_15_" gradientUnits="userSpaceOnUse" x1="513.839" y1="321.619" x2="606.64"
+                            y2="482.355">
+                <stop offset=".116" stop-color="#DEE4FF"/>
+                <stop offset=".847" stop-color="#BACBEE"/>
+            </linearGradient>
+            <path d="M560.24 305.91c-39.52 0-71.56 32.04-71.56 71.56v49.03c0 39.52 32.04 71.56 71.56 71.56s71.56-32.04 71.56-71.56v-49.03c0-39.52-32.04-71.56-71.56-71.56zm22.53 131.41c0 12.44-10.09 22.53-22.53 22.53-12.44 0-22.53-10.09-22.53-22.53v-70.67c0-12.44 10.09-22.53 22.53-22.53 12.44 0 22.53 10.09 22.53 22.53v70.67z"
+                  style="fill:url(#SVGID_15_)"/>
+            <linearGradient id="SVGID_16_" gradientUnits="userSpaceOnUse" x1="217.031" y1="307.363" x2="316.583"
+                            y2="479.793">
+                <stop offset="0" stop-color="#C8CBF2"/>
+                <stop offset="1" stop-color="#AFB0E7"/>
+            </linearGradient>
+            <path d="M333.72 412.6c-5.55-58.15-65.99-54.01-90.14-49.98l2.26-15.28 71.49 5.88 8.98-5.88V307.2h-109l-9.09 7.47-14.81 92.41h43.6c22.73-19.99 38.77-11.37 45.38 0 6.34 10.92 7.27 43.26-19.71 43.87-23.34.53-23.13-19.92-23.13-19.92l-41.55.58-8.06 7.52s6.18 59.41 69.73 59.41 77.3-50.09 74.05-85.94z"
+                  style="fill:url(#SVGID_16_)"/>
+            <linearGradient id="SVGID_17_" gradientUnits="userSpaceOnUse" x1="212.735" y1="311.982" x2="309.699"
+                            y2="479.928">
+                <stop offset=".116" stop-color="#DEE4FF"/>
+                <stop offset=".847" stop-color="#BACBEE"/>
+            </linearGradient>
+            <path d="M324.26 415.94c-5.19-55.89-61.65-51.92-84.21-48.04l2.11-14.69h75.17v-38.58H208.14l-14.95 96h40.73c21.23-19.21 36.22-10.93 42.39 0 5.92 10.49 6.79 46.38-18.41 46.97-21.8.51-24.41-19.14-24.41-19.14l-43.54.66s5.78 59.41 65.14 59.41 72.2-48.14 69.17-82.59z"
+                  style="fill:url(#SVGID_17_)"/>
+            <linearGradient id="SVGID_18_" gradientUnits="userSpaceOnUse" x1="368.459" y1="304.731" x2="452.448"
+                            y2="450.205">
+                <stop offset="0" stop-color="#C8CBF2"/>
+                <stop offset="1" stop-color="#AFB0E7"/>
+            </linearGradient>
+            <path d="M387.26 461.26s-54.09-36.72-56.49-83.83c-2.29-45.03 25.47-81.27 76.27-81.27 55.29 0 78.12 47.95 78.12 73.99 0 26.04-10.63 63.25-55.73 93.35-23.53 0-42.17-2.24-42.17-2.24z"
+                  style="fill:url(#SVGID_18_)"/>
+            <linearGradient id="SVGID_19_" gradientUnits="userSpaceOnUse" x1="366.623" y1="312.428" x2="445.175"
+                            y2="448.483">
+                <stop offset=".116" stop-color="#DEE4FF"/>
+                <stop offset=".847" stop-color="#BACBEE"/>
+            </linearGradient>
+            <path d="M384.76 461.29s-51.7-34.94-53.99-79.77c-2.19-42.85 24.35-77.34 72.9-77.34 52.85 0 73.47 45.54 73.47 70.32 0 24.78-12.03 58.72-55.14 87.36-22.49.01-37.24-.57-37.24-.57z"
+                  style="fill:url(#SVGID_19_)"/>
+            <linearGradient id="SVGID_20_" gradientUnits="userSpaceOnUse" x1="400.418" y1="454.748" x2="417.994"
+                            y2="485.191">
+                <stop offset="0" stop-color="#C8CBF2"/>
+                <stop offset="1" stop-color="#AFB0E7"/>
+            </linearGradient>
+            <path d="M414.59 486.78h-16.64c-.85 0-1.64-.44-2.08-1.17l-11.39-18.8c-.7-1.15-.33-2.64.82-3.34 1.15-.69 2.64-.33 3.34.82l10.68 17.62h13.84l10.6-19.05c.65-1.17 2.13-1.6 3.31-.94 1.17.65 1.6 2.13.94 3.31l-11.29 20.3c-.44.77-1.25 1.25-2.13 1.25z"
+                  style="fill:url(#SVGID_20_)"/>
+            <linearGradient id="SVGID_21_" gradientUnits="userSpaceOnUse" x1="397.841" y1="454.748" x2="415.417"
+                            y2="485.191">
+                <stop offset=".116" stop-color="#DEE4FF"/>
+                <stop offset=".847" stop-color="#BACBEE"/>
+            </linearGradient>
+            <path d="M412.01 486.78h-16.64c-.85 0-1.64-.44-2.08-1.17l-11.39-18.8c-.7-1.15-.33-2.64.82-3.34 1.15-.69 2.64-.33 3.34.82l10.68 17.62h13.84l10.6-19.05c.65-1.17 2.13-1.6 3.31-.94 1.17.65 1.6 2.13.94 3.31l-11.29 20.3c-.43.77-1.25 1.25-2.13 1.25z"
+                  style="fill:url(#SVGID_21_)"/>
+            <linearGradient id="SVGID_22_" gradientUnits="userSpaceOnUse" x1="395.626" y1="441.888" x2="415.816"
+                            y2="476.856">
+                <stop offset="0" stop-color="#C8CBF2"/>
+                <stop offset="1" stop-color="#AFB0E7"/>
+            </linearGradient>
+            <path d="M429.22 468.35h-47.66c-2.76 0-5-2.24-5-5V452.9h57.65v10.45c0 2.76-2.23 5-4.99 5z"
+                  style="fill:url(#SVGID_22_)"/>
+            <linearGradient id="SVGID_23_" gradientUnits="userSpaceOnUse" x1="395.022" y1="445.756" x2="412.776"
+                            y2="476.507">
+                <stop offset=".116" stop-color="#DEE4FF"/>
+                <stop offset=".847" stop-color="#BACBEE"/>
+            </linearGradient>
+            <path d="M425.57 468.35h-44.01c-2.76 0-5-2.24-5-5v-6.93h54.01v6.93c0 2.76-2.24 5-5 5z"
+                  style="fill:url(#SVGID_23_)"/>
+            <linearGradient id="SVGID_24_" gradientUnits="userSpaceOnUse" x1="396.171" y1="472.261" x2="416.697"
+                            y2="507.813">
+                <stop offset="0" stop-color="#C8CBF2"/>
+                <stop offset="1" stop-color="#AFB0E7"/>
+            </linearGradient>
+            <path d="M418.79 505.46h-25.7c-4.09 0-7.4-3.31-7.4-7.4v-19.75h40.5v19.75c0 4.09-3.31 7.4-7.4 7.4z"
+                  style="fill:url(#SVGID_24_)"/>
+            <linearGradient id="SVGID_25_" gradientUnits="userSpaceOnUse" x1="395.099" y1="476.159" x2="413.018"
+                            y2="507.195">
+                <stop offset=".116" stop-color="#DEE4FF"/>
+                <stop offset=".847" stop-color="#BACBEE"/>
+            </linearGradient>
+            <path d="M414.04 505.46h-20.95c-4.09 0-7.4-3.31-7.4-7.4v-16.47h35.75v16.47c0 4.09-3.31 7.4-7.4 7.4z"
+                  style="fill:url(#SVGID_25_)"/>
+            <linearGradient id="SVGID_26_" gradientUnits="userSpaceOnUse" x1="370.752" y1="345.042" x2="439.366"
+                            y2="413.656">
+                <stop offset="0" stop-color="#C8CBF2"/>
+                <stop offset="1" stop-color="#AFB0E7"/>
+            </linearGradient>
+            <path d="M404.4 311.4s-17.23 79.51 1.33 135.9c47.84-62.43-1.33-135.9-1.33-135.9z"
+                  style="fill:url(#SVGID_26_)"/>
+            <linearGradient id="SVGID_27_" gradientUnits="userSpaceOnUse" x1="352.936" y1="350.49" x2="415.513"
+                            y2="413.067">
+                <stop offset="0" stop-color="#C8CBF2"/>
+                <stop offset="1" stop-color="#AFB0E7"/>
+            </linearGradient>
+            <path d="M386.43 316.99s-15.24 26.94-16.34 62.72c-.75 24.43 11.93 66.85 11.93 66.85s-20.76-36.07-20.76-70.23 25.17-59.34 25.17-59.34z"
+                  style="fill:url(#SVGID_27_)"/>
+            <linearGradient id="SVGID_28_" gradientUnits="userSpaceOnUse" x1="389.798" y1="347.846" x2="456.792"
+                            y2="414.84">
+                <stop offset="0" stop-color="#C8CBF2"/>
+                <stop offset="1" stop-color="#AFB0E7"/>
+            </linearGradient>
+            <path d="M420.65 316.99s34.1 22.12 34.1 60.99-29.68 68.58-29.68 68.58 23.5-42.18 23.5-70.9c0-14.24-13.98-48.76-27.92-58.67z"
+                  style="fill:url(#SVGID_28_)"/>
+            <path class="st26"
+                  d="M386.43 316.99s-62.13 47.12-4.42 129.57c-7.06-15.6-36.21-73.62 4.42-129.57zM420.65 316.99s62.13 47.12 4.42 129.57c7.07-15.6 36.22-73.62-4.42-129.57zM404.4 311.4s-35.48 79.66 1.33 135.9c32.24-57.5-1.33-135.9-1.33-135.9z"/>
+        </g>
+        <g>
+            <linearGradient id="SVGID_29_" gradientUnits="userSpaceOnUse" x1="234.692" y1="561.708" x2="234.692"
+                            y2="486.088">
+                <stop offset="0" stop-color="#C3D5FD"/>
+                <stop offset="1" stop-color="#1A90FC"/>
+            </linearGradient>
+            <path d="M226.89 486.45s-18.35-2.54-24.31 5.89c-5.96 8.43-8.14 30.01-8.14 30.01l13.81-.73-1.16 25.14 25.48 14.94 36.3-19.52-5.52-22.78 11.6-3.03s-3.46-33.06-19.59-28.18c-8.29.89-10.9.74-10.9.74s-2.18 6.95-9.67 6.36c-7.49-.58-7.9-8.84-7.9-8.84z"
+                  style="fill:url(#SVGID_29_)"/>
+            <linearGradient id="SVGID_30_" gradientUnits="userSpaceOnUse" x1="235.741" y1="473.191" x2="235.741"
+                            y2="497.147">
+                <stop offset="0" stop-color="#F4AE98"/>
+                <stop offset="1" stop-color="#FAD1BB"/>
+            </linearGradient>
+            <path d="M228.72 476.05l-3.81 17.01c-.18.8.24 1.61 1 1.92 1.97.8 5.91 2.17 9.97 2.17 4.21 0 8.18-2.3 10-3.53.63-.42.89-1.21.65-1.93l-5.83-17.35a1.681 1.681 0 00-1.89-1.12l-8.74 1.55c-.67.11-1.2.62-1.35 1.28z"
+                  style="fill:url(#SVGID_30_)"/>
+            <linearGradient id="SVGID_31_" gradientUnits="userSpaceOnUse" x1="-1535.437" y1="750.954" x2="-1523.728"
+                            y2="668.51" gradientTransform="rotate(-8.082 -1929.216 -11692.611)">
+                <stop offset="0" stop-color="#C3D5FD"/>
+                <stop offset="1" stop-color="#1A90FC"/>
+            </linearGradient>
+            <path d="M205.94 489.39c5.34-1.77 12.58-.59 12.88 11.39.29 11.98-11.45 31.07-7.24 37.71 4.26 6.73 13.37 16.29 19.17 21.73-1.35 6.4-4.99 11.78-4.99 11.78s-21.36-9.86-30.66-19.73c-9.3-9.87-4.61-32.5-.3-48.61 3.24-12.13 11.14-14.27 11.14-14.27z"
+                  style="fill:url(#SVGID_31_)"/>
+            <linearGradient id="SVGID_32_" gradientUnits="userSpaceOnUse" x1="-5585.118" y1="175.804" x2="-5573.409"
+                            y2="93.36" gradientTransform="scale(-1 1) rotate(-8.082 -118.041 -37329.02)">
+                <stop offset="0" stop-color="#C3D5FD"/>
+                <stop offset="1" stop-color="#1A90FC"/>
+            </linearGradient>
+            <path d="M261.91 489.39c-5.34-1.77-12.58-.59-12.88 11.39-.29 11.98 11.45 31.07 7.24 37.71-4.26 6.73-13.37 16.29-19.17 21.73 1.35 6.4 4.99 11.78 4.99 11.78s21.36-9.86 30.66-19.73c9.3-9.87 4.61-32.5.3-48.61-3.24-12.13-11.14-14.27-11.14-14.27z"
+                  style="fill:url(#SVGID_32_)"/>
+            <linearGradient id="SVGID_33_" gradientUnits="userSpaceOnUse" x1="234.692" y1="534.399" x2="234.692"
+                            y2="582.454">
+                <stop offset="0" stop-color="#275C89"/>
+                <stop offset="1" stop-color="#013F7C"/>
+            </linearGradient>
+            <path d="M208.53 582.45h51.85c2.35 0 4.45-1.78 5.26-4.46l10.45-34.39c1.36-4.46-1.35-9.21-5.26-9.21h-72.29c-3.87 0-6.58 4.67-5.29 9.11l9.98 34.39c.8 2.74 2.92 4.56 5.3 4.56z"
+                  style="fill:url(#SVGID_33_)"/>
+            <path class="st26"
+                  d="M206.46 598.27s-.8-1.76-1.42-1.95c-.62-.19-9.49-.54-12.72-1.38s-12.56-2.17-16.56 1.61c-3.48 3.3-4.63 11 .67 15.43 1.99 1.73 3.94 2.23 11.31 1.89s18.04-.27 20.38-3.68c-.07-5.65-1.66-11.92-1.66-11.92z"/>
+            <linearGradient id="SVGID_34_" gradientUnits="userSpaceOnUse" x1="-3991.106" y1="603.193" x2="-3974.093"
+                            y2="603.193" gradientTransform="matrix(-1 0 0 1 -3772.525 0)">
+                <stop offset="0" stop-color="#F4B9A4"/>
+                <stop offset=".652" stop-color="#FAD1BB"/>
+            </linearGradient>
+            <path d="M214.69 596.31s-8.56 1.92-11.62 1.64c-3.06-.28-.5 12.05-.5 12.05s8.17.57 15.4-1.53c2.45-9.44-3.28-12.16-3.28-12.16z"
+                  style="fill:url(#SVGID_34_)"/>
+            <linearGradient id="SVGID_35_" gradientUnits="userSpaceOnUse" x1="211.625" y1="584.443" x2="299.388"
+                            y2="584.443">
+                <stop offset="0" stop-color="#18264B"/>
+                <stop offset=".652" stop-color="#2D3C65"/>
+            </linearGradient>
+            <path d="M211.63 595.87l4.45 13.84s95.64-12.6 81.97-43.63c-11.43-25.96-86.42 29.79-86.42 29.79z"
+                  style="fill:url(#SVGID_35_)"/>
+            <linearGradient id="SVGID_36_" gradientUnits="userSpaceOnUse" x1="191.837" y1="594.929" x2="191.837"
+                            y2="612.987">
+                <stop offset="0" stop-color="#FFDB80"/>
+                <stop offset="1" stop-color="#FFBB24"/>
+            </linearGradient>
+            <path d="M205.35 596.94s3.5 1.37 3.95 6.26c.44 4.89-1 8.17-8.45 9.07-7.45.91-9.34.57-14.01.68-4.67.11-11.45.57-12.46-8.32-1-8.88 8.08-11.15 17.5-8.88 2.96.56 13.47 1.19 13.47 1.19z"
+                  style="fill:url(#SVGID_36_)"/>
+            <g>
+                <path class="st26"
+                      d="M266.14 598.27s.8-1.76 1.42-1.95c.62-.19 9.49-.54 12.72-1.38 3.23-.84 11.93-2.24 16.32 1.51 4.07 3.48 4.34 11.16-.3 15.4-1.99 1.73-4.08 2.35-11.44 2.01s-18.04-.27-20.38-3.68c.08-5.64 1.66-11.91 1.66-11.91z"/>
+                <linearGradient id="SVGID_37_" gradientUnits="userSpaceOnUse" x1="254.028" y1="603.193" x2="271.04"
+                                y2="603.193">
+                    <stop offset="0" stop-color="#F4B9A4"/>
+                    <stop offset=".652" stop-color="#FAD1BB"/>
+                </linearGradient>
+                <path d="M257.92 596.31s8.56 1.92 11.62 1.64c3.06-.28.5 12.05.5 12.05s-8.17.57-15.4-1.53c-2.45-9.44 3.28-12.16 3.28-12.16z"
+                      style="fill:url(#SVGID_37_)"/>
+                <linearGradient id="SVGID_38_" gradientUnits="userSpaceOnUse" x1="173.22" y1="584.443" x2="260.983"
+                                y2="584.443">
+                    <stop offset="0" stop-color="#445677"/>
+                    <stop offset="1" stop-color="#293861"/>
+                </linearGradient>
+                <path d="M260.98 595.87l-4.45 13.84s-95.64-12.6-81.97-43.63c11.43-25.96 86.42 29.79 86.42 29.79z"
+                      style="fill:url(#SVGID_38_)"/>
+                <linearGradient id="SVGID_39_" gradientUnits="userSpaceOnUse" x1="280.771" y1="594.929" x2="280.771"
+                                y2="612.987">
+                    <stop offset="0" stop-color="#FFDB80"/>
+                    <stop offset="1" stop-color="#FFBB24"/>
+                </linearGradient>
+                <path d="M267.26 596.94s-3.5 1.37-3.95 6.26 1 8.17 8.45 9.07 9.34.57 14.01.68 11.45.57 12.46-8.32c1-8.88-8.08-11.15-17.5-8.88-2.96.56-13.47 1.19-13.47 1.19z"
+                      style="fill:url(#SVGID_39_)"/>
+            </g>
+            <linearGradient id="SVGID_40_" gradientUnits="userSpaceOnUse" x1="251.42" y1="467.696" x2="220.113"
+                            y2="467.696">
+                <stop offset="0" stop-color="#F4B9A4"/>
+                <stop offset=".652" stop-color="#FAD1BB"/>
+            </linearGradient>
+            <path d="M250.74 469.25c.57-.81.93-2.88.46-3.49-.84-.68-1.63-.29-2.24.3.14-4.96-.31-9.07-.42-10.12-.31-3.04-3.4-8.6-13.5-8.6s-12.05 7.29-12.05 7.29-.66 5.15-.46 11.41c-.6-.58-1.39-.95-2.22-.28-.46.61-.1 2.68.46 3.49.57.81.93 2.73 1.03 3.79.1 1.01-.63 3.7 2.03 3.36 1.59 6.35 8.01 11.64 11.99 11.64 4.36 0 10.16-5.33 11.8-11.65 2.71.37 1.98-2.34 2.07-3.35.13-1.06.49-2.98 1.05-3.79z"
+                  style="fill:url(#SVGID_40_)"/>
+            <linearGradient id="SVGID_41_" gradientUnits="userSpaceOnUse" x1="215.804" y1="455.594" x2="252.152"
+                            y2="455.594">
+                <stop offset="0" stop-color="#4F5C7C"/>
+                <stop offset="1" stop-color="#274168"/>
+            </linearGradient>
+            <path d="M242.34 445.19s-1.97-6.21-9.53-4.72c-7.55 1.48-8.06 5.06-11.03 5.19-5.06.24-9.11 6.54-2.61 13.22 2.89 2.97.45 4.25 1.82 6.88s1.36 5.19 1.36 5.19 2.41-7.71.82-11c-.82-1.7 2.82-2.16 7.35-1.75s11.68-1.1 12.24-4.18c1.34 6.32 2.68 6.98 4.38 7.94 1.7.96 1.8 8.6 1.8 8.6s.3-5.62 1.49-6.88c.98-2.07 2.89-10.22.73-12.19s-.34-8.31-8.82-6.3z"
+                  style="fill:url(#SVGID_41_)"/>
+        </g>
+        <linearGradient id="SVGID_42_" gradientUnits="userSpaceOnUse" x1="509.948" y1="612.061" x2="509.948"
+                        y2="547.57">
+            <stop offset="0" stop-color="#B0B9E1"/>
+            <stop offset="1" stop-color="#E7EFF7"/>
+        </linearGradient>
+        <path d="M452.67 596.16L498.32 547.57 567.22 547.57 506.27 612.06z" style="fill:url(#SVGID_42_)"/>
+        <linearGradient id="SVGID_43_" gradientUnits="userSpaceOnUse" x1="461.835" y1="563.724" x2="495.632"
+                        y2="622.263">
+            <stop offset="0" stop-color="#C8CBF2"/>
+            <stop offset="1" stop-color="#AFB0E7"/>
+        </linearGradient>
+        <circle cx="478.73" cy="592.99" r="33.79" style="fill:url(#SVGID_43_)"/>
+        <linearGradient id="SVGID_44_" gradientUnits="userSpaceOnUse" x1="455.798" y1="564.313" x2="489.595"
+                        y2="622.851">
+            <stop offset=".116" stop-color="#DEE4FF"/>
+            <stop offset=".847" stop-color="#BACBEE"/>
+        </linearGradient>
+        <circle cx="472.7" cy="593.58" r="33.79" style="fill:url(#SVGID_44_)"/>
+        <linearGradient id="SVGID_45_" gradientUnits="userSpaceOnUse" x1="479.001" y1="231.35" x2="503.267" y2="273.38">
+            <stop offset="0" stop-color="#C8CBF2"/>
+            <stop offset="1" stop-color="#AFB0E7"/>
+        </linearGradient>
+        <circle cx="491.13" cy="252.36" r="24.26" style="fill:url(#SVGID_45_)"/>
+        <linearGradient id="SVGID_46_" gradientUnits="userSpaceOnUse" x1="474.666" y1="231.772" x2="498.933"
+                        y2="273.803">
+            <stop offset=".116" stop-color="#DEE4FF"/>
+            <stop offset=".847" stop-color="#BACBEE"/>
+        </linearGradient>
+        <circle cx="486.8" cy="252.79" r="24.26" style="fill:url(#SVGID_46_)"/>
+    </g>
+</svg>

+ 13 - 0
projects/common/src/assets/svgs/del.svg

@@ -0,0 +1,13 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+        "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg t="1722242333836" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1347"
+     xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200">
+    <path d="M808.65 395.1l-10.54-89.6c-2.95-25.08-24.2-43.97-49.45-43.97H637.69c-10.14 0-18.36-8.22-18.36-18.36 0-34.73-28.15-62.88-62.88-62.88h-81.23c-34.73 0-62.88 28.15-62.88 62.88 0 10.14-8.22 18.36-18.36 18.36H283.01c-25.25 0-46.5 18.9-49.45 43.97l-10.54 89.6c-3.48 29.6 19.65 55.61 49.45 55.61h486.74c29.81 0 52.93-26.01 49.45-55.61z"
+          fill="#4384F7" p-id="1348"></path>
+    <path d="M671.71 849.29H359.96c-26.37 0-48.37-20.14-50.7-46.4L274.87 415.1c-2.64-29.77 20.81-55.39 50.7-55.39H706.1c29.88 0 53.34 25.63 50.7 55.39l-34.39 387.79c-2.33 26.26-24.33 46.4-50.7 46.4z"
+          fill="#6CA4F4" p-id="1349"></path>
+    <path d="M389.13 486m40.38 0l0.01 0q40.38 0 40.38 40.38l0 157.13q0 40.38-40.38 40.38l-0.01 0q-40.38 0-40.38-40.38l0-157.13q0-40.38 40.38-40.38Z"
+          fill="#FFFFFF" p-id="1350"></path>
+    <path d="M558.13 486m40.38 0l0.01 0q40.38 0 40.38 40.38l0 157.13q0 40.38-40.38 40.38l-0.01 0q-40.38 0-40.38-40.38l0-157.13q0-40.38 40.38-40.38Z"
+          fill="#FFFFFF" p-id="1351"></path>
+</svg>

+ 7 - 0
projects/common/src/assets/svgs/guize.svg

@@ -0,0 +1,7 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+        "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg t="1725352774800" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2944"
+     xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200">
+    <path d="M1021.804463 27.927237a38.27051 38.27051 0 0 0-37.531258-27.920982h-0.227462C780.35337 1.314163 285.168226 33.272598 85.228979 305.374218c-104.063943 141.310873-112.707505 324.815978-26.613074 545.226821 0.568655 1.762832 1.137311 3.809991 2.957009 4.321781l5.459092 1.307907 44.810047-92.690834c71.479987-132.837907 193.172248-300.477526 390.609411-424.615005a40.033342 40.033342 0 0 1 53.510475 9.95147 35.08604 35.08604 0 0 1-10.57699 50.439736c-222.969792 140.514755-343.638473 344.263994-401.755058 473.519372l127.378815 27.693519c27.181729 2.04716 54.363459 3.070739 81.829516 3.070739 130.620151 0 283.247267-24.054124 388.96031-116.460631 83.933541-73.242819 126.29837-178.7284 126.29837-313.613466 0-331.469247 132.610445-404.14341 133.349697-404.6552a35.711561 35.711561 0 0 0 20.357864-40.94319zM65.155443 860.097584c-30.707393 71.878046-42.649157 119.758832-43.217812 121.06674-3.525664 19.163688 9.780873 37.872451 29.911275 41.966771 20.41473 4.094319 40.431401-7.676848 45.606165-26.66994 0.227462-1.251042 13.306537-50.667198 45.890493-123.341361l-76.597886-16.661604-1.592235 3.639394z"
+          p-id="2945"></path>
+</svg>

+ 3 - 0
projects/common/src/assets/svgs/icon.svg

@@ -0,0 +1,3 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg">
+    <path d="M115.147.062a13 13 0 014.94.945c1.55.63 2.907 1.526 4.069 2.688a13.148 13.148 0 012.761 4.069c.678 1.55 1.017 3.245 1.017 5.086v102.3c0 3.681-1.187 6.733-3.56 9.155-2.373 2.422-5.352 3.633-8.937 3.633H12.992c-3.875 0-7-1.26-9.373-3.779-2.373-2.518-3.56-5.667-3.56-9.445V12.704c0-3.39 1.163-6.345 3.488-8.863C5.872 1.32 8.972.062 12.847.062h102.3zM81.434 109.047c1.744 0 3.003-.412 3.778-1.235.775-.824 1.163-1.914 1.163-3.27 0-1.26-.388-2.325-1.163-3.197-.775-.872-2.034-1.307-3.778-1.307H72.57c.097-.194.145-.485.145-.872V27.09h9.01c1.743 0 2.954-.436 3.633-1.308.678-.872 1.017-1.938 1.017-3.197 0-1.26-.34-2.325-1.017-3.197-.679-.872-1.89-1.308-3.633-1.308H46.268c-1.743 0-2.954.436-3.632 1.308-.678.872-1.018 1.938-1.018 3.197 0 1.26.34 2.325 1.018 3.197.678.872 1.889 1.308 3.632 1.308h8.138v72.075c0 .193.024.339.073.436.048.096.072.242.072.436H46.56c-1.744 0-3.003.435-3.778 1.307-.775.872-1.163 1.938-1.163 3.197 0 1.356.388 2.446 1.163 3.27.775.823 2.034 1.235 3.778 1.235h34.875z"/>
+</svg>

+ 188 - 0
projects/common/src/assets/svgs/login-box-bg.svg

@@ -0,0 +1,188 @@
+<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" x="0" y="0" viewBox="0 0 700 700" xml:space="preserve"
+     enable-background="new 0 0 700 700"><style>.st0{fill:#e5e6eb}.st1{fill:#fff}.st2{fill:#84a9ff}.st3{fill:#050f64}.st4{fill:#155bcd}.st5{fill:#ffbd00}.st6{fill:#ff654f}.st9{fill:#f5bdc8}.st10{fill:#ea8096}.st11{opacity:0}.st13{fill:#dca000}</style>
+    <path class="st0"
+          d="M101.8 176.7c21.4-19.8 48.8-33.2 77.8-37.2 92.4-12.6 158.2 78.1 240.3 104.9 40.8 13.3 85.4 12.6 125.4 28 68.5 26.2 131.4 117.8 101 191.6-23.7 57.5-79.6 71.8-134.6 54-33.5-10.9-64.1-29.4-97.6-40.5-38.1-12.6-78.7-15.1-118.9-16.7s-80.6-2.4-119.6-12-77-28.9-101.2-60.9C40.8 343.4 48 260.8 73.1 213.7c7.4-13.9 17.2-26.3 28.7-37z"/>
+    <path class="st1"
+          d="M82 257.1c5.7-23.2 18.9-44.7 37.3-60.4l1.7-1.5 1.8-1.4 1.8-1.4 1.8-1.3c.6-.4 1.2-.9 1.8-1.3l1.9-1.3c.6-.4 1.2-.9 1.9-1.3l1.9-1.2c5.1-3.2 10.5-6 16.1-8.4 11.1-4.7 23-7.8 35.1-9 12.1-1.1 24.3-.5 36.1 1.5 5.9 1 11.8 2.4 17.6 4 .7.2 1.5.4 2.2.6l2.2.7 2.2.7 2.1.7 2.1.7 2.1.8 2.1.8 2.1.8c5.6 2.2 11.1 4.6 16.5 7.2 5.4 2.6 10.7 5.4 15.9 8.3 10.4 5.9 20.6 12.2 30.5 18.8-10.4-5.9-20.7-11.8-31.4-17.2-5.3-2.7-10.7-5.3-16.1-7.7-5.4-2.4-10.9-4.7-16.5-6.7l-2.1-.8-2.1-.7-2.1-.7-2.1-.7-2.1-.7-2.1-.6-2.1-.6-2.1-.6c-5.7-1.5-11.5-2.8-17.3-3.7-11.6-1.9-23.5-2.5-35.2-1.3-11.7 1.1-23.2 4-34.1 8.5-5.4 2.2-10.7 4.9-15.8 7.9l-1.9 1.1c-.6.4-1.2.8-1.9 1.2l-1.8 1.2c-.6.4-1.2.8-1.8 1.3l-1.8 1.3-1.8 1.3-1.8 1.3-1.7 1.4c-18.2 15.2-32 35.7-39.1 58.4z"/>
+    <path class="st2"
+          d="M183.1 543.2c-.3 1.2-.5 1.8-.5 1.8-.7-.5-1.4-.9-2.1-1.4-120.8-82.8-72.6-232.2-72.6-232.2 115.7 67.3 80.1 213.8 75.2 231.8z"/>
+    <path class="st3"
+          d="M183.1 543.2c-.3 1.2-.5 1.8-.5 1.8-.7-.5-1.4-.9-2.1-1.4-10.1-29.9-20.1-59.8-29.8-89.8-5-15.5-10-31.1-14.8-46.7l-3.6-11.7-3.5-11.7c-1.2-3.9-2.2-7.8-3.4-11.8-.6-2-1.1-3.9-1.6-5.9l-1.6-5.9 1.6 5.9c.5 2 1.1 3.9 1.7 5.9 1.2 3.9 2.3 7.8 3.5 11.7l3.6 11.7 3.7 11.7c5 15.5 10.2 31 15.4 46.5 10.4 30 20.8 59.9 31.4 89.7zM137.9 384.9c-.1 0-.2 0-.4-.1-.3-.1-.4-.5-.2-.8 3.7-7.2 6-15.3 6.7-23.4 0-.3.3-.5.6-.5s.5.3.5.6c-.7 8.2-3.1 16.5-6.9 23.8 0 .3-.2.4-.3.4zM154 430.5h-.3c-.3-.1-.4-.5-.3-.7 3.4-8.3 7.6-16.4 12.3-24.1.2-.3.5-.3.8-.2.3.2.3.5.2.8-4.7 7.6-8.8 15.6-12.2 23.9-.1.1-.3.3-.5.3zM137.4 440.3h-.3c-9.5-3.9-18.3-9.3-26.1-16.1-.2-.2-.3-.6-.1-.8.2-.2.6-.3.8-.1 7.7 6.7 16.3 12 25.7 15.9.3.1.4.5.3.7 0 .2-.1.3-.3.4zM125.9 390.5c-.2.1-.4.1-.6-.1l-19.2-15c-.2-.2-.3-.6-.1-.8.2-.2.6-.3.8-.1l19.2 15c.2.2.3.6.1.8 0 .1-.1.2-.2.2zM170.7 478.4h-.3c-.3-.1-.4-.5-.3-.7l10.1-23.5c.1-.3.5-.4.7-.3.3.1.4.5.3.7l-10.1 23.5c0 .1-.2.3-.4.3zM151.6 481.6h-.3l-24.3-10c-.3-.1-.4-.5-.3-.7.1-.3.5-.4.7-.3l24.3 10c.3.1.4.5.3.7-.1.1-.3.3-.4.3z"/>
+    <path class="st4"
+          d="M182.3 543.2c.3 1.2.4 1.9.4 1.9-.8-.1-1.7-.2-2.5-.3C35 525 11 369.8 11 369.8c133.5 8.2 167.5 155.1 171.3 173.4z"/>
+    <path class="st1"
+          d="M182.3 543.2c.3 1.2.4 1.9.4 1.9-.8-.1-1.7-.2-2.5-.3-22.5-22.1-44.8-44.4-66.9-66.8-11.5-11.6-22.9-23.3-34.2-35.1l-8.5-8.8-8.4-8.9c-2.8-3-5.5-6-8.3-9-1.4-1.5-2.7-3-4.1-4.6l-4-4.6 4.1 4.5c1.4 1.5 2.7 3 4.1 4.5 2.8 3 5.6 6 8.4 8.9l8.5 8.8 8.6 8.7c11.5 11.6 23 23.1 34.7 34.6 22.5 22.2 45.2 44.3 68.1 66.2zM70.7 422.1c-.1.1-.2.1-.3.1-.3 0-.6-.3-.6-.6.1-8.1-1.5-16.4-4.5-23.9-.1-.3 0-.6.3-.7.3-.1.6 0 .7.3 3 7.7 4.6 16.1 4.6 24.4 0 .1-.1.3-.2.4zM105.6 455.5c-.1.1-.2.1-.3.1-.3 0-.6-.2-.6-.5-.7-9-.6-18.1.2-27 0-.3.3-.5.6-.5s.5.3.5.6c-.8 8.9-.9 17.9-.2 26.8.1.2 0 .4-.2.5zM95.2 471.7c-.1.1-.2.1-.3.1-10.3.8-20.5-.1-30.5-2.7-.3-.1-.5-.4-.4-.7.1-.3.4-.5.7-.4 9.9 2.5 20 3.4 30.1 2.6.3 0 .6.2.6.5 0 .4-.1.5-.2.6zM62.6 432.4c-.1.1-.3.2-.5.2l-23.9-4.8c-.3-.1-.5-.4-.4-.7.1-.3.4-.5.7-.4l23.9 4.8c.3.1.5.4.4.7-.1.1-.1.2-.2.2zM142.1 490.8c-.1.1-.2.1-.3.1-.3 0-.6-.2-.6-.5l-1.5-25.5c0-.3.2-.6.5-.6s.6.2.6.5l1.5 25.5c0 .2-.1.4-.2.5zM126.4 502.3c-.1.1-.2.1-.3.1l-26.2 2c-.3 0-.6-.2-.6-.5s.2-.6.5-.6l26.2-2c.3 0 .6.2.6.5 0 .2-.1.4-.2.5z"/>
+    <g><path class="st5" d="M259.6 503.3c1.2.5 1.8.7 1.8.7-.5.7-1.1 1.3-1.7 1.9C164 616.8 20.9 552.3 20.9 552.3c79.7-107.4 221.4-55.9 238.7-49z"/>
+        <path class="st1"
+              d="M259.6 503.3c1.2.5 1.8.7 1.8.7-.5.7-1.1 1.3-1.7 1.9-30.8 6.8-61.6 13.3-92.5 19.7-16 3.3-32 6.5-48 9.6l-12 2.3-12 2.2c-4 .7-8 1.4-12.1 2-2 .4-4 .6-6 .9l-6.1.9 6-1c2-.3 4-.6 6-1 4-.7 8-1.4 12-2.2l12-2.3 12-2.4c16-3.3 31.9-6.7 47.9-10.2 31-6.9 61.9-13.9 92.7-21.1zM97.3 530.8c0 .1 0 .2-.1.3-.2.3-.5.3-.8.2-6.8-4.5-14.6-7.7-22.5-9.3-.3-.1-.5-.4-.4-.7.1-.3.4-.5.7-.4 8.1 1.6 16 4.9 22.9 9.5.1 0 .1.2.2.4zM144.3 519.7c0 .1 0 .2-.1.3-.2.3-.5.4-.8.2-7.9-4.3-15.5-9.4-22.5-14.9-.2-.2-.3-.6-.1-.8.2-.2.6-.3.8-.1 7 5.5 14.6 10.5 22.4 14.8.2.1.3.3.3.5zM152.2 537.3c0 .1 0 .2-.1.3-4.9 9-11.3 17.2-18.8 24.1-.2.2-.6.2-.8 0-.2-.2-.2-.6 0-.8 7.5-6.9 13.7-14.9 18.6-23.8.2-.3.5-.4.8-.2.2.1.3.3.3.4zM101.5 543.2c.1.2 0 .4-.1.6l-17 17.5c-.2.2-.6.2-.8 0-.2-.2-.2-.6 0-.8l17-17.5c.2-.2.6-.2.8 0 .1 0 .1.1.1.2zM193.8 508.4c0 .1 0 .2-.1.3-.2.3-.5.4-.8.2l-22.2-12.7c-.3-.2-.4-.5-.2-.8.2-.3.5-.4.8-.2l22.2 12.7c.2.2.3.3.3.5zM194.9 527.8c0 .1 0 .2-.1.3l-12.7 23.1c-.2.3-.5.4-.8.2-.3-.2-.4-.5-.2-.8l12.7-23.1c.2-.3.5-.4.8-.2.1.2.3.3.3.5z"/></g>
+    <g><path class="st2" d="M608.8 430.3c-1 .2-2.4-.3-4.4-1.4-3.2-1.9-8.3-4.9-10.2-6.1 3 6.3 5.8 12.7 8.3 19.2 4.5-1 7.9-.1 10.1 1.4 2.2 1.5 3.3 3.6 3.3 4.6-.1 2-1.8 2.4-4.9.3-1.6-1.1-3.7-2.6-5.5-3.9-1.3-.9-2.3-1.7-2.8-2 .8 2 1.5 4 2.2 6h.2c1.3.2 3.1 3.1 3.9 4.1 1.7 2.3 3 4.9 3.2 7.8.1 1.2-.1 2.6-1.2 3.2-1.2.6-2.6-.3-3.5-1.3-2.5-2.8-4-6.5-4.1-10.2 0-1-.1-3.3 1.2-3.5-.8-2-1.5-3.9-2.3-5.9-.1.6-.4 1.9-.7 3.4-.5 2.1-1.1 4.7-1.7 6.4-1.1 3.5-2.7 4.1-4 2.8-.7-.7-1.1-2.7-.3-5.2.8-2.4 2.6-5.3 6.6-7.7-2.7-6.4-5.6-12.7-8.8-18.9-.1.8-.3 2.2-.5 3.7-.3 2.6-.9 5.7-1.4 7.8-.5 2.1-1.2 3.4-2 4-.8.6-1.7.4-2.5-.3-.9-.7-1.6-3.1-.9-6.2.6-2.9 2.6-6.5 7-9.6-3.5-6.6-7.2-13.1-11.2-19.4v.3c0 1 0 2.5-.1 4.1-.1 1.6-.2 3.4-.3 5-.1 1.7-.4 3.3-.5 4.6-.8 5.3-3 6.6-5.2 5-1.2-.8-2.1-3.7-1.7-7.4.2-1.9.9-4 2.2-6.2 1.1-2 2.8-4.2 5.2-6.3-3.8-5.8-7.8-11.5-12-17 .1 1.2.2 2.8.2 4.6.1 1.8.1 3.9.1 5.8v2.8c0 .9-.1 1.8-.1 2.5-.4 6.1-2.8 7.8-5.5 6.2-.7-.4-1.4-1.4-1.9-2.8s-.8-3.3-.7-5.4c.1-2.2.7-4.6 1.9-7.3 1.1-2.4 2.8-5 5.2-7.6-4.2-5.4-8.5-10.5-13.1-15.5l2-1.8c4.5 5.2 8.8 10.5 12.9 16 3.1-1.6 6.1-2.5 8.8-2.7 3-.3 5.6.1 7.8.9s4 1.9 5.3 3.1c1.2 1.2 2 2.4 2.2 3.3.7 3.5-2 4.7-8 2.5-3.1-1.2-7.3-2.8-10.7-4.2-1.7-.6-3.3-1.2-4.4-1.6 4.1 5.6 8 11.5 11.6 17.4 2.9-1.2 5.6-1.7 8-1.8 2.6 0 4.8.5 6.7 1.4 3.8 1.7 5.8 4.5 6 6 .3 3.1-2 4-7.1 1.6-2.6-1.3-6.1-3-9-4.4-1.4-.7-2.8-1.3-3.7-1.8-.1 0-.1-.1-.2-.1 3.9 6.4 7.5 13 10.8 19.8 5.1-1.6 9.2-.9 12 .7 2.8 1.6 4.3 4 4.4 5.2-.7 1.1-1.2 1.8-2.2 2z"/></g>
+    <g><path class="st2" d="M552.1 373.7c-.5 1.1-.8 1.7-.8 1.7l-1.8-1.8c-105.3-101.8-32.8-241.1-32.8-241.1 102.7 85.7 43.2 224.2 35.4 241.2z"/>
+        <path class="st1"
+              d="M552.1 373.7c-.5 1.1-.8 1.7-.8 1.7l-1.8-1.8c-5-31.1-9.8-62.3-14.4-93.5-2.4-16.1-4.7-32.3-6.8-48.5l-1.6-12.1-1.5-12.2c-.5-4.1-.9-8.1-1.4-12.2-.2-2-.4-4.1-.6-6.1l-.5-6.1.6 6.1c.2 2 .4 4.1.7 6.1.5 4 1 8.1 1.5 12.1l1.6 12.1 1.7 12.1c2.4 16.1 4.9 32.3 7.5 48.4 5.1 31.4 10.3 62.7 15.8 93.9zM533.9 210c-.1 0-.2 0-.3-.1-.3-.2-.3-.5-.1-.8 4.9-6.5 8.5-14.1 10.6-21.9.1-.3.4-.5.7-.4.3.1.5.4.4.7-2.1 8-5.8 15.7-10.7 22.3-.3.1-.5.2-.6.2zM542.2 257.6c-.1 0-.2 0-.3-.1-.3-.2-.3-.5-.2-.8 4.8-7.6 10.2-14.9 16.2-21.7.2-.2.6-.3.8-.1.2.2.3.6.1.8-5.9 6.7-11.3 13.9-16.1 21.5-.1.3-.3.4-.5.4zM524.2 264.5c-.1 0-.2 0-.3-.1-8.7-5.4-16.5-12.2-23-20.2-.2-.2-.2-.6.1-.8.2-.2.6-.2.8.1 6.4 7.9 14.1 14.6 22.7 19.9.3.2.3.5.2.8-.2.2-.4.3-.5.3zM521.2 213.5c-.2 0-.4 0-.5-.2l-16.5-18c-.2-.2-.2-.6 0-.8.2-.2.6-.2.8 0l16.5 18c.2.2.2.6 0 .8-.1.2-.2.2-.3.2zM550.7 307.7c-.1 0-.2 0-.3-.1-.3-.2-.3-.5-.2-.8l13.9-21.5c.2-.3.5-.3.8-.2.3.2.3.5.2.8l-13.9 21.5c-.1.2-.3.3-.5.3zM531.2 307.6c-.1 0-.2 0-.3-.1l-22.3-13.9c-.3-.2-.3-.5-.2-.8.2-.3.5-.3.8-.2l22.3 13.9c.3.2.3.5.2.8-.1.2-.3.3-.5.3z"/>
+        <g><path class="st4" d="M526.6 382.8c-1 .7-1.6 1-1.6 1-.2-.8-.4-1.6-.6-2.5-35-142.2 100.5-221.5 100.5-221.5 41.5 127.2-82.7 212.8-98.3 223z"/>
+            <path class="st3"
+                  d="M526.6 382.8c-1 .7-1.6 1-1.6 1-.2-.8-.4-1.6-.6-2.5 12.3-29 24.8-58 37.5-86.8 6.6-14.9 13.3-29.8 20-44.7l5.1-11.1 5.2-11.1c1.7-3.7 3.6-7.3 5.3-11 .9-1.8 1.8-3.6 2.7-5.5l2.8-5.4-2.7 5.5c-.9 1.8-1.8 3.6-2.7 5.5-1.7 3.7-3.5 7.4-5.2 11.1l-5.1 11.1-5 11.2c-6.6 14.9-13 29.9-19.4 44.9-12.2 29.2-24.3 58.5-36.3 87.8zM598.2 234.5c-.1-.1-.2-.2-.2-.3-.1-.3 0-.6.3-.7 7.6-2.9 14.7-7.4 20.6-13 .2-.2.6-.2.8 0 .2.2.2.6 0 .8-6 5.7-13.3 10.2-21 13.2-.1.1-.3.1-.5 0zM580 279.3c-.1-.1-.2-.1-.2-.2-.1-.3 0-.6.3-.8 8.1-3.9 16.6-7.2 25.2-9.7.3-.1.6.1.7.4.1.3-.1.6-.4.7-8.6 2.5-17 5.8-25 9.7-.3 0-.5 0-.6-.1zM561 275.5c-.1-.1-.2-.1-.2-.3-4.5-9.3-7.4-19.1-8.7-29.3 0-.3.2-.6.5-.6s.6.2.6.5c1.3 10.1 4.2 19.8 8.6 29 .1.3 0 .6-.3.8-.1 0-.3 0-.5-.1zM585.6 230.8c-.2-.1-.3-.2-.4-.4l-4.4-24c-.1-.3.1-.6.5-.7.3-.1.6.1.7.5l4.4 24c.1.3-.1.6-.5.7-.1-.1-.2-.1-.3-.1zM560.5 326.2c-.1-.1-.2-.1-.2-.2-.1-.3 0-.6.3-.8l23.2-10.8c.3-.1.6 0 .8.3.1.3 0 .6-.3.8l-23.2 10.8c-.2 0-.4 0-.6-.1zM544.1 315.8c-.1-.1-.2-.1-.2-.2l-11.5-23.7c-.1-.3 0-.6.3-.8.3-.1.6 0 .8.3l11.5 23.7c.1.3 0 .6-.3.8-.2 0-.5 0-.6-.1z"/></g>
+        <g><path class="st5" d="M482.2 415.1c-1.2 0-1.9-.1-1.9-.1l.9-2.4C532.4 275.4 689 286.2 689 286.2c-37.4 128.5-188.2 129.3-206.8 128.9z"/>
+            <path class="st1"
+                  d="M482.2 415.1c-1.2 0-1.9-.1-1.9-.1l.9-2.4c26.5-17 53.2-33.9 79.9-50.6 13.9-8.6 27.8-17.2 41.7-25.6l10.5-6.3 10.5-6.2c3.5-2.1 7.1-4.1 10.6-6.1 1.8-1 3.6-2 5.3-3l5.4-2.9-5.3 3c-1.8 1-3.6 2-5.3 3-3.5 2.1-7 4.1-10.5 6.2l-10.5 6.4-10.4 6.4c-13.8 8.6-27.6 17.4-41.4 26.2-26.6 17.2-53.1 34.5-79.5 52zM624.9 333c0-.1-.1-.2 0-.4.1-.3.4-.5.7-.4 7.9 1.8 16.3 2.2 24.3.9.3 0 .6.2.7.5 0 .3-.2.6-.5.7-8.2 1.3-16.7 1-24.8-.9l-.4-.4zM584.6 359.7c0-.1-.1-.2 0-.3 0-.3.3-.5.6-.5 8.9 1.3 17.8 3.4 26.3 6.2.3.1.5.4.4.7-.1.3-.4.5-.7.4-8.5-2.7-17.3-4.8-26.1-6.1-.3-.1-.4-.3-.5-.4zM571.1 345.9c-.1-.1-.1-.2-.1-.3 1.5-10.2 4.6-20 9.3-29.2.1-.3.5-.4.8-.2.3.1.4.5.2.8-4.6 9.1-7.7 18.7-9.2 28.8 0 .3-.3.5-.6.5-.2-.2-.4-.3-.4-.4zM616.6 322.8c-.1-.2-.1-.4-.1-.6l9.9-22.3c.1-.3.5-.4.8-.3.3.1.4.5.3.8l-9.9 22.3c-.1.3-.5.4-.8.3l-.2-.2zM542.1 387.4c0-.1-.1-.2 0-.3.1-.3.3-.5.7-.5l25.2 4.2c.3.1.5.3.5.7-.1.3-.3.5-.7.5l-25.2-4.2c-.3-.1-.4-.2-.5-.4zM534.4 369.6c0-.1-.1-.2 0-.3l3.9-26c0-.3.3-.5.6-.5s.5.3.5.6l-3.9 26c0 .3-.3.5-.6.5s-.4-.2-.5-.3z"/></g></g>
+    <g><path class="st2" d="M445 229c-.1 1 .4 2.4 1.6 4.3 2.1 3.1 5.4 8 6.6 9.9-6.4-2.7-13-5.1-19.6-7.3.8-4.5-.3-7.9-1.9-10-1.6-2.2-3.7-3.1-4.8-3-2 .2-2.3 1.9 0 4.9 1.1 1.5 2.8 3.5 4.2 5.3 1 1.2 1.8 2.2 2.2 2.7-2-.7-4.1-1.3-6.1-1.9v-.2c-.3-1.3-3.3-3-4.3-3.7-2.4-1.6-5.1-2.7-7.9-2.8-1.2 0-2.6.3-3.1 1.4-.5 1.2.5 2.6 1.5 3.4 2.9 2.4 6.7 3.6 10.4 3.5 1 0 3.3 0 3.5-1.4 2 .7 4 1.3 6 2-.6.2-1.9.5-3.4.9-2.1.6-4.6 1.4-6.3 2-3.4 1.3-4 2.9-2.6 4.2.7.6 2.8 1 5.2 0 2.4-.9 5.2-2.9 7.3-7 6.6 2.3 13 4.9 19.3 7.7-.8.1-2.2.4-3.7.7-2.5.5-5.6 1.2-7.7 1.8-2.1.6-3.3 1.4-3.9 2.2-.5.8-.4 1.7.4 2.5s3.2 1.4 6.2.5c2.9-.8 6.3-2.9 9.3-7.5 6.8 3.1 13.5 6.5 20 10.2h-.3c-1 .1-2.5.2-4.1.4-1.6.2-3.3.4-5 .6-1.7.2-3.3.5-4.6.8-5.2 1.1-6.4 3.3-4.7 5.5.9 1.1 3.8 1.9 7.5 1.3 1.9-.3 4-1.1 6.1-2.5 2-1.3 4-3 6-5.5 6 3.4 11.9 7.1 17.7 11.1h-4.6c-1.8 0-3.9.1-5.8.2-1 .1-1.9.1-2.8.2-.9.1-1.7.2-2.5.3-6.1.8-7.6 3.2-5.9 5.8.4.7 1.5 1.3 2.9 1.7 1.5.4 3.3.7 5.5.4 2.2-.3 4.6-.9 7.2-2.3 2.3-1.2 4.8-3 7.3-5.6 5.6 3.9 11 8 16.2 12.3l1.7-2.1c-5.4-4.2-11-8.2-16.7-12 1.4-3.2 2.1-6.2 2.2-8.9.1-3-.4-5.6-1.3-7.7-.9-2.1-2.1-3.9-3.4-5.1-1.3-1.2-2.5-1.9-3.4-2-3.5-.5-4.6 2.2-2 8.1 1.4 3 3.2 7.1 4.8 10.5.7 1.7 1.4 3.2 1.9 4.3-5.9-3.8-11.9-7.4-18-10.7 1-3 1.4-5.7 1.3-8.1-.1-2.6-.8-4.8-1.7-6.6-1.9-3.7-4.8-5.5-6.3-5.6-3.1-.2-3.9 2.3-1.2 7.2 1.4 2.5 3.3 5.9 4.9 8.8.8 1.4 1.5 2.7 2 3.6 0 .1.1.1.1.2-6.6-3.5-13.4-6.8-20.3-9.7 1.3-5.2.4-9.2-1.3-11.9-1.8-2.8-4.2-4.1-5.4-4.1-1.6.3-2.3.8-2.4 1.8z"/></g>
+    <g><path class="st2" d="M100.2 255.8c1-.1 2.4.5 4.3 1.8 3 2.2 7.8 5.7 9.6 7-2.4-6.5-4.6-13.2-6.4-19.9-4.6.6-7.9-.6-9.9-2.3-2.1-1.7-3-3.9-2.8-4.9.3-2 2-2.2 4.9.2 1.5 1.2 3.4 3 5.1 4.4 1.2 1 2.2 1.9 2.6 2.3-.6-2.1-1.1-4.1-1.6-6.2h-.2c-1.3-.3-2.8-3.4-3.5-4.5-1.5-2.4-2.5-5.2-2.5-8 0-1.2.4-2.6 1.5-3 1.3-.5 2.6.6 3.4 1.6 2.3 3 3.3 6.8 3.1 10.5-.1 1-.2 3.3-1.5 3.4.6 2 1.2 4.1 1.8 6.1.2-.6.6-1.9 1-3.4.7-2.1 1.6-4.5 2.3-6.2 1.4-3.4 3.1-3.9 4.3-2.4.6.7.8 2.8-.2 5.2-1 2.4-3.1 5-7.3 7 2 6.6 4.4 13.2 6.9 19.6.2-.8.5-2.2.8-3.7.6-2.5 1.4-5.6 2.1-7.6.7-2.1 1.5-3.3 2.4-3.8.9-.5 1.7-.3 2.5.5s1.2 3.3.3 6.2c-.9 2.8-3.2 6.2-7.8 8.9 2.8 6.9 5.9 13.8 9.3 20.4v-.3c.1-1 .3-2.4.5-4s.5-3.3.8-5c.3-1.7.7-3.3 1-4.6 1.3-5.2 3.6-6.3 5.7-4.5 1.1.9 1.8 3.9 1 7.5-.4 1.8-1.3 3.9-2.8 6-1.3 1.9-3.2 3.9-5.8 5.8 3.2 6.2 6.6 12.2 10.3 18.1 0-1.2.1-2.8.2-4.6.1-1.8.3-3.9.5-5.8.1-1 .2-1.9.3-2.8.1-.9.3-1.7.4-2.5 1-6 3.5-7.5 6.1-5.6.6.5 1.2 1.5 1.6 3 .3 1.5.5 3.3.2 5.5s-1.1 4.5-2.6 7.1c-1.3 2.3-3.2 4.7-5.9 7 3.6 5.7 7.5 11.3 11.6 16.7l-2.2 1.6c-4-5.6-7.8-11.3-11.3-17.2-3.3 1.3-6.3 1.9-9 1.9-3 0-5.6-.6-7.7-1.6-2.1-1-3.8-2.3-4.9-3.6-1.1-1.3-1.8-2.6-1.8-3.4-.3-3.5 2.4-4.5 8.2-1.7 2.9 1.5 7 3.5 10.3 5.2 1.7.8 3.1 1.5 4.2 2-3.6-6-6.9-12.2-9.9-18.5-3 .9-5.7 1.2-8.1 1-2.6-.2-4.7-1-6.5-2-3.6-2-5.3-5-5.4-6.6 0-3.1 2.4-3.8 7.2-.9 2.4 1.5 5.8 3.5 8.6 5.2 1.4.9 2.6 1.6 3.5 2.1.1 0 .1.1.2.1-3.3-6.8-6.2-13.7-8.8-20.7-5.3 1.1-9.2 0-11.9-1.8-2.7-1.9-3.9-4.4-3.8-5.6-.1-.9.5-1.6 1.5-1.7z"/></g>
+    <g><path class="st4" d="M106.8 558.3c0 13.1 8.1 23.7 18.2 23.7h455c10.1 0 18.2-10.6 18.2-23.7H106.8z"/>
+        <path class="st2" d="M155.4 290.9H549.6V538.5H155.4z"/>
+        <path class="st3"
+              d="M556.6 264.8h-408c-7.6 0-13.8 6.2-13.8 13.8V540c0 7.6 6.2 13.8 13.8 13.8h408c7.6 0 13.8-6.2 13.8-13.8V278.6c0-7.7-6.2-13.8-13.8-13.8z"/>
+        <path class="st1" d="M155.4 285.5H549.6V533.1H155.4z"/>
+        <path class="st0"
+              d="M295.7 558.3L196.6 558.3 196.9 553.9 197.3 548.4 294.9 548.4zM508.6 558.3L409.4 558.3 409.8 553.9 410.2 548.4 507.8 548.4z"/></g>
+    <g><path class="st0" d="M188 451.7H222.4V455.59999999999997H188zM235 451.7H269.4V455.59999999999997H235zM328.6 451.7H353.5V455.59999999999997H328.6zM374.8 451.7H413.5V455.59999999999997H374.8zM342.3 465.1H359.90000000000003V469H342.3zM342.3 475.3H359.90000000000003V479.2H342.3zM342.3 485.6H359.90000000000003V489.5H342.3zM342.3 495.8H359.90000000000003V499.7H342.3z"/>
+        <path class="st6" d="M209.7 465.1H222.39999999999998V469H209.7z"/>
+        <path class="st2" d="M209.7 475.3H222.39999999999998V479.2H209.7z"/>
+        <path class="st4" d="M209.7 485.6H222.39999999999998V489.5H209.7z"/>
+        <path class="st5" d="M209.7 495.8H222.39999999999998V499.7H209.7z"/>
+        <path class="st0"
+              d="M399.7 465.1H417.3V469H399.7zM399.7 475.3H417.3V479.2H399.7zM399.7 485.6H417.3V489.5H399.7zM399.7 495.8H417.3V499.7H399.7zM234.6 465.1H252.2V469H234.6zM234.6 475.3H260.7V479.2H234.6zM234.6 485.6H267.5V489.5H234.6zM234.6 495.8H249.7V499.7H234.6zM180.4 314.6H306V321.5H180.4z"/>
+        <path class="st4"
+              d="M180.4 340.4H198.20000000000002V347.9H180.4zM216.1 340.4H233.9V347.9H216.1zM251.8 340.4H269.6V347.9H251.8zM287.5 340.4H305.3V347.9H287.5zM323.3 340.4H341.1V347.9H323.3zM359 340.4H376.8V347.9H359zM394.7 340.4H412.5V347.9H394.7z"/>
+        <g><path class="st0" d="M180.4 355.7H430.20000000000005V358H180.4z"/></g>
+        <g><path class="st0" d="M427.7 446.2H181v-90.4h-2v92.5h250.7v-92.5h-2v90.4z"/>
+            <path class="st0"
+                  d="M405.1 355.7H407.1V447.2H405.1zM382.4 355.7H384.5V447.2H382.4zM359.8 355.7H361.8V447.2H359.8zM337.2 355.7H339.2V447.2H337.2zM314.6 355.7H316.6V447.2H314.6zM292 355.7H294V447.2H292zM269.4 355.7H271.4V447.2H269.4zM246.8 355.7H248.8V447.2H246.8zM224.2 355.7H226.2V447.2H224.2zM201.6 355.7H203.7V447.2H201.6z"/>
+            <path class="st0"
+                  d="M179 355.7H429.7V357.7H179zM180 378.4H428.7V380.4H180zM180 401H428.7V403H180zM180 423.6H428.7V425.6H180z"/>
+            <g><path class="st2" d="M203.6 396.2H219.79999999999998V446.3H203.6zM248.8 385.8H265V446.3H248.8zM294.1 410.5H310.3V446.3H294.1zM339.3 373.7H355.5V446.29999999999995H339.3zM384.5 393.3H400.7V446.3H384.5z"/></g>
+            <g><path class="st6" d="M201.6 396.2H217.79999999999998V446.3H201.6zM246.8 385.8H263V446.3H246.8zM292 410.5H308.2V446.3H292zM337.2 373.7H353.4V446.29999999999995H337.2zM382.5 393.3H398.7V446.3H382.5z"/></g></g>
+        <g><path class="st0" d="M179 471.1H429.7V473.20000000000005H179z"/></g>
+        <g><path class="st0" d="M179 481.3H429.7V483.40000000000003H179z"/></g>
+        <g><path class="st0" d="M179 491.6H429.7V493.70000000000005H179z"/></g>
+        <g><path class="st0" d="M179 501.8H429.7V503.90000000000003H179z"/></g>
+        <g><path class="st6" d="M473.5 352.4c.9-5.5 5.4-9.8 10.9-10.6l-.2-5.1-.5-12.6c-14.7 1.2-26.4 12.7-27.9 27.2l12.6.8 5.1.3z"/>
+            <path class="st5"
+                  d="M491.1 366.7c-1.5.6-3.1.9-4.8.9-2.9 0-5.6-.9-7.7-2.5l-3.5 3.8-8.5 9.2c5.3 4.5 12.2 7.2 19.7 7.2 4.7 0 9.1-1 13-2.9l-5.9-11.1-2.3-4.6zM516.3 361.3l-12.4-2.1c-1.2 4.6-4 8.4-7.9 10.9l5.9 11.1 2.7 5.2c8.8-5.1 15.3-13.8 17.5-24.1l-5.8-1z"/>
+            <path class="st6"
+                  d="M468.2 354.9l-12.6-.8-5.9-.4v.9c0 10.1 4.1 19.3 10.7 25.9l4-4.3 8.5-9.2c-2.8-3.2-4.6-7.4-4.7-12.1z"/>
+            <path class="st4"
+                  d="M495.9 339.3l-2.4 4.6c3.5 2.3 5.7 6.3 5.7 10.8v.8l5.1.9 12.4 2.1c.2-1.3.2-2.5.2-3.8 0-11.3-6.1-21.2-15.2-26.5l-5.8 11.1zM487 336.6c2.3.1 4.4.6 6.4 1.4l5.8-11.2 2.7-5.2c-4.7-2.3-10-3.5-15.7-3.5l.2 5.9.6 12.6z"/></g>
+        <g><path class="st0" d="M446.7 407.2H525.1V411.09999999999997H446.7zM446.7 441.5H450.59999999999997V445.4H446.7zM454.4 441.5H525.1V445.4H454.4z"/>
+            <path class="st4" d="M446.7 456.1H450.59999999999997V460H446.7z"/>
+            <path class="st0" d="M454.4 456.1H525.1V460H454.4z"/>
+            <path d="M446.7 470.8H450.59999999999997V474.7H446.7z" style="fill:#6292ff"/>
+            <path class="st0" d="M454.4 470.8H525.1V474.7H454.4z"/>
+            <path d="M446.7 485.4H450.59999999999997V489.29999999999995H446.7z" style="fill:#da5544"/>
+            <path class="st0" d="M454.4 485.4H525.1V489.29999999999995H454.4z"/>
+            <path class="st5" d="M446.7 500H450.59999999999997V503.9H446.7z"/>
+            <path class="st0" d="M454.4 500H525.1V503.9H454.4zM446.7 417.7H525.1V430.7H446.7z"/></g></g>
+    <g><path class="st3" d="M522.8 556.7c.3-.3.7-.5 1.1-.6.4-.1.8-.1 1.3-.1 1-.1 2-.3 2.9-.8.5-.3.9-.6 1.4-.8l2.9.1c.4.4.7 1 .8 1.6.1.5.1 1.1.1 1.6v.6h-10.8v-.6c0-.4 0-.8.3-1z"/>
+        <path class="st9" d="M532.7 551.2L532.4 554.5 529.4 554.4 529.2 551.4z"/>
+        <path class="st3"
+              d="M494 555.5c.3-.3.7-.4 1.1-.5.4 0 .8 0 1.3.1 1 .1 2.1-.1 3-.5.5-.2 1-.5 1.5-.6l2.9.4c.4.5.5 1.1.6 1.7.1.5 0 1.1-.1 1.6l-.1.6-10.7-1.2.1-.6c0-.4.1-.8.4-1z"/>
+        <path class="st4"
+              d="M535.3 503.7c.6-11.4.5-27.5-2.6-36.6 0-.2-23.9 2-23.9 2l-5.6 22.9c-2 8.1-2.9 16.3-2.8 24.6l.3 34.4 4 .3 7.5-45.5c2.8-5.4 5.8-11.6 8.1-17.7l8.7 63.4 4-.2c0-.1 2.3-47.6 2.3-47.6z"/>
+        <path class="st9" d="M504.5 551.2L503.8 554.4 500.9 554 501 551z"/>
+        <path class="st10"
+              d="M481.6 394.3c.7-.3 1.6 0 1.9.7 2 4 4.2 7.8 6.6 11.5 2.4 3.7 5 7.2 7.8 10.5s5.8 6.4 9.1 9.1c1.6 1.4 3.3 2.7 5 3.9.4.3.9.6 1.3.9l1.3.9c.9.6 1.8 1.1 2.7 1.7.3.2.5.4.8.6.2.2.4.5.6.7.3.5.6 1.1.7 1.8.3 1.3.1 2.7-.7 4-.8 1.3-2 2.1-3.3 2.3-.7.1-1.4.1-2.1 0-.3-.1-.7-.2-1-.3l-.9-.6c-.9-.7-1.8-1.5-2.7-2.3l-1.3-1.2c-.4-.4-.9-.8-1.3-1.2-1.7-1.6-3.4-3.4-4.9-5.1-3.1-3.5-6-7.3-8.5-11.2-2.5-3.9-4.7-8-6.6-12.2-1.9-4.2-3.6-8.4-5.1-12.7-.5-.7-.1-1.5.6-1.8z"/>
+        <path class="st2" d="M500.2 434.6l9.4 7.3c2.8 2.2 6.8 1.9 9-.9s1.8-7.2-1.1-9.4l-9.4-7.3-7.9 10.3z"/>
+        <path class="st2"
+              d="M521.8 428.5c-9-.1-16 7.9-14.8 16.8l1.8 23.7c10 3.6 17.5 1.6 23.9-2l1.1-25.2c.7-7.1-4.9-13.2-12-13.3z"/>
+        <path class="st1"
+              d="M531.8 433.5l-.2.2c1 1.4 1.7 3 2 4.7h.3c-.3-1.7-1-3.4-2.1-4.9zm-9.9 37.3v.3c2.2-.2 4.4-.8 6.6-1.7l-.1-.2c-2.1.8-4.2 1.3-6.5 1.6zm5.1-41.3c-1.6-.8-3.4-1.2-5.2-1.2h-.2c-4.3 0-8.5 1.9-11.3 5.2-1.7 1.9-2.8 4.2-3.3 6.6l.3.1c1.5-6.6 7.4-11.6 14.5-11.5 1.9 0 3.6.5 5.2 1.2v-.4zM508.6 466c-.1 0-.2.1-.3.1l.2 3 .2.1c2.2.8 4.5 1.4 6.6 1.7v-.3c-2.1-.3-4.2-.8-6.5-1.7l-.2-2.9zm-1.8-20.6l.9 12h.3l-.9-12h-.3z"/>
+        <path class="st3" d="M524 412.1s6.2 1.5 4.7 8.4c-1 4.6-4.4 7-9.2 7.8l4.5-16.2z"/>
+        <path class="st9" d="M517.5 423.7l.5 7.1c2 1.2 4 1.1 5.9-.3l-.5-7.1-5.9.3z"/>
+        <path class="st10" d="M517.6 424.6l.1 2.2c.9.5 1.9.7 3 .7h.2c1-.1 2-.5 2.7-1.2l-.1-2.1-5.9.4z"/>
+        <path class="st9"
+              d="M514.6 415.4l.4 5.3.1 1.2c.3 2.9 2.7 5.1 5.6 5.1.3 0 .6 0 .9-.1.1 0 .2-.1.3-.1h.1c.4-.2.8-.4 1.1-.8.7-.8 1.1-1.6 1.5-2.5.3-.7.6-1.5.8-2.2.2-.9.4-1.8.2-2.8l-.4-4.6-9-.7-1.6 2.2z"/>
+        <path class="st3"
+              d="M523.9 414s-10.3.6-8.2 9.7c0 0-3.2-6.5.1-10.9 3.6-4.8 8.5-3.2 10.2-.9 1.7 2.3 3 6.1-1.8 8.9-.1-.1 1.5-3.5-.3-6.8z"/>
+        <path class="st9"
+              d="M523.7 419.5c.1 1.2 1.1 2.1 2.3 2 1.2-.1 2.1-1.1 2-2.3-.1-1.2-1.1-2.1-2.3-2-1.2.1-2.1 1.1-2 2.3z"/>
+        <g><path class="st3" d="M503.8 450.8l-7.4-8c4.5-4.2 6.9-9.8 6.9-15.9h10.9c0 9.1-3.8 17.8-10.4 23.9z"/>
+            <path class="st4"
+                  d="M514.2 427h-10.9c0-12-9.7-21.7-21.7-21.7-2.6 0-5.1.4-7.5 1.3l-3.8-10.2c3.6-1.3 7.4-2 11.3-2 18-.1 32.6 14.6 32.6 32.6z"/>
+            <path class="st2"
+                  d="M481.6 459.6c-18 0-32.6-14.6-32.6-32.6 0-13.6 8.6-25.9 21.4-30.6l3.8 10.2c-8.5 3.1-14.2 11.3-14.2 20.4 0 12 9.7 21.7 21.7 21.7 5.5 0 10.8-2.1 14.8-5.8l7.4 8c-6.1 5.6-14 8.7-22.3 8.7z"/></g>
+        <g><path class="st9" d="M471.1 455.3c0-.8.5-1.5 1.3-1.5 4.4-.5 8.8-1.1 13.1-2.1 4.3-.9 8.5-2.1 12.6-3.5 4.1-1.5 8-3.2 11.8-5.2 1.9-1 3.7-2.1 5.5-3.3.4-.3.9-.6 1.3-.9l1.3-.9c.8-.6 1.7-1.2 2.5-1.9.3-.2.6-.4.8-.5l.9-.3c.6-.1 1.3-.1 1.9 0 1.3.2 2.6.9 3.5 2.1.9 1.2 1.2 2.6 1 3.9-.1.7-.4 1.3-.8 1.9-.2.3-.4.6-.7.8-.3.3-.6.5-.9.7-1 .6-2.1 1.2-3.1 1.7l-1.6.8c-.5.3-1.1.5-1.6.8-2.1 1-4.3 2-6.5 2.8-4.4 1.7-9 3-13.5 3.9-4.6.9-9.2 1.5-13.7 1.9-4.6.3-9.1.4-13.7.3-.8 0-1.4-.7-1.4-1.5z"/>
+            <path class="st2"
+                  d="M515.5 452.5l10.1-6.2c3.1-1.9 4.3-5.7 2.4-8.8-1.9-3.1-6.1-4.2-9.1-2.3l-10.1 6.2 6.7 11.1z"/>
+            <path class="st1"
+                  d="M529.1 439.4c-.1-.7-.4-1.4-.8-2-.9-1.5-2.5-2.7-4.3-3.1-.3-.1-.6-.1-.9-.2v.3c2 .3 3.9 1.4 4.9 3.2 1.4 2.3 1.1 5-.5 7l.2.1c1.3-1.5 1.8-3.4 1.4-5.3zm-3.3 7.1s.1 0 .1-.1l-.3-.1-3 1.8.2.2 3-1.8zm-4.2 2.6l-.2-.2-2.9 1.7.2.2 2.9-1.7zm-4.4 2.6l-.2-.2-1.5.9-5.2-8.5-.2.1 5.3 8.8 1.8-1.1zm.2-15.9l-7.4 4.5.1.2 7.4-4.5-.1-.2z"/></g></g>
+    <g><path class="st10" d="M234.4 464c0-.8-.5-1.5-1.3-1.6-2.3-.3-4.6-.6-6.9-1-2.3-.4-4.5-.8-6.7-1.3s-4.3-1.2-6.2-2c-1.9-.8-3.7-1.9-5.3-3.1-3.2-2.5-5.7-6-8-9.7-.3-.5-.6-.9-.9-1.4l-.8-1.4c-.6-1-1.1-2-1.7-3-1.1-2-2.2-4-3.2-6.1-1.4-2.6-4.7-3.5-7.2-2s-3.3 4.8-1.7 7.3c1.4 1.9 2.7 3.9 4.1 5.8.7 1 1.4 1.9 2.2 2.9l1.1 1.4c.4.5.8.9 1.1 1.4 1.6 1.9 3.2 3.7 5 5.5 1.8 1.8 3.9 3.4 6.1 4.8 2.3 1.3 4.7 2.3 7.2 3 2.5.7 4.9 1.1 7.3 1.3 2.4.2 4.8.4 7.1.4 2.4.1 4.7.1 7 .1 1 0 1.7-.6 1.7-1.3z"/>
+        <path class="st3" d="M190.5 450.4l-6.3-10c-1.9-3-1.3-7 1.8-8.9 3-1.9 7.3-1.1 9.2 2l6.3 10-11 6.9z"/>
+        <path class="st9" d="M181.4 505.2L189.7 554.4 192.6 553.9 193.4 504.8z"/>
+        <path class="st4" d="M194.2 504.7l-13.6.5c-3.7-9-6.9-28.9-3.1-38.1l15.2 3.4 1.5 34.2z"/>
+        <circle transform="rotate(-16.739 184.847 470.406)" class="st4" cx="184.8" cy="470.4" r="7.9"/>
+        <g class="st11"><path class="st4" d="M184.8 470.4L184.8 470.4 184.8 470.4 184.8 470.3z"/></g>
+        <path class="st9" d="M165.9 503.2L161.1 553.4 164.1 553.6 177.6 505.8z"/>
+        <path class="st4"
+              d="M180.4 462.7c-3.2-1-6.5.2-8.5 2.7-.1.2-.3.4-.4.6-5.7 8.3-7.5 27.6-6.3 37l13.2 3 7.3-33.4c1.3-4.2-1.1-8.6-5.3-9.9z"/>
+        <path class="st2"
+              d="M180.4 497.1l-1.9 8.9-2.2-.5v.3l2.4.5 2-9.1-.3-.1zm-11.9-25.8c-1.3 3.5-2.4 7.8-3.1 12.8v.3h.3c.6-4.6 1.7-9.1 3.1-12.9l-.3-.2zm-3.9 23.7h.3c0-2.2.2-4.5.4-6.8h-.3c-.3 2.3-.4 4.6-.4 6.8zm.6 8c-.2-1.3-.3-2.8-.3-4.4h-.3c.1 1.6.2 3.1.3 4.4v.2l8 1.8.1-.2-7.8-1.8zm18.6-21.8l-1.7 7.9h.3l1.7-7.9h-.3z"/>
+        <path class="st3"
+              d="M170.4 556.6c-.2-.4-.6-.6-1-.7-.4-.1-.8-.1-1.2-.2-1-.2-2-.6-2.8-1.2-.4-.3-.8-.7-1.3-.9l-2.9-.3c-.4.4-.8.9-1 1.5-.2.5-.2 1.1-.3 1.6l-.1.6 10.7 1.2.1-.6c.1-.3 0-.7-.2-1zM199.5 555.1c-.3-.3-.7-.4-1.2-.4-.4 0-.8.1-1.3.1-1 .1-2.1 0-3-.4l-1.5-.6-2.9.5c-.3.5-.5 1.1-.5 1.7 0 .5 0 1.1.1 1.6l.1.6 10.7-1.6-.1-.6c0-.3-.1-.6-.4-.9zM182 428.8c9 .1 15.8 8.2 14.4 17.1l-3.6 24c-6.5 2.3-15.6 1.5-23.1-.7v-27.4c-.5-7.1 5.2-13.1 12.3-13z"/>
+        <path class="st1"
+              d="M169.4 457.4v10.4h.3v-10.4h-.3zm12.6-28.8h-.1c-.4 0-.8 0-1.2.1v.3c.4 0 .8-.1 1.3-.1 2.1 0 4 .5 5.8 1.2l.1-.2c-1.8-.9-3.8-1.3-5.9-1.3zm11.3 5.3c-.8-.9-1.7-1.8-2.7-2.5l-.2.2c3.7 2.7 6.1 7.1 6.1 11.9 0 .8-.1 1.6-.2 2.4l-.8 5.3.3.1.8-5.3c.7-4.4-.5-8.8-3.3-12.1zm-.6 36c-5.9 2.1-13.9 1.6-20.9-.1v.3c4 1 8.1 1.5 11.8 1.5 3.5 0 6.6-.5 9.2-1.4l.1-.1 2.1-13.8h-.3l-2 13.6zm-16.9-39.5l-.1-.3c-1.1.6-2.1 1.4-2.9 2.3-2.4 2.5-3.6 5.9-3.3 9.3v6.4h.3v-6.4c-.4-4.7 2.1-9 6-11.3z"/>
+        <g><path class="st9" d="M186.2 424.7l-.4 7.3c-2.1 1.1-4 1-5.9-.4l.4-7.3 5.9.4z"/>
+            <path class="st10" d="M186.1 426.9v.8c-.9.5-2 .7-3.1.7h-.2c-1-.1-1.9-.5-2.6-1.2l.1-2.1 5.8 1.8z"/>
+            <path class="st9"
+                  d="M189.3 416.4l-.5 5.2-.1 1.2c-.3 2.9-2.8 5.1-5.7 5-.3 0-.6-.1-.9-.1-.1 0-.2-.1-.3-.1h-.1c-.4-.2-.8-.5-1.1-.8-.6-.8-1-1.6-1.4-2.5-.3-.8-.6-1.5-.8-2.3-.2-.9-.3-1.8-.2-2.8l.2-3.6 9.3-1.5 1.6 2.3z"/>
+            <path class="st3"
+                  d="M189 424.6s0-3.1-.1-4.6c-.1-1.4-.4-2.8-1.5-2.6-2.1.4-2.9-1.4-2.9-1.4-.6 0-1.2.1-1.9.3-3.1.8-3.6 0-4-.5-.8 2.4-.5 5.5-.5 5.8 0 .1.1.3.1.4.2.8.5 1.5.8 2.3.3.7.6 1.4 1 2v.5c-2.2-.4-4.9-2.8-5.6-4.7-2.3-7.2 1.6-11.5 7.1-12.6 4.8-.9 7.4 3.5 8.4 7.5.8 2.3-.3 7-.9 7.6z"/>
+            <path class="st9"
+                  d="M180.2 420.3c-.1 1.2-1.1 2.1-2.3 2-1.2-.1-2.1-1.1-2-2.3.1-1.2 1.1-2.1 2.3-2 1.2.1 2 1.1 2 2.3z"/></g>
+        <g><path transform="rotate(-180 274.437 454.01)" class="st2" d="M269 446.1H279.8V462H269z"/>
+            <path transform="rotate(-180 260.511 447.387)" class="st2"
+                  d="M255.1 432.8H265.9V461.90000000000003H255.1z"/>
+            <path transform="rotate(-180 246.585 443.424)" class="st4" d="M241.2 424.9H252V461.9H241.2z"/>
+            <path transform="rotate(-180 232.659 439.712)" class="st4" d="M227.2 417.5H238V461.9H227.2z"/>
+            <path transform="rotate(-180 218.732 441.217)" class="st4"
+                  d="M213.3 420.5H224.10000000000002V461.9H213.3z"/>
+            <path transform="rotate(-180 204.806 443.424)" class="st2"
+                  d="M199.4 424.9H210.20000000000002V461.9H199.4z"/>
+            <path transform="rotate(-180 190.88 447.387)" class="st4" d="M185.5 432.8H196.3V461.90000000000003H185.5z"/>
+            <g><path transform="rotate(-180 232.659 462.663)" class="st3" d="M183.1 461.9H282.3V463.4H183.1z"/></g></g>
+        <g><path class="st9" d="M227.5 461.9c-.1-.8-.7-1.4-1.5-1.4h-6.9c-2.3-.1-4.6-.2-6.8-.4s-4.4-.6-6.4-1.1c-2-.6-3.9-1.3-5.7-2.4-3.5-2.1-6.5-5.1-9.3-8.5-.4-.4-.7-.8-1.1-1.3l-1-1.3c-.7-.9-1.4-1.8-2-2.7-1.4-1.8-2.7-3.7-4-5.6-1.7-2.3-5.1-2.8-7.4-.9-2.3 1.8-2.6 5.3-.6 7.5 1.6 1.7 3.2 3.4 4.9 5.2.8.9 1.7 1.7 2.5 2.6l1.3 1.3c.4.4.9.8 1.3 1.2 1.8 1.7 3.7 3.3 5.8 4.8 2.1 1.5 4.3 2.8 6.7 3.9 2.4 1 5 1.7 7.5 2 2.5.3 5 .4 7.4.3 2.4-.1 4.8-.3 7.1-.6s4.7-.6 7-.9c.7-.3 1.2-1 1.2-1.7z"/>
+            <path class="st3" d="M181.9 454.2l-7.7-9c-2.3-2.7-2.2-6.7.5-9.1 2.7-2.3 7.1-2.1 9.4.7l7.7 9-9.9 8.4z"/>
+            <path class="st1"
+                  d="M179.6 434.3c-1.2-.1-2.3.1-3.4.6l.1.2c2.6-1.2 5.9-.6 7.8 1.7l.7.8.2-.2-.7-.8c-1.1-1.3-2.8-2.2-4.7-2.3zm12.2 11.6l-8.1 6.8.2.2 8.3-7-4.4-5.2-.2.2 4.2 5zm-18-9.1c-1.8 2.1-1.9 5.2-.4 7.7l.2-.1c-1.4-2.3-1.4-5.3.3-7.4l-.1-.2zm7.4 17l.2-.2-3.7-4.4-.2.2 3.7 4.4z"/></g></g>
+    <g><path class="st3" d="M630.9 587.7H74.2c-1.6 0-2.9-1.3-2.9-2.9 0-1.6 1.3-2.9 2.9-2.9H631c1.6 0 2.9 1.3 2.9 2.9-.1 1.6-1.4 2.9-3 2.9z"/></g>
+    <g><path transform="rotate(-40.957 194.403 297.627)" class="st2" d="M179.5 288.7H209.2V306.4H179.5z"/>
+        <path transform="rotate(-40.957 148.955 337.083)" class="st4" d="M103.6 323.8H194.2V350.40000000000003H103.6z"/>
+        <path class="st4"
+              d="M294.2 300.4c28.1-24.4 31.2-67.2 6.7-95.3-24.4-28.1-67.2-31.2-95.3-6.7-25.9 22.5-30.5 60.4-12.1 88.2 1.6 2.4 3.4 4.8 5.4 7.1 2 2.3 4.1 4.4 6.2 6.3 25 22.1 63.3 22.9 89.1.4zm-76.9-88.6c20.7-18 52.3-15.8 70.3 5s15.8 52.3-5 70.3-52.3 15.8-70.3-5-15.8-52.3 5-70.3z"/>
+        <g style="opacity:.5"><path class="st2" d="M212.3 282.1c-18-20.8-15.8-52.3 5-70.3 20.7-18 52.3-15.8 70.3 5s15.8 52.3-5 70.3c-20.7 17.9-52.3 15.7-70.3-5z"/></g>
+        <g><path class="st1" d="M263.6 217c.2-.4.4-.7.8-1 1-.8 2.5-.5 3.2.5l20.8 28.3c.8 1 .5 2.5-.5 3.2-1 .8-2.5.5-3.2-.5l-20.8-28.3c-.5-.6-.6-1.5-.3-2.2zM252.5 225.2c.2-.4.4-.7.8-1 1-.8 2.5-.5 3.2.5l20.8 28.3c.8 1 .5 2.5-.5 3.2-1 .8-2.5.5-3.2-.5l-20.8-28.3c-.5-.6-.6-1.5-.3-2.2z"/></g></g>
+    <g><path class="st3" d="M410 551.8l-12.9 6.5c-.2-.4-.3-.9-.2-1.4.1-.6.5-1 .9-1.3.5-.3 1-.6 1.5-.8 1.2-.7 2.2-1.6 3-2.8.4-.6.7-1.2 1.2-1.8l3.6-1.7c.7.3 1.4.8 1.9 1.4.4.5.7 1.2 1 1.9zM422.6 556.4l-14.4 1.9c-.1-.5 0-1 .2-1.4.3-.5.8-.8 1.3-1 .5-.2 1.1-.2 1.7-.3 1.4-.2 2.6-.8 3.7-1.6.6-.4 1.1-.9 1.7-1.3l3.9-.4c.6.5 1.1 1.2 1.3 2 .4.7.5 1.4.6 2.1zM416.5 508.6L416.5 508.6 416.5 508.6z"/>
+        <g class="st11"><path class="st3" d="M414.6 478.3L414.6 478.3 414.6 478.3 414.6 478.3z"/></g>
+        <path class="st3" d="M416.5 508.6L416.5 508.6 416.5 508.6zM416.5 508.6L416.5 508.6 416.5 508.6z"/>
+        <path class="st2"
+              d="M384.1 510.1l18.8 40.3 4.7-1.9-12-37.6 9.7-15.3 11 57.2 5.1-.3.1-73.2c.1-.7-30.9-2.6-30.9-2.6l-6.8 30.4c-.1 1.1 0 2 .3 3zm32.4-1.5z"/>
+        <g class="st11"><path class="st3" d="M416.5 508.6L416.5 508.6 416.5 508.6z"/></g>
+        <path class="st10"
+              d="M352.8 484.7c1.5-1.5 3-2.8 4.5-4.2.4-.3.7-.7 1.1-1 .4-.4.7-.7 1.1-1l1-1.1.5-.5.5-.5c2.7-2.9 5.1-6 7.3-9.3 1-1.7 2.1-3.3 3.1-5l.7-1.3c.1-.2.2-.4.4-.6l.3-.7 1.3-2.6c.1-.2.2-.4.3-.7l.3-.7.6-1.3.6-1.3.3-.7.2-.3.1-.3 1.1-2.7c.4-.9.7-1.8 1.1-2.8.4-1.2 1.4-2 2.6-2.4 1.2-.4 2.6-.4 3.9.2 1.3.6 2.3 1.6 2.8 2.7.5 1.2.5 2.5-.1 3.7-.5.9-1 1.8-1.6 2.8l-1.6 2.7-.2.3-.2.3-.4.7-.9 1.3-.9 1.3-.4.7c-.1.2-.3.4-.5.7l-1.8 2.6-.5.6c-.2.2-.3.4-.5.6l-1 1.3c-1.3 1.7-2.7 3.3-4.1 4.9-2.9 3.1-6 6.1-9.2 8.7l-.6.5-.6.5-1.3.9c-.4.3-.8.6-1.3.9-.4.3-.8.6-1.3.9-1.7 1.2-3.4 2.3-5 3.4-.5.4-1.3.3-1.9-.3-.3-.6-.3-1.4.2-1.9z"/>
+        <path class="st4" d="M383.8 465.5l5.6-12.2c1.7-3.7.4-8-3.3-9.7-3.7-1.7-8.4-.1-10 3.6l-5.6 12.2 13.3 6.1z"/>
+        <g><path class="st4" d="M389.8 435.7c-7.7 1.9-12.2 9.9-9.6 17.5l11.9 36.1c13.9 1.7 20.3-2.7 29.7-9.7l-12.4-33.5c-3-7.9-11.4-12.4-19.6-10.4z"/></g>
+        <g><path class="st1" d="M403.3 438.2c1.4 1 2.7 2.2 3.8 3.7l.3-.3c-1.1-1.4-2.4-2.7-3.8-3.7l-.3.3zm16 43.1l.2.3c.8-.6 1.5-1.1 2.3-1.7l.2-.2-3.2-8.7-.4.1 3.1 8.5c-.6.5-1.4 1.1-2.2 1.7zm-27.6 8.3h.3c2.7.3 5.1.5 7.3.4l-.1-.4c-2.2.1-4.5 0-7.2-.3l-7-21.2-.4.1 7.1 21.4zm20.6-3.7c-1 .5-1.9 1-3 1.4l.2.4c1.1-.5 2.1-1 3.1-1.5l-.3-.3zm2.1-26l.4-.2-3-8-.4.2 3 8zm-32.6-.2l.4-.1-2.1-6.5c-2.3-6.8 1.2-14.1 7.6-16.8.3-.1.6-.3 1-.4l-.2-.4-.9.3c-6.8 2.8-10.3 10.4-7.9 17.4l2.1 6.5z"/></g>
+        <g><path class="st4" d="M353.2 491.4c8.2 7.9 20.6 10.6 31.7 6l-11.3-26.9-20.4 20.9z"/>
+            <path class="st3"
+                  d="M373.6 470.4l29.2-1.4c-.2-3.3-.9-6.7-2.3-9.9-2.7-6.4-7.4-11.3-13.1-14.4l-13.8 25.7zM362.2 443.5l11.3 26.9 13.9-25.7c-7.4-4-16.7-4.8-25.2-1.2z"/>
+            <path class="st3" d="M373.6 470.4l11.3 26.9c11.6-4.9 18.4-16.4 17.8-28.3l-29.1 1.4z"/>
+            <path class="st4" d="M346.7 481.8c1.6 3.7 3.8 7 6.6 9.6l20.4-21-29-3.4c-.7 4.9-.1 9.9 2 14.8z"/></g>
+        <g><path class="st9" d="M371.3 467.3c.5-.6 1.3-.7 1.9-.3 1.8 1.2 3.7 2.4 5.6 3.4.9.5 1.9 1 2.9 1.4 1 .4 1.9.8 2.9 1.1 1 .3 1.9.5 2.8.5h1.2c.4 0 .8-.1 1.1-.2.3-.1.6-.3.9-.4.3-.2.5-.4.8-.6.2-.2.5-.5.7-.8.2-.3.4-.6.6-1 .4-.7.7-1.6 1-2.5.3-.9.5-1.8.7-2.8.4-2 .6-4 .7-6.1.1-2.1.2-4.2.2-6.4 0-2.1-.1-4.3-.2-6.5 0-1.4.5-2.6 1.5-3.6.9-.9 2.2-1.5 3.7-1.5 1.4 0 2.7.6 3.7 1.6.9 1 1.4 2.3 1.3 3.7-.2 2.3-.4 4.6-.8 6.8-.3 2.3-.7 4.6-1.1 6.9-.5 2.3-1 4.6-1.8 7-.4 1.2-.8 2.3-1.4 3.5-.6 1.2-1.2 2.3-2 3.4-.4.6-.9 1.1-1.4 1.6-.5.5-1.1 1-1.7 1.4-.6.4-1.3.8-2.1 1.1-.7.3-1.5.5-2.2.6-.7.1-1.5.1-2.2.1h-.6l-.5-.1c-.3-.1-.7-.1-1-.2-1.3-.3-2.5-.7-3.6-1.2s-2.2-1.1-3.2-1.7c-1-.6-2-1.3-2.9-2-1.9-1.4-3.6-2.8-5.3-4.3-.6-.5-.7-1.3-.2-1.9z"/>
+            <path class="st4" d="M406.8 461.8l.4-13.4c.1-4.1-2.8-7.6-6.8-7.7-4.1-.1-7.7 3.2-7.9 7.2l-.4 13.4 14.7.5z"/>
+            <path class="st1"
+                  d="M392.2 449.3h.4V448c0-.5.1-.9.2-1.4l-.4-.1c-.1.5-.2 1-.2 1.5v1.3zm11.3 12.8l3.7.1.1-4.1-.4-.1-.1 3.8-3.3-.1v.4zm3.7-11.4l-.2 4.9h.4l.2-5-.4.1zm-12.7-7.9l.4.1c1.5-1.4 3.4-2.2 5.5-2.2 1.7.1 3.3.7 4.4 1.8l.2-.3c-1.3-1.2-2.9-1.8-4.6-1.9-1.1 0-2.2.2-3.3.6-1 .5-1.9 1.1-2.6 1.9zm-2.6 15.2l.4.1.1-3.4h-.4l-.1 3.3zm4.5 3.9l3.4.1v-.4l-3.3-.1-.1.4z"/></g>
+        <g><path class="st9" d="M383 434.5l4.8 8.4c2.5.2 4.3-.9 5.5-3.1l-4.8-8.4-5.5 3.1z"/>
+            <path class="st10"
+                  d="M383 434.5l2.2 3.8c.5-.1.9-.2 1.4-.4.1-.1.3-.1.4-.2 1.5-.9 2.5-2.4 2.8-4l-1.3-2.3-5.5 3.1z"/>
+            <path class="st9"
+                  d="M377.6 430.8l2.1 3.5.9 1.4c1.2 1.9 3.7 2.7 5.7 1.7.7-.3 1.3-.8 1.7-1.3.1-.1.2-.3.3-.4.1-.1.1-.2.2-.3.5-.9.8-1.8.7-2.9-.1-.9-.2-1.8-.3-2.8-.1-.6-.2-1.1-.3-1.7-.5-2.5-2.3-4.6-4.7-5.3-2.1-.6-4-.1-5.6 1.6-1.7 1.8-2 4.4-.7 6.5z"/>
+            <path class="st3"
+                  d="M385.7 429.1h-.8s0-3.2-.8-3.9c-1.2-1-4.5.3-5.9 1.4-.4.4-.7.7-.7 1.3.1 1.2.5 3.5 1.7 5.5 0 0-5-5.2-4.5-9.4.3-2.8.8-4.8 4.3-4.8 5.5 0 9.6 2.7 11.2 8.4l-3.5.2-1 1.3z"/>
+            <g><path class="st9" d="M385.9 429.5c.6 1 2 1.3 3.1.7s1.6-2 1-3c-.6-1-2-1.3-3.1-.7-1.2.6-1.6 2-1 3z"/></g></g></g>
+    <g><path class="st5" d="M305 499.7H375.1V558.3H305z"/>
+        <path class="st13" d="M281.2 499.7H305V558.3H281.2z"/>
+        <path class="st13"
+              d="M305 499.7L295.6 517.6 269.4 517.6 281.2 499.7zM386 519.6L316 524.1 305 499.7 375.1 504.2z"/>
+        <path class="st5"
+              d="M386 519.6L316 519.6 305 499.7 375.1 499.7zM305 499.7L299.7 519.7 269.4 517.6 295.6 517.6z"/></g>
+    <g><path class="st0" d="M38.9 241.8c3.5-18.6 10.8-36.5 20.7-52.7 5-8.1 10.7-15.8 17.1-22.9 3.2-3.6 6.5-7 10-10.3 3.5-3.3 7.1-6.4 10.8-9.4 15-11.9 32.3-20.9 50.6-26.7 9.2-2.9 18.6-4.9 28.1-6.1 2.4-.3 4.8-.5 7.1-.8l3.6-.3c1.2-.1 2.4-.1 3.6-.2 4.8-.2 9.6-.2 14.4 0 4.8.2 9.6.7 14.3 1.3 4.8.6 9.5 1.5 14.2 2.5 2.3.5 4.7 1.1 7 1.7l3.5 1c1.2.3 2.3.7 3.4 1.1.6.2 1.1.4 1.7.5l1.7.6c1.1.4 2.3.8 3.4 1.2 1.1.4 2.2.8 3.4 1.3l3.3 1.4c.6.2 1.1.5 1.7.7l1.6.7 3.3 1.5 3.2 1.6 1.6.8 1.6.8 3.2 1.7 3.1 1.7 1.6.9 1.5.9 3.1 1.8c4.1 2.4 8.1 4.9 12.1 7.5 4 2.6 7.9 5.2 11.9 7.9 7.8 5.3 15.6 10.7 23.5 15.9 3.9 2.6 7.9 5.1 11.9 7.6 4 2.4 8.1 4.8 12.2 7.1 2 1.2 4.1 2.2 6.2 3.3 1 .6 2.1 1 3.2 1.6 1.1.5 2.1 1.1 3.2 1.5 2.1 1 4.3 2 6.5 2.8 1.1.4 2.2.9 3.3 1.3l3.3 1.2 3.3 1.2c1.1.4 2.2.8 3.4 1.1l3.4 1c.6.2 1.1.3 1.7.5l1.7.4c1.1.3 2.3.6 3.4.8l3.5.7c.6.1 1.2.2 1.7.3l1.7.3 3.5.5c-9.4-.8-18.8-2.7-27.8-5.6-9-2.9-17.8-6.7-26.3-11-4.3-2.1-8.4-4.4-12.5-6.8-4.1-2.4-8.2-4.8-12.2-7.3s-8-5.1-12-7.6l-11.9-7.7c-4-2.6-7.9-5.1-11.9-7.6s-8-4.9-12.1-7.3l-3.1-1.7-1.5-.9-1.5-.8-3.1-1.7-3.1-1.6-1.6-.8-1.6-.8-3.2-1.5-3.2-1.4-1.6-.7c-.5-.2-1.1-.4-1.6-.7-17.2-7.2-35.7-11.2-54.3-11.9-18.6-.8-37.4 1.5-55.2 6.9-4.5 1.3-8.9 2.9-13.2 4.6-4.3 1.7-8.6 3.7-12.7 5.8-8.3 4.2-16.2 9.2-23.7 14.8-7.4 5.7-14.4 11.9-20.8 18.8-6.4 6.8-12.2 14.2-17.4 22-10.6 15.9-18.3 33.3-22.9 51.7z"/></g>
+    <g><path class="st0" d="M658 370.2c6.5 13.9 10.3 29.1 11.5 44.5 1.1 15.4-.4 31.1-4.6 46.1-4.2 14.9-11.2 29.1-20.3 41.6-9.1 12.5-20.3 23.5-33.2 31.9 11.9-9.7 22.3-21 30.7-33.6 8.4-12.6 14.9-26.4 19-41 4.1-14.5 5.9-29.7 5.3-44.9-.4-15.1-3.3-30.2-8.4-44.6z"/></g>
+    <g><path class="st1" d="M639.8 422.2c.4 9.5-.9 19.2-3.6 28.3-1.4 4.6-3.1 9.1-5.2 13.4-2.1 4.3-4.6 8.5-7.3 12.4-2.8 3.9-5.9 7.6-9.2 11.1-3.4 3.4-7 6.6-10.9 9.4-7.7 5.7-16.4 10.1-25.5 12.9 8.8-3.5 17.1-8.3 24.6-14.1 3.7-2.9 7.2-6.1 10.5-9.5 3.3-3.4 6.3-7 9-10.9 2.7-3.8 5.1-7.9 7.3-12.1 2.1-4.2 3.9-8.6 5.4-13.1 2.9-8.8 4.5-18.2 4.9-27.8z"/></g></svg>

+ 3 - 0
projects/common/src/assets/svgs/message.svg

@@ -0,0 +1,3 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg">
+    <path d="M0 20.967v59.59c0 11.59 8.537 20.966 19.075 20.966h28.613l1 26.477L76.8 101.523h32.125c10.538 0 19.075-9.377 19.075-20.966v-59.59C128 9.377 119.463 0 108.925 0h-89.85C8.538 0 0 9.377 0 20.967zm82.325 33.1c0-5.524 4.013-9.935 9.037-9.935 5.026 0 9.038 4.41 9.038 9.934 0 5.524-4.025 9.934-9.038 9.934-5.024 0-9.037-4.41-9.037-9.934zm-27.613 0c0-5.524 4.013-9.935 9.038-9.935s9.037 4.41 9.037 9.934c0 5.524-4.025 9.934-9.037 9.934-5.025 0-9.038-4.41-9.038-9.934zm-27.1 0c0-5.524 4.013-9.935 9.038-9.935s9.038 4.41 9.038 9.934c0 5.524-4.026 9.934-9.05 9.934-5.013 0-9.025-4.41-9.025-9.934z"/>
+</svg>

+ 12 - 0
projects/common/src/assets/svgs/warning.svg

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink">
+    <g id="页面-1" stroke-width="1" fill-rule="evenodd">
+        <g id="icon" transform="translate(-191.000000, -66.000000)" fill-rule="nonzero">
+            <g id="健康监测" transform="translate(191.000000, 66.000000)">
+                <path d="M14.5454545,0 L1.45454546,0 C0.651222186,0 0,0.651222186 0,1.45454546 L0,7.27272729 L0.610181829,7.27272729 L0.841454556,6.73018182 C1.07051796,6.19792201 1.5965672,5.85505831 2.17600002,5.86036363 C2.75854547,5.86690908 3.27418182,6.22036363 3.49090909,6.76145454 L4.30181819,8.79345456 L6.58254545,1.95200001 C6.54545911,1.65544427 6.6935726,1.36638989 6.95594678,1.22327982 C7.21832096,1.08016975 7.54153582,1.11214154 7.7707872,1.30388227 C8.00003858,1.495623 8.08865036,1.80809379 7.99418181,2.09163637 L9.03272726,10.4007273 L9.85018182,7.78327274 C9.94545455,7.47927275 10.2269091,7.27272729 10.5447273,7.27272729 L11.8378182,7.27272729 C12.0894545,6.84000002 12.5534545,6.54545457 13.0909091,6.54545454 C13.8942323,6.54545454 14.5454545,7.19667672 14.5454545,8 C14.5454545,8.80332328 13.8942323,9.45454546 13.0909091,9.45454546 C12.5733609,9.45309513 12.0958126,9.17593418 11.8378182,8.72727271 L11.0792727,8.72727271 L9.4210909,14.0349091 C9.31982648,14.3622727 9.00359601,14.5743782 8.66228958,14.5438606 C8.32098315,14.513343 8.04739868,14.2484996 8.00581819,13.9083636 L6.9490909,5.45381819 L5.0538182,11.1389091 C4.95709094,11.4283637 4.69018182,11.6269091 4.38472728,11.6363636 C4.08218181,11.6298182 3.80145456,11.4625454 3.68800002,11.1789091 L2.14036363,7.30109092 L1.76000001,8.28581818 C1.6458182,8.55345456 1.3818182,8.72727271 1.09090909,8.72727271 L0,8.72727271 L0,14.5454545 C0,15.3487778 0.651222186,16 1.45454546,16 L14.5454545,16 C15.3487778,16 16,15.3487778 16,14.5454545 L16,1.45454546 C16,0.651222186 15.3487778,0 14.5454545,0 Z"
+                      id="路径"></path>
+            </g>
+        </g>
+    </g>
+</svg>

+ 84 - 0
projects/common/src/axios/config.ts

@@ -0,0 +1,84 @@
+import { AxiosResponse, InternalAxiosRequestConfig } from './types'
+import { ElMessage } from 'element-plus'
+import qs from 'qs'
+import { SUCCESS_CODE, EXPIRE_CODE, TRANSFORM_REQUEST_DATA } from '../constants'
+// @ts-ignore
+import { API_URL_MESSAGE_TIP } from '@/utils/messageApi'
+import { API_URL_MESSAGE_TIP_COMMON } from '../api/messageApi'
+
+// import { useUserStoreWithOut } from '@common/src/store/modules/user'
+import { objToFormData } from '../utils'
+import { useUserStoreWithOut } from '../store/modules/user'
+import { usePermissionStoreWithOut } from '../store/modules/permission'
+
+const defaultRequestInterceptors = (config: InternalAxiosRequestConfig) => {
+  if (
+    config.method === 'post' &&
+    config.headers['Content-Type'] === 'application/x-www-form-urlencoded'
+  ) {
+    config.data = qs.stringify(config.data)
+  } else if (
+    TRANSFORM_REQUEST_DATA &&
+    config.method === 'post' &&
+    config.headers['Content-Type'] === 'multipart/form-data' &&
+    !(config.data instanceof FormData)
+  ) {
+    config.data = objToFormData(config.data)
+  }
+  if (config.method === 'get' && config.params) {
+    let url = config.url as string
+    url += '?'
+    const keys = Object.keys(config.params)
+    for (const key of keys) {
+      if (config.params[key] !== void 0 && config.params[key] !== null) {
+        url += `${key}=${encodeURIComponent(config.params[key])}&`
+      }
+    }
+    url = url.substring(0, url.length - 1)
+    config.params = {}
+    config.url = url
+  }
+  return config
+}
+
+const defaultResponseInterceptors = (response: AxiosResponse) => {
+  if (response.data.code === EXPIRE_CODE) {
+    ElMessage.warning('权限认证已过期,即将离开本页面')
+    setTimeout(() => {
+      const userStore = useUserStoreWithOut()
+      if (sessionStorage.getItem('flag')) {
+        const usePermissionStore = usePermissionStoreWithOut()
+        userStore.setToken('')
+        userStore.setUserInfo(undefined)
+        userStore.setRoleRouters([])
+        usePermissionStore.resetAddRouters()
+        window.location.href = response?.data?.attachments?.loginUrl
+      } else {
+        userStore.reset()
+      }
+    }, 3000)
+    return
+  }
+  if (response.data.success) {
+    const url: any = response?.config?.url?.split('?')[0]
+    // 统一处理需要展示提示信息的接口
+    if (API_URL_MESSAGE_TIP.includes(url) || API_URL_MESSAGE_TIP_COMMON.includes(url)) {
+      ElMessage.success(response?.data?.message)
+    }
+  }
+  // console.log(response)
+  if (response?.config?.responseType === 'blob') {
+    // 如果是文件流,直接过
+    // 当前业务处理形式  如果是文件流,直接过
+    return {
+      data: response.data,
+      name: response?.headers?.['content-disposition'] || '导出文件.xlsx'
+    }
+  } else if (response.data.success || response.data.code === SUCCESS_CODE) {
+    return response.data
+  } else {
+    ElMessage.error(response?.data?.message || 'Error Response')
+  }
+}
+
+export { defaultResponseInterceptors, defaultRequestInterceptors }

+ 42 - 0
projects/common/src/axios/index.ts

@@ -0,0 +1,42 @@
+import service from './service'
+import { CONTENT_TYPE } from '../constants'
+import { useUserStoreWithOut } from '../store/modules/user'
+
+const request = (option: AxiosConfig) => {
+  const { url, method, params, data, headers, responseType } = option
+
+  const userStore = useUserStoreWithOut()
+  return service.request({
+    url: url,
+    method,
+    params,
+    data: data,
+    responseType: responseType,
+    headers: {
+      'Content-Type': CONTENT_TYPE,
+      [userStore.getTokenKey ?? 'Authorization']: userStore.getToken ?? '',
+      ...headers
+    }
+  })
+}
+
+export default {
+  get: <T = any>(option: AxiosConfig) => {
+    return request({ method: 'get', ...option }) as Promise<IResponse<T>>
+  },
+  post: <T = any>(option: AxiosConfig) => {
+    return request({ method: 'post', ...option }) as Promise<IResponse<T>>
+  },
+  delete: <T = any>(option: AxiosConfig) => {
+    return request({ method: 'delete', ...option }) as Promise<IResponse<T>>
+  },
+  put: <T = any>(option: AxiosConfig) => {
+    return request({ method: 'put', ...option }) as Promise<IResponse<T>>
+  },
+  cancelRequest: (url: string | string[]) => {
+    return service.cancelRequest(url)
+  },
+  cancelAllRequest: () => {
+    return service.cancelAllRequest()
+  }
+}

+ 73 - 0
projects/common/src/axios/service.ts

@@ -0,0 +1,73 @@
+import axios from 'axios'
+import { defaultRequestInterceptors, defaultResponseInterceptors } from './config'
+
+import { AxiosInstance, InternalAxiosRequestConfig, RequestConfig, AxiosResponse } from './types'
+import { ElMessage } from 'element-plus'
+import { REQUEST_TIMEOUT } from '../constants'
+
+export const PATH_URL = import.meta.env.VITE_API_BASE_PATH
+
+const abortControllerMap: Map<string, AbortController> = new Map()
+const axiosInstance: AxiosInstance = axios.create({
+  timeout: REQUEST_TIMEOUT,
+  baseURL: PATH_URL
+})
+
+axiosInstance.interceptors.request.use((res: InternalAxiosRequestConfig) => {
+  const controller = new AbortController()
+  const url = res.url || ''
+  res.signal = controller.signal
+  abortControllerMap.set(url, controller)
+  return res
+})
+
+axiosInstance.interceptors.response.use(
+  (res: AxiosResponse) => {
+    const url = res.config.url || ''
+    abortControllerMap.delete(url)
+    // 这里不能做任何处理,否则后面的 interceptors 拿不到完整的上下文了
+    return res
+  },
+  (error) => {
+    console.log('err: ' + error) // for debug
+    ElMessage.error(error?.response?.data?.message || '请求失败')
+    return Promise.reject(error)
+  }
+)
+// 拦截器
+axiosInstance.interceptors.request.use(defaultRequestInterceptors)
+axiosInstance.interceptors.response.use(defaultResponseInterceptors)
+
+const service = {
+  request: (config: RequestConfig) => {
+    return new Promise((resolve, reject) => {
+      if (config.interceptors?.requestInterceptors) {
+        config = config.interceptors.requestInterceptors(config as any)
+      }
+
+      axiosInstance
+        .request(config)
+        .then((res) => {
+          resolve(res)
+        })
+        .catch((err: any) => {
+          reject(err)
+        })
+    })
+  },
+  cancelRequest: (url: string | string[]) => {
+    const urlList = Array.isArray(url) ? url : [url]
+    for (const _url of urlList) {
+      abortControllerMap.get(_url)?.abort()
+      abortControllerMap.delete(_url)
+    }
+  },
+  cancelAllRequest() {
+    for (const [_, controller] of abortControllerMap) {
+      controller.abort()
+    }
+    abortControllerMap.clear()
+  }
+}
+
+export default service

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

@@ -0,0 +1,31 @@
+import type {
+    InternalAxiosRequestConfig,
+    AxiosResponse,
+    AxiosRequestConfig,
+    AxiosInstance,
+    AxiosRequestHeaders,
+    AxiosError
+} from 'axios'
+
+interface RequestInterceptors<T> {
+    // 请求拦截
+    requestInterceptors?: (config: InternalAxiosRequestConfig) => InternalAxiosRequestConfig
+    requestInterceptorsCatch?: (err: any) => any
+    // 响应拦截
+    responseInterceptors?: (config: T) => T
+    responseInterceptorsCatch?: (err: any) => any
+}
+
+interface RequestConfig<T = AxiosResponse> extends AxiosRequestConfig {
+    interceptors?: RequestInterceptors<T>
+}
+
+export {
+    AxiosResponse,
+    RequestInterceptors,
+    RequestConfig,
+    AxiosInstance,
+    InternalAxiosRequestConfig,
+    AxiosRequestHeaders,
+    AxiosError
+}

+ 46 - 0
projects/common/src/business-components/BackButton.vue

@@ -0,0 +1,46 @@
+<!-- 
+  * 底部操作按钮
+  * 可配合 组件一起使用
+  * 也可以单独使用
+-->
+<template>
+  <div class="button-bottom">
+    <el-button @click="back"> {{ text }}</el-button>
+  </div>
+</template>
+
+<script setup>
+import { useRouter } from 'vue-router'
+
+const { go } = useRouter()
+
+defineProps({
+  text: {
+    type: String,
+    default: '返回'
+  }
+})
+const emits = defineEmits(['handle-back'])
+
+const back = () => {
+  go(-1)
+  emits('handle-back')
+}
+</script>
+
+<style lang="less">
+.button-bottom {
+  width: 100%;
+  background: #ffffff;
+  border-top: 1px solid var(--el-border-color);
+  // position: absolute;
+  bottom: 0;
+  left: 0;
+  display: flex;
+  justify-content: flex-end;
+  align-items: center;
+  z-index: 10;
+  padding-top: 16px;
+  margin-top: 16px;
+}
+</style>

+ 52 - 0
projects/common/src/business-components/ButtonBottom.vue

@@ -0,0 +1,52 @@
+<!-- 
+  * 底部操作按钮
+  * 可配合 组件一起使用
+  * 也可以单独使用
+-->
+<template>
+  <div class="button-bottom">
+    <el-button v-if="!hideSave" type="primary" @click="$emit('submit')"> {{ saveText }}</el-button>
+    <el-button v-if="!hideCancel" @click="$emit('close')"> {{ cancelText }}</el-button>
+  </div>
+</template>
+
+<script setup>
+import { defineProps, defineEmits } from 'vue'
+
+defineProps({
+  hideSave: {
+    type: Boolean,
+    default: false
+  },
+  saveText: {
+    type: String,
+    default: '保存'
+  },
+  hideCancel: {
+    type: Boolean,
+    default: false
+  },
+  cancelText: {
+    type: String,
+    default: '取消'
+  }
+})
+defineEmits(['submit', 'close'])
+</script>
+
+<style lang="less">
+.button-bottom {
+  width: 100%;
+  height: 64px;
+  background: #ffffff;
+  border-top: 1px solid var(--el-border-color);
+  // position: absolute;
+  bottom: 0;
+  left: 0;
+  display: flex;
+  justify-content: flex-end;
+  align-items: center;
+  z-index: 10;
+  // padding: 0 var(--el-card-padding);
+}
+</style>

+ 34 - 0
projects/common/src/business-components/DeptSelect.vue

@@ -0,0 +1,34 @@
+<script setup lang="ts">
+/*
+ * 表单组件 选择部门树
+ * */
+import { getDeptTree } from '../api'
+import { ref } from 'vue'
+
+const model = defineModel()
+const data = ref([])
+
+const getDeptTreeApi = async () => {
+  const res = await getDeptTree()
+  data.value = res.data
+}
+getDeptTreeApi()
+</script>
+
+<template>
+  <el-tree-select
+    v-model="model"
+    :data="data"
+    :render-after-expand="false"
+    check-strictly
+    check-on-click-node
+    clearable
+    :props="{
+      label: 'name'
+    }"
+    node-key="id"
+    v-bind="$attrs"
+  />
+</template>
+
+<style scoped lang="less"></style>

+ 44 - 0
projects/common/src/business-components/DistrictSelect.vue

@@ -0,0 +1,44 @@
+<script setup lang="ts">
+import { getDistrictTree } from '../api'
+import { ref } from 'vue'
+
+const props = defineProps({
+  // 最顶级节点是否disabled
+  topDisabled: {
+    type: Boolean,
+    default: false
+  }
+})
+
+const model = defineModel()
+const data = ref([])
+
+const getDistrictTreeApi = async () => {
+  const res = await getDistrictTree()
+  data.value = res.data
+  if (props.topDisabled) {
+    res.data[0].disabled = true
+  }
+}
+getDistrictTreeApi()
+</script>
+
+<template>
+  <el-tree-select
+    v-model="model"
+    :data="data"
+    :render-after-expand="false"
+    :default-expanded-keys="['3600']"
+    check-strictly
+    check-on-click-node
+    clearable
+    :props="{
+      label: 'name'
+    }"
+    node-key="id"
+    v-bind="$attrs"
+    class="min-w-180px w-100%"
+  />
+</template>
+
+<style scoped lang="less"></style>

+ 3 - 0
projects/common/src/business-components/DynamicForm/index.ts

@@ -0,0 +1,3 @@
+import DynamicForm from './src/DynamicForm.vue'
+
+export default DynamicForm

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä