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->balance }} 元, {{ $drops }} Drops
+ +注册时间: {{ $user->created_at }}
+ +邮箱: {{ $user->email }}
+ + + {{-- hosts --}} +ID | +名称 | +价格 / 5 分钟 | +操作 | + + + + @php($drops_rage = config('drops.rate')) + + @foreach($hosts as $host) +
---|---|---|---|
{{ $host->id }} | +{{ $host->name }} | ++ {{ $host->price }} Drops + ≈ + {{ round($host->price / $drops_rage * (30 * 24 * 60 / 5), 2) }} 元 / 月 + + | ++ 查看 + | +
ID | +标题 | +状态 | +操作 | + + + @foreach($workOrders as $workOrder) +
---|---|---|---|
{{ $workOrder->id }} | +{{ $workOrder->title }} | +
+ |
+ + 查看 + | +
订单号 | +支付方式 | +金额 | +完成时间 | +
---|---|---|---|
{{ $b->order_id }} | +
+ |
+ + {{ $b->amount }} + | ++ {{ $b->paid_at }} + | +
用户名 | +邮箱 | +金额 | +注册时间 | +操作 | + + + + @foreach ($users as $user) +
---|---|---|---|---|
+ + {{ $user->name }} + + | ++ {{ $user->email }} + | ++ {{ $user->balance }} 元 + | ++ {{ $user->created_at }} + | ++ 编辑 + | +