# ساده‌سازی سیستم مدیریت صفحات سایت > **تاریخ:** ۱۳۹۶/۱۱/۲۸ (2026-02-17) > **وضعیت:** ✅ پیاده‌سازی کامل شده — مرج به production > **اولویت:** بالا --- ## ۱. خلاصه مسئله ### وضعیت فعلی (مشکلات) سیستم فعلی مدیریت صفحات **بیش از حد انعطاف‌پذیر و پیچیده** طراحی شده: | مشکل | توضیح | |-------|--------| | **سیستم عمومی 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. ✅ حجم کد رو ~۳۰٪ کاهش میده > **مرحله بعد:** بعد از تأیید این طرح، شروع پیاده‌سازی از فاز ۱ (دیتابیس)