业务场景是这样的,系统维护的很多个公告,点击其中一条公告的时候,要展示出这条公告的详情,并且在下方还要展示上一条公告的标题和下一条公告的标题。效果图:
下面说一下我的思路吧:
可能不是最好的解决方法,但是也能够解决问题
我的实现方法,返回的数据格式是这样的
这里我们就需要自定义一个新的数据模型,用于返回 我新建一个类 叫 PortalNoticeInfoVo.java
除了有单条公告的信息之外,
import java.io.Serializable;
/**
* <p>
* 公告详情返回值
* </p>
*
* @author: wangmh
* @since: 2022年08月25日 11:22
*/
@ApiModel(value="公告详情返回值", description="公告详情返回值")
public class PortalNoticeInfoVO implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "当前公告信息")
private RecNoticeVo recNoticeVo;
@ApiModelProperty(value = "上一条的id")
private String preNoticeId;
@ApiModelProperty(value = "上一条的标题")
private String preNoticeTitle;
@ApiModelProperty(value = "下一条的id")
private String nextNoticeId;
@ApiModelProperty(value = "下一条的标题")
private String nextNoticeTitle;
@ApiModelProperty(value = "是否有上一条,默认有")
private Boolean havePreNotice = true;
@ApiModelProperty(value = "是否有下一条,默认有")
private Boolean haveNextNotice = true;
public PortalNoticeInfoVO(){}
public static long getSerialVersionUID() {
return serialVersionUID;
}
public String getPreNoticeId() {
return preNoticeId;
}
public void setPreNoticeId(String preNoticeId) {
this.preNoticeId = preNoticeId;
}
public String getPreNoticeTitle() {
return preNoticeTitle;
}
public void setPreNoticeTitle(String preNoticeTitle) {
this.preNoticeTitle = preNoticeTitle;
}
public String getNextNoticeId() {
return nextNoticeId;
}
public void setNextNoticeId(String nextNoticeId) {
this.nextNoticeId = nextNoticeId;
}
public String getNextNoticeTitle() {
return nextNoticeTitle;
}
public void setNextNoticeTitle(String nextNoticeTitle) {
this.nextNoticeTitle = nextNoticeTitle;
}
public RecNoticeVo getRecNoticeVo() {
return recNoticeVo;
}
public void setRecNoticeVo(RecNoticeVo recNoticeVo) {
this.recNoticeVo = recNoticeVo;
}
public Boolean getHavePreNotice() {
return havePreNotice;
}
public void setHavePreNotice(Boolean havePreNotice) {
this.havePreNotice = havePreNotice;
}
public Boolean getHaveNextNotice() {
return haveNextNotice;
}
public void setHaveNextNotice(Boolean haveNextNotice) {
this.haveNextNotice = haveNextNotice;
}
}
再贴一下我的其他方法
controller
@ApiOperation(value = "招聘门户——招聘公告详情", notes = "招聘门户——招聘公告详情")
@GetMapping(Urls.recPortalUrls.getNoticeById)
@DataLog(operationName = "招聘门户——招聘公告详情", logType = LogTypeEnum.DATA_LOG, methodType = MethodTypeEnum.FIND_TYPE)
@ApiOperationSupport(order = 5)
@ApiImplicitParams({
@ApiImplicitParam(name = "noticeId", value = "公告主键", required = true)
})
public JsonObject<PortalNoticeInfoVO> getNoticeById(String noticeId){
PortalNoticeInfoVO notice = recPortalWhitelistService.getNoticeById(noticeId);
return new JsonSuccessObject<>(notice,"查询成功");
}
service
/**
* 招聘门户——招聘公告详情
*/
PortalNoticeInfoVO getNoticeById(String noticeId);
service实现类
主要分三个步骤
// 1. 查询主要展示的公告详情// 2. 查询上一条公告概略// 3. 查询下一条公告概略
然后就是核心基于sql的查询,查询出上一条公告和吓一条公告,这里需要再建一个类来接受上一条公告和下一条公告的返回值,这个类就俩字段就🆗了,一个存主键,一个存标题
@Override
public PortalNoticeInfoVO getNoticeById(String noticeId) {
PortalNoticeInfoVO portalNoticeInfoVO = new PortalNoticeInfoVO();
// 1. 查询主要展示的公告详情
RecNoticeVo recNoticeVo = recNoticeMapper.getNoticeById(noticeId);
portalNoticeInfoVO.setRecNoticeVo(recNoticeVo);
// 2. 查询上一条公告概略
PortalNoticeVo preNotice = recPortalWhitelistMapper.getPreNotice(recNoticeVo.getNoticeId(),recNoticeVo.getPriority(),recNoticeVo.getCreateTime());
if (preNotice == null) { // 没有上一条
portalNoticeInfoVO.setHavePreNotice(false);
}else{
portalNoticeInfoVO.setPreNoticeId(preNotice.getNoticeId());
portalNoticeInfoVO.setPreNoticeTitle(preNotice.getNoticeTitle());
}
// 3. 查询下一条公告概略
PortalNoticeVo nextNotice = recPortalWhitelistMapper.nextPreNotice(recNoticeVo.getNoticeId(),recNoticeVo.getPriority(),recNoticeVo.getCreateTime());
if (nextNotice == null) { // 没有下一条
portalNoticeInfoVO.setHaveNextNotice(false);
}else{
portalNoticeInfoVO.setNextNoticeId(nextNotice.getNoticeId());
portalNoticeInfoVO.setNextNoticeTitle(nextNotice.getNoticeTitle());
}
return portalNoticeInfoVO;
}
dao
/**
* 查询上一条公告概略
* @param noticeId id
* @param priority 优先级
* @param createTime 创建时间
* @return
*/
PortalNoticeVo getPreNotice(@Param("noticeId") String noticeId, @Param("priority") Integer priority, @Param("createTime") LocalDateTime createTime);
/**
* 查询下一条公告概略
* @param noticeId id
* @param priority 优先级
* @param createTime 创建时间
* @return
*/
PortalNoticeVo nextPreNotice(@Param("noticeId") String noticeId, @Param("priority") Integer priority, @Param("createTime") LocalDateTime createTime);
mapper
这两条sql还是有差距的,我是根据优先级来确定谁在前面展示,优先级相同的话,那就谁后发布谁展示在前面。 基于这种展示方式,去编写sql查询指定公告他的上一条公告和下一条公告。
(比如查询上一条:sql的大概意思就是,首先查询已经发布的公告,再查询比它优先级小的,如果优先级一样,查比它发布的晚的(因为优先级一样,后发布的在前面展示),再去掉自身,得到一堆数据,再把这一堆数据进行排序,然后取第一条,就是它的上一条)
其中用到了mybatis的转义字符
<select id="getPreNotice" resultType="com.bdsoft.recruit.gateway.vo.PortalNoticeVo" parameterType="Map">
select
NOTICEID noticeId,
NOTICETITLE noticeTitle
from
rec_notice
where
-- 已经发布的公告
NOTICESTATE = 1
-- 优先级比它小
and PRIORITY <= #{priority}
-- 如果优先级一样,找比他发布晚的公告
and IF(PRIORITY=#{priority}, CREATETIME >= #{createTime} , 1=1 )
-- 排除本条展示的
and NOTICEID <> #{noticeId}
-- 排序
order by priority desc , CREATETIME asc
-- 取第一条
LIMIT 1
</select>
<select id="nextPreNotice" resultType="com.bdsoft.recruit.gateway.vo.PortalNoticeVo" parameterType="Map">
select
NOTICEID noticeId,
NOTICETITLE noticeTitle
from
rec_notice
where
-- 已经发布的公告
NOTICESTATE = 1
-- 优先级比它大的
and PRIORITY >= #{priority}
-- 如果优先级一样,找比他发布早的公告
and IF(PRIORITY=#{priority}, CREATETIME <= #{createTime} , 1=1 )
-- 排除本条展示的
and NOTICEID <> #{noticeId}
-- 排序
order by priority asc , CREATETIME DESC
-- 取第一条
LIMIT 1
</select>