6.6 KiB
6.6 KiB
راهنمای توسعهدهندگان (Developer Guide)
این مستند مختص دولوپرها است و استانداردهای کدنویسی، نحوه مدیریت Stateها و معماری پوشهها را شرح میدهد. این پروژه از معماری Monorepo (ولی در پوشههای مجزا) برای جداسازی Frontend و Backend استفاده میکند.
۱. ساختار پوشهها (Folder Structure)
پروژه از دو پوشه اصلی تشکیل شده است:
فولدر frontend/application (Next.js)
frontend/application/
├── app/ # صفحات (Pages) و Layout ها بر اساس Next.js App Router
│ ├── api/ # مسیرهای (Route Handlers) سمت بکاند Next.js (در صورت نیاز)
│ ├── shop/ # صفحات مربوط به فروشگاه
│ ├── blog/ # صفحات وبلاگ
│ └── ...
├── components/ # کامپوننتهای React (دکمهها، فرمها، هدر، مودالها)
├── lib/ # منطق تجاری سمت فرانتاند
│ ├── services/ # توابع ارتباط با API بکاند (استفاده از Axios)
│ ├── store/ # استورهای Zustand (Cart, User, Pet و...)
│ └── utils/ # توابع کمکی (فرمتدهی تاریخ، اعداد، ترکیب کلاسهای tailwind)
└── public/ # فایلهای استاتیک، تصاویر خام، فونتها
فولدر backend (NestJS)
backend/
├── prisma/ # شمای دیتابیس (schema.prisma) و مایگریشنها
├── src/
│ ├── modules/ # ماژولهای مستقل (Users, Products, Orders و...)
│ ├── common/ # گاردهای امنیتی (Guards)، دکوراتورها، اینترسپتورها
│ └── main.ts # نقطه ورود بکاند
۲. استانداردهای توسعه در Frontend
کامپوننتها (Components)
- تمامی فایلهای کامپوننت باید در پوشه
componentsقرار گیرند و با حرف بزرگ شروع شوند (PascalCase). - کامپوننتها باید در صورت امکان Server Component باشند. تنها زمانی که به هوکهای React (مثل
useState,useEffect) یا رویدادهای کاربری (onClick) نیاز است، از دایرکتیو"use client"در بالاترین خط فایل استفاده کنید. - از Prop-drilling (ارسال پروپها به صورت آبشاری در لایههای زیاد) خودداری کنید. اگر دیتایی گلوبال است، از Zustand استفاده کنید.
مدیریت State با Zustand
- فایلهای State منحصراً در پوشه
lib/store/ذخیره میشوند. - نام فایلها باید شامل کلمه
storeباشد (مثلاًcartStore.ts). - هنگام نیاز به ذخیره ماندگار اطلاعات (مثل سبد خرید یا توکن)، از میدلویر
persistدر Zustand استفاده کنید. این کار به صورت خودکار اطلاعات را در LocalStorage ذخیره و بازیابی میکند.
ارتباط با شبکه (API & Fetching)
- ارتباطات سمت کلاینت با بکاند در فایلهای پوشه
lib/services/نوشته میشوند. - در فایل
lib/services/api.tsیک نمونه از Axios (axios.create) با کانفیگهای پایه و آدرس Base URL ساخته شده است. - تمام Requestها باید تایپکشی (Type-safe) شده باشند. رابطها (Interfaces) مربوط به ریسپانس را صراحتاً مشخص کنید.
سبک استایلدهی (TailwindCSS)
- استایلدهی باید فقط و فقط از طریق کلاسهای Tailwind انجام شود.
- از کلاس کمکی
cn(موجود درlib/utils) برای ترکیب کلاسهای شرطی (Conditional Classes) استفاده کنید. - رنگهای اختصاصی پروژه (مثل
canino-blue,medical-gray) در فایلtailwind.config.tsتعریف شدهاند و باید استفاده شوند، نه مقادیر هگزادسیمال خام.
۳. استانداردهای توسعه در Backend (NestJS)
مدیریت دیتابیس
- شمای منبع حقیقت (Source of Truth) فایل
schema.prismaاست. برای افزودن یک جدول یا فیلد جدید، فقط این فایل را تغییر دهید. - بعد از هر تغییر در
schema.prismaدستورnpx prisma migrate dev --name <description>را اجرا کنید تا تغییرات در دیتابیس اعمال شود و تایپهای Prisma کلاینت آپدیت شوند.
کنترلرها و سرویسها
- هیچگونه لاجیک پیچیدهای نباید داخل فایلهای
.controller.tsنوشته شود. کنترلرها فقط وظیفه دریافت درخواست، اعتبارسنجی اولیه پارامترها و ارسال آن به سرویس را دارند. - لاجیک اصلی تجاری را داخل فایلهای
.service.tsپیادهسازی کنید.
امنیت و احراز هویت
- تمامی روتهایی که به کاربر لاگین شده نیاز دارند، باید با
@UseGuards(JwtAuthGuard)محافظت شوند. - روتهای ادمین باید از گارد اختصاصی ترکیب شده با بررسی نقش کاربری استفاده کنند.
- رمزهای عبور کاربران پیش از ذخیره در دیتابیس حتماً باید با کتابخانه
bcryptهش شوند.
۴. چرخه توسعه ویژگی جدید (Feature Workflow)
هنگامی که یک توسعهدهنده میخواهد ویژگی جدیدی اضافه کند، این مراحل را طی میکند:
- تعریف ساختار دیتابیس جدید در Prisma و مایگریشن.
- ساخت ماژول در NestJS (شامل Entity, DTO, Service, Controller).
- نوشتن توابع API فراخوانی در پوشه
lib/servicesدر فرانتاند. - پیادهسازی Store مربوطه در Zustand (اگر نیاز به State گلوبال دارد).
- نوشتن و استایلدهی کامپوننتهای UI در فرانتاند.
- اتصال UI به اکشنهای Store یا APIها.