0.0.1版本
This commit is contained in:
178
cdTMP/package-lock.json
generated
178
cdTMP/package-lock.json
generated
@@ -18,7 +18,7 @@
|
||||
"echarts": "^5.4.2",
|
||||
"file2md5": "^1.3.0",
|
||||
"lodash": "^4.17.21",
|
||||
"mammoth": "^1.7.2",
|
||||
"mammoth": "^1.8.0",
|
||||
"mitt": "^3.0.0",
|
||||
"monaco-editor": "^0.33.0",
|
||||
"nprogress": "^0.2.0",
|
||||
@@ -28,7 +28,7 @@
|
||||
"qs": "^6.11.2",
|
||||
"sortablejs": "^1.15.0",
|
||||
"tinymce": "^6.8.3",
|
||||
"vue": "^3.4.31",
|
||||
"vue": "^3.4.33",
|
||||
"vue-clipboard3": "^2.0.0",
|
||||
"vue-color-kit": "^1.0.5",
|
||||
"vue-echarts": "^6.5.5",
|
||||
@@ -54,7 +54,8 @@
|
||||
"postcss": "^8.4.38",
|
||||
"prettier": "^2.8.8",
|
||||
"tailwindcss": "^3.3.2",
|
||||
"vite": "^5.3.2"
|
||||
"typescript": "^5.5.3",
|
||||
"vite": "^5.3.4"
|
||||
}
|
||||
},
|
||||
"node_modules/@alloc/quick-lru": {
|
||||
@@ -1501,49 +1502,53 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/compiler-core": {
|
||||
"version": "3.4.31",
|
||||
"resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.4.31.tgz",
|
||||
"integrity": "sha512-skOiodXWTV3DxfDhB4rOf3OGalpITLlgCeOwb+Y9GJpfQ8ErigdBUHomBzvG78JoVE8MJoQsb+qhZiHfKeNeEg==",
|
||||
"version": "3.4.33",
|
||||
"resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.4.33.tgz",
|
||||
"integrity": "sha512-MoIREbkdPQlnGfSKDMgzTqzqx5nmEjIc0ydLVYlTACGBsfvOJ4tHSbZXKVF536n6fB+0eZaGEOqsGThPpdvF5A==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/parser": "^7.24.7",
|
||||
"@vue/shared": "3.4.31",
|
||||
"@vue/shared": "3.4.33",
|
||||
"entities": "^4.5.0",
|
||||
"estree-walker": "^2.0.2",
|
||||
"source-map-js": "^1.2.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/compiler-dom": {
|
||||
"version": "3.4.31",
|
||||
"resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.4.31.tgz",
|
||||
"integrity": "sha512-wK424WMXsG1IGMyDGyLqB+TbmEBFM78hIsOJ9QwUVLGrcSk0ak6zYty7Pj8ftm7nEtdU/DGQxAXp0/lM/2cEpQ==",
|
||||
"version": "3.4.33",
|
||||
"resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.4.33.tgz",
|
||||
"integrity": "sha512-GzB8fxEHKw0gGet5BKlpfXEqoBnzSVWwMnT+dc25wE7pFEfrU/QsvjZMP9rD4iVXHBBoemTct8mN0GJEI6ZX5A==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@vue/compiler-core": "3.4.31",
|
||||
"@vue/shared": "3.4.31"
|
||||
"@vue/compiler-core": "3.4.33",
|
||||
"@vue/shared": "3.4.33"
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/compiler-sfc": {
|
||||
"version": "3.4.31",
|
||||
"resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.4.31.tgz",
|
||||
"integrity": "sha512-einJxqEw8IIJxzmnxmJBuK2usI+lJonl53foq+9etB2HAzlPjAS/wa7r0uUpXw5ByX3/0uswVSrjNb17vJm1kQ==",
|
||||
"version": "3.4.33",
|
||||
"resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.4.33.tgz",
|
||||
"integrity": "sha512-7rk7Vbkn21xMwIUpHQR4hCVejwE6nvhBOiDgoBcR03qvGqRKA7dCBSsHZhwhYUsmjlbJ7OtD5UFIyhP6BY+c8A==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/parser": "^7.24.7",
|
||||
"@vue/compiler-core": "3.4.31",
|
||||
"@vue/compiler-dom": "3.4.31",
|
||||
"@vue/compiler-ssr": "3.4.31",
|
||||
"@vue/shared": "3.4.31",
|
||||
"@vue/compiler-core": "3.4.33",
|
||||
"@vue/compiler-dom": "3.4.33",
|
||||
"@vue/compiler-ssr": "3.4.33",
|
||||
"@vue/shared": "3.4.33",
|
||||
"estree-walker": "^2.0.2",
|
||||
"magic-string": "^0.30.10",
|
||||
"postcss": "^8.4.38",
|
||||
"postcss": "^8.4.39",
|
||||
"source-map-js": "^1.2.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/compiler-ssr": {
|
||||
"version": "3.4.31",
|
||||
"resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.4.31.tgz",
|
||||
"integrity": "sha512-RtefmITAje3fJ8FSg1gwgDhdKhZVntIVbwupdyZDSifZTRMiWxWehAOTCc8/KZDnBOcYQ4/9VWxsTbd3wT0hAA==",
|
||||
"version": "3.4.33",
|
||||
"resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.4.33.tgz",
|
||||
"integrity": "sha512-0WveC9Ai+eT/1b6LCV5IfsufBZ0HP7pSSTdDjcuW302tTEgoBw8rHVHKPbGUtzGReUFCRXbv6zQDDgucnV2WzQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@vue/compiler-dom": "3.4.31",
|
||||
"@vue/shared": "3.4.31"
|
||||
"@vue/compiler-dom": "3.4.33",
|
||||
"@vue/shared": "3.4.33"
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/devtools-api": {
|
||||
@@ -1552,49 +1557,54 @@
|
||||
"integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q=="
|
||||
},
|
||||
"node_modules/@vue/reactivity": {
|
||||
"version": "3.4.31",
|
||||
"resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.4.31.tgz",
|
||||
"integrity": "sha512-VGkTani8SOoVkZNds1PfJ/T1SlAIOf8E58PGAhIOUDYPC4GAmFA2u/E14TDAFcf3vVDKunc4QqCe/SHr8xC65Q==",
|
||||
"version": "3.4.33",
|
||||
"resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.4.33.tgz",
|
||||
"integrity": "sha512-B24QIelahDbyHipBgbUItQblbd4w5HpG3KccL+YkGyo3maXyS253FzcTR3pSz739OTphmzlxP7JxEMWBpewilA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@vue/shared": "3.4.31"
|
||||
"@vue/shared": "3.4.33"
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/runtime-core": {
|
||||
"version": "3.4.31",
|
||||
"resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.4.31.tgz",
|
||||
"integrity": "sha512-LDkztxeUPazxG/p8c5JDDKPfkCDBkkiNLVNf7XZIUnJ+66GVGkP+TIh34+8LtPisZ+HMWl2zqhIw0xN5MwU1cw==",
|
||||
"version": "3.4.33",
|
||||
"resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.4.33.tgz",
|
||||
"integrity": "sha512-6wavthExzT4iAxpe8q37/rDmf44nyOJGISJPxCi9YsQO+8w9v0gLCFLfH5TzD1V1AYrTAdiF4Y1cgUmP68jP6w==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@vue/reactivity": "3.4.31",
|
||||
"@vue/shared": "3.4.31"
|
||||
"@vue/reactivity": "3.4.33",
|
||||
"@vue/shared": "3.4.33"
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/runtime-dom": {
|
||||
"version": "3.4.31",
|
||||
"resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.4.31.tgz",
|
||||
"integrity": "sha512-2Auws3mB7+lHhTFCg8E9ZWopA6Q6L455EcU7bzcQ4x6Dn4cCPuqj6S2oBZgN2a8vJRS/LSYYxwFFq2Hlx3Fsaw==",
|
||||
"version": "3.4.33",
|
||||
"resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.4.33.tgz",
|
||||
"integrity": "sha512-iHsMCUSFJ+4z432Bn9kZzHX+zOXa6+iw36DaVRmKYZpPt9jW9riF32SxNwB124i61kp9+AZtheQ/mKoJLerAaQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@vue/reactivity": "3.4.31",
|
||||
"@vue/runtime-core": "3.4.31",
|
||||
"@vue/shared": "3.4.31",
|
||||
"@vue/reactivity": "3.4.33",
|
||||
"@vue/runtime-core": "3.4.33",
|
||||
"@vue/shared": "3.4.33",
|
||||
"csstype": "^3.1.3"
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/server-renderer": {
|
||||
"version": "3.4.31",
|
||||
"resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.4.31.tgz",
|
||||
"integrity": "sha512-D5BLbdvrlR9PE3by9GaUp1gQXlCNadIZytMIb8H2h3FMWJd4oUfkUTEH2wAr3qxoRz25uxbTcbqd3WKlm9EHQA==",
|
||||
"version": "3.4.33",
|
||||
"resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.4.33.tgz",
|
||||
"integrity": "sha512-jTH0d6gQcaYideFP/k0WdEu8PpRS9MF8d0b6SfZzNi+ap972pZ0TNIeTaESwdOtdY0XPVj54XEJ6K0wXxir4fw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@vue/compiler-ssr": "3.4.31",
|
||||
"@vue/shared": "3.4.31"
|
||||
"@vue/compiler-ssr": "3.4.33",
|
||||
"@vue/shared": "3.4.33"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"vue": "3.4.31"
|
||||
"vue": "3.4.33"
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/shared": {
|
||||
"version": "3.4.31",
|
||||
"resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.4.31.tgz",
|
||||
"integrity": "sha512-Yp3wtJk//8cO4NItOPpi3QkLExAr/aLBGZMmTtW9WpdwBCJpRM6zj9WgWktXAl8IDIozwNMByT45JP3tO3ACWA=="
|
||||
"version": "3.4.33",
|
||||
"resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.4.33.tgz",
|
||||
"integrity": "sha512-aoRY0jQk3A/cuvdkodTrM4NMfxco8n55eG4H7ML/CRy7OryHfiqvug4xrCBBMbbN+dvXAetDDwZW9DXWWjBntA==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@vueuse/core": {
|
||||
"version": "10.10.0",
|
||||
@@ -2318,7 +2328,8 @@
|
||||
"node_modules/csstype": {
|
||||
"version": "3.1.3",
|
||||
"resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz",
|
||||
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
|
||||
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/dayjs": {
|
||||
"version": "1.11.8",
|
||||
@@ -2431,6 +2442,7 @@
|
||||
"version": "4.5.0",
|
||||
"resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
|
||||
"integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
|
||||
"license": "BSD-2-Clause",
|
||||
"engines": {
|
||||
"node": ">=0.12"
|
||||
},
|
||||
@@ -2784,7 +2796,8 @@
|
||||
"node_modules/estree-walker": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz",
|
||||
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
|
||||
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/esutils": {
|
||||
"version": "2.0.3",
|
||||
@@ -3572,9 +3585,10 @@
|
||||
}
|
||||
},
|
||||
"node_modules/mammoth": {
|
||||
"version": "1.7.2",
|
||||
"resolved": "https://registry.npmmirror.com/mammoth/-/mammoth-1.7.2.tgz",
|
||||
"integrity": "sha512-MqWU2hcLf1I5QMKyAbfJCvrLxnv5WztrAQyorfZ+WPq7Hk82vZFmvfR2/64ajIPpM4jlq0TXp1xZvp/FFaL1Ug==",
|
||||
"version": "1.8.0",
|
||||
"resolved": "https://registry.npmmirror.com/mammoth/-/mammoth-1.8.0.tgz",
|
||||
"integrity": "sha512-pJNfxSk9IEGVpau+tsZFz22ofjUsl2mnA5eT8PjPs2n0BP+rhVte4Nez6FdgEuxv3IGI3afiV46ImKqTGDVlbA==",
|
||||
"license": "BSD-2-Clause",
|
||||
"dependencies": {
|
||||
"@xmldom/xmldom": "^0.8.6",
|
||||
"argparse": "~1.0.3",
|
||||
@@ -3939,9 +3953,10 @@
|
||||
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
|
||||
},
|
||||
"node_modules/picocolors": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz",
|
||||
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.1.tgz",
|
||||
"integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==",
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/picomatch": {
|
||||
"version": "2.3.1",
|
||||
@@ -4021,9 +4036,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/postcss": {
|
||||
"version": "8.4.38",
|
||||
"resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.38.tgz",
|
||||
"integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==",
|
||||
"version": "8.4.39",
|
||||
"resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.39.tgz",
|
||||
"integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "opencollective",
|
||||
@@ -4038,9 +4053,10 @@
|
||||
"url": "https://github.com/sponsors/ai"
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"nanoid": "^3.3.7",
|
||||
"picocolors": "^1.0.0",
|
||||
"picocolors": "^1.0.1",
|
||||
"source-map-js": "^1.2.0"
|
||||
},
|
||||
"engines": {
|
||||
@@ -4810,6 +4826,20 @@
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/typescript": {
|
||||
"version": "5.5.3",
|
||||
"resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.5.3.tgz",
|
||||
"integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==",
|
||||
"devOptional": true,
|
||||
"license": "Apache-2.0",
|
||||
"bin": {
|
||||
"tsc": "bin/tsc",
|
||||
"tsserver": "bin/tsserver"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14.17"
|
||||
}
|
||||
},
|
||||
"node_modules/underscore": {
|
||||
"version": "1.13.6",
|
||||
"resolved": "https://registry.npmmirror.com/underscore/-/underscore-1.13.6.tgz",
|
||||
@@ -4852,13 +4882,14 @@
|
||||
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
|
||||
},
|
||||
"node_modules/vite": {
|
||||
"version": "5.3.2",
|
||||
"resolved": "https://registry.npmmirror.com/vite/-/vite-5.3.2.tgz",
|
||||
"integrity": "sha512-6lA7OBHBlXUxiJxbO5aAY2fsHHzDr1q7DvXYnyZycRs2Dz+dXBWuhpWHvmljTRTpQC2uvGmUFFkSHF2vGo90MA==",
|
||||
"version": "5.3.4",
|
||||
"resolved": "https://registry.npmmirror.com/vite/-/vite-5.3.4.tgz",
|
||||
"integrity": "sha512-Cw+7zL3ZG9/NZBB8C+8QbQZmR54GwqIz+WMI4b3JgdYJvX+ny9AjJXqkGQlDXSXRP9rP0B4tbciRMOVEKulVOA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"esbuild": "^0.21.3",
|
||||
"postcss": "^8.4.38",
|
||||
"postcss": "^8.4.39",
|
||||
"rollup": "^4.13.0"
|
||||
},
|
||||
"bin": {
|
||||
@@ -4907,15 +4938,16 @@
|
||||
}
|
||||
},
|
||||
"node_modules/vue": {
|
||||
"version": "3.4.31",
|
||||
"resolved": "https://registry.npmmirror.com/vue/-/vue-3.4.31.tgz",
|
||||
"integrity": "sha512-njqRrOy7W3YLAlVqSKpBebtZpDVg21FPoaq1I7f/+qqBThK9ChAIjkRWgeP6Eat+8C+iia4P3OYqpATP21BCoQ==",
|
||||
"version": "3.4.33",
|
||||
"resolved": "https://registry.npmmirror.com/vue/-/vue-3.4.33.tgz",
|
||||
"integrity": "sha512-VdMCWQOummbhctl4QFMcW6eNtXHsFyDlX60O/tsSQuCcuDOnJ1qPOhhVla65Niece7xq/P2zyZReIO5mP+LGTQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@vue/compiler-dom": "3.4.31",
|
||||
"@vue/compiler-sfc": "3.4.31",
|
||||
"@vue/runtime-dom": "3.4.31",
|
||||
"@vue/server-renderer": "3.4.31",
|
||||
"@vue/shared": "3.4.31"
|
||||
"@vue/compiler-dom": "3.4.33",
|
||||
"@vue/compiler-sfc": "3.4.33",
|
||||
"@vue/runtime-dom": "3.4.33",
|
||||
"@vue/server-renderer": "3.4.33",
|
||||
"@vue/shared": "3.4.33"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"typescript": "*"
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
"echarts": "^5.4.2",
|
||||
"file2md5": "^1.3.0",
|
||||
"lodash": "^4.17.21",
|
||||
"mammoth": "^1.7.2",
|
||||
"mammoth": "^1.8.0",
|
||||
"mitt": "^3.0.0",
|
||||
"monaco-editor": "^0.33.0",
|
||||
"nprogress": "^0.2.0",
|
||||
@@ -31,7 +31,7 @@
|
||||
"qs": "^6.11.2",
|
||||
"sortablejs": "^1.15.0",
|
||||
"tinymce": "^6.8.3",
|
||||
"vue": "^3.4.31",
|
||||
"vue": "^3.4.33",
|
||||
"vue-clipboard3": "^2.0.0",
|
||||
"vue-color-kit": "^1.0.5",
|
||||
"vue-echarts": "^6.5.5",
|
||||
@@ -57,6 +57,7 @@
|
||||
"postcss": "^8.4.38",
|
||||
"prettier": "^2.8.8",
|
||||
"tailwindcss": "^3.3.2",
|
||||
"vite": "^5.3.2"
|
||||
"typescript": "^5.5.3",
|
||||
"vite": "^5.3.4"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -83,5 +83,18 @@ export default {
|
||||
id: projectId
|
||||
}
|
||||
})
|
||||
},
|
||||
/**
|
||||
* 根据项目id查询项目->查看全部时间
|
||||
* @returns 返回看板所有信息
|
||||
*/
|
||||
getDocumentTimeShow(projectId) {
|
||||
return request({
|
||||
url: `/testmanage/project/document_time_show`,
|
||||
method: "get",
|
||||
params: {
|
||||
id: projectId
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +1,3 @@
|
||||
<!--
|
||||
- MineAdmin is committed to providing solutions for quickly building web applications
|
||||
- Please view the LICENSE file that was distributed with this source code,
|
||||
- For the full copyright and license information.
|
||||
- Thank you very much for using MineAdmin.
|
||||
-
|
||||
- @Author X.Mo<root@imoi.cn>
|
||||
- @Link https://gitee.com/xmo/mineadmin-vue
|
||||
-->
|
||||
<template>
|
||||
<a-input
|
||||
v-model="value"
|
||||
|
||||
@@ -13,12 +13,9 @@
|
||||
{{ prop.title }}
|
||||
</template>
|
||||
<slot name="body"></slot>
|
||||
<ma-form
|
||||
ref="maFormRef"
|
||||
:columns="prop.column"
|
||||
v-model="form"
|
||||
:options="{ ...options, showButtons: false }"
|
||||
></ma-form>
|
||||
<ma-form ref="maFormRef" :columns="prop.column" v-model="form" :options="{ ...options, showButtons: false }">
|
||||
<template #[`inputPrepend-version`]>V </template>
|
||||
</ma-form>
|
||||
</a-modal>
|
||||
</template>
|
||||
|
||||
|
||||
@@ -1,12 +1,3 @@
|
||||
<!--
|
||||
- MineAdmin is committed to providing solutions for quickly building web applications
|
||||
- Please view the LICENSE file that was distributed with this source code,
|
||||
- For the full copyright and license information.
|
||||
- Thank you very much for using MineAdmin.
|
||||
-
|
||||
- @Author X.Mo<root@imoi.cn>
|
||||
- @Link https://gitee.com/xmo/mineadmin-vue
|
||||
-->
|
||||
<template>
|
||||
<ma-form-item
|
||||
v-if="typeof props.component.display == 'undefined' || props.component.display === true"
|
||||
|
||||
@@ -1,12 +1,3 @@
|
||||
<!--
|
||||
- MineAdmin is committed to providing solutions for quickly building web applications
|
||||
- Please view the LICENSE file that was distributed with this source code,
|
||||
- For the full copyright and license information.
|
||||
- Thank you very much for using MineAdmin.
|
||||
-
|
||||
- @Author X.Mo<root@imoi.cn>
|
||||
- @Link https://gitee.com/xmo/mineadmin-vue
|
||||
-->
|
||||
<template>
|
||||
<ma-form-item
|
||||
v-if="typeof props.component.display == 'undefined' || props.component.display === true"
|
||||
|
||||
@@ -1,12 +1,3 @@
|
||||
<!--
|
||||
- MineAdmin is committed to providing solutions for quickly building web applications
|
||||
- Please view the LICENSE file that was distributed with this source code,
|
||||
- For the full copyright and license information.
|
||||
- Thank you very much for using MineAdmin.
|
||||
-
|
||||
- @Author X.Mo<root@imoi.cn>
|
||||
- @Link https://gitee.com/xmo/mineadmin-vue
|
||||
-->
|
||||
<template>
|
||||
<ma-form-item
|
||||
v-if="typeof props.component.display == 'undefined' || props.component.display === true"
|
||||
|
||||
@@ -1,12 +1,3 @@
|
||||
<!--
|
||||
- MineAdmin is committed to providing solutions for quickly building web applications
|
||||
- Please view the LICENSE file that was distributed with this source code,
|
||||
- For the full copyright and license information.
|
||||
- Thank you very much for using MineAdmin.
|
||||
-
|
||||
- @Author X.Mo<root@imoi.cn>
|
||||
- @Link https://gitee.com/xmo/mineadmin-vue
|
||||
-->
|
||||
<template>
|
||||
<div class="ma-content-block">
|
||||
<a-space class="flex">
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<div class="mt-2">页面未找到,请返回</div>
|
||||
</div>
|
||||
<div class="mt-5">
|
||||
<a-button type="primary" @click="$router.push({ name: 'Workplace' })">返回第一个有权限页面</a-button>
|
||||
<a-button type="primary" @click="$router.push({ name: 'workplace' })">返回第一个有权限页面</a-button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -87,13 +87,13 @@
|
||||
</a-space>
|
||||
</a-doption>
|
||||
<a-doption>
|
||||
<a-space @click="$router.push({ name: 'Usercenter' })">
|
||||
<a-space @click="$router.push({ name: 'usercenter' })">
|
||||
<icon-user />
|
||||
<span> 用户中心 </span>
|
||||
</a-space>
|
||||
</a-doption>
|
||||
<a-doption>
|
||||
<a-space @click="$router.push({ name: 'Usercenter' })">
|
||||
<a-space @click="$router.push({ name: 'usercenter' })">
|
||||
<icon-settings />
|
||||
<span> 用户设置 </span>
|
||||
</a-space>
|
||||
@@ -169,7 +169,7 @@ const handleLogout = () => {
|
||||
const toggleDrawerMenu = inject("toggleDrawerMenu")
|
||||
// 点击图标返回首页
|
||||
const handleClickLogo = () => {
|
||||
router.push({ name: "Workplace" })
|
||||
router.push({ name: "workplace" })
|
||||
}
|
||||
|
||||
// 测试生成文档-测试项和方法
|
||||
|
||||
@@ -310,7 +310,7 @@ const handleCopyNode = async () => {
|
||||
/// 进度条变量
|
||||
const visible = ref(false)
|
||||
const isComplete = ref(false)
|
||||
const ptext = ref("第二轮数据")
|
||||
const ptext = ref("轮次数据")
|
||||
const handleModalConfirmClick = () => {
|
||||
visible.value = false
|
||||
}
|
||||
@@ -367,7 +367,7 @@ const handleSoDutSubmit = async (data) => {
|
||||
// ~~~~定义弹出a-form-modal的cancel方法-返回false则无法关闭弹窗~~~~
|
||||
const handleSoDutCancel = () => {
|
||||
Notification.error("必须按要求添加源代码信息,返回项目列表页面!")
|
||||
router.replace({ name: "Projmanage" })
|
||||
router.replace({ name: "projmanage" })
|
||||
}
|
||||
// 初始化树状数据
|
||||
// so_dut弹窗ref对象
|
||||
@@ -766,7 +766,8 @@ const soDutColumn = ref([
|
||||
title: "代码版本",
|
||||
dataIndex: "version",
|
||||
placeholder: "请输入代码版本,注意不要带V",
|
||||
rules: [{ required: true, message: "代码版本必填" }]
|
||||
rules: [{ required: true, message: "代码版本必填" }],
|
||||
openPrepend: true
|
||||
},
|
||||
{
|
||||
title: "用户标识",
|
||||
|
||||
@@ -14,9 +14,9 @@ export const NOT_FOUND = {
|
||||
name: "notFound"
|
||||
}
|
||||
|
||||
export const REDIRECT_ROUTE_NAME = "Redirect"
|
||||
export const REDIRECT_ROUTE_NAME = "redirect"
|
||||
|
||||
export const DEFAULT_ROUTE_NAME = "Workplace"
|
||||
export const DEFAULT_ROUTE_NAME = "workplace"
|
||||
|
||||
/**
|
||||
* @description: 默认路由对象没有component,固定在router/constants.js文件查看
|
||||
|
||||
@@ -14,7 +14,7 @@ const DASHBOARD = {
|
||||
children: [
|
||||
{
|
||||
path: "workplace",
|
||||
name: "Workplace",
|
||||
name: "workplace",
|
||||
component: () => import("@/views/dashboard/workplace/index.vue"),
|
||||
meta: {
|
||||
requiresAuth: true,
|
||||
@@ -26,9 +26,10 @@ const DASHBOARD = {
|
||||
},
|
||||
{
|
||||
path: "usercenter",
|
||||
name: "Usercenter",
|
||||
name: "usercenter",
|
||||
component: () => import("@/views/dashboard/usercenter/index.vue"),
|
||||
meta: {
|
||||
ignoreCache: false,
|
||||
requiresAuth: true,
|
||||
roles: ["*"],
|
||||
locale: "用户中心",
|
||||
@@ -38,7 +39,7 @@ const DASHBOARD = {
|
||||
},
|
||||
{
|
||||
path: "usermanage",
|
||||
name: "Usermanage",
|
||||
name: "usermanage",
|
||||
component: () => import("@/views/dashboard/usermanage/index.vue"),
|
||||
meta: {
|
||||
requiresAuth: true,
|
||||
|
||||
@@ -2,7 +2,7 @@ import { DEFAULT_LAYOUT } from "../base"
|
||||
|
||||
const DATAMANAGE = {
|
||||
path: "/datamanage",
|
||||
name: "Datamanage",
|
||||
name: "datamanage",
|
||||
component: DEFAULT_LAYOUT, // () => import("@/layout/default-layout.vue")
|
||||
meta: {
|
||||
requiresAuth: true,
|
||||
@@ -14,7 +14,7 @@ const DATAMANAGE = {
|
||||
children: [
|
||||
{
|
||||
path: "dictmanage",
|
||||
name: "Dictmanage",
|
||||
name: "dictmanage",
|
||||
component: () => import("@/views/datamanage/dictmanage/index.vue"),
|
||||
meta: {
|
||||
requiresAuth: true,
|
||||
@@ -26,7 +26,7 @@ const DATAMANAGE = {
|
||||
},
|
||||
{
|
||||
path: "projContact",
|
||||
name: "ProjContact",
|
||||
name: "projContact",
|
||||
component: () => import("@/views/datamanage/projContact/index.vue"),
|
||||
meta: {
|
||||
requiresAuth: true,
|
||||
|
||||
@@ -2,7 +2,7 @@ import { DEFAULT_LAYOUT } from "../base"
|
||||
|
||||
const TESTMANAGE = {
|
||||
path: "/monitor",
|
||||
name: "Monitor",
|
||||
name: "monitor",
|
||||
component: DEFAULT_LAYOUT, // () => import("@/layout/default-layout.vue")
|
||||
meta: {
|
||||
requiresAuth: true,
|
||||
|
||||
@@ -2,7 +2,7 @@ import { DEFAULT_LAYOUT } from "../base"
|
||||
|
||||
const TESTMANAGE = {
|
||||
path: "/testmanage",
|
||||
name: "Testmanage",
|
||||
name: "testmanage",
|
||||
component: DEFAULT_LAYOUT, // () => import("@/layout/default-layout.vue")
|
||||
meta: {
|
||||
requiresAuth: true,
|
||||
@@ -14,7 +14,7 @@ const TESTMANAGE = {
|
||||
children: [
|
||||
{
|
||||
path: "projmanage",
|
||||
name: "Projmanage",
|
||||
name: "projmanage",
|
||||
component: () => import("@/views/testmanage/projmanage/index.vue"),
|
||||
meta: {
|
||||
requiresAuth: true,
|
||||
|
||||
@@ -14,6 +14,7 @@ const formatTag = (route) => {
|
||||
const BAN_LIST = [REDIRECT_ROUTE_NAME]
|
||||
const useTabBarStore = defineStore("tabBar", {
|
||||
state: () => ({
|
||||
// 修改:添加"用户中心到缓存"
|
||||
cacheTabList: new Set([DEFAULT_ROUTE_NAME]),
|
||||
tagList: [DEFAULT_ROUTE]
|
||||
}),
|
||||
|
||||
@@ -12,7 +12,6 @@ const useUserStore = defineStore("user", {
|
||||
job: undefined,
|
||||
organization: undefined,
|
||||
location: undefined,
|
||||
email: undefined,
|
||||
introduction: undefined,
|
||||
personalWebsite: undefined,
|
||||
jobName: undefined,
|
||||
|
||||
@@ -4,7 +4,11 @@
|
||||
label="旧密码"
|
||||
field="oldPassword"
|
||||
label-col-flex="80px"
|
||||
:rules="[{ required: true, message: '旧密码必填' }]"
|
||||
:rules="[
|
||||
{ required: true, message: '旧密码必填' },
|
||||
{ minLength: 6, message: '密码长度至少6位' },
|
||||
{ maxLength: 18, message: '密码最长18位' }
|
||||
]"
|
||||
>
|
||||
<a-input-password v-model="password.oldPassword" allow-clear autocomplete="off" />
|
||||
</a-form-item>
|
||||
@@ -12,7 +16,11 @@
|
||||
label="新密码"
|
||||
field="newPassword"
|
||||
label-col-flex="80px"
|
||||
:rules="[{ required: true, message: '新密码必填' }]"
|
||||
:rules="[
|
||||
{ required: true, message: '新密码必填' },
|
||||
{ minLength: 6, message: '密码长度至少6位' },
|
||||
{ maxLength: 18, message: '密码最长18位' }
|
||||
]"
|
||||
>
|
||||
<a-input-password
|
||||
v-model="password.newPassword"
|
||||
@@ -69,14 +77,13 @@ const modifyPassword = async (data) => {
|
||||
Message.error("确认密码与新密码不一致")
|
||||
return
|
||||
}
|
||||
Message.error("由于采用LDAP认证,请联系内网管理员修改!")
|
||||
// const response = await user.modifyPassword(data.values)
|
||||
// if (response.success) {
|
||||
// tool.local.clear()
|
||||
// visible.value = true
|
||||
// } else {
|
||||
// Message.error(response.message)
|
||||
// }
|
||||
const response = await user.modifyPassword(data.values)
|
||||
if (response.success) {
|
||||
tool.local.clear()
|
||||
visible.value = true
|
||||
} else {
|
||||
Message.error(response.message)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -9,9 +9,6 @@
|
||||
<a-form-item label="手机" label-col-flex="80px">
|
||||
<a-input v-model="userInfo.phone" allow-clear />
|
||||
</a-form-item>
|
||||
<a-form-item label="邮箱" label-col-flex="80px">
|
||||
<a-input v-model="userInfo.email" allow-clear />
|
||||
</a-form-item>
|
||||
<a-form-item label="个人签名" label-col-flex="80px">
|
||||
<a-textarea v-model="userInfo.introduction" :max-length="255" class="h-28" show-word-limit allow-clear />
|
||||
</a-form-item>
|
||||
@@ -21,7 +18,7 @@
|
||||
</a-form>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
<script setup lang="ts">
|
||||
import { reactive } from "vue"
|
||||
import { useUserStore } from "@/store"
|
||||
import { Message } from "@arco-design/web-vue"
|
||||
@@ -32,9 +29,7 @@ const userInfo = reactive({
|
||||
...userStore.$state
|
||||
})
|
||||
|
||||
const modifyInfo = async (data) => {
|
||||
// 注意要用values
|
||||
console.log(data.values)
|
||||
Message.error("由于采用LDAP登录无法修改!")
|
||||
const modifyInfo = async (data: any) => {
|
||||
Message.warning("请联系内网管理员进行修改")
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -82,6 +82,11 @@ const operationLogList = computed(() => {
|
||||
return item
|
||||
})
|
||||
})
|
||||
|
||||
// 组件命名
|
||||
defineOptions({
|
||||
name: "usercenter"
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
<template #status="{ record }">
|
||||
<a-switch
|
||||
:checked-value="1"
|
||||
unchecked-value="2"
|
||||
@change="changeStatus($event, record.id)"
|
||||
:unchecked-value="2"
|
||||
:before-change="changeStatusWrapper(record)"
|
||||
:default-checked="record.status == 1"
|
||||
></a-switch>
|
||||
</template>
|
||||
@@ -22,11 +22,13 @@ import userApi from "@/api/system/user"
|
||||
import user from "@/api/system/user"
|
||||
import { Message } from "@arco-design/web-vue"
|
||||
// 切换状态按钮
|
||||
const changeStatus = async (e, id) => {
|
||||
const res = await userApi.changeUserStatus({ user_status: e, userId: id })
|
||||
const changeStatusWrapper = (record) => {
|
||||
return async function (newVal) {
|
||||
const res = await userApi.changeUserStatus({ user_status: newVal, userId: record.id })
|
||||
if (res.data) {
|
||||
Message.success(res.data === "1" ? "启用成功" : "禁用成功")
|
||||
}
|
||||
}
|
||||
}
|
||||
// crud组件
|
||||
const crudRef = ref()
|
||||
@@ -104,13 +106,6 @@ const crudColumns = reactive([
|
||||
search: true,
|
||||
commonRules: [{ match: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "请输入正确的手机号码" }]
|
||||
},
|
||||
{
|
||||
title: "邮箱",
|
||||
align: "center",
|
||||
dataIndex: "email",
|
||||
width: 100,
|
||||
commonRules: [{ type: "email", message: "请输入正确的邮箱" }]
|
||||
},
|
||||
{
|
||||
title: "密码",
|
||||
dataIndex: "password",
|
||||
@@ -145,6 +140,10 @@ const crudColumns = reactive([
|
||||
formType: "range"
|
||||
}
|
||||
])
|
||||
|
||||
defineOptions({
|
||||
name: "usermanage"
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped></style>
|
||||
|
||||
@@ -6,6 +6,10 @@
|
||||
|
||||
<script setup>
|
||||
import Statistics from "./components/statistics.vue"
|
||||
|
||||
defineOptions({
|
||||
name: "workplace"
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped></style>
|
||||
|
||||
@@ -46,6 +46,10 @@ const crudColumns = ref([
|
||||
commonRules: [{ required: true, message: "全称和描述必填" }]
|
||||
}
|
||||
])
|
||||
|
||||
defineOptions({
|
||||
name: "abbreviation"
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped></style>
|
||||
|
||||
@@ -61,7 +61,7 @@ const crudOptions = ref({
|
||||
searchColNumber: 4,
|
||||
tablePagination: false,
|
||||
operationColumn: true,
|
||||
showTools:false,
|
||||
showTools: false
|
||||
})
|
||||
|
||||
const crudColumns = ref([
|
||||
@@ -108,8 +108,12 @@ const crudColumns = ref([
|
||||
search: true,
|
||||
formType: "range",
|
||||
width: 180
|
||||
},
|
||||
}
|
||||
])
|
||||
|
||||
defineOptions({
|
||||
name: "dictmanage"
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped></style>
|
||||
|
||||
@@ -30,21 +30,28 @@ const crudOptions = ref({
|
||||
})
|
||||
const crudColumns = ref([
|
||||
{ title: "ID", dataIndex: "id", addDisplay: false, editDisplay: false, width: 50, hide: true },
|
||||
{ title: "公司编号", align: "center", dataIndex: "key", search: true, width: 220, formType: "input-number" },
|
||||
{ title: "公司编号", align: "center", dataIndex: "key", search: true, width: 70, formType: "input-number" },
|
||||
{
|
||||
title: "名称",
|
||||
align: "center",
|
||||
dataIndex: "name",
|
||||
search: true,
|
||||
width: 220,
|
||||
width: 150,
|
||||
commonRules: [{ required: true, message: "名称必填" }]
|
||||
},
|
||||
{
|
||||
title: "简称",
|
||||
align: "center",
|
||||
dataIndex: "refer_name",
|
||||
search: true,
|
||||
commonRules: [{ required: true, message: "简称必填" }]
|
||||
},
|
||||
{
|
||||
title: "法人",
|
||||
align: "center",
|
||||
dataIndex: "entrust_person",
|
||||
search: true,
|
||||
width: 220,
|
||||
width: 90,
|
||||
commonRules: [{ required: true, message: "法人必填" }]
|
||||
},
|
||||
{
|
||||
@@ -52,7 +59,7 @@ const crudColumns = ref([
|
||||
align: "center",
|
||||
dataIndex: "addr",
|
||||
search: true,
|
||||
width: 200,
|
||||
width: 150,
|
||||
commonRules: [{ required: true, message: "公司地址必填" }]
|
||||
}
|
||||
])
|
||||
|
||||
@@ -89,8 +89,8 @@ const router = useRouter()
|
||||
const route = useRoute()
|
||||
const userStore = useUserStore()
|
||||
// 绑定登录form的数据
|
||||
const form = reactive({ username: "superAdmin", password: "admin123", code: "" })
|
||||
// const form = reactive({ username: "", password: "", code: "" })
|
||||
// const form = reactive({ username: "superAdmin", password: "admin123", code: "" })
|
||||
const form = reactive({ username: "", password: "", code: "" })
|
||||
// 获取验证码dom && arco表单loading
|
||||
const Verify = ref(null)
|
||||
const loading = ref(null)
|
||||
@@ -108,7 +108,7 @@ const handleSubmit = async ({ values, errors }) => {
|
||||
if (login_res) {
|
||||
const { redirect, ...otherQuery } = router.currentRoute.value.query
|
||||
router.push({
|
||||
name: redirect || "Workplace",
|
||||
name: redirect || "workplace",
|
||||
query: {
|
||||
...otherQuery // 将退出时的查询参数放入,这样就不会错误
|
||||
}
|
||||
|
||||
@@ -81,6 +81,10 @@ const crudColumns = ref([
|
||||
editDisplay: false
|
||||
}
|
||||
])
|
||||
|
||||
defineOptions({
|
||||
name: "loginLog"
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped></style>
|
||||
|
||||
@@ -50,6 +50,10 @@ const handleDeleteAllLogButton = async () => {
|
||||
crudRef.value.refresh()
|
||||
Message.success(res.message)
|
||||
}
|
||||
|
||||
defineOptions({
|
||||
name: "operationLog"
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped></style>
|
||||
|
||||
@@ -85,6 +85,10 @@ const crudColumns = ref([
|
||||
{ title: "请求参数", dataIndex: "request_body", hide: true, formType: "textarea" },
|
||||
{ title: "返回信息", dataIndex: "json_result", hide: true, formType: "textarea" }
|
||||
])
|
||||
|
||||
defineOptions({
|
||||
name: "operations"
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped></style>
|
||||
|
||||
@@ -84,7 +84,6 @@ const handleRelatedChange = async (record) => {
|
||||
}
|
||||
}
|
||||
loading.value = false
|
||||
// 更新树状目录中,case显示“<”“@”“X”的更新
|
||||
treeStore.updateCaseTreeData(res.data, route.query.id)
|
||||
emits("relatedOrunrelated")
|
||||
}
|
||||
@@ -349,7 +348,7 @@ const columns = ref([
|
||||
{
|
||||
title: "问题描述",
|
||||
hide: true,
|
||||
search: true,
|
||||
search: false,
|
||||
dataIndex: "operation",
|
||||
formType: "editor"
|
||||
},
|
||||
@@ -391,14 +390,26 @@ const columns = ref([
|
||||
hide: true,
|
||||
formType: "select",
|
||||
commonRules: [{ required: true, message: "测试人员必填" }],
|
||||
dict: { url: "system/user/list", translation: true, props: { label: "name", value: "name" } }
|
||||
dict: {
|
||||
url: "system/user/list",
|
||||
params: { project_id: route.query.id },
|
||||
translation: true,
|
||||
props: { label: "name", value: "name" }
|
||||
}
|
||||
},
|
||||
{
|
||||
title: "悬挂状态",
|
||||
dataIndex: "hang",
|
||||
search: false,
|
||||
search: true,
|
||||
formType: "select",
|
||||
addDisplay: false,
|
||||
editDisplay: false,
|
||||
dict: {
|
||||
data: [
|
||||
{ label: "悬挂", value: "1" },
|
||||
{ label: "已有关联", value: "2" }
|
||||
]
|
||||
},
|
||||
align: "center",
|
||||
customRender: ({ record }) => {
|
||||
// 判断是否为悬挂状态record.hang[Boolean]
|
||||
@@ -452,7 +463,12 @@ const columns = ref([
|
||||
dataIndex: "verifyPerson",
|
||||
formType: "select",
|
||||
commonRules: [{ required: true, message: "回归人" }],
|
||||
dict: { url: "system/user/list", translation: true, props: { label: "name", value: "name" } }
|
||||
dict: {
|
||||
url: "system/user/list",
|
||||
params: { project_id: route.query.id },
|
||||
translation: true,
|
||||
props: { label: "name", value: "name" }
|
||||
}
|
||||
},
|
||||
{
|
||||
title: "回归日期",
|
||||
|
||||
229
cdTMP/src/views/project/case/components/ProblemForm.vue
Normal file
229
cdTMP/src/views/project/case/components/ProblemForm.vue
Normal file
@@ -0,0 +1,229 @@
|
||||
<template>
|
||||
<div class="problem-form-caintainer">
|
||||
<a-modal
|
||||
v-model:visible="visible"
|
||||
:on-before-ok="handleBeforeOk"
|
||||
ok-text="修改"
|
||||
cancel-text="关闭"
|
||||
width="950px"
|
||||
draggable
|
||||
>
|
||||
<template #title>{{ props.title }}</template>
|
||||
<ma-form v-model="form" :columns="columnsOptions" :options="options" ref="crudForm" />
|
||||
</a-modal>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive } from "vue"
|
||||
import { IProps } from "./problemFormTypes"
|
||||
import { useRoute } from "vue-router"
|
||||
import problemApi from "@/api/project/problem"
|
||||
import { Message } from "@arco-design/web-vue"
|
||||
const visible = ref<boolean>(false)
|
||||
const route = useRoute()
|
||||
const props = defineProps<IProps>()
|
||||
const handleBeforeOk = async () => {
|
||||
const validateRes = await crudForm.value.validateForm()
|
||||
if (validateRes) {
|
||||
return false
|
||||
}
|
||||
const res = await problemApi.update(form.value.id, { ...form.value, projectId: route.query.id })
|
||||
if (res.success) {
|
||||
Message.success("更新问题单成功")
|
||||
}
|
||||
}
|
||||
// 初始化ma-form
|
||||
const crudForm = ref<any>()
|
||||
const form = ref<any>({})
|
||||
const options = ref({
|
||||
showButtons: false,
|
||||
labelAlign: "center"
|
||||
})
|
||||
const columnsOptions = reactive([
|
||||
{
|
||||
formType: "grid-tailwind",
|
||||
customClass: [],
|
||||
colNumber: 2,
|
||||
cols: [
|
||||
{
|
||||
formList: [
|
||||
{
|
||||
title: "问题名称",
|
||||
dataIndex: "name",
|
||||
rules: [{ required: true, message: "名称是必填" }]
|
||||
},
|
||||
{
|
||||
title: "缺陷状态",
|
||||
dataIndex: "status",
|
||||
formType: "radio",
|
||||
rules: [{ required: true, message: "缺陷状态必填" }],
|
||||
dict: {
|
||||
name: "problemStatu",
|
||||
translation: true,
|
||||
props: { label: "title", value: "key" }
|
||||
}
|
||||
},
|
||||
{
|
||||
title: "缺陷等级",
|
||||
dataIndex: "grade",
|
||||
formType: "radio",
|
||||
rules: [{ required: true, message: "缺陷等级必填" }],
|
||||
dict: {
|
||||
name: "problemGrade",
|
||||
translation: true,
|
||||
props: { label: "title", value: "key" }
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
formList: [
|
||||
{
|
||||
title: "问题标识",
|
||||
dataIndex: "ident",
|
||||
disabled: true
|
||||
},
|
||||
{
|
||||
title: "闭环方式",
|
||||
dataIndex: "closeMethod",
|
||||
formType: "checkbox",
|
||||
dict: {
|
||||
name: "closeMethod",
|
||||
translation: true,
|
||||
props: { label: "title", value: "key" }
|
||||
}
|
||||
},
|
||||
{
|
||||
title: "缺陷类型",
|
||||
dataIndex: "type",
|
||||
rules: [{ required: true, message: "缺陷类型必填" }],
|
||||
formType: "radio",
|
||||
dict: {
|
||||
name: "problemType",
|
||||
translation: true,
|
||||
props: { label: "title", value: "key" }
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
title: "测试人员填写",
|
||||
formType: "divider"
|
||||
},
|
||||
{
|
||||
title: "问题描述",
|
||||
dataIndex: "operation",
|
||||
formType: "editor"
|
||||
},
|
||||
{
|
||||
title: "问题影响",
|
||||
dataIndex: "result",
|
||||
formType: "textarea"
|
||||
},
|
||||
{
|
||||
title: "研制方回复",
|
||||
formType: "divider"
|
||||
},
|
||||
{
|
||||
title: "原因分析",
|
||||
dataIndex: "analysis",
|
||||
formType: "editor"
|
||||
},
|
||||
{
|
||||
title: "影响域分析",
|
||||
dataIndex: "effect_scope",
|
||||
formType: "textarea"
|
||||
},
|
||||
{
|
||||
title: "改正措施",
|
||||
dataIndex: "solve",
|
||||
formType: "textarea"
|
||||
},
|
||||
{
|
||||
title: "回归填写",
|
||||
formType: "divider"
|
||||
},
|
||||
{
|
||||
title: "回归结果",
|
||||
dataIndex: "verify_result",
|
||||
formType: "editor"
|
||||
},
|
||||
{
|
||||
title: "人员信息",
|
||||
formType: "divider"
|
||||
},
|
||||
{
|
||||
formType: "grid-tailwind",
|
||||
customClass: [],
|
||||
colNumber: 2,
|
||||
cols: [
|
||||
{
|
||||
formList: [
|
||||
{
|
||||
title: "测试人员",
|
||||
dataIndex: "postPerson",
|
||||
formType: "select",
|
||||
rules: [{ required: true, message: "测试人员必填" }],
|
||||
dict: {
|
||||
url: "system/user/list",
|
||||
translation: true,
|
||||
params: { project_id: route.query.id },
|
||||
props: { label: "name", value: "name" }
|
||||
}
|
||||
},
|
||||
{
|
||||
title: "开发人员",
|
||||
dataIndex: "designerPerson",
|
||||
formType: "input",
|
||||
rules: [{ required: true, message: "开发人员必填" }]
|
||||
},
|
||||
{
|
||||
title: "回归人员",
|
||||
dataIndex: "verifyPerson",
|
||||
formType: "select",
|
||||
rules: [{ required: true, message: "回归人" }],
|
||||
dict: {
|
||||
url: "system/user/list",
|
||||
translation: true,
|
||||
params: { project_id: route.query.id },
|
||||
props: { label: "name", value: "name" }
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
formList: [
|
||||
{
|
||||
title: "测试日期",
|
||||
dataIndex: "postDate",
|
||||
formType: "date"
|
||||
},
|
||||
{
|
||||
title: "开发方日期",
|
||||
dataIndex: "designDate",
|
||||
formType: "date"
|
||||
},
|
||||
{
|
||||
title: "回归日期",
|
||||
dataIndex: "verifyDate",
|
||||
formType: "date"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
])
|
||||
|
||||
// 暴露属性和方法
|
||||
const open = (problem: object) => {
|
||||
visible.value = true
|
||||
// 打开时初始化表单
|
||||
form.value = problem
|
||||
}
|
||||
defineExpose({ open })
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped></style>
|
||||
@@ -0,0 +1,3 @@
|
||||
export interface IProps {
|
||||
title?: string
|
||||
}
|
||||
@@ -60,7 +60,7 @@ const crudOptions = ref({
|
||||
delete: { show: true, api: problemApi.delete },
|
||||
operationColumnAlign: "center", // 操作列居中
|
||||
// 列表选项卡配置
|
||||
tabs:{},
|
||||
tabs: {},
|
||||
beforeOpenAdd: function () {
|
||||
// 先判断是否已经有个问题单了,如果有则不让用户创建
|
||||
if (crudRef.value.getTableData().length >= 1) {
|
||||
@@ -108,7 +108,7 @@ const crudOptions = ref({
|
||||
},
|
||||
showIndex: false,
|
||||
showTools: false,
|
||||
operationColumnAlign:'center',
|
||||
operationColumnAlign: "center",
|
||||
rowSelection: { showCheckedAll: true },
|
||||
searchColNumber: 3,
|
||||
tablePagination: false,
|
||||
@@ -311,36 +311,42 @@ const crudColumns = ref([
|
||||
title: "问题描述",
|
||||
hide: true,
|
||||
search: true,
|
||||
align: "center",
|
||||
dataIndex: "operation",
|
||||
formType: "editor",
|
||||
formType: "editor"
|
||||
},
|
||||
{
|
||||
title: "问题影响",
|
||||
hide: true,
|
||||
align: "center",
|
||||
dataIndex: "result",
|
||||
formType: "textarea",
|
||||
formType: "textarea"
|
||||
},
|
||||
{
|
||||
title: "原因分析",
|
||||
hide: true,
|
||||
align: "center",
|
||||
dataIndex: "analysis",
|
||||
formType: "editor",
|
||||
formType: "editor"
|
||||
},
|
||||
{
|
||||
title: "影响域分析",
|
||||
hide: true,
|
||||
align: "center",
|
||||
dataIndex: "effect_scope",
|
||||
formType: "textarea",
|
||||
formType: "textarea"
|
||||
},
|
||||
{
|
||||
title: "改正措施",
|
||||
hide: true,
|
||||
align: "center",
|
||||
dataIndex: "solve",
|
||||
formType: "textarea"
|
||||
},
|
||||
{
|
||||
title: "回归结果",
|
||||
hide: true,
|
||||
align: "center",
|
||||
dataIndex: "verify_result",
|
||||
formType: "editor"
|
||||
},
|
||||
@@ -348,9 +354,15 @@ const crudColumns = ref([
|
||||
title: "测试人员",
|
||||
dataIndex: "postPerson",
|
||||
search: true,
|
||||
align: "center",
|
||||
formType: "select",
|
||||
commonRules: [{ required: true, message: "测试人员必填" }],
|
||||
dict: { url: "system/user/list", translation: true, props: { label: "name", value: "name" } }
|
||||
dict: {
|
||||
url: "system/user/list",
|
||||
params: { project_id: route.query.id },
|
||||
translation: true,
|
||||
props: { label: "name", value: "name" }
|
||||
}
|
||||
},
|
||||
{
|
||||
title: "测试日期",
|
||||
@@ -377,7 +389,12 @@ const crudColumns = ref([
|
||||
dataIndex: "verifyPerson",
|
||||
formType: "select",
|
||||
commonRules: [{ required: true, message: "提单人必填" }],
|
||||
dict: { url: "system/user/list", translation: true, props: { label: "name", value: "name" } }
|
||||
dict: {
|
||||
url: "system/user/list",
|
||||
params: { project_id: route.query.id },
|
||||
translation: true,
|
||||
props: { label: "name", value: "name" }
|
||||
}
|
||||
},
|
||||
{
|
||||
title: "回归日期",
|
||||
@@ -386,6 +403,10 @@ const crudColumns = ref([
|
||||
formType: "date"
|
||||
}
|
||||
])
|
||||
|
||||
defineOptions({
|
||||
name: "case"
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped></style>
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
关联测试项
|
||||
</a-button>
|
||||
</template>
|
||||
<!-- 版本字段的插槽 -->
|
||||
<template #inputPrepend-ident> XQ_XX_ </template>
|
||||
</ma-crud>
|
||||
</div>
|
||||
<!-- 关联的modal组件 -->
|
||||
@@ -41,7 +43,7 @@
|
||||
|
||||
<script setup>
|
||||
import { ref, computed } from "vue"
|
||||
import { useRoute, useRouter } from "vue-router"
|
||||
import { useRoute } from "vue-router"
|
||||
import testDemandApi from "@/api/project/testDemand"
|
||||
import { useTreeDataStore } from "@/store"
|
||||
import commonApi from "@/api/common"
|
||||
@@ -50,7 +52,6 @@ import { Message } from "@arco-design/web-vue"
|
||||
|
||||
const treeDataStore = useTreeDataStore()
|
||||
const route = useRoute()
|
||||
const router = useRouter()
|
||||
const crudRef = ref()
|
||||
// 根据传参获取key,分别为轮次、设计需求的key
|
||||
const roundNumber = route.query.key.split("-")[0]
|
||||
@@ -197,6 +198,7 @@ const crudOptions = ref({
|
||||
searchColNumber: 3,
|
||||
tablePagination: false,
|
||||
operationColumn: true,
|
||||
operationColumnAlign:'center',
|
||||
formOption: {
|
||||
width: 1200
|
||||
}
|
||||
@@ -205,7 +207,7 @@ const crudColumns = ref([
|
||||
{
|
||||
title: "ID",
|
||||
align: "center",
|
||||
width: 50,
|
||||
hide: true,
|
||||
dataIndex: "id"
|
||||
},
|
||||
{
|
||||
@@ -217,7 +219,8 @@ const crudColumns = ref([
|
||||
search: true,
|
||||
validateTrigger: "blur",
|
||||
placeholder: "请填写测试项的标识,注意标识不能重复",
|
||||
commonRules: [{ required: true, message: "测试项标识必填" }]
|
||||
commonRules: [{ required: true, message: "测试项标识必填" }],
|
||||
openPrepend: true
|
||||
},
|
||||
{
|
||||
title: "名称",
|
||||
@@ -262,7 +265,7 @@ const crudColumns = ref([
|
||||
return true
|
||||
}
|
||||
}
|
||||
},
|
||||
}
|
||||
},
|
||||
{
|
||||
title: "测试手段",
|
||||
@@ -339,6 +342,10 @@ const refreshCrudTable = () => {
|
||||
crudRef.value.refresh()
|
||||
}
|
||||
defineExpose({ refreshCrudTable })
|
||||
|
||||
defineOptions({
|
||||
name: "designDemand"
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped>
|
||||
|
||||
@@ -20,18 +20,12 @@
|
||||
@change="handleUploadChange"
|
||||
></a-upload>
|
||||
</div>
|
||||
<a-alert :style="{ margin: '10px 0' }" type="warning"
|
||||
>上传录入提示信息:硬性要求,本辅助程序根据GJB438C文档结构进行解析,要求:1.功能需求章节必须包含<span
|
||||
<a-alert :style="{ margin: '10px 0' }" type="warning">
|
||||
请去除需求规格说明文件中不必要的部分再来此处解析,注意:本系统不支持word中emf格式图片,如果使用了visio等图片请<span
|
||||
class="important-text"
|
||||
>“CSCI功能需求”</span
|
||||
>或<span class="important-text">“CSCI能力需求”</span>文字,且章节级别必须为<span class="important-text"
|
||||
>2级</span
|
||||
>; 2.外部接口章节必须包含<span class="important-text">“CSCI外部接口需求”</span
|
||||
>文字,且章节级别必须为<span class="important-text">2级</span
|
||||
>。暂时只能解析这两个章节,如果章节号有标识则使用<span class="important-text"
|
||||
>“(RQGN01-UART-ZRZL)”</span
|
||||
>或<span class="important-text">“(RQGN01-UART-XBRCV)”</span>包含在里面。</a-alert
|
||||
>在word变为普通图片上传</span
|
||||
>
|
||||
</a-alert>
|
||||
<div class="operation-container">
|
||||
<span :style="{ marginRight: '10px', fontWeight: 700 }">操作按钮:</span>
|
||||
<a-space>
|
||||
@@ -39,7 +33,7 @@
|
||||
<a-button type="outline" status="warning" @click="handleResetData">重置数据</a-button>
|
||||
</a-space>
|
||||
</div>
|
||||
<a-spin :loading="loading" tip="解析word完成,需要时间渲染HTML元素..." :style="{ width: '100%' }">
|
||||
<a-spin :loading="loading" tip="解析word完成,正在渲染界面..." :style="{ width: '100%' }">
|
||||
<div class="demand-container">
|
||||
<a-list :data="htmlData" :pagination-props="{ defaultPageSize: 15, total: htmlData.length }">
|
||||
<template #item="{ item, index }">
|
||||
@@ -117,6 +111,7 @@ import dictApi from "@/api/system/dict"
|
||||
import demandApi from "@/api/project/designDemand"
|
||||
import { useRoute, useRouter } from "vue-router"
|
||||
import { parseHtmlStringByDemandDut } from "@/views/project/dut/tools/parseHtmlString"
|
||||
import { HtmlParser } from "@/views/project/dut/tools/parser"
|
||||
import { useTreeDataStore } from "@/store"
|
||||
// 其他初始化数据
|
||||
const route = useRoute()
|
||||
@@ -169,8 +164,8 @@ const handleRquest = function (options) {
|
||||
// 已经上传到浏览器了,需要解析为列表
|
||||
onSuccess(1)
|
||||
const rawHtml = res.value
|
||||
const finalData = parseHtmlStringByDemandDut(rawHtml)
|
||||
// 将finalData赋值给响应式数据ref变量:htmlData
|
||||
const parser = new HtmlParser(rawHtml)
|
||||
const finalData = parser.parseToArray()
|
||||
htmlData.value = finalData
|
||||
// ~~~~使用nextTick:等待DOM更新完成~~~~
|
||||
nextTick(() => {
|
||||
|
||||
@@ -1,258 +0,0 @@
|
||||
<template>
|
||||
<div class="file-input-container">
|
||||
<a-modal
|
||||
v-model:visible="modalVisible"
|
||||
width="80%"
|
||||
title="设计需求批量写入"
|
||||
:unmount-on-close="true"
|
||||
:mask-closable="false"
|
||||
ok-text="录入"
|
||||
:esc-to-close="false"
|
||||
:on-before-ok="handleModalSubmit"
|
||||
>
|
||||
<div class="uploadContainer">
|
||||
<span :style="{ marginBottom: '10px', flex: '0 1 160px' }">上传设计需求.docx:</span>
|
||||
<a-upload
|
||||
:style="{ marginBottom: '10px' }"
|
||||
:custom-request="handleRquest"
|
||||
:limit="1"
|
||||
accept=".docx"
|
||||
@change="handleUploadChange"
|
||||
></a-upload>
|
||||
</div>
|
||||
<a-alert :style="{ margin: '10px 0' }" type="warning"
|
||||
>上传录入提示信息:硬性要求,本辅助程序根据GJB438C文档结构进行解析,要求:1.功能需求章节必须包含<span
|
||||
class="important-text"
|
||||
>“CSCI功能需求”</span
|
||||
>或<span class="important-text">“CSCI能力需求”</span>文字,且章节级别必须为<span class="important-text"
|
||||
>2级</span
|
||||
>; 2.外部接口章节必须包含<span class="important-text">“CSCI外部接口需求”</span
|
||||
>文字,且章节级别必须为<span class="important-text">2级</span
|
||||
>。暂时只能解析这两个章节,如果章节号有标识则使用<span class="important-text"
|
||||
>“(RQGN01-UART-ZRZL)”</span
|
||||
>或<span class="important-text">“(RQGN01-UART-XBRCV)”</span>包含在里面。</a-alert
|
||||
>
|
||||
<div class="operation-container">
|
||||
<span :style="{ marginRight: '10px', fontWeight: 700 }">操作按钮:</span>
|
||||
<a-space>
|
||||
<a-button type="primary" @click="handleCreateAtLatest">新增一条</a-button>
|
||||
<a-button type="outline" status="warning" @click="handleResetData">重置数据</a-button>
|
||||
</a-space>
|
||||
</div>
|
||||
<a-spin :loading="loading" tip="解析word完成,需要时间渲染HTML元素..." :style="{ width: '100%' }">
|
||||
<div class="demand-container">
|
||||
<Empty v-if="!htmlData.length"></Empty>
|
||||
<a-collapse show-expand-icon destroy-on-hide v-show="htmlData.length">
|
||||
<a-collapse-item v-for="(item, index) in htmlData" :key="index">
|
||||
<template #header>
|
||||
<a-input-group>
|
||||
<a-input
|
||||
placeholder="章节号"
|
||||
v-model="item.chapter"
|
||||
:style="{ width: '110px' }"
|
||||
@click.stop.prevent
|
||||
></a-input>
|
||||
<a-input
|
||||
placeholder="标题"
|
||||
v-model="item.title"
|
||||
:style="{ width: '300px' }"
|
||||
@click.stop.prevent
|
||||
></a-input>
|
||||
<a-input
|
||||
placeholder="标识"
|
||||
v-model="item.ident"
|
||||
:style="{ width: '200px' }"
|
||||
@click.stop.prevent
|
||||
></a-input>
|
||||
<a-select
|
||||
:style="{ width: '200px' }"
|
||||
placeholder="请选择设计需求类型"
|
||||
@click.stop.prevent
|
||||
v-model="item.demandType"
|
||||
>
|
||||
<a-option v-for="it in demandType" :value="it.key">{{ it.title }}</a-option>
|
||||
</a-select>
|
||||
</a-input-group>
|
||||
</template>
|
||||
<div class="content">
|
||||
<MaEditor v-model="item.content" />
|
||||
</div>
|
||||
<template #extra>
|
||||
<a-button-group>
|
||||
<a-button
|
||||
type="primary"
|
||||
status="success"
|
||||
size="mini"
|
||||
@click.stop.prevent="handledownCreate(index)"
|
||||
>
|
||||
+下方新增
|
||||
</a-button>
|
||||
<a-button
|
||||
type="primary"
|
||||
status="danger"
|
||||
size="mini"
|
||||
@click.stop.prevent="handleDelete(index)"
|
||||
>
|
||||
删除该条
|
||||
</a-button>
|
||||
</a-button-group>
|
||||
</template>
|
||||
</a-collapse-item>
|
||||
</a-collapse>
|
||||
</div>
|
||||
</a-spin>
|
||||
</a-modal>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, nextTick, watch } from "vue"
|
||||
import mammoth from "mammoth"
|
||||
import dictApi from "@/api/system/dict"
|
||||
import demandApi from "@/api/project/designDemand"
|
||||
import { useRoute, useRouter } from "vue-router"
|
||||
import { parseHtmlStringByDemandDut } from "@/views/project/dut/tools/parseHtmlString"
|
||||
import { useTreeDataStore } from "@/store"
|
||||
// 其他初始化数据
|
||||
const route = useRoute()
|
||||
const router = useRouter()
|
||||
const treeDataStore = useTreeDataStore()
|
||||
// ~导入editor组件~tinymce
|
||||
import MaEditor from "@/components/ma-editor/index.vue"
|
||||
import { Message } from "@arco-design/web-vue"
|
||||
// 单个设计需求录入模版
|
||||
const templateDemandObj = {
|
||||
chapter: "",
|
||||
title: "",
|
||||
ident: "",
|
||||
demandType: "",
|
||||
content: ""
|
||||
}
|
||||
// 先请求设计需求的dict,然后给demandType选项
|
||||
let demandType = []
|
||||
const getDictDemandType = async function () {
|
||||
const res = await dictApi.getDictByCode({ code: "demandType" })
|
||||
demandType = res.data
|
||||
}
|
||||
getDictDemandType()
|
||||
// 弹窗显示
|
||||
const modalVisible = ref(false)
|
||||
// 全部html数据-循环创建折叠项
|
||||
const htmlData = ref([])
|
||||
// 数据变化spin显示
|
||||
const loading = ref(false)
|
||||
// 当upload组件发生变化时候
|
||||
const handleUploadChange = (files) => {
|
||||
files.length ? (files.length = 1) : (htmlData.value = [])
|
||||
}
|
||||
// 上传行为函数
|
||||
const handleRquest = function (options) {
|
||||
const { onProgress, onError, onSuccess, fileItem } = options
|
||||
onProgress(0.1)
|
||||
// 让spin组件先转圈
|
||||
loading.value = true
|
||||
// 让Empty组件不显示
|
||||
htmlData.value.push(templateDemandObj)
|
||||
// 获取文件
|
||||
let reader = new FileReader()
|
||||
reader.readAsArrayBuffer(fileItem.file)
|
||||
reader.onload = function (loadEvent) {
|
||||
let arrayBuffer = loadEvent.target.result
|
||||
mammoth
|
||||
.convertToHtml({ arrayBuffer: arrayBuffer })
|
||||
.then((res) => {
|
||||
// 已经上传到浏览器了,需要解析为列表
|
||||
onSuccess(1)
|
||||
const rawHtml = res.value
|
||||
const finalData = parseHtmlStringByDemandDut(rawHtml)
|
||||
// 将finalData赋值给响应式数据ref变量:htmlData
|
||||
htmlData.value = finalData
|
||||
// ~~~~使用nextTick:等待DOM更新完成~~~~
|
||||
nextTick(() => {
|
||||
loading.value = false
|
||||
})
|
||||
})
|
||||
.catch(function (error) {
|
||||
console.log("处理错误导致失败,请检查前端代码")
|
||||
console.log("错误如下:", error)
|
||||
onError(error)
|
||||
})
|
||||
}
|
||||
}
|
||||
// 上方按钮:直接在最下新增一条
|
||||
const handleCreateAtLatest = () => {
|
||||
const newDemand = JSON.parse(JSON.stringify(templateDemandObj))
|
||||
htmlData.value.push(newDemand)
|
||||
}
|
||||
// 上方按钮:重置数据,点击页面不卡段
|
||||
const handleResetData = () => {
|
||||
htmlData.value = []
|
||||
}
|
||||
// 点击单条右侧按钮:下方新增 - 深拷贝,并插入到下方
|
||||
const handledownCreate = (index) => {
|
||||
const newDemand = JSON.parse(JSON.stringify(templateDemandObj))
|
||||
htmlData.value.splice(index + 1, 0, newDemand)
|
||||
}
|
||||
// 点击单条右侧按钮:删除
|
||||
const handleDelete = (index) => {
|
||||
htmlData.value.splice(index, 1)
|
||||
}
|
||||
// 打开弹窗并初始化form数据
|
||||
const open = function () {
|
||||
// 打开时候传入对象可初始化from
|
||||
modalVisible.value = true
|
||||
}
|
||||
// 为了性能,监听modal关闭则清空数据
|
||||
watch(
|
||||
() => modalVisible.value,
|
||||
(newValue) => {
|
||||
if (!newValue) {
|
||||
htmlData.value = []
|
||||
}
|
||||
}
|
||||
)
|
||||
// 提交事件
|
||||
const handleModalSubmit = async () => {
|
||||
if (!htmlData.value.length) {
|
||||
Message.error("请添加设计需求后再提交...")
|
||||
return false
|
||||
}
|
||||
const res = await demandApi.multiSave({
|
||||
projectId: route.query.id,
|
||||
key: route.query.key,
|
||||
data: htmlData.value
|
||||
})
|
||||
if (res.code === 200) {
|
||||
treeDataStore.updateDesignDemandTreeData(res.data, route.query.id)
|
||||
Message.success("批量新增设计需求成功...")
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
// 暴露该组件ref的方法
|
||||
defineExpose({ open })
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped>
|
||||
.uploadContainer {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
& span {
|
||||
font-size: 1em;
|
||||
font-weight: 700;
|
||||
}
|
||||
}
|
||||
.demand-container {
|
||||
width: 100%;
|
||||
height: 55vh;
|
||||
padding: 5px;
|
||||
overflow: auto;
|
||||
}
|
||||
.operation-container {
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
.important-text {
|
||||
font-weight: 700;
|
||||
color: red;
|
||||
}
|
||||
</style>
|
||||
@@ -14,6 +14,9 @@
|
||||
上传需求规格说明快捷录入
|
||||
</a-button>
|
||||
</template>
|
||||
<!-- 字段的前缀后缀的插槽 -->
|
||||
<!-- 版本字段的插槽 -->
|
||||
<template #inputPrepend-ident> SJ-XX- </template>
|
||||
</ma-crud>
|
||||
</div>
|
||||
<file-input-modal ref="fileInputRef"></file-input-modal>
|
||||
@@ -119,6 +122,7 @@ const crudColumns = ref([
|
||||
title: "ID",
|
||||
align: "center",
|
||||
width: 50,
|
||||
hide: true,
|
||||
dataIndex: "id",
|
||||
commonRules: [{ required: true, message: "ID必填" }],
|
||||
validateTrigger: "blur"
|
||||
@@ -132,7 +136,8 @@ const crudColumns = ref([
|
||||
search: true,
|
||||
validateTrigger: "blur",
|
||||
placeholder: "请输入文档中设计需求的标识",
|
||||
help: '若不知道则填"无"或不填'
|
||||
help: '若不知道则填"无"或不填',
|
||||
openPrepend: true
|
||||
},
|
||||
{
|
||||
title: "设需名称",
|
||||
@@ -191,8 +196,7 @@ const crudColumns = ref([
|
||||
{
|
||||
title: "接口来源",
|
||||
dataIndex: "source",
|
||||
hide: true,
|
||||
extra: "接口独有四个字段,决定大纲的接口列表信息"
|
||||
hide: true
|
||||
},
|
||||
{
|
||||
title: "目的地",
|
||||
@@ -206,11 +210,10 @@ const crudColumns = ref([
|
||||
{
|
||||
title: "接口类型",
|
||||
dataIndex: "type",
|
||||
hide: true,
|
||||
extra: "接口类型例如:网络"
|
||||
hide: true
|
||||
},
|
||||
{
|
||||
title: "接口协议",
|
||||
title: "接口内容",
|
||||
dataIndex: "protocal",
|
||||
hide: true
|
||||
}
|
||||
@@ -232,6 +235,10 @@ const fileInputRef = ref(null)
|
||||
const handleAddFileInputDemand = () => {
|
||||
fileInputRef.value.open()
|
||||
}
|
||||
|
||||
defineOptions({
|
||||
name: "dut"
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped></style>
|
||||
|
||||
174
cdTMP/src/views/project/dut/tools/parser.ts
Normal file
174
cdTMP/src/views/project/dut/tools/parser.ts
Normal file
@@ -0,0 +1,174 @@
|
||||
// 根据后端定义,不能更改的枚举
|
||||
enum DemandType {
|
||||
gn = "1",
|
||||
xn = "2",
|
||||
jk = "3",
|
||||
kkx = "4",
|
||||
aqx = "5",
|
||||
other = "6"
|
||||
}
|
||||
|
||||
// 数据每一项的结构
|
||||
interface DemandObj {
|
||||
chapter: string
|
||||
title: string
|
||||
ident?: string // 如果其标题有()则放入
|
||||
demandType: DemandType
|
||||
content: string
|
||||
}
|
||||
|
||||
// 定义h元素对象接口
|
||||
interface IHobj {
|
||||
level: number // h1 -> 1
|
||||
title: string // 标题文字
|
||||
ident?: string // 如果有()则放入
|
||||
index: number // 该标题的索引,先map的时候不设置后续再排列
|
||||
demandType: DemandType
|
||||
}
|
||||
|
||||
// h元素对象带计算出的章节号的对象
|
||||
interface IHobjWithChapter extends IHobj {
|
||||
chapter: string
|
||||
}
|
||||
|
||||
export class HtmlParser {
|
||||
domArray: Element[] // 初始化得到一个元素的集合
|
||||
hWithChapter: IHobjWithChapter[]
|
||||
constructor(htmlText: string) {
|
||||
const parser = new DOMParser()
|
||||
const doc = parser.parseFromString(htmlText, "text/html")
|
||||
this.domArray = Array.from(doc.body.children)
|
||||
// 解析domArray将h元素加入
|
||||
const HDomArray = this.domArray.filter((domItem) => domItem.tagName.startsWith("H"))
|
||||
const storeArray: IHobj[] = []
|
||||
HDomArray.forEach((it, i) => {
|
||||
!it.textContent && (it.textContent = "")
|
||||
// 这里判断是什么类型的设计需求 -> 后续可以添加
|
||||
let type: DemandType = DemandType.gn
|
||||
if (it.textContent.includes("接口")) {
|
||||
type = DemandType.jk
|
||||
} else if (it.textContent.includes("性能")) {
|
||||
type = DemandType.xn
|
||||
} else if (it.textContent.includes("可靠")) {
|
||||
type = DemandType.kkx
|
||||
} else if (it.textContent.includes("安全")) {
|
||||
type = DemandType.aqx
|
||||
}
|
||||
// 获取章节号
|
||||
const level = +it.tagName.slice(1)
|
||||
// 1.判断当前的章节级别的前一个级别的level是否一样/小于/大于
|
||||
let index = 0
|
||||
if (i > 0) {
|
||||
// 找上一个标题对象的level
|
||||
if (level === storeArray[i - 1].level) {
|
||||
index = storeArray[i - 1].index + 1
|
||||
} else if (level < storeArray[i - 1].level) {
|
||||
// 如果等级小于上一个标题对象,找storeArray里面level一样的长度
|
||||
for (let j = storeArray.length - 1; j >= 0; j--) {
|
||||
if (storeArray[j].level === level) {
|
||||
index = storeArray[j].index + 1
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
storeArray.push({
|
||||
level: level,
|
||||
title: it.textContent,
|
||||
ident: it.textContent.match(/[\((](.*?)[\))]/)?.[1],
|
||||
index: index,
|
||||
demandType: type
|
||||
})
|
||||
})
|
||||
// 直接将storeArray计算出章节号
|
||||
const chapterArray: any[] = storeArray.map((it, indx) => {
|
||||
let str = it.index + 1 + ""
|
||||
for (let i = it.level - 1; i > 0; i--) {
|
||||
for (let j = indx - 1; j >= 0; j--) {
|
||||
if (storeArray[j].level === i) {
|
||||
str = storeArray[j].index + 1 + "." + str
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
return {
|
||||
...it,
|
||||
chapter: str
|
||||
}
|
||||
})
|
||||
this.hWithChapter = chapterArray
|
||||
}
|
||||
/**
|
||||
* 将所有Element元素遍历,输出列表格式
|
||||
*/
|
||||
parseToArray(): DemandObj[] {
|
||||
const resArr: DemandObj[] = []
|
||||
let index = 0
|
||||
let currentHElement: IHobjWithChapter = this.hWithChapter[index]
|
||||
let adapterIndex: number = 1
|
||||
this.domArray.forEach((item) => {
|
||||
// 1.如果循环到H元素,将其存入
|
||||
if (item.tagName.startsWith("H")) {
|
||||
const text = item.textContent
|
||||
if (text !== currentHElement.title) {
|
||||
currentHElement = this.hWithChapter[index + 1]
|
||||
index++
|
||||
adapterIndex = 1
|
||||
}
|
||||
} else {
|
||||
// 2.构造每一项放入 - chapter和content计算
|
||||
let content = ""
|
||||
let ident = currentHElement.ident
|
||||
if (!ident) {
|
||||
ident = ""
|
||||
}
|
||||
// 这里对图片进行处理
|
||||
if (item.querySelector("img")) {
|
||||
const img = item.querySelector("img")
|
||||
if (img) {
|
||||
const strblob = img.src + ""
|
||||
const blob = strblob.split(",")[1]
|
||||
content = `<img src="data:image/png;base64,${blob}" />`
|
||||
}
|
||||
ident += `-g${adapterIndex}`
|
||||
adapterIndex++
|
||||
resArr.push({
|
||||
chapter: currentHElement.chapter,
|
||||
title: currentHElement.title,
|
||||
ident: ident,
|
||||
demandType: currentHElement.demandType,
|
||||
content
|
||||
})
|
||||
} else {
|
||||
// 如果不是图片进行判断
|
||||
if (item.textContent) {
|
||||
if (item.tagName === "TABLE") {
|
||||
content = item.outerHTML
|
||||
ident += `-t${adapterIndex}`
|
||||
adapterIndex++
|
||||
}
|
||||
if (item.tagName === "P" && !item.querySelector("img")) {
|
||||
content = item.innerHTML.trim()
|
||||
ident += `-p${adapterIndex}`
|
||||
adapterIndex++
|
||||
}
|
||||
if (item.tagName === "OL" || item.tagName === "UL") {
|
||||
content = item.innerHTML.trim()
|
||||
ident += `-u${adapterIndex}`
|
||||
adapterIndex++
|
||||
}
|
||||
// title要将括号去除
|
||||
resArr.push({
|
||||
chapter: currentHElement.chapter,
|
||||
title: currentHElement.title,
|
||||
ident: ident,
|
||||
demandType: currentHElement.demandType,
|
||||
content
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
return resArr
|
||||
}
|
||||
}
|
||||
@@ -50,6 +50,10 @@ const fetchProblemData = async (
|
||||
}
|
||||
}
|
||||
fetchProblemData()
|
||||
|
||||
defineOptions({
|
||||
name: "problem"
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped></style>
|
||||
|
||||
@@ -2,7 +2,10 @@
|
||||
<div class="ma-content-block lg:flex justify-between p-4">
|
||||
<div class="lg:w-full w-full lg:ml-4 mt-5 lg:mt-0">
|
||||
<!-- CRUD组件 -->
|
||||
<ma-crud :options="crudOptions" :columns="crudColumns" ref="crudRef"></ma-crud>
|
||||
<ma-crud :options="crudOptions" :columns="crudColumns" ref="crudRef">
|
||||
<!-- 版本字段的插槽 -->
|
||||
<template #inputPrepend-version> V </template>
|
||||
</ma-crud>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
@@ -81,6 +84,7 @@ const crudColumns = ref([
|
||||
title: "ID",
|
||||
width: 50,
|
||||
align: "center",
|
||||
hide: true,
|
||||
dataIndex: "id",
|
||||
commonRules: [{ required: true, message: "ID是必填" }],
|
||||
validateTrigger: "blur"
|
||||
@@ -152,7 +156,9 @@ const crudColumns = ref([
|
||||
dataIndex: "version",
|
||||
search: true,
|
||||
commonRules: [{ required: true, message: "版本必填" }],
|
||||
validateTrigger: "blur"
|
||||
validateTrigger: "blur",
|
||||
help: "填写不带V字符",
|
||||
openPrepend: true
|
||||
},
|
||||
{
|
||||
title: "用户标识",
|
||||
@@ -271,6 +277,10 @@ const crudColumns = ref([
|
||||
}
|
||||
}
|
||||
])
|
||||
|
||||
defineOptions({
|
||||
name: "round"
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped></style>
|
||||
|
||||
@@ -8,15 +8,18 @@
|
||||
</template>
|
||||
</ma-crud>
|
||||
</div>
|
||||
<problem-form ref="problemFormRef" :title="title"></problem-form>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="jsx">
|
||||
import { ref } from "vue"
|
||||
import { useRoute, useRouter } from "vue-router"
|
||||
import { useRoute } from "vue-router"
|
||||
import caseApi from "@/api/project/case"
|
||||
import dictApi from "@/api/system/dict"
|
||||
import { useTreeDataStore } from "@/store"
|
||||
import ProblemForm from "@/views/project/case/components/ProblemForm.vue"
|
||||
const problemFormRef = ref(null)
|
||||
const title = ref("问题单表单")
|
||||
const treeDataStore = useTreeDataStore()
|
||||
const route = useRoute()
|
||||
const roundNumber = route.query.key.split("-")[0]
|
||||
@@ -37,7 +40,8 @@ const crudOptions = ref({
|
||||
add: { show: true, api: caseApi.save, text: "新增用例" },
|
||||
edit: { show: true, api: caseApi.update, text: "修改用例" },
|
||||
delete: { show: true, api: caseApi.delete },
|
||||
operationColumnAlign:'center',
|
||||
operationColumnAlign: "center",
|
||||
isDbClickEdit: false, // 关闭双击编辑
|
||||
// 处理新增删除后树状图显示
|
||||
beforeOpenAdd: function () {
|
||||
let key_split = route.query.key.split("-")
|
||||
@@ -142,6 +146,7 @@ const crudColumns = ref([
|
||||
title: "ID",
|
||||
width: 60,
|
||||
align: "center",
|
||||
hide: true,
|
||||
dataIndex: "id",
|
||||
fixed: "left"
|
||||
},
|
||||
@@ -152,8 +157,8 @@ const crudColumns = ref([
|
||||
width: 140,
|
||||
align: "center",
|
||||
addDisabled: true,
|
||||
addDefaultValue: route.query.key,
|
||||
editDefaultValue: route.query.key,
|
||||
addDefaultValue: "用例标识自动生成,结构为YL_IO_XXXX_001",
|
||||
editDefaultValue: "用例标识自动生成,结构为YL_IO_XXXX_001",
|
||||
editDisabled: true,
|
||||
search: true,
|
||||
validateTrigger: "blur"
|
||||
@@ -243,15 +248,20 @@ const crudColumns = ref([
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
title: "设计人员",
|
||||
width: 80,
|
||||
dataIndex: "designPerson",
|
||||
align: "center",
|
||||
hide: true,
|
||||
search: true,
|
||||
formType: "select",
|
||||
dict: { url: "system/user/list", translation: true, props: { label: "name", value: "name" } }
|
||||
dict: {
|
||||
url: "system/user/list",
|
||||
params: { project_id: route.query.id },
|
||||
translation: true,
|
||||
props: { label: "name", value: "name" }
|
||||
}
|
||||
},
|
||||
{
|
||||
title: "执行人员",
|
||||
@@ -260,7 +270,12 @@ const crudColumns = ref([
|
||||
align: "center",
|
||||
search: true,
|
||||
formType: "select",
|
||||
dict: { url: "system/user/list", translation: true, props: { label: "name", value: "name" } }
|
||||
dict: {
|
||||
url: "system/user/list",
|
||||
params: { project_id: route.query.id },
|
||||
translation: true,
|
||||
props: { label: "name", value: "name" }
|
||||
}
|
||||
},
|
||||
{
|
||||
title: "审核人员",
|
||||
@@ -269,7 +284,12 @@ const crudColumns = ref([
|
||||
align: "center",
|
||||
hide: true,
|
||||
formType: "select",
|
||||
dict: { url: "system/user/list", translation: true, props: { label: "name", value: "name" } }
|
||||
dict: {
|
||||
url: "system/user/list",
|
||||
params: { project_id: route.query.id },
|
||||
translation: true,
|
||||
props: { label: "name", value: "name" }
|
||||
}
|
||||
},
|
||||
{
|
||||
title: "用例综述",
|
||||
@@ -345,6 +365,28 @@ const crudColumns = ref([
|
||||
commonRules: [{ required: true, message: "执行状态必填" }]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
title: "关联问题",
|
||||
dataIndex: "problem",
|
||||
width: 120,
|
||||
addDisplay: false,
|
||||
editDisplay: false,
|
||||
align: "center",
|
||||
customRender: ({ record }) => {
|
||||
if (record.problem) {
|
||||
return (
|
||||
<a-link
|
||||
onClick={() => {
|
||||
title.value = `PT_${route.query.ident}_${record.problem.ident.padStart(3, 0)}`
|
||||
problemFormRef.value.open(record.problem)
|
||||
}}
|
||||
>{`PT_${route.query.ident}_${record.problem.ident.padStart(3, 0)}`}</a-link>
|
||||
)
|
||||
} else {
|
||||
return "无问题单"
|
||||
}
|
||||
}
|
||||
}
|
||||
])
|
||||
// 暴露刷新表格方法给外部
|
||||
@@ -352,6 +394,10 @@ const refreshCrudTable = () => {
|
||||
crudRef.value.refresh()
|
||||
}
|
||||
defineExpose({ refreshCrudTable })
|
||||
|
||||
defineOptions({
|
||||
name: "testDemand"
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped></style>
|
||||
|
||||
@@ -8,6 +8,10 @@ const router = useRouter()
|
||||
const route = useRoute()
|
||||
const gotoPath = route.params.path as string
|
||||
router.replace({ path: gotoPath })
|
||||
|
||||
defineOptions({
|
||||
name: "redirect"
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped></style>
|
||||
|
||||
@@ -25,20 +25,46 @@
|
||||
</a-timeline-item>
|
||||
<div class="info">
|
||||
<a-alert>测试人员填写的项目开始时间、结束时间、轮次时间均会影响生成文档的时间!</a-alert>
|
||||
<a-button type="primary" @click="handleModalVisible">展示目前文档生成的日期</a-button>
|
||||
</div>
|
||||
</a-timeline>
|
||||
</div>
|
||||
<!-- a-modal组件,展示生成文档的全部信息 -->
|
||||
<a-modal v-model:visible="visible" hide-cancel :closable="false" width="auto">
|
||||
<template #title> 生成文档时间一览表 </template>
|
||||
<a-card
|
||||
:style="{ width: '600px' }"
|
||||
:title="item.title"
|
||||
hoverable
|
||||
v-for="(item, index) in timeList"
|
||||
:key="item.title"
|
||||
>
|
||||
<p v-for="(value, key, idx) in item" class="flex">
|
||||
<template v-if="key !== 'title'">
|
||||
<span class="font-bold w-[300px]">{{ key }}</span>
|
||||
<span class="">{{ value }}</span>
|
||||
</template>
|
||||
</p>
|
||||
</a-card>
|
||||
</a-modal>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { useDocTimeShow } from "./useDocTimeShow"
|
||||
// 在一开始就请求接口
|
||||
// 1.定义props
|
||||
const props = defineProps({
|
||||
pInfo: {
|
||||
type: Object,
|
||||
required: true
|
||||
},
|
||||
projectId: {
|
||||
type: String,
|
||||
required: true
|
||||
}
|
||||
})
|
||||
const { visible, handleModalVisible, timeList } = useDocTimeShow(props.projectId)
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped>
|
||||
@@ -56,6 +82,10 @@ const props = defineProps({
|
||||
position: absolute;
|
||||
right: 30px;
|
||||
top: 1rem;
|
||||
button {
|
||||
width: 180px;
|
||||
border-radius: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
.a-col-title {
|
||||
|
||||
35
cdTMP/src/views/testmanage/projBoard/cpns/useDocTimeShow.ts
Normal file
35
cdTMP/src/views/testmanage/projBoard/cpns/useDocTimeShow.ts
Normal file
@@ -0,0 +1,35 @@
|
||||
import { ref, computed } from "vue"
|
||||
import projectApi from "@/api/project/project"
|
||||
export function useDocTimeShow(projectId: number) {
|
||||
const visible = ref<boolean>(false)
|
||||
const handleModalVisible = (): void => {
|
||||
visible.value = true
|
||||
}
|
||||
// 获取时间模块
|
||||
const timeTemp = ref<any[]>([])
|
||||
const getTimeByBackend = async () => {
|
||||
const res = await projectApi.getDocumentTimeShow(projectId)
|
||||
timeTemp.value = res.data
|
||||
}
|
||||
getTimeByBackend()
|
||||
const timeList = computed(() => {
|
||||
timeTemp.value.forEach((item) => {
|
||||
// 遍历所有属性,对值格式进行处理
|
||||
Object.keys(item).forEach((key) => {
|
||||
if (Array.isArray(item[key])) {
|
||||
item[key] = item[key].join("~")
|
||||
} else {
|
||||
if (item[key].includes("年")) {
|
||||
item[key] = item[key].replace('年','').replace('月','').replace('日','')
|
||||
}
|
||||
}
|
||||
})
|
||||
})
|
||||
return timeTemp.value
|
||||
})
|
||||
return {
|
||||
visible,
|
||||
handleModalVisible,
|
||||
timeList
|
||||
}
|
||||
}
|
||||
@@ -4,7 +4,7 @@
|
||||
<!-- 返回前面一页的按钮,以及项目整体情况 -->
|
||||
<Title :pInfo="loadingData"></Title>
|
||||
<!-- 时间线显示项目情况 -->
|
||||
<time-line :pInfo="loadingData"></time-line>
|
||||
<time-line :pInfo="loadingData" :projectId="route.params.projectId"></time-line>
|
||||
<!-- 以轮次为合集展示需求下面的测试项数、用例数,测试类型下面测试项和用例数量 -->
|
||||
<round-info v-for="item in loadingData.statistics" :data="item"></round-info>
|
||||
</a-layout-content>
|
||||
@@ -24,6 +24,10 @@ const fetchData = async () => {
|
||||
return projectApi.getBoardInfo(route.params.projectId)
|
||||
}
|
||||
const { loadingData, isDataLoading } = useFetchData({}, fetchData)
|
||||
|
||||
defineOptions({
|
||||
name: "projBoard"
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped>
|
||||
|
||||
@@ -798,6 +798,10 @@ const crudColumns = ref([
|
||||
}
|
||||
}
|
||||
])
|
||||
|
||||
defineOptions({
|
||||
name: "projmanage"
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped>
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
"jsx": "preserve",
|
||||
"allowJs": true,
|
||||
"strictFunctionTypes": false,
|
||||
"strictNullChecks": true,
|
||||
"allowSyntheticDefaultImports": true,
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"inlineSources": false,
|
||||
@@ -21,6 +22,7 @@
|
||||
"resolveJsonModule": true,
|
||||
"removeComments": true,
|
||||
"noImplicitAny": false,
|
||||
"noImplicitThis": true,
|
||||
"experimentalDecorators": true,
|
||||
"target": "esnext",
|
||||
"module": "esnext",
|
||||
@@ -47,14 +49,13 @@
|
||||
},
|
||||
"include": [
|
||||
"src/**/*",
|
||||
"mock",
|
||||
"vite.config.ts",
|
||||
"node_modules",
|
||||
"dist",
|
||||
"build"
|
||||
],
|
||||
"exclude": [
|
||||
"node_modules",
|
||||
"build/**/*"
|
||||
"mock",
|
||||
"build/**/*",
|
||||
"dist",
|
||||
"build"
|
||||
]
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user