Browse Source

优化

daijiajun/feature-20251107115823-股票知识测评
daijiajun 2 months ago
parent
commit
8924b1c187
  1. 193
      package-lock.json
  2. 1
      package.json
  3. 10
      src/components/Question/QuestionSearch.vue
  4. 224
      src/components/Question/QuestionTable.vue
  5. 3
      src/components/WrongQuestion/WrongQuestionSearch.vue
  6. 118
      src/components/WrongQuestion/WrongQuestionTable.vue
  7. 27
      src/views/WrongQuestion.vue

193
package-lock.json

@ -8,6 +8,7 @@
"name": "evaluation-system",
"version": "0.1.0",
"dependencies": {
"axios": "^1.13.2",
"core-js": "^3.8.3",
"vue": "^2.6.14",
"vue-router": "^3.6.5"
@ -3197,6 +3198,11 @@
"integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
"dev": true
},
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
},
"node_modules/at-least-node": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz",
@ -3243,6 +3249,16 @@
"postcss": "^8.1.0"
}
},
"node_modules/axios": {
"version": "1.13.2",
"resolved": "https://registry.npmmirror.com/axios/-/axios-1.13.2.tgz",
"integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==",
"dependencies": {
"follow-redirects": "^1.15.6",
"form-data": "^4.0.4",
"proxy-from-env": "^1.1.0"
}
},
"node_modules/babel-loader": {
"version": "8.4.1",
"resolved": "https://registry.npmmirror.com/babel-loader/-/babel-loader-8.4.1.tgz",
@ -3574,7 +3590,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
"integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
"dev": true,
"dependencies": {
"es-errors": "^1.3.0",
"function-bind": "^1.1.2"
@ -3883,6 +3898,17 @@
"integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
"dev": true
},
"node_modules/combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"dependencies": {
"delayed-stream": "~1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/commander": {
"version": "8.3.0",
"resolved": "https://registry.npmmirror.com/commander/-/commander-8.3.0.tgz",
@ -4650,6 +4676,14 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/depd": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz",
@ -4813,7 +4847,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz",
"integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
"dev": true,
"dependencies": {
"call-bind-apply-helpers": "^1.0.1",
"es-errors": "^1.3.0",
@ -4943,7 +4976,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz",
"integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
"dev": true,
"engines": {
"node": ">= 0.4"
}
@ -4952,7 +4984,6 @@
"version": "1.3.0",
"resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz",
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
"dev": true,
"engines": {
"node": ">= 0.4"
}
@ -4967,7 +4998,6 @@
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
"integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
"dev": true,
"dependencies": {
"es-errors": "^1.3.0"
},
@ -4975,6 +5005,20 @@
"node": ">= 0.4"
}
},
"node_modules/es-set-tostringtag": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
"integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
"dependencies": {
"es-errors": "^1.3.0",
"get-intrinsic": "^1.2.6",
"has-tostringtag": "^1.0.2",
"hasown": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/escalade": {
"version": "3.2.0",
"resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz",
@ -5829,7 +5873,6 @@
"version": "1.15.11",
"resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.11.tgz",
"integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
"dev": true,
"funding": [
{
"type": "individual",
@ -5845,6 +5888,21 @@
}
}
},
"node_modules/form-data": {
"version": "4.0.4",
"resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.4.tgz",
"integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"es-set-tostringtag": "^2.1.0",
"hasown": "^2.0.2",
"mime-types": "^2.1.12"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/forwarded": {
"version": "0.2.0",
"resolved": "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz",
@ -5921,7 +5979,6 @@
"version": "1.1.2",
"resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz",
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
"dev": true,
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@ -5954,7 +6011,6 @@
"version": "1.3.0",
"resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
"integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
"dev": true,
"dependencies": {
"call-bind-apply-helpers": "^1.0.2",
"es-define-property": "^1.0.1",
@ -5978,7 +6034,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz",
"integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
"dev": true,
"dependencies": {
"dunder-proto": "^1.0.1",
"es-object-atoms": "^1.0.0"
@ -6089,7 +6144,6 @@
"version": "1.2.0",
"resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz",
"integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
"dev": true,
"engines": {
"node": ">= 0.4"
},
@ -6149,7 +6203,20 @@
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz",
"integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
"dev": true,
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-tostringtag": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
"integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
"dependencies": {
"has-symbols": "^1.0.3"
},
"engines": {
"node": ">= 0.4"
},
@ -6167,7 +6234,6 @@
"version": "2.0.2",
"resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz",
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
"dev": true,
"dependencies": {
"function-bind": "^1.1.2"
},
@ -7242,7 +7308,6 @@
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
"integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
"dev": true,
"engines": {
"node": ">= 0.4"
}
@ -7345,7 +7410,6 @@
"version": "1.52.0",
"resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
"dev": true,
"engines": {
"node": ">= 0.6"
}
@ -7354,7 +7418,6 @@
"version": "2.1.35",
"resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"dev": true,
"dependencies": {
"mime-db": "1.52.0"
},
@ -8829,6 +8892,11 @@
"node": ">= 0.10"
}
},
"node_modules/proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
},
"node_modules/pseudomap": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/pseudomap/-/pseudomap-1.0.2.tgz",
@ -13639,6 +13707,11 @@
"integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
"dev": true
},
"asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
},
"at-least-node": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz",
@ -13659,6 +13732,16 @@
"postcss-value-parser": "^4.2.0"
}
},
"axios": {
"version": "1.13.2",
"resolved": "https://registry.npmmirror.com/axios/-/axios-1.13.2.tgz",
"integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==",
"requires": {
"follow-redirects": "^1.15.6",
"form-data": "^4.0.4",
"proxy-from-env": "^1.1.0"
}
},
"babel-loader": {
"version": "8.4.1",
"resolved": "https://registry.npmmirror.com/babel-loader/-/babel-loader-8.4.1.tgz",
@ -13899,7 +13982,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
"integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
"dev": true,
"requires": {
"es-errors": "^1.3.0",
"function-bind": "^1.1.2"
@ -14126,6 +14208,14 @@
"integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
"dev": true
},
"combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"requires": {
"delayed-stream": "~1.0.0"
}
},
"commander": {
"version": "8.3.0",
"resolved": "https://registry.npmmirror.com/commander/-/commander-8.3.0.tgz",
@ -14664,6 +14754,11 @@
"object-keys": "^1.1.1"
}
},
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
},
"depd": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz",
@ -14789,7 +14884,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz",
"integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
"dev": true,
"requires": {
"call-bind-apply-helpers": "^1.0.1",
"es-errors": "^1.3.0",
@ -14894,14 +14988,12 @@
"es-define-property": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz",
"integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
"dev": true
"integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="
},
"es-errors": {
"version": "1.3.0",
"resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz",
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
"dev": true
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="
},
"es-module-lexer": {
"version": "1.7.0",
@ -14913,11 +15005,21 @@
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
"integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
"dev": true,
"requires": {
"es-errors": "^1.3.0"
}
},
"es-set-tostringtag": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
"integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
"requires": {
"es-errors": "^1.3.0",
"get-intrinsic": "^1.2.6",
"has-tostringtag": "^1.0.2",
"hasown": "^2.0.2"
}
},
"escalade": {
"version": "3.2.0",
"resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz",
@ -15561,8 +15663,19 @@
"follow-redirects": {
"version": "1.15.11",
"resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.11.tgz",
"integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
"dev": true
"integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ=="
},
"form-data": {
"version": "4.0.4",
"resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.4.tgz",
"integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
"requires": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"es-set-tostringtag": "^2.1.0",
"hasown": "^2.0.2",
"mime-types": "^2.1.12"
}
},
"forwarded": {
"version": "0.2.0",
@ -15616,8 +15729,7 @@
"function-bind": {
"version": "1.1.2",
"resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz",
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
"dev": true
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="
},
"functional-red-black-tree": {
"version": "1.0.1",
@ -15641,7 +15753,6 @@
"version": "1.3.0",
"resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
"integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
"dev": true,
"requires": {
"call-bind-apply-helpers": "^1.0.2",
"es-define-property": "^1.0.1",
@ -15659,7 +15770,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz",
"integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
"dev": true,
"requires": {
"dunder-proto": "^1.0.1",
"es-object-atoms": "^1.0.0"
@ -15737,8 +15847,7 @@
"gopd": {
"version": "1.2.0",
"resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz",
"integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
"dev": true
"integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="
},
"graceful-fs": {
"version": "4.2.11",
@ -15779,8 +15888,15 @@
"has-symbols": {
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz",
"integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
"dev": true
"integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="
},
"has-tostringtag": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
"integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
"requires": {
"has-symbols": "^1.0.3"
}
},
"hash-sum": {
"version": "2.0.0",
@ -15792,7 +15908,6 @@
"version": "2.0.2",
"resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz",
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
"dev": true,
"requires": {
"function-bind": "^1.1.2"
}
@ -16598,8 +16713,7 @@
"math-intrinsics": {
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
"integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
"dev": true
"integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="
},
"mdn-data": {
"version": "2.0.14",
@ -16674,14 +16788,12 @@
"mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
"dev": true
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
},
"mime-types": {
"version": "2.1.35",
"resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"dev": true,
"requires": {
"mime-db": "1.52.0"
}
@ -17714,6 +17826,11 @@
}
}
},
"proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
},
"pseudomap": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/pseudomap/-/pseudomap-1.0.2.tgz",

1
package.json

@ -8,6 +8,7 @@
"lint": "vue-cli-service lint"
},
"dependencies": {
"axios": "^1.13.2",
"core-js": "^3.8.3",
"vue": "^2.6.14",
"vue-router": "^3.6.5"

10
src/components/Question/QuestionSearch.vue

@ -7,8 +7,8 @@
<label>题目类型</label>
<select>
<option>股票知识</option>
<option>基金知识</option>
<option>投资策略</option>
<option>企业文化</option>
<option>全部</option>
</select>
</div>
@ -20,11 +20,11 @@
<!-- 课程推荐筛选项 -->
<div class="search-item">
<label>课程推荐</label>
<label>推荐系列</label>
<select>
<option>量能擒牛</option>
<option>趋势交易</option>
<option>基本面分析</option>
<option>价格破译</option>
</select>
</div>

224
src/components/Question/QuestionTable.vue

@ -9,8 +9,29 @@
<th>ID</th>
<th>题干</th>
<th>题目类型</th>
<th>出错次数</th>
<th>出错率</th>
<th @click="sort('errorCount')" class="sortable">
<div class="sort-header">
出错次数
<span v-if="sortField === 'errorCount'" class="sort-icon">
<svg width="12" height="12" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M7 10L12 15L17 10" stroke="#e74c3c" stroke-width="2" />
<path d="M12 15V3" stroke="#e74c3c" stroke-width="2" />
</svg>
</span>
</div>
</th>
<th @click="sort('errorRate')" class="sortable">
<div class="sort-header">
出错率
<span v-if="sortField === 'errorRate'" class="sort-icon">
<svg width="12" height="12" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M7 10L12 15L17 10" stroke="#e74c3c" stroke-width="2" />
<path d="M12 15V3" stroke="#e74c3c" stroke-width="2" />
</svg>
</span>
</div>
</th>
<th>推荐课程</th>
<th>操作</th>
</tr>
@ -18,15 +39,14 @@
<!-- 表格主体部分 -->
<tbody>
<!-- 示例数据行 -->
<tr>
<td>1</td>
<td>以下哪项不是股票的基本特征</td>
<td>股票知识</td>
<td>50</td>
<td>50%</td>
<td>量能擒牛</td>
<tr v-for="item in sortedItems" :key="item.id">
<td>{{ item.id }}</td>
<td>{{ item.questionText }}</td>
<td>{{ item.type }}</td>
<td>{{ item.errorCount }}</td>
<td>{{ item.errorRate }}</td>
<td>{{ item.recommendedCourse }}</td>
<td>
<!-- 操作按钮组 -->
<button class="btn-red small">查看</button>
<button class="btn-red small">修改</button>
<button class="btn-red small">删除</button>
@ -37,45 +57,199 @@
</div>
</template>
<script>
export default {
//
name: 'QuestionTable'
name: 'QuestionTable',
data() {
return {
sortField: '', //
sortDirection: 'asc', // asc desc
items: [
{
id: 1,
questionText: '以下哪项不是股票的基本特征?',
type: '股票知识',
errorCount: 50,
errorRate: '50%',
recommendedCourse: '量能擒牛'
},
{
id: 2,
questionText: '基金的风险主要来源于?',
type: '基金知识',
errorCount: 30,
errorRate: '30%',
recommendedCourse: '基本面分析'
}
],
sortedItems: [] //
}
},
// computed: {
// sortedItems() {
// if (!this.sortField) {
// // ID
// return this.items.sort((a, b) => a.id - b.id)
// }
//
// return this.items.sort((a, b) => {
// const aValue = a[this.sortField]
// const bValue = b[this.sortField]
//
// //
// if (typeof aValue === 'number' && typeof bValue === 'number') {
// return this.sortDirection === 'asc' ? aValue - bValue : bValue - aValue
// } else {
// const strA = String(aValue).toLowerCase()
// const strB = String(bValue).toLowerCase()
// return this.sortDirection === 'asc'
// ? strA.localeCompare(strB)
// : strB.localeCompare(strA)
// }
// })
// }
// },
watch: {
sortField: {
handler() {
this.updateSortedItems()
},
immediate: true //
},
sortDirection: {
handler() {
this.updateSortedItems()
},
immediate: true
}
},
methods: {
updateSortedItems() {
if (!this.sortField) {
this.sortedItems = [...this.items].sort((a, b) => a.id - b.id)
return
}
const sorted = [...this.items].sort((a, b) => {
const aValue = a[this.sortField]
const bValue = b[this.sortField]
if (typeof aValue === 'number' && typeof bValue === 'number') {
return this.sortDirection === 'asc' ? aValue - bValue : bValue - aValue
} else {
const strA = String(aValue).toLowerCase()
const strB = String(bValue).toLowerCase()
return this.sortDirection === 'asc'
? strA.localeCompare(strB)
: strB.localeCompare(strA)
}
})
this.sortedItems = sorted
},
sort(field) {
if (this.sortField === field) {
this.sortDirection = this.sortDirection === 'asc' ? 'desc' : 'asc'
} else {
this.sortField = field
this.sortDirection = 'asc'
}
}
}
}
</script>
<style scoped>
/* 修改操作列按钮间距 */
td:last-child {
display: flex;
gap: 16px; /* 将间距设置为16px */
}
th {
display: table-cell !important;
vertical-align: middle !important;
}
/* sort-header 样式 */
.sort-header {
display: flex;
align-items: center;
gap: 6px;
}
/* 排序图标样式 */
.sort-icon svg {
width: 12px;
height: 12px;
fill: none;
stroke: #e74c3c;
stroke-width: 2;
transition: transform 0.2s;
}
/* 表格容器样式 */
.table-container {
width: 100%; /* 宽度100% */
border-collapse: collapse; /* 边框合并 */
margin-top: 10px; /* 上边距10px */
width: 100%;
border-collapse: collapse;
margin-top: 10px;
}
/* 表格样式 */
table {
width: 100%; /* 宽度100% */
border-collapse: collapse; /* 边框合并 */
background-color: white; /* 白色背景 */
width: 100%;
border-collapse: collapse;
background-color: white;
}
/* 表格单元格样式 */
th,
td {
padding: 12px; /* 内边距 */
text-align: left; /* 文字左对齐 */
border-bottom: 1px solid #ddd; /* 底部边框 */
padding: 12px;
text-align: left;
border-bottom: 1px solid #ddd;
}
/* 表头样式 */
th {
background-color: #f2f2f2; /* 背景色 */
font-weight: normal; /* 正常字体粗细 */
color: #333; /* 字体颜色 */
background-color: #f2f2f2;
font-weight: normal;
color: #333;
cursor: pointer; /* 添加鼠标指针 */
user-select: none; /* 防止文字选中 */
}
/* 可排序列样式 */
.sortable {
display: flex;
align-items: center;
gap: 6px;
}
/* 排序图标样式 */
.sortable svg {
width: 12px;
height: 12px;
fill: none;
stroke: #e74c3c;
stroke-width: 2;
transition: transform 0.2s;
}
/* 悬停效果 */
th:hover {
background-color: #e0e0e0;
}
/* 表格行悬停效果 */
tr:hover {
background-color: #f9f9f9; /* 悬停背景色 */
background-color: #f9f9f9;
}
</style>

3
src/components/WrongQuestion/WrongQuestionSearch.vue

@ -57,8 +57,7 @@ export default {
methods: {
//
searchWrongQuestions() {
console.log('搜索条件:', this.filters)
// API
this.$emit('search', this.filters)
},
// Excel
exportToExcel() {

118
src/components/WrongQuestion/WrongQuestionTable.vue

@ -1,4 +1,3 @@
<!-- src/components/WrongQuestion/WrongQuestionTable.vue -->
<template>
<!-- 表格容器用于展示错题统计数据 -->
<div class="table-container">
@ -10,25 +9,43 @@
<th>ID</th>
<th>题干</th>
<th>题目类型</th>
<th>出错次数</th>
<th>出错率</th>
<th @click="sort('errorCount')" class="sortable">
<div class="sort-header">
出错次数
<span v-if="sortField === 'errorCount'" class="sort-icon">
<svg width="12" height="12" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M7 10L12 15L17 10" stroke="#e74c3c" stroke-width="2" />
<path d="M12 15V3" stroke="#e74c3c" stroke-width="2" />
</svg>
</span>
</div>
</th>
<th @click="sort('errorRate')" class="sortable">
<div class="sort-header">
出错率
<span v-if="sortField === 'errorRate'" class="sort-icon">
<svg width="12" height="12" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M7 10L12 15L17 10" stroke="#e74c3c" stroke-width="2" />
<path d="M12 15V3" stroke="#e74c3c" stroke-width="2" />
</svg>
</span>
</div>
</th>
<th>推荐课程</th>
<th>操作</th>
</tr>
</thead>
<!-- 表格主体循环渲染每条错题数据 -->
<tbody>
<tr v-for="item in wrongQuestions" :key="item.id">
<tr v-for="item in sortedWrongQuestions" :key="item.id">
<td>{{ item.id }}</td>
<td>{{ item.questionText }}</td>
<td>{{ item.type }}</td>
<td>{{ item.errorCount }}</td>
<td>{{ item.errorRate }}</td>
<td>{{ item.recommendedCourse }}</td>
<td>
<!-- 查看出错用户按钮 -->
<td class="operation-cell">
<button class="btn-red small" @click="viewUser(item)">出错用户</button>
<!-- 查看题目详情按钮 -->
<button class="btn-red small" @click="viewQuestion(item)">查看题目</button>
</td>
</tr>
@ -39,45 +56,75 @@
<script>
export default {
//
name: 'WrongQuestionTable',
//
props: {
wrongQuestions: {
type: Array,
default: () => []
}
},
//
data() {
return {
sortField: '', //
sortDirection: 'asc' // asc desc
}
},
computed: {
sortedWrongQuestions() {
if (!this.sortField) {
// ID
return [...this.wrongQuestions].sort((a, b) => a.id - b.id)
}
return [...this.wrongQuestions].sort((a, b) => {
const aValue = a[this.sortField]
const bValue = b[this.sortField]
//
if (typeof aValue === 'number' && typeof bValue === 'number') {
return this.sortDirection === 'asc' ? aValue - bValue : bValue - aValue
} else {
const strA = String(aValue).toLowerCase()
const strB = String(bValue).toLowerCase()
return this.sortDirection === 'asc'
? strA.localeCompare(strB)
: strB.localeCompare(strA)
}
})
}
},
methods: {
//
viewUser(item) {
console.log('查看出错用户:', item)
},
//
viewQuestion(item) {
console.log('查看题目:', item)
},
sort(field) {
if (this.sortField === field) {
this.sortDirection = this.sortDirection === 'asc' ? 'desc' : 'asc'
} else {
this.sortField = field
this.sortDirection = 'asc'
}
}
}
}
</script>
<style scoped>
/* 表格容器样式 */
.table-container {
width: 100%;
border-collapse: collapse;
margin-top: 10px;
}
/* 表格整体样式 */
table {
width: 100%;
border-collapse: collapse;
background-color: white;
}
/* 表头和表体单元格通用样式 */
th,
td {
padding: 12px;
@ -85,15 +132,52 @@ td {
border-bottom: 1px solid #ddd;
}
/* 表头样式 */
th {
background-color: #f2f2f2;
font-weight: normal;
color: #333;
cursor: pointer; /* 添加鼠标指针 */
user-select: none; /* 防止文字选中 */
display: table-cell !important;
vertical-align: middle !important;
}
/* 鼠标悬停行高亮效果 */
tr:hover {
background-color: #f9f9f9;
}
/* 操作列按钮间距调整 */
.operation-cell {
display: flex;
gap: 16px; /* 更宽的间距 */
}
/* sort-header 样式 */
.sort-header {
display: flex;
align-items: center;
gap: 6px;
}
/* 可排序列样式 */
.sortable {
display: flex;
align-items: center;
gap: 6px;
}
/* 排序图标样式 */
.sort-icon svg {
width: 12px;
height: 12px;
fill: none;
stroke: #e74c3c;
stroke-width: 2;
transition: transform 0.2s;
}
/* 悬 hover 效果 */
th:hover {
background-color: #e0e0e0;
}
</style>

27
src/views/WrongQuestion.vue

@ -2,7 +2,7 @@
<!-- 错题统计页面容器 -->
<div class="wrong-question">
<!-- 搜索区域组件用于筛选错题数据 -->
<WrongQuestionSearch />
<WrongQuestionSearch @search="handleSearch" />
<!-- 错题表格组件展示筛选后的错题列表 -->
<WrongQuestionTable :wrongQuestions="wrongQuestions" />
</div>
@ -13,6 +13,7 @@
import WrongQuestionSearch from '@/components/WrongQuestion/WrongQuestionSearch.vue'
//
import WrongQuestionTable from '@/components/WrongQuestion/WrongQuestionTable.vue'
import axios from "axios";
export default {
//
@ -34,17 +35,33 @@ export default {
errorCount: 50,
errorRate: '50%',
recommendedCourse: '量能擒牛'
},
{
id: 2,
questionText: '基金的风险主要来源于?',
type: '基金知识',
errorCount: 30,
errorRate: '30%',
recommendedCourse: '基本面分析'
}
]
}
},
//
methods: {
// API
fetchWrongQuestions() {
console.log('获取错题数据...')
}
handleSearch(filters) {
this.fetchWrongQuestions(filters)
},
async fetchWrongQuestions(filters = {}) {
try {
const response = await axios.get('/api/wrong-questions', { params: filters })
this.wrongQuestions = response.data
} catch (error) {
console.error('搜索失败:', error)
}
}
}
,
//
mounted() {
//

Loading…
Cancel
Save