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

View File

@ -7,8 +7,8 @@
use App\Jobs\ClearTasks; use App\Jobs\ClearTasks;
use App\Jobs\DeleteHost; use App\Jobs\DeleteHost;
use App\Jobs\HostCost; use App\Jobs\HostCost;
use App\Jobs\Remote\FetchModule; use App\Jobs\Module\FetchModule;
use App\Jobs\Remote\PushWorkOrder; use App\Jobs\Module\PushWorkOrder;
use Illuminate\Console\Scheduling\Schedule; use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel; 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 { } else {
return $this->error('无权操作'); return $this->error('无权操作');
} }

View File

@ -18,7 +18,7 @@ public function index(): JsonResponse
public function call(Request $request, Module $module): 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 <?php
namespace App\Http\Controllers\Remote; namespace App\Http\Controllers\Modules;
use App\Events\UserEvent; use App\Events\UserEvent;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;

View File

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

View File

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

View File

@ -1,9 +1,10 @@
<?php <?php
namespace App\Http\Controllers\Remote; namespace App\Http\Controllers\Modules;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\Module; use App\Models\Module;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Str; 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 = [ $default = [

View File

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

View File

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

View File

@ -1,6 +1,6 @@
<?php <?php
namespace App\Http\Controllers\Remote\WorkOrder; namespace App\Http\Controllers\Modules\WorkOrder;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Http\Requests\Remote\WorkOrderRequest; 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) { Host::with('module')->where('created_at', '<', now()->subHour())->chunk(100, function ($hosts) {
foreach ($hosts as $host) { 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); $response = $http->get('hosts/' . $host->id);
if ($response->status() === 404) { if ($response->status() === 404) {
Log::warning($host->module->name . ' ' . $host->name . ' ' . $host->id . ' 不存在,删除。'); 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 // 查找暂停时间超过3天以上的 host
Host::where('status', 'suspended')->where('suspended_at', '<', now()->subDays(3))->chunk(100, function ($hosts) { Host::where('status', 'suspended')->where('suspended_at', '<', now()->subDays(3))->chunk(100, function ($hosts) {
foreach ($hosts as $host) { foreach ($hosts as $host) {
dispatch(new \App\Jobs\Remote\Host($host, 'delete')); dispatch(new \App\Jobs\Module\Host($host, 'delete'));
} }
}); });
// 查找部署时间超过3天以上的 host // 查找部署时间超过3天以上的 host
Host::where('status', 'pending')->where('created_at', '<', now()->subDays(3))->chunk(100, function ($hosts) { Host::where('status', 'pending')->where('created_at', '<', now()->subDays(3))->chunk(100, function ($hosts) {
foreach ($hosts as $host) { 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 <?php
namespace App\Jobs\Remote; namespace App\Jobs\Module;
use App\Events\ServerEvent; use App\Events\ServerEvent;
use App\Models\Module; use App\Models\Module;
@ -50,7 +50,7 @@ public function handle()
foreach ($modules as $module) { foreach ($modules as $module) {
try { try {
$http = Http::remote($module->api_token, $module->url); $http = Http::module($module->api_token, $module->url);
// dd($module->url); // dd($module->url);
$response = $http->get('remote'); $response = $http->get('remote');
} catch (ConnectException $e) { } catch (ConnectException $e) {

View File

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

View File

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

View File

@ -1,6 +1,6 @@
<?php <?php
namespace App\Jobs\Remote; namespace App\Jobs\Module;
use App\Models\WorkOrder\Reply; use App\Models\WorkOrder\Reply;
use App\Models\WorkOrder\WorkOrder; 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'; $workOrder->status = 'open';
$response = $http->post('work-orders', $workOrder->toArray()); $response = $http->post('work-orders', $workOrder->toArray());
@ -70,7 +70,7 @@ public function handle()
Reply::where('is_pending', 1)->chunk(100, function ($replies) { Reply::where('is_pending', 1)->chunk(100, function ($replies) {
foreach ($replies as $reply) { 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 <?php
namespace App\Jobs\Remote\WorkOrder; namespace App\Jobs\Module\WorkOrder;
use App\Events\UserEvent; use App\Events\UserEvent;
use App\Models\WorkOrder\Reply as WorkOrderReply; use App\Models\WorkOrder\Reply as WorkOrderReply;
@ -9,7 +9,6 @@
use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels; use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Http;
use Log;
// use Illuminate\Contracts\Queue\ShouldBeUnique; // use Illuminate\Contracts\Queue\ShouldBeUnique;
@ -40,7 +39,7 @@ public function handle()
$this->reply->load(['workOrder', 'user']); $this->reply->load(['workOrder', 'user']);
$this->reply->workOrder->load(['module']); $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(); $reply = $this->reply->toArray();

View File

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

View File

@ -206,7 +206,7 @@ protected static function boot()
// when Updated // when Updated
static::updated(function ($model) { 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_hosts_' . $model->user_id);
Cache::forget('user_tasks_' . $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) 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); $response = $http->post("hosts/{$host_id}/functions/" . $func, $requests);
$json = $response->json(); $json = $response->json();
@ -46,7 +46,7 @@ public function remoteHost($host_id, $func, $requests)
public function remote($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); $response = $http->post('functions/' . $func, $requests);
$json = $response->json(); $json = $response->json();
@ -61,7 +61,7 @@ public function remoteRequest($method, $path, $requests)
{ {
$user = auth()->user(); $user = auth()->user();
$http = Http::remote($this->api_token, $this->url) $http = Http::module($this->api_token, $this->url)
->accept('application/json'); ->accept('application/json');
// add Headers // add Headers
@ -94,7 +94,7 @@ public function moduleRequest($method, $path, $requests)
{ {
$module_id = auth('module')->id(); $module_id = auth('module')->id();
$http = Http::remote($this->api_token, $this->url) $http = Http::module($this->api_token, $this->url)
->accept('application/json'); ->accept('application/json');
$http->withHeaders([ $http->withHeaders([
@ -119,7 +119,7 @@ public function moduleRequest($method, $path, $requests)
public function remotePost($path = '', $data = []) 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); $response = $http->post($path, $data);
$json = $response->json(); $json = $response->json();
@ -137,7 +137,7 @@ public function check($module_id = null)
} }
try { try {
$http = Http::remote($module->api_token, $module->url); $http = Http::module($module->api_token, $module->url);
// dd($module->url); // dd($module->url);
$response = $http->get('remote'); $response = $http->get('remote');
} catch (ConnectException $e) { } catch (ConnectException $e) {

View File

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

View File

@ -101,7 +101,7 @@ protected static function boot()
// updated // updated
static::updated(function ($model) { 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); Sanctum::usePersonalAccessTokenModel(PersonalAccessToken::class);
Http::macro('remote', function ($api_token, $url) { Http::macro('module', function ($api_token, $url) {
// 关闭证书验证 // 关闭证书验证
return Http::withoutVerifying()->withHeaders([ return Http::withoutVerifying()->withHeaders([
'X-Remote-Api-Token' => $api_token, 'X-Module-Api-Token' => $api_token,
'Content-Type' => 'application/json' 'Content-Type' => 'application/json'
])->withOptions([ ])->withOptions([
'version' => 2, 'version' => 2,

View File

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

View File

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

View File

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

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::get('hosts/usages', [HostController::class, 'usages']);
Route::apiResource('hosts', HostController::class); 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/transactions', [BalanceController::class, 'transactions']);
Route::get('balances/drops', [BalanceController::class, 'drops']); Route::get('balances/drops', [BalanceController::class, 'drops']);

View File

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