https://github.com/ddthien-coder/hskdolien
https://github.com/ddthien-coder/hskdolien
Last synced: about 1 month ago
JSON representation
- Host: GitHub
- URL: https://github.com/ddthien-coder/hskdolien
- Owner: ddthien-coder
- Created: 2025-10-31T02:04:07.000Z (7 months ago)
- Default Branch: Deploy
- Last Pushed: 2025-10-31T03:50:58.000Z (7 months ago)
- Last Synced: 2025-10-31T04:23:14.010Z (7 months ago)
- Language: TypeScript
- Size: 199 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# HSK Dolien - Chinese Proficiency Exam System
A comprehensive HSK (Hanyu Shuiping Kaoshi) examination platform built with Next.js 15, TypeScript, PostgreSQL, and Redis.
## Features
- 🔐 **Authentication & Security**: JWT + Refresh tokens, RBAC (5 roles), rate limiting
- 📚 **Question Bank**: Multi-language support (zh-CN, zh-TW, pinyin, Vietnamese), 7 question types
- 🎯 **Exam Generation**: Manual creation + intelligent auto-generation with balancing algorithm
- ✍️ **Exam Taking**: Real-time autosave, progress tracking, resume capability
- 🤖 **Auto-Grading**: Fuzzy matching for fill-in-blank, exact match for MCQ, partial credit system
- 👨🏫 **Manual Grading**: Queue management for essays, rubric-based scoring
- 🛡️ **Anti-Cheating**: Proctor sessions, violation tracking, suspicious activity detection
- 📈 **Analytics**: Performance tracking, skill breakdown, system-wide reporting with Recharts
- 🎓 **Certificates**: Auto-generated HTML certificates for passed exams
- 📋 **Exam Templates**: Reusable exam configurations for quick exam creation
- 💾 **Media Library & Document Storage**: Centralized file management with upload, download, and organization for images, audio, and documents (PDF, DOC, DOCX, XLS, XLSX, PPT, PPTX, TXT, CSV)
- ⚡ **Job Queue**: Background processing for grading, certificates, and cleanup tasks
- 👤 **Admin Panel**: Complete management UI for users, exams, question banks, and system monitoring
## Tech Stack
- **Framework**: Next.js 16.0.1 (App Router)
- **Language**: TypeScript 5 (strict mode, zero `any` types)
- **Database**: PostgreSQL 17 with Prisma ORM
- **Cache**: Redis 7
- **Authentication**: JWT with httpOnly cookies
- **Validation**: Zod v4
- **Charts**: Recharts 3
- **Styling**: Tailwind CSS 4
- **Deployment**: Docker + PM2 cluster mode
## Getting Started
### Prerequisites
- Node.js 20+
- PostgreSQL 17
- Redis 7
### Installation
```bash
# Install dependencies
npm install
# Set up environment variables
cp .env.example .env
# Edit .env with your database and Redis credentials
# Generate Prisma client
npm run db:generate
# Push schema to database
npm run db:push
# Seed demo data
npm run db:seed
```
### Development
```bash
npm run dev
```
Open [http://localhost:3000](http://localhost:3000)
### Demo Accounts
- **Admin**: admin@hsk.com / Admin123!
- **Teacher**: teacher@hsk.com / Teacher123!
- **Candidate**: candidate@hsk.com / Candidate123!
## Docker Deployment
```bash
# Build and run with Docker Compose
docker-compose up -d
# View logs
docker-compose logs -f app
# Stop services
docker-compose down
```
## PM2 Deployment
```bash
# Build for production
npm run build
# Start with PM2
pm2 start ecosystem.config.js
# Monitor
pm2 monit
```
## API Endpoints
### Authentication
- `POST /api/auth/register` - Register new user
- `POST /api/auth/login` - Login
- `POST /api/auth/logout` - Logout
- `POST /api/auth/refresh` - Refresh access token
- `GET /api/auth/me` - Get current user
### Question Banks
- `GET /api/banks` - List banks
- `POST /api/banks` - Create bank
- `GET /api/banks/[id]` - Get bank details
- `PATCH /api/banks/[id]` - Update bank
- `DELETE /api/banks/[id]` - Delete bank
### Questions
- `GET /api/questions` - List questions
- `POST /api/questions` - Create question
- `PATCH /api/questions/[id]` - Update question
- `DELETE /api/questions/[id]` - Delete question
### Exams
- `GET /api/exams` - List exams
- `POST /api/exams` - Create exam
- `POST /api/exams/generate` - Auto-generate exam
- `GET /api/exams/[id]` - Get exam details
- `POST /api/exams/[id]/publish` - Publish exam
- `POST /api/exams/[id]/questions` - Add questions
### Attempts
- `GET /api/attempts` - List user attempts
- `POST /api/attempts` - Start attempt
- `POST /api/attempts/[id]/answer` - Save answer (autosave)
- `POST /api/attempts/[id]/submit` - Submit attempt
- `POST /api/attempts/[id]/grade` - Auto-grade attempt
### Grading
- `GET /api/grading/manual` - Get manual grading queue
- `POST /api/grading/manual` - Submit manual grade
### Proctor
- `POST /api/proctor/[attemptId]` - Initialize session
- `POST /api/proctor/[attemptId]/flag` - Record violation
- `GET /api/proctor/[attemptId]/analysis` - Analyze suspicious activity
### Analytics
- `GET /api/analytics/user` - User performance
- `GET /api/analytics/exam/[id]` - Exam statistics
- `GET /api/analytics/system` - System-wide analytics
### Admin
- `GET /api/admin/dashboard` - Admin dashboard data
- `GET /api/admin/users` - List users
- `PATCH /api/admin/users/[id]` - Update user
- `DELETE /api/admin/users/[id]` - Delete user
- `GET /api/admin/exams` - List all exams
- `PATCH /api/admin/exams/[id]` - Update exam
- `DELETE /api/admin/exams/[id]` - Delete exam
- `GET /api/admin/banks` - List all banks
- `DELETE /api/admin/banks/[id]` - Delete bank
- `POST /api/admin/banks/[id]/transfer` - Transfer ownership
- `GET /api/admin/activity` - Activity logs
### Templates
- `GET /api/templates` - List exam templates
- `POST /api/templates` - Create template
- `GET /api/templates/[id]` - Get template details
- `PATCH /api/templates/[id]` - Update template
- `DELETE /api/templates/[id]` - Delete template
### Media & Document Storage
- `GET /api/media` - List all media files (with filtering and search)
- `POST /api/upload` - Upload file (image, audio, document)
- `GET /api/media/[id]` - Get media details
- `PATCH /api/media/[id]` - Update media metadata (description, tags)
- `DELETE /api/media/[id]` - Delete media file
- `POST /api/media/bulk` - Bulk delete media files
### Certificates
- `GET /api/certificates/[attemptId]` - Generate certificate HTML
### Job Queue
- `GET /api/jobs` - List jobs (admin only)
- `POST /api/jobs` - Create job
- `GET /api/jobs/[id]` - Get job status
## Database Schema
14 models: User, RefreshToken, PasswordReset, Bank, Question, QuestionTranslation, ExamTemplate, Exam, ExamQuestion, Attempt, Answer, GradeRecord, ProctorSession, AuditLog, JobQueue
## Scripts
```bash
npm run dev # Start development server
npm run build # Build for production
npm run start # Start production server
npm run lint # Run ESLint
npm run db:generate # Generate Prisma client
npm run db:push # Push schema to database
npm run db:migrate # Run migrations
npm run db:seed # Seed demo data
npm run db:studio # Open Prisma Studio
```
## Background Worker
Run the background job processor for auto-grading, certificate generation, and cleanup:
```bash
# Development
ts-node scripts/worker.ts
# Production (with PM2)
pm2 start scripts/worker.ts --name hsk-worker --interpreter ts-node
```
## Admin Panel
Access the admin panel at [http://localhost:3000/admin](http://localhost:3000/admin)
Features:
- Dashboard with real-time metrics
- User management (roles, activation)
- Exam management (publish/unpublish)
- Question bank management
- **Media library & document storage** (upload, download, organize files)
- Activity audit logs
- System health monitoring
### Question Type Distribution System:
The distribution system supports all 6 HSK question types:
MCQ - Multiple Choice Questions
FILL_BLANK - Fill in the Blank
LISTENING - Listening Comprehension
WRITING - Written Essays
MATCHING - Match Items
DICTATION - Listen and Write
## License
MIT