如何在项目中实现类似于微信的置顶与取消置顶的功能?


- 借鉴微信的置顶与取消置顶的实现思路:



会看到这个微信的聊天记录的排序规则是以时间降序来进行排序的,如果要实现置顶与取消置顶? 一下子是想不到的,需要思路

由此可以确信的是,我们平时使用微信时,最新的聊天记录总是在前面的,多久不聊的聊天是在最后面的。

在项目中需要实现置顶与取消置顶的功能,刚开始没有思路,苦思冥想了半天,以前也没有做过类似的需求。

于是我一直在使用微信的置顶与取消置顶的功能,玩着玩着还挺好玩,我只要最后点击某条聊天记录置顶,那么这条记录就一定会在第一条显示,并且在它前面置顶的聊天记录会依次在它的下面显示。如果我取消了某条 (置顶过) 的聊天记录,那么它的位置就是在它(聊天记录)的 创建的时间点上。当时就特别好奇,这到底要怎么实现?

一直写SQL语句反复尝试还没有思路,整个人都快傻了,这应该是个很简单的功能,为什么就是写不出来,又想不对啊,怎么可能在一个字段中就 实现置顶与取消置顶,并且还要排序? 终于,我在测试表中仅有的字段又加了一个标记字段 is_top(是否置顶), 神奇的现象发生了, 我想要的结果出来了 ,哈哈哈

(这是类似于微信的,先以是否置顶降序排,再以排序字段降序排(盲猜我这个对应微信的聊天记录的创建时间,哈哈哈))
 SELECT * FROM tb_test ORDER BY is_top DESC,sort_num DESC

在这里插入图片描述

(这是我,应该更容易理解,嗯)
SELECT * FROM `tb_test` ORDER BY is_top DESC,sort_num ASC

在这里插入图片描述

从结果可以看出来,这句SQL语句再执行的时候,先排第一个字段,再排第二个字段,所有从这个思路,思路逐渐清晰:

当前文稿置顶:

@Override
    public Map<Integer, String> stick(Long publishId) {
   

        // 1: 获取 is_top字段 的最大值
        Integer isTopMax = publishInfoMapper.getIsTopMax();
        
        // 2: 查询当前文稿
        PublishInfo publishInfoUpdate = new PublishInfo();
        publishInfoUpdate.setPublishId(publishId);

        // 创建查询对象
        QueryWrapper<PublishInfo> queryWrapper = Wrappers.query(publishInfoUpdate);
        PublishInfo publishInfo = null;
        try {
   
            publishInfo = publishInfoMapper.selectOne(queryWrapper);
        } catch (Exception e) {
   
            throw new RuntimeException(e);
        }

        Map<Integer, String> resultMap = new HashMap<>();
        if (ObjectUtils.isEmpty(publishInfo)) {
   
            throw new OperationException(OperationExEnum.ABSENT, "无法找到对应id的文稿,无法进行置顶显示,请确认id是否正确 !");
        } else {
   
            Integer isTop = publishInfo.getIsTop();
            
            if (isTop.equals(isTopMax)) {
   
                resultMap.put(OperationExEnum.MODIFICATION_FAILURE.getStatusCode(), "当前文稿已经置顶,请重新选择 !");
            } else if (isTop < 0)<
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值