From 6131da2cf5cad1a7deb426ef94f2b503e66b7932 Mon Sep 17 00:00:00 2001 From: "iVampireSP.com" Date: Sat, 31 Dec 2022 18:04:28 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9F=BA=E6=9C=AC=20=E9=80=9A=E7=9F=A5?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Admin/NotificationController.php | 88 ++++++++++++ app/Jobs/SendCommonNotificationsJob.php | 57 ++++++++ app/Notifications/CommonNotification.php | 69 ++++++++++ .../admin/notifications/create.blade.php | 127 ++++++++++++++++++ resources/views/layouts/admin.blade.php | 3 + resources/views/mail/common.blade.php | 7 + routes/admin.php | 3 + 7 files changed, 354 insertions(+) create mode 100644 app/Http/Controllers/Admin/NotificationController.php create mode 100644 app/Jobs/SendCommonNotificationsJob.php create mode 100644 app/Notifications/CommonNotification.php create mode 100644 resources/views/admin/notifications/create.blade.php create mode 100644 resources/views/mail/common.blade.php diff --git a/app/Http/Controllers/Admin/NotificationController.php b/app/Http/Controllers/Admin/NotificationController.php new file mode 100644 index 0000000..ed58e72 --- /dev/null +++ b/app/Http/Controllers/Admin/NotificationController.php @@ -0,0 +1,88 @@ +query($request)->paginate(20)->withQueryString(); + + return view('admin.notifications.create', compact('modules', 'users')); + } + + /** + * Store a newly created resource in storage. + * + * @param Request $request + * + * @return RedirectResponse + */ + public function store(Request $request) + { + $request->validate([ + 'title' => 'required', + 'content' => 'required', + 'user_id' => 'nullable', + 'module_id' => 'nullable', + 'user' => 'nullable', + ]); + + dispatch(new SendCommonNotificationsJob($request->toArray(), $request->input('title'), $request->input('content'))); + + return back()->with('success', '通知发送成功。')->withInput(); + } + + public function query(Request|array $request): User|CachedBuilder + { + if ($request instanceof Request) { + $request = $request->all(); + } + + if (!empty($request['user_id'])) { + $users = User::where('id', $request['user_id']); + } else { + $users = User::query(); + + if (!empty($request['user'])) { + $user = $request['user']; + + if ($user == 'active') { + // 寻找有 host 的用户 + $users = $users->whereHas('hosts'); + } else if ($user == 'normal') { + $users = $users->whereNull('banned_at'); + } else if ($user == 'banned') { + $users = $users->whereNotNull('banned_at'); + } + } + } + + if (!empty($request['module_id'])) { + // 从 hosts 中找到 module_id,然后找到拥有此 host 的用户 + $users = $users->whereHas('hosts', function ($query) use ($request) { + $query->where('module_id', $request['module_id']); + }); + } + + return $users; + } +} diff --git a/app/Jobs/SendCommonNotificationsJob.php b/app/Jobs/SendCommonNotificationsJob.php new file mode 100644 index 0000000..294e600 --- /dev/null +++ b/app/Jobs/SendCommonNotificationsJob.php @@ -0,0 +1,57 @@ +requests = $requests; + $this->title = $title; + $this->content = $content; + } + + /** + * Execute the job. + * + * @return void + */ + public function handle(): void + { + // + + $notificationController = new NotificationController(); + + $users = $notificationController->query($this->requests); + + // chunk + $users->chunk(100, function ($users) { + foreach ($users as $user) { + $user->notify(new CommonNotification($this->title, $this->content)); + } + }); + } +} diff --git a/app/Notifications/CommonNotification.php b/app/Notifications/CommonNotification.php new file mode 100644 index 0000000..99464b5 --- /dev/null +++ b/app/Notifications/CommonNotification.php @@ -0,0 +1,69 @@ +title = $title; + $this->content = $content; + } + + /** + * Get the notification's delivery channels. + * + * @param mixed $notifiable + * + * @return array + */ + public function via($notifiable): array + { + return ['mail']; + } + + /** + * Get the mail representation of the notification. + * + * @param mixed $notifiable + * + * @return MailMessage + */ + public function toMail($notifiable): MailMessage + { + return (new MailMessage)->subject($this->title)->markdown('mail.common', [ + 'title' => $this->title, + 'content' => $this->content, + ]); + } + + /** + * Get the array representation of the notification. + * + * @param mixed $notifiable + * + * @return array + */ + public function toArray($notifiable): array + { + return [ + // + ]; + } +} diff --git a/resources/views/admin/notifications/create.blade.php b/resources/views/admin/notifications/create.blade.php new file mode 100644 index 0000000..1e5638e --- /dev/null +++ b/resources/views/admin/notifications/create.blade.php @@ -0,0 +1,127 @@ +@extends('layouts.admin') + +@section('title', '通知') + +@section('content') +

通知

+ + + @if (Request::isNotFilled('user_id')) +
首先,我们得先筛选出要通知哪些用户。
+ +
+
+ + +
+ +
+ + +
+ +

这两个搜搜条件只能二选一。

+ + +
+ + @endif + + @if (count($users)) +
筛选出的用户,接下来我们得选择通知方式。
+ {{-- 用户列表 --}} +
+ + + + + + + + + + + + + @foreach ($users as $user) + + + + + + + + + + + @endforeach + +
ID用户名邮箱余额用户组注册时间操作
+ + {{ $user->id }} + + + + {{ $user->name }} + + + {{ $user->email }} + + {{ $user->balance }} 元 + + @if ($user->user_group_id) + + {{ $user->user_group->name }} + + @else + 无 + @endif + + {{ $user->created_at }} + + 编辑 +
+
+ + {{-- 分页 --}} + {{ $users->links() }} + + @endif + + +
+ @csrf + + + + + +
+ + +
+ + {{-- 通知内容 --}} +
+ + +
+ + + 通知一旦发送,将无法撤销! +
+ +@endsection diff --git a/resources/views/layouts/admin.blade.php b/resources/views/layouts/admin.blade.php index 800b9fe..9373e94 100644 --- a/resources/views/layouts/admin.blade.php +++ b/resources/views/layouts/admin.blade.php @@ -49,6 +49,9 @@ + diff --git a/resources/views/mail/common.blade.php b/resources/views/mail/common.blade.php new file mode 100644 index 0000000..15882d3 --- /dev/null +++ b/resources/views/mail/common.blade.php @@ -0,0 +1,7 @@ +@component('mail::message') +# {{ $title }} + +{{ $content }} + +
+@endcomponent diff --git a/routes/admin.php b/routes/admin.php index 20ecdad..25d2a26 100644 --- a/routes/admin.php +++ b/routes/admin.php @@ -7,6 +7,7 @@ use App\Http\Controllers\Admin\HomeController; use App\Http\Controllers\Admin\HostController; use App\Http\Controllers\Admin\ModuleController; +use App\Http\Controllers\Admin\NotificationController; use App\Http\Controllers\Admin\UserController; use App\Http\Controllers\Admin\UserGroupController; use App\Http\Controllers\Admin\WorkOrderController; @@ -45,6 +46,8 @@ Route::resource('devices', DeviceController::class)->only(['index', 'destroy']); + Route::resource('notifications', NotificationController::class)->only(['create', 'store']); + Route::view('commands', 'admin.commands')->name('commands');