Trong một dự án bình thường thì bạn sẽ thường lưu các cài đặt (setting) trong tập tin properties hoặc yaml, và khi cần thay đổi hay bổ sung thêm cài đặt mới bạn sẽ cần cập nhật các tập tin cài đặt sau đó build lại dự án, triển khai và khởi động lại máy chủ. Tuy nhiên đối với EzyPlatform thì khác, nó phải đảm bảo hạn chế tối đa việc khởi động lại để giữ cho phần mềm của người dùng hoạt động ổn định. Chính vì vậy việc quản lý cài đặt cũng sẽ phải khác.

Sử dụng cơ sở dữ liệu

Cụ thể thì EzyPlatform sinh ra một bảng có tên là ezy_settings với mã nguồn như sau:

CREATE TABLE IF NOT EXISTS `ezy_settings` (
    `id` bigint unsigned NOT NULL AUTO_INCREMENT,
    `setting_name` varchar(120) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT '',
    `data_type` varchar(12) COLLATE utf8mb4_unicode_520_ci NOT NULL DEFAULT 'STRING',
    `setting_value` varchar(2048) COLLATE utf8mb4_unicode_520_ci NOT NULL,
    `created_at` datetime NOT NULL,
    `updated_at` datetime NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `key_setting_name` (`setting_name`),
    INDEX `index_data_type` (`data_type`),
    INDEX `index_created_at` (`created_at`),
    INDEX `index_updated_at` (`updated_at`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;

Ý nghĩa của các trường trong bảng sẽ như sau:

  1. id: Là id của setting được tăng dần.
  2. setting_name: Là tên của cài đặt, thường được yêu cầu các nhà phát triển viết dưới dạng snake_case (viết thường và gạch dưới).
  3. data_type: Là kiểu dữ liệu của cài đặt, trường này sẽ hỗ trợ việc serialize và deserialize giá trị của setting.
  4. setting_value: Là giá trị của cài đặt, thường là bất kỳ giá trị nào cũng được.
  5. created_at: Là thời gian điểm cài đặt được tạo ra.
  6. updated_at: Là thời điểm cài đặt được cập nhật. Bạn có thể sử dụng trường này để cập nhật cache cài đặt khi có thay đổi.

Thiết kế lớp

Mặc dù có một bảng nhưng sẽ có tương đối nhiều lớp được tạo ra để quản lý cài đặt:

EzyPlatform quản lý cài đặt - thiet ke lop.png
  1. Setting: Đây là lớp entity ánh xạ với bảng ezy_settings.
  2. SettingRepository: Đây là lớp repository cung cấp các hàm truy vấn lấy các cài đặt từ cơ sở dữ liệu.
  3. SettingService: Đây là một giao diện cung cấp các hàm cơ bản thêm sửa xoá cài đặt.
  4. DefaultSettingService: Đây là lớp cài đặt sẵn các hàm mặc định của SettingService.
  5. Lớp WebSettingService: Đây là lớp chuyên dùng cho web.
  6. SocketSettingService: Đây là lớp chuyên dùng cho socket.
  7. AdminSettingService: Đây là lớp chuyên dùng cho admin, trong lớp này cung cấp thêm một số hàm đặc trưng cho admin mà web hay socket không có.
  8. AdminSettingsController: Cung cấp giao diện cho màn hình cài đặt trên giao diện quản trị.
  9. AdminApiSettingsController: Cung cấp các API cho quản lý cài đặt.

Bạn cần lưu ý rằng nên hạn chế gọi thay đổi cài đặt ở web hay socket để tránh rủi ro về bảo mật, việc thay đổi hay thêm mới setting thường sẽ diễn ra ở admin.

Sử dụng

Bạn có thể tìm thấy các menu dành cài đặt ở phần cuối của sidebar:

Screenshot 2024-12-04 at 16.41.54.png

Bạn có thể xem danh sách các cài đặt:

Screenshot 2024-12-04 at 16.42.31.png

Bổ sung một cài đặt:

Screenshot 2024-12-04 at 16.42.37.png

Hay sửa đổi một cài đặt:

Screenshot 2024-12-04 at 16.42.49.png

Bạn có thể sử dụng các cài đặt trong mã nguồn của mình ví dụ:

public void setInputDeliveryOrderCountryId(long countryId) {
    settingService.setLongValue(
        SETTING_KEY_INPUT_DELIVERY_ORDER_COUNTRY_ID,
        countryId
    );
}

public long getInputDeliveryOrderCountryId() {
    return settingService.getLongValue(
        SETTING_KEY_INPUT_DELIVERY_ORDER_COUNTRY_ID
    );
}

Tổng kết

Việc sử dụng các cài đặt được lưu trong cơ sở dữ liệu sẽ giúp EzyPlatform trở nên động hơn và hạn chế việc khởi động lại. Cái giá phải trả là việc cài đặt tương đối nhiều lớp, tuy nhiên EzyPlatform đã làm công việc đó cho bạn. Để đảm bảo hiệu năng thì EzyPlatform còn cho phép cache các cài đặt, mình sẽ chia sẻ vấn đề này ở các bài tiếp theo nhé.