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.

196 lines
5.5 KiB
PHP

<?php
namespace App\Http\Controllers\API\Admin;
use App\Http\Controllers\Controller;
use App\Lib\Rs;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class SysPermissionController extends Controller
{
/**
* 获取权限列表
*/
public function list(Request $request)
{
$params = $request->all();
$page = $params['page'] ?? 1;
$pageSize = $params['page_size'] ?? 10;
$offset = ($page - 1) * $pageSize;
$query = DB::table('sys_permission')
->where('deleted', 0);
// 搜索条件
if (!empty($params['permission_name'])) {
$query->where('permission_name', 'like', '%' . $params['permission_name'] . '%');
}
if (!empty($params['permission_code'])) {
$query->where('permission_code', 'like', '%' . $params['permission_code'] . '%');
}
if (isset($params['type']) && $params['type'] !== '') {
$query->where('type', $params['type']);
}
if (isset($params['status']) && $params['status'] !== '') {
$query->where('status', $params['status']);
}
$total = $query->count();
$list = $query
->orderBy('sort', 'asc')
->orderBy('id', 'asc')
->offset($offset)
->limit($pageSize)
->get();
return Rs::success([
'list' => $list,
'total' => $total
]);
}
/**
* 保存权限
*/
public function Save(Request $request)
{
$data = $request->all();
// 验证必填字段
if (empty($data['permission_name'])) {
return Rs::error('权限名称不能为空');
}
if (empty($data['permission_code'])) {
return Rs::error('权限编码不能为空');
}
if (empty($data['type'])) {
return Rs::error('权限类型不能为空');
}
if (empty($data['parent_id'])) {
$data['parent_id']=0;
}
// 检查权限编码是否已存在
$exists = DB::table('sys_permission')
->where('permission_code', $data['permission_code'])
->where('deleted', 0);
if (isset($data['id']) && $data['id'] > 0) {
$exists->where('id', '<>', $data['id']);
}
if ($exists->exists()) {
return Rs::error('权限编码已存在');
}
try {
if (isset($data['id']) && $data['id'] > 0) {
// 更新
$id = $data['id'];
unset($data['id']);
$data['update_time'] = date('Y-m-d H:i:s');
DB::table('sys_permission')
->where('id', $id)
->update($data);
} else {
// 新增
$data['create_time'] = date('Y-m-d H:i:s');
$data['update_time'] = date('Y-m-d H:i:s');
$data['deleted'] = 0;
$id = DB::table('sys_permission')->insertGetId($data);
}
return Rs::success(['id' => $id]);
} catch (\Exception $e) {
return Rs::error('保存失败:' . $e->getMessage());
}
}
/**
* 删除权限
*/
public function Delete(Request $request)
{
$id = $request->input('id');
if (empty($id)) {
return Rs::error('ID不能为空');
}
try {
// 检查是否有子权限
$hasChildren = DB::table('sys_permission')
->where('parent_id', $id)
->where('deleted', 0)
->exists();
if ($hasChildren) {
return Rs::error('该权限下存在子权限,无法删除');
}
// 软删除
DB::table('sys_permission')
->where('id', $id)
->update([
'deleted' => 1,
'update_time' => date('Y-m-d H:i:s')
]);
// 删除角色权限关联
DB::table('sys_role_permission')
->where('permission_id', $id)
->delete();
return Rs::success();
} catch (\Exception $e) {
return Rs::error('删除失败:' . $e->getMessage());
}
}
/**
* 获取权限树
*/
public function getPermissionTree()
{
$permissions = DB::table('sys_permission')
->where('deleted', 0)
->orderBy('sort', 'asc')
->orderBy('id', 'asc')
->get();
$permissionTree = $this->buildPermissionTree($permissions);
return Rs::success($permissionTree);
}
/**
* 构建权限树
*/
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;
}
/**
* 获取所有权限(不分页,用于角色绑定)
*/
public function getAllPermissions()
{
$permissions = DB::table('sys_permission')
->where('deleted', 0)
->orderBy('sort', 'asc')
->orderBy('id', 'asc')
->get();
return Rs::success($permissions);
}
}