DTcms Core文章与标签相关的内容如何关联获取文章列表?

DTcms Core

内容页想列表展示与标签相关的文章列表,如何写文章获取列表代码?形如 url: `/client/article/view/channel/news/5?labelId=4&siteId=${$site}`

比如:文章A  有对应所属  标签“1”,“2”,“3”,在 文章A 内容页后面展示 标签“1”,“2”,“3” 并且列表显示其他文章包括 标签“1”,或“2”,或“3” 的,只要其他文章所属标签有其中一个 就满足条件展示文章列表。想把上面代码 labelId=4 如何转换成   labelId=其他文章包含对应标签id。 

请先 登录 后评论

2 个回答

dtcms - 官方技术支持
擅长:DTcms

这个其实并不难实现,目前labelId传的是单个标签ID,你的意思是想传多个标签ID,只要符合其中一个就查询出来对应的文章是吧?

我们可以另外定义个参数为labelIds=1,2,3这样传参,在API控制器里面,获取这个参数值,然后转换成数组:

//将ID列表转换成IEnumerable

var labelIds = searchParam.LabelIds.ToIEnumerable<long>();

我们可以参考一下批量删除的API接口,用的就是这种方法,具体在控制器查询条件上加上以下条件即可:

&& (searchParam.LabelIds == null || x.ArticleLabelRelations.Any(l => labelIds.Contains(l.LabelId)))

注意:searchParam是我们自定义的查询参数。


请先 登录 后评论
飞天

请教,是不是像下面黑体部分这样添加?  前端如何调用?  LabelIds添加到了一个基础参数BaseParameter  public string LabelIds { get; set; }


    #region 根据频道名称获取指定数量列表

        /// <summary>

        /// 根据频道名称获取指定数量列表

        /// 示例:/client/article/view/channel/news/10?categoryId=1

        /// </summary>

        [HttpGet("/client/article/view/channel/{channelName}/{top}")]

        public async Task<IActionResult> ClientGetList([FromRoute] string channelName, [FromRoute] int top, [FromQuery] ArticleParameter searchParam)

        {

            searchParam.Fields = "Id,SiteId,ChannelId,CallIndex,Title,Source,Author," +

                "LinkUrl,ImgUrl,SeoTitle,SeoKeyword,SeoDescription,Zhaiyao," +

                "Content,SortId,Click,Status,IsComment,CommentCount,LikeCount,AddTime,CategoryTitle," +

                "LabelTitle,ArticleFields,ArticleAlbums,ArticleAttachs,ArticleLabelRelations,ArticleCategoryRelations";


            //检测参数是否合法

            if (searchParam.OrderBy.IsNotNullOrEmpty()

                && !searchParam.OrderBy.Replace("-", "").IsPropertyExists<ArticlesDto>())

            {

                return BadRequest(ResponseMessage.Error("请输入正确的排序参数"));

            }

            if (!searchParam.Fields.IsPropertyExists<ArticlesDto>())

            {

                return BadRequest(ResponseMessage.Error("请输入正确的属性参数"));

            }

            if (string.IsNullOrWhiteSpace(channelName))

            {

                return BadRequest(ResponseMessage.Error("请传入频道名称"));

            }

            //获得频道实体

            SiteChannel channelModel = await _siteChannelService.QueryAsync(t => t.Name.Equals(channelName) && t.SiteId.Equals(searchParam.SiteId));

            if (channelModel == null)

            {

                return BadRequest(ResponseMessage.Error("频道不存在"));

            }

            if (searchParam.LabelIds == null)

            {

                return BadRequest(ResponseMessage.Error("传输参数不可为空"));

            }

            //将ID列表转换成IEnumerable

            var labelIds = searchParam.LabelIds.ToIEnumerable<long>();

            if (labelIds == null)

            {

                return BadRequest(ResponseMessage.Error("传输参数不符合规范"));

            }

            //获取数据库列表

            var resultFrom = await _articleService.QueryListAsync(top,

                x => (searchParam.CategoryId > 0 ? x.ArticleCategoryRelations.Any(t => t.CategoryId == searchParam.CategoryId) : true)//查询分类

                && (searchParam.Keyword.IsNotNullOrEmpty() ? x.Title.Contains(searchParam.Keyword) : true)//查询关键字

                && (searchParam.LabelId > 0 ? x.ArticleLabelRelations.Any(t => t.LabelId == searchParam.LabelId) : true)

                && (searchParam.LabelIds == null || x.ArticleLabelRelations.Any(l => labelIds.Contains(l.LabelId)))

                && (searchParam.StartDate != null ? DateTime.Compare(x.AddTime, searchParam.StartDate.GetValueOrDefault()) >= 0 : true)

                && (searchParam.EndDate != null ? DateTime.Compare(x.AddTime, searchParam.EndDate.GetValueOrDefault()) <= 0 : true)

                && x.ChannelId == channelModel.Id,//频道查询

                searchParam.OrderBy.IsNotNullOrWhiteSpace() ? searchParam.OrderBy : "SortId,-Id");


            //映射成DTO,根据字段进行塑形

            var resultDto = _mapper.Map<IEnumerable<ArticlesClientDto>>(resultFrom).ShapeData(searchParam.Fields);

            //返回成功200

            return Ok(resultDto);

        }

        #endregion

请先 登录 后评论
  • 2 关注
  • 0 收藏,983 浏览
  • 提出于 2021-10-19 22:33

相似问题