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;