Quản trị viên trong EzyPlatform được quản lý thế nào?
Back To BlogsThiết kế cơ sở dữ liệu
Có khá nhiều bảng liên quan đến quản trị viên, tuy nhiên các bảng chính để quản lý quản trị viên sẽ như sau:
- Bảng
ezy_admins
: Dùng để quản lý thông tin cơ bản của các quản trị viên, ví dụ tên đăng nhập, mật khẩu, email, .. - Bảng
ezy_admin_meta
: Bởi vì EzyPlatform phục vụ cho mọi loại phần mềm nên có thể trong các phần mềm, plugin đó cần thêm các thông tin bổ sung cho quản trị viên thì đây là bảng tiện ích có thể cho phép bổ sung thêm các thông tin của quản trị viên ngoài các thông tin cơ bản. - Bảng
ezy_admin_access_tokens
: Dùng để quản lý access token của quản trị viên, một quản trị viên có thể có nhiều access token nhưng một access token chỉ được sử dụng cho một quản trị viên. - Bảng
ezy_admin_role_names
: Dùng để quản lý các quyền của quản trị viên. - Bảng
ezy_admin_roles
: Đây là bảng trung gian, dùng để ánh xạ giữa các quản trị viên và quyền. - Bảng
ezy_role_features
: Đây là bảng quản lý các quyền và các API gắn với quyền đó, bạn có thể tham khảo bài viết phân quyền trong EzyPlatform trước đó để có thêm thông tin.
Mã nguồn SQL của các bảng sẽ như sau:
CREATE TABLE IF NOT EXISTS `ezy_admins` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT, `uuid` varchar(128) COLLATE utf8mb4_unicode_520_ci NOT NULL, `username` varchar(64) COLLATE utf8mb4_unicode_520_ci NOT NULL, `email` varchar(120) COLLATE utf8mb4_unicode_520_ci NOT NULL, `phone` varchar(20) COLLATE utf8mb4_unicode_520_ci, `password` varchar(128) COLLATE utf8mb4_unicode_520_ci NOT NULL, `display_name` varchar(64) COLLATE utf8mb4_unicode_520_ci, `url` varchar(100) COLLATE utf8mb4_unicode_520_ci, `avatar_image_id` bigint, `cover_image_id` bigint, `status` varchar(25) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'ACTIVATED', `created_at` datetime NOT NULL DEFAULT '2021-10-27 00:00:00', `updated_at` datetime NOT NULL DEFAULT '2021-10-27 00:00:00', PRIMARY KEY (`id`), UNIQUE KEY `key_uuid` (`uuid`), UNIQUE KEY `key_username` (`username`), UNIQUE KEY `key_email` (`email`), UNIQUE KEY `key_phone` (`phone`), 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_admin_meta` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT, `admin_id` bigint unsigned NOT NULL DEFAULT 0, `meta_key` varchar(255) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL, `meta_value` varchar(500) COLLATE utf8mb4_unicode_520_ci, `meta_number_value` bigint NOT NULL default 0, PRIMARY KEY (`id`), INDEX `index_key_admin_id` (`admin_id`), INDEX `index_meta_key` (`meta_key`), INDEX `index_meta_value` (`meta_value`), INDEX `index_meta_number_value` (`meta_number_value`), INDEX `index_meta_key_value` (`meta_key`, `meta_value`), INDEX `index_meta_key_number_value` (`meta_key`, `meta_number_value`), INDEX `index_admin_id_meta_key` (`admin_id`, `meta_key`), INDEX `index_admin_id_meta_key_value` (`admin_id`, `meta_key`, `meta_value`), INDEX `index_admin_id_meta_key_number_value` (`admin_id`, `meta_key`, `meta_number_value`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; CREATE TABLE IF NOT EXISTS `ezy_admin_access_tokens` ( `id` varchar(256) NOT NULL, `admin_id` bigint NOT NULL, `renewal_count` bigint NOT NULL, `status` varchar(25) COLLATE utf8mb4_unicode_520_ci, `created_at` datetime NOT NULL, `expired_at` datetime NOT NULL, PRIMARY KEY (`id`), INDEX `index_admin_id` (`admin_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; CREATE TABLE IF NOT EXISTS `ezy_admin_role_names` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT, `name` varchar(45) NOT NULL COLLATE utf8mb4_unicode_520_ci NOT NULL, `display_name` varchar(60) COLLATE utf8mb4_unicode_520_ci NOT NULL, `priority` int NOT NULL DEFAULT 0, `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `key_name` (`name`), UNIQUE KEY `key_display_name` (`display_name`), INDEX `index_priority` (`priority`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; CREATE TABLE IF NOT EXISTS `ezy_admin_roles` ( `role_id` bigint unsigned NOT NULL, `admin_id` bigint unsigned NOT NULL, `created_at` datetime NOT NULL, PRIMARY KEY (`role_id`, `admin_id`), INDEX `index_role_id` (`role_id`), INDEX `index_admin_id` (`admin_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; CREATE TABLE IF NOT EXISTS `ezy_role_features` ( `role_id` bigint unsigned NOT NULL, `target` varchar(25) COLLATE utf8mb4_unicode_520_ci NOT NULL, `feature` varchar(120) COLLATE utf8mb4_unicode_520_ci NOT NULL, `feature_uri` varchar(300) COLLATE utf8mb4_unicode_520_ci NOT NULL, `feature_method` varchar(25) COLLATE utf8mb4_unicode_520_ci NOT NULL, `created_at` datetime NOT NULL, PRIMARY KEY (`role_id`, `target`, `feature`, `feature_uri`, `feature_method`), INDEX `index_role_id` (`role_id`), INDEX `index_role_id_target` (`role_id`, `target`), INDEX `index_feature_uri_method` (`target`, `feature_uri`, `feature_method`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;
Chúng tôi tạo sẵn rất nhiều index, nếu trong quá trình vận hành bạn thấy không cần thiết, bạn có thể xoá bớt những index này hoặc bổ sung các index khác cần thiết.
Thiết kế lớp
Sẽ có rất nhiều lớp được sinh ra để quản lý quản trị viên bao gồm:
- Các lớp Entity.
- Các lớp Model.
- Các lớp Repository.
- Các lớp Service.
- Các lớp Controller.
Các lớp Entity
Tương ứng với mỗi bảng sẽ lại có một lớp Entity được sinh ra:
- Admin.
- AdmMeta.
- AdminAccesToken.
- AdminRoleName.
- AdminRoleId và AdminRole.
- RoleFeatureId và RoleFeature.
Các lớp Repostiory
Tương ứng với các Entity lại có các lớp Repository được sinh ra:
- AdminRepository và AdminAdminRepository.
- AdminMetaRepository và AdminAdminMetaRepository.
- AdminAccessTokenRepository và AdminAdminAccessTokenRepository.
- AdminRoleNameRepository.
- AdminIdRoleRepository và AdminRoleRepository.
- RoleFeatureRepository và AdminRoleFeatureRepository.
Các lớp Model
Cũng tương ứng với các Entity được sinh ra thì sẽ có các model được sinh ra:
- AdminModel.
- AdminAccessTokenModel.
- AdminRoleNameModel.
- AdminRoleModel.
Các lớp Service
Tương ứng với các lớp Repository sẽ có các lớp Service được sinh ra:
- AdminService, DefaultAdminService, AdminAdminService.
- AdminMetaService, DefaultAdminMetaService, AdminAdminMetaService.
- AdminAccessTokenService. DefaultAdminAccessTokenService.
- AdminRoleService, DefaultAdminRoleService, AdminAdminRoleService.
- RoleFeatureService, DefaultRoleFeatureService, AdminRoleFeatureService.
Các lớp controller dùng để quản lý admin bao gồm:
- AdminAdminsController: Cung cấp các màn hình quản trị quản trị viên.
- AdminAuthenticationController: Cung cấp các màn hình xác thực quản trị viên.
- AdminApiAdminsController: Cung cấp các API cho nghiệp vụ quản trị các quản trị viên.
Có rất nhiều lớp nên khá khó để vẽ thiết kế chung vào một hình, vậy mình sẽ vẽ đại diện các lớp liên quan đến bảng ezy_admins
, tuy nhiên các bảng khác cũng có thiết kế lớp gần giống như vậy.
Sở dĩ sinh ra nhiều lớp thế này là do một số lớp được sử dụng chung giữa cả admin, web và socket nên chúng chưa được chỉ định là singleton mà phải khi vào từng thành phần cụ thể mới có các lớp cụ thể ví dụ như AdminAdminService
hay AdminAdminRepository
để được chỉ định là singleton.
Quản trị các quản trị trị viên thông qua giao diện admin
Từ giao diện quản trị viên bạn có thể:
- Xem danh sách quản trị viên.
- Thêm mới một quản trị viên.
- Sửa đổi quản trị viên.
- Cấp quyền cho quản trị viên.
Bạn có thể tìm thấy các menu quản trị các quản trị viên ở gần cuối sidebar:
Sau đó bạn có thể chọn để xem danh sách quản trị viên:
Bạn có thể thêm mới một quản trị viên:
Hoặc chỉnh sửa một quản trị viên:
Hoặc cấp quyền cho các quản trị viên nếu muốn:
Tổng kết
Nghiệp vụ quản lý quản trị viên tương đối phức tạp, đòi hỏi một thiết kế tốt và mà nguồn cài đặt cũng phức tạp không kém. EzyPlatform đã đóng gói lại tính năng này, thể hiện chúng trên giao diện quản trị, hầu hết các dự án phần mềm thông thường nhà phát triển sẽ không cần phải code lại tính năng quản trị các quản trị viên này nữa. Tuy nhiên nếu cần mở rộng thì các nhà phát triển vẫn có thể tái sử dụng các bảng, các lớp mà EzyPlatform đã thiết kế, đặc biệt là bảng ezy_admin_meta
.