EzyPlatform quản lý thư nội bộ thế nào?
Back To BlogsThiết kế cơ sở dữ liệu
Cũng gần tương tự như quản lý thông báo, tính năng quản lý thư nội bộ cũng sử dụng 2 bảng:
- ezy_letters: Bảng này chứa thông tin của thư nội bộ.
- ezy_notification_receivers: Bảng này chứa thông tin người nhận thư nội bộ.
Một thông thư nội bộ có thể gửi đến nhiều người. Một người cũng có thể nhận được nhiều thư nội bộ khác nhau.
Mã nguồn SQL của hai bảng này như sau:
CREATE TABLE IF NOT EXISTS `ezy_letters` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT, `letter_type` varchar(25) COLLATE utf8mb4_unicode_520_ci, `title` varchar(1200) COLLATE utf8mb4_unicode_520_ci NOT NULL, `content` varchar(12000) COLLATE utf8mb4_unicode_520_ci NOT NULL, `from_admin_id` bigint unsigned, `from_user_id` bigint unsigned, `parent_id` bigint unsigned DEFAULT 0, `status` varchar(25) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'DRAFT', `created_at` datetime NOT NULL, PRIMARY KEY (`id`), INDEX `index_letter_type` (`letter_type`), INDEX `index_from_admin_id` (`from_admin_id`), INDEX `index_from_user_id` (`from_user_id`), INDEX `index_status` (`status`), INDEX `index_parent_id` (`parent_id`), 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_letter_receivers` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT, `letter_id` bigint unsigned NOT NULL, `to_admin_id` bigint unsigned, `to_user_id` bigint unsigned, `notification_receiver_id` bigint unsigned NOT NULL DEFAULT 0, `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_letter_to_admin_id` (`letter_id`, `to_admin_id`), UNIQUE KEY `key_letter_to_user_id` (`letter_id`, `to_user_id`), INDEX `index_letter_id` (`letter_id`), INDEX `index_to_admin_id` (`to_admin_id`), INDEX `index_to_user_id` (`to_user_id`), INDEX `index_notification_receiver_id` (`notification_receiver_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à:
- letter_type: Là loại thư nội bộ, ví dụ
order_approved,order_rejected. - title: Là tiêu đề của thư nội bộ.
- 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.
- parent_id: Là email cha, bạn có thể sử dụng trường này để gom các thư nội bộ vào chung một luồng.
- confidence_level: Là mức độ bảo mật của thư nội bộ để 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.
- important_level: Là mức độ quan trọng của thư nội bộ để 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
Cũng tương tự như tính năng quản lý thông báo, đâ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:
- Letter: Lớp này ánh xạ đến bảng
ezy_letters. - LetterReceiver: Lớp này ánh xạ đến bảng
ezy_letter_receivers. - LetterRepository: Giao diện để truy vấn bảng
ezy_letters. - LetterReceiverRepository: Giao diện để truy vấn bảng
ezy_letter_receivers. - LetterService: Giao diện cung cấp các hàm cơ sở cho nghiệp vụ thông báo.
- DefaultLetterService: Lớp cài đặt các hàm cơ sở cho nghiệp vụ thông báo.
- AdminLetterService: Lớp thừa kế
DefaultLetterServiceđể sử dụng cho admin. - WebLetterService: Lớp thừa kế
DefaultLetterServiceđể sử dụng cho web. - PaginationLetterRepository: Lớp cung cấp phân trang dữ liệu cho bảng
ezy_letters. - AdminPaginationLetterRepository: Lớp thừa kế
PaginationLetterRepositoryvà sử dụng cho admin. - WebPaginationLetterRepository: Lớp thừa kế
PaginationLetterRepositoryvà sử dụng cho web. - PaginationLetterService: Lớp cung cấp phân trang dữ liệu các thông báo.
- AdminPaginationLetterService: Lớp thừa kế
PaginationLetterServicevà sử dụng cho admin. - AdminPaginationLetterService: Lớp thừa kế
PaginationLetterServicevà sử dụng cho web. - Lớp AdminLetterControllerService: 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.
- Lớp WebLetterControllerService: 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.
- AdminLettersController: Lớp cung cấp các API cho tính năng thông báo phía admin.
- WebApiLetterController: 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ế
Tại admin bạn có thể truy cập vào hòm thư để xem danh sách các thư:
Bạn có thể click vào một thư để xem nội dung, ví dụ:
Để sử dụng được tính năng thư nội bộ cho người dùng, bạn có thể cài EzyAccount Plugin, người dùng của bạn có thể xem được thư trong hòm thư của họ, ví dụ:
Tổng kết
Quản lý thư nội bộ là tính năng tương đối hữu ích để tránh phụ thuộc vào hoàn toàn email thông thường. Với việc đóng gói lại tính năng này, EzyPlatform sẽ hỗ trợ các nhà phát triển có thêm một lựa chọn trong việc phát triển các phần mềm có sự giao tiếp giữa người dùng hay quản trị viên, ví dụ hệ thống hỗ trợ người dùng qua ticket chẳng hạn.