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. 属性定义

  • 基础信息IdNode(评论类型)、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;
}
  • 标记为会员评论
  • 使用会员的身份标识和头像

设计亮点

  1. 多态处理:通过类型判断处理不同类型的评论者(游客/会员)
  2. 数据安全:对已删除评论进行特殊处理,隐藏原始内容
  3. 时区处理PublishTime.ToLocalTime() 转换为本地时间
  4. 类型转换:将ID和回复列表转换为字符串格式
  5. 隐私保护:使用邮箱MD5而非明文邮箱

这个类很好地展现了如何在保护用户隐私的同时,为不同类型的用户提供差异化的显示效果。

评论加载中...