namespace Yes.Domain.Articles { [Table("Article")] public class ArticleEntity { [Key] public int Id { get; private set; } /// /// 作者ID /// [ForeignKey(nameof(Author))] public int UserId { get; private set; } public UserEntity? Author { get; private set; } /// /// 分类ID /// [ForeignKey(nameof(Category))] public int CategoryId { get; private set; } public CategoryEntity? Category { get; private set; } /// /// 标题 /// public string Title { get; private set; } = string.Empty; public string Slug { get; private set; } = string.Empty; /// /// 内容 /// public string Content { get; private set; } = string.Empty; /// /// 封面图 /// public string CoverUrl { get; private set; } = string.Empty; /// /// 摘要 /// public string Summary { get; private set; } = string.Empty; /// /// 标签 /// public string Tag { get; private set; } = string.Empty; /// /// 创建时间 /// public DateTime CreateDate { get; private set; } /// /// 删除时间 /// public DateTime DeleteDate { get; private set; } /// /// 发布时间 /// public DateTime PublishDate { get; private set; } /// /// 修改时间 /// public DateTime ModifyDate { get; private set; } /// /// 是否允许评论 /// public bool CanComment { get; private set; } /// /// 评论数 /// public int CommentCount { get; private set; } /// /// 密码,不为空时需要输入密码才可查看 /// public string Password { get; private set; } = string.Empty; /// /// 排序值 /// public int Sort { get; private set; } /// /// 文章类型 /// public ArticleTypeEnum Type { get; private set; } /// /// 文章状态 /// public ArticleStatusEnum Status { get; private set; } /// /// 阅读数 /// public int ReadCount { get; private set; } public static ArticleEntity CreatePage(string title, string content, string summary, string slug, string coverUrl,int sort, ValueObject authorObject) { var author = authorObject.Value; var authorId = authorObject.Id; var page = new ArticleEntity() { Author = author ?? throw new UserNotExistsException(authorId), UserId = authorId, Content = content ?? "", Status = ArticleStatusEnum.Normal, Summary = summary ?? "", Title = title ?? "", CategoryId = 0, Tag = "", CoverUrl = coverUrl ?? "", Slug = slug ?? "", Type = ArticleTypeEnum.Page, CanComment = true, CommentCount = 0, ReadCount = 0, Sort = sort, Password = "", CreateDate = DateTime.Now, PublishDate = DateTime.Now, ModifyDate= DateTime.Now }; page.CheckSummary(); return page; } public static ArticleEntity CreateDraft(string title, string content, string summary, List tags, string slug, string coverUrl, ValueObject authorObject, ValueObject categoryObject) { var category = categoryObject.Value; var categoryId = categoryObject.Id; var author = authorObject.Value; var authorId = authorObject.Id; return new ArticleEntity() { Author = author ?? throw new UserNotExistsException(authorId), UserId = authorId, Content = content ?? "", Status = ArticleStatusEnum.Draft, Summary = summary ?? "", Title = title ?? "", Category = category, CategoryId = categoryId, Tag = string.Join(",", tags.Distinct()), CoverUrl = coverUrl ?? "", Slug = slug ?? "", Type = ArticleTypeEnum.Article, CanComment = true, CommentCount = 0, ReadCount = 0, Sort = 0, Password = "", CreateDate = DateTime.Now, ModifyDate = DateTime.Now }; } public static ArticleEntity CreateArticle(string title, string content, string summary, List tags, string slug, string coverUrl, ValueObject authorObject, ValueObject categoryObject) { var article = CreateDraft(title, content, summary, tags, slug, coverUrl, authorObject, categoryObject); article.CheckCategory(); article.Publish(); article.CheckSummary(); return article; } public void UpdateDraft(string title, string content, string summary, List tags, string slug, string coverUrl, ValueObject authorObject, ValueObject categoryObject) { Update(title, content, summary, tags, slug, coverUrl, authorObject, categoryObject); Draft(); } public void UpdateArticle(string title, string content, string summary, List tags, string slug, string coverUrl, ValueObject authorObject, ValueObject categoryObject) { Update(title, content, summary, tags, slug, coverUrl, authorObject, categoryObject); CheckCategory(); Publish(); CheckSummary(); } public void UpdatePage(string title, string content, string summary, string slug, string coverUrl,int sort, ValueObject authorObject) { var author = authorObject.Value; var authorId = authorObject.Id; Title = title ?? ""; Content = content ?? ""; Summary = summary ?? ""; Tag = ""; Slug = slug ?? ""; CoverUrl = coverUrl ?? ""; Author = author ?? throw new UserNotExistsException(authorId); UserId = authorId; CategoryId = 0; Sort = sort; CheckSummary(); } public bool IsPage() { return Type == ArticleTypeEnum.Page; } public bool IsArticle() { return Type == ArticleTypeEnum.Article; } public bool IsSlugEmpty() { return string.IsNullOrEmpty(Slug); } public bool IsSlugDifferent(string slug) { return !string.Equals(Slug, slug); } public void UpdateSlug(string slug) { if (string.IsNullOrEmpty(Slug)) { Slug = slug; } } public void Delete() { Status = ArticleStatusEnum.Deleted; DeleteDate = DateTime.Now; } private void Update(string title, string content, string summary, List tags, string slug, string coverUrl, ValueObject authorObject, ValueObject categoryObject) { var category = categoryObject.Value; var categoryId = categoryObject.Id; var author = authorObject.Value; var authorId = authorObject.Id; Title = title ?? ""; Content = content ?? ""; Summary = summary ?? ""; Tag = string.Join(",", tags.Distinct()); Slug = slug ?? ""; CoverUrl = coverUrl ?? ""; Author = author ?? throw new UserNotExistsException(authorId); UserId = authorId; Category = category; CategoryId = categoryId; } private void CheckCategory() { if (Category == null) { throw new CategoryNotExistsException(); } } private void Publish() { Status = ArticleStatusEnum.Normal; PublishDate = DateTime.Now; } private void Draft() { Status = ArticleStatusEnum.Draft; PublishDate = DateTime.Now; } private void CheckSummary() { if (Status == ArticleStatusEnum.Normal && string.IsNullOrEmpty(Summary)) { Summary = Content.ToSummary(); } } } }