Browse Source

refactor: 使用`eslint.config.js`替换`.eslintrc.js`并遵循`esm`语法 (#786)

xiaoming 1 year ago
parent
commit
5b7dd8c3e2
100 changed files with 423 additions and 416 deletions
  1. 2 2
      .eslintignore
  2. 0 123
      .eslintrc.cjs
  3. 1 1
      build/info.ts
  4. 1 4
      commitlint.config.cjs
  5. 174 0
      eslint.config.js
  6. 2 3
      package.json
  7. 54 92
      pnpm-lock.yaml
  8. 1 1
      src/components/ReAnimateSelector/src/index.vue
  9. 1 1
      src/components/ReCountTo/src/normal/props.ts
  10. 1 1
      src/components/ReCountTo/src/rebound/props.ts
  11. 1 1
      src/components/ReCropper/src/index.tsx
  12. 2 2
      src/components/ReDialog/index.vue
  13. 1 1
      src/components/ReFlicker/index.ts
  14. 0 1
      src/components/ReFlop/src/filpper.tsx
  15. 1 1
      src/components/ReFlowChart/src/NodePanel.vue
  16. 1 1
      src/components/ReIcon/src/Select.vue
  17. 2 2
      src/components/ReIcon/src/hooks.ts
  18. 2 2
      src/components/ReQrcode/src/index.tsx
  19. 3 3
      src/components/ReSeamlessScroll/src/index.vue
  20. 0 1
      src/components/ReSelector/src/index.tsx
  21. 1 1
      src/components/ReSplitPane/index.tsx
  22. 1 1
      src/config/index.ts
  23. 8 8
      src/layout/components/appMain.vue
  24. 2 2
      src/layout/components/navbar.vue
  25. 1 1
      src/layout/components/notice/index.vue
  26. 1 1
      src/layout/components/notice/noticeList.vue
  27. 2 2
      src/layout/components/search/components/SearchModal.vue
  28. 4 4
      src/layout/components/setting/index.vue
  29. 1 1
      src/layout/components/sidebar/breadCrumb.vue
  30. 3 3
      src/layout/components/sidebar/horizontal.vue
  31. 4 4
      src/layout/components/sidebar/mixNav.vue
  32. 1 1
      src/layout/components/sidebar/sidebarItem.vue
  33. 4 4
      src/layout/components/tag/index.vue
  34. 2 2
      src/layout/frameView.vue
  35. 1 1
      src/layout/hooks/useDataThemeChange.ts
  36. 1 1
      src/layout/hooks/useNav.ts
  37. 2 2
      src/layout/hooks/useTag.ts
  38. 1 1
      src/layout/theme/index.ts
  39. 1 1
      src/main.ts
  40. 1 1
      src/plugins/element-plus/index.ts
  41. 1 1
      src/plugins/i18n.ts
  42. 3 3
      src/router/index.ts
  43. 4 4
      src/router/utils.ts
  44. 1 1
      src/store/modules/app.ts
  45. 1 1
      src/store/modules/multiTags.ts
  46. 1 1
      src/store/modules/permission.ts
  47. 1 1
      src/store/modules/settings.ts
  48. 1 1
      src/store/modules/types.ts
  49. 2 2
      src/store/modules/user.ts
  50. 4 4
      src/utils/http/index.ts
  51. 1 1
      src/utils/http/types.d.ts
  52. 1 1
      src/utils/localforage/index.ts
  53. 1 1
      src/utils/message.ts
  54. 2 2
      src/utils/propTypes.ts
  55. 1 1
      src/utils/responsive.ts
  56. 2 2
      src/utils/sso.ts
  57. 4 4
      src/views/able/cascader.vue
  58. 6 6
      src/views/able/directives.vue
  59. 1 1
      src/views/able/menu-tree.vue
  60. 3 3
      src/views/able/pdf.vue
  61. 3 3
      src/views/able/print.vue
  62. 1 1
      src/views/able/video-frame/index.vue
  63. 1 1
      src/views/able/virtual-list/horizontal.vue
  64. 1 1
      src/views/able/virtual-list/vertical.vue
  65. 1 1
      src/views/able/watermark.vue
  66. 5 5
      src/views/able/wavesurfer/index.vue
  67. 4 4
      src/views/about/index.vue
  68. 2 2
      src/views/components/danmaku/index.vue
  69. 2 2
      src/views/components/dialog/form.vue
  70. 1 1
      src/views/components/dialog/formPrimitive.vue
  71. 2 2
      src/views/components/draggable/index.vue
  72. 1 1
      src/views/components/segmented/index.vue
  73. 3 3
      src/views/components/selector/index.vue
  74. 1 1
      src/views/editor/components/multi.vue
  75. 4 4
      src/views/error/403.vue
  76. 4 4
      src/views/error/404.vue
  77. 4 4
      src/views/error/500.vue
  78. 2 2
      src/views/flow-chart/index.vue
  79. 3 3
      src/views/list/card/index.vue
  80. 2 2
      src/views/login/components/phone.vue
  81. 5 5
      src/views/login/components/regist.vue
  82. 4 4
      src/views/login/components/update.vue
  83. 5 5
      src/views/login/index.vue
  84. 1 1
      src/views/nested/menu1/menu1-2/menu1-2-2/index.vue
  85. 6 6
      src/views/permission/button/index.vue
  86. 1 1
      src/views/pure-table/high.vue
  87. 4 4
      src/views/pure-table/high/data.ts
  88. 1 1
      src/views/pure-table/high/excel/index.vue
  89. 2 2
      src/views/pure-table/high/prints/index.vue
  90. 1 1
      src/views/pure-table/high/table-select/multiple/index.vue
  91. 1 1
      src/views/pure-table/index.vue
  92. 1 1
      src/views/system/dept/form.vue
  93. 1 1
      src/views/system/dept/utils/hook.tsx
  94. 2 2
      src/views/system/role/utils/hook.tsx
  95. 3 3
      src/views/system/user/form/index.vue
  96. 1 1
      src/views/system/user/form/role.vue
  97. 1 1
      src/views/system/user/index.vue
  98. 1 1
      src/views/system/user/tree.vue
  99. 1 1
      src/views/system/user/upload.vue
  100. 1 1
      src/views/system/user/utils/hook.tsx

+ 2 - 2
.eslintignore

@@ -3,9 +3,9 @@ dist
 *.d.ts
 /src/assets
 package.json
-.eslintrc.cjs
+eslint.config.js 
 .prettierrc.js
-commitlint.config.js
+commitlint.config.cjs
 postcss.config.js
 tailwind.config.ts
 stylelint.config.cjs

+ 0 - 123
.eslintrc.cjs

@@ -1,123 +0,0 @@
-// @ts-check
-const { defineConfig } = require("eslint-define-config");
-
-module.exports = defineConfig({
-  root: true,
-  env: {
-    node: true
-  },
-  globals: {
-    // Ref sugar (take 2)
-    $: "readonly",
-    $$: "readonly",
-    $ref: "readonly",
-    $shallowRef: "readonly",
-    $computed: "readonly",
-
-    // index.d.ts
-    // global.d.ts
-    Fn: "readonly",
-    PromiseFn: "readonly",
-    RefType: "readonly",
-    LabelValueOptions: "readonly",
-    EmitType: "readonly",
-    TargetContext: "readonly",
-    ComponentElRef: "readonly",
-    ComponentRef: "readonly",
-    ElRef: "readonly",
-    global: "readonly",
-    ForDataType: "readonly",
-    ComponentRoutes: "readonly",
-
-    // script setup
-    defineProps: "readonly",
-    defineEmits: "readonly",
-    defineExpose: "readonly",
-    withDefaults: "readonly"
-  },
-  extends: [
-    "plugin:vue/vue3-essential",
-    "eslint:recommended",
-    "@vue/typescript/recommended",
-    "@vue/prettier",
-    "@vue/eslint-config-typescript"
-  ],
-  parser: "vue-eslint-parser",
-  parserOptions: {
-    parser: "@typescript-eslint/parser",
-    ecmaVersion: "latest",
-    sourceType: "module",
-    jsxPragma: "React",
-    ecmaFeatures: {
-      jsx: true
-    }
-  },
-  overrides: [
-    {
-      files: ["*.ts", "*.vue"],
-      rules: {
-        "no-undef": "off"
-      }
-    },
-    {
-      files: ["*.vue"],
-      parser: "vue-eslint-parser",
-      parserOptions: {
-        parser: "@typescript-eslint/parser",
-        extraFileExtensions: [".vue"],
-        ecmaVersion: "latest",
-        ecmaFeatures: {
-          jsx: true
-        }
-      },
-      rules: {
-        "no-undef": "off"
-      }
-    }
-  ],
-  rules: {
-    "vue/no-v-html": "off",
-    "vue/require-default-prop": "off",
-    "vue/require-explicit-emits": "off",
-    "vue/multi-word-component-names": "off",
-    "@typescript-eslint/no-explicit-any": "off", // any
-    "no-debugger": "off",
-    "@typescript-eslint/explicit-module-boundary-types": "off", // setup()
-    "@typescript-eslint/ban-types": "off",
-    "@typescript-eslint/ban-ts-comment": "off",
-    "@typescript-eslint/no-empty-function": "off",
-    "@typescript-eslint/no-non-null-assertion": "off",
-    "vue/html-self-closing": [
-      "error",
-      {
-        html: {
-          void: "always",
-          normal: "always",
-          component: "always"
-        },
-        svg: "always",
-        math: "always"
-      }
-    ],
-    "@typescript-eslint/no-unused-vars": [
-      "error",
-      {
-        argsIgnorePattern: "^_",
-        varsIgnorePattern: "^_"
-      }
-    ],
-    "no-unused-vars": [
-      "error",
-      {
-        argsIgnorePattern: "^_",
-        varsIgnorePattern: "^_"
-      }
-    ],
-    "prettier/prettier": [
-      "error",
-      {
-        endOfLine: "auto"
-      }
-    ]
-  }
-});

+ 1 - 1
build/info.ts

@@ -1,7 +1,7 @@
 import type { Plugin } from "vite";
 import picocolors from "picocolors";
-import dayjs, { Dayjs } from "dayjs";
 import { getPackageSize } from "./utils";
+import dayjs, { type Dayjs } from "dayjs";
 import duration from "dayjs/plugin/duration";
 dayjs.extend(duration);
 

+ 1 - 4
commitlint.config.js → commitlint.config.cjs

@@ -1,7 +1,4 @@
-// @ts-check
-
-/** @type {import("@commitlint/types").UserConfig} */
-export default {
+module.exports = {
   ignores: [commit => commit.includes("init")],
   extends: ["@commitlint/config-conventional"],
   rules: {

+ 174 - 0
eslint.config.js

@@ -0,0 +1,174 @@
+import js from "@eslint/js";
+import pluginVue from "eslint-plugin-vue";
+import * as parserVue from "vue-eslint-parser";
+import configPrettier from "eslint-config-prettier";
+import pluginPrettier from "eslint-plugin-prettier";
+import { defineFlatConfig } from "eslint-define-config";
+import * as parserTypeScript from "@typescript-eslint/parser";
+import pluginTypeScript from "@typescript-eslint/eslint-plugin";
+
+export default defineFlatConfig([
+  {
+    ...js.configs.recommended,
+    ignores: ["src/assets/**", "src/**/iconfont/**"],
+    languageOptions: {
+      globals: {
+        // index.d.ts
+        RefType: "readonly",
+        EmitType: "readonly",
+        TargetContext: "readonly",
+        ComponentRef: "readonly",
+        ElRef: "readonly",
+        ForDataType: "readonly",
+        AnyFunction: "readonly",
+        PropType: "readonly",
+        Writable: "readonly",
+        Nullable: "readonly",
+        NonNullable: "readonly",
+        Recordable: "readonly",
+        ReadonlyRecordable: "readonly",
+        Indexable: "readonly",
+        DeepPartial: "readonly",
+        Without: "readonly",
+        Exclusive: "readonly",
+        TimeoutHandle: "readonly",
+        IntervalHandle: "readonly",
+        Effect: "readonly",
+        ChangeEvent: "readonly",
+        WheelEvent: "readonly",
+        ImportMetaEnv: "readonly",
+        Fn: "readonly",
+        PromiseFn: "readonly",
+        ComponentElRef: "readonly",
+        parseInt: "readonly",
+        parseFloat: "readonly"
+      }
+    },
+    plugins: {
+      prettier: pluginPrettier
+    },
+    rules: {
+      ...configPrettier.rules,
+      ...pluginPrettier.configs.recommended.rules,
+      "no-debugger": "off",
+      "no-unused-vars": [
+        "error",
+        {
+          argsIgnorePattern: "^_",
+          varsIgnorePattern: "^_"
+        }
+      ],
+      "prettier/prettier": [
+        "error",
+        {
+          endOfLine: "auto"
+        }
+      ]
+    }
+  },
+  {
+    files: ["**/*.?([cm])ts", "**/*.?([cm])tsx"],
+    languageOptions: {
+      parser: parserTypeScript,
+      parserOptions: {
+        sourceType: "module"
+      }
+    },
+    plugins: {
+      "@typescript-eslint": pluginTypeScript
+    },
+    rules: {
+      ...pluginTypeScript.configs.strict.rules,
+      "@typescript-eslint/ban-types": "off",
+      "@typescript-eslint/no-redeclare": "error",
+      "@typescript-eslint/ban-ts-comment": "off",
+      "@typescript-eslint/no-explicit-any": "off",
+      "@typescript-eslint/prefer-as-const": "warn",
+      "@typescript-eslint/no-empty-function": "off",
+      "@typescript-eslint/no-non-null-assertion": "off",
+      "@typescript-eslint/no-import-type-side-effects": "error",
+      "@typescript-eslint/explicit-module-boundary-types": "off",
+      "@typescript-eslint/consistent-type-imports": [
+        "error",
+        { disallowTypeAnnotations: false, fixStyle: "inline-type-imports" }
+      ],
+      "@typescript-eslint/prefer-literal-enum-member": [
+        "error",
+        { allowBitwiseExpressions: true }
+      ],
+      "@typescript-eslint/no-unused-vars": [
+        "error",
+        {
+          argsIgnorePattern: "^_",
+          varsIgnorePattern: "^_"
+        }
+      ]
+    }
+  },
+  {
+    files: ["**/*.d.ts"],
+    rules: {
+      "eslint-comments/no-unlimited-disable": "off",
+      "import/no-duplicates": "off",
+      "unused-imports/no-unused-vars": "off"
+    }
+  },
+  {
+    files: ["**/*.?([cm])js"],
+    rules: {
+      "@typescript-eslint/no-require-imports": "off",
+      "@typescript-eslint/no-var-requires": "off"
+    }
+  },
+  {
+    files: ["**/*.vue"],
+    languageOptions: {
+      globals: {
+        $: "readonly",
+        $$: "readonly",
+        $computed: "readonly",
+        $customRef: "readonly",
+        $ref: "readonly",
+        $shallowRef: "readonly",
+        $toRef: "readonly"
+      },
+      parser: parserVue,
+      parserOptions: {
+        ecmaFeatures: {
+          jsx: true
+        },
+        extraFileExtensions: [".vue"],
+        parser: "@typescript-eslint/parser",
+        sourceType: "module"
+      }
+    },
+    plugins: {
+      vue: pluginVue
+    },
+    processor: pluginVue.processors[".vue"],
+    rules: {
+      ...pluginVue.configs.base.rules,
+      ...pluginVue.configs["vue3-essential"].rules,
+      ...pluginVue.configs["vue3-recommended"].rules,
+      "no-undef": "off",
+      "no-unused-vars": "off",
+      "vue/no-v-html": "off",
+      "vue/require-default-prop": "off",
+      "vue/require-explicit-emits": "off",
+      "vue/multi-word-component-names": "off",
+      "vue/no-setup-props-reactivity-loss": "off",
+      "vue/html-self-closing": [
+        "error",
+        {
+          html: {
+            void: "always",
+            normal: "always",
+            component: "always"
+          },
+          svg: "always",
+          math: "always"
+        }
+      ]
+    }
+  }
+]);

+ 2 - 3
package.json

@@ -105,7 +105,7 @@
   "devDependencies": {
     "@commitlint/cli": "^18.2.0",
     "@commitlint/config-conventional": "^18.1.0",
-    "@commitlint/types": "^18.4.0",
+    "@eslint/js": "^8.53.0",
     "@faker-js/faker": "^8.2.0",
     "@iconify-icons/ep": "^1.2.12",
     "@iconify-icons/ri": "^1.2.10",
@@ -123,12 +123,11 @@
     "@typescript-eslint/parser": "^6.10.0",
     "@vitejs/plugin-vue": "^4.4.1",
     "@vitejs/plugin-vue-jsx": "^3.0.2",
-    "@vue/eslint-config-prettier": "^8.0.0",
-    "@vue/eslint-config-typescript": "^12.0.0",
     "autoprefixer": "^10.4.16",
     "cloc": "^2.11.0",
     "cssnano": "^6.0.1",
     "eslint": "^8.53.0",
+    "eslint-config-prettier": "^9.0.0",
     "eslint-define-config": "^1.24.1",
     "eslint-plugin-prettier": "^5.0.1",
     "eslint-plugin-vue": "^9.18.1",

+ 54 - 92
pnpm-lock.yaml

@@ -175,9 +175,9 @@ devDependencies:
   '@commitlint/config-conventional':
     specifier: ^18.1.0
     version: 18.1.0
-  '@commitlint/types':
-    specifier: ^18.4.0
-    version: 18.4.0
+  '@eslint/js':
+    specifier: ^8.53.0
+    version: 8.53.0
   '@faker-js/faker':
     specifier: ^8.2.0
     version: 8.2.0
@@ -229,12 +229,6 @@ devDependencies:
   '@vitejs/plugin-vue-jsx':
     specifier: ^3.0.2
     version: 3.0.2(vite@5.0.0-beta.17)(vue@3.3.8)
-  '@vue/eslint-config-prettier':
-    specifier: ^8.0.0
-    version: 8.0.0(eslint@8.53.0)(prettier@3.0.3)
-  '@vue/eslint-config-typescript':
-    specifier: ^12.0.0
-    version: 12.0.0(eslint-plugin-vue@9.18.1)(eslint@8.53.0)(typescript@5.2.2)
   autoprefixer:
     specifier: ^10.4.16
     version: 10.4.16(postcss@8.4.31)
@@ -247,12 +241,15 @@ devDependencies:
   eslint:
     specifier: ^8.53.0
     version: 8.53.0
+  eslint-config-prettier:
+    specifier: ^9.0.0
+    version: 9.0.0(eslint@8.53.0)
   eslint-define-config:
     specifier: ^1.24.1
     version: 1.24.1
   eslint-plugin-prettier:
     specifier: ^5.0.1
-    version: 5.0.1(eslint-config-prettier@8.10.0)(eslint@8.53.0)(prettier@3.0.3)
+    version: 5.0.1(eslint-config-prettier@9.0.0)(eslint@8.53.0)(prettier@3.0.3)
   eslint-plugin-vue:
     specifier: ^9.18.1
     version: 9.18.1(eslint@8.53.0)
@@ -778,10 +775,10 @@ packages:
     engines: {node: '>=v18'}
     hasBin: true
     dependencies:
-      '@commitlint/format': 18.1.0
-      '@commitlint/lint': 18.1.0
-      '@commitlint/load': 18.2.0(typescript@5.2.2)
-      '@commitlint/read': 18.1.0
+      '@commitlint/format': 18.4.0
+      '@commitlint/lint': 18.4.0
+      '@commitlint/load': 18.4.0(typescript@5.2.2)
+      '@commitlint/read': 18.4.0
       '@commitlint/types': 18.4.0
       execa: 5.1.1
       lodash.isfunction: 3.0.9
@@ -799,16 +796,16 @@ packages:
       conventional-changelog-conventionalcommits: 7.0.2
     dev: true
 
-  /@commitlint/config-validator@18.1.0:
-    resolution: {integrity: sha512-kbHkIuItXn93o2NmTdwi5Mk1ujyuSIysRE/XHtrcps/27GuUKEIqBJp6TdJ4Sq+ze59RlzYSHMKuDKZbfg9+uQ==}
+  /@commitlint/config-validator@18.4.0:
+    resolution: {integrity: sha512-1y6qHMU3o4cYQSK+Y9EnmH6H1GRiwQGjnLIUOIKlekrmfc8MrMk1ByNmb8od4vK3qHJAaL/77/5n+1uyyIF5dA==}
     engines: {node: '>=v18'}
     dependencies:
       '@commitlint/types': 18.4.0
       ajv: 8.12.0
     dev: true
 
-  /@commitlint/ensure@18.1.0:
-    resolution: {integrity: sha512-CkPzJ9UBumIo54VDcpmBlaVX81J++wzEhN3DJH9+6PaLeiIG+gkSx8t7C2gfwG7PaiW4HzQtdQlBN5ab+c4vFQ==}
+  /@commitlint/ensure@18.4.0:
+    resolution: {integrity: sha512-N5cJo/n61ULSwz3W5Iz/IZJ0I9H/PaHc+OMcF2XcRVbLa6B3YwzEW66XGCRKVULlsBNSrIH6tk5un9ayXAXIdw==}
     engines: {node: '>=v18'}
     dependencies:
       '@commitlint/types': 18.4.0
@@ -819,44 +816,44 @@ packages:
       lodash.upperfirst: 4.3.1
     dev: true
 
-  /@commitlint/execute-rule@18.1.0:
-    resolution: {integrity: sha512-w3Vt4K+O7+nSr9/gFSEfZ1exKUOPSlJaRpnk7Y+XowEhvwT7AIk1HNANH+gETf0zGZ020+hfiMW/Ome+SNCUsg==}
+  /@commitlint/execute-rule@18.4.0:
+    resolution: {integrity: sha512-g013SWki6ZWhURBLOSXTaVQGWHdA0QlPJGiW4a+YpThezmJOemvc4LiKVpn13AjSKQ40QnmBqpBrxujOaSo+3A==}
     engines: {node: '>=v18'}
     dev: true
 
-  /@commitlint/format@18.1.0:
-    resolution: {integrity: sha512-So/w217tGWMZZb1yXcUFNF2qFLyYtSVqbnGoMbX8a+JKcG4oB11Gc1adS0ssUOMivtiNpaLtkSHFynyiwtJtiQ==}
+  /@commitlint/format@18.4.0:
+    resolution: {integrity: sha512-MiAe4D5/ahty38CzULdQbpRa3ReKZtx0kyigOWcntq+N5uqez+Ac4/MO7H+3j1kC4G7nfJVfBu6TqcXeyNvhCQ==}
     engines: {node: '>=v18'}
     dependencies:
       '@commitlint/types': 18.4.0
       chalk: 4.1.2
     dev: true
 
-  /@commitlint/is-ignored@18.1.0:
-    resolution: {integrity: sha512-fa1fY93J/Nx2GH6r6WOLdBOiL7x9Uc1N7wcpmaJ1C5Qs6P+rPSUTkofe2IOhSJIJoboHfAH6W0ru4xtK689t0Q==}
+  /@commitlint/is-ignored@18.4.0:
+    resolution: {integrity: sha512-vyBKBj3Q4N3Xe4ZQcJXW9ef6gVrDL9Fl2HXnnC3F0Qt/F6E4runhJkEuUh5DB3WCXTJUHIJkByKPqrnz4RNrZw==}
     engines: {node: '>=v18'}
     dependencies:
       '@commitlint/types': 18.4.0
       semver: 7.5.4
     dev: true
 
-  /@commitlint/lint@18.1.0:
-    resolution: {integrity: sha512-LGB3eI5UYu5LLayibNrRM4bSbowr1z9uyqvp0c7+0KaSJi+xHxy/QEhb6fy4bMAtbXEvygY0sUu9HxSWg41rVQ==}
+  /@commitlint/lint@18.4.0:
+    resolution: {integrity: sha512-Wkkf1DPVeLdHYGqtzMBfWoMbUtCojvlzDR89OKVic1rid41iZbb0FzTcwgMYs/1TNWNxoIq9PVVwY7ovLX1aJQ==}
     engines: {node: '>=v18'}
     dependencies:
-      '@commitlint/is-ignored': 18.1.0
-      '@commitlint/parse': 18.1.0
-      '@commitlint/rules': 18.1.0
+      '@commitlint/is-ignored': 18.4.0
+      '@commitlint/parse': 18.4.0
+      '@commitlint/rules': 18.4.0
       '@commitlint/types': 18.4.0
     dev: true
 
-  /@commitlint/load@18.2.0(typescript@5.2.2):
-    resolution: {integrity: sha512-xjX3d3CRlOALwImhOsmLYZh14/+gW/KxsY7+bPKrzmGuFailf9K7ckhB071oYZVJdACnpY4hDYiosFyOC+MpAA==}
+  /@commitlint/load@18.4.0(typescript@5.2.2):
+    resolution: {integrity: sha512-7unGl1HGRNMgWrUPmj8OFkJyuNUMb6xA1i53/OAFKd9l+U3C4WTfoJe3t/TUz8vKZLCaDcWWR/b2cw5HveBBFg==}
     engines: {node: '>=v18'}
     dependencies:
-      '@commitlint/config-validator': 18.1.0
-      '@commitlint/execute-rule': 18.1.0
-      '@commitlint/resolve-extends': 18.1.0
+      '@commitlint/config-validator': 18.4.0
+      '@commitlint/execute-rule': 18.4.0
+      '@commitlint/resolve-extends': 18.4.0
       '@commitlint/types': 18.4.0
       '@types/node': 18.18.9
       chalk: 4.1.2
@@ -870,13 +867,13 @@ packages:
       - typescript
     dev: true
 
-  /@commitlint/message@18.1.0:
-    resolution: {integrity: sha512-8dT/jJg73wf3o2Mut/fqEDTpBYSIEVtX5PWyuY/0uviEYeheZAczFo/VMIkeGzhJJn1IrcvAwWsvJ1lVGY2I/w==}
+  /@commitlint/message@18.4.0:
+    resolution: {integrity: sha512-3kg6NQO6pJ+VdBTWi51KInT8ngkxPJaW+iI7URtUALjKcO9K4XY3gf80ZPmS1hDessrjb7qCr1lau8eWMINAQw==}
     engines: {node: '>=v18'}
     dev: true
 
-  /@commitlint/parse@18.1.0:
-    resolution: {integrity: sha512-23yv8uBweXWYn8bXk4PjHIsmVA+RkbqPh2h7irupBo2LthVlzMRc4LM6UStasScJ4OlXYYaWOmuP7jcExUF50Q==}
+  /@commitlint/parse@18.4.0:
+    resolution: {integrity: sha512-SxTCSUZH8CJNYWOlFg18YUQ2RLz8ubXKbpHUIiSNwCbiQx7UDCydp1JnhoB4sOYOxgV8d3nuDwYluRU5KnEY4A==}
     engines: {node: '>=v18'}
     dependencies:
       '@commitlint/types': 18.4.0
@@ -884,22 +881,22 @@ packages:
       conventional-commits-parser: 5.0.0
     dev: true
 
-  /@commitlint/read@18.1.0:
-    resolution: {integrity: sha512-rzfzoKUwxmvYO81tI5o1371Nwt3vhcQR36oTNfupPdU1jgSL3nzBIS3B93LcZh3IYKbCIMyMPN5WZ10BXdeoUg==}
+  /@commitlint/read@18.4.0:
+    resolution: {integrity: sha512-IpnABCbDeOw5npZ09SZZGLfd3T7cFtsxUYm6wT3aGmIB2fXKE3fMeuj3jxXjMibiGIyA3Z5voCMuOcKWpkNySA==}
     engines: {node: '>=v18'}
     dependencies:
-      '@commitlint/top-level': 18.1.0
+      '@commitlint/top-level': 18.4.0
       '@commitlint/types': 18.4.0
       fs-extra: 11.1.1
       git-raw-commits: 2.0.11
       minimist: 1.2.8
     dev: true
 
-  /@commitlint/resolve-extends@18.1.0:
-    resolution: {integrity: sha512-3mZpzOEJkELt7BbaZp6+bofJyxViyObebagFn0A7IHaLARhPkWTivXdjvZHS12nAORftv88Yhbh8eCPKfSvB7g==}
+  /@commitlint/resolve-extends@18.4.0:
+    resolution: {integrity: sha512-qhgU6ach+S6sJMD9NjCYiEycOObGhxzWQLQzqlScJCv9zkPs15Bg0ffLXTQ3z7ipXv46XEKYMnSJzjLRw2Tlkg==}
     engines: {node: '>=v18'}
     dependencies:
-      '@commitlint/config-validator': 18.1.0
+      '@commitlint/config-validator': 18.4.0
       '@commitlint/types': 18.4.0
       import-fresh: 3.3.0
       lodash.mergewith: 4.6.2
@@ -907,24 +904,24 @@ packages:
       resolve-global: 1.0.0
     dev: true
 
-  /@commitlint/rules@18.1.0:
-    resolution: {integrity: sha512-VJNQ674CRv4znI0DbsjZLVnn647J+BTxHGcrDIsYv7c99gW7TUGeIe5kL80G7l8+5+N0se8v9yn+Prr8xEy6Yw==}
+  /@commitlint/rules@18.4.0:
+    resolution: {integrity: sha512-T3ChRxQZ6g0iNCpVLc6KeQId0/86TnyQA8PFkng+dWElO2DAA5km/yirgKZV1Xlc+gF7Rf6d+a0ottxdKpOY+w==}
     engines: {node: '>=v18'}
     dependencies:
-      '@commitlint/ensure': 18.1.0
-      '@commitlint/message': 18.1.0
-      '@commitlint/to-lines': 18.1.0
+      '@commitlint/ensure': 18.4.0
+      '@commitlint/message': 18.4.0
+      '@commitlint/to-lines': 18.4.0
       '@commitlint/types': 18.4.0
       execa: 5.1.1
     dev: true
 
-  /@commitlint/to-lines@18.1.0:
-    resolution: {integrity: sha512-aHIoSDjG0ckxPLYDpODUeSLbEKmF6Jrs1B5JIssbbE9eemBtXtjm9yzdiAx9ZXcwoHlhbTp2fbndDb3YjlvJag==}
+  /@commitlint/to-lines@18.4.0:
+    resolution: {integrity: sha512-bZXuCtfBPjNgtEnG3gwJrveIgfKK2UdhIhFvKpMTrQl/gAwoto/3mzmE7qGAHwmuP4eZ2U8X7iwMnqIlWmv2Tw==}
     engines: {node: '>=v18'}
     dev: true
 
-  /@commitlint/top-level@18.1.0:
-    resolution: {integrity: sha512-1/USHlolIxJlsfLKecSXH+6PDojIvnzaJGPYwF7MtnTuuXCNQ4izkeqDsRuNMe9nU2VIKpK9OT8Q412kGNmgGw==}
+  /@commitlint/top-level@18.4.0:
+    resolution: {integrity: sha512-TfulcA8UHF7MZ6tm4Ci3aqZgMBZa1OoCg4prccWHvwG/hsHujZ7+0FKbeKqDbcSli/YWm4NJwEjl4uh5itIJeA==}
     engines: {node: '>=v18'}
     dependencies:
       find-up: 5.0.0
@@ -2378,41 +2375,6 @@ packages:
   /@vue/devtools-api@6.5.1:
     resolution: {integrity: sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA==}
 
-  /@vue/eslint-config-prettier@8.0.0(eslint@8.53.0)(prettier@3.0.3):
-    resolution: {integrity: sha512-55dPqtC4PM/yBjhAr+yEw6+7KzzdkBuLmnhBrDfp4I48+wy+Giqqj9yUr5T2uD/BkBROjjmqnLZmXRdOx/VtQg==}
-    peerDependencies:
-      eslint: '>= 8.0.0'
-      prettier: '>= 3.0.0'
-    dependencies:
-      eslint: 8.53.0
-      eslint-config-prettier: 8.10.0(eslint@8.53.0)
-      eslint-plugin-prettier: 5.0.1(eslint-config-prettier@8.10.0)(eslint@8.53.0)(prettier@3.0.3)
-      prettier: 3.0.3
-    transitivePeerDependencies:
-      - '@types/eslint'
-    dev: true
-
-  /@vue/eslint-config-typescript@12.0.0(eslint-plugin-vue@9.18.1)(eslint@8.53.0)(typescript@5.2.2):
-    resolution: {integrity: sha512-StxLFet2Qe97T8+7L8pGlhYBBr8Eg05LPuTDVopQV6il+SK6qqom59BA/rcFipUef2jD8P2X44Vd8tMFytfvlg==}
-    engines: {node: ^14.17.0 || >=16.0.0}
-    peerDependencies:
-      eslint: ^6.2.0 || ^7.0.0 || ^8.0.0
-      eslint-plugin-vue: ^9.0.0
-      typescript: '*'
-    peerDependenciesMeta:
-      typescript:
-        optional: true
-    dependencies:
-      '@typescript-eslint/eslint-plugin': 6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.2.2)
-      '@typescript-eslint/parser': 6.10.0(eslint@8.53.0)(typescript@5.2.2)
-      eslint: 8.53.0
-      eslint-plugin-vue: 9.18.1(eslint@8.53.0)
-      typescript: 5.2.2
-      vue-eslint-parser: 9.3.2(eslint@8.53.0)
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
   /@vue/language-core@1.8.22(typescript@5.2.2):
     resolution: {integrity: sha512-bsMoJzCrXZqGsxawtUea1cLjUT9dZnDsy5TuZ+l1fxRMzUGQUG9+Ypq4w//CqpWmrx7nIAJpw2JVF/t258miRw==}
     peerDependencies:
@@ -4224,8 +4186,8 @@ packages:
     optionalDependencies:
       source-map: 0.6.1
 
-  /eslint-config-prettier@8.10.0(eslint@8.53.0):
-    resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==}
+  /eslint-config-prettier@9.0.0(eslint@8.53.0):
+    resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==}
     hasBin: true
     peerDependencies:
       eslint: '>=7.0.0'
@@ -4238,7 +4200,7 @@ packages:
     engines: {node: '>=18.0.0', npm: '>=9.0.0', pnpm: '>= 8.6.0'}
     dev: true
 
-  /eslint-plugin-prettier@5.0.1(eslint-config-prettier@8.10.0)(eslint@8.53.0)(prettier@3.0.3):
+  /eslint-plugin-prettier@5.0.1(eslint-config-prettier@9.0.0)(eslint@8.53.0)(prettier@3.0.3):
     resolution: {integrity: sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==}
     engines: {node: ^14.18.0 || >=16.0.0}
     peerDependencies:
@@ -4253,7 +4215,7 @@ packages:
         optional: true
     dependencies:
       eslint: 8.53.0
-      eslint-config-prettier: 8.10.0(eslint@8.53.0)
+      eslint-config-prettier: 9.0.0(eslint@8.53.0)
       prettier: 3.0.3
       prettier-linter-helpers: 1.0.0
       synckit: 0.8.5

+ 1 - 1
src/components/ReAnimateSelector/src/index.vue

@@ -81,8 +81,8 @@ function onMouseleave() {
     placeholder="请选择动画"
     clearable
     filterable
-    @clear="onClear"
     :filter-method="filterMethod"
+    @clear="onClear"
   >
     <template #empty>
       <div class="w-[280px]">

+ 1 - 1
src/components/ReCountTo/src/normal/props.ts

@@ -1,4 +1,4 @@
-import { PropType } from "vue";
+import type { PropType } from "vue";
 import propTypes from "@/utils/propTypes";
 export const countToProps = {
   startVal: propTypes.number.def(0),

+ 1 - 1
src/components/ReCountTo/src/rebound/props.ts

@@ -1,4 +1,4 @@
-import { PropType } from "vue";
+import type { PropType } from "vue";
 import propTypes from "@/utils/propTypes";
 export const reboundProps = {
   delay: propTypes.number.def(1),

+ 1 - 1
src/components/ReCropper/src/index.tsx

@@ -10,7 +10,7 @@ import {
   ref,
   unref,
   computed,
-  PropType,
+  type PropType,
   onMounted,
   onUnmounted,
   defineComponent

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

@@ -84,11 +84,11 @@ function handleClose(
 
 <template>
   <el-dialog
-    class="pure-dialog"
     v-for="(options, index) in dialogStore"
     :key="index"
     v-bind="options"
     v-model="options.visible"
+    class="pure-dialog"
     :fullscreen="fullscreen ? true : options?.fullscreen ? true : false"
     @close="handleClose(options, index)"
     @opened="eventsCallBack('open', options, index)"
@@ -123,8 +123,8 @@ function handleClose(
         </i>
       </div>
       <component
-        v-else
         :is="options?.headerRenderer({ close, titleId, titleClass })"
+        v-else
       />
     </template>
     <component

+ 1 - 1
src/components/ReFlicker/index.ts

@@ -1,5 +1,5 @@
 import "./index.css";
-import { h, defineComponent, Component } from "vue";
+import { h, defineComponent, type Component } from "vue";
 
 export interface attrsType {
   width?: string;

+ 0 - 1
src/components/ReFlop/src/filpper.tsx

@@ -18,7 +18,6 @@ export default defineComponent({
   name: "ReFlop",
   props,
   setup(props) {
-    // eslint-disable-next-line vue/no-setup-props-destructure
     const { frontText, backText, duration } = props;
     const isFlipping = ref(false);
     const flipType = ref("down");

+ 1 - 1
src/components/ReFlowChart/src/NodePanel.vue

@@ -35,9 +35,9 @@ const nodeDragNode = item => {
   <!-- 左侧bpmn元素选择器 -->
   <div class="node-panel">
     <div
-      class="node-item dark:text-bg_color"
       v-for="item in props.nodeList"
       :key="item.text"
+      class="node-item dark:text-bg_color"
       @mousedown="nodeDragNode(item)"
     >
       <div class="node-item-icon" :class="item.class">

+ 1 - 1
src/components/ReIcon/src/Select.vue

@@ -151,8 +151,8 @@ watch(
           </template>
 
           <el-input
-            class="px-2 pt-2"
             v-model="filterValue"
+            class="px-2 pt-2"
             placeholder="搜索图标"
             clearable
           />

+ 2 - 2
src/components/ReIcon/src/hooks.ts

@@ -1,5 +1,5 @@
-import { iconType } from "./types";
-import { h, defineComponent, Component } from "vue";
+import type { iconType } from "./types";
+import { h, defineComponent, type Component } from "vue";
 import { IconifyIconOnline, IconifyIconOffline, FontIcon } from "../index";
 
 /**

+ 2 - 2
src/components/ReQrcode/src/index.tsx

@@ -4,13 +4,13 @@ import {
   watch,
   nextTick,
   computed,
-  PropType,
+  type PropType,
   defineComponent
 } from "vue";
 import "./index.scss";
 import propTypes from "@/utils/propTypes";
 import { isString, cloneDeep } from "@pureadmin/utils";
-import QRCode, { QRCodeRenderersOptions } from "qrcode";
+import QRCode, { type QRCodeRenderersOptions } from "qrcode";
 import RefreshRight from "@iconify-icons/ep/refresh-right";
 
 interface QrcodeLogo {

+ 3 - 3
src/components/ReSeamlessScroll/src/index.vue

@@ -498,16 +498,16 @@ defineExpose({
 <template>
   <div :ref="'wrap' + props.classOption['key']">
     <div
-      :style="leftSwitch"
       v-if="navigation"
+      :style="leftSwitch"
       :class="leftSwitchClass"
       @click="leftSwitchClick"
     >
       <slot name="left-switch" />
     </div>
     <div
-      :style="rightSwitch"
       v-if="navigation"
+      :style="rightSwitch"
       :class="rightSwitchClass"
       @click="rightSwitchClick"
     >
@@ -526,7 +526,7 @@ defineExpose({
       <div :ref="'slotList' + props.classOption['key']" :style="float">
         <slot />
       </div>
-      <div v-html="copyHtml" :style="float" />
+      <div :style="float" v-html="copyHtml" />
     </div>
   </div>
 </template>

+ 0 - 1
src/components/ReSelector/src/index.tsx

@@ -55,7 +55,6 @@ export default defineComponent({
   emits: ["selectedVal"],
   setup(props, { emit }) {
     const instance = getCurrentInstance();
-    // eslint-disable-next-line vue/no-setup-props-destructure
     const currentValue = props.value;
 
     const rateDisabled = computed(() => {

+ 1 - 1
src/components/ReSplitPane/index.tsx

@@ -1,4 +1,4 @@
-import { defineComponent, ref, unref, computed, PropType } from "vue";
+import { defineComponent, ref, unref, computed, type PropType } from "vue";
 import resizer from "./resizer";
 import "./index.css";
 

+ 1 - 1
src/config/index.ts

@@ -1,4 +1,4 @@
-import { App } from "vue";
+import type { App } from "vue";
 import axios from "axios";
 
 let config: object = {};

+ 8 - 8
src/layout/components/appMain.vue

@@ -50,6 +50,12 @@ const getSectionStyle = computed(() => {
 });
 
 const transitionMain = defineComponent({
+  props: {
+    route: {
+      type: undefined,
+      required: true
+    }
+  },
   render() {
     const transitionName =
       transitions.value(this.route)?.name || "fade-transform";
@@ -72,12 +78,6 @@ const transitionMain = defineComponent({
         default: () => [this.$slots.default()]
       }
     );
-  },
-  props: {
-    route: {
-      type: undefined,
-      required: true
-    }
   }
 });
 </script>
@@ -118,8 +118,8 @@ const transitionMain = defineComponent({
                 />
               </keep-alive>
               <component
-                v-else
                 :is="Component"
+                v-else
                 :key="route.fullPath"
                 class="main-content"
               />
@@ -140,8 +140,8 @@ const transitionMain = defineComponent({
               />
             </keep-alive>
             <component
-              v-else
               :is="Component"
+              v-else
               :key="route.fullPath"
               class="main-content"
             />

+ 2 - 2
src/layout/components/navbar.vue

@@ -62,8 +62,8 @@ const { t, locale, translationCh, translationEn } = useTranslationLang();
               @click="translationCh"
             >
               <IconifyIconOffline
-                class="check-zh"
                 v-show="locale === 'zh'"
+                class="check-zh"
                 :icon="Check"
               />
               简体中文
@@ -73,7 +73,7 @@ const { t, locale, translationCh, translationEn } = useTranslationLang();
               :class="['dark:!text-white', getDropdownItemClass(locale, 'en')]"
               @click="translationEn"
             >
-              <span class="check-en" v-show="locale === 'en'">
+              <span v-show="locale === 'en'" class="check-en">
                 <IconifyIconOffline :icon="Check" />
               </span>
               English

+ 1 - 1
src/layout/components/notice/index.vue

@@ -23,8 +23,8 @@ notices.value.map(v => (noticesNum.value += v.list.length));
     <template #dropdown>
       <el-dropdown-menu>
         <el-tabs
-          :stretch="true"
           v-model="activeKey"
+          :stretch="true"
           class="dropdown-tabs"
           :style="{ width: notices.length === 0 ? '200px' : '330px' }"
         >

+ 1 - 1
src/layout/components/notice/noticeList.vue

@@ -15,8 +15,8 @@ const props = defineProps({
   <div v-if="props.list.length">
     <NoticeItem
       v-for="(item, index) in props.list"
-      :noticeItem="item"
       :key="index"
+      :noticeItem="item"
     />
   </div>
   <el-empty v-else description="暂无数据" />

+ 2 - 2
src/layout/components/search/components/SearchModal.vue

@@ -146,9 +146,9 @@ onKeyStroke("ArrowDown", handleDown);
 
 <template>
   <el-dialog
+    v-model="show"
     top="5vh"
     class="pure-search-dialog"
-    v-model="show"
     :show-close="false"
     :width="device === 'mobile' ? '80vw' : '40vw'"
     :before-close="handleClose"
@@ -161,8 +161,8 @@ onKeyStroke("ArrowDown", handleDown);
   >
     <el-input
       ref="inputRef"
-      size="large"
       v-model="keyword"
+      size="large"
       clearable
       placeholder="搜索菜单(中文模式下支持拼音搜索)"
       @input="handleSearch"

+ 4 - 4
src/layout/components/setting/index.vue

@@ -254,8 +254,8 @@ onBeforeMount(() => {
         popper-class="pure-tooltip"
       >
         <li
-          :class="layoutTheme.layout === 'vertical' ? 'is-select' : ''"
           ref="verticalRef"
+          :class="layoutTheme.layout === 'vertical' ? 'is-select' : ''"
           @click="setLayoutModel('vertical')"
         >
           <div />
@@ -272,8 +272,8 @@ onBeforeMount(() => {
         popper-class="pure-tooltip"
       >
         <li
-          :class="layoutTheme.layout === 'horizontal' ? 'is-select' : ''"
           ref="horizontalRef"
+          :class="layoutTheme.layout === 'horizontal' ? 'is-select' : ''"
           @click="setLayoutModel('horizontal')"
         >
           <div />
@@ -290,8 +290,8 @@ onBeforeMount(() => {
         popper-class="pure-tooltip"
       >
         <li
-          :class="layoutTheme.layout === 'mix' ? 'is-select' : ''"
           ref="mixRef"
+          :class="layoutTheme.layout === 'mix' ? 'is-select' : ''"
           @click="setLayoutModel('mix')"
         >
           <div />
@@ -304,8 +304,8 @@ onBeforeMount(() => {
     <ul class="theme-color">
       <li
         v-for="(item, index) in themeColors"
-        :key="index"
         v-show="showThemeColors(item.themeColor)"
+        :key="index"
         :style="getThemeColorStyle(item.color)"
         @click="setLayoutThemeColor(item.themeColor)"
       >

+ 1 - 1
src/layout/components/sidebar/breadCrumb.vue

@@ -108,9 +108,9 @@ watch(
   <el-breadcrumb class="!leading-[50px] select-none" separator="/">
     <transition-group name="breadcrumb">
       <el-breadcrumb-item
-        class="!inline !items-stretch"
         v-for="item in levelList"
         :key="item.path"
+        class="!inline !items-stretch"
       >
         <a @click.prevent="handleLink(item)">
           {{ transformI18n(item.meta.title) }}

+ 3 - 3
src/layout/components/sidebar/horizontal.vue

@@ -48,8 +48,8 @@ nextTick(() => {
       <span>{{ title }}</span>
     </div>
     <el-menu
-      router
       ref="menuRef"
+      router
       mode="horizontal"
       class="horizontal-header-menu"
       :default-active="defaultActive"
@@ -78,7 +78,7 @@ nextTick(() => {
               :class="['dark:!text-white', getDropdownItemClass(locale, 'zh')]"
               @click="translationCh"
             >
-              <span class="check-zh" v-show="locale === 'zh'">
+              <span v-show="locale === 'zh'" class="check-zh">
                 <IconifyIconOffline :icon="Check" />
               </span>
               简体中文
@@ -88,7 +88,7 @@ nextTick(() => {
               :class="['dark:!text-white', getDropdownItemClass(locale, 'en')]"
               @click="translationEn"
             >
-              <span class="check-en" v-show="locale === 'en'">
+              <span v-show="locale === 'en'" class="check-en">
                 <IconifyIconOffline :icon="Check" />
               </span>
               English

+ 4 - 4
src/layout/components/sidebar/mixNav.vue

@@ -61,12 +61,12 @@ watch(
 <template>
   <div
     v-if="device !== 'mobile'"
-    class="horizontal-header"
     v-loading="usePermissionStoreHook().wholeMenus.length === 0"
+    class="horizontal-header"
   >
     <el-menu
-      router
       ref="menuRef"
+      router
       mode="horizontal"
       class="horizontal-header-menu"
       :default-active="defaultActive"
@@ -111,7 +111,7 @@ watch(
               :class="['dark:!text-white', getDropdownItemClass(locale, 'zh')]"
               @click="translationCh"
             >
-              <span class="check-zh" v-show="locale === 'zh'">
+              <span v-show="locale === 'zh'" class="check-zh">
                 <IconifyIconOffline :icon="Check" />
               </span>
               简体中文
@@ -121,7 +121,7 @@ watch(
               :class="['dark:!text-white', getDropdownItemClass(locale, 'en')]"
               @click="translationEn"
             >
-              <span class="check-en" v-show="locale === 'en'">
+              <span v-show="locale === 'en'" class="check-en">
                 <IconifyIconOffline :icon="Check" />
               </span>
               English

+ 1 - 1
src/layout/components/sidebar/sidebarItem.vue

@@ -275,7 +275,6 @@ function resolvePath(routePath) {
         {{ transformI18n(props.item.meta.title) }}
       </span>
       <div
-        :style="getSubMenuDivStyle(props.item)"
         v-if="
           !(
             isCollapse &&
@@ -283,6 +282,7 @@ function resolvePath(routePath) {
             props.item.parentId === null
           )
         "
+        :style="getSubMenuDivStyle(props.item)"
       >
         <el-tooltip
           v-if="layout !== 'horizontal'"

+ 4 - 4
src/layout/components/tag/index.vue

@@ -518,15 +518,15 @@ onBeforeUnmount(() => {
 </script>
 
 <template>
-  <div ref="containerDom" class="tags-view" v-if="!showTags">
+  <div v-if="!showTags" ref="containerDom" class="tags-view">
     <span v-show="isShowArrow" class="arrow-left">
       <IconifyIconOffline :icon="ArrowLeftSLine" @click="handleScroll(200)" />
     </span>
     <div ref="scrollbarDom" class="scroll-container">
-      <div class="tab select-none" ref="tabDom" :style="getTabStyle">
+      <div ref="tabDom" class="tab select-none" :style="getTabStyle">
         <div
-          :ref="'dynamic' + index"
           v-for="(item, index) in multiTags"
+          :ref="'dynamic' + index"
           :key="index"
           :class="['scroll-item is-closable', linkIsActive(item)]"
           @contextmenu.prevent="openMenu(item, $event)"
@@ -550,8 +550,8 @@ onBeforeUnmount(() => {
             <IconifyIconOffline :icon="CloseBold" />
           </span>
           <div
-            :ref="'schedule' + index"
             v-if="showModel !== 'card'"
+            :ref="'schedule' + index"
             :class="[scheduleIsActive(item)]"
           />
         </div>

+ 2 - 2
src/layout/frameView.vue

@@ -46,11 +46,11 @@ onMounted(() => {
 
 <template>
   <div
-    class="frame"
     v-loading="loading"
+    class="frame"
     :element-loading-text="t('status.hsLoad')"
   >
-    <iframe :src="frameSrc" class="frame-iframe" ref="frameRef" />
+    <iframe ref="frameRef" :src="frameSrc" class="frame-iframe" />
   </div>
 </template>
 

+ 1 - 1
src/layout/hooks/useDataThemeChange.ts

@@ -1,8 +1,8 @@
 import { ref } from "vue";
 import { getConfig } from "@/config";
 import { useLayout } from "./useLayout";
-import { themeColorsType } from "../types";
 import { useGlobal } from "@pureadmin/utils";
+import type { themeColorsType } from "../types";
 import { useEpThemeStoreHook } from "@/store/modules/epTheme";
 import {
   darken,

+ 1 - 1
src/layout/hooks/useNav.ts

@@ -2,10 +2,10 @@ import { storeToRefs } from "pinia";
 import { getConfig } from "@/config";
 import { useRouter } from "vue-router";
 import { emitter } from "@/utils/mitt";
-import { routeMetaType } from "../types";
 import userAvatar from "@/assets/user.jpg";
 import { getTopMenu } from "@/router/utils";
 import { useGlobal } from "@pureadmin/utils";
+import type { routeMetaType } from "../types";
 import { transformI18n } from "@/plugins/i18n";
 import { router, remainingPaths } from "@/router";
 import { computed, type CSSProperties } from "vue";

+ 2 - 2
src/layout/hooks/useTag.ts

@@ -4,10 +4,10 @@ import {
   computed,
   reactive,
   onMounted,
-  CSSProperties,
+  type CSSProperties,
   getCurrentInstance
 } from "vue";
-import { tagsViewsType } from "../types";
+import type { tagsViewsType } from "../types";
 import { useRoute, useRouter } from "vue-router";
 import { transformI18n, $t } from "@/plugins/i18n";
 import { responsiveStorageNameSpace } from "@/config";

+ 1 - 1
src/layout/theme/index.ts

@@ -2,7 +2,7 @@
  * @description ⚠️:此文件仅供主题插件使用,请不要在此文件中导出别的工具函数(仅在页面加载前运行)
  */
 
-import { type multipleScopeVarsOptions } from "@pureadmin/theme";
+import type { multipleScopeVarsOptions } from "@pureadmin/theme";
 
 /** 预设主题色 */
 const themeColors = {

+ 1 - 1
src/main.ts

@@ -4,9 +4,9 @@ import { setupStore } from "@/store";
 import ElementPlus from "element-plus";
 import { useI18n } from "@/plugins/i18n";
 import { getPlatformConfig } from "./config";
-import { createApp, Directive } from "vue";
 import { MotionPlugin } from "@vueuse/motion";
 import { useEcharts } from "@/plugins/echarts";
+import { createApp, type Directive } from "vue";
 import { injectResponsiveStorage } from "@/utils/responsive";
 
 import Table from "@pureadmin/table";

+ 1 - 1
src/plugins/element-plus/index.ts

@@ -1,4 +1,4 @@
-import { App, Component } from "vue";
+import type { App, Component } from "vue";
 import {
   ElTag,
   ElAffix,

+ 1 - 1
src/plugins/i18n.ts

@@ -1,6 +1,6 @@
 // 多组件库的国际化和本地项目国际化兼容
-import { App, WritableComputedRef } from "vue";
 import { type I18n, createI18n } from "vue-i18n";
+import type { App, WritableComputedRef } from "vue";
 import { responsiveStorageNameSpace } from "@/config";
 import { storageLocal, isObject } from "@pureadmin/utils";
 

+ 3 - 3
src/router/index.ts

@@ -20,10 +20,10 @@ import {
   formatFlatteningRoutes
 } from "./utils";
 import {
-  Router,
+  type Router,
   createRouter,
-  RouteRecordRaw,
-  RouteComponent
+  type RouteRecordRaw,
+  type RouteComponent
 } from "vue-router";
 import {
   type DataInfo,

+ 4 - 4
src/router/utils.ts

@@ -1,7 +1,7 @@
 import {
-  RouterHistory,
-  RouteRecordRaw,
-  RouteComponent,
+  type RouterHistory,
+  type RouteRecordRaw,
+  type RouteComponent,
   createWebHistory,
   createWebHashHistory
 } from "vue-router";
@@ -17,7 +17,7 @@ import {
   isIncludeAllChildren
 } from "@pureadmin/utils";
 import { getConfig } from "@/config";
-import { menuType } from "@/layout/types";
+import type { menuType } from "@/layout/types";
 import { buildHierarchyTree } from "@/utils/tree";
 import { userKey, type DataInfo } from "@/utils/auth";
 import { useMultiTagsStoreHook } from "@/store/modules/multiTags";

+ 1 - 1
src/store/modules/app.ts

@@ -1,6 +1,6 @@
 import { store } from "@/store";
-import { appType } from "./types";
 import { defineStore } from "pinia";
+import type { appType } from "./types";
 import { getConfig, responsiveStorageNameSpace } from "@/config";
 import { deviceDetection, storageLocal } from "@pureadmin/utils";
 

+ 1 - 1
src/store/modules/multiTags.ts

@@ -1,8 +1,8 @@
 import { defineStore } from "pinia";
 import { store } from "@/store";
 import { routerArrays } from "@/layout/types";
-import { multiType, positionType } from "./types";
 import { responsiveStorageNameSpace } from "@/config";
+import type { multiType, positionType } from "./types";
 import { isEqual, isBoolean, isUrl, storageLocal } from "@pureadmin/utils";
 
 export const useMultiTagsStore = defineStore({

+ 1 - 1
src/store/modules/permission.ts

@@ -1,6 +1,6 @@
 import { defineStore } from "pinia";
 import { store } from "@/store";
-import { cacheType } from "./types";
+import type { cacheType } from "./types";
 import { constantMenus } from "@/router";
 import { useMultiTagsStoreHook } from "./multiTags";
 import { debounce, getKeyList } from "@pureadmin/utils";

+ 1 - 1
src/store/modules/settings.ts

@@ -1,7 +1,7 @@
 import { defineStore } from "pinia";
 import { store } from "@/store";
-import { setType } from "./types";
 import { getConfig } from "@/config";
+import type { setType } from "./types";
 
 export const useSettingStore = defineStore({
   id: "pure-setting",

+ 1 - 1
src/store/modules/types.ts

@@ -1,4 +1,4 @@
-import { RouteRecordName } from "vue-router";
+import type { RouteRecordName } from "vue-router";
 
 export type cacheType = {
   mode: string;

+ 2 - 2
src/store/modules/user.ts

@@ -1,11 +1,11 @@
 import { defineStore } from "pinia";
 import { store } from "@/store";
-import { userType } from "./types";
+import type { userType } from "./types";
 import { routerArrays } from "@/layout/types";
 import { router, resetRouter } from "@/router";
 import { storageLocal } from "@pureadmin/utils";
 import { getLogin, refreshTokenApi } from "@/api/user";
-import { UserResult, RefreshTokenResult } from "@/api/user";
+import type { UserResult, RefreshTokenResult } from "@/api/user";
 import { useMultiTagsStoreHook } from "@/store/modules/multiTags";
 import { type DataInfo, setToken, removeToken, userKey } from "@/utils/auth";
 

+ 4 - 4
src/utils/http/index.ts

@@ -1,9 +1,9 @@
 import Axios, {
-  AxiosInstance,
-  AxiosRequestConfig,
-  CustomParamsSerializer
+  type AxiosInstance,
+  type AxiosRequestConfig,
+  type CustomParamsSerializer
 } from "axios";
-import {
+import type {
   PureHttpError,
   RequestMethods,
   PureHttpResponse,

+ 1 - 1
src/utils/http/types.d.ts

@@ -1,4 +1,4 @@
-import Axios, {
+import type {
   Method,
   AxiosError,
   AxiosResponse,

+ 1 - 1
src/utils/localforage/index.ts

@@ -1,5 +1,5 @@
 import forage from "localforage";
-import { LocalForage, ProxyStorage, ExpiresData } from "./types.d";
+import type { LocalForage, ProxyStorage, ExpiresData } from "./types.d";
 
 class StorageProxy implements ProxyStorage {
   protected storage: LocalForage;

+ 1 - 1
src/utils/message.ts

@@ -1,4 +1,4 @@
-import { type VNode } from "vue";
+import type { VNode } from "vue";
 import { isFunction } from "@pureadmin/utils";
 import { type MessageHandler, ElMessage } from "element-plus";
 

+ 2 - 2
src/utils/propTypes.ts

@@ -2,8 +2,8 @@ import type { CSSProperties, VNodeChild } from "vue";
 import {
   createTypes,
   toValidableType,
-  VueTypesInterface,
-  VueTypeValidableDef
+  type VueTypesInterface,
+  type VueTypeValidableDef
 } from "vue-types";
 
 export type VueNode = VNodeChild | JSX.Element;

+ 1 - 1
src/utils/responsive.ts

@@ -1,5 +1,5 @@
 // 响应式storage
-import { App } from "vue";
+import type { App } from "vue";
 import Storage from "responsive-storage";
 import { routerArrays } from "@/layout/types";
 import { responsiveStorageNameSpace } from "@/config";

+ 2 - 2
src/utils/sso.ts

@@ -40,8 +40,8 @@ import { subBefore, getQueryMap } from "@pureadmin/utils";
     setToken(params);
 
     // 删除不需要显示在 url 的参数
-    delete params["roles"];
-    delete params["accessToken"];
+    delete params.roles;
+    delete params.accessToken;
 
     const newUrl = `${location.origin}${location.pathname}${subBefore(
       location.hash,

+ 4 - 4
src/views/able/cascader.vue

@@ -32,8 +32,8 @@ const handleChange = value => {
           <span class="imp">
             1. 二级联动(不带“全部”选项)
             <el-cascader
-              :options="provinceAndCityData"
               v-model="selectedOptions1"
+              :options="provinceAndCityData"
               @change="handleChange"
             />
           </span>
@@ -61,8 +61,8 @@ const handleChange = value => {
           <span class="imp">
             2. 二级联动(带有“全部”选项)
             <el-cascader
-              :options="provinceAndCityDataPlus"
               v-model="selectedOptions3"
+              :options="provinceAndCityDataPlus"
               @change="handleChange"
             />
           </span>
@@ -90,8 +90,8 @@ const handleChange = value => {
           <span class="imp">
             3. 三级联动(不带“全部”选项)
             <el-cascader
-              :options="regionData"
               v-model="selectedOptions2"
+              :options="regionData"
               @change="handleChange"
             />
           </span>
@@ -121,8 +121,8 @@ const handleChange = value => {
           <span class="imp">
             4. 三级联动(带"全部选项")
             <el-cascader
-              :options="regionDataPlus"
               v-model="selectedOptions4"
+              :options="regionDataPlus"
               @change="handleChange"
             />
           </span>

+ 6 - 6
src/views/able/directives.vue

@@ -62,13 +62,13 @@ function onReset() {
     <div class="mb-2">
       防抖指令(连续输入,只会执行第一次点击事件,立即执行)
       <el-input
+        v-model="search"
         v-optimize="{
           event: 'input',
           fn: onInput,
           immediate: true,
           timeout: 1000
         }"
-        v-model="search"
         class="!w-[200px]"
         clearable
         @clear="onInput"
@@ -77,8 +77,8 @@ function onReset() {
     <div class="mb-2">
       防抖指令(连续输入,只会执行最后一次事件,延后执行)
       <el-input
-        v-optimize="{ event: 'input', fn: onInputTwo, timeout: 400 }"
         v-model="searchTwo"
+        v-optimize="{ event: 'input', fn: onInputTwo, timeout: 400 }"
         class="!w-[200px]"
         clearable
       />
@@ -86,13 +86,13 @@ function onReset() {
     <div>
       防抖指令(连续输入,只会执行最后一次事件,延后执行,传参用法)
       <el-input
+        v-model="searchThree"
         v-optimize="{
           event: 'input',
           fn: onInputThree,
           timeout: 400,
           params: { name: '小明', sex: '男' }
         }"
-        v-model="searchThree"
         class="!w-[200px]"
         clearable
       />
@@ -103,8 +103,8 @@ function onReset() {
     <div class="mb-2">
       节流指令(连续输入,每一秒只会执行一次事件)
       <el-input
-        v-optimize:throttle="{ event: 'input', fn: onInputFour, timeout: 1000 }"
         v-model="searchFour"
+        v-optimize:throttle="{ event: 'input', fn: onInputFour, timeout: 1000 }"
         class="!w-[200px]"
         clearable
       />
@@ -112,12 +112,12 @@ function onReset() {
     <div>
       节流指令(连续输入,每一秒只会执行一次事件,传参用法)
       <el-input
+        v-model="searchFive"
         v-optimize:throttle="{
           event: 'input',
           fn: onInputFive,
           params: { name: '小明', sex: '男' }
         }"
-        v-model="searchFive"
         class="!w-[200px]"
         clearable
       />
@@ -127,7 +127,7 @@ function onReset() {
 
     <div class="mb-2">
       文本复制指令(双击输入框内容即可复制)
-      <el-input v-copy="searchSix" v-model="searchSix" class="!w-[200px]" />
+      <el-input v-model="searchSix" v-copy="searchSix" class="!w-[200px]" />
     </div>
     <div>
       文本复制指令(自定义触发事件,单击复制)

+ 1 - 1
src/views/able/menu-tree.vue

@@ -61,8 +61,8 @@ const filterMethod = (query: string, node: treeNode) => {
       </div>
     </template>
     <el-input
-      class="mb-4"
       v-model="query"
+      class="mb-4"
       placeholder="请输入关键字查找"
       clearable
       @input="onQueryChanged"

+ 3 - 3
src/views/able/pdf.vue

@@ -49,8 +49,8 @@ const onPrint = () => {
       </div>
     </template>
     <div
-      class="h-[calc(100vh-239px)]"
       v-loading="loading"
+      class="h-[calc(100vh-239px)]"
       :element-loading-text="t('status.hsLoad')"
     >
       <div class="flex justify-between items-center h-9">
@@ -59,9 +59,9 @@ const onPrint = () => {
         </div>
         <div v-else>
           <el-pagination
+            v-model:current-page="currentPage"
             background
             layout="prev, slot, next"
-            v-model:current-page="currentPage"
             :page-size="1"
             :total="pageCount"
           >
@@ -98,8 +98,8 @@ const onPrint = () => {
       </div>
       <el-scrollbar>
         <vue-pdf-embed
-          class="h-full container overflow-auto"
           ref="pdfRef"
+          class="h-full container overflow-auto"
           :rotation="rotations[currentRotation]"
           :page="currentPage"
           :source="source"

+ 3 - 3
src/views/able/print.vue

@@ -103,12 +103,12 @@ const tableData: User[] = [
     </template>
     <el-row :gutter="24">
       <el-col
+        v-motion
         :xs="24"
         :sm="24"
         :md="24"
         :lg="24"
         :xl="24"
-        v-motion
         :initial="{
           opacity: 0,
           y: 100
@@ -138,12 +138,12 @@ const tableData: User[] = [
       <el-divider />
 
       <el-col
+        v-motion
         :xs="11"
         :sm="11"
         :md="11"
         :lg="11"
         :xl="11"
-        v-motion
         :initial="{
           opacity: 0,
           y: 100
@@ -161,12 +161,12 @@ const tableData: User[] = [
       </el-col>
 
       <el-col
+        v-motion
         :xs="11"
         :sm="11"
         :md="11"
         :lg="11"
         :xl="11"
-        v-motion
         :initial="{
           opacity: 0,
           y: 100

+ 1 - 1
src/views/able/video-frame/index.vue

@@ -155,9 +155,9 @@ onBeforeUnmount(() => {
       />
     </div>
     <div
+      id="canvas-container"
       v-loading="loading"
       element-loading-text="温馨提示:可左右拖拽图片并单击选取所需的帧图片"
-      id="canvas-container"
       class="w-full h-[200px] overflow-hidden mt-6"
     />
   </el-card>

+ 1 - 1
src/views/able/virtual-list/horizontal.vue

@@ -23,9 +23,9 @@ const filteredItems = computed(() => {
     <div class="flex-ac mb-4 shadow-2xl">
       水平模式 horizontal
       <el-input
+        v-model="search"
         class="mr-2 !w-[1/1.5]"
         clearable
-        v-model="search"
         placeholder="Filter..."
         style="width: 300px"
       />

+ 1 - 1
src/views/able/virtual-list/vertical.vue

@@ -23,9 +23,9 @@ const filteredItems = computed(() => {
     <div class="flex-ac mb-4 shadow-2xl">
       垂直模式 vertical
       <el-input
+        v-model="search"
         class="!w-[350px]"
         clearable
-        v-model="search"
         placeholder="Filter..."
       />
     </div>

+ 1 - 1
src/views/able/watermark.vue

@@ -42,9 +42,9 @@ onBeforeUnmount(() => {
     </template>
     <span> 请输入要创建水印的值:</span>
     <el-input
+      v-model="value"
       class="mb-4 mr-4"
       style="width: 200px"
-      v-model="value"
       clearable
     />
     <span>请选择要创建水印的颜色:</span>

+ 5 - 5
src/views/able/wavesurfer/index.vue

@@ -105,41 +105,41 @@ onBeforeUnmount(() => {
       element-loading-background="transparent"
     >
       <div ref="wavesurferRef" />
-      <div class="flex justify-between" v-show="totalTime">
+      <div v-show="totalTime" class="flex justify-between">
         <span class="text-[#81888f]">00:00</span>
         <h1 class="text-4xl mt-2">{{ curTime }}</h1>
         <span class="text-[#81888f]">{{ totalTime }}</span>
       </div>
-      <div class="flex mt-2 w-[180px] justify-around m-auto" v-show="totalTime">
+      <div v-show="totalTime" class="flex mt-2 w-[180px] justify-around m-auto">
         <Rewind
-          class="cursor-pointer"
           v-tippy="{
             content: '快退(可长按)',
             placement: 'bottom',
             animation: 'scale'
           }"
           v-longpress:0:100="() => wavesurfer?.skip(-1)"
+          class="cursor-pointer"
         />
         <div
-          class="cursor-pointer"
           v-tippy="{
             content: isPlay ? '暂停' : '播放',
             placement: 'bottom',
             animation: 'scale'
           }"
+          class="cursor-pointer"
           @click="wavesurfer?.playPause()"
         >
           <Play v-if="isPlay" v-motion-pop />
           <Pause v-else v-motion-pop />
         </div>
         <Forward
-          class="cursor-pointer"
           v-tippy="{
             content: '快进(可长按)',
             placement: 'bottom',
             animation: 'scale'
           }"
           v-longpress:0:100="() => wavesurfer?.skip(1)"
+          class="cursor-pointer"
         />
       </div>
     </div>

+ 4 - 4
src/views/about/index.vue

@@ -57,11 +57,11 @@ Object.keys(devDependencies).forEach(key => {
       </template>
       <el-descriptions border>
         <el-descriptions-item
+          v-for="(item, index) in schema"
+          :key="index"
           :label="item.label"
           label-align="left"
           align="left"
-          v-for="(item, index) in schema"
-          :key="index"
         >
           <a
             :href="'https://www.npmjs.com/package/' + item.label"
@@ -81,11 +81,11 @@ Object.keys(devDependencies).forEach(key => {
       </template>
       <el-descriptions border>
         <el-descriptions-item
+          v-for="(item, index) in devSchema"
+          :key="index"
           :label="item.label"
           label-align="left"
           align="left"
-          v-for="(item, index) in devSchema"
-          :key="index"
         >
           <a
             :href="'https://www.npmjs.com/package/' + item.label"

+ 2 - 2
src/views/components/danmaku/index.vue

@@ -120,8 +120,8 @@ function addDanmu() {
     <div class="flex gap-5">
       <vue-danmaku
         ref="danmaku"
-        class="demo"
         v-model:danmus="danmus"
+        class="demo"
         isSuspend
         v-bind="config"
       >
@@ -176,9 +176,9 @@ function addDanmu() {
         </p>
         <p class="flex">
           <el-input
+            v-model="danmuMsg"
             type="text"
             placeholder="输入评论后,回车发送弹幕"
-            v-model="danmuMsg"
             @keyup.enter="addDanmu"
           />
         </p>

+ 2 - 2
src/views/components/dialog/form.vue

@@ -27,15 +27,15 @@ const newFormInline = ref(props.formInline);
   <el-form :model="newFormInline">
     <el-form-item label="姓名">
       <el-input
-        class="!w-[220px]"
         v-model="newFormInline.user"
+        class="!w-[220px]"
         placeholder="请输入姓名"
       />
     </el-form-item>
     <el-form-item label="城市">
       <el-select
-        class="!w-[220px]"
         v-model="newFormInline.region"
+        class="!w-[220px]"
         placeholder="请选择城市"
       >
         <el-option label="上海" value="上海" />

+ 1 - 1
src/views/components/dialog/formPrimitive.vue

@@ -18,5 +18,5 @@ const data = useVModel(props, "data", emit);
 </script>
 
 <template>
-  <el-input class="!w-[220px]" v-model="data" placeholder="请输入内容" />
+  <el-input v-model="data" class="!w-[220px]" placeholder="请输入内容" />
 </template>

+ 2 - 2
src/views/components/draggable/index.vue

@@ -110,10 +110,10 @@ onMounted(() => {
             <draggable
               v-model="lists"
               item-key="name"
-              @change="change"
               chosen-class="chosen"
               force-fallback="true"
               animation="300"
+              @change="change"
             >
               <template #item="{ element, index }">
                 <div class="item-single">{{ element.name }} {{ index }}</div>
@@ -132,9 +132,9 @@ onMounted(() => {
             <!-- 拖拽实现元素位置切换 -->
             <div class="cut-container">
               <div
-                class="item-cut"
                 v-for="(item, index) in cutLists"
                 :key="index"
+                class="item-cut"
               >
                 <p>{{ item.name }}</p>
               </div>

+ 1 - 1
src/views/components/segmented/index.vue

@@ -163,7 +163,7 @@ function onChange({ index, option }) {
         {{ optionsBasis[value].label }}
       </span>
     </p>
-    <Segmented :options="optionsBasis" v-model="value" />
+    <Segmented v-model="value" :options="optionsBasis" />
     <el-divider />
     <p class="mb-2">禁用</p>
     <Segmented :options="optionsDisabled" />

+ 3 - 3
src/views/components/selector/index.vue

@@ -28,9 +28,9 @@ const selectedVal = ({ left, right }): void => {
 <template>
   <div>
     <el-card
-      class="box-card"
       v-for="(item, key) in dataLists"
       :key="key"
+      class="box-card"
       shadow="never"
     >
       <template #header>
@@ -41,10 +41,10 @@ const selectedVal = ({ left, right }): void => {
       <Selector
         :HsKey="key"
         :echo="item.echo"
-        @selectedVal="selectedVal"
         :disabled="item.disabled"
+        @selectedVal="selectedVal"
       />
-      <h4 class="mt-3" v-if="!item.disabled">选中范围:{{ selectRange }}</h4>
+      <h4 v-if="!item.disabled" class="mt-3">选中范围:{{ selectRange }}</h4>
     </el-card>
   </div>
 </template>

+ 1 - 1
src/views/editor/components/multi.vue

@@ -55,7 +55,7 @@ onBeforeUnmount(() => {
 
 <template>
   <el-row :gutter="30" justify="space-around">
-    <re-col :value="11" v-for="(edit, index) in editorList" :key="index">
+    <re-col v-for="(edit, index) in editorList" :key="index" :value="11">
       <div class="wangeditor">
         <Toolbar
           :editor="edit.editorRef"

+ 4 - 4
src/views/error/403.vue

@@ -14,8 +14,8 @@ const router = useRouter();
     <noAccess />
     <div class="ml-12">
       <p
-        class="font-medium text-4xl mb-4 dark:text-white"
         v-motion
+        class="font-medium text-4xl mb-4 dark:text-white"
         :initial="{
           opacity: 0,
           y: 100
@@ -31,8 +31,8 @@ const router = useRouter();
         403
       </p>
       <p
-        class="mb-4 text-gray-500"
         v-motion
+        class="mb-4 text-gray-500"
         :initial="{
           opacity: 0,
           y: 100
@@ -48,9 +48,8 @@ const router = useRouter();
         抱歉,你无权访问该页面
       </p>
       <el-button
-        type="primary"
-        @click="router.push('/')"
         v-motion
+        type="primary"
         :initial="{
           opacity: 0,
           y: 100
@@ -62,6 +61,7 @@ const router = useRouter();
             delay: 500
           }
         }"
+        @click="router.push('/')"
       >
         返回首页
       </el-button>

+ 4 - 4
src/views/error/404.vue

@@ -14,8 +14,8 @@ const router = useRouter();
     <noExist />
     <div class="ml-12">
       <p
-        class="font-medium text-4xl mb-4 dark:text-white"
         v-motion
+        class="font-medium text-4xl mb-4 dark:text-white"
         :initial="{
           opacity: 0,
           y: 100
@@ -31,8 +31,8 @@ const router = useRouter();
         404
       </p>
       <p
-        class="mb-4 text-gray-500"
         v-motion
+        class="mb-4 text-gray-500"
         :initial="{
           opacity: 0,
           y: 100
@@ -48,9 +48,8 @@ const router = useRouter();
         抱歉,你访问的页面不存在
       </p>
       <el-button
-        type="primary"
-        @click="router.push('/')"
         v-motion
+        type="primary"
         :initial="{
           opacity: 0,
           y: 100
@@ -62,6 +61,7 @@ const router = useRouter();
             delay: 500
           }
         }"
+        @click="router.push('/')"
       >
         返回首页
       </el-button>

+ 4 - 4
src/views/error/500.vue

@@ -14,8 +14,8 @@ const router = useRouter();
     <noServer />
     <div class="ml-12">
       <p
-        class="font-medium text-4xl mb-4 dark:text-white"
         v-motion
+        class="font-medium text-4xl mb-4 dark:text-white"
         :initial="{
           opacity: 0,
           y: 100
@@ -31,8 +31,8 @@ const router = useRouter();
         500
       </p>
       <p
-        class="mb-4 text-gray-500"
         v-motion
+        class="mb-4 text-gray-500"
         :initial="{
           opacity: 0,
           y: 100
@@ -48,9 +48,8 @@ const router = useRouter();
         抱歉,服务器出错了
       </p>
       <el-button
-        type="primary"
-        @click="router.push('/')"
         v-motion
+        type="primary"
         :initial="{
           opacity: 0,
           y: 100
@@ -62,6 +61,7 @@ const router = useRouter();
             delay: 500
           }
         }"
+        @click="router.push('/')"
       >
         返回首页
       </el-button>

+ 2 - 2
src/views/flow-chart/index.vue

@@ -84,8 +84,8 @@ onMounted(() => {
     <div class="logic-flow-view">
       <!-- 辅助工具栏 -->
       <Control
-        class="demo-control"
         v-if="lf"
+        class="demo-control"
         :lf="lf"
         :catTurboData="false"
         @catData="catData"
@@ -96,9 +96,9 @@ onMounted(() => {
       <div id="turbo" />
       <!-- 数据查看面板 -->
       <el-dialog
+        v-model="dataVisible"
         class="flow-dialog"
         title="数据"
-        v-model="dataVisible"
         width="50%"
       >
         <el-scrollbar>

+ 3 - 3
src/views/list/card/index.vue

@@ -102,8 +102,8 @@ const handleManageProduct = product => {
         新建产品
       </el-button>
       <el-input
-        style="width: 300px"
         v-model="searchValue"
+        style="width: 300px"
         placeholder="请输入产品名称"
         clearable
       >
@@ -123,7 +123,6 @@ const handleManageProduct = product => {
       element-loading-svg-view-box="-10, -10, 50, 50"
     >
       <el-empty
-        description="暂无数据"
         v-show="
           productList
             .slice(
@@ -134,6 +133,7 @@ const handleManageProduct = product => {
               v.name.toLowerCase().includes(searchValue.toLowerCase())
             ).length === 0
         "
+        description="暂无数据"
       />
       <template v-if="pagination.total > 0">
         <el-row :gutter="16">
@@ -161,8 +161,8 @@ const handleManageProduct = product => {
           </el-col>
         </el-row>
         <el-pagination
-          class="float-right"
           v-model:currentPage="pagination.current"
+          class="float-right"
           :page-size="pagination.pageSize"
           :total="pagination.total"
           :page-sizes="[12, 24, 36]"

+ 2 - 2
src/views/login/components/phone.vue

@@ -48,8 +48,8 @@ function onBack() {
     <Motion>
       <el-form-item prop="phone">
         <el-input
-          clearable
           v-model="ruleForm.phone"
+          clearable
           :placeholder="t('login.phone')"
           :prefix-icon="useRenderIcon(Iphone)"
         />
@@ -60,8 +60,8 @@ function onBack() {
       <el-form-item prop="verifyCode">
         <div class="w-full flex justify-between">
           <el-input
-            clearable
             v-model="ruleForm.verifyCode"
+            clearable
             :placeholder="t('login.smsVerifyCode')"
             :prefix-icon="useRenderIcon('ri:shield-keyhole-line')"
           />

+ 5 - 5
src/views/login/components/regist.vue

@@ -89,8 +89,8 @@ function onBack() {
         prop="username"
       >
         <el-input
-          clearable
           v-model="ruleForm.username"
+          clearable
           :placeholder="t('login.username')"
           :prefix-icon="useRenderIcon(User)"
         />
@@ -100,8 +100,8 @@ function onBack() {
     <Motion :delay="100">
       <el-form-item prop="phone">
         <el-input
-          clearable
           v-model="ruleForm.phone"
+          clearable
           :placeholder="t('login.phone')"
           :prefix-icon="useRenderIcon(Iphone)"
         />
@@ -112,8 +112,8 @@ function onBack() {
       <el-form-item prop="verifyCode">
         <div class="w-full flex justify-between">
           <el-input
-            clearable
             v-model="ruleForm.verifyCode"
+            clearable
             :placeholder="t('login.smsVerifyCode')"
             :prefix-icon="useRenderIcon('ri:shield-keyhole-line')"
           />
@@ -135,9 +135,9 @@ function onBack() {
     <Motion :delay="200">
       <el-form-item prop="password">
         <el-input
+          v-model="ruleForm.password"
           clearable
           show-password
-          v-model="ruleForm.password"
           :placeholder="t('login.password')"
           :prefix-icon="useRenderIcon(Lock)"
         />
@@ -147,9 +147,9 @@ function onBack() {
     <Motion :delay="250">
       <el-form-item :rules="repeatPasswordRule" prop="repeatPassword">
         <el-input
+          v-model="ruleForm.repeatPassword"
           clearable
           show-password
-          v-model="ruleForm.repeatPassword"
           :placeholder="t('login.sure')"
           :prefix-icon="useRenderIcon(Lock)"
         />

+ 4 - 4
src/views/login/components/update.vue

@@ -72,8 +72,8 @@ function onBack() {
     <Motion>
       <el-form-item prop="phone">
         <el-input
-          clearable
           v-model="ruleForm.phone"
+          clearable
           :placeholder="t('login.phone')"
           :prefix-icon="useRenderIcon(Iphone)"
         />
@@ -84,8 +84,8 @@ function onBack() {
       <el-form-item prop="verifyCode">
         <div class="w-full flex justify-between">
           <el-input
-            clearable
             v-model="ruleForm.verifyCode"
+            clearable
             :placeholder="t('login.smsVerifyCode')"
             :prefix-icon="useRenderIcon('ri:shield-keyhole-line')"
           />
@@ -107,9 +107,9 @@ function onBack() {
     <Motion :delay="150">
       <el-form-item prop="password">
         <el-input
+          v-model="ruleForm.password"
           clearable
           show-password
-          v-model="ruleForm.password"
           :placeholder="t('login.password')"
           :prefix-icon="useRenderIcon(Lock)"
         />
@@ -119,9 +119,9 @@ function onBack() {
     <Motion :delay="200">
       <el-form-item :rules="repeatPasswordRule" prop="repeatPassword">
         <el-input
+          v-model="ruleForm.repeatPassword"
           clearable
           show-password
-          v-model="ruleForm.repeatPassword"
           :placeholder="t('login.sure')"
           :prefix-icon="useRenderIcon(Lock)"
         />

+ 5 - 5
src/views/login/index.vue

@@ -142,8 +142,8 @@ watch(loginDay, value => {
               @click="translationCh"
             >
               <IconifyIconOffline
-                class="check-zh"
                 v-show="locale === 'zh'"
+                class="check-zh"
                 :icon="Check"
               />
               简体中文
@@ -153,7 +153,7 @@ watch(loginDay, value => {
               :class="['dark:!text-white', getDropdownItemClass(locale, 'en')]"
               @click="translationEn"
             >
-              <span class="check-en" v-show="locale === 'en'">
+              <span v-show="locale === 'en'" class="check-en">
                 <IconifyIconOffline :icon="Check" />
               </span>
               English
@@ -194,8 +194,8 @@ watch(loginDay, value => {
                 prop="username"
               >
                 <el-input
-                  clearable
                   v-model="ruleForm.username"
+                  clearable
                   :placeholder="t('login.username')"
                   :prefix-icon="useRenderIcon(User)"
                 />
@@ -205,9 +205,9 @@ watch(loginDay, value => {
             <Motion :delay="150">
               <el-form-item prop="password">
                 <el-input
+                  v-model="ruleForm.password"
                   clearable
                   show-password
-                  v-model="ruleForm.password"
                   :placeholder="t('login.password')"
                   :prefix-icon="useRenderIcon(Lock)"
                 />
@@ -217,8 +217,8 @@ watch(loginDay, value => {
             <Motion :delay="200">
               <el-form-item prop="verifyCode">
                 <el-input
-                  clearable
                   v-model="ruleForm.verifyCode"
+                  clearable
                   :placeholder="t('login.verifyCode')"
                   :prefix-icon="useRenderIcon('ri:shield-keyhole-line')"
                 >

+ 1 - 1
src/views/nested/menu1/menu1-2/menu1-2-2/index.vue

@@ -19,7 +19,7 @@ const { query } = useRoute();
     <p style="text-indent: 4em">{{ t("menus.hsmenu1-2-2") }}</p>
     <el-input v-model="input" />
 
-    <div class="mt-4" v-if="query.text">
+    <div v-if="query.text" class="mt-4">
       此页面携带的参数值为:{{ query.text }}
     </div>
   </div>

+ 6 - 6
src/views/permission/button/index.vue

@@ -41,15 +41,15 @@ const elStyle = computed((): CSSProperties => {
       <template #header>
         <div class="card-header">函数方式判断权限</div>
       </template>
-      <el-button type="success" v-if="hasAuth('btn_add')">
+      <el-button v-if="hasAuth('btn_add')" type="success">
         拥有code:'btn_add' 权限可见
       </el-button>
-      <el-button type="primary" v-if="hasAuth(['btn_edit'])">
+      <el-button v-if="hasAuth(['btn_edit'])" type="primary">
         拥有code:['btn_edit'] 权限可见
       </el-button>
       <el-button
-        type="danger"
         v-if="hasAuth(['btn_add', 'btn_edit', 'btn_delete'])"
+        type="danger"
       >
         拥有code:['btn_add', 'btn_edit', 'btn_delete'] 权限可见
       </el-button>
@@ -61,13 +61,13 @@ const elStyle = computed((): CSSProperties => {
           指令方式判断权限(该方式不能动态修改权限)
         </div>
       </template>
-      <el-button type="success" v-auth="'btn_add'">
+      <el-button v-auth="'btn_add'" type="success">
         拥有code:'btn_add' 权限可见
       </el-button>
-      <el-button type="primary" v-auth="['btn_edit']">
+      <el-button v-auth="['btn_edit']" type="primary">
         拥有code:['btn_edit'] 权限可见
       </el-button>
-      <el-button type="danger" v-auth="['btn_add', 'btn_edit', 'btn_delete']">
+      <el-button v-auth="['btn_add', 'btn_edit', 'btn_delete']" type="danger">
         拥有code:['btn_add', 'btn_edit', 'btn_delete'] 权限可见
       </el-button>
     </el-card>

+ 1 - 1
src/views/pure-table/high.vue

@@ -49,7 +49,7 @@ function tabClick({ index }) {
               <span>{{ item.title }}</span>
             </el-tooltip>
           </template>
-          <component v-if="selected == index" :is="item.component" />
+          <component :is="item.component" v-if="selected == index" />
         </el-tab-pane>
       </template>
     </el-tabs>

+ 4 - 4
src/views/pure-table/high/data.ts

@@ -61,15 +61,15 @@ const tableDataImage = clone(tableData, true).map((item, index) =>
 );
 
 const tableDataSortable = clone(tableData, true).map((item, index) => {
-  delete item["date"];
+  delete item.date;
   Object.assign(item, {
     date: `${dayjs(new Date()).format("YYYY-MM")}-${index + 1}`
   });
 });
 
 const tableDataDrag = clone(tableData, true).map((item, index) => {
-  delete item["address"];
-  delete item["date"];
+  delete item.address;
+  delete item.date;
   return Object.assign(
     {
       id: index + 1,
@@ -80,7 +80,7 @@ const tableDataDrag = clone(tableData, true).map((item, index) => {
 });
 
 const tableDataEdit = clone(tableData, true).map((item, index) => {
-  delete item["date"];
+  delete item.date;
   return Object.assign(
     {
       id: index + 1,

+ 1 - 1
src/views/pure-table/high/excel/index.vue

@@ -8,8 +8,8 @@ const { columns, dataList, exportExcel } = useColumns();
   <div>
     <el-button
       type="primary"
-      @click="exportExcel"
       class="mb-[20px] float-right"
+      @click="exportExcel"
     >
       导出
     </el-button>

+ 2 - 2
src/views/pure-table/high/prints/index.vue

@@ -9,13 +9,13 @@ const { columns, dataList, print, cellStyle, rowStyle, headerCellStyle } =
 
 <template>
   <div>
-    <el-button type="primary" @click="print" class="mb-[20px] float-right">
+    <el-button type="primary" class="mb-[20px] float-right" @click="print">
       打印
     </el-button>
     <!-- rowHoverBgColor="transparent" 鼠标经过行时,去掉行的背景色 -->
     <pure-table
-      rowHoverBgColor="transparent"
       ref="printRef"
+      rowHoverBgColor="transparent"
       row-key="id"
       border
       :data="dataList"

+ 1 - 1
src/views/pure-table/high/table-select/multiple/index.vue

@@ -18,9 +18,9 @@ const {
 
 <template>
   <el-select
-    class="w-[160px]"
     ref="selectRef"
     v-model="selectValue"
+    class="w-[160px]"
     placeholder="请选择"
     clearable
     multiple

+ 1 - 1
src/views/pure-table/index.vue

@@ -50,7 +50,7 @@ function tabClick({ index }) {
               <span>{{ item.title }}</span>
             </el-tooltip>
           </template>
-          <component v-if="selected == index" :is="item.component" />
+          <component :is="item.component" v-if="selected == index" />
         </el-tab-pane>
       </template>
     </el-tabs>

+ 1 - 1
src/views/system/dept/form.vue

@@ -41,8 +41,8 @@ defineExpose({ getRef });
       <re-col>
         <el-form-item label="上级部门">
           <el-cascader
-            class="w-full"
             v-model="newFormInline.parentId"
+            class="w-full"
             :options="newFormInline.higherDeptOptions"
             :props="{
               value: 'id',

+ 1 - 1
src/views/system/dept/utils/hook.tsx

@@ -6,7 +6,7 @@ import { getDeptList } from "@/api/system";
 import { usePublicHooks } from "../../hooks";
 import { addDialog } from "@/components/ReDialog";
 import { reactive, ref, onMounted, h } from "vue";
-import { type FormItemProps } from "../utils/types";
+import type { FormItemProps } from "../utils/types";
 import { cloneDeep, isAllEmpty } from "@pureadmin/utils";
 
 export function useDept() {

+ 2 - 2
src/views/system/role/utils/hook.tsx

@@ -5,8 +5,8 @@ import { getRoleList } from "@/api/system";
 import { ElMessageBox } from "element-plus";
 import { usePublicHooks } from "../../hooks";
 import { addDialog } from "@/components/ReDialog";
-import { type FormItemProps } from "../utils/types";
-import { type PaginationProps } from "@pureadmin/table";
+import type { FormItemProps } from "../utils/types";
+import type { PaginationProps } from "@pureadmin/table";
 import { reactive, ref, onMounted, h, toRaw } from "vue";
 
 export function useRole() {

+ 3 - 3
src/views/system/user/form/index.vue

@@ -70,10 +70,10 @@ defineExpose({ getRef });
       </re-col>
 
       <re-col
+        v-if="newFormInline.title === '新增'"
         :value="12"
         :xs="24"
         :sm="24"
-        v-if="newFormInline.title === '新增'"
       >
         <el-form-item label="用户密码" prop="password">
           <el-input
@@ -123,8 +123,8 @@ defineExpose({ getRef });
       <re-col :value="12" :xs="24" :sm="24">
         <el-form-item label="归属部门">
           <el-cascader
-            class="w-full"
             v-model="newFormInline.parentId"
+            class="w-full"
             :options="newFormInline.higherDeptOptions"
             :props="{
               value: 'id',
@@ -144,10 +144,10 @@ defineExpose({ getRef });
         </el-form-item>
       </re-col>
       <re-col
+        v-if="newFormInline.title === '新增'"
         :value="12"
         :xs="24"
         :sm="24"
-        v-if="newFormInline.title === '新增'"
       >
         <el-form-item label="用户状态">
           <el-switch

+ 1 - 1
src/views/system/user/form/role.vue

@@ -25,7 +25,7 @@ const newFormInline = ref(props.formInline);
       </re-col> -->
       <re-col>
         <el-form-item label="用户昵称" prop="nickname">
-          <el-input disabled v-model="newFormInline.nickname" />
+          <el-input v-model="newFormInline.nickname" disabled />
         </el-form-item>
       </re-col>
       <re-col>

+ 1 - 1
src/views/system/user/index.vue

@@ -148,8 +148,8 @@ const {
             </el-popconfirm>
           </div>
           <pure-table
-            row-key="id"
             ref="tableRef"
+            row-key="id"
             adaptive
             align-whole="center"
             table-layout="auto"

+ 1 - 1
src/views/system/user/tree.vue

@@ -101,9 +101,9 @@ defineExpose({ onTreeReset });
   >
     <div class="flex items-center h-[34px]">
       <el-input
+        v-model="searchValue"
         class="ml-2"
         size="small"
-        v-model="searchValue"
         placeholder="请输入部门名称"
         clearable
       >

+ 1 - 1
src/views/system/user/upload.vue

@@ -33,7 +33,7 @@ function onCropper({ base64, blob, info }) {
             @cropper="onCropper"
             @readied="showPopover = true"
           />
-          <p class="mt-1 text-center" v-show="showPopover">
+          <p v-show="showPopover" class="mt-1 text-center">
             温馨提示:右键上方裁剪区可开启功能菜单
           </p>
         </div>

+ 1 - 1
src/views/system/user/utils/hook.tsx

@@ -8,7 +8,7 @@ import { message } from "@/utils/message";
 import croppingUpload from "../upload.vue";
 import { usePublicHooks } from "../../hooks";
 import { addDialog } from "@/components/ReDialog";
-import { type PaginationProps } from "@pureadmin/table";
+import type { PaginationProps } from "@pureadmin/table";
 import type { FormItemProps, RoleFormItemProps } from "../utils/types";
 import { hideTextAtIndex, getKeyList, isAllEmpty } from "@pureadmin/utils";
 import {

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