NameApp2.zip
حجم:
23.3M
لاگ نویسی پروژه فرقی نمیکنه چی باشه این پروژه برای پروژه های بزرگ هم کار میکند
پروژه ASP.Net Core MVC (وب و سی شارپ)
لاگ نویسی پروژه فرقی نمیکنه چی باشه این پروژه برای پروژه های بزرگ هم کار میکند
// مسیر پوشه لاگها را مشخص میکنیم (داخل wwwroot/logs)
var folderPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "logs");
// اگر پوشه وجود نداشت، ساخته میشود
Directory.CreateDirectory(folderPath);
// نام فایل لاگ را با تاریخ و ساعت جاری میسازیم (هر بار اجرا یک فایل جدید)
var logFilePath = Path.Combine(folderPath, $"eflog_{DateTime.Now:yyyyMMdd_HHmmss}.txt");
// فایل را باز میکنیم با اجازهی اشتراکگذاری (FileShare.ReadWrite)
// تا چند پروسه بتوانند همزمان به آن دسترسی داشته باشند
var fileStream = new FileStream(logFilePath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
// یک StreamWriter روی فایل ایجاد میکنیم و AutoFlush را فعال میکنیم
// تا هر خط بلافاصله نوشته شود و نیازی به Close دستی نباشد
var writer = new StreamWriter(fileStream) { AutoFlush = true };
// ثبت DbContext در DI Container (Dependency Injection)
// اینجا EF Core را تنظیم میکنیم تا:
// 1. از ConnectionString موجود در appsettings.json استفاده کند
// 2. SensitiveDataLogging فعال باشد (پارامترهای کوئری هم نمایش داده شوند)
// 3. همهی کوئریها در فایل لاگ نوشته شوند
builder.Services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"))
.EnableSensitiveDataLogging()
.LogTo(writer.WriteLine, LogLevel.Information));
پروژه ASP.Net Core MVC (وب و سی شارپ)
لاگ نویسی پروژه فرقی نمیکنه چی باشه این پروژه برای پروژه های بزرگ هم کار میکند
## 📌 معرفی پروژه لاگنویسی EF Core در پروژه NameApp2
### 🔹 هدف پروژه
این پروژه با استفاده از ASP.NET Core MVC و Entity Framework Core طراحی شده تا تمام کوئریهای اجرا شده توسط EF Core را در فایل متنی ذخیره کند. هدف اصلی، مانیتورینگ و بررسی کوئریها برای یادگیری و تحلیل عملکرد دیتابیس است.
---
### 🔹 ساختار پروژه
- Program
به گونهای تنظیم شده که هنگام اجرای برنامه، یک فایل جدید در مسیر
wwwroot/logsساخته میشود. - نام فایل شامل تاریخ و ساعت اجراست (مثلاً
eflog_20260101_220000.txt). - همهی کوئریهای EF Core در این فایل ثبت میشوند. --- ### 🔹 امکانات پروژه 1. ایجاد فایل لاگ جدید در هر اجرا - هر بار پروژه اجرا شود، یک فایل جدید ساخته میشود. - این فایل شامل تمام کوئریهای SQL تولید شده توسط EF Core است. 2. ذخیره کوئریها با جزئیات کامل - متن کامل کوئریها (SELECT, INSERT, UPDATE, DELETE) ثبت میشود. - با فعال بودن `EnableSensitiveDataLogging`، پارامترهای کوئری نیز نمایش داده میشوند. 3. مدیریت پوشه لاگها - اگر پوشهی
wwwroot/logsوجود نداشته باشد، به صورت خودکار ساخته میشود. - فایلها به صورت مرتب و قابل دسترسی ذخیره میشوند. 4. قابلیت توسعه - میتوان لاگها را به جای فایل، در دیتابیس یا سرویسهای مانیتورینگ (مثل Seq یا ELK) ذخیره کرد. - امکان استفاده از کتابخانههای حرفهای مثل Serilog یا NLog برای مدیریت بهتر لاگها وجود دارد. --- ### 🔹 نمونه کاربرد - بررسی کوئریهای تولید شده توسط EF Core برای یادگیری. - تحلیل عملکرد دیتابیس و پیدا کردن کوئریهای سنگین. - مستندسازی کوئریها برای آموزش یا انتشار. --- ## 🎯 نتیجه این پروژه یک نمونهی ساده و آموزشی است که نشان میدهد چگونه میتوان کوئریهای EF Core را در فایل متنی ذخیره کرد. کاربرد اصلی آن برای یادگیری، مانیتورینگ و تحلیل کوئریها است و میتواند پایهای برای پروژههای بزرگتر با سیستم لاگ حرفهای باشد.
PictureApp.zip
حجم:
23.4M
اینکه دو پروژهی جدا (CRUD تصویر و CRUD فایل) رو در یک پروژه ترکیب کردی، یعنی الان دو کنترلر داری که هر کدوم مسئولیت متفاوتی دارن. بذار مرحلهبهمرحله توضیح بدم:
پروژه ASP.Net Core MVC (وب و سی شارپ)
اینکه دو پروژهی جدا (CRUD تصویر و CRUD فایل) رو در یک پروژه ترکیب کردی، یعنی الان دو کنترلر داری که
## 🔹 کنترلر اول: PicturesController
این کنترلر مخصوص مدیریت تصاویر هست:
- Index
→ لیست همه تصاویر ذخیرهشده در دیتابیس رو نمایش میده.
- Create (GET/POST)
→ کاربر میتونه یک تصویر آپلود کنه. تصویر در پوشهی
wwwroot/imagesذخیره میشه و مسیرش در دیتابیس ثبت میشه. - Edit (GET/POST) → کاربر میتونه توضیحات تصویر رو تغییر بده یا تصویر جدید جایگزین کنه. اگر تصویر جدید آپلود بشه، تصویر قبلی حذف میشه. - Delete → تصویر از دیتابیس و فایل فیزیکی از پوشه حذف میشه. - نمایش در ویو → تصاویر با
<img src="~/images/...">نمایش داده میشن. 👉 این کنترلر بیشتر برای گالری عکس، پروفایل کاربری یا نمایش بصری استفاده میشه. --- ## 🔹 کنترلر دوم: DocumentsController این کنترلر مخصوص مدیریت فایلهای عمومی (PDF، Word، ZIP و …) هست: - Index → لیست همه فایلها رو نمایش میده همراه با توضیحات. - Create (GET/POST) → کاربر میتونه یک فایل آپلود کنه. فایل در پوشهی
wwwroot/filesذخیره میشه و نام اصلی + مسیر ذخیره در دیتابیس ثبت میشه. - Edit (GET/POST) → کاربر میتونه توضیحات فایل رو تغییر بده یا فایل جدید جایگزین کنه. فایل قبلی حذف و فایل جدید ذخیره میشه. - Download → کاربر میتونه فایل رو دانلود کنه. اینجا کنترلر فایل رو از پوشه میخونه و با متد
File()به کاربر برمیگردونه. - Delete → فایل از دیتابیس و پوشه حذف میشه. 👉 این کنترلر بیشتر برای مدیریت اسناد، فایلهای آموزشی یا دانلودی استفاده میشه. --- ## 🔹 تفاوت اصلی دو کنترلر - PicturesController → تمرکز روی نمایش بصری (
<img>). - DocumentsController → تمرکز روی دانلود فایل (
File()در کنترلر). - هر دو از یک الگو استفاده میکنن: - آپلود → ذخیره در پوشه + ثبت در دیتابیس - ویرایش → تغییر توضیحات یا جایگزینی فایل - حذف → پاک کردن رکورد + فایل فیزیکی --- ## 🎯 جمعبندی الان پروژهات دو بخش داره: - بخش مدیریت تصاویر (نمایش مستقیم در صفحه) - بخش مدیریت فایلها (دانلود توسط کاربر) هر دو کنترلر ساختار مشابه دارن، فقط فرقشون در نوع نمایش خروجی هست: - تصاویر با
<img>نمایش داده میشن. - فایلها با لینک دانلود برگردونده میشن.
// مسیر پوشه لاگها را مشخص میکنیم (داخل wwwroot/logs)
var folderPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "logs");
// اگر پوشه وجود نداشت، ساخته میشود
Directory.CreateDirectory(folderPath);
// نام فایل لاگ را با تاریخ و ساعت جاری میسازیم (هر بار اجرا یک فایل جدید)
var logFilePath = Path.Combine(folderPath, $"eflog_{DateTime.Now:yyyyMMdd_HHmmss}.txt");
// فایل را باز میکنیم با اجازهی اشتراکگذاری (FileShare.ReadWrite)
// تا چند پروسه بتوانند همزمان به آن دسترسی داشته باشند
var fileStream = new FileStream(logFilePath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
// یک StreamWriter روی فایل ایجاد میکنیم و AutoFlush را فعال میکنیم
// تا هر خط بلافاصله نوشته شود و نیازی به Close دستی نباشد
var writer = new StreamWriter(fileStream) { AutoFlush = true };
// ثبت DbContext در DI Container (Dependency Injection)
// اینجا EF Core را تنظیم میکنیم تا:
// 1. از ConnectionString موجود در appsettings.json استفاده کند
// 2. SensitiveDataLogging فعال باشد (پارامترهای کوئری هم نمایش داده شوند)
// 3. همهی کوئریها در فایل لاگ نوشته شوند
builder.Services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"))
.EnableSensitiveDataLogging()
.LogTo(writer.WriteLine, LogLevel.Information));
و
if (file != null)
{
// مسیر پوشه wwwroot/images
var folder = Path.Combine(_env.WebRootPath, "images");
Directory.CreateDirectory(folder);
// نام فایل یکتا
var fileName = Guid.NewGuid() + Path.GetExtension(file.FileName);
var filePath = Path.Combine(folder, fileName);
// ذخیره فایل
using (var stream = new FileStream(filePath, FileMode.Create))
{
file.CopyTo(stream);
}
// ذخیره رکورد در دیتابیس
var pc = new Picture { FileName = fileName , Description = description};
_db.Pictures.Add(pc);
_db.SaveChanges();
return RedirectToAction("Index");
}
شباهت و تفاوت
این دو قطعه کد از نظر ساختار خیلی شبیه هم هستند، اما از نظر هدف کاملاً متفاوتند. بذار دقیق توضیح بدم:
---
## 🔹 شباهتها
1. ساخت پوشه
هر دو با Directory.CreateDirectory(...) مطمئن میشوند که پوشه وجود دارد و اگر نبود ساخته میشود.
- اولی:
wwwroot/logs- دومی:
wwwroot/images2. ساخت نام فایل یکتا هر دو نام فایل را با Guid.NewGuid() و پسوند مناسب میسازند تا فایلها تکراری نشوند. 3. کار با FileStream هر دو از
FileStreamاستفاده میکنند تا روی فایل بنویسند. - اولی: برای نوشتن لاگها (متن کوئریهای EF Core). - دومی: برای ذخیره کردن محتوای آپلود شده (تصویر). 4. ارتباط با دیتابیس هر دو در نهایت یک رکورد در دیتابیس ثبت میکنند: - اولی: EF Core کوئریها را لاگ میکند. - دومی: مسیر و توضیحات تصویر را ذخیره میکند. --- ## 🔹 تفاوتها 1. هدف اصلی - کد اول: مخصوص لاگنویسی EF Core است. یعنی کوئریهای دیتابیس در فایل متنی ذخیره میشوند. - کد دوم: مخصوص آپلود تصویر است. یعنی فایل واقعی (jpg, png و …) در پوشه ذخیره میشود. 2. نوع داده ورودی - کد اول: هیچ ورودی از کاربر نمیگیرد، خودش فایل لاگ میسازد. - کد دوم: ورودی از کاربر (
IFormFile file) میگیرد و آن را ذخیره میکند. 3. نحوه نوشتن در فایل - کد اول: از
StreamWriterاستفاده میکند تا متن (کوئریها) را خطبهخط بنویسد. - کد دوم: از file.CopyTo(stream) استفاده میکند تا کل محتوای فایل آپلود شده کپی شود. 4. محل استفاده - کد اول: در Program.cs یا هنگام تنظیم DbContext استفاده میشود. - کد دوم: در Controller (اکشن Create) استفاده میشود. 5. نوع خروجی - کد اول: خروجیاش یک فایل متنی لاگ است. - کد دوم: خروجیاش یک فایل تصویر است که بعداً در ویو با
<img>نمایش داده میشود. --- ## 🎯 جمعبندی - شباهتها: ساخت پوشه، نام یکتا، کار با FileStream، ثبت در دیتابیس. - تفاوتها: هدف (لاگنویسی vs آپلود تصویر)، نوع داده (متن vs فایل)، محل استفاده (Program.cs vs Controller)، و نوع خروجی (فایل متنی vs تصویر).
برای اینکه ورودی <input type="file"> فقط فرمتهای تصویر رو قبول کنه، باید از ویژگی accept استفاده کنی. این ویژگی مشخص میکنه چه نوع فایلهایی قابل انتخاب باشن.
---
🔹 نمونه کد HTML
html
<form asp-action="Create" enctype="multipart/form-data" method="post">
<div class="form-group">
<label>انتخاب تصویر</label>
<input type="file" name="file" class="form-control"
accept="image/*" /> <!-- فقط همه فرمتهای تصویر -->
</div>
<div class="form-group">
<label>توضیحات</label>
<input type="text" name="description" class="form-control" />
</div>
<button type="submit" class="btn btn-success">ذخیره</button>
</form>
---
🔹 توضیح
- accept="image/*" → یعنی فقط فایلهایی که نوع MIME آنها تصویر است (jpg, png, gif, bmp, webp, svg و …) قابل انتخاب هستند.
- اگر بخوای دقیقتر باشی و فقط چند فرمت خاص رو قبول کنی، میتونی اینطوری بنویسی:
html
<input type="file" name="file"
accept=".jpg,.jpeg,.png,.gif,.bmp,.webp" />
---
🎯 جمعبندی
- برای همهی فرمتهای تصویر → accept="image/*"
- برای فرمتهای خاص → accept=".jpg,.png,.gif"ImageUrlApp2.zip
حجم:
24.8M
پروژه را جمعه قبل نوشتم
پروژه را تغییر نام دادم و نتوانستم پروژه جدید بسازم چون نیاز به اینترنت داشتم و کتابخانه ها نیاز داشتم
و پروژه دارای
نام
Checkbox
تصویر
قیمت که Fluent api استفاده شده
تاریخ به شمسی و میلادی
که همه از یک جدول دیتابیس ذخیره می شود
این پروژه چون تغییر نام دادم دو تا namespace وجود دارد
به آپارات
https://www.aparat.com/shorts/user/alialirezapanahi/shorts
یا
www.aparat.com/alialirezapanahi
سر بزنید
شرمنده سایت Nuget بالا نمیاد و نمیتوانم کتابخانه های EF Core به پروژه جدید اضافه کنم
پروژه قبلی را اگر تغییر نام دهم دو تا namespace به دست میاد که و اولی نام قبلی که تغییر نمیکنه و تغییر دهم خطا میده و دومی نام پروژه جدید است
سایت خالی nuget بالا می آید ولی برای دانلود کتابخانه زمان زیادی طول میکشه و api.nuget.org درست متصل نیست
Filter App.zip
حجم:
23.3M
با دردسر کتابخانه ها نصب شد هوش مصنوعی من فرق میکند و این پروژه هم فیلتر کردن محصول برای آموزش گذاشتم
نکته: اگر همه آموزش تکراری هستند من را ببخشید و من هنوز کدها را خوب درک نکرده ام و تمرین کنم و به اشتراک بگذارم
نکته دوم : برای تازه وارد که چگونه پروژه را اجرا کنند من یک ویدئو کوتاه درست میکنم تا بتوانند پروژه را اجرا کنند