195 lines
5.5 KiB
PHP
195 lines
5.5 KiB
PHP
<?php
|
|
declare (strict_types = 1);
|
|
|
|
namespace app\admin\controller\v1;
|
|
|
|
use app\admin\exception\InvalidOperateException;
|
|
use app\admin\model\v1\SysRoleAuthorityModel;
|
|
use app\admin\model\v1\SysRoleModel;
|
|
use app\admin\validate\v1\SysRoleValidate;
|
|
|
|
/**
|
|
* 角色管理控制器
|
|
*/
|
|
class Role
|
|
{
|
|
// 角色分页
|
|
public function index()
|
|
{
|
|
$params = request()->get([
|
|
'name',
|
|
'page/d' => 1,
|
|
'size/d' => 10
|
|
]);
|
|
|
|
$roles = SysRoleModel::withoutField([
|
|
'pid',
|
|
'created_at',
|
|
'updated_at',
|
|
'deleted_at'
|
|
])
|
|
->withSearch(['name'], [
|
|
'name' => $params['name']??null
|
|
])
|
|
->order('id', 'desc');
|
|
if (!request()->has('scene')) {
|
|
$roles = $roles->paginate([
|
|
'list_rows' => $params['size'],
|
|
'page' => $params['page']
|
|
]);
|
|
} else if ('all' == request()->get('scene')) {
|
|
$roles = $roles->select();
|
|
}
|
|
|
|
return success('获取成功', $roles);
|
|
}
|
|
|
|
// 角色详情
|
|
public function read()
|
|
{
|
|
$id = request()->param('id');
|
|
|
|
$role = SysRoleModel::withoutField([
|
|
'pid',
|
|
'created_at',
|
|
'updated_at',
|
|
'deleted_at'
|
|
])
|
|
->bypk($id)
|
|
->find();
|
|
if (empty($role)) {
|
|
return error('角色不存在');
|
|
}
|
|
|
|
return success('获取成功', $role);
|
|
}
|
|
|
|
// 角色新增
|
|
public function save()
|
|
{
|
|
$post = request()->post([
|
|
'name',
|
|
'desc',
|
|
// $[*].menu_id
|
|
// $[*].permissions
|
|
'menu_permission'
|
|
]);
|
|
$post['menu_permission'] = json_decode($post['menu_permission'], true);
|
|
|
|
$validate = new SysRoleValidate;
|
|
if (!$validate->scene('create')->check($post)) {
|
|
return error($validate->getError());
|
|
}
|
|
|
|
SysRoleModel::startTrans();
|
|
try {
|
|
$role = SysRoleModel::create($post, ['name', 'desc']);
|
|
if ($role->isEmpty()) {
|
|
throw new InvalidOperateException('角色新增失败');
|
|
}
|
|
|
|
$permissions = [];
|
|
foreach ($post['menu_permission'] as $menu) {
|
|
$permissions[] = [
|
|
'role_id' => $role->id,
|
|
'menu_id' => $menu['menu_id'],
|
|
'permission' => array_reduce($menu['permission'], function($v1, $v2) {
|
|
return $v1 | $v2;
|
|
})
|
|
];
|
|
}
|
|
$authority = (new SysRoleAuthorityModel)->saveAll($permissions);
|
|
if ($authority->isEmpty()) {
|
|
throw new InvalidOperateException('角色权限新增失败');
|
|
}
|
|
|
|
SysRoleModel::commit();
|
|
} catch (InvalidOperateException $e) {
|
|
SysRoleModel::rollback();
|
|
return error($e->getMessage());
|
|
} catch (\Throwable $th) {
|
|
SysRoleModel::rollback();
|
|
return error('操作失败');
|
|
}
|
|
|
|
return success('操作成功');
|
|
}
|
|
|
|
// 角色更新
|
|
public function update()
|
|
{
|
|
$id = request()->param('id');
|
|
$put = request()->put([
|
|
'name',
|
|
'desc',
|
|
// $[*].menu_id
|
|
// $[*].permissions
|
|
'menu_permission'
|
|
]);
|
|
$put['menu_permission'] = json_decode($put['menu_permission'], true);
|
|
|
|
$validate = new SysRoleValidate;
|
|
if (!$validate->scene('update')->check($put)) {
|
|
return error($validate->getError());
|
|
}
|
|
|
|
SysRoleModel::startTrans();
|
|
try {
|
|
$role = SysRoleModel::bypk($id)->find();
|
|
if (empty($rule)) {
|
|
throw new InvalidOperateException('角色不存在');
|
|
}
|
|
|
|
if (!$role->allowField(['name', 'desc'])->save($put)) {
|
|
throw new InvalidOperateException('角色更新失败');
|
|
}
|
|
|
|
$permissions = [];
|
|
foreach ($put['menu_permission'] as $menu) {
|
|
$permissions[] = [
|
|
'role_id' => $role->id,
|
|
'menu_id' => $menu['menu_id'],
|
|
'permission' => array_reduce($menu['permission'], function($v1, $v2) {
|
|
return $v1 | $v2;
|
|
})
|
|
];
|
|
}
|
|
|
|
SysRoleAuthorityModel::destroy(function($query) use ($role) {
|
|
$query->roleId($role->id);
|
|
});
|
|
$authority = (new SysRoleAuthorityModel)->saveAll($permissions);
|
|
if ($authority->isEmpty()) {
|
|
throw new InvalidOperateException('角色权限更新失败');
|
|
}
|
|
|
|
SysRoleModel::commit();
|
|
} catch (InvalidOperateException $e) {
|
|
SysRoleModel::rollback();
|
|
return error($e->getMessage());
|
|
} catch (\Throwable $th) {
|
|
SysRoleModel::rollback();
|
|
return error('操作失败');
|
|
}
|
|
|
|
return success('操作成功');
|
|
}
|
|
|
|
// 角色删除
|
|
public function delete()
|
|
{
|
|
$id = request()->param('id');
|
|
|
|
$role = SysRoleModel::bypk($id)->find();
|
|
if (empty($role)) {
|
|
return error('请确认要操作对象是否存在');
|
|
}
|
|
|
|
if (!$role->delete()) {
|
|
return error('操作失败');
|
|
}
|
|
|
|
return success('操作成功');
|
|
}
|
|
}
|