初始化项目
This commit is contained in:
184
app/Http/Controllers/Auth/Admin/Auth.php
Normal file
184
app/Http/Controllers/Auth/Admin/Auth.php
Normal file
@@ -0,0 +1,184 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Auth\Admin;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Services\Auth\AuthService;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Validation\ValidationException;
|
||||
use Exception;
|
||||
|
||||
class Auth extends Controller
|
||||
{
|
||||
protected $authService;
|
||||
|
||||
public function __construct(AuthService $authService)
|
||||
{
|
||||
$this->authService = $authService;
|
||||
}
|
||||
|
||||
/**
|
||||
* 管理员登录
|
||||
*/
|
||||
public function login(Request $request)
|
||||
{
|
||||
try {
|
||||
$validated = $request->validate([
|
||||
'username' => 'required|string',
|
||||
'password' => 'required|string',
|
||||
]);
|
||||
|
||||
$result = $this->authService->login($validated);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '登录成功',
|
||||
'data' => $result,
|
||||
]);
|
||||
} catch (ValidationException $e) {
|
||||
return response()->json([
|
||||
'code' => 422,
|
||||
'message' => $e->getMessage(),
|
||||
'data' => $e->errors(),
|
||||
], 422);
|
||||
} catch (Exception $e) {
|
||||
return response()->json([
|
||||
'code' => 500,
|
||||
'message' => '登录失败:' . $e->getMessage(),
|
||||
'data' => null,
|
||||
], 500);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 管理员登出
|
||||
*/
|
||||
public function logout(Request $request)
|
||||
{
|
||||
try {
|
||||
$this->authService->logout();
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '登出成功',
|
||||
'data' => null,
|
||||
]);
|
||||
} catch (Exception $e) {
|
||||
return response()->json([
|
||||
'code' => 500,
|
||||
'message' => '登出失败:' . $e->getMessage(),
|
||||
'data' => null,
|
||||
], 500);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 刷新token
|
||||
*/
|
||||
public function refresh(Request $request)
|
||||
{
|
||||
try {
|
||||
$result = $this->authService->refresh();
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '刷新成功',
|
||||
'data' => $result,
|
||||
]);
|
||||
} catch (Exception $e) {
|
||||
return response()->json([
|
||||
'code' => 401,
|
||||
'message' => 'Token无效或已过期',
|
||||
'data' => null,
|
||||
], 401);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前用户信息
|
||||
*/
|
||||
public function me(Request $request)
|
||||
{
|
||||
try {
|
||||
$result = $this->authService->me();
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $result,
|
||||
]);
|
||||
} catch (Exception $e) {
|
||||
return response()->json([
|
||||
'code' => 401,
|
||||
'message' => '未登录或token已过期',
|
||||
'data' => null,
|
||||
], 401);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 找回密码
|
||||
*/
|
||||
public function resetPassword(Request $request)
|
||||
{
|
||||
try {
|
||||
$validated = $request->validate([
|
||||
'username' => 'required|string',
|
||||
'password' => 'required|string|min:6|confirmed',
|
||||
]);
|
||||
|
||||
$this->authService->resetPassword($validated);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '密码重置成功',
|
||||
'data' => null,
|
||||
]);
|
||||
} catch (ValidationException $e) {
|
||||
return response()->json([
|
||||
'code' => 422,
|
||||
'message' => $e->getMessage(),
|
||||
'data' => $e->errors(),
|
||||
], 422);
|
||||
} catch (Exception $e) {
|
||||
return response()->json([
|
||||
'code' => 500,
|
||||
'message' => '密码重置失败:' . $e->getMessage(),
|
||||
'data' => null,
|
||||
], 500);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改密码
|
||||
*/
|
||||
public function changePassword(Request $request)
|
||||
{
|
||||
try {
|
||||
$validated = $request->validate([
|
||||
'old_password' => 'required|string',
|
||||
'password' => 'required|string|min:6|confirmed',
|
||||
]);
|
||||
|
||||
$this->authService->changePassword($validated);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '密码修改成功',
|
||||
'data' => null,
|
||||
]);
|
||||
} catch (ValidationException $e) {
|
||||
return response()->json([
|
||||
'code' => 422,
|
||||
'message' => $e->getMessage(),
|
||||
'data' => $e->errors(),
|
||||
], 422);
|
||||
} catch (Exception $e) {
|
||||
return response()->json([
|
||||
'code' => 500,
|
||||
'message' => '密码修改失败:' . $e->getMessage(),
|
||||
'data' => null,
|
||||
], 500);
|
||||
}
|
||||
}
|
||||
}
|
||||
228
app/Http/Controllers/Auth/Admin/Department.php
Normal file
228
app/Http/Controllers/Auth/Admin/Department.php
Normal file
@@ -0,0 +1,228 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Auth\Admin;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Services\Auth\DepartmentService;
|
||||
use App\Services\Auth\ImportExportService;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class Department extends Controller
|
||||
{
|
||||
protected $departmentService;
|
||||
protected $importExportService;
|
||||
|
||||
public function __construct(
|
||||
DepartmentService $departmentService,
|
||||
ImportExportService $importExportService
|
||||
) {
|
||||
$this->departmentService = $departmentService;
|
||||
$this->importExportService = $importExportService;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取部门列表
|
||||
*/
|
||||
public function index(Request $request)
|
||||
{
|
||||
$params = $request->all();
|
||||
$result = $this->departmentService->getList($params);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $result,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取部门树
|
||||
*/
|
||||
public function tree()
|
||||
{
|
||||
$result = $this->departmentService->getTree();
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => ['tree' => $result],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取所有部门(不分页)
|
||||
*/
|
||||
public function getAll()
|
||||
{
|
||||
$result = $this->departmentService->getAll();
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => ['list' => $result],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取部门详情
|
||||
*/
|
||||
public function show($id)
|
||||
{
|
||||
$result = $this->departmentService->getById($id);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $result,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建部门
|
||||
*/
|
||||
public function store(Request $request)
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'name' => 'required|string|max:50',
|
||||
'parent_id' => 'nullable|integer|exists:auth_departments,id',
|
||||
'leader' => 'nullable|string|max:50',
|
||||
'phone' => 'nullable|string|max:20',
|
||||
'sort' => 'nullable|integer|min:0',
|
||||
'status' => 'nullable|integer|in:0,1',
|
||||
]);
|
||||
|
||||
$result = $this->departmentService->create($validated);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '创建成功',
|
||||
'data' => ['id' => $result->id],
|
||||
], 201);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新部门
|
||||
*/
|
||||
public function update(Request $request, $id)
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'name' => 'nullable|string|max:50',
|
||||
'parent_id' => 'nullable|integer|exists:auth_departments,id',
|
||||
'leader' => 'nullable|string|max:50',
|
||||
'phone' => 'nullable|string|max:20',
|
||||
'sort' => 'nullable|integer|min:0',
|
||||
'status' => 'nullable|integer|in:0,1',
|
||||
]);
|
||||
|
||||
$result = $this->departmentService->update($id, $validated);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '更新成功',
|
||||
'data' => ['id' => $result->id],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除部门
|
||||
*/
|
||||
public function destroy($id)
|
||||
{
|
||||
$this->departmentService->delete($id);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '删除成功',
|
||||
'data' => null,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量删除部门
|
||||
*/
|
||||
public function batchDelete(Request $request)
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'ids' => 'required|array',
|
||||
'ids.*' => 'integer',
|
||||
]);
|
||||
|
||||
$count = $this->departmentService->batchDelete($validated['ids']);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => "成功删除 {$count} 条数据",
|
||||
'data' => ['count' => $count],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量更新部门状态
|
||||
*/
|
||||
public function batchUpdateStatus(Request $request)
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'ids' => 'required|array',
|
||||
'ids.*' => 'integer',
|
||||
'status' => 'required|integer|in:0,1',
|
||||
]);
|
||||
|
||||
$count = $this->departmentService->batchUpdateStatus($validated['ids'], $validated['status']);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => "成功更新 {$count} 条数据",
|
||||
'data' => ['count' => $count],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出部门
|
||||
*/
|
||||
public function export(Request $request)
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'ids' => 'nullable|array',
|
||||
'ids.*' => 'integer',
|
||||
]);
|
||||
|
||||
$filename = $this->importExportService->exportDepartments($validated['ids'] ?? []);
|
||||
|
||||
$filePath = $this->importExportService->getExportFilePath($filename);
|
||||
|
||||
return response()->download($filePath, $filename)->deleteFileAfterSend();
|
||||
}
|
||||
|
||||
/**
|
||||
* 导入部门
|
||||
*/
|
||||
public function import(Request $request)
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'file' => 'required|file|mimes:xlsx,xls',
|
||||
]);
|
||||
|
||||
$file = $request->file('file');
|
||||
$realPath = $file->getRealPath();
|
||||
$filename = $file->getClientOriginalName();
|
||||
|
||||
$result = $this->importExportService->importDepartments($filename, $realPath);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => "导入完成,成功 {$result['success_count']} 条,失败 {$result['error_count']} 条",
|
||||
'data' => $result,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 下载部门导入模板
|
||||
*/
|
||||
public function downloadTemplate()
|
||||
{
|
||||
$filename = $this->importExportService->downloadDepartmentTemplate();
|
||||
$filePath = $this->importExportService->getExportFilePath($filename);
|
||||
|
||||
return response()->download($filePath, $filename)->deleteFileAfterSend();
|
||||
}
|
||||
}
|
||||
182
app/Http/Controllers/Auth/Admin/Permission.php
Normal file
182
app/Http/Controllers/Auth/Admin/Permission.php
Normal file
@@ -0,0 +1,182 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Auth\Admin;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Services\Auth\PermissionService;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class Permission extends Controller
|
||||
{
|
||||
protected $permissionService;
|
||||
|
||||
public function __construct(PermissionService $permissionService)
|
||||
{
|
||||
$this->permissionService = $permissionService;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取权限列表
|
||||
*/
|
||||
public function index(Request $request)
|
||||
{
|
||||
$params = $request->all();
|
||||
$result = $this->permissionService->getList($params);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $result,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取权限树
|
||||
*/
|
||||
public function tree(Request $request)
|
||||
{
|
||||
$params = $request->all();
|
||||
$result = $this->permissionService->getTree($params);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => ['tree' => $result],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取菜单树
|
||||
*/
|
||||
public function menu(Request $request)
|
||||
{
|
||||
$result = $this->permissionService->getMenuTree();
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => ['tree' => $result],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取权限详情
|
||||
*/
|
||||
public function show($id)
|
||||
{
|
||||
$result = $this->permissionService->getById($id);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $result,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建权限
|
||||
*/
|
||||
public function store(Request $request)
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'name' => 'required|string|max:50',
|
||||
'code' => 'required|string|max:100|unique:auth_permissions,code',
|
||||
'type' => 'required|in:menu,api,button',
|
||||
'route' => 'nullable|string|max:200',
|
||||
'component' => 'nullable|string|max:200',
|
||||
'icon' => 'nullable|string|max:50',
|
||||
'parent_id' => 'nullable|integer|exists:auth_permissions,id',
|
||||
'sort' => 'nullable|integer|min:0',
|
||||
'status' => 'nullable|integer|in:0,1',
|
||||
'meta' => 'nullable|array',
|
||||
]);
|
||||
|
||||
$result = $this->permissionService->create($validated);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '创建成功',
|
||||
'data' => ['id' => $result->id],
|
||||
], 201);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新权限
|
||||
*/
|
||||
public function update(Request $request, $id)
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'name' => 'nullable|string|max:50',
|
||||
'code' => 'nullable|string|max:100|unique:auth_permissions,code,' . $id,
|
||||
'type' => 'nullable|in:menu,api,button',
|
||||
'route' => 'nullable|string|max:200',
|
||||
'component' => 'nullable|string|max:200',
|
||||
'icon' => 'nullable|string|max:50',
|
||||
'parent_id' => 'nullable|integer|exists:auth_permissions,id',
|
||||
'sort' => 'nullable|integer|min:0',
|
||||
'status' => 'nullable|integer|in:0,1',
|
||||
'meta' => 'nullable|array',
|
||||
]);
|
||||
|
||||
$result = $this->permissionService->update($id, $validated);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '更新成功',
|
||||
'data' => ['id' => $result->id],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除权限
|
||||
*/
|
||||
public function destroy($id)
|
||||
{
|
||||
$this->permissionService->delete($id);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '删除成功',
|
||||
'data' => null,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量删除权限
|
||||
*/
|
||||
public function batchDelete(Request $request)
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'ids' => 'required|array',
|
||||
'ids.*' => 'integer',
|
||||
]);
|
||||
|
||||
$count = $this->permissionService->batchDelete($validated['ids']);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => "成功删除 {$count} 条数据",
|
||||
'data' => ['count' => $count],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量更新权限状态
|
||||
*/
|
||||
public function batchUpdateStatus(Request $request)
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'ids' => 'required|array',
|
||||
'ids.*' => 'integer',
|
||||
'status' => 'required|integer|in:0,1',
|
||||
]);
|
||||
|
||||
$count = $this->permissionService->batchUpdateStatus($validated['ids'], $validated['status']);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => "成功更新 {$count} 条数据",
|
||||
'data' => ['count' => $count],
|
||||
]);
|
||||
}
|
||||
}
|
||||
240
app/Http/Controllers/Auth/Admin/Role.php
Normal file
240
app/Http/Controllers/Auth/Admin/Role.php
Normal file
@@ -0,0 +1,240 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Auth\Admin;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Services\Auth\RoleService;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class Role extends Controller
|
||||
{
|
||||
protected $roleService;
|
||||
|
||||
public function __construct(RoleService $roleService)
|
||||
{
|
||||
$this->roleService = $roleService;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取角色列表
|
||||
*/
|
||||
public function index(Request $request)
|
||||
{
|
||||
$params = $request->all();
|
||||
$result = $this->roleService->getList($params);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $result,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取所有角色(不分页)
|
||||
*/
|
||||
public function getAll()
|
||||
{
|
||||
$result = $this->roleService->getAll();
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => ['list' => $result],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取角色详情
|
||||
*/
|
||||
public function show($id)
|
||||
{
|
||||
$result = $this->roleService->getById($id);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $result,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建角色
|
||||
*/
|
||||
public function store(Request $request)
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'name' => 'required|string|max:50',
|
||||
'code' => 'required|string|max:50|unique:auth_roles,code',
|
||||
'description' => 'nullable|string|max:200',
|
||||
'sort' => 'nullable|integer|min:0',
|
||||
'status' => 'nullable|integer|in:0,1',
|
||||
'permission_ids' => 'nullable|array',
|
||||
'permission_ids.*' => 'integer|exists:auth_permissions,id',
|
||||
]);
|
||||
|
||||
$result = $this->roleService->create($validated);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '创建成功',
|
||||
'data' => ['id' => $result->id],
|
||||
], 201);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新角色
|
||||
*/
|
||||
public function update(Request $request, $id)
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'name' => 'nullable|string|max:50',
|
||||
'code' => 'nullable|string|max:50|unique:auth_roles,code,' . $id,
|
||||
'description' => 'nullable|string|max:200',
|
||||
'sort' => 'nullable|integer|min:0',
|
||||
'status' => 'nullable|integer|in:0,1',
|
||||
'permission_ids' => 'nullable|array',
|
||||
'permission_ids.*' => 'integer|exists:auth_permissions,id',
|
||||
]);
|
||||
|
||||
$result = $this->roleService->update($id, $validated);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '更新成功',
|
||||
'data' => ['id' => $result->id],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除角色
|
||||
*/
|
||||
public function destroy($id)
|
||||
{
|
||||
$this->roleService->delete($id);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '删除成功',
|
||||
'data' => null,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量删除角色
|
||||
*/
|
||||
public function batchDelete(Request $request)
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'ids' => 'required|array',
|
||||
'ids.*' => 'integer',
|
||||
]);
|
||||
|
||||
$count = $this->roleService->batchDelete($validated['ids']);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => "成功删除 {$count} 条数据",
|
||||
'data' => ['count' => $count],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量更新角色状态
|
||||
*/
|
||||
public function batchUpdateStatus(Request $request)
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'ids' => 'required|array',
|
||||
'ids.*' => 'integer',
|
||||
'status' => 'required|integer|in:0,1',
|
||||
]);
|
||||
|
||||
$count = $this->roleService->batchUpdateStatus($validated['ids'], $validated['status']);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => "成功更新 {$count} 条数据",
|
||||
'data' => ['count' => $count],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 分配权限
|
||||
*/
|
||||
public function assignPermissions(Request $request, $id)
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'permission_ids' => 'required|array',
|
||||
'permission_ids.*' => 'integer|exists:auth_permissions,id',
|
||||
]);
|
||||
|
||||
$this->roleService->assignPermissions($id, $validated['permission_ids']);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '权限分配成功',
|
||||
'data' => null,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取角色的权限列表
|
||||
*/
|
||||
public function getPermissions($id)
|
||||
{
|
||||
$result = $this->roleService->getPermissions($id);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => ['tree' => $result],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 复制角色
|
||||
*/
|
||||
public function copy(Request $request, $id)
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'name' => 'required|string|max:50',
|
||||
'code' => 'required|string|max:50|unique:auth_roles,code',
|
||||
'description' => 'nullable|string|max:200',
|
||||
'sort' => 'nullable|integer|min:0',
|
||||
'status' => 'nullable|integer|in:0,1',
|
||||
]);
|
||||
|
||||
$result = $this->roleService->copy($id, $validated);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '复制成功',
|
||||
'data' => ['id' => $result->id],
|
||||
], 201);
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量复制角色
|
||||
*/
|
||||
public function batchCopy(Request $request)
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'ids' => 'required|array',
|
||||
'ids.*' => 'integer',
|
||||
'name' => 'nullable|string|max:50',
|
||||
'code' => 'nullable|string|max:50',
|
||||
'description' => 'nullable|string|max:200',
|
||||
'sort' => 'nullable|integer|min:0',
|
||||
'status' => 'nullable|integer|in:0,1',
|
||||
]);
|
||||
|
||||
$result = $this->roleService->batchCopy($validated['ids'], $validated);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => "复制完成,成功 {$result['success_count']} 个,失败 {$result['error_count']} 个",
|
||||
'data' => $result,
|
||||
]);
|
||||
}
|
||||
}
|
||||
329
app/Http/Controllers/Auth/Admin/User.php
Normal file
329
app/Http/Controllers/Auth/Admin/User.php
Normal file
@@ -0,0 +1,329 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Auth\Admin;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Services\Auth\UserService;
|
||||
use App\Services\Auth\UserOnlineService;
|
||||
use App\Services\Auth\ImportExportService;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
|
||||
class User extends Controller
|
||||
{
|
||||
protected $userService;
|
||||
protected $userOnlineService;
|
||||
protected $importExportService;
|
||||
|
||||
public function __construct(
|
||||
UserService $userService,
|
||||
UserOnlineService $userOnlineService,
|
||||
ImportExportService $importExportService
|
||||
) {
|
||||
$this->userService = $userService;
|
||||
$this->userOnlineService = $userOnlineService;
|
||||
$this->importExportService = $importExportService;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取用户列表
|
||||
*/
|
||||
public function index(Request $request)
|
||||
{
|
||||
$params = $request->all();
|
||||
$result = $this->userService->getList($params);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $result,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取用户详情
|
||||
*/
|
||||
public function show(Request $request, $id)
|
||||
{
|
||||
$result = $this->userService->getById($id);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $result,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建用户
|
||||
*/
|
||||
public function store(Request $request)
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'username' => 'required|string|max:50|unique:auth_users,username',
|
||||
'password' => 'required|string|min:6',
|
||||
'real_name' => 'required|string|max:50',
|
||||
'email' => 'nullable|email|unique:auth_users,email',
|
||||
'phone' => 'nullable|string|max:20',
|
||||
'department_id' => 'nullable|integer|exists:auth_departments,id',
|
||||
'role_ids' => 'nullable|array',
|
||||
'role_ids.*' => 'integer|exists:auth_roles,id',
|
||||
'status' => 'nullable|integer|in:0,1',
|
||||
]);
|
||||
|
||||
$result = $this->userService->create($validated);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '创建成功',
|
||||
'data' => ['id' => $result->id],
|
||||
], 201);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新用户
|
||||
*/
|
||||
public function update(Request $request, $id)
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'username' => 'nullable|string|max:50|unique:auth_users,username,' . $id,
|
||||
'password' => 'nullable|string|min:6',
|
||||
'real_name' => 'nullable|string|max:50',
|
||||
'email' => 'nullable|email|unique:auth_users,email,' . $id,
|
||||
'phone' => 'nullable|string|max:20',
|
||||
'department_id' => 'nullable|integer|exists:auth_departments,id',
|
||||
'role_ids' => 'nullable|array',
|
||||
'role_ids.*' => 'integer|exists:auth_roles,id',
|
||||
'status' => 'nullable|integer|in:0,1',
|
||||
]);
|
||||
|
||||
$result = $this->userService->update($id, $validated);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '更新成功',
|
||||
'data' => ['id' => $result->id],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除用户
|
||||
*/
|
||||
public function destroy(Request $request, $id)
|
||||
{
|
||||
$this->userService->delete($id);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '删除成功',
|
||||
'data' => null,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量删除用户
|
||||
*/
|
||||
public function batchDelete(Request $request)
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'ids' => 'required|array',
|
||||
'ids.*' => 'integer',
|
||||
]);
|
||||
|
||||
$count = $this->userService->batchDelete($validated['ids']);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => "成功删除 {$count} 条数据",
|
||||
'data' => ['count' => $count],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量更新用户状态
|
||||
*/
|
||||
public function batchUpdateStatus(Request $request)
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'ids' => 'required|array',
|
||||
'ids.*' => 'integer',
|
||||
'status' => 'required|integer|in:0,1',
|
||||
]);
|
||||
|
||||
$count = $this->userService->batchUpdateStatus($validated['ids'], $validated['status']);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => "成功更新 {$count} 条数据",
|
||||
'data' => ['count' => $count],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量分配部门
|
||||
*/
|
||||
public function batchAssignDepartment(Request $request)
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'ids' => 'required|array',
|
||||
'ids.*' => 'integer',
|
||||
'department_id' => 'nullable|integer|exists:auth_departments,id',
|
||||
]);
|
||||
|
||||
$count = $this->userService->batchAssignDepartment($validated['ids'], $validated['department_id']);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => "成功分配 {$count} 条数据",
|
||||
'data' => ['count' => $count],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量分配角色
|
||||
*/
|
||||
public function batchAssignRoles(Request $request)
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'ids' => 'required|array',
|
||||
'ids.*' => 'integer',
|
||||
'role_ids' => 'nullable|array',
|
||||
'role_ids.*' => 'integer|exists:auth_roles,id',
|
||||
]);
|
||||
|
||||
$count = $this->userService->batchAssignRoles($validated['ids'], $validated['role_ids'] ?? []);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => "成功分配 {$count} 条数据",
|
||||
'data' => ['count' => $count],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出用户
|
||||
*/
|
||||
public function export(Request $request)
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'ids' => 'nullable|array',
|
||||
'ids.*' => 'integer',
|
||||
]);
|
||||
|
||||
$filename = $this->importExportService->exportUsers($validated['ids'] ?? []);
|
||||
|
||||
$filePath = $this->importExportService->getExportFilePath($filename);
|
||||
|
||||
return response()->download($filePath, $filename)->deleteFileAfterSend();
|
||||
}
|
||||
|
||||
/**
|
||||
* 导入用户
|
||||
*/
|
||||
public function import(Request $request)
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'file' => 'required|file|mimes:xlsx,xls',
|
||||
]);
|
||||
|
||||
$file = $request->file('file');
|
||||
$realPath = $file->getRealPath();
|
||||
$filename = $file->getClientOriginalName();
|
||||
|
||||
$result = $this->importExportService->importUsers($filename, $realPath);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => "导入完成,成功 {$result['success_count']} 条,失败 {$result['error_count']} 条",
|
||||
'data' => $result,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 下载用户导入模板
|
||||
*/
|
||||
public function downloadTemplate()
|
||||
{
|
||||
$filename = $this->importExportService->downloadUserTemplate();
|
||||
$filePath = $this->importExportService->getExportFilePath($filename);
|
||||
|
||||
return response()->download($filePath, $filename)->deleteFileAfterSend();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取在线用户数量
|
||||
*/
|
||||
public function getOnlineCount()
|
||||
{
|
||||
$count = $this->userOnlineService->getOnlineCount();
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => ['count' => $count],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取在线用户列表
|
||||
*/
|
||||
public function getOnlineUsers(Request $request)
|
||||
{
|
||||
$limit = $request->get('limit', 100);
|
||||
$users = $this->userOnlineService->getOnlineUsers($limit);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => ['list' => $users],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取用户的所有会话
|
||||
*/
|
||||
public function getUserSessions($userId)
|
||||
{
|
||||
$sessions = $this->userOnlineService->getUserSessions($userId);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => ['sessions' => $sessions],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 强制用户下线(单个会话)
|
||||
*/
|
||||
public function setUserOffline($userId, Request $request)
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'token' => 'nullable|string',
|
||||
]);
|
||||
|
||||
if (!empty($validated['token'])) {
|
||||
$this->userOnlineService->setOffline($userId, $validated['token']);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '操作成功',
|
||||
'data' => null,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 强制用户所有设备下线
|
||||
*/
|
||||
public function setUserAllOffline($userId)
|
||||
{
|
||||
$this->userOnlineService->setAllOffline($userId);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '操作成功',
|
||||
'data' => null,
|
||||
]);
|
||||
}
|
||||
}
|
||||
8
app/Http/Controllers/Controller.php
Normal file
8
app/Http/Controllers/Controller.php
Normal file
@@ -0,0 +1,8 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
abstract class Controller
|
||||
{
|
||||
//
|
||||
}
|
||||
172
app/Http/Controllers/System/Admin/City.php
Normal file
172
app/Http/Controllers/System/Admin/City.php
Normal file
@@ -0,0 +1,172 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\System\Admin;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Services\System\CityService;
|
||||
|
||||
class City extends Controller
|
||||
{
|
||||
protected $cityService;
|
||||
|
||||
public function __construct(CityService $cityService)
|
||||
{
|
||||
$this->cityService = $cityService;
|
||||
}
|
||||
|
||||
public function index(Request $request)
|
||||
{
|
||||
$result = $this->cityService->getList($request->all());
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $result
|
||||
]);
|
||||
}
|
||||
|
||||
public function tree()
|
||||
{
|
||||
$tree = $this->cityService->getCachedTree();
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $tree
|
||||
]);
|
||||
}
|
||||
|
||||
public function show(int $id)
|
||||
{
|
||||
$city = $this->cityService->getById($id);
|
||||
if (!$city) {
|
||||
return response()->json([
|
||||
'code' => 404,
|
||||
'message' => '城市不存在',
|
||||
'data' => null
|
||||
], 404);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $city
|
||||
]);
|
||||
}
|
||||
|
||||
public function store(Request $request)
|
||||
{
|
||||
try {
|
||||
$city = $this->cityService->create($request->all());
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '创建成功',
|
||||
'data' => $city
|
||||
], 201);
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
'code' => 422,
|
||||
'message' => $e->getMessage(),
|
||||
'data' => null
|
||||
], 422);
|
||||
}
|
||||
}
|
||||
|
||||
public function update(Request $request, int $id)
|
||||
{
|
||||
try {
|
||||
$city = $this->cityService->update($id, $request->all());
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '更新成功',
|
||||
'data' => $city
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
'code' => 422,
|
||||
'message' => $e->getMessage(),
|
||||
'data' => null
|
||||
], 422);
|
||||
}
|
||||
}
|
||||
|
||||
public function destroy(int $id)
|
||||
{
|
||||
try {
|
||||
$this->cityService->delete($id);
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '删除成功',
|
||||
'data' => null
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
'code' => 400,
|
||||
'message' => $e->getMessage(),
|
||||
'data' => null
|
||||
], 400);
|
||||
}
|
||||
}
|
||||
|
||||
public function batchDelete(Request $request)
|
||||
{
|
||||
$this->cityService->batchDelete($request->input('ids', []));
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '批量删除成功',
|
||||
'data' => null
|
||||
]);
|
||||
}
|
||||
|
||||
public function batchUpdateStatus(Request $request)
|
||||
{
|
||||
$this->cityService->batchUpdateStatus(
|
||||
$request->input('ids', []),
|
||||
$request->input('status', true)
|
||||
);
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '批量更新状态成功',
|
||||
'data' => null
|
||||
]);
|
||||
}
|
||||
|
||||
public function children(int $parentId)
|
||||
{
|
||||
$children = $this->cityService->getChildren($parentId);
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $children
|
||||
]);
|
||||
}
|
||||
|
||||
public function provinces()
|
||||
{
|
||||
$provinces = $this->cityService->getProvinces();
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $provinces
|
||||
]);
|
||||
}
|
||||
|
||||
public function cities(int $provinceId)
|
||||
{
|
||||
$cities = $this->cityService->getCities($provinceId);
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $cities
|
||||
]);
|
||||
}
|
||||
|
||||
public function districts(int $cityId)
|
||||
{
|
||||
$districts = $this->cityService->getDistricts($cityId);
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $districts
|
||||
]);
|
||||
}
|
||||
}
|
||||
142
app/Http/Controllers/System/Admin/Config.php
Normal file
142
app/Http/Controllers/System/Admin/Config.php
Normal file
@@ -0,0 +1,142 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\System\Admin;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Services\System\ConfigService;
|
||||
|
||||
class Config extends Controller
|
||||
{
|
||||
protected $configService;
|
||||
|
||||
public function __construct(ConfigService $configService)
|
||||
{
|
||||
$this->configService = $configService;
|
||||
}
|
||||
|
||||
public function index(Request $request)
|
||||
{
|
||||
$result = $this->configService->getList($request->all());
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $result
|
||||
]);
|
||||
}
|
||||
|
||||
public function show(int $id)
|
||||
{
|
||||
$config = $this->configService->getById($id);
|
||||
if (!$config) {
|
||||
return response()->json([
|
||||
'code' => 404,
|
||||
'message' => '配置不存在',
|
||||
'data' => null
|
||||
], 404);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $config
|
||||
]);
|
||||
}
|
||||
|
||||
public function store(Request $request)
|
||||
{
|
||||
try {
|
||||
$config = $this->configService->create($request->all());
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '创建成功',
|
||||
'data' => $config
|
||||
], 201);
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
'code' => 422,
|
||||
'message' => $e->getMessage(),
|
||||
'data' => null
|
||||
], 422);
|
||||
}
|
||||
}
|
||||
|
||||
public function update(Request $request, int $id)
|
||||
{
|
||||
try {
|
||||
$config = $this->configService->update($id, $request->all());
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '更新成功',
|
||||
'data' => $config
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
'code' => 422,
|
||||
'message' => $e->getMessage(),
|
||||
'data' => null
|
||||
], 422);
|
||||
}
|
||||
}
|
||||
|
||||
public function destroy(int $id)
|
||||
{
|
||||
try {
|
||||
$this->configService->delete($id);
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '删除成功',
|
||||
'data' => null
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
'code' => 400,
|
||||
'message' => $e->getMessage(),
|
||||
'data' => null
|
||||
], 400);
|
||||
}
|
||||
}
|
||||
|
||||
public function batchDelete(Request $request)
|
||||
{
|
||||
$this->configService->batchDelete($request->input('ids', []));
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '批量删除成功',
|
||||
'data' => null
|
||||
]);
|
||||
}
|
||||
|
||||
public function batchUpdateStatus(Request $request)
|
||||
{
|
||||
$this->configService->batchUpdateStatus(
|
||||
$request->input('ids', []),
|
||||
$request->input('status', true)
|
||||
);
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '批量更新状态成功',
|
||||
'data' => null
|
||||
]);
|
||||
}
|
||||
|
||||
public function getGroups()
|
||||
{
|
||||
$groups = $this->configService->getGroups();
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $groups
|
||||
]);
|
||||
}
|
||||
|
||||
public function getByGroup(Request $request)
|
||||
{
|
||||
$configs = $this->configService->getByGroup($request->input('group'));
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $configs
|
||||
]);
|
||||
}
|
||||
}
|
||||
211
app/Http/Controllers/System/Admin/Dictionary.php
Normal file
211
app/Http/Controllers/System/Admin/Dictionary.php
Normal file
@@ -0,0 +1,211 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\System\Admin;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Services\System\DictionaryService;
|
||||
|
||||
class Dictionary extends Controller
|
||||
{
|
||||
protected $dictionaryService;
|
||||
|
||||
public function __construct(DictionaryService $dictionaryService)
|
||||
{
|
||||
$this->dictionaryService = $dictionaryService;
|
||||
}
|
||||
|
||||
public function index(Request $request)
|
||||
{
|
||||
$result = $this->dictionaryService->getList($request->all());
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $result
|
||||
]);
|
||||
}
|
||||
|
||||
public function all()
|
||||
{
|
||||
$dictionaries = $this->dictionaryService->getAll();
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $dictionaries
|
||||
]);
|
||||
}
|
||||
|
||||
public function show(int $id)
|
||||
{
|
||||
$dictionary = $this->dictionaryService->getById($id);
|
||||
if (!$dictionary) {
|
||||
return response()->json([
|
||||
'code' => 404,
|
||||
'message' => '字典不存在',
|
||||
'data' => null
|
||||
], 404);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $dictionary
|
||||
]);
|
||||
}
|
||||
|
||||
public function store(Request $request)
|
||||
{
|
||||
try {
|
||||
$dictionary = $this->dictionaryService->create($request->all());
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '创建成功',
|
||||
'data' => $dictionary
|
||||
], 201);
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
'code' => 422,
|
||||
'message' => $e->getMessage(),
|
||||
'data' => null
|
||||
], 422);
|
||||
}
|
||||
}
|
||||
|
||||
public function update(Request $request, int $id)
|
||||
{
|
||||
try {
|
||||
$dictionary = $this->dictionaryService->update($id, $request->all());
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '更新成功',
|
||||
'data' => $dictionary
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
'code' => 422,
|
||||
'message' => $e->getMessage(),
|
||||
'data' => null
|
||||
], 422);
|
||||
}
|
||||
}
|
||||
|
||||
public function destroy(int $id)
|
||||
{
|
||||
try {
|
||||
$this->dictionaryService->delete($id);
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '删除成功',
|
||||
'data' => null
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
'code' => 400,
|
||||
'message' => $e->getMessage(),
|
||||
'data' => null
|
||||
], 400);
|
||||
}
|
||||
}
|
||||
|
||||
public function batchDelete(Request $request)
|
||||
{
|
||||
$this->dictionaryService->batchDelete($request->input('ids', []));
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '批量删除成功',
|
||||
'data' => null
|
||||
]);
|
||||
}
|
||||
|
||||
public function batchUpdateStatus(Request $request)
|
||||
{
|
||||
$this->dictionaryService->batchUpdateStatus(
|
||||
$request->input('ids', []),
|
||||
$request->input('status', true)
|
||||
);
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '批量更新状态成功',
|
||||
'data' => null
|
||||
]);
|
||||
}
|
||||
|
||||
public function getItemsList(Request $request)
|
||||
{
|
||||
$result = $this->dictionaryService->getItemsList($request->all());
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $result
|
||||
]);
|
||||
}
|
||||
|
||||
public function storeItem(Request $request)
|
||||
{
|
||||
try {
|
||||
$item = $this->dictionaryService->createItem($request->all());
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '创建成功',
|
||||
'data' => $item
|
||||
], 201);
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
'code' => 422,
|
||||
'message' => $e->getMessage(),
|
||||
'data' => null
|
||||
], 422);
|
||||
}
|
||||
}
|
||||
|
||||
public function updateItem(Request $request, int $id)
|
||||
{
|
||||
try {
|
||||
$item = $this->dictionaryService->updateItem($id, $request->all());
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '更新成功',
|
||||
'data' => $item
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
'code' => 422,
|
||||
'message' => $e->getMessage(),
|
||||
'data' => null
|
||||
], 422);
|
||||
}
|
||||
}
|
||||
|
||||
public function destroyItem(int $id)
|
||||
{
|
||||
$this->dictionaryService->deleteItem($id);
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '删除成功',
|
||||
'data' => null
|
||||
]);
|
||||
}
|
||||
|
||||
public function batchDeleteItems(Request $request)
|
||||
{
|
||||
$this->dictionaryService->batchDeleteItems($request->input('ids', []));
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '批量删除成功',
|
||||
'data' => null
|
||||
]);
|
||||
}
|
||||
|
||||
public function batchUpdateItemsStatus(Request $request)
|
||||
{
|
||||
$this->dictionaryService->batchUpdateItemsStatus(
|
||||
$request->input('ids', []),
|
||||
$request->input('status', true)
|
||||
);
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '批量更新状态成功',
|
||||
'data' => null
|
||||
]);
|
||||
}
|
||||
}
|
||||
126
app/Http/Controllers/System/Admin/Log.php
Normal file
126
app/Http/Controllers/System/Admin/Log.php
Normal file
@@ -0,0 +1,126 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\System\Admin;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests\LogRequest;
|
||||
use App\Services\System\LogService;
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
use App\Exports\GenericExport;
|
||||
|
||||
class Log extends Controller
|
||||
{
|
||||
protected $logService;
|
||||
|
||||
public function __construct(LogService $logService)
|
||||
{
|
||||
$this->logService = $logService;
|
||||
}
|
||||
|
||||
public function index(LogRequest $request)
|
||||
{
|
||||
$result = $this->logService->getList($request->validated());
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $result
|
||||
]);
|
||||
}
|
||||
|
||||
public function export(LogRequest $request)
|
||||
{
|
||||
$params = $request->validated();
|
||||
$pageSize = $params['page_size'] ?? 10000; // 导出时默认获取更多数据
|
||||
|
||||
// 获取所有符合条件的日志(不分页)
|
||||
$query = $this->logService->getListQuery($params);
|
||||
$logs = $query->limit($pageSize)->get();
|
||||
|
||||
// 准备导出数据
|
||||
$headers = [
|
||||
'ID', '用户名', '模块', '操作', '请求方法', 'URL', 'IP地址',
|
||||
'状态码', '状态', '错误信息', '执行时间(ms)', '创建时间'
|
||||
];
|
||||
|
||||
$data = [];
|
||||
foreach ($logs as $log) {
|
||||
$data[] = [
|
||||
$log->id,
|
||||
$log->username,
|
||||
$log->module,
|
||||
$log->action,
|
||||
$log->method,
|
||||
$log->url,
|
||||
$log->ip,
|
||||
$log->status_code,
|
||||
$log->status === 'success' ? '成功' : '失败',
|
||||
$log->error_message ?? '-',
|
||||
$log->execution_time,
|
||||
$log->created_at->format('Y-m-d H:i:s'),
|
||||
];
|
||||
}
|
||||
|
||||
$filename = '系统操作日志_' . date('YmdHis') . '.xlsx';
|
||||
|
||||
return Excel::download(new GenericExport($headers, $data), $filename);
|
||||
}
|
||||
|
||||
public function show(int $id)
|
||||
{
|
||||
$log = $this->logService->getById($id);
|
||||
if (!$log) {
|
||||
return response()->json([
|
||||
'code' => 404,
|
||||
'message' => '日志不存在',
|
||||
'data' => null
|
||||
], 404);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $log
|
||||
]);
|
||||
}
|
||||
|
||||
public function destroy(int $id)
|
||||
{
|
||||
$this->logService->delete($id);
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '删除成功',
|
||||
'data' => null
|
||||
]);
|
||||
}
|
||||
|
||||
public function batchDelete(Request $request)
|
||||
{
|
||||
$this->logService->batchDelete($request->input('ids', []));
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '批量删除成功',
|
||||
'data' => null
|
||||
]);
|
||||
}
|
||||
|
||||
public function clearLogs(Request $request)
|
||||
{
|
||||
$days = $request->input('days', 30);
|
||||
$this->logService->clearLogs($days);
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '清理成功',
|
||||
'data' => null
|
||||
]);
|
||||
}
|
||||
|
||||
public function getStatistics(LogRequest $request)
|
||||
{
|
||||
$statistics = $this->logService->getStatistics($request->validated());
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $statistics
|
||||
]);
|
||||
}
|
||||
}
|
||||
152
app/Http/Controllers/System/Admin/Task.php
Normal file
152
app/Http/Controllers/System/Admin/Task.php
Normal file
@@ -0,0 +1,152 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\System\Admin;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Services\System\TaskService;
|
||||
|
||||
class Task extends Controller
|
||||
{
|
||||
protected $taskService;
|
||||
|
||||
public function __construct(TaskService $taskService)
|
||||
{
|
||||
$this->taskService = $taskService;
|
||||
}
|
||||
|
||||
public function index(Request $request)
|
||||
{
|
||||
$result = $this->taskService->getList($request->all());
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $result
|
||||
]);
|
||||
}
|
||||
|
||||
public function all()
|
||||
{
|
||||
$tasks = $this->taskService->getAll();
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $tasks
|
||||
]);
|
||||
}
|
||||
|
||||
public function show(int $id)
|
||||
{
|
||||
$task = $this->taskService->getById($id);
|
||||
if (!$task) {
|
||||
return response()->json([
|
||||
'code' => 404,
|
||||
'message' => '任务不存在',
|
||||
'data' => null
|
||||
], 404);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $task
|
||||
]);
|
||||
}
|
||||
|
||||
public function store(Request $request)
|
||||
{
|
||||
try {
|
||||
$task = $this->taskService->create($request->all());
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '创建成功',
|
||||
'data' => $task
|
||||
], 201);
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
'code' => 422,
|
||||
'message' => $e->getMessage(),
|
||||
'data' => null
|
||||
], 422);
|
||||
}
|
||||
}
|
||||
|
||||
public function update(Request $request, int $id)
|
||||
{
|
||||
try {
|
||||
$task = $this->taskService->update($id, $request->all());
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '更新成功',
|
||||
'data' => $task
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
'code' => 422,
|
||||
'message' => $e->getMessage(),
|
||||
'data' => null
|
||||
], 422);
|
||||
}
|
||||
}
|
||||
|
||||
public function destroy(int $id)
|
||||
{
|
||||
$this->taskService->delete($id);
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '删除成功',
|
||||
'data' => null
|
||||
]);
|
||||
}
|
||||
|
||||
public function batchDelete(Request $request)
|
||||
{
|
||||
$this->taskService->batchDelete($request->input('ids', []));
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '批量删除成功',
|
||||
'data' => null
|
||||
]);
|
||||
}
|
||||
|
||||
public function batchUpdateStatus(Request $request)
|
||||
{
|
||||
$this->taskService->batchUpdateStatus(
|
||||
$request->input('ids', []),
|
||||
$request->input('status', true)
|
||||
);
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '批量更新状态成功',
|
||||
'data' => null
|
||||
]);
|
||||
}
|
||||
|
||||
public function run(int $id)
|
||||
{
|
||||
try {
|
||||
$result = $this->taskService->run($id);
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '执行成功',
|
||||
'data' => $result
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
'code' => 400,
|
||||
'message' => $e->getMessage(),
|
||||
'data' => null
|
||||
], 400);
|
||||
}
|
||||
}
|
||||
|
||||
public function getStatistics()
|
||||
{
|
||||
$statistics = $this->taskService->getStatistics();
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $statistics
|
||||
]);
|
||||
}
|
||||
}
|
||||
152
app/Http/Controllers/System/Admin/Upload.php
Normal file
152
app/Http/Controllers/System/Admin/Upload.php
Normal file
@@ -0,0 +1,152 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\System\Admin;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Services\System\UploadService;
|
||||
|
||||
class Upload extends Controller
|
||||
{
|
||||
protected $uploadService;
|
||||
|
||||
public function __construct(UploadService $uploadService)
|
||||
{
|
||||
$this->uploadService = $uploadService;
|
||||
}
|
||||
|
||||
public function upload(Request $request)
|
||||
{
|
||||
try {
|
||||
$request->validate([
|
||||
'file' => 'required|file|max:10240',
|
||||
]);
|
||||
|
||||
$file = $request->file('file');
|
||||
$directory = $request->input('directory', 'uploads');
|
||||
$options = [
|
||||
'compress' => $request->input('compress', false),
|
||||
'quality' => $request->input('quality', 80),
|
||||
'width' => $request->input('width'),
|
||||
'height' => $request->input('height'),
|
||||
];
|
||||
|
||||
$result = $this->uploadService->upload($file, $directory, $options);
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '上传成功',
|
||||
'data' => $result
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
'code' => 400,
|
||||
'message' => $e->getMessage(),
|
||||
'data' => null
|
||||
], 400);
|
||||
}
|
||||
}
|
||||
|
||||
public function uploadMultiple(Request $request)
|
||||
{
|
||||
try {
|
||||
$request->validate([
|
||||
'files' => 'required|array',
|
||||
'files.*' => 'file|max:10240',
|
||||
]);
|
||||
|
||||
$files = $request->file('files');
|
||||
$directory = $request->input('directory', 'uploads');
|
||||
$options = [
|
||||
'compress' => $request->input('compress', false),
|
||||
'quality' => $request->input('quality', 80),
|
||||
'width' => $request->input('width'),
|
||||
'height' => $request->input('height'),
|
||||
];
|
||||
|
||||
$results = $this->uploadService->uploadMultiple($files, $directory, $options);
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '上传成功',
|
||||
'data' => $results
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
'code' => 400,
|
||||
'message' => $e->getMessage(),
|
||||
'data' => null
|
||||
], 400);
|
||||
}
|
||||
}
|
||||
|
||||
public function uploadBase64(Request $request)
|
||||
{
|
||||
try {
|
||||
$request->validate([
|
||||
'base64' => 'required|string',
|
||||
]);
|
||||
|
||||
$base64 = $request->input('base64');
|
||||
$directory = $request->input('directory', 'uploads');
|
||||
$fileName = $request->input('file_name');
|
||||
|
||||
$result = $this->uploadService->uploadBase64($base64, $directory, $fileName);
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '上传成功',
|
||||
'data' => $result
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
'code' => 400,
|
||||
'message' => $e->getMessage(),
|
||||
'data' => null
|
||||
], 400);
|
||||
}
|
||||
}
|
||||
|
||||
public function delete(Request $request)
|
||||
{
|
||||
try {
|
||||
$request->validate([
|
||||
'path' => 'required|string',
|
||||
]);
|
||||
|
||||
$path = $request->input('path');
|
||||
$this->uploadService->delete($path);
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '删除成功',
|
||||
'data' => null
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
'code' => 400,
|
||||
'message' => $e->getMessage(),
|
||||
'data' => null
|
||||
], 400);
|
||||
}
|
||||
}
|
||||
|
||||
public function batchDelete(Request $request)
|
||||
{
|
||||
try {
|
||||
$request->validate([
|
||||
'paths' => 'required|array',
|
||||
]);
|
||||
|
||||
$paths = $request->input('paths', []);
|
||||
$this->uploadService->deleteMultiple($paths);
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '批量删除成功',
|
||||
'data' => null
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
'code' => 400,
|
||||
'message' => $e->getMessage(),
|
||||
'data' => null
|
||||
], 400);
|
||||
}
|
||||
}
|
||||
}
|
||||
75
app/Http/Controllers/System/Api/City.php
Normal file
75
app/Http/Controllers/System/Api/City.php
Normal file
@@ -0,0 +1,75 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\System\Api;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Services\System\CityService;
|
||||
|
||||
class City extends Controller
|
||||
{
|
||||
protected $cityService;
|
||||
|
||||
public function __construct(CityService $cityService)
|
||||
{
|
||||
$this->cityService = $cityService;
|
||||
}
|
||||
|
||||
public function tree()
|
||||
{
|
||||
$tree = $this->cityService->getCachedTree();
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $tree
|
||||
]);
|
||||
}
|
||||
|
||||
public function provinces()
|
||||
{
|
||||
$provinces = $this->cityService->getProvinces();
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $provinces
|
||||
]);
|
||||
}
|
||||
|
||||
public function cities(int $provinceId)
|
||||
{
|
||||
$cities = $this->cityService->getCities($provinceId);
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $cities
|
||||
]);
|
||||
}
|
||||
|
||||
public function districts(int $cityId)
|
||||
{
|
||||
$districts = $this->cityService->getDistricts($cityId);
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $districts
|
||||
]);
|
||||
}
|
||||
|
||||
public function show(int $id)
|
||||
{
|
||||
$city = $this->cityService->getById($id);
|
||||
if (!$city) {
|
||||
return response()->json([
|
||||
'code' => 404,
|
||||
'message' => '城市不存在',
|
||||
'data' => null
|
||||
], 404);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $city
|
||||
]);
|
||||
}
|
||||
}
|
||||
51
app/Http/Controllers/System/Api/Config.php
Normal file
51
app/Http/Controllers/System/Api/Config.php
Normal file
@@ -0,0 +1,51 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\System\Api;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Services\System\ConfigService;
|
||||
|
||||
class Config extends Controller
|
||||
{
|
||||
protected $configService;
|
||||
|
||||
public function __construct(ConfigService $configService)
|
||||
{
|
||||
$this->configService = $configService;
|
||||
}
|
||||
|
||||
public function index()
|
||||
{
|
||||
$configs = $this->configService->getAllConfig();
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $configs
|
||||
]);
|
||||
}
|
||||
|
||||
public function getByGroup(Request $request)
|
||||
{
|
||||
$configs = $this->configService->getByGroup($request->input('group'));
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $configs
|
||||
]);
|
||||
}
|
||||
|
||||
public function getByKey(Request $request)
|
||||
{
|
||||
$key = $request->input('key');
|
||||
$value = $this->configService->getConfigValue($key);
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => [
|
||||
'key' => $key,
|
||||
'value' => $value,
|
||||
]
|
||||
]);
|
||||
}
|
||||
}
|
||||
59
app/Http/Controllers/System/Api/Dictionary.php
Normal file
59
app/Http/Controllers/System/Api/Dictionary.php
Normal file
@@ -0,0 +1,59 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\System\Api;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Services\System\DictionaryService;
|
||||
|
||||
class Dictionary extends Controller
|
||||
{
|
||||
protected $dictionaryService;
|
||||
|
||||
public function __construct(DictionaryService $dictionaryService)
|
||||
{
|
||||
$this->dictionaryService = $dictionaryService;
|
||||
}
|
||||
|
||||
public function index()
|
||||
{
|
||||
$dictionaries = $this->dictionaryService->getAll();
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $dictionaries
|
||||
]);
|
||||
}
|
||||
|
||||
public function getByCode(Request $request)
|
||||
{
|
||||
$code = $request->input('code');
|
||||
$items = $this->dictionaryService->getItemsByCode($code);
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => [
|
||||
'code' => $code,
|
||||
'items' => $items,
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
public function show(int $id)
|
||||
{
|
||||
$dictionary = $this->dictionaryService->getById($id);
|
||||
if (!$dictionary) {
|
||||
return response()->json([
|
||||
'code' => 404,
|
||||
'message' => '字典不存在',
|
||||
'data' => null
|
||||
], 404);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => $dictionary
|
||||
]);
|
||||
}
|
||||
}
|
||||
106
app/Http/Controllers/System/Api/Upload.php
Normal file
106
app/Http/Controllers/System/Api/Upload.php
Normal file
@@ -0,0 +1,106 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\System\Api;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Services\System\UploadService;
|
||||
|
||||
class Upload extends Controller
|
||||
{
|
||||
protected $uploadService;
|
||||
|
||||
public function __construct(UploadService $uploadService)
|
||||
{
|
||||
$this->uploadService = $uploadService;
|
||||
}
|
||||
|
||||
public function upload(Request $request)
|
||||
{
|
||||
try {
|
||||
$request->validate([
|
||||
'file' => 'required|file|max:10240',
|
||||
]);
|
||||
|
||||
$file = $request->file('file');
|
||||
$directory = $request->input('directory', 'uploads');
|
||||
$options = [
|
||||
'compress' => $request->input('compress', false),
|
||||
'quality' => $request->input('quality', 80),
|
||||
'width' => $request->input('width'),
|
||||
'height' => $request->input('height'),
|
||||
];
|
||||
|
||||
$result = $this->uploadService->upload($file, $directory, $options);
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '上传成功',
|
||||
'data' => $result
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
'code' => 400,
|
||||
'message' => $e->getMessage(),
|
||||
'data' => null
|
||||
], 400);
|
||||
}
|
||||
}
|
||||
|
||||
public function uploadMultiple(Request $request)
|
||||
{
|
||||
try {
|
||||
$request->validate([
|
||||
'files' => 'required|array',
|
||||
'files.*' => 'file|max:10240',
|
||||
]);
|
||||
|
||||
$files = $request->file('files');
|
||||
$directory = $request->input('directory', 'uploads');
|
||||
$options = [
|
||||
'compress' => $request->input('compress', false),
|
||||
'quality' => $request->input('quality', 80),
|
||||
'width' => $request->input('width'),
|
||||
'height' => $request->input('height'),
|
||||
];
|
||||
|
||||
$results = $this->uploadService->uploadMultiple($files, $directory, $options);
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '上传成功',
|
||||
'data' => $results
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
'code' => 400,
|
||||
'message' => $e->getMessage(),
|
||||
'data' => null
|
||||
], 400);
|
||||
}
|
||||
}
|
||||
|
||||
public function uploadBase64(Request $request)
|
||||
{
|
||||
try {
|
||||
$request->validate([
|
||||
'base64' => 'required|string',
|
||||
]);
|
||||
|
||||
$base64 = $request->input('base64');
|
||||
$directory = $request->input('directory', 'uploads');
|
||||
$fileName = $request->input('file_name');
|
||||
|
||||
$result = $this->uploadService->uploadBase64($base64, $directory, $fileName);
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => '上传成功',
|
||||
'data' => $result
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
'code' => 400,
|
||||
'message' => $e->getMessage(),
|
||||
'data' => null
|
||||
], 400);
|
||||
}
|
||||
}
|
||||
}
|
||||
395
app/Http/Controllers/System/WebSocket.php
Normal file
395
app/Http/Controllers/System/WebSocket.php
Normal file
@@ -0,0 +1,395 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\System;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Services\WebSocket\WebSocketService;
|
||||
|
||||
/**
|
||||
* WebSocket Controller
|
||||
*
|
||||
* Provides API endpoints for WebSocket operations
|
||||
*/
|
||||
class WebSocket extends Controller
|
||||
{
|
||||
/**
|
||||
* @var WebSocketService
|
||||
*/
|
||||
protected $webSocketService;
|
||||
|
||||
/**
|
||||
* WebSocket constructor
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->webSocketService = app(WebSocketService::class);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get online user count
|
||||
*
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function getOnlineCount(): JsonResponse
|
||||
{
|
||||
$count = $this->webSocketService->getOnlineUserCount();
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => [
|
||||
'online_count' => $count
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get online user IDs
|
||||
*
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function getOnlineUsers(): JsonResponse
|
||||
{
|
||||
$userIds = $this->webSocketService->getOnlineUserIds();
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => [
|
||||
'user_ids' => $userIds,
|
||||
'count' => count($userIds)
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a user is online
|
||||
*
|
||||
* @param Request $request
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function checkOnline(Request $request): JsonResponse
|
||||
{
|
||||
$request->validate([
|
||||
'user_id' => 'required|integer'
|
||||
]);
|
||||
|
||||
$userId = $request->input('user_id');
|
||||
$isOnline = $this->webSocketService->isUserOnline($userId);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => [
|
||||
'user_id' => $userId,
|
||||
'is_online' => $isOnline
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Send message to a specific user
|
||||
*
|
||||
* @param Request $request
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function sendToUser(Request $request): JsonResponse
|
||||
{
|
||||
$request->validate([
|
||||
'user_id' => 'required|integer',
|
||||
'type' => 'required|string',
|
||||
'data' => 'required|array'
|
||||
]);
|
||||
|
||||
$userId = $request->input('user_id');
|
||||
$type = $request->input('type');
|
||||
$data = $request->input('data');
|
||||
|
||||
$message = [
|
||||
'type' => $type,
|
||||
'data' => $data
|
||||
];
|
||||
|
||||
$sent = $this->webSocketService->sendToUser($userId, $message);
|
||||
|
||||
return response()->json([
|
||||
'code' => $sent ? 200 : 404,
|
||||
'message' => $sent ? 'Message sent successfully' : 'User is not online',
|
||||
'data' => [
|
||||
'user_id' => $userId,
|
||||
'sent' => $sent
|
||||
]
|
||||
], $sent ? 200 : 404);
|
||||
}
|
||||
|
||||
/**
|
||||
* Send message to multiple users
|
||||
*
|
||||
* @param Request $request
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function sendToUsers(Request $request): JsonResponse
|
||||
{
|
||||
$request->validate([
|
||||
'user_ids' => 'required|array',
|
||||
'user_ids.*' => 'integer',
|
||||
'type' => 'required|string',
|
||||
'data' => 'required|array'
|
||||
]);
|
||||
|
||||
$userIds = $request->input('user_ids');
|
||||
$type = $request->input('type');
|
||||
$data = $request->input('data');
|
||||
|
||||
$message = [
|
||||
'type' => $type,
|
||||
'data' => $data
|
||||
];
|
||||
|
||||
$sentTo = $this->webSocketService->sendToUsers($userIds, $message);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'success',
|
||||
'data' => [
|
||||
'total_users' => count($userIds),
|
||||
'sent_to' => $sentTo,
|
||||
'failed' => count($userIds) - count($sentTo)
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Broadcast message to all users
|
||||
*
|
||||
* @param Request $request
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function broadcast(Request $request): JsonResponse
|
||||
{
|
||||
$request->validate([
|
||||
'type' => 'required|string',
|
||||
'data' => 'required|array',
|
||||
'exclude_user_id' => 'nullable|integer'
|
||||
]);
|
||||
|
||||
$type = $request->input('type');
|
||||
$data = $request->input('data');
|
||||
$excludeUserId = $request->input('exclude_user_id');
|
||||
|
||||
$message = [
|
||||
'type' => $type,
|
||||
'data' => $data
|
||||
];
|
||||
|
||||
$count = $this->webSocketService->broadcast($message, $excludeUserId);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'Broadcast sent successfully',
|
||||
'data' => [
|
||||
'sent_to' => $count,
|
||||
'exclude_user_id' => $excludeUserId
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Send message to a channel
|
||||
*
|
||||
* @param Request $request
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function sendToChannel(Request $request): JsonResponse
|
||||
{
|
||||
$request->validate([
|
||||
'channel' => 'required|string',
|
||||
'type' => 'required|string',
|
||||
'data' => 'required|array'
|
||||
]);
|
||||
|
||||
$channel = $request->input('channel');
|
||||
$type = $request->input('type');
|
||||
$data = $request->input('data');
|
||||
|
||||
$message = [
|
||||
'type' => $type,
|
||||
'data' => $data
|
||||
];
|
||||
|
||||
$count = $this->webSocketService->sendToChannel($channel, $message);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'Message sent to channel successfully',
|
||||
'data' => [
|
||||
'channel' => $channel,
|
||||
'sent_to' => $count
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Send system notification
|
||||
*
|
||||
* @param Request $request
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function sendNotification(Request $request): JsonResponse
|
||||
{
|
||||
$request->validate([
|
||||
'title' => 'required|string|max:255',
|
||||
'message' => 'required|string|max:1000',
|
||||
'type' => 'nullable|string|in:info,success,warning,error',
|
||||
'extra_data' => 'nullable|array'
|
||||
]);
|
||||
|
||||
$title = $request->input('title');
|
||||
$message = $request->input('message');
|
||||
$type = $request->input('type', 'info');
|
||||
$extraData = $request->input('extra_data', []);
|
||||
|
||||
$count = $this->webSocketService->sendSystemNotification($title, $message, $type, $extraData);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'Notification sent successfully',
|
||||
'data' => [
|
||||
'sent_to' => $count
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Send notification to specific users
|
||||
*
|
||||
* @param Request $request
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function sendNotificationToUsers(Request $request): JsonResponse
|
||||
{
|
||||
$request->validate([
|
||||
'user_ids' => 'required|array',
|
||||
'user_ids.*' => 'integer',
|
||||
'title' => 'required|string|max:255',
|
||||
'message' => 'required|string|max:1000',
|
||||
'type' => 'nullable|string|in:info,success,warning,error',
|
||||
'extra_data' => 'nullable|array'
|
||||
]);
|
||||
|
||||
$userIds = $request->input('user_ids');
|
||||
$title = $request->input('title');
|
||||
$message = $request->input('message');
|
||||
$type = $request->input('type', 'info');
|
||||
$extraData = $request->input('extra_data', []);
|
||||
|
||||
$sentTo = $this->webSocketService->sendNotificationToUsers($userIds, $title, $message, $type, $extraData);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'Notification sent successfully',
|
||||
'data' => [
|
||||
'total_users' => count($userIds),
|
||||
'sent_to' => $sentTo,
|
||||
'failed' => count($userIds) - count($sentTo)
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Push data update
|
||||
*
|
||||
* @param Request $request
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function pushDataUpdate(Request $request): JsonResponse
|
||||
{
|
||||
$request->validate([
|
||||
'user_ids' => 'required|array',
|
||||
'user_ids.*' => 'integer',
|
||||
'resource_type' => 'required|string',
|
||||
'action' => 'required|string|in:create,update,delete',
|
||||
'data' => 'required|array'
|
||||
]);
|
||||
|
||||
$userIds = $request->input('user_ids');
|
||||
$resourceType = $request->input('resource_type');
|
||||
$action = $request->input('action');
|
||||
$data = $request->input('data');
|
||||
|
||||
$sentTo = $this->webSocketService->pushDataUpdate($userIds, $resourceType, $action, $data);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'Data update pushed successfully',
|
||||
'data' => [
|
||||
'resource_type' => $resourceType,
|
||||
'action' => $action,
|
||||
'total_users' => count($userIds),
|
||||
'sent_to' => $sentTo,
|
||||
'failed' => count($userIds) - count($sentTo)
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Push data update to channel
|
||||
*
|
||||
* @param Request $request
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function pushDataUpdateToChannel(Request $request): JsonResponse
|
||||
{
|
||||
$request->validate([
|
||||
'channel' => 'required|string',
|
||||
'resource_type' => 'required|string',
|
||||
'action' => 'required|string|in:create,update,delete',
|
||||
'data' => 'required|array'
|
||||
]);
|
||||
|
||||
$channel = $request->input('channel');
|
||||
$resourceType = $request->input('resource_type');
|
||||
$action = $request->input('action');
|
||||
$data = $request->input('data');
|
||||
|
||||
$count = $this->webSocketService->pushDataUpdateToChannel($channel, $resourceType, $action, $data);
|
||||
|
||||
return response()->json([
|
||||
'code' => 200,
|
||||
'message' => 'Data update pushed to channel successfully',
|
||||
'data' => [
|
||||
'channel' => $channel,
|
||||
'resource_type' => $resourceType,
|
||||
'action' => $action,
|
||||
'sent_to' => $count
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Disconnect a user from WebSocket
|
||||
*
|
||||
* @param Request $request
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function disconnectUser(Request $request): JsonResponse
|
||||
{
|
||||
$request->validate([
|
||||
'user_id' => 'required|integer'
|
||||
]);
|
||||
|
||||
$userId = $request->input('user_id');
|
||||
$disconnected = $this->webSocketService->disconnectUser($userId);
|
||||
|
||||
return response()->json([
|
||||
'code' => $disconnected ? 200 : 404,
|
||||
'message' => $disconnected ? 'User disconnected successfully' : 'User is not online',
|
||||
'data' => [
|
||||
'user_id' => $userId,
|
||||
'disconnected' => $disconnected
|
||||
]
|
||||
], $disconnected ? 200 : 404);
|
||||
}
|
||||
}
|
||||
120
app/Http/Middleware/AuthCheckMiddleware.php
Normal file
120
app/Http/Middleware/AuthCheckMiddleware.php
Normal file
@@ -0,0 +1,120 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Middleware;
|
||||
|
||||
use Closure;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
|
||||
class AuthCheckMiddleware
|
||||
{
|
||||
/**
|
||||
* 处理传入请求
|
||||
*
|
||||
* @param Request $request
|
||||
* @param Closure $next
|
||||
* @param string|null $guard 认证守卫名称(默认为 api)
|
||||
* @param string|null $permission 需要检查的权限编码(可选)
|
||||
* @return Response
|
||||
*/
|
||||
public function handle(Request $request, Closure $next, ?string $guard = 'api', ?string $permission = null): Response
|
||||
{
|
||||
// 检查是否已认证
|
||||
if (!Auth::guard($guard)->check()) {
|
||||
return response()->json([
|
||||
'code' => 401,
|
||||
'message' => '未登录或token已过期',
|
||||
'data' => null,
|
||||
], 401);
|
||||
}
|
||||
|
||||
// 获取当前用户
|
||||
$user = Auth::guard($guard)->user();
|
||||
|
||||
// 检查用户状态
|
||||
if (isset($user->status) && $user->status !== 1) {
|
||||
return response()->json([
|
||||
'code' => 403,
|
||||
'message' => '账号已被禁用',
|
||||
'data' => null,
|
||||
], 403);
|
||||
}
|
||||
|
||||
// 如果需要检查权限
|
||||
if ($permission !== null) {
|
||||
if (!$this->checkPermission($user, $permission, $guard)) {
|
||||
return response()->json([
|
||||
'code' => 403,
|
||||
'message' => '无权限访问',
|
||||
'data' => null,
|
||||
], 403);
|
||||
}
|
||||
}
|
||||
|
||||
// 将用户信息添加到请求中
|
||||
$request->merge(['auth_user' => $user]);
|
||||
|
||||
// 更新用户最后活跃时间
|
||||
if (method_exists($user, 'updateLastActiveAt')) {
|
||||
$user->updateLastActiveAt();
|
||||
}
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查用户权限
|
||||
*
|
||||
* @param mixed $user
|
||||
* @param string $permission 权限编码
|
||||
* @param string $guard 认证守卫
|
||||
* @return bool
|
||||
*/
|
||||
protected function checkPermission($user, string $permission, string $guard): bool
|
||||
{
|
||||
// 如果用户有所有权限标识
|
||||
if (method_exists($user, 'hasAllPermissions') && $user->hasAllPermissions()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// 检查用户是否有指定权限
|
||||
if (method_exists($user, 'hasPermission')) {
|
||||
return $user->hasPermission($permission);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查多个权限(满足任意一个即可)
|
||||
*
|
||||
* @param array $permissions 权限编码数组
|
||||
* @return bool
|
||||
*/
|
||||
protected function checkAnyPermission($user, array $permissions): bool
|
||||
{
|
||||
foreach ($permissions as $permission) {
|
||||
if ($this->checkPermission($user, $permission, 'api')) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查多个权限(必须全部满足)
|
||||
*
|
||||
* @param array $permissions 权限编码数组
|
||||
* @return bool
|
||||
*/
|
||||
protected function checkAllPermissions($user, array $permissions): bool
|
||||
{
|
||||
foreach ($permissions as $permission) {
|
||||
if (!$this->checkPermission($user, $permission, 'api')) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
242
app/Http/Middleware/LogRequestMiddleware.php
Normal file
242
app/Http/Middleware/LogRequestMiddleware.php
Normal file
@@ -0,0 +1,242 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Middleware;
|
||||
|
||||
use Closure;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\Log as LaravelLog;
|
||||
use App\Services\System\LogService;
|
||||
use Throwable;
|
||||
|
||||
class LogRequestMiddleware
|
||||
{
|
||||
protected $logService;
|
||||
|
||||
public function __construct(LogService $logService)
|
||||
{
|
||||
$this->logService = $logService;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle an incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param \Closure $next
|
||||
* @return mixed
|
||||
*/
|
||||
public function handle(Request $request, Closure $next)
|
||||
{
|
||||
$startTime = microtime(true);
|
||||
|
||||
$response = $next($request);
|
||||
|
||||
$endTime = microtime(true);
|
||||
$executionTime = round(($endTime - $startTime) * 1000, 2); // 转换为毫秒
|
||||
|
||||
// 异步记录日志,不影响响应速度
|
||||
$this->logRequest($request, $response, $executionTime);
|
||||
|
||||
return $response;
|
||||
}
|
||||
|
||||
/**
|
||||
* 记录请求日志
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param \Illuminate\Http\Response $response
|
||||
* @param float $executionTime
|
||||
* @return void
|
||||
*/
|
||||
protected function logRequest(Request $request, $response, float $executionTime): void
|
||||
{
|
||||
try {
|
||||
// 获取当前用户信息
|
||||
$user = Auth::guard('admin')->user();
|
||||
$userId = $user ? $user->id : null;
|
||||
$username = $user ? $user->username : 'guest';
|
||||
|
||||
// 解析模块和操作
|
||||
$module = $this->parseModule($request->path());
|
||||
$action = $this->parseAction($request->method(), $request->path());
|
||||
|
||||
// 获取请求参数(排除敏感信息)
|
||||
$params = $this->sanitizeParams($request->all());
|
||||
|
||||
// 获取响应数据
|
||||
$result = null;
|
||||
if ($response->getStatusCode() >= 400) {
|
||||
$result = $response->getContent();
|
||||
}
|
||||
|
||||
// 确定日志状态
|
||||
$status = $response->getStatusCode() < 400 ? 'success' : 'error';
|
||||
$errorMessage = null;
|
||||
if ($status === 'error') {
|
||||
$errorMessage = $this->extractErrorMessage($result);
|
||||
}
|
||||
|
||||
// 构建日志数据
|
||||
$logData = [
|
||||
'user_id' => $userId,
|
||||
'username' => $username,
|
||||
'module' => $module,
|
||||
'action' => $action,
|
||||
'method' => $request->method(),
|
||||
'url' => $request->fullUrl(),
|
||||
'ip' => $this->getClientIp($request),
|
||||
'user_agent' => $request->userAgent(),
|
||||
'params' => $params,
|
||||
'result' => $result,
|
||||
'status_code' => $response->getStatusCode(),
|
||||
'status' => $status,
|
||||
'error_message' => $errorMessage,
|
||||
'execution_time' => $executionTime,
|
||||
];
|
||||
|
||||
// 记录到数据库
|
||||
$this->logService->create($logData);
|
||||
|
||||
// 同时记录到 Laravel 日志(用于错误)
|
||||
if ($status === 'error') {
|
||||
LaravelLog::error('API Request Error', [
|
||||
'url' => $request->fullUrl(),
|
||||
'method' => $request->method(),
|
||||
'user_id' => $userId,
|
||||
'error' => $errorMessage,
|
||||
]);
|
||||
}
|
||||
|
||||
} catch (Throwable $e) {
|
||||
// 记录日志失败不影响业务流程
|
||||
LaravelLog::error('Log request failed', [
|
||||
'error' => $e->getMessage(),
|
||||
'trace' => $e->getTraceAsString(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析模块名称
|
||||
*
|
||||
* @param string $path
|
||||
* @return string
|
||||
*/
|
||||
protected function parseModule(string $path): string
|
||||
{
|
||||
$segments = explode('/', trim($path, '/'));
|
||||
|
||||
// 移除前缀(如 admin, api)
|
||||
$prefixes = ['admin', 'api'];
|
||||
if (in_array($segments[0], $prefixes)) {
|
||||
array_shift($segments);
|
||||
}
|
||||
|
||||
return $segments[0] ?? 'unknown';
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析操作名称
|
||||
*
|
||||
* @param string $method
|
||||
* @param string $path
|
||||
* @return string
|
||||
*/
|
||||
protected function parseAction(string $method, string $path): string
|
||||
{
|
||||
$segments = explode('/', trim($path, '/'));
|
||||
|
||||
// 获取资源名称
|
||||
$resource = end($segments);
|
||||
|
||||
// 如果资源是 ID,则取前一个作为资源名
|
||||
if (is_numeric($resource)) {
|
||||
$resource = prev($segments);
|
||||
}
|
||||
|
||||
// 根据方法映射操作
|
||||
$actionMap = [
|
||||
'GET' => '查询',
|
||||
'POST' => '创建',
|
||||
'PUT' => '更新',
|
||||
'PATCH' => '更新',
|
||||
'DELETE' => '删除',
|
||||
];
|
||||
|
||||
$action = $actionMap[$method] ?? '操作';
|
||||
|
||||
return $action . ' ' . $resource;
|
||||
}
|
||||
|
||||
/**
|
||||
* 清理敏感参数
|
||||
*
|
||||
* @param array $params
|
||||
* @return array
|
||||
*/
|
||||
protected function sanitizeParams(array $params): array
|
||||
{
|
||||
$sensitiveKeys = ['password', 'password_confirmation', 'token', 'secret', 'key'];
|
||||
|
||||
array_walk_recursive($params, function (&$value, $key) use ($sensitiveKeys) {
|
||||
if (in_array(strtolower($key), $sensitiveKeys)) {
|
||||
$value = '******';
|
||||
}
|
||||
});
|
||||
|
||||
return $params;
|
||||
}
|
||||
|
||||
/**
|
||||
* 提取错误信息
|
||||
*
|
||||
* @param string|null $content
|
||||
* @return string|null
|
||||
*/
|
||||
protected function extractErrorMessage(?string $content): ?string
|
||||
{
|
||||
if (empty($content)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
$data = json_decode($content, true);
|
||||
if (isset($data['message'])) {
|
||||
return $data['message'];
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
// JSON 解析失败,返回原始内容
|
||||
}
|
||||
|
||||
return $content;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取客户端 IP
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return string
|
||||
*/
|
||||
protected function getClientIp(Request $request): string
|
||||
{
|
||||
$ip = $request->ip();
|
||||
|
||||
// 检查代理头
|
||||
$headers = [
|
||||
'HTTP_X_FORWARDED_FOR',
|
||||
'HTTP_CLIENT_IP',
|
||||
'HTTP_X_REAL_IP',
|
||||
'HTTP_CF_CONNECTING_IP',
|
||||
];
|
||||
|
||||
foreach ($headers as $header) {
|
||||
if ($request->hasHeader($header)) {
|
||||
$forwardedIps = explode(',', $request->header($header));
|
||||
$ip = trim($forwardedIps[0]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return $ip;
|
||||
}
|
||||
}
|
||||
139
app/Http/Requests/LogRequest.php
Normal file
139
app/Http/Requests/LogRequest.php
Normal file
@@ -0,0 +1,139 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Requests;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
use Illuminate\Contracts\Validation\Validator;
|
||||
use Illuminate\Http\Exceptions\HttpResponseException;
|
||||
|
||||
class LogRequest extends FormRequest
|
||||
{
|
||||
/**
|
||||
* Determine if the user is authorized to make this request.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function authorize(): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the validation rules that apply to the request.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function rules(): array
|
||||
{
|
||||
$rules = [];
|
||||
|
||||
if ($this->isMethod('GET')) {
|
||||
// 列表查询参数验证
|
||||
$rules = [
|
||||
'user_id' => 'nullable|integer|exists:auth_users,id',
|
||||
'username' => 'nullable|string|max:50',
|
||||
'module' => 'nullable|string|max:50',
|
||||
'action' => 'nullable|string|max:100',
|
||||
'status' => 'nullable|in:success,error',
|
||||
'start_date' => 'nullable|date',
|
||||
'end_date' => 'nullable|date|after_or_equal:start_date',
|
||||
'ip' => 'nullable|ip',
|
||||
'page' => 'nullable|integer|min:1',
|
||||
'page_size' => 'nullable|integer|min:1|max:100',
|
||||
];
|
||||
} elseif ($this->isMethod('POST')) {
|
||||
// 批量删除参数验证
|
||||
if ($this->routeIs('*.batch-delete')) {
|
||||
$rules = [
|
||||
'ids' => 'required|array',
|
||||
'ids.*' => 'required|integer|exists:system_logs,id',
|
||||
];
|
||||
}
|
||||
// 清理日志参数验证
|
||||
if ($this->routeIs('*.clear')) {
|
||||
$rules = [
|
||||
'days' => 'nullable|integer|min:1|max:365',
|
||||
];
|
||||
}
|
||||
} elseif ($this->isMethod('DELETE')) {
|
||||
// 单个删除参数验证
|
||||
$rules = [
|
||||
'id' => 'required|integer|exists:system_logs,id',
|
||||
];
|
||||
}
|
||||
|
||||
return $rules;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get custom messages for validator errors.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function messages(): array
|
||||
{
|
||||
return [
|
||||
'user_id.exists' => '用户不存在',
|
||||
'username.max' => '用户名最多50个字符',
|
||||
'module.max' => '模块名最多50个字符',
|
||||
'action.max' => '操作名最多100个字符',
|
||||
'status.in' => '状态值必须是 success 或 error',
|
||||
'start_date.date' => '开始日期格式不正确',
|
||||
'end_date.date' => '结束日期格式不正确',
|
||||
'end_date.after_or_equal' => '结束日期必须大于或等于开始日期',
|
||||
'ip.ip' => 'IP地址格式不正确',
|
||||
'page.integer' => '页码必须是整数',
|
||||
'page.min' => '页码必须大于0',
|
||||
'page_size.integer' => '每页数量必须是整数',
|
||||
'page_size.min' => '每页数量必须大于0',
|
||||
'page_size.max' => '每页数量不能超过100',
|
||||
'ids.required' => '请选择要删除的日志',
|
||||
'ids.array' => '日志ID必须是数组',
|
||||
'ids.*.required' => '日志ID不能为空',
|
||||
'ids.*.integer' => '日志ID必须是整数',
|
||||
'ids.*.exists' => '日志不存在',
|
||||
'days.integer' => '天数必须是整数',
|
||||
'days.min' => '天数必须大于0',
|
||||
'days.max' => '天数不能超过365',
|
||||
'id.required' => '日志ID不能为空',
|
||||
'id.integer' => '日志ID必须是整数',
|
||||
'id.exists' => '日志不存在',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle a failed validation attempt.
|
||||
*
|
||||
* @param \Illuminate\Contracts\Validation\Validator $validator
|
||||
* @return void
|
||||
*
|
||||
* @throws \Illuminate\Http\Exceptions\HttpResponseException
|
||||
*/
|
||||
protected function failedValidation(Validator $validator): void
|
||||
{
|
||||
throw new HttpResponseException(
|
||||
response()->json([
|
||||
'code' => 422,
|
||||
'message' => $validator->errors()->first(),
|
||||
'data' => null,
|
||||
], 422)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepare the data for validation.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function prepareForValidation(): void
|
||||
{
|
||||
// 设置默认值
|
||||
if ($this->isMethod('GET')) {
|
||||
$this->merge([
|
||||
'page' => $this->input('page', 1),
|
||||
'page_size' => $this->input('page_size', 20),
|
||||
'days' => $this->input('days', 30),
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user