Thêm tính năng trong mục 4.1 của ARCHITECTURE.md
This commit is contained in:
+27
-33
@@ -31,44 +31,38 @@ Hệ thống được thiết kế theo mô hình **Client-Server** kết hợp
|
||||
|
||||
Dưới đây là các thực thể cốt lõi phục vụ tính năng:
|
||||
|
||||
### 3.1. Users & Authentication
|
||||
* `users`: Lưu thông tin định danh (`id`, `email`, `password_hash`, `name`, `avatar`).
|
||||
### 3.1. User (Người dùng)
|
||||
Lưu trữ thông tin định danh và trạng thái quản trị. Toàn bộ ID sử dụng định dạng **UUID**.
|
||||
* `User`: `id`, `email`, `passwordHash`, `name`, `avatar`, `isAdmin`, `isBlocked`, `createdAt`.
|
||||
|
||||
### 3.2. Tour & Members (Quản lý đa người dùng & Phân quyền)
|
||||
* `tours`: Thông tin tổng quan về chuyến đi.
|
||||
* `id` (PK), `title`, `start_date`, `end_date`, `creator_id` (FK), `created_at`.
|
||||
* `tour_members`: Bảng trung gian quản lý thành viên và quyền hạn (Bảo mật thông tin).
|
||||
* `tour_id` (FK), `user_id` (FK).
|
||||
* `role`: Định nghĩa các quyền cụ thể:
|
||||
* `OWNER`: Toàn quyền (Người tạo).
|
||||
* `EDITOR`: Sửa đổi kế hoạch, chi phí, xem/thêm ảnh.
|
||||
* `MEMBER_PLAN_ONLY`: Chỉ xem/sửa kế hoạch, không xem được chi phí.
|
||||
* `MEMBER_PHOTO_ONLY`: Chỉ được xem/đăng ảnh trong album, không thấy kế hoạch và chi phí.
|
||||
* `VIEWER_EXTERNAL`: Người ngoài được share link, chỉ xem được ảnh công khai (tùy thuộc vào cài đặt privacy).
|
||||
|
||||
### 3.3. Itinerary & Map (Chặng & Địa điểm)
|
||||
* `legs` (Chặng): Một tour có nhiều chặng.
|
||||
* `id` (PK), `tour_id` (FK), `sequence_number` (Thứ tự chặng: 1, 2, 3...), `notes`.
|
||||
* `places` (Địa điểm trong chặng):
|
||||
* `id` (PK), `leg_id` (FK), `name`, `address`, `latitude`, `longitude` (Dữ liệu PostGIS), `sequence_in_leg`.
|
||||
* `arrival_time` (Dự kiến), `departure_time` (Dự kiến).
|
||||
### 3.2. Tour & Phân quyền (RBAC)
|
||||
Hệ thống sử dụng bảng trung gian để quản lý thành viên cho từng chuyến đi.
|
||||
* `Tour`: `id`, `title`, `startDate`, `endDate`, `totalCost` (Decimal), `createdById` (FK -> User).
|
||||
* `TourParticipant`: Quản lý vai trò thành viên trong Tour qua enum `ParticipantRole`:
|
||||
* `OWNER`: Toàn quyền quản lý.
|
||||
* `MANAGER`: Quản lý nội dung và thành viên.
|
||||
* `MEMBER`: Thành viên chính thức (Xem được chi phí).
|
||||
* `MEMBER_NO_FINANCE`: Thành viên không được xem thông tin tài chính.
|
||||
* `VIEWER_ONLY`: Chỉ xem lộ trình và ảnh.
|
||||
|
||||
### 3.4. Expenses (Chi phí)
|
||||
* `expenses`: Lưu vết chi phí cho từng địa điểm/chặng.
|
||||
* `id` (PK), `leg_id` (FK), `place_id` (FK, nullable), `category` (`LODGING`, `DINING`, `TRANSPORT`, `OTHER`), `amount` (Số tiền), `currency`, `description`.
|
||||
* `tour_cost_summaries`: Cấu hình phân chia tiền ở cuối tour/chặng.
|
||||
* `tour_id` (FK), `total_cost`, `adult_count`, `child_count`, `child_discount_percent` (Ví dụ: trẻ em giảm 30%).
|
||||
### 3.3. Lộ trình (Leg & Location)
|
||||
Một Tour được chia thành nhiều chặng di chuyển (Leg), mỗi chặng chứa danh sách các điểm đến (Location).
|
||||
* `Leg`: `id`, `tourId` (FK), `sequence` (Thứ tự chặng), `note`.
|
||||
* `Location`: Tích hợp tính năng theo dõi tiến độ (Thay thế khái niệm `Task` cũ).
|
||||
* Tọa độ: `latitude`, `longitude`.
|
||||
* Thời gian: `plannedStart`, `plannedEnd`, `actualStart`, `actualEnd`.
|
||||
* Trạng thái (`LocationStatus`): `PENDING` (Chờ), `COMPLETED` (Hoàn thành).
|
||||
* Loại địa điểm (`LocationType`): `MOVE`, `VISIT`, `REST`, `EAT`.
|
||||
|
||||
### 3.5. Tasks & Timeline Tracking (Theo dõi tiến độ)
|
||||
* `tasks`: Các hoạt động cần tích chọn hoàn thành.
|
||||
* `id` (PK), `tour_id` (FK), `leg_id` (FK), `title`, `planned_timestamp`.
|
||||
* `is_completed` (Boolean).
|
||||
* `completed_at` (Timestamp - Ghi lại lúc hệ thống tự động tích hoặc user chủ động tích).
|
||||
* `trigger_type` (`AUTO_BY_TIME` hoặc `MANUAL_BY_USER`).
|
||||
### 3.4. Chi phí (Expense)
|
||||
Quản lý tài chính cho từng chặng hoặc gắn trực tiếp vào một địa điểm cụ thể.
|
||||
* `Expense`: `id` (UUID, PK), `leg_id` (UUID, FK), `location_id` (UUID, FK, Nullable), `category` (Enum: `ACCOMMODATION`, `FOOD`, `TRANSPORT`, `TICKET`, `OTHER`), `amount` (Decimal), `description` (Text).
|
||||
|
||||
### 3.6. Album Ảnh (Tách biệt logic kế hoạch)
|
||||
* `photos`: Lưu trữ hình ảnh của tour gắn với địa điểm.
|
||||
* `id` (PK), `tour_id` (FK), `place_id` (FK, nullable), `uploader_id` (FK), `image_url` (Đường dẫn S3), `captured_at` (Metadata từ ảnh hoặc thời gian tạo), `privacy_level` (`PUBLIC_IN_TOUR`, `PRIVATE_OWNER`).
|
||||
### 3.5. Album Ảnh (Photo)
|
||||
Lưu trữ tài nguyên đa phương tiện gắn với bối cảnh chuyến đi.
|
||||
* `Photo`: `id`, `tourId` (FK), `locationId` (FK, nullable), `uploaderId` (FK), `imageUrl`, `privacy`.
|
||||
* Cấp độ bảo mật (`PrivacyLevel`): `PUBLIC`, `TOUR_ONLY`, `PRIVATE`.
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user