修改 Remote 为 Module

This commit is contained in:
iVampireSP.com 2022-11-16 10:29:50 +08:00
parent 3b80a5429e
commit f2170c3506
No known key found for this signature in database
GPG Key ID: 2F7B001CA27A8132
30 changed files with 201 additions and 118 deletions

View File

@ -2,7 +2,7 @@
namespace App\Console\Commands;
use App\Http\Controllers\Remote\ModuleController;
use App\Http\Controllers\Modules\ModuleController;
use App\Models\Module;
use Illuminate\Console\Command;
@ -70,5 +70,7 @@ public function handle()
$this->warn('计算模块收益完成。');
$this->warn('完成时间: ' . now());
$this->warn('比例: 1:' . $rate . ' (1 元 = ' . $rate . ' Drops)');
return 1;
}
}

View File

@ -7,8 +7,8 @@
use App\Jobs\ClearTasks;
use App\Jobs\DeleteHost;
use App\Jobs\HostCost;
use App\Jobs\Remote\FetchModule;
use App\Jobs\Remote\PushWorkOrder;
use App\Jobs\Module\FetchModule;
use App\Jobs\Module\PushWorkOrder;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

View File

@ -50,7 +50,7 @@ public function destroy(Host $host)
}
}
dispatch(new \App\Jobs\Remote\Host($host, 'delete'));
dispatch(new \App\Jobs\Module\Host($host, 'delete'));
} else {
return $this->error('无权操作');
}

View File

@ -18,7 +18,7 @@ public function index(): JsonResponse
public function call(Request $request, Module $module): JsonResponse
{
return (new \App\Http\Controllers\Remote\ModuleController())->call($request, $module);
return (new \App\Http\Controllers\Modules\ModuleController())->call($request, $module);
}

View File

@ -1,6 +1,6 @@
<?php
namespace App\Http\Controllers\Remote;
namespace App\Http\Controllers\Modules;
use App\Events\UserEvent;
use App\Http\Controllers\Controller;

View File

@ -1,11 +1,13 @@
<?php
namespace App\Http\Controllers\Remote\Host;
namespace App\Http\Controllers\Modules\Host;
use App\Http\Controllers\Controller;
use App\Models\Host;
use App\Models\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Str;
// use Illuminate\Support\Facades\Log;
@ -15,19 +17,22 @@ class HostController extends Controller
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
* @return Response
*/
public function index()
{
//
// Host::all();
return;
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
* @param Request $request
*
* @return Response|JsonResponse
*/
public function store(Request $request)
{
@ -68,7 +73,8 @@ public function store(Request $request)
* Display the specified resource.
*
* @param Host $host
* @return \Illuminate\Http\Response
*
* @return JsonResponse
*/
public function show(Host $host)
{
@ -82,9 +88,10 @@ public function show(Host $host)
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param Host $host
* @return \Illuminate\Http\Response
* @param Request $request
* @param Host $host
*
* @return JsonResponse
*/
public function update(Request $request, Host $host)
{
@ -124,7 +131,8 @@ public function update(Request $request, Host $host)
* Remove the specified resource from storage.
*
* @param $host
* @return \Illuminate\Http\Response
*
* @return JsonResponse
*/
public function destroy($host)
{

View File

@ -1,10 +1,12 @@
<?php
namespace App\Http\Controllers\Remote\Host;
namespace App\Http\Controllers\Modules\Host;
use App\Http\Controllers\Controller;
use App\Models\Task;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
class TaskController extends Controller
{
@ -14,7 +16,7 @@ class TaskController extends Controller
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
* @return Response|null
*/
public function index(Request $request)
{
@ -23,13 +25,15 @@ public function index(Request $request)
// return $this->getTasks();
return null;
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
* @param Request $request
*
* @return JsonResponse
*/
public function store(Request $request)
{
@ -48,10 +52,10 @@ public function store(Request $request)
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \App\Models\Task $task
* @param Request $request
* @param Task $task
*
* @return \Illuminate\Http\Response
* @return JsonResponse
*/
public function update(Request $request, Task $task)
{

View File

@ -1,9 +1,10 @@
<?php
namespace App\Http\Controllers\Remote;
namespace App\Http\Controllers\Modules;
use App\Http\Controllers\Controller;
use App\Models\Module;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Str;
@ -77,7 +78,7 @@ public function exportCall(Request $request, Module $module): \Illuminate\Http\R
}
public function calcModule(Module $module): array
public function calcModule(Module|Authenticatable $module): array
{
$default = [

View File

@ -1,6 +1,6 @@
<?php
namespace App\Http\Controllers\Remote;
namespace App\Http\Controllers\Modules;
use App\Exceptions\User\BalanceNotEnoughException;
use App\Http\Controllers\Controller;

View File

@ -1,9 +1,10 @@
<?php
namespace App\Http\Controllers\Remote\WorkOrder;
namespace App\Http\Controllers\Modules\WorkOrder;
use App\Http\Controllers\Controller;
use App\Models\WorkOrder\Reply;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class ReplyController extends Controller
@ -11,7 +12,7 @@ class ReplyController extends Controller
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
* @return JsonResponse
*/
public function index(Request $request)
{
@ -23,8 +24,8 @@ public function index(Request $request)
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
* @param Request $request
* @return JsonResponse
*/
public function store(Request $request)
{

View File

@ -1,6 +1,6 @@
<?php
namespace App\Http\Controllers\Remote\WorkOrder;
namespace App\Http\Controllers\Modules\WorkOrder;
use App\Http\Controllers\Controller;
use App\Http\Requests\Remote\WorkOrderRequest;

View File

@ -37,12 +37,12 @@ public function handle()
//
Host::with('module')->where('created_at', '<', now()->subHour())->chunk(100, function ($hosts) {
foreach ($hosts as $host) {
$http = Http::remote($host->module->api_token, $host->module->url);
$http = Http::module($host->module->api_token, $host->module->url);
$response = $http->get('hosts/' . $host->id);
if ($response->status() === 404) {
Log::warning($host->module->name . ' ' . $host->name . ' ' . $host->id . ' 不存在,删除。');
dispatch(new \App\Jobs\Remote\Host($host, 'delete'));
dispatch(new \App\Jobs\Module\Host($host, 'delete'));
}
}
});

View File

@ -36,14 +36,14 @@ public function handle()
// 查找暂停时间超过3天以上的 host
Host::where('status', 'suspended')->where('suspended_at', '<', now()->subDays(3))->chunk(100, function ($hosts) {
foreach ($hosts as $host) {
dispatch(new \App\Jobs\Remote\Host($host, 'delete'));
dispatch(new \App\Jobs\Module\Host($host, 'delete'));
}
});
// 查找部署时间超过3天以上的 host
Host::where('status', 'pending')->where('created_at', '<', now()->subDays(3))->chunk(100, function ($hosts) {
foreach ($hosts as $host) {
dispatch(new \App\Jobs\Remote\Host($host, 'delete'));
dispatch(new \App\Jobs\Module\Host($host, 'delete'));
}
});
}

View File

@ -1,6 +1,6 @@
<?php
namespace App\Jobs\Remote;
namespace App\Jobs\Module;
use App\Events\ServerEvent;
use App\Models\Module;
@ -50,7 +50,7 @@ public function handle()
foreach ($modules as $module) {
try {
$http = Http::remote($module->api_token, $module->url);
$http = Http::module($module->api_token, $module->url);
// dd($module->url);
$response = $http->get('remote');
} catch (ConnectException $e) {

View File

@ -1,6 +1,6 @@
<?php
namespace App\Jobs\Remote;
namespace App\Jobs\Module;
use App\Models\Host as HostModel;
use Illuminate\Bus\Queueable;
@ -41,7 +41,7 @@ public function handle()
$host = $this->host;
$host->load(['module']);
$http = Http::remote($host->module->api_token, $host->module->url);
$http = Http::module($host->module->api_token, $host->module->url);
switch ($this->type) {
case 'patch':

View File

@ -1,6 +1,6 @@
<?php
namespace App\Jobs\Remote;
namespace App\Jobs\Module;
use App\Models\Host;
use Illuminate\Bus\Queueable;
@ -35,7 +35,7 @@ public function handle()
//
Host::whereIn('status', ['pending', 'error'])->with(['module', 'user'])->chunk(100, function ($hosts) {
foreach ($hosts as $host) {
$http = Http::remote($host->module->api_token, $host->module->url);
$http = Http::module($host->module->api_token, $host->module->url);
$host->status = 'running';
$response = $http->post('hosts', $host->toArray());

View File

@ -1,6 +1,6 @@
<?php
namespace App\Jobs\Remote;
namespace App\Jobs\Module;
use App\Models\WorkOrder\Reply;
use App\Models\WorkOrder\WorkOrder;
@ -50,7 +50,7 @@ public function handle()
}
}
$http = Http::remote($workOrder->module->api_token, $workOrder->module->url);
$http = Http::module($workOrder->module->api_token, $workOrder->module->url);
$workOrder->status = 'open';
$response = $http->post('work-orders', $workOrder->toArray());
@ -70,7 +70,7 @@ public function handle()
Reply::where('is_pending', 1)->chunk(100, function ($replies) {
foreach ($replies as $reply) {
dispatch(new \App\Jobs\Remote\WorkOrder\Reply($reply));
dispatch(new \App\Jobs\Module\WorkOrder\Reply($reply));
}
});

View File

@ -1,6 +1,6 @@
<?php
namespace App\Jobs\Remote\WorkOrder;
namespace App\Jobs\Module\WorkOrder;
use App\Events\UserEvent;
use App\Models\WorkOrder\Reply as WorkOrderReply;
@ -9,7 +9,6 @@
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Http;
use Log;
// use Illuminate\Contracts\Queue\ShouldBeUnique;
@ -40,7 +39,7 @@ public function handle()
$this->reply->load(['workOrder', 'user']);
$this->reply->workOrder->load(['module']);
$http = Http::remote($this->reply->workOrder->module->api_token, $this->reply->workOrder->module->url);
$http = Http::module($this->reply->workOrder->module->api_token, $this->reply->workOrder->module->url);
$reply = $this->reply->toArray();

View File

@ -1,6 +1,6 @@
<?php
namespace App\Jobs\Remote\WorkOrder;
namespace App\Jobs\Module\WorkOrder;
use App\Events\UserEvent;
use App\Models\WorkOrder\WorkOrder as WorkOrderWorkOrder;
@ -39,7 +39,7 @@ public function handle()
{
$this->workOrder->load(['module']);
$http = Http::remote($this->workOrder->module->api_token, $this->workOrder->module->url);
$http = Http::module($this->workOrder->module->api_token, $this->workOrder->module->url);
if ($this->type == 'put') {
$response = $http->put('work-orders/' . $this->workOrder->id, $this->workOrder->toArray());
} else {

View File

@ -206,7 +206,7 @@ protected static function boot()
// when Updated
static::updated(function ($model) {
dispatch(new \App\Jobs\Remote\Host($model, 'patch'));
dispatch(new \App\Jobs\Module\Host($model, 'patch'));
Cache::forget('user_hosts_' . $model->user_id);
Cache::forget('user_tasks_' . $model->user_id);

View File

@ -35,7 +35,7 @@ class Module extends Authenticatable
public function remoteHost($host_id, $func, $requests)
{
$http = Http::remote($this->api_token, $this->url);
$http = Http::module($this->api_token, $this->url);
$response = $http->post("hosts/{$host_id}/functions/" . $func, $requests);
$json = $response->json();
@ -46,7 +46,7 @@ public function remoteHost($host_id, $func, $requests)
public function remote($func, $requests)
{
$http = Http::remote($this->api_token, $this->url);
$http = Http::module($this->api_token, $this->url);
$response = $http->post('functions/' . $func, $requests);
$json = $response->json();
@ -61,7 +61,7 @@ public function remoteRequest($method, $path, $requests)
{
$user = auth()->user();
$http = Http::remote($this->api_token, $this->url)
$http = Http::module($this->api_token, $this->url)
->accept('application/json');
// add Headers
@ -94,7 +94,7 @@ public function moduleRequest($method, $path, $requests)
{
$module_id = auth('module')->id();
$http = Http::remote($this->api_token, $this->url)
$http = Http::module($this->api_token, $this->url)
->accept('application/json');
$http->withHeaders([
@ -119,7 +119,7 @@ public function moduleRequest($method, $path, $requests)
public function remotePost($path = '', $data = [])
{
$http = Http::remote($this->api_token, $this->url);
$http = Http::module($this->api_token, $this->url);
$response = $http->post($path, $data);
$json = $response->json();
@ -137,7 +137,7 @@ public function check($module_id = null)
}
try {
$http = Http::remote($module->api_token, $module->url);
$http = Http::module($module->api_token, $module->url);
// dd($module->url);
$response = $http->get('remote');
} catch (ConnectException $e) {

View File

@ -75,8 +75,8 @@ protected static function boot()
$model->workOrder->save();
}
// dispatch
dispatch(new \App\Jobs\Remote\WorkOrder\Reply($model));
dispatch(new \App\Jobs\Remote\WorkOrder\WorkOrder($model->workOrder, 'put'));
dispatch(new \App\Jobs\Module\WorkOrder\Reply($model));
dispatch(new \App\Jobs\Module\WorkOrder\WorkOrder($model->workOrder, 'put'));
});
}
}

View File

@ -101,7 +101,7 @@ protected static function boot()
// updated
static::updated(function ($model) {
dispatch(new \App\Jobs\Remote\WorkOrder\WorkOrder($model, 'put'));
dispatch(new \App\Jobs\Module\WorkOrder\WorkOrder($model, 'put'));
});
}
}

View File

@ -33,10 +33,10 @@ public function boot()
Sanctum::usePersonalAccessTokenModel(PersonalAccessToken::class);
Http::macro('remote', function ($api_token, $url) {
Http::macro('module', function ($api_token, $url) {
// 关闭证书验证
return Http::withoutVerifying()->withHeaders([
'X-Remote-Api-Token' => $api_token,
'X-Module-Api-Token' => $api_token,
'Content-Type' => 'application/json'
])->withOptions([
'version' => 2,

View File

@ -35,9 +35,9 @@ public function boot()
->group(base_path('routes/api.php'));
Route::middleware(['api', 'auth:module'])
->prefix('remote')
->as('remote.')
->group(base_path('routes/remote.php'));
->prefix('modules')
->as('modules.')
->group(base_path('routes/modules.php'));
Route::middleware(['web'])
->prefix('admin')

View File

@ -1,53 +1,32 @@
<!DOCTYPE html>
<html>
@extends('layouts.app')
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<meta name="csrf-token" content="{{ csrf_token() }}">
</head>
@section('title', '用户')
<body>
{{-- display all errors --}}
@if ($errors->any())
<div style="color: red">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
@if (session('success'))
<p style="color:green">{{ session('success') }}</p>
@endif
@if (session('error'))
<p style="color:red">{{ session('error') }}</p>
@endif
@if (session('token'))
<p style="color:green">这是新的 Token请妥善保管{{ session('token') }}</p>
{{-- <a href="http://localhost:3000/login?token={{ session('token') }}">前往</a> --}}
@endif
@section('content')
@guest
<p>嗨,游客</p>
<p>您需要先登录,才能使用 莱云 Access Token Manager.</p>
<p>您需要先登录,才能继续使用 莱云。</p>
<a href="{{ route('login') }}">登录</a>
<a href="{{ route('login') }}" class="btn btn-primary">登录</a>
@endguest
@auth
@if (session('token'))
<p style="color:green">这是新的 Token请妥善保管{{ session('token') }}</p>
{{-- <a href="http://localhost:3000/login?token={{ session('token') }}">前往</a> --}}
@endif
<p>, {{ auth('web')->user()->name }}
<p>在这里,你可以获取新的 Token 来对接其他应用程序。</p>
<form action="{{ route('newToken') }}" name="newToken" method="POST">
@csrf
<input type="text" name="token_name" placeholder="Token 名字" />
<button>获取新的 Token</button>
<button class="btn btn-primary" type="submit">获取新的 Token</button>
</form>
<hr />
@ -55,17 +34,16 @@
<form action="{{ route('deleteAll') }}" method="post">
@csrf
@method('delete')
<button>吊销所有 Token</button>
<button class="btn btn-danger" type="submit">吊销所有 Token</button>
</form>
<p>*如果您的 Token 被泄漏,您应该立即吊销所有 Token</p>
<p class="text-danger">*如果您的 Token 被泄漏,您应该立即吊销所有 Token</p>
<hr />
<p>退出登录</p>
<form action="{{ route('logout') }}" method="post">
@csrf
<button>退出登录</button>
<button class="btn btn-danger" type="submit">退出登录</button>
</form>
@endauth
</body>
</html>
@endsection

View File

@ -8,7 +8,7 @@
<!-- CSRF Token -->
<meta name="csrf-token" content="{{ csrf_token() }}">
<title>@yield('title')</title>
<title>@yield('title', '管理员')</title>
<!-- Fonts -->
<link rel="dns-prefetch" href="//fonts.gstatic.com">
@ -42,7 +42,7 @@
<!-- Right Side Of Navbar -->
<ul class="navbar-nav ms-auto">
<!-- Authentication Links -->
@guest
@if (!Auth::guard('admin')->check())
@if (Route::has('admin.login'))
<li class="nav-item">
<a class="nav-link" href="{{ route('admin.login') }}">{{ __('Login') }}</a>
@ -52,7 +52,7 @@
<li class="nav-item dropdown">
<a id="navbarDropdown" class="nav-link dropdown-toggle" href="#" role="button"
data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
{{ Auth::guard('admin')->user()->email }}
{{ Auth::guard('admin')->user()->email ?? '' }}
</a>
<div class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdown">
@ -80,9 +80,7 @@ class="d-none">
</div>
<div class="container">
<div class="row">
@yield('content')
</div>
@yield('content')
</div>
</main>
</div>

View File

@ -0,0 +1,92 @@
<!doctype html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- CSRF Token -->
<meta name="csrf-token" content="{{ csrf_token() }}">
<title>@yield('title', '莱云')</title>
<!-- Fonts -->
<link rel="dns-prefetch" href="//fonts.gstatic.com">
<link href="https://fonts.bunny.net/css?family=Nunito" rel="stylesheet">
<!-- Scripts -->
@vite(['resources/sass/app.scss', 'resources/js/app.js'])
</head>
<body>
<div id="app">
<nav class="navbar navbar-expand-md navbar-light bg-white shadow-sm">
<div class="container">
<a class="navbar-brand" href="{{ route('admin.index') }}">
{{ config('app.display_name') }}
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse"
data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="{{ __('Toggle navigation') }}">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<!-- Left Side Of Navbar -->
<ul class="navbar-nav me-auto">
<li class="nav-item">
<a class="nav-link" href="{{ route('index') }}">首页</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{{ route('index') }}">首页</a>
</li>
</ul>
<!-- Right Side Of Navbar -->
<ul class="navbar-nav ms-auto">
<!-- Authentication Links -->
@guest
@if (Route::has('admin.login'))
<li class="nav-item">
<a class="nav-link" href="{{ route('admin.login') }}">{{ __('Login') }}</a>
</li>
@endif
@else
<li class="nav-item dropdown">
<a id="navbarDropdown" class="nav-link dropdown-toggle" href="#" role="button"
data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
{{ Auth::user()->name }}
</a>
<div class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdown">
<a class="dropdown-item" href="{{ route('logout') }}"
onclick="event.preventDefault();
document.getElementById('logout-form').submit();">
{{ __('Logout') }}
</a>
<form id="logout-form" action="{{ route('logout') }}" method="POST"
class="d-none">
@csrf
</form>
</div>
</li>
@endguest
</ul>
</div>
</div>
</nav>
<main class="py-4">
<div class="container">
<x-alert />
</div>
<div class="container">
@yield('content')
</div>
</main>
</div>
</body>
</html>

View File

@ -23,7 +23,7 @@
Route::get('hosts/usages', [HostController::class, 'usages']);
Route::apiResource('hosts', HostController::class);
Route::apiResource('balances', BalanceController::class)->only(['index', 'store']);
// Route::apiResource('balances', BalanceController::class)->only(['index', 'store']);
Route::get('balances/transactions', [BalanceController::class, 'transactions']);
Route::get('balances/drops', [BalanceController::class, 'drops']);

View File

@ -1,12 +1,12 @@
<?php
use App\Http\Controllers\Remote\BroadcastController;
use App\Http\Controllers\Remote\Host\HostController;
use App\Http\Controllers\Remote\Host\TaskController;
use App\Http\Controllers\Remote\ModuleController;
use App\Http\Controllers\Remote\UserController;
use App\Http\Controllers\Remote\WorkOrder\ReplyController;
use App\Http\Controllers\Remote\WorkOrder\WorkOrderController;
use App\Http\Controllers\Modules\BroadcastController;
use App\Http\Controllers\Modules\Host\HostController;
use App\Http\Controllers\Modules\Host\TaskController;
use App\Http\Controllers\Modules\ModuleController;
use App\Http\Controllers\Modules\UserController;
use App\Http\Controllers\Modules\WorkOrder\ReplyController;
use App\Http\Controllers\Modules\WorkOrder\WorkOrderController;
use Illuminate\Support\Facades\Route;
Route::get('modules', [ModuleController::class, 'index']);