Skip to content

RiceTooCold/duo-nan-guo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

29 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Duo-Nan-Guo ๅคš้›ฃ้Ž

่ชž่จ€ๆชขๅฎš่€ƒ่ฉฆๅฐๆˆฐๆ‡‰็”จ โ€” ็ตๅˆ Kahoot ๅผๅณๆ™‚ๅฐๆˆฐ่ˆ‡ JLPT / TOEIC / TOPIK / HSK ๅฎ˜ๆ–น้กŒๅž‹

Next.js TypeScript Prisma Pusher


๐Ÿ“– ็›ฎ้Œ„


ๅฐˆๆกˆๆฆ‚่ฟฐ

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 ้ฉ—่ญ‰๏ผ‰

๐Ÿค– AI ๅฐๆ‰‹

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 ๅ‰็ซฏไฝฟ็”จ

AI API Keys๏ผˆ่‡ณๅฐ‘ๅกซไธ€ๅ€‹๏ผ‰

่ฎŠๆ•ธ ่ชชๆ˜Ž ๅ–ๅพ—ๆ–นๅผ
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/                     # ๅฐˆๆกˆๆ–‡ไปถ

้ƒจ็ฝฒๆŒ‡ๅ—

Vercel ้ƒจ็ฝฒ

  1. ้€ฃ็ต GitHub Repository

    • ็™ปๅ…ฅ Vercel
    • Import ๅฐˆๆกˆ
  2. ่จญๅฎš็’ฐๅขƒ่ฎŠๆ•ธ

    • ๅœจ Vercel Dashboard โ†’ Settings โ†’ Environment Variables
    • ๅŠ ๅ…ฅๆ‰€ๆœ‰ๅฟ…ๅกซ็’ฐๅขƒ่ฎŠๆ•ธ
    • NEXTAUTH_URL ่จญ็‚บไฝ ็š„ Vercel ็ถฒๅŸŸ๏ผˆๅฆ‚ https://duo-nan-guo.vercel.app๏ผ‰
  3. ่จญๅฎš Cron Job๏ผˆ้ธๅกซ๏ผ‰

    • vercel.json ๅทฒ่จญๅฎšๆฏๆ—ฅ 10:00 UTC ๅŸท่กŒๆธ…็†ไปปๅ‹™
    • ๅœจ Vercel ่จญๅฎš CRON_SECRET ็’ฐๅขƒ่ฎŠๆ•ธ
  4. ้ƒจ็ฝฒ

    • Push ๅˆฐ main ๅˆ†ๆ”ฏๅณ่‡ชๅ‹•้ƒจ็ฝฒ

ๆณจๆ„ไบ‹้ …

  • Vercel Hobby Plan ๆœ‰ 10 ็ง’ ๅ‡ฝๆ•ธๅŸท่กŒ้™ๅˆถ
  • ๆœฌๅฐˆๆกˆๅทฒ้‡ๅฐ Serverless ๅ„ชๅŒ–๏ผš
    • Client-side Hash ้ฉ—่ญ‰ๅฏฆ็พๅณๆ™‚ๅ›ž้ฅ‹
    • LLM ๅ‘ผๅซๆœ‰ 5 ็ง’ Timeout + Fallback
    • Client-driven ่ฝ‰ๅ ด้ฟๅ…่ƒŒๆ™ฏๅŸท่กŒ

้–‹็™ผๆ–‡ไปถ


License

MIT ยฉ 2025 Duo-Nan-Guo Team

About

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors