جستجوی پیشرفته پرسش‌ها

فیلتر جستجو:
*
جلوگیری از ثبت رکورد تکراری در جدول AppUserUsedPasswords پروژه DNTIdentity
وضعیت: پاسخ داده شده

سلام و احترام

در پروژه DNTIdentity موقع ثبت نام کار، رکورد پسوردهای استفاده شده توسط کاربر در جدول AppUserUsedPasswords، دو بار ثبت می شود (رکورد تکراری)، راه حل این مشکل چیست؟

بانک اطلاعاتی هم 2019 sql server می باشد

سپاس از شما

پابلیش پروژه DNTIdentity و بهینه سازی فایل جاوااسکریپت
وضعیت: پاسخ داده شده

سلام و درود؛ پروژه DNTIdentity را جهت تست و بررسی بدون هیچ دخل و تصرفی بعد از پابلیش در هاست آپلود کردم ولی دستورات جاوااسکریپت با خطا انجام می شود؟

پاپلیش را از طریق vs code , visual studio 2022 انجام دادم و هیچ آپدیتی هم انجام نشده و در اینجا هم بارگذاری شده، ولی در قسمت نقش ها، ایجاد یک نقش خطای

$.bootstrapModalAjaxForm is not a function

نمایش داده می شود؟ حتی بعد از بروزرسانی هم تغییری حاصل نشد !

جهت حل مشکل راهنمایی کنید، سپاس

چگونه میتوانم یک پلاک خودرو را در سی شارپ بخوانم
وضعیت: پاسخ داده شده

درود بر همه عزیزان؛ زبان سی شارپ. اندازه پروژه کوچک.

برای خواندن متن (پلاک ماشین) از داخل تصویری که با OpenCVsharp گرفتم. (کیفیت تصاویر خوبه)

راه حل های طی شده :

1 :

با IronOCR و Tesseract کار کردم جواب نداد یا شاید بشه گفت من بلد نیستم چجوری از اینا استفاده کنم.

void Test1()
{
    var Ocr = new IronTesseract();
    Ocr.Language = OcrLanguage.Persian;
    using (var Input = new OcrInput("car-plate-iran.jpg"))
    {
       var Result = Ocr.Read(Input);
       var AllText = Result.Text;
       Console.WriteLine(AllText);
    }
}

2 :

امکانات آنلاین مثل api.ocr.space رو نمیتونم استفاده کنم

راه های مختلفی رو تست کردم، چت جی پی تی هم یسری کد میده همشون بدون خطا هستن ولی هیچ کدوم خروجی نمیدن. شاید قبلش کانفیگی چیزی لازمه و من بلد نیستم یا اینکه کلا سورس در رابطه با OCR بسیار کم هست؟! چیزی نمیدونم. ممنون میشم راهنمایی کنید

جستجو Contains روی کلید های ترکیبی
وضعیت: پاسخ داده شده

اگر یک لیست رشته ایی داشته باشیم به راحتی میتونیم روی پایگاه داده جستجو کنیم:

var eyeColors = new List<string>
{
    "Black", "Green", "Brown"
};
var specificUsers = _context.Users.Where(x => eyeColors.Contains(x.EyeColor)).ToList();

حالا اگه لیست ما ترکیبی باشه این سرچ باید به چه صورت انجام بشه:

public class User
{
    public string FullName { get; set; }

    public string EyeColor { get; set; }
}
var customUsers = new List<User>
{
    new User{FullName = "Ali Ahmadi", EyeColor = "Brown"},
    new User{FullName = "Milad Rezaei", EyeColor = "Green"}
};

var specificUsers = _context.Users.Where(x => customUsers.Contains(new User(){EyeColor = x.EyeColor, FullName = x.FullName})).ToList();

روش فوق و روش های زیادی رو سرچ کردم ولی به جواب نرسیدم. آیا میشه از EF استفاده کرد یا راه حل دیگری دارد ؟

آیا استفاده از FullName یک کلاس تضادی با Clean Code دارد؟
وضعیت: پاسخ داده شده

سلام

در بکارگیری کلاس ها، ثابت ها و... علاقه زیادی دارم تا از نام کامل استفاده کنم و در بیشتر کلاس ها اصلا using ندارم. اگرچه که خطوط کمی طولانی میشن و اجبارا برای خوانایی بهتر خطوط را میشکنم ولی در زمان مرور کدها کمی راحت تر هستم. سوالم اینه که آیا این کار تضادی با کد نویسی تمیز داره یا پیشنهاد میکنید برای خلوت کردن کدها حتما فضای نام را using کنم.

تشکر

آیا استفاده از Handler در یک Handler دیگر در الگوی Mediator صحیح است؟
وضعیت: پاسخ داده شده

سلام

یک پروژه با کتابخانه MediatR ایجاد کردم و برای عملیات CRUD به ازای تمام Entityها Handlerهای مورد نیاز را پیاده سازی کردم. برخی از این Handlerها در زمان اجرای Bussiness مربوط به خودش، نیاز داره تا اطلاعاتی را در یک جدول دیگر در بانک اطلاعاتی ذخیره کنه ولی افزودن اطلاعات جدید در جدول دوم، مستلزم لحاظ نمودن Business مربوط به Handler دوم است. به تمامی Handlerها IEntityRepository مربوط به Entity که در Domain تعریف شده است تزریق می شود. در لایه Infrastructure نیز تمام متدهای موجود در IEntityRepository تحت نام EntityRepository پیاده سازی شده اند.

سوال:

  1. آیا با توجه به سناریوی بالا، امکان تزریق MediatR.IMediator در Handler اول وجود دارد (از حیث Best Practice بودن)؟
  2. اگر آیتم یک مناسب نباشد آیا باید یک لایه دیگری به پروژه افزوده شود تا امکان استفاده از Handlerهای مشترک وجود داشته باشد؟
  3. در یکی از منابع اینترنتی به آیتم شماره یک عنوان Anti Pattern داده بودند. آیا درست است؟

تشکر

ساخت یک دیتابیس ترکیبی از SQL و فایل های XML
وضعیت: پاسخ داده شده

سلام. یک نرم افزار رو در نظر بگیرید که هر روز، به صورت خودکار، قیمت 1000 کالا را از 100 وبسایت مختلف دریافت و در دیتابیس ذخیره می کند. پرسش من اینه که کدوم روش زیر برای طراحی دیتابیس این نرم افزار و همچنین منطق کاری اون اصولی تر و بهینه تره:

روش اول: در این روش، دیتابیس نرم افزار، شامل چهار جدول (جدول سایت ها – جدول کالاها – جدول تاریخ ها و جدول ثبت اطلاعات روزانه قیمت کالا) است که جدول ثبت تاریخ و جدول اطلاعات روزانه، ارتباط یک به چند دارند (جدول اطلاعات روزانه، شامل یک کلید خارجی از جدول کالاها، یک کلید خارجی از جدول سایت ها و یک کلید خارجی از جدول تاریخ ها است) و نرمالسازی جداول هم انجام شده.

در این روش، هر روز، به صورت خودکار، نرم افزار، ابتدا تاریخ جاری را در جدول تاریخ ها ثبت می کند و سپس، به ازای هر سایت و به ازای هر کالا، یک رکورد (شامل شناسه تاریخ جاری، شناسه سایت و شناسه کالا) را به همراه قیمت روز آن کالا که از وبسایت مربوطه دریافت کرده است، در جدول اطلاعات روزانه ثبت می کند.

بنابراین، حدود 100 هزار رکورد در هر روز باید در این جدول ثبت گردد که هم زمانبر است و هم ممکن است هنگام ثبت این داده ها در دیتابیس، خطایی رخ دهد (فرض کنیم که صحت داده ها اهمیت زیادی داشته باشد). پس لازم است پس از ثبت این رکوردها، همه آن ها مجددا چک شود که عملیات ثبت ناقص انجام نشده باشد و این هم مدتی زمان لازم دارد. ضمن آنکه حجم دیتابیس نیز روز به روز افزایش خواهد یافت.

مشکل دیگر این روش آن است که اگر در آینده، تعداد سایت ها یا تعداد کالاها افزایش یابد، اجرای این روش دشوارتر و احتمال خطای آن بیشتر می شود. مثلا اگر تعداد سایت ها 1000 و تعداد کالاها 1000 شود، هر روز باید یک میلیون رکورد در جدول اطلاعات روزانه ثبت و کنترل گردد.

روش دوم: در این روش، دیتابیس شامل همان چهار جدول قبلی است. با این تفاوت که در جدول اطلاعات روزانه، یک فیلد از نوع XML و یا یک فیلد از نوع رشته ای برای ثبت تمامی اطلاعات لازم کالا در یک روز (شامل شناسه تاریخ، شناسه کالا، شناسه سایتی که اطلاعات از آن دریافت می شود و سایر مشخصات لازم) در نظر گرفته شده است. بنابراین، در این روش، در ابتدای شروع کار نرم افزار، ابتدا به ازای هر کالا، یک رکورد در جدول اطلاعات روزانه ثبت می شود. بنابراین، کلا 1000 رکورد در این جدول وجود خواهد داشت. سپس، هر روز، عملیات دریافت اطلاعات هر کالا از سایت های مربوطه انجام شده و فایل XML یا رشته مربوط به رکورد متناظر با آن کالا ویرایش می شود. بنابراین، در این روش، همیشه کلا 1000 رکورد وجود دارد که باید به صورت روزانه، بروزرسانی شوند و این موضوع، سرعت کار را افزایش و میزان خطا و همچنین حجم دیتابیس را نیز کاهش می دهد. البته به نظرم این روش غیر اصولی است و اصول نرمال سازی و ... در مورد اون رعایت نشده و خیلی ایراد داره.

حالا پرسش من اینه که اگر محدودیت زمان برای دریافت و ثبت داده های روزانه وجود داشته باشد (مثلا کلیه اطلاعات باید در 5 دقیقه دریافت و ثبت شود) و در آینده نیز تعداد رکوردهایی که باید به صورت روزانه ثبت شود افزایش پیدا کند، کدامیک از این دو روش، از نظر طراحی و هم از نظر کاربری نرم افزار، بهینه تر و اصولی تر است؟ آیا برای رسیدن به سرعت و کارایی بالاتر، مجاز هستیم از روش دوم که غیر اصولی به نظر میرسه استفاده کنیم؟ آیا ساخت یک دیتابیس ترکیبی از SQL و فایل های XML به این شکل کار درستی است؟ در غیر اینصورت، روش اصولی برای نرم افزارهایی که باید در هر عملیات، تعداد زیادی داده را ثبت و مدیریت کنند چیست؟ با تشکر.

اضافه کردن ویژگی ای برای ذخیره عناوین مورد علاقه
وضعیت: پاسخ داده شده

سلام

چطور میشه در سایت dntips.ir موضوعات مورد علاقه را در حساب کاربری Bookmark کنیم؟ اگر این ویژگی وجود نداشته باشد آیا امید به اضافه شدن این ویژگی هست؟

تشکر

HttpContext در BlazorSSR
وضعیت: پاسخ داده شده

سلام

مشابه سایت جاری از یک CascadingValue بنام ApplicationState در برنامه استفاده کرده ام. در این ApplicationState اعضایی وجود دارند مانند

 public CurrentUserModel? CurrentUser { set; get; }
 public string? UserName { get; set; } 
[CascadingParameter]
 public HttpContext HttpContext { set; get; } 

چنانچه فایل App برنامه بصورت زیر باشد.

<head>
      <HeadOutlet  />  
</head>
<body>
    <Routes  />
</body>

</html>

HttpContext نال نیست ولی اعضای دیگر مانند CurrentUser , UserName در سایر صفحات نال نشان میدهد. نمونه عکس زیر

پس از تغییر HeadOutlet و Routes فایل App به InteractiveServer اینبار برعکس میشود و HttpContext نال میشود و اعضای دیگر ApplicationState مقدار دارند

<body>
    <Routes @rendermode="RenderModeForPage" />
    <script src="_framework/blazor.web.js"></script>
</body>

</html>

@code {
    [CascadingParameter]
    private HttpContext HttpContext { get; set; } = default!;

    private IComponentRenderMode? RenderModeForPage => HttpContext.Request.Path.StartsWithSegments("/Account")
        ? null
        : InteractiveServer;
}

مشابه عکس زیر

راه حل نال نشدن همه اعضاء در هردو صورت InteractiveServer و یا غیر InteractiveServer چیست؟

با تزریق

[Inject] IHttpContextAccessor HttpContextAccessor{ get; set; }

در ApplicationState و مقدار دهی HttpContext مشکل حل میشود ولی شما در سایت از این روش استفاده نکرده اید

 protected override async Task OnInitializedAsync()
 {
     this.HttpContext = HttpContextAccessor.HttpContext;
     CurrentUser = new CurrentUserModel
     {
         IsAdmin = true
     };

 }