بکاند فروشگاه اینترنتی؛ کاتالوگ، سبد، سفارش و پرداخت
مدل دادهی کامل یک فروشگاه با سطح دسترسی هر جدول، و دو چیزی که همیشه اشتباه پیاده میشوند: قیمت لحظهی خرید، و اینکه موجودی را کِی باید کم کرد.
در این مطلب
اگر دنبال «فروشگاهساز» هستید، این مقاله مال شما نیست و صادقانهترین کار این است که همان اول بگوییم. این راهنما برای کسی است که اپ یا سایت فروشگاهیاش را خودش میسازد — با فلاتر، ریاکتنیتیو، Next.js — و فقط بکاندش را میخواهد: کاتالوگ، سبد، سفارش، کاربر و پرداخت. مدل دادهی کاملش را نشان میدهیم، میگوییم کدام بخشش عمومی است، و دو چیزی را باز میکنیم که در فروشگاه اینترنتی همیشه اشتباه پیاده میشوند: قیمت در لحظهی سفارش، و موجودی.
فروشگاهساز یا بکاند اختصاصی؟
| معیار | فروشگاهساز آماده | بکاند آماده + فرانتاند خودتان |
|---|---|---|
| ظاهر و تجربهی خرید | قالبهای خودشان | هرچه بسازید |
| اپ موبایل اختصاصی | معمولاً نه | بله |
| زمان تا فروش اول | کمترین | بهاندازهی ساخت فرانتاند |
| مدل داده | ثابت | مال خودتان |
| مناسب برای | فروشنده | تیم فنی یا آژانس |
اگر فروشندهاید و فقط میخواهید بفروشید، فروشگاهساز انتخاب عاقلانهتری است. اگر دولوپرید یا برای مشتری میسازید و ظاهر و جریان خرید بخشی از ارزش کارتان است، ادامهی مقاله برای شماست.
مدل دادهی یک فروشگاه
چهار موجودیت هستهی کار است:
- دستهبندی (category) — برای منوی اپ. نام و نشانی.
- محصول (product) — نام، توضیح، قیمت، تصویر، موجودی، و ارجاع به دستهبندی. فیلد تصویر شناسهی یک فایل آپلودشده را نگه میدارد، نه آدرس؛ خودِ آپلود در آپلود عکس و فایل در اپلیکیشن آمده است.
- سفارش (order) — به کاربر گره خورده، با وضعیت و مبلغ کل.
- قلم سفارش (order_item) — هر ردیف سبد: کدام محصول، چند تا، به چه قیمتی.
«مشتری» موجودیت جدا نیست. خریدار همان کاربر نهایی پروژه است که ثبتنام کرده؛ سفارش خودکار به او گره میخورد. جدول مشتریِ مستقل یک دفترچهی موازی است که به احراز هویت وصل نیست.
سطح دسترسی: نصف فروشگاه باید عمومی باشد
- دستهبندی و محصول → عمومی. کاتالوگ باید بدون ورود خوانده شود، وگرنه بازدیدکننده قبل از دیدن محصول باید ثبتنام کند و همانجا میرود. با کلید عمومی خوانده میشوند و برای موتورهای جستوجو هم قابل دسترسیاند.
- سفارش و قلم سفارش → فقط خودش. هر کاربر فقط سفارشهای خودش را میبیند. این دسترسی سطح رکورد است، نه فیلتر سمت کلاینت — احراز هویت با JWT تفاوتش را باز کرده.
دو چیزی که همیشه اشتباه پیاده میشوند
۱. قیمت را در قلم سفارش ذخیره کنید، نه فقط در محصول. اگر قلم سفارش فقط به محصول ارجاع بدهد و قیمت را از آنجا بخواند، اولین باری که قیمت محصول را عوض کنید، تمام فاکتورهای قدیمی هم عوض میشوند. سفارش باید قیمتِ لحظهی خرید را در خودش نگه دارد.
این باگ ماهها پنهان میماند و روزی خودش را نشان میدهد که مشتری فاکتورش را با مبلغی که پرداخت کرده مقایسه کند. قیمت در قلم سفارش یک کپی عمدی است، نه دادهی تکراری.
۲. موجودی را در لحظهی پرداخت کم کنید، نه در لحظهی افزودن به سبد. سبدِ رهاشده نباید کالا را قفل کند. کم کردن موجودی وقتی معنا دارد که پرداخت تأیید شده باشد.
پرداخت
سفارش تا وقتی پرداخت نشده فقط یک ردیف با وضعیت «در انتظار» است. اتصال درگاه — ساخت تراکنش، بازگشت از بانک، تأیید، و تغییر وضعیت سفارش — کاری است که معمولاً بکاند میخواهد؛ مسیر انجامش بدون نوشتن بکاند را در اتصال درگاه پرداخت به اپلیکیشن جدا نوشتهایم.
شروع از قالب فروشگاه
لازم نیست این مدل را از صفر بسازید: قالب «فروشگاه اینترنتی» همین چهار موجودیت را با فیلدها، رابطهها و سطوح دسترسی بالا دارد. پروژه را از رویش میسازید و به شکل کسبوکار خودتان تغییرش میدهید — فهرست قالبها.
خواندن کاتالوگ از اپ، یک درخواست است:
curl "https://api.fikaro.ir/my-shop/v1/product?filter[category]=<id>&sort=-created_at&limit=24" \
-H "Authorization: Bearer apck_..."
صفحهبندی مبتنی بر cursor، فیلتر و مرتبسازی از همان اول هست و مستندات Swagger و کالکشن Postman خودکار بهروز میمانند. کد اتصال از اپ موبایل در بکاند فلاتر و ریاکتنیتیو و از وب در اتصال فرانتاند به API آمده است.
سوالات متداول
- برای فروشگاه اینترنتی، بکاند آماده بهتر است یا فروشگاهساز؟
- اگر فروشندهاید و میخواهید سریع بفروشید، فروشگاهساز. اگر اپ یا سایت اختصاصی میسازید و ظاهر و جریان خرید بخشی از ارزش کارتان است، بکاند آماده با فرانتاند خودتان — چون فروشگاهساز مدل داده و قالبش را به شما تحمیل میکند.
- قیمت محصول را کجا ذخیره کنم؟
- هم در محصول (قیمت جاری) و هم در قلم سفارش (قیمت لحظهی خرید). اگر فقط در محصول باشد، با اولین تغییر قیمت تمام فاکتورهای قدیمی هم عوض میشوند — این کپی عمدی است، نه دادهی تکراری.
- کاتالوگ محصولات را عمومی بگذارم یا پشت ورود؟
- عمومی. دستهبندی و محصول باید بدون ورود خوانده شوند تا بازدیدکننده قبل از ثبتنام محصول را ببیند و موتورهای جستوجو هم بتوانند بخوانند. فقط سفارش و اقلامش خصوصیاند و به کاربر گره میخورند.
- موجودی کالا را کِی کم کنم؟
- در لحظهی تأیید پرداخت، نه هنگام افزودن به سبد. اگر هنگام افزودن به سبد کم شود، سبدهای رهاشده کالا را بیدلیل قفل میکنند.
مطالب مرتبط
- ۷ دقیقه مطالعه
آپلود عکس و فایل در اپلیکیشن؛ بدون سرور، با یک درخواست
آپلود فایل از اپ به بکاند با یک درخواست multipart: آدرس عمومی برای تگ img، فایل خصوصی پشت توکن، تصویر کوچک با ?w=، سقف حجم هر پلن و سه خطایی که وقت میگیرد.
- ۴ دقیقه مطالعه
سیستم نوبتدهی آنلاین؛ مدل داده و API یک اپ رزرو
سیستم نوبتدهی از چهار موجودیت ساخته میشود: خدمت، کارشناس، بازه و نوبت. مدل داده، سطح دسترسی هرکدام، و تلهی تداخل نوبت که پیادهسازی اول را میشکند.