| ۱ |
users |
id (PK), uuid (UK), full_name, email (UK), phone, password_hash, role ENUM('owner','admin','coach','customer'), status, registered_jalali, failed_login_attempts, locked_until, last_login_at, last_login_ip, deleted_at |
جدول مرکزی کاربران و کنترل دسترسی مبتنی بر نقش (RBAC). هر ۴ نقش خواسته شده در صورتمسئله (مالک، ادمین، مربی و مشتری) در این جدول با ستون role تفکیک میشوند. ستونهای failed_login_attempts و locked_until برای قفل کردن خودکار حساب پس از ۵ بار رمز اشتباه تعبیه شدهاند. |
| ۲ |
user_physical_profiles |
id (PK), user_id (UK, FK -> users.id ON DELETE CASCADE), gender, height_cm, weight_kg, fitness_goal, activity_level, medical_conditions, dietary_allergies |
نگهداری پروفایل فیزیکی و آنتروپومتریک ورزشکار (قد، وزن، هدف ورزشی، بیماریها و حساسیتهای غذایی). جداسازی این ستونها از جدول users باعث سبک ماندن جدول کاربران در هنگام لاگین و رعایت نرمالسازی (3NF) میشود. |
| ۳ |
coach_profiles |
id (PK), user_id (UK, FK -> users.id ON DELETE CASCADE), specialty_title, experience_years, bio, commission_rate_pct |
نگهداری اطلاعات تخصصی کاربران دارای نقش مربی (coach) شامل عنوان تخصص، سالهای سابقه، بیوگرافی و درصد پورسانت مربی از فروش برنامههای تمرینی و غذایی. |
| ۴ |
brands |
id (PK), name (UK), slug (UK), is_active, created_at |
نگهداری برندهای سازنده مکمل (Optimum Nutrition، MyProtein، Cellucor، Universal Nutrition). با نگهداشتن brand_id در جدول محصولات، افزونگی داده (Data Redundancy) حذف شده و فیلتر برند در products.html با سرعت بالا انجام میشود. |
| ۵ |
categories |
id (PK), name_fa (UK), slug (UK), sort_order, is_active, created_at |
نگهداری دستهبندیهای مکملهای ورزشی (پروتئین، کراتین، پیشتمرین، ویتامین، سلامت عمومی) با قابلیت تعیین ترتیب نمایش (sort_order). |
| ۶ |
products |
id (PK), client_id (UK), sku (UK), brand_id (FK -> brands.id), category_id (FK -> categories.id), name, slug, supplement_form ENUM('powder','tablet','capsule'), tag_label, short_description, price_toman (BIGINT), stock_quantity, low_stock_threshold, status_label, image_path, is_active, deleted_at |
جدول اصلی مکملهای باشگاهی. ستون supplement_form دقیقاً فیلتر مکملهای پودری و قرصی/کپسولی در صفحه products.html را تغذیه میکند. ستون price_toman از نوع BIGINT UNSIGNED برای دقت مالی و deleted_at برای حذف نرم (Soft Delete) در نظر گرفته شده است. |
| ۷ |
inventory_movements |
id (PK), client_id (UK), product_name, change_label, reason, date_label, actor_user_id, created_at |
دفتر کل گردش موجودی انبار (Inventory Ledger). هر بار که مدیر در بخش «مدیریت موجودی» پنل ادمین تعداد یک مکمل را کم یا زیاد میکند، مقدار تغییر، علت تغییر و شناسه مدیر در این جدول ثبت میگردد. |
| ۸ |
coupons |
id (PK), client_id (UK), code (UK), discount_type_label, discount_value, start_label, expires_label, usage_limit, status_label |
نگهداری کدهای تخفیف (درصدی و مبلغ ثابت) مربوط به تب «تخفیف و کدها» در پنل مدیریت به همراه سقف مجاز استفاده و بازه زمانی اعتبار. |
| ۹ |
orders |
id (PK), client_id (UK), order_number (UK), date_label, customer_client_id, customer_name, customer_phone, customer_email, shipping_address, items_json (JSON), subtotal_toman, discount_toman, shipping_toman, total_toman, payment_label, status_label |
نگهداری سربرگ سفارشهای مشتریان (مانند NX-2408)، وضعیت پرداخت، وضعیت ارسال و مبالغ مالی شامل جمع جزء، تخفیف، هزینه ارسال و مبلغ نهایی. |
| ۱۰ |
order_items |
id (PK), order_id (FK -> orders.id ON DELETE CASCADE), product_id (FK -> products.id), item_title_snapshot, unit_price_toman, quantity, line_total_toman |
نگهداری ریز اقلام هر سفارش به صورت رابطهای و Snapshot کردن نام و قیمت واحد محصول در لحظه خرید تا تغییرات قیمت آتی محصولات، اسناد مالی قبلی را مخدوش نکند. |
| ۱۱ |
workout_plans |
id (PK), client_id (UK), coach_id, title, goal_label, level_label, duration_label, description, status_label |
نگهداری برنامههای تمرینی تدوینشده توسط مربیان یا ادمین (شامل عنوان برنامه، هدف تمرینی، سطح دشواری مبتدی/متوسط/پیشرفته و مدت زمان به هفته). |
| ۱۲ |
workout_plan_exercises |
id (PK), workout_plan_id (FK -> workout_plans.id ON DELETE CASCADE), day_number, exercise_name, target_muscle_group, sets_count, reps_scheme, rest_seconds, tempo |
نگهداری ریز حرکات ورزشی هر روز از برنامه تمرینی (نام حرکت، عضله هدف، تعداد ست، تکرار، زمان استراحت بین ستها و ریتم اجرای حرکت). |
| ۱۳ |
nutrition_plans |
id (PK), client_id (UK), coach_id, title, goal_label, duration_label, description, status_label |
نگهداری برنامههای تغذیه و رژیمهای مکمل ورزشی طراحیشده برای اهداف افزایش حجم، کاهش وزن یا حفظ تناسب اندام. |
| ۱۴ |
nutrition_plan_meals |
id (PK), nutrition_plan_id (FK -> nutrition_plans.id ON DELETE CASCADE), day_number, meal_type, meal_title_fa, food_items_text, supplement_instructions, calories, protein_grams, carbs_grams, fats_grams |
نگهداری وعدههای غذایی روزانه (صبحانه، قبل تمرین، بعد تمرین، ناهار، شام) به همراه دستور مصرف مکملها و ماکروهای هر وعده. |
| ۱۵ |
contact_messages |
id (PK), client_id (UK), name, email, phone, subject, message, date_label, is_read (TINYINT), is_archived (TINYINT), created_at |
ذخیره پیامهای ارسالشده از فرم «تماس با ما» (contact.html). ستون is_read شمارنده پیامهای خواندهنشده (#unread-count) در پنل مدیریت را تغذیه میکند. |
| ۱۶ |
reviews |
id (PK), client_id (UK), product_name, author_name, rating (1..5), comment_text, date_label, status_label |
نگهداری نظرات و امتیازهای مشتریان درباره محصولات. فقط دیدگاههایی که در پنل مدیریت به وضعیت تأییدشده تغییر یابند در صفحه اصلی سایت نمایش داده میشوند. |
| ۱۷ |
site_settings |
id (PK), setting_group, setting_key (UK), setting_value (LONGTEXT), updated_at |
نگهداری تنظیمات کلیدی فروشگاه (نام، ایمیل، تلفن، واحد پول، محصولات ویژه صفحه اول و متنهای CMS) در قالب Key-Value ساختیافته. |
| ۱۸ |
admin_sessions |
id (PK), user_id (FK -> users.id ON DELETE CASCADE), token_hash (CHAR 64 UK), csrf_token (CHAR 64), ip_address, user_agent_hash (CHAR 64), expires_at, last_activity_at, is_revoked |
جدول امنیتی نشستهای مدیران و مربیان. توکن خام هرگز ذخیره نمیشود، بلکه فقط هش SHA-256 آن به همراه توکن اختصاصی CSRF و اثرانگشت مرورگر ذخیره میگردد. |
| ۱۹ |
security_rate_limits & audit_logs |
id (PK), ip_address, action_key (UK), attempts, locked_until + actor_user_id, action, entity_type, old_values_json, new_values_json |
فایروال سطح دیتابیس برای محدودسازی نرخ درخواستها (Rate Limiting در لاگین و فرم تماس) و ثبت لاگ ممیزی تغییرناپذیر (Forensic Audit Trail) از تمام اقدامات مدیران. |