32 KiB
32 KiB
سادهسازی سیستم مدیریت صفحات سایت
تاریخ: ۱۳۹۶/۱۱/۲۸ (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"):
{
"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"):
{
"visionTitle": "چشمانداز",
"visionText": "...",
"missionTitle": "مأموریت",
"missionText": "...",
"valuesTitle": "ارزشهای ما",
"teamTitle": "تیم ما"
}
SitePageImagerecords باImageGroup = "values"برای ارزشهاSitePageImagerecords باImageGroup = "team"برای اعضای تیم
Contact (PageKey = "contact"):
{
"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"):
{
"pageDescription": "مجوزها و نمادهای اعتماد",
"displayStyle": "grid"
}
SitePageImagerecords با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 ساده |
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
۱۰. نتیجهگیری
این تغییر یک سادهسازی معماری هست که:
- ✅ پیچیدگی غیرضروری رو حذف میکنه
- ✅ تجربه ادمین رو بهبود میده (فرمهای اختصاصی بهجای فرمهای عمومی)
- ✅ خطاهای انسانی رو کاهش میده (بدون JSON خام و SectionKey تایپی)
- ✅ لندینگ پیج رو CMS-driven میکنه
- ✅ صفحه مجوزها رو اضافه میکنه
- ✅ حجم کد رو ~۳۰٪ کاهش میده
مرحله بعد: بعد از تأیید این طرح، شروع پیادهسازی از فاز ۱ (دیتابیس)