在做新增文章的时候要注意几点,不是单纯的添加文章数据就结束了,要指定文章分类,添加文章的标签。添加标签我这里是从标签库中去取得数据,只存标签Id,所以添加标签的时候就可能存在添加了标签库中已有的标签。
新建一个新增和更新文章的通用输出参数模型类,起名:EditPostInput,继承PostDto,然后添加标签Tags字段,返回类型IEnumerable<string>。
//EditPostInput.cs using System.Collections.Generic; namespace Meowv.Blog.Application.Contracts.Blog.Params { public class EditPostInput : PostDto { /// <summary> /// 标签列表 /// </summary> public IEnumerable<string> Tags { get; set; } } }添加新增文章的接口:InsertPostAsync。
/// <summary> /// 新增文章 /// </summary> /// <param></param> /// <returns></returns> Task<ServiceResult> InsertPostAsync(EditPostInput input);然后去实现这个接口,实现之前,配置AutoMapper实体映射。
CreateMap<EditPostInput, Post>().ForMember(x => x.Id, opt => opt.Ignore());将EditPostInput转换为Post,并且忽略Id字段。
/// <summary> /// 新增文章 /// </summary> /// <param></param> /// <returns></returns> public async Task<ServiceResult> InsertPostAsync(EditPostInput input) { var result = new ServiceResult(); var post = ObjectMapper.Map<EditPostInput, Post>(input); post.Url = $"{post.CreationTime.ToString(" yyyy MM dd ").Replace(" ", "http://www.likecs.com/")}{post.Url}/"; await _postRepository.InsertAsync(post); var tags = await _tagRepository.GetListAsync(); var newTags = input.Tags .Where(item => !tags.Any(x => x.TagName.Equals(item))) .Select(item => new Tag { TagName = item, DisplayName = item }); await _tagRepository.BulkInsertAsync(newTags); var postTags = input.Tags.Select(item => new PostTag { PostId = post.Id, TagId = _tagRepository.FirstOrDefault(x => x.TagName == item).Id }); await _postTagRepository.BulkInsertAsync(postTags); result.IsSuccess(ResponseText.INSERT_SUCCESS); return result; }URL字段,根据创建时间按照yyyy/MM/dd/name/格式拼接。
然后找出是否有新标签,有的话批量添加至标签表。
再根据input.Tags构建PostTag列表,也进行批量保存,这样才算是新增好一篇文章,最后输出ResponseText.INSERT_SUCCESS常量,提示成功。
在BlogController.Admin.cs添加API。
/// <summary> /// 新增文章 /// </summary> /// <param></param> /// <returns></returns> [HttpPost] [Authorize] [Route("post")] [ApiExplorerSettings(GroupName = Grouping.GroupName_v2)] public async Task<ServiceResult> InsertPostAsync([FromBody] EditPostInput input) { return await _blogService.InsertPostAsync(input); } 更新文章更新操作和新增操作输入参数一样,只新增一个Id用来标识更新那篇文章,添加UpdatePostAsync更新文章接口。
/// <summary> /// 更新文章 /// </summary> /// <param></param> /// <param></param> /// <returns></returns> Task<ServiceResult> UpdatePostAsync(int id, EditPostInput input);同样的实现这个接口。
/// <summary> /// 更新文章 /// </summary> /// <param></param> /// <param></param> /// <returns></returns> public async Task<ServiceResult> UpdatePostAsync(int id, EditPostInput input) { var result = new ServiceResult(); var post = await _postRepository.GetAsync(id); post.Title = input.Title; post.Author = input.Author; post.Url = $"{input.CreationTime.ToString(" yyyy MM dd ").Replace(" ", "http://www.likecs.com/")}{input.Url}/"; post.Html = input.Html; post.Markdown = input.Markdown; post.CreationTime = input.CreationTime; post.CategoryId = input.CategoryId; await _postRepository.UpdateAsync(post); var tags = await _tagRepository.GetListAsync(); var oldPostTags = from post_tags in await _postTagRepository.GetListAsync() join tag in await _tagRepository.GetListAsync() on post_tags.TagId equals tag.Id where post_tags.PostId.Equals(post.Id) select new { post_tags.Id, tag.TagName }; var removedIds = oldPostTags.Where(item => !input.Tags.Any(x => x == item.TagName) && tags.Any(t => t.TagName == item.TagName)) .Select(item => item.Id); await _postTagRepository.DeleteAsync(x => removedIds.Contains(x.Id)); var newTags = input.Tags .Where(item => !tags.Any(x => x.TagName == item)) .Select(item => new Tag { TagName = item, DisplayName = item }); await _tagRepository.BulkInsertAsync(newTags); var postTags = input.Tags .Where(item => !oldPostTags.Any(x => x.TagName == item)) .Select(item => new PostTag { PostId = id, TagId = _tagRepository.FirstOrDefault(x => x.TagName == item).Id }); await _postTagRepository.BulkInsertAsync(postTags); result.IsSuccess(ResponseText.UPDATE_SUCCESS); return result; }ResponseText.UPDATE_SUCCESS是常量更新成功。
先根据Id查询到数据库中的这篇文章数据,然后根据input参数,修改需要修改的数据,最后保存。
注意的是,如果修改的时候修改了标签,有可能新增也有可能删除,也许会又有新增又有删除。