using System.ComponentModel.DataAnnotations;
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 VmPublishComment : IHaveCustomMapping
{
    /// <summary>
    /// 评论类型
    /// </summary>
    [Required(ErrorMessage = "comment node is empty.")]
    public required CommentNode Node { get; set; }

    /// <summary>
    /// 关联
    /// </summary>
    [
        Required(ErrorMessage = "relation is empty."),
        MaxLength(500, ErrorMessage = "relation max length 20.")
    ]
    public required string Relation { get; set; }

    /// <summary>
    /// 昵称
    /// </summary>
    [Required(ErrorMessage = "昵称不能为空"), MaxLength(200, ErrorMessage = "昵称最大长度为200")]
    public required string NickName { get; set; }

    /// <summary>
    /// 邮箱地址
    /// </summary>
    [
        Required(ErrorMessage = "请填写邮箱地址"),
        EmailAddress(ErrorMessage = "请填写正确的邮箱地址"),
        MaxLength(200, ErrorMessage = "邮箱地址最大长度为200")
    ]
    public required string Email { get; set; }

    /// <summary>
    /// 回复内容
    /// </summary>
    [
        Required(ErrorMessage = "请输入回复内容"),
        MaxLength(5000, ErrorMessage = "回复内容最大长度为5000")
    ]
    public required string CommentText { get; set; }

    /// <summary>
    /// 个人网站
    /// </summary>
    [
        Url(ErrorMessage = "请填写正确的个人网站地址"),
        MaxLength(200, ErrorMessage = "个人网站最大长度为200")
    ]
    public string? Site { get; set; }

    /// <summary>
    /// 回复ID
    /// </summary>
    [MaxLength(50, ErrorMessage = "reply id max length 15")]
    public string? ReplyId { get; set; }

    /// <summary>
    /// 发送时间
    /// </summary>
    public DateTime SendTime => DateTime.Now;

    /// <summary>
    /// Executes CreateMappings.
    /// </summary>
    public static void CreateMappings(TypeAdapterConfig cfg)
    {
        cfg.NewConfig<VmPublishComment, Comment>().MapWith(x => CreateCommentEntity(x));
    }

    private static Comment CreateCommentEntity(VmPublishComment viewModel)
    {
        var entity = new Comment
        {
            Node = viewModel.Node,
            Relation = viewModel.Relation,
            CommentText = viewModel.CommentText,
            Commenter = new GuestCommenter
            {
                Email = viewModel.Email,
                NickName = viewModel.NickName,
                Site = viewModel.Site,
            },
        };
        return entity;
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

这是一个用于发布评论功能的视图模型(ViewModel)类,主要用于接收和验证前端传递的评论数据。让我详细解释一下这个代码:

类的基本信息

public class VmPublishComment : IHaveCustomMapping
  • VmPublishComment: 发布评论的视图模型类
  • IHaveCustomMapping: 实现了自定义映射接口,用于配置对象映射规则

属性说明

1. 必填属性(带验证)

[Required(ErrorMessage = "comment node is empty.")]
public required CommentNode Node { get; set; }
  • Node: 评论类型/节点,是一个枚举类型
  • 使用 Required 特性确保必填
[Required, MaxLength(500)]
public required string Relation { get; set; }
  • Relation: 关联信息(可能是文章ID、产品ID等)
  • 最大长度500字符
[Required, MaxLength(200)]
public required string NickName { get; set; }
  • NickName: 评论者昵称
  • 最大长度200字符
[Required, EmailAddress, MaxLength(200)]
public required string Email { get; set; }
  • Email: 邮箱地址
  • 包含邮箱格式验证
[Required, MaxLength(5000)]
public required string CommentText { get; set; }
  • CommentText: 评论内容
  • 最大长度5000字符

2. 可选属性

[Url, MaxLength(200)]
public string? Site { get; set; }
  • Site: 个人网站地址(可选)
  • 包含URL格式验证
[MaxLength(50)]
public string? ReplyId { get; set; }
  • ReplyId: 回复的评论ID(用于嵌套回复)

3. 自动生成属性

public DateTime SendTime => DateTime.Now;
  • SendTime: 发送时间,自动获取当前时间

对象映射配置

public static void CreateMappings(TypeAdapterConfig cfg)
{
    cfg.NewConfig<VmPublishComment, Comment>().MapWith(x => CreateCommentEntity(x));
}

这个方法配置了如何将 VmPublishComment 映射到 Comment 实体类。

private static Comment CreateCommentEntity(VmPublishComment viewModel)
{
    var entity = new Comment
    {
        Node = viewModel.Node,
        Relation = viewModel.Relation,
        CommentText = viewModel.CommentText,
        Commenter = new GuestCommenter  // 创建游客评论者对象
        {
            Email = viewModel.Email,
            NickName = viewModel.NickName,
            Site = viewModel.Site,
        },
    };
    return entity;
}

主要特点

  1. 数据验证: 使用 DataAnnotations 进行前端数据验证
  2. 类型安全: 使用 required 关键字确保关键属性不为空
  3. 对象映射: 通过 Mapster 库实现 ViewModel 到 Entity 的转换
  4. 结构清晰: 将评论者信息封装在 GuestCommenter 对象中

这个类主要用于接收用户提交的评论数据,验证数据有效性,并转换为业务实体对象进行后续处理。

评论加载中...