Hệ thống quản lý tuyển dụng (Applicant Tracking System) với giao diện Neo-brutalism, được xây dựng bằng Next.js, Express, TypeScript và Couchbase.
- Frontend: Next.js 15 (App Router) + React + TypeScript + Tailwind CSS + Framer Motion
- Backend: Node.js + Express + TypeScript + Socket.IO
- Database: Couchbase Server 7.x
- Design: Neo-brutalism UI/UX với animation mượt mà
- ✅ Dashboard tổng quan với KPI và biểu đồ
- ✅ Quản lý công việc (Jobs) - CRUD, gán recruiter
- ✅ Quản lý ứng viên (Candidates) - Profile, CV, kỹ năng
- ✅ Quy trình pipeline (Kanban board) với real-time updates
- ✅ Lịch phỏng vấn (Calendar) với tích hợp ICS
- ✅ Quản lý đơn ứng tuyển (Applications)
- ✅ Tasks & Notes cho recruiter
- ✅ Báo cáo và thống kê chi tiết
- ✅ JWT Authentication với refresh token
- ✅ Role-based Access Control (Admin, Recruiter, Hiring Manager, Interviewer)
- ✅ Session management với Couchbase
- ✅ Audit logs
- ✅ Cập nhật pipeline tự động
- ✅ Notifications
- ✅ Chat giữa Recruiter và Hiring Manager
- ✅ Job Board - Danh sách việc làm
- ✅ Application Form - Multi-step với upload CV
- Node.js >= 18.x
- npm >= 9.x
- Couchbase Server >= 7.x (đang chạy trên http://localhost:8091)
# Cài đặt dependencies cho toàn bộ monorepo
npm install
# Cài đặt cho từng workspace
cd backend && npm install
cd ../frontend && npm install
cd ../shared && npm install
Đăng nhập vào Couchbase Web Console tại http://localhost:8091 với:
- Username:
Admin - Password:
123456
Tạo Bucket và Collections:
-- Chạy các lệnh sau trong Query Editor của Couchbase
-- Tạo bucket (nếu chưa có)
-- Làm thủ công qua UI: Buckets > Add Bucket
-- Name: ats_bucket
-- Memory Quota: 512 MB (tối thiểu)
-- Tạo scope và collections
CREATE SCOPE ats_bucket.main IF NOT EXISTS;
CREATE COLLECTION ats_bucket.main.users IF NOT EXISTS;
CREATE COLLECTION ats_bucket.main.sessions IF NOT EXISTS;
CREATE COLLECTION ats_bucket.main.jobs IF NOT EXISTS;
CREATE COLLECTION ats_bucket.main.candidates IF NOT EXISTS;
CREATE COLLECTION ats_bucket.main.applications IF NOT EXISTS;
CREATE COLLECTION ats_bucket.main.interviews IF NOT EXISTS;
CREATE COLLECTION ats_bucket.main.tasks IF NOT EXISTS;
CREATE COLLECTION ats_bucket.main.reports IF NOT EXISTS;
CREATE COLLECTION ats_bucket.main.activities IF NOT EXISTS;
-- Tạo Primary Index
CREATE PRIMARY INDEX ON ats_bucket.main.users;
CREATE PRIMARY INDEX ON ats_bucket.main.jobs;
CREATE PRIMARY INDEX ON ats_bucket.main.candidates;
CREATE PRIMARY INDEX ON ats_bucket.main.applications;
CREATE PRIMARY INDEX ON ats_bucket.main.interviews;
CREATE PRIMARY INDEX ON ats_bucket.main.tasks;
CREATE PRIMARY INDEX ON ats_bucket.main.reports;
CREATE PRIMARY INDEX ON ats_bucket.main.activities;
-- Tạo các index cho query hiệu quả
CREATE INDEX idx_users_email ON ats_bucket.main.users(email);
CREATE INDEX idx_users_role ON ats_bucket.main.users(`role`);
CREATE INDEX idx_jobs_status ON ats_bucket.main.jobs(`status`);
CREATE INDEX idx_applications_job ON ats_bucket.main.applications(jobId);
CREATE INDEX idx_applications_candidate ON ats_bucket.main.applications(candidateId);
CREATE INDEX idx_applications_status ON ats_bucket.main.applications(`status`);
CREATE INDEX idx_interviews_date ON ats_bucket.main.interviews(scheduledDate);
CREATE INDEX idx_candidates_skills ON ats_bucket.main.candidates(skills);
Backend - Tạo file backend/.env:
# Server
PORT=5000
NODE_ENV=development
# Couchbase
COUCHBASE_URL=couchbase://localhost
COUCHBASE_USERNAME=Admin
COUCHBASE_PASSWORD=123456
COUCHBASE_BUCKET=ats_bucket
# JWT
JWT_SECRET=your-super-secret-jwt-key-change-this-in-production
JWT_REFRESH_SECRET=your-refresh-secret-key-change-this-in-production
JWT_EXPIRES_IN=1h
JWT_REFRESH_EXPIRES_IN=7d
# CORS
CORS_ORIGIN=http://localhost:3000
# Upload
MAX_FILE_SIZE=10485760
UPLOAD_DIR=./uploads
Frontend - Tạo file frontend/.env.local:
NEXT_PUBLIC_API_URL=http://localhost:5000
NEXT_PUBLIC_WS_URL=http://localhost:5000
cd backend
npm run seed
Lệnh này sẽ tạo:
- 5 users mẫu (Admin, Recruiters, Hiring Managers)
- 10 jobs mẫu
- 30 candidates mẫu
- 50 applications mẫu
- 20 interviews mẫu
- Report snapshots
Tài khoản demo:
- Admin:
admin@ats.com/Admin123! - Recruiter:
recruiter@ats.com/Recruiter123! - Hiring Manager:
manager@ats.com/Manager123!
Chạy cả Backend và Frontend cùng lúc:
# Từ thư mục root
npm run dev
Hoặc chạy riêng từng service:
# Terminal 1 - Backend
cd backend
npm run dev
# Terminal 2 - Frontend
cd frontend
npm run dev
Truy cập ứng dụng:
- Frontend: http://localhost:3000
- Backend API: http://localhost:5000
- API Documentation: http://localhost:5000/api-docs
ats-couchbase-monorepo/
├── backend/ # Express API server
│ ├── src/
│ │ ├── config/ # Couchbase, JWT config
│ │ ├── controllers/ # Route controllers
│ │ ├── middleware/ # Auth, validation, error handling
│ │ ├── models/ # TypeScript interfaces
│ │ ├── repositories/ # Couchbase data access layer
│ │ ├── routes/ # API routes
│ │ ├── services/ # Business logic
│ │ ├── socket/ # Socket.IO handlers
│ │ ├── utils/ # Helpers
│ │ └── server.ts # Entry point
│ ├── uploads/ # File storage
│ └── package.json
├── frontend/ # Next.js application
│ ├── src/
│ │ ├── app/ # App Router pages
│ │ ├── components/ # React components
│ │ ├── lib/ # API client, utils
│ │ ├── hooks/ # Custom React hooks
│ │ ├── store/ # Zustand state management
│ │ └── styles/ # Global styles
│ └── package.json
├── shared/ # Shared TypeScript types
│ ├── src/
│ │ └── types/
│ └── package.json
└── package.json # Root package.json
Ứng dụng sử dụng phong cách thiết kế Neo-brutalism với:
- Màu sắc: Palette tươi sáng, tương phản cao
- Typography: Font đậm, rõ ràng
- Borders: Viền đen dày
- Shadows: Drop shadow nhiều lớp
- Layout: Grid rõ ràng, không bo góc hoặc bo góc tối thiểu
- Animation: Micro-interactions mượt mà với Framer Motion
# Development
npm run dev # Chạy toàn bộ stack
npm run dev:backend # Chỉ chạy backend
npm run dev:frontend # Chỉ chạy frontend
# Build
npm run build # Build toàn bộ
npm run build:backend # Build backend
npm run build:frontend # Build frontend
# Linting
npm run lint # Lint toàn bộ
npm run lint:backend # Lint backend
npm run lint:frontend # Lint frontend
# Backend specific
cd backend
npm run seed # Seed dữ liệu mẫu
npm run clear-db # Xóa toàn bộ dữ liệu
npm test # (Chưa cài đặt)
# Frontend specific
cd frontend
npm run build # Production build
npm start # Start production server
POST /api/auth/register- Đăng kýPOST /api/auth/login- Đăng nhậpPOST /api/auth/refresh- Refresh tokenPOST /api/auth/logout- Đăng xuất
GET /api/users- Danh sách usersGET /api/users/:id- Chi tiết userPOST /api/users- Tạo userPUT /api/users/:id- Cập nhật userDELETE /api/users/:id- Xóa user
GET /api/jobs- Danh sách jobsGET /api/jobs/:id- Chi tiết jobPOST /api/jobs- Tạo jobPUT /api/jobs/:id- Cập nhật jobDELETE /api/jobs/:id- Xóa job
GET /api/candidates- Danh sách ứng viênGET /api/candidates/:id- Chi tiết ứng viênPOST /api/candidates- Tạo ứng viênPUT /api/candidates/:id- Cập nhật ứng viênDELETE /api/candidates/:id- Xóa ứng viênPOST /api/candidates/:id/upload-cv- Upload CV
GET /api/applications- Danh sách đơn ứng tuyểnGET /api/applications/:id- Chi tiết đơnPOST /api/applications- Tạo đơn ứng tuyểnPUT /api/applications/:id- Cập nhật đơnPATCH /api/applications/:id/status- Thay đổi trạng tháiPOST /api/applications/:id/notes- Thêm ghi chú
GET /api/interviews- Danh sách phỏng vấnGET /api/interviews/:id- Chi tiết phỏng vấnPOST /api/interviews- Tạo lịch phỏng vấnPUT /api/interviews/:id- Cập nhật lịchDELETE /api/interviews/:id- Hủy phỏng vấn
GET /api/tasks- Danh sách tasksPOST /api/tasks- Tạo taskPUT /api/tasks/:id- Cập nhật taskDELETE /api/tasks/:id- Xóa task
GET /api/reports/dashboard- Dashboard metricsGET /api/reports/pipeline- Pipeline statisticsGET /api/reports/sources- Candidate sourcesGET /api/reports/time-to-hire- Time to hire metricsGET /api/reports/export- Export CSV
join_room- Tham gia room (job/application)leave_room- Rời roomsend_message- Gửi message
application_updated- Đơn ứng tuyển cập nhậtinterview_scheduled- Lịch phỏng vấn mớistatus_changed- Trạng thái thay đổinew_message- Message mớinotification- Thông báo
- Đảm bảo Couchbase Server đang chạy
- Kiểm tra username/password trong
.env - Kiểm tra bucket
ats_bucketđã được tạo
- Kiểm tra Backend đang chạy trên port 5000
- Kiểm tra CORS settings trong backend
- Kiểm tra
NEXT_PUBLIC_API_URLtrong.env.local
- Kiểm tra thư mục
backend/uploadsđã được tạo - Kiểm tra
MAX_FILE_SIZEtrong.env
Tham khảo tài liệu Đề xuất cải tiến & chức năng bổ sung để xem roadmap đề xuất và các tính năng gợi ý trong tương lai.
MIT
Dự án "Tìm hiểu công cụ và thiết kế CSDL tài liệu bằng Couchbase cho Quản lý hồ sơ ứng viên và tuyển dụng trực tuyến"