CPM là hệ thống quản lý công việc và dự án cho nhóm sinh viên hoặc các dự án nhỏ. Ứng dụng hỗ trợ quản lý project, task, thành viên, kỹ năng, deadline, file đính kèm, dashboard thống kê, chatbot agent và gợi ý phân công bằng AI kết hợp thuật toán Min-Cost Max-Flow.
Source GitHub: https://github.com/tin12q/cpm
- Quản lý đăng nhập, người dùng, team và phân quyền theo role.
- Quản lý project, task, deadline, trạng thái, priority, difficulty và kỹ năng yêu cầu.
- Dashboard thống kê tiến độ, task trễ hạn, workload nhân sự và biểu đồ theo project.
- Project overview cho admin/manager với chart trạng thái, workload và deadline pressure.
- Tạo/sửa task, upload nhiều file đính kèm, preview ảnh/PDF và tải file.
- Chatbot agent có thể hỏi dữ liệu hệ thống, báo cáo project/cá nhân, thống kê nhân sự và hỗ trợ thao tác quản lý.
- Gợi ý phân công task bằng AI scoring và thuật toán MCMF, có preview trước khi apply.
- Dữ liệu demo đa dạng để test: project hoàn thành, project trễ hạn, project sát deadline, task chưa gán, task completed và task đang làm.
- Flutter / Dart
- HTTP client
- Provider
- FL Chart
- File Picker
- Image Picker
- Flutter PDFView
- Node.js
- Express.js
- MongoDB / Mongoose
- JWT authentication
- Multer
- Google Gemini hoặc OpenAI-compatible LLM API
- Min-Cost Max-Flow cho bài toán phân công task
- React
- Vite
- Material UI
- Tailwind CSS
- Chart.js
- Axios
cpm/
├── client/ # Web admin React/Vite
├── qlcv/ # Mobile app Flutter
├── server/ # Backend Express + MongoDB
├── exampleDB/assignment_test_100/ # File JSON dữ liệu demo
├── scripts/ # Script import/reset database local
├── generate-assignment-test-data.js # Sinh lại dữ liệu demo
└── README.md
- Node.js 18 trở lên
- npm
- MongoDB local
- Flutter SDK
- Android Studio hoặc thiết bị Android bật USB debugging
- Git
Di chuyển vào thư mục server:
cd server
npm installTạo file server/.env hoặc chỉnh file đang có:
PORT=1337
MONGODB_URI=mongodb://localhost:27017/cpm
JWT_SECRET=secret
# Chọn một trong hai nhóm LLM bên dưới nếu muốn dùng chatbot AI.
GEMINI_API_KEY=your_gemini_api_key
GEMINI_MODEL=gemini-2.5-flash-lite
# Hoặc dùng OpenAI-compatible API.
OPENAI_COMPATIBLE_API_KEY=your_api_key
OPENAI_COMPATIBLE_BASE_URL=https://your-llm-provider/v1
OPENAI_COMPATIBLE_CHAT_MODEL=your_chat_modelChạy backend:
npm startBackend mặc định chạy tại:
http://localhost:1337
Nếu gặp lỗi EADDRINUSE: address already in use :::1337, nghĩa là port 1337 đang bị chiếm. Có thể tắt process đang dùng port đó hoặc đổi PORT trong server/.env.
MongoDB local mặc định dùng database cpm.
Từ thư mục gốc project, chạy:
node .\scripts\reset-local-db-demo.jsLệnh này sẽ xóa database cpm local rồi nạp lại dữ liệu demo.
Nếu MongoDB dùng URI khác:
node .\scripts\reset-local-db-demo.js --uri "mongodb://localhost:27017/cpm"Dữ liệu JSON nằm tại:
exampleDB/assignment_test_100/
Bộ dữ liệu hiện có:
- 33 users
- 33 auth accounts
- 4 teams
- 12 projects
- 100 tasks
- 57 skills
- 1 stage template
- 1 contact
Tất cả tài khoản demo dùng password 123.
| Vai trò | Username | Password |
|---|---|---|
| Admin | janesmith |
123 |
| Manager Web | maitran |
123 |
| Manager Backend | quangnguyen |
123 |
| Manager Mobile | trangle |
123 |
| Manager AI/QA | minhdang |
123 |
| Employee Web | annguyen |
123 |
| Employee Backend | namtran |
123 |
| Employee Mobile | anhvo |
123 |
| Employee AI | nhile |
123 |
Di chuyển vào thư mục Flutter:
cd qlcv
flutter pub getKiểm tra file cấu hình API:
qlcv/lib/config/api_config.dart
Nếu chạy bằng điện thoại Android thật qua USB, baseUrl phải là IPv4 của máy đang chạy backend, ví dụ:
static const String baseUrl = 'http://192.168.100.152:1337';Lấy IPv4 trên Windows:
ipconfigNếu chạy Android Emulator, có thể dùng:
static const String baseUrl = 'http://10.0.2.2:1337';Chạy app:
flutter runBuild APK debug:
flutter build apk --debugWeb admin là phần phụ trợ để quản lý bằng trình duyệt.
cd client
npm install
npm run devAPI mặc định trỏ về:
http://localhost:1337
Nếu cần đổi backend URL, chỉnh client/.env hoặc biến môi trường Vite/React tương ứng.
Backend gắn prefix /api.
| Nhóm API | Đường dẫn |
|---|---|
| Auth | /api/auth |
| Users | /api/users |
| Teams | /api/teams |
| Projects | /api/projects |
| Tasks | /api/tasks |
| Files | /api/file |
| Skills | /api/skills |
| Stage templates | /api/stage-templates |
| Contacts | /api/contacts |
| Assignment AI/MCMF | /api/assignments |
| Chatbot | /api/chatbot/message |
- Start MongoDB local.
- Reset dữ liệu demo:
node .\scripts\reset-local-db-demo.js- Start backend:
cd server
npm start- Start mobile app:
cd qlcv
flutter run- Đăng nhập bằng
janesmith / 123. - Kiểm tra Dashboard, Project Overview, tạo task, upload file, hỏi chatbot và chạy Auto Assignment.
Dự án nào bị trễ hạn nhất?Task nào bị trễ hạn nặng nhất?Báo cáo cho tôi dự án Module gợi ý phân công thông minhBáo cáo tổng quan từ hôm nay đến 1 tuầnThống kê nhân sự trong project Ứng dụng mobile theo dõi tiến độ nhómBáo cáo cá nhân An Nguyễn trong tuần nàyĐề xuất 3 người phù hợp cho task chưa gán trong project Module gợi ý phân công thông minhDự án nào đang tồn nhiều task nhất?
- Admin
janesmith: xem dashboard tổng quan, quản lý user, xem mọi project. - Manager
trangle: xem project mobile, tạo/sửa task, upload file, xem project overview. - Manager
minhdang: test chatbot, báo cáo project và gợi ý phân công AI/MCMF. - Employee
annguyen: kiểm tra luồng xem task cá nhân và giới hạn quyền chỉnh sửa.
- Máy tính và điện thoại nên cùng mạng Wi-Fi.
- Backend phải lắng nghe tại IP máy tính, không dùng
localhosttrên điện thoại thật. - Nếu đổi mạng, IPv4 có thể đổi, cần cập nhật lại
ApiConfig.baseUrl. - Nếu app gọi API không được, kiểm tra firewall Windows và port
1337.
- Báo cáo Word:
BC_DACN3_NPT_VPT.docxhoặcfinal.docx. - Link GitHub source: https://github.com/tin12q/cpm
- File CSDL:
exampleDB/assignment_test_100/*.json - File hướng dẫn cài đặt:
README.md - Tài khoản test: xem mục "Tài khoản test".
Không commit API key thật lên GitHub. Các khóa như GEMINI_API_KEY, OPENAI_COMPATIBLE_API_KEY, CLAUDE_SONNET_4_6_API_KEY hoặc JWT_SECRET nên để trong file .env local và thay bằng placeholder trong tài liệu.