From 029881f09fec52b39907dc441906ae3fa02b902e Mon Sep 17 00:00:00 2001 From: zhonghua Date: Mon, 23 Mar 2026 14:47:01 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=88=90=E9=95=BF=E8=AE=B0=E5=BD=95=20i?= =?UTF-8?q?mages=20=E5=BA=8F=E5=88=97=E5=8C=96=E7=BB=9F=E4=B8=80=20+=20?= =?UTF-8?q?=E7=A7=9F=E6=88=B7=E5=A5=97=E9=A4=90=E7=A7=BB=E9=99=A4=E7=A1=AE?= =?UTF-8?q?=E8=AE=A4=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 成长记录: images 统一为 string[],修复 OpenAPI/Java DTO/前端类型 - 租户更新: TenantUpdateRequest 新增 forceRemove,ErrorCode 新增 REMOVE_PACKAGE_HAS_SCHEDULES - 异常处理: BusinessException 支持附加 data,GlobalExceptionHandler 返回 data 供前端确认弹窗 Made-with: Cursor --- reading-platform-frontend/openapi.json | 10 ++++++---- .../scripts/fetch-openapi.js | 18 ++++++++++++++++++ .../model/growthRecordCreateRequest.ts | 4 ++-- .../model/growthRecordUpdateRequest.ts | 4 ++-- .../platform/common/enums/ErrorCode.java | 1 + .../common/exception/BusinessException.java | 12 ++++++++++++ .../exception/GlobalExceptionHandler.java | 4 ++-- .../platform/common/response/Result.java | 11 +++++++++++ .../dto/request/GrowthRecordCreateRequest.java | 4 ++-- .../dto/request/GrowthRecordUpdateRequest.java | 4 ++-- .../dto/request/TenantUpdateRequest.java | 3 +++ 11 files changed, 61 insertions(+), 14 deletions(-) diff --git a/reading-platform-frontend/openapi.json b/reading-platform-frontend/openapi.json index c622793..3b211bc 100644 --- a/reading-platform-frontend/openapi.json +++ b/reading-platform-frontend/openapi.json @@ -26910,8 +26910,9 @@ "description": "内容" }, "images": { - "type": "string", - "description": "图片(JSON 数组)" + "type": "array", + "items": { "type": "string", "description": "图片 URL" }, + "description": "图片 URL 列表" }, "recordDate": { "type": "string", @@ -30152,8 +30153,9 @@ "description": "内容" }, "images": { - "type": "string", - "description": "图片(JSON 数组)" + "type": "array", + "items": { "type": "string", "description": "图片 URL" }, + "description": "图片 URL 列表" }, "recordDate": { "type": "string", diff --git a/reading-platform-frontend/scripts/fetch-openapi.js b/reading-platform-frontend/scripts/fetch-openapi.js index a3b6926..ff4870f 100644 --- a/reading-platform-frontend/scripts/fetch-openapi.js +++ b/reading-platform-frontend/scripts/fetch-openapi.js @@ -31,6 +31,8 @@ async function fetchAndFix() { if (spec.components?.schemas) { delete spec.components.schemas['ResultObject[]']; } + // 修复成长记录 images 字段:统一为 array of string(避免 SpringDoc 误生成为 string) + fixGrowthRecordImagesSchema(spec.components?.schemas); writeFileSync(OUTPUT, JSON.stringify(spec, null, 2)); console.log('OpenAPI spec written to:', OUTPUT); @@ -61,6 +63,22 @@ function fixSchema(schema) { if (schema.items) fixSchema(schema.items); } +/** 将 GrowthRecordCreateRequest/GrowthRecordUpdateRequest 的 images 统一为 array of string */ +function fixGrowthRecordImagesSchema(schemas) { + if (!schemas) return; + const arrayOfString = { + type: 'array', + items: { type: 'string', description: '图片 URL' }, + description: '图片 URL 列表', + }; + for (const name of ['GrowthRecordCreateRequest', 'GrowthRecordUpdateRequest']) { + const s = schemas[name]; + if (s?.properties?.images?.type === 'string') { + schemas[name].properties.images = arrayOfString; + } + } +} + function inlineResultObjectArrayRef(paths) { const inlineSchema = { type: 'object', diff --git a/reading-platform-frontend/src/api/generated/model/growthRecordCreateRequest.ts b/reading-platform-frontend/src/api/generated/model/growthRecordCreateRequest.ts index 08d6821..d338b4f 100644 --- a/reading-platform-frontend/src/api/generated/model/growthRecordCreateRequest.ts +++ b/reading-platform-frontend/src/api/generated/model/growthRecordCreateRequest.ts @@ -18,8 +18,8 @@ export interface GrowthRecordCreateRequest { title: string; /** 内容 */ content?: string; - /** 图片(JSON 数组) */ - images?: string; + /** 图片 URL 列表 */ + images?: string[]; /** 记录日期 */ recordDate?: string; /** 标签 */ diff --git a/reading-platform-frontend/src/api/generated/model/growthRecordUpdateRequest.ts b/reading-platform-frontend/src/api/generated/model/growthRecordUpdateRequest.ts index 55c858e..6937d58 100644 --- a/reading-platform-frontend/src/api/generated/model/growthRecordUpdateRequest.ts +++ b/reading-platform-frontend/src/api/generated/model/growthRecordUpdateRequest.ts @@ -16,8 +16,8 @@ export interface GrowthRecordUpdateRequest { title?: string; /** 内容 */ content?: string; - /** 图片(JSON 数组) */ - images?: string; + /** 图片 URL 列表 */ + images?: string[]; /** 记录日期 */ recordDate?: string; /** 标签 */ diff --git a/reading-platform-java/src/main/java/com/reading/platform/common/enums/ErrorCode.java b/reading-platform-java/src/main/java/com/reading/platform/common/enums/ErrorCode.java index 1a5585e..e7d9ecd 100644 --- a/reading-platform-java/src/main/java/com/reading/platform/common/enums/ErrorCode.java +++ b/reading-platform-java/src/main/java/com/reading/platform/common/enums/ErrorCode.java @@ -37,6 +37,7 @@ public enum ErrorCode { // Package Errors (3100+) PACKAGE_NOT_FOUND(3101, "Package not found"), + REMOVE_PACKAGE_HAS_SCHEDULES(3102, "该套餐下有排课计划"), // User Errors (4000+) USER_NOT_FOUND(4001, "User not found"), diff --git a/reading-platform-java/src/main/java/com/reading/platform/common/exception/BusinessException.java b/reading-platform-java/src/main/java/com/reading/platform/common/exception/BusinessException.java index ece1b07..74f5f4f 100644 --- a/reading-platform-java/src/main/java/com/reading/platform/common/exception/BusinessException.java +++ b/reading-platform-java/src/main/java/com/reading/platform/common/exception/BusinessException.java @@ -11,29 +11,41 @@ public class BusinessException extends RuntimeException { private final Integer code; private final String message; + private final Object data; public BusinessException(String message) { super(message); this.code = 500; this.message = message; + this.data = null; } public BusinessException(Integer code, String message) { super(message); this.code = code; this.message = message; + this.data = null; } public BusinessException(ErrorCode errorCode) { super(errorCode.getMessage()); this.code = errorCode.getCode(); this.message = errorCode.getMessage(); + this.data = null; } public BusinessException(ErrorCode errorCode, String message) { super(message); this.code = errorCode.getCode(); this.message = message; + this.data = null; + } + + public BusinessException(ErrorCode errorCode, String message, Object data) { + super(message); + this.code = errorCode.getCode(); + this.message = message; + this.data = data; } public static BusinessException of(String message) { diff --git a/reading-platform-java/src/main/java/com/reading/platform/common/exception/GlobalExceptionHandler.java b/reading-platform-java/src/main/java/com/reading/platform/common/exception/GlobalExceptionHandler.java index cd0508e..930a13e 100644 --- a/reading-platform-java/src/main/java/com/reading/platform/common/exception/GlobalExceptionHandler.java +++ b/reading-platform-java/src/main/java/com/reading/platform/common/exception/GlobalExceptionHandler.java @@ -33,9 +33,9 @@ public class GlobalExceptionHandler { private String activeProfile; @ExceptionHandler(BusinessException.class) - public Result handleBusinessException(BusinessException e, HttpServletRequest request) { + public Result handleBusinessException(BusinessException e, HttpServletRequest request) { log.warn("业务异常 at {}: {}", request.getRequestURI(), e.getMessage()); - return Result.error(e.getCode(), e.getMessage()); + return Result.error(e.getCode(), e.getMessage(), e.getData()); } @ExceptionHandler(MethodArgumentNotValidException.class) diff --git a/reading-platform-java/src/main/java/com/reading/platform/common/response/Result.java b/reading-platform-java/src/main/java/com/reading/platform/common/response/Result.java index c82c436..ce8926c 100644 --- a/reading-platform-java/src/main/java/com/reading/platform/common/response/Result.java +++ b/reading-platform-java/src/main/java/com/reading/platform/common/response/Result.java @@ -84,6 +84,17 @@ public class Result implements Serializable { return result; } + /** + * 错误响应(带错误码、消息和附加数据) + */ + public static Result error(Integer code, String message, T data) { + Result result = new Result<>(); + result.setCode(code); + result.setMessage(message); + result.setData(data); + return result; + } + /** * 错误响应(默认 500) */ diff --git a/reading-platform-java/src/main/java/com/reading/platform/dto/request/GrowthRecordCreateRequest.java b/reading-platform-java/src/main/java/com/reading/platform/dto/request/GrowthRecordCreateRequest.java index f7d83bb..f207856 100644 --- a/reading-platform-java/src/main/java/com/reading/platform/dto/request/GrowthRecordCreateRequest.java +++ b/reading-platform-java/src/main/java/com/reading/platform/dto/request/GrowthRecordCreateRequest.java @@ -29,13 +29,13 @@ public class GrowthRecordCreateRequest { @Schema(description = "内容") private String content; - @Schema(description = "图片 URL 列表") + @Schema(description = "图片 URL 列表", type = "array", implementation = String.class) private List images; @Schema(description = "记录日期") private LocalDate recordDate; - @Schema(description = "标签") + @Schema(description = "标签", type = "array", implementation = String.class) private List tags; } diff --git a/reading-platform-java/src/main/java/com/reading/platform/dto/request/GrowthRecordUpdateRequest.java b/reading-platform-java/src/main/java/com/reading/platform/dto/request/GrowthRecordUpdateRequest.java index 8a54127..dda3b71 100644 --- a/reading-platform-java/src/main/java/com/reading/platform/dto/request/GrowthRecordUpdateRequest.java +++ b/reading-platform-java/src/main/java/com/reading/platform/dto/request/GrowthRecordUpdateRequest.java @@ -19,13 +19,13 @@ public class GrowthRecordUpdateRequest { @Schema(description = "内容") private String content; - @Schema(description = "图片 URL 列表") + @Schema(description = "图片 URL 列表", type = "array", implementation = String.class) private List images; @Schema(description = "记录日期") private LocalDate recordDate; - @Schema(description = "标签") + @Schema(description = "标签", type = "array", implementation = String.class) private List tags; } diff --git a/reading-platform-java/src/main/java/com/reading/platform/dto/request/TenantUpdateRequest.java b/reading-platform-java/src/main/java/com/reading/platform/dto/request/TenantUpdateRequest.java index 49064b4..b2a79a8 100644 --- a/reading-platform-java/src/main/java/com/reading/platform/dto/request/TenantUpdateRequest.java +++ b/reading-platform-java/src/main/java/com/reading/platform/dto/request/TenantUpdateRequest.java @@ -36,6 +36,9 @@ public class TenantUpdateRequest { @Schema(description = "课程套餐ID(用于三层架构)") private List collectionIds; + @Schema(description = "是否强制移除套餐(即便套餐下有排课计划)") + private Boolean forceRemove; + @Schema(description = "教师配额") private Integer teacherQuota;