Merge branch 'main' of github.com:EdgeStanding/lae
This commit is contained in:
commit
882d447754
@ -29,7 +29,7 @@ protected function schedule(Schedule $schedule)
|
||||
$schedule->command('sanctum:prune-expired --hours=24')->daily();
|
||||
|
||||
// 扣费
|
||||
$schedule->job(new HostCost(now()->hour))->hourly()->withoutOverlapping()->onOneServer();
|
||||
$schedule->job(new HostCost(now()->minute))->everyMinute()->withoutOverlapping()->onOneServer();
|
||||
|
||||
// 获取模块暴露的信息(服务器等)
|
||||
$schedule->job(new FetchModule())->withoutOverlapping()->everyMinute();
|
||||
|
@ -61,21 +61,14 @@ public function store(Request $request): RedirectResponse
|
||||
$module->name = $request->name;
|
||||
$module->api_token = $api_token;
|
||||
$module->url = $request->url;
|
||||
$module->status = $request->status;
|
||||
|
||||
$module->save();
|
||||
|
||||
return redirect()->route('admin.modules.index')->with('success', '模块创建成功, 请重置以获得 API Token。');
|
||||
|
||||
}
|
||||
|
||||
private function rules(): array
|
||||
{
|
||||
return [
|
||||
'id' => 'required|string|max:255',
|
||||
'name' => 'required|string|max:255',
|
||||
'url' => 'required|url',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*
|
||||
@ -128,6 +121,7 @@ public function update(Request $request, Module $module): RedirectResponse
|
||||
$module->id = $request->id;
|
||||
$module->name = $request->name;
|
||||
$module->url = $request->url;
|
||||
$module->status = $request->status;
|
||||
|
||||
$module->save();
|
||||
|
||||
@ -156,4 +150,15 @@ public function destroy(Module $module): RedirectResponse
|
||||
|
||||
return redirect()->route('admin.modules.index')->with('success', '模块已删除。');
|
||||
}
|
||||
|
||||
private function rules(): array
|
||||
{
|
||||
return [
|
||||
'id' => 'required|string|max:255',
|
||||
'name' => 'required|string|max:255',
|
||||
'url' => 'required|url',
|
||||
'status' => 'required|string|in:up,down,maintenance',
|
||||
];
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -20,6 +20,4 @@ public function call(Request $request, Module $module): JsonResponse
|
||||
{
|
||||
return (new \App\Http\Controllers\Modules\ModuleController())->call($request, $module);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -32,11 +32,15 @@ public function __construct()
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
// now 添加1.5小时
|
||||
|
||||
//
|
||||
// 删除所有模块中不存在的主机
|
||||
Host::with('module')->where('created_at', '<', now()->subHour())->chunk(100, function ($hosts) {
|
||||
foreach ($hosts as $host) {
|
||||
|
||||
// 忽略维护中的模块
|
||||
if ($host->module->status !== 'up') {
|
||||
continue;
|
||||
}
|
||||
|
||||
$http = Http::module($host->module->api_token, $host->module->url);
|
||||
$response = $http->get('hosts/' . $host->id);
|
||||
|
||||
|
@ -13,17 +13,17 @@ class HostCost implements ShouldQueue
|
||||
{
|
||||
use InteractsWithQueue, Queueable, SerializesModels, Lock;
|
||||
|
||||
public $hour, $cache, $user;
|
||||
public $minute, $cache, $user;
|
||||
|
||||
/**
|
||||
* Create a new job instance.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($hour)
|
||||
public function __construct($minute)
|
||||
{
|
||||
//
|
||||
$this->hour = $hour;
|
||||
$this->minute = $minute;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -34,7 +34,7 @@ public function __construct($hour)
|
||||
public function handle()
|
||||
{
|
||||
// chunk hosts and load user
|
||||
Host::where('hour_at', $this->hour)->whereIn('status', ['running', 'stopped'])->with('user')->chunk(1000, function ($hosts) {
|
||||
Host::where('minute_at', $this->minute)->whereIn('status', ['running', 'stopped'])->with('user')->chunk(500, function ($hosts) {
|
||||
foreach ($hosts as $host) {
|
||||
$host->cost();
|
||||
}
|
||||
|
@ -36,13 +36,13 @@ public function handle()
|
||||
{
|
||||
// 获取运行完成的时间
|
||||
|
||||
$last_run = Cache::get('servers_updated_at', false);
|
||||
if ($last_run !== false) {
|
||||
// 如果和上次运行时间间隔小于一分钟,则不运行
|
||||
if (now()->diffInMinutes($last_run) < 1) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
// $last_run = Cache::get('servers_updated_at', false);
|
||||
// if ($last_run !== false) {
|
||||
// // 如果和上次运行时间间隔小于一分钟,则不运行
|
||||
// if (now()->diffInMinutes($last_run) < 1) {
|
||||
// return;
|
||||
// }
|
||||
// }
|
||||
|
||||
//
|
||||
Module::whereNotNull('url')->chunk(100, function ($modules) {
|
||||
@ -58,8 +58,13 @@ public function handle()
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
if ($response->successful()) {
|
||||
|
||||
// 如果模块状态不为 up,则更新为 up
|
||||
if ($module->status !== 'up') {
|
||||
$module->status = 'up';
|
||||
}
|
||||
|
||||
$json = $response->json();
|
||||
|
||||
if (isset($json['data']['servers']) && is_array($json['data']['servers'])) {
|
||||
@ -79,12 +84,20 @@ public function handle()
|
||||
|
||||
broadcast(new ServerEvent($servers));
|
||||
}
|
||||
// $module->update([
|
||||
// 'data' => $response->json()
|
||||
// ]);
|
||||
|
||||
} else {
|
||||
|
||||
// if module return maintenance, then set module status to maintenance
|
||||
if ($response->status() == 503) {
|
||||
$module->status = 'maintenance';
|
||||
} else {
|
||||
$module->status = 'down';
|
||||
}
|
||||
}
|
||||
|
||||
$module->save();
|
||||
}
|
||||
|
||||
// if local
|
||||
if (config('app.env') === 'local') {
|
||||
Cache::forever('servers', $servers);
|
||||
@ -93,7 +106,7 @@ public function handle()
|
||||
}
|
||||
|
||||
// 缓存运行完成的时间
|
||||
Cache::put('servers_updated_at', now(), now()->addMinutes(10));
|
||||
// Cache::put('servers_updated_at', now(), now()->addMinutes(10));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -98,6 +98,7 @@ protected static function boot()
|
||||
|
||||
static::creating(function ($model) {
|
||||
$model->hour_at = now()->hour;
|
||||
$model->minute_at = now()->minute_at;
|
||||
|
||||
if ($model->price !== null) {
|
||||
$model->price = round($model->price, 2);
|
||||
@ -201,8 +202,11 @@ public function safeDelete(): bool
|
||||
{
|
||||
// 如果创建时间大于大于 1 小时
|
||||
if ($this->created_at->diffInHours(now()) > 1) {
|
||||
// 如果当前时间比扣费时间小,则说明没有扣费。执行扣费。
|
||||
if (now()->minute < $this->minute_at) {
|
||||
$this->cost();
|
||||
}
|
||||
}
|
||||
|
||||
dispatch(new \App\Jobs\Module\Host($this, 'delete'));
|
||||
return true;
|
||||
|
@ -0,0 +1,47 @@
|
||||
<?php
|
||||
|
||||
use App\Models\Host;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('hosts', function (Blueprint $table) {
|
||||
//
|
||||
|
||||
$table->tinyInteger('minute_at')->index()->nullable()->after('hour_at');
|
||||
});
|
||||
|
||||
echo PHP_EOL . '将开始刷新主机的分钟数...';
|
||||
Host::chunk(100, function ($hosts) {
|
||||
foreach ($hosts as $host) {
|
||||
echo '刷新: ' . $host->id . PHP_EOL;
|
||||
$host->minute_at = $host->created_at->minute;
|
||||
$host->save();
|
||||
}
|
||||
});
|
||||
echo ' 完成!' . PHP_EOL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('hosts', function (Blueprint $table) {
|
||||
//
|
||||
|
||||
$table->dropColumn('minute_at');
|
||||
});
|
||||
}
|
||||
};
|
@ -0,0 +1,35 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('modules', function (Blueprint $table) {
|
||||
//
|
||||
$table->enum('status', ['up', 'down', 'maintenance'])->index()->default('down')->after('url');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('modules', function (Blueprint $table) {
|
||||
//
|
||||
|
||||
$table->dropColumn('status');
|
||||
});
|
||||
}
|
||||
};
|
@ -23,6 +23,16 @@
|
||||
<input type="text" class="form-control" id="url" name="url">
|
||||
</div>
|
||||
|
||||
<!-- 选择状态 -->
|
||||
<div class="form-group mt-1">
|
||||
<label for="status">状态</label>
|
||||
<select class="form-control" id="status" name="status">
|
||||
<option value="up">正常</option>
|
||||
<option value="down">异常</option>
|
||||
<option value="maintenance">维护模式</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<button type="submit" class="btn btn-primary mt-3">提交</button>
|
||||
</form>
|
||||
|
||||
|
@ -25,6 +25,15 @@
|
||||
<input type="text" class="form-control" id="url" name="url" value="{{ $module->url }}">
|
||||
</div>
|
||||
|
||||
<div class="form-group mt-1">
|
||||
<label for="status">状态</label>
|
||||
<select class="form-control" id="status" name="status">
|
||||
<option value="up" @if ($module->status === 'up') selected @endif>正常</option>
|
||||
<option value="down" @if ($module->status === 'down') selected @endif>异常</option>
|
||||
<option value="maintenance" @if ($module->status === 'maintenance') selected @endif>维护模式</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="form-check mt-1">
|
||||
<input class="form-check-input" type="checkbox" value="1" id="reset_api_token" name="reset_api_token">
|
||||
<label class="form-check-label" for="reset_api_token">
|
||||
@ -37,8 +46,7 @@
|
||||
|
||||
|
||||
<hr />
|
||||
<form method="POST" action="{{ route('admin.modules.destroy', $module)}}"
|
||||
onsubmit="return confirm('删除后,业务将无法正常进行。')">
|
||||
<form method="POST" action="{{ route('admin.modules.destroy', $module)}}" onsubmit="return confirm('删除后,业务将无法正常进行。')">
|
||||
@csrf
|
||||
@method('DELETE')
|
||||
<button type="submit" class="btn btn-danger">删除</button>
|
||||
|
@ -4,6 +4,7 @@
|
||||
|
||||
@section('content')
|
||||
<h3>{{ $module->name }}</h3>
|
||||
<p>状态: {{ $module->status }}</p>
|
||||
<a class="mt-3" href="{{ route('admin.modules.edit', $module) }}">编辑</a>
|
||||
<h4 class="mt-2">收益</h4>
|
||||
<div>
|
||||
|
Loading…
Reference in New Issue
Block a user