From e3366af9ec0d4b4ac49a722c5af7bc4156af4876 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=AB=E5=9C=B0=E5=83=A7?= <357099073@qq.com> Date: Mon, 17 Nov 2025 22:55:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=99=BA=E8=83=BD=E6=96=B0?= =?UTF-8?q?=E5=BB=BA=E9=A2=98=E7=9B=AE=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pc/package-lock.json | 106 ++++- pc/package.json | 3 +- pc/src/api/exam.js | 9 + .../examinationQuestions/components/edit.vue | 232 ++++++++-- .../components/examList.vue | 432 +++++++++++++++++- server/conf/app.conf | 2 +- server/controllers/exam.go | 90 ++++ server/routers/router.go | 2 + server/services/exam.go | 15 + 9 files changed, 834 insertions(+), 57 deletions(-) diff --git a/pc/package-lock.json b/pc/package-lock.json index 0fcda1f..1a95132 100644 --- a/pc/package-lock.json +++ b/pc/package-lock.json @@ -21,7 +21,8 @@ "pinia": "^3.0.3", "vue": "^3.5.22", "vue-router": "^4.6.3", - "vue3-pdf-app": "^1.0.3" + "vue3-pdf-app": "^1.0.3", + "xlsx": "^0.18.5" }, "devDependencies": { "@types/node": "^24.9.2", @@ -1784,6 +1785,15 @@ "node": ">=0.4.0" } }, + "node_modules/adler-32": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/adler-32/-/adler-32-1.3.1.tgz", + "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, "node_modules/array-buffer-byte-length": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", @@ -1945,6 +1955,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/cfb": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/cfb/-/cfb-1.2.2.tgz", + "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==", + "license": "Apache-2.0", + "dependencies": { + "adler-32": "~1.3.0", + "crc-32": "~1.2.0" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/chart": { "version": "0.1.2", "resolved": "https://registry.npmmirror.com/chart/-/chart-0.1.2.tgz", @@ -1983,6 +2006,15 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/codepage": { + "version": "1.15.0", + "resolved": "https://registry.npmmirror.com/codepage/-/codepage-1.15.0.tgz", + "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, "node_modules/color-convert": { "version": "0.2.1", "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-0.2.1.tgz", @@ -2041,6 +2073,18 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "license": "MIT" }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz", @@ -2633,6 +2677,15 @@ "node": ">= 6" } }, + "node_modules/frac": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/frac/-/frac-1.1.2.tgz", + "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", @@ -4796,6 +4849,18 @@ "node": ">=0.10.0" } }, + "node_modules/ssf": { + "version": "0.11.2", + "resolved": "https://registry.npmmirror.com/ssf/-/ssf-0.11.2.tgz", + "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==", + "license": "Apache-2.0", + "dependencies": { + "frac": "~1.1.2" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/ssr-window": { "version": "3.0.0", "resolved": "https://registry.npmmirror.com/ssr-window/-/ssr-window-3.0.0.tgz", @@ -5523,6 +5588,45 @@ "resolved": "https://registry.npmmirror.com/wildcard/-/wildcard-1.1.2.tgz", "integrity": "sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==", "license": "MIT" + }, + "node_modules/wmf": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/wmf/-/wmf-1.0.2.tgz", + "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/word": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/word/-/word-0.3.0.tgz", + "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/xlsx": { + "version": "0.18.5", + "resolved": "https://registry.npmmirror.com/xlsx/-/xlsx-0.18.5.tgz", + "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==", + "license": "Apache-2.0", + "dependencies": { + "adler-32": "~1.3.0", + "cfb": "~1.2.1", + "codepage": "~1.15.0", + "crc-32": "~1.2.1", + "ssf": "~0.11.2", + "wmf": "~1.0.1", + "word": "~0.3.0" + }, + "bin": { + "xlsx": "bin/xlsx.njs" + }, + "engines": { + "node": ">=0.8" + } } } } diff --git a/pc/package.json b/pc/package.json index f232435..6a8e3f2 100644 --- a/pc/package.json +++ b/pc/package.json @@ -22,7 +22,8 @@ "pinia": "^3.0.3", "vue": "^3.5.22", "vue-router": "^4.6.3", - "vue3-pdf-app": "^1.0.3" + "vue3-pdf-app": "^1.0.3", + "xlsx": "^0.18.5" }, "devDependencies": { "@types/node": "^24.9.2", diff --git a/pc/src/api/exam.js b/pc/src/api/exam.js index 119c92b..a392257 100644 --- a/pc/src/api/exam.js +++ b/pc/src/api/exam.js @@ -122,6 +122,15 @@ export function createExamQuestion(data) { }) } +//题目批量导入 +export function batchImportExamQuestions(data) { + return request({ + url: '/api/exam-questions/batch', + method: 'post', + data + }) +} + // 更新题目 export function updateExamQuestion(id, data) { return request({ diff --git a/pc/src/views/apps/exams/examinationQuestions/components/edit.vue b/pc/src/views/apps/exams/examinationQuestions/components/edit.vue index 28d8d0b..48058b3 100644 --- a/pc/src/views/apps/exams/examinationQuestions/components/edit.vue +++ b/pc/src/views/apps/exams/examinationQuestions/components/edit.vue @@ -1,10 +1,23 @@