12 KiB
📋 تاریخچه تغییرات FrontOffice — کارا بازار سلامت
آخرین بروزرسانی: اسفند ۱۴۰۴ (فوریه ۲۰۲۶)
فریمورک: Blazor Server + MudBlazor 8.14 + .NET 9
🔖 نسخه ۲.۷.۰ — اسفند ۱۴۰۴ (February 17, 2026)
۱. اجبار تخفیف ۱۰۰٪ و حذف اسلایدر
- حذف
MudSliderوMudNumericFieldازCheckout.razor— کاربر دیگه درصد تخفیف انتخاب نمیکنه - حذف کامل بخش نمایش موجودی تخفیفی
- بکند همیشه حداکثر تخفیف (
MaxDiscountPercent) رو اعمال میکنه
۲. رفع متن Badge تخفیف
- مشکل: Badge روی محصولات "۱۰۰٪ تخفیفی" نشون میداد — گمراهکننده
- رفع: نمایش درصد واقعی محصول (مثلاً "۳۰٪ تخفیف")
- فایلها:
Products.razor,Cart.razor,ProductDetail.razor
۳. نمایش جدول مالیات (VAT) در Checkout
- جمع کل، تخفیف، مبلغ پس از تخفیف، مالیات ۹٪، مبلغ قابل پرداخت
- استفاده از
VatCalculatorبرای محاسبه VAT
۴. نمایش وضعیت پرداخت در سفارشات
- فیلد جدید
payment_statusدر protodiscountorder.proto(v0.0.179) - صفحه Orders: نمایش Chip رنگی بر اساس PaymentStatus (موفق/ناموفق/در انتظار)
- صفحه OrderDetail: Alert برای سفارشات ناموفق + دکمه بازگشت + جزئیات وضعیت
- Helper متدها:
GetPaymentStatusText(),GetPaymentStatusColor(),GetDeliveryStatusText()
۵. فیکس مپینگ PaymentStatus و DeliveryStatus
- مشکل: Domain enum مقادیر متفاوتی از Proto داشت — مستقیم cast میشد
- رفع:
MapPaymentStatus()وMapDeliveryStatus()درDiscountOrderService.cs(WebApi) - سفارشات ناموفق حالا
DeliveryStatus=Cancelledدارن (بجای "در حال پردازش")
۶. فیکس Proto به NuGet v0.0.179
FrontOffice.Main.csproj:PackageReferenceبهFoursat.CMSMicroservice.Protobufv0.0.179
🔖 نسخه ۲.۶.۰ — بهمن ۱۴۰۴ (February 16, 2026)
۱. درگاه پرداخت زرینپال
- یکپارچهسازی ZarinPal — پرداخت مستقیم بدون PYMS واسط
- صفحه checkout فروشگاه اعتباری: ریدایرکت به ZarinPal → callback → تأیید
- صفحه checkout فروشگاه عادی: همان جریان
- پشتیبانی از sandbox و production
۲. جدول PaymentTransaction
- Entity جدید
PaymentTransaction— ذخیره جزئیات سطح درگاه (Authority, CardPan, CardHash, RefId) - جدا از جدول Transaction اصلی
- Migration:
AddPaymentTransactionTable
۳. فیکس نمایش وضعیت پرداخت
- مشکل: سفارشات تخفیفی «در انتظار پرداخت» نشان میدادند حتی بعد از پرداخت موفق
- علت: Mapster نمیتونست
PaymentStatus(enum) رو بهpayment_completed(bool) مپ کنه - رفع: مپینگ دستی در
DiscountOrderService
۴. فیکس DeliveryStatus
- مشکل: فروشگاه اعتباری بعد از پرداخت
InTransitست میکرد - رفع: تغییر به
Pending— ادمین باید وضعیت پست رو مشخص کنه
۵. تغییر به NuGet Package (Docker build fix)
ProjectReferenceبه CMS Protobuf →PackageReference(v0.0.178)- Docker build context فقط
src/داره → مسیر../../../CMSقابل دسترسی نیست
🔖 نسخه ۲.۵.۰ — بهمن ۱۴۰۴
۱. محافظت صفحات نیازمند احراز هویت (Auth Guard)
فایلهای تغییریافته:
Shared/MainLayout.razor.cs
شرح:
قبلاً هیچ محافظتی در سطح مسیریابی وجود نداشت — کاربر غیرلاگین میتوانست مستقیماً به /profile/*، /commission/*، /cart و... دسترسی پیدا کند.
تغییرات:
- متد
EnforceAuthGuardAsync()اضافه شد — در هر تغییر مسیر و اولین بار رندر اجرا میشود - متد
IsProtectedRoute(path)مسیرهای محافظتشده را تشخیص میدهد - کاربر غیرلاگین → ریدایرکت به
/(صفحه اصلی)
مسیرهای محافظتشده:
| گروه | مسیرها |
|---|---|
| پروفایل | /profile/* |
| کمیسیون | /commission/* |
| شبکه | /network/* |
| باشگاه | /club/* |
| سبد خرید | /cart, /checkout*, /orders, /order/*, /order-tracking/* |
| پکیجها | /my-packages |
| دروازه | /my-orders, /my-cart |
| فروشگاه اعتباری | /discount-store/cart, /discount-store/checkout, /discount-store/orders, /discount-store/order/* |
مسیرهای عمومی:
/, /register, /about, /faq, /contact, /blog/*, /packages, /package/*, /products, /product/*, /categories, /stores, /discount-store, /discount-store/product/*
۲. استخراج کامپوننت PhoneVerifyForm
فایلهای جدید:
Shared/PhoneVerifyForm.razorShared/PhoneVerifyForm.razor.cs
فایلهای تغییریافته:
Shared/AuthDialog.razorShared/AuthDialog.razor.cs
شرح:
فرم تلفن + تایید OTP + کپچا که قبلاً بهصورت RenderFragment با __builder مستقیم در AuthDialog نوشته شده بود، به کامپوننت مستقل PhoneVerifyForm استخراج شد.
ساختار قبل:
AuthDialog.razor
└── @code { PhoneOrVerifyContent() => __builder => { ... } } ← RenderFragment پیچیده
ساختار بعد:
AuthDialog.razor
└── <PhoneVerifyForm @ref="_phoneVerifyForm" ... /> ← کامپوننت مستقل
PhoneVerifyForm.razor ← مارکاپ فرم
PhoneVerifyForm.razor.cs ← پارامترها و فرم رفها
پارامترهای PhoneVerifyForm:
| پارامتر | نوع | توضیح |
|---|---|---|
CurrentStep |
AuthStep |
مرحله فعلی (Phone / Verify) |
PhoneRequest |
CreateNewOtpTokenRequest |
مدل فرم تلفن |
VerifyRequest |
VerifyOtpTokenRequest |
مدل فرم تایید |
CaptchaCode |
string? |
کد کپچا نمایشدادهشده |
CaptchaInput / CaptchaInputChanged |
string? + EventCallback |
ورودی کپچا (two-way) |
OnRefreshCaptcha |
EventCallback |
رفرش کپچا |
IsBusy |
bool |
وضعیت بارگذاری |
ErrorMessage / InfoMessage |
string? |
پیامهای خطا/اطلاع |
PhoneNumber |
string? |
شماره تاییدشده |
ResendRemaining |
int |
ثانیه تا ارسال مجدد |
OnChangePhone / OnResendOtp |
EventCallback |
اکشنهای تایید |
نکته مهم — Two-way binding کپچا:
فیلد کپچا با Value + ValueChanged بایند شده (نه @bind-Value) تا مقدار تایپشده از فرزند به والد برگردد:
<MudTextField Value="CaptchaInput"
ValueChanged="@((string v) => CaptchaInputChanged.InvokeAsync(v))" ... />
دسترسی به فرمها از والد:
// AuthDialog.razor.cs
var phoneForm = _phoneVerifyForm?.GetPhoneForm();
var verifyForm = _phoneVerifyForm?.GetVerifyForm();
۳. بهبود لایوت مدال ورود (AuthDialog)
فایلهای تغییریافته:
Shared/AuthDialog.razorUtilities/AuthDialogService.cswwwroot/css/site.css
مشکلات قبلی:
- دیالوگ روی موبایل
FullScreenبود → فضای خالی بزرگ بین فرم و دکمهها TitleContentوDialogActionsجدا → گپ عمودی- ردیف کپچا با
MudStack Row="true"→ آیتمها عمودی رندر میشدند
تغییرات:
- حذف FullScreen:
AuthDialogServiceحالا همیشهMaxWidth.ExtraSmall, FullWidth=true, CloseButton=true - ادغام محتوا: آواتار + عنوان + فرم + دکمهها همه داخل
DialogContent→ بدونTitleContentوDialogActions - کلاس
auth-dialog-wrapper: CSS با.auth-dialog-wrapper .mud-dialog-title { display: none; }عنوان پیشفرض دیالوگ رو مخفی میکنه - ردیف کپچا: از
MudStack Rowبهdiv.captcha-rowبا CSS flex اختصاصی - حالت Inline: بدون تغییر ساختاری — فقط از
PhoneVerifyFormاستفاده میکنه
CSS جدید:
.auth-dialog-wrapper .mud-dialog-title { display: none; }
.auth-dialog-wrapper .mud-dialog-content { padding-bottom: 24px !important; }
.auth-dialog-content { max-width: 400px; margin: 0 auto; }
.captcha-row { display: flex; align-items: center; gap: 10px; }
.captcha-row > .mud-input-control { flex: 1 1 0; min-width: 0; }
.captcha-row > .mud-paper { flex: 0 0 auto; }
.captcha-row > .mud-button-root { flex: 0 0 auto; }
۴. صفحه لندینگ — حذف /pricing و اضافه بنر بلاگ
فایلهای تغییریافته:
Pages/Index.razorwwwroot/css/site.css
تغییرات:
- دکمه هیرو «مشاهده پکیجها» → «آخرین اخبار» با لینک
/blog - بنر جدیدترین مطلب بین هیرو و «سه گام تا شروع» اضافه شد
- تصویر بندانگشتی + عنوان + خلاصه + آیکون شیشهای
- هاور:
translateY(-2px)+ سایه بزرگتر
CSS جدید:
.landing-blog-banner { border: 1px solid var(--mud-palette-divider); transition: ... }
.landing-blog-banner:hover { box-shadow: var(--mud-elevation-4); transform: translateY(-2px); }
.landing-blog-thumb { width: 80px; height: 80px; border-radius: 12px; }
.landing-blog-title { -webkit-line-clamp: 1; font-weight: 600; }
.landing-blog-summary { -webkit-line-clamp: 1; }
۵. افزایش ارتفاع تکستباکسها (Global)
فایل تغییریافته:
wwwroot/css/site.css
قبل: padding: 10px 14px
بعد: padding: 14px 14px + font-size: 1rem
.mud-input-outlined .mud-input-slot {
padding: 14px 14px !important;
font-size: 1rem;
}
تمام فیلدهای Outlined در کل اپلیکیشن بزرگتر شدند.
۶. اصلاح RTL فیلدهای ورودی
فایل تغییریافته:
wwwroot/css/site.css
مشکل: فیلدهای type="tel" بهصورت پیشفرض مرورگر direction: ltr میگیرن — لیبل سمت راست ولی placeholder/cursor سمت چپ.
اصلاح:
.mud-input-slot input,
.mud-input-slot textarea {
direction: rtl !important;
text-align: right !important;
}
۷. اصلاح captcha-box CSS
فایل تغییریافته:
wwwroot/css/site.css
قبل:
.captcha-box {
min-width: 120px; min-height: 56px;
background: linear-gradient(135deg, rgba(123,97,255,.12), rgba(255,140,189,.12));
}
بعد:
.captcha-box {
min-width: 96px; min-height: 48px;
border-radius: var(--mud-default-borderradius);
background: rgba(99,102,241,.08);
border: 1px solid var(--mud-palette-divider);
}
📁 نقشه فایلها
Shared/
├── AuthDialog.razor ← بازنویسی (کامپوننت PhoneVerifyForm جایگزین RenderFragment)
├── AuthDialog.razor.cs ← بروزرسانی (استفاده از _phoneVerifyForm)
├── PhoneVerifyForm.razor ← ✨ جدید (فرم تلفن + تایید + کپچا)
├── PhoneVerifyForm.razor.cs ← ✨ جدید (پارامترها و فرم رفها)
├── MainLayout.razor.cs ← Auth Guard اضافه شد
Pages/
├── Index.razor ← /pricing → /blog + بنر بلاگ
Utilities/
├── AuthDialogService.cs ← حذف FullScreen، ثابتسازی سایز
wwwroot/css/
├── site.css ← captcha-row, auth-dialog, RTL fix, input height
🔍 وضعیت بیلد
| تاریخ | خطا | هشدار | توضیح |
|---|---|---|---|
| بهمن ۱۴۰۴ | ۰ | ۱۰۵ | MUD0002 warnings (بیخطر — مربوط به MudBlazor analyzer) |