่ช่จๆชขๅฎ่่ฉฆๅฐๆฐๆ็จ โ ็ตๅ Kahoot ๅผๅณๆๅฐๆฐ่ JLPT / TOEIC / TOPIK / HSK ๅฎๆน้กๅ
- ๅฐๆกๆฆ่ฟฐ
- ๅ่ฝ็น่ฒ
- ๆ่กๆถๆง
- ๅฟซ้้ๅง
- ็ฐๅข่ฎๆธ่จญๅฎ
- ๅฏ็จๆไปค
- ๅฐๆก็ตๆง
- ้จ็ฝฒๆๅ
- ้็ผๆไปถ
Duo-Nan-Guo ๆฏไธๆฌพ่ช่จๆชขๅฎ่่ฉฆๅฐๆฐ PWA ๆ็จ๏ผ็ฉๅฎถๅฏ้้ 1v1 ๆๅคไบบๅฐๆฐๆจกๅผ็ทด็ฟ่ช่จ่่ฉฆ้ก็ฎใ
| ่่ฉฆ้กๅ | ่ช่จ | ็ญ็ด |
|---|---|---|
| JLPT | ๆฅ่ช ๐ฏ๐ต | N5 โ N1 |
| TOEIC | ่ฑ่ช ๐บ๐ธ | ๆฉ่ฒ โ ้่ฒ่ญๆธ |
| TOPIK | ้่ช ๐ฐ๐ท | I 1๊ธ โ II 6๊ธ |
| HSK | ไธญๆ ๐จ๐ณ | 1็ด โ 6็ด |
- Bot ๅฐๆฐ๏ผ่ LLM ้ฉ ๅ็ AI ๅฐๆๅฐๆฑบ๏ผGPT-4o-miniใGeminiใLlama ็ญ๏ผ
- PvP ๅฐๆฐ๏ผๅณๆ 1v1 ็ไบบๅฐๆฑบ
- ๅคไบบๆจกๅผ๏ผ2-8 ไบบๅๆ็ซถ่ณฝ๏ผ้็ผไธญ๏ผ
| ๆฉๅถ | ่ชชๆ |
|---|---|
| ๅบ็คๅ | ็ญๅฐ +100 ๅ |
| ้ๅบฆ็ๅต | ๆๅค +50 ๅ๏ผ็ญ้ก่ถๅฟซๅๆธ่ถ้ซ๏ผ |
| ้ฃ็บๆญฃ็ขบ | 1.0x โ 1.5x ๅ็ๅ ๆ |
| ๅณๆๅ้ฅ | ้ปๆๅพ็ซๅณ้กฏ็คบๅฐ้ฏ๏ผClient-side Hash ้ฉ่ญ๏ผ |
| Bot ้กๅ | ่ชชๆ |
|---|---|
| GPT-4o-mini | OpenAI ๆๅฟซๆจกๅ |
| Gemini Flash | Google ้ซ้ๆจกๅ |
| Llama 3.3 70B | Groq ๆจ็ๅ ้ |
- ๆญทๅฒ็ด้๏ผๆฅ็้ๅปๅฐๆฐ็ตๆ่็ญ้ก่ฉณๆ
- ๆ่กๆฆ๏ผๅ จๆ็ฉๅฎถ็ฉๅๆๅ
- Google ็ปๅ ฅ๏ผOAuth 2.0 ๅฟซ้็ปๅ ฅ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Frontend โ
โ Next.js 15 (App Router) + React 19 + Tailwind CSS 4 โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Backend / API โ
โ Next.js Server Actions + API Routes โ
โ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โ
โ โ NextAuth.js โ โ Prisma ORM โ โ Vercel AI โ โ
โ โ (OAuth) โ โ (MongoDB) โ โ SDK โ โ
โ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโ
โผ โผ โผ
โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ
โ MongoDB โ โ Pusher โ โ LLM APIs โ
โ Atlas โ โ (Realtime) โ โ Gemini/GPT โ
โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ
| ๅฑค็ด | ๆ่ก |
|---|---|
| Framework | Next.js 15 (App Router, Server Actions) |
| UI | React 19, Tailwind CSS 4, Framer Motion |
| Database | MongoDB Atlas + Prisma 6 |
| Auth | NextAuth.js 4 (Google OAuth) |
| Realtime | Pusher Channels |
| AI | Vercel AI SDK (Gemini, OpenAI, Groq) |
| Deployment | Vercel |
- Node.js 20+
- pnpm 9+
- MongoDB Atlas ๅธณ่
- Pusher ๅธณ่
- Google Cloud OAuth ๆ่ญ
- AI API Key๏ผ่ณๅฐไธๅ๏ผGemini / OpenAI / Groq๏ผ
# 1. Clone ๅฐๆก
git clone https://github.com/RiceTooCold/duo-nan-guo.git
cd duo-nan-guo
# 2. ๅฎ่ฃไพ่ณด
pnpm install
# 3. ่จญๅฎ็ฐๅข่ฎๆธ
cp .env.example .env
# ็ทจ่ผฏ .env ๅกซๅ
ฅๆๆๅฟ
่ฆ่ฎๆธ๏ผ่ฆไธๆน่ชชๆ๏ผ
# 4. ๆจ้ Schema ๅฐ่ณๆๅบซ
pnpm db:push
# 5. Seed Bot ไฝฟ็จ่
๏ผๅปบ็ซ AI ๅฐๆๅธณ่๏ผ
pnpm seed-bots
# 6. ๅๅ้็ผไผบๆๅจ
pnpm dev้ๅ http://localhost:3000 ๅณๅฏไฝฟ็จใ
ๅฐ .env.example ่ค่ฃฝ็บ .env ไธฆๅกซๅ
ฅไปฅไธ่ฎๆธ๏ผ
| ่ฎๆธ | ่ชชๆ | ๅๅพๆนๅผ |
|---|---|---|
DATABASE_URL |
MongoDB ้ฃ็ทๅญไธฒ | MongoDB Atlas |
NEXTAUTH_SECRET |
NextAuth ๅ ๅฏ้้ฐ | openssl rand -base64 32 |
NEXTAUTH_URL |
ๆ็จ็จๅผ URL | http://localhost:3000 (้็ผ) |
GOOGLE_CLIENT_ID |
Google OAuth Client ID | Google Cloud Console |
GOOGLE_CLIENT_SECRET |
Google OAuth Secret | ๅไธ |
PUSHER_APP_ID |
Pusher App ID | Pusher Dashboard |
PUSHER_KEY |
Pusher Key | ๅไธ |
PUSHER_SECRET |
Pusher Secret | ๅไธ |
PUSHER_CLUSTER |
Pusher Cluster | ้ๅธธ็บ ap3 |
NEXT_PUBLIC_PUSHER_KEY |
ๅ PUSHER_KEY |
ๅ็ซฏไฝฟ็จ |
NEXT_PUBLIC_PUSHER_CLUSTER |
ๅ PUSHER_CLUSTER |
ๅ็ซฏไฝฟ็จ |
| ่ฎๆธ | ่ชชๆ | ๅๅพๆนๅผ |
|---|---|---|
GEMINI_API_KEY |
Google Gemini | AI Studio |
OPENAI_API_KEY |
OpenAI | OpenAI Platform |
GROQ_API_KEY |
Groq | Groq Console |
| ่ฎๆธ | ่ชชๆ | ้ ่จญๅผ |
|---|---|---|
NEXT_PUBLIC_ADMIN_PASSWORD |
Admin ้ ้ขๅฏ็ขผ | - |
CRON_SECRET |
Vercel Cron ๆๆฌ้้ฐ | - |
GEMINI_RPM |
Gemini API ้็้ๅถ | 30 |
| ๆไปค | ่ชชๆ |
|---|---|
pnpm dev |
ๅๅ้็ผไผบๆๅจ |
pnpm build |
ๅปบ็ฝฎ็็ข็ๆฌ |
pnpm start |
ๅๅ็็ขไผบๆๅจ |
pnpm lint |
ๅท่ก ESLint |
pnpm db:generate |
็ๆ Prisma Client |
pnpm db:push |
ๆจ้ Schema ๅฐ่ณๆๅบซ |
pnpm db:studio |
้ๅ Prisma Studio๏ผ่ณๆๅบซ GUI๏ผ |
pnpm seed-bots |
ๅปบ็ซ AI Bot ไฝฟ็จ่ |
duo-nan-guo/
โโโ app/ # Next.js App Router
โ โโโ (game)/ # ้ๆฒ้ ้ข๏ผ้็ปๅ
ฅ๏ผ
โ โ โโโ battle/ # ๅฐๆฐ้ ้ข
โ โ โโโ history/ # ๆญทๅฒ็ด้
โ โ โโโ leaderboard/ # ๆ่กๆฆ
โ โ โโโ lobby/ # ๅคงๅปณ
โ โ โโโ results/ # ็ต็ฎ้ ้ข
โ โ โโโ room/ # ็ญๅพ
ๅฎค
โ โโโ admin/ # ้ก็ฎ็ฎก็ๅพๅฐ
โ โโโ api/ # API Routes
โ โ โโโ auth/ # NextAuth ็ซฏ้ป
โ โ โโโ cron/ # ๅฎๆไปปๅ
โ โโโ login/ # ็ปๅ
ฅ้ ้ข
โ
โโโ lib/
โ โโโ factory/ # ้ก็ฎ็ๆ้่ผฏ
โ โ โโโ ai/ # AI ๆจกๅๆดๅ
โ โ โโโ services/ # ็ๆๆๅ
โ โโโ game-engine/ # ้ๆฒๅผๆ
โ โ โโโ server/ # Server-side ็ๆ
็ฎก็
โ โ โโโ useGameClient.ts # Client-side Hook
โ โโโ config/ # ้ๆฒ่จญๅฎ
โ โโโ auth.ts # NextAuth ่จญๅฎ
โ โโโ prisma.ts # Prisma Client
โ โโโ pusher.ts # Pusher ่จญๅฎ
โ
โโโ actions/ # Server Actions
โ โโโ game.server.ts # ้ๆฒ็ธ้
โ โโโ bot.server.ts # Bot AI ๅผๅซ
โ โโโ leaderboard.server.ts # ๆ่กๆฆ
โ
โโโ components/ # React ๅ
ไปถ
โ โโโ game/ # ้ๆฒ UI ๅ
ไปถ
โ
โโโ prisma/
โ โโโ schema.prisma # ่ณๆๅบซ Schema
โ โโโ seed-bots.ts # Bot ไฝฟ็จ่
Seed
โ
โโโ docs/ # ๅฐๆกๆไปถ
-
้ฃ็ต GitHub Repository
- ็ปๅ ฅ Vercel
- Import ๅฐๆก
-
่จญๅฎ็ฐๅข่ฎๆธ
- ๅจ Vercel Dashboard โ Settings โ Environment Variables
- ๅ ๅ ฅๆๆๅฟ ๅกซ็ฐๅข่ฎๆธ
NEXTAUTH_URL่จญ็บไฝ ็ Vercel ็ถฒๅ๏ผๅฆhttps://duo-nan-guo.vercel.app๏ผ
-
่จญๅฎ Cron Job๏ผ้ธๅกซ๏ผ
vercel.jsonๅทฒ่จญๅฎๆฏๆฅ 10:00 UTC ๅท่กๆธ ็ไปปๅ- ๅจ Vercel ่จญๅฎ
CRON_SECRET็ฐๅข่ฎๆธ
-
้จ็ฝฒ
- Push ๅฐ
mainๅๆฏๅณ่ชๅ้จ็ฝฒ
- Push ๅฐ
- Vercel Hobby Plan ๆ 10 ็ง ๅฝๆธๅท่ก้ๅถ
- ๆฌๅฐๆกๅทฒ้ๅฐ Serverless ๅชๅ๏ผ
- Client-side Hash ้ฉ่ญๅฏฆ็พๅณๆๅ้ฅ
- LLM ๅผๅซๆ 5 ็ง Timeout + Fallback
- Client-driven ่ฝๅ ด้ฟๅ ่ๆฏๅท่ก
MIT ยฉ 2025 Duo-Nan-Guo Team