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

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

  •  
  •   zzztongxue · 2022-06-06 10:07:00 +08:00 · 2432 次点击
    这是一个创建于 661 天前的主题,其中的信息可能已经有所发展或是发生改变。
    目前有两种想法:

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

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

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

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

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

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

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