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",
|
"echarts": "^5.4.2",
|
||||||
"file2md5": "^1.3.0",
|
"file2md5": "^1.3.0",
|
||||||
"lodash": "^4.17.21",
|
"lodash": "^4.17.21",
|
||||||
"mammoth": "^1.7.2",
|
"mammoth": "^1.8.0",
|
||||||
"mitt": "^3.0.0",
|
"mitt": "^3.0.0",
|
||||||
"monaco-editor": "^0.33.0",
|
"monaco-editor": "^0.33.0",
|
||||||
"nprogress": "^0.2.0",
|
"nprogress": "^0.2.0",
|
||||||
@@ -28,7 +28,7 @@
|
|||||||
"qs": "^6.11.2",
|
"qs": "^6.11.2",
|
||||||
"sortablejs": "^1.15.0",
|
"sortablejs": "^1.15.0",
|
||||||
"tinymce": "^6.8.3",
|
"tinymce": "^6.8.3",
|
||||||
"vue": "^3.4.31",
|
"vue": "^3.4.33",
|
||||||
"vue-clipboard3": "^2.0.0",
|
"vue-clipboard3": "^2.0.0",
|
||||||
"vue-color-kit": "^1.0.5",
|
"vue-color-kit": "^1.0.5",
|
||||||
"vue-echarts": "^6.5.5",
|
"vue-echarts": "^6.5.5",
|
||||||
@@ -54,7 +54,8 @@
|
|||||||
"postcss": "^8.4.38",
|
"postcss": "^8.4.38",
|
||||||
"prettier": "^2.8.8",
|
"prettier": "^2.8.8",
|
||||||
"tailwindcss": "^3.3.2",
|
"tailwindcss": "^3.3.2",
|
||||||
"vite": "^5.3.2"
|
"typescript": "^5.5.3",
|
||||||
|
"vite": "^5.3.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@alloc/quick-lru": {
|
"node_modules/@alloc/quick-lru": {
|
||||||
@@ -1501,49 +1502,53 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@vue/compiler-core": {
|
"node_modules/@vue/compiler-core": {
|
||||||
"version": "3.4.31",
|
"version": "3.4.33",
|
||||||
"resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.4.31.tgz",
|
"resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.4.33.tgz",
|
||||||
"integrity": "sha512-skOiodXWTV3DxfDhB4rOf3OGalpITLlgCeOwb+Y9GJpfQ8ErigdBUHomBzvG78JoVE8MJoQsb+qhZiHfKeNeEg==",
|
"integrity": "sha512-MoIREbkdPQlnGfSKDMgzTqzqx5nmEjIc0ydLVYlTACGBsfvOJ4tHSbZXKVF536n6fB+0eZaGEOqsGThPpdvF5A==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/parser": "^7.24.7",
|
"@babel/parser": "^7.24.7",
|
||||||
"@vue/shared": "3.4.31",
|
"@vue/shared": "3.4.33",
|
||||||
"entities": "^4.5.0",
|
"entities": "^4.5.0",
|
||||||
"estree-walker": "^2.0.2",
|
"estree-walker": "^2.0.2",
|
||||||
"source-map-js": "^1.2.0"
|
"source-map-js": "^1.2.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@vue/compiler-dom": {
|
"node_modules/@vue/compiler-dom": {
|
||||||
"version": "3.4.31",
|
"version": "3.4.33",
|
||||||
"resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.4.31.tgz",
|
"resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.4.33.tgz",
|
||||||
"integrity": "sha512-wK424WMXsG1IGMyDGyLqB+TbmEBFM78hIsOJ9QwUVLGrcSk0ak6zYty7Pj8ftm7nEtdU/DGQxAXp0/lM/2cEpQ==",
|
"integrity": "sha512-GzB8fxEHKw0gGet5BKlpfXEqoBnzSVWwMnT+dc25wE7pFEfrU/QsvjZMP9rD4iVXHBBoemTct8mN0GJEI6ZX5A==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@vue/compiler-core": "3.4.31",
|
"@vue/compiler-core": "3.4.33",
|
||||||
"@vue/shared": "3.4.31"
|
"@vue/shared": "3.4.33"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@vue/compiler-sfc": {
|
"node_modules/@vue/compiler-sfc": {
|
||||||
"version": "3.4.31",
|
"version": "3.4.33",
|
||||||
"resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.4.31.tgz",
|
"resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.4.33.tgz",
|
||||||
"integrity": "sha512-einJxqEw8IIJxzmnxmJBuK2usI+lJonl53foq+9etB2HAzlPjAS/wa7r0uUpXw5ByX3/0uswVSrjNb17vJm1kQ==",
|
"integrity": "sha512-7rk7Vbkn21xMwIUpHQR4hCVejwE6nvhBOiDgoBcR03qvGqRKA7dCBSsHZhwhYUsmjlbJ7OtD5UFIyhP6BY+c8A==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/parser": "^7.24.7",
|
"@babel/parser": "^7.24.7",
|
||||||
"@vue/compiler-core": "3.4.31",
|
"@vue/compiler-core": "3.4.33",
|
||||||
"@vue/compiler-dom": "3.4.31",
|
"@vue/compiler-dom": "3.4.33",
|
||||||
"@vue/compiler-ssr": "3.4.31",
|
"@vue/compiler-ssr": "3.4.33",
|
||||||
"@vue/shared": "3.4.31",
|
"@vue/shared": "3.4.33",
|
||||||
"estree-walker": "^2.0.2",
|
"estree-walker": "^2.0.2",
|
||||||
"magic-string": "^0.30.10",
|
"magic-string": "^0.30.10",
|
||||||
"postcss": "^8.4.38",
|
"postcss": "^8.4.39",
|
||||||
"source-map-js": "^1.2.0"
|
"source-map-js": "^1.2.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@vue/compiler-ssr": {
|
"node_modules/@vue/compiler-ssr": {
|
||||||
"version": "3.4.31",
|
"version": "3.4.33",
|
||||||
"resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.4.31.tgz",
|
"resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.4.33.tgz",
|
||||||
"integrity": "sha512-RtefmITAje3fJ8FSg1gwgDhdKhZVntIVbwupdyZDSifZTRMiWxWehAOTCc8/KZDnBOcYQ4/9VWxsTbd3wT0hAA==",
|
"integrity": "sha512-0WveC9Ai+eT/1b6LCV5IfsufBZ0HP7pSSTdDjcuW302tTEgoBw8rHVHKPbGUtzGReUFCRXbv6zQDDgucnV2WzQ==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@vue/compiler-dom": "3.4.31",
|
"@vue/compiler-dom": "3.4.33",
|
||||||
"@vue/shared": "3.4.31"
|
"@vue/shared": "3.4.33"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@vue/devtools-api": {
|
"node_modules/@vue/devtools-api": {
|
||||||
@@ -1552,49 +1557,54 @@
|
|||||||
"integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q=="
|
"integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q=="
|
||||||
},
|
},
|
||||||
"node_modules/@vue/reactivity": {
|
"node_modules/@vue/reactivity": {
|
||||||
"version": "3.4.31",
|
"version": "3.4.33",
|
||||||
"resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.4.31.tgz",
|
"resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.4.33.tgz",
|
||||||
"integrity": "sha512-VGkTani8SOoVkZNds1PfJ/T1SlAIOf8E58PGAhIOUDYPC4GAmFA2u/E14TDAFcf3vVDKunc4QqCe/SHr8xC65Q==",
|
"integrity": "sha512-B24QIelahDbyHipBgbUItQblbd4w5HpG3KccL+YkGyo3maXyS253FzcTR3pSz739OTphmzlxP7JxEMWBpewilA==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@vue/shared": "3.4.31"
|
"@vue/shared": "3.4.33"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@vue/runtime-core": {
|
"node_modules/@vue/runtime-core": {
|
||||||
"version": "3.4.31",
|
"version": "3.4.33",
|
||||||
"resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.4.31.tgz",
|
"resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.4.33.tgz",
|
||||||
"integrity": "sha512-LDkztxeUPazxG/p8c5JDDKPfkCDBkkiNLVNf7XZIUnJ+66GVGkP+TIh34+8LtPisZ+HMWl2zqhIw0xN5MwU1cw==",
|
"integrity": "sha512-6wavthExzT4iAxpe8q37/rDmf44nyOJGISJPxCi9YsQO+8w9v0gLCFLfH5TzD1V1AYrTAdiF4Y1cgUmP68jP6w==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@vue/reactivity": "3.4.31",
|
"@vue/reactivity": "3.4.33",
|
||||||
"@vue/shared": "3.4.31"
|
"@vue/shared": "3.4.33"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@vue/runtime-dom": {
|
"node_modules/@vue/runtime-dom": {
|
||||||
"version": "3.4.31",
|
"version": "3.4.33",
|
||||||
"resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.4.31.tgz",
|
"resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.4.33.tgz",
|
||||||
"integrity": "sha512-2Auws3mB7+lHhTFCg8E9ZWopA6Q6L455EcU7bzcQ4x6Dn4cCPuqj6S2oBZgN2a8vJRS/LSYYxwFFq2Hlx3Fsaw==",
|
"integrity": "sha512-iHsMCUSFJ+4z432Bn9kZzHX+zOXa6+iw36DaVRmKYZpPt9jW9riF32SxNwB124i61kp9+AZtheQ/mKoJLerAaQ==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@vue/reactivity": "3.4.31",
|
"@vue/reactivity": "3.4.33",
|
||||||
"@vue/runtime-core": "3.4.31",
|
"@vue/runtime-core": "3.4.33",
|
||||||
"@vue/shared": "3.4.31",
|
"@vue/shared": "3.4.33",
|
||||||
"csstype": "^3.1.3"
|
"csstype": "^3.1.3"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@vue/server-renderer": {
|
"node_modules/@vue/server-renderer": {
|
||||||
"version": "3.4.31",
|
"version": "3.4.33",
|
||||||
"resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.4.31.tgz",
|
"resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.4.33.tgz",
|
||||||
"integrity": "sha512-D5BLbdvrlR9PE3by9GaUp1gQXlCNadIZytMIb8H2h3FMWJd4oUfkUTEH2wAr3qxoRz25uxbTcbqd3WKlm9EHQA==",
|
"integrity": "sha512-jTH0d6gQcaYideFP/k0WdEu8PpRS9MF8d0b6SfZzNi+ap972pZ0TNIeTaESwdOtdY0XPVj54XEJ6K0wXxir4fw==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@vue/compiler-ssr": "3.4.31",
|
"@vue/compiler-ssr": "3.4.33",
|
||||||
"@vue/shared": "3.4.31"
|
"@vue/shared": "3.4.33"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"vue": "3.4.31"
|
"vue": "3.4.33"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@vue/shared": {
|
"node_modules/@vue/shared": {
|
||||||
"version": "3.4.31",
|
"version": "3.4.33",
|
||||||
"resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.4.31.tgz",
|
"resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.4.33.tgz",
|
||||||
"integrity": "sha512-Yp3wtJk//8cO4NItOPpi3QkLExAr/aLBGZMmTtW9WpdwBCJpRM6zj9WgWktXAl8IDIozwNMByT45JP3tO3ACWA=="
|
"integrity": "sha512-aoRY0jQk3A/cuvdkodTrM4NMfxco8n55eG4H7ML/CRy7OryHfiqvug4xrCBBMbbN+dvXAetDDwZW9DXWWjBntA==",
|
||||||
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/@vueuse/core": {
|
"node_modules/@vueuse/core": {
|
||||||
"version": "10.10.0",
|
"version": "10.10.0",
|
||||||
@@ -2318,7 +2328,8 @@
|
|||||||
"node_modules/csstype": {
|
"node_modules/csstype": {
|
||||||
"version": "3.1.3",
|
"version": "3.1.3",
|
||||||
"resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz",
|
"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": {
|
"node_modules/dayjs": {
|
||||||
"version": "1.11.8",
|
"version": "1.11.8",
|
||||||
@@ -2431,6 +2442,7 @@
|
|||||||
"version": "4.5.0",
|
"version": "4.5.0",
|
||||||
"resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
|
"resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
|
||||||
"integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
|
"integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
|
||||||
|
"license": "BSD-2-Clause",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.12"
|
"node": ">=0.12"
|
||||||
},
|
},
|
||||||
@@ -2784,7 +2796,8 @@
|
|||||||
"node_modules/estree-walker": {
|
"node_modules/estree-walker": {
|
||||||
"version": "2.0.2",
|
"version": "2.0.2",
|
||||||
"resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz",
|
"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": {
|
"node_modules/esutils": {
|
||||||
"version": "2.0.3",
|
"version": "2.0.3",
|
||||||
@@ -3572,9 +3585,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/mammoth": {
|
"node_modules/mammoth": {
|
||||||
"version": "1.7.2",
|
"version": "1.8.0",
|
||||||
"resolved": "https://registry.npmmirror.com/mammoth/-/mammoth-1.7.2.tgz",
|
"resolved": "https://registry.npmmirror.com/mammoth/-/mammoth-1.8.0.tgz",
|
||||||
"integrity": "sha512-MqWU2hcLf1I5QMKyAbfJCvrLxnv5WztrAQyorfZ+WPq7Hk82vZFmvfR2/64ajIPpM4jlq0TXp1xZvp/FFaL1Ug==",
|
"integrity": "sha512-pJNfxSk9IEGVpau+tsZFz22ofjUsl2mnA5eT8PjPs2n0BP+rhVte4Nez6FdgEuxv3IGI3afiV46ImKqTGDVlbA==",
|
||||||
|
"license": "BSD-2-Clause",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@xmldom/xmldom": "^0.8.6",
|
"@xmldom/xmldom": "^0.8.6",
|
||||||
"argparse": "~1.0.3",
|
"argparse": "~1.0.3",
|
||||||
@@ -3939,9 +3953,10 @@
|
|||||||
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
|
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
|
||||||
},
|
},
|
||||||
"node_modules/picocolors": {
|
"node_modules/picocolors": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz",
|
"resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.1.tgz",
|
||||||
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
|
"integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==",
|
||||||
|
"license": "ISC"
|
||||||
},
|
},
|
||||||
"node_modules/picomatch": {
|
"node_modules/picomatch": {
|
||||||
"version": "2.3.1",
|
"version": "2.3.1",
|
||||||
@@ -4021,9 +4036,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/postcss": {
|
"node_modules/postcss": {
|
||||||
"version": "8.4.38",
|
"version": "8.4.39",
|
||||||
"resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.38.tgz",
|
"resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.39.tgz",
|
||||||
"integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==",
|
"integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==",
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
"type": "opencollective",
|
"type": "opencollective",
|
||||||
@@ -4038,9 +4053,10 @@
|
|||||||
"url": "https://github.com/sponsors/ai"
|
"url": "https://github.com/sponsors/ai"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"nanoid": "^3.3.7",
|
"nanoid": "^3.3.7",
|
||||||
"picocolors": "^1.0.0",
|
"picocolors": "^1.0.1",
|
||||||
"source-map-js": "^1.2.0"
|
"source-map-js": "^1.2.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -4810,6 +4826,20 @@
|
|||||||
"node": ">=10"
|
"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": {
|
"node_modules/underscore": {
|
||||||
"version": "1.13.6",
|
"version": "1.13.6",
|
||||||
"resolved": "https://registry.npmmirror.com/underscore/-/underscore-1.13.6.tgz",
|
"resolved": "https://registry.npmmirror.com/underscore/-/underscore-1.13.6.tgz",
|
||||||
@@ -4852,13 +4882,14 @@
|
|||||||
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
|
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
|
||||||
},
|
},
|
||||||
"node_modules/vite": {
|
"node_modules/vite": {
|
||||||
"version": "5.3.2",
|
"version": "5.3.4",
|
||||||
"resolved": "https://registry.npmmirror.com/vite/-/vite-5.3.2.tgz",
|
"resolved": "https://registry.npmmirror.com/vite/-/vite-5.3.4.tgz",
|
||||||
"integrity": "sha512-6lA7OBHBlXUxiJxbO5aAY2fsHHzDr1q7DvXYnyZycRs2Dz+dXBWuhpWHvmljTRTpQC2uvGmUFFkSHF2vGo90MA==",
|
"integrity": "sha512-Cw+7zL3ZG9/NZBB8C+8QbQZmR54GwqIz+WMI4b3JgdYJvX+ny9AjJXqkGQlDXSXRP9rP0B4tbciRMOVEKulVOA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"esbuild": "^0.21.3",
|
"esbuild": "^0.21.3",
|
||||||
"postcss": "^8.4.38",
|
"postcss": "^8.4.39",
|
||||||
"rollup": "^4.13.0"
|
"rollup": "^4.13.0"
|
||||||
},
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
@@ -4907,15 +4938,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/vue": {
|
"node_modules/vue": {
|
||||||
"version": "3.4.31",
|
"version": "3.4.33",
|
||||||
"resolved": "https://registry.npmmirror.com/vue/-/vue-3.4.31.tgz",
|
"resolved": "https://registry.npmmirror.com/vue/-/vue-3.4.33.tgz",
|
||||||
"integrity": "sha512-njqRrOy7W3YLAlVqSKpBebtZpDVg21FPoaq1I7f/+qqBThK9ChAIjkRWgeP6Eat+8C+iia4P3OYqpATP21BCoQ==",
|
"integrity": "sha512-VdMCWQOummbhctl4QFMcW6eNtXHsFyDlX60O/tsSQuCcuDOnJ1qPOhhVla65Niece7xq/P2zyZReIO5mP+LGTQ==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@vue/compiler-dom": "3.4.31",
|
"@vue/compiler-dom": "3.4.33",
|
||||||
"@vue/compiler-sfc": "3.4.31",
|
"@vue/compiler-sfc": "3.4.33",
|
||||||
"@vue/runtime-dom": "3.4.31",
|
"@vue/runtime-dom": "3.4.33",
|
||||||
"@vue/server-renderer": "3.4.31",
|
"@vue/server-renderer": "3.4.33",
|
||||||
"@vue/shared": "3.4.31"
|
"@vue/shared": "3.4.33"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"typescript": "*"
|
"typescript": "*"
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
"echarts": "^5.4.2",
|
"echarts": "^5.4.2",
|
||||||
"file2md5": "^1.3.0",
|
"file2md5": "^1.3.0",
|
||||||
"lodash": "^4.17.21",
|
"lodash": "^4.17.21",
|
||||||
"mammoth": "^1.7.2",
|
"mammoth": "^1.8.0",
|
||||||
"mitt": "^3.0.0",
|
"mitt": "^3.0.0",
|
||||||
"monaco-editor": "^0.33.0",
|
"monaco-editor": "^0.33.0",
|
||||||
"nprogress": "^0.2.0",
|
"nprogress": "^0.2.0",
|
||||||
@@ -31,7 +31,7 @@
|
|||||||
"qs": "^6.11.2",
|
"qs": "^6.11.2",
|
||||||
"sortablejs": "^1.15.0",
|
"sortablejs": "^1.15.0",
|
||||||
"tinymce": "^6.8.3",
|
"tinymce": "^6.8.3",
|
||||||
"vue": "^3.4.31",
|
"vue": "^3.4.33",
|
||||||
"vue-clipboard3": "^2.0.0",
|
"vue-clipboard3": "^2.0.0",
|
||||||
"vue-color-kit": "^1.0.5",
|
"vue-color-kit": "^1.0.5",
|
||||||
"vue-echarts": "^6.5.5",
|
"vue-echarts": "^6.5.5",
|
||||||
@@ -57,6 +57,7 @@
|
|||||||
"postcss": "^8.4.38",
|
"postcss": "^8.4.38",
|
||||||
"prettier": "^2.8.8",
|
"prettier": "^2.8.8",
|
||||||
"tailwindcss": "^3.3.2",
|
"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: 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>
|
<template>
|
||||||
<a-input
|
<a-input
|
||||||
v-model="value"
|
v-model="value"
|
||||||
|
|||||||
@@ -13,12 +13,9 @@
|
|||||||
{{ prop.title }}
|
{{ prop.title }}
|
||||||
</template>
|
</template>
|
||||||
<slot name="body"></slot>
|
<slot name="body"></slot>
|
||||||
<ma-form
|
<ma-form ref="maFormRef" :columns="prop.column" v-model="form" :options="{ ...options, showButtons: false }">
|
||||||
ref="maFormRef"
|
<template #[`inputPrepend-version`]>V </template>
|
||||||
:columns="prop.column"
|
</ma-form>
|
||||||
v-model="form"
|
|
||||||
:options="{ ...options, showButtons: false }"
|
|
||||||
></ma-form>
|
|
||||||
</a-modal>
|
</a-modal>
|
||||||
</template>
|
</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>
|
<template>
|
||||||
<ma-form-item
|
<ma-form-item
|
||||||
v-if="typeof props.component.display == 'undefined' || props.component.display === true"
|
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>
|
<template>
|
||||||
<ma-form-item
|
<ma-form-item
|
||||||
v-if="typeof props.component.display == 'undefined' || props.component.display === true"
|
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>
|
<template>
|
||||||
<ma-form-item
|
<ma-form-item
|
||||||
v-if="typeof props.component.display == 'undefined' || props.component.display === true"
|
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>
|
<template>
|
||||||
<div class="ma-content-block">
|
<div class="ma-content-block">
|
||||||
<a-space class="flex">
|
<a-space class="flex">
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<div class="mt-2">页面未找到,请返回</div>
|
<div class="mt-2">页面未找到,请返回</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="mt-5">
|
<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>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -87,13 +87,13 @@
|
|||||||
</a-space>
|
</a-space>
|
||||||
</a-doption>
|
</a-doption>
|
||||||
<a-doption>
|
<a-doption>
|
||||||
<a-space @click="$router.push({ name: 'Usercenter' })">
|
<a-space @click="$router.push({ name: 'usercenter' })">
|
||||||
<icon-user />
|
<icon-user />
|
||||||
<span> 用户中心 </span>
|
<span> 用户中心 </span>
|
||||||
</a-space>
|
</a-space>
|
||||||
</a-doption>
|
</a-doption>
|
||||||
<a-doption>
|
<a-doption>
|
||||||
<a-space @click="$router.push({ name: 'Usercenter' })">
|
<a-space @click="$router.push({ name: 'usercenter' })">
|
||||||
<icon-settings />
|
<icon-settings />
|
||||||
<span> 用户设置 </span>
|
<span> 用户设置 </span>
|
||||||
</a-space>
|
</a-space>
|
||||||
@@ -169,7 +169,7 @@ const handleLogout = () => {
|
|||||||
const toggleDrawerMenu = inject("toggleDrawerMenu")
|
const toggleDrawerMenu = inject("toggleDrawerMenu")
|
||||||
// 点击图标返回首页
|
// 点击图标返回首页
|
||||||
const handleClickLogo = () => {
|
const handleClickLogo = () => {
|
||||||
router.push({ name: "Workplace" })
|
router.push({ name: "workplace" })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 测试生成文档-测试项和方法
|
// 测试生成文档-测试项和方法
|
||||||
|
|||||||
@@ -310,7 +310,7 @@ const handleCopyNode = async () => {
|
|||||||
/// 进度条变量
|
/// 进度条变量
|
||||||
const visible = ref(false)
|
const visible = ref(false)
|
||||||
const isComplete = ref(false)
|
const isComplete = ref(false)
|
||||||
const ptext = ref("第二轮数据")
|
const ptext = ref("轮次数据")
|
||||||
const handleModalConfirmClick = () => {
|
const handleModalConfirmClick = () => {
|
||||||
visible.value = false
|
visible.value = false
|
||||||
}
|
}
|
||||||
@@ -367,7 +367,7 @@ const handleSoDutSubmit = async (data) => {
|
|||||||
// ~~~~定义弹出a-form-modal的cancel方法-返回false则无法关闭弹窗~~~~
|
// ~~~~定义弹出a-form-modal的cancel方法-返回false则无法关闭弹窗~~~~
|
||||||
const handleSoDutCancel = () => {
|
const handleSoDutCancel = () => {
|
||||||
Notification.error("必须按要求添加源代码信息,返回项目列表页面!")
|
Notification.error("必须按要求添加源代码信息,返回项目列表页面!")
|
||||||
router.replace({ name: "Projmanage" })
|
router.replace({ name: "projmanage" })
|
||||||
}
|
}
|
||||||
// 初始化树状数据
|
// 初始化树状数据
|
||||||
// so_dut弹窗ref对象
|
// so_dut弹窗ref对象
|
||||||
@@ -766,7 +766,8 @@ const soDutColumn = ref([
|
|||||||
title: "代码版本",
|
title: "代码版本",
|
||||||
dataIndex: "version",
|
dataIndex: "version",
|
||||||
placeholder: "请输入代码版本,注意不要带V",
|
placeholder: "请输入代码版本,注意不要带V",
|
||||||
rules: [{ required: true, message: "代码版本必填" }]
|
rules: [{ required: true, message: "代码版本必填" }],
|
||||||
|
openPrepend: true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "用户标识",
|
title: "用户标识",
|
||||||
|
|||||||
@@ -14,9 +14,9 @@ export const NOT_FOUND = {
|
|||||||
name: "notFound"
|
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文件查看
|
* @description: 默认路由对象没有component,固定在router/constants.js文件查看
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ const DASHBOARD = {
|
|||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
path: "workplace",
|
path: "workplace",
|
||||||
name: "Workplace",
|
name: "workplace",
|
||||||
component: () => import("@/views/dashboard/workplace/index.vue"),
|
component: () => import("@/views/dashboard/workplace/index.vue"),
|
||||||
meta: {
|
meta: {
|
||||||
requiresAuth: true,
|
requiresAuth: true,
|
||||||
@@ -26,9 +26,10 @@ const DASHBOARD = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "usercenter",
|
path: "usercenter",
|
||||||
name: "Usercenter",
|
name: "usercenter",
|
||||||
component: () => import("@/views/dashboard/usercenter/index.vue"),
|
component: () => import("@/views/dashboard/usercenter/index.vue"),
|
||||||
meta: {
|
meta: {
|
||||||
|
ignoreCache: false,
|
||||||
requiresAuth: true,
|
requiresAuth: true,
|
||||||
roles: ["*"],
|
roles: ["*"],
|
||||||
locale: "用户中心",
|
locale: "用户中心",
|
||||||
@@ -38,7 +39,7 @@ const DASHBOARD = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "usermanage",
|
path: "usermanage",
|
||||||
name: "Usermanage",
|
name: "usermanage",
|
||||||
component: () => import("@/views/dashboard/usermanage/index.vue"),
|
component: () => import("@/views/dashboard/usermanage/index.vue"),
|
||||||
meta: {
|
meta: {
|
||||||
requiresAuth: true,
|
requiresAuth: true,
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { DEFAULT_LAYOUT } from "../base"
|
|||||||
|
|
||||||
const DATAMANAGE = {
|
const DATAMANAGE = {
|
||||||
path: "/datamanage",
|
path: "/datamanage",
|
||||||
name: "Datamanage",
|
name: "datamanage",
|
||||||
component: DEFAULT_LAYOUT, // () => import("@/layout/default-layout.vue")
|
component: DEFAULT_LAYOUT, // () => import("@/layout/default-layout.vue")
|
||||||
meta: {
|
meta: {
|
||||||
requiresAuth: true,
|
requiresAuth: true,
|
||||||
@@ -14,7 +14,7 @@ const DATAMANAGE = {
|
|||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
path: "dictmanage",
|
path: "dictmanage",
|
||||||
name: "Dictmanage",
|
name: "dictmanage",
|
||||||
component: () => import("@/views/datamanage/dictmanage/index.vue"),
|
component: () => import("@/views/datamanage/dictmanage/index.vue"),
|
||||||
meta: {
|
meta: {
|
||||||
requiresAuth: true,
|
requiresAuth: true,
|
||||||
@@ -26,7 +26,7 @@ const DATAMANAGE = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "projContact",
|
path: "projContact",
|
||||||
name: "ProjContact",
|
name: "projContact",
|
||||||
component: () => import("@/views/datamanage/projContact/index.vue"),
|
component: () => import("@/views/datamanage/projContact/index.vue"),
|
||||||
meta: {
|
meta: {
|
||||||
requiresAuth: true,
|
requiresAuth: true,
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { DEFAULT_LAYOUT } from "../base"
|
|||||||
|
|
||||||
const TESTMANAGE = {
|
const TESTMANAGE = {
|
||||||
path: "/monitor",
|
path: "/monitor",
|
||||||
name: "Monitor",
|
name: "monitor",
|
||||||
component: DEFAULT_LAYOUT, // () => import("@/layout/default-layout.vue")
|
component: DEFAULT_LAYOUT, // () => import("@/layout/default-layout.vue")
|
||||||
meta: {
|
meta: {
|
||||||
requiresAuth: true,
|
requiresAuth: true,
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { DEFAULT_LAYOUT } from "../base"
|
|||||||
|
|
||||||
const TESTMANAGE = {
|
const TESTMANAGE = {
|
||||||
path: "/testmanage",
|
path: "/testmanage",
|
||||||
name: "Testmanage",
|
name: "testmanage",
|
||||||
component: DEFAULT_LAYOUT, // () => import("@/layout/default-layout.vue")
|
component: DEFAULT_LAYOUT, // () => import("@/layout/default-layout.vue")
|
||||||
meta: {
|
meta: {
|
||||||
requiresAuth: true,
|
requiresAuth: true,
|
||||||
@@ -14,7 +14,7 @@ const TESTMANAGE = {
|
|||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
path: "projmanage",
|
path: "projmanage",
|
||||||
name: "Projmanage",
|
name: "projmanage",
|
||||||
component: () => import("@/views/testmanage/projmanage/index.vue"),
|
component: () => import("@/views/testmanage/projmanage/index.vue"),
|
||||||
meta: {
|
meta: {
|
||||||
requiresAuth: true,
|
requiresAuth: true,
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ const formatTag = (route) => {
|
|||||||
const BAN_LIST = [REDIRECT_ROUTE_NAME]
|
const BAN_LIST = [REDIRECT_ROUTE_NAME]
|
||||||
const useTabBarStore = defineStore("tabBar", {
|
const useTabBarStore = defineStore("tabBar", {
|
||||||
state: () => ({
|
state: () => ({
|
||||||
|
// 修改:添加"用户中心到缓存"
|
||||||
cacheTabList: new Set([DEFAULT_ROUTE_NAME]),
|
cacheTabList: new Set([DEFAULT_ROUTE_NAME]),
|
||||||
tagList: [DEFAULT_ROUTE]
|
tagList: [DEFAULT_ROUTE]
|
||||||
}),
|
}),
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ const useUserStore = defineStore("user", {
|
|||||||
job: undefined,
|
job: undefined,
|
||||||
organization: undefined,
|
organization: undefined,
|
||||||
location: undefined,
|
location: undefined,
|
||||||
email: undefined,
|
|
||||||
introduction: undefined,
|
introduction: undefined,
|
||||||
personalWebsite: undefined,
|
personalWebsite: undefined,
|
||||||
jobName: undefined,
|
jobName: undefined,
|
||||||
|
|||||||
@@ -4,7 +4,11 @@
|
|||||||
label="旧密码"
|
label="旧密码"
|
||||||
field="oldPassword"
|
field="oldPassword"
|
||||||
label-col-flex="80px"
|
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-input-password v-model="password.oldPassword" allow-clear autocomplete="off" />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
@@ -12,7 +16,11 @@
|
|||||||
label="新密码"
|
label="新密码"
|
||||||
field="newPassword"
|
field="newPassword"
|
||||||
label-col-flex="80px"
|
label-col-flex="80px"
|
||||||
:rules="[{ required: true, message: '新密码必填' }]"
|
:rules="[
|
||||||
|
{ required: true, message: '新密码必填' },
|
||||||
|
{ minLength: 6, message: '密码长度至少6位' },
|
||||||
|
{ maxLength: 18, message: '密码最长18位' }
|
||||||
|
]"
|
||||||
>
|
>
|
||||||
<a-input-password
|
<a-input-password
|
||||||
v-model="password.newPassword"
|
v-model="password.newPassword"
|
||||||
@@ -69,14 +77,13 @@ const modifyPassword = async (data) => {
|
|||||||
Message.error("确认密码与新密码不一致")
|
Message.error("确认密码与新密码不一致")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
Message.error("由于采用LDAP认证,请联系内网管理员修改!")
|
const response = await user.modifyPassword(data.values)
|
||||||
// const response = await user.modifyPassword(data.values)
|
if (response.success) {
|
||||||
// if (response.success) {
|
tool.local.clear()
|
||||||
// tool.local.clear()
|
visible.value = true
|
||||||
// visible.value = true
|
} else {
|
||||||
// } else {
|
Message.error(response.message)
|
||||||
// Message.error(response.message)
|
}
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,9 +9,6 @@
|
|||||||
<a-form-item label="手机" label-col-flex="80px">
|
<a-form-item label="手机" label-col-flex="80px">
|
||||||
<a-input v-model="userInfo.phone" allow-clear />
|
<a-input v-model="userInfo.phone" allow-clear />
|
||||||
</a-form-item>
|
</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-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-textarea v-model="userInfo.introduction" :max-length="255" class="h-28" show-word-limit allow-clear />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
@@ -21,7 +18,7 @@
|
|||||||
</a-form>
|
</a-form>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup lang="ts">
|
||||||
import { reactive } from "vue"
|
import { reactive } from "vue"
|
||||||
import { useUserStore } from "@/store"
|
import { useUserStore } from "@/store"
|
||||||
import { Message } from "@arco-design/web-vue"
|
import { Message } from "@arco-design/web-vue"
|
||||||
@@ -32,9 +29,7 @@ const userInfo = reactive({
|
|||||||
...userStore.$state
|
...userStore.$state
|
||||||
})
|
})
|
||||||
|
|
||||||
const modifyInfo = async (data) => {
|
const modifyInfo = async (data: any) => {
|
||||||
// 注意要用values
|
Message.warning("请联系内网管理员进行修改")
|
||||||
console.log(data.values)
|
|
||||||
Message.error("由于采用LDAP登录无法修改!")
|
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -82,6 +82,11 @@ const operationLogList = computed(() => {
|
|||||||
return item
|
return item
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// 组件命名
|
||||||
|
defineOptions({
|
||||||
|
name: "usercenter"
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
|
|||||||
@@ -6,8 +6,8 @@
|
|||||||
<template #status="{ record }">
|
<template #status="{ record }">
|
||||||
<a-switch
|
<a-switch
|
||||||
:checked-value="1"
|
:checked-value="1"
|
||||||
unchecked-value="2"
|
:unchecked-value="2"
|
||||||
@change="changeStatus($event, record.id)"
|
:before-change="changeStatusWrapper(record)"
|
||||||
:default-checked="record.status == 1"
|
:default-checked="record.status == 1"
|
||||||
></a-switch>
|
></a-switch>
|
||||||
</template>
|
</template>
|
||||||
@@ -22,10 +22,12 @@ import userApi from "@/api/system/user"
|
|||||||
import user from "@/api/system/user"
|
import user from "@/api/system/user"
|
||||||
import { Message } from "@arco-design/web-vue"
|
import { Message } from "@arco-design/web-vue"
|
||||||
// 切换状态按钮
|
// 切换状态按钮
|
||||||
const changeStatus = async (e, id) => {
|
const changeStatusWrapper = (record) => {
|
||||||
const res = await userApi.changeUserStatus({ user_status: e, userId: id })
|
return async function (newVal) {
|
||||||
if (res.data) {
|
const res = await userApi.changeUserStatus({ user_status: newVal, userId: record.id })
|
||||||
Message.success(res.data === "1" ? "启用成功" : "禁用成功")
|
if (res.data) {
|
||||||
|
Message.success(res.data === "1" ? "启用成功" : "禁用成功")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// crud组件
|
// crud组件
|
||||||
@@ -104,13 +106,6 @@ const crudColumns = reactive([
|
|||||||
search: true,
|
search: true,
|
||||||
commonRules: [{ match: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "请输入正确的手机号码" }]
|
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: "密码",
|
title: "密码",
|
||||||
dataIndex: "password",
|
dataIndex: "password",
|
||||||
@@ -145,6 +140,10 @@ const crudColumns = reactive([
|
|||||||
formType: "range"
|
formType: "range"
|
||||||
}
|
}
|
||||||
])
|
])
|
||||||
|
|
||||||
|
defineOptions({
|
||||||
|
name: "usermanage"
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="less" scoped></style>
|
<style lang="less" scoped></style>
|
||||||
|
|||||||
@@ -6,6 +6,10 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import Statistics from "./components/statistics.vue"
|
import Statistics from "./components/statistics.vue"
|
||||||
|
|
||||||
|
defineOptions({
|
||||||
|
name: "workplace"
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="less" scoped></style>
|
<style lang="less" scoped></style>
|
||||||
|
|||||||
@@ -46,6 +46,10 @@ const crudColumns = ref([
|
|||||||
commonRules: [{ required: true, message: "全称和描述必填" }]
|
commonRules: [{ required: true, message: "全称和描述必填" }]
|
||||||
}
|
}
|
||||||
])
|
])
|
||||||
|
|
||||||
|
defineOptions({
|
||||||
|
name: "abbreviation"
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="less" scoped></style>
|
<style lang="less" scoped></style>
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ const crudOptions = ref({
|
|||||||
searchColNumber: 4,
|
searchColNumber: 4,
|
||||||
tablePagination: false,
|
tablePagination: false,
|
||||||
operationColumn: true,
|
operationColumn: true,
|
||||||
showTools:false,
|
showTools: false
|
||||||
})
|
})
|
||||||
|
|
||||||
const crudColumns = ref([
|
const crudColumns = ref([
|
||||||
@@ -108,8 +108,12 @@ const crudColumns = ref([
|
|||||||
search: true,
|
search: true,
|
||||||
formType: "range",
|
formType: "range",
|
||||||
width: 180
|
width: 180
|
||||||
},
|
}
|
||||||
])
|
])
|
||||||
|
|
||||||
|
defineOptions({
|
||||||
|
name: "dictmanage"
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="less" scoped></style>
|
<style lang="less" scoped></style>
|
||||||
|
|||||||
@@ -30,21 +30,28 @@ const crudOptions = ref({
|
|||||||
})
|
})
|
||||||
const crudColumns = ref([
|
const crudColumns = ref([
|
||||||
{ title: "ID", dataIndex: "id", addDisplay: false, editDisplay: false, width: 50, hide: true },
|
{ 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: "名称",
|
title: "名称",
|
||||||
align: "center",
|
align: "center",
|
||||||
dataIndex: "name",
|
dataIndex: "name",
|
||||||
search: true,
|
search: true,
|
||||||
width: 220,
|
width: 150,
|
||||||
commonRules: [{ required: true, message: "名称必填" }]
|
commonRules: [{ required: true, message: "名称必填" }]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: "简称",
|
||||||
|
align: "center",
|
||||||
|
dataIndex: "refer_name",
|
||||||
|
search: true,
|
||||||
|
commonRules: [{ required: true, message: "简称必填" }]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
title: "法人",
|
title: "法人",
|
||||||
align: "center",
|
align: "center",
|
||||||
dataIndex: "entrust_person",
|
dataIndex: "entrust_person",
|
||||||
search: true,
|
search: true,
|
||||||
width: 220,
|
width: 90,
|
||||||
commonRules: [{ required: true, message: "法人必填" }]
|
commonRules: [{ required: true, message: "法人必填" }]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -52,7 +59,7 @@ const crudColumns = ref([
|
|||||||
align: "center",
|
align: "center",
|
||||||
dataIndex: "addr",
|
dataIndex: "addr",
|
||||||
search: true,
|
search: true,
|
||||||
width: 200,
|
width: 150,
|
||||||
commonRules: [{ required: true, message: "公司地址必填" }]
|
commonRules: [{ required: true, message: "公司地址必填" }]
|
||||||
}
|
}
|
||||||
])
|
])
|
||||||
|
|||||||
@@ -89,8 +89,8 @@ const router = useRouter()
|
|||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
const userStore = useUserStore()
|
const userStore = useUserStore()
|
||||||
// 绑定登录form的数据
|
// 绑定登录form的数据
|
||||||
const form = reactive({ username: "superAdmin", password: "admin123", code: "" })
|
// const form = reactive({ username: "superAdmin", password: "admin123", code: "" })
|
||||||
// const form = reactive({ username: "", password: "", code: "" })
|
const form = reactive({ username: "", password: "", code: "" })
|
||||||
// 获取验证码dom && arco表单loading
|
// 获取验证码dom && arco表单loading
|
||||||
const Verify = ref(null)
|
const Verify = ref(null)
|
||||||
const loading = ref(null)
|
const loading = ref(null)
|
||||||
@@ -108,7 +108,7 @@ const handleSubmit = async ({ values, errors }) => {
|
|||||||
if (login_res) {
|
if (login_res) {
|
||||||
const { redirect, ...otherQuery } = router.currentRoute.value.query
|
const { redirect, ...otherQuery } = router.currentRoute.value.query
|
||||||
router.push({
|
router.push({
|
||||||
name: redirect || "Workplace",
|
name: redirect || "workplace",
|
||||||
query: {
|
query: {
|
||||||
...otherQuery // 将退出时的查询参数放入,这样就不会错误
|
...otherQuery // 将退出时的查询参数放入,这样就不会错误
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -81,6 +81,10 @@ const crudColumns = ref([
|
|||||||
editDisplay: false
|
editDisplay: false
|
||||||
}
|
}
|
||||||
])
|
])
|
||||||
|
|
||||||
|
defineOptions({
|
||||||
|
name: "loginLog"
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="less" scoped></style>
|
<style lang="less" scoped></style>
|
||||||
|
|||||||
@@ -50,6 +50,10 @@ const handleDeleteAllLogButton = async () => {
|
|||||||
crudRef.value.refresh()
|
crudRef.value.refresh()
|
||||||
Message.success(res.message)
|
Message.success(res.message)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
defineOptions({
|
||||||
|
name: "operationLog"
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="less" scoped></style>
|
<style lang="less" scoped></style>
|
||||||
|
|||||||
@@ -85,6 +85,10 @@ const crudColumns = ref([
|
|||||||
{ title: "请求参数", dataIndex: "request_body", hide: true, formType: "textarea" },
|
{ title: "请求参数", dataIndex: "request_body", hide: true, formType: "textarea" },
|
||||||
{ title: "返回信息", dataIndex: "json_result", hide: true, formType: "textarea" }
|
{ title: "返回信息", dataIndex: "json_result", hide: true, formType: "textarea" }
|
||||||
])
|
])
|
||||||
|
|
||||||
|
defineOptions({
|
||||||
|
name: "operations"
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="less" scoped></style>
|
<style lang="less" scoped></style>
|
||||||
|
|||||||
@@ -84,7 +84,6 @@ const handleRelatedChange = async (record) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
loading.value = false
|
loading.value = false
|
||||||
// 更新树状目录中,case显示“<”“@”“X”的更新
|
|
||||||
treeStore.updateCaseTreeData(res.data, route.query.id)
|
treeStore.updateCaseTreeData(res.data, route.query.id)
|
||||||
emits("relatedOrunrelated")
|
emits("relatedOrunrelated")
|
||||||
}
|
}
|
||||||
@@ -349,7 +348,7 @@ const columns = ref([
|
|||||||
{
|
{
|
||||||
title: "问题描述",
|
title: "问题描述",
|
||||||
hide: true,
|
hide: true,
|
||||||
search: true,
|
search: false,
|
||||||
dataIndex: "operation",
|
dataIndex: "operation",
|
||||||
formType: "editor"
|
formType: "editor"
|
||||||
},
|
},
|
||||||
@@ -391,14 +390,26 @@ const columns = ref([
|
|||||||
hide: true,
|
hide: true,
|
||||||
formType: "select",
|
formType: "select",
|
||||||
commonRules: [{ required: true, message: "测试人员必填" }],
|
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: "悬挂状态",
|
title: "悬挂状态",
|
||||||
dataIndex: "hang",
|
dataIndex: "hang",
|
||||||
search: false,
|
search: true,
|
||||||
|
formType: "select",
|
||||||
addDisplay: false,
|
addDisplay: false,
|
||||||
editDisplay: false,
|
editDisplay: false,
|
||||||
|
dict: {
|
||||||
|
data: [
|
||||||
|
{ label: "悬挂", value: "1" },
|
||||||
|
{ label: "已有关联", value: "2" }
|
||||||
|
]
|
||||||
|
},
|
||||||
align: "center",
|
align: "center",
|
||||||
customRender: ({ record }) => {
|
customRender: ({ record }) => {
|
||||||
// 判断是否为悬挂状态record.hang[Boolean]
|
// 判断是否为悬挂状态record.hang[Boolean]
|
||||||
@@ -452,7 +463,12 @@ const columns = ref([
|
|||||||
dataIndex: "verifyPerson",
|
dataIndex: "verifyPerson",
|
||||||
formType: "select",
|
formType: "select",
|
||||||
commonRules: [{ required: true, message: "回归人" }],
|
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: "回归日期",
|
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 },
|
delete: { show: true, api: problemApi.delete },
|
||||||
operationColumnAlign: "center", // 操作列居中
|
operationColumnAlign: "center", // 操作列居中
|
||||||
// 列表选项卡配置
|
// 列表选项卡配置
|
||||||
tabs:{},
|
tabs: {},
|
||||||
beforeOpenAdd: function () {
|
beforeOpenAdd: function () {
|
||||||
// 先判断是否已经有个问题单了,如果有则不让用户创建
|
// 先判断是否已经有个问题单了,如果有则不让用户创建
|
||||||
if (crudRef.value.getTableData().length >= 1) {
|
if (crudRef.value.getTableData().length >= 1) {
|
||||||
@@ -108,7 +108,7 @@ const crudOptions = ref({
|
|||||||
},
|
},
|
||||||
showIndex: false,
|
showIndex: false,
|
||||||
showTools: false,
|
showTools: false,
|
||||||
operationColumnAlign:'center',
|
operationColumnAlign: "center",
|
||||||
rowSelection: { showCheckedAll: true },
|
rowSelection: { showCheckedAll: true },
|
||||||
searchColNumber: 3,
|
searchColNumber: 3,
|
||||||
tablePagination: false,
|
tablePagination: false,
|
||||||
@@ -311,36 +311,42 @@ const crudColumns = ref([
|
|||||||
title: "问题描述",
|
title: "问题描述",
|
||||||
hide: true,
|
hide: true,
|
||||||
search: true,
|
search: true,
|
||||||
|
align: "center",
|
||||||
dataIndex: "operation",
|
dataIndex: "operation",
|
||||||
formType: "editor",
|
formType: "editor"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "问题影响",
|
title: "问题影响",
|
||||||
hide: true,
|
hide: true,
|
||||||
|
align: "center",
|
||||||
dataIndex: "result",
|
dataIndex: "result",
|
||||||
formType: "textarea",
|
formType: "textarea"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "原因分析",
|
title: "原因分析",
|
||||||
hide: true,
|
hide: true,
|
||||||
|
align: "center",
|
||||||
dataIndex: "analysis",
|
dataIndex: "analysis",
|
||||||
formType: "editor",
|
formType: "editor"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "影响域分析",
|
title: "影响域分析",
|
||||||
hide: true,
|
hide: true,
|
||||||
|
align: "center",
|
||||||
dataIndex: "effect_scope",
|
dataIndex: "effect_scope",
|
||||||
formType: "textarea",
|
formType: "textarea"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "改正措施",
|
title: "改正措施",
|
||||||
hide: true,
|
hide: true,
|
||||||
|
align: "center",
|
||||||
dataIndex: "solve",
|
dataIndex: "solve",
|
||||||
formType: "textarea"
|
formType: "textarea"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "回归结果",
|
title: "回归结果",
|
||||||
hide: true,
|
hide: true,
|
||||||
|
align: "center",
|
||||||
dataIndex: "verify_result",
|
dataIndex: "verify_result",
|
||||||
formType: "editor"
|
formType: "editor"
|
||||||
},
|
},
|
||||||
@@ -348,9 +354,15 @@ const crudColumns = ref([
|
|||||||
title: "测试人员",
|
title: "测试人员",
|
||||||
dataIndex: "postPerson",
|
dataIndex: "postPerson",
|
||||||
search: true,
|
search: true,
|
||||||
|
align: "center",
|
||||||
formType: "select",
|
formType: "select",
|
||||||
commonRules: [{ required: true, message: "测试人员必填" }],
|
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: "测试日期",
|
title: "测试日期",
|
||||||
@@ -377,7 +389,12 @@ const crudColumns = ref([
|
|||||||
dataIndex: "verifyPerson",
|
dataIndex: "verifyPerson",
|
||||||
formType: "select",
|
formType: "select",
|
||||||
commonRules: [{ required: true, message: "提单人必填" }],
|
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: "回归日期",
|
title: "回归日期",
|
||||||
@@ -386,6 +403,10 @@ const crudColumns = ref([
|
|||||||
formType: "date"
|
formType: "date"
|
||||||
}
|
}
|
||||||
])
|
])
|
||||||
|
|
||||||
|
defineOptions({
|
||||||
|
name: "case"
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="less" scoped></style>
|
<style lang="less" scoped></style>
|
||||||
|
|||||||
@@ -15,6 +15,8 @@
|
|||||||
关联测试项
|
关联测试项
|
||||||
</a-button>
|
</a-button>
|
||||||
</template>
|
</template>
|
||||||
|
<!-- 版本字段的插槽 -->
|
||||||
|
<template #inputPrepend-ident> XQ_XX_ </template>
|
||||||
</ma-crud>
|
</ma-crud>
|
||||||
</div>
|
</div>
|
||||||
<!-- 关联的modal组件 -->
|
<!-- 关联的modal组件 -->
|
||||||
@@ -41,7 +43,7 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref, computed } from "vue"
|
import { ref, computed } from "vue"
|
||||||
import { useRoute, useRouter } from "vue-router"
|
import { useRoute } from "vue-router"
|
||||||
import testDemandApi from "@/api/project/testDemand"
|
import testDemandApi from "@/api/project/testDemand"
|
||||||
import { useTreeDataStore } from "@/store"
|
import { useTreeDataStore } from "@/store"
|
||||||
import commonApi from "@/api/common"
|
import commonApi from "@/api/common"
|
||||||
@@ -50,7 +52,6 @@ import { Message } from "@arco-design/web-vue"
|
|||||||
|
|
||||||
const treeDataStore = useTreeDataStore()
|
const treeDataStore = useTreeDataStore()
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
const router = useRouter()
|
|
||||||
const crudRef = ref()
|
const crudRef = ref()
|
||||||
// 根据传参获取key,分别为轮次、设计需求的key
|
// 根据传参获取key,分别为轮次、设计需求的key
|
||||||
const roundNumber = route.query.key.split("-")[0]
|
const roundNumber = route.query.key.split("-")[0]
|
||||||
@@ -197,6 +198,7 @@ const crudOptions = ref({
|
|||||||
searchColNumber: 3,
|
searchColNumber: 3,
|
||||||
tablePagination: false,
|
tablePagination: false,
|
||||||
operationColumn: true,
|
operationColumn: true,
|
||||||
|
operationColumnAlign:'center',
|
||||||
formOption: {
|
formOption: {
|
||||||
width: 1200
|
width: 1200
|
||||||
}
|
}
|
||||||
@@ -205,7 +207,7 @@ const crudColumns = ref([
|
|||||||
{
|
{
|
||||||
title: "ID",
|
title: "ID",
|
||||||
align: "center",
|
align: "center",
|
||||||
width: 50,
|
hide: true,
|
||||||
dataIndex: "id"
|
dataIndex: "id"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -217,7 +219,8 @@ const crudColumns = ref([
|
|||||||
search: true,
|
search: true,
|
||||||
validateTrigger: "blur",
|
validateTrigger: "blur",
|
||||||
placeholder: "请填写测试项的标识,注意标识不能重复",
|
placeholder: "请填写测试项的标识,注意标识不能重复",
|
||||||
commonRules: [{ required: true, message: "测试项标识必填" }]
|
commonRules: [{ required: true, message: "测试项标识必填" }],
|
||||||
|
openPrepend: true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "名称",
|
title: "名称",
|
||||||
@@ -262,7 +265,7 @@ const crudColumns = ref([
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "测试手段",
|
title: "测试手段",
|
||||||
@@ -339,6 +342,10 @@ const refreshCrudTable = () => {
|
|||||||
crudRef.value.refresh()
|
crudRef.value.refresh()
|
||||||
}
|
}
|
||||||
defineExpose({ refreshCrudTable })
|
defineExpose({ refreshCrudTable })
|
||||||
|
|
||||||
|
defineOptions({
|
||||||
|
name: "designDemand"
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="less" scoped>
|
<style lang="less" scoped>
|
||||||
|
|||||||
@@ -20,18 +20,12 @@
|
|||||||
@change="handleUploadChange"
|
@change="handleUploadChange"
|
||||||
></a-upload>
|
></a-upload>
|
||||||
</div>
|
</div>
|
||||||
<a-alert :style="{ margin: '10px 0' }" type="warning"
|
<a-alert :style="{ margin: '10px 0' }" type="warning">
|
||||||
>上传录入提示信息:硬性要求,本辅助程序根据GJB438C文档结构进行解析,要求:1.功能需求章节必须包含<span
|
请去除需求规格说明文件中不必要的部分再来此处解析,注意:本系统不支持word中emf格式图片,如果使用了visio等图片请<span
|
||||||
class="important-text"
|
class="important-text"
|
||||||
>“CSCI功能需求”</span
|
>在word变为普通图片上传</span
|
||||||
>或<span class="important-text">“CSCI能力需求”</span>文字,且章节级别必须为<span class="important-text"
|
>
|
||||||
>2级</span
|
</a-alert>
|
||||||
>; 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">
|
<div class="operation-container">
|
||||||
<span :style="{ marginRight: '10px', fontWeight: 700 }">操作按钮:</span>
|
<span :style="{ marginRight: '10px', fontWeight: 700 }">操作按钮:</span>
|
||||||
<a-space>
|
<a-space>
|
||||||
@@ -39,7 +33,7 @@
|
|||||||
<a-button type="outline" status="warning" @click="handleResetData">重置数据</a-button>
|
<a-button type="outline" status="warning" @click="handleResetData">重置数据</a-button>
|
||||||
</a-space>
|
</a-space>
|
||||||
</div>
|
</div>
|
||||||
<a-spin :loading="loading" tip="解析word完成,需要时间渲染HTML元素..." :style="{ width: '100%' }">
|
<a-spin :loading="loading" tip="解析word完成,正在渲染界面..." :style="{ width: '100%' }">
|
||||||
<div class="demand-container">
|
<div class="demand-container">
|
||||||
<a-list :data="htmlData" :pagination-props="{ defaultPageSize: 15, total: htmlData.length }">
|
<a-list :data="htmlData" :pagination-props="{ defaultPageSize: 15, total: htmlData.length }">
|
||||||
<template #item="{ item, index }">
|
<template #item="{ item, index }">
|
||||||
@@ -117,6 +111,7 @@ import dictApi from "@/api/system/dict"
|
|||||||
import demandApi from "@/api/project/designDemand"
|
import demandApi from "@/api/project/designDemand"
|
||||||
import { useRoute, useRouter } from "vue-router"
|
import { useRoute, useRouter } from "vue-router"
|
||||||
import { parseHtmlStringByDemandDut } from "@/views/project/dut/tools/parseHtmlString"
|
import { parseHtmlStringByDemandDut } from "@/views/project/dut/tools/parseHtmlString"
|
||||||
|
import { HtmlParser } from "@/views/project/dut/tools/parser"
|
||||||
import { useTreeDataStore } from "@/store"
|
import { useTreeDataStore } from "@/store"
|
||||||
// 其他初始化数据
|
// 其他初始化数据
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
@@ -169,8 +164,8 @@ const handleRquest = function (options) {
|
|||||||
// 已经上传到浏览器了,需要解析为列表
|
// 已经上传到浏览器了,需要解析为列表
|
||||||
onSuccess(1)
|
onSuccess(1)
|
||||||
const rawHtml = res.value
|
const rawHtml = res.value
|
||||||
const finalData = parseHtmlStringByDemandDut(rawHtml)
|
const parser = new HtmlParser(rawHtml)
|
||||||
// 将finalData赋值给响应式数据ref变量:htmlData
|
const finalData = parser.parseToArray()
|
||||||
htmlData.value = finalData
|
htmlData.value = finalData
|
||||||
// ~~~~使用nextTick:等待DOM更新完成~~~~
|
// ~~~~使用nextTick:等待DOM更新完成~~~~
|
||||||
nextTick(() => {
|
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>
|
</a-button>
|
||||||
</template>
|
</template>
|
||||||
|
<!-- 字段的前缀后缀的插槽 -->
|
||||||
|
<!-- 版本字段的插槽 -->
|
||||||
|
<template #inputPrepend-ident> SJ-XX- </template>
|
||||||
</ma-crud>
|
</ma-crud>
|
||||||
</div>
|
</div>
|
||||||
<file-input-modal ref="fileInputRef"></file-input-modal>
|
<file-input-modal ref="fileInputRef"></file-input-modal>
|
||||||
@@ -119,6 +122,7 @@ const crudColumns = ref([
|
|||||||
title: "ID",
|
title: "ID",
|
||||||
align: "center",
|
align: "center",
|
||||||
width: 50,
|
width: 50,
|
||||||
|
hide: true,
|
||||||
dataIndex: "id",
|
dataIndex: "id",
|
||||||
commonRules: [{ required: true, message: "ID必填" }],
|
commonRules: [{ required: true, message: "ID必填" }],
|
||||||
validateTrigger: "blur"
|
validateTrigger: "blur"
|
||||||
@@ -132,7 +136,8 @@ const crudColumns = ref([
|
|||||||
search: true,
|
search: true,
|
||||||
validateTrigger: "blur",
|
validateTrigger: "blur",
|
||||||
placeholder: "请输入文档中设计需求的标识",
|
placeholder: "请输入文档中设计需求的标识",
|
||||||
help: '若不知道则填"无"或不填'
|
help: '若不知道则填"无"或不填',
|
||||||
|
openPrepend: true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "设需名称",
|
title: "设需名称",
|
||||||
@@ -191,8 +196,7 @@ const crudColumns = ref([
|
|||||||
{
|
{
|
||||||
title: "接口来源",
|
title: "接口来源",
|
||||||
dataIndex: "source",
|
dataIndex: "source",
|
||||||
hide: true,
|
hide: true
|
||||||
extra: "接口独有四个字段,决定大纲的接口列表信息"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "目的地",
|
title: "目的地",
|
||||||
@@ -206,11 +210,10 @@ const crudColumns = ref([
|
|||||||
{
|
{
|
||||||
title: "接口类型",
|
title: "接口类型",
|
||||||
dataIndex: "type",
|
dataIndex: "type",
|
||||||
hide: true,
|
hide: true
|
||||||
extra: "接口类型例如:网络"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "接口协议",
|
title: "接口内容",
|
||||||
dataIndex: "protocal",
|
dataIndex: "protocal",
|
||||||
hide: true
|
hide: true
|
||||||
}
|
}
|
||||||
@@ -232,6 +235,10 @@ const fileInputRef = ref(null)
|
|||||||
const handleAddFileInputDemand = () => {
|
const handleAddFileInputDemand = () => {
|
||||||
fileInputRef.value.open()
|
fileInputRef.value.open()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
defineOptions({
|
||||||
|
name: "dut"
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="less" scoped></style>
|
<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()
|
fetchProblemData()
|
||||||
|
|
||||||
|
defineOptions({
|
||||||
|
name: "problem"
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="less" scoped></style>
|
<style lang="less" scoped></style>
|
||||||
|
|||||||
@@ -2,7 +2,10 @@
|
|||||||
<div class="ma-content-block lg:flex justify-between p-4">
|
<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">
|
<div class="lg:w-full w-full lg:ml-4 mt-5 lg:mt-0">
|
||||||
<!-- CRUD组件 -->
|
<!-- 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>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -81,6 +84,7 @@ const crudColumns = ref([
|
|||||||
title: "ID",
|
title: "ID",
|
||||||
width: 50,
|
width: 50,
|
||||||
align: "center",
|
align: "center",
|
||||||
|
hide: true,
|
||||||
dataIndex: "id",
|
dataIndex: "id",
|
||||||
commonRules: [{ required: true, message: "ID是必填" }],
|
commonRules: [{ required: true, message: "ID是必填" }],
|
||||||
validateTrigger: "blur"
|
validateTrigger: "blur"
|
||||||
@@ -152,7 +156,9 @@ const crudColumns = ref([
|
|||||||
dataIndex: "version",
|
dataIndex: "version",
|
||||||
search: true,
|
search: true,
|
||||||
commonRules: [{ required: true, message: "版本必填" }],
|
commonRules: [{ required: true, message: "版本必填" }],
|
||||||
validateTrigger: "blur"
|
validateTrigger: "blur",
|
||||||
|
help: "填写不带V字符",
|
||||||
|
openPrepend: true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "用户标识",
|
title: "用户标识",
|
||||||
@@ -271,6 +277,10 @@ const crudColumns = ref([
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
])
|
])
|
||||||
|
|
||||||
|
defineOptions({
|
||||||
|
name: "round"
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="less" scoped></style>
|
<style lang="less" scoped></style>
|
||||||
|
|||||||
@@ -8,15 +8,18 @@
|
|||||||
</template>
|
</template>
|
||||||
</ma-crud>
|
</ma-crud>
|
||||||
</div>
|
</div>
|
||||||
|
<problem-form ref="problemFormRef" :title="title"></problem-form>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="jsx">
|
<script setup lang="jsx">
|
||||||
import { ref } from "vue"
|
import { ref } from "vue"
|
||||||
import { useRoute, useRouter } from "vue-router"
|
import { useRoute } from "vue-router"
|
||||||
import caseApi from "@/api/project/case"
|
import caseApi from "@/api/project/case"
|
||||||
import dictApi from "@/api/system/dict"
|
|
||||||
import { useTreeDataStore } from "@/store"
|
import { useTreeDataStore } from "@/store"
|
||||||
|
import ProblemForm from "@/views/project/case/components/ProblemForm.vue"
|
||||||
|
const problemFormRef = ref(null)
|
||||||
|
const title = ref("问题单表单")
|
||||||
const treeDataStore = useTreeDataStore()
|
const treeDataStore = useTreeDataStore()
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
const roundNumber = route.query.key.split("-")[0]
|
const roundNumber = route.query.key.split("-")[0]
|
||||||
@@ -37,7 +40,8 @@ const crudOptions = ref({
|
|||||||
add: { show: true, api: caseApi.save, text: "新增用例" },
|
add: { show: true, api: caseApi.save, text: "新增用例" },
|
||||||
edit: { show: true, api: caseApi.update, text: "修改用例" },
|
edit: { show: true, api: caseApi.update, text: "修改用例" },
|
||||||
delete: { show: true, api: caseApi.delete },
|
delete: { show: true, api: caseApi.delete },
|
||||||
operationColumnAlign:'center',
|
operationColumnAlign: "center",
|
||||||
|
isDbClickEdit: false, // 关闭双击编辑
|
||||||
// 处理新增删除后树状图显示
|
// 处理新增删除后树状图显示
|
||||||
beforeOpenAdd: function () {
|
beforeOpenAdd: function () {
|
||||||
let key_split = route.query.key.split("-")
|
let key_split = route.query.key.split("-")
|
||||||
@@ -142,6 +146,7 @@ const crudColumns = ref([
|
|||||||
title: "ID",
|
title: "ID",
|
||||||
width: 60,
|
width: 60,
|
||||||
align: "center",
|
align: "center",
|
||||||
|
hide: true,
|
||||||
dataIndex: "id",
|
dataIndex: "id",
|
||||||
fixed: "left"
|
fixed: "left"
|
||||||
},
|
},
|
||||||
@@ -152,8 +157,8 @@ const crudColumns = ref([
|
|||||||
width: 140,
|
width: 140,
|
||||||
align: "center",
|
align: "center",
|
||||||
addDisabled: true,
|
addDisabled: true,
|
||||||
addDefaultValue: route.query.key,
|
addDefaultValue: "用例标识自动生成,结构为YL_IO_XXXX_001",
|
||||||
editDefaultValue: route.query.key,
|
editDefaultValue: "用例标识自动生成,结构为YL_IO_XXXX_001",
|
||||||
editDisabled: true,
|
editDisabled: true,
|
||||||
search: true,
|
search: true,
|
||||||
validateTrigger: "blur"
|
validateTrigger: "blur"
|
||||||
@@ -243,15 +248,20 @@ const crudColumns = ref([
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
title: "设计人员",
|
title: "设计人员",
|
||||||
width: 80,
|
width: 80,
|
||||||
dataIndex: "designPerson",
|
dataIndex: "designPerson",
|
||||||
align: "center",
|
align: "center",
|
||||||
|
hide: true,
|
||||||
search: true,
|
search: true,
|
||||||
formType: "select",
|
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: "执行人员",
|
title: "执行人员",
|
||||||
@@ -260,7 +270,12 @@ const crudColumns = ref([
|
|||||||
align: "center",
|
align: "center",
|
||||||
search: true,
|
search: true,
|
||||||
formType: "select",
|
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: "审核人员",
|
title: "审核人员",
|
||||||
@@ -269,7 +284,12 @@ const crudColumns = ref([
|
|||||||
align: "center",
|
align: "center",
|
||||||
hide: true,
|
hide: true,
|
||||||
formType: "select",
|
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: "用例综述",
|
title: "用例综述",
|
||||||
@@ -345,6 +365,28 @@ const crudColumns = ref([
|
|||||||
commonRules: [{ required: true, message: "执行状态必填" }]
|
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()
|
crudRef.value.refresh()
|
||||||
}
|
}
|
||||||
defineExpose({ refreshCrudTable })
|
defineExpose({ refreshCrudTable })
|
||||||
|
|
||||||
|
defineOptions({
|
||||||
|
name: "testDemand"
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="less" scoped></style>
|
<style lang="less" scoped></style>
|
||||||
|
|||||||
@@ -8,6 +8,10 @@ const router = useRouter()
|
|||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
const gotoPath = route.params.path as string
|
const gotoPath = route.params.path as string
|
||||||
router.replace({ path: gotoPath })
|
router.replace({ path: gotoPath })
|
||||||
|
|
||||||
|
defineOptions({
|
||||||
|
name: "redirect"
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="less" scoped></style>
|
<style lang="less" scoped></style>
|
||||||
|
|||||||
@@ -25,20 +25,46 @@
|
|||||||
</a-timeline-item>
|
</a-timeline-item>
|
||||||
<div class="info">
|
<div class="info">
|
||||||
<a-alert>测试人员填写的项目开始时间、结束时间、轮次时间均会影响生成文档的时间!</a-alert>
|
<a-alert>测试人员填写的项目开始时间、结束时间、轮次时间均会影响生成文档的时间!</a-alert>
|
||||||
|
<a-button type="primary" @click="handleModalVisible">展示目前文档生成的日期</a-button>
|
||||||
</div>
|
</div>
|
||||||
</a-timeline>
|
</a-timeline>
|
||||||
</div>
|
</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>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
|
import { useDocTimeShow } from "./useDocTimeShow"
|
||||||
|
// 在一开始就请求接口
|
||||||
// 1.定义props
|
// 1.定义props
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
pInfo: {
|
pInfo: {
|
||||||
type: Object,
|
type: Object,
|
||||||
required: true
|
required: true
|
||||||
|
},
|
||||||
|
projectId: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
const { visible, handleModalVisible, timeList } = useDocTimeShow(props.projectId)
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="less" scoped>
|
<style lang="less" scoped>
|
||||||
@@ -56,6 +82,10 @@ const props = defineProps({
|
|||||||
position: absolute;
|
position: absolute;
|
||||||
right: 30px;
|
right: 30px;
|
||||||
top: 1rem;
|
top: 1rem;
|
||||||
|
button {
|
||||||
|
width: 180px;
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.a-col-title {
|
.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>
|
<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>
|
<round-info v-for="item in loadingData.statistics" :data="item"></round-info>
|
||||||
</a-layout-content>
|
</a-layout-content>
|
||||||
@@ -24,6 +24,10 @@ const fetchData = async () => {
|
|||||||
return projectApi.getBoardInfo(route.params.projectId)
|
return projectApi.getBoardInfo(route.params.projectId)
|
||||||
}
|
}
|
||||||
const { loadingData, isDataLoading } = useFetchData({}, fetchData)
|
const { loadingData, isDataLoading } = useFetchData({}, fetchData)
|
||||||
|
|
||||||
|
defineOptions({
|
||||||
|
name: "projBoard"
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="less" scoped>
|
<style lang="less" scoped>
|
||||||
|
|||||||
@@ -798,6 +798,10 @@ const crudColumns = ref([
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
])
|
])
|
||||||
|
|
||||||
|
defineOptions({
|
||||||
|
name: "projmanage"
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="less" scoped>
|
<style lang="less" scoped>
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
"jsx": "preserve",
|
"jsx": "preserve",
|
||||||
"allowJs": true,
|
"allowJs": true,
|
||||||
"strictFunctionTypes": false,
|
"strictFunctionTypes": false,
|
||||||
|
"strictNullChecks": true,
|
||||||
"allowSyntheticDefaultImports": true,
|
"allowSyntheticDefaultImports": true,
|
||||||
"forceConsistentCasingInFileNames": true,
|
"forceConsistentCasingInFileNames": true,
|
||||||
"inlineSources": false,
|
"inlineSources": false,
|
||||||
@@ -21,6 +22,7 @@
|
|||||||
"resolveJsonModule": true,
|
"resolveJsonModule": true,
|
||||||
"removeComments": true,
|
"removeComments": true,
|
||||||
"noImplicitAny": false,
|
"noImplicitAny": false,
|
||||||
|
"noImplicitThis": true,
|
||||||
"experimentalDecorators": true,
|
"experimentalDecorators": true,
|
||||||
"target": "esnext",
|
"target": "esnext",
|
||||||
"module": "esnext",
|
"module": "esnext",
|
||||||
@@ -47,14 +49,13 @@
|
|||||||
},
|
},
|
||||||
"include": [
|
"include": [
|
||||||
"src/**/*",
|
"src/**/*",
|
||||||
"mock",
|
|
||||||
"vite.config.ts",
|
"vite.config.ts",
|
||||||
"node_modules",
|
|
||||||
"dist",
|
|
||||||
"build"
|
|
||||||
],
|
],
|
||||||
"exclude": [
|
"exclude": [
|
||||||
"node_modules",
|
"node_modules",
|
||||||
"build/**/*"
|
"mock",
|
||||||
|
"build/**/*",
|
||||||
|
"dist",
|
||||||
|
"build"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user