1.修复角色组不能选择权限的报错
2.修复角色创建子角色报权限不够的问题
This commit is contained in:
@@ -253,28 +253,20 @@ class Admin extends Backend
|
||||
if (!$data) {
|
||||
return $this->error(__('Parameter %s can not be empty', ['']));
|
||||
}
|
||||
$data = $this->normalizeSingleGroup($data);
|
||||
if (!$this->hasSingleGroup($data['group_arr'] ?? null)) {
|
||||
return $this->error(__('Please select exactly one role group'));
|
||||
$isSelfEdit = (int) $this->auth->id === (int) $id;
|
||||
if ($isSelfEdit) {
|
||||
unset($data['group_arr'], $data['group_name_arr']);
|
||||
}
|
||||
|
||||
$postedGroups = array_map('intval', $data['group_arr'] ?? []);
|
||||
$rowGroups = array_map('intval', $row->group_arr ?? []);
|
||||
sort($postedGroups);
|
||||
sort($rowGroups);
|
||||
|
||||
// 当前管理员编辑自身时,不允许修改角色组
|
||||
if ((int)$this->auth->id === (int)$id) {
|
||||
$postedGroups = $data['group_arr'] ?? [];
|
||||
if (!is_array($postedGroups)) {
|
||||
$postedGroups = [];
|
||||
}
|
||||
$originGroups = $row->group_arr ?? [];
|
||||
sort($postedGroups);
|
||||
sort($originGroups);
|
||||
if ($postedGroups !== $originGroups) {
|
||||
return $this->error(__('You cannot modify your own management group!'));
|
||||
$editGroupArr = null;
|
||||
if (array_key_exists('group_arr', $data)) {
|
||||
$data = $this->normalizeSingleGroup($data);
|
||||
if (!$this->hasSingleGroup($data['group_arr'] ?? null)) {
|
||||
return $this->error(__('Please select exactly one role group'));
|
||||
}
|
||||
$editGroupArr = $data['group_arr'];
|
||||
} elseif (!$isSelfEdit) {
|
||||
return $this->error(__('Please select exactly one role group'));
|
||||
}
|
||||
|
||||
if ($this->modelValidate) {
|
||||
@@ -285,8 +277,10 @@ class Admin extends Backend
|
||||
'password' => 'nullable|string|regex:/^(?!.*[&<>"\'\n\r]).{6,32}$/',
|
||||
'email' => 'email|unique:admin,email,' . $id,
|
||||
'mobile' => 'regex:/^1[3-9]\d{9}$/|unique:admin,mobile,' . $id,
|
||||
'group_arr' => 'required|array',
|
||||
];
|
||||
if (array_key_exists('group_arr', $data)) {
|
||||
$rules['group_arr'] = 'required|array';
|
||||
}
|
||||
$messages = [
|
||||
'username.regex' => __('Please input correct username'),
|
||||
'password.regex' => __('Please input correct password'),
|
||||
@@ -306,10 +300,10 @@ class Admin extends Backend
|
||||
}
|
||||
|
||||
$groupAccess = [];
|
||||
if (!empty($data['group_arr'])) {
|
||||
if (!$isSelfEdit && !empty($editGroupArr)) {
|
||||
$checkGroups = [];
|
||||
$rowGroupArr = $row->group_arr ?? [];
|
||||
foreach ($data['group_arr'] as $datum) {
|
||||
foreach ($editGroupArr as $datum) {
|
||||
if (!in_array($datum, $rowGroupArr)) {
|
||||
$checkGroups[] = $datum;
|
||||
}
|
||||
@@ -323,32 +317,36 @@ class Admin extends Backend
|
||||
}
|
||||
|
||||
$data = $this->excludeFields($data);
|
||||
unset($data['invite_code']);
|
||||
$creatorChannelId = $this->getCreatorChannelId();
|
||||
$groupChannelId = $this->resolveChannelIdFromPrimaryGroup($data['group_arr'] ?? []);
|
||||
if (!$this->auth->isSuperAdmin()) {
|
||||
if ($creatorChannelId === null || $creatorChannelId === '') {
|
||||
return $this->error(__('You have no permission'));
|
||||
unset($data['invite_code'], $data['group_arr'], $data['group_name_arr']);
|
||||
if (!$isSelfEdit && $editGroupArr !== null) {
|
||||
$creatorChannelId = $this->getCreatorChannelId();
|
||||
$groupChannelId = $this->resolveChannelIdFromPrimaryGroup($editGroupArr);
|
||||
if (!$this->auth->isSuperAdmin()) {
|
||||
if ($creatorChannelId === null || $creatorChannelId === '') {
|
||||
return $this->error(__('You have no permission'));
|
||||
}
|
||||
if ($groupChannelId === null || $groupChannelId === '') {
|
||||
return $this->error(__('Selected role group is not bound to a channel'));
|
||||
}
|
||||
if ((string) $groupChannelId !== (string) $creatorChannelId) {
|
||||
return $this->error(__('Selected role group channel does not match current account'));
|
||||
}
|
||||
$data['channel_id'] = $creatorChannelId;
|
||||
} else {
|
||||
$data['channel_id'] = ($groupChannelId === null || $groupChannelId === '') ? null : $groupChannelId;
|
||||
}
|
||||
if ($groupChannelId === null || $groupChannelId === '') {
|
||||
return $this->error(__('Selected role group is not bound to a channel'));
|
||||
}
|
||||
if ((string) $groupChannelId !== (string) $creatorChannelId) {
|
||||
return $this->error(__('Selected role group channel does not match current account'));
|
||||
}
|
||||
$data['channel_id'] = $creatorChannelId;
|
||||
} else {
|
||||
$data['channel_id'] = ($groupChannelId === null || $groupChannelId === '') ? null : $groupChannelId;
|
||||
}
|
||||
$result = false;
|
||||
$this->model->startTrans();
|
||||
try {
|
||||
$result = $row->save($data);
|
||||
Db::name('admin_group_access')
|
||||
->where('uid', $id)
|
||||
->delete();
|
||||
if ($groupAccess) {
|
||||
Db::name('admin_group_access')->insertAll($groupAccess);
|
||||
if (!$isSelfEdit) {
|
||||
Db::name('admin_group_access')
|
||||
->where('uid', $id)
|
||||
->delete();
|
||||
if ($groupAccess) {
|
||||
Db::name('admin_group_access')->insertAll($groupAccess);
|
||||
}
|
||||
}
|
||||
$this->model->commit();
|
||||
} catch (Throwable $e) {
|
||||
|
||||
Reference in New Issue
Block a user