From 3d314fe84f4e971439e2005cddf0ae749f510767 Mon Sep 17 00:00:00 2001 From: DevOps Date: Fri, 19 Dec 2025 14:44:37 +0800 Subject: [PATCH 1/8] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0package-lock.jso?= =?UTF-8?q?n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with Claude Code Co-Authored-By: Claude --- package-lock.json | 46 ++++++++++------------------------------------ 1 file changed, 10 insertions(+), 36 deletions(-) diff --git a/package-lock.json b/package-lock.json index e7a28a2..ff21ee9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -851,7 +851,6 @@ "version": "4.17.12", "resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz", "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", - "peer": true, "dependencies": { "@types/lodash": "*" } @@ -874,7 +873,6 @@ "version": "2.3.4", "resolved": "https://registry.npmmirror.com/@uppy/core/-/core-2.3.4.tgz", "integrity": "sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==", - "peer": true, "dependencies": { "@transloadit/prettier-bytes": "0.0.7", "@uppy/store-default": "^2.1.1", @@ -903,7 +901,6 @@ "version": "2.1.3", "resolved": "https://registry.npmmirror.com/@uppy/xhr-upload/-/xhr-upload-2.1.3.tgz", "integrity": "sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==", - "peer": true, "dependencies": { "@uppy/companion-client": "^2.2.2", "@uppy/utils": "^4.1.2", @@ -1058,7 +1055,6 @@ "version": "1.1.7", "resolved": "https://registry.npmmirror.com/@wangeditor/basic-modules/-/basic-modules-1.1.7.tgz", "integrity": "sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==", - "peer": true, "dependencies": { "is-url": "^1.2.4" }, @@ -1089,7 +1085,6 @@ "version": "1.1.19", "resolved": "https://registry.npmmirror.com/@wangeditor/core/-/core-1.1.19.tgz", "integrity": "sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==", - "peer": true, "dependencies": { "@types/event-emitter": "^0.3.3", "event-emitter": "^0.3.5", @@ -1119,7 +1114,6 @@ "version": "5.1.23", "resolved": "https://registry.npmmirror.com/@wangeditor/editor/-/editor-5.1.23.tgz", "integrity": "sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==", - "peer": true, "dependencies": { "@uppy/core": "^2.1.1", "@uppy/xhr-upload": "^2.0.3", @@ -1476,7 +1470,6 @@ "version": "11.13.1", "resolved": "https://registry.npmmirror.com/diagram-js/-/diagram-js-11.13.1.tgz", "integrity": "sha512-6kO0rBN6aBIQiMELfv1oX2Ohes/brlIPuOVZUYAioeWM0EyuazhAXgHeq8iKFt29daU9NGRr4n78esGx8QjtjQ==", - "peer": true, "dependencies": { "@bpmn-io/diagram-js-ui": "^0.2.2", "clsx": "^1.2.1", @@ -1514,7 +1507,6 @@ "version": "3.0.0", "resolved": "https://registry.npmmirror.com/dom7/-/dom7-3.0.0.tgz", "integrity": "sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==", - "peer": true, "dependencies": { "ssr-window": "^3.0.0-alpha.1" } @@ -1540,7 +1532,6 @@ "version": "2.7.3", "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.7.3.tgz", "integrity": "sha512-OaqY1kQ2xzNyRFyge3fzM7jqMwux+464RBEqd+ybRV9xPiGxtgnj/sVK4iEbnKnzQIa9XK03DOIFzoToUhu1DA==", - "peer": true, "dependencies": { "@ctrl/tinycolor": "^3.4.1", "@element-plus/icons-vue": "^2.3.1", @@ -1866,8 +1857,7 @@ "node_modules/is-hotkey": { "version": "0.2.0", "resolved": "https://registry.npmmirror.com/is-hotkey/-/is-hotkey-0.2.0.tgz", - "integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==", - "peer": true + "integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==" }, "node_modules/is-number": { "version": "7.0.0", @@ -1942,14 +1932,12 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "peer": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/lodash-es": { "version": "4.17.21", "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "peer": true + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" }, "node_modules/lodash-unified": { "version": "1.0.3", @@ -1964,44 +1952,37 @@ "node_modules/lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmmirror.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "peer": true + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" }, "node_modules/lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmmirror.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", - "peer": true + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "peer": true + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" }, "node_modules/lodash.foreach": { "version": "4.5.0", "resolved": "https://registry.npmmirror.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz", - "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==", - "peer": true + "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==" }, "node_modules/lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", - "peer": true + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" }, "node_modules/lodash.throttle": { "version": "4.1.1", "resolved": "https://registry.npmmirror.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", - "peer": true + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" }, "node_modules/lodash.toarray": { "version": "4.4.0", "resolved": "https://registry.npmmirror.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz", - "integrity": "sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw==", - "peer": true + "integrity": "sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw==" }, "node_modules/magic-string": { "version": "0.30.10", @@ -2116,7 +2097,6 @@ "url": "https://github.com/sponsors/ai" } ], - "peer": true, "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -2308,7 +2288,6 @@ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz", "integrity": "sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==", "dev": true, - "peer": true, "dependencies": { "@types/estree": "1.0.5" }, @@ -2367,7 +2346,6 @@ "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.2.tgz", "integrity": "sha512-eb4GZt1C3avsX3heBNlrc7I09nyT00IUuo4eFhAbeXWU2fvA7oXI53SxODVAA+zgZCk9aunAZgO+losjR3fAwA==", "dev": true, - "peer": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -2403,7 +2381,6 @@ "version": "0.72.8", "resolved": "https://registry.npmmirror.com/slate/-/slate-0.72.8.tgz", "integrity": "sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==", - "peer": true, "dependencies": { "immer": "^9.0.6", "is-plain-object": "^5.0.0", @@ -2425,7 +2402,6 @@ "version": "3.5.1", "resolved": "https://registry.npmmirror.com/snabbdom/-/snabbdom-3.5.1.tgz", "integrity": "sha512-wHMNIOjkm/YNE5EM3RCbr/+DVgPg6AqQAX1eOxO46zYNvCXjKP5Y865tqQj3EXnaMBjkxmQA5jFuDpDK/dbfiA==", - "peer": true, "engines": { "node": ">=8.3.0" } @@ -2623,7 +2599,6 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.12.tgz", "integrity": "sha512-/gC8GxzxMK5ntBwb48pR32GGhENnjtY30G4A0jemunsBkiEZFw60s8InGpN8gkhHEkjnRK1aSAxeQgwvFhUHAA==", "dev": true, - "peer": true, "dependencies": { "esbuild": "^0.20.1", "postcss": "^8.4.38", @@ -2791,7 +2766,6 @@ "version": "3.4.27", "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.27.tgz", "integrity": "sha512-8s/56uK6r01r1icG/aEOHqyMVxd1bkYcSe9j8HcKtr/xTOFWvnzIVTehNW+5Yt89f+DLBe4A569pnZLS5HzAMA==", - "peer": true, "dependencies": { "@vue/compiler-dom": "3.4.27", "@vue/compiler-sfc": "3.4.27", From 226d92f725d2e9f4ab226cd27d9045d49353699e Mon Sep 17 00:00:00 2001 From: DevOps Date: Mon, 22 Dec 2025 13:25:38 +0800 Subject: [PATCH 2/8] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8DP2=E5=92=8CP3?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. P2: 修复订单管理this.$set不兼容Vue3问题,改为直接赋值 2. P3: 修复选手年龄显示-1问题,改为显示"--" 🤖 Generated with Claude Code Co-Authored-By: Claude --- src/views/martial/order/index.vue | 6 +++--- src/views/martial/participant/index.vue | 7 +++++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/views/martial/order/index.vue b/src/views/martial/order/index.vue index 60b8c4f..5249277 100644 --- a/src/views/martial/order/index.vue +++ b/src/views/martial/order/index.vue @@ -181,13 +181,13 @@ export default { try { const res = await getScheduleResult(competition.id) if (res.data?.data) { - this.$set(this.scheduleStatusMap, competition.id, res.data.data.isCompleted || false) + this.scheduleStatusMap[competition.id] = res.data.data.isCompleted || false } else { - this.$set(this.scheduleStatusMap, competition.id, false) + this.scheduleStatusMap[competition.id] = false } } catch (err) { // 如果获取失败,默认为未完成 - this.$set(this.scheduleStatusMap, competition.id, false) + this.scheduleStatusMap[competition.id] = false } } }, diff --git a/src/views/martial/participant/index.vue b/src/views/martial/participant/index.vue index b260bb8..6698c76 100644 --- a/src/views/martial/participant/index.vue +++ b/src/views/martial/participant/index.vue @@ -94,11 +94,14 @@ + > + + Date: Tue, 23 Dec 2025 17:17:34 +0800 Subject: [PATCH 3/8] =?UTF-8?q?feat:=20=E8=B5=9B=E7=A8=8B=E7=BC=96?= =?UTF-8?q?=E6=8E=92=E8=A1=A8=E6=A0=BC=E6=8C=89=E9=98=9F=E4=BC=8D=E5=88=86?= =?UTF-8?q?=E7=BB=84=E6=98=BE=E7=A4=BA=E9=80=89=E6=89=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将同一单位的选手合并为一个队伍行 - 多选手队伍可展开查看具体选手 - 队伍状态根据所有选手状态计算(已签到/未签到/部分签到/部分异常) - 上移/下移操作移动整个队伍 - 异常标记:单人队伍在主行标记,多人队伍需展开后标记单个选手 - 修复语法错误(转义字符和字符串引号) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- src/views/martial/schedule/index.vue | 218 +++++++++++++++++++++++++-- 1 file changed, 207 insertions(+), 11 deletions(-) diff --git a/src/views/martial/schedule/index.vue b/src/views/martial/schedule/index.vue index 1accdb9..6955462 100644 --- a/src/views/martial/schedule/index.vue +++ b/src/views/martial/schedule/index.vue @@ -86,13 +86,44 @@ - + + + + + - - - + + diff --git a/src/views/martial/participant/index.vue.bak b/src/views/martial/participant/index.vue.bak new file mode 100644 index 0000000..b260bb8 --- /dev/null +++ b/src/views/martial/participant/index.vue.bak @@ -0,0 +1,990 @@ + + + + + diff --git a/src/views/martial/schedule/index.vue b/src/views/martial/schedule/index.vue index 0f3a22a..1498dd7 100644 --- a/src/views/martial/schedule/index.vue +++ b/src/views/martial/schedule/index.vue @@ -380,7 +380,7 @@ import { ArrowDown, ArrowRight } from '@element-plus/icons-vue' import { getVenuesByCompetition } from '@/api/martial/venue' import { getCompetitionDetail } from '@/api/martial/competition' -import { getScheduleResult, saveAndLockSchedule, saveDraftSchedule, triggerAutoArrange, moveScheduleGroup } from '@/api/martial/activitySchedule' +import { getScheduleResult, saveAndLockSchedule, saveDraftSchedule, triggerAutoArrange, moveScheduleGroup, exportSchedule } from '@/api/martial/activitySchedule' export default { name: 'MartialScheduleList', @@ -1113,8 +1113,23 @@ export default { group.items.splice(itemIndex + 1, 0, temp) this.$message.success('下移成功') }, - handleExport() { - this.$message.success('导出功能开发中') + async handleExport() { + try { + this.loading = true + const res = await exportSchedule(this.competitionId) + const blob = new Blob([res], { type: 'application/vnd.ms-excel' }) + const link = document.createElement('a') + link.href = window.URL.createObjectURL(blob) + link.download = `赛程表_${this.competitionInfo.competitionName || this.competitionId}.xlsx` + link.click() + window.URL.revokeObjectURL(link.href) + this.$message.success('导出成功') + } catch (error) { + console.error('导出失败:', error) + this.$message.error('导出失败,请稍后重试') + } finally { + this.loading = false + } }, handleConfirm() { this.confirmDialogVisible = true diff --git a/src/views/martial/schedule/index.vue.bak b/src/views/martial/schedule/index.vue.bak new file mode 100644 index 0000000..78ed40f --- /dev/null +++ b/src/views/martial/schedule/index.vue.bak @@ -0,0 +1,1019 @@ + + + + + From 7f8c5c630b53cf29ab823fb7526650e1e9b2e93c Mon Sep 17 00:00:00 2001 From: DevOps Date: Wed, 24 Dec 2025 13:58:21 +0800 Subject: [PATCH 8/8] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=9A=E6=AD=A3=E7=A1=AE=E5=A4=84=E7=90=86?= =?UTF-8?q?blob=E5=93=8D=E5=BA=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - axios拦截器跳过blob类型响应的code检查 - 从res.data获取blob数据而非res 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- src/axios.js | 4 ++++ src/views/martial/schedule/index.vue | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/axios.js b/src/axios.js index 7d9b5e5..e24edb9 100644 --- a/src/axios.js +++ b/src/axios.js @@ -98,6 +98,10 @@ axios.interceptors.request.use( axios.interceptors.response.use( res => { NProgress.done(); + // 如果是 blob 类型响应(文件下载),直接返回 + if (res.config.responseType === 'blob') { + return res; + } const status = res.data.code || res.status; const statusWhiteList = website.statusWhiteList || []; const message = res.data.msg || res.data.error_description || '系统错误'; diff --git a/src/views/martial/schedule/index.vue b/src/views/martial/schedule/index.vue index 1498dd7..814bbd9 100644 --- a/src/views/martial/schedule/index.vue +++ b/src/views/martial/schedule/index.vue @@ -1117,7 +1117,8 @@ export default { try { this.loading = true const res = await exportSchedule(this.competitionId) - const blob = new Blob([res], { type: 'application/vnd.ms-excel' }) + // axios 返回的是 response 对象,需要取 res.data + const blob = new Blob([res.data], { type: 'application/vnd.ms-excel' }) const link = document.createElement('a') link.href = window.URL.createObjectURL(blob) link.download = `赛程表_${this.competitionInfo.competitionName || this.competitionId}.xlsx`