feat: Implement structured page settings for simplified site management
This commit is contained in:
@@ -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. ✅ حجم کد رو ~۳۰٪ کاهش میده
|
||||
|
||||
> **مرحله بعد:** بعد از تأیید این طرح، شروع پیادهسازی از فاز ۱ (دیتابیس)
|
||||
Reference in New Issue
Block a user