- 后端
- 前端
- 协同办公
- 即时通讯
- 企业应用
【免费下载链接】dootask
DooTask是一款开源在线项目任务管理工具,提供各类文档协作工具、在线思维导图、在线流程图、项目管理、任务分发、即时IM,文件管理等工具;同时消息功能使用非对称加密技术让你的沟通更安全。
DooTask 的系统级聊天管控能力通过「消息设置」中的三个独立开关实现,分别控制全员群、个人私聊与个人自建群的发言权限,属于系统管理员可直接操作的全局策略。本文以 群组与私聊禁言设置 为骨架,结合仓库源码(WebSocketDialog::checkMute判定逻辑、SystemController设置读写、settings 表存储机制)完整展开每个开关的作用域、豁免对象、生效方式与边界限制,帮助你准确理解并正确配置全员禁言策略。
功能概览:三个相互独立的禁言开关
入口为桌面端左上角头像 →「系统设置」→「消息设置」。该页面共涉及三个独立字段,每个字段取值均为open(开放发言)或close(禁言):
| 字段 | UI 标签 | 默认 | 控制范围 |
|---|---|---|---|
all_group_mute | 全员群组禁言 | open | 系统「全员群」(group_type=all) |
user_private_chat_mute | 私聊禁言 | open | 个人对个人的私聊(type=user) |
user_group_chat_mute | 群聊禁言 | open | 个人自建群(group_type=user) |
三个开关相互独立,不会联动:例如关闭「全员群组禁言」并不会影响私聊与个人自建群,要实现全平台静音必须分别关闭三个开关。
禁言粒度与谁能发言
各开关的禁言粒度如下:
all_group_mute=close:除系统管理员外,所有人都不能在全员群发言,管理员仍可发言;user_private_chat_mute=close:禁止任何成员发起或继续个人私聊,只有管理员可发言;user_group_chat_mute=close:个人自建群禁言,管理员仍可发言;部门群、项目群、会议群等系统群不受影响。
源码视角:checkMute 的会话类型路由
禁言判定由 WebSocketDialog::checkMute 统一完成,其核心逻辑是按会话type与group_type路由到对应开关:
public function checkMute($userid) { $muteMsgTip = null; $systemConfig = Base::setting('system'); switch ($this->type) { case 'user': if ($systemConfig['user_private_chat_mute'] === 'close') { $muteMsgTip = '个人会话禁言'; } break; case 'group': if ($this->group_type === 'user') { if ($systemConfig['user_group_chat_mute'] === 'close') { $muteMsgTip = '个人群组禁言'; } } elseif ($this->group_type === 'all') { if ($systemConfig['all_group_mute'] === 'close') { $muteMsgTip = '当前会话全员禁言'; } } break; } if ($muteMsgTip === null) { return; } if ($userid) { $user = User::find($userid); if ($user?->bot || $user?->isAdmin()) { // 机器人或管理员不受禁言 return; } } throw new ApiException($muteMsgTip); }从代码结构可以推断出几个关键事实:
- 系统群天然不受
user_group_chat_mute控制:switch分支只命中group_type=user与group_type=all,而部门群、项目群、会议群等系统群属于group_type=project/task/department等其他类型,直接落入「无提示」分支提前返回,永远可发言(除非被全员群禁言覆盖)。 - 错误提示与开关一一对应:被禁言时尝试发消息会收到「个人会话禁言 / 个人群组禁言 / 当前会话全员禁言」三种明确错误,方便定位是被哪个开关拦截。
- 豁免判定位于抛错之前:管理员(
isAdmin,即identity含admin,见 User::isAdmin)与机器人账号(bot)直接返回,不受任何禁言开关限制。
该判定在发消息链路中被调用:WebSocketDialogMsg::sendMsg在处理任意类型消息时都会先执行$dialog->checkMute($sender);(见 WebSocketDialogMsg.php),且仅当$sender > 0时校验,即系统内部通道(如机器人推送)不会触发禁言拦截。
前端会话列表同步显示禁言状态
会话列表接口会在返回每个会话时附带dialog_mute字段,让前端直接展示当前会话是否处于禁言状态,其取值同样按会话类型路由(见 WebSocketDialog::synthesizeData):
- 私聊会话(
type=user):读取user_private_chat_mute; - 个人自建群(
group_type=user):读取user_group_chat_mute; - 全员群(
group_type=all):读取all_group_mute; - 项目群、任务群等其他类型:不设置
dialog_mute,默认不显示禁言标识。
这意味着前端展示与后端校验使用的是同一份系统设置,行为一致。
操作步骤
- 进入桌面端「系统设置」→「消息设置」;
- 分别在「全员群组禁言」「私聊禁言」「群聊禁言」三个选项中选「开放」或「禁言」;
- 点击「提交」保存,立即生效,无需重启服务或重新登录。
后端保存链路与前置条件
「提交」操作对应SystemController的setting/save接口,需要User::auth('admin')管理员鉴权。后端会对提交参数做白名单过滤,只有all_group_mute、user_private_chat_mute、user_group_chat_mute等受支持字段才会被写入(见 SystemController.php),随后统一存入系统设置。
需要注意的是,该接口受环境变量SYSTEM_SETTING控制:当部署环境将其设置为disabled时(对应配置项 config/dootask.php 中的'system_setting' => env('SYSTEM_SETTING')),SystemController中所有系统设置读写接口(save、set 等)都会返回「当前环境禁止修改」(见 SystemController.php)。也就是说,只有SYSTEM_SETTING未被置为disabled的部署环境,管理员才可以通过界面调整这些禁言开关。
默认值与历史值兼容
在读取设置时,后端会为缺失字段补齐默认值(见 SystemController.php):
$setting['all_group_mute'] = $setting['all_group_mute'] ?: 'open'; $setting['user_private_chat_mute'] = $setting['user_private_chat_mute'] ?: 'open'; $setting['user_group_chat_mute'] = $setting['user_group_chat_mute'] ?: 'open';即数据库未写入任何值时,三个开关均按open(开放)兜底,老部署无需额外初始化。
另外,all_group_mute字段历史上曾支持user/all两种更细粒度的取值,迁移脚本 2024_02_05_212046_all_group_mute_handle.php 会在升级时将其统一转换为close,确保后续代码只按open/close二值语义工作。
能不能解禁
能。任何字段从close改回open后,禁言立即解除,成员马上恢复发言能力,不需要重启、不需要重新登录。由于禁言只在发送消息时实时校验(checkMute不写入任何持久化状态),因此对历史已发、未发消息没有任何回溯影响——它纯粹是一个即时读取的全局配置开关。
设置存储机制
三个开关与系统其他设置一样,存放在数据库settings表中,以name='system'为键、整体以序列化数组形式存储。读写统一走 Base::setting 与 Base::settingFind:前者负责整组读写并在请求上下文中缓存,后者按 key 取单个值。checkMute中使用的是Base::setting('system')一次性读取整组配置,synthesizeData中则用Base::settingFind('system', ...)按需取值,二者读取的是同一份数据。
边界与限制
- 不能临时禁言某个具体用户:三个开关都是全局粒度;如需针对个人,请使用群管理员的踢人、群规则等会话级手段;
- 不能定时禁言:例如「晚上 22 点后禁言」这种时段策略不受支持,因为
checkMute不包含时间条件; - 不影响机器人推送:机器人消息走系统接口直接写入消息表,且
checkMute对bot账号本身豁免,因此禁言不会阻断机器人推送(如 webhook 机器人、系统通知); - 系统管理员永远可发言:无论三个开关如何设置,管理员(
identity含admin的用户)始终不受禁言限制; - 系统群不受个人群禁言控制:部门群、项目群、会议群等系统群永远可发言,若要管控只能通过全员群禁言或其他会话级规则。
常见问题
问:关闭「全员群组禁言」后,普通成员在全员群发言会看到什么?答:后端会抛出「当前会话全员禁言」异常,前端提示后消息不会发出。
问:只关闭「私聊禁言」,群聊还能正常发言吗?答:可以。三个开关相互独立,群聊发言只受user_group_chat_mute与all_group_mute影响。
问:为什么禁言后机器人消息还能收到?答:机器人账号(bot)在checkMute中直接豁免,且机器人推送走系统接口,不经过$sender > 0的禁言判定分支。
问:升级到新版本后all_group_mute行为变了?答:若之前配置过user/all等旧值,迁移脚本会将其转换为close,等价于原来的「全部禁言」语义,属于兼容性收口。
综上,DooTask 的禁言体系是一个「全局开关 + 会话类型路由 + 管理员/机器人豁免」的轻量实现,适合快速实施全员静音或管控私聊与个人群场景;需要更细粒度管控时,应组合使用群管理员踢人、群规则等会话级能力。
- 后端
- 前端
- 协同办公
- 即时通讯
- 企业应用
【免费下载链接】dootask
DooTask是一款开源在线项目任务管理工具,提供各类文档协作工具、在线思维导图、在线流程图、项目管理、任务分发、即时IM,文件管理等工具;同时消息功能使用非对称加密技术让你的沟通更安全。
相关推荐
DooTask 退出群组(退群)完整指南:操作流程、权限规则与源码实现解析
DooTask 退出群组(退群)完整指南:操作流程、权限规则与源码实现解析 「退出群组」(exit)是群成员主动离开群聊的操作,与「被踢」(remove,即群主
后端前端协同办公即时通讯企业应用markdownlint MD013 行长度(Line length)规则完全指南:参数、豁免机制与源码实现
markdownlint MD013 行长度(Line length)规则完全指南:参数、豁免机制与源码实现 本文以 markdownlint 仓库中的规则文档
开发工具代码质量Lint静态分析ComfyUI_IPAdapter_plus中Combine Params节点使用注意事项
ComfyUI_IPAdapter_plus中Combine Params节点使用注意事项 在使用ComfyUI_IPAdapter_plus插件时,用户可能会
即时通讯
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考