Files
docs/cms/SITE-PAGES-SIMPLIFICATION.md
T

584 lines
32 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ساده‌سازی سیستم مدیریت صفحات سایت
> **تاریخ:** ۱۳۹۶/۱۱/۲۸ (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. ✅ حجم کد رو ~۳۰٪ کاهش میده
> **مرحله بعد:** بعد از تأیید این طرح، شروع پیاده‌سازی از فاز ۱ (دیتابیس)