From 01ca0c6f4b7289d5116aa7fbc4f45aace3f1afd0 Mon Sep 17 00:00:00 2001 From: wangziqi Date: Tue, 11 Aug 2026 15:18:30 +0800 Subject: [PATCH] =?UTF-8?q?fix(server,admin):=20=E6=88=90=E7=BB=A9/?= =?UTF-8?q?=E7=8F=AD=E7=BA=A7=E5=9D=87=E5=88=86/=E6=8E=92=E5=90=8D?= =?UTF-8?q?=E8=B6=85=E5=88=97=E5=AE=BD=E5=86=99=E5=85=A5=20MySQL=20?= =?UTF-8?q?=E6=8A=A5=20500?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit score/class_avg 为 decimal(5,2)(上限 999.99)、rank 为 int,越界值直写库抛 ER_WARN_DATA_OUT_OF_RANGE。DTO 加 @Max 与列宽对齐返回 400 清晰报错, 前端单元格与表单 InputNumber 同步加 max 阻止输入 --- .../StudentProfileContent/ExamScoresTab.tsx | 12 ++++++------ apps/server/src/archive/dto/archive.dto.ts | 8 +++++--- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/apps/admin/src/components/StudentProfileContent/ExamScoresTab.tsx b/apps/admin/src/components/StudentProfileContent/ExamScoresTab.tsx index 527b500..3c9e74e 100644 --- a/apps/admin/src/components/StudentProfileContent/ExamScoresTab.tsx +++ b/apps/admin/src/components/StudentProfileContent/ExamScoresTab.tsx @@ -125,7 +125,7 @@ export const ExamScoresTab: React.FC< title: '成绩', dataIndex: 'score', render: (v: number | null, r) => ( - + {v ?? '-'} ), @@ -134,7 +134,7 @@ export const ExamScoresTab: React.FC< title: '班级均分', dataIndex: 'classAvg', render: (v: number | undefined, r) => ( - + {v !== undefined ? v : '-'} ), @@ -143,7 +143,7 @@ export const ExamScoresTab: React.FC< title: '排名', dataIndex: 'rank', render: (v: number | undefined, r) => ( - + {v !== undefined ? v : '-'} ), @@ -247,13 +247,13 @@ export const ExamScoresTab: React.FC< - + - + - + diff --git a/apps/server/src/archive/dto/archive.dto.ts b/apps/server/src/archive/dto/archive.dto.ts index 1cf8465..89b5341 100644 --- a/apps/server/src/archive/dto/archive.dto.ts +++ b/apps/server/src/archive/dto/archive.dto.ts @@ -6,6 +6,7 @@ import { IsDateString, IsNotEmpty, Min, + Max, IsInt, } from 'class-validator'; @@ -38,9 +39,10 @@ export class CreateExamScoreDto { @IsString() @IsNotEmpty() examType: string; @IsOptional() @IsString() examName?: string; @IsString() @IsNotEmpty() subject: string; - @IsNumber() @Min(0) score: number; - @IsOptional() @IsNumber() @Min(0) classAvg?: number; - @IsOptional() @IsNumber() @Min(1) rank?: number; + // 列类型 decimal(5,2)/int:上限与列宽对齐,避免超范围写入 MySQL 报 500 + @IsNumber() @Min(0) @Max(999.99) score: number; + @IsOptional() @IsNumber() @Min(0) @Max(999.99) classAvg?: number; + @IsOptional() @IsNumber() @Min(1) @Max(2147483647) rank?: number; @IsOptional() @IsDateString() examDate?: string; @IsOptional() @IsNumber() enrollmentId?: number; }