From 9ffd2631c3c07e9b53c64b4f9554d55390668b8a Mon Sep 17 00:00:00 2001 From: MingNian <1281442923@qq.com> Date: Tue, 2 Jun 2026 13:01:21 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=90=8E=E7=AB=AF=20J?= =?UTF-8?q?SON=20=E5=8F=8D=E5=BA=8F=E5=88=97=E5=8C=96=E4=B8=8E=E5=BE=AA?= =?UTF-8?q?=E7=8E=AF=E5=BC=95=E7=94=A8=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Program.cs 添加 JsonStringEnumConverter + CamelCase 策略, 修复枚举值和 decimal 反序列化失败 - CreateHealthRecordRequest 改为 class + init 属性, 修复 decimal? 在位置记录中的 JSON 反序列化异常 - 运动计划 /current 端点改用匿名对象投影, 修复 EF Core 导航属性循环引用导致 JSON 无限递归 --- .../Health.WebApi/Endpoints/health_endpoints.cs | 13 ++++++++++--- .../Endpoints/remaining_endpoints.cs | 16 +++++++++++++++- backend/src/Health.WebApi/Program.cs | 8 ++++++++ 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/backend/src/Health.WebApi/Endpoints/health_endpoints.cs b/backend/src/Health.WebApi/Endpoints/health_endpoints.cs index f0ab047..be06330 100644 --- a/backend/src/Health.WebApi/Endpoints/health_endpoints.cs +++ b/backend/src/Health.WebApi/Endpoints/health_endpoints.cs @@ -122,6 +122,13 @@ public static class HealthEndpoints Guid.TryParse(http.User.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier)?.Value, out var id) ? id : Guid.Empty; } -public sealed record CreateHealthRecordRequest( - HealthMetricType Type, int? Systolic, int? Diastolic, decimal? Value, - string? Unit, HealthRecordSource Source, DateTime? RecordedAt); +public sealed class CreateHealthRecordRequest +{ + public HealthMetricType Type { get; init; } + public int? Systolic { get; init; } + public int? Diastolic { get; init; } + public decimal? Value { get; init; } + public string? Unit { get; init; } + public HealthRecordSource Source { get; init; } + public DateTime? RecordedAt { get; init; } +} diff --git a/backend/src/Health.WebApi/Endpoints/remaining_endpoints.cs b/backend/src/Health.WebApi/Endpoints/remaining_endpoints.cs index 68c295c..e235104 100644 --- a/backend/src/Health.WebApi/Endpoints/remaining_endpoints.cs +++ b/backend/src/Health.WebApi/Endpoints/remaining_endpoints.cs @@ -193,7 +193,21 @@ public static class RemainingEndpoints var today = DateOnly.FromDateTime(DateTime.Now); var monday = today.AddDays(-(int)today.DayOfWeek + 1); var plan = await db.ExercisePlans.Include(p => p.Items).FirstOrDefaultAsync(p => p.UserId == userId && p.WeekStartDate == monday); - return Results.Ok(new { code = 0, data = plan, message = (string?)null }); + if (plan == null) return Results.Ok(new { code = 0, data = (object?)null, message = (string?)null }); + return Results.Ok(new + { + code = 0, + data = new + { + plan.Id, plan.WeekStartDate, plan.CreatedAt, plan.UpdatedAt, + items = plan.Items.Select(i => new + { + i.Id, i.DayOfWeek, i.ExerciseType, i.DurationMinutes, + i.IsCompleted, i.CompletedAt, i.IsRestDay + }) + }, + message = (string?)null + }); }); group.MapPost("/", async (CreateExercisePlanRequest req, HttpContext http, AppDbContext db, CancellationToken ct) => diff --git a/backend/src/Health.WebApi/Program.cs b/backend/src/Health.WebApi/Program.cs index c3dc020..1329c34 100644 --- a/backend/src/Health.WebApi/Program.cs +++ b/backend/src/Health.WebApi/Program.cs @@ -27,6 +27,14 @@ if (File.Exists(envPath)) var builder = WebApplication.CreateBuilder(args); +// ---- JSON 配置(枚举字符串、camelCase)---- +builder.Services.ConfigureHttpJsonOptions(options => +{ + options.SerializerOptions.Converters.Add(new System.Text.Json.Serialization.JsonStringEnumConverter()); + options.SerializerOptions.PropertyNamingPolicy = System.Text.Json.JsonNamingPolicy.CamelCase; + options.SerializerOptions.PropertyNameCaseInsensitive = true; +}); + // ---- 数据库 ---- builder.Services.AddDbContext(options => options.UseNpgsql(builder.Configuration.GetConnectionString("Default") ?? builder.Configuration["DB_CONNECTION"] ?? "Host=localhost;Database=health_manager;Username=postgres;Password=postgres"));