Flarum 举报系统详解

yufei       6 年, 5 月 前       1152

Flarum 举报系统的扩展名为 flarum-ext-flags ,这是一个官方出品的扩展

我翻了一下源码,发现它是基于通知系统的,但有一个坑,针对置顶等没有设置已读的地方,大家用上后就会知道的

废话不多说了,我们直接进入主题

flarum-ext-flags

flarum-ext-flags 系统需要创建一个表 flags 和往 users 表中添加 flag_read_time 字段

flags

+---------------+------------------+-----+----------------+
| Field         | Type             | Key | Extra          |
+---------------+------------------+-----+----------------+
| id            | int(10) unsigned | PRI | auto_increment |
| post_id       | int(10) unsigned |     |                |
| type          | varchar(255)     |     |                |
| user_id       | int(10) unsigned |     |                |
| reason        | varchar(255)     |     |                |
| reason_detail | varchar(255)     |     |                |
| time          | datetime         |     |                |
+---------------+------------------+-----+----------------+

users

+------------------+----------+-----+-------+
| Field            | Type     | Key | Extra |
+------------------+----------+-------------+
| flags_read_time  | datetime |     |       |
+---------------+-------------+-----+-------+

字段都很普通,见名知义,唯一值得商讨的是 type 字段

目前所知,就有两种类型:

  1. spam 举报帖子不符合规范
  2. user 置顶,锁定等功能

权限

flarum-ext-flags 默认会向 permisson 里插入两个权限

<?php 
return Migration::addPermissions([
    'discussion.flagPosts' => Group::MEMBER_ID,
    'discussion.viewFlags' => Group::MODERATOR_ID
]);
  1. discussion.flagPosts 用于是否有举报的功能,默认情况下只有 登录用户 有举报功能
  2. discussion.viewFlags 用于是否处理举报的功能,默认情况下 话题管理者 (版主) 以上权限具有管理功能

更多权限方面的内容可以访问我们的 Flarum 权限系统详解

序列化 ( API 返回内容 )

序列化方面的内容,大家可以看 AddFlagsApi.php 这个文件中的函数

<?php
   public function prepareApiAttributes(PrepareApiAttributes $event)
    {
        if ($event->isSerializer(ForumSerializer::class)) {
            $event->attributes['canViewFlags'] = $event->actor->hasPermissionLike('discussion.viewFlags');

            if ($event->attributes['canViewFlags']) {
                $event->attributes['flagsCount'] = (int) $this->getFlagsCount($event->actor);
            }

            $event->attributes['guidelinesUrl'] = $this->settings->get('flarum-flags.guidelines_url');
        }

        if ($event->isSerializer(CurrentUserSerializer::class)) {
            $event->attributes['newFlagsCount'] = (int) $this->getNewFlagsCount($event->model);
        }

        if ($event->isSerializer(PostSerializer::class)) {
            $event->attributes['canFlag'] = $event->actor->can('flag', $event->model);
        }
    }

简明扼要的说一下上面这段代码的意思

  1. 返回的内容中包括 forum 信息时,需要添加 canViewFlags 这个字段表示当前用户是否有举报权限

    forum 就是每次刷新页面或者首次加载的时候必须返回的,就是查看源码里的 app.boot({...}) 那个

  2. 返回的内容中包括 forum 信息时,需要添加 flagsCount 这个字段表示当前标志的条数

    这个字段有一个坑,这个坑是什么呢? 它返回所有未处理(删除) 的标志,不仅包括举报的,还包括置顶的,举报的还好说,但是置顶的,没地方设置已阅读啦之类的....

  3. 返回的内容包含 forum 信息时,需要返回 guidelinesUrl 用于指导用户这么操作举报系统,这个,不是必须的

  4. 当返回的内容包含当前用户信息时,需要添加 newFlagsCount 用于表示新增的 flag 的数量

这个是不是和 flagsCount 重叠啊,目前看是这样的,因为没地方设置已读

  1. 当返回的内容包含 post 时,需要添加 canFlag 选项

这个 canFlag 是当前用户对这个 post 是否有举报功能

因为权限权限会设置到 Tag 级别,所以一般情况下,就是当前用户对这个 Tag 下的文章是否有举报功能

当一个 post 横跨两个 Tag,这两个 Tag 一个有举报功能,一个没有举报功能,那么,它是有还是没有呢?

API

flarum-ext-flags 同时还添加了三个 API 用户获取和创建 Flags

API endpoint 方法 说明
/flags GET 列出当前用户所有未读的 flags
/flags POST 创建一个 POST
/flags/<post_id>/flags 撤销举报

举报,举报吗,举报的时候除了撤销,当然还有对帖子的处理对吧,所以,其实还有两个隐形的 API

API endpoint 方法 说明
/posts/<post_id> PATCH 删除/隐藏帖子
/posts/<post_id> DELETE 永久性删除帖子

因为删除任何帖子的时候都有至少有两步

  1. 第一次点击删除,那么就是隐藏帖子
  2. 然后点击 永久性删除 就是删除数据库记录了

所以,在第一次点击删除的时候,需要调用 DELETE /flags/&lt;post_id&gt;/flags 来删除举报

序列化方面的坑

序列化方面的坑有很多需要注意的,尤其是被 flag 的帖子

  1. 如果 type==user 那么就是置顶,锁定等之类的, 这个时候需要给 post 添加 flags 属性

    属性的内容就是 flags 表中的 id,reason,reason_detail,time,type 字段

  2. 如果 type==spam 就是举报,这个时候,这是一种 relationship 关系,需要在 relationships 里添加字段 flags

写在最后

flarum-ext-flags 相关的内容就写到这里,不懂的大家直接回帖询问把

目前尚无回复
简单教程 = 简单教程,简单编程
简单教程 是一个关于技术和学习的地方
现在注册
已注册用户请 登入
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.