Tổng quan

Một dự án phần mềm được tổ chức như một chiếc tủ hồ sơ: mỗi ngăn chứa đúng loại tài liệu của nó. Khi cần tìm hay sửa bất cứ thứ gì, bạn biết ngay phải mở ngăn nào. ProjectOS chia toàn bộ source code thành hai nhóm lớn:

Dùng chung (Shared)

Các thành phần được dùng ở nhiều nơi trong dự án — ví dụ: thanh điều hướng, nút bấm, hàm định dạng ngày tháng.

Theo chức năng (Modules)

Mỗi tính năng lớn có thư mục riêng — ví dụ: Tasks, Risks, Team, Budget. Chúng hoạt động độc lập với nhau.

Sơ đồ thư mục tổng quan

Hãy hình dung cấu trúc dự án như một toà nhà văn phòng:
1

Tầng 1 — Giao diện người dùng (src/app/)

Chứa tất cả các trang web mà người dùng nhìn thấy và tương tác. Mỗi tính năng (Tasks, Risks, Team…) có một thư mục trang riêng.
2

Tầng 2 — Kho dùng chung (src/components/, src/hooks/, src/lib/...)

Chứa các thành phần tái sử dụng — nút bấm, ô nhập liệu, biểu đồ, hàm tiện ích. Bất kỳ tính năng nào cũng có thể dùng chúng.
3

Tầng 3 — Kho theo tính năng (src/modules/)

Mỗi tính năng lớn có “kho riêng” chứa các thành phần, logic và dữ liệu chỉ dùng cho tính năng đó.
4

Tầng nền — Kết nối Firebase (src/firebase/, src/services/)

Chứa code kết nối với Google Firebase — nơi lưu trữ dữ liệu thực tế của ứng dụng trên cloud.

Các thư mục dùng chung

Giao diện (components/)

Thư mục này chứa các “viên gạch” xây dựng nên giao diện, được chia thành 4 nhóm:
NhómNội dungVí dụ
common/Khung chính của ứng dụngThanh menu bên, header, footer
ui/Các ô, nút, hộp thoại cơ bảnNút bấm, ô nhập liệu, bảng dữ liệu
data-display/Hiển thị số liệu và trạng tháiThẻ thống kê, thanh tiến độ, nhãn trạng thái
forms/Các ô nhập liệu nâng caoChọn ngày, dropdown lựa chọn

Thư viện tiện ích (lib/)

Chứa các hàm dùng đi dùng lại nhiều lần, ví dụ:
  • Chuyển đổi định dạng ngày tháng
  • Hiển thị số tiền đúng định dạng
  • Xử lý thông báo lỗi từ Firebase
  • Kiểm tra dữ liệu hợp lệ trước khi lưu

Hàm nhỏ (utils/)

Tương tự lib/ nhưng dành cho các hàm đơn giản hơn:
  • Ghép class CSS
  • Định dạng văn bản
  • Các giá trị mặc định (phân trang, giới hạn hiển thị…)

Dữ liệu thời gian thực (hooks/)

Đây là nơi chứa các “cầu nối” giữa giao diện và Firebase. Khi dữ liệu trên Firebase thay đổi, giao diện tự động cập nhật mà không cần tải lại trang.
Hãy hình dung hooks như các màn hình hiển thị số liệu trực tiếp — số liệu thay đổi ở nguồn thì màn hình cập nhật ngay lập tức.

Kiểu dữ liệu (types/)

Định nghĩa “khuôn mẫu” của từng loại dữ liệu. Ví dụ, một Task phải có: tiêu đề, trạng thái, mức ưu tiên, người phụ trách, ngày hết hạn. TypeScript sẽ báo lỗi ngay nếu code thiếu hoặc sai kiểu.

Giá trị cố định (constants/)

Chứa các danh sách giá trị không đổi trong suốt dự án:
  • Danh sách trạng thái: todo, in_progress, done, blocked
  • Danh sách mức ưu tiên: low, medium, high, critical
  • Danh sách vai trò: admin, manager, developer

Cấu hình (config/)

Chứa các thông số cài đặt cho ứng dụng — tên site, đường dẫn API, các tính năng bật/tắt.

Các module theo tính năng

Mỗi tính năng lớn có cấu trúc bên trong giống nhau:
Tất cả màn hình và logic liên quan đến việc tạo, gán, theo dõi, và cập nhật công việc.Các trang bao gồm:
  • Danh sách tất cả tasks
  • Chi tiết từng task
  • Tạo mới / chỉnh sửa task
Bên trong module có:
  • Thẻ hiển thị task (TaskCard)
  • Danh sách tasks dạng bảng hoặc Kanban (TaskList)
  • Form điền thông tin task (TaskForm)
  • Bộ lọc và tìm kiếm (TaskFilters)
Theo dõi các rủi ro tiềm ẩn trong dự án và kế hoạch xử lý.Các trang bao gồm:
  • Danh sách rủi ro (Risk Register)
  • Chi tiết và kế hoạch giảm thiểu từng rủi ro
  • Ma trận xác suất vs mức độ ảnh hưởng (Risk Heatmap)
Danh sách thành viên, vai trò, và khối lượng công việc.Các trang bao gồm:
  • Danh sách thành viên team
  • Trang cá nhân từng người
  • Biểu đồ khối lượng công việc (Workload)
  • Quản lý vai trò và quyền hạn
Theo dõi chi phí thực tế so với ngân sách kế hoạch.Các trang bao gồm:
  • Tổng quan ngân sách
  • Danh sách chi phí đã phát sinh
  • Báo cáo chi tiêu
Ba module bổ sung với cấu trúc tương tự — mỗi module đều có trang danh sách, trang chi tiết, và các thành phần hiển thị riêng.

Kết nối Firebase

Vì ProjectOS lưu toàn bộ dữ liệu trên Google Firebase, có một số thư mục đặc biệt:
Thư mụcChức năng
firebase/Cài đặt kết nối tới Firebase (giống như nhập địa chỉ và mật khẩu văn phòng)
context/Lưu thông tin người dùng đang đăng nhập để mọi trang đều dùng được
store/Lưu trạng thái giao diện — ví dụ: menu đang mở hay đóng
providers/“Bao bọc” toàn bộ ứng dụng để Firebase và context hoạt động đúng
services/Các hàm thao tác dữ liệu: thêm, sửa, xóa, lắng nghe thay đổi từ Firestore
Cấu trúc dữ liệu Firebase của ProjectOS được mô tả chi tiết trong trang Firestore và tổ chức Data.

Bảo mật dữ liệu

Firebase Security Rules là “bộ quy tắc bảo vệ” dữ liệu — quy định ai được phép đọc và ghi dữ liệu nào.
Loại dữ liệuAi được đọcAi được sửa/xóa
Hồ sơ cá nhân (users/)Chính chủChính chủ
Công việc (tasks/)Thành viên dự ánNgười tạo
Rủi ro (risks/)Người đăng nhậpNgười tạo
Dự án (projects/)Thành viên được mờiAdmin dự án
Thông báoChính chủChính chủ
Dữ liệu trên Firestore không tự bảo vệ — bạn phải cấu hình Security Rules đúng. Nếu để trống, mặc định là từ chối tất cả (deny all) hoặc cho phép tất cả (allow all) tùy phiên bản.

Quy tắc đặt tên

Để cả team hiểu ngay file làm gì chỉ nhìn vào tên:
LoạiQuy tắcVí dụ
Giao diện (Component)Chữ hoa đầu mỗi từTaskCard, UserProfile
Hooks (cầu nối dữ liệu)Bắt đầu bằng useuseTasks, useAuth
Hàm tiện íchChữ thường, liềnformatDate, calculateDays
Kiểu dữ liệuChữ hoa đầu mỗi từTask, User, Project
Hằng sốChữ HOA, gạch dướiMAX_TASKS, DEFAULT_PAGE_SIZE
File serviceThêm .service.tstasks.service.ts

Quy tắc quan trọng

Modules không được “vay mượn” của nhau. Module Tasks không được dùng code từ module Risks và ngược lại. Nếu cần dùng chung, chuyển code đó lên thư mục src/ (dùng chung cho toàn dự án).
Khi muốn thêm tính năng mới, hãy tạo một module mới theo cùng cấu trúc (components, hooks, services, types). Đừng nhồi vào module có sẵn.

Checklist khởi động dự án

1

Tạo cấu trúc thư mục

Tạo đủ các thư mục theo sơ đồ tổng quan: app/, components/, modules/, firebase/, services/
2

Kết nối Firebase

Điền đầy đủ thông tin Firebase vào file .env.local (API key, Project ID, …).
3

Tạo các thư mục dùng chung

Tạo components/, hooks/, types/, utils/, lib/, constants/, config/.
4

Tạo 4 module cơ bản

Tạo thư mục và cấu trúc bên trong cho: tasks/, risks/, team/, budget/.
5

Thiết lập Security Rules

Cấu hình firestore.rules để bảo vệ dữ liệu đúng theo phân quyền.
6

Chạy thử

Chạy lệnh npm run dev và mở trình duyệt tại địa chỉ localhost:3000 để kiểm tra.