๋ก๋ธ๋ก์ค ์ปค๋ฎค๋ํฐ๋ฅผ ๋ณดํธํ๋ ์ ๋ฌธ์ ์ธ ๋ธ๋๋ฆฌ์คํธ ๊ด๋ฆฌ ํ๋ซํผ์ ๋๋ค.
- ๐ ๊ธ๋์ค๋ชจํผ์ฆ ๋์์ธ์ ๊ฒ์์ฐฝ
- ๐ ๋๋ค์ ๋๋ ๋ก๋ธ๋ก์ค ID๋ก ๋น ๋ฅธ ๊ฒ์
- ๐ ๋ธ๋๋ฆฌ์คํธ ์ฌ์ฉ์ ๊ฐ๋ต ์กฐํ
- ๐ ๋ธ๋๋ฆฌ์คํธ ์ฌ์ฉ์ ์์ธ ์ ๋ณด
- ๐ผ๏ธ ์ฆ๊ฑฐ ์ฌ์ง ์ด๋ฏธ์ง ๋ทฐ์ด
- ๐ ๋์ ์ ๊ณ ๊ฑด์ ํ์
- โ๏ธ ๋ธ๋๋ฆฌ์คํธ ๋ฑ๋ก ์ ์ฒญ
- ๐ธ ์ฆ๊ฑฐ ์ฌ์ง ์ ๋ก๋ (Firebase Storage)
- ๐ ๋ก๊ทธ์ธ ํ์ ์ ๊ทผ ์ ํ
- โณ ๊ฒํ ๋๊ธฐ ์ํ ๊ด๋ฆฌ
- ๐ค ๊ฐ์ธ ์ ๋ณด ๊ด๋ฆฌ
- ๐ ๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ
- ๐ ๋ด๊ฐ ์ ๊ณ ํ ๋ฆฌ์คํธ
- ๐ก๏ธ ๋ด ๋ธ๋๋ฆฌ์คํธ ์ํ ํ์ธ
- ๐ ์ ๊ณ ์น์ธ/๊ฑฐ์ ์๋ฆผ
- ๐จ ๊ธด๊ธ ์๋ฆผ (๋ธ๋๋ฆฌ์คํธ ๋ฑ๋ก)
- ๐ฒ ์ค์๊ฐ ์๋ฆผ ์์คํ
- โ ์ ๊ณ ๊ฒํ ๋ฐ ์น์ธ
- โ ์ ๊ณ ๊ฑฐ์ (์ฌ์ ๊ธฐ๋ก)
- ๐ ๋๊ธฐ ์ค์ธ ์ ๊ณ ๊ด๋ฆฌ
| ํญ๋ชฉ | ๊ธฐ์ |
|---|---|
| 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/ # ์ ํธ๋ฆฌํฐ ํจ์
- ํฌ๋ช ๋๊ฐ ์ ์ฉ๋ ํ์ดํธ ๋ฐฐ๊ฒฝ
backdrop-filter: blur(10px)ํจ๊ณผ- ๋ฏธ์ธํ ํ ๋๋ฆฌ์ ์๋์ฐ
- ์ ์ฒด๊ฐ์ ์ฃผ๋ ๊ทธ๋ฆผ์ ํจ๊ณผ
- 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// 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
}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 ์ค์
- ๐ ํ๊ฒฝ ๋ณ์๋ฅผ ํตํ ๋ฏผ๊ฐ ์ ๋ณด ๊ด๋ฆฌ
- ๐ค ์ฌ์ฉ์ ๊ถํ ๊ด๋ฆฌ ์์คํ
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
์ด ํ๋ก์ ํธ๋ MIT ๋ผ์ด์ ์ค ํ์ ์์ต๋๋ค.
- ์ด๋ฉ์ผ: support@robloxguard.com
- Discord: RG Community
- ํํ์ด์ง: https://robloxguard.com
๋ก๋ธ๋ก์ค ์ปค๋ฎค๋ํฐ์ ์์ ์ ์ํด ํจ๊ปํด์ฃผ๋ ๋ชจ๋ ์ฌ๋๋ค์๊ฒ ๊ฐ์ฌํฉ๋๋ค!
RG (Roblox Guard) - ํจ๊ป ๋ง๋๋ ์์ ํ ๋ก๋ธ๋ก์ค ์ปค๋ฎค๋ํฐ ๐ก๏ธ