Initial commit: dating app admin panel (Next.js)
Admin login, category/option and profile-question management, and the pending-user review workflow (list, full profile detail, approve/reject with a reason shown back to the user). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
# پنل ادمین دلدل
|
||||
|
||||
پنل مدیریت دسکتاپمحور (Next.js + Basis Design System) برای همون بکاند
|
||||
Go/Gin/GORM اپ دیتینگ. با این پنل میتونی بدون لمس کد، تمام لیستهای
|
||||
انتخابی و سوالات پروفایل اپ رو مدیریت کنی.
|
||||
|
||||
## ویژگیها
|
||||
|
||||
- **ورود امن:** همون فلوی OTP اپ اصلی، ولی فقط کاربرهایی که `is_admin=true`
|
||||
دارن اجازهی ورود میگیرن (پیام «دسترسی نداری» برای بقیه).
|
||||
- **مدیریت ۶ دستهی انتخابی:** سطح تحصیلات، رشته تحصیلی، فعالیتها، اهمیت در
|
||||
رابطه، علاقهمندیها، دنبال چی میگردی — برای هر کدوم:
|
||||
- ویرایش عنوان و حداقل/حداکثر تعداد انتخاب مجاز
|
||||
- افزودن/ویرایش/حذف گزینه
|
||||
- فعال/غیرفعال کردن آنی با یک کلیک (گزینهی غیرفعال فوراً از دید کاربر مخفی میشه)
|
||||
- **مدیریت سوالات پروفایل:** افزودن/ویرایش/حذف/فعالسازی سوالاتی که کاربر
|
||||
توی مرحلهی سوم آنبوردینگ ۳ تاشو انتخاب میکنه.
|
||||
- فیدبک فوری با Toast بعد از هر عملیات، تایید قبل از حذف.
|
||||
|
||||
## ✅ تست شده
|
||||
|
||||
قبل از تحویل، یک اسکریپت Node که دقیقاً همون درخواستهای `src/lib/api.ts`
|
||||
رو میفرسته، روی یک نمونهی واقعی از بکاند اجرا شد: ورود ادمین، GET/PATCH
|
||||
دسته، CRUD کامل گزینه، toggle فعال/غیرفعال (با تایید اینکه گزینهی
|
||||
غیرفعال از API عمومی کاربر واقعاً حذف میشه)، CRUD کامل سوالات، و مهمتر
|
||||
از همه — تست کردیم که یک کاربر عادی (غیرادمین) با کد ۴۰۳ از تمام
|
||||
`/admin/*` endpoint ها بلاک میشه. همهی ۱۴ چک پاس شد.
|
||||
|
||||
## راهاندازی
|
||||
|
||||
```bash
|
||||
cp .env.local.example .env.local
|
||||
# NEXT_PUBLIC_API_URL رو به آدرس بکاندت تنظیم کن
|
||||
|
||||
npm install
|
||||
npm run dev
|
||||
```
|
||||
|
||||
`http://localhost:3000` رو باز کن، با شمارهی موبایلِ یک کاربر ادمین
|
||||
(همونی که با `ADMIN_BOOTSTRAP_PHONE` در بکاند ساخته شده، یا هر کاربری که
|
||||
دستی `is_admin=true` شده) وارد شو.
|
||||
|
||||
## ساختار پروژه
|
||||
|
||||
```
|
||||
src/
|
||||
├── app/
|
||||
│ ├── login/, verify/ ← ورود OTP (مثل اپ اصلی)
|
||||
│ └── (dashboard)/
|
||||
│ ├── layout.tsx ← گارد ادمین + سایدبار
|
||||
│ ├── page.tsx ← داشبورد با آمار سریع
|
||||
│ ├── categories/page.tsx ← لیست ۶ دسته
|
||||
│ ├── categories/[key]/ ← ویرایش تنظیمات دسته + CRUD گزینهها
|
||||
│ └── questions/page.tsx ← CRUD سوالات پروفایل
|
||||
├── components/
|
||||
│ ├── ui/ ← دیزاینسیستم مشترک + Modal/Toast/ConfirmDialog جدید
|
||||
│ └── Sidebar.tsx
|
||||
└── lib/
|
||||
├── api.ts ← کلاینت تایپشدهی endpoint های /admin/*
|
||||
├── auth-context.tsx ← ورود + چک is_admin
|
||||
└── hooks.ts
|
||||
```
|
||||
|
||||
## نکتهی امنیتی
|
||||
|
||||
این پنل فقط روی احراز هویت سمت بکاند (`middleware.AdminRequired`) تکیه
|
||||
میکنه — یعنی حتی اگه کسی مستقیم به route های این پنل دسترسی پیدا کنه،
|
||||
بدون توکن معتبرِ یک کاربر `is_admin=true`، هیچ عملیاتی از سمت بکاند رد
|
||||
نمیشه (این رو با تست ۴۰۳ بالا تایید کردیم). با این حال توصیه میشه این
|
||||
پنل رو پشت یک دامنهی جدا یا حداقل VPN/IP-allowlist در پروداکشن قرار بدی.
|
||||
Reference in New Issue
Block a user