V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zzztongxue
V2EX  ›  问与答

社区禁言功能如何设计比较好呢?

  •  
  •   zzztongxue · 177 天前 · 1998 次点击
    这是一个创建于 177 天前的主题,其中的信息可能已经有所发展或是发生改变。
    目前有两种想法:

    1.在 users 表里新增禁言字段,每次发帖从数据库 users 表检测是否禁言。

    2.新建一张惩罚表,记录对用户的惩罚记录,每次发帖 or 发评论检测一下该表。

    第一种方法不能自动取消禁言。第二种方法后台管理员禁言比较麻烦,需要新增一条记录,不能一键禁言。

    有点纠结,是否还有其他更好的方案?求解
    31 条回复    2022-06-07 00:26:18 +08:00
    WenJimmy
        1
    WenJimmy  
       177 天前
    发言技能冷却时间?
    zzztongxue
        2
    zzztongxue  
    OP
       177 天前 via iPhone
    @WenJimmy 如何实现冷却😂
    hingle
        3
    hingle  
       177 天前   ❤️ 1
    把 1 禁言字段改成禁言过期时间
    liuxey
        4
    liuxey  
       177 天前
    干脆 Redis 里存一下 userId 的禁言状态,时间到了 key 自动过期,都不用维护过期了
    zzztongxue
        5
    zzztongxue  
    OP
       177 天前 via iPhone
    @liuxey 有永久封禁的用户,这种方式感觉不适合做持久化
    codergrowing
        6
    codergrowing  
       177 天前
    一键禁言是什么场景?批量禁言所选用户吗?如果是这样的话,方案二也可以实现啊,插入多条记录而已。
    如果是将所有用户都禁言,方案一、二都不行吧,方案一岂不是得将表里所有行都更新一下
    cmdOptionKana
        7
    cmdOptionKana  
       177 天前
    其实一般论坛发言频率很低,直接增加个字段每次查表就行。等到论坛很兴旺的时候再看怎么改一下与 Redis 配合也不迟。
    delectate
        8
    delectate  
       177 天前   ❤️ 3
    为了应对国内特殊情况,我觉得 user 表应该增加五各字段,分别是:
    1 、禁言等级:禁言分不同等级的,比如仅禁止发言可浏览;禁止发言禁止浏览;删除账号;保留账号(类似 b 站的纪念账号)
    2 、解禁时间:最短 1 秒,最长 2099 年,相当于永久了;
    3 、解禁后的禁言等级:理论上来说,不能接近之后直接可以恢复自由身,要有一个改造过程(参考辛巴限流)
    4 、解禁后是否需要管理员二次确认的 Boolean:(需要管理员二次确认这个人是否可以放出来,比如李佳琦、薇娅)
    5 、封禁原因(含封禁原因、管理员操作历史等)
    delectate
        9
    delectate  
       177 天前
    补充:
    每次展示帖子的时候,如果查到仍在禁言期,则用户的发言“假删除”,不可以真的删掉,不然 guo 安 wang 安找你来调数据,你说删了,你就替他去 jail 了。
    pengtdyd
        10
    pengtdyd  
       177 天前   ❤️ 2
    我想到一个比较骚的产品套路,当帖子不符合规范的时候,别人看不到,只有发帖者自己可以看到,这样让发帖者以为发成功了,其实只有他自己能看,其他人看不了,这样用户体验非常好。
    gbqqaybc
        11
    gbqqaybc  
       177 天前 via Android
    @pengtdyd 这就是 shadowban 吧
    zzztongxue
        12
    zzztongxue  
    OP
       177 天前
    @pengtdyd 哈哈哈,这个功能已经做了,帖子设置个仅作者自己可见状态即可。
    ChoateYao
        13
    ChoateYao  
       177 天前
    @zzztongxue 但是不感觉这玩意对分页很恶心嘛。
    zzztongxue
        14
    zzztongxue  
    OP
       177 天前
    @delectate 这个思路和方法二差不多,这些字段可以放在惩罚表里。
    zzztongxue
        15
    zzztongxue  
    OP
       177 天前
    @ChoateYao 如果是惩罚表的话,分页不好处理嘛?没 get 到你的意思
    zzztongxue
        16
    zzztongxue  
    OP
       177 天前
    @codergrowing 当前业务场景没有涉及到批量禁言的
    estk
        17
    estk  
       177 天前 via Android   ❤️ 1
    如果是我,就悄无声息让用户无感,可以发帖回帖,但是只有他自己能看到
    murmur
        18
    murmur  
       177 天前   ❤️ 1
    @pengtdyd 这不就是新浪微博么,被封号了还可以登录,但是不能申诉,一跳转申诉就提示未登录,然后也不能注销,因为注销和申诉是一套系统
    BeautifulSoap
        19
    BeautifulSoap  
       177 天前 via Android
    user 表再加个禁言时间字段啊。用户登录或发言的时候如果过了字段就更新下禁言 flag 不就可以了
    cxe2v
        20
    cxe2v  
       177 天前
    @pengtdyd #10
    @estk #17 抖音就是这么干的
    estk
        21
    estk  
       177 天前 via Android
    @cxe2v
    这样好,省得激怒用户
    oppoic
        22
    oppoic  
       177 天前
    论坛一般登录一次,很久不掉线,期间他每次发言,你都查 user 表吗?

    用户信息直接放 redis 里最好(此接口调用非常频繁)具体思路:
    用户登录,验证成功,写用户信息进 redis (包括禁言状态)。前端拿到这个全局都可以使用,比如发言判断、头像展示、粉丝互动等等等(当然后端也要验证)

    过程中禁言、恢复等操作,写库之后再更新 redis (到期自动解除禁言,到期时间也返回给前端,前端来判断)
    ranleng
        23
    ranleng  
       177 天前
    @pengtdyd 某即刻就是这么搞的, 审核中的 po ,自己能看到,其他人看不到。但之前有 bug ,自己转发自己 po (审核中)会显示原 po 找不到。
    ikaros
        24
    ikaros  
       177 天前
    第一种方法为啥不能自动取消禁言? 这个依赖你自己的实现吧
    iClass
        25
    iClass  
       177 天前 via Android
    不会开门 何必关门
    jackma0571
        26
    jackma0571  
       177 天前
    我是产品经理说下我的拙见:
    1 、user 表增加禁言状态,和禁言期限,发帖回复时校验该状态,禁言状态提示发送失败,被禁言
    2 、每天跑定时任务,把到期的用户状态改为非禁言状态,因此你的到期时间最好为每天的 24 点,不然你的定时任务得每分钟跑一次
    kaiki
        27
    kaiki  
       177 天前
    我设计的是用户有状态和解锁时间,正常 /禁用,判断状态再判断时间,如果是禁用那就没必要判断时间了。
    i3x
        28
    i3x  
       177 天前 via Android
    所有的评论统统人工审核后放出呗。
    potatowish
        29
    potatowish  
       177 天前 via iPhone
    社区最好不要设置禁言,可以参照某乎,评论仅个人可见,再考虑下 V2 的降权规则,触发规则就让所发评论沉底。

    这样的好处是,用户不会因为直接禁言就破口大骂,而是慢慢接受现状~
    keepeye
        30
    keepeye  
       177 天前
    你要回查禁言记录,就需要单独一张表了。其实都可以,看你系统规模,如果有几千万用户,你加一个字段都要累死,所以单独一张表应该适应性更强一些
    xieqiqiang00
        31
    xieqiqiang00  
       176 天前
    你把第一个时间改成解禁时间不就好了,如果是永久禁言改成 2000 年以前的时间比如 1970 年就是 0 时间,然后判断一下就好了
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3457 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 60ms · UTC 13:58 · PVG 21:58 · LAX 05:58 · JFK 08:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.