feat: 实现v1.2.0云同步与实体重构核心功能

1.  重构用户与任务实体:UserEntity实现IUser<Guid>,TaskEntity继承ABP风格FullAuditedEntityWithUser,主键从int改为Guid
2.  新增云同步代理系统:嵌入式WebServer支持CloudSyncProxy转发云同步请求,新增配置API与持久化
3.  完善前端适配:新增Guid工具函数,更新任务类型定义与API交互逻辑,调整云同步设置弹窗适配本地代理
4.  文档与配置优化:更新文档结构,新增部署文档、版本记录,统一各项目配置项
5.  补充测试与迁移:新增单元测试,更新EF Core数据库迁移快照
This commit is contained in:
ShaoHua
2026-06-14 04:51:22 +08:00
parent d81aa06681
commit 14868c45c7
51 changed files with 4368 additions and 449 deletions
@@ -1,46 +1,140 @@
using System.Text.Json.Serialization;
using Hua.Todo.Core.Entities;
namespace Hua.Todo.Application.CloudSync.Models;
/// <summary>
/// 云同步任务条目。
/// 云同步任务条目ABP 标准)
/// </summary>
public class CloudTaskItem
{
/// <summary>
/// 任务 ID(服务端分配)。
/// 任务 ID(服务端分配Guid)。
/// </summary>
public int Id { get; set; }
[JsonPropertyName("id")]
public Guid Id { get; set; }
/// <summary>
/// 标题。
/// </summary>
[JsonPropertyName("title")]
public string Title { get; set; } = string.Empty;
/// <summary>
/// 优先级。
/// </summary>
[JsonPropertyName("priority")]
public TaskPriority Priority { get; set; }
/// <summary>
/// 是否完成。
/// </summary>
[JsonPropertyName("isCompleted")]
public bool IsCompleted { get; set; }
/// <summary>
/// 创建时间(UTC)。
/// 任务编号(用户级自增字符串)。
/// </summary>
public DateTime CreatedAtUtc { get; set; }
[JsonPropertyName("code")]
public string Code { get; set; } = string.Empty;
/// <summary>
/// 更新时间(UTC)。
/// 父任务 IDGuid)。
/// </summary>
public DateTime UpdatedAtUtc { get; set; }
[JsonPropertyName("parentTaskId")]
public Guid? ParentTaskId { get; set; }
// === ABP 审计字段 ===
/// <summary>
/// 父任务 ID(v1.2.0 同步可先不使用)
/// 创建时间
/// </summary>
public int? ParentTaskId { get; set; }
[JsonPropertyName("creationTime")]
public DateTime CreationTime { get; set; }
/// <summary>
/// 创建人 ID。
/// </summary>
[JsonPropertyName("creatorId")]
public Guid? CreatorId { get; set; }
/// <summary>
/// 最后修改时间(用于 LWW 冲突判断)。
/// </summary>
[JsonPropertyName("lastModificationTime")]
public DateTime? LastModificationTime { get; set; }
/// <summary>
/// 最后修改人 ID。
/// </summary>
[JsonPropertyName("lastModifierId")]
public Guid? LastModifierId { get; set; }
/// <summary>
/// 软删除标记。
/// </summary>
[JsonPropertyName("isDeleted")]
public bool IsDeleted { get; set; }
/// <summary>
/// 删除时间。
/// </summary>
[JsonPropertyName("deletionTime")]
public DateTime? DeletionTime { get; set; }
/// <summary>
/// 删除人 ID。
/// </summary>
[JsonPropertyName("deleterId")]
public Guid? DeleterId { get; set; }
}
/// <summary>
/// 任务 Upsert DTO(客户端提交)。
/// </summary>
public class CloudTaskUpsert
{
/// <summary>
/// 任务 ID;为 null 表示新建。
/// </summary>
[JsonPropertyName("id")]
public Guid? Id { get; set; }
/// <summary>
/// 标题。
/// </summary>
[JsonPropertyName("title")]
public string Title { get; set; } = string.Empty;
/// <summary>
/// 优先级。
/// </summary>
[JsonPropertyName("priority")]
public TaskPriority Priority { get; set; } = TaskPriority.Medium;
/// <summary>
/// 是否完成。
/// </summary>
[JsonPropertyName("isCompleted")]
public bool IsCompleted { get; set; }
/// <summary>
/// 任务编号。
/// </summary>
[JsonPropertyName("code")]
public string Code { get; set; } = string.Empty;
/// <summary>
/// 父任务 ID(可选)。
/// </summary>
[JsonPropertyName("parentTaskId")]
public Guid? ParentTaskId { get; set; }
/// <summary>
/// 客户端发起变更时写入的时间戳(UTC),用于 LWW 冲突判断。
/// </summary>
[JsonPropertyName("lastModificationTime")]
public DateTime? LastModificationTime { get; set; }
}
/// <summary>
@@ -51,43 +145,14 @@ public class SyncRequest
/// <summary>
/// 新增或更新的任务列表。
/// </summary>
[JsonPropertyName("upserts")]
public List<CloudTaskUpsert> Upserts { get; set; } = new();
/// <summary>
/// 需要删除的任务 ID 列表。
/// 需要逻辑删除的任务 ID 列表。
/// </summary>
public List<int> Deletes { get; set; } = new();
}
/// <summary>
/// 任务 Upsert DTO。
/// </summary>
public class CloudTaskUpsert
{
/// <summary>
/// 任务 ID;为空表示新建。
/// </summary>
public int? Id { get; set; }
/// <summary>
/// 标题。
/// </summary>
public string Title { get; set; } = string.Empty;
/// <summary>
/// 优先级。
/// </summary>
public TaskPriority Priority { get; set; } = TaskPriority.Medium;
/// <summary>
/// 是否完成。
/// </summary>
public bool IsCompleted { get; set; }
/// <summary>
/// 父任务 ID(可选)。
/// </summary>
public int? ParentTaskId { get; set; }
[JsonPropertyName("deletes")]
public List<Guid> Deletes { get; set; } = new();
}
/// <summary>
@@ -98,11 +163,12 @@ public class SyncResponse
/// <summary>
/// 服务端时间(UTC)。
/// </summary>
[JsonPropertyName("serverTimeUtc")]
public DateTime ServerTimeUtc { get; set; }
/// <summary>
/// 当前用户的任务全量。
/// 当前用户的任务全量(含 Tombstone
/// </summary>
[JsonPropertyName("tasks")]
public List<CloudTaskItem> Tasks { get; set; } = new();
}
}