یک اپلیکیشن Desktop با Flutter که به Laravel Reverb WebSocket متصل میشود و سفارشات جدید را به صورت فوری و Critical نمایش میدهد.
- سیستم Always-on-top Window: پنجره همیشه در بالای تمام برنامهها (حتی بازیها) نمایش داده میشود
- صدای هشدار مداوم: تا زمانی که سفارش تایید نشود، صدای هشدار به صورت loop پخش میشود
- سیستم System Notification: اعلان سیستمی با اولویت بالا برای Windows/Linux/macOS
- غیرقابل بستن: تا زمانی که کاربر سفارش را acknowledge نکند، پنجره بسته نمیشود
- انیمیشن جذب توجه: پنجره با انیمیشنهای scale و rotation توجه کاربر را جلب میکند
- اتصال مستقیم WebSocket به Laravel Reverb (بدون نیاز به plugin)
- پشتیبانی کامل از Public و Private Channel
- پشتیبانی از Events سفارشی
- Authorization با Bearer Token برای Private Channel
- نمایش وضعیت اتصال به صورت Real-time
- پشتیبانی از wss:// برای اتصال امن
- پنل تنظیمات برای وارد کردن اطلاعات اتصال
- نمایش لیست سفارشات دریافتی
- پنجره Popup با طراحی جذاب برای هر سفارش جدید
- پشتیبانی از زبان فارسی
برای اجرای این پروژه نیاز به Flutter SDK دارید:
# دانلود Flutter از سایت رسمی
https://docs.flutter.dev/get-started/install
# تایید نصب
flutter doctorدر Laravel خود، باید Reverb را نصب و تنظیم کنید:
# نصب Laravel Reverb
composer require laravel/reverb
# انتشار فایلهای تنظیمات
php artisan reverb:install
# اجرای Reverb
php artisan reverb:startgit clone <repository-url>
cd flutter_notificationflutter pub getیک فایل صوتی با نام notification.mp3 در مسیر assets/sounds/ قرار دهید.
توصیه: از یک صدای واضح و بلند برای هشدار استفاده کنید.
میتوانید از صداهای رایگان از منابع زیر استفاده کنید:
flutter run -d windowsflutter run -d linuxflutter run -d macosflutter build windows --releaseفایل exe در مسیر build/windows/runner/Release/ قرار میگیرد.
flutter build linux --releaseflutter build macos --releaseپس از اجرای برنامه، موارد زیر را در پنل تنظیمات وارد کنید:
| فیلد | توضیحات | مثال | الزامی |
|---|---|---|---|
| App Key | کلید application از فایل .env Laravel |
ICS7DPZtPJyrRLjNFDBcsTiDzkNrj4QA |
✅ |
| Host | آدرس سرور Laravel Reverb (بدون پروتکل) | ws1.binacity.com |
✅ |
| Port | پورت Reverb | 443 (wss) یا 6001 (ws) |
✅ |
| Channel Name | نام Channel (برای Private باید با private- شروع شود) |
orders یا private-Ecommerce.Orders.All |
✅ |
| Event Name | نام Event که broadcast میشود | CreateOrderEvent |
✅ |
| Auth Token | Bearer token برای Private Channel | `1 | xxxxxxxxxxxxx` |
| Auth Endpoint | URL endpoint برای authorization | https://your-domain.com/api/broadcasting/auth |
❌ (فقط برای Private) |
App Key: ICS7DPZtPJyrRLjNFDBcsTiDzkNrj4QA
Host: ws1.binacity.com
Port: 443
Channel Name: orders
Event Name: CreateOrderEvent
Auth Token: (خالی بگذارید)
Auth Endpoint: (خالی بگذارید)
App Key: ICS7DPZtPJyrRLjNFDBcsTiDzkNrj4QA
Host: ws1.binacity.com
Port: 443
Channel Name: private-Ecommerce.Orders.All
Event Name: CreateOrderEvent
Auth Token: 1|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Auth Endpoint: https://ws1.binacity.com/api/broadcasting/auth
📖 راهنمای کامل Private Channel: برای جزئیات بیشتر درباره استفاده از Private Channel، فایل PRIVATE_CHANNEL_GUIDE.md را مطالعه کنید.
REVERB_APP_ID=your-app-id
REVERB_APP_KEY=local
REVERB_APP_SECRET=your-secret
REVERB_HOST=127.0.0.1
REVERB_PORT=6001
REVERB_SCHEME=httpnamespace App\Events;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class CreateOrderEvent implements ShouldBroadcast
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public $id;
public $customerName;
public $orderDetails;
public $totalPrice;
public $createdAt;
public function __construct($order)
{
$this->id = $order->id;
$this->customerName = $order->customer_name;
$this->orderDetails = $order->details;
$this->totalPrice = $order->total;
$this->createdAt = $order->created_at;
}
public function broadcastOn()
{
return new Channel('orders');
}
public function broadcastAs()
{
return 'CreateOrderEvent';
}
}// در Controller یا هر جای دیگر
use App\Events\CreateOrderEvent;
$order = Order::create([
'customer_name' => 'علی احمدی',
'details' => 'یک پیتزا پپرونی، یک نوشابه',
'total' => 250000,
]);
event(new CreateOrderEvent($order));- برنامه را اجرا کنید
- تنظیمات Laravel Reverb را وارد کنید
- روی دکمه "اتصال به سرور" کلیک کنید
- پس از اتصال موفق، برنامه منتظر دریافت سفارشات میماند
- هنگام دریافت سفارش جدید:
- یک System Notification نمایش داده میشود
- صدای هشدار شروع به پخش میشود
- یک پنجره Always-on-top با جزئیات سفارش باز میشود
- تا زمانی که روی دکمه تایید کلیک نکنید، پنجره و صدا ادامه دارد
flutter_notification/
├── lib/
│ ├── main.dart # Entry point
│ ├── models/
│ │ ├── order_event.dart # Model سفارش
│ │ └── order_event.g.dart # Generated JSON serialization
│ ├── services/
│ │ ├── websocket_service.dart # سرویس WebSocket
│ │ └── notification_service.dart # سرویس Notification
│ └── screens/
│ ├── main_screen.dart # صفحه اصلی
│ └── order_notification_popup.dart # پنجره Popup سفارش
├── assets/
│ └── sounds/
│ └── notification.mp3 # فایل صوتی (باید اضافه شود)
├── pubspec.yaml # Dependencies
└── README.md # این فایل
- مطمئن شوید فایل
notification.mp3درassets/sounds/وجود دارد - مطمئن شوید Volume سیستم روشن است
- در صورت نبود فایل صوتی، برنامه از یک URL backup استفاده میکند
- مطمئن شوید Laravel Reverb در حال اجرا است (
php artisan reverb:start) - آدرس Host و Port را بررسی کنید
- Firewall را بررسی کنید
- در فایل
.envLaravel، تنظیمات Reverb را بررسی کنید
- در Windows، مطمئن شوید Notification های برنامه در تنظیمات سیستم فعال است
- در Linux، مطمئن شوید که یک notification daemon نصب است
- در macOS، در System Preferences > Notifications اجازه دهید
- این ویژگی فقط روی Desktop پشتیبانی میشود
- مطمئن شوید از نسخه Desktop برنامه استفاده میکنید
- در برخی سیستمعاملها ممکن است نیاز به مجوز اضافی باشد
flutter- فریمورک اصلیweb_socket_channel- اتصال مستقیم WebSocket به Laravel Reverbflutter_local_notifications- Notification های سیستمیaudioplayers- پخش صداwindow_manager- مدیریت پنجره برای always-on-topprovider- State managementhttp- درخواستهای HTTP برای authorizationjson_annotation- JSON serialization
- استفاده در محیط تولید: این برنامه برای استفاده در آشپزخانه طراحی شده است
- Always Running: برنامه باید همیشه در حال اجرا باشد تا سفارشات را دریافت کند
- Network: مطمئن شوید اتصال اینترنت پایدار دارید
- Sound File: حتما یک فایل صوتی مناسب اضافه کنید
برای گزارش مشکلات یا پیشنهادات، لطفا یک Issue باز کنید.
این پروژه تحت لایسنس MIT منتشر شده است.
ساخته شده با ❤️ برای داران