diff --git a/app/Http/Controllers/Admin/BaseController.php b/app/Http/Controllers/Admin/BaseController.php index f721faa..6b26e34 100644 --- a/app/Http/Controllers/Admin/BaseController.php +++ b/app/Http/Controllers/Admin/BaseController.php @@ -13,6 +13,11 @@ use Psr\SimpleCache\InvalidArgumentException; class BaseController extends Controller { + // 用户信息 + protected array|null $adminUser; + // 用户id + protected int $adminUserId; + /** * @var ApiResponseService */ @@ -26,6 +31,8 @@ class BaseController extends Controller ApiResponseService $responseService ) { $this->responseService = $responseService; + $this->adminUser = Auth::guard('sanctum')->user(); + $this->adminUserId = $this->adminUser['id'] ?? 0; } /** @@ -61,8 +68,7 @@ class BaseController extends Controller */ protected function methodShow(string $className, array $auth = []): array { - $user = Auth::guard('sanctum')->user(); - $methodAuthArr = AdminMenuService::auth($user->id); + $methodAuthArr = AdminMenuService::auth($this->adminUserId); $authArr = [ $className . '/show' => 0, $className . '/store' => 0, diff --git a/app/Http/Controllers/Admin/ConfigController.php b/app/Http/Controllers/Admin/ConfigController.php index 58bc80c..70abfe9 100644 --- a/app/Http/Controllers/Admin/ConfigController.php +++ b/app/Http/Controllers/Admin/ConfigController.php @@ -25,6 +25,7 @@ class ConfigController extends BaseController ) { parent::__construct($responseService); $this->logService = $logService; + $this->logService->menuTitle = 'total_configuration'; } // diff --git a/app/Http/Controllers/Admin/IndexController.php b/app/Http/Controllers/Admin/IndexController.php index 929ab2b..b938841 100644 --- a/app/Http/Controllers/Admin/IndexController.php +++ b/app/Http/Controllers/Admin/IndexController.php @@ -39,9 +39,9 @@ class IndexController extends BaseController public function menu(): JsonResponse { try { - $user = Auth::guard('sanctum')->user(); - $user_id = $user['id'] ?? 1; - $data = (new AdminMenuService())->getUserMenuTreeList($user_id); + $data = (new AdminMenuService())->getUserMenuTreeList( + $this->adminUserId + ); return $this->responseService->success($data); } catch (Exception $e) { $m_prefix = __('exception.get_data_failed'); diff --git a/app/Http/Controllers/Admin/OperationLogController.php b/app/Http/Controllers/Admin/OperationLogController.php index 508db71..5633cdd 100644 --- a/app/Http/Controllers/Admin/OperationLogController.php +++ b/app/Http/Controllers/Admin/OperationLogController.php @@ -3,15 +3,21 @@ namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; +use App\Models\AdminMenu; use App\Models\AdminOperationLog; use App\Models\AdminUsers; +use App\Services\AdminMenuService; use App\Services\ApiResponseService; use Exception; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Auth; class OperationLogController extends Controller { + + protected int $adminUserId; + /** * @var ApiResponseService */ @@ -25,6 +31,8 @@ class OperationLogController extends Controller ApiResponseService $responseService, ) { $this->responseService = $responseService; + $adminUser = Auth::guard('sanctum')->user(); + $this->adminUserId = $adminUser['id'] ?? 0; } public function search(): JsonResponse @@ -32,7 +40,11 @@ class OperationLogController extends Controller try { $data = [ 'type_data' => get_select_data( - AdminOperationLog::getActionArr(), true + AdminOperationLog::getActionArr(), + true + ), + 'main_directory_list' => AdminMenuService::getMenuList( + $this->adminUserId ) ]; return $this->responseService->success($data); @@ -44,6 +56,23 @@ class OperationLogController extends Controller } } + /** + * @param $id + * @return JsonResponse + */ + public function getSubDirectoryList($id): JsonResponse + { + try { + $data = AdminMenuService::getMenuList($this->adminUserId, $id); + return $this->responseService->success($data); + } catch (Exception $e) { + $m_prefix = __('exception.exception_handler.resource'); + return $this->responseService->systemError( + $m_prefix . ':' . $e->getMessage() + ); + } + } + /** * @param Request $request * @return JsonResponse @@ -56,26 +85,34 @@ class OperationLogController extends Controller // 关键词搜索 if ($request->has('type')) { $type = $request->input('type'); - $query->where('action', '=', $type); + if (!empty($type)) { + $query->where('action', '=', $type); + } } if ($request->has('name')) { $name = $request->input('name'); - $user_id = AdminUsers::query()->where('name', $name)->value( - 'id' - ); - $user_id = $user_id ?: 0; - $query->where('user_id', '=', $user_id); + if (!empty($name)) { + $user_id = AdminUsers::query()->where('name', $name)->value( + 'id' + ); + $user_id = $user_id ?: 0; + $query->where('user_id', '=', $user_id); + } } if ($request->has('start_time')) { $start_time = $request->input('start_time'); - $query->where('created_at', '>=', $start_time); + if (!empty($start_time)) { + $query->where('created_at', '>=', $start_time); + } } if ($request->has('end_time')) { $end_time = $request->input('end_time'); - $query->where('created_at', '<=', $end_time); + if (!empty($end_time)) { + $query->where('created_at', '<=', $end_time); + } } // 分页 @@ -83,15 +120,34 @@ class OperationLogController extends Controller $perPage = $request->input('per_page', 10); $total = $query->count(); - $items = $query->latest()->forPage($page, $perPage)->get()->each( - function ($item) { - $actionArr = AdminOperationLog::getActionArr(); - $item['operation_name'] = $item->user->value('name'); - $item['action'] = $actionArr[$item['action']]; - unset($item['user']); - return $item; - } - ); + $field = [ + 'id', 'user_id', 'action', 'description', 'sub_directory', + 'created_at' + ]; + $items = $query->latest()->forPage($page, $perPage)->select($field) + ->get()->each( + function ($item) { + $actionArr = AdminOperationLog::getActionArr(); + $username = AdminUsers::getUsername($item['user_id']); + $item['operation_name'] = $username ?? ''; + $item['action_str'] = $actionArr[$item['action']] ?? + $item['action']; + $item['main_directory'] = ''; + if ($item['sub_directory']) { + $item['main_directory'] + = AdminMenu::getLastParentTitle( + $item['sub_directory'] + ); + $item['sub_directory'] = AdminMenu::getParentTitle( + $item['sub_directory'] + ); + } else { + $item['sub_directory'] = ''; + } + unset($item['user_id']); + return $item; + } + ); return $this->responseService->success([ 'items' => $items, diff --git a/app/Models/AdminMenu.php b/app/Models/AdminMenu.php index 64299f9..2b4b4d1 100644 --- a/app/Models/AdminMenu.php +++ b/app/Models/AdminMenu.php @@ -24,6 +24,64 @@ class AdminMenu extends Model 'deleted_at', ]; + // 查询菜单列表 + public static function getMenuList( + int $parent_id = 0, + array $menu_ids = [] + ): array + { + $model = self::query(); + if ($menu_ids) { + $model->whereIn('id', $menu_ids); + } + $list = $model->where('parent_id', $parent_id)->whereNull( + 'deleted_at' + )->select(['id', 'title'])->get()->toArray(); + foreach ($list as &$item) { + $item['title'] = empty($item['title']) + ? '' + : __( + 'menu.' . $item['title'] + ); + } + return $list; + } + + // 获取目录id + public static function getMenuId($title, $is_child = false) + { + $model = self::query()->where('title', $title); + if ($is_child) { + $model->where('parent_id', '>', 0); + } + return $model->value('id'); + } + + // 获取目录名称 + public static function getParentTitle($parent_id): string + { + $title = self::query()->where('id', $parent_id)->whereNull('deleted_at')->value('title'); + return empty($title) ? '' : __('menu.' . $title); + } + + // 获取上级目录名称 + public static function getLastParentTitle($parent_id): string + { + $last_parent_id = self::query()->where('id', $parent_id)->whereNull('deleted_at')->value('parent_id'); + $title = self::getTreeTitle($last_parent_id); + return empty($title) ? '' : __('menu.' . $title); + } + + // 获取最高级目录名称 + public static function getTreeTitle($id): string + { + $value = self::query()->whereNull('deleted_at')->find($id); + if ($value['parent_id'] > 0) { + return self::getTreeTitle($value['parent_id']); + } + return $value['title']; + } + /** * @param $value * @return string diff --git a/app/Models/AdminOperationLog.php b/app/Models/AdminOperationLog.php index e2fa6ad..285b54a 100644 --- a/app/Models/AdminOperationLog.php +++ b/app/Models/AdminOperationLog.php @@ -23,6 +23,8 @@ class AdminOperationLog extends Model 'description', 'old_values', 'new_values', + 'main_directory', + 'sub_directory' ]; /** @@ -37,34 +39,41 @@ class AdminOperationLog extends Model protected $table = 'admin_operation_log'; - protected $hidden = [ - 'updated_at' - ]; - - /** - * 获取关联的模型 - */ - public function model() - { - return $this->morphTo(); - } + protected $hidden + = [ + 'updated_at' + ]; /** * @return string[] */ - #[ArrayShape(['login' => "string", - 'logout' => "string", - 'create' => "string", - 'update' => "string", - 'delete' => "string" + #[ArrayShape([ + 'login' => "string", + 'logout' => "string", + 'create' => "string", + 'update' => "string", + 'delete' => "string" ])] public static function getActionArr(): array { return [ - 'login' => __('admin.login'), + 'login' => __('admin.login'), 'logout' => __('admin.logout'), 'create' => __('admin.new'), 'update' => __('admin.edit'), 'delete' => __('admin.delete') ]; } + + /** + * 获取关联的模型 + */ + public function model() + { + return $this->morphTo(); + } + + public function getCreatedAtAttribute($value): string + { + return get_datetime('datetime', strtotime($value)); + } } diff --git a/app/Services/AdminFloorService.php b/app/Services/AdminFloorService.php index 30315f7..1cfe4b6 100644 --- a/app/Services/AdminFloorService.php +++ b/app/Services/AdminFloorService.php @@ -24,6 +24,7 @@ class AdminFloorService public function __construct(OperationLogService $logService) { $this->logService = $logService; + $this->logService->menuTitle = 'floor_plan'; } /** diff --git a/app/Services/AdminMenuService.php b/app/Services/AdminMenuService.php index bc72a77..ef2be1d 100644 --- a/app/Services/AdminMenuService.php +++ b/app/Services/AdminMenuService.php @@ -80,6 +80,17 @@ final class AdminMenuService * @return array */ public function getUserMenuTreeList($user_id): array + { + $menus_id = $this->getUserRolesMenuIds($user_id); + return $this->getMenuTreeList($menus_id, 1); + } + + /** + * 获取用户有权菜单 + * @param $user_id + * @return array + */ + public function getUserRolesMenuIds($user_id): array { $AdminUsers = AdminUsers::find($user_id); $roles_id = $AdminUsers->roles()->where('status', 1)->pluck('id') @@ -93,7 +104,7 @@ final class AdminMenuService if (!$menus_id) { return []; } - return $this->getMenuTreeList($menus_id, 1); + return $menus_id; } /** @@ -118,4 +129,18 @@ final class AdminMenuService } return $uriArr; } + + /** + * @param int $user_id + * @param int $parent_id + * @return array + */ + public static function getMenuList(int $user_id, int $parent_id = 0): array + { + $menu_ids = []; + if ($user_id) { + $menu_ids = (new self())->getUserRolesMenuIds($user_id); + } + return AdminMenu::getMenuList($parent_id, $menu_ids); + } } diff --git a/app/Services/AdminRolesService.php b/app/Services/AdminRolesService.php index 11fb610..ee2d567 100644 --- a/app/Services/AdminRolesService.php +++ b/app/Services/AdminRolesService.php @@ -23,6 +23,7 @@ final class AdminRolesService public function __construct(OperationLogService $logService) { $this->logService = $logService; + $this->logService->menuTitle = 'role_manage'; } /** diff --git a/app/Services/AdminTranslationService.php b/app/Services/AdminTranslationService.php index 67c1641..d73007f 100644 --- a/app/Services/AdminTranslationService.php +++ b/app/Services/AdminTranslationService.php @@ -21,6 +21,7 @@ class AdminTranslationService public function __construct(OperationLogService $logService) { $this->logService = $logService; + $this->logService->menuTitle = 'translation'; } /** diff --git a/app/Services/AdminUsersService.php b/app/Services/AdminUsersService.php index e39fd6b..0235a89 100644 --- a/app/Services/AdminUsersService.php +++ b/app/Services/AdminUsersService.php @@ -25,6 +25,7 @@ final class AdminUsersService public function __construct(OperationLogService $logService) { $this->logService = $logService; + $this->logService->menuTitle = 'user_list'; } /** diff --git a/app/Services/OperationLogService.php b/app/Services/OperationLogService.php index 83b0302..93381ce 100644 --- a/app/Services/OperationLogService.php +++ b/app/Services/OperationLogService.php @@ -2,6 +2,7 @@ namespace App\Services; +use App\Models\AdminMenu; use App\Models\AdminOperationLog; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Facades\Auth; @@ -9,6 +10,13 @@ use Illuminate\Support\Facades\Request; final class OperationLogService { + + /** + * 菜单title + * @var string + */ + public string $menuTitle = ''; + /** * 记录操作日志 * @@ -46,6 +54,10 @@ final class OperationLogService $data['new_values'] = $newValues; } + if ($this->menuTitle) { + $subDirectory = AdminMenu::getMenuId($this->menuTitle); + $data['sub_directory'] = $subDirectory ?? 0; + } return AdminOperationLog::create($data); } diff --git a/app/Services/ParkingLicensePlateService.php b/app/Services/ParkingLicensePlateService.php index 1274445..91bb751 100644 --- a/app/Services/ParkingLicensePlateService.php +++ b/app/Services/ParkingLicensePlateService.php @@ -23,6 +23,7 @@ class ParkingLicensePlateService public function __construct(OperationLogService $logService) { $this->logService = $logService; + $this->logService->menuTitle = 'cat_attr'; } /** diff --git a/app/Services/ParkingSpaceAttributesService.php b/app/Services/ParkingSpaceAttributesService.php index 20fde4a..cf0dde9 100644 --- a/app/Services/ParkingSpaceAttributesService.php +++ b/app/Services/ParkingSpaceAttributesService.php @@ -23,6 +23,7 @@ class ParkingSpaceAttributesService public function __construct(OperationLogService $logService) { $this->logService = $logService; + $this->logService->menuTitle = 'license_plate_management'; } /** diff --git a/app/Services/ParkingSpaceTypeService.php b/app/Services/ParkingSpaceTypeService.php index 6f13c34..f1a039d 100644 --- a/app/Services/ParkingSpaceTypeService.php +++ b/app/Services/ParkingSpaceTypeService.php @@ -37,6 +37,7 @@ class ParkingSpaceTypeService public function __construct(OperationLogService $logService) { $this->logService = $logService; + $this->logService->menuTitle = 'cat_type'; } /** diff --git a/app/Services/ParkingVipListService.php b/app/Services/ParkingVipListService.php index 464f6ba..df209fb 100644 --- a/app/Services/ParkingVipListService.php +++ b/app/Services/ParkingVipListService.php @@ -12,7 +12,6 @@ use Illuminate\Support\Facades\DB; class ParkingVipListService { - /** * @var OperationLogService */ @@ -25,6 +24,7 @@ class ParkingVipListService public function __construct(OperationLogService $logService) { $this->logService = $logService; + $this->logService->menuTitle = 'vip_list'; } diff --git a/database/migrations/2026_01_27_084640_create_admin_table.php b/database/migrations/2026_01_27_084640_create_admin_table.php index 6c85df2..acfd9cb 100644 --- a/database/migrations/2026_01_27_084640_create_admin_table.php +++ b/database/migrations/2026_01_27_084640_create_admin_table.php @@ -104,8 +104,7 @@ return new class extends Migration $table->unsignedBigInteger('model_id')->nullable()->comment('模型ID'); $table->string('ip')->nullable()->comment('操作IP'); $table->text('description')->nullable()->comment('操作描述'); - $table->string('main_directory', 50)->nullable()->comment('主目录'); - $table->string('sub_directory', 50)->nullable()->comment('副目录'); + $table->integer('sub_directory')->nullable()->default(0)->comment('副目录(菜单id)'); $table->json('old_values')->nullable()->comment('旧值'); $table->json('new_values')->nullable()->comment('新值'); $table->timestamps(); diff --git a/routes/admin/api.php b/routes/admin/api.php index 3501c9a..7c3b759 100644 --- a/routes/admin/api.php +++ b/routes/admin/api.php @@ -81,6 +81,7 @@ Route::group(['prefix' => 'admin'], function () { // 系统日志 Route::get('/operationLog/index', [OperationLogController::class, 'index']); Route::get('/operationLog/search', [OperationLogController::class, 'search']); + Route::get('/operationLog/directory/{id}', [OperationLogController::class, 'getSubDirectoryList']); // 系统总配置 Route::get('/config/index', [ConfigController::class, 'index']);