根据文章类型查询,实现上一篇、下一篇的效果
- 自定义实体Dto(这里只放出扩展字段)
@Getter
@Setter
public class OsArticleDto extends BaseDto {/** */private static final long serialVersionUID = 1L;/** 上一篇文章id*/private String beforeId;/*** 上一篇文章标题*/private String beforeTitle;/*** 下一篇文章id*/private String afterId;/*** 下一篇文章标题*/private String afterTitle;}
- service层实现
public OsArticleDto getAfter(String id) {OsArticleDto articleOld = getById(id);OsArticle articleNew = new OsArticle();// 设置查询条件articleNew.setType(articleOld.getType());articleNew.setStatus(articleOld.getStatus());// 根据当前文章类型查询相关文章List<OsArticleDto> list = osArticleMapper.getPageList(articleNew);// list长度减一(索引值从0开始)int count = list.size() - 1;list.forEach(a -> {if (a.getId().equals(articleOld.getId())) {// 当前文章所在索引位置int index = list.indexOf(a);// 索引为0时且list长度大于0,直接获取索引下一个值if (index == 0 && count > 0) {articleOld.setAfterId(list.get(1).getId());articleOld.setAfterTitle(list.get(1).getArticleTitle());// 索引为最后一个且list长度大于0,,赋值上一篇文章} else if (index == count && count > 0) {articleOld.setBeforeId(list.get(index - 1).getId());articleOld.setBeforeTitle(list.get(index - 1).getArticleTitle());} else {// 索引为中间值时,分别给上下文章赋值articleOld.setBeforeId(list.get(index - 1).getId());articleOld.setBeforeTitle(list.get(index - 1).getArticleTitle());articleOld.setAfterId(list.get(index + 1).getId());articleOld.setAfterTitle(list.get(index + 1).getArticleTitle());}}});return articleOld;}
- Controller层,此方法为根据id查询详情时向前台提供的接口。
@GetMapping(value = "/getById", produces = "application/json;charset=UTF-8")public BaseResult<?> getById(@RequestParam("id") String id) {try {OsArticleDto dto = oArticleService.getAfter(id);return getBaseResultSuccess(dto, "获取信息成功");} catch (BusinessException e) {return getBaseResultFail(null, e.getCode(), e.getMessage());} catch (Exception e) {log.error("获取信息失败" + e + "######################");return getBaseResultFail(null, ErrorCode.HANDLER_EXCEPTION, "系统繁忙,请稍后再试");}}
- 代码有待优化,希望各位多提意见,谢谢。