查询公告详情,并且带有上一条和下一条的id和标题

业务场景是这样的,系统维护的很多个公告,点击其中一条公告的时候,要展示出这条公告的详情,并且在下方还要展示上一条公告的标题和下一条公告的标题。效果图:

下面说一下我的思路吧:

可能不是最好的解决方法,但是也能够解决问题

我的实现方法,返回的数据格式是这样的

这里我们就需要自定义一个新的数据模型,用于返回  我新建一个类 叫 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 &lt;= #{priority}
            -- 如果优先级一样,找比他发布晚的公告
            and IF(PRIORITY=#{priority}, CREATETIME >= #{createTime} , 1=1 )
            -- 排除本条展示的
            and NOTICEID &lt;&gt; #{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 &lt;= #{createTime} , 1=1 )
            -- 排除本条展示的
            and NOTICEID &lt;&gt; #{noticeId}
            -- 排序
            order by priority asc , CREATETIME DESC
            -- 取第一条
            LIMIT 1
    </select>

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值