Пример #1
0
        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);
        }
Пример #2
0
        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));
            }
        }
Пример #3
0
        /// <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));
        }
Пример #4
0
        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));
        }
Пример #5
0
        //实现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);
        }
Пример #6
0
        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
            }));
        }
Пример #7
0
        //返回前一页面,后一页,以及当前页的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
                }));
            }
        }
Пример #8
0
        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));
        }