diff --git a/app/Http/Controllers/Admin/HostController.php b/app/Http/Controllers/Admin/HostController.php new file mode 100644 index 0000000..0179282 --- /dev/null +++ b/app/Http/Controllers/Admin/HostController.php @@ -0,0 +1,94 @@ +login($user); + + return back()->with('success', '您已切换到用户 ' . $user->name . ' 的身份。'); } /** * Show the form for editing the specified resource. * - * @param int $id + * @param User $user * - * @return \Illuminate\Http\Response + * @return View */ - public function edit($id) + public function edit(User $user) { // + + $transaction = new Transaction(); + + $drops = $transaction->getDrops($user->id); + + $hosts = Host::where('user_id', $user->id)->latest()->paginate(50, ['*'], 'hosts_page'); + $workOrders = WorkOrder::where('user_id', $user->id)->latest()->paginate(50, ['*'], 'workOrders_page'); + $balances = Balance::where('user_id', $user->id)->latest()->paginate(50, ['*'], 'balances_page'); + + + return view('admin.users.edit', compact('user', 'drops', 'hosts', 'workOrders', 'balances')); } /** * Update the specified resource in storage. * * @param \Illuminate\Http\Request $request - * @param int $id + * @param User $user * - * @return \Illuminate\Http\Response + * @return \Illuminate\Http\RedirectResponse|Response */ - public function update(Request $request, $id) + public function update(Request $request, User $user) { // + + $transaction = new Transaction(); + + // 检测是否为空 + + if ($request->filled('balance')) { + $transaction->addAmount($user->id, 'console', $request->balance, '管理员汇入', true); + } + + if ($request->filled('drops')) { + $transaction->increaseDrops($user->id, $request->drops, '管理员汇入', 'console'); + } + + if ($request->is_banned) { + $user->banned_at = Carbon::now(); + + if ($request->filled('banned_reason')) { + $user->banned_reason = $request->banned_reason; + } + } else { + if ($user->banned_at) { + $user->banned_at = null; + } + } + + if ($request->filled('one_time_action')) { + if ($request->one_time_action == 'clear_all_keys') { + $user->tokens()->delete(); + } else if ($request->one_time_action == 'suspend_all_hosts') { + $user->hosts()->update(['status' => 'suspended', 'suspended_at' => now()]); + } else if ($request->one_time_action == 'stop_all_hosts') { + $user->hosts()->update(['status' => 'stopped', 'suspended_at' => null]); + } + + } + $user->save(); + + // if dirty, save + if ($user->isDirty()) { + $user->save(); + } + + return back()->with('success', '已完成所有更改。'); } /** @@ -81,9 +151,10 @@ public function update(Request $request, $id) * * @param int $id * - * @return \Illuminate\Http\Response + * @return Response */ - public function destroy($id) + public + function destroy($id) { // } diff --git a/app/Http/Controllers/Admin/WorkOrderController.php b/app/Http/Controllers/Admin/WorkOrderController.php new file mode 100644 index 0000000..879a8dc --- /dev/null +++ b/app/Http/Controllers/Admin/WorkOrderController.php @@ -0,0 +1,85 @@ +status == 'suspended') { - $model->suspended_at = now(); - } else if ($model->status == 'running') { - $model->suspended_at = null; + + if ($model->isDirty('status')) { + if ($model->status == 'suspended') { + $model->suspended_at = now(); + } else { + $model->suspended_at = null; + } } broadcast(new UserEvent($model->user_id, 'hosts.updating', $model)); diff --git a/app/Models/Transaction.php b/app/Models/Transaction.php index 17ff40b..e93cd3b 100644 --- a/app/Models/Transaction.php +++ b/app/Models/Transaction.php @@ -4,6 +4,7 @@ use App\Exceptions\ChargeException; use App\Exceptions\User\BalanceNotEnoughException; +use Carbon\Carbon; use Illuminate\Contracts\Cache\LockTimeoutException; use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Log; @@ -302,6 +303,7 @@ public function addAmount($user_id, $payment = 'console', $amount = 0, $descript 'user_id' => $user_id, 'amount' => $amount, 'payment' => $payment, + 'paid_at' => Carbon::now(), ]; Balance::create($data); diff --git a/app/Models/User.php b/app/Models/User.php index 3f026d1..643c403 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -8,6 +8,7 @@ use GeneaLabs\LaravelModelCaching\Traits\Cachable; use Illuminate\Contracts\Cache\LockTimeoutException; use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Illuminate\Support\Facades\Cache; @@ -44,6 +45,11 @@ class User extends Authenticatable 'banned_at' => 'datetime', ]; + public function hosts(): HasMany + { + return $this->hasMany(Host::class); + } + protected static function boot() { parent::boot(); @@ -51,17 +57,19 @@ protected static function boot() static::updating(function ($model) { // balance 四舍五入 - $model->balance = round($model->balance, 2); - if ($model->banned_at) { - Host::where('user_id', $model->id)->update([ - 'status' => 'suspended', - 'suspended_at' => now() - ]); - - $model->tokens()->delete(); + if ($model->isDirty('balance')) { + $model->balance = round($model->balance, 2); } + if ($model->isDirty('banned_at')) { + if ($model->banned_at) { + $model->tokens()->delete(); + $model->hosts()->update(['status' => 'suspended', 'suspended_at' => now()]); + } else { + $model->hosts()->update(['status' => 'stopped']); + } + } }); } diff --git a/app/View/Components/WorkOrderStatus.php b/app/View/Components/WorkOrderStatus.php new file mode 100644 index 0000000..8cd4b08 --- /dev/null +++ b/app/View/Components/WorkOrderStatus.php @@ -0,0 +1,45 @@ +status = $status; + } + + /** + * Get the view / contents that represent the component. + * + * @return \Illuminate\Contracts\View\View|\Closure|string + */ + public function render() + { + $this->status = match ($this->status) { + 'pending' => '推送中', + 'open' => '开启', + 'user_read' => '用户已读', + 'user_replied' => '用户已回复', + 'replied' => '已回复', + 'read' => '已读', + 'on_hold' => '挂起', + 'in_progress' => '处理中', + 'closed' => '结单', + default => $this->status, + }; + + return view('components.work-order-status', ['status' => $this->status]); + } +} diff --git a/resources/views/admin/users/edit.blade.php b/resources/views/admin/users/edit.blade.php new file mode 100644 index 0000000..2398a4d --- /dev/null +++ b/resources/views/admin/users/edit.blade.php @@ -0,0 +1,163 @@ +@extends('layouts.admin') + +@section('title', $user->name) + +@section('content') +

{{ $user->name }}

+ + +

余额: {{ $user->balance }} 元, {{ $drops }} Drops

+ +

注册时间: {{ $user->created_at }}

+ +

邮箱: {{ $user->email }}

+ + + {{-- hosts --}} +

主机列表

+ + + + + + + + + + @php($drops_rage = config('drops.rate')) + + @foreach($hosts as $host) + + + + + + + + @endforeach +
ID名称价格 / 5 分钟操作
{{ $host->id }}{{ $host->name }} + {{ $host->price }} Drops + ≈ + {{ round($host->price / $drops_rage * (30 * 24 * 60 / 5), 2) }} 元 / 月 + + + 查看 +
+ {{ $hosts->links() }} + + {{-- Work Orders --}} +

工单列表

+ + + + + + + + + @foreach($workOrders as $workOrder) + + + + + + + @endforeach + + +
ID标题状态操作
{{ $workOrder->id }}{{ $workOrder->title }} + + + 查看 +
+ {{ $workOrders->links() }} + + + +

充值记录

+
+ + + + + + + + + + + @foreach($balances as $b) + + + + + + + @endforeach + + +
订单号支付方式金额完成时间
{{ $b->order_id }} + + + {{ $b->amount }} + + {{ $b->paid_at }} +
+
+ + {{ $balances->links() }} + + +{{-- transactions_page--}} + + + + {{-- 账号操作 --}} +

账号操作

+
+ @csrf + @method('PATCH') + +
+ + +
+ +
+ + +
+ + {{-- 封禁 --}} +
+ + +
+ + {{-- 原因 --}} +
+ + +
+ + {{-- 一次性操作 --}} +
+ + +
+ + +
+ + + +@endsection diff --git a/resources/views/admin/users/index.blade.php b/resources/views/admin/users/index.blade.php index 2161328..0c02205 100644 --- a/resources/views/admin/users/index.blade.php +++ b/resources/views/admin/users/index.blade.php @@ -4,6 +4,46 @@ @section('content') - 欢迎来到后台管理系统 + {{-- 用户列表 --}} +
+ + + + + + + + + + + @foreach ($users as $user) + + + + + + + + + @endforeach + +
用户名邮箱金额注册时间操作
+ + {{ $user->name }} + + + {{ $user->email }} + + {{ $user->balance }} 元 + + {{ $user->created_at }} + + 编辑 +
+
+ + {{-- 分页 --}} + {{ $users->links() }} + @endsection diff --git a/resources/views/components/work-order-status.blade.php b/resources/views/components/work-order-status.blade.php new file mode 100644 index 0000000..14394e2 --- /dev/null +++ b/resources/views/components/work-order-status.blade.php @@ -0,0 +1 @@ +{{ $status }} diff --git a/resources/views/layouts/admin.blade.php b/resources/views/layouts/admin.blade.php index caef065..3ea019a 100644 --- a/resources/views/layouts/admin.blade.php +++ b/resources/views/layouts/admin.blade.php @@ -11,10 +11,10 @@ @yield('title', '管理员') - {{-- --}} - {{-- --}} +{{-- --}} +{{-- --}} - + @vite(['resources/sass/app.scss', 'resources/js/app.js']) @@ -37,6 +37,15 @@ + + + @@ -49,6 +58,11 @@ @endif @else + @if (Auth::guard('web')->check()) + + @endif