Thông báo (notification) cũng là một trong những tính năng rất cơ bản mà phần mềm nào cũng có để thông báo một thứ gì đó cho người dùng và quản trị viên, vậy nên EzyPlatform cũng đã đóng gói phần này để các nhà phát triển yên tâm sử dụng.

Thiết kế bảng

Sẽ có hai bảng tham gia vào nghiệp vụ thông báo này:

EzyPlatform quản lý thông báo thế nào - thiet ke bang.png
  1. ezy_notifications: Bảng này chứa thông tin của các thông báo.
  2. ezy_notification_receivers: Bảng này chứa thông tin người nhận thông báo.

Một thông báo có thể gửi đến nhiều người. Một người cũng có thể nhận được nhiều thông báo khác nhau.

Mã nguồn SQL của hai bảng này như sau:

CREATE TABLE IF NOT EXISTS `ezy_notifications` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `notification_type` varchar(25) COLLATE utf8mb4_unicode_520_ci,
  `title` varchar(300) COLLATE utf8mb4_unicode_520_ci NOT NULL,
  `content` varchar(3000) COLLATE utf8mb4_unicode_520_ci NOT NULL,
  `deep_link` varchar(300) COLLATE utf8mb4_unicode_520_ci,
  `icon_image` varchar(120) COLLATE utf8mb4_unicode_520_ci,
  `from_admin_id` bigint unsigned,
  `from_user_id` bigint unsigned,
  `status` varchar(25) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'DRAFT',
  `created_at` datetime NOT NULL,
  PRIMARY KEY (`id`),
  INDEX `index_notification_type` (`notification_type`),
  INDEX `index_from_admin_id` (`from_admin_id`),
  INDEX `index_from_user_id` (`from_user_id`),
  INDEX `index_status` (`status`),
  INDEX `index_created_at` (`created_at`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;

CREATE TABLE IF NOT EXISTS `ezy_notification_receivers` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `notification_id` bigint unsigned NOT NULL,
  `to_admin_id` bigint unsigned,
  `to_user_id` bigint unsigned,
  `confidence_level` varchar(25) COLLATE utf8mb4_unicode_520_ci,
  `important_level` varchar(25) COLLATE utf8mb4_unicode_520_ci,
  `status` varchar(25) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'SENT',
  `sent_at` datetime NOT NULL,
  `received_at` datetime,
  `read_at` datetime,
  PRIMARY KEY (`id`),
  UNIQUE KEY `key_notification_to_admin_id` (`notification_id`, `to_admin_id`),
  UNIQUE KEY `key_notification_to_user_id` (`notification_id`, `to_user_id`),
  INDEX `index_notification_id` (`notification_id`),
  INDEX `index_to_admin_id` (`to_admin_id`),
  INDEX `index_to_user_id` (`to_user_id`),
  INDEX `index_confidence_level` (`confidence_level`),
  INDEX `index_important_level` (`important_level`),
  INDEX `index_status` (`status`),
  INDEX `index_sent_at` (`sent_at`),
  INDEX `index_received_at` (`received_at`),
  INDEX `index_read_at` (`read_at`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;

Một số trường bạn có thể lưu ý đó là:

  1. notification_type: Là loại thông báo, ví dụ order_approved, order_rejected.
  2. title: Là tiêu đề của thông báo, bởi vì trên giao diện thông báo thường được hiển thị trong không gian hẹp nên bạn hãy giữ cho tiêu đề thật ngắn gọn.
  3. content: Là nội dung của thông báo, bạn cũng nên giữ cho nội dung của thông báo ngắn gọn.
  4. deep_link: Là đường dẫn sẽ được mở khi click vào thông báo, ví dụ bạn có thể dẫn người dùng đến hòm thư khi họ xem thông báo chẳng hạn.
  5. icon_image: Bạn sẽ thường dùng font icon để hiển thị.
  6. confidence_level: Là mức độ bảo mật của thông báo để người đọc có thể cảnh giác, thông thường bạn sẽ không dùng đến trường này.
  7. important_level: Là mức độ quản trọng của thông báo để người đọc có thể cảnh giác, thông thường bạn sẽ không dùng đến trường này.

Thiết kế lớp

Đây là một thiết kế lớp tương đối phức tạp với sự tham ra của rất nhiều lớp khác nhau:

EzyPlatform quản lý thông báo thế nào - thiet ke lop.png
  1. Notfication: Lớp này ánh xạ đến bảng ezy_notifications.
  2. NotificationReceiver: Lớp này ánh xạ đến bảng ezy_notification_receivers.
  3. NotificationRepository: Giao diện để truy vấn bảng ezy_notifications.
  4. NotificationReceiverRepository: Giao diện để truy vấn bảng ezy_notification_receivers.
  5. NotificationService: Giao diện cung cấp các hàm cơ sở cho nghiệp vụ thông báo.
  6. DefaultNotificationService: Lớp cài đặt các hàm cơ sở cho nghiệp vụ thông báo.
  7. AdminNotificationService: Lớp thừa kế DefaultNotificationService để sử dụng cho admin.
  8. WebNotificationService: Lớp thừa kế DefaultNotificationService để sử dụng cho web.
  9. PaginationNotificationRepository: Lớp cung cấp phân trang dữ liệu cho bảng ezy_notifications.
  10. AdminPaginationNotificationRepository: Lớp thừa kế PaginationNotificationRepository và sử dụng cho admin.
  11. WebPaginationNotificationRepository: Lớp thừa kế PaginationNotificationRepository và sử dụng cho web.
  12. PaginationNotificationService: Lớp cung cấp phân trang dữ liệu các thông báo.
  13. AdminPaginationNotificationService: Lớp thừa kế PaginationNotificationService và sử dụng cho admin.
  14. AdminPaginationNotificationService: Lớp thừa kế PaginationNotificationService và sử dụng cho web.
  15. Lớp AdminNotificationControllerService: Lớp cung cấp các hàm tổng hợp dữ liệu cho nghiệp vụ thông báo dùng cho admin.
  16. Lớp WebNotificationControllerService: Lớp cung cấp các hàm tổng hợp dữ liệu cho nghiệp vụ thông báo dùng cho web.
  17. AdminNotificationsController: Lớp cung cấp các API cho tính năng thông báo phía admin.
  18. WebApiNotificationController: Lớp cung cấp các API cho tính năng thông báo phía web, tuy nhiên bạn sẽ cần phải thừa kế lại lớp này và khai báo @Controller("/api/v1") thì mới có API để sử dụng.

Sử dụng trong thực tế

Bạn có thể tạo tài khoản trên ezyplatform.com, tạo một dự án và yêu cầu xem xét, bạn có thể nhận được các thông báo thế này:

Screenshot 2024-12-21 at 16.23.08.png

Như bạn có thể thấy thông báo cũng chỉ hiển thị icon, tiêu đề và thời gian trong một popup nhỏ, vậy nên chúng ta cần lựa chọn một tiêu đề ngắn gọn và đủ hiểu.

Tổng kết

Tính năng thông báo mặc dù cơ bản nhưng lại cần một thiết kế tương đối phức tạp. EzyPlatform đã đóng gói khá kỹ tính năng này với tương đối nhiều lớp để các nhà phát triển có thể sử dụng 1 cách dễ dàng.