188 lines
5.4 KiB
PHP
188 lines
5.4 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\Permission;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Validator;
|
|
|
|
class PermissionController extends Controller
|
|
{
|
|
/**
|
|
* 权限列表(按分组)
|
|
*/
|
|
public function index(Request $request)
|
|
{
|
|
$query = Permission::query();
|
|
|
|
if ($request->filled('group')) {
|
|
$query->where('group_name', $request->group);
|
|
}
|
|
|
|
if ($request->filled('keyword')) {
|
|
$query->where('name', 'like', "%{$request->keyword}%");
|
|
}
|
|
|
|
$permissions = $query->orderBy('group_name')->orderBy('sort')->get();
|
|
|
|
// 按分组组织
|
|
$grouped = $permissions->groupBy('group_name')->map(fn($items) => $items->map(fn($p) => [
|
|
'id' => $p->id,
|
|
'name' => $p->name,
|
|
'code' => $p->slug,
|
|
'description' => $p->description,
|
|
]));
|
|
|
|
// 扁平列表
|
|
$list = $permissions->map(fn($p) => [
|
|
'id' => $p->id,
|
|
'name' => $p->name,
|
|
'code' => $p->slug,
|
|
'group' => $p->group_name,
|
|
'description' => $p->description,
|
|
]);
|
|
|
|
return response()->json([
|
|
'code' => 200,
|
|
'data' => [
|
|
'list' => $list,
|
|
'grouped' => $grouped,
|
|
],
|
|
'message' => 'success',
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* 创建权限
|
|
*/
|
|
public function store(Request $request)
|
|
{
|
|
$validator = Validator::make($request->all(), [
|
|
'name' => 'required|string|max:255',
|
|
'code' => 'required|string|max:100|unique:permissions,slug|regex:/^[a-z.]+$/',
|
|
'group' => 'required|string|max:100',
|
|
'description' => 'nullable|string|max:500',
|
|
'sort' => 'nullable|integer|min:0',
|
|
]);
|
|
|
|
if ($validator->fails()) {
|
|
return response()->json(['code' => 422, 'message' => '验证失败', 'errors' => $validator->errors()], 422);
|
|
}
|
|
|
|
$permission = Permission::create([
|
|
'name' => $request->name,
|
|
'slug' => $request->code,
|
|
'group_name' => $request->group,
|
|
'description' => $request->description,
|
|
'sort' => $request->sort ?? 0,
|
|
]);
|
|
|
|
return response()->json([
|
|
'code' => 200,
|
|
'data' => $permission,
|
|
'message' => '权限创建成功',
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* 更新权限
|
|
*/
|
|
public function update(Request $request, string $id)
|
|
{
|
|
$permission = Permission::find($id);
|
|
if (!$permission) {
|
|
return response()->json(['code' => 404, 'message' => '权限不存在'], 404);
|
|
}
|
|
|
|
$validator = Validator::make($request->all(), [
|
|
'name' => 'sometimes|string|max:255',
|
|
'group' => 'sometimes|string|max:100',
|
|
'description' => 'nullable|string|max:500',
|
|
'sort' => 'nullable|integer|min:0',
|
|
]);
|
|
|
|
if ($validator->fails()) {
|
|
return response()->json(['code' => 422, 'message' => '验证失败', 'errors' => $validator->errors()], 422);
|
|
}
|
|
|
|
$permission->update($request->only(['name', 'group_name', 'description', 'sort']));
|
|
|
|
return response()->json([
|
|
'code' => 200,
|
|
'data' => $permission,
|
|
'message' => '权限更新成功',
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* 删除权限
|
|
*/
|
|
public function destroy(string $id)
|
|
{
|
|
$permission = Permission::find($id);
|
|
if (!$permission) {
|
|
return response()->json(['code' => 404, 'message' => '权限不存在'], 404);
|
|
}
|
|
|
|
$permission->roles()->detach();
|
|
$permission->delete();
|
|
|
|
return response()->json(['code' => 200, 'message' => '删除成功']);
|
|
}
|
|
|
|
/**
|
|
* 获取所有分组
|
|
*/
|
|
public function groups()
|
|
{
|
|
$groups = Permission::select('group_name')
|
|
->distinct()
|
|
->whereNotNull('group_name')
|
|
->orderBy('group_name')
|
|
->pluck('group_name');
|
|
|
|
return response()->json([
|
|
'code' => 200,
|
|
'data' => $groups,
|
|
'message' => 'success',
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* 批量创建权限
|
|
*/
|
|
public function batchStore(Request $request)
|
|
{
|
|
$validator = Validator::make($request->all(), [
|
|
'permissions' => 'required|array',
|
|
'permissions.*.name' => 'required|string',
|
|
'permissions.*.code' => 'required|string',
|
|
'permissions.*.group' => 'required|string',
|
|
]);
|
|
|
|
if ($validator->fails()) {
|
|
return response()->json(['code' => 422, 'message' => '验证失败', 'errors' => $validator->errors()], 422);
|
|
}
|
|
|
|
$created = 0;
|
|
foreach ($request->permissions as $perm) {
|
|
if (!Permission::where('slug', $perm['code'])->exists()) {
|
|
Permission::create([
|
|
'name' => $perm['name'],
|
|
'slug' => $perm['code'],
|
|
'group_name' => $perm['group'],
|
|
'description' => $perm['description'] ?? null,
|
|
'sort' => $perm['sort'] ?? 0,
|
|
]);
|
|
$created++;
|
|
}
|
|
}
|
|
|
|
return response()->json([
|
|
'code' => 200,
|
|
'data' => ['created' => $created],
|
|
'message' => "成功创建 {$created} 个权限",
|
|
]);
|
|
}
|
|
}
|