Skip to content

yoohwan09/RG

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

2 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

RG (Roblox Guard) - ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ๊ด€๋ฆฌ ํ”Œ๋žซํผ

๋กœ๋ธ”๋ก์Šค ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ์ „๋ฌธ์ ์ธ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ๊ด€๋ฆฌ ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค.

Next.js TypeScript Tailwind CSS Firebase

๐ŸŽฏ ์ฃผ์š” ๊ธฐ๋Šฅ

1. ํ™ˆ ํŽ˜์ด์ง€ (Home)

  • ๐Ÿ’Ž ๊ธ€๋ž˜์Šค๋ชจํ”ผ์ฆ˜ ๋””์ž์ธ์˜ ๊ฒ€์ƒ‰์ฐฝ
  • ๐Ÿ” ๋‹‰๋„ค์ž„ ๋˜๋Š” ๋กœ๋ธ”๋ก์Šค ID๋กœ ๋น ๋ฅธ ๊ฒ€์ƒ‰
  • ๐Ÿ“Š ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ์‚ฌ์šฉ์ž ๊ฐ„๋žต ์กฐํšŒ

2. ์ƒ์„ธ ํŽ˜์ด์ง€ (Detail)

  • ๐Ÿ“‹ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ์‚ฌ์šฉ์ž ์ƒ์„ธ ์ •๋ณด
  • ๐Ÿ–ผ๏ธ ์ฆ๊ฑฐ ์‚ฌ์ง„ ์ด๋ฏธ์ง€ ๋ทฐ์–ด
  • ๐Ÿ“Š ๋ˆ„์  ์‹ ๊ณ  ๊ฑด์ˆ˜ ํ‘œ์‹œ

3. ์‹ ๊ณ  ํŽ˜์ด์ง€ (Report)

  • โœ๏ธ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ๋“ฑ๋ก ์‹ ์ฒญ
  • ๐Ÿ“ธ ์ฆ๊ฑฐ ์‚ฌ์ง„ ์—…๋กœ๋“œ (Firebase Storage)
  • ๐Ÿ” ๋กœ๊ทธ์ธ ํ•„์ˆ˜ ์ ‘๊ทผ ์ œํ•œ
  • โณ ๊ฒ€ํ†  ๋Œ€๊ธฐ ์ƒํƒœ ๊ด€๋ฆฌ

4. ๋งˆ์ด ํŽ˜์ด์ง€ (My Page)

  • ๐Ÿ‘ค ๊ฐœ์ธ ์ •๋ณด ๊ด€๋ฆฌ
  • ๐Ÿ”‘ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ
  • ๐Ÿ“ ๋‚ด๊ฐ€ ์‹ ๊ณ ํ•œ ๋ฆฌ์ŠคํŠธ
  • ๐Ÿ›ก๏ธ ๋‚ด ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ์ƒํƒœ ํ™•์ธ

5. ์•Œ๋ฆผ ํŽ˜์ด์ง€ (Notification)

  • ๐Ÿ”” ์‹ ๊ณ  ์Šน์ธ/๊ฑฐ์ ˆ ์•Œ๋ฆผ
  • ๐Ÿšจ ๊ธด๊ธ‰ ์•Œ๋ฆผ (๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ๋“ฑ๋ก)
  • ๐Ÿ“ฒ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ์‹œ์Šคํ…œ

6. ์–ด๋“œ๋ฏผ ํŽ˜์ด์ง€ (Admin)

  • โœ… ์‹ ๊ณ  ๊ฒ€ํ†  ๋ฐ ์Šน์ธ
  • โŒ ์‹ ๊ณ  ๊ฑฐ์ ˆ (์‚ฌ์œ  ๊ธฐ๋ก)
  • ๐Ÿ“Š ๋Œ€๊ธฐ ์ค‘์ธ ์‹ ๊ณ  ๊ด€๋ฆฌ

๐Ÿ› ๏ธ ๊ธฐ์ˆ  ์Šคํƒ

ํ•ญ๋ชฉ ๊ธฐ์ˆ 
Frontend Next.js 14, React 18, TypeScript 5
Styling Tailwind CSS, CSS3 (Glassmorphism)
์ƒํƒœ ๊ด€๋ฆฌ Zustand
๋ฐฑ์—”๋“œ & DB Firebase (Authentication, Firestore, Storage)
์ธ์ฆ Firebase Auth + Discord OAuth 2.0 (์ค€๋น„ ์ค‘)
API ํ†ต์‹  Axios

๐Ÿ“ฆ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

src/
โ”œโ”€โ”€ app/                      # Next.js App Router
โ”‚   โ”œโ”€โ”€ (auth)/              # ์ธ์ฆ ๊ด€๋ จ ํŽ˜์ด์ง€
โ”‚   โ”‚   โ”œโ”€โ”€ login/
โ”‚   โ”‚   โ””โ”€โ”€ signup/
โ”‚   โ”œโ”€โ”€ (main)/              # ๋ฉ”์ธ ํŽ˜์ด์ง€๋“ค
โ”‚   โ”‚   โ”œโ”€โ”€ home/
โ”‚   โ”‚   โ”œโ”€โ”€ detail/[id]/
โ”‚   โ”‚   โ”œโ”€โ”€ report/
โ”‚   โ”‚   โ”œโ”€โ”€ mypage/
โ”‚   โ”‚   โ””โ”€โ”€ notification/
โ”‚   โ”œโ”€โ”€ admin/               # ์–ด๋“œ๋ฏผ ํŽ˜์ด์ง€
โ”‚   โ”œโ”€โ”€ layout.tsx           # ๋ฉ”์ธ ๋ ˆ์ด์•„์›ƒ
โ”‚   โ””โ”€โ”€ globals.css          # ๊ธ€๋กœ๋ฒŒ ์Šคํƒ€์ผ
โ”‚
โ”œโ”€โ”€ components/
โ”‚   โ”œโ”€โ”€ common/              # ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ
โ”‚   โ”‚   โ”œโ”€โ”€ GlassButton.tsx
โ”‚   โ”‚   โ”œโ”€โ”€ GlassInput.tsx
โ”‚   โ”‚   โ”œโ”€โ”€ GlassCard.tsx
โ”‚   โ”‚   โ”œโ”€โ”€ GlassModal.tsx
โ”‚   โ”‚   โ”œโ”€โ”€ Loader.tsx
โ”‚   โ”‚   โ”œโ”€โ”€ Toast.tsx
โ”‚   โ”‚   โ””โ”€โ”€ index.ts
โ”‚   โ””โ”€โ”€ layout/              # ๋ ˆ์ด์•„์›ƒ ์ปดํฌ๋„ŒํŠธ
โ”‚       โ”œโ”€โ”€ Header.tsx
โ”‚       โ”œโ”€โ”€ Footer.tsx
โ”‚       โ””โ”€โ”€ index.ts
โ”‚
โ”œโ”€โ”€ lib/
โ”‚   โ””โ”€โ”€ firebase/            # Firebase ๊ด€๋ จ ํ•จ์ˆ˜
โ”‚       โ”œโ”€โ”€ config.ts        # Firebase ์„ค์ •
โ”‚       โ”œโ”€โ”€ auth.ts          # ์ธ์ฆ ํ•จ์ˆ˜
โ”‚       โ”œโ”€โ”€ firestore.ts     # Firestore CRUD ํ•จ์ˆ˜
โ”‚       โ””โ”€โ”€ storage.ts       # Storage ํ•จ์ˆ˜
โ”‚
โ”œโ”€โ”€ store/                   # Zustand ์ƒํƒœ ๊ด€๋ฆฌ
โ”‚   โ”œโ”€โ”€ authStore.ts
โ”‚   โ””โ”€โ”€ blacklistStore.ts
โ”‚
โ”œโ”€โ”€ types/                   # TypeScript ํƒ€์ž… ์ •์˜
โ”‚   โ””โ”€โ”€ index.ts
โ”‚
โ”œโ”€โ”€ styles/                  # ์Šคํƒ€์ผ ํŒŒ์ผ
โ”‚   โ””โ”€โ”€ glassmorphism.css    # ๊ธ€๋ž˜์Šค๋ชจํ”ผ์ฆ˜ ์Šคํƒ€์ผ
โ”‚
โ””โ”€โ”€ utils/                   # ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜

๐ŸŽจ ๋””์ž์ธ ์ปจ์…‰

Glassmorphism (๊ธ€๋ž˜์Šค๋ชจํ”ผ์ฆ˜)

  • ํˆฌ๋ช…๋„๊ฐ€ ์ ์šฉ๋œ ํ™”์ดํŠธ ๋ฐฐ๊ฒฝ
  • backdrop-filter: blur(10px) ํšจ๊ณผ
  • ๋ฏธ์„ธํ•œ ํ…Œ๋‘๋ฆฌ์™€ ์„€๋„์šฐ

3D ๋ฒ„ํŠผ ๋””์ž์ธ

  • ์ž…์ฒด๊ฐ์„ ์ฃผ๋Š” ๊ทธ๋ฆผ์ž ํšจ๊ณผ
  • Hover ์‹œ ์œ„๋กœ ๋– ์˜ค๋ฅด๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜
  • Active ์ƒํƒœ์—์„œ ๋ˆ„๋ฅด๋Š” ๋“ฏํ•œ ํšจ๊ณผ

์ƒ‰์ƒ ํŒ”๋ ˆํŠธ

์šฉ๋„ ์ƒ‰์ƒ ์šฉ๋„
Primary #3b82f6 (Blue) ๋ฒ„ํŠผ, ๊ฐ•์กฐ
Background #FFFFFF ๊ธฐ๋ณธ ๋ฐฐ๊ฒฝ
Secondary #F0F0F0 ๋ณด์กฐ ๋ฐฐ๊ฒฝ
Text Primary #1a1a1a ์ฃผ ํ…์ŠคํŠธ
Text Secondary #666666 ๋ณด์กฐ ํ…์ŠคํŠธ

๐Ÿš€ ๋น ๋ฅธ ์‹œ์ž‘

์‚ฌ์ „ ์š”๊ตฌ์‚ฌํ•ญ

  • Node.js 18.17 ์ด์ƒ
  • npm ๋˜๋Š” yarn
  • Firebase ํ”„๋กœ์ ํŠธ (์„ค์ • ํ•„์š”)

์„ค์น˜ ๋ฐ ์‹คํ–‰

# 1. ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ ์ด๋™
cd roblox-guard

# 2. ์˜์กด์„ฑ ์„ค์น˜
npm install

# 3. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •
cp .env.example .env.local
# .env.local ํŒŒ์ผ์—์„œ Firebase ์„ค์ • ๊ฐ’ ์ž…๋ ฅ

# 4. ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰
npm run dev

# 5. ๋ธŒ๋ผ์šฐ์ €์—์„œ ์—ด๊ธฐ
# http://localhost:3000

๐Ÿ”‘ Firebase ์„ค์ •

Firestore ์ปฌ๋ ‰์…˜ ๊ตฌ์กฐ

// Users ์ปฌ๋ ‰์…˜
{
  uid: string,
  userId: string,
  phoneNumber: string,
  robloxNickname: string,
  robloxId: string,
  createdAt: timestamp,
  updatedAt: timestamp
}

// Blacklist_Requests ์ปฌ๋ ‰์…˜ (๊ฒ€ํ†  ๋Œ€๊ธฐ)
{
  id: string,
  reporterId: string,
  robloxNickname: string,
  robloxId: string,
  reportType: 'scam' | 'harassment' | 'spam' | 'inappropriate' | 'other',
  description: string,
  imageUrls: string[],
  status: 'pending' | 'approved' | 'rejected',
  rejectionReason?: string,
  createdAt: timestamp,
  updatedAt: timestamp
}

// Blacklist_Official ์ปฌ๋ ‰์…˜ (์Šน์ธ๋œ ๋ชฉ๋ก)
{
  id: string,
  robloxNickname: string,
  robloxId: string,
  reportType: string,
  description: string,
  imageUrls: string[],
  reportCount: number,
  approvedAt: timestamp,
  createdAt: timestamp
}

// Notifications ์ปฌ๋ ‰์…˜
{
  id: string,
  userId: string,
  type: 'approval' | 'rejection' | 'blacklisted' | 'other',
  title: string,
  message: string,
  relatedData?: any,
  isRead: boolean,
  createdAt: timestamp
}

Firebase ๊ทœ์น™ (์ƒ˜ํ”Œ)

rules_version = '2';

service cloud.firestore {
  match /databases/{database}/documents {
    // Users ์ปฌ๋ ‰์…˜
    match /users/{userId} {
      allow read, write: if request.auth.uid == userId;
    }

    // Blacklist_Requests (์‹ ๊ณ  ์ ‘์ˆ˜)
    match /blacklist_requests/{requestId} {
      allow create: if request.auth != null;
      allow read: if request.auth.uid == resource.data.reporterId;
    }

    // Blacklist_Official (๊ณต๊ฐœ ๋ฐ์ดํ„ฐ)
    match /blacklist_official/{blacklistId} {
      allow read: if true;
    }

    // Notifications
    match /notifications/{notificationId} {
      allow read, write: if request.auth.uid == resource.data.userId;
    }
  }
}

๐Ÿ“ฑ ๋ฐ˜์‘ํ˜• ๋””์ž์ธ

  • โœ… ๋ชจ๋ฐ”์ผ ์ตœ์ ํ™” (375px ์ด์ƒ)
  • โœ… ํƒœ๋ธ”๋ฆฟ ์ตœ์ ํ™” (768px ์ด์ƒ)
  • โœ… ๋ฐ์Šคํฌํ†ฑ ์ตœ์ ํ™” (1024px ์ด์ƒ)

๐Ÿ” ๋ณด์•ˆ ๊ธฐ๋Šฅ

  • ๐Ÿ”’ Firebase Authentication
  • ๐Ÿ›ก๏ธ CORS ์„ค์ •
  • ๐Ÿ”‘ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•œ ๋ฏผ๊ฐ ์ •๋ณด ๊ด€๋ฆฌ
  • ๐Ÿ‘ค ์‚ฌ์šฉ์ž ๊ถŒํ•œ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ

๐Ÿค ๊ธฐ์—ฌํ•˜๊ธฐ

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/AmazingFeature)
  3. Commit your changes (git commit -m 'Add some AmazingFeature')
  4. Push to the branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

๐Ÿ“„ ๋ผ์ด์„ ์Šค

์ด ํ”„๋กœ์ ํŠธ๋Š” MIT ๋ผ์ด์„ ์Šค ํ•˜์— ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“ž ๋ฌธ์˜

๐Ÿ™ ๊ฐ์‚ฌ์˜ ๋ง

๋กœ๋ธ”๋ก์Šค ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ์•ˆ์ „์„ ์œ„ํ•ด ํ•จ๊ป˜ํ•ด์ฃผ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!


RG (Roblox Guard) - ํ•จ๊ป˜ ๋งŒ๋“œ๋Š” ์•ˆ์ „ํ•œ ๋กœ๋ธ”๋ก์Šค ์ปค๋ฎค๋‹ˆํ‹ฐ ๐Ÿ›ก๏ธ

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published