初始化项目

This commit is contained in:
2026-02-08 22:38:13 +08:00
commit 334d2c6312
201 changed files with 32724 additions and 0 deletions

View 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);
}
}
}

View 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();
}
}

View 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],
]);
}
}

View 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,
]);
}
}

View 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,
]);
}
}

View File

@@ -0,0 +1,8 @@
<?php
namespace App\Http\Controllers;
abstract class Controller
{
//
}

View 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
]);
}
}

View 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
]);
}
}

View 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
]);
}
}

View 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
]);
}
}

View 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
]);
}
}

View 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);
}
}
}

View 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
]);
}
}

View 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,
]
]);
}
}

View 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
]);
}
}

View 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);
}
}
}

View 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);
}
}