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
字段
目前所知,就有两种类型:
spam
举报帖子不符合规范user
置顶,锁定等功能
权限
flarum-ext-flags
默认会向 permisson
里插入两个权限
<?php return Migration::addPermissions([ 'discussion.flagPosts' => Group::MEMBER_ID, 'discussion.viewFlags' => Group::MODERATOR_ID ]);
discussion.flagPosts
用于是否有举报的功能,默认情况下只有 登录用户 有举报功能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); } }
简明扼要的说一下上面这段代码的意思
-
返回的内容中包括
forum
信息时,需要添加canViewFlags
这个字段表示当前用户是否有举报权限forum
就是每次刷新页面或者首次加载的时候必须返回的,就是查看源码里的app.boot({...})
那个 -
返回的内容中包括
forum
信息时,需要添加flagsCount
这个字段表示当前标志的条数这个字段有一个坑,这个坑是什么呢? 它返回所有未处理(删除) 的标志,不仅包括举报的,还包括置顶的,举报的还好说,但是置顶的,没地方设置已阅读啦之类的....
-
返回的内容包含
forum
信息时,需要返回guidelinesUrl
用于指导用户这么操作举报系统,这个,不是必须的 -
当返回的内容包含当前用户信息时,需要添加
newFlagsCount
用于表示新增的flag
的数量
这个是不是和 flagsCount
重叠啊,目前看是这样的,因为没地方设置已读
- 当返回的内容包含
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 | 永久性删除帖子 |
因为删除任何帖子的时候都有至少有两步
- 第一次点击删除,那么就是隐藏帖子
- 然后点击 永久性删除 就是删除数据库记录了
所以,在第一次点击删除的时候,需要调用 DELETE /flags/<post_id>/flags
来删除举报
序列化方面的坑
序列化方面的坑有很多需要注意的,尤其是被 flag
的帖子
-
如果
type==user
那么就是置顶,锁定等之类的, 这个时候需要给post
添加flags
属性属性的内容就是
flags
表中的id,reason,reason_detail,time,type
字段 -
如果
type==spam
就是举报,这个时候,这是一种relationship
关系,需要在relationships
里添加字段flags
写在最后
flarum-ext-flags
相关的内容就写到这里,不懂的大家直接回帖询问把