news 2026/10/16 2:54:48

DooTask 群组与私聊禁言设置全指南:三个开关的粒度、豁免规则与源码实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DooTask 群组与私聊禁言设置全指南:三个开关的粒度、豁免规则与源码实现
  • 后端
  • 前端
  • 协同办公
  • 即时通讯
  • 企业应用

【免费下载链接】dootask

DooTask是一款开源在线项目任务管理工具,提供各类文档协作工具、在线思维导图、在线流程图、项目管理、任务分发、即时IM,文件管理等工具;同时消息功能使用非对称加密技术让你的沟通更安全。

项目地址:https://gitcode.com/gh_mirrors/do/dootask
点击查看免费下载

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); }

从代码结构可以推断出几个关键事实:

  1. 系统群天然不受user_group_chat_mute控制:switch分支只命中group_type=user与group_type=all,而部门群、项目群、会议群等系统群属于group_type=project/task/department等其他类型,直接落入「无提示」分支提前返回,永远可发言(除非被全员群禁言覆盖)。
  2. 错误提示与开关一一对应:被禁言时尝试发消息会收到「个人会话禁言 / 个人群组禁言 / 当前会话全员禁言」三种明确错误,方便定位是被哪个开关拦截。
  3. 豁免判定位于抛错之前:管理员(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,默认不显示禁言标识。

这意味着前端展示与后端校验使用的是同一份系统设置,行为一致。

操作步骤

  1. 进入桌面端「系统设置」→「消息设置」;
  2. 分别在「全员群组禁言」「私聊禁言」「群聊禁言」三个选项中选「开放」或「禁言」;
  3. 点击「提交」保存,立即生效,无需重启服务或重新登录。

后端保存链路与前置条件

「提交」操作对应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,文件管理等工具;同时消息功能使用非对称加密技术让你的沟通更安全。

项目地址:https://gitcode.com/gh_mirrors/do/dootask
点击查看免费下载

相关推荐

上一篇:OpenMed Android Span Parity Protocol:用共享 Fixture 钉死端上 NER 与 Python 参考实现的逐字节一致性
下一篇:AI-Infra-Guard aig-agent-redteam many_shot 算子实战:基于 ICL 顺从示例的多轮上下文越狱变异测试指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/16 2:53:54

微信聊天记录导出完整指南:留痕把对话存成 HTML、Word 和年度报告

微信聊天记录导出完整指南:留痕把对话存成 HTML、Word 和年度报告 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trendi…

作者头像 李华
网站建设 2026/10/16 2:53:53

让 Linux 上的 Claude Code/codex 拿到 Windows 截图的小工具

让 Linux 上的 Claude Code/codex 拿到 Windows 截图的小工具 picopaste 把 Windows 截图送到 Linux 的步骤压缩为一次热键:截图进入剪贴板后按 altshiftv,工具通过已有 SSH 通道上传图片,将远端绝对路径写入剪贴板并注入当前焦点窗口。Linu…

作者头像 李华
网站建设 2026/10/16 2:53:33

免费解锁 WeMod Pro:Wand-Enhancer 完整指南

免费解锁 WeMod Pro:Wand-Enhancer 完整指南 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer 不想交订阅费,也想用上 WeMod …

作者头像 李华
网站建设 2026/10/16 2:53:12

HashMap源码深度解析:从数据结构到扩容机制与性能调优

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华