3e3c2dab by xukangle

Merge branch 'dev_20241202_xukangle' into develop

2 parents b30375b8 210b5eb5
......@@ -3,7 +3,7 @@ VITE_APP_TITLE = 数据资产管理系统
# 接口域名
# VITE_API_BASEURL = https://www.zgsjzc.com/api
# VITE_API_BASEURL = https://swzl-test.csbr.cn/api
# VITE_API_BASEURL = http://10.4.82.30:8052/
# VITE_API_BASEURL = http://localhost:9000
VITE_API_BASEURL = http://10.4.82.1:28052/
# 平台用户 接口请地址
VITE_APP_USER_API_BASEURL = gateway-server/user
......@@ -24,10 +24,10 @@ VITE_APP_PLAN_BASEURL = ms-daop-jgjf-data-plan-service
#数据质量接口地址
VITE_APP_QUALITY_BASEURL = ms-daop-data-quality-service
#数据盘点接口地址
#数据盘点接口地址ms-daop-zcgl-data-inventory
# VITE_APP_CHECK_BASEURL = /mock
VITE_APP_CHECK_BASEURL = ms-daop-zcgl-data-inventory
#门户接口
VITE_API_PORTALURL = https://swzl-test.zgsjzc.com/portal
......
......@@ -54,7 +54,6 @@ declare module '@vue/runtime-core' {
Table_tools: typeof import('./src/components/Tools/table_tools.vue')['default']
Table_v2: typeof import('./src/components/Table/table_v2.vue')['default']
Tabs: typeof import('./src/components/Tabs/index.vue')['default']
TemplateItem: typeof import('./src/components/TemplateItem/index.vue')['default']
Toolbar: typeof import('./src/components/LineageGraph/toolbar.vue')['default']
Topbar: typeof import('./src/components/LineageGraph/topbar.vue')['default']
Transfer: typeof import('./src/components/Transfer/index.vue')['default']
......
......@@ -35,7 +35,6 @@
"lodash-es": "^4.17.21",
"md5": "^2.3.0",
"mitt": "^3.0.0",
"mockjs": "^1.1.0",
"moment": "^2.29.4",
"nprogress": "^0.2.0",
"path-browserify": "^1.0.1",
......@@ -67,6 +66,7 @@
"fs-extra": "^11.1.1",
"http-server": "^14.1.1",
"lint-staged": "^13.2.2",
"mockjs": "^1.1.0",
"npm-run-all": "^4.1.5",
"plop": "^3.1.2",
"postcss-html": "^1.5.0",
......
......@@ -13,22 +13,22 @@ importers:
version: 4.8.24
'@antv/s2':
specifier: ^1.48.0
version: 1.56.0(@antv/g-base@0.4.7)
version: 1.56.0(@antv/g-base@0.5.16)
'@antv/s2-vue':
specifier: ^1.5.0
version: 1.7.1(@antv/s2@1.56.0)(ant-design-vue@3.2.20)(vue@3.5.13)
version: 1.7.1(@antv/s2@1.56.0(@antv/g-base@0.5.16))(ant-design-vue@3.2.20(vue@3.5.13(typescript@5.7.2)))(vue@3.5.13(typescript@5.7.2))
'@vueuse/core':
specifier: ^10.1.0
version: 10.11.1(vue@3.5.13)
version: 10.11.1(vue@3.5.13(typescript@5.7.2))
'@vueuse/integrations':
specifier: ^10.1.0
version: 10.11.1(axios@1.7.7)(nprogress@0.2.0)(sortablejs@1.15.4)(vue@3.5.13)
version: 10.11.1(async-validator@4.2.5)(axios@1.7.7)(change-case@4.1.2)(nprogress@0.2.0)(sortablejs@1.15.4)(vue@3.5.13(typescript@5.7.2))
'@wangeditor/editor':
specifier: ^5.1.23
version: 5.1.23
'@wangeditor/editor-for-vue':
specifier: ^5.1.12
version: 5.1.12(@wangeditor/editor@5.1.23)(vue@3.5.13)
version: 5.1.12(@wangeditor/editor@5.1.23)(vue@3.5.13(typescript@5.7.2))
axios:
specifier: ^1.4.0
version: 1.7.7
......@@ -43,7 +43,7 @@ importers:
version: 5.5.1
element-plus:
specifier: ^2.5.2
version: 2.8.8(vue@3.5.13)
version: 2.8.8(vue@3.5.13(typescript@5.7.2))
eruda:
specifier: ^3.0.0
version: 3.4.1
......@@ -68,9 +68,6 @@ importers:
mitt:
specifier: ^3.0.0
version: 3.0.1
mockjs:
specifier: ^1.1.0
version: 1.1.0
moment:
specifier: ^2.29.4
version: 2.30.1
......@@ -85,7 +82,7 @@ importers:
version: 6.3.0
pinia:
specifier: ^2.0.35
version: 2.2.6(typescript@5.7.2)(vue@3.5.13)
version: 2.2.6(typescript@5.7.2)(vue@3.5.13(typescript@5.7.2))
pinyin-pro:
specifier: ^3.24.2
version: 3.26.0
......@@ -97,13 +94,13 @@ importers:
version: 1.15.4
vant:
specifier: ^4.9.8
version: 4.9.9(vue@3.5.13)
version: 4.9.9(vue@3.5.13(typescript@5.7.2))
vue:
specifier: ^3.2.47
version: 3.5.13(typescript@5.7.2)
vue-router:
specifier: ^4.1.6
version: 4.4.5(vue@3.5.13)
version: 4.4.5(vue@3.5.13(typescript@5.7.2))
xlsx:
specifier: ^0.18.5
version: 0.18.5
......@@ -119,7 +116,7 @@ importers:
version: 1.2.1
'@iconify/vue':
specifier: ^4.1.1
version: 4.1.2(vue@3.5.13)
version: 4.1.2(vue@3.5.13(typescript@5.7.2))
'@types/md5':
specifier: ^2.3.2
version: 2.3.5
......@@ -137,13 +134,13 @@ importers:
version: 1.2.1
'@vitejs/plugin-vue':
specifier: ^4.2.1
version: 4.6.2(vite@4.5.5)(vue@3.5.13)
version: 4.6.2(vite@4.5.5(@types/node@22.9.3)(sass@1.81.0)(terser@5.36.0))(vue@3.5.13(typescript@5.7.2))
'@vitejs/plugin-vue-jsx':
specifier: ^3.0.1
version: 3.1.0(vite@4.5.5)(vue@3.5.13)
version: 3.1.0(vite@4.5.5(@types/node@22.9.3)(sass@1.81.0)(terser@5.36.0))(vue@3.5.13(typescript@5.7.2))
autoprefixer:
specifier: ^10.4.14
version: 10.4.20(postcss@8.4.49)
version: 10.4.20(postcss@5.2.18)
eslint:
specifier: ^8.39.0
version: 8.57.1
......@@ -159,6 +156,9 @@ importers:
lint-staged:
specifier: ^13.2.2
version: 13.3.0
mockjs:
specifier: ^1.1.0
version: 1.1.0
npm-run-all:
specifier: ^4.1.5
version: 4.1.5
......@@ -179,19 +179,19 @@ importers:
version: 15.11.0(typescript@5.7.2)
stylelint-config-standard:
specifier: ^33.0.0
version: 33.0.0(stylelint@15.11.0)
version: 33.0.0(stylelint@15.11.0(typescript@5.7.2))
stylelint-config-standard-scss:
specifier: ^9.0.0
version: 9.0.0(postcss@8.4.49)(stylelint@15.11.0)
version: 9.0.0(postcss@5.2.18)(stylelint@15.11.0(typescript@5.7.2))
stylelint-config-standard-vue:
specifier: ^1.0.0
version: 1.0.0(postcss-html@1.7.0)(stylelint@15.11.0)
version: 1.0.0(postcss-html@1.7.0)(stylelint@15.11.0(typescript@5.7.2))
stylelint-scss:
specifier: ^5.0.0
version: 5.3.2(stylelint@15.11.0)
version: 5.3.2(stylelint@15.11.0(typescript@5.7.2))
stylelint-stylistic:
specifier: ^0.4.0
version: 0.4.5(stylelint@15.11.0)
version: 0.4.5(stylelint@15.11.0(typescript@5.7.2))
svgo:
specifier: ^3.0.2
version: 3.3.2
......@@ -203,40 +203,40 @@ importers:
version: 5.7.2
unplugin-auto-import:
specifier: ^0.15.3
version: 0.15.3(@vueuse/core@10.11.1)
version: 0.15.3(@vueuse/core@10.11.1(vue@3.5.13(typescript@5.7.2)))(rollup@3.29.5)
unplugin-vue-components:
specifier: ^0.24.1
version: 0.24.1(vue@3.5.13)
version: 0.24.1(@babel/parser@7.26.2)(rollup@3.29.5)(vue@3.5.13(typescript@5.7.2))
unplugin-vue-setup-extend-plus:
specifier: ^1.0.0
version: 1.0.1
vite:
specifier: ^4.3.3
version: 4.5.5(sass@1.81.0)(terser@5.36.0)
version: 4.5.5(@types/node@22.9.3)(sass@1.81.0)(terser@5.36.0)
vite-plugin-banner:
specifier: ^0.7.0
version: 0.7.1
vite-plugin-compression:
specifier: ^0.5.1
version: 0.5.1(vite@4.5.5)
version: 0.5.1(vite@4.5.5(@types/node@22.9.3)(sass@1.81.0)(terser@5.36.0))
vite-plugin-mock:
specifier: ^2.9.8
version: 2.9.8(mockjs@1.1.0)(vite@4.5.5)
version: 2.9.8(mockjs@1.1.0)(vite@4.5.5(@types/node@22.9.3)(sass@1.81.0)(terser@5.36.0))
vite-plugin-pages:
specifier: ^0.29.0
version: 0.29.1(vite@4.5.5)
version: 0.29.1(@vue/compiler-sfc@3.5.13)(vite@4.5.5(@types/node@22.9.3)(sass@1.81.0)(terser@5.36.0))
vite-plugin-spritesmith:
specifier: ^0.1.1
version: 0.1.1
vite-plugin-svg-icons:
specifier: ^2.0.1
version: 2.0.1(vite@4.5.5)
version: 2.0.1(vite@4.5.5(@types/node@22.9.3)(sass@1.81.0)(terser@5.36.0))
vite-plugin-vue-inspector:
specifier: ^3.4.1
version: 3.7.2(vite@4.5.5)
version: 3.7.2(vite@4.5.5(@types/node@22.9.3)(sass@1.81.0)(terser@5.36.0))
vite-plugin-vue-meta-layouts:
specifier: ^0.2.2
version: 0.2.2(vite@4.5.5)(vue-router@4.4.5)
version: 0.2.2(vite@4.5.5(@types/node@22.9.3)(sass@1.81.0)(terser@5.36.0))(vue-router@4.4.5(vue@3.5.13(typescript@5.7.2)))
vue-tsc:
specifier: ^1.6.2
version: 1.8.27(typescript@5.7.2)
......@@ -294,9 +294,6 @@ packages:
'@antv/event-emitter@0.1.3':
resolution: {integrity: sha512-4ddpsiHN9Pd4UIlWuKVK1C4IiZIdbwQvy9i7DUSI3xNJ89FPUFt8lxDYj8GzzfdllV0NkJTRxnG+FvLk0llidg==}
'@antv/g-base@0.4.7':
resolution: {integrity: sha512-wKSpS3/M1slU92iOgi2QV4MCd82J1d2PyPcQArqSFRUZU0KnVMIl95v79dG0Be4YvFaZ3bVrT6Ns1Czr8oplhA==}
'@antv/g-base@0.5.16':
resolution: {integrity: sha512-jP06wggTubDPHXoKwFg3/f1lyxBX9ywwN3E/HG74Nd7DXqOXQis8tsIWW+O6dS/h9vyuXLd1/wDWkMMm3ZzXdg==}
......@@ -895,9 +892,6 @@ packages:
resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==}
engines: {node: '>=10.13.0'}
'@types/d3-timer@1.0.12':
resolution: {integrity: sha512-Tv9tkA4y3UvGQnrHyYAQhf5x/297FuYwotS4UW2TpwLblvRahbyL8r9HFYTJLPfPRqS63hwlqRItjKGmKtJxNg==}
'@types/d3-timer@2.0.3':
resolution: {integrity: sha512-jhAJzaanK5LqyLQ50jJNIrB8fjL9gwWZTgYjevPvkDLMU+kTAZkYsobI59nYoeSrH1PucuyJEi247Pb90t6XUg==}
......@@ -5476,26 +5470,26 @@ snapshots:
'@ant-design/icons-svg@4.4.2': {}
'@ant-design/icons-vue@6.1.0(vue@3.5.13)':
'@ant-design/icons-vue@6.1.0(vue@3.5.13(typescript@5.7.2))':
dependencies:
'@ant-design/colors': 6.0.0
'@ant-design/icons-svg': 4.4.2
vue: 3.5.13(typescript@5.7.2)
'@antfu/eslint-config-basic@0.38.6(@typescript-eslint/eslint-plugin@5.62.0)(@typescript-eslint/parser@5.62.0)(eslint@8.57.1)(typescript@5.7.2)':
'@antfu/eslint-config-basic@0.38.6(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2)':
dependencies:
eslint: 8.57.1
eslint-plugin-antfu: 0.38.6(eslint@8.57.1)(typescript@5.7.2)
eslint-plugin-eslint-comments: 3.2.0(eslint@8.57.1)
eslint-plugin-html: 7.1.0
eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1)
eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)
eslint-plugin-jsonc: 2.18.2(eslint@8.57.1)
eslint-plugin-markdown: 3.0.1(eslint@8.57.1)
eslint-plugin-n: 15.7.0(eslint@8.57.1)
eslint-plugin-no-only-tests: 3.3.0
eslint-plugin-promise: 6.6.0(eslint@8.57.1)
eslint-plugin-unicorn: 46.0.1(eslint@8.57.1)
eslint-plugin-unused-imports: 2.0.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.57.1)
eslint-plugin-unused-imports: 2.0.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)
eslint-plugin-yml: 1.15.0(eslint@8.57.1)
jsonc-eslint-parser: 2.4.0
yaml-eslint-parser: 1.2.3
......@@ -5510,11 +5504,11 @@ snapshots:
'@antfu/eslint-config-ts@0.38.6(eslint@8.57.1)(typescript@5.7.2)':
dependencies:
'@antfu/eslint-config-basic': 0.38.6(@typescript-eslint/eslint-plugin@5.62.0)(@typescript-eslint/parser@5.62.0)(eslint@8.57.1)(typescript@5.7.2)
'@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1)(typescript@5.7.2)
'@antfu/eslint-config-basic': 0.38.6(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2)
'@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2)
'@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.7.2)
eslint: 8.57.1
eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.57.1)(typescript@5.7.2)
eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2)
typescript: 5.7.2
transitivePeerDependencies:
- '@eslint/json'
......@@ -5523,9 +5517,9 @@ snapshots:
- jest
- supports-color
'@antfu/eslint-config-vue@0.38.6(@typescript-eslint/eslint-plugin@5.62.0)(@typescript-eslint/parser@5.62.0)(eslint@8.57.1)(typescript@5.7.2)':
'@antfu/eslint-config-vue@0.38.6(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2)':
dependencies:
'@antfu/eslint-config-basic': 0.38.6(@typescript-eslint/eslint-plugin@5.62.0)(@typescript-eslint/parser@5.62.0)(eslint@8.57.1)(typescript@5.7.2)
'@antfu/eslint-config-basic': 0.38.6(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2)
'@antfu/eslint-config-ts': 0.38.6(eslint@8.57.1)(typescript@5.7.2)
eslint: 8.57.1
eslint-plugin-vue: 9.31.0(eslint@8.57.1)
......@@ -5542,13 +5536,13 @@ snapshots:
'@antfu/eslint-config@0.38.6(eslint@8.57.1)(typescript@5.7.2)':
dependencies:
'@antfu/eslint-config-vue': 0.38.6(@typescript-eslint/eslint-plugin@5.62.0)(@typescript-eslint/parser@5.62.0)(eslint@8.57.1)(typescript@5.7.2)
'@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1)(typescript@5.7.2)
'@antfu/eslint-config-vue': 0.38.6(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2)
'@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2)
'@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.7.2)
eslint: 8.57.1
eslint-plugin-eslint-comments: 3.2.0(eslint@8.57.1)
eslint-plugin-html: 7.1.0
eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1)
eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)
eslint-plugin-jsonc: 2.18.2(eslint@8.57.1)
eslint-plugin-n: 15.7.0(eslint@8.57.1)
eslint-plugin-promise: 6.6.0(eslint@8.57.1)
......@@ -5578,19 +5572,6 @@ snapshots:
'@antv/event-emitter@0.1.3': {}
'@antv/g-base@0.4.7':
dependencies:
'@antv/event-emitter': 0.1.3
'@antv/g-math': 0.1.9
'@antv/matrix-util': 3.1.0-beta.3
'@antv/path-util': 2.0.15
'@antv/util': 2.0.17
'@types/d3-timer': 1.0.12
d3-ease: 1.0.7
d3-interpolate: 1.4.0
d3-timer: 1.0.10
detect-browser: 5.3.0
'@antv/g-base@0.5.16':
dependencies:
'@antv/event-emitter': 0.1.3
......@@ -5615,10 +5596,10 @@ snapshots:
gl-matrix: 3.4.3
tslib: 2.8.1
'@antv/g-gesture@1.0.1(@antv/g-base@0.4.7)':
'@antv/g-gesture@1.0.1(@antv/g-base@0.5.16)':
dependencies:
'@antv/event-emitter': 0.1.3
'@antv/g-base': 0.4.7
'@antv/g-base': 0.5.16
d3-ease: 1.0.7
'@antv/g-math@0.1.9':
......@@ -5757,21 +5738,21 @@ snapshots:
'@antv/util': 2.0.17
tslib: 2.8.1
'@antv/s2-vue@1.7.1(@antv/s2@1.56.0)(ant-design-vue@3.2.20)(vue@3.5.13)':
'@antv/s2-vue@1.7.1(@antv/s2@1.56.0(@antv/g-base@0.5.16))(ant-design-vue@3.2.20(vue@3.5.13(typescript@5.7.2)))(vue@3.5.13(typescript@5.7.2))':
dependencies:
'@antv/s2': 1.56.0(@antv/g-base@0.4.7)
'@vueuse/core': 10.11.1(vue@3.5.13)
ant-design-vue: 3.2.20(vue@3.5.13)
'@antv/s2': 1.56.0(@antv/g-base@0.5.16)
'@vueuse/core': 10.11.1(vue@3.5.13(typescript@5.7.2))
ant-design-vue: 3.2.20(vue@3.5.13(typescript@5.7.2))
lodash: 4.17.21
vue: 3.5.13(typescript@5.7.2)
transitivePeerDependencies:
- '@vue/composition-api'
'@antv/s2@1.56.0(@antv/g-base@0.4.7)':
'@antv/s2@1.56.0(@antv/g-base@0.5.16)':
dependencies:
'@antv/event-emitter': 0.1.3
'@antv/g-canvas': 0.5.17
'@antv/g-gesture': 1.0.1(@antv/g-base@0.4.7)
'@antv/g-gesture': 1.0.1(@antv/g-base@0.5.16)
d3-interpolate: 1.4.0
d3-timer: 1.0.10
decimal.js: 10.4.3
......@@ -5995,7 +5976,7 @@ snapshots:
'@csstools/css-tokenizer@2.4.1': {}
'@csstools/media-query-list-parser@2.1.13(@csstools/css-parser-algorithms@2.7.1)(@csstools/css-tokenizer@2.4.1)':
'@csstools/media-query-list-parser@2.1.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1)':
dependencies:
'@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1)
'@csstools/css-tokenizer': 2.4.1
......@@ -6006,7 +5987,7 @@ snapshots:
'@ctrl/tinycolor@3.6.1': {}
'@element-plus/icons-vue@2.3.1(vue@3.5.13)':
'@element-plus/icons-vue@2.3.1(vue@3.5.13(typescript@5.7.2))':
dependencies:
vue: 3.5.13(typescript@5.7.2)
......@@ -6131,7 +6112,7 @@ snapshots:
'@iconify/types@2.0.0': {}
'@iconify/vue@4.1.2(vue@3.5.13)':
'@iconify/vue@4.1.2(vue@3.5.13(typescript@5.7.2))':
dependencies:
'@iconify/types': 2.0.0
vue: 3.5.13(typescript@5.7.2)
......@@ -6244,11 +6225,13 @@ snapshots:
dependencies:
'@babel/runtime': 7.26.0
'@rollup/pluginutils@5.1.3':
'@rollup/pluginutils@5.1.3(rollup@3.29.5)':
dependencies:
'@types/estree': 1.0.6
estree-walker: 2.0.2
picomatch: 4.0.2
optionalDependencies:
rollup: 3.29.5
'@rtsao/scc@1.1.0': {}
......@@ -6263,8 +6246,6 @@ snapshots:
'@trysound/sax@0.2.0': {}
'@types/d3-timer@1.0.12': {}
'@types/d3-timer@2.0.3': {}
'@types/debug@4.1.12':
......@@ -6337,7 +6318,7 @@ snapshots:
'@types/web-bluetooth@0.0.20': {}
'@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1)(typescript@5.7.2)':
'@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2)':
dependencies:
'@eslint-community/regexpp': 4.12.1
'@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.7.2)
......@@ -6351,6 +6332,7 @@ snapshots:
natural-compare-lite: 1.4.0
semver: 7.6.3
tsutils: 3.21.0(typescript@5.7.2)
optionalDependencies:
typescript: 5.7.2
transitivePeerDependencies:
- supports-color
......@@ -6362,6 +6344,7 @@ snapshots:
'@typescript-eslint/typescript-estree': 5.62.0(typescript@5.7.2)
debug: 4.3.7
eslint: 8.57.1
optionalDependencies:
typescript: 5.7.2
transitivePeerDependencies:
- supports-color
......@@ -6378,6 +6361,7 @@ snapshots:
debug: 4.3.7
eslint: 8.57.1
tsutils: 3.21.0(typescript@5.7.2)
optionalDependencies:
typescript: 5.7.2
transitivePeerDependencies:
- supports-color
......@@ -6393,6 +6377,7 @@ snapshots:
is-glob: 4.0.3
semver: 7.6.3
tsutils: 3.21.0(typescript@5.7.2)
optionalDependencies:
typescript: 5.7.2
transitivePeerDependencies:
- supports-color
......@@ -6452,23 +6437,23 @@ snapshots:
'@vant/popperjs@1.3.0': {}
'@vant/use@1.6.0(vue@3.5.13)':
'@vant/use@1.6.0(vue@3.5.13(typescript@5.7.2))':
dependencies:
vue: 3.5.13(typescript@5.7.2)
'@vitejs/plugin-vue-jsx@3.1.0(vite@4.5.5)(vue@3.5.13)':
'@vitejs/plugin-vue-jsx@3.1.0(vite@4.5.5(@types/node@22.9.3)(sass@1.81.0)(terser@5.36.0))(vue@3.5.13(typescript@5.7.2))':
dependencies:
'@babel/core': 7.26.0
'@babel/plugin-transform-typescript': 7.25.9(@babel/core@7.26.0)
'@vue/babel-plugin-jsx': 1.2.5(@babel/core@7.26.0)
vite: 4.5.5(sass@1.81.0)(terser@5.36.0)
vite: 4.5.5(@types/node@22.9.3)(sass@1.81.0)(terser@5.36.0)
vue: 3.5.13(typescript@5.7.2)
transitivePeerDependencies:
- supports-color
'@vitejs/plugin-vue@4.6.2(vite@4.5.5)(vue@3.5.13)':
'@vitejs/plugin-vue@4.6.2(vite@4.5.5(@types/node@22.9.3)(sass@1.81.0)(terser@5.36.0))(vue@3.5.13(typescript@5.7.2))':
dependencies:
vite: 4.5.5(sass@1.81.0)(terser@5.36.0)
vite: 4.5.5(@types/node@22.9.3)(sass@1.81.0)(terser@5.36.0)
vue: 3.5.13(typescript@5.7.2)
'@volar/language-core@1.11.1':
......@@ -6488,7 +6473,6 @@ snapshots:
'@vue/babel-plugin-jsx@1.2.5(@babel/core@7.26.0)':
dependencies:
'@babel/core': 7.26.0
'@babel/helper-module-imports': 7.25.9
'@babel/helper-plugin-utils': 7.25.9
'@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0)
......@@ -6499,6 +6483,8 @@ snapshots:
'@vue/babel-plugin-resolve-type': 1.2.5(@babel/core@7.26.0)
html-tags: 3.3.1
svg-tags: 1.0.0
optionalDependencies:
'@babel/core': 7.26.0
transitivePeerDependencies:
- supports-color
......@@ -6555,8 +6541,9 @@ snapshots:
minimatch: 9.0.5
muggle-string: 0.3.1
path-browserify: 1.0.1
typescript: 5.7.2
vue-template-compiler: 2.7.16
optionalDependencies:
typescript: 5.7.2
'@vue/reactivity@3.5.13':
dependencies:
......@@ -6574,7 +6561,7 @@ snapshots:
'@vue/shared': 3.5.13
csstype: 3.1.3
'@vue/server-renderer@3.5.13(vue@3.5.13)':
'@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.7.2))':
dependencies:
'@vue/compiler-ssr': 3.5.13
'@vue/shared': 3.5.13
......@@ -6582,34 +6569,37 @@ snapshots:
'@vue/shared@3.5.13': {}
'@vueuse/core@10.11.1(vue@3.5.13)':
'@vueuse/core@10.11.1(vue@3.5.13(typescript@5.7.2))':
dependencies:
'@types/web-bluetooth': 0.0.20
'@vueuse/metadata': 10.11.1
'@vueuse/shared': 10.11.1(vue@3.5.13)
vue-demi: 0.14.10(vue@3.5.13)
'@vueuse/shared': 10.11.1(vue@3.5.13(typescript@5.7.2))
vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.2))
transitivePeerDependencies:
- '@vue/composition-api'
- vue
'@vueuse/core@9.13.0(vue@3.5.13)':
'@vueuse/core@9.13.0(vue@3.5.13(typescript@5.7.2))':
dependencies:
'@types/web-bluetooth': 0.0.16
'@vueuse/metadata': 9.13.0
'@vueuse/shared': 9.13.0(vue@3.5.13)
vue-demi: 0.14.10(vue@3.5.13)
'@vueuse/shared': 9.13.0(vue@3.5.13(typescript@5.7.2))
vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.2))
transitivePeerDependencies:
- '@vue/composition-api'
- vue
'@vueuse/integrations@10.11.1(axios@1.7.7)(nprogress@0.2.0)(sortablejs@1.15.4)(vue@3.5.13)':
'@vueuse/integrations@10.11.1(async-validator@4.2.5)(axios@1.7.7)(change-case@4.1.2)(nprogress@0.2.0)(sortablejs@1.15.4)(vue@3.5.13(typescript@5.7.2))':
dependencies:
'@vueuse/core': 10.11.1(vue@3.5.13)
'@vueuse/shared': 10.11.1(vue@3.5.13)
'@vueuse/core': 10.11.1(vue@3.5.13(typescript@5.7.2))
'@vueuse/shared': 10.11.1(vue@3.5.13(typescript@5.7.2))
vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.2))
optionalDependencies:
async-validator: 4.2.5
axios: 1.7.7
change-case: 4.1.2
nprogress: 0.2.0
sortablejs: 1.15.4
vue-demi: 0.14.10(vue@3.5.13)
transitivePeerDependencies:
- '@vue/composition-api'
- vue
......@@ -6618,23 +6608,23 @@ snapshots:
'@vueuse/metadata@9.13.0': {}
'@vueuse/shared@10.11.1(vue@3.5.13)':
'@vueuse/shared@10.11.1(vue@3.5.13(typescript@5.7.2))':
dependencies:
vue-demi: 0.14.10(vue@3.5.13)
vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.2))
transitivePeerDependencies:
- '@vue/composition-api'
- vue
'@vueuse/shared@9.13.0(vue@3.5.13)':
'@vueuse/shared@9.13.0(vue@3.5.13(typescript@5.7.2))':
dependencies:
vue-demi: 0.14.10(vue@3.5.13)
vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.2))
transitivePeerDependencies:
- '@vue/composition-api'
- vue
'@wangeditor/basic-modules@1.1.7(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2)':
'@wangeditor/basic-modules@1.1.7(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2)':
dependencies:
'@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2)
'@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2)
dom7: 3.0.0
is-url: 1.2.4
lodash.throttle: 4.1.1
......@@ -6642,15 +6632,15 @@ snapshots:
slate: 0.72.8
snabbdom: 3.6.2
'@wangeditor/code-highlight@1.0.3(@wangeditor/core@1.1.19)(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.2)':
'@wangeditor/code-highlight@1.0.3(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.2)':
dependencies:
'@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2)
'@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2)
dom7: 3.0.0
prismjs: 1.29.0
slate: 0.72.8
snabbdom: 3.6.2
'@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2)':
'@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2)':
dependencies:
'@types/event-emitter': 0.3.5
'@uppy/core': 2.3.4
......@@ -6673,7 +6663,7 @@ snapshots:
slate-history: 0.66.0(slate@0.72.8)
snabbdom: 3.6.2
'@wangeditor/editor-for-vue@5.1.12(@wangeditor/editor@5.1.23)(vue@3.5.13)':
'@wangeditor/editor-for-vue@5.1.12(@wangeditor/editor@5.1.23)(vue@3.5.13(typescript@5.7.2))':
dependencies:
'@wangeditor/editor': 5.1.23
vue: 3.5.13(typescript@5.7.2)
......@@ -6682,13 +6672,13 @@ snapshots:
dependencies:
'@uppy/core': 2.3.4
'@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4)
'@wangeditor/basic-modules': 1.1.7(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2)
'@wangeditor/code-highlight': 1.0.3(@wangeditor/core@1.1.19)(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.2)
'@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2)
'@wangeditor/list-module': 1.0.5(@wangeditor/core@1.1.19)(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.2)
'@wangeditor/table-module': 1.1.4(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2)
'@wangeditor/upload-image-module': 1.0.2(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(@wangeditor/basic-modules@1.1.7)(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.foreach@4.5.0)(slate@0.72.8)(snabbdom@3.6.2)
'@wangeditor/video-module': 1.1.4(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(@wangeditor/core@1.1.19)(dom7@3.0.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2)
'@wangeditor/basic-modules': 1.1.7(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2)
'@wangeditor/code-highlight': 1.0.3(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.2)
'@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2)
'@wangeditor/list-module': 1.0.5(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.2)
'@wangeditor/table-module': 1.1.4(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2)
'@wangeditor/upload-image-module': 1.0.2(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor/basic-modules@1.1.7(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2))(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.foreach@4.5.0)(slate@0.72.8)(snabbdom@3.6.2)
'@wangeditor/video-module': 1.1.4(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2)
dom7: 3.0.0
is-hotkey: 0.2.0
lodash.camelcase: 4.3.0
......@@ -6702,16 +6692,16 @@ snapshots:
slate: 0.72.8
snabbdom: 3.6.2
'@wangeditor/list-module@1.0.5(@wangeditor/core@1.1.19)(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.2)':
'@wangeditor/list-module@1.0.5(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.6.2)':
dependencies:
'@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2)
'@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2)
dom7: 3.0.0
slate: 0.72.8
snabbdom: 3.6.2
'@wangeditor/table-module@1.1.4(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2)':
'@wangeditor/table-module@1.1.4(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2)':
dependencies:
'@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2)
'@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2)
dom7: 3.0.0
lodash.isequal: 4.5.0
lodash.throttle: 4.1.1
......@@ -6719,22 +6709,22 @@ snapshots:
slate: 0.72.8
snabbdom: 3.6.2
'@wangeditor/upload-image-module@1.0.2(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(@wangeditor/basic-modules@1.1.7)(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.foreach@4.5.0)(slate@0.72.8)(snabbdom@3.6.2)':
'@wangeditor/upload-image-module@1.0.2(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor/basic-modules@1.1.7(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2))(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.foreach@4.5.0)(slate@0.72.8)(snabbdom@3.6.2)':
dependencies:
'@uppy/core': 2.3.4
'@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4)
'@wangeditor/basic-modules': 1.1.7(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2)
'@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2)
'@wangeditor/basic-modules': 1.1.7(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2)
'@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2)
dom7: 3.0.0
lodash.foreach: 4.5.0
slate: 0.72.8
snabbdom: 3.6.2
'@wangeditor/video-module@1.1.4(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(@wangeditor/core@1.1.19)(dom7@3.0.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2)':
'@wangeditor/video-module@1.1.4(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2))(dom7@3.0.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2)':
dependencies:
'@uppy/core': 2.3.4
'@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4)
'@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2)
'@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.7)(slate@0.72.8)(snabbdom@3.6.2)
dom7: 3.0.0
nanoid: 3.3.7
slate: 0.72.8
......@@ -6798,10 +6788,10 @@ snapshots:
ansi-styles@6.2.1: {}
ant-design-vue@3.2.20(vue@3.5.13):
ant-design-vue@3.2.20(vue@3.5.13(typescript@5.7.2)):
dependencies:
'@ant-design/colors': 6.0.0
'@ant-design/icons-vue': 6.1.0(vue@3.5.13)
'@ant-design/icons-vue': 6.1.0(vue@3.5.13(typescript@5.7.2))
'@babel/runtime': 7.26.0
'@ctrl/tinycolor': 3.6.1
'@simonwep/pickr': 1.8.2
......@@ -6816,7 +6806,7 @@ snapshots:
scroll-into-view-if-needed: 2.2.31
shallow-equal: 1.2.1
vue: 3.5.13(typescript@5.7.2)
vue-types: 3.0.2(vue@3.5.13)
vue-types: 3.0.2(vue@3.5.13(typescript@5.7.2))
warning: 4.0.3
anymatch@3.1.3:
......@@ -6914,14 +6904,14 @@ snapshots:
atob@2.1.2: {}
autoprefixer@10.4.20(postcss@8.4.49):
autoprefixer@10.4.20(postcss@5.2.18):
dependencies:
browserslist: 4.24.2
caniuse-lite: 1.0.30001684
fraction.js: 4.3.7
normalize-range: 0.1.2
picocolors: 1.1.1
postcss: 8.4.49
postcss: 5.2.18
postcss-value-parser: 4.2.0
available-typed-arrays@1.0.7:
......@@ -7304,6 +7294,7 @@ snapshots:
js-yaml: 4.1.0
parse-json: 5.2.0
path-type: 4.0.0
optionalDependencies:
typescript: 5.7.2
crc-32@1.2.2: {}
......@@ -7643,15 +7634,15 @@ snapshots:
electron-to-chromium@1.5.64: {}
element-plus@2.8.8(vue@3.5.13):
element-plus@2.8.8(vue@3.5.13(typescript@5.7.2)):
dependencies:
'@ctrl/tinycolor': 3.6.1
'@element-plus/icons-vue': 2.3.1(vue@3.5.13)
'@element-plus/icons-vue': 2.3.1(vue@3.5.13(typescript@5.7.2))
'@floating-ui/dom': 1.6.12
'@popperjs/core': '@sxzz/popperjs-es@2.11.7'
'@types/lodash': 4.17.13
'@types/lodash-es': 4.17.12
'@vueuse/core': 9.13.0(vue@3.5.13)
'@vueuse/core': 9.13.0(vue@3.5.13(typescript@5.7.2))
async-validator: 4.2.5
dayjs: 1.11.13
escape-html: 1.0.3
......@@ -7932,10 +7923,11 @@ snapshots:
esquery: 1.6.0
jsonc-eslint-parser: 2.4.0
eslint-module-utils@2.12.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.1):
eslint-module-utils@2.12.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1):
dependencies:
'@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.7.2)
debug: 3.2.7
optionalDependencies:
'@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.7.2)
eslint: 8.57.1
eslint-import-resolver-node: 0.3.9
transitivePeerDependencies:
......@@ -7965,10 +7957,9 @@ snapshots:
dependencies:
htmlparser2: 8.0.2
eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1):
eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1):
dependencies:
'@rtsao/scc': 1.1.0
'@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.7.2)
array-includes: 3.1.8
array.prototype.findlastindex: 1.2.5
array.prototype.flat: 1.3.2
......@@ -7977,7 +7968,7 @@ snapshots:
doctrine: 2.1.0
eslint: 8.57.1
eslint-import-resolver-node: 0.3.9
eslint-module-utils: 2.12.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.1)
eslint-module-utils: 2.12.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1)
hasown: 2.0.2
is-core-module: 2.15.1
is-glob: 4.0.3
......@@ -7988,16 +7979,19 @@ snapshots:
semver: 6.3.1
string.prototype.trimend: 1.0.8
tsconfig-paths: 3.15.0
optionalDependencies:
'@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.7.2)
transitivePeerDependencies:
- eslint-import-resolver-typescript
- eslint-import-resolver-webpack
- supports-color
eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.57.1)(typescript@5.7.2):
eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2):
dependencies:
'@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1)(typescript@5.7.2)
'@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.7.2)
eslint: 8.57.1
optionalDependencies:
'@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2)
transitivePeerDependencies:
- supports-color
- typescript
......@@ -8061,11 +8055,12 @@ snapshots:
semver: 7.6.3
strip-indent: 3.0.0
eslint-plugin-unused-imports@2.0.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.57.1):
eslint-plugin-unused-imports@2.0.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1):
dependencies:
'@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.1)(typescript@5.7.2)
eslint: 8.57.1
eslint-rule-composer: 0.3.0
optionalDependencies:
'@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2)
eslint-plugin-vue@9.31.0(eslint@8.57.1):
dependencies:
......@@ -9842,12 +9837,13 @@ snapshots:
pify@3.0.0: {}
pinia@2.2.6(typescript@5.7.2)(vue@3.5.13):
pinia@2.2.6(typescript@5.7.2)(vue@3.5.13(typescript@5.7.2)):
dependencies:
'@vue/devtools-api': 6.6.4
typescript: 5.7.2
vue: 3.5.13(typescript@5.7.2)
vue-demi: 0.14.10(vue@3.5.13)
vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.2))
optionalDependencies:
typescript: 5.7.2
pinyin-pro@3.26.0: {}
......@@ -9916,9 +9912,9 @@ snapshots:
dependencies:
postcss: 8.4.49
postcss-scss@4.0.9(postcss@8.4.49):
postcss-scss@4.0.9(postcss@5.2.18):
dependencies:
postcss: 8.4.49
postcss: 5.2.18
postcss-selector-parser@6.1.2:
dependencies:
......@@ -10579,56 +10575,58 @@ snapshots:
style-search@0.1.0: {}
stylelint-config-html@1.1.0(postcss-html@1.7.0)(stylelint@15.11.0):
stylelint-config-html@1.1.0(postcss-html@1.7.0)(stylelint@15.11.0(typescript@5.7.2)):
dependencies:
postcss-html: 1.7.0
stylelint: 15.11.0(typescript@5.7.2)
stylelint-config-recommended-scss@11.0.0(postcss@8.4.49)(stylelint@15.11.0):
stylelint-config-recommended-scss@11.0.0(postcss@5.2.18)(stylelint@15.11.0(typescript@5.7.2)):
dependencies:
postcss: 8.4.49
postcss-scss: 4.0.9(postcss@8.4.49)
postcss-scss: 4.0.9(postcss@5.2.18)
stylelint: 15.11.0(typescript@5.7.2)
stylelint-config-recommended: 12.0.0(stylelint@15.11.0)
stylelint-scss: 4.7.0(stylelint@15.11.0)
stylelint-config-recommended: 12.0.0(stylelint@15.11.0(typescript@5.7.2))
stylelint-scss: 4.7.0(stylelint@15.11.0(typescript@5.7.2))
optionalDependencies:
postcss: 5.2.18
stylelint-config-recommended-vue@1.5.0(postcss-html@1.7.0)(stylelint@15.11.0):
stylelint-config-recommended-vue@1.5.0(postcss-html@1.7.0)(stylelint@15.11.0(typescript@5.7.2)):
dependencies:
postcss-html: 1.7.0
semver: 7.6.3
stylelint: 15.11.0(typescript@5.7.2)
stylelint-config-html: 1.1.0(postcss-html@1.7.0)(stylelint@15.11.0)
stylelint-config-recommended: 14.0.1(stylelint@15.11.0)
stylelint-config-html: 1.1.0(postcss-html@1.7.0)(stylelint@15.11.0(typescript@5.7.2))
stylelint-config-recommended: 14.0.1(stylelint@15.11.0(typescript@5.7.2))
stylelint-config-recommended@12.0.0(stylelint@15.11.0):
stylelint-config-recommended@12.0.0(stylelint@15.11.0(typescript@5.7.2)):
dependencies:
stylelint: 15.11.0(typescript@5.7.2)
stylelint-config-recommended@14.0.1(stylelint@15.11.0):
stylelint-config-recommended@14.0.1(stylelint@15.11.0(typescript@5.7.2)):
dependencies:
stylelint: 15.11.0(typescript@5.7.2)
stylelint-config-standard-scss@9.0.0(postcss@8.4.49)(stylelint@15.11.0):
stylelint-config-standard-scss@9.0.0(postcss@5.2.18)(stylelint@15.11.0(typescript@5.7.2)):
dependencies:
postcss: 8.4.49
stylelint: 15.11.0(typescript@5.7.2)
stylelint-config-recommended-scss: 11.0.0(postcss@8.4.49)(stylelint@15.11.0)
stylelint-config-standard: 33.0.0(stylelint@15.11.0)
stylelint-config-recommended-scss: 11.0.0(postcss@5.2.18)(stylelint@15.11.0(typescript@5.7.2))
stylelint-config-standard: 33.0.0(stylelint@15.11.0(typescript@5.7.2))
optionalDependencies:
postcss: 5.2.18
stylelint-config-standard-vue@1.0.0(postcss-html@1.7.0)(stylelint@15.11.0):
stylelint-config-standard-vue@1.0.0(postcss-html@1.7.0)(stylelint@15.11.0(typescript@5.7.2)):
dependencies:
postcss-html: 1.7.0
stylelint: 15.11.0(typescript@5.7.2)
stylelint-config-html: 1.1.0(postcss-html@1.7.0)(stylelint@15.11.0)
stylelint-config-recommended-vue: 1.5.0(postcss-html@1.7.0)(stylelint@15.11.0)
stylelint-config-standard: 33.0.0(stylelint@15.11.0)
stylelint-config-html: 1.1.0(postcss-html@1.7.0)(stylelint@15.11.0(typescript@5.7.2))
stylelint-config-recommended-vue: 1.5.0(postcss-html@1.7.0)(stylelint@15.11.0(typescript@5.7.2))
stylelint-config-standard: 33.0.0(stylelint@15.11.0(typescript@5.7.2))
stylelint-config-standard@33.0.0(stylelint@15.11.0):
stylelint-config-standard@33.0.0(stylelint@15.11.0(typescript@5.7.2)):
dependencies:
stylelint: 15.11.0(typescript@5.7.2)
stylelint-config-recommended: 12.0.0(stylelint@15.11.0)
stylelint-config-recommended: 12.0.0(stylelint@15.11.0(typescript@5.7.2))
stylelint-scss@4.7.0(stylelint@15.11.0):
stylelint-scss@4.7.0(stylelint@15.11.0(typescript@5.7.2)):
dependencies:
postcss-media-query-parser: 0.2.3
postcss-resolve-nested-selector: 0.1.6
......@@ -10636,7 +10634,7 @@ snapshots:
postcss-value-parser: 4.2.0
stylelint: 15.11.0(typescript@5.7.2)
stylelint-scss@5.3.2(stylelint@15.11.0):
stylelint-scss@5.3.2(stylelint@15.11.0(typescript@5.7.2)):
dependencies:
known-css-properties: 0.29.0
postcss-media-query-parser: 0.2.3
......@@ -10645,7 +10643,7 @@ snapshots:
postcss-value-parser: 4.2.0
stylelint: 15.11.0(typescript@5.7.2)
stylelint-stylistic@0.4.5(stylelint@15.11.0):
stylelint-stylistic@0.4.5(stylelint@15.11.0(typescript@5.7.2)):
dependencies:
is-plain-object: 5.0.0
postcss: 8.4.49
......@@ -10658,7 +10656,7 @@ snapshots:
dependencies:
'@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1)
'@csstools/css-tokenizer': 2.4.1
'@csstools/media-query-list-parser': 2.1.13(@csstools/css-parser-algorithms@2.7.1)(@csstools/css-tokenizer@2.4.1)
'@csstools/media-query-list-parser': 2.1.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1)
'@csstools/selector-specificity': 3.1.1(postcss-selector-parser@6.1.2)
balanced-match: 2.0.0
colord: 2.9.3
......@@ -10955,9 +10953,9 @@ snapshots:
undici-types@6.19.8: {}
unimport@3.13.3:
unimport@3.13.3(rollup@3.29.5):
dependencies:
'@rollup/pluginutils': 5.1.3
'@rollup/pluginutils': 5.1.3(rollup@3.29.5)
acorn: 8.14.0
escape-string-regexp: 5.0.0
estree-walker: 3.0.3
......@@ -10994,23 +10992,24 @@ snapshots:
unpipe@1.0.0: {}
unplugin-auto-import@0.15.3(@vueuse/core@10.11.1):
unplugin-auto-import@0.15.3(@vueuse/core@10.11.1(vue@3.5.13(typescript@5.7.2)))(rollup@3.29.5):
dependencies:
'@antfu/utils': 0.7.10
'@rollup/pluginutils': 5.1.3
'@vueuse/core': 10.11.1(vue@3.5.13)
'@rollup/pluginutils': 5.1.3(rollup@3.29.5)
local-pkg: 0.4.3
magic-string: 0.30.13
minimatch: 9.0.5
unimport: 3.13.3
unimport: 3.13.3(rollup@3.29.5)
unplugin: 1.16.0
optionalDependencies:
'@vueuse/core': 10.11.1(vue@3.5.13(typescript@5.7.2))
transitivePeerDependencies:
- rollup
unplugin-vue-components@0.24.1(vue@3.5.13):
unplugin-vue-components@0.24.1(@babel/parser@7.26.2)(rollup@3.29.5)(vue@3.5.13(typescript@5.7.2)):
dependencies:
'@antfu/utils': 0.7.10
'@rollup/pluginutils': 5.1.3
'@rollup/pluginutils': 5.1.3(rollup@3.29.5)
chokidar: 3.6.0
debug: 4.3.7
fast-glob: 3.3.2
......@@ -11020,6 +11019,8 @@ snapshots:
resolve: 1.22.8
unplugin: 1.16.0
vue: 3.5.13(typescript@5.7.2)
optionalDependencies:
'@babel/parser': 7.26.2
transitivePeerDependencies:
- rollup
- supports-color
......@@ -11081,10 +11082,10 @@ snapshots:
spdx-correct: 3.2.0
spdx-expression-parse: 3.0.1
vant@4.9.9(vue@3.5.13):
vant@4.9.9(vue@3.5.13(typescript@5.7.2)):
dependencies:
'@vant/popperjs': 1.3.0
'@vant/use': 1.6.0(vue@3.5.13)
'@vant/use': 1.6.0(vue@3.5.13(typescript@5.7.2))
'@vue/shared': 3.5.13
vue: 3.5.13(typescript@5.7.2)
......@@ -11111,16 +11112,16 @@ snapshots:
vite-plugin-banner@0.7.1: {}
vite-plugin-compression@0.5.1(vite@4.5.5):
vite-plugin-compression@0.5.1(vite@4.5.5(@types/node@22.9.3)(sass@1.81.0)(terser@5.36.0)):
dependencies:
chalk: 4.1.2
debug: 4.3.7
fs-extra: 10.1.0
vite: 4.5.5(sass@1.81.0)(terser@5.36.0)
vite: 4.5.5(@types/node@22.9.3)(sass@1.81.0)(terser@5.36.0)
transitivePeerDependencies:
- supports-color
vite-plugin-mock@2.9.8(mockjs@1.1.0)(vite@4.5.5):
vite-plugin-mock@2.9.8(mockjs@1.1.0)(vite@4.5.5(@types/node@22.9.3)(sass@1.81.0)(terser@5.36.0)):
dependencies:
'@types/mockjs': 1.0.10
chalk: 4.1.2
......@@ -11131,11 +11132,11 @@ snapshots:
fast-glob: 3.3.2
mockjs: 1.1.0
path-to-regexp: 6.3.0
vite: 4.5.5(sass@1.81.0)(terser@5.36.0)
vite: 4.5.5(@types/node@22.9.3)(sass@1.81.0)(terser@5.36.0)
transitivePeerDependencies:
- supports-color
vite-plugin-pages@0.29.1(vite@4.5.5):
vite-plugin-pages@0.29.1(@vue/compiler-sfc@3.5.13)(vite@4.5.5(@types/node@22.9.3)(sass@1.81.0)(terser@5.36.0)):
dependencies:
'@types/debug': 4.1.12
debug: 4.3.7
......@@ -11145,8 +11146,10 @@ snapshots:
json5: 2.2.3
local-pkg: 0.4.3
picocolors: 1.1.1
vite: 4.5.5(sass@1.81.0)(terser@5.36.0)
vite: 4.5.5(@types/node@22.9.3)(sass@1.81.0)(terser@5.36.0)
yaml: 2.6.1
optionalDependencies:
'@vue/compiler-sfc': 3.5.13
transitivePeerDependencies:
- supports-color
......@@ -11159,7 +11162,7 @@ snapshots:
spritesheet-templates: 10.5.2
spritesmith: 3.5.1
vite-plugin-svg-icons@2.0.1(vite@4.5.5):
vite-plugin-svg-icons@2.0.1(vite@4.5.5(@types/node@22.9.3)(sass@1.81.0)(terser@5.36.0)):
dependencies:
'@types/svgo': 2.6.4
cors: 2.8.5
......@@ -11169,11 +11172,11 @@ snapshots:
pathe: 0.2.0
svg-baker: 1.7.0
svgo: 2.8.0
vite: 4.5.5(sass@1.81.0)(terser@5.36.0)
vite: 4.5.5(@types/node@22.9.3)(sass@1.81.0)(terser@5.36.0)
transitivePeerDependencies:
- supports-color
vite-plugin-vue-inspector@3.7.2(vite@4.5.5):
vite-plugin-vue-inspector@3.7.2(vite@4.5.5(@types/node@22.9.3)(sass@1.81.0)(terser@5.36.0)):
dependencies:
'@babel/core': 7.26.0
'@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.26.0)
......@@ -11184,27 +11187,28 @@ snapshots:
'@vue/compiler-dom': 3.5.13
kolorist: 1.8.0
magic-string: 0.30.13
vite: 4.5.5(sass@1.81.0)(terser@5.36.0)
vite: 4.5.5(@types/node@22.9.3)(sass@1.81.0)(terser@5.36.0)
transitivePeerDependencies:
- supports-color
vite-plugin-vue-meta-layouts@0.2.2(vite@4.5.5)(vue-router@4.4.5):
vite-plugin-vue-meta-layouts@0.2.2(vite@4.5.5(@types/node@22.9.3)(sass@1.81.0)(terser@5.36.0))(vue-router@4.4.5(vue@3.5.13(typescript@5.7.2))):
dependencies:
local-pkg: 0.4.3
vite: 4.5.5(sass@1.81.0)(terser@5.36.0)
vue-router: 4.4.5(vue@3.5.13)
vite: 4.5.5(@types/node@22.9.3)(sass@1.81.0)(terser@5.36.0)
vue-router: 4.4.5(vue@3.5.13(typescript@5.7.2))
vite@4.5.5(sass@1.81.0)(terser@5.36.0):
vite@4.5.5(@types/node@22.9.3)(sass@1.81.0)(terser@5.36.0):
dependencies:
esbuild: 0.18.20
postcss: 8.4.49
rollup: 3.29.5
sass: 1.81.0
terser: 5.36.0
optionalDependencies:
'@types/node': 22.9.3
fsevents: 2.3.3
sass: 1.81.0
terser: 5.36.0
vue-demi@0.14.10(vue@3.5.13):
vue-demi@0.14.10(vue@3.5.13(typescript@5.7.2)):
dependencies:
vue: 3.5.13(typescript@5.7.2)
......@@ -11221,7 +11225,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
vue-router@4.4.5(vue@3.5.13):
vue-router@4.4.5(vue@3.5.13(typescript@5.7.2)):
dependencies:
'@vue/devtools-api': 6.6.4
vue: 3.5.13(typescript@5.7.2)
......@@ -11238,7 +11242,7 @@ snapshots:
semver: 7.6.3
typescript: 5.7.2
vue-types@3.0.2(vue@3.5.13):
vue-types@3.0.2(vue@3.5.13(typescript@5.7.2)):
dependencies:
is-plain-object: 3.0.1
vue: 3.5.13(typescript@5.7.2)
......@@ -11248,8 +11252,9 @@ snapshots:
'@vue/compiler-dom': 3.5.13
'@vue/compiler-sfc': 3.5.13
'@vue/runtime-dom': 3.5.13
'@vue/server-renderer': 3.5.13(vue@3.5.13)
'@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.7.2))
'@vue/shared': 3.5.13
optionalDependencies:
typescript: 5.7.2
warning@4.0.3:
......
......@@ -129,3 +129,100 @@ export const getGradeTreeList = () => request({
url: `${import.meta.env.VITE_APP_CHECK_BASEURL}/grade/tree-list`,
method: 'post',
})
/**
* 分类树形列表
* @param {Object}
* @path /classify/tree-list
* */
export const getClassifyTreeList = (data) => request({
url: `${import.meta.env.VITE_APP_CHECK_BASEURL}/classify/tree-list`,
method: 'post',
data
})
/**
* 分类新增
* @param {Object}
* @path /classify/save
* */
export const saveClassify = (data) => request({
url: `${import.meta.env.VITE_APP_CHECK_BASEURL}/classify/save`,
method: 'post',
data
})
/**
* 分类更新
* @param {Object}
* @path /classify/update
*/
export const updateClassify = (data) => request({
url: `${import.meta.env.VITE_APP_CHECK_BASEURL}/classify/update`,
method: 'post',
data
})
/**删除分类
* @param {Object}
* @path /classify/delete
*/
export const deleteClassify = (data) => request({
url: `${import.meta.env.VITE_APP_CHECK_BASEURL}/classify/delete?guid=${data.guid}`,
method: 'delete',
})
/** ---------------分类分级模板------------------------ */
/**
* 分类分级模板新增
* @param {Object}
* @path /cg-template/save
*/
export const saveCgTemplate = (data) => request({
url: `${import.meta.env.VITE_APP_CHECK_BASEURL}/cg-template/save`,
method: 'post',
data
})
/**
* 分类分级模板左侧树形列表
* @param {Object}
* @path /cg-template-classify/tree-list
*/
export const getCgTemplateClassifyTreeList = (data) => request({
url: `${import.meta.env.VITE_APP_CHECK_BASEURL}/cg-template-classify/tree-list`,
method: 'post',
data
})
/**-------------------------分类分级目录--------------------------------- */
/**
* 分类分级目录树形列表
* @param {Object}
* @path /cg-dir/tree-list
*/
export const getCgDirTreeList = (data) => request({
url: `${import.meta.env.VITE_APP_CHECK_BASEURL}/cg-dir/tree-list`,
method: 'post',
data
})
/**
* 分类分级目录-分页
* @param {Object}
* @path /cg-dir/field/page-list
*/
export const getCgDirFieldPageList = (data) => request({
url: `${import.meta.env.VITE_APP_CHECK_BASEURL}/cg-dir/field/page-list`,
method: 'post',
data
})
......
import request from "@/utils/request";
/**
* 远程获取标签
* @param {Object}
* @path /cg-label/label-serach
* @method get
* @des query查询 label
*/
export const getLabelList = (data) => request({
url: `${import.meta.env.VITE_APP_CHECK_BASEURL}/cg-label/label-serach?label=${data.label}`,
method: 'get',
})
/**
* 分类分级树形目录
* @param {no params}
* @path /classify-grade/tree-list
* @method post
*/
export const getClassifyGradeTreeList = () => request({
url: `${import.meta.env.VITE_APP_CHECK_BASEURL}/classify-grade/tree-list`,
method: 'post',
})
/**
* @des 新增标签规则
* @param {Object}
* @path /cg-label/save
*/
export const saveLabel = (data) => request({
url: `${import.meta.env.VITE_APP_CHECK_BASEURL}/cg-label/save`,
method: 'post',
data
})
/**
* @des 获取标签页规则列表
* @param {Object}
* @path /cg-label/page-list
*/
export const getLabelPageList = (data) => request({
url: `${import.meta.env.VITE_APP_CHECK_BASEURL}/cg-label/page-list`,
method: 'post',
data
})
/**
* @des 删除标签规则
* @param {Array}
* @path /cg-label/delete
*/
export const deleteLabel = (data) => request({
url: `${import.meta.env.VITE_APP_CHECK_BASEURL}/cg-label/delete`,
method: 'delete',
data
})
/**
* @des 标签规则修改
* @param {Object}
* @path /cg-label/update
*/
export const updateLabel = (data) => request({
url: `${import.meta.env.VITE_APP_CHECK_BASEURL}/cg-label/update`,
method: 'post',
data
})
......@@ -14,6 +14,8 @@ const props = defineProps({
},
});
const dialogRef = ref();
const dialogInfo = computed(() => {
return {
visible: props.dialogConfigInfo.visible,
......@@ -49,10 +51,16 @@ const formDialogRadioGroupChange = (val, row, item) => {
const formDialogSelectChange = (val, item, row) => {
emits('formDialogSelectChange', val, row, item);
}
defineExpose({
dialogRef,
});
</script>
<template>
<Dialog :dialogInfo="dialogInfo" @btnClick="formDialogBtnClick" @radioGroupChange="formDialogRadioGroupChange"
@select-change="formDialogSelectChange" />
<Dialog ref="dialogRef" :dialogInfo="dialogInfo" @btnClick="formDialogBtnClick"
@radioGroupChange="formDialogRadioGroupChange" @select-change="formDialogSelectChange">
<!-- 默认插槽内容 -->
<slot></slot>
</Dialog>
</template>
......
......@@ -80,7 +80,7 @@ const showClose = computed(() => {
const dialogModal = computed(() => {
return props.dialogInfo.modal ?? true;
});
const btnLoading = computed(()=>{
const btnLoading = computed(() => {
return props.dialogInfo.btnLoading ?? false;
})
const modalClose = computed(() => {
......@@ -495,8 +495,8 @@ const uploadSelectChange = (val) => {
const scheduleChange = (val, rowValue) => {
emits("scheduleChange", val, rowValue);
};
const treeSelectNodeChange = (node, item)=>{
emits("treeSelectNodeChange",node, item)
const treeSelectNodeChange = (node, item, nodeObj) => {
emits("treeSelectNodeChange", node, item, nodeObj);
}
const setTreeChecked = (checkedKeys, leafOnly: boolean = false) => {
nextTick(() => {
......@@ -522,7 +522,7 @@ watch(
);
const getDialogConRef = (refName) => {
if(refName == 'formTableRef'){
if (refName == 'formTableRef') {
const dtf = formTableRef.value?.[0] || formTableRef.value
return dtf?.tableRef
}
......@@ -538,86 +538,44 @@ defineExpose({
</script>
<template>
<el-dialog
v-model="dialogVisible"
:title="dialogTitle"
:width="dialogSize"
:show-close="showClose"
:modal="dialogModal"
:close-on-click-modal="modalClose"
:modal-class="dialogModalClass"
destroy-on-close
align-center
:before-close="beforeClose"
@close="dialogClose"
>
<el-dialog v-model="dialogVisible" :title="dialogTitle" :width="dialogSize" :show-close="showClose"
:modal="dialogModal" :close-on-click-modal="modalClose" :modal-class="dialogModalClass" destroy-on-close
align-center :before-close="beforeClose" @close="dialogClose">
<template v-if="headerSearchInputVisible" #header="{ titleId, titleClass }">
<span :id="titleId" :class="titleClass">{{ dialogTitle }}</span>
<el-input
class="header_search_input"
v-model.trim="headerSearchInputValue"
:placeholder="headerSearchInputPlaceholder"
:prefix-icon="Search"
@change="headerSearchInputChanged"
clearable
/>
<el-input class="header_search_input" v-model.trim="headerSearchInputValue"
:placeholder="headerSearchInputPlaceholder" :prefix-icon="Search" @change="headerSearchInputChanged"
clearable />
</template>
<div
class="dialog_content"
:class="[dialogDirection]"
:style="{ height: dialogHeight }"
@keydown.tab.prevent="handleKeyDown"
>
<div
class="dialog_panel"
:class="[con.col, { grid: con.type == 'grid' }]"
:style="con.style"
v-for="con in contents"
>
<div class="dialog_content" :class="[dialogDirection]" :style="{ height: dialogHeight }"
@keydown.tab.prevent="handleKeyDown">
<div class="dialog_panel" :class="[con.col, { grid: con.type == 'grid' }]" :style="con.style"
v-for="con in contents">
<div class="panel_header" v-if="con.title">
<span class="title_text" :class="{ required_mark: con.type.indexOf('form-') > -1 }">{{
con.title
}}</span>
</div>
<div
class="panel_content"
:class="[con.col, { full: !con.title }]"
v-if="con.type"
>
<div class="panel_content" :class="[con.col, { full: !con.title }]" v-if="con.type">
<template v-if="con.type.indexOf('table') > -1">
<div
class="panel_title table_panel_title"
:class="[con.tools.posit]"
v-if="con.tools"
>
<div class="panel_title table_panel_title" :class="[con.tools.posit]" v-if="con.tools">
<div class="title_text">
<span>{{ con.tools.title }}</span>
<span class="tips_text">{{ con.tools.tips }}</span>
</div>
<div class="table_tool">
<span v-for="bar in con.tools.btns">
<span
class="tool_btn"
v-if="con.tools.type == 'text_btn'"
:class="[bar.type]"
@click="btnClick(bar, null)"
v-preReClick
>
<span class="tool_btn" v-if="con.tools.type == 'text_btn'" :class="[bar.type]"
@click="btnClick(bar, null)" v-preReClick>
<el-icon v-if="bar.icon && bar.icon == 'CirclePlus'">
<CirclePlus />
</el-icon>
<span>{{ bar.label }}</span>
</span>
<template v-else>
<el-popover
v-if="bar.popover"
:visible="bar.popover.visible"
:title="bar.popover.title"
:content="bar.popover.content"
placement="bottom-start"
:width="bar.popover.width ?? 200"
trigger="click"
>
<el-popover v-if="bar.popover" :visible="bar.popover.visible" :title="bar.popover.title"
:content="bar.popover.content" placement="bottom-start" :width="bar.popover.width ?? 200"
trigger="click">
<template #reference>
<el-button :type="bar.type" @click="btnClick(bar, con.type)" v-preReClick>{{ bar.label
}}</el-button>
......@@ -629,59 +587,31 @@ defineExpose({
</span>
</div>
</div>
<div
class="panel_body"
:class="[
<div class="panel_body" :class="[
con.tools && con.tools.posit,
con.tableInfo.col,
{ full: !con.tools },
]"
>
]">
<div class="table_panel_wrap" :class="[con.tableInfo.col]">
<Table
ref="formTableRef"
:tableInfo="con.tableInfo"
@tableSelectChange="tableSelectChange"
@table-checkbox-select-change="tableCheckboxSelectChange"
@table-checkbox-all-select-change="
tableCheckboxAllSelectChange
"
@tableBtnClick="tableBtnClick"
@tableSelectionChange="tableSelectionChange"
@tablePageChange="tablePageChange"
/>
<Table ref="formTableRef" :tableInfo="con.tableInfo" @tableSelectChange="tableSelectChange"
@table-checkbox-select-change="tableCheckboxSelectChange" @table-checkbox-all-select-change="tableCheckboxAllSelectChange
" @tableBtnClick="tableBtnClick" @tableSelectionChange="tableSelectionChange"
@tablePageChange="tablePageChange" />
</div>
<PageNav
v-if="
<PageNav v-if="
!con.tableInfo.showPage &&
con.tableInfo.pageCount !== undefined
"
class="footer_page"
:pageInfo="{ type: 'count', rows: con.tableInfo.pageCount }"
/>
" class="footer_page" :pageInfo="{ type: 'count', rows: con.tableInfo.pageCount }" />
</div>
</template>
<template v-else-if="con.type.indexOf('tree') > -1">
<div class="list_tree" v-if="con.type.indexOf('list-tree') > -1">
<ListPanel
ref="formListRef"
:listInfo="con.formListTree.listInfo"
@itemClick="listItemClick"
/>
<Tree
ref="formTreeRef"
:treeInfo="con.formListTree.treeInfo"
@nodeCheck="treeNodeCheck"
@nodeClick="treeNodeClick"
/>
<ListPanel ref="formListRef" :listInfo="con.formListTree.listInfo" @itemClick="listItemClick" />
<Tree ref="formTreeRef" :treeInfo="con.formListTree.treeInfo" @nodeCheck="treeNodeCheck"
@nodeClick="treeNodeClick" />
</div>
<Tree
v-else
ref="formTreeRef"
:treeInfo="con.treeInfo"
@nodeCheck="treeNodeCheck"
@nodeClick="treeNodeClick"
/>
<Tree v-else ref="formTreeRef" :treeInfo="con.treeInfo" @nodeCheck="treeNodeCheck"
@nodeClick="treeNodeClick" />
</template>
<template v-else-if="con.type.indexOf('tags') > -1">
<!-- 修改此处时须测试数据目录对不对。-->
......@@ -693,11 +623,7 @@ defineExpose({
}}</span>
</div>
<div class="tags_list_panel">
<div
class="tag_item"
v-for="(tag, t) in con.tagInfo.data"
:key="tag.guid"
>
<div class="tag_item" v-for="(tag, t) in con.tagInfo.data" :key="tag.guid">
<span class="tag">
<span>{{
con.tagInfo.labelFields
......@@ -713,81 +639,45 @@ defineExpose({
</div>
</template>
<template v-else-if="con.type.indexOf('tabs') > -1">
<Tabs
ref="formTabsRef"
:tabsInfo="con.tabsInfo"
@tabChange="tabChange"
/>
<Tabs ref="formTabsRef" :tabsInfo="con.tabsInfo" @tabChange="tabChange" />
</template>
<template v-else-if="con.type.indexOf('grid') > -1">
<DialogGrid
:gridInfo="con.gridInfo"
@listSearch="listSearch"
@itemClick="listItemClick"
@tableBtnClick="tableBtnClick"
/>
<DialogGrid :gridInfo="con.gridInfo" @listSearch="listSearch" @itemClick="listItemClick"
@tableBtnClick="tableBtnClick" />
</template>
<template v-else-if="con.type.indexOf('transfer') > -1">
<Transfer
:transferInfo="con.transferInfo"
@btnClick="transferBtnClick"
@toolBtnClick="transferToolBtnClick"
@tableSelectionChange="transferTableSelectionChange"
@tableDataFilter="transferTableDataFilter"
/>
<Transfer :transferInfo="con.transferInfo" @btnClick="transferBtnClick" @toolBtnClick="transferToolBtnClick"
@tableSelectionChange="transferTableSelectionChange" @tableDataFilter="transferTableDataFilter" />
</template>
<template v-else-if="con.type.indexOf('list') > -1">
<ListPanel
class="list_unit"
ref="formListRef"
:listInfo="con.listInfo"
@itemClick="listItemClick"
/>
<ListPanel class="list_unit" ref="formListRef" :listInfo="con.listInfo" @itemClick="listItemClick" />
</template>
<template v-else-if="con.type.indexOf('textare') > -1">
<div class="textare_panel">
<el-input
v-model.trim="textareVal"
:rows="con.rows ?? 4"
type="textarea"
:placeholder="con.placeholder"
:disabled="con.disabled"
:readonly="con.readonly"
resize="none"
:maxlength="con.maxlength ?? 500"
show-word-limit
/>
<el-input v-model.trim="textareVal" :rows="con.rows ?? 4" type="textarea" :placeholder="con.placeholder"
:disabled="con.disabled" :readonly="con.readonly" resize="none" :maxlength="con.maxlength ?? 500"
show-word-limit />
</div>
</template>
<template v-else-if="con.type.indexOf('upload') > -1">
<UploadFiles
ref="formUploadRef"
:upload-info="con.uploadInfo"
@onUpload="onUpload"
@beforeUPload="beforeUPload"
@uploadFile="uploadFile"
@uploadBtnClick="uploadBtnClick"
@cascaderChange="cascaderChange"
@selectChange="uploadSelectChange"
/>
<UploadFiles ref="formUploadRef" :upload-info="con.uploadInfo" @onUpload="onUpload"
@beforeUPload="beforeUPload" @uploadFile="uploadFile" @uploadBtnClick="uploadBtnClick"
@cascaderChange="cascaderChange" @selectChange="uploadSelectChange" />
</template>
<template v-else>
<div v-if="con.formInfo.tools">
<div
class="tips_msg_box"
:class="[con.formInfo.tools.tips.type]"
v-if="con.formInfo.tools.tips"
>
<div class="tips_msg_box" :class="[con.formInfo.tools.tips.type]" v-if="con.formInfo.tools.tips">
<el-icon>
<WarningFilled />
</el-icon>
<span>{{ con.formInfo.tools.tips.msg }}</span>
</div>
</div>
<Form ref="dialogFormRef" :itemList="con.formInfo.items" :formId="con.formInfo.id" :rules="con.formInfo.rules"
:col="con.formInfo.col" :readonly="con.formInfo.readonly" @radioGroupChange="radioGroupChange"
@selectChange="formSelectChange" @toolBtnClick="formToolBtnClick" @checkboxChange="checkboxChange"
@switchChange="switchChange" @btnClick="btnClick" @treeSelectLoad="treeSelectLoad" @treeSelectNodeChange="treeSelectNodeChange"
<Form ref="dialogFormRef" :itemList="con.formInfo.items" :formId="con.formInfo.id"
:rules="con.formInfo.rules" :col="con.formInfo.col" :readonly="con.formInfo.readonly"
@radioGroupChange="radioGroupChange" @selectChange="formSelectChange" @toolBtnClick="formToolBtnClick"
@checkboxChange="checkboxChange" @switchChange="switchChange" @btnClick="btnClick"
@treeSelectLoad="treeSelectLoad" @treeSelectNodeChange="treeSelectNodeChange"
@scheduleChange="scheduleChange" @inputChange="formInputChange" />
<template v-if="con.note">
<div class="sql-note">{{ con.note }}</div>
......@@ -799,30 +689,19 @@ defineExpose({
<template #footer v-if="footer.visible ?? true">
<div class="dialog-footer" :class="{ between: footer.textBtns }">
<div v-if="footer.textBtns">
<span
class="text_btn"
v-for="btn in footer.textBtns"
:disabled="btn.disabled ?? false"
@click="btnClick(btn, null)"
v-preReClick
>{{ btn.label }}</span
>
<span class="text_btn" v-for="btn in footer.textBtns" :disabled="btn.disabled ?? false"
@click="btnClick(btn, null)" v-preReClick>{{ btn.label }}</span>
</div>
<div>
<template v-for="btn in footer.btns">
<el-button
v-if="btn.visible ?? true"
:type="btn.type"
:disabled="btn.disabled ?? false"
:loading="btn.loading ?? btnLoading"
@click="btnClick(btn, null)"
v-preReClick
>{{ btn.label }}</el-button
>
<el-button v-if="btn.visible ?? true" :type="btn.type" :disabled="btn.disabled ?? false"
:loading="btn.loading ?? btnLoading" @click="btnClick(btn, null)" v-preReClick>{{ btn.label }}</el-button>
</template>
</div>
</div>
</template>
<!-- 默认插槽内容 -->
<slot></slot>
</el-dialog>
</template>
......@@ -1042,7 +921,7 @@ defineExpose({
width: 100%;
position: relative;
& > span {
&>span {
max-width: calc(100% - 20px);
overflow: hidden;
text-overflow: ellipsis;
......
......@@ -99,7 +99,7 @@ const onClickOutside = (e: any) => {
};
const getDrawerConRef = (refName) => {
if(refName == 'drawerTableRef'){
if (refName == 'drawerTableRef') {
const dtf = drawerTableRef.value[0] || drawerTableRef.value
return dtf?.tableRef
}
......@@ -228,90 +228,45 @@ const drawerClose = () => {
</script>
<template>
<el-drawer
v-model="drawerVisible"
:direction="drawerDirection"
:size="drawerSize"
:modal="drawerModal"
:close-on-click-modal="modalClose"
:close-on-press-escape="modalClose"
:modal-class="drawerModalClass"
destroy-on-close
:z-index="props.drawerInfo.zIndex ?? null"
@close="drawerClose"
>
<el-drawer v-model="drawerVisible" :direction="drawerDirection" :size="drawerSize" :modal="drawerModal"
:close-on-click-modal="modalClose" :close-on-press-escape="modalClose" :modal-class="drawerModalClass"
destroy-on-close :z-index="props.drawerInfo.zIndex ?? null" @close="drawerClose">
<template #header>
<span class="title">{{ drawerTitle }}</span>
</template>
<template #default>
<div class="drawer-body-loading" v-if="drawerInfo.loading ?? false" v-loading="drawerInfo.loading ?? false"></div>
<div
v-else
class="drawer_panel"
:class="[con.col]"
:style="con.style"
v-for="con in contents"
>
<div v-else class="drawer_panel" :class="[con.col]" :style="con.style" v-for="con in contents">
<div class="panel_title" v-if="con.title">{{ con.title }}</div>
<template v-if="con.type && con.type.indexOf('table') > -1">
<div
class="table_tool"
:class="[con.tableTool.col]"
v-if="con.tableTool && (con.tableTool.visible ?? true)"
>
<div class="table_tool" :class="[con.tableTool.col]" v-if="con.tableTool && (con.tableTool.visible ?? true)">
<template v-for="bar in con.tableTool.btns">
<el-popover
v-if="bar.popover"
:visible="bar.popover.visible"
:title="bar.popover.title"
:popper-class="bar.popover.class ?? ''"
placement="bottom-start"
:width="bar.popover.width ?? 200"
trigger="click"
>
<el-popover v-if="bar.popover" :visible="bar.popover.visible" :title="bar.popover.title"
:popper-class="bar.popover.class ?? ''" placement="bottom-start" :width="bar.popover.width ?? 200"
trigger="click">
<template #reference>
<el-button
:type="bar.type"
@click="toolBtnClick(bar, con.type)"
v-click-outside="onClickOutside"
v-preReClick
>{{ bar.label }}</el-button
>
<el-button :type="bar.type" @click="toolBtnClick(bar, con.type)" v-click-outside="onClickOutside"
v-preReClick>{{ bar.label }}</el-button>
</template>
<template #default>
<span v-html="bar.popover.content"></span>
</template>
</el-popover>
<el-button
:type="bar.type"
:plain="bar.plain"
v-else
@click="toolBtnClick(bar, 'table')"
v-preReClick
>{{ bar.label }}</el-button
>
<el-button :type="bar.type" :plain="bar.plain" v-else @click="toolBtnClick(bar, 'table')" v-preReClick>{{
bar.label
}}</el-button>
</template>
</div>
<div class="table_panel_wrap" :style="con.tableInfo.style">
<Table
ref="drawerTableRef"
:class="[con.tableInfo.col]"
:tableInfo="con.tableInfo"
@tableSelectChange="tableSelectChange"
@tableBtnClick="tableBtnClick"
@tableSelectionChange="tableSelectionChange"
@tableInputChange="tableInputChange"
@tablePageChange="tablePageChange"
/>
<Table ref="drawerTableRef" :class="[con.tableInfo.col]" :tableInfo="con.tableInfo"
@tableSelectChange="tableSelectChange" @tableBtnClick="tableBtnClick"
@tableSelectionChange="tableSelectionChange" @tableInputChange="tableInputChange"
@tablePageChange="tablePageChange" />
</div>
</template>
<template v-else-if="con.type && con.type.indexOf('tree') > -1">
<div class="list_tree" v-if="con.type.indexOf('list') > -1">
<ListPanel
ref="formListRef"
:listInfo="con.listInfo"
@itemClick="listItemClick"
/>
<ListPanel ref="formListRef" :listInfo="con.listInfo" @itemClick="listItemClick" />
<Tree ref="formTreeRef" :treeInfo="con.treeInfo" />
</div>
<Tree ref="formTreeRef" :treeInfo="con.treeInfo" v-else />
......@@ -329,23 +284,12 @@ const drawerClose = () => {
</template>
<template v-else-if="con.type && con.type.indexOf('upload') > -1">
<div class="upload_tool">
<UploadFiles
ref="uploadRef"
:upload-info="con.uploadInfo"
@onUpload="onUpload"
@beforeUPload="beforeUPload"
@uploadFile="uploadFile"
@uploadBtnClick="uploadBtnClick"
/>
<UploadFiles ref="uploadRef" :upload-info="con.uploadInfo" @onUpload="onUpload" @beforeUPload="beforeUPload"
@uploadFile="uploadFile" @uploadBtnClick="uploadBtnClick" />
<div class="tool_btns" v-if="con.tools && con.tools.visible">
<template v-for="btn in con.tools.btns">
<el-button
v-if="btn.visible ?? true"
:type="btn.type"
:plain="btn.plain"
@click="toolBtnClick(btn, 'table')"
v-preReClick
>
<el-button v-if="btn.visible ?? true" :type="btn.type" :plain="btn.plain"
@click="toolBtnClick(btn, 'table')" v-preReClick>
<el-icon v-if="btn.icon && btn.icon == 'Upload'">
<Upload />
</el-icon>
......@@ -357,49 +301,28 @@ const drawerClose = () => {
</template>
</div>
</div>
<div
class="upload_table_panel_wrap"
v-if="con.tableInfo && Object.keys(con.tableInfo).length"
>
<Table
ref="drawerTableRef"
:class="[con.tableInfo.col]"
:tableInfo="con.tableInfo"
@tableSelectChange="tableSelectChange"
@tableBtnClick="tableBtnClick"
@tableSelectionChange="tableSelectionChange"
@tableInputChange="tableInputChange"
@tablePageChange="tablePageChange"
/>
<div class="upload_table_panel_wrap" v-if="con.tableInfo && Object.keys(con.tableInfo).length">
<Table ref="drawerTableRef" :class="[con.tableInfo.col]" :tableInfo="con.tableInfo"
@tableSelectChange="tableSelectChange" @tableBtnClick="tableBtnClick"
@tableSelectionChange="tableSelectionChange" @tableInputChange="tableInputChange"
@tablePageChange="tablePageChange" />
</div>
</template>
<template v-else>
<Form
ref="drawerFormRef"
:itemList="con.formInfo.items"
:formId="con.formInfo.id"
:rules="con.formInfo.rules"
:col="con.formInfo.col"
:readonly="con.formInfo.readonly"
@radioGroupChange="radioGroupChange"
@selectChange="formSelectChange"
@btnClick="formBtnClick"
/>
<Form ref="drawerFormRef" :itemList="con.formInfo.items" :formId="con.formInfo.id" :rules="con.formInfo.rules"
:col="con.formInfo.col" :readonly="con.formInfo.readonly" @radioGroupChange="radioGroupChange"
@selectChange="formSelectChange" @btnClick="formBtnClick">
</Form>
<!-- 插槽内容 -->
<slot></slot>
</template>
</div>
</template>
<template #footer v-if="footer.visible ?? true">
<div style="flex: auto">
<template v-for="btn in footer.btns">
<el-button
v-if="btn.visible ?? true"
:type="btn.type"
:disabled="btn.disabled ?? false"
@click="btnClick(btn, null)"
v-preReClick
:loading="btn.loading ?? false"
>{{ btn.label }}</el-button
>
<el-button v-if="btn.visible ?? true" :type="btn.type" :disabled="btn.disabled ?? false"
@click="btnClick(btn, null)" v-preReClick :loading="btn.loading ?? false">{{ btn.label }}</el-button>
</template>
</div>
</template>
......
This diff could not be displayed because it is too large.
import type { MockMethod } from 'vite-plugin-mock'
import Mock from 'mockjs'
export const confirmDelivery = {
url: '/mock/youthBoost/admin/shipment',
method: 'post',
response: ({body}:{body:any}) => {
return {
code: 200,
message: '成功',
data: []
}
}
}
export default [confirmDelivery] as MockMethod[]
// import { createProdMockServer } from 'vite-plugin-mock/es/createProdMockServer'
// const mocks: any[] = []
// const mockContext = import.meta.glob('./mock/*.ts', { eager: true })
// Object.keys(mockContext).forEach((v) => {
// mocks.push(...(mockContext[v] as any).default)
// })
// export function setupProdMockServer() {
// createProdMockServer(mocks)
// }
import { createProdMockServer } from 'vite-plugin-mock/es/createProdMockServer'
import dataInventory from './mock/data_inventory'
const mocks: any[] = []
const mockContext = import.meta.glob('./mock/*.ts', { eager: true })
Object.keys(mockContext).forEach((v) => {
mocks.push(...(mockContext[v] as any).default)
})
export function setupProdMockServer() {
createProdMockServer(mocks)
createProdMockServer([...dataInventory,])
}
......
......@@ -89,7 +89,17 @@ const routes: RouteRecordRaw[] = [
name: 'templateConfig',
component: () => import('@/views/data_inventory/templateConfig.vue'),
meta: {
title: '分类分级模板',
title: '分类分级标准',
breadcrumb: false,
cache: true
},
},
{
path: 'data-label',
name: 'dataLabel',
component: () => import('@/views/data_inventory/dataLabel.vue'),
meta: {
title: '标签管理',
breadcrumb: false,
cache: true
},
......@@ -165,6 +175,47 @@ const routes: RouteRecordRaw[] = [
}
}
},
{
path: 'classificationTemplate-edit',
name: 'classificationTemplateEdit',
component: () => import('@/views/data_inventory/classificationTemplateEdit.vue'),
meta: {
title: '编辑-',
sidebar: false,
breadcrumb: false,
cache: true,
reuse: true,
editPage: true,
activeMenu: '/data-inventory/classify-grade-manage/template-config'
},
beforeEnter: (to, from) => {
if (to.query.classClassifyGradName) {
to.meta.title = `编辑-${to.query.classClassifyGradName}`;
}
}
},
],
},
{
path: '/data-inventory/classify-grade-catalogue',
component: Layout,
meta: {
title: '分类分级目录',
icon: 'sidebar-videos',
},
children: [
{
path: '',
name: 'classifyGradeCatalogue',
component: () => import('@/views/data_inventory/classifyGradeCatalogue.vue'),
meta: {
title: '分类分级目录',
sidebar: false,
breadcrumb: false,
cache: true
},
},
],
}
]
......
......@@ -552,6 +552,18 @@ export const tagType = (row, type) => {
state = 'danger'//发布中
break;
}
}else if (type == 'status'){
switch (row[type]) {
case 'Y':
state = 'success';
break;
case 'S':
state = 'info';
break;
default:
state = 'info';
break;
}
}
return state;
}
......
......@@ -9,6 +9,8 @@ import { useValidator } from '@/hooks/useValidator';
import { TableColumnWidth } from '@/utils/enum';
import G6 from '@antv/g6';
import { IGroup, ModelConfig } from '@antv/g6';
import { getClassifyGradList, getClassifyTreeList, getGradeList, saveClassify, updateClassify, deleteClassify } from "@/api/modules/dataInventory";
const { required, orderNum } = useValidator();
const { proxy } = getCurrentInstance() as any;
......@@ -18,51 +20,67 @@ const fullPath = route.query.fullPath;
const userStore = useUserStore();
const fullscreenLoading = ref(false);
const formRef = ref();
const classStandardFormItems = ref([{
label: '分类名称',
type: 'input',
maxlength: 50,
placeholder: '请输入',
field: 'classStandardName',
default: '',
default: router.currentRoute.value.query.classStandardName,
clearable: true,
disabled: true,
required: true
}, {
label: '分级标准',
type: 'select',
type: 'input',
placeholder: '请选择',
field: 'gradeStandard',
default: 1,
options: [], //TODO
default: '',
required: true,
filterable: true,
clearable: true,
disabled: true,
visible: true,
}]);
const currTableInfo = ref({});
// 定义层级映射1->一级,2->二级,3->三级,4->四级
const levelMap = {
1: '一级',
2: '二级',
3: '三级',
4: '四级',
}
const currTableInfo = ref<any>({});
const tableInfo = ref({
id: "data-class-standard-table",
multiple: false,
fields: [
{ label: "序号", type: "index", width: 56, align: "center" },
{ label: "分类", field: "className", width: 160, type: 'expand' },
{ label: "层级", field: "levelName", width: 120 },
{ label: "状态", field: "state", type: "tag", width: 120, align: "center" },
{ label: "定义说明", field: "description", width: TableColumnWidth.DESCRIPTION },
{ label: "最低安全级别参考", field: "minLevel", width: 140 },
{ label: "分类", field: "classifyName", width: 160, type: 'expand' },
{
label: "层级", field: "level", width: 120, getName: (scope) => {
let level = scope.row.level;
return levelMap[level];
}
},
{
label: "状态", field: "status", type: "tag", width: 120, align: "center", getName: (scope) => {
let status = scope.row.status;
return status == 'Y' ? '有效' : '停用';
}
},
{ label: "定义说明", width: 360, field: "description", },
{
label: "最低安全级别参考", field: "name", width: 140,
},
{ label: "修改人", field: "updateUserName", width: 140 },
{ label: "更新时间", field: "updateTime", width: 180 },
],
data: [{
guid: '1',
children: [{
guid: '1-1'
}]
}],
data: [],
rowKey: 'guid',
showPage: false,
actionInfo: {
label: "操作",
......@@ -71,6 +89,8 @@ const tableInfo = ref({
btns: [
{
label: "编辑", value: "edit", click: (scope) => {
console.log(scope);
selectParentEdit(scope.row.guid);
currTableInfo.value = scope.row;
drawerInfo.value.visible = true;
drawerInfo.value.header.title = '编辑分类';
......@@ -81,15 +101,16 @@ const tableInfo = ref({
},
{
label: "删除", value: "delete", click: (scope) => {
console.log(scope);
proxy.$openMessageBox("此操作将永久删除该分类, 是否继续", () => {
// deleteBizTerm([scope.row.guid]).then((res: any) => {
// if (res.code == proxy.$passCode) {
// getTableData();
// proxy.$ElMessage.success('该分类删除成功');
// } else {
// proxy.$ElMessage.error(res.msg);
// }
// });
deleteClassify({ guid: scope.row.guid }).then((res: any) => {
if (res.code == proxy.$passCode) {
getTreeListData();
proxy.$ElMessage.success('该分类删除成功');
} else {
proxy.$ElMessage.error(res.msg);
}
});
})
}
},
......@@ -103,7 +124,7 @@ const classEditFormItems = ref([{
type: 'input',
maxlength: 50,
placeholder: '请输入',
field: 'classStandardName',
field: 'classifyName',
default: '',
clearable: true,
required: true
......@@ -127,7 +148,7 @@ const classEditFormItems = ref([{
checkStrictly: true,
lazy: false,
props: {
label: "className",
label: "classifyName",
value: "guid",
},
block: true,
......@@ -138,9 +159,13 @@ const classEditFormItems = ref([{
label: '最低安全级别参考',
type: 'select',
placeholder: '请选择',
field: 'lowerLevel',
field: 'gradeGuid',
default: 1,
options: [], //TODO
props: {
label: "name",
value: "guid",
},
required: false,
filterable: true,
clearable: true,
......@@ -148,12 +173,12 @@ const classEditFormItems = ref([{
}, {
label: '业务状态',
type: 'switch',
field: 'state',
field: 'status',
default: 'Y',
activeText: "有效",
inactiveText: "停用",
activeValue: 'Y',
inactiveValue: 'N'
inactiveValue: 'S'
}, {
label: '定义说明',
type: 'textarea',
......@@ -165,11 +190,41 @@ const classEditFormItems = ref([{
block: true
}]);
const validateUniqueClassifyName = (rule, value, callback) => {
console.log('validateUniqueClassifyName', value);
// 递归遍历treeListData,判断是否有重复的分类名称
// 检查空值情况
if (!value) {
callback(new Error('请填写分类名称'));
return;
}
// 递归检查函数
const isExist = (data, value) => {
return data.some(item => {
if (item.classifyName === value) {
return true;
}
return item.children && isExist(item.children, value);
});
};
// 检查是否存在
if (isExist(treeListData.value, value)) {
callback(new Error('分类名称已存在,请填写其他名称'));
} else {
callback(); // 校验通过
}
}
const classEditFormRules = ref({
classStandardName: [required('请填写分类名称')], //TODO,要自己判断分类名称是否重复。规则是什么呢。
orderNum: [orderNum()]
classifyName: [{ required: true, message: '请填写分类名称', trigger: 'blur' },
{ validator: validateUniqueClassifyName, trigger: 'blur' }],
orderNum: [orderNum()],
});
/** 新增分类的form */
const classEditFormInfo = ref({
type: "form",
......@@ -203,11 +258,129 @@ const drawerInfo = ref({
}
})
const drawerBtnClick = (btn, info) => {
const drawerBtnClick = async (btn, info) => {
if (btn.value == 'cancel') {
drawerInfo.value.visible = false;
} else {
if (drawerInfo.value.header.title == '添加分类') {
const params = {
...info,
classifyGradeGuid: router.currentRoute.value.query.guid,
}
const res: any = await saveClassify(params);
if (res.code == proxy.$passCode) {
proxy.$ElMessage.success('添加成功!');
drawerInfo.value.visible = false;
getTreeListData();
} else {
proxy.$ElMessage.error(res.msg);
}
} else {
// 编辑分类
const params = {
...info,
classifyGradeGuid: router.currentRoute.value.query.guid,
guid: currTableInfo.value.guid
}
const res: any = await updateClassify(params);
if (res.code == proxy.$passCode) {
proxy.$ElMessage.success('修改成功!');
drawerInfo.value.visible = false;
getTreeListData();
} else {
proxy.$ElMessage.error(res.msg);
}
}
}
}
const refGradePageParams = ref({
pageIndex: 1,
pageSize: -1,
type: "G"
});
const classifyGradListData = ref([]);
// 获取分级列表
const getClassifyGradListData = async () => {
const res: any = await getClassifyGradList(refGradePageParams.value);
if (res.code == proxy.$passCode) {
classifyGradListData.value = res.data.records || [];
const gradeName = findStandardName(router.currentRoute.value.query.refGradeGuid as any);
classStandardFormItems.value[1].default = gradeName;
} else {
proxy.$ElMessage.error(res.msg);
}
}
const findStandardName = (guid: string) => {
const item: any = classifyGradListData.value.find((item: any) => item.guid == guid);
return item ? item.name : '';
}
// 获取分类树形列表
const treeListParams = ref({
pageIndex: 1,
pageSize: -1,
classifyGradeGuid: router.currentRoute.value.query.guid,
});
const treeListData = ref([]);
const getTreeListData = async () => {
const res: any = await getClassifyTreeList(treeListParams.value);
if (res.code == proxy.$passCode) {
treeListData.value = res.data || [];
tableInfo.value.data = treeListData.value;
classEditFormItems.value[2].options = treeListData.value;
shapeTreeListData.value = treeListData.value;
} else {
proxy.$ElMessage.error(res.msg);
}
}
// 这里有个需求就是编辑时,不能选择自己和自己的子类children作为上级分类,每条数据加上disabled属性true or false
const selectParentEdit = (guid: string) => {
const cloneData = JSON.parse(JSON.stringify(treeListData.value)); // 深拷贝数据,避免直接修改原始数据
const disableNodeAndChildren = (node: any, disabled: boolean) => {
node.disabled = disabled;
if (node.children && node.children.length > 0) {
node.children.forEach((child: any) => disableNodeAndChildren(child, disabled));
}
};
const updateDisabledStatus = (nodes: any[], guid: string) => {
nodes.forEach((node) => {
if (node.guid === guid) {
// 禁用当前节点及其所有子节点
disableNodeAndChildren(node, true);
} else {
// 其他节点保持启用状态
node.disabled = false;
if (node.children && node.children.length > 0) {
updateDisabledStatus(node.children, guid);
}
}
});
};
updateDisabledStatus(cloneData, guid);
classEditFormItems.value[2].options = cloneData; // 更新选项
};
// 获取最低安全级别参考 // 获取分级列表
const gradeTablelist = ref<any>([]);
const getGradeListData = async () => {
console.log(shapeMain.value, shapeMain.value.clientWidth, shapeMain.value.clientHeight);
const params = {
pageIndex: 1,
pageSize: -1,
classifyGradeGuid: router.currentRoute.value.query.refGradeGuid,
}
const res: any = await getGradeList(params);
if (res.code == proxy.$passCode) {
gradeTablelist.value = res.data.records;
console.log('gradeTablelist', gradeTablelist.value);
for (let i = 0; i < gradeTablelist.value.length; i++) {
gradeTablelist.value[i].name = gradeTablelist.value[i].dataGrade + '级';
}
classEditFormItems.value[3].options = gradeTablelist.value;
} else {
proxy.$ElMessage.error(res.msg);
}
}
......@@ -215,7 +388,7 @@ const newCreateClass = () => {
drawerInfo.value.visible = true;
drawerInfo.value.header.title = '添加分类';
classEditFormItems.value.forEach(item => {
if (item.field == 'state') {
if (item.field == 'status') {
item.default = 'Y';
} else {
item.default = '';
......@@ -228,8 +401,7 @@ const importClass = () => {
}
const dataShowMethod = ref('shape');
const dataShowMethod = ref('table');
/** 切换是图形展示,还是表格展示。 */
const changeShowMethod = () => {
dataShowMethod.value = dataShowMethod.value == 'table' ? 'shape' : 'table';
......@@ -246,12 +418,10 @@ const cancel = () => {
});
}
const save = () => {
}
const graph = ref();
// const graph = ref();
const shapeMain = ref();
const shapeTreeListData = ref<any>();
var COLLAPSE_ICON = function COLLAPSE_ICON(x, y, r) {
return [['M', x, y], ['a', r, r, 0, 1, 0, r * 2, 0], ['a', r, r, 0, 1, 0, -r * 2, 0], ['M', x + 2, y], ['L', x + 2 * r - 2, y]];
......@@ -260,15 +430,19 @@ var EXPAND_ICON = function EXPAND_ICON(x, y, r) {
return [['M', x, y], ['a', r, r, 0, 1, 0, r * 2, 0], ['a', r, r, 0, 1, 0, -r * 2, 0], ['M', x + 2, y], ['L', x + 2 * r - 2, y], ['M', x + r, y - r + 2], ['L', x + r, y + r - 2]];
};
G6.registerNode('tree-node', {
drawShape: function drawShape(cfg: ModelConfig, group: IGroup) {
if (!cfg || typeof cfg.classifyName !== 'string') {
throw new Error('Invalid cfg or cfg.classifyName');
}
var rect = group.addShape('rect', {
attrs: {
fill: '#F6FDFD',
stroke: '#D1E7E8'
}
});
var content = cfg.name.replace(/(.{19})/g, '$1\n');
var content = cfg.classifyName.replace(/(.{18})/g, '$1\n');
var text = group.addShape('text', {
attrs: {
text: content,
......@@ -282,7 +456,7 @@ G6.registerNode('tree-node', {
}
});
var bbox = text.getBBox();
var hasChildren = cfg.children && cfg.children.length > 0;
var hasChildren = Array.isArray(cfg.children) && cfg.children.length > 0;
if (hasChildren) {
group.addShape('circle', {
attrs: {
......@@ -329,10 +503,13 @@ G6.registerNode('tree-node', {
return rect;
}
}, 'single-shape');
let graph = '' as any;
const showNodeDetails = ref(false); // 控制弹窗显示
const nodeDetails = ref<any>(); // 存储节点详情
const popupPosition = ref({ top: 0, left: 0 }); // 弹窗位置
onMounted(() => {
graph.value = new G6.TreeGraph({
const initGraph = () => {
graph = new G6.TreeGraph({
container: shapeMain.value,
width: shapeMain.value.clientWidth,
height: shapeMain.value.clientHeight,
......@@ -390,28 +567,26 @@ onMounted(() => {
}
}
});
graph.value.data({
guid: 1,
name: '工业数据',
children: [{
guid: '1-1',
name: '原材料',
children: [{
guid: '1-1-1',
name: '用户数据分类有带你长'
}]
}, {
guid: '1-2',
name: '装备制造'
}]
graph.data(shapeTreeListData.value[0]);
graph.on('node:mouseenter', (e) => {
const nodeItem = e.item; // 获取鼠标进入的节点元素对象
const nodeModel = nodeItem.getModel();
// 更新弹窗位置和显示节点详情
nodeDetails.value = nodeModel;
showNodeDetails.value = true;
const { clientX, clientY } = e;
// 设置弹窗位置为鼠标下方
popupPosition.value = {
top: clientY - 100, // 弹窗距离鼠标的Y位置
left: clientX - 80 // 弹窗距离鼠标的X位置
};
});
graph.value.on('node:mouseenter', (e) => {
const nodeItem = e.item // 获取鼠标进入的节点元素对象
console.log('鼠标移入', nodeItem._cfg)
})
graph.value.render();
graph.value.fitView();
graph.value.on('node:click', (evt: any) => {
graph.on('node:mouseleave', () => {
showNodeDetails.value = false;
});
graph.render();
graph.fitView();
graph.on('node:click', (evt: any) => {
evt.preventDefault();
evt.stopPropagation();
const { item, target } = evt;
......@@ -419,6 +594,100 @@ onMounted(() => {
if (!currentAnchor) return;
// 设置一个全局属性,指定点击的是哪个图形元素
});
}
// 监听展示模式的变化
watch(dataShowMethod, (newMode) => {
if (newMode === 'shape' && !graph) {
// 当切换到 'shape' 且图形未初始化时,初始化图形
nextTick(() => {
initGraph();
});
} else if (newMode === 'table' && graph) {
// 切换到表格时销毁图形实例
graph.destroy();
graph = '' as any;
}
});
onMounted(() => {
getClassifyGradListData();
getTreeListData();
getGradeListData();
// graph.value = new G6.TreeGraph({
// container: shapeMain.value,
// width: shapeMain.value.clientWidth,
// height: shapeMain.value.clientHeight,
// minZoom: 1.4,
// maxZoom: 1.4,
// modes: {
// default: [{
// type: 'collapse-expand',
// onChange: function onChange(item, collapsed, event) {
// var data = item.get('model');
// var icon = item.get('group').findByClassName('collapse-icon');
// if (collapsed) {
// icon.attr('symbol', EXPAND_ICON);
// } else {
// icon.attr('symbol', COLLAPSE_ICON);
// }
// data.collapsed = collapsed;
// return true;
// }
// }, 'drag-canvas', 'zoom-canvas']
// },
// defaultNode: {
// type: 'tree-node',
// anchorPoints: [[0, 0.5], [1, 0.5]]
// },
// defaultEdge: {
// type: 'polyline',
// style: {
// stroke: '#4FA1A4',
// endArrow: {
// fill: '#4FA1A4',
// stroke: '#4FA1A4',
// path: 'M -2,0 L 2,2 L 2,-2 Z',
// d: -2,
// }
// }
// },
// layout: {
// type: 'compactBox',
// direction: 'LR',
// getId: function getId(d) {
// return d.id;
// },
// getHeight: function getHeight() {
// return 16;
// },
// getWidth: function getWidth() {
// return 16;
// },
// getVGap: function getVGap() {
// return 20;
// },
// getHGap: function getHGap() {
// return 80;
// }
// }
// });
// graph.value.data(tempData.value);
// graph.value.on('node:mouseenter', (e) => {
// const nodeItem = e.item // 获取鼠标进入的节点元素对象
// console.log('鼠标移入', nodeItem._cfg)
// })
// graph.value.render();
// graph.value.fitView();
// graph.value.on('node:click', (evt: any) => {
// evt.preventDefault();
// evt.stopPropagation();
// const { item, target } = evt;
// const currentAnchor = target.get('name');
// if (!currentAnchor) return;
// // 设置一个全局属性,指定点击的是哪个图形元素
// });
})
</script>
......@@ -438,11 +707,28 @@ onMounted(() => {
</div>
<Table v-show="dataShowMethod == 'table'" :tableInfo="tableInfo" />
<div ref="shapeMain" class="shape-main" v-show="dataShowMethod != 'table'"></div>
<div v-if="showNodeDetails" class="node-details-popup"
:style="{ top: popupPosition.top + 'px', left: popupPosition.left + 'px' }">
<div class="pop-content">
<div class="top-area">
<span>{{ nodeDetails.classifyName }}</span>
<span class="tip">{{ nodeDetails.status === 'Y' ? '有效' : '无效' }}</span>
</div>
<div class="middle-top-area">
{{ nodeDetails.description }}
</div>
<div class="middle-bottom-area">
<span>最低安全级别</span> <span>{{ nodeDetails.name }}</span>
</div>
<div class="bottom-area">
<span>创建时间</span> <span>{{ nodeDetails.createTime }}</span>
</div>
</div>
</div>
</ContentWrap>
</div>
<div class="bottom_tool_wrap">
<el-button @click="cancel">取消</el-button>
<!-- <el-button type="primary" @click="save">保存</el-button> !-->
</div>
<Drawer :drawerInfo="drawerInfo" @drawerBtnClick="drawerBtnClick" />
</div>
......@@ -495,4 +781,63 @@ onMounted(() => {
.table_panel {
height: calc(100% - 58px) !important;
}
.node-details-popup {
position: absolute;
padding: 12px;
background-color: #fff;
border: 1px solid #ddd;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
z-index: 9999;
border-radius: 4px;
width: 264px;
height: 152px;
.pop-content {
display: flex;
flex-direction: column;
justify-content: space-between;
height: 100%;
.top-area {
display: flex;
justify-content: space-between;
font-size: 16px;
font-weight: bold;
color: #212121;
.tip {
background: #F2FFF5;
border: 1px solid rgba(220, 250, 228, 1);
color: #1BA854;
border-radius: 2px;
font-size: 12px;
text-align: center;
line-height: 18px;
font-weight: 400;
padding: 1px 8px;
}
}
.middle-top-area {
font-size: 14px;
color: #666;
}
.middle-bottom-area {
display: flex;
justify-content: space-between;
font-size: 14px;
color: #666;
}
.bottom-area {
display: flex;
justify-content: space-between;
font-size: 14px;
color: #666;
}
}
}
</style>
......
<route lang="yaml">
name: classificationTemplateEdit //新增分级分类模板
</route>
<script lang="ts" setup name="classificationTemplateEdit">
import { CirclePlus, Delete } from "@element-plus/icons-vue";
import TableTools from '@/components/Tools/table_tools.vue';
import { getCgTemplateClassifyTreeList } from '@/api/modules/dataInventory';
const currentPath = ref<string[]>(['全部', '个人信息', '个人自然信息', '个人基本概况信息']);
const tempData = [
{
guid: '1',
standardName: '个人信息',
status: 'published',
children: [
{
guid: '1-1',
standardName: '个人自然信息',
status: 'published',
children: [
{
guid: '1-1-1',
standardName: '个人基本概况信息',
status: 'published',
},
{
guid: '1-1-2',
standardName: '个人财产信息',
status: 'published',
},
{
guid: '1-1-3',
standardName: '个人健康信息',
status: 'published',
},
]
},
]
},
];
const { proxy } = getCurrentInstance() as any;
const cgTemplateClassifyTreeList = ref();
const getCgTemplateClassifyTreeListData = async () => {
const params = {
pageIndex: 1,
pageSize: -1,
templateGuid: '1',
}
const res: any = await getCgTemplateClassifyTreeList(params);
if (res.code == proxy.$passCode) {
cgTemplateClassifyTreeList.value = res.data;
} else {
proxy.$ElMessage.error(res.msg);
}
}
// 左侧tree-list
const treeInfo = ref({
id: "data-pickup-tree",
filter: true,
editTreeItem: true,
queryValue: "",
className: 'tree-list',
queryPlaceholder: "输入标准集名称搜索",
props: {
label: "standardName",
value: "guid",
},
nodeKey: 'guid',
expandedKey: ['0'],
currentNodeKey: '',
expandOnNodeClick: false,
data: tempData,
loading: false
});
// 弹窗配置
const formItems: any = ref([
{
label: '标准集名称',
type: 'input',
maxlength: 50,
placeholder: '请输入',
field: 'standardName',
clearable: true,
required: true
}, {
label: '标准集编号',
type: 'input',
placeholder: '',
field: 'standardCode',
required: true,
disabled: true
}, {
label: "上级标准集",
type: 'tree-select',
placeholder: '请选择',
field: 'parentGuid',
default: '',
checkStrictly: true,
lazy: false,
clearable: true,
options: [],
props: {
label: 'standardName',
value: 'guid',
children: 'children',
isLeaf: 'isLeaf'
},
expandKeys: [],
filterable: true,
required: false
}, {
label: '排序',
type: 'input',
placeholder: '请输入',
field: 'orderNum',
maxlength: 6,
required: true,
clearable: true,
}, {
label: '描述',
type: 'textarea',
placeholder: '请输入',
field: 'description',
clearable: true,
required: false,
block: true
},
])
const formRules: any = ref({
standardName: [
{
required: true,
message: '请输入标准集名称',
trigger: 'blur'
},
{
max: 50,
message: '长度在 50 个字符以内',
trigger: 'blur'
},
],
orderNum: [{
validator: (rule: any, value: any, callback: any) => {
if (value === 0) {
callback();
return;
}
if (!value) {
callback(new Error('请填写排序'));
return;
}
const r = /(^[0-9]([0-9]*)$|^[0-9]$)/; // 正整数(可以以0打头)
if (value && !r.test(value)) {
callback(new Error('请填写大于或等于零整数'));
return;
}
callback();
},
trigger: "blur",
}],
})
const formInfo = ref({
type: "form",
title: "",
formInfo: {
id: "add-set-standard-form",
items: formItems.value,
rules: formRules.value
},
})
const standardSetDialogInfo: any = ref({
visible: false,
size: 700,
direction: "column",
header: {
title: "新建",
},
type: '',
contents: [formInfo.value],
footer: {
visible: true,
btns: [
{ type: "default", label: "取消", value: "cancel" },
{ type: "primary", label: "确定", value: "submit" },
],
},
})
const addStandardSet = () => {
standardSetDialogInfo.value.visible = true;
console.log('addStandardSet');
}
const standardSetDialogBtnClick = (btn: any, info: any) => {
console.log('standardSetDialogBtnClick', btn, info);
if (btn.value === 'submit') {
standardSetDialogInfo.value.visible = false;
}
if (btn.value === 'cancel') {
standardSetDialogInfo.value.visible = false;
}
}
// 右侧上方搜索tab配置
const searchItemList = ref([
{
label: '',
field: 'parentGuid',
type: 'tree-select',
placeholder: '请选择目录',
default: '',
options: tempData,
showAllLevels: false,
checkStrictly: true,
lazy: false,
props: {
label: "standardName",
value: "guid",
},
block: true,
filterable: true,
clearable: true,
required: false
},
{
type: 'input',
label: '',
field: 'name',
default: '',
maxlength: 50,
placeholder: '分级',
clearable: true
}, {
type: 'input',
maxlength: 50,
label: '',
field: 'standardCode',
default: '',
placeholder: '规则',
clearable: true
}, {
type: 'select',
label: '',
field: 'approveState',
default: '',
placeholder: '状态',
options: [
{ label: '草稿中', value: 'N' },
{ label: '审批中', value: 'A' },
{ label: '已通过', value: 'Y' },
{ label: '已驳回', value: 'R' },
{ label: '已撤销', value: 'C' },
],
clearable: true
}
])
const searchParams = ref({})
const toSearch = (val: any, clear: boolean = false) => {
if (clear) {
searchItemList.value.map(item => item.default = '')
searchParams.value = {}
}
if (Object.keys(val).length) {
searchParams.value = { ...val }
}
// let params: any = { ...searchParams.value }
// params.pageIndex = page.value.curr;
// params.pageSize = page.value.limit;
// //params.standardSetGuid = standardSetGuid.value;
// params.standardSetLevelCode = standardSetLevelCode.value;
// return getTableData(params);
};
const treeSelectNodeChange = (node: any) => {
console.log('treeSelectNodeChange', node);
const { guid, standardName } = node
treeInfo.value.currentNodeKey = guid;
console.log('nodeClick', guid, standardName);
// 递归tempData找到所有祖先元素的standardName,存入currentPath中
const path = findPath(tempData, guid);
if (path) {
currentPath.value = path;
console.log('找到路径:', path);
} else {
console.error('未找到路径');
}
}
// btns-area
const checked1 = ref(false);
//下方表格配置
const tableDataList = ref([{
fieldStandardCode: '个人基本概况信息',
chName: '个人自然信息',
enName: '个人信息',
dataTypeValue: '规则',
approveState: 'Y',
}, {
fieldStandardCode: '个人财产信息',
chName: '个人自然信息',
enName: '个人信息',
dataTypeValue: '规则',
approveState: 'Y',
}, {
fieldStandardCode: '个人健康信息',
chName: '个人自然信息',
enName: '个人信息',
dataTypeValue: '规则',
approveState: 'Y',
}]);
const tableInfo = ref({
id: "role-manage-table",
multiple: true,
fixedSelection: true,
fields: [
{ label: "序号", type: "index", width: 56, align: "center" },
{ label: "标签", field: "fieldStandardCode", width: 140 },
{ label: "分类", field: "chName", width: 120 },
{ label: "分级", field: "enName", width: 120 },
{ label: "规则", field: "dataTypeValue", width: 100 },
{ label: "状态", field: "approveState", type: 'tag', width: 96, align: 'center' },
],
data: tableDataList.value,
page: {
type: "normal",
rows: 0,
// ...page.value,
},
actionInfo: {
label: "操作",
type: "btn",
width: 300,
fixed: 'right',
btns: [
{
label: "编辑", value: "edit", click: (scope) => {
console.log('编辑', scope);
drawerInfo.value.visible = true
}
},
{
label: "复制", value: "copy", click: (scope) => {
console.log('复制', scope);
}
},
{
label: "删除 ", value: "delete", click: (scope) => {
console.log('删除', scope);
}
},
]
},
loading: false
});
const nodeClick = (data: any) => {
const { guid, standardName } = data
console.log('nodeClick', guid, standardName);
searchItemList.value[0].default = standardName;
// 递归tempData找到所有祖先元素的standardName,存入currentPath中
const path = findPath(tempData, guid);
if (path) {
currentPath.value = path;
console.log('找到路径:', path);
} else {
console.error('未找到路径');
}
}
const findPath = (data: any[], targetGuid: string, path: string[] = []) => {
for (const item of data) {
path.push(item.standardName); // 添加当前节点名称
if (item.guid === targetGuid) {
return path; // 找到目标节点,返回路径
}
if (item.children && item.children.length > 0) {
const result = findPath(item.children, targetGuid, path);
if (result) return result; // 子节点找到目标节点,返回路径
}
path.pop(); // 回溯,移除当前节点
}
return null; // 未找到目标节点
};
const classEditFormItems = ref([{
label: '标签名称',
type: 'input',
maxlength: 50,
placeholder: '请输入',
field: 'classifyName',
default: '',
clearable: true,
required: true,
block: true
}, {
label: '分类',
type: 'input',
placeholder: '请输入',
field: 'orderNum',
maxlength: 6,
regexp: /\D/g,
required: true,
clearable: true,
}, {
label: '分级',
field: 'parentGuid',
type: 'tree-select',
placeholder: '请选择',
default: '',
options: tableInfo.value.data,
showAllLevels: false,
checkStrictly: true,
lazy: false,
props: {
label: "classifyName",
value: "guid",
},
filterable: true,
clearable: true,
required: false
},
{
label: ' ',
type: 'label',
field: 'description',
default: '规则配置',
block: true,
col: 'title-label'
},
{
label: '精确匹配',
type: 'textarea',
placeholder: '请输入',
field: 'description',
default: '',
clearable: true,
required: false,
},
{
label: '',
type: 'textarea',
placeholder: '请输入',
field: 'description',
default: '',
clearable: true,
required: false,
},
{
type: 'formAndSelect',
visible: false,
children: [
{
label: '模糊匹配',
type: 'select',
placeholder: '请选择',
field: 'gradeGuid',
default: '',
options: [], //TODO
props: {
label: 'name',
value: 'guid'
},
required: true,
filterable: true,
clearable: true,
visible: true,
showDeleteButton: false
},
{
label: '',
type: 'input',
maxlength: 50,
placeholder: '请输入',
field: 'classifyName',
default: '',
clearable: true,
required: true,
showDeleteButton: false
},
],
extraIcon: {
icon: Delete,
click: () => {
console.log('click');
}
}
},
]);
const classEditFormRules = ref({
classifyName: [{ required: true, message: '请填写分类名称', trigger: 'blur' }],
});
/** 新增分类的form */
const classEditFormInfo = ref({
type: "form",
title: "",
col: "span",
formInfo: {
id: "add-class-form",
readonly: false,
items: classEditFormItems.value,
rules: classEditFormRules.value,
},
});
/** 新增编辑分类。 */
const drawerInfo = ref({
visible: false,
direction: 'rtl',
size: 600,
header: {
title: '添加分类',
},
type: '',
container: {
contents: [classEditFormInfo.value],
},
footer: {
btns: [
{ type: 'default', label: '取消', value: 'cancel' },
{ type: 'primary', label: '确定', value: 'save', loading: false },
]
}
})
const drawerBtnClick = async (btn, info) => {
if (btn.value == 'cancel') {
drawerInfo.value.visible = false;
} else {
// if (drawerInfo.value.header.title == '添加分类') {
// const params = {
// ...info,
// classifyGradeGuid: router.currentRoute.value.query.guid,
// }
// const res: any = await saveClassify(params);
// if (res.code == proxy.$passCode) {
// proxy.$ElMessage.success('添加成功!');
// drawerInfo.value.visible = false;
// getTreeListData();
// } else {
// proxy.$ElMessage.error(res.msg);
// }
// } else {
// // 编辑分类
// const params = {
// ...info,
// classifyGradeGuid: router.currentRoute.value.query.guid,
// guid: currTableInfo.value.guid
// }
// const res: any = await updateClassify(params);
// if (res.code == proxy.$passCode) {
// proxy.$ElMessage.success('修改成功!');
// drawerInfo.value.visible = false;
// getTreeListData();
// } else {
// proxy.$ElMessage.error(res.msg);
// }
// }
console.log('aaa')
}
}
const handleTreeItemMenuClick = (data: any, type) => {
console.log('handleTreeItemMenuClick', data, type);
}
const getItemStyle = (status: string) => {
const styles: { [key: string]: any } = {
published: {
color: '#1BA854',
background: '#F2FFF5',
border: '1px solid rgba(109, 209, 142, 1)',
},
running: {
color: '#FF991C',
background: '#FFFBF2',
border: '1px solid rgba(255, 203, 120, 1)',
},
pending: {
border: '1px solid rgba(217, 217, 217, 1)',
color: '#404040',
background: '#F5F5F5',
},
};
return styles[status] || {}; // 如果状态没有对应的样式,则返回空对象
}
const temp = ref('');
// 模拟表单行数据
const formRows = ref([
{ selectValue: '', inputValue: '' }, // 初始行
]);
// 当前悬停的行索引
const hoveredRowIndex = ref<number | null>(null);
// 鼠标移入事件
const handleMouseEnter = (index: number) => {
hoveredRowIndex.value = index;
};
// 鼠标移出事件
const handleMouseLeave = () => {
hoveredRowIndex.value = null;
};
// 新增行
const addRow = () => {
formRows.value.push({ selectValue: '', inputValue: '' });
};
// 删除行
const deleteRow = (index: number) => {
formRows.value.splice(index, 1);
};
</script>
<template>
<div class="classification-template-content">
<div class="top-area">
<div class="top-title">
<div class="left">
<div class="top-des">医疗数据分类分级模板</div>
<div class="top-status" :style="getItemStyle('published')">待确认</div>
</div>
<div class="right">
<div class="right-one">模型确认人:---</div>
<div class="right-two">模型确认时间:---</div>
</div>
</div>
<div class="middle-area">
<span>医疗行业分类</span>
<span>五级</span>
<span>v5</span>
</div>
<div class="bottom-area">
适用于各级医疗机构、卫生健康管理部门、公共卫生服务机构、相关专项业务服务机构、相关信息技术服务机构等开展医疗健康数据分类分级。适用于各级医疗机构、卫生健康管理部门、公共卫生服务机构、相关专项业务服务机构、相关信息技术服务机构等开展医疗健康数据分类分级。适用于各级医疗机构、卫生健康。
</div>
</div>
<div class="container_wrap full flex">
<div class="aside_wrap">
<div class="aside_title">分类分级目录</div>
<el-icon class="icon-add" color="#4fa1a4" @click="addStandardSet()">
<CirclePlus />
</el-icon>
<Tree :treeInfo="treeInfo" @nodeClick="nodeClick" @itemMenuClick="handleTreeItemMenuClick" />
</div>
<div class="main_wrap">
<div class="path">
<span v-for="(item, index) in currentPath" :key="index" class="path-item">
<span :class="{ 'bold': index === currentPath.length - 1 }">{{ item }}</span>
<span v-if="index < currentPath.length - 1">/</span>
</span>
</div>
<TableTools :searchItems="searchItemList" :init="false" :searchId="'files-standard-search'" @search="toSearch"
@treeSelectNodeChange="treeSelectNodeChange" />
<div class="btns-area">
<div class="left-btns">
<el-button type="primary" @click="addStandardSet">新增标准</el-button>
<el-button>批量移动</el-button>
<el-button>批量删除</el-button>
</div>
<div class="right-btns">
<el-checkbox v-model="checked1" label="仅看未分类分级" size="large" />
</div>
</div>
<div class="table_panel_wrap">
<Table :tableInfo="tableInfo" />
</div>
</div>
<Dialog :dialogInfo="standardSetDialogInfo" @btnClick="standardSetDialogBtnClick" />
<Drawer :drawerInfo="drawerInfo" @drawerBtnClick="drawerBtnClick" class="v-drawer">
<!-- 传递到 Form 组件中的默认插槽 -->
<template v-slot:default>
<div class="title-label">模糊匹配</div>
<!-- 渲染行 -->
<div v-for="(row, index) in formRows" :key="index" class="match-content-wrapper">
<div class="match-content" @mouseenter="handleMouseEnter(index)" @mouseleave="handleMouseLeave()">
<el-select v-model="row.selectValue" class="v-select" placeholder="请选择" />
<el-input v-model="row.inputValue" class="v-input" laceholder="请输入匹配值" />
<!-- 删除按钮 -->
<el-button v-if="hoveredRowIndex === index" class="extra-icon" :icon="Delete" @click="deleteRow(index)"
circle style="margin-left: 8px;" />
</div>
</div>
<!-- 新增按钮 -->
<div class="add-Icon" @click="addRow">
<el-icon class="icon-add" color="#4fa1a4" :size="30">
<CirclePlus />
</el-icon>
<span class="word-des">模糊匹配规则</span>
</div>
</template>
</Drawer>
</div>
</div>
</template>
<style lang="scss" scoped>
.classification-template-content {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
.top-area {
width: 100%;
height: 134px;
padding: 16px;
border-bottom: 1px solid #D9D9D9;
.top-title {
display: flex;
justify-content: space-between;
.left {
display: flex;
align-items: center;
.top-des {
font-size: 16px;
color: #212121;
line-height: 24px;
font-weight: 600;
}
.top-status {
margin-left: 16px;
border-radius: 2px;
font-size: 12px;
text-align: center;
line-height: 18px;
font-weight: 400;
padding: 1px 8px;
}
}
.right {
display: flex;
align-items: center;
.right-one,
.right-two {
display: inline-block;
font-size: 14px;
color: #666666;
line-height: 21px;
}
.right-one {
margin-right: 24px;
}
}
}
.middle-area {
margin-top: 9px;
display: flex;
/* 左对齐 */
justify-content: flex-start;
span {
background: #F5F5F5;
border: 1px solid rgba(217, 217, 217, 1);
border-radius: 2px;
display: inline-block;
padding: 1px 8px;
margin-right: 8px;
font-size: 12px;
color: #404040;
text-align: center;
line-height: 18px;
font-weight: 400;
}
}
.bottom-area {
margin-top: 9px;
font-size: 14px;
color: #666666;
font-weight: 400;
}
}
.container_wrap {
padding: 0;
display: flex;
justify-content: space-between;
.aside_wrap {
width: 199px;
border-right: 1px solid #d9d9d9;
box-shadow: none;
.aside_title {
width: calc(100% - 32px);
display: inline-block;
}
.icon-add.el-icon {
width: 24px;
height: 24px;
vertical-align: middle;
cursor: pointer;
svg {
width: 24px;
height: 24px;
}
}
.tree_panel {
height: 100%;
padding-top: 0;
:deep(.el-tree) {
margin: 0;
height: calc(100% - 68px);
overflow: hidden auto;
}
}
}
.main_wrap {
padding: 11px 16px 0 16px;
.path-item {
font-weight: normal;
}
.bold {
color: #212121;
font-weight: 400;
}
.btns-area {
display: flex;
justify-content: space-between;
.left-btns {
display: flex;
align-items: center;
}
.right-btns {
display: flex;
align-items: center;
.el-checkbox {
margin-right: 8px;
}
}
}
.table_panel_wrap {
width: 100%;
height: calc(100% - 113px);
min-height: 210px;
overflow: visible;
}
}
}
// :deep(.v-drawer) {
// .el-drawer__body {
// .title-label {
// font-size: 16px;
// color: #212121;
// line-height: 24px;
// font-weight: 600;
// }
// }
// }
.match-content-wrapper {
width: 100%;
.match-content {
display: flex;
align-items: center;
margin-top: 8px;
.v-select {
margin-right: 8px;
width: 50%;
}
.v-input {
width: calc(50% - 50px);
}
.extra-icon {
transition: opacity 1s;
}
}
}
:deep(.add-Icon) {
display: flex;
align-items: center;
margin-top: 13px;
.el-icon svg {
height: 19px;
width: 19px;
}
.word-des {
color: #4fa1a4
}
}
}
</style>
......@@ -237,7 +237,7 @@ const newCreateGradeFormItems = ref([{
{
label: '分级描述',
type: 'textarea',
maxlength: 50,
maxlength: 500,
placeholder: '分类分级的描述说明',
field: 'gradeDesc',
default: '',
......
<route lang="yaml">
name: classifyGradeCatalogue //新增分级分类模板
</route>
<script lang="ts" setup name="classifyGradeCatalogue">
import { CirclePlus, Delete, Warning } from "@element-plus/icons-vue";
import TableTools from '@/components/Tools/table_tools.vue';
import { getCgDirTreeList, getCgDirFieldPageList } from '@/api/modules/dataInventory';
const currentPath = ref<string[]>(['全部', '个人信息', '个人自然信息', '个人基本概况信息']);
const tempData = [
{
guid: '1',
standardName: '个人信息',
status: 'published',
children: [
{
guid: '1-1',
standardName: '个人自然信息',
status: 'published',
children: [
{
guid: '1-1-1',
standardName: '个人基本概况信息',
status: 'published',
},
{
guid: '1-1-2',
standardName: '个人财产信息',
status: 'published',
},
{
guid: '1-1-3',
standardName: '个人健康信息',
status: 'published',
},
]
},
]
},
];
const { proxy } = getCurrentInstance() as any;
// 分级分类树形列表
const CgDirTreeList = ref();
const getCgDirTreeData = async () => {
const params = {
classifyName: '',
}
const res: any = await getCgDirTreeList(params);
if (res.code == proxy.$passCode) {
CgDirTreeList.value = res.data;
} else {
proxy.$ElMessage.error(res.msg);
}
}
// 分页列表
const CgDirFieldPageList = ref();
const getCgDirFieldPage = async (params = {}) => {
// 在这里你可以根据需要扩展或修改 params
const defaultParams = {
pageIndex: 1,
pageSize: 10,
dirGuid: '',
label: '',
fieldName: '',
classifyName: '',
gradeDetailName: '',
tableName: '',
database: '',
dirGuids: [],
};
const finalParams = { ...defaultParams, ...params };
const res: any = await getCgDirFieldPageList(finalParams);
if (res.code == proxy.$passCode) {
CgDirFieldPageList.value = res.data;
} else {
proxy.$ElMessage.error(res.msg);
}
};
onMounted(() => {
getCgDirTreeData();
getCgDirFieldPage();
})
// 左侧tree-list
const treeInfo = ref({
id: "data-pickup-tree",
filter: true,
editTreeItem: true,
queryValue: "",
className: 'tree-list',
queryPlaceholder: "输入标准集名称搜索",
props: {
label: "standardName",
value: "guid",
},
nodeKey: 'guid',
expandedKey: ['0'],
currentNodeKey: '',
expandOnNodeClick: false,
data: tempData,
loading: false
});
// 弹窗配置
const formItems: any = ref([
{
label: '标准集名称',
type: 'input',
maxlength: 50,
placeholder: '请输入',
field: 'standardName',
clearable: true,
required: true
}, {
label: '标准集编号',
type: 'input',
placeholder: '',
field: 'standardCode',
required: true,
disabled: true
}, {
label: "上级标准集",
type: 'tree-select',
placeholder: '请选择',
field: 'parentGuid',
default: '',
checkStrictly: true,
lazy: false,
clearable: true,
options: [],
props: {
label: 'standardName',
value: 'guid',
children: 'children',
isLeaf: 'isLeaf'
},
expandKeys: [],
filterable: true,
required: false
}, {
label: '排序',
type: 'input',
placeholder: '请输入',
field: 'orderNum',
maxlength: 6,
required: true,
clearable: true,
}, {
label: '描述',
type: 'textarea',
placeholder: '请输入',
field: 'description',
clearable: true,
required: false,
block: true
},
])
const formRules: any = ref({
standardName: [
{
required: true,
message: '请输入标准集名称',
trigger: 'blur'
},
{
max: 50,
message: '长度在 50 个字符以内',
trigger: 'blur'
},
],
orderNum: [{
validator: (rule: any, value: any, callback: any) => {
if (value === 0) {
callback();
return;
}
if (!value) {
callback(new Error('请填写排序'));
return;
}
const r = /(^[0-9]([0-9]*)$|^[0-9]$)/; // 正整数(可以以0打头)
if (value && !r.test(value)) {
callback(new Error('请填写大于或等于零整数'));
return;
}
callback();
},
trigger: "blur",
}],
})
const formInfo = ref({
type: "form",
title: "",
formInfo: {
id: "add-set-standard-form",
items: formItems.value,
rules: formRules.value
},
})
const standardSetDialogInfo: any = ref({
visible: false,
size: 700,
direction: "column",
header: {
title: "新建",
},
type: '',
contents: [formInfo.value],
footer: {
visible: true,
btns: [
{ type: "default", label: "取消", value: "cancel" },
{ type: "primary", label: "确定", value: "submit" },
],
},
})
const addStandardSet = () => {
standardSetDialogInfo.value.visible = true;
console.log('addStandardSet');
}
const standardSetDialogBtnClick = (btn: any, info: any) => {
console.log('standardSetDialogBtnClick', btn, info);
if (btn.value === 'submit') {
standardSetDialogInfo.value.visible = false;
}
if (btn.value === 'cancel') {
standardSetDialogInfo.value.visible = false;
}
}
// 右侧上方搜索tab配置
const searchItemList = ref([
{
label: '标签',
type: 'select',
maxlength: 19,
placeholder: '选择标签',
field: 'labelName',
default: '',
options: [],
props: {
label: 'name',
value: 'guid',
},
clearable: true,
},
{
label: '字段名',
type: 'select',
maxlength: 19,
placeholder: '选择字段名',
field: 'fieldName',
default: '',
options: [],
props: {
label: 'name',
value: 'guid',
},
clearable: true,
},
{
label: '分类',
type: 'select',
maxlength: 19,
placeholder: '选择分类',
field: 'classifyName',
default: '',
options: [],
props: {
label: 'name',
value: 'guid',
},
clearable: true,
}, {
label: '分级',
type: 'select',
maxlength: 19,
placeholder: '选择分级',
field: 'levelName',
default: '',
options: [],
props: {
label: 'name',
value: 'guid',
},
clearable: true,
}, {
label: '数据库名',
type: 'select',
maxlength: 19,
placeholder: '选择数据库名',
field: 'databaseName',
default: '',
options: [],
props: {
label: 'name',
value: 'guid',
},
clearable: true,
},
{
label: '表名',
type: 'select',
maxlength: 19,
placeholder: '选择表名',
field: 'tableName',
default: '',
options: [],
props: {
label: 'name',
value: 'guid',
},
clearable: true,
}
])
const searchParams = ref({})
const toSearch = (val: any, clear: boolean = false) => {
if (clear) {
searchItemList.value.map(item => item.default = '')
searchParams.value = {}
}
if (Object.keys(val).length) {
searchParams.value = { ...val }
}
// let params: any = { ...searchParams.value }
// params.pageIndex = page.value.curr;
// params.pageSize = page.value.limit;
// //params.standardSetGuid = standardSetGuid.value;
// params.standardSetLevelCode = standardSetLevelCode.value;
// return getTableData(params);
};
const treeSelectNodeChange = (node: any) => {
console.log('treeSelectNodeChange', node);
const { guid, standardName } = node
treeInfo.value.currentNodeKey = guid;
console.log('nodeClick', guid, standardName);
// 递归tempData找到所有祖先元素的standardName,存入currentPath中
const path = findPath(tempData, guid);
if (path) {
currentPath.value = path;
console.log('找到路径:', path);
} else {
console.error('未找到路径');
}
}
// btns-area
const checked1 = ref(false);
//下方表格配置
const tableDataList = ref([{
fieldStandardCode: '个人基本概况信息',
chName: '个人自然信息',
enName: '个人信息',
dataTypeValue: '规则',
approveState: 'Y',
}, {
fieldStandardCode: '个人财产信息',
chName: '个人自然信息',
enName: '个人信息',
dataTypeValue: '规则',
approveState: 'Y',
}, {
fieldStandardCode: '个人健康信息',
chName: '个人自然信息',
enName: '个人信息',
dataTypeValue: '规则',
approveState: 'Y',
}]);
const tableInfo = ref({
id: "role-manage-table",
multiple: true,
fixedSelection: true,
fields: [
{ label: "序号", type: "index", width: 56, align: "center" },
{ label: "字段名", field: "fieldName", width: 140 },
{ label: "分类", field: "classifyName", width: 180 },
{ label: "分级", field: "enName", width: 120 },
{ label: "标签", field: "labelName", width: 140 },
{ label: "规则", field: "rulesName", width: 180 },
{ label: "表名", field: "tableName", width: 120, align: 'center' },
{ label: "表中文名", field: "tableCHName", width: 120, align: 'center' },
{ label: "数据库名", field: "databaseName", width: 120, align: 'center' },
{ label: "数据类型", field: "databaseCHName", width: 120, align: 'center' },
],
data: tableDataList.value,
page: {
type: "normal",
rows: 0,
// ...page.value,
},
actionInfo: {
label: "操作",
type: "btn",
width: 300,
fixed: 'right',
btns: [
{
label: "编辑", value: "edit", click: (scope) => {
console.log('编辑', scope);
drawerInfo.value.visible = true
}
},
{
label: "复制", value: "copy", click: (scope) => {
console.log('复制', scope);
}
},
{
label: "删除 ", value: "delete", click: (scope) => {
console.log('删除', scope);
}
},
]
},
loading: false
});
const nodeClick = (data: any) => {
const { guid, standardName } = data
console.log('nodeClick', guid, standardName);
searchItemList.value[0].default = standardName;
// 递归tempData找到所有祖先元素的standardName,存入currentPath中
const path = findPath(tempData, guid);
if (path) {
currentPath.value = path;
console.log('找到路径:', path);
} else {
console.error('未找到路径');
}
}
const findPath = (data: any[], targetGuid: string, path: string[] = []) => {
for (const item of data) {
path.push(item.standardName); // 添加当前节点名称
if (item.guid === targetGuid) {
return path; // 找到目标节点,返回路径
}
if (item.children && item.children.length > 0) {
const result = findPath(item.children, targetGuid, path);
if (result) return result; // 子节点找到目标节点,返回路径
}
path.pop(); // 回溯,移除当前节点
}
return null; // 未找到目标节点
};
const classEditFormItems = ref([{
label: '已选字段',
type: 'input',
maxlength: 50,
placeholder: '请输入',
field: 'classifyName',
default: '',
clearable: true,
required: true,
block: true
}, {
label: '长度',
type: 'input',
placeholder: '请选择',
field: 'orderNum',
maxlength: 6,
regexp: /\D/g,
required: true,
clearable: true,
},
{
label: '',
type: 'input',
placeholder: '请输入',
field: 'orderNum',
maxlength: 6,
regexp: /\D/g,
required: true,
clearable: true,
col: 'numberClass',
},
{
label: '精度',
type: 'input',
placeholder: '请选择',
field: 'orderNum',
maxlength: 6,
regexp: /\D/g,
required: true,
clearable: true,
},
{
label: '',
type: 'input',
placeholder: '请输入',
field: 'orderNum',
maxlength: 6,
regexp: /\D/g,
required: true,
clearable: true,
col: 'numberClass',
}, {
label: '关联字典',
field: 'parentGuid',
type: 'select',
placeholder: '请选择',
default: '',
options: [],
props: {
label: "classifyName",
value: "guid",
},
filterable: true,
clearable: true,
required: false
},
{
label: '字段取值范围',
type: 'input-group',
placeholder: '请输入',
field: 'numberAround',
default: '',
children: [
{
type: 'input',
placeholder: '请输入',
field: 'numberStart',
default: '',
clearable: true,
required: true,
},
{
type: 'input',
placeholder: '请输入',
field: 'numberEnd',
default: '',
clearable: true,
required: true,
},
],
col: 'col2',
clearable: true,
},
{
label: '数据是否唯一',
type: "radio-group",
field: "radioField",
disabled: false,
options: [
{ label: "选项一", value: "option1", disabled: false },
{ label: "选项二", value: "option2", disabled: false },
],
},
{
label: '是否必填',
type: "radio-group",
field: "radioField",
disabled: false,
options: [
{ label: "选项一", value: "option1", disabled: false },
{ label: "选项二", value: "option2", disabled: false },
],
}
]);
const classEditFormRules = ref({
classifyName: [{ required: true, message: '请填写分类名称', trigger: 'blur' }],
});
/** 新增分类的form */
const classEditFormInfo = ref({
type: "form",
title: "",
col: "span",
formInfo: {
id: "add-class-form",
readonly: false,
items: classEditFormItems.value,
rules: classEditFormRules.value,
},
});
/** 新增编辑分类。 */
const drawerInfo = ref({
visible: false,
direction: 'rtl',
size: 600,
header: {
title: '批量配置业务规则',
},
type: '',
container: {
contents: [classEditFormInfo.value],
},
footer: {
btns: [
{ type: 'default', label: '取消', value: 'cancel' },
{ type: 'primary', label: '确定', value: 'save', loading: false },
]
}
})
const drawerBtnClick = async (btn, info) => {
if (btn.value == 'cancel') {
drawerInfo.value.visible = false;
} else {
// if (drawerInfo.value.header.title == '添加分类') {
// const params = {
// ...info,
// classifyGradeGuid: router.currentRoute.value.query.guid,
// }
// const res: any = await saveClassify(params);
// if (res.code == proxy.$passCode) {
// proxy.$ElMessage.success('添加成功!');
// drawerInfo.value.visible = false;
// getTreeListData();
// } else {
// proxy.$ElMessage.error(res.msg);
// }
// } else {
// // 编辑分类
// const params = {
// ...info,
// classifyGradeGuid: router.currentRoute.value.query.guid,
// guid: currTableInfo.value.guid
// }
// const res: any = await updateClassify(params);
// if (res.code == proxy.$passCode) {
// proxy.$ElMessage.success('修改成功!');
// drawerInfo.value.visible = false;
// getTreeListData();
// } else {
// proxy.$ElMessage.error(res.msg);
// }
// }
console.log('aaa')
}
}
const handleTreeItemMenuClick = (data: any, type) => {
console.log('handleTreeItemMenuClick', data, type);
}
const getItemStyle = (status: string) => {
const styles: { [key: string]: any } = {
published: {
color: '#1BA854',
background: '#F2FFF5',
border: '1px solid rgba(109, 209, 142, 1)',
},
running: {
color: '#FF991C',
background: '#FFFBF2',
border: '1px solid rgba(255, 203, 120, 1)',
},
pending: {
border: '1px solid rgba(217, 217, 217, 1)',
color: '#404040',
background: '#F5F5F5',
},
};
return styles[status] || {}; // 如果状态没有对应的样式,则返回空对象
}
const activeName = ref('first');
const handleClick = (tab: any) => {
console.log(tab.props.name);
activeName.value = tab.props.name;
}
const handleSubjectTableCommand = (command: string) => {
console.log('handleSubjectTableCommand', command);
}
// 文字提示区域
const isShowClassifyTip = ref(true);
const isShowDatabaseTip = ref(true);
const addIsShowClassifyTip = () => {
isShowClassifyTip.value = false;
}
const addIsShowDatabaseTip = () => {
isShowDatabaseTip.value = false;
}
</script>
<template>
<div class="classification-template-content">
<div class="v-table-tools">
<TableTools :searchItems="searchItemList" :init="false" :searchId="'files-standard-search'" @search="toSearch"
@treeSelectNodeChange="treeSelectNodeChange" />
</div>
<div class="container_wrap full flex">
<div class="aside_wrap">
<el-tabs v-model="activeName" class="v-tabs" @tab-click="handleClick">
<el-tab-pane label="分类分级目录" name="first">
<Tree :treeInfo="treeInfo" @nodeClick="nodeClick" @itemMenuClick="handleTreeItemMenuClick" />
</el-tab-pane>
<el-tab-pane label="数据库目录" name="second">Config</el-tab-pane>
</el-tabs>
</div>
<div class="main_wrap" v-if="activeName === 'first'">
<div class="top-tool-tip" v-if="isShowClassifyTip">
<div class="des">
<div class="v-icon">
<el-icon>
<Warning />
</el-icon>
</div>
目录内容为最新的已确认的分类分级任务。
</div>
<el-button type="success" link @click="addIsShowClassifyTip">
不再提醒
</el-button>
</div>
<div class="path">
<span v-for="(item, index) in currentPath" :key="index" class="path-item">
<span :class="{ 'bold': index === currentPath.length - 1 }">{{ item }}</span>
<span v-if="index < currentPath.length - 1">/</span>
</span>
</div>
<div class="btns-area">
<div class="left-btns">
<el-button type="primary" @click="addStandardSet">查看已生产报告</el-button>
<el-button>导出</el-button>
<el-button>批量配置业务规则</el-button>
</div>
</div>
<div class="table_panel_wrap">
<Table :tableInfo="tableInfo" />
</div>
</div>
<div class="main_wrap" v-if="activeName === 'second'">
<div class="top-tool-tip" v-if="isShowDatabaseTip">
<div class="des">
<div class="v-icon">
<el-icon>
<Warning />
</el-icon>
</div>
数据库目录可新建表,可设置业务规则,自动生成质检规则。
</div>
<el-button type="success" link @click="addIsShowDatabaseTip">
不再提醒
</el-button>
</div>
<div>全部</div>
<div class="btns-area">
<div class="left-btns">
<div class="dropdown_btn">
<el-dropdown popper-class="table-create-menu" @command="handleSubjectTableCommand"
placement="bottom-start" trigger="click">
<span class="el-dropdown-link">
<el-button type="primary">新建主题表</el-button>
</span>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item command="manualCreate">
<el-icon style="width: 24px;height: 24px;">
<svg-icon style="width: 24px;height: 24px;" name="table-create-manual" />
</el-icon>
<div class="item-content">
<span class="item-content-title">根据文件新建</span>
<span class="item-content-desc">根据文件新建数据库表</span>
</div>
</el-dropdown-item>
<el-dropdown-item command="existingCreate">
<el-icon style="width: 24px;height: 24px;">
<svg-icon style="width: 24px;height: 24px;" name="table-create-exist" />
</el-icon>
<div class="item-content">
<span class="item-content-title">已有表新建</span>
<span class="item-content-desc">根据已有表或视图新建表</span>
</div>
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</div>
<el-button>导出</el-button>
<el-button>查看已生产报告</el-button>
<el-button>查看质量规则</el-button>
</div>
<div class="right-btns">
<el-checkbox v-model="checked1" label="仅看规划数据资产表" size="large" />
</div>
</div>
<div class="table_panel_wrap_database">
<Table :tableInfo="tableInfo" />
</div>
</div>
<Dialog :dialogInfo="standardSetDialogInfo" @btnClick="standardSetDialogBtnClick" />
<Drawer :drawerInfo="drawerInfo" @drawerBtnClick="drawerBtnClick" class="v-drawer" />
</div>
</div>
</template>
<style lang="scss" scoped>
.classification-template-content {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
.v-table-tools {
padding: 8px 12px;
}
.container_wrap {
padding: 0;
display: flex;
justify-content: space-between;
.aside_wrap {
width: 199px;
border-right: 1px solid #d9d9d9;
box-shadow: none;
:deep(.v-tabs) {
.el-tabs__item {
padding: 0 10px;
}
}
.tree_panel {
height: 100%;
padding-top: 0;
:deep(.el-tree) {
margin: 0;
height: calc(100% - 68px);
overflow: hidden auto;
}
}
}
.main_wrap {
padding: 11px 16px 0 16px;
.top-tool-tip {
display: flex;
justify-content: space-between;
height: 40px;
align-items: center;
background: #EFFBFC;
border: 1px solid rgba(195, 219, 219, 1);
border-radius: 2px;
padding: 0 16px;
margin-bottom: 12px;
.des {
display: flex;
align-items: center;
font-size: 14px;
color: #212121;
line-height: 21px;
font-weight: 400;
.v-icon {
display: flex;
align-items: center;
margin-right: 8px;
color: #4FA1A4;
}
}
}
.path-item {
font-weight: normal;
}
.bold {
color: #212121;
font-weight: 400;
}
.btns-area {
display: flex;
justify-content: space-between;
height: 40px;
.left-btns {
display: flex;
align-items: center;
.dropdown_btn {
margin-right: 8px;
}
}
.right-btns {
display: flex;
align-items: center;
.el-checkbox {
margin-right: 8px;
}
}
}
.table_panel_wrap {
width: 100%;
height: calc(100% - 113px);
min-height: 210px;
overflow: visible;
}
.table_panel_wrap_database {
width: 100%;
height: calc(100% - 113px);
min-height: 210px;
overflow: visible;
}
}
}
.match-content-wrapper {
width: 100%;
.match-content {
display: flex;
align-items: center;
margin-top: 8px;
.v-select {
margin-right: 8px;
width: 50%;
}
.v-input {
width: calc(50% - 50px);
}
.extra-icon {
transition: opacity 1s;
}
}
}
:deep(.v-drawer) {
.numberClass {
margin-top: 12px;
}
}
}
</style>
<route lang="yaml">
name: dataLabel //标签管理
</route>
<script lang="ts" setup name="dataLabel">
import TableTools from '@/components/Tools/table_tools.vue';
import { getGradeList } from "@/api/modules/dataInventory";
import { getLabelList, getClassifyGradeTreeList, saveLabel, getLabelPageList, deleteLabel, updateLabel } from "@/api/modules/dataLabel";
import { CirclePlus, Delete } from "@element-plus/icons-vue";
import { el, tr } from 'element-plus/es/locale';
const { proxy } = getCurrentInstance() as any;
const dialogLabelFormRef = ref();
// 原始数据存储
const classGradeTreeData: any = ref([]);
const expandedKey: any = ref([])
// 分类guid
const classifyGuid = ref('')
// 分类明细guid
const classifyDetailGuid = ref('')
const getClassifyGradeTree = async () => {
treeInfo.value.loading = true;
const res: any = await getClassifyGradeTreeList();
if (res.code == proxy.$passCode) {
const transformedData = transformData(res.data);
classGradeTreeData.value = transformedData || [];
treeInfo.value.data = classGradeTreeData.value;
// 默认展开第一级
expandedKey.value = classGradeTreeData.value[0].guid;
treeInfo.value.expandedKey.push(classGradeTreeData.value[0].guid);
// 寻找第一children中guid
if (classGradeTreeData.value[0].children) {
treeInfo.value.currentNodeKey = classGradeTreeData.value[0].children[0].guid;
// 分类明细guid
classifyDetailGuid.value = classGradeTreeData.value[0].children[0].guid;
}
// 分别赋值 分类guid
classifyGuid.value = classGradeTreeData.value[0].guid;
newCreateGradeFormItems.value[1].options = transformDataForTree(transformedData)
treeInfo.value.loading = false;
} else {
proxy.$ElMessage.error(res.msg);
}
}
// 数据转换函数
const transformData = (data: any[]) => {
return data?.map(({ name, classifyRSTreeVOS, ...rest }) => ({
...rest,
classifyName: name,
children: classifyRSTreeVOS,
}));
};
// 我需要给树形组件传递的数据,只能选择末级节点。所以要给非末级节点添加一个disabled属性
// 通过深拷贝的方式,避免污染原始数据
const transformDataForTree = (data: any[]) => {
const cloneData = JSON.parse(JSON.stringify(data));
const traverse = (data: any[]) => {
data.forEach((item) => {
if (item.children) {
item.disabled = true;
traverse(item.children);
}
});
};
traverse(cloneData);
return cloneData;
};
// 获取标签规则列表
const labelPageList = ref<any>()
const getLabelPageData = async () => {
tableInfo.value.loading = true;
const params = {
pageIndex: page.value.curr,
pageSize: page.value.limit,
classifyGuid: classifyGuid.value,
detailGuid: classifyDetailGuid.value
}
const res: any = await getLabelPageList(params);
if (res.code == proxy.$passCode) {
labelPageList.value = res.data.records;
tableInfo.value.page.rows = res.data.totalRows;
tableInfo.value.page.limit = res.data.pageSize
tableInfo.value.page.curr = res.data.pageIndex
tableInfo.value.data = labelPageList.value;
tableInfo.value.loading = false;
} else {
proxy.$ElMessage.error(res.msg);
}
}
// 下拉标签
const LabelListData = ref<any>([]);
const getLabelListData = async () => {
const res: any = await getLabelList({ label: '' });
if (res.code == proxy.$passCode) {
LabelListData.value = res.data;
const data = res.data
data.map(item => {
item.label = item.label
item.value = item.guid
})
classSearchItemList.value[0].options = data;
} else {
proxy.$ElMessage.error(res.msg);
}
}
onMounted(async () => {
await getClassifyGradeTree();
await getLabelPageData();
await getLabelListData();
});
// 左侧tree-list
const treeInfo = ref<any>({
id: "data-pickup-tree",
filter: true,
queryValue: "",
className: 'tree-list',
queryPlaceholder: "输入标准集名称搜索",
props: {
label: "classifyName",
value: "guid",
},
nodeKey: 'guid',
expandedKey: [],
currentNodeKey: '',
expandOnNodeClick: false,
data: [],
loading: false
});
// 点击树节点修改分类guid 和 分类明细guid
const nodeClick = (data: any) => {
console.log('nodeClick', data);
// 分类guid
if (Object.keys(data).includes("type")) {
classifyGuid.value = data.guid;
classifyDetailGuid.value = '';
getLabelPageData();
return;
}
classifyGuid.value = data.classifyGradeGuid;
// 分类明细guid
classifyDetailGuid.value = data.guid;
getLabelPageData();
}
const handleTreeItemMenuClick = (data: any, type) => {
console.log('handleTreeItemMenuClick', data, type);
}
// 右侧表格配置
const tableDataList = ref([]);
// 删除标签guids
const deleteLabelGuids = ref<any>([]);
// 保存编辑的guid
const editLabelRow = ref<any>('');
const page = ref({
limit: 10,
curr: 1,
sizes: [
{ label: "10", value: 10 },
{ label: "20", value: 20 },
{ label: "100", value: 100 },
{ label: "150", value: 150 },
{ label: "200", value: 200 },
],
});
const tableInfo = ref({
id: "role-manage-table",
multiple: true,
fixedSelection: true,
fields: [
{ label: "序号", type: "index", width: 56, align: "center" },
{ label: "标签名", field: "label", type: 'text_btn', class: 'drawer-detail-cell', width: 120, value: 'detail', columClass: 'text_btn' },
{ label: "分类", field: "classifyDetailName", width: 140 },
{ label: "分级", field: "gradeDetailName", width: 140 },
{
label: '状态', field: 'bizState', type: 'switch', activeText: '启用', inactiveText: '停用', activeValue: 'Y', inactiveValue: 'N', switchWidth: 56, width: 100, align: 'center'
},
{ label: "修改人", field: "updateUserName", width: 140 },
{ label: "更新时间", field: "updateTime", width: 180 },
],
data: tableDataList.value,
page: {
type: "normal",
rows: 0,
...page.value,
},
actionInfo: {
label: "操作",
type: "btn",
width: 300,
fixed: 'right',
btns: [
{
label: "编辑", value: "edit", click: async (scope) => {
console.log('编辑', scope);
newCreateGradeStandardDialogInfo.value.submitBtnLoading = false;
newCreateGradeStandardDialogInfo.value.title = '编辑标签';
await getGradeListData(scope.row.gradeGuid);
// 遍历classGradeTreeData 找到对应的guid item的refGradeGuid
classGradeTreeData.value.forEach((element: any) => {
if (element.guid === scope.row.classifyGuid) {
tempRefGradeGuid.value = element.refGradeGuid;
}
});
editLabelRow.value = scope.row;
// formItems进行回显,加上disabled: true 不能修改
newCreateGradeFormItems.value.forEach(item => {
item.default = scope.row[item.field];
item.disabled = false;
});
if (scope.row.vagueMatchRule) {
// formRows进行回显
formRows.value = scope.row.vagueMatchRule.map((item) => ({
matchValue: item.matchValue,
position: item.position,
name: item.name,
disabled: false
}));
} else {
formRows.value = [{ matchValue: '', position: '', name: '', disabled: false }];
}
newCreateGradeStandardDialogInfo.value.visible = true;
}
},
{
label: "删除 ", value: "delete", click: (scope) => {
console.log('删除', scope);
deleteLabelGuids.value = []; // 重置数组
deleteLabelGuids.value.push(scope.row.guid);
batchRemobe();
getLabelListData();
}
},
]
},
loading: false
});
// 批量删除
const batchRemobe = async () => {
// 批量删除,增加confirm确认弹窗
if (deleteLabelGuids.value.length == 0) {
proxy.$ElMessage({
type: 'warning',
message: '请选择要删除的数据'
})
return;
}
// confirm弹窗
proxy.$confirm('是否删除选中数据?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const res: any = await deleteLabel(deleteLabelGuids.value);
if (res.code == proxy.$passCode) {
proxy.$ElMessage({
type: 'success',
message: '删除成功'
})
getLabelPageData();
} else {
proxy.$ElMessage.error(res.msg);
}
}).catch(() => {
proxy.$ElMessage({
type: 'info',
message: '已取消删除'
});
});
};
const tableSwitchBeforeChange = (scope, field, callback) => {
// 弹窗确认
proxy.$confirm('是否修改状态?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const state = scope.row.bizState === 'Y' ? 'N' : 'Y';
const res = await tableSwitchChange(state, scope, field);
if (res) {
callback();
}
}).catch(() => {
proxy.$ElMessage({
type: 'info',
message: '已取消修改'
});
});
}
const tableSwitchChange = async (state, scope, field) => {
console.log('tableSwitchChange', state, scope, field);
const params = {
...scope.row,
bizState: state,
version: 0,
vagueMatchRule: scope.row.vagueMatchRule ? scope.row.vagueMatchRule : ''
}
const res: any = await updateLabel(params);
if (res.code == proxy.$passCode) {
proxy.$ElMessage.success('修改成功');
getLabelPageData();
return true
} else {
proxy.$ElMessage.error(res.msg);
return false
}
}
const tableBtnClick = async (scope, value) => {
console.log('tableBtnClick', scope.row);
await getGradeListData(scope.row.gradeGuid);
// formItems进行回显,加上disabled: true 不能修改
newCreateGradeFormItems.value.forEach(item => {
item.default = scope.row[item.field];
item.disabled = true;
});
if (scope.row.vagueMatchRule) {
// formRows进行回显
formRows.value = scope.row.vagueMatchRule.map((item) => ({
matchValue: item.matchValue,
position: item.position,
name: item.name,
disabled: true
}));
} else {
formRows.value = [{ matchValue: '', position: '', name: '', disabled: false }];
}
newCreateGradeStandardDialogInfo.value.visible = true;
}
const tablePageChange = (info) => {
console.log('tablePageChange', info);
page.value.curr = Number(info.curr);
page.value.limit = Number(info.limit);
getLabelPageData();
}
/**弹窗配置 */
const newCreateGradeFormItems = ref<any>([{
label: '标签名',
type: 'input',
placeholder: '请选择',
field: 'label',
default: '',
required: true,
filterable: true,
clearable: true,
visible: true,
block: true,
},
{
label: '分类',
type: 'tree-select',
placeholder: '请选择',
field: 'classifyDetailGuid',
default: '',
options: [],
props: {
label: "classifyName",
value: "guid",
},
required: true,
checkStricty: true,
lazy: false,
filterable: true,
clearable: true,
visible: true,
block: true,
},
{
label: '分级',
type: 'select',
maxlength: 19,
placeholder: '请输入',
field: 'gradeDetailGuid',
default: '',
options: [],
props: {
label: 'name',
value: 'guid',
},
clearable: true,
required: true,
block: true,
},
// {
// label: ' ',
// type: 'label',
// default: '规则配置',
// block: true,
// col: 'title-label'
// },
{
label: '精确匹配',
type: 'textarea',
maxlength: 500,
placeholder: '请输入字段中文,中间用英文“,”分号隔开',
field: 'matchChValue',
default: '',
clearable: true,
required: false,
},
{
label: '',
type: 'textarea',
maxlength: 500,
placeholder: '请输入字段中文,中间用英文“,”分号隔开',
field: 'matchEnValue',
default: '',
clearable: true,
required: false,
}
]);
const newCreateGradeFormRules = ref({
label: [
{ required: true, message: '请输入标签名', trigger: 'change' }
],
detailGuid: [
{ required: true, message: '请选择分类', trigger: 'change' }
],
gradeDetailGuid: [
{ required: true, message: '请选择分级', trigger: 'change' }
],
});
const newCreateGradeStandardDialogInfo = ref({
visible: false,
size: 600,
title: "添加标签",
type: "",
formInfo: {
id: "grade-form",
items: newCreateGradeFormItems.value,
rules: newCreateGradeFormRules.value,
},
submitBtnLoading: false,
btns: {
cancel: () => {
newCreateGradeStandardDialogInfo.value.visible = false;
newCreateGradeStandardDialogInfo.value.submitBtnLoading = false;
},
submit: async (btn, info) => {
console.log(info);
newCreateGradeStandardDialogInfo.value.submitBtnLoading = true;
if (newCreateGradeStandardDialogInfo.value.title === "添加标签") {
const tempParams = formRows.value.map((item) => ({
matchValue: item.matchValue,
position: item.position,
name: item.name
}));
const params = {
...info,
classifyGuid: classifyGuid.value,
gradeGuid: tempRefGradeGuid.value,
vagueMatchRule: tempParams
}
console.log('submit', params);
const res: any = await saveLabel(params);
if (res.code == proxy.$passCode) {
proxy.$ElMessage.success('新增成功');
newCreateGradeStandardDialogInfo.value.visible = false;
newCreateGradeStandardDialogInfo.value.submitBtnLoading = false;
getLabelPageData();
getLabelListData();
} else {
proxy.$ElMessage.error(res.msg);
}
}
if (newCreateGradeStandardDialogInfo.value.title === "编辑标签") {
console.log('editLabelRow', info, formRows.value);
const tempParams = formRows.value.map((item) => ({
matchValue: item.matchValue,
position: item.position,
name: item.name
}));
const params = {
...editLabelRow.value,
...info,
vagueMatchRule: tempParams,
classifyGuid: classifyGuid.value,
gradeGuid: tempRefGradeGuid.value,
}
console.log('submit', params);
const res: any = await updateLabel(params);
if (res.code == proxy.$passCode) {
proxy.$ElMessage.success('修改成功');
newCreateGradeStandardDialogInfo.value.visible = false;
newCreateGradeStandardDialogInfo.value.submitBtnLoading = false;
getLabelPageData();
getLabelListData();
} else {
proxy.$ElMessage.error(res.msg);
}
}
}
}
})
// 新增标签
const addNewLabel = () => {
console.log('addNewLabel');
newCreateGradeFormItems.value.forEach(item => {
item.default = '';
item.disabled = false;
});
formRows.value = [{ matchValue: '', position: '', name: '', disabled: false }];
newCreateGradeStandardDialogInfo.value.title = '添加标签';
newCreateGradeStandardDialogInfo.value.visible = true;
}
const classSearchItemList = ref<any>([
{
type: 'select-slots',
multiple: true,
label: '',
field: 'labelName',
default: [],
options: [],
placeholder: '请选择标签名称',
clearable: false,
filterable: true,
visible: true
}
]);
const guids = ref<any>([])
const selectChange = async (val: any, row: any) => {
if (val) {
guids.value = val;
}
};
/** 搜索查询分类标准 */
const searchClass = async (val: any, clear: boolean = false) => {
console.log('searchClass', val, clear);
if (clear) {
classSearchItemList.value.map(item => item.default = '')
guids.value = []
getLabelPageData();
return;
}
if (val?.labelName?.length !== 0) {
console.log('调用了吗');
tableInfo.value.loading = true;
const params = {
pageIndex: page.value.curr,
pageSize: page.value.limit,
guids: guids.value,
}
const res: any = await getLabelPageList(params);
if (res.code == proxy.$passCode) {
labelPageList.value = res.data.records;
tableInfo.value.page.rows = res.data.totalRows;
tableInfo.value.page.limit = res.data.pageSize
tableInfo.value.page.curr = res.data.pageIndex
tableInfo.value.data = labelPageList.value;
tableInfo.value.loading = false;
} else {
proxy.$ElMessage.error(res.msg);
}
}
};
//弹窗模糊匹配
const tempRefGradeGuid = ref('')
const tempName = ref('')
const tempFormData = ref()
const handleSelectChange = async (val, row, info) => {
const formRef = dialogLabelFormRef.value.dialogRef.dialogFormRef[0].formInline
tempFormData.value = formRef;
if (tempRefGradeGuid.value) {
await getGradeListData(tempRefGradeGuid.value);
const matchedGrade = gradeListData.value.find(
(element: any) => element.name === tempName.value
);
if (matchedGrade) {
newCreateGradeFormItems.value[2].default = matchedGrade.guid;
newCreateGradeFormItems.value[0].default = tempFormData.value.label;
newCreateGradeFormItems.value[1].default = tempFormData.value.classifyDetailGuid;
}
}
};
const handleTreeSelectNodeChange = (node, item, nodeObj) => {
console.log('handleTreeSelectNodeChange', node, item, nodeObj);
treeInfo.value.expandedKey = [];
treeInfo.value.currentNodeKey = node.guid;
treeInfo.value.expandedKey.push(node.classifyGradeGuid);
if (node?.classifyGradeGuid) {
classifyGuid.value = node.classifyGradeGuid;
tempName.value = node.name;
classifyDetailGuid.value = node.guid;
}
// 遍历classGradeTreeData 找到对应的guid item的refGradeGuid
classGradeTreeData.value.forEach((element: any) => {
if (element.guid === classifyGuid.value) {
tempRefGradeGuid.value = element.refGradeGuid;
}
});
};
const gradeListData = ref<any>()
// 获取分级列表
const getGradeListData = async (guid) => {
const params = {
pageIndex: 1,
pageSize: -1,
classifyGradeGuid: guid
}
const res: any = await getGradeList(params);
if (res.code == proxy.$passCode) {
gradeListData.value = res.data.records;
newCreateGradeFormItems.value[2].options = gradeListData.value;
return res.data.records;
} else {
proxy.$ElMessage.error(res.msg);
}
}
const formRows = ref([
{ matchValue: '', position: '', name: '', disabled: false }, // 初始行
]);
// 位置选项
const positionOptions = [
{ label: '前面', value: 'B' },
{ label: '后面', value: 'A' },
{ label: '任意位置', value: 'C' },
];
// 语言options
const languageOptions = [
{ label: '中文名', value: 'zhName' },
{ label: '英文名', value: 'enName' },
];
// 当前悬停的行索引
const hoveredRowIndex = ref<number | null>(null);
// 鼠标移入事件
const handleMouseEnter = (index: number) => {
hoveredRowIndex.value = index;
};
// 鼠标移出事件
const handleMouseLeave = () => {
hoveredRowIndex.value = null;
};
// 新增行
const addRow = () => {
formRows.value.push({ matchValue: '', position: '', name: '', disabled: false });
};
// 删除行
const deleteRow = (index: number) => {
formRows.value.splice(index, 1);
};
</script>
<template>
<div class="data-label">
<div class="container_wrap full flex">
<div class="aside_wrap">
<div class="aside_title">分类分级目录</div>
<Tree :treeInfo="treeInfo" @nodeClick="nodeClick" @itemMenuClick="handleTreeItemMenuClick" />
</div>
<div class="main_wrap">
<div class="main_wrap-top-area">
<!-- <el-select v-model="labelInput" multiple filterable remote reserve-keyword placeholder="请输入关键字"
remote-show-suffix :remote-method="remoteMethod" :loading="loading" style="width: 240px">
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
<el-button type="primary" class="v-serach" @click="labelSearch">查询</el-button>
<el-button>清空</el-button> -->
<TableTools :searchItems="classSearchItemList" :searchId="'template-manage-search'" @search="searchClass"
@select-change="selectChange" />
</div>
<div>
<el-button type="primary" class="v-add" @click="addNewLabel">新增</el-button>
<el-button class="v-import">导入</el-button>
<el-button>导出</el-button>
</div>
<div class="table_panel_wrap">
<Table :tableInfo="tableInfo" @tableSwitchBeforeChange="tableSwitchBeforeChange"
@tableBtnClick="tableBtnClick" @tablePageChange="tablePageChange" />
</div>
</div>
</div>
<Dialog_form ref="dialogLabelFormRef" :dialogConfigInfo="newCreateGradeStandardDialogInfo" class="v-dialog-form"
@treeSelectNodeChange='handleTreeSelectNodeChange' @selectChange="handleSelectChange">
<template v-slot:default>
<div class="dim-label">模糊匹配</div>
<!-- 渲染行 -->
<div v-for="(row, index) in formRows" :key="index" class="match-content-wrapper">
<div class="match-content" @mouseenter="handleMouseEnter(index)" @mouseleave="handleMouseLeave()">
<!-- 位置映射下拉框 -->
<el-select v-model="row.name" placeholder="请选语言类型" :disabled=row.disabled class="v-select">
<el-option v-for="option in languageOptions" :key="option.value" :label="option.label"
:value="option.value" />
</el-select>
<el-select v-model="row.position" placeholder="请选择位置" :disabled=row.disabled class="v-select">
<el-option v-for="option in positionOptions" :key="option.value" :label="option.label"
:value="option.value" />
</el-select>
<el-input v-model="row.matchValue" :disabled=row.disabled class="v-input" laceholder="请输入匹配值" />
<!-- 删除按钮 -->
<el-button :disabled=row.disabled v-if="hoveredRowIndex === index" class="extra-icon" :icon="Delete"
@click="deleteRow(index)" circle style="margin-left: 8px;" />
</div>
</div>
<!-- 新增按钮 -->
<div class="add-Icon" @click="addRow">
<el-icon class="icon-add" color="#4fa1a4" :size="30">
<CirclePlus />
</el-icon>
<span class="word-des">模糊匹配规则</span>
</div>
</template>
</Dialog_form>
</div>
</template>
<style lang="scss" scoped>
.data-label {
width: 100%;
height: 100%;
.container_wrap {
padding: 0;
display: flex;
justify-content: space-between;
.aside_wrap {
width: 199px;
border-right: 1px solid #d9d9d9;
box-shadow: none;
.aside_title {
width: calc(100% - 32px);
display: inline-block;
}
.icon-add.el-icon {
width: 24px;
height: 24px;
vertical-align: middle;
cursor: pointer;
svg {
width: 24px;
height: 24px;
}
}
.tree_panel {
height: 100%;
padding-top: 0;
:deep(.el-tree) {
margin: 0;
height: calc(100% - 68px);
overflow: hidden auto;
}
}
}
.main_wrap {
padding: 11px 16px 0 16px;
.main_wrap-top-area {
display: flex;
margin-bottom: 10px;
align-items: center;
.v-serach {
margin-left: 10px;
}
}
.table_panel_wrap {
margin-top: 12px;
width: 100%;
height: calc(100% - 105px);
min-height: 210px;
overflow: visible;
}
}
}
.dim-label {
height: 10px;
display: flex;
}
.match-content-wrapper {
width: 100%;
.match-content {
display: flex;
align-items: center;
margin-top: 8px;
.v-select {
margin-right: 8px;
width: 33%;
}
.v-input {
width: calc(33% - 50px);
}
.extra-icon {
transition: opacity 1s;
}
}
}
:deep(.add-Icon) {
display: flex;
align-items: center;
margin-top: 13px;
width: 50%;
.el-icon svg {
height: 19px;
width: 19px;
}
.word-des {
color: #4fa1a4
}
}
:deep(.v-dialog-form) {
.title-label {
font-size: 16px;
color: #212121;
line-height: 24px;
font-weight: 600;
}
}
}
</style>
......@@ -6,20 +6,54 @@
import router from "@/router";
import { getMetaDataBase } from '@/api/modules/dataMetaService';
import { ref } from "vue";
import { getClassifyGradList, saveCgTemplate } from "@/api/modules/dataInventory";
onMounted(async () => {
const params = {
pageIndex: 1,
pageSize: -1,
}
const res = await getMetaDataBase(params)
console.log(res);
const res = await getMetaDataBase(params);
tableInfo.value.data = res.data.records;
getGradListData();
getClassifyDataList();
});
const { proxy } = getCurrentInstance() as any;
const refGradePageParams = ref({
pageIndex: 1,
pageSize: -1,
type: "G"
});
const refClassifyPageParams = ref({
pageIndex: 1,
pageSize: -1,
type: "C"
});
const gradListData = ref([]);
const classifyDataList = ref([]);
// 获取分级列表
const getGradListData = async () => {
const res: any = await getClassifyGradList(refGradePageParams.value);
gradListData.value = res.data.records;
newCreateTemplateFormItems.value[2].options = gradListData.value;
};
// 获取分类列表
const getClassifyDataList = async () => {
const res: any = await getClassifyGradList(refClassifyPageParams.value);
classifyDataList.value = res.data.records;
newCreateTemplateFormItems.value[1].options = classifyDataList.value;
};
// 表单引用
const formRef = ref();
const tableRef = ref();
// 元数据metaGuids
const metaGuids = ref<any>([]);
const fullscreenLoading = ref(false);
const isExpand = ref(true);
const newCreateTemplateFormItems = ref([{
......@@ -27,7 +61,7 @@ const newCreateTemplateFormItems = ref([{
type: 'input',
maxlength: 50,
placeholder: '请输入',
field: 'templeteName',
field: 'templateName',
default: '',
clearable: true,
required: true
......@@ -35,9 +69,13 @@ const newCreateTemplateFormItems = ref([{
label: '行业分类',
type: 'select',
placeholder: '请选择',
field: ' industryCategory',
field: 'classifyGuid',
default: '',
options: [], //TODO
props: {
label: 'name',
value: 'guid'
},
required: true,
filterable: true,
clearable: true,
......@@ -46,9 +84,13 @@ const newCreateTemplateFormItems = ref([{
label: '分级标准',
type: 'select',
placeholder: '请选择',
field: ' gradingStandard',
field: 'gradeGuid',
default: '',
options: [], //TODO
props: {
label: 'name',
value: 'guid'
},
required: true,
filterable: true,
clearable: true,
......@@ -82,63 +124,14 @@ const tableInfo = ref({
actionInfo: {
show: false,
},
data: [
{
index: 1,
databaseNameZh: "数据库名称",
databaseName: "数据库名",
tableCount: 0,
storageCapacities: 0,
columns: 0,
},
{
index: 2,
databaseNameZh: "数据库名称",
databaseName: "数据库名",
tableCount: 0,
storageCapacities: 0,
columns: 0,
},
{
index: 3,
databaseNameZh: "数据库名称",
databaseName: "数据库名",
tableCount: 0,
storageCapacities: 0,
columns: 0,
},
{
index: 4,
databaseNameZh: "数据库名称",
databaseName: "数据库名",
tableCount: 0,
storageCapacities: 0,
columns: 0,
},
{
index: 5,
databaseNameZh: "数据库名称",
databaseName: "数据库名",
tableCount: 0,
storageCapacities: 0,
columns: 0,
},
{
index: 6,
databaseNameZh: "数据库名称",
databaseName: "数据库名",
tableCount: 0,
storageCapacities: 0,
columns: 0,
},
],
data: [],
showPage: false,
loading: false,
});
const onTableSelectChange = (selection: any[]) => {
console.log(selection);
// 遍历选中的元数据guid,然后存入metaGuids数组中
metaGuids.value = selection.map((item: any) => item.guid);
};
const cancel = () => {
......@@ -149,11 +142,24 @@ const cancel = () => {
const save = async () => {
console.log('save');
// 校验表单
const res = formRef.value;
res.ruleFormRef.validate((valid: any) => {
const formRes = formRef.value;
formRes.ruleFormRef.validate(async (valid: any) => {
if (valid) {
// 表单校验通过
console.log('表单校验通过');
const formData = formRes.formInline;
const params = {
...formData,
metaGuids: metaGuids.value,
version: 0
};
const res: any = await saveCgTemplate(params);
if (res.code == proxy.$passCode) {
// 保存成功
proxy.$ElMessage.success(res.msg);
} else {
// 保存失败
proxy.$ElMessage.error(res.msg);
}
} else {
console.log('表单校验不通过');
return false;
......
......@@ -7,61 +7,75 @@
import { ref, onMounted } from "vue";
import TableTools from '@/components/Tools/table_tools.vue';
import { MoreFilled } from "@element-plus/icons-vue";
import { commonPageConfig } from '@/components/PageNav/index';
import { useValidator } from '@/hooks/useValidator';
import TemplateItem from './templateItem.vue';
import { getTempleteClassifyData, saveClassifyGrad, getClassifyGradList, deleteClassifyGrad, updateClassifyGrad, getGradeTreeList } from "@/api/modules/dataInventory";
import { saveClassifyGrad, getClassifyGradList, deleteClassifyGrad, updateClassifyGrad, } from "@/api/modules/dataInventory";
const router = useRouter();
const { required } = useValidator();
const { proxy } = getCurrentInstance() as any;
const refClassifyPageParams = ref({
const refGradePageParams = ref({
pageIndex: 1,
pageSize: 10,
pageSize: -1,
type: "G"
});
const classifyGradListData = ref();
const refClassifyPageParams = ref({
pageIndex: 1,
pageSize: -1,
type: "C"
});
// 分级列表
const classifyGradListData: any = ref([]);
// 分类列表
const classListData: any = ref([]);
//记录分级guid
const classifyGradGuid = ref('');
// 记录分类guid
const classGuid = ref('');
const classListDataLoading = ref(false);
// 获取分级列表
const getClassifyGradListData = async () => {
const res: any = await getClassifyGradList(refClassifyPageParams.value);
const res: any = await getClassifyGradList(refGradePageParams.value);
if (res.code == proxy.$passCode) {
classifyGradListData.value = res.data.records || [];
(classStandardFormItems.value[1].options as any) = classifyGradListData.value;
} else {
proxy.$ElMessage.error(res.msg);
}
}
// 获取分级树形列表
const getGradeTreeListData = async () => {
const res: any = await getGradeTreeList();
//获取分类列表
const getClassListData = async () => {
const res: any = await getClassifyGradList(refClassifyPageParams.value);
if (res.code == proxy.$passCode) {
gradeTreeData.value = res.data || [];
(classStandardFormItems.value[1].options as any) = gradeTreeData.value;
classListData.value = res.data.records || [];
} else {
proxy.$ElMessage.error(res.msg);
}
}
//记录分级guid
const classifyGradGuid = ref('');
// 分级列表
const gradeTreeData = ref('');
onMounted(() => {
getClassifyGradListData();
getGradeTreeListData();
getClassListData();
})
const tabsInfo = ref({
activeName: 'classStandard',
activeName: 'gradeStandard',
tabs: [
{ label: '分类分级模板', name: 'classTemplate' },
// { label: '分类分级模板', name: 'classTemplate' },
{ label: '分级标准', name: 'gradeStandard' },
{ label: '分类标准', name: 'classStandard' },
{ label: '分级标准', name: 'gradeStandard' }
]
});
......@@ -69,35 +83,6 @@ const tabChange = (val) => {
tabsInfo.value.activeName = val;
}
/** 模板的搜索配置 */
const searchItemList = ref([
{
type: 'input',
label: '',
field: 'templateName',
default: '',
maxlength: 50,
placeholder: '模板名称',
clearable: true,
visible: true
}
]);
/** 搜索查询分类分级模板。 */
const searchTemplate = (val: any, clear: boolean = false) => {
// page.value.curr = 1;
// if (clear) {
// searchItemList.value.map(item => item.default = '')
// page.value.planName = '';
// page.value.state = null;
// getTableData();
// return;
// }
// page.value.planName = val.planName;
// page.value.state = val.state;
// getTableData();
};
/** ------------------------------- 分类标准相关 ------------------------------------- */
/** 分类标准的搜索配置 */
......@@ -114,88 +99,90 @@ const classSearchItemList = ref([
}
]);
const classPage: any = ref({
...commonPageConfig,
classStandardName: ''
});
const classListDataLoading = ref(false);
const classListData: any = ref([{
guid: '1',
name: '工业数据分类',
updateTime: '2020-12-12 10:10:10'
}, {
guid: '2'
}, {
guid: '3'
}, {
guid: '4'
}, {
guid: '5'
}, {
guid: '6'
}, {
guid: '7'
}]);
/** 记录点击省略号弹出菜单的visible */
const cardBtnVisible: any = ref(false);
/** 搜索查询分类标准 */
const searchClass = (val: any, clear: boolean = false) => {
classPage.value.curr = 1;
const searchClass = async (val: any, clear: boolean = false) => {
if (clear) {
classSearchItemList.value.map(item => item.default = '')
// classPage.value.planName = '';
getClassListData();
return;
}
// classPage.value.planName = '';
getClassListData();
};
const params = {
type: 'C',
name: val.classStandardName,
pageIndex: 1,
pageSize: -1
}
const res: any = await getClassifyGradList(params);
if (res.code == proxy.$passCode) {
classListData.value = res.data.records || [];
} else {
proxy.$ElMessage.error(res.msg);
}
const getClassListData = () => {
// classListDataLoading.value = true;
// getPlanList({
// pageIndex: classPage.value.curr,
// pageSize: classPage.value.limit,
// //TODO
// }).then((res: any) => {
// classListDataLoading.value = false;
// if (res === undefined) {
// return;
// }
// if (res.code == proxy.$passCode) {
// const data = res.data || {}
// classListData.value.data = data.records || [];
// } else {
// proxy.$ElMessage.error(res.msg);
// }
// })
}
};
/** 编辑分类 */
const handleClassDataEdit = (item, des = '') => {
const handleClassDataEdit = (params) => {
classGuid.value = params.guid;
newCreateClassStandardDialogInfo.value.submitBtnLoading = false;
newCreateClassStandardDialogInfo.value.visible = true;
newCreateClassStandardDialogInfo.value.title = '编辑分类';
classStandardFormItems.value.forEach(item => {
if (item.field === 'refGradeGuid') {
item.default = params.refGradeGuid
}
if (item.field === 'classStandardName') {
item.default = params.name
}
})
}
// 配置分类
const handleClassDataClick = (item, des = '') => {
// 获取分级标准
router.push({
name: 'classStandardEdit',
query: {
guid: item.guid,
type: des === '' ? '配置' : des,
classStandardName: '工业分类'
classStandardName: item.name,
refGradeGuid: item.refGradeGuid
}
});
}
const handleClassDataDel = (item) => {
const handleClassDataDel = async (item) => {
try {
// 弹出确认框
await proxy.$confirm('此操作将永久删除该分级, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
});
const res: any = await deleteClassifyGrad({ guid: item.guid });
if (res.code === proxy.$passCode) {
await getClassListData(); // 获取更新后的列表数据
proxy.$ElMessage({
type: 'success',
message: '删除成功!'
});
} else {
proxy.$ElMessage.error(res.msg); // 显示错误信息
}
} catch (error) {
if (error !== 'cancel') {
proxy.$ElMessage({
type: 'info',
message: '已取消删除'
});
}
}
}
/** ------------------------------- 分类标准相关 ------------------------------------- */
const classStandardFormItems = ref([{
label: '分类名称',
......@@ -209,25 +196,19 @@ const classStandardFormItems = ref([{
required: true
}, {
label: '分级标准',
type: 'tree-select',
type: 'select',
placeholder: '请选择',
field: 'gradeStandard',
field: 'refGradeGuid',
options: [],
nodeKey: 'guid',
checkStrictly: false,//只能选择叶子节点。
lazy: false,
multiple: false,
collapseTagsTooltip: true,
collapseTags: true,
props: {
label: "name",
value: "guid",
children: "gradeRSVOList"
},
filterable: true,
clearable: true,
default: '',
required: true
required: true,
block: true,
}]);
const classStandardFormRules = ref({
......@@ -250,18 +231,46 @@ const newCreateClassStandardDialogInfo = ref({
cancel: () => {
newCreateClassStandardDialogInfo.value.visible = false;
},
submit: (btn, info) => {
submit: async (btn, info) => {
if (newCreateClassStandardDialogInfo.value.title === '新增分类') {
newCreateClassStandardDialogInfo.value.submitBtnLoading = true;
const params = {
name: info.classStandardName,
refGradeGuid: info.refGradeGuid,
type: 'C'
}
const res: any = await saveClassifyGrad(params);
if (res.code == proxy.$passCode) {
await getClassListData();
proxy.$ElMessage({
type: 'success',
message: '新增分类成功'
})
newCreateClassStandardDialogInfo.value.submitBtnLoading = false;
newCreateClassStandardDialogInfo.value.visible = false;
classPage.value.curr = 1;
} else {
proxy.$ElMessage.error(res.msg);
}
} else {
newCreateClassStandardDialogInfo.value.submitBtnLoading = true;
const params = {
name: info.classStandardName,
refGradeGuid: info.refGradeGuid,
guid: classGuid.value,
type: 'C'
}
const res: any = await updateClassifyGrad(params);
if (res.code == proxy.$passCode) {
getClassListData();
//跳转到编辑页面
router.push({
name: 'classStandardEdit',
query: {
guid: '1',
classStandardName: '工业分类'
proxy.$ElMessage({
type: 'success',
message: '修改分类成功'
})
newCreateClassStandardDialogInfo.value.visible = false;
} else {
proxy.$ElMessage.error(res.msg);
}
}
});
}
}
})
......@@ -389,6 +398,7 @@ const handleClassifyGradDataDel = async (item) => {
// 编辑分级
const handleClassifyGradDataEdit = (itemGradeName) => {
newCreateGradeStandardDialogInfo.value.submitBtnLoading = false;
classifyGradGuid.value = itemGradeName.guid;
newCreateGradeStandardDialogInfo.value.visible = true;
newCreateGradeStandardDialogInfo.value.title = '编辑分级';
......@@ -421,60 +431,69 @@ const newCreateGrade = () => {
/** ------------------------------- 分类分级模板 ------------------------------------- */
const pageInfo = ref({
limit: 50,
curr: 1,
sizes: [
{ label: "10", value: 10 },
{ label: "50", value: 50 },
{ label: "100", value: 100 },
{ label: "150", value: 150 },
{ label: "200", value: 200 },
],
type: "normal",
rows: 0,
})
const newCreateTemplate = () => {
router.push({
name: 'newCreateTemplate',
query: {
classStandardName: '分类分级模板'
}
});
}
const pageChange = (info) => {
pageInfo.value.curr = Number(info.curr);
pageInfo.value.limit = Number(info.limit);
getClassificationTemplateList();
}
const getClassificationTemplateList = async () => {
const params = {
pageSize: pageInfo.value.limit,
pageIndex: pageInfo.value.curr,
}
const res = await getTempleteClassifyData(params);
console.log(res);
}
onBeforeMount(() => {
getClassListData();
getClassificationTemplateList();
})
// const pageInfo = ref({
// limit: 50,
// curr: 1,
// sizes: [
// { label: "10", value: 10 },
// { label: "50", value: 50 },
// { label: "100", value: 100 },
// { label: "150", value: 150 },
// { label: "200", value: 200 },
// ],
// type: "normal",
// rows: 0,
// })
// const newCreateTemplate = () => {
// router.push({
// name: 'newCreateTemplate',
// query: {
// classStandardName: '分类分级模板'
// }
// });
// }
// const tempBtn = () => {
// router.push({
// name: 'classificationTemplateEdit',
// query: {
// classClassifyGradName: '分类分级模板名称'
// }
// });
// }
// const pageChange = (info) => {
// pageInfo.value.curr = Number(info.curr);
// pageInfo.value.limit = Number(info.limit);
// getClassificationTemplateList();
// }
// const getClassificationTemplateList = async () => {
// const params = {
// pageSize: pageInfo.value.limit,
// pageIndex: pageInfo.value.curr,
// }
// const res = await getTempleteClassifyData(params);
// console.log(res);
// }
// onBeforeMount(() => {
// getClassificationTemplateList();
// })
</script>
<template>
<div class="container">
<Tabs :tabs-info="tabsInfo" @tab-change="tabChange" />
<div class="panel" v-show="tabsInfo.activeName == 'classTemplate'">
<!-- <div class="panel" v-show="tabsInfo.activeName == 'classTemplate'">
<div class="table_tool_wrap">
<TableTools :searchItems="searchItemList" :searchId="'template-manage-search'" @search="searchTemplate" />
<div class="tools_btns">
<el-button type="primary" @click="newCreateTemplate">新增模板</el-button>
<el-button type="primary" @click="tempBtn">测试页面</el-button>
</div>
</div>
<div class="content">
......@@ -483,7 +502,7 @@ onBeforeMount(() => {
<div class="botton-page-nav">
<PageNav :class="[pageInfo.type]" :pageInfo="pageInfo" @pageChange="pageChange" />
</div>
</div>
</div> -->
<div class="panel" v-show="tabsInfo.activeName == 'classStandard'">
<div class="table_tool_wrap">
<TableTools :searchItems="classSearchItemList" :searchId="'template-manage-search'" @search="searchClass" />
......@@ -512,10 +531,6 @@ onBeforeMount(() => {
<svg-icon name="folder" />
</el-icon>
<div class="title">{{ item.name }}</div>
<div class="desc-row">
<div class="desc">{{ '分级标准' }}</div>
<div class="desc">{{ item.updateTime }}</div>
</div>
</div>
<div v-if="!classListData.length" class="card-noData">
<img src="../../assets/images/no-data.png" :style="{ width: '96px', height: '96px' }" />
......@@ -549,12 +564,8 @@ onBeforeMount(() => {
<svg-icon name="folder" />
</el-icon>
<div class="title">{{ item.name }}</div>
<!-- <div class="desc-row">
<div class="desc">{{ '分级标准' }}</div>
<div class="desc">{{ item.updateTime }}</div>
</div> -->
</div>
<div v-if="!classListData.length" class="card-noData">
<div v-if="!classifyGradListData.length" class="card-noData">
<img src="../../assets/images/no-data.png" :style="{ width: '96px', height: '96px' }" />
<span>暂无分类标准</span>
</div>
......
......@@ -21,9 +21,10 @@
<span>模板确认时间: {{ item.content.modelConfirmTime }}</span>
</div>
<div class="botton-btn">
<el-button type="primary" class="off-line-btn">下线</el-button>
<el-button type="primary" class="templete-btn">模板训练</el-button>
<el-button type="primary" class="delete-btn">删除</el-button>
<el-button type="primary" plain class="off-line-btn">下线</el-button>
<el-button>模板训练</el-button>
<el-button>模板确认</el-button>
<el-button>删除</el-button>
</div>
</div>
</div>
......@@ -146,6 +147,7 @@ const getItemStyle = (status: string) => {
borderTop: `4px solid ${borderColor}`,
};
};
</script>
<style scoped lang="scss">
......@@ -259,22 +261,6 @@ const getItemStyle = (status: string) => {
.botton-btn {
margin-top: 13px;
.off-line-btn {
background-color: #fff;
font-size: 14px;
color: #4FA1A4;
}
.templete-btn,
.delete-btn {
background: #FFFFFF;
border: 1px solid rgba(217, 217, 217, 1);
font-size: 14px;
color: #212121;
}
}
}
}
......
......@@ -15,6 +15,7 @@ import createBanner from './banner'
import AutoImport from 'unplugin-auto-import/vite';
import Components from 'unplugin-vue-components/vite';
import { VantResolver } from '@vant/auto-import-resolver';
import createMock from './mock'
export default function createVitePlugins(viteEnv, isBuild = false) {
const vitePlugins: (PluginOption | PluginOption[])[] = [
......@@ -37,5 +38,6 @@ export default function createVitePlugins(viteEnv, isBuild = false) {
isBuild && vitePlugins.push(...createCompression(viteEnv))
vitePlugins.push(...createSpritesmith(isBuild))
vitePlugins.push(createBanner())
vitePlugins.push(createMock(viteEnv.VITE_APP_CHECK_BASEURL, isBuild))
return vitePlugins
}
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!