根据文章类型查询,实现上一篇、下一篇的效果
- 自定义实体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, "系统繁忙,请稍后再试");
}
}
- 代码有待优化,希望各位多提意见,谢谢。