This commit is contained in:
2024-06-13 19:41:57 +08:00
parent b8df6f3403
commit b6f56fe5d8
31 changed files with 691 additions and 273 deletions

View File

@@ -1,53 +0,0 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": 4,
"id": "db3fdebd-b7cd-4a83-9f52-2b01691dfcbd",
"metadata": {},
"outputs": [
{
"ename": "TypeError",
"evalue": "ord() expected a character, but string of length 2 found",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------\u001b[0m",
"\u001b[1;31mTypeError\u001b[0mTraceback (most recent call last)",
"Cell \u001b[1;32mIn[4], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;28;43mord\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m12\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m)\n",
"\u001b[1;31mTypeError\u001b[0m: ord() expected a character, but string of length 2 found"
]
}
],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "7a1670a0-01da-495a-a2b7-9dd635238477",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.10"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

258
cdTMP/package-lock.json generated
View File

@@ -9,7 +9,7 @@
"version": "0.0.1",
"dependencies": {
"@arco-design/color": "^0.4.0",
"@arco-design/web-vue": "^2.55.2",
"@arco-design/web-vue": "^2.55.3",
"@tinymce/tinymce-vue": "^5.1.1",
"@vueuse/core": "^10.1.2",
"axios": "^1.4.0",
@@ -47,11 +47,11 @@
"autoprefixer": "^10.4.14",
"browserslist": "^4.23.0",
"caniuse-lite": "^1.0.30001591",
"eslint": "^8.42.0",
"eslint-plugin-vue": "^9.14.1",
"less": "^4.1.3",
"eslint": "^8.57.0",
"eslint-plugin-vue": "^9.26.0",
"less": "^4.2.0",
"less-loader": "^11.1.2",
"postcss": "^8.4.24",
"postcss": "^8.4.38",
"prettier": "^2.8.8",
"tailwindcss": "^3.3.2",
"vite": "^5.2.12"
@@ -88,9 +88,9 @@
}
},
"node_modules/@arco-design/web-vue": {
"version": "2.55.2",
"resolved": "https://registry.npmmirror.com/@arco-design/web-vue/-/web-vue-2.55.2.tgz",
"integrity": "sha512-aEuX0a7u1Qif5VYuCM/NFfbFfKA4GiOl3nOoaZEH/W6jhJh/RTmEVAYxJv8j6AYhPySj7ULfel4USVngP31E0Q==",
"version": "2.55.3",
"resolved": "https://registry.npmmirror.com/@arco-design/web-vue/-/web-vue-2.55.3.tgz",
"integrity": "sha512-gOyEPD0XdaeGIOD7+dypY7+vCE18Y2cG+6R1e56oNGPTk3q+Wj1X6iMpBXVAGiKykvH3BpsCEBFxMtJmKXCR5A==",
"dependencies": {
"@arco-design/color": "^0.4.0",
"b-tween": "^0.3.3",
@@ -921,23 +921,23 @@
}
},
"node_modules/@eslint-community/regexpp": {
"version": "4.5.1",
"resolved": "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.5.1.tgz",
"integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==",
"version": "4.10.1",
"resolved": "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.10.1.tgz",
"integrity": "sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==",
"dev": true,
"engines": {
"node": "^12.0.0 || ^14.0.0 || >=16.0.0"
}
},
"node_modules/@eslint/eslintrc": {
"version": "2.0.3",
"resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.0.3.tgz",
"integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==",
"version": "2.1.4",
"resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
"integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
"dev": true,
"dependencies": {
"ajv": "^6.12.4",
"debug": "^4.3.2",
"espree": "^9.5.2",
"espree": "^9.6.0",
"globals": "^13.19.0",
"ignore": "^5.2.0",
"import-fresh": "^3.2.1",
@@ -947,37 +947,43 @@
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
"node_modules/@eslint/eslintrc/node_modules/globals": {
"version": "13.20.0",
"resolved": "https://registry.npmmirror.com/globals/-/globals-13.20.0.tgz",
"integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
"version": "13.24.0",
"resolved": "https://registry.npmmirror.com/globals/-/globals-13.24.0.tgz",
"integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
"dev": true,
"dependencies": {
"type-fest": "^0.20.2"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@eslint/js": {
"version": "8.42.0",
"resolved": "https://registry.npmmirror.com/@eslint/js/-/js-8.42.0.tgz",
"integrity": "sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==",
"version": "8.57.0",
"resolved": "https://registry.npmmirror.com/@eslint/js/-/js-8.57.0.tgz",
"integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
"dev": true,
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
}
},
"node_modules/@humanwhocodes/config-array": {
"version": "0.11.10",
"resolved": "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.11.10.tgz",
"integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==",
"version": "0.11.14",
"resolved": "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
"integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
"dev": true,
"dependencies": {
"@humanwhocodes/object-schema": "^1.2.1",
"debug": "^4.1.1",
"@humanwhocodes/object-schema": "^2.0.2",
"debug": "^4.3.1",
"minimatch": "^3.0.5"
},
"engines": {
@@ -994,9 +1000,9 @@
}
},
"node_modules/@humanwhocodes/object-schema": {
"version": "1.2.1",
"resolved": "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
"integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
"version": "2.0.3",
"resolved": "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
"integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
"dev": true
},
"node_modules/@jridgewell/gen-mapping": {
@@ -1384,6 +1390,12 @@
"resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz",
"integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow=="
},
"node_modules/@ungap/structured-clone": {
"version": "1.2.0",
"resolved": "https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
"integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
"dev": true
},
"node_modules/@vitejs/plugin-vue": {
"version": "5.0.4",
"resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.0.4.tgz",
@@ -1850,9 +1862,9 @@
"peer": true
},
"node_modules/acorn": {
"version": "8.8.2",
"resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.8.2.tgz",
"integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==",
"version": "8.11.3",
"resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.11.3.tgz",
"integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
"dev": true,
"bin": {
"acorn": "bin/acorn"
@@ -2502,27 +2514,28 @@
}
},
"node_modules/eslint": {
"version": "8.42.0",
"resolved": "https://registry.npmmirror.com/eslint/-/eslint-8.42.0.tgz",
"integrity": "sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==",
"version": "8.57.0",
"resolved": "https://registry.npmmirror.com/eslint/-/eslint-8.57.0.tgz",
"integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
"dev": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.4.0",
"@eslint/eslintrc": "^2.0.3",
"@eslint/js": "8.42.0",
"@humanwhocodes/config-array": "^0.11.10",
"@eslint-community/regexpp": "^4.6.1",
"@eslint/eslintrc": "^2.1.4",
"@eslint/js": "8.57.0",
"@humanwhocodes/config-array": "^0.11.14",
"@humanwhocodes/module-importer": "^1.0.1",
"@nodelib/fs.walk": "^1.2.8",
"ajv": "^6.10.0",
"@ungap/structured-clone": "^1.2.0",
"ajv": "^6.12.4",
"chalk": "^4.0.0",
"cross-spawn": "^7.0.2",
"debug": "^4.3.2",
"doctrine": "^3.0.0",
"escape-string-regexp": "^4.0.0",
"eslint-scope": "^7.2.0",
"eslint-visitor-keys": "^3.4.1",
"espree": "^9.5.2",
"eslint-scope": "^7.2.2",
"eslint-visitor-keys": "^3.4.3",
"espree": "^9.6.1",
"esquery": "^1.4.2",
"esutils": "^2.0.2",
"fast-deep-equal": "^3.1.3",
@@ -2532,7 +2545,6 @@
"globals": "^13.19.0",
"graphemer": "^1.4.0",
"ignore": "^5.2.0",
"import-fresh": "^3.0.0",
"imurmurhash": "^0.1.4",
"is-glob": "^4.0.0",
"is-path-inside": "^3.0.3",
@@ -2542,9 +2554,8 @@
"lodash.merge": "^4.6.2",
"minimatch": "^3.1.2",
"natural-compare": "^1.4.0",
"optionator": "^0.9.1",
"optionator": "^0.9.3",
"strip-ansi": "^6.0.1",
"strip-json-comments": "^3.1.0",
"text-table": "^0.2.0"
},
"bin": {
@@ -2552,49 +2563,53 @@
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
"node_modules/eslint-plugin-vue": {
"version": "9.14.1",
"resolved": "https://registry.npmmirror.com/eslint-plugin-vue/-/eslint-plugin-vue-9.14.1.tgz",
"integrity": "sha512-LQazDB1qkNEKejLe/b5a9VfEbtbczcOaui5lQ4Qw0tbRBbQYREyxxOV5BQgNDTqGPs9pxqiEpbMi9ywuIaF7vw==",
"version": "9.26.0",
"resolved": "https://registry.npmmirror.com/eslint-plugin-vue/-/eslint-plugin-vue-9.26.0.tgz",
"integrity": "sha512-eTvlxXgd4ijE1cdur850G6KalZqk65k1JKoOI2d1kT3hr8sPD07j1q98FRFdNnpxBELGPWxZmInxeHGF/GxtqQ==",
"dev": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.3.0",
"@eslint-community/eslint-utils": "^4.4.0",
"globals": "^13.24.0",
"natural-compare": "^1.4.0",
"nth-check": "^2.0.1",
"postcss-selector-parser": "^6.0.9",
"semver": "^7.3.5",
"vue-eslint-parser": "^9.3.0",
"nth-check": "^2.1.1",
"postcss-selector-parser": "^6.0.15",
"semver": "^7.6.0",
"vue-eslint-parser": "^9.4.2",
"xml-name-validator": "^4.0.0"
},
"engines": {
"node": "^14.17.0 || >=16.0.0"
},
"peerDependencies": {
"eslint": "^6.2.0 || ^7.0.0 || ^8.0.0"
"eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0"
}
},
"node_modules/eslint-plugin-vue/node_modules/lru-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz",
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
"node_modules/eslint-plugin-vue/node_modules/globals": {
"version": "13.24.0",
"resolved": "https://registry.npmmirror.com/globals/-/globals-13.24.0.tgz",
"integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
"dev": true,
"dependencies": {
"yallist": "^4.0.0"
"type-fest": "^0.20.2"
},
"engines": {
"node": ">=10"
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/eslint-plugin-vue/node_modules/semver": {
"version": "7.5.1",
"resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.1.tgz",
"integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==",
"version": "7.6.2",
"resolved": "https://registry.npmmirror.com/semver/-/semver-7.6.2.tgz",
"integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
"dev": true,
"dependencies": {
"lru-cache": "^6.0.0"
},
"bin": {
"semver": "bin/semver.js"
},
@@ -2602,16 +2617,10 @@
"node": ">=10"
}
},
"node_modules/eslint-plugin-vue/node_modules/yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true
},
"node_modules/eslint-scope": {
"version": "7.2.0",
"resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.0.tgz",
"integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==",
"version": "7.2.2",
"resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.2.tgz",
"integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
"dev": true,
"dependencies": {
"esrecurse": "^4.3.0",
@@ -2619,15 +2628,21 @@
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
"node_modules/eslint-visitor-keys": {
"version": "3.4.1",
"resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz",
"integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==",
"version": "3.4.3",
"resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
"integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
"dev": true,
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
"node_modules/eslint/node_modules/ansi-styles": {
@@ -2716,17 +2731,20 @@
}
},
"node_modules/espree": {
"version": "9.5.2",
"resolved": "https://registry.npmmirror.com/espree/-/espree-9.5.2.tgz",
"integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==",
"version": "9.6.1",
"resolved": "https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz",
"integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
"dev": true,
"dependencies": {
"acorn": "^8.8.0",
"acorn": "^8.9.0",
"acorn-jsx": "^5.3.2",
"eslint-visitor-keys": "^3.4.1"
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
"node_modules/esquery": {
@@ -3110,9 +3128,9 @@
}
},
"node_modules/ignore": {
"version": "5.2.4",
"resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.2.4.tgz",
"integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
"version": "5.3.1",
"resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.3.1.tgz",
"integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
"dev": true,
"engines": {
"node": ">= 4"
@@ -3147,6 +3165,9 @@
},
"engines": {
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/imurmurhash": {
@@ -3383,9 +3404,9 @@
}
},
"node_modules/less": {
"version": "4.1.3",
"resolved": "https://registry.npmmirror.com/less/-/less-4.1.3.tgz",
"integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==",
"version": "4.2.0",
"resolved": "https://registry.npmmirror.com/less/-/less-4.2.0.tgz",
"integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==",
"dev": true,
"dependencies": {
"copy-anything": "^2.0.1",
@@ -3819,9 +3840,9 @@
"integrity": "sha512-pkEqbDyl8ou5cpq+VsnQbe/WlEy5qS7xPzMS1U55OCG9KPvwFD46zDbxQIj3egJSFc3D+XhYOPUzz49zQAVy7A=="
},
"node_modules/optionator": {
"version": "0.9.1",
"resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.1.tgz",
"integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
"version": "0.9.4",
"resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.4.tgz",
"integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
"dev": true,
"dependencies": {
"deep-is": "^0.1.3",
@@ -3829,7 +3850,7 @@
"levn": "^0.4.1",
"prelude-ls": "^1.2.1",
"type-check": "^0.4.0",
"word-wrap": "^1.2.3"
"word-wrap": "^1.2.5"
},
"engines": {
"node": ">= 0.8.0"
@@ -4097,9 +4118,9 @@
}
},
"node_modules/postcss-selector-parser": {
"version": "6.0.13",
"resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz",
"integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==",
"version": "6.1.0",
"resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz",
"integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==",
"dev": true,
"dependencies": {
"cssesc": "^3.0.0",
@@ -4523,6 +4544,9 @@
"dev": true,
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/sucrase": {
@@ -4960,9 +4984,9 @@
}
},
"node_modules/vue-eslint-parser": {
"version": "9.3.0",
"resolved": "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-9.3.0.tgz",
"integrity": "sha512-48IxT9d0+wArT1+3wNIy0tascRoywqSUe2E1YalIC1L8jsUGe5aJQItWfRok7DVFGz3UYvzEI7n5wiTXsCMAcQ==",
"version": "9.4.3",
"resolved": "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz",
"integrity": "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==",
"dev": true,
"dependencies": {
"debug": "^4.3.4",
@@ -4976,30 +5000,18 @@
"engines": {
"node": "^14.17.0 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/mysticatea"
},
"peerDependencies": {
"eslint": ">=6.0.0"
}
},
"node_modules/vue-eslint-parser/node_modules/lru-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz",
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
"dev": true,
"dependencies": {
"yallist": "^4.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/vue-eslint-parser/node_modules/semver": {
"version": "7.5.1",
"resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.1.tgz",
"integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==",
"version": "7.6.2",
"resolved": "https://registry.npmmirror.com/semver/-/semver-7.6.2.tgz",
"integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
"dev": true,
"dependencies": {
"lru-cache": "^6.0.0"
},
"bin": {
"semver": "bin/semver.js"
},
@@ -5007,12 +5019,6 @@
"node": ">=10"
}
},
"node_modules/vue-eslint-parser/node_modules/yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true
},
"node_modules/vue-router": {
"version": "4.2.2",
"resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.2.2.tgz",
@@ -5145,9 +5151,9 @@
}
},
"node_modules/word-wrap": {
"version": "1.2.3",
"resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.3.tgz",
"integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
"version": "1.2.5",
"resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.5.tgz",
"integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
"dev": true,
"engines": {
"node": ">=0.10.0"

View File

@@ -12,7 +12,7 @@
},
"dependencies": {
"@arco-design/color": "^0.4.0",
"@arco-design/web-vue": "^2.55.2",
"@arco-design/web-vue": "^2.55.3",
"@tinymce/tinymce-vue": "^5.1.1",
"@vueuse/core": "^10.1.2",
"axios": "^1.4.0",
@@ -50,11 +50,11 @@
"autoprefixer": "^10.4.14",
"browserslist": "^4.23.0",
"caniuse-lite": "^1.0.30001591",
"eslint": "^8.42.0",
"eslint-plugin-vue": "^9.14.1",
"less": "^4.1.3",
"eslint": "^8.57.0",
"eslint-plugin-vue": "^9.26.0",
"less": "^4.2.0",
"less-loader": "^11.1.2",
"postcss": "^8.4.24",
"postcss": "^8.4.38",
"prettier": "^2.8.8",
"tailwindcss": "^3.3.2",
"vite": "^5.2.12"

View File

@@ -1,9 +1,8 @@
<script setup></script>
<template>
<a-config-provider>
<router-view />
</a-config-provider>
</template>
<script setup></script>
<style scoped></style>

View File

@@ -71,4 +71,17 @@ export default {
}
})
},
/**
* 根据项目id查询项目->看板的所有信息
* @returns 返回看板所有信息
*/
getBoardInfo(projectId) {
return request({
url: `/testmanage/project/board`,
method: "get",
params: {
id: projectId
}
})
}
}

View File

@@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="50px" height="50px" viewBox="0 0 50 50" style="enable-background:new 0 0 50 50" xml:space="preserve">
<path fill="#409eff" d="M43.935,25.145c0-10.318-8.364-18.683-18.683-18.683c-10.318,0-18.683,8.365-18.683,18.683h4.068c0-8.071,6.543-14.615,14.615-14.615c8.072,0,14.615,6.543,14.615,14.615H43.935z" transform="rotate(275.098 25 25)">
<animateTransform attributeType="xml" attributeName="transform" type="rotate" from="0 25 25" to="360 25 25" dur=".8s" repeatCount="indefinite"></animateTransform>
</path>
</svg>

After

Width:  |  Height:  |  Size: 617 B

View File

@@ -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>
<component
:is="componentName"
@@ -16,6 +7,7 @@
ok-text="保存"
cancel-text="关闭"
draggable
:mask-closable="options.formOption.mask"
:width="options.formOption.width"
:fullscreen="options.formOption.isFull || false"
unmount-on-close

View File

@@ -5,13 +5,20 @@
unmount-on-close
@cancel="modal.cancel"
:width="width"
draggable
:on-before-cancel="modal.customCancel"
v-bind="$attrs"
>
<template #title>
{{ prop.title }}
</template>
<slot name="body"></slot>
<ma-form ref="maFormRef" :columns="prop.column" v-model="form" :options="{ ...options, showButtons: false }" />
<ma-form
ref="maFormRef"
:columns="prop.column"
v-model="form"
:options="{ ...options, showButtons: false }"
></ma-form>
</a-modal>
</template>
@@ -60,7 +67,7 @@ const modal = reactive({
return prop.submit(form._rawValue)
},
customCancel() {
if(prop.customCancel){
if (prop.customCancel) {
return prop.customCancel()
}
return true

View File

@@ -1,11 +1,13 @@
import auth from "./auth/index"
import role from "./role/index"
import copy from "./copy/index"
import loading from "./loading/index"
export default {
install(Vue) {
Vue.directive("auth", auth)
Vue.directive("role", role)
Vue.directive("copy", copy)
Vue.directive("loading", loading)
}
}

View File

@@ -0,0 +1,34 @@
// 用于远程加载数据时候显示加载中
import imgUrl from "@/assets/funcImg/loading.svg"
import styles from "./loading.module.less"
// 创建img元素
function createImg() {
const imgEle = document.createElement("img")
// 给个html自定义属性
imgEle.dataset.role = "loading"
imgEle.src = imgUrl
imgEle.classList.add(styles.img)
imgEle.title = "loading element"
return imgEle
}
// 通过el找到img元素-在update钩子的时候在update时已经创建了img元素了
function getImgElement(element) {
return element.querySelector("img[data-role=loading]")
}
export default function (el, binding) {
const img = getImgElement(el)
if (binding.value) {
// 这里要判断是否有元素否则在update钩子会创建多个!!!
if (!img) {
const img = createImg()
el.appendChild(img)
}
} else {
if (img) {
img.remove()
}
}
}

View File

@@ -0,0 +1,6 @@
.img {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}

View File

@@ -0,0 +1,23 @@
import { ref } from "vue"
/**
* 该hook传入一个远程数据储存默认值以及请求远程数据的函数
*/
const useFetchData = (defaultValue = {}, fetDataFunc) => {
const loadingData = ref(defaultValue) // 远程请求的数据
const isDataLoading = ref(false)
// 该hook需要组件里面提供 -> fetchData的函数返回远程请求数据的东西
/// 相当于created
async function fetchOrigin() {
isDataLoading.value = true
const res = await fetDataFunc()
loadingData.value = res.data
isDataLoading.value = false
}
fetchOrigin()
return {
loadingData,
isDataLoading
}
}
export default useFetchData

View File

@@ -146,7 +146,9 @@ const paddingStyle = computed(() => {
overflow-y: hidden;
}
}
.work-area {
position: relative; // 注意这个是改变v-loading这些东西
}
.menu-wrapper {
height: 100%;
overflow: auto;

View File

@@ -134,7 +134,8 @@
:options="roundOption"
width="800px"
:submit="handleRoundSubmit"
></ma-form-modal>
>
</ma-form-modal>
<!-- 如果没有第一轮的SO_dut则弹窗 -->
<ma-form-modal
ref="soDutFormRef"
@@ -143,7 +144,12 @@
width="800px"
:submit="handleSoDutSubmit"
:custom-cancel="handleSoDutCancel"
></ma-form-modal>
cancelText="返回项目页面"
:cancel-button-props="{ status: 'warning' }"
:closable="false"
:mask-closable="false"
>
</ma-form-modal>
<Progress
:visible="visible"
:isComplete="isComplete"
@@ -158,15 +164,6 @@
alignPoint
:style="{ display: 'block' }"
>
<div
:style="{
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
height: '300px',
backgroundColor: 'var(--color-fill-2)'
}"
></div>
<template #content>
<a-dgroup title="执行操作">
<a-doption @click="handleDoptionClickGreateCases">
@@ -369,8 +366,8 @@ const handleSoDutSubmit = async (data) => {
}
// ~~~~定义弹出a-form-modal的cancel方法-返回false则无法关闭弹窗~~~~
const handleSoDutCancel = () => {
Notification.error("必须按要求添加源代码信息,无法关闭!")
return false
Notification.error("必须按要求添加源代码信息,返回项目列表页面!")
router.replace({ name: "Projmanage" })
}
// 初始化树状数据
// so_dut弹窗ref对象
@@ -686,7 +683,6 @@ const roundColumn = ref([
}
]
},
{
formType: "card",
title: "极端工况信息",
@@ -775,7 +771,9 @@ const soDutColumn = ref([
{
title: "用户标识",
dataIndex: "userRef",
placeholder: "请输入用户标识"
placeholder: "请输入用户标识",
help: "客户使用的标识",
rules: [{ required: true, message: "用户标识为客户的标识,必填,可随意填写后面再修改" }]
},
{
title: "单位",
@@ -866,7 +864,7 @@ const handleProblemShowClick = () => {
const handleDoptionClickGreateCases = async () => {
// 将project_id加入参数
rightClickNode.project_id = projectId.value
const res = await caseApi.createByDemand(rightClickNode)
await caseApi.createByDemand(rightClickNode)
routeViewRef.value.refresh()
}
/// 复制modal级联选择器的选项

View File

@@ -24,7 +24,8 @@ app.use(ArcoVueIcon)
app.use(router)
app.use(pinia)
app.use(globalComponents)
// app.use(directive)
import directives from "@/directives"
app.use(directives)
// 注册ma-icon图标
const modules = import.meta.glob("./assets/ma-icons/*.vue", { eager: true })

View File

@@ -98,10 +98,9 @@ const router = createRouter({
locale: "问题单详情",
icon: "icon-arrow-right"
}
},
}
]
},
// 后台管理的路由以及404和重定向路由
...appRoutes,
REDIRECT_MAIN,

View File

@@ -21,6 +21,21 @@ const TESTMANAGE = {
locale: "项目管理",
icon: "icon-folder"
}
},
// 二级路由(非三级路由,但是想办法把左侧菜单删除)
{
path: "/projBoard/:projectId",
name: "projBoard",
component: () => import("@/views/testmanage/projBoard/index.vue"),
meta: {
requiresAuth: true,
roles: ["*"],
locale: "项目看板",
icon: "icon-folder",
hideInMenu: true,
ignoreCache: false,
noAffix: true
}
}
]
}

View File

@@ -2,7 +2,7 @@
<a-modal v-model:visible="visible" fullscreen :footer="false">
<template #title>维护数据字典 {{ currentRow.name }}</template>
<!-- crud组件 -->
<div class="lg:w-full w-full lg:ml-4 mt-5 lg:mt-0">
<div class="lg:w-full w-full lg:mt-0">
<ma-crud :options="crudOptions" :columns="columns" ref="crudRef">
<!-- 排序列 -->
<template #sort="{ record }">
@@ -93,6 +93,7 @@ const crudOptions = ref({
operationColumn: true,
operationWidth: 160,
operationColumnAlign: "center",
showTools: false,
beforeAdd: (form) => {
form.id = currentRow.value?.id
},
@@ -183,7 +184,7 @@ const columns = ref([
dataIndex: "source",
align: "center",
search: false,
placeholder: "如果不是标准则不填",
placeholder: "如果不是标准则不填"
}
])

View File

@@ -60,7 +60,8 @@ const crudOptions = ref({
rowSelection: { showCheckedAll: true },
searchColNumber: 4,
tablePagination: false,
operationColumn: true
operationColumn: true,
showTools:false,
})
const crudColumns = ref([

View File

@@ -79,7 +79,7 @@ const crudOptions = ref({
${td[round_key].title} > ${td[round_key].children[dut_key].title} >
${td[round_key].children[dut_key].children[design_key].title} >
${td[round_key].children[dut_key].children[design_key].children[test_key].title} >
${td[round_key].children[dut_key].children[design_key].children[test_key].children[case_key].title} > 用例-`
${td[round_key].children[dut_key].children[design_key].children[test_key].children[case_key].title} > 问题单-`
return true
},
beforeOpenEdit: function (record) {

View File

@@ -249,11 +249,12 @@ const crudColumns = ref([
align: "center",
formType: "select",
sortable: { sortDirections: ["ascend", "descend"] },
addDefaultValue: "3",
addDefaultValue: "4",
maxLength: 200,
commonRules: [{ required: true, message: "测试类型必选" }],
dict: { name: "testType", translation: true, props: { label: "title", value: "key" } },
extra: "请保证测试类型选择正确",
// 这是arco的属性所以在ma-crud和ma-form可以直接使用arco属性和事件事件+onXXX
filterOption: function (inputValue, selectedOption) {
if (inputValue) {
let matchRes = PinYinMatch.match(selectedOption.label, inputValue)
@@ -261,7 +262,7 @@ const crudColumns = ref([
return true
}
}
}
},
},
{
title: "测试手段",
@@ -299,7 +300,9 @@ const crudColumns = ref([
const subItemFormData = crudRef.value.getFormData().testContent
// 取出充分性条件字段字符串
const mapRes = subItemFormData.map((subItem) => subItem.subName)
crudRef.value.getFormData().adequacy = `测试用例覆盖${mapRes.join('、')}子项要求的全部内容。\n所有用例执行完毕对于未执行的用例说明未执行原因。`
crudRef.value.getFormData().adequacy = `测试用例覆盖${mapRes.join(
"、"
)}子项要求的全部内容。\n所有用例执行完毕对于未执行的用例说明未执行原因。`
}
},
{

View File

@@ -130,17 +130,17 @@ const crudColumns = ref([
width: 120,
dataIndex: "ident",
search: true,
commonRules: [{ required: true, message: "标识是必填" }],
validateTrigger: "blur",
placeholder: "请输入文档中设计需求的标识"
placeholder: "请输入文档中设计需求的标识",
help:'若不知道则填"无"或不填'
},
{
title: "需名称",
title: "需名称",
align: "center",
width: 150,
dataIndex: "name",
search: true,
commonRules: [{ required: true, message: "需求名称是必填" }],
commonRules: [{ required: true, message: "设计需求名称是必填" }],
validateTrigger: "blur"
},
{
@@ -148,7 +148,8 @@ const crudColumns = ref([
align: "center",
width: 150,
dataIndex: "chapter",
search: true
search: true,
help:'若为隐含需求则填"/"'
},
{
title: "需求类型",

View File

@@ -71,7 +71,8 @@ const crudOptions = ref({
operationColumnAlign: "center",
formOption: {
viewType: "drawer",
width: 600
width: 600,
mask: false
}
})
@@ -118,7 +119,8 @@ const crudColumns = ref([
comment_line: { display: true },
total_code_line: { display: true },
total_line: { display: true },
comment_percent: { display: true }
comment_percent: { display: true },
release_date: { display: false }
}
} else {
// 其他数据清除
@@ -129,7 +131,8 @@ const crudColumns = ref([
comment_line: { display: false },
total_code_line: { display: false },
total_line: { display: false },
comment_percent: { display: false }
comment_percent: { display: false },
release_date: { display: true }
}
}
}
@@ -140,7 +143,7 @@ const crudColumns = ref([
align: "center",
dataIndex: "name",
search: true,
commonRules: [{ required: true, message: "需求名称必填" }],
commonRules: [{ required: true, message: "被测件名称必填" }],
validateTrigger: "blur"
},
{
@@ -157,7 +160,8 @@ const crudColumns = ref([
dataIndex: "ref",
search: true,
commonRules: [{ required: true, message: "用户标识或编号必填" }],
validateTrigger: "blur"
validateTrigger: "blur",
help: "客户使用的标识"
},
{
title: "单位",
@@ -181,7 +185,8 @@ const crudColumns = ref([
align: "center",
dataIndex: "black_line",
formType: "input-number",
commonRules: [{ required: true, message: "空行数必填" }]
commonRules: [{ required: true, message: "空行数必填" }],
min: 0
},
{
title: "纯代码行",
@@ -189,7 +194,8 @@ const crudColumns = ref([
align: "center",
dataIndex: "code_line",
formType: "input-number",
commonRules: [{ required: true, message: "纯代码行数必填" }]
commonRules: [{ required: true, message: "纯代码行数必填" }],
min: 0
},
{
title: "纯注释行",
@@ -197,7 +203,8 @@ const crudColumns = ref([
align: "center",
dataIndex: "comment_line",
formType: "input-number",
commonRules: [{ required: true, message: "纯注释行数必填" }]
commonRules: [{ required: true, message: "纯注释行数必填" }],
min: 0
},
{
title: "混合行",
@@ -205,7 +212,9 @@ const crudColumns = ref([
align: "center",
dataIndex: "mix_line",
formType: "input-number",
commonRules: [{ required: true, message: "混合行数必填" }]
help: "混合行是指:代码中一行即包含代码也包含注释",
commonRules: [{ required: true, message: "混合行数必填" }],
min: 0
},
{
title: "注释率 %",
@@ -248,7 +257,7 @@ const crudColumns = ref([
)
}
},
// 注意这个是个创新点
// 字段交互控制
control(value, data) {
data.comment_percent = (
(parseFloat(data.comment_line) + parseFloat(data.mix_line)) /

View File

@@ -0,0 +1,105 @@
<template>
<div class="round-info-container">
<div class="ma-content-block rounded-sm flex-column justify-between w-full p-3 bg-color">
<div class="title">{{ props.data.name }}信息</div>
<div class="info-list">
<a-list :gridProps="{ gutter: 0, span: 6 }" class="list-container">
<template #header><div class="header">设计需求下面测试项/用例统计信息</div></template>
<a-list-item v-for="(item, index) in props.data.desings" :key="index">
<a-list-item-meta class="meta" :title="`${item.name}`"></a-list-item-meta>
<div class="item-count">
测试项数 : <span class="count">{{ item.demand_count }}</span>
</div>
<div class="item-count">
用例数 : <span class="count">{{ item.case_count }}</span>
</div>
</a-list-item>
</a-list>
<a-list class="list-container">
<template #header><div class="header">测试类型统计信息</div></template>
<a-table
:bordered="false"
:data="resolveData"
:columns="columns"
size="small"
:pagination="false"
></a-table>
</a-list>
</div>
</div>
</div>
</template>
<script setup>
import { computed } from "vue"
import columns from "./tableColumn.js"
const props = defineProps({
data: {
type: Object,
required: true
}
})
const resolveData = computed(() => {
let resData = []
let res = props.data.method_demand
Object.keys(res).forEach((key) => {
const value = res[key]
resData.push({
name: key,
demand_count: value,
case_count: 0
})
})
let res2 = props.data.method_case
Object.keys(res2).forEach((key) => {
const value = res2[key]
resData.forEach((item) => {
if (item.name === key) {
item.case_count = value
}
})
})
return resData
})
</script>
<style lang="less" scoped>
.round-info-container {
width: 100%;
height: 100%;
}
.title {
margin: 10px;
font-weight: 700;
font-size: 1rem;
}
.count {
font-weight: 700;
}
.meta {
font-size: 15px;
width: 80%;
border-bottom: 1px dashed var(--color-text-4);
margin-bottom: 2px;
text-overflow: ellipsis;
overflow: hidden;
word-break: break-all;
white-space: nowrap;
}
.list-container {
transition: all 0.3s;
&:hover {
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
}
}
.info-list {
display: flex;
flex-direction: column;
gap: 5px;
}
.header {
font-size: 14px;
font-weight: 700;
color: var(--color-text-3);
}
</style>

View File

@@ -0,0 +1,67 @@
<template>
<div class="time-line-container">
<div class="ma-content-block rounded-sm flex-column justify-between w-full p-3 bg-color">
<div class="title">填写的项目时间轴</div>
<a-timeline direction="horizontal" class="timeline" mode="alternate">
<a-timeline-item :label="pInfo.time_line.start_time">
<a-row :style="{ display: 'inline-flex', alignItems: 'center' }">
<div>开始时间</div>
</a-row>
</a-timeline-item>
<a-timeline-item
v-for="(item, index) in pInfo.time_line.round_time"
:key="index"
:label="`结束时间 : ${item.end}`"
>
<a-col>
<div>{{ item.name }}</div>
<div class="a-col-title">开始时间 : {{ item.start }}</div>
</a-col>
</a-timeline-item>
<a-timeline-item :label="pInfo.time_line.end_time">
<a-row :style="{ display: 'inline-flex', alignItems: 'center' }">
<div>结束时间</div>
</a-row>
</a-timeline-item>
<div class="info">
<a-alert>测试人员填写的项目开始时间结束时间轮次时间均会影响生成文档的时间!</a-alert>
</div>
</a-timeline>
</div>
</div>
</template>
<script setup>
// 1.定义props
const props = defineProps({
pInfo: {
type: Object,
required: true
}
})
</script>
<style lang="less" scoped>
.title {
margin: 10px;
font-weight: 700;
font-size: 1rem;
}
.timeline {
position: relative;
padding: 50px;
width: 100%;
.info {
width: 180px;
position: absolute;
right: 30px;
top: 1rem;
}
}
.a-col-title {
font-size: 12px;
margin-bottom: -5px;
margin-top: 5px;
color: var(--color-text-3);
}
</style>

View File

@@ -0,0 +1,89 @@
<template>
<div class="title-container">
<div class="ma-content-block rounded-sm flex-col justify-between w-full p-3 bg-color">
<a-page-header
@back="handleBackClick"
:style="{ background: 'var(--color-bg-2)' }"
:title="props.pInfo.ident"
>
<template #subtitle>
<a-space>
<span>{{ props.pInfo.name }}</span>
<a-tag color="red" size="small">{{ props.pInfo.step }}</a-tag>
</a-space>
</template>
</a-page-header>
<div class="title">基本信息</div>
<div class="item-container">
<a-card
class="item"
v-for="(val, key) in pInfo.title_info"
:style="{ width: '360px' }"
:title="key"
:key="key"
hoverable
>
<ul class="li-container">
<li v-for="(v, k) in val" :key="k">
<div class="key">{{ k }}:</div>
<div class="value">{{ v }}</div>
</li>
</ul>
</a-card>
</div>
</div>
</div>
</template>
<script setup>
import { useRoute, useRouter } from "vue-router"
const router = useRouter()
// 1.头部-点击返回
const handleBackClick = () => {
router.go(-1)
}
// 2.定义props
const props = defineProps({
pInfo: {
type: Object,
required: true
}
})
</script>
<style lang="less" scoped>
:deep(.arco-page-header-main) {
align-items: center;
}
.item-container {
display: flex;
align-items: center;
justify-content: space-around;
.item {
height: 11rem;
.li-container {
display: flex;
flex-direction: column;
gap: 5px;
li {
display: flex;
line-height: 1.5;
gap: 5px;
.value {
text-overflow: ellipsis;
overflow: hidden;
word-break: break-all;
white-space: nowrap;
font-weight: 700;
}
}
}
}
}
.title {
margin: 10px;
font-weight: 700;
font-size: 1rem;
}
</style>

View File

@@ -0,0 +1,18 @@
export default [
{
title: "测试类型",
dataIndex: "name",
ellipsis: true,
align: "center"
},
{
title: "测试项数量",
dataIndex: "demand_count",
align: "center"
},
{
title: "用例数量",
dataIndex: "case_count",
align: "center"
}
]

View File

@@ -0,0 +1,33 @@
<template>
<div class="proj-board-container" v-loading="isDataLoading">
<a-layout-content class="flex flex-col gap-2" v-if="!isDataLoading">
<!-- 返回前面一页的按钮以及项目整体情况 -->
<Title :pInfo="loadingData"></Title>
<!-- 时间线显示项目情况 -->
<time-line :pInfo="loadingData"></time-line>
<!-- 以轮次为合集展示需求下面的测试项数用例数测试类型下面测试项和用例数量 -->
<round-info v-for="item in loadingData.statistics" :data="item"></round-info>
</a-layout-content>
</div>
</template>
<script setup>
import Title from "./cpns/Title.vue"
import TimeLine from "./cpns/TimeLine.vue"
import projectApi from "@/api/project/project"
import { useRoute } from "vue-router"
import RoundInfo from "./cpns/RoundInfo.vue"
const route = useRoute()
// hooks
import useFetchData from "@/hooks/fetchData"
const fetchData = async () => {
return projectApi.getBoardInfo(route.params.projectId)
}
const { loadingData, isDataLoading } = useFetchData({}, fetchData)
</script>
<style lang="less" scoped>
:deep(.ma-content-block) {
box-shadow: 0 0 5px rgba(0, 0, 0, 0.2);
}
</style>

View File

@@ -2,7 +2,13 @@
<!-- 描述列表组件 -->
<a-modal width="1000px" v-model:visible="visible" :footer="false">
<template #title>项目名称{{ previewRecord.name }}</template>
<ma-info :columns="props.columns" :data="previewRecord" :column="1" size="mini"></ma-info>
<ma-info
class="my-custom-class"
:columns="props.columns"
:data="previewRecord"
:column="1"
size="mini"
></ma-info>
</a-modal>
</template>
@@ -26,4 +32,13 @@ defineExpose({ open })
// MA-INFO的columns
</script>
<style lang="less" scoped></style>
<style lang="less" scoped>
.my-custom-class {
:deep(.arco-space-horizontal) {
flex-wrap: wrap;
}
:deep(.arco-space-item){
margin-bottom: 2px;
}
}
</style>

View File

@@ -93,6 +93,7 @@
工作区
</a-button>
<a-link @click="previewRef.open(record)"><icon-eye />预览</a-link>
<a-link @click="handleBoardClick(record)"><icon-dashboard />项目看板</a-link>
</template>
</ma-crud>
</div>
@@ -328,6 +329,15 @@ const createWtdItem = async (record) => {
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 1.跳转到项目看板页面
const handleBoardClick = (record) => {
router.push({
name: "projBoard",
params: {
projectId: record.id
}
})
}
// CRUD-OPTIONS
const crudRef = ref()
@@ -343,7 +353,7 @@ const crudOptions = ref({
operationWidth: 500,
showIndex: false,
showTools: false,
operationColumnWidth: 220, // 操作列宽度
operationColumnWidth: 280, // 操作列宽度
operationColumnAlign: "center", // 操作列对齐方式
// 处理弹窗的title
beforeOpenAdd: function () {
@@ -386,30 +396,27 @@ const crudOptions = ref({
{ span: 12, formList: [{ dataIndex: "member" }] },
{ span: 6, formList: [{ dataIndex: "soft_type" }] },
{ span: 6, formList: [{ dataIndex: "devplant" }] },
{ span: 24, formList: [{ dataIndex: "abbreviation" }] },
{ span: 8, formList: [{ dataIndex: "quality_person" }] },
{ span: 8, formList: [{ dataIndex: "vise_person" }] },
{ span: 8, formList: [{ dataIndex: "config_person" }] }
{ span: 6, formList: [{ dataIndex: "abbreviation" }] },
{ span: 6, formList: [{ dataIndex: "quality_person" }] },
{ span: 6, formList: [{ dataIndex: "vise_person" }] },
{ span: 6, formList: [{ dataIndex: "config_person" }] }
]
},
{
formType: "grid",
cols: [{ span: 24, formList: [{ dataIndex: "security_level" }] }]
},
{
formType: "grid",
cols: [
{ span: 12, formList: [{ dataIndex: "test_level" }] },
{ span: 6, formList: [{ dataIndex: "security_level" }] },
{ span: 6, formList: [{ dataIndex: "language" }] },
{ span: 12, formList: [{ dataIndex: "plant_type" }] }
]
},
{
formType: "grid",
cols: [{ span: 24, formList: [{ dataIndex: "report_type" }] }]
cols: [{ span: 24, formList: [{ dataIndex: "test_level" }] }]
},
{
formType: "grid",
cols: [{ span: 24, formList: [{ dataIndex: "language" }] }]
cols: [{ span: 24, formList: [{ dataIndex: "report_type" }] }]
},
{
formType: "grid",
@@ -484,6 +491,7 @@ const crudColumns = ref([
},
{
title: "项目名称",
width: 110,
dataIndex: "name",
search: true,
commonRules: [{ required: true, message: "名称是必填" }]
@@ -491,7 +499,7 @@ const crudColumns = ref([
{ title: "工程型号", dataIndex: "engin_model", hide: true },
{ title: "分系统", dataIndex: "section_system", hide: true },
{ title: "子系统", dataIndex: "sub_system", hide: true },
{ title: "设备", dataIndex: "device", hide: true },
{ title: "设备名称", dataIndex: "device", hide: true },
{
title: "开始日期",
dataIndex: "beginTime",
@@ -502,7 +510,7 @@ const crudColumns = ref([
title: "结束时间",
dataIndex: "endTime",
formType: "date",
extra: "注意:开始时间和结束时间影响大纲、报告多个时间,谨慎填写",
extra: "注意:结束时间需要晚于最后一轮结束时间",
commonRules: [
{
required: true,
@@ -626,7 +634,7 @@ const crudColumns = ref([
title: "测试级别",
dataIndex: "test_level",
commonRules: [{ required: true, message: "请至少选择一个测试级别" }],
addDefaultValue: ["6"],
addDefaultValue: ["4"],
hide: true,
formType: "checkbox",
dict: { name: "test_level", props: { label: "title", value: "key" } }
@@ -643,7 +651,7 @@ const crudColumns = ref([
{
title: "报告类型",
dataIndex: "report_type",
addDefaultValue: "1",
addDefaultValue: "9",
search: true,
commonRules: [{ required: true, message: "报告类型必填" }],
// 字典-report_type
@@ -656,16 +664,18 @@ const crudColumns = ref([
addDefaultValue: ["1"],
commonRules: [{ required: true, message: "请至少选择一个" }],
hide: true,
formType: "checkbox",
formType: "select",
multiple: true,
dict: { name: "language", props: { label: "title", value: "key" } }
},
{
title: "依据标准",
dataIndex: "standard",
addDefaultValue: ["1"],
addDefaultValue: ["1", "2", "3", "4", "9"],
commonRules: [{ required: true, message: "请至少选择一个" }],
hide: true,
formType: "checkbox",
multiple: true,
formType: "select",
dict: { name: "standard", props: { label: "title", value: "key" } }
},
{
@@ -681,21 +691,27 @@ const crudColumns = ref([
title: "联系人",
dataIndex: "entrust_contact",
hide: true,
rules: [{ required: true, message: "联系人必填" }]
commonRules: [{ required: true, message: "联系人必填" }]
},
{
formType: "input",
title: "联系电话",
maxLength: 11,
dataIndex: "entrust_contact_phone",
hide: true,
rules: [{ required: true, message: "联系电话必填" }]
commonRules: [
{ required: true, message: "联系电话必填" },
{
match: /^1[3456789]\d{9}$/,
message: "电话号码格式错误"
}
]
},
{
formType: "input",
title: "电子邮箱",
dataIndex: "entrust_email",
hide: true,
rules: [{ required: true, message: "电子邮箱必填" }]
hide: true
},
{
title: "单位",
@@ -710,21 +726,27 @@ const crudColumns = ref([
title: "联系人",
dataIndex: "dev_contact",
hide: true,
rules: [{ required: true, message: "联系人必填" }]
commonRules: [{ required: true, message: "联系人必填" }]
},
{
formType: "input",
title: "联系电话",
maxLength: 11,
dataIndex: "dev_contact_phone",
hide: true,
rules: [{ required: true, message: "联系电话必填" }]
commonRules: [
{ required: true, message: "联系电话必填" },
{
match: /^1[3456789]\d{9}$/,
message: "电话号码格式错误"
}
]
},
{
formType: "input",
title: "电子邮箱",
dataIndex: "dev_email",
hide: true,
rules: [{ required: true, message: "电子邮箱必填" }]
hide: true
},
{
title: "单位",
@@ -739,21 +761,27 @@ const crudColumns = ref([
title: "联系人",
dataIndex: "test_contact",
hide: true,
rules: [{ required: true, message: "联系人必填" }]
commonRules: [{ required: true, message: "联系人必填" }]
},
{
formType: "input",
title: "联系电话",
dataIndex: "test_contact_phone",
hide: true,
rules: [{ required: true, message: "联系电话必填" }]
maxLength: 11,
commonRules: [
{ required: true, message: "联系电话必填" },
{
match: /^1[3456789]\d{9}$/,
message: "电话号码格式错误"
}
]
},
{
formType: "input",
title: "电子邮箱",
dataIndex: "test_email",
hide: true,
rules: [{ required: true, message: "电子邮箱必填" }]
hide: true
},
{
title: "状态",

View File

@@ -25,7 +25,6 @@ export default ({ mode }) => {
chunkSizeWarningLimit: 3000
// assetsPublicPath: "./"
},
server: {
host: "0.0.0.0",
port: env.VITE_APP_PORT || process.env.port,