#feature: add project&cronjob management

This commit is contained in:
2026-01-16 12:14:43 +08:00
parent bbe68839e3
commit 381d5e6e49
19 changed files with 2157 additions and 84 deletions

View File

@@ -11,6 +11,8 @@ use App\Http\Controllers\Admin\AdminMetaController;
use App\Http\Controllers\Admin\ConfigController;
use App\Http\Controllers\Admin\IpUserMappingController;
use App\Http\Controllers\Admin\OperationLogController;
use App\Http\Controllers\Admin\ProjectController;
use App\Http\Controllers\Admin\ScheduledTaskController;
// 环境管理API路由
Route::prefix('env')->group(function () {
@@ -76,6 +78,22 @@ Route::prefix('admin')->middleware('admin.ip')->group(function () {
Route::post('/ip-user-mappings', [IpUserMappingController::class, 'store']);
Route::put('/ip-user-mappings/{mapping}', [IpUserMappingController::class, 'update']);
Route::delete('/ip-user-mappings/{mapping}', [IpUserMappingController::class, 'destroy']);
// 项目管理
Route::get('/projects', [ProjectController::class, 'index']);
Route::get('/projects/discover', [ProjectController::class, 'discover']);
Route::post('/projects/add-discovered', [ProjectController::class, 'addDiscovered']);
Route::get('/projects/{slug}', [ProjectController::class, 'show']);
Route::post('/projects', [ProjectController::class, 'store']);
Route::put('/projects/{slug}', [ProjectController::class, 'update']);
Route::delete('/projects/{slug}', [ProjectController::class, 'destroy']);
Route::post('/projects/{slug}/sync', [ProjectController::class, 'sync']);
Route::post('/projects/sync-all', [ProjectController::class, 'syncAll']);
Route::get('/projects/{slug}/status', [ProjectController::class, 'status']);
// 定时任务管理
Route::get('/scheduled-tasks', [ScheduledTaskController::class, 'index']);
Route::post('/scheduled-tasks/{name}/toggle', [ScheduledTaskController::class, 'toggle']);
});
// 日志分析 API 路由

View File

@@ -1,6 +1,5 @@
<?php
use App\Services\ConfigService;
use Illuminate\Foundation\Inspiring;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Log;
@@ -16,7 +15,8 @@ Artisan::command('inspire', function () {
|--------------------------------------------------------------------------
|
| 定时任务配置
| 所有定时任务统一在此文件管理
| 所有任务可在管理后台的"定时任务"页面控制启用/禁用
| 启用状态存储在数据库 configs (key: scheduled_tasks)
|
*/
@@ -25,50 +25,34 @@ Schedule::command('git-monitor:check')
->everyTenMinutes()
->withoutOverlapping()
->runInBackground()
->name('git-monitor-check');
->name('git-monitor-check')
->description('Git 监控 - 检查 release 分支变化')
->when(fn() => \App\Services\ScheduledTaskService::isEnabled('git-monitor-check'));
// Git Monitor - 每天凌晨 2 点刷新 release 缓存
Schedule::command('git-monitor:cache')
->dailyAt('02:00')
->withoutOverlapping()
->name('git-monitor-cache');
->name('git-monitor-cache')
->description('Git 监控 - 刷新 release 缓存')
->when(fn() => \App\Services\ScheduledTaskService::isEnabled('git-monitor-cache'));
// SLS 日志分析定时任务 - 每天凌晨 2 点执行
// 分析过去 24 小时的 ERROR 和 WARNING 日志并推送到钉钉
// 可通过数据库配置 log_analysis.settings.daily_schedule_enabled 控制是否启用
// SLS 日志分析 - 每天凌晨 2 点执行
Schedule::command('log-analysis:run --from="-24h" --to="now" --query="ERROR or WARNING" --push')
->dailyAt('02:00')
->withoutOverlapping()
->runInBackground()
->when(function () {
try {
$settings = app(ConfigService::class)->get('log_analysis.settings', []);
return $settings['daily_schedule_enabled'] ?? false;
} catch (\Exception $e) {
return false;
}
})
->name('daily-log-analysis')
->onFailure(function () {
Log::error('每日日志分析定时任务执行失败');
});
->description('SLS 日志分析 - 每日分析过去 24 小时日志')
->when(fn() => \App\Services\ScheduledTaskService::isEnabled('daily-log-analysis'))
->onFailure(fn() => Log::error('每日日志分析定时任务执行失败'));
// SLS 日志分析定时任务 - 每 4 小时执行一次
// 分析过去 6 小时的 ERROR 和 WARNING 日志并推送到钉钉
// 可通过数据库配置 log_analysis.settings.schedule_enabled 控制是否启用
// SLS 日志分析 - 每 4 小时执行一次
Schedule::command('log-analysis:run --from="-6h" --to="now" --query="ERROR or WARNING" --push')
->everyFourHours()
->withoutOverlapping()
->runInBackground()
->when(function () {
try {
$settings = app(ConfigService::class)->get('log_analysis.settings', []);
return $settings['schedule_enabled'] ?? false;
} catch (\Exception $e) {
return false;
}
})
->name('frequent-log-analysis')
->onFailure(function () {
Log::error('SLS 日志分析定时任务执行失败');
});
->description('SLS 日志分析 - 定期分析过去 6 小时日志')
->when(fn() => \App\Services\ScheduledTaskService::isEnabled('frequent-log-analysis'))
->onFailure(fn() => Log::error('SLS 日志分析定时任务执行失败'));

View File

@@ -18,3 +18,5 @@ Route::get('/log-analysis', [AdminController::class, 'index'])->name('admin.log-
Route::get('/settings', [AdminController::class, 'index'])->name('admin.settings');
Route::get('/logs', [AdminController::class, 'index'])->name('admin.logs');
Route::get('/ip-mappings', [AdminController::class, 'index'])->name('admin.ip-mappings')->middleware('admin.ip');
Route::get('/projects', [AdminController::class, 'index'])->name('admin.projects')->middleware('admin.ip');
Route::get('/scheduled-tasks', [AdminController::class, 'index'])->name('admin.scheduled-tasks')->middleware('admin.ip');