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

This commit is contained in:
xiaoming 2023-11-10 23:18:01 +08:00 committed by GitHub
parent 18158f8e0d
commit 5b7dd8c3e2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
102 changed files with 431 additions and 424 deletions

View File

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

View File

@ -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"
}
]
}
});

View File

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

View File

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

174
eslint.config.js Normal file
View File

@ -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"
}
]
}
}
]);

View File

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

146
pnpm-lock.yaml generated
View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -4,13 +4,13 @@ import {
watch, watch,
nextTick, nextTick,
computed, computed,
PropType, type PropType,
defineComponent defineComponent
} from "vue"; } from "vue";
import "./index.scss"; import "./index.scss";
import propTypes from "@/utils/propTypes"; import propTypes from "@/utils/propTypes";
import { isString, cloneDeep } from "@pureadmin/utils"; 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"; import RefreshRight from "@iconify-icons/ep/refresh-right";
interface QrcodeLogo { interface QrcodeLogo {

View File

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

View File

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

View File

@ -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 resizer from "./resizer";
import "./index.css"; import "./index.css";

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -2,7 +2,7 @@
* @description 使 * @description 使
*/ */
import { type multipleScopeVarsOptions } from "@pureadmin/theme"; import type { multipleScopeVarsOptions } from "@pureadmin/theme";
/** 预设主题色 */ /** 预设主题色 */
const themeColors = { const themeColors = {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -28,9 +28,9 @@ const selectedVal = ({ left, right }): void => {
<template> <template>
<div> <div>
<el-card <el-card
class="box-card"
v-for="(item, key) in dataLists" v-for="(item, key) in dataLists"
:key="key" :key="key"
class="box-card"
shadow="never" shadow="never"
> >
<template #header> <template #header>
@ -41,10 +41,10 @@ const selectedVal = ({ left, right }): void => {
<Selector <Selector
:HsKey="key" :HsKey="key"
:echo="item.echo" :echo="item.echo"
@selectedVal="selectedVal"
:disabled="item.disabled" :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> </el-card>
</div> </div>
</template> </template>

View File

@ -55,7 +55,7 @@ onBeforeUnmount(() => {
<template> <template>
<el-row :gutter="30" justify="space-around"> <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"> <div class="wangeditor">
<Toolbar <Toolbar
:editor="edit.editorRef" :editor="edit.editorRef"

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -9,13 +9,13 @@ const { columns, dataList, print, cellStyle, rowStyle, headerCellStyle } =
<template> <template>
<div> <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> </el-button>
<!-- rowHoverBgColor="transparent" 鼠标经过行时去掉行的背景色 --> <!-- rowHoverBgColor="transparent" 鼠标经过行时去掉行的背景色 -->
<pure-table <pure-table
rowHoverBgColor="transparent"
ref="printRef" ref="printRef"
rowHoverBgColor="transparent"
row-key="id" row-key="id"
border border
:data="dataList" :data="dataList"

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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