using Dpz.Core.Entity.Base.MapperConfig;
using Dpz.Core.EnumLibrary;
using Dpz.Core.Public.Entity;
using Mapster;
namespace Dpz.Core.Public.ViewModel;
/// <summary>
/// 评论 平铺
/// </summary>
public class VmCommentFlat : IHaveCustomMapping
{
/// <summary>
/// Gets or sets Id.
/// </summary>
public required string Id { get; set; }
/// <summary>
/// 评论类型
/// </summary>
public CommentNode Node { get; set; }
/// <summary>
/// 关联
/// </summary>
public required string Relation { get; set; }
/// <summary>
/// 回复时间
/// </summary>
public DateTime PublishTime { get; set; }
/// <summary>
/// 回复内容
/// </summary>
public string? CommentText { get; set; }
/// <summary>
/// 回复ID
/// </summary>
public List<string> Replies { get; set; } = [];
/// <summary>
/// 昵称
/// </summary>
public string? NickName { get; set; }
/// <summary>
/// 头像
/// </summary>
public string? Avatar { get; set; }
/// <summary>
/// 身份标识
/// </summary>
public string? Identity { get; set; }
/// <summary>
/// 邮箱MD5
/// </summary>
public string? EmailMd5 { get; set; }
/// <summary>
/// 网站
/// </summary>
public string? Site { get; set; }
/// <summary>
/// 是否匿名评论
/// </summary>
public bool IsGuest { get; set; }
/// <summary>
/// 是否删除
/// </summary>
public bool IsDelete { get; set; }
/// <summary>
/// Executes CreateMappings.
/// </summary>
public static void CreateMappings(TypeAdapterConfig cfg)
{
cfg.NewConfig<Comment, VmCommentFlat>().MapWith(x => CreateVmCommentFlat(x));
}
private static VmCommentFlat CreateVmCommentFlat(Comment entity)
{
var viewModel = new VmCommentFlat
{
Id = entity.Id.ToString(),
Node = entity.Node,
Relation = entity.Relation,
PublishTime = entity.PublishTime.ToLocalTime(),
CommentText = entity.CommentText,
Replies = entity.Replies.Select(x => x.ToString()).ToList(),
NickName = entity.Commenter.NickName,
IsDelete = entity.IsDelete,
};
if (entity.IsDelete)
{
viewModel.IsGuest = true;
viewModel.NickName = entity.Commenter.NickName;
viewModel.CommentText = "该用户发言因某些原因已被删除";
viewModel.EmailMd5 = viewModel.Id.GenerateHashMd5();
}
else if (entity.Commenter is GuestCommenter guestCommenter)
{
viewModel.IsGuest = true;
viewModel.EmailMd5 = guestCommenter.Email.GenerateHashMd5();
viewModel.Site = guestCommenter.Site;
}
else if (entity.Commenter is MembleCommenter membleCommenter)
{
viewModel.IsGuest = false;
viewModel.Identity = membleCommenter.Identity;
viewModel.Avatar = membleCommenter.Avatar;
}
return viewModel;
}
}
⚠⚠ 以下内容为AI分析的结果,请根据实际情况进行判断。
这是一个用于评论系统的视图模型类,实现了平铺显示评论的功能。让我详细解释一下这个代码:
类的用途
VmCommentFlat 是一个评论的平铺视图模型,用于将评论数据转换为前端显示所需的格式。
主要特性
1. 属性定义
- 基础信息:
Id、Node(评论类型)、Relation(关联对象) - 评论内容:
PublishTime(发布时间)、CommentText(评论内容)、Replies(回复列表) - 用户信息:
NickName(昵称)、Avatar(头像)、Identity(身份标识) - 扩展信息:
EmailMd5(邮箱MD5值)、Site(网站) - 状态标识:
IsGuest(是否匿名)、IsDelete(是否已删除)
2. 映射配置
实现了 IHaveCustomMapping 接口,提供自定义的对象映射逻辑:
public static void CreateMappings(TypeAdapterConfig cfg)
{
cfg.NewConfig<Comment, VmCommentFlat>().MapWith(x => CreateVmCommentFlat(x));
}
3. 核心转换逻辑
CreateVmCommentFlat 方法处理了三种不同的评论状态:
已删除评论处理
if (entity.IsDelete)
{
viewModel.IsGuest = true;
viewModel.NickName = entity.Commenter.NickName;
viewModel.CommentText = "该用户发言因某些原因已被删除";
viewModel.EmailMd5 = viewModel.Id.GenerateHashMd5();
}
- 显示统一的删除提示信息
- 使用ID生成MD5作为头像标识
游客评论处理
else if (entity.Commenter is GuestCommenter guestCommenter)
{
viewModel.IsGuest = true;
viewModel.EmailMd5 = guestCommenter.Email.GenerateHashMd5();
viewModel.Site = guestCommenter.Site;
}
- 标记为游客评论
- 使用邮箱MD5生成头像(通常用于Gravatar)
- 保存用户网站信息
会员评论处理
else if (entity.Commenter is MembleCommenter membleCommenter)
{
viewModel.IsGuest = false;
viewModel.Identity = membleCommenter.Identity;
viewModel.Avatar = membleCommenter.Avatar;
}
- 标记为会员评论
- 使用会员的身份标识和头像
设计亮点
- 多态处理:通过类型判断处理不同类型的评论者(游客/会员)
- 数据安全:对已删除评论进行特殊处理,隐藏原始内容
- 时区处理:
PublishTime.ToLocalTime()转换为本地时间 - 类型转换:将ID和回复列表转换为字符串格式
- 隐私保护:使用邮箱MD5而非明文邮箱
这个类很好地展现了如何在保护用户隐私的同时,为不同类型的用户提供差异化的显示效果。
评论加载中...