- 1. Mục lục
- 2. Tính năng
- 3. Công nghệ sử dụng và lý do
- 4. Cấu trúc thư mục
- 5. Cách chạy
- 6. Deploy lên Vercel
- 7. AI Summary và GitHub Actions
- 8. Thành viên
FITUSocial là ứng dụng web dành cho cộng đồng sinh viên CNTT, được xây dựng bằng React + TypeScript + Vite và dùng Supabase làm backend chính. Hệ thống đang có các nhóm tính năng sau:
- Đăng nhập, đăng ký, xác thực OTP và quên mật khẩu.
- Kiểm tra phiên đăng nhập qua Supabase Auth trong
src/App.tsxvàsrc/lib/supabase.ts.
- Trang chủ feed với danh sách bài viết.
- Xem chi tiết bài viết qua route
/post/:postId. - Tạo, sửa, xóa bài viết và tương tác liên quan trong module
src/features/feed. - Hỗ trợ hiển thị ảnh, filter và các modal thao tác bài viết.
- Có thể hiển thị bản tóm tắt AI cho bài viết khi bảng
summary_postđã có dữ liệu.
- Comment gốc và reply theo cây.
- Vote comment, sửa, xóa, report.
- Hỗ trợ markdown, attachment, mention người dùng và mention tài liệu.
- Có realtime/polling sync và đồng bộ badge số lượng comment.
- Toàn bộ logic nằm ở
src/features/comment.
- Route hiện hành:
/docs/docs/:subjectId/docs/:subjectId/:folderSlug/docs/personal
- Xem danh sách môn học, thư mục tài liệu và tài liệu cá nhân.
- Upload tài liệu, preview, download, bookmark, rating, report và yêu cầu gỡ tài liệu.
- Logic chính nằm ở
src/features/materials.
- Module
src/features/subjectsvới các route:/subjects/subjects/:subjectId
- Module này bao gồm:
- danh sách môn học
- trang chi tiết môn học
- đánh giá môn học
- vote review
- theo dõi môn học
- hiển thị bản tóm tắt AI cho review môn học từ
summary_reviewnếu dữ liệu đã có
- Hệ thống hiện có 2 nhánh tóm tắt bằng AI:
- tóm tắt bài viết trong feed
- tóm tắt review môn học ở trang chi tiết môn học
- Frontend đọc dữ liệu summary từ Supabase:
- bài viết dùng bảng
summary_post - môn học dùng bảng
summary_review
- bài viết dùng bảng
- Phần xử lý AI được tách riêng trong thư mục
summarizerđể frontend không phải gọi model trực tiếp. - UI hiện đã có:
- nút
Xem bản tóm tắt AItrong bài viết - nút
Xem bản tóm tắttrong trang chi tiết môn học
- nút
- Cách tổ chức này giúp có thể chạy AI theo lịch nền bằng GitHub Actions thay vì bắt người dùng chờ khi đang sử dụng app.
- Trang tìm kiếm tại
/search. - Module tìm kiếm có các nhánh cho bài viết, tài liệu và môn học trong
src/features/search.
- Trang hồ sơ người dùng theo route
/:username. - Thiết lập hồ sơ ban đầu tại
/profile/setup. - Khu vực cài đặt tài khoản tại
/settings. - Module nằm ở
src/features/profilevàsrc/features/settings.
- Trang thông báo tại
/notifications. - Chuông thông báo và dropdown nằm ở layout/header.
- Logic nằm ở
src/features/notifications.
- Trang quản trị tại
/admin. - Theo mã nguồn hiện tại, admin có các nhóm quản lý:
- tài khoản
- bài viết
- bình luận
- report
- vai trò và quyền
- môn học, tag, tài liệu
- Module nằm ở
src/features/admin.
- Repo có thư mục
androidvà các script Capacitor trongpackage.json. - Có thể build/sync sang Android.
| Công nghệ | Dùng ở đâu | Lý do chọn |
|---|---|---|
| React 19 | Toàn bộ frontend | Phù hợp để xây dựng UI theo component và tổ chức app theo từng module tính năng. |
| TypeScript | Toàn bộ src/ |
Giúp kiểm soát kiểu dữ liệu tốt hơn khi app có nhiều domain như post, comment, materials, subjects và admin. |
| Vite | Môi trường dev và build | Khởi động nhanh, build gọn, phù hợp với app React hiện đại. |
| React Router | src/App.tsx và các page |
Tổ chức điều hướng rõ ràng cho các route như /post, /docs, /subjects, /admin, /notifications. |
| Supabase | Auth, database, storage, realtime | Đây là backend chính của hệ thống cho đăng nhập, dữ liệu bảng, upload file, signed URL và đồng bộ realtime. |
| TanStack Query | materials, search và các flow dữ liệu động |
Hữu ích cho cache server state, refetch, pagination và mutation. |
| Zustand | src/store/ |
Nhẹ, dễ dùng cho global state như profile, UI state và user stats. |
| Tailwind CSS | Toàn bộ UI | Giúp xây giao diện nhanh và giữ style nhất quán giữa nhiều module. |
| Radix UI | Form, modal, dialog, select, toast | Cung cấp các primitive UI ổn định cho những thành phần tương tác phức tạp. |
| Zod | auth, materials và các form |
Dùng để validate dữ liệu đầu vào rõ ràng trước khi gửi lên backend. |
| Vitest + Testing Library | tests/ |
Phù hợp để test UI React và logic frontend trong hệ sinh thái Vite. |
| Capacitor | android/ và script cap:* |
Cho phép tái sử dụng code web để build và chạy trên Android. |
| Python summarizer scripts | summarizer/ |
Tách riêng pipeline AI summary khỏi frontend, giúp phần tạo summary vận hành độc lập với UI. |
Stack hiện tại được chọn theo hướng:
- dễ chia module theo tính năng
- tận dụng backend-as-a-service để giảm công dựng hạ tầng
- hỗ trợ được dữ liệu động như comment, thông báo, tài liệu
- có đường mở rộng sang Android và pipeline AI summary riêng
the-fitusocial/
├── src/
│ ├── App.tsx # Định nghĩa route và luồng điều hướng chính
│ ├── main.tsx # Entry point của ứng dụng Vite
│ ├── components/ # UI dùng chung
│ ├── layouts/ # AuthLayout, MainLayout
│ ├── lib/ # Supabase client, feature flags, utils dùng chung
│ ├── store/ # Zustand stores
│ ├── types/ # Kiểu dữ liệu và generated database types
│ ├── utils/ # Helper functions
│ └── features/
│ ├── admin/ # Trang và logic quản trị
│ ├── auth/ # Đăng nhập, đăng ký, quên mật khẩu, OTP
│ ├── comment/ # Hệ thống comment
│ ├── feed/ # Feed, bài viết, post detail
│ ├── materials/ # Kho tài liệu học tập hiện hành
│ ├── notifications/ # Thông báo
│ ├── profile/ # Hồ sơ cá nhân
│ ├── search/ # Tìm kiếm
│ ├── settings/ # Cài đặt tài khoản
│ └── subjects/ # Môn học, review môn học và tóm tắt review
├── public/ # Tài nguyên public
├── docs/ # Tài liệu dự án và tài liệu kỹ thuật
├── supabase/ # SQL, functions, migrations liên quan Supabase
├── android/ # Android project của Capacitor
├── summarizer/ # Script Python phục vụ xử lý/tóm tắt ngoài FE
├── references/ # Tài liệu tham khảo phụ
├── tests/ # Thư mục test cấp repo
├── package.json # Scripts và dependencies
├── vite.config.ts # Cấu hình Vite
├── tsconfig.json # Cấu hình TypeScript
├── tailwind.config.js # Cấu hình Tailwind
└── capacitor.config.ts # Cấu hình Capacitor
- Node.js
>= 24.0.0 - npm
- Supabase project hoặc Supabase local đang sẵn sàng
Bạn có thể tạo file .env.local ở thư mục gốc để chạy local:
VITE_SUPABASE_URL=your_supabase_url
VITE_SUPABASE_ANON_KEY=your_supabase_anon_keyNgoài env cho frontend, các script trong summarizer còn dùng thêm các biến sau:
SUPABASE_URL=your_supabase_url
SUPABASE_ANON_KEY=your_supabase_anon_key
BOT_EMAIL=bot_account_email
BOT_PASSWORD=bot_account_password
AI_BASE_URL=https://your-openai-compatible-endpoint
AI_API_KEY=your_ai_api_key
AI_MODEL=your_model_namenpm install
npm run devSau đó mở:
http://localhost:5173
npm run buildnpm run previewnpm run testnpm run lint
npm run test:watch
npm run test:coverage
npm run update-typesRepo hiện có sẵn các script:
npm run cap sync
npm run cap open
npm run cap run
npm run cap buildLưu ý:
- các script
cap:*đang gọipnpm exec, nên nếu dùng phần Android bạn cần cópnpm - app phụ thuộc dữ liệu từ Supabase, vì vậy thiếu env hoặc backend chưa sẵn sàng thì app sẽ báo lỗi ngay khi khởi động
Dự án này có thể deploy dễ dàng lên nền tảng Vercel do sử dụng Vite.
- Đăng nhập vào Vercel, chọn Add New... > Project.
- Import repository GitHub chứa dự án của bạn.
- Vercel sẽ tự động nhận diện Framework Preset là Vite.
- Mở phần Environment Variables và thêm các biến môi trường cần thiết (tương tự như trong file
.env.local):VITE_SUPABASE_URLVITE_SUPABASE_ANON_KEY
- Bấm Deploy và chờ quá trình hoàn tất.
Vì dự án sử dụng React Router (client-side routing), nên mọi request tới các route con (như /docs, /search, ...) cần được trỏ về index.html để tránh lỗi 404 từ phía server Vercel.
Dự án đã có sẵn file vercel.json ở thư mục gốc với cấu hình rewrites sau để xử lý vấn đề này:
{
"rewrites": [
{
"source": "/(.*)",
"destination": "/index.html"
}
]
}Repo đang có 2 workflow trong .github/workflows:
summarize_posts.yml: chạy scriptsummarizer/post_summarizer.pyđể tạo tóm tắt AI cho bài viết.summarize_reviews.yml: chạy scriptsummarizer/review_summarizer.pyđể tạo tóm tắt AI cho review môn học.
summarize_posts.yml: chạy mỗi3tiếng và có thể bấm chạy tay bằngworkflow_dispatch.summarize_reviews.yml: chạy mỗi12tiếng và có thể bấm chạy tay bằngworkflow_dispatch.
Để workflow chạy được trên GitHub, vào:
Repository Settings > Secrets and variables > Actions
Sau đó thêm các Repository secrets:
| Secret | Mục đích |
|---|---|
AI_API_KEY |
API key để gọi model AI hoặc provider OpenAI-compatible. |
AI_BASE_URL |
Base URL của endpoint AI, ví dụ endpoint OpenAI-compatible hoặc gateway nội bộ. |
AI_MODEL |
Tên model dùng để sinh tóm tắt. |
BOT_EMAIL |
Email tài khoản bot dùng đăng nhập Supabase. |
BOT_PASSWORD |
Mật khẩu tài khoản bot dùng cho pipeline summary. |
SUPABASE_ANON_KEY |
Anon key của Supabase để khởi tạo client. |
SUPABASE_URL |
URL project Supabase. |
- GitHub Actions kích hoạt workflow theo lịch hoặc chạy tay.
- Workflow cài Python, cài
supabasepackage và chạy script trong thư mụcsummarizer. - Script đăng nhập bằng bot account, đọc bài viết hoặc review cần xử lý.
- Script gọi model AI qua
AI_BASE_URL,AI_API_KEY,AI_MODEL. - Kết quả được ghi về Supabase:
- bài viết vào
summary_post - review môn học vào
summary_review - log chạy được lưu ở các bảng log tương ứng
- bài viết vào
- Frontend tự đọc các bản summary này để hiển thị nút và nội dung tóm tắt AI.
| STT | MSSV | Họ và tên | |
|---|---|---|---|
| 1 | 24120429 | Phạm Quang Sang | coangsang19@gmail.com |
| 2 | 24120097 | Nguyễn Hoàng Nam | nguyenhoangnam2006tq@gmail.com |
| 3 | 24120260 | Trương Tuấn Anh | truongtuananh200806@gmail.com |
| 4 | 24120387 | Trần Nhật Nam | trannhatnam891@gmail.com |
| 5 | 24120423 | Đỗ Ngọc Tường Quyên | dntq0808@gmail.com |
| 6 | 24120477 | Phan Chí Trung | phanchitrung01.st@gmail.com |