feat(dialog): 管理员可设置全员群名称

- 后端 group__edit 放开全员群改名(仅系统管理员 admin=1)
- formatData/getGroupName 用 ALL_GROUP_DEFAULT_NAME 哨兵区分"未自定义",
  避免回退逻辑被默认种子名短路导致 i18n 丢失
- 前端 canModifyName/编辑入口对全员群管理员放开,改名请求带 admin=1

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
kuaifan 2026-06-04 20:29:41 +00:00
parent e9ea1adc5d
commit 8e66f0bfb3
5 changed files with 22 additions and 5 deletions

View File

@ -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个字');

View File

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

View File

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

View File

@ -6,7 +6,7 @@
<div class="quick-edit">
<div class="quick-text" :title="dialogData.name">{{dialogData.name}}</div>
<Icon
v-if="isOwnerOrDeputy"
v-if="isOwnerOrDeputy || (dialogData.group_type === 'all' && userIsAdmin)"
class="quick-icon"
type="ios-create-outline"
@click.stop="onEditName"/>

View File

@ -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, {