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;
}
主要特点
- 数据验证: 使用 DataAnnotations 进行前端数据验证
- 类型安全: 使用
required关键字确保关键属性不为空 - 对象映射: 通过 Mapster 库实现 ViewModel 到 Entity 的转换
- 结构清晰: 将评论者信息封装在
GuestCommenter对象中
这个类主要用于接收用户提交的评论数据,验证数据有效性,并转换为业务实体对象进行后续处理。
AI 正在分析代码…
评论加载中...