🌐وب‌اپ★ شاخصسال: ۱۴۰۴–۰۵در حال توسعه فعال

3T Store

مارکت‌پلیسی که چند فروشنده یک کالا را می‌فروشند و مشتری فقط یک قیمت منصفانه می‌بیند — فعال روی my3tstore.com

3T Store cover
Next.js 15React 19NestJS 11PrismaPostgreSQLRedisMeilisearchTailwind v4DockerNginx

فعال روی my3tstore.com. فروشنده واقعی، کالای واقعی، سفارش واقعی — این فروشگاهی است که خودم اداره می‌کنم، نه دمو.

چیست

مارکت‌پلیسی که چند فروشنده یک کالا را می‌فروشند و مشتری فقط یک قیمت می‌بیند.

دو کار را با هم انجام می‌دهد. یک فروشگاه چندفروشنده است، که هر فروشنده قیمت، موجودی، هزینه ارسال و گارانتی خودش را می‌گذارد. و هم‌زمان مقایسه قیمت لحظه‌ای انجام می‌دهد: ارزان‌ترین لیستینگی که موجود دارد و هنوز فعال است خودکار جایگاه محصول را می‌گیرد، و هر کالا یک نمودار قیمت ۳۰ روزه دارد.

چه کار می‌کند

  • ارزان‌ترین لیستینگ فعال، جایگاه محصول را می‌گیرد. اگر دو فروشنده قیمت مساوی بدهند، فروشنده رسمی آن را نگه می‌دارد. مقایسه روی قیمت به‌علاوه هزینه ارسال است، یعنی روی عددی که مشتری واقعاً می‌پردازد.
  • تسویه نمی‌تواند بیش‌فروشی کند. اگر دو نفر هم‌زمان به آخرین کالا برسند، یکی‌شان به او گفته می‌شود که تمام شد. موجودی هرگز منفی نمی‌شود — نه چون دو بار چک می‌کنم، بلکه چون دیتابیس فقط وقتی کم می‌کند که موجودی کافی باشد.
  • یک سفارش به ازای هر فروشنده. سبدی با سه فروشنده سه سفارش می‌سازد، هرکدام با لینک پرداخت خودش، چون هر فروشنده جدا ارسال می‌کند و جدا پول می‌گیرد.
  • دوبار زدن دکمه پرداخت، دوبار پول نمی‌کَشد. هر تسویه یک کلید یکتایی می‌گیرد، پس درخواست تکراری به‌جای ساخت سفارش جدید، همان سفارش قبلی را برمی‌گرداند.
  • ورود با کد ۶ رقمی پیامک — با ارقام فارسی یا لاتین، همان یک حساب است. کد دو دقیقه اعتبار دارد و فقط یک‌بار قابل استفاده است.
  • محصولی که عکس ندارد، می‌گوید عکس ندارد. بدون عکس فیک، بدون تصویر شکسته، بدون تظاهر به چیزی که نیست.
  • دوزبانه فارسی/انگلیسی، تم روشن و تاریک، و از نسخه اول روی گوشی کار می‌کند.

اعداد

۲۲٬۴۰۰ خط کد
۲۴۱ فایل سورس
۱۲ جدول دیتابیس
۳ سرویس زنده: وب، API، جستجو

چرا ارزش دیدن دارد

بخش جالب سبد خرید نیست — آن را هرکسی می‌سازد. آنچه جالب است بخشی است که آسان اشتباه می‌شود و تا وقتی جلوی مشتری خراب نشود، دیده نمی‌شود.

پول به‌صورت عدد صحیح ذخیره می‌شود نه اعشار، چون مبالغ ریالی آن‌قدر بزرگ‌اند که float رقم‌ها را از دست می‌دهد. کد ورود با مولد رمزنگاری‌شده ساخته می‌شود و با حذف اتمی از Redis مصرف می‌شود، پس دو درخواست هم‌زمان نمی‌توانند همان کد را دوبار خرج کنند. ریت‌لیمیت داخل یک اسکریپت Lua در Redis زندگی می‌کند، چون خواندن و بعد نوشتن در کد اپلیکیشن اتمی نیست و یک سیل درخواست موازی از آن رد می‌شود.

و استقرار امیدوارانه نیست: دیتابیس، کش و موتور جستجو همه سقف حافظه و healthcheck دارند، تا وقتی حافظه ماشین کم می‌شود سایت کنترل‌شده fail کند نه اینکه با خودش پایین بیاید.

پروژه‌های بیشتر