You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

237 lines
6.0 KiB
PHP

<?php
namespace App\Http\Controllers\API\Admin;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Lib\Rs;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\Rule;
class SysRoleController extends Controller
{
/**
* 获取角色列表
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function list(Request $request)
{
// 获取查询参数
$roleName = $request->input('role_name', '');
$roleCode = $request->input('role_code', '');
$status = $request->input('status', null);
$page = $request->input('page', 1);
$pageSize = $request->input('page_size', 10);
// 构建查询
$query = DB::table('sys_role')
->where('deleted', 0);
// 添加查询条件
if (!empty($roleName)) {
$query->where('role_name', 'like', '%' . $roleName . '%');
}
if (!empty($roleCode)) {
$query->where('role_code', 'like', '%' . $roleCode . '%');
}
if ($status !== null) {
$query->where('status', $status);
}
// 计算总数
$total = $query->count();
// 分页查询
$roles = $query->orderBy('sort', 'asc')
->orderBy('id', 'asc')
->skip(($page - 1) * $pageSize)
->take($pageSize)
->get();
// 构造返回数据
$data = [
'list' => $roles,
'total' => $total,
'page' => $page,
'page_size' => $pageSize,
'total_pages' => ceil($total / $pageSize)
];
return Rs::success($data);
}
public function Save(Request $request)
{
$data = $request->validate([
'id' => 'required|integer',
'role_name' => 'required|string|max:50',
'role_code' => [
'required',
'string',
'max:50',
Rule::unique('sys_role', 'role_code')->ignore($request->id, 'id'),
],
'status' => 'required|integer|in:0,1',
]);
$conditions = ['id' => $data['id']];
$values = [
'role_name' => $data['role_name'],
'role_code' => $data['role_code'],
'status' => $data['status'],
];
$updated = DB::table('sys_role')->updateOrInsert($conditions, $values);
if ($updated) {
return Rs::success();
}
return Rs::error('操作失败');
}
/**
* 删除角色
* @param Request $request
*/
public function Delete(Request $request)
{
$data = $request->validate([
'id' => 'required|integer',
]);
$deleted = DB::table('sys_role')->where('id', $data['id'])->update(['deleted' => 1]);
if ($deleted) {
return Rs::success();
}
return Rs::error('删除失败');
}
/**
* 获取所有权限,用于角色权限分配
*/
public function getAllPermissions()
{
// 获取所有未删除的权限
$permissions = DB::table('sys_permission')
->where('deleted', 0)
->orderBy('sort', 'asc')
->get();
// 构建权限树
$permissionTree = $this->buildPermissionTree($permissions);
return Rs::success($permissionTree);
}
/**
* 获取所有启用的角色列表(用于用户绑定角色)
*/
public function getRoleList()
{
$roles = DB::table('sys_role')
->where('deleted', 0)
->where('status', 1)
->orderBy('sort', 'asc')
->get();
return Rs::success($roles);
}
/**
* 获取角色已有权限
* @param Request $request
*/
public function getRolePermissions(Request $request)
{
$data = $request->validate([
'role_id' => 'required|integer',
]);
// 获取角色已有的权限ID列表
$permissionIds = DB::table('sys_role_permission')
->where('role_id', $data['role_id'])
->pluck('permission_id')
->toArray();
return Rs::success($permissionIds);
}
/**
* 保存角色权限
* @param Request $request
*/
public function saveRolePermissions(Request $request)
{
$data = $request->validate([
'role_id' => 'required|integer',
'permission_ids' => 'required|array',
]);
// 开启事务
DB::beginTransaction();
try {
// 删除角色原有权限
DB::table('sys_role_permission')
->where('role_id', $data['role_id'])
->delete();
// 添加新的权限关联
$insertData = [];
foreach ($data['permission_ids'] as $permissionId) {
$insertData[] = [
'role_id' => $data['role_id'],
'permission_id' => $permissionId,
'create_time' => now(),
];
}
if (!empty($insertData)) {
DB::table('sys_role_permission')->insert($insertData);
}
// 提交事务
DB::commit();
return Rs::success();
} catch (\Exception $e) {
// 回滚事务
DB::rollBack();
return Rs::error('保存权限失败:' . $e->getMessage());
}
}
/**
* 构建权限树
* @param $permissions
* @param int $parentId
* @return array
*/
private function buildPermissionTree($permissions, $parentId = 0)
{
$tree = [];
foreach ($permissions as $permission) {
if ($permission->parent_id == $parentId) {
$children = $this->buildPermissionTree($permissions, $permission->id);
if (!empty($children)) {
$permission->children = $children;
}
$tree[] = $permission;
}
}
return $tree;
}
}