基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(一) (2)

模型为一个年份和一个文章列表,文章列表模型:PostBriefDto.cs。

//PostBriefDto.cs namespace Meowv.Blog.Application.Contracts.Blog { public class PostBriefDto { /// <summary> /// 标题 /// </summary> public string Title { get; set; } /// <summary> /// 链接 /// </summary> public string Url { get; set; } /// <summary> /// 年份 /// </summary> public int Year { get; set; } /// <summary> /// 创建时间 /// </summary> public string CreationTime { get; set; } } }

搞定,因为返回时间为英文格式,所以CreationTime 给了字符串类型。

在IBlogService.Post.cs中添加接口分页查询文章列表QueryPostsAsync,肯定需要接受俩参数分页页码和分页数量。还是去添加一个公共模型PagingInput吧,在.Application.Contracts下面。

//PagingInput.cs using System.ComponentModel.DataAnnotations; namespace Meowv.Blog.Application.Contracts { /// <summary> /// 分页输入参数 /// </summary> public class PagingInput { /// <summary> /// 页码 /// </summary> [Range(1, int.MaxValue)] public int Page { get; set; } = 1; /// <summary> /// 限制条数 /// </summary> [Range(10, 30)] public int Limit { get; set; } = 10; } }

Page设置默认值为1,Limit设置默认值为10,Range Attribute设置参数可输入大小限制,于是这个分页查询文章列表的接口就是这个样子的。

//IBlogService.Post.cs public partial interface IBlogService { /// <summary> /// 分页查询文章列表 /// </summary> /// <param></param> /// <returns></returns> Task<ServiceResult<PagedList<QueryPostDto>>> QueryPostsAsync(PagingInput input); }

ServiceResult和PagedList是之前添加的统一返回模型,紧接着就去添加一个分页查询文章列表缓存接口,和上面是对应的。

//IBlogCacheService.Post.cs using Meowv.Blog.Application.Contracts; using Meowv.Blog.Application.Contracts.Blog; using Meowv.Blog.ToolKits.Base; using System; using System.Threading.Tasks; namespace Meowv.Blog.Application.Caching.Blog { public partial interface IBlogCacheService { /// <summary> /// 分页查询文章列表 /// </summary> /// <param></param> /// <param></param> /// <returns></returns> Task<ServiceResult<PagedList<QueryPostDto>>> QueryPostsAsync(PagingInput input, Func<Task<ServiceResult<PagedList<QueryPostDto>>>> factory); } }

分别实现这两个接口。

//BlogCacheService.Post.cs public partial class BlogCacheService { private const string KEY_QueryPosts = "Blog:Post:QueryPosts-{0}-{1}"; /// <summary> /// 分页查询文章列表 /// </summary> /// <param></param> /// <param></param> /// <returns></returns> public async Task<ServiceResult<PagedList<QueryPostDto>>> QueryPostsAsync(PagingInput input, Func<Task<ServiceResult<PagedList<QueryPostDto>>>> factory) { return await Cache.GetOrAddAsync(KEY_QueryPosts.FormatWith(input.Page, input.Limit), factory, CacheStrategy.ONE_DAY); } } //BlogService.Post.cs /// <summary> /// 分页查询文章列表 /// </summary> /// <param></param> /// <returns></returns> public async Task<ServiceResult<PagedList<QueryPostDto>>> QueryPostsAsync(PagingInput input) { return await _blogCacheService.QueryPostsAsync(input, async () => { var result = new ServiceResult<PagedList<QueryPostDto>>(); var count = await _postRepository.GetCountAsync(); var list = _postRepository.OrderByDescending(x => x.CreationTime) .PageByIndex(input.Page, input.Limit) .Select(x => new PostBriefDto { Title = x.Title, Url = x.Url, Year = x.CreationTime.Year, CreationTime = x.CreationTime.TryToDateTime() }).GroupBy(x => x.Year) .Select(x => new QueryPostDto { Year = x.Key, Posts = x.ToList() }).ToList(); result.IsSuccess(new PagedList<QueryPostDto>(count.TryToInt(), list)); return result; }); }

PageByIndex(...)、TryToDateTime()是.ToolKits层添加的扩展方法,先查询总数,然后根据时间倒序,分页,筛选出所需字段,根据年份分组,输出,结束。

在BlogController中添加API。

/// <summary> /// 分页查询文章列表 /// </summary> /// <param></param> /// <returns></returns> [HttpGet] [Route("posts")] public async Task<ServiceResult<PagedList<QueryPostDto>>> QueryPostsAsync([FromQuery] PagingInput input) { return await _blogService.QueryPostsAsync(input); }

[FromQuery]设置input为从URL进行查询参数,编译运行看效果。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wssjjs.html