private IEnumerable <LinkResource> CreateLinks(ArticleParameters request, bool hasPrevious, bool hasNext) { var links = new List <LinkResource> { new LinkResource( CreateUri(request, PaginationUriType.CurrentPage), "self", "GET") }; if (hasPrevious) { links.Add( new LinkResource( CreateUri(request, PaginationUriType.PreviousPage), "previous_page", "GET")); } if (hasNext) { links.Add( new LinkResource( CreateUri(request, PaginationUriType.NextPage), "next_page", "GET")); } return(links); }
private string CreateUri(ArticleParameters parameters, PaginationUriType uriType) { switch (uriType) { case PaginationUriType.PreviousPage: var previours = new { PageIndex = parameters.PageIndex - 1, PageSize = parameters.PageSize, OrderBy = parameters.OrderBy, //fields=parameters }; return(_urlHelper.Link("GetArticles", previours)); case PaginationUriType.NextPage: var next = new { PageIndex = parameters.PageIndex + 1, PageSize = parameters.PageSize, OrderBy = parameters.OrderBy, //fields=parameters }; return(_urlHelper.Link("GetArticles", next)); default: var current = new { PageIndex = parameters.PageIndex, PageSize = parameters.PageSize, OrderBy = parameters.OrderBy, //fields=parameters }; return(_urlHelper.Link("GetArticles", current)); } }
/// <summary> /// 文章过滤及搜索 /// </summary> /// <param name="parameters"></param> /// <returns></returns> public async Task <PageList <ArticleListViewModel> > GetArticles(ArticleParameters parameters) { if (parameters == null) { throw new ArgumentNullException(nameof(parameters)); } var resultList = _articleRepository.GetAll(); var dateTime = DateTime.Now; //过滤条件,判断枚举是否引用 if (Enum.IsDefined(typeof(DistanceTime), parameters.DistanceTime)) { switch (parameters.DistanceTime) { case DistanceTime.Week: dateTime = dateTime.AddDays(-7); break; case DistanceTime.Month: dateTime = dateTime.AddMonths(-1); break; case DistanceTime.Year: dateTime = dateTime.AddYears(-1); break; } resultList = resultList.Where(m => m.CreateTime > dateTime); } //搜索条件,暂时添加标题和内容 if (!string.IsNullOrWhiteSpace(parameters.SearchStr)) { parameters.SearchStr = parameters.SearchStr.Trim(); resultList = resultList.Where(m => m.Title.Contains(parameters.SearchStr) || m.Content.Contains(parameters.SearchStr)); } //转换为viewModel var list = resultList.Select(m => new ArticleListViewModel { ArticleId = m.Id, Title = m.Title, Content = m.Content, CreateTime = m.CreateTime, Account = m.User.Account, ProfilePhoto = m.User.ProfilePhoto }); //排序 var mappingDictionary = _propertyMappingService.GetPropertyMapping <ArticleListViewModel, Article>(); list = list.ApplySort(parameters.Orderby, mappingDictionary); return(await PageList <ArticleListViewModel> .CreatePageMsgAsync(list, parameters.PageNumber, parameters.PageSize)); }
public async Task <PaginatedList <Article> > GetAllArticlesAsync(ArticleParameters request) { var query = _context.Articles.AsQueryable(); if (!string.IsNullOrEmpty(request.Title)) { query = query.Where(r => r.Title.ToLowerInvariant().Contains(request.Title.ToLowerInvariant())); } query = query.ApplySort(request.OrderBy, _propertyMappingContainer.Resolve <ArticleViewModel, Article>()); var count = await query.CountAsync(); var data = await query.Skip(request.PageIndex *request.PageSize).Take(request.PageSize).ToListAsync(); return(new PaginatedList <Article>(request.PageIndex, request.PageSize, count, data)); }
//实现HATEOAS集合资源的简单方法,将自身的前一页信息和后一页信息也放到headoas中 private IEnumerable <LinkDto> CreateLinksForArticles(ArticleParameters parameters, bool hasPrevious, bool hasNext) { var links = new List <LinkDto> { new LinkDto(CreateArticleUrl(parameters, UrlType.CurrentPage), "self", "GET") }; if (hasPrevious) { links.Add(new LinkDto(CreateArticleUrl(parameters, UrlType.PreviousPage), "Previous", "GET")); } if (hasNext) { links.Add(new LinkDto(CreateArticleUrl(parameters, UrlType.NextPage), "Next", "GET")); } return(links); }
public async Task <IActionResult> Get([FromQuery] ArticleParameters request, [FromHeader(Name = "Accept")] string mediaType) { var list = await _articleRepository.GetAllArticlesAsync(request); var previoustlink = list.GetHasPrevious ? CreateUri(request, PaginationUriType.PreviousPage) : null; var nextlink = list.GetHasNext ? CreateUri(request, PaginationUriType.NextPage) : null; var metadata = new { PageSize = list.PageSize, PageIndex = list.PageIndex, TotalCount = list.TotalCount, PageCount = list.PageCount, Previoustlink = previoustlink, Nextlink = nextlink, //list.GetHasPrevious }; //_logger.LogInformation("test"); //throw new Exception("fsf"); Response.Headers.Add("X-Pagination", JsonConvert.SerializeObject(metadata, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }));//序列化时候变成驼峰规范 var viewList = _mapper.Map <IEnumerable <Article>, IEnumerable <ArticleViewModel> >(list); var shaped = viewList.ToDynamicIEnumerable(request.Fields); var shapedLinks = shaped.Select(r => { var dic = r as IDictionary <string, object>; var articlelinks = CreateLinks((int)dic["Id"], request.Fields); dic.Add("links", articlelinks); return(dic); }); var links = CreateLinks(request, list.GetHasPrevious, list.GetHasNext); return(Ok(new { value = shapedLinks, links })); }
//返回前一页面,后一页,以及当前页的url信息 private string CreateArticleUrl(ArticleParameters parameters, UrlType type) { var isDefined = Enum.IsDefined(typeof(DistanceTime), parameters.DistanceTime); switch (type) { case UrlType.PreviousPage: return(Url.Link(nameof(GetArticles), new { fields = parameters.Fields, orderBy = parameters.Orderby, pageNumber = parameters.PageNumber - 1, pageSize = parameters.PageSize, distanceTime = isDefined ? parameters.DistanceTime.ToString() : null, searchStr = parameters.SearchStr })); case UrlType.NextPage: return(Url.Link(nameof(GetArticles), new { fields = parameters.Fields, orderBy = parameters.Orderby, pageNumber = parameters.PageNumber + 1, pageSize = parameters.PageSize, distanceTime = isDefined ? parameters.DistanceTime.ToString() : null, searchStr = parameters.SearchStr })); default: return(Url.Link(nameof(GetArticles), new { fields = parameters.Fields, orderBy = parameters.Orderby, pageNumber = parameters.PageNumber, pageSize = parameters.PageSize, distanceTime = isDefined ? parameters.DistanceTime.ToString() : null, searchStr = parameters.SearchStr })); } }
public async Task <IActionResult> GetArticles([FromQuery] ArticleParameters parameters) { //不存在排序字段则返回400错误 if (!_propertyMappingService.PropertyMappingExist <ArticleListViewModel, Article>(parameters.Orderby)) { return(BadRequest()); } //确认是否存在该字段 if (!_propertyCheckService.TypeHasProperties <ArticleListViewModel>(parameters.Fields)) { return(BadRequest()); } var list = await _articleService.GetArticles(parameters); //前后页信息 //var previousPageLink = list.HasPrevious ? CreateArticleUrl(parameters, UrlType.PreviousPage) : null; //var nextPageLink = list.HasNext ? CreateArticleUrl(parameters, UrlType.NextPage) : null; var paginationX = new { totalCount = list.TotalCount, pageSize = list.PageSize, currentPage = list.CurrentPage, totalPages = list.TotalPages, //previousPageLink, //nextPageLink }; //添加前后页面信息 Response.Headers.Add("Pagination-X", JsonSerializer.Serialize(paginationX, new JsonSerializerOptions { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping })); //防止添加hateoas异常 if (!string.IsNullOrWhiteSpace(parameters.Fields)) { if (!parameters.Fields.ToLowerInvariant().Contains("articleid")) { parameters.Fields += ",articleid"; } } //结果集数据塑形 var shapedList = list.ShapeDataList(parameters.Fields); //集合内部元素依次添加links信息 var resultList = shapedList.Select(x => { var articleDict = x as IDictionary <string, object>; var articleLinks = CreateLinksForArticle((Guid)articleDict["ArticleId"], null); articleDict.Add("links", articleLinks); return(articleDict); }); //为集合资源获取HEATOAS的Links信息 var links = CreateLinksForArticles(parameters, list.HasPrevious, list.HasNext); //组合信息并返回 var resultListWithLinks = new { value = resultList, links }; return(Ok(resultListWithLinks)); }