V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
madpecker009
V2EX  ›  PHP

论坛沉帖功能实现

  •  
  •   madpecker009 · 2020-06-26 10:33:46 +08:00 · 3799 次点击
    这是一个创建于 1608 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在开发一个论坛,有一个下沉帖子的功能,就类似于 v 站的下沉功能。想问一下这个功能是怎么实现的?给点思路吧。

    12 条回复    2020-06-27 11:10:12 +08:00
    delectate
        1
    delectate  
       2020-06-26 10:50:09 +08:00
    要看帖子的排序依据。
    前提是,不论怎样,都要加两个字段,下沉的记录时间和作用期限。

    比如按照发帖时间,回复热度等,都先过滤掉有下沉记录且在作用期限的,就可以了。
    GPLer
        2
    GPLer  
       2020-06-26 10:52:27 +08:00 via Android
    计算出来的帖子排名增加大小,比如+50
    zsdroid
        3
    zsdroid  
       2020-06-26 11:01:42 +08:00
    下沉 1 天`update table set sort_time = sort_time - 86400 where id = xxx;`
    imdong
        4
    imdong  
       2020-06-26 11:06:32 +08:00 via iPhone
    这样实现可还行?
    论坛是按照最后回复时间排序的。
    主题加两个字段,一个最后回复时间,一个是否沉贴过沉贴结束时间。

    回复时更新回复时间字段,如果沉贴中,就不更新。

    这样排序就会在原来的位置慢慢下沉。

    婚姻就如楼上所说,直接从首页消失。
    EminemW
        5
    EminemW  
       2020-06-26 12:57:28 +08:00
    应该有个字段用来排序的吧。
    不是单纯的用时间排序,根据帖子的内容和评论进行打分,然后把分数作为排序依据
    Jooooooooo
        6
    Jooooooooo  
       2020-06-26 14:08:33 +08:00   ❤️ 2
    合理的做法是用权重, 而不是像楼上说的用修改时间的方法间接达到效果

    一个帖子的排序规则完全由权重决定, 时间只是决定权重的因素之一

    (修改时间的做法很显然的毛病是以后一旦权重和时间失去关联之后, 还要再修改这个沉帖功能
    kukumao
        7
    kukumao  
       2020-06-26 14:09:41 +08:00
    按最后回复时间排序。 把最后回复时间 - 10000
    RickyC
        8
    RickyC  
       2020-06-26 17:40:32 +08:00
    V 站每点一次"下沉", 就多下沉 1 天; 顶一下的话, 帖子还往上跑

    主题数据表包含: create_time(创建时间戳), last_reply_time(最后回复时间戳), sort_time(用于排序的时间戳) 3 个字段
    整个论坛以 sort_time 来排序帖子

    1. 刚发帖时 last_reply_time = sort_time = create_time = 此刻时间戳
    2. 点下沉后, 给 sort_time 减少 86400
    3. 有人回帖时,
    a. 计算 原 last_reply_time - 原 sort_time 的值, 记录为 x
    b. 更新 last_reply_time 为此刻时间戳
    c. 更新 sort_time 为 (新的 last_reply_time - x)
    4. 最后一条回复被删除时
    a. 计算 原 last_reply_time - 原 sort_time 的值, 记录为 x
    b. 查找新的最后一条回复, 将主题的 last_reply_time 记录为这条回复的 create_time
    c. 更新主题的 sort_time 为(新的 last_reply_time - x)
    RickyC
        9
    RickyC  
       2020-06-26 17:43:27 +08:00
    @delectate 沉贴会不会是永久作用? 点 1 次"沉贴 1 天"就多下沉 1 天?
    nightwitch
        10
    nightwitch  
       2020-06-26 17:45:47 +08:00
    简单的实现:
    每个帖子用一个数字来代表排序,每个帖子初始的权重为 1,每个帖子的初始分数为发帖的 unix 时间戳(一串数字),最后的排序结果是权重 * 分数。
    下沉直接把权重降下去就可以了
    mostkia
        11
    mostkia  
       2020-06-26 18:16:09 +08:00
    看你论坛帖子的数据库依什么算法来排序喽,按时间的话,改时间,按热度的话,降热度,按综合的话,降整个帖子的权重
    seliote
        12
    seliote  
       2020-06-27 11:10:12 +08:00
    可以看看 Redis 实战,第一章就有一个还不错的例子。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3118 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 14:26 · PVG 22:26 · LAX 06:26 · JFK 09:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.