71 lines
4.1 KiB
Markdown
71 lines
4.1 KiB
Markdown
|
|
# پنل ادمین دلدل
|
||
|
|
|
||
|
|
پنل مدیریت دسکتاپمحور (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 در پروداکشن قرار بدی.
|