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:
@@ -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)。
|
||||
/// 父任务 ID(Guid)。
|
||||
/// </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();
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user