Browse Source

优化系统日志接口,补全日志目录

master
wanghongjun 1 week ago
parent
commit
00ced041c6
  1. 10
      app/Http/Controllers/Admin/BaseController.php
  2. 1
      app/Http/Controllers/Admin/ConfigController.php
  3. 6
      app/Http/Controllers/Admin/IndexController.php
  4. 92
      app/Http/Controllers/Admin/OperationLogController.php
  5. 58
      app/Models/AdminMenu.php
  6. 43
      app/Models/AdminOperationLog.php
  7. 1
      app/Services/AdminFloorService.php
  8. 27
      app/Services/AdminMenuService.php
  9. 1
      app/Services/AdminRolesService.php
  10. 1
      app/Services/AdminTranslationService.php
  11. 1
      app/Services/AdminUsersService.php
  12. 12
      app/Services/OperationLogService.php
  13. 1
      app/Services/ParkingLicensePlateService.php
  14. 1
      app/Services/ParkingSpaceAttributesService.php
  15. 1
      app/Services/ParkingSpaceTypeService.php
  16. 2
      app/Services/ParkingVipListService.php
  17. 3
      database/migrations/2026_01_27_084640_create_admin_table.php
  18. 1
      routes/admin/api.php

10
app/Http/Controllers/Admin/BaseController.php

@ -13,6 +13,11 @@ use Psr\SimpleCache\InvalidArgumentException;
class BaseController extends Controller class BaseController extends Controller
{ {
// 用户信息
protected array|null $adminUser;
// 用户id
protected int $adminUserId;
/** /**
* @var ApiResponseService * @var ApiResponseService
*/ */
@ -26,6 +31,8 @@ class BaseController extends Controller
ApiResponseService $responseService ApiResponseService $responseService
) { ) {
$this->responseService = $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 protected function methodShow(string $className, array $auth = []): array
{ {
$user = Auth::guard('sanctum')->user(); $methodAuthArr = AdminMenuService::auth($this->adminUserId);
$methodAuthArr = AdminMenuService::auth($user->id);
$authArr = [ $authArr = [
$className . '/show' => 0, $className . '/show' => 0,
$className . '/store' => 0, $className . '/store' => 0,

1
app/Http/Controllers/Admin/ConfigController.php

@ -25,6 +25,7 @@ class ConfigController extends BaseController
) { ) {
parent::__construct($responseService); parent::__construct($responseService);
$this->logService = $logService; $this->logService = $logService;
$this->logService->menuTitle = 'total_configuration';
} }
// //

6
app/Http/Controllers/Admin/IndexController.php

@ -39,9 +39,9 @@ class IndexController extends BaseController
public function menu(): JsonResponse public function menu(): JsonResponse
{ {
try { try {
$user = Auth::guard('sanctum')->user(); $data = (new AdminMenuService())->getUserMenuTreeList(
$user_id = $user['id'] ?? 1; $this->adminUserId
$data = (new AdminMenuService())->getUserMenuTreeList($user_id); );
return $this->responseService->success($data); return $this->responseService->success($data);
} catch (Exception $e) { } catch (Exception $e) {
$m_prefix = __('exception.get_data_failed'); $m_prefix = __('exception.get_data_failed');

92
app/Http/Controllers/Admin/OperationLogController.php

@ -3,15 +3,21 @@
namespace App\Http\Controllers\Admin; namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\AdminMenu;
use App\Models\AdminOperationLog; use App\Models\AdminOperationLog;
use App\Models\AdminUsers; use App\Models\AdminUsers;
use App\Services\AdminMenuService;
use App\Services\ApiResponseService; use App\Services\ApiResponseService;
use Exception; use Exception;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class OperationLogController extends Controller class OperationLogController extends Controller
{ {
protected int $adminUserId;
/** /**
* @var ApiResponseService * @var ApiResponseService
*/ */
@ -25,6 +31,8 @@ class OperationLogController extends Controller
ApiResponseService $responseService, ApiResponseService $responseService,
) { ) {
$this->responseService = $responseService; $this->responseService = $responseService;
$adminUser = Auth::guard('sanctum')->user();
$this->adminUserId = $adminUser['id'] ?? 0;
} }
public function search(): JsonResponse public function search(): JsonResponse
@ -32,7 +40,11 @@ class OperationLogController extends Controller
try { try {
$data = [ $data = [
'type_data' => get_select_data( 'type_data' => get_select_data(
AdminOperationLog::getActionArr(), true AdminOperationLog::getActionArr(),
true
),
'main_directory_list' => AdminMenuService::getMenuList(
$this->adminUserId
) )
]; ];
return $this->responseService->success($data); 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 * @param Request $request
* @return JsonResponse * @return JsonResponse
@ -56,26 +85,34 @@ class OperationLogController extends Controller
// 关键词搜索 // 关键词搜索
if ($request->has('type')) { if ($request->has('type')) {
$type = $request->input('type'); $type = $request->input('type');
$query->where('action', '=', $type); if (!empty($type)) {
$query->where('action', '=', $type);
}
} }
if ($request->has('name')) { if ($request->has('name')) {
$name = $request->input('name'); $name = $request->input('name');
$user_id = AdminUsers::query()->where('name', $name)->value( if (!empty($name)) {
'id' $user_id = AdminUsers::query()->where('name', $name)->value(
); 'id'
$user_id = $user_id ?: 0; );
$query->where('user_id', '=', $user_id); $user_id = $user_id ?: 0;
$query->where('user_id', '=', $user_id);
}
} }
if ($request->has('start_time')) { if ($request->has('start_time')) {
$start_time = $request->input('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')) { if ($request->has('end_time')) {
$end_time = $request->input('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); $perPage = $request->input('per_page', 10);
$total = $query->count(); $total = $query->count();
$items = $query->latest()->forPage($page, $perPage)->get()->each( $field = [
function ($item) { 'id', 'user_id', 'action', 'description', 'sub_directory',
$actionArr = AdminOperationLog::getActionArr(); 'created_at'
$item['operation_name'] = $item->user->value('name'); ];
$item['action'] = $actionArr[$item['action']]; $items = $query->latest()->forPage($page, $perPage)->select($field)
unset($item['user']); ->get()->each(
return $item; 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([ return $this->responseService->success([
'items' => $items, 'items' => $items,

58
app/Models/AdminMenu.php

@ -24,6 +24,64 @@ class AdminMenu extends Model
'deleted_at', '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 * @param $value
* @return string * @return string

43
app/Models/AdminOperationLog.php

@ -23,6 +23,8 @@ class AdminOperationLog extends Model
'description', 'description',
'old_values', 'old_values',
'new_values', 'new_values',
'main_directory',
'sub_directory'
]; ];
/** /**
@ -37,34 +39,41 @@ class AdminOperationLog extends Model
protected $table = 'admin_operation_log'; protected $table = 'admin_operation_log';
protected $hidden = [ protected $hidden
'updated_at' = [
]; 'updated_at'
];
/**
* 获取关联的模型
*/
public function model()
{
return $this->morphTo();
}
/** /**
* @return string[] * @return string[]
*/ */
#[ArrayShape(['login' => "string", #[ArrayShape([
'logout' => "string", 'login' => "string",
'create' => "string", 'logout' => "string",
'update' => "string", 'create' => "string",
'delete' => "string" 'update' => "string",
'delete' => "string"
])] public static function getActionArr(): array ])] public static function getActionArr(): array
{ {
return [ return [
'login' => __('admin.login'), 'login' => __('admin.login'),
'logout' => __('admin.logout'), 'logout' => __('admin.logout'),
'create' => __('admin.new'), 'create' => __('admin.new'),
'update' => __('admin.edit'), 'update' => __('admin.edit'),
'delete' => __('admin.delete') 'delete' => __('admin.delete')
]; ];
} }
/**
* 获取关联的模型
*/
public function model()
{
return $this->morphTo();
}
public function getCreatedAtAttribute($value): string
{
return get_datetime('datetime', strtotime($value));
}
} }

1
app/Services/AdminFloorService.php

@ -24,6 +24,7 @@ class AdminFloorService
public function __construct(OperationLogService $logService) public function __construct(OperationLogService $logService)
{ {
$this->logService = $logService; $this->logService = $logService;
$this->logService->menuTitle = 'floor_plan';
} }
/** /**

27
app/Services/AdminMenuService.php

@ -80,6 +80,17 @@ final class AdminMenuService
* @return array * @return array
*/ */
public function getUserMenuTreeList($user_id): 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); $AdminUsers = AdminUsers::find($user_id);
$roles_id = $AdminUsers->roles()->where('status', 1)->pluck('id') $roles_id = $AdminUsers->roles()->where('status', 1)->pluck('id')
@ -93,7 +104,7 @@ final class AdminMenuService
if (!$menus_id) { if (!$menus_id) {
return []; return [];
} }
return $this->getMenuTreeList($menus_id, 1); return $menus_id;
} }
/** /**
@ -118,4 +129,18 @@ final class AdminMenuService
} }
return $uriArr; 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);
}
} }

1
app/Services/AdminRolesService.php

@ -23,6 +23,7 @@ final class AdminRolesService
public function __construct(OperationLogService $logService) public function __construct(OperationLogService $logService)
{ {
$this->logService = $logService; $this->logService = $logService;
$this->logService->menuTitle = 'role_manage';
} }
/** /**

1
app/Services/AdminTranslationService.php

@ -21,6 +21,7 @@ class AdminTranslationService
public function __construct(OperationLogService $logService) public function __construct(OperationLogService $logService)
{ {
$this->logService = $logService; $this->logService = $logService;
$this->logService->menuTitle = 'translation';
} }
/** /**

1
app/Services/AdminUsersService.php

@ -25,6 +25,7 @@ final class AdminUsersService
public function __construct(OperationLogService $logService) public function __construct(OperationLogService $logService)
{ {
$this->logService = $logService; $this->logService = $logService;
$this->logService->menuTitle = 'user_list';
} }
/** /**

12
app/Services/OperationLogService.php

@ -2,6 +2,7 @@
namespace App\Services; namespace App\Services;
use App\Models\AdminMenu;
use App\Models\AdminOperationLog; use App\Models\AdminOperationLog;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
@ -9,6 +10,13 @@ use Illuminate\Support\Facades\Request;
final class OperationLogService final class OperationLogService
{ {
/**
* 菜单title
* @var string
*/
public string $menuTitle = '';
/** /**
* 记录操作日志 * 记录操作日志
* *
@ -46,6 +54,10 @@ final class OperationLogService
$data['new_values'] = $newValues; $data['new_values'] = $newValues;
} }
if ($this->menuTitle) {
$subDirectory = AdminMenu::getMenuId($this->menuTitle);
$data['sub_directory'] = $subDirectory ?? 0;
}
return AdminOperationLog::create($data); return AdminOperationLog::create($data);
} }

1
app/Services/ParkingLicensePlateService.php

@ -23,6 +23,7 @@ class ParkingLicensePlateService
public function __construct(OperationLogService $logService) public function __construct(OperationLogService $logService)
{ {
$this->logService = $logService; $this->logService = $logService;
$this->logService->menuTitle = 'cat_attr';
} }
/** /**

1
app/Services/ParkingSpaceAttributesService.php

@ -23,6 +23,7 @@ class ParkingSpaceAttributesService
public function __construct(OperationLogService $logService) public function __construct(OperationLogService $logService)
{ {
$this->logService = $logService; $this->logService = $logService;
$this->logService->menuTitle = 'license_plate_management';
} }
/** /**

1
app/Services/ParkingSpaceTypeService.php

@ -37,6 +37,7 @@ class ParkingSpaceTypeService
public function __construct(OperationLogService $logService) public function __construct(OperationLogService $logService)
{ {
$this->logService = $logService; $this->logService = $logService;
$this->logService->menuTitle = 'cat_type';
} }
/** /**

2
app/Services/ParkingVipListService.php

@ -12,7 +12,6 @@ use Illuminate\Support\Facades\DB;
class ParkingVipListService class ParkingVipListService
{ {
/** /**
* @var OperationLogService * @var OperationLogService
*/ */
@ -25,6 +24,7 @@ class ParkingVipListService
public function __construct(OperationLogService $logService) public function __construct(OperationLogService $logService)
{ {
$this->logService = $logService; $this->logService = $logService;
$this->logService->menuTitle = 'vip_list';
} }

3
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->unsignedBigInteger('model_id')->nullable()->comment('模型ID');
$table->string('ip')->nullable()->comment('操作IP'); $table->string('ip')->nullable()->comment('操作IP');
$table->text('description')->nullable()->comment('操作描述'); $table->text('description')->nullable()->comment('操作描述');
$table->string('main_directory', 50)->nullable()->comment('主目录'); $table->integer('sub_directory')->nullable()->default(0)->comment('副目录(菜单id)');
$table->string('sub_directory', 50)->nullable()->comment('副目录');
$table->json('old_values')->nullable()->comment('旧值'); $table->json('old_values')->nullable()->comment('旧值');
$table->json('new_values')->nullable()->comment('新值'); $table->json('new_values')->nullable()->comment('新值');
$table->timestamps(); $table->timestamps();

1
routes/admin/api.php

@ -81,6 +81,7 @@ Route::group(['prefix' => 'admin'], function () {
// 系统日志 // 系统日志
Route::get('/operationLog/index', [OperationLogController::class, 'index']); Route::get('/operationLog/index', [OperationLogController::class, 'index']);
Route::get('/operationLog/search', [OperationLogController::class, 'search']); Route::get('/operationLog/search', [OperationLogController::class, 'search']);
Route::get('/operationLog/directory/{id}', [OperationLogController::class, 'getSubDirectoryList']);
// 系统总配置 // 系统总配置
Route::get('/config/index', [ConfigController::class, 'index']); Route::get('/config/index', [ConfigController::class, 'index']);

Loading…
Cancel
Save