پروژه کامل: فرانت متصل به API + داکرایز
- اتصال کامل فرانت به API: همه محتوای سایت (پروژهها، مقالات، خدمات، برند و...) از بکاند خوانده میشود (SiteProvider + useSite) - فرم تماس و خبرنامه متصل به بکاند و تستشده در مرورگر - ساختار مونوریپو: frontend/ + backend/ - Dockerfile برای هر دو بخش + docker-compose (PostgreSQL + FastAPI + nginx) - nginx با پروکسی /api — بدون نیاز به CORS در حالت داکر - README کامل فارسی
This commit is contained in:
@@ -1,154 +1,74 @@
|
||||
# بکاند آرامش پلازا (ArameshPlaza API)
|
||||
# آرامش پلازا — پروژه کامل (فرانتاند + بکاند)
|
||||
|
||||
بکاند سایت آرامش پلازا — ساختهشده با **FastAPI** + **PostgreSQL** + **SQLAlchemy 2** + **JWT**.
|
||||
مونوریپوی سایت آرامش پلازا شامل:
|
||||
|
||||
## امکانات
|
||||
- **`frontend/`** — سایت React + Vite + Tailwind (همه محتوا از API خوانده میشود)
|
||||
- **`backend/`** — بکاند FastAPI + SQLAlchemy 2 + PostgreSQL + JWT
|
||||
|
||||
- **API عمومی محتوا**: برند، خدمات، پروژهها، مقالات، نظرات مشتریان، سوالات متداول، تیم، تایملاین، آمار، چرا آرامش، و بخش قبل/بعد
|
||||
- **فرم تماس**: ثبت پیام مشتریان از سایت (`POST /api/contact`)
|
||||
- **خبرنامه**: عضویت و مدیریت مشترکین (`POST /api/newsletter`)
|
||||
- **پنل مدیریت**: ورود با نام کاربری/رمز عبور و دریافت توکن JWT، سپس CRUD کامل همه محتواها، مدیریت پیامهای تماس و مشترکین
|
||||
- **Seed خودکار**: همه محتوای فعلی سایت با یک دستور در دیتابیس قرار میگیرد
|
||||
- مستندات تعاملی Swagger در مسیر `/docs`
|
||||
## ساختار
|
||||
|
||||
## راهاندازی
|
||||
```
|
||||
├── frontend/ # سایت React
|
||||
│ ├── src/ # کد منبع (api.tsx = لایه اتصال به بکاند)
|
||||
│ ├── Dockerfile # بیلد Node + سرو با nginx
|
||||
│ └── nginx.conf # پروکسی /api به بکاند
|
||||
├── backend/ # بکاند FastAPI
|
||||
│ ├── app/ # کد منبع
|
||||
│ ├── requirements.txt
|
||||
│ ├── Dockerfile
|
||||
│ └── .env.example
|
||||
└── docker-compose.yml # اجرای کامل با یک دستور
|
||||
```
|
||||
|
||||
### ۱. پیشنیازها
|
||||
|
||||
- Python 3.11 یا جدیدتر
|
||||
- PostgreSQL در حال اجرا (پورت پیشفرض 5432)
|
||||
|
||||
### ۲. نصب وابستگیها
|
||||
## اجرا با Docker (سادهترین راه)
|
||||
|
||||
```bash
|
||||
cd arameshplaza-backend
|
||||
docker compose up --build
|
||||
```
|
||||
|
||||
- سایت: http://localhost:5173
|
||||
- مستندات API: http://localhost:8000/docs
|
||||
- دیتابیس PostgreSQL در کانتینر جدا (دادهها در volume ذخیره میشوند)
|
||||
- بکاند هنگام شروع، خودش جداول و دادههای اولیه سایت را seed میکند
|
||||
- nginx درخواستهای `/api` را خودش به بکاند پروکسی میکند — نیازی به تنظیم CORS نیست
|
||||
|
||||
## اجرای محلی (توسعه)
|
||||
|
||||
### بکاند
|
||||
|
||||
```bash
|
||||
cd backend
|
||||
python -m venv .venv
|
||||
|
||||
# ویندوز
|
||||
.venv\Scripts\activate
|
||||
# لینوکس / مک
|
||||
source .venv/bin/activate
|
||||
|
||||
.venv\Scripts\activate # ویندوز — در لینوکس: source .venv/bin/activate
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
### ۳. تنظیمات
|
||||
|
||||
فایل `.env.example` را به نام `.env` کپی کنید و مقادیر را تنظیم کنید:
|
||||
|
||||
```bash
|
||||
cp .env.example .env # لینوکس / مک
|
||||
copy .env.example .env # ویندوز
|
||||
```
|
||||
|
||||
مهمترین تنظیم `DATABASE_URL` است:
|
||||
|
||||
```
|
||||
DATABASE_URL=postgresql+psycopg://postgres:YOUR_PASSWORD@localhost:5432/arameshplaza_api
|
||||
```
|
||||
|
||||
### ۴. ساخت دیتابیس و Seed
|
||||
|
||||
```bash
|
||||
# ساخت دیتابیس (یکبار):
|
||||
psql -U postgres -c "CREATE DATABASE arameshplaza_api;"
|
||||
|
||||
# ساخت جداول + وارد کردن محتوای سایت + ساخت ادمین پیشفرض:
|
||||
python -m app.seed
|
||||
|
||||
# بازنشانی کامل دادهها در صورت نیاز:
|
||||
python -m app.seed --force
|
||||
```
|
||||
|
||||
### ۵. اجرا
|
||||
|
||||
```bash
|
||||
# فایل .env از روی .env.example بسازید و DATABASE_URL را تنظیم کنید
|
||||
python -m app.seed # ساخت جداول + محتوای اولیه
|
||||
uvicorn app.main:app --reload
|
||||
```
|
||||
|
||||
سپس:
|
||||
- مستندات API: http://localhost:8000/docs
|
||||
- بررسی سلامت: http://localhost:8000/api/health
|
||||
### فرانتاند
|
||||
|
||||
## ورود به پنل مدیریت
|
||||
|
||||
```
|
||||
POST /api/auth/login
|
||||
{ "username": "admin", "password": "aramesh123" }
|
||||
```bash
|
||||
cd frontend
|
||||
npm install
|
||||
npm run dev # http://localhost:5173
|
||||
```
|
||||
|
||||
پاسخ شامل `access_token` است. توکن را در هدر همه درخواستهای مدیریتی قرار دهید:
|
||||
آدرس بکاند در `frontend/src/config.ts` از `VITE_API_URL` خوانده میشود؛
|
||||
اگر تنظیم نشود پیشفرض `http://localhost:8000` است.
|
||||
|
||||
```
|
||||
Authorization: Bearer <access_token>
|
||||
```
|
||||
## امکانات بکاند
|
||||
|
||||
> نام کاربری و رمز عبور پیشفرض از تنظیمات `.env` خوانده میشود — حتماً در محیط تولید تغییرشان دهید.
|
||||
- **API عمومی**: برند، خدمات، پروژهها، مقالات، نظرات، سوالات متداول، تیم، تایملاین، آمار و...
|
||||
- **فرم تماس** `POST /api/contact` و **خبرنامه** `POST /api/newsletter`
|
||||
- **پنل مدیریت** با JWT: ورود `POST /api/auth/login` (پیشفرض: `admin` / `aramesh123`) و سپس CRUD کامل همه محتواها در `/api/admin/...`
|
||||
- همه محتوا در یک درخواست: `GET /api/site`
|
||||
|
||||
## فهرست انتهاپوینتها
|
||||
> در محیط واقعی حتماً `SECRET_KEY` و `ADMIN_PASSWORD` را تغییر دهید.
|
||||
|
||||
### عمومی (بدون نیاز به توکن)
|
||||
## نکات امنیتی
|
||||
|
||||
| متد | مسیر | توضیح |
|
||||
|---|---|---|
|
||||
| GET | `/api/health` | وضعیت سرور |
|
||||
| GET | `/api/brand` | اطلاعات برند و تماس |
|
||||
| GET | `/api/services` | خدمات |
|
||||
| GET | `/api/projects` | همه پروژهها |
|
||||
| GET | `/api/projects/{slug}` | جزئیات یک پروژه |
|
||||
| GET | `/api/articles` | همه مقالات |
|
||||
| GET | `/api/articles/{slug}` | جزئیات یک مقاله |
|
||||
| GET | `/api/testimonials` | نظرات مشتریان |
|
||||
| GET | `/api/faqs` | سوالات متداول |
|
||||
| GET | `/api/team` | اعضای تیم |
|
||||
| GET | `/api/timeline` | تایملاین شرکت |
|
||||
| GET | `/api/stats` | آمار |
|
||||
| GET | `/api/why-us` | چرا آرامش پلازا |
|
||||
| GET | `/api/before-after` | بخش قبل/بعد |
|
||||
| GET | `/api/site` | **همه محتوا در یک درخواست** |
|
||||
| POST | `/api/contact` | ثبت پیام تماس |
|
||||
| POST | `/api/newsletter` | عضویت در خبرنامه |
|
||||
| POST | `/api/auth/login` | ورود ادمین و دریافت توکن |
|
||||
|
||||
### مدیریت (نیاز به توکن Bearer)
|
||||
|
||||
برای هر یک از این مسیرها، CRUD کامل در دسترس است:
|
||||
`brand`، `services`، `projects`، `articles`، `testimonials`، `faqs`، `team`، `timeline`، `stats`، `why-us`، `before-after`
|
||||
|
||||
| متد | مسیر | توضیح |
|
||||
|---|---|---|
|
||||
| GET/POST | `/api/admin/{resource}` | لیست / ساخت |
|
||||
| GET/PUT/DELETE | `/api/admin/{resource}/{id}` | دریافت / ویرایش / حذف |
|
||||
| GET | `/api/admin/messages` | پیامهای تماس (با `?unread_only=true` فقط خواندهنشدهها) |
|
||||
| PATCH | `/api/admin/messages/{id}` | تغییر وضعیت خواندهشدن |
|
||||
| DELETE | `/api/admin/messages/{id}` | حذف پیام |
|
||||
| GET | `/api/admin/subscribers` | مشترکین خبرنامه |
|
||||
| DELETE | `/api/admin/subscribers/{id}` | حذف مشترک |
|
||||
|
||||
## اتصال به فرانتاند
|
||||
|
||||
در پروژه React (پوشه `ArameshPlaza`)، فایل `src/config.ts` آدرس بکاند را نگه میدارد:
|
||||
|
||||
```ts
|
||||
export const API_URL = import.meta.env.VITE_API_URL ?? 'http://localhost:8000'
|
||||
```
|
||||
|
||||
در محیط تولید مقدار `VITE_API_URL` را روی آدرس عمومی API تنظیم کنید و مطمئن شوید آدرس سایت در `CORS_ORIGINS` فایل `.env` بکاند قرار دارد.
|
||||
|
||||
## ساختار پروژه
|
||||
|
||||
```
|
||||
app/
|
||||
├── main.py # نقطه ورود FastAPI، CORS، ثبت روترها
|
||||
├── config.py # تنظیمات از .env
|
||||
├── database.py # اتصال PostgreSQL و نشستها
|
||||
├── models.py # مدلهای SQLAlchemy
|
||||
├── schemas.py # اسکیماهای Pydantic (ورودی/خروجی)
|
||||
├── auth.py # هش رمز عبور و JWT
|
||||
├── seed.py # اسکریپت seed
|
||||
├── seed_data.py # دادههای اولیه سایت
|
||||
└── api/
|
||||
├── public.py # انتهای عمومی محتوا
|
||||
├── forms.py # فرم تماس و خبرنامه
|
||||
└── admin.py # ورود و پنل مدیریت
|
||||
```
|
||||
- فایل `.env` هرگز commit نمیشود (در `.gitignore` است)
|
||||
- رمز عبور ادمین با bcrypt هش میشود
|
||||
- توکنهای JWT امضا دارند و مدت اعتبارشان قابل تنظیم است
|
||||
|
||||
Reference in New Issue
Block a user