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
{
// 用户信息
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,

1
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';
}
//

6
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');

92
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,

58
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

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

1
app/Services/AdminFloorService.php

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

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

1
app/Services/AdminRolesService.php

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

1
app/Services/AdminUsersService.php

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

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

1
app/Services/ParkingLicensePlateService.php

@ -23,6 +23,7 @@ class ParkingLicensePlateService
public function __construct(OperationLogService $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)
{
$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)
{
$this->logService = $logService;
$this->logService->menuTitle = 'cat_type';
}
/**

2
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';
}

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

1
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']);

Loading…
Cancel
Save