From 8e66f0bfb35a22d7cbef601556c4b5f86f681c30 Mon Sep 17 00:00:00 2001 From: kuaifan Date: Thu, 4 Jun 2026 20:29:41 +0000 Subject: [PATCH] =?UTF-8?q?feat(dialog):=20=E7=AE=A1=E7=90=86=E5=91=98?= =?UTF-8?q?=E5=8F=AF=E8=AE=BE=E7=BD=AE=E5=85=A8=E5=91=98=E7=BE=A4=E5=90=8D?= =?UTF-8?q?=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 后端 group__edit 放开全员群改名(仅系统管理员 admin=1) - formatData/getGroupName 用 ALL_GROUP_DEFAULT_NAME 哨兵区分"未自定义", 避免回退逻辑被默认种子名短路导致 i18n 丢失 - 前端 canModifyName/编辑入口对全员群管理员放开,改名请求带 admin=1 Co-Authored-By: Claude Opus 4.8 --- app/Http/Controllers/Api/DialogController.php | 4 +++- app/Models/WebSocketDialog.php | 11 +++++++++-- database/seeders/WebSocketDialogsTableSeeder.php | 2 +- .../js/pages/manage/components/DialogGroupInfo.vue | 2 +- .../js/pages/manage/components/DialogWrapper.vue | 8 ++++++++ 5 files changed, 22 insertions(+), 5 deletions(-) diff --git a/app/Http/Controllers/Api/DialogController.php b/app/Http/Controllers/Api/DialogController.php index 46b84cad8..b7aba7f99 100755 --- a/app/Http/Controllers/Api/DialogController.php +++ b/app/Http/Controllers/Api/DialogController.php @@ -2916,7 +2916,9 @@ class DialogController extends AbstractController $data['avatar'] = Base::fillUrl($array['avatar'] = $avatar); } $existName = Request::exists('chat_name') || Request::exists('name'); - if ($existName && $dialog->group_type === 'user') { + // 个人群组群主可改名;全员群仅系统管理员可改名 + $canEditName = $dialog->group_type === 'user' || ($dialog->group_type === 'all' && $admin === 1); + if ($existName && $canEditName) { $chatName = trim(Request::input('chat_name') ?: Request::input('name')); if (mb_strlen($chatName) < 2) { return Base::retError('群名称至少2个字'); diff --git a/app/Models/WebSocketDialog.php b/app/Models/WebSocketDialog.php index 34a73b6f7..d390692ea 100644 --- a/app/Models/WebSocketDialog.php +++ b/app/Models/WebSocketDialog.php @@ -62,6 +62,9 @@ class WebSocketDialog extends AbstractModel { use SoftDeletes; + // 全员群初始化默认名称(双语字面量),用于识别"管理员尚未自定义"的状态 + const ALL_GROUP_DEFAULT_NAME = '全体成员 All members'; + protected $appends = ['deputy_ids']; /** @@ -366,7 +369,9 @@ class WebSocketDialog extends AbstractModel } break; case 'all': - $data['name'] = Doo::translate('全体成员'); + $data['name'] = ($data['name'] && $data['name'] !== self::ALL_GROUP_DEFAULT_NAME) + ? $data['name'] + : Doo::translate('全体成员'); $data['dialog_mute'] = Base::settingFind('system', 'all_group_mute'); break; } @@ -824,7 +829,9 @@ class WebSocketDialog extends AbstractModel $name = \DB::table('project_tasks')->where('dialog_id', $this->id)->value('name'); break; case 'all': - $name = Doo::translate('全体成员'); + $name = ($name && $name !== self::ALL_GROUP_DEFAULT_NAME) + ? $name + : Doo::translate('全体成员'); break; } } diff --git a/database/seeders/WebSocketDialogsTableSeeder.php b/database/seeders/WebSocketDialogsTableSeeder.php index 67592178e..6f1c6a268 100644 --- a/database/seeders/WebSocketDialogsTableSeeder.php +++ b/database/seeders/WebSocketDialogsTableSeeder.php @@ -218,6 +218,6 @@ class WebSocketDialogsTableSeeder extends Seeder User::botGetOrCreate('ai-claude'); $userids = User::whereBot(0)->whereNull('disable_at')->pluck('userid')->toArray(); - WebSocketDialog::createGroup("全体成员 All members", $userids, 'all'); + WebSocketDialog::createGroup(WebSocketDialog::ALL_GROUP_DEFAULT_NAME, $userids, 'all'); } } diff --git a/resources/assets/js/pages/manage/components/DialogGroupInfo.vue b/resources/assets/js/pages/manage/components/DialogGroupInfo.vue index a7515fb7f..db6d53680 100644 --- a/resources/assets/js/pages/manage/components/DialogGroupInfo.vue +++ b/resources/assets/js/pages/manage/components/DialogGroupInfo.vue @@ -6,7 +6,7 @@
{{dialogData.name}}
diff --git a/resources/assets/js/pages/manage/components/DialogWrapper.vue b/resources/assets/js/pages/manage/components/DialogWrapper.vue index c432c0e5e..85c9b89ab 100644 --- a/resources/assets/js/pages/manage/components/DialogWrapper.vue +++ b/resources/assets/js/pages/manage/components/DialogWrapper.vue @@ -1028,6 +1028,10 @@ export default { if (this.modifyData.userid) { return true } + if (this.dialogData.group_type === 'all') { + // 全员群仅系统管理员可改名 + return this.userIsAdmin + } return this.dialogData.group_type === 'user' }, @@ -2873,6 +2877,10 @@ export default { avatar: this.dialogData.avatar, name: this.dialogData.name } + if (this.dialogData.group_type === 'all') { + // 全员群走系统管理员权限校验 + this.modifyData.admin = 1 + } if (this.dialogData.type === 'user') { // 机器人 this.modifyData = Object.assign(this.modifyData, {