From ce74377012117db00a37a8054119ed0882f14358 Mon Sep 17 00:00:00 2001 From: masoodafar-web Date: Tue, 17 Feb 2026 02:57:11 +0330 Subject: [PATCH] feat: Implement structured page settings for simplified site management --- cms/SITE-PAGES-SIMPLIFICATION.md | 583 +++++++++++++++++++++++++++++++ 1 file changed, 583 insertions(+) create mode 100644 cms/SITE-PAGES-SIMPLIFICATION.md diff --git a/cms/SITE-PAGES-SIMPLIFICATION.md b/cms/SITE-PAGES-SIMPLIFICATION.md new file mode 100644 index 0000000..45f58fd --- /dev/null +++ b/cms/SITE-PAGES-SIMPLIFICATION.md @@ -0,0 +1,583 @@ +# ساده‌سازی سیستم مدیریت صفحات سایت + +> **تاریخ:** ۱۳۹۶/۱۱/۲۸ (2026-02-17) +> **وضعیت:** طرح اولیه — منتظر تأیید +> **اولویت:** بالا + +--- + +## ۱. خلاصه مسئله + +### وضعیت فعلی (مشکلات) + +سیستم فعلی مدیریت صفحات **بیش از حد انعطاف‌پذیر و پیچیده** طراحی شده: + +| مشکل | توضیح | +|-------|--------| +| **سیستم عمومی Section/Key** | ادمین باید `SectionKey` رو دقیق تایپ کنه (مثلاً `value-1`, `team-2`). یه اشتباه تایپی باعث میشه فرانت اون بخش رو پیدا نکنه | +| **ExtraData به‌صورت JSON خام** | اطلاعات تماس (آدرس/تلفن/ایمیل) و شبکه‌های اجتماعی داخل textarea به JSON خام نوشته میشه — خطاپذیر | +| **HTML Editor برای همه‌چیز** | حتی برای متن‌های ساده (عنوان یک Value) از HTML Editor استفاده میشه | +| **CRUD نامحدود** | ادمین میتونه صفحات جدید بسازه ولی فرانت فقط `about` و `contact` رو میشناسه | +| **لندینگ پیج کاملاً هاردکد** | محتوای لندینگ (Steps, Features, Stats, FAQ, Testimonials) داخل کد C# هاردکد شده و از CMS استفاده نمیکنه | +| **صفحه مجوزها وجود نداره** | هیچ صفحه‌ای برای نمایش نمادهای اعتماد و مجوزها نداریم | + +### هدف + +**۴ صفحه مشخص** با **فرم‌های اختصاصی** (نه عمومی) در پنل ادمین: + +| # | صفحه | محتوای قابل ویرایش | طراحی | +|---|-------|-------------------|--------| +| 1 | **لندینگ** | عنوان hero، زیرعنوان، متن دکمه‌ها، عناوین سکشن‌ها، متن مراحل/ویژگی‌ها/سوالات/آمار | **چیدمان ثابت** — فقط متن‌ها قابل تغییر | +| 2 | **درباره ما** | عنوان، چشم‌انداز، مأموریت، ارزش‌ها (عنوان+متن+آیکون)، اعضای تیم (نام+سمت+تصویر) | **چیدمان ثابت** — تعداد ارزش‌ها و اعضا قابل تغییر | +| 3 | **تماس با ما** | آدرس، تلفن، ایمیل، ساعات کاری، لینک شبکه‌های اجتماعی | **چیدمان ثابت** — فقط اطلاعات قابل تغییر | +| 4 | **مجوزها** 🆕 | تصاویر مجوزها با عنوان و لینک (نماد اعتماد الکترونیکی و ...) | **ساده و یکپارچه** | + +--- + +## ۲. معماری جدید — Structured Page Settings + +### فلسفه طراحی + +``` +❌ قبلی: Generic Sections + Free-form Keys + Raw JSON +✅ جدید: Typed Settings per Page + Structured Forms + Fixed Layout +``` + +به‌جای اینکه هر صفحه N تا Section داشته باشه با Key‌های دلخواه، **هر صفحه یک مدل مشخص** با فیلدهای تایپ‌شده داره. + +### ۲.۱ مدل‌های داده جدید (Database) + +#### جدول `SitePageSettings` (جایگزین SitePage + SitePageSection) + +``` +┌─────────────────────────────────────────────┐ +│ SitePageSettings │ +├─────────────────────────────────────────────┤ +│ Id : long (PK) │ +│ PageKey : string(50) [UNIQUE INDEX] │ ← "landing" | "about" | "contact" | "licenses" +│ Title : string(200) │ +│ MetaDescription : string?(300) │ +│ HeroTitle : string?(200) │ +│ HeroSubtitle : string?(500) │ +│ HeroImagePath : string? │ +│ IsActive : bool │ +│ SettingsJson : string (JSON Column) │ ← ⭐ Typed JSON per PageKey +│ + Audit fields │ +└─────────────────────────────────────────────┘ +``` + +#### جدول `SitePageImage` (برای مجوزها و تصاویر تیم) + +``` +┌─────────────────────────────────────────────┐ +│ SitePageImage │ +├─────────────────────────────────────────────┤ +│ Id : long (PK) │ +│ SitePageSettingsId : long (FK) │ +│ ImageGroup : string(50) │ ← "licenses" | "team" | "values" +│ Title : string?(200) │ +│ Subtitle : string?(300) │ +│ Description : string? │ +│ ImagePath : string │ +│ ThumbnailPath : string? │ +│ LinkUrl : string? │ ← برای مجوزها: لینک به سایت مرجع +│ IconName : string?(100) │ +│ SortOrder : int │ +│ IsActive : bool │ +│ + Audit fields │ +└─────────────────────────────────────────────┘ +``` + +#### SettingsJson — ساختار به‌ازای هر صفحه + +**Landing (`PageKey = "landing"`):** +```json +{ + "heroButtonPrimaryText": "شروع کنید", + "heroButtonSecondaryText": "بیشتر بدانید", + "steps": [ + { "title": "ثبت‌نام", "description": "...", "iconName": "PersonAdd" } + ], + "features": [ + { "title": "پشتیبانی ۲۴/۷", "description": "...", "iconName": "Support" } + ], + "stats": [ + { "label": "کاربران فعال", "value": 15000, "suffix": "+" } + ], + "testimonials": [ + { "name": "علی محمدی", "role": "کاربر", "text": "...", "rating": 5 } + ], + "faqs": [ + { "question": "سوال ۱", "answer": "جواب ۱", "category": "عمومی" } + ], + "featuredBlogEnabled": true, + "ctaTitle": "همین الان شروع کنید", + "ctaDescription": "...", + "ctaButtonText": "ثبت‌نام رایگان" +} +``` + +**About (`PageKey = "about"`):** +```json +{ + "visionTitle": "چشم‌انداز", + "visionText": "...", + "missionTitle": "مأموریت", + "missionText": "...", + "valuesTitle": "ارزش‌های ما", + "teamTitle": "تیم ما" +} +``` ++ `SitePageImage` records با `ImageGroup = "values"` برای ارزش‌ها ++ `SitePageImage` records با `ImageGroup = "team"` برای اعضای تیم + +**Contact (`PageKey = "contact"`):** +```json +{ + "address": "تهران، ...", + "phone": "021-12345678", + "email": "info@kbs1.ir", + "workingHours": "شنبه تا چهارشنبه ۹ تا ۱۸", + "telegramUrl": "https://t.me/...", + "instagramUrl": "https://instagram.com/...", + "linkedinUrl": "https://linkedin.com/...", + "whatsappUrl": "https://wa.me/...", + "mapLatitude": 35.6892, + "mapLongitude": 51.3890, + "formSubjects": ["پشتیبانی فنی", "پیشنهاد همکاری", "سایر"] +} +``` + +**Licenses (`PageKey = "licenses"`):** +```json +{ + "pageDescription": "مجوزها و نمادهای اعتماد", + "displayStyle": "grid" +} +``` ++ `SitePageImage` records با `ImageGroup = "licenses"` — هر مجوز: Title + ImagePath + LinkUrl + +--- + +## ۳. تغییرات به‌ازای هر لایه + +### ۳.۱ دیتابیس (CMS — Entity Framework) + +| عملیات | فایل/محل | توضیح | +|--------|----------|--------| +| **حذف** | `SitePage` entity | جایگزین با `SitePageSettings` | +| **حذف** | `SitePageSection` entity | جایگزین با `SitePageImage` (فقط برای آیتم‌های تصویری) | +| **ایجاد** | `SitePageSettings.cs` | Entity جدید با `SettingsJson` | +| **ایجاد** | `SitePageImage.cs` | Entity جدید برای تصاویر (مجوزها، تیم، ارزش‌ها) | +| **تغییر** | `DbContext` — `SitePageConfiguration` | Configuration جدید | +| **تغییر** | `SitePageSeedData.cs` | Seed data جدید برای ۴ صفحه | +| **Migration** | EF Migration | **Data migration** از ساختار قدیم به جدید | + +### ۳.۲ Proto / gRPC Contract + +| عملیات | توضیح | +|--------|--------| +| **بازنویسی** | `site_pages.proto` — حذف ۱۰ RPC قبلی، جایگزین با ۴ RPC ساده | + +```protobuf +service SitePageSettingsService { + // دریافت تنظیمات صفحه با کلید (FrontOffice) + rpc GetPageSettings (GetPageSettingsRequest) returns (PageSettingsResponse); + + // ذخیره تنظیمات صفحه (BackOffice — Admin) + rpc SavePageSettings (SavePageSettingsRequest) returns (SavePageSettingsResponse); + + // مدیریت تصاویر صفحه (مجوزها، تیم، ارزش‌ها) + rpc SavePageImage (SavePageImageRequest) returns (SavePageImageResponse); + rpc DeletePageImage (DeletePageImageRequest) returns (DeletePageImageResponse); + + // لیست همه صفحات (BackOffice) + rpc GetAllPages (GetAllPagesRequest) returns (GetAllPagesResponse); +} +``` + +### ۳.۳ CMS Backend (Application Layer) + +| عملیات | فایل‌ها | توضیح | +|--------|---------|--------| +| **حذف** | ۲۲ فایل Command/Query فعلی | CQRS handlers قدیمی | +| **ایجاد** | `GetPageSettingsQuery` + Handler | دریافت Settings + Images | +| **ایجاد** | `SavePageSettingsCommand` + Handler + Validator | ذخیره JSON با اعتبارسنجی | +| **ایجاد** | `SavePageImageCommand` + Handler | آپلود/ویرایش تصویر | +| **ایجاد** | `DeletePageImageCommand` + Handler | حذف تصویر | +| **ایجاد** | `GetAllPagesQuery` + Handler | لیست صفحات | +| **تغییر** | gRPC Service | `SitePageGrpcService` بازنویسی | + +### ۳.۴ FrontOffice (Blazor Server — سمت مشتری) + +| عملیات | فایل | توضیح | +|--------|------|--------| +| **تغییر** | `SitePageService.cs` | ساده‌سازی — فقط `GetPageSettings(pageKey)` | +| **تغییر** | `Index.razor` + `.cs` | **بزرگ‌ترین تغییر:** از هاردکد به CMS-driven. چیدمان ثابت میمونه، فقط متن‌ها از `SettingsJson` خونده میشه | +| **تغییر** | `AboutUs.razor` + `.cs` | ساده‌تر — خواندن مستقیم فیلدهای typed به‌جای key-matching | +| **تغییر** | `ContactUs.razor` + `.cs` | ساده‌تر — خواندن مستقیم فیلدها بدون JSON parsing | +| **ایجاد** | `Licenses.razor` + `.cs` | 🆕 صفحه جدید مجوزها | + +### ۳.۵ BackOffice (Blazor WASM — پنل ادمین) + +| عملیات | فایل | توضیح | +|--------|------|--------| +| **حذف** | ۵ فایل Dialog فعلی | `CreateSitePageDialog`, `EditSitePageDialog`, `SitePageSectionsDialog`, `SitePageSectionEditDialog` | +| **حذف** | `SitePageManagement.razor` + `.cs` فعلی | جایگزین | +| **ایجاد** | `PageSettingsManagement.razor` | صفحه اصلی — لیست ۴ صفحه ثابت | +| **ایجاد** | `LandingPageSettings.razor` | 🌟 فرم اختصاصی لندینگ | +| **ایجاد** | `AboutPageSettings.razor` | 🌟 فرم اختصاصی درباره‌ما | +| **ایجاد** | `ContactPageSettings.razor` | 🌟 فرم اختصاصی تماس | +| **ایجاد** | `LicensesPageSettings.razor` | 🌟 فرم اختصاصی مجوزها | +| **تغییر** | `ISitePageService` + Impl | ساده‌سازی interface | + +--- + +## ۴. طراحی UI پنل ادمین (BackOffice) + +### ۴.۱ صفحه اصلی مدیریت صفحات + +``` +┌─────────────────────────────────────────────────────────┐ +│ مدیریت صفحات سایت │ +├─────────────────────────────────────────────────────────┤ +│ │ +│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ +│ │ 🏠 │ │ 👥 │ │ 📞 │ │ 🏅 │ │ +│ │ لندینگ │ │ درباره‌ما│ │ تماس │ │ مجوزها │ │ +│ │ │ │ │ │ │ │ │ │ +│ │ [ویرایش] │ │ [ویرایش] │ │ [ویرایش] │ │ [ویرایش] │ │ +│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ +│ │ +│ ℹ️ صفحات سایت ثابت هستند و فقط محتوای آنها │ +│ قابل ویرایش است │ +└─────────────────────────────────────────────────────────┘ +``` + +### ۴.۲ فرم ویرایش لندینگ (نمونه) + +``` +┌─────────────────────────────────────────────────────────┐ +│ ← بازگشت تنظیمات صفحه لندینگ │ +├─────────────────────────────────────────────────────────┤ +│ │ +│ ── Hero Section ────────────────────────────────────── │ +│ عنوان: [_______________________________] │ +│ زیرعنوان: [_______________________________] │ +│ تصویر پس‌زمینه: [📎 انتخاب فایل] │ +│ متن دکمه اصلی: [_____________] │ +│ متن دکمه ثانویه:[_____________] │ +│ │ +│ ── مراحل (Steps) ───────────────────────────────────── │ +│ ┌────┬──────────────┬──────────────────┬────────┐ │ +│ │ # │ عنوان │ توضیح │ آیکون │ │ +│ ├────┼──────────────┼──────────────────┼────────┤ │ +│ │ 1 │ [ثبت‌نام ] │ [در کمتر از...] │ [🔍] │ │ +│ │ 2 │ [دعوت ] │ [لینک اختصاصی ] │ [🔍] │ │ +│ │ 3 │ [دریافت ] │ [پاداش‌های... ] │ [🔍] │ │ +│ │ │ │ [+ افزودن مرحله]│ │ │ +│ └────┴──────────────┴──────────────────┴────────┘ │ +│ │ +│ ── ویژگی‌ها (Features) ──────────────────────────────── │ +│ (مشابه بالا — جدول قابل ویرایش) │ +│ │ +│ ── آمار (Stats) ────────────────────────────────────── │ +│ ┌──────────────┬─────────┬────────┐ │ +│ │ برچسب │ مقدار │ پسوند │ │ +│ ├──────────────┼─────────┼────────┤ │ +│ │ [کاربران ] │ [15000] │ [+] │ │ +│ └──────────────┴─────────┴────────┘ │ +│ │ +│ ── نظرات مشتریان ───────────────────────────────────── │ +│ (جدول: نام، نقش، متن، امتیاز) │ +│ │ +│ ── سوالات متداول (FAQ) ─────────────────────────────── │ +│ (جدول: سوال، جواب، دسته‌بندی) │ +│ │ +│ ── CTA Banner ──────────────────────────────────────── │ +│ عنوان: [_______________] │ +│ توضیح: [_______________] │ +│ متن دکمه: [_______________] │ +│ │ +│ [💾 ذخیره تغییرات] │ +└─────────────────────────────────────────────────────────┘ +``` + +### ۴.۳ فرم ویرایش تماس با ما + +``` +┌─────────────────────────────────────────────────────────┐ +│ ← بازگشت تنظیمات صفحه تماس با ما │ +├─────────────────────────────────────────────────────────┤ +│ │ +│ ── اطلاعات تماس ───────────────────────────────────── │ +│ آدرس: [_______________________________] │ +│ تلفن: [_______________________________] │ +│ ایمیل: [_______________________________] │ +│ ساعات کاری: [_______________________________] │ +│ │ +│ ── شبکه‌های اجتماعی ───────────────────────────────── │ +│ تلگرام: [_______________________________] │ +│ اینستاگرام: [_______________________________] │ +│ لینکدین: [_______________________________] │ +│ واتس‌اپ: [_______________________________] │ +│ │ +│ ── تنظیمات فرم تماس ───────────────────────────────── │ +│ موضوعات: [پشتیبانی فنی ×] [پیشنهاد همکاری ×] │ +│ [+ افزودن موضوع] │ +│ │ +│ [💾 ذخیره تغییرات] │ +└─────────────────────────────────────────────────────────┘ +``` + +### ۴.۴ فرم مجوزها (جدید) + +``` +┌─────────────────────────────────────────────────────────┐ +│ ← بازگشت مدیریت مجوزها و نمادهای اعتماد │ +├─────────────────────────────────────────────────────────┤ +│ │ +│ توضیح صفحه: [_______________________________] │ +│ │ +│ ── مجوزها ──────────────────────────────────────────── │ +│ ┌──────┬──────────────┬─────────────────┬────────────┐ │ +│ │ تصویر│ عنوان │ لینک │ عملیات │ │ +│ ├──────┼──────────────┼─────────────────┼────────────┤ │ +│ │ [🖼] │ [نماد اعتماد]│ [https://...] │ [🗑] [↕] │ │ +│ │ [🖼] │ [ساماندهی ] │ [https://...] │ [🗑] [↕] │ │ +│ │ [🖼] │ [مجوز کسب..] │ [https://...] │ [🗑] [↕] │ │ +│ └──────┴──────────────┴─────────────────┴────────────┘ │ +│ │ +│ [+ افزودن مجوز جدید] │ +│ │ +│ [💾 ذخیره تغییرات] │ +└─────────────────────────────────────────────────────────┘ +``` + +--- + +## ۵. طراحی UI فرانت مشتری (FrontOffice) + +### ۵.۱ صفحه مجوزها (جدید — `/licenses`) + +``` +┌─────────────────────────────────────────────────────────┐ +│ [Header / Navbar] │ +├─────────────────────────────────────────────────────────┤ +│ │ +│ 🏅 مجوزها و نمادهای اعتماد │ +│ توضیح کوتاه صفحه از CMS │ +│ │ +│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ +│ │ │ │ │ │ │ │ +│ │ [تصویر] │ │ [تصویر] │ │ [تصویر] │ │ +│ │ │ │ │ │ │ │ +│ │ نماد │ │ ساماندهی │ │ مجوز │ │ +│ │ اعتماد │ │ │ │ کسب‌وکار │ │ +│ └──────────┘ └──────────┘ └──────────┘ │ +│ │ +│ (هر تصویر لینک‌دار — کلیک = باز شدن سایت مرجع) │ +│ │ +├─────────────────────────────────────────────────────────┤ +│ [Footer] │ +└─────────────────────────────────────────────────────────┘ +``` + +### ۵.۲ تغییرات سایر صفحات + +- **لندینگ:** بدون تغییر ظاهری — فقط منبع داده از هاردکد به CMS تغییر میکنه +- **درباره ما:** بدون تغییر ظاهری — کد ساده‌تر میشه +- **تماس با ما:** بدون تغییر ظاهری — کد ساده‌تر میشه + +--- + +## ۶. Migration Plan — مراحل اجرا + +### فاز ۱: دیتابیس و Backend (CMS) + +``` +مدت تخمینی: ۱ روز +``` + +| # | تسک | جزئیات | +|---|------|--------| +| 1.1 | ایجاد Entity‌های جدید | `SitePageSettings`, `SitePageImage` | +| 1.2 | ایجاد EF Configuration | Indexes, relationships, JSON column | +| 1.3 | نوشتن Migration | `SimplifySitePages` — ایجاد جدول‌های جدید | +| 1.4 | نوشتن Data Migration | انتقال داده از `SitePage`/`SitePageSection` به ساختار جدید | +| 1.5 | Seed Data جدید | ۴ صفحه: landing, about, contact, licenses | +| 1.6 | حذف Entity‌های قدیمی | بعد از تأیید migration موفق | + +### فاز ۲: Proto و gRPC Service + +``` +مدت تخمینی: ۰.۵ روز +``` + +| # | تسک | جزئیات | +|---|------|--------| +| 2.1 | بازنویسی `site_pages.proto` | ۵ RPC جدید (Get, Save, Image CRUD, List) | +| 2.2 | بازنویسی gRPC Service | `SitePageSettingsGrpcService` | +| 2.3 | نوشتن CQRS Handlers | ۵ handler جدید | +| 2.4 | Validators | اعتبارسنجی SettingsJson بر اساس PageKey | + +### فاز ۳: BackOffice (پنل ادمین) + +``` +مدت تخمینی: ۱.۵ روز +``` + +| # | تسک | جزئیات | +|---|------|--------| +| 3.1 | حذف UI قدیمی | ۵ فایل dialog + management page | +| 3.2 | صفحه اصلی | `PageSettingsManagement.razor` — کارت‌های ۴ صفحه | +| 3.3 | فرم لندینگ | `LandingPageSettings.razor` — فرم با سکشن‌های Steps/Features/Stats/FAQ/Testimonials/CTA | +| 3.4 | فرم درباره‌ما | `AboutPageSettings.razor` — Vision/Mission + مدیریت Values & Team | +| 3.5 | فرم تماس | `ContactPageSettings.razor` — فیلدهای ساده | +| 3.6 | فرم مجوزها | `LicensesPageSettings.razor` — آپلود و مدیریت تصاویر مجوز | +| 3.7 | سرویس BackOffice | `ISitePageSettingsService` + Implementation | + +### فاز ۴: FrontOffice (سمت مشتری) + +``` +مدت تخمینی: ۱ روز +``` + +| # | تسک | جزئیات | +|---|------|--------| +| 4.1 | بروزرسانی `SitePageService` | ساده‌سازی — فقط `GetPageSettings` | +| 4.2 | بروزرسانی `Index.razor` | خواندن Steps/Features/Stats/FAQ/Testimonials از CMS | +| 4.3 | بروزرسانی `AboutUs.razor` | خواندن مستقیم فیلدها (بدون key-matching) | +| 4.4 | بروزرسانی `ContactUs.razor` | خواندن مستقیم فیلدها (بدون JSON parsing) | +| 4.5 | ایجاد `Licenses.razor` | 🆕 صفحه جدید مجوزها | +| 4.6 | افزودن به Navigation | لینک مجوزها در Footer | + +### فاز ۵: تست و Cleanup + +``` +مدت تخمینی: ۰.۵ روز +``` + +| # | تسک | جزئیات | +|---|------|--------| +| 5.1 | تست E2E | همه ۴ صفحه در FrontOffice | +| 5.2 | تست ادمین | ویرایش همه ۴ صفحه از BackOffice | +| 5.3 | حذف کدهای قدیمی | فایل‌هایی که دیگه استفاده نمیشن | +| 5.4 | بروزرسانی مستندات | CHANGELOG, INDEX.md | + +--- + +## ۷. مقایسه قبل و بعد + +### کاهش پیچیدگی + +| معیار | قبل | بعد | تغییر | +|-------|------|------|--------| +| RPC‌های gRPC | 10 | 5 | -50% | +| CQRS Handlers | 10 (22 file) | 5 (~12 file) | -45% | +| Entity‌ها | 2 (generic) | 2 (typed) | = | +| BackOffice Dialogs | 4 generic | 4 specific | کیفیت↑ | +| JSON خام در UI | ✅ بله | ❌ خیر | حذف | +| خطای تایپ SectionKey | ✅ ممکن | ❌ غیرممکن | حذف | +| لندینگ CMS-driven | ❌ هاردکد | ✅ CMS | بهبود | +| صفحه مجوزها | ❌ ندارد | ✅ دارد | 🆕 | + +### تجربه ادمین + +| قبل | بعد | +|------|------| +| لیست صفحات → انتخاب → مدیریت سکشن‌ها → ویرایش سکشن (4 مرحله) | ۴ کارت → فرم اختصاصی (2 مرحله) | +| JSON خام برای اطلاعات تماس | فیلدهای مشخص (آدرس، تلفن، ایمیل) | +| HTML Editor برای عنوان ساده | Text field ساده | +| امکان ساخت صفحه‌ای که فرانت نمیشناسه | فقط ۴ صفحه مشخص | + +--- + +## ۸. ریسک‌ها و ملاحظات + +| ریسک | شدت | راه‌حل | +|------|------|--------| +| Data migration از ساختار قدیم | متوسط | Script migration دقیق + بکاپ قبل از اجرا | +| Breaking change در Proto | بالا | نسخه جدید Proto NuGet + بروزرسانی هر ۳ پروژه همزمان | +| تصاویر موجود (hero, section images) | کم | مسیرها در فایل سیستم ثابت میمونن — فقط reference DB تغییر میکنه | +| Backward compatibility | کم | چون ساختار قبلی فقط ۲ صفحه فعال داشت، migration ساده‌ست | + +--- + +## ۹. فایل‌های تأثیرپذیر (خلاصه) + +### حذف (Delete) +``` +CMS: + - Domain/Entities/Content/SitePage.cs + - Domain/Entities/Content/SitePageSection.cs + - Application/Features/SitePages/* (22 files) + - Infrastructure/Persistence/Configurations/SitePageConfiguration.cs + - Infrastructure/Persistence/Configurations/SitePageSectionConfiguration.cs + +BackOffice: + - Pages/Content/SitePageManagement.razor + .cs + - Pages/Content/CreateSitePageDialog.razor + .cs + - Pages/Content/EditSitePageDialog.razor + .cs + - Pages/Content/SitePageSectionsDialog.razor + .cs + - Pages/Content/SitePageSectionEditDialog.razor + .cs +``` + +### ایجاد (Create) +``` +CMS: + - Domain/Entities/Content/SitePageSettings.cs + - Domain/Entities/Content/SitePageImage.cs + - Application/Features/SitePageSettings/* (~12 files) + - Infrastructure/Persistence/Configurations/SitePageSettingsConfiguration.cs + - Infrastructure/Persistence/Configurations/SitePageImageConfiguration.cs + +BackOffice: + - Pages/Content/PageSettingsManagement.razor + .cs + - Pages/Content/LandingPageSettings.razor + .cs + - Pages/Content/AboutPageSettings.razor + .cs + - Pages/Content/ContactPageSettings.razor + .cs + - Pages/Content/LicensesPageSettings.razor + .cs + +FrontOffice: + - Pages/Licenses.razor + .cs + +Proto: + - site_pages.proto (rewrite) +``` + +### تغییر (Modify) +``` +CMS: + - ApplicationDbContext.cs (DbSets) + - SitePageSeedData.cs + - SitePageGrpcService.cs + +BackOffice: + - Services/ISitePageService.cs → ISitePageSettingsService.cs + - Services/SitePageService.cs → SitePageSettingsService.cs + - NavMenu (routing) + +FrontOffice: + - Services/SitePageService.cs (simplify) + - Pages/Index.razor + .cs (CMS-driven) + - Pages/AboutUs.razor + .cs (simplify) + - Pages/ContactUs.razor + .cs (simplify) + - Shared/NavMenu or Footer (add Licenses link) + - DI registration +``` + +--- + +## ۱۰. نتیجه‌گیری + +این تغییر یک **ساده‌سازی معماری** هست که: + +1. ✅ پیچیدگی غیرضروری رو حذف میکنه +2. ✅ تجربه ادمین رو بهبود میده (فرم‌های اختصاصی به‌جای فرم‌های عمومی) +3. ✅ خطاهای انسانی رو کاهش میده (بدون JSON خام و SectionKey تایپی) +4. ✅ لندینگ پیج رو CMS-driven میکنه +5. ✅ صفحه مجوزها رو اضافه میکنه +6. ✅ حجم کد رو ~۳۰٪ کاهش میده + +> **مرحله بعد:** بعد از تأیید این طرح، شروع پیاده‌سازی از فاز ۱ (دیتابیس)