معرفی و چشمانداز پروژه
**فودیت (Foodit)** یک پلتفرم کامل و مدرن برای سفارش آنلاین غذا و نوشیدنی است که برای رستورانها و کافهها طراحی شده است. چشمانداز اصلی این پروژه، ارائه یک تجربه کاربری (UX) سریع، روان و بصری جذاب است که همزمان قدرت و انعطافپذیری بالایی را در اختیار مدیران سیستم قرار میدهد.
این پروژه با معماری **API-محور** و استفاده از اپلیکیشن **تک-صفحهای (SPA)**، از بارگذاریهای مجدد صفحه جلوگیری کرده و تعاملی شبیه به اپلیکیشنهای موبایل را در وب فراهم میکند. تمرکز بر جزئیات، از تمهای پویا برای دستهبندیهای مختلف گرفته تا سیستم جامع مدیریت کاربر و انبار، فودیت را به یک راهحل همهجانبه برای کسبوکارهای حوزه غذا تبدیل کرده است.
روند توسعه و آینده پروژه
جدید در نسخه ۲.۰ (نسخه فعلی)
این نسخه با تمرکز بر افزایش تعامل با کاربر و بهبود دیده شدن در موتورهای جستجو توسعه یافته است.
- سیستم وبلاگ و مدیریت محتوا: برای جذب مخاطب و بازاریابی محتوایی، بخش وبلاگ به همراه پنل مدیریت کامل (ایجاد، ویرایش، دستهبندی و مدیریت نظرات) اضافه شده است.
- بهینهسازی برای موتورهای جستجو (SEO): امکانات پیشرفته SEO مانند تعریف متا تگها، تگهای Open Graph و تولید خودکار Sitemap و robots.txt برای بهبود رتبه در گوگل پیادهسازی شده است.
در دست توسعه برای نسخه ۳.۰
نسخه آینده بر بهبود تجربه کاربری در رستوران و رفع ایرادات جزئی متمرکز خواهد بود.
- رفع باگهای پنل ادمین: برطرف کردن مشکلاتی که در برخی بخشها نیازمند رفرش دستی صفحه برای مشاهده تغییرات هستند.
- منوی داخل و خارج از سالن: قابلیت تعریف منوهای متفاوت برای سفارشات داخل رستوران و بیرونبر.
- سیستم رزرو میز: امکان رزرو آنلاین میز توسط مشتریان از طریق سایت.
ویژگیهای کلیدی (نسخه ۲.۰)
پنل مشتریان (Frontend SPA)
- تمهای پویا: تغییر خودکار رنگبندی و پسزمینه سایت بر اساس دستهبندی (غذا، قهوه، نوشیدنی سرد) برای ایجاد تجربهای منحصربهفرد.
- سفارشیساز محصول: قابلیت "پیتزای خود را بسازید" که به کاربر اجازه میدهد مواد اولیه دلخواه خود را انتخاب کند.
- سبد خرید Real-time: افزودن، حذف و تغییر تعداد آیتمها بدون رفرش صفحه و محاسبه آنی قیمت.
- احراز هویت OTP: ورود و ثبتنام امن و سریع با استفاده از کد یکبار مصرف پیامکی.
- پروفایل کاربری جامع:
- - **تاریخچه سفارشات:** مشاهده تمام سفارشات قبلی و وضعیت آنها.
- - **رهگیری سفارش:** پیگیری زنده سفارشات در حال ارسال روی نقشه.
- - **کیف پول:** مشاهده موجودی و تاریخچه تراکنشها با قابلیت شارژ آنلاین.
- - **پشتیبانی:** سیستم تیکتینگ برای ارتباط مستقیم با پشتیبانی.
- - **مدیریت اطلاعات:** افزودن و ویرایش آدرسها و کارتهای بانکی.
- وبلاگ و محتوا: بخش وبلاگ برای انتشار مقالات و اخبار، با قابلیت نظردهی توسط کاربران.
- آماده برای PWA: استفاده از Service Worker برای کش کردن منابع اصلی و امکان استفاده آفلاین محدود.
پنل مدیریت (Backend SPA)
- دسترسی امن: ورود با ایمیل و رمز عبور و دسترسی مبتنی بر نقش (ادمین).
- داشبورد تحلیلی: نمایش گزارشات لحظهای از درآمد، تعداد سفارشات و محصولات پرفروش با نمودارهای گرافیکی.
- مانیتور زنده آشپزخانه (KDS): صفحهای برای نمایش سفارشات جدید با رفرش خودکار، امکان تغییر وضعیت و مدیریت صف سفارشات.
- مدیریت جامع محتوا (CRUD):
- - مدیریت کامل **محصولات** به همراه آپشنها و دستور پخت.
- - مدیریت **دستهبندیها** به صورت تودرتو (والد و فرزند).
- - مدیریت **بنرهای تبلیغاتی** و **کدهای تخفیف**.
- - مدیریت کامل **وبلاگ** (پستها، دستهها، نظرات).
- مدیریت انبارداری: تعریف مواد اولیه، تامینکنندگان و مدیریت موجودی با هشدارهای کمبود.
- ثبت سفارش دستی: امکان ثبت سفارش برای مشتریان به صورت مستقیم توسط ادمین.
- پیکربندی جامع: مدیریت تمام تنظیمات سایت از جمله ساعات کاری، هزینههای ارسال، کلیدهای API درگاهها و ظاهر سایت از طریق پنل.
گردش کار سیستم
گردش کار مشتری
ورود و مرور
کاربر با شماره موبایل و کد OTP وارد سایت میشود، منوها را مرور کرده و محصول مورد نظر را پیدا میکند.
افزودن به سبد خرید
محصول را با گزینههای دلخواه (مثلا اندازه دوبل) به سبد خرید اضافه میکند. سبد خرید به صورت آنی بهروز میشود.
تسویه حساب
اطلاعات ارسال را وارد کرده، روش پرداخت (آنلاین/کیف پول) را انتخاب و سفارش را نهایی میکند. در صورت پرداخت آنلاین، به درگاه بانکی هدایت میشود.
پیگیری و تعامل
پس از ثبت، وضعیت سفارش را در پروفایل خود پیگیری کرده و پس از تحویل، به آن امتیاز میدهد یا در صورت نیاز تیکت پشتیبانی ثبت میکند.
گردش کار مدیر
مشاهده سفارش جدید
سفارش جدید به صورت زنده در مانیتور آشپزخانه (KDS) نمایش داده میشود. مدیر سیستم یک اعلان صوتی نیز دریافت میکند.
پردازش و آمادهسازی
مدیر سفارش را پذیرفته و وضعیت آن را به "در حال آمادهسازی" تغییر میدهد. در این مرحله، مواد اولیه مربوط به سفارش از انبار کسر میشود.
ارسال و تکمیل
پس از آماده شدن، وضعیت به "ارسال شده" (برای سفارشات پستی یا با پیک) یا "تکمیل" (برای تحویل حضوری) تغییر میکند. برای سفارشات پستی، کد رهگیری وارد میشود.
پشتیبانی و گزارشگیری
مدیر به تیکتهای مشتریان پاسخ میدهد و در پایان روز، گزارشات فروش و عملکرد را از داشبورد بررسی میکند.
پشته فناوری (Tech Stack)
PHP 7.4+
هسته بکاند و منطق API
MySQL
ذخیرهسازی دادهها
Apache
وب سرور با mod_rewrite
Vanilla JavaScript
منطق فرانتاند SPA
TailwindCSS
چارچوب استایلدهی
GSAP
کتابخانه انیمیشن
Swiper.js
اسلایدرهای تعاملی
Chart.js
نمودارهای گزارشات
معماری فنی
پروژه بر اساس معماری مدرن **SPA (Single-Page Application)** و **API-Centric** طراحی شده است. این جداسازی کامل بین لایه نمایش (Frontend) و لایه منطق (Backend)، توسعه، تست و نگهداری سیستم را به مراتب سادهتر میکند.
جزئیات بکاند (PHP)
بکاند به عنوان یک سرویسدهنده API عمل میکند و هیچگونه کد HTML تولید نمیکند. تمام پاسخها در فرمت JSON هستند.
- نقطه ورود واحد (`bootstrap.php`): این فایل مسئولیتهای اصلی مانند راهاندازی نشست (Session)، اتصال به پایگاه داده، بارگذاری توابع کمکی و Autoloader برای کلاسها را بر عهده دارد.
- مسیریابی (`router.php`): درخواستهای ورودی را بر اساس متد (GET, POST) و مسیر (URI) به کنترلر مربوطه هدایت میکند.
- جداسازی APIها:
api.php: مخصوص درخواستهای عمومی (مشاهده محصولات، ثبت سفارش).api-admin.php: مخصوص عملیاتهای نیازمند احراز هویت ادمین (مدیریت محصولات، مشاهده گزارشات).
- لایه کنترلرها (`/controllers`): منطق تجاری در کلاسهای کنترلر (مانند `ProductController`, `OrderController`) پیادهسازی شده است. هر متد در یک کنترلر، مسئول یک Endpoint خاص از API است.
- امنیت:
- CSRF Protection: تمام درخواستهای POST, PUT, DELETE با توکن CSRF محافظت میشوند.
- Authentication: کلاس `Auth` وظیفه مدیریت نشست کاربران و بررسی نقشها (ادمین/مشتری) را بر عهده دارد.
جزئیات فرانتاند (Vanilla JS)
فرانتاند یک SPA کامل است که در فایل `shell.php` بارگذاری شده و تمام منطق آن توسط ماژولهای جاوااسکریپت مدیریت میشود.
- ساختار ماژولار (`/assets/js/public`): کدها به ماژولهای جداگانه تقسیم شدهاند:
app.js: نقطه شروع اصلی که تمام ماژولها را مقداردهی اولیه میکند.router.js: مسئول مدیریت URLهای سمت کلاینت و رندر کردن View مناسب است.api.js: یک Wrapper برای `fetch` که تمام ارتباطات با بکاند را مدیریت میکند.ui.jsو `modalManager.js`: مسئول تمام دستکاریهای DOM، انیمیشنها، نمایش مدالها و بهروزرسانی رابط کاربری هستند.templates/: شامل توابعی است که رشتههای HTML را برای بخشهای مختلف سایت تولید میکنند.
- مدیریت وضعیت (State): یک آبجکت سراسری `window.app.state` اطلاعات مهمی مانند وضعیت ورود کاربر، محتوای سبد خرید و دادههای صفحه اصلی را نگهداری میکند.
- رندرینگ پویا: هیچ صفحهای از قبل ساخته نشده است. `router.js` پس از دریافت داده از API، تابع `template` مربوط به آن View را فراخوانی کرده و HTML تولید شده را در DOM قرار میدهد.
ساختار پایگاه داده (MySQL)
پایگاه داده با دقت طراحی شده تا ضمن حفظ یکپارچگی دادهها، کارایی بالایی داشته باشد. از کلیدهای خارجی (Foreign Keys) برای برقراری ارتباط بین جداول و از ایندکسگذاری برای بهینهسازی کوئریها استفاده شده است.
هسته و کاربران
- users: اطلاعات کاربران، شامل نقش (ادمین/مشتری)، موجودی کیف پول و آدرسها (به صورت JSON).
- roles: نقشهای مختلف سیستم.
- settings: ذخیره تمام تنظیمات سایت به صورت زوجهای کلید-مقدار برای انعطافپذیری بالا.
فروشگاه و محصولات
- products: اطلاعات کامل محصولات شامل قیمت، توضیحات، آپشنها (JSON) و...
- categories: دستهبندیهای تودرتو با قابلیت تعیین تم نمایشی.
- product_recipe: جدول ارتباطی برای تعریف مواد اولیه مورد نیاز هر محصول (برای مدیریت انبار).
- product_builders / builder_options: جداول مربوط به قابلیت "محصول سفارشی".
سفارشات و تراکنشها
- orders: اطلاعات اصلی سفارشات شامل مشتری، مبلغ کل، وضعیت و آدرس.
- order_items: آیتمهای هر سفارش.
- transactions: ثبت تمام تراکنشهای مالی (پرداخت آنلاین، استفاده از کیف پول).
محتوا و بازاریابی
- posts / blog_categories: مدیریت پستها و دستههای وبلاگ.
- post_comments: نظرات کاربران برای پستها.
- banners / discounts: مدیریت بنرها و کدهای تخفیف.
پشتیبانی و ارتباطات
- tickets / ticket_replies: سیستم تیکتینگ پشتیبانی.
- notifications: اعلانهای درونبرنامهای برای کاربران.
- communications: لاگ تمام ارتباطات خارجی (مانند پیامکهای ارسالی).
راهاندازی و نگهداری
مراحل نصب
- پیشنیازها: اطمینان از وجود وب سرور Apache، PHP 7.4+ و پایگاه داده MySQL.
- پیکربندی: کپی کردن فایل `config.php.example` به `config.php` و وارد کردن اطلاعات پایگاه داده.
- اجرای نصبکننده: مراجعه به آدرس `your-domain.com/installer.php` و دنبال کردن مراحل.
- حذف نصبکننده: پس از اتمام نصب، فایل `installer.php` باید برای امنیت **حتماً حذف شود**.
وظایف نگهداری
- Cron Job: تنظیم یک وظیفه زمانبندی شده برای اجرای اسکریپت `cron/update_promotions.php` جهت منقضی کردن خودکار کدهای تخفیف.
- پشتیبانگیری: تهیه نسخه پشتیبان منظم از پایگاه داده و پوشه `uploads`.
- پاکسازی کش: پس از هر بروزرسانی کد، کش برنامه و OPcache (در صورت فعال بودن) باید پاکسازی شوند.