پروژه کنسولی: سیستم مدیریت کتابخانه 📚💻
وقتشه همه مفاهیم C# که یاد گرفتیم رو در یک پروژه واقعی به کار ببریم!
🎯 مروری بر پروژه
در این درس، یک سیستم مدیریت کتابخانه کامل میسازیم که تمام مفاهیم آموخته شده را در یک پروژه عملی ترکیب میکند. این پروژه شامل این ویژگیها است:
📚 مدیریت کتابها
- اضافه کردن کتاب جدید با اطلاعات کامل
- نمایش فهرست کتابها با فیلتر وضعیت
- جستجوی پیشرفته بر اساس عنوان، نویسنده و ISBN
- ویرایش و حذف کتابها
👥 مدیریت اعضا
- ثبت عضو جدید با اعتبارسنجی ایمیل
- نمایش فهرست اعضا با جزئیات امانت
- پیگیری تاریخچه امانتهای هر عضو
- مدیریت اطلاعات شخصی اعضا
🔄 امانت و بازگشت
- امانت دادن کتاب با ثبت تاریخ
- بازگشت کتاب و محاسبه مدت امانت
- کنترل موجودی و محدودیت امانت
- مدیریت صف انتظار برای کتابهای پرطرفدار
💾 ذخیرهسازی و گزارش
- ذخیره خودکار در فایلهای JSON
- بارگذاری دادهها هنگام شروع برنامه
- Exception Handling کامل
- تولید گزارشهای آماری
🏗️ معماری پروژه
این پروژه از معماری سه لایه استفاده میکند:
Data Layer
کلاسهای Book و Member
Business Layer
کلاس LibraryManager
Presentation Layer
کلاس Program و Console UI
💻 پیادهسازی کد
کد کامل سیستم مدیریت کتابخانه در C#. سعی کن اول خودت بنویسیش و بعد با این مقایسه کنی!
📋 ساختار کلاسها
هر کلاس مسئولیت خاص خودش رو داره و از اصول OOP پیروی میکنه. بیایید با کلاس Book شروع کنیم:
using System;
using System.ComponentModel.DataAnnotations;
public class Book
{
// Properties اصلی کتاب
public int Id { get; set; }
[Required(ErrorMessage = "عنوان کتاب الزامی است")]
[StringLength(200, ErrorMessage = "عنوان نباید بیش از 200 کاراکتر باشد")]
public string Title { get; set; }
[Required(ErrorMessage = "نام نویسنده الزامی است")]
[StringLength(100, ErrorMessage = "نام نویسنده نباید بیش از 100 کاراکتر باشد")]
public string Author { get; set; }
[Required(ErrorMessage = "ISBN الزامی است")]
[RegularExpression(@"^\d{10}(\d{3})?$", ErrorMessage = "فرمت ISBN نامعتبر است")]
public string ISBN { get; set; }
public string Category { get; set; }
public int PublicationYear { get; set; }
public int PageCount { get; set; }
public string Publisher { get; set; }
// Properties مربوط به امانت
public bool IsAvailable { get; set; }
public DateTime? BorrowDate { get; set; }
public DateTime? DueDate { get; set; }
public int? BorrowedByMemberId { get; set; }
public int BorrowCount { get; set; } // تعداد دفعات امانت
// Constructor
public Book(int id, string title, string author, string isbn,
string category = "", int publicationYear = 0,
int pageCount = 0, string publisher = "")
{
Id = id;
Title = title;
Author = author;
ISBN = isbn;
Category = category;
PublicationYear = publicationYear;
PageCount = pageCount;
Publisher = publisher;
IsAvailable = true;
BorrowDate = null;
DueDate = null;
BorrowedByMemberId = null;
BorrowCount = 0;
}
// متد برای امانت دادن کتاب
public void BorrowBook(int memberId, int borrowDays = 14)
{
if (!IsAvailable)
throw new InvalidOperationException("این کتاب در حال حاضر امانتی است");
IsAvailable = false;
BorrowDate = DateTime.Now;
DueDate = DateTime.Now.AddDays(borrowDays);
BorrowedByMemberId = memberId;
BorrowCount++;
}
// متد برای بازگشت کتاب
public int ReturnBook()
{
if (IsAvailable)
throw new InvalidOperationException("این کتاب امانتی نیست");
IsAvailable = true;
int daysLate = 0;
if (DueDate.HasValue && DateTime.Now > DueDate.Value)
{
daysLate = (DateTime.Now - DueDate.Value).Days;
}
BorrowDate = null;
DueDate = null;
BorrowedByMemberId = null;
return daysLate; // برمیگرداند تعداد روزهای تأخیر
}
// متد برای بررسی تأخیر
public bool IsOverdue()
{
return !IsAvailable && DueDate.HasValue && DateTime.Now > DueDate.Value;
}
// متد برای محاسبه جریمه
public decimal CalculateFine(decimal finePerDay = 1000)
{
if (!IsOverdue()) return 0;
int daysLate = (DateTime.Now - DueDate.Value).Days;
return daysLate * finePerDay;
}
public override string ToString()
{
string status = IsAvailable ? "✅ موجود" :
IsOverdue() ? $"❌ امانتی (تأخیر {(DateTime.Now - DueDate.Value).Days} روز)" :
$"📖 امانتی (تا {DueDate:yyyy/MM/dd})";
return $"[{Id}] {Title}\n" +
$" نویسنده: {Author} | دسته: {Category}\n" +
$" ISBN: {ISBN} | وضعیت: {status}\n" +
$" تعداد امانت: {BorrowCount} بار";
}
// متد برای نمایش اطلاعات کامل
public string GetDetailedInfo()
{
return $"📚 اطلاعات کامل کتاب:\n" +
$" شناسه: {Id}\n" +
$" عنوان: {Title}\n" +
$" نویسنده: {Author}\n" +
$" دستهبندی: {Category}\n" +
$" سال انتشار: {PublicationYear}\n" +
$" تعداد صفحات: {PageCount}\n" +
$" ناشر: {Publisher}\n" +
$" ISBN: {ISBN}\n" +
$" وضعیت: {(IsAvailable ? "موجود" : "امانتی")}\n" +
$" تعداد امانت: {BorrowCount} بار";
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text.RegularExpressions;
public class Member
{
// Properties اصلی عضو
public int Id { get; set; }
[Required(ErrorMessage = "نام عضو الزامی است")]
[StringLength(100, ErrorMessage = "نام نباید بیش از 100 کاراکتر باشد")]
public string Name { get; set; }
[Required(ErrorMessage = "ایمیل الزامی است")]
[EmailAddress(ErrorMessage = "فرمت ایمیل نامعتبر است")]
public string Email { get; set; }
[Phone(ErrorMessage = "فرمت شماره تلفن نامعتبر است")]
public string PhoneNumber { get; set; }
public string Address { get; set; }
public DateTime JoinDate { get; set; }
public DateTime? LastVisit { get; set; }
// Properties مربوط به امانت
public List BorrowedBooks { get; set; }
public List BorrowHistory { get; set; } // تاریخچه کامل امانتها
public int MaxBorrowLimit { get; set; } // حداکثر تعداد کتاب قابل امانت
public decimal TotalFines { get; set; } // مجموع جریمهها
public bool IsActive { get; set; } // وضعیت فعال بودن عضویت
// Constructor
public Member(int id, string name, string email, string phoneNumber = "", string address = "")
{
Id = id;
Name = name;
Email = email;
PhoneNumber = phoneNumber;
Address = address;
JoinDate = DateTime.Now;
LastVisit = DateTime.Now;
BorrowedBooks = new List();
BorrowHistory = new List();
MaxBorrowLimit = 3; // پیشفرض 3 کتاب
TotalFines = 0;
IsActive = true;
}
// متد برای اعتبارسنجی ایمیل
public bool IsValidEmail()
{
if (string.IsNullOrWhiteSpace(Email))
return false;
string pattern = @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$";
return Regex.IsMatch(Email, pattern);
}
// متد برای بررسی امکان امانت کتاب جدید
public bool CanBorrowBook()
{
return IsActive && BorrowedBooks.Count < MaxBorrowLimit && TotalFines == 0;
}
// متد برای امانت گرفتن کتاب
public void BorrowBook(int bookId)
{
if (!CanBorrowBook())
throw new InvalidOperationException("امکان امانت کتاب جدید وجود ندارد");
if (BorrowedBooks.Contains(bookId))
throw new InvalidOperationException("این کتاب قبلاً امانت گرفته شده");
BorrowedBooks.Add(bookId);
if (!BorrowHistory.Contains(bookId))
BorrowHistory.Add(bookId);
LastVisit = DateTime.Now;
}
// متد برای بازگشت کتاب
public void ReturnBook(int bookId, decimal fine = 0)
{
if (!BorrowedBooks.Contains(bookId))
throw new InvalidOperationException("این کتاب توسط این عضو امانت گرفته نشده");
BorrowedBooks.Remove(bookId);
TotalFines += fine;
LastVisit = DateTime.Now;
}
// متد برای پرداخت جریمه
public void PayFine(decimal amount)
{
if (amount <= 0)
throw new ArgumentException("مبلغ باید مثبت باشد");
if (amount > TotalFines)
throw new ArgumentException("مبلغ بیش از جریمه کل است");
TotalFines -= amount;
}
// متد برای غیرفعال کردن عضویت
public void DeactivateMembership()
{
if (BorrowedBooks.Count > 0)
throw new InvalidOperationException("ابتدا تمام کتابهای امانتی را بازگردانید");
IsActive = false;
}
// متد برای فعال کردن مجدد عضویت
public void ReactivateMembership()
{
if (TotalFines > 0)
throw new InvalidOperationException("ابتدا جریمههای معوقه را پرداخت کنید");
IsActive = true;
}
// متد برای محاسبه آمار عضو
public string GetMemberStats()
{
int totalBorrowedBooks = BorrowHistory.Count;
int currentBorrowedBooks = BorrowedBooks.Count;
int daysSinceJoin = (DateTime.Now - JoinDate).Days;
int daysSinceLastVisit = LastVisit.HasValue ? (DateTime.Now - LastVisit.Value).Days : 0;
return $"📊 آمار عضو:\n" +
$" کل کتابهای امانت گرفته شده: {totalBorrowedBooks}\n" +
$" کتابهای فعلی امانتی: {currentBorrowedBooks}\n" +
$" مدت عضویت: {daysSinceJoin} روز\n" +
$" آخرین بازدید: {daysSinceLastVisit} روز پیش\n" +
$" جریمههای معوقه: {TotalFines:N0} تومان";
}
public override string ToString()
{
string status = IsActive ? "✅ فعال" : "❌ غیرفعال";
string fineStatus = TotalFines > 0 ? $" (جریمه: {TotalFines:N0} تومان)" : "";
return $"[{Id}] {Name}\n" +
$" ایمیل: {Email} | تلفن: {PhoneNumber}\n" +
$" تاریخ عضویت: {JoinDate:yyyy/MM/dd} | وضعیت: {status}{fineStatus}\n" +
$" کتابهای امانتی: {BorrowedBooks.Count}/{MaxBorrowLimit}";
}
// متد برای نمایش اطلاعات کامل
public string GetDetailedInfo()
{
return $"👤 اطلاعات کامل عضو:\n" +
$" شناسه: {Id}\n" +
$" نام: {Name}\n" +
$" ایمیل: {Email}\n" +
$" تلفن: {PhoneNumber}\n" +
$" آدرس: {Address}\n" +
$" تاریخ عضویت: {JoinDate:yyyy/MM/dd}\n" +
$" آخرین بازدید: {(LastVisit?.ToString("yyyy/MM/dd") ?? "هرگز")}\n" +
$" وضعیت: {(IsActive ? "فعال" : "غیرفعال")}\n" +
$" حد امانت: {BorrowedBooks.Count}/{MaxBorrowLimit}\n" +
$" جریمههای معوقه: {TotalFines:N0} تومان\n" +
$" تعداد کل امانتها: {BorrowHistory.Count}";
}
}
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Newtonsoft.Json;
using System.Text;
public class LibraryManager
{
private List books;
private List members;
private const string BooksFile = "books.json";
private const string MembersFile = "members.json";
private const string LogFile = "library_log.txt";
private const decimal FinePerDay = 1000; // جریمه روزانه به تومان
public LibraryManager()
{
books = new List();
members = new List();
LoadData();
LogActivity("سیستم مدیریت کتابخانه راهاندازی شد");
}
#region Data Management
// بارگذاری دادهها از فایل
private void LoadData()
{
try
{
if (File.Exists(BooksFile))
{
string booksJson = File.ReadAllText(BooksFile, Encoding.UTF8);
books = JsonConvert.DeserializeObject>(booksJson) ?? new List();
Console.WriteLine($"✅ {books.Count} کتاب بارگذاری شد");
}
else
{
Console.WriteLine("⚠️ فایل کتابها یافت نشد. لیست خالی ایجاد شد.");
}
if (File.Exists(MembersFile))
{
string membersJson = File.ReadAllText(MembersFile, Encoding.UTF8);
members = JsonConvert.DeserializeObject>(membersJson) ?? new List();
Console.WriteLine($"✅ {members.Count} عضو بارگذاری شد");
}
else
{
Console.WriteLine("⚠️ فایل اعضا یافت نشد. لیست خالی ایجاد شد.");
}
}
catch (Exception ex)
{
Console.WriteLine($"❌ خطا در بارگذاری دادهها: {ex.Message}");
LogActivity($"خطا در بارگذاری: {ex.Message}");
}
}
// ذخیره دادهها در فایل
private void SaveData()
{
try
{
// ایجاد پشتیبان قبل از ذخیره
CreateBackup();
string booksJson = JsonConvert.SerializeObject(books, Formatting.Indented);
File.WriteAllText(BooksFile, booksJson, Encoding.UTF8);
string membersJson = JsonConvert.SerializeObject(members, Formatting.Indented);
File.WriteAllText(MembersFile, membersJson, Encoding.UTF8);
Console.WriteLine("💾 دادهها با موفقیت ذخیره شد");
}
catch (Exception ex)
{
Console.WriteLine($"❌ خطا در ذخیره دادهها: {ex.Message}");
LogActivity($"خطا در ذخیره: {ex.Message}");
}
}
// ایجاد پشتیبان از دادهها
private void CreateBackup()
{
try
{
string backupDir = "Backup";
if (!Directory.Exists(backupDir))
Directory.CreateDirectory(backupDir);
string timestamp = DateTime.Now.ToString("yyyyMMdd_HHmmss");
if (File.Exists(BooksFile))
File.Copy(BooksFile, Path.Combine(backupDir, $"books_{timestamp}.json"));
if (File.Exists(MembersFile))
File.Copy(MembersFile, Path.Combine(backupDir, $"members_{timestamp}.json"));
}
catch (Exception ex)
{
Console.WriteLine($"⚠️ خطا در ایجاد پشتیبان: {ex.Message}");
}
}
// ثبت فعالیت در لاگ
private void LogActivity(string activity)
{
try
{
string logEntry = $"[{DateTime.Now:yyyy/MM/dd HH:mm:ss}] {activity}";
File.AppendAllText(LogFile, logEntry + Environment.NewLine, Encoding.UTF8);
}
catch
{
// در صورت خطا در لاگ، کاری نمیکنیم
}
}
#endregion
#region Book Management
// اضافه کردن کتاب جدید
public void AddBook()
{
try
{
Console.WriteLine("\n📚 اضافه کردن کتاب جدید");
Console.WriteLine("═══════════════════════════");
Console.Write("عنوان کتاب: ");
string title = Console.ReadLine();
if (string.IsNullOrWhiteSpace(title))
{
Console.WriteLine("❌ عنوان کتاب نمیتواند خالی باشد!");
return;
}
Console.Write("نام نویسنده: ");
string author = Console.ReadLine();
if (string.IsNullOrWhiteSpace(author))
{
Console.WriteLine("❌ نام نویسنده نمیتواند خالی باشد!");
return;
}
Console.Write("ISBN: ");
string isbn = Console.ReadLine();
if (string.IsNullOrWhiteSpace(isbn))
{
Console.WriteLine("❌ ISBN نمیتواند خالی باشد!");
return;
}
// بررسی تکراری نبودن ISBN
if (books.Any(b => b.ISBN == isbn))
{
Console.WriteLine("❌ کتابی با این ISBN قبلاً ثبت شده است!");
return;
}
Console.Write("دستهبندی (اختیاری): ");
string category = Console.ReadLine();
Console.Write("سال انتشار (اختیاری): ");
int.TryParse(Console.ReadLine(), out int year);
Console.Write("تعداد صفحات (اختیاری): ");
int.TryParse(Console.ReadLine(), out int pages);
Console.Write("ناشر (اختیاری): ");
string publisher = Console.ReadLine();
int newId = books.Count > 0 ? books.Max(b => b.Id) + 1 : 1;
Book newBook = new Book(newId, title, author, isbn, category, year, pages, publisher);
books.Add(newBook);
SaveData();
Console.WriteLine($"\n✅ کتاب '{title}' با موفقیت اضافه شد! (شناسه: {newId})");
LogActivity($"کتاب جدید اضافه شد: {title} - {author}");
}
catch (Exception ex)
{
Console.WriteLine($"❌ خطا در اضافه کردن کتاب: {ex.Message}");
LogActivity($"خطا در اضافه کردن کتاب: {ex.Message}");
}
}
// نمایش همه کتابها
public void ShowAllBooks()
{
try
{
Console.WriteLine("\n📚 فهرست کتابهای کتابخانه");
Console.WriteLine("═══════════════════════════════");
if (books.Count == 0)
{
Console.WriteLine("📭 هیچ کتابی در کتابخانه موجود نیست!");
return;
}
Console.WriteLine("فیلتر بر اساس وضعیت:");
Console.WriteLine("1. همه کتابها");
Console.WriteLine("2. فقط کتابهای موجود");
Console.WriteLine("3. فقط کتابهای امانتی");
Console.WriteLine("4. فقط کتابهای دارای تأخیر");
Console.Write("انتخاب شما: ");
string choice = Console.ReadLine();
List filteredBooks = books;
switch (choice)
{
case "2":
filteredBooks = books.Where(b => b.IsAvailable).ToList();
break;
case "3":
filteredBooks = books.Where(b => !b.IsAvailable).ToList();
break;
case "4":
filteredBooks = books.Where(b => b.IsOverdue()).ToList();
break;
}
if (filteredBooks.Count == 0)
{
Console.WriteLine("📭 با این فیلتر هیچ کتابی یافت نشد!");
return;
}
Console.WriteLine($"\n📊 تعداد کتابها: {filteredBooks.Count}");
Console.WriteLine("─────────────────────────────────────────────────────────────");
foreach (var book in filteredBooks.OrderBy(b => b.Title))
{
Console.WriteLine(book.ToString());
Console.WriteLine();
}
LogActivity($"فهرست کتابها مشاهده شد (فیلتر: {choice})");
}
catch (Exception ex)
{
Console.WriteLine($"❌ خطا در نمایش کتابها: {ex.Message}");
}
}
// جستجوی کتاب
public void SearchBooks()
{
try
{
Console.WriteLine("\n🔍 جستجوی کتاب");
Console.WriteLine("═══════════════════");
if (books.Count == 0)
{
Console.WriteLine("📭 هیچ کتابی برای جستجو موجود نیست!");
return;
}
Console.WriteLine("جستجو بر اساس:");
Console.WriteLine("1. عنوان کتاب");
Console.WriteLine("2. نام نویسنده");
Console.WriteLine("3. ISBN");
Console.WriteLine("4. دستهبندی");
Console.WriteLine("5. جستجوی کلی");
Console.Write("انتخاب شما: ");
string searchType = Console.ReadLine();
Console.Write("کلمه کلیدی: ");
string keyword = Console.ReadLine();
if (string.IsNullOrWhiteSpace(keyword))
{
Console.WriteLine("❌ کلمه کلیدی نمیتواند خالی باشد!");
return;
}
List results = new List();
switch (searchType)
{
case "1":
results = books.Where(b => b.Title.Contains(keyword, StringComparison.OrdinalIgnoreCase)).ToList();
break;
case "2":
results = books.Where(b => b.Author.Contains(keyword, StringComparison.OrdinalIgnoreCase)).ToList();
break;
case "3":
results = books.Where(b => b.ISBN.Contains(keyword)).ToList();
break;
case "4":
results = books.Where(b => b.Category.Contains(keyword, StringComparison.OrdinalIgnoreCase)).ToList();
break;
case "5":
results = books.Where(b =>
b.Title.Contains(keyword, StringComparison.OrdinalIgnoreCase) ||
b.Author.Contains(keyword, StringComparison.OrdinalIgnoreCase) ||
b.Category.Contains(keyword, StringComparison.OrdinalIgnoreCase) ||
b.Publisher.Contains(keyword, StringComparison.OrdinalIgnoreCase)
).ToList();
break;
default:
Console.WriteLine("❌ انتخاب نامعتبر!");
return;
}
Console.WriteLine($"\n📊 {results.Count} کتاب یافت شد:");
Console.WriteLine("─────────────────────────────────────────────────────────────");
if (results.Count == 0)
{
Console.WriteLine("📭 هیچ کتابی با این مشخصات یافت نشد!");
}
else
{
foreach (var book in results)
{
Console.WriteLine(book.ToString());
Console.WriteLine();
}
}
LogActivity($"جستجو انجام شد: {keyword} ({results.Count} نتیجه)");
}
catch (Exception ex)
{
Console.WriteLine($"❌ خطا در جستجو: {ex.Message}");
}
}
#endregion
#region Member Management
// اضافه کردن عضو جدید
public void AddMember()
{
try
{
Console.WriteLine("\n👤 اضافه کردن عضو جدید");
Console.WriteLine("═══════════════════════════");
Console.Write("نام و نام خانوادگی: ");
string name = Console.ReadLine();
if (string.IsNullOrWhiteSpace(name))
{
Console.WriteLine("❌ نام نمیتواند خالی باشد!");
return;
}
Console.Write("ایمیل: ");
string email = Console.ReadLine();
if (string.IsNullOrWhiteSpace(email) || !Member.IsValidEmail(email))
{
Console.WriteLine("❌ ایمیل معتبر وارد کنید!");
return;
}
// بررسی تکراری نبودن ایمیل
if (members.Any(m => m.Email.Equals(email, StringComparison.OrdinalIgnoreCase)))
{
Console.WriteLine("❌ عضوی با این ایمیل قبلاً ثبت شده است!");
return;
}
Console.Write("شماره تلفن (اختیاری): ");
string phone = Console.ReadLine();
Console.Write("آدرس (اختیاری): ");
string address = Console.ReadLine();
int newId = members.Count > 0 ? members.Max(m => m.Id) + 1 : 1;
Member newMember = new Member(newId, name, email, phone, address);
members.Add(newMember);
SaveData();
Console.WriteLine($"\n✅ عضو '{name}' با موفقیت اضافه شد! (شناسه: {newId})");
LogActivity($"عضو جدید اضافه شد: {name} - {email}");
}
catch (Exception ex)
{
Console.WriteLine($"❌ خطا در اضافه کردن عضو: {ex.Message}");
LogActivity($"خطا در اضافه کردن عضو: {ex.Message}");
}
}
// نمایش همه اعضا
public void ShowAllMembers()
{
try
{
Console.WriteLine("\n👥 فهرست اعضای کتابخانه");
Console.WriteLine("═══════════════════════════════");
if (members.Count == 0)
{
Console.WriteLine("📭 هیچ عضوی در کتابخانه ثبت نشده است!");
return;
}
Console.WriteLine("فیلتر بر اساس وضعیت:");
Console.WriteLine("1. همه اعضا");
Console.WriteLine("2. فقط اعضای فعال");
Console.WriteLine("3. فقط اعضای غیرفعال");
Console.WriteLine("4. اعضای دارای کتاب امانتی");
Console.WriteLine("5. اعضای دارای جریمه");
Console.Write("انتخاب شما: ");
string choice = Console.ReadLine();
List filteredMembers = members;
switch (choice)
{
case "2":
filteredMembers = members.Where(m => m.IsActive).ToList();
break;
case "3":
filteredMembers = members.Where(m => !m.IsActive).ToList();
break;
case "4":
filteredMembers = members.Where(m => m.BorrowedBooks.Count > 0).ToList();
break;
case "5":
filteredMembers = members.Where(m => m.TotalFines > 0).ToList();
break;
}
if (filteredMembers.Count == 0)
{
Console.WriteLine("📭 با این فیلتر هیچ عضوی یافت نشد!");
return;
}
Console.WriteLine($"\n📊 تعداد اعضا: {filteredMembers.Count}");
Console.WriteLine("─────────────────────────────────────────────────────────────");
foreach (var member in filteredMembers.OrderBy(m => m.Name))
{
Console.WriteLine(member.ToString());
Console.WriteLine();
}
LogActivity($"فهرست اعضا مشاهده شد (فیلتر: {choice})");
}
catch (Exception ex)
{
Console.WriteLine($"❌ خطا در نمایش اعضا: {ex.Message}");
}
}
#endregion
#region Borrowing Management
// امانت دادن کتاب
public void BorrowBook()
{
try
{
Console.WriteLine("\n📖 امانت دادن کتاب");
Console.WriteLine("═══════════════════════");
if (books.Count == 0)
{
Console.WriteLine("📭 هیچ کتابی در کتابخانه موجود نیست!");
return;
}
if (members.Count == 0)
{
Console.WriteLine("📭 هیچ عضوی در کتابخانه ثبت نشده است!");
return;
}
Console.Write("شناسه کتاب: ");
if (!int.TryParse(Console.ReadLine(), out int bookId))
{
Console.WriteLine("❌ شناسه کتاب معتبر وارد کنید!");
return;
}
Book book = books.FirstOrDefault(b => b.Id == bookId);
if (book == null)
{
Console.WriteLine("❌ کتابی با این شناسه یافت نشد!");
return;
}
if (!book.IsAvailable)
{
Console.WriteLine($"❌ این کتاب در حال حاضر در اختیار عضو شناسه {book.BorrowedByMemberId} است!");
return;
}
Console.Write("شناسه عضو: ");
if (!int.TryParse(Console.ReadLine(), out int memberId))
{
Console.WriteLine("❌ شناسه عضو معتبر وارد کنید!");
return;
}
Member member = members.FirstOrDefault(m => m.Id == memberId);
if (member == null)
{
Console.WriteLine("❌ عضوی با این شناسه یافت نشد!");
return;
}
if (!member.IsActive)
{
Console.WriteLine("❌ این عضو غیرفعال است و نمیتواند کتاب امانت بگیرد!");
return;
}
if (!member.CanBorrowBook())
{
Console.WriteLine($"❌ این عضو نمیتواند کتاب جدید امانت بگیرد! (حداکثر: {member.MaxBorrowLimit})");
return;
}
if (member.TotalFines > 0)
{
Console.WriteLine($"⚠️ این عضو {member.TotalFines:N0} تومان جریمه دارد!");
Console.Write("آیا میخواهید ادامه دهید؟ (y/n): ");
if (Console.ReadLine()?.ToLower() != "y")
return;
}
// امانت دادن کتاب
book.BorrowBook(memberId);
member.BorrowBook(bookId);
SaveData();
Console.WriteLine($"\n✅ کتاب '{book.Title}' با موفقیت به '{member.Name}' امانت داده شد!");
Console.WriteLine($"📅 تاریخ بازگشت: {book.DueDate:yyyy/MM/dd}");
LogActivity($"امانت کتاب: {book.Title} به {member.Name}");
}
catch (Exception ex)
{
Console.WriteLine($"❌ خطا در امانت دادن کتاب: {ex.Message}");
LogActivity($"خطا در امانت: {ex.Message}");
}
}
// بازگرداندن کتاب
public void ReturnBook()
{
try
{
Console.WriteLine("\n📚 بازگرداندن کتاب");
Console.WriteLine("═══════════════════════");
Console.Write("شناسه کتاب: ");
if (!int.TryParse(Console.ReadLine(), out int bookId))
{
Console.WriteLine("❌ شناسه کتاب معتبر وارد کنید!");
return;
}
Book book = books.FirstOrDefault(b => b.Id == bookId);
if (book == null)
{
Console.WriteLine("❌ کتابی با این شناسه یافت نشد!");
return;
}
if (book.IsAvailable)
{
Console.WriteLine("❌ این کتاب امانت داده نشده است!");
return;
}
Member member = members.FirstOrDefault(m => m.Id == book.BorrowedByMemberId);
if (member == null)
{
Console.WriteLine("❌ عضو امانتگیرنده یافت نشد!");
return;
}
// محاسبه جریمه در صورت تأخیر
decimal fine = 0;
if (book.IsOverdue())
{
fine = book.CalculateFine(FinePerDay);
Console.WriteLine($"⚠️ این کتاب {(DateTime.Now - book.DueDate).Days} روز تأخیر دارد!");
Console.WriteLine($"💰 جریمه: {fine:N0} تومان");
member.TotalFines += fine;
}
// بازگرداندن کتاب
book.ReturnBook();
member.ReturnBook(bookId);
SaveData();
Console.WriteLine($"\n✅ کتاب '{book.Title}' با موفقیت بازگردانده شد!");
if (fine > 0)
{
Console.WriteLine($"💰 جریمه {fine:N0} تومان به حساب '{member.Name}' اضافه شد.");
}
LogActivity($"بازگشت کتاب: {book.Title} از {member.Name} (جریمه: {fine:N0})");
}
catch (Exception ex)
{
Console.WriteLine($"❌ خطا در بازگرداندن کتاب: {ex.Message}");
LogActivity($"خطا در بازگشت: {ex.Message}");
}
}
#endregion
#region Reports and Statistics
// گزارش کامل کتابخانه
public void ShowLibraryReport()
{
try
{
Console.WriteLine("\n📊 گزارش کامل کتابخانه");
Console.WriteLine("═══════════════════════════════");
// آمار کلی کتابها
int totalBooks = books.Count;
int availableBooks = books.Count(b => b.IsAvailable);
int borrowedBooks = books.Count(b => !b.IsAvailable);
int overdueBooks = books.Count(b => b.IsOverdue());
Console.WriteLine("📚 آمار کتابها:");
Console.WriteLine($" • کل کتابها: {totalBooks}");
Console.WriteLine($" • کتابهای موجود: {availableBooks}");
Console.WriteLine($" • کتابهای امانتی: {borrowedBooks}");
Console.WriteLine($" • کتابهای دارای تأخیر: {overdueBooks}");
// آمار اعضا
int totalMembers = members.Count;
int activeMembers = members.Count(m => m.IsActive);
int membersWithBooks = members.Count(m => m.BorrowedBooks.Count > 0);
int membersWithFines = members.Count(m => m.TotalFines > 0);
decimal totalFines = members.Sum(m => m.TotalFines);
Console.WriteLine("\n👥 آمار اعضا:");
Console.WriteLine($" • کل اعضا: {totalMembers}");
Console.WriteLine($" • اعضای فعال: {activeMembers}");
Console.WriteLine($" • اعضای دارای کتاب: {membersWithBooks}");
Console.WriteLine($" • اعضای دارای جریمه: {membersWithFines}");
Console.WriteLine($" • کل جریمهها: {totalFines:N0} تومان");
// محبوبترین دستهبندیها
var categoryStats = books
.Where(b => !string.IsNullOrEmpty(b.Category))
.GroupBy(b => b.Category)
.Select(g => new { Category = g.Key, Count = g.Count() })
.OrderByDescending(x => x.Count)
.Take(5);
Console.WriteLine("\n📈 محبوبترین دستهبندیها:");
foreach (var cat in categoryStats)
{
Console.WriteLine($" • {cat.Category}: {cat.Count} کتاب");
}
// کتابهای پرامانت
var popularBooks = books
.Where(b => b.BorrowCount > 0)
.OrderByDescending(b => b.BorrowCount)
.Take(5);
Console.WriteLine("\n🏆 کتابهای پرامانت:");
foreach (var book in popularBooks)
{
Console.WriteLine($" • {book.Title} ({book.BorrowCount} بار)");
}
LogActivity("گزارش کامل کتابخانه مشاهده شد");
}
catch (Exception ex)
{
Console.WriteLine($"❌ خطا در تولید گزارش: {ex.Message}");
}
}
// نمایش کتابهای دارای تأخیر
public void ShowOverdueBooks()
{
try
{
Console.WriteLine("\n⏰ کتابهای دارای تأخیر");
Console.WriteLine("═══════════════════════════════");
var overdueBooks = books.Where(b => b.IsOverdue()).ToList();
if (overdueBooks.Count == 0)
{
Console.WriteLine("✅ هیچ کتاب دارای تأخیری وجود ندارد!");
return;
}
Console.WriteLine($"📊 تعداد کتابهای دارای تأخیر: {overdueBooks.Count}");
Console.WriteLine("─────────────────────────────────────────────────────────────");
foreach (var book in overdueBooks.OrderBy(b => b.DueDate))
{
var member = members.FirstOrDefault(m => m.Id == book.BorrowedByMemberId);
int daysOverdue = (DateTime.Now - book.DueDate).Days;
decimal fine = book.CalculateFine(FinePerDay);
Console.WriteLine($"📖 {book.Title}");
Console.WriteLine($" 👤 امانتگیرنده: {member?.Name ?? "نامشخص"}");
Console.WriteLine($" 📅 تاریخ بازگشت: {book.DueDate:yyyy/MM/dd}");
Console.WriteLine($" ⏰ تأخیر: {daysOverdue} روز");
Console.WriteLine($" 💰 جریمه: {fine:N0} تومان");
Console.WriteLine();
}
LogActivity($"فهرست کتابهای دارای تأخیر مشاهده شد ({overdueBooks.Count} کتاب)");
}
catch (Exception ex)
{
Console.WriteLine($"❌ خطا در نمایش کتابهای دارای تأخیر: {ex.Message}");
}
}
#endregion
}
using System;
using System.IO;
class Program
{
static LibraryManager library = new LibraryManager();
static void Main(string[] args)
{
try
{
Console.OutputEncoding = System.Text.Encoding.UTF8;
Console.Title = "سیستم مدیریت کتابخانه";
ShowWelcomeMessage();
bool running = true;
while (running)
{
try
{
ShowMainMenu();
string choice = Console.ReadLine()?.Trim();
switch (choice)
{
case "1":
BookManagementMenu();
break;
case "2":
MemberManagementMenu();
break;
case "3":
BorrowingMenu();
break;
case "4":
ReportsMenu();
break;
case "5":
SystemMenu();
break;
case "0":
running = false;
ShowGoodbyeMessage();
break;
default:
Console.WriteLine("❌ گزینه نامعتبر! لطفاً دوباره تلاش کنید.");
break;
}
}
catch (Exception ex)
{
Console.WriteLine($"❌ خطا: {ex.Message}");
}
if (running)
{
Console.WriteLine("\n📌 برای ادامه Enter بزنید...");
Console.ReadLine();
Console.Clear();
}
}
}
catch (Exception ex)
{
Console.WriteLine($"❌ خطای سیستمی: {ex.Message}");
Console.WriteLine("برای خروج Enter بزنید...");
Console.ReadLine();
}
}
static void ShowWelcomeMessage()
{
Console.Clear();
Console.WriteLine("╔══════════════════════════════════════════════════════════════╗");
Console.WriteLine("║ 🏛️ سیستم مدیریت کتابخانه ║");
Console.WriteLine("║ نسخه پیشرفته 2.0 ║");
Console.WriteLine("╚══════════════════════════════════════════════════════════════╝");
Console.WriteLine();
Console.WriteLine("📚 خوش آمدید! سیستم در حال بارگذاری...");
// شبیهسازی بارگذاری
for (int i = 0; i <= 100; i += 20)
{
Console.Write($"\r⏳ بارگذاری: {i}%");
System.Threading.Thread.Sleep(300);
}
Console.WriteLine("\n✅ سیستم آماده است!");
Console.WriteLine("\nبرای ادامه Enter بزنید...");
Console.ReadLine();
Console.Clear();
}
static void ShowMainMenu()
{
Console.WriteLine("╔══════════════════════════════════════════════════════════════╗");
Console.WriteLine("║ 📋 منوی اصلی ║");
Console.WriteLine("╠══════════════════════════════════════════════════════════════╣");
Console.WriteLine("║ 1️⃣ 📚 مدیریت کتابها ║");
Console.WriteLine("║ 2️⃣ 👥 مدیریت اعضا ║");
Console.WriteLine("║ 3️⃣ 🔄 امانت و بازگشت ║");
Console.WriteLine("║ 4️⃣ 📊 گزارشها و آمار ║");
Console.WriteLine("║ 5️⃣ ⚙️ تنظیمات سیستم ║");
Console.WriteLine("║ 0️⃣ 🚪 خروج ║");
Console.WriteLine("╚══════════════════════════════════════════════════════════════╝");
Console.Write("🎯 انتخاب شما: ");
}
static void BookManagementMenu()
{
bool back = false;
while (!back)
{
Console.Clear();
Console.WriteLine("╔══════════════════════════════════════════════════════════════╗");
Console.WriteLine("║ 📚 مدیریت کتابها ║");
Console.WriteLine("╠══════════════════════════════════════════════════════════════╣");
Console.WriteLine("║ 1️⃣ ➕ اضافه کردن کتاب جدید ║");
Console.WriteLine("║ 2️⃣ 📋 نمایش همه کتابها ║");
Console.WriteLine("║ 3️⃣ 🔍 جستجوی کتاب ║");
Console.WriteLine("║ 4️⃣ ✏️ ویرایش کتاب ║");
Console.WriteLine("║ 5️⃣ 🗑️ حذف کتاب ║");
Console.WriteLine("║ 0️⃣ 🔙 بازگشت به منوی اصلی ║");
Console.WriteLine("╚══════════════════════════════════════════════════════════════╝");
Console.Write("🎯 انتخاب شما: ");
string choice = Console.ReadLine()?.Trim();
switch (choice)
{
case "1":
library.AddBook();
break;
case "2":
ShowBooksSubMenu();
break;
case "3":
library.SearchBooks();
break;
case "4":
EditBook();
break;
case "5":
DeleteBook();
break;
case "0":
back = true;
break;
default:
Console.WriteLine("❌ گزینه نامعتبر!");
break;
}
if (!back)
{
Console.WriteLine("\n📌 برای ادامه Enter بزنید...");
Console.ReadLine();
}
}
}
static void ShowBooksSubMenu()
{
Console.WriteLine("\n📚 نوع نمایش را انتخاب کنید:");
Console.WriteLine("1. همه کتابها");
Console.WriteLine("2. کتابهای موجود");
Console.WriteLine("3. کتابهای امانت داده شده");
Console.WriteLine("4. کتابهای معوقه");
Console.Write("انتخاب: ");
string choice = Console.ReadLine()?.Trim();
switch (choice)
{
case "1":
library.ShowAllBooks("all");
break;
case "2":
library.ShowAllBooks("available");
break;
case "3":
library.ShowAllBooks("borrowed");
break;
case "4":
library.ShowAllBooks("overdue");
break;
default:
library.ShowAllBooks("all");
break;
}
}
static void MemberManagementMenu()
{
bool back = false;
while (!back)
{
Console.Clear();
Console.WriteLine("╔══════════════════════════════════════════════════════════════╗");
Console.WriteLine("║ 👥 مدیریت اعضا ║");
Console.WriteLine("╠══════════════════════════════════════════════════════════════╣");
Console.WriteLine("║ 1️⃣ ➕ اضافه کردن عضو جدید ║");
Console.WriteLine("║ 2️⃣ 📋 نمایش همه اعضا ║");
Console.WriteLine("║ 3️⃣ ✏️ ویرایش اطلاعات عضو ║");
Console.WriteLine("║ 4️⃣ 💰 مدیریت جریمهها ║");
Console.WriteLine("║ 5️⃣ 📊 جزئیات عضو ║");
Console.WriteLine("║ 0️⃣ 🔙 بازگشت به منوی اصلی ║");
Console.WriteLine("╚══════════════════════════════════════════════════════════════╝");
Console.Write("🎯 انتخاب شما: ");
string choice = Console.ReadLine()?.Trim();
switch (choice)
{
case "1":
library.AddMember();
break;
case "2":
ShowMembersSubMenu();
break;
case "3":
EditMember();
break;
case "4":
ManageFines();
break;
case "5":
ShowMemberDetails();
break;
case "0":
back = true;
break;
default:
Console.WriteLine("❌ گزینه نامعتبر!");
break;
}
if (!back)
{
Console.WriteLine("\n📌 برای ادامه Enter بزنید...");
Console.ReadLine();
}
}
}
static void ShowMembersSubMenu()
{
Console.WriteLine("\n👥 نوع نمایش را انتخاب کنید:");
Console.WriteLine("1. همه اعضا");
Console.WriteLine("2. اعضای فعال");
Console.WriteLine("3. اعضای غیرفعال");
Console.WriteLine("4. اعضا با کتاب امانتی");
Console.WriteLine("5. اعضا با جریمه");
Console.Write("انتخاب: ");
string choice = Console.ReadLine()?.Trim();
switch (choice)
{
case "1":
library.ShowAllMembers("all");
break;
case "2":
library.ShowAllMembers("active");
break;
case "3":
library.ShowAllMembers("inactive");
break;
case "4":
library.ShowAllMembers("with_books");
break;
case "5":
library.ShowAllMembers("with_fines");
break;
default:
library.ShowAllMembers("all");
break;
}
}
static void BorrowingMenu()
{
bool back = false;
while (!back)
{
Console.Clear();
Console.WriteLine("╔══════════════════════════════════════════════════════════════╗");
Console.WriteLine("║ 🔄 امانت و بازگشت ║");
Console.WriteLine("╠══════════════════════════════════════════════════════════════╣");
Console.WriteLine("║ 1️⃣ 📤 امانت دادن کتاب ║");
Console.WriteLine("║ 2️⃣ 📥 بازگشت کتاب ║");
Console.WriteLine("║ 3️⃣ ⏰ کتابهای معوقه ║");
Console.WriteLine("║ 4️⃣ 📋 تاریخچه امانت ║");
Console.WriteLine("║ 0️⃣ 🔙 بازگشت به منوی اصلی ║");
Console.WriteLine("╚══════════════════════════════════════════════════════════════╝");
Console.Write("🎯 انتخاب شما: ");
string choice = Console.ReadLine()?.Trim();
switch (choice)
{
case "1":
library.BorrowBook();
break;
case "2":
library.ReturnBook();
break;
case "3":
library.ShowOverdueBooks();
break;
case "4":
ShowBorrowHistory();
break;
case "0":
back = true;
break;
default:
Console.WriteLine("❌ گزینه نامعتبر!");
break;
}
if (!back)
{
Console.WriteLine("\n📌 برای ادامه Enter بزنید...");
Console.ReadLine();
}
}
}
static void ReportsMenu()
{
bool back = false;
while (!back)
{
Console.Clear();
Console.WriteLine("╔══════════════════════════════════════════════════════════════╗");
Console.WriteLine("║ 📊 گزارشها و آمار ║");
Console.WriteLine("╠══════════════════════════════════════════════════════════════╣");
Console.WriteLine("║ 1️⃣ 📈 گزارش کلی کتابخانه ║");
Console.WriteLine("║ 2️⃣ 📚 جزئیات کتاب ║");
Console.WriteLine("║ 3️⃣ 👤 جزئیات عضو ║");
Console.WriteLine("║ 4️⃣ 💰 گزارش جریمهها ║");
Console.WriteLine("║ 5️⃣ 📋 آمار امانت ║");
Console.WriteLine("║ 0️⃣ 🔙 بازگشت به منوی اصلی ║");
Console.WriteLine("╚══════════════════════════════════════════════════════════════╝");
Console.Write("🎯 انتخاب شما: ");
string choice = Console.ReadLine()?.Trim();
switch (choice)
{
case "1":
library.ShowLibraryReport();
break;
case "2":
ShowBookDetails();
break;
case "3":
ShowMemberDetails();
break;
case "4":
ShowFinesReport();
break;
case "5":
ShowBorrowingStats();
break;
case "0":
back = true;
break;
default:
Console.WriteLine("❌ گزینه نامعتبر!");
break;
}
if (!back)
{
Console.WriteLine("\n📌 برای ادامه Enter بزنید...");
Console.ReadLine();
}
}
}
static void SystemMenu()
{
bool back = false;
while (!back)
{
Console.Clear();
Console.WriteLine("╔══════════════════════════════════════════════════════════════╗");
Console.WriteLine("║ ⚙️ تنظیمات سیستم ║");
Console.WriteLine("╠══════════════════════════════════════════════════════════════╣");
Console.WriteLine("║ 1️⃣ 💾 پشتیبانگیری دستی ║");
Console.WriteLine("║ 2️⃣ 📂 مشاهده فایلهای سیستم ║");
Console.WriteLine("║ 3️⃣ 🔧 تنظیمات جریمه ║");
Console.WriteLine("║ 4️⃣ 📊 اطلاعات سیستم ║");
Console.WriteLine("║ 5️⃣ 🗂️ مشاهده لاگها ║");
Console.WriteLine("║ 0️⃣ 🔙 بازگشت به منوی اصلی ║");
Console.WriteLine("╚══════════════════════════════════════════════════════════════╝");
Console.Write("🎯 انتخاب شما: ");
string choice = Console.ReadLine()?.Trim();
switch (choice)
{
case "1":
CreateManualBackup();
break;
case "2":
ShowSystemFiles();
break;
case "3":
ConfigureFineSettings();
break;
case "4":
ShowSystemInfo();
break;
case "5":
ShowLogs();
break;
case "0":
back = true;
break;
default:
Console.WriteLine("❌ گزینه نامعتبر!");
break;
}
if (!back)
{
Console.WriteLine("\n📌 برای ادامه Enter بزنید...");
Console.ReadLine();
}
}
}
static void ShowGoodbyeMessage()
{
Console.Clear();
Console.WriteLine("╔══════════════════════════════════════════════════════════════╗");
Console.WriteLine("║ 👋 خداحافظ! ║");
Console.WriteLine("║ ║");
Console.WriteLine("║ از استفاده از سیستم متشکریم! 🙏 ║");
Console.WriteLine("║ ║");
Console.WriteLine("║ تا دیدار مجدد! 😊 ║");
Console.WriteLine("╚══════════════════════════════════════════════════════════════╝");
// ذخیره خودکار قبل از خروج
Console.WriteLine("\n💾 در حال ذخیره دادهها...");
library.SaveData();
Console.WriteLine("✅ دادهها با موفقیت ذخیره شد!");
Console.WriteLine("\nبرای خروج Enter بزنید...");
Console.ReadLine();
}
// متدهای کمکی برای عملکردهای اضافی
static void EditBook()
{
Console.WriteLine("🔧 این قابلیت در نسخههای آینده اضافه خواهد شد.");
}
static void DeleteBook()
{
Console.WriteLine("🗑️ این قابلیت در نسخههای آینده اضافه خواهد شد.");
}
static void EditMember()
{
Console.WriteLine("✏️ این قابلیت در نسخههای آینده اضافه خواهد شد.");
}
static void ManageFines()
{
Console.WriteLine("💰 این قابلیت در نسخههای آینده اضافه خواهد شد.");
}
static void ShowMemberDetails()
{
Console.WriteLine("👤 این قابلیت در نسخههای آینده اضافه خواهد شد.");
}
static void ShowBorrowHistory()
{
Console.WriteLine("📋 این قابلیت در نسخههای آینده اضافه خواهد شد.");
}
static void ShowBookDetails()
{
Console.WriteLine("📚 این قابلیت در نسخههای آینده اضافه خواهد شد.");
}
static void ShowFinesReport()
{
Console.WriteLine("💰 این قابلیت در نسخههای آینده اضافه خواهد شد.");
}
static void ShowBorrowingStats()
{
Console.WriteLine("📊 این قابلیت در نسخههای آینده اضافه خواهد شد.");
}
static void CreateManualBackup()
{
try
{
Console.WriteLine("💾 در حال ایجاد پشتیبان...");
// شبیهسازی پشتیبانگیری
string backupName = $"backup_{DateTime.Now:yyyyMMdd_HHmmss}";
Console.WriteLine($"✅ پشتیبان با نام '{backupName}' ایجاد شد!");
}
catch (Exception ex)
{
Console.WriteLine($"❌ خطا در ایجاد پشتیبان: {ex.Message}");
}
}
static void ShowSystemFiles()
{
Console.WriteLine("📂 فایلهای سیستم:");
Console.WriteLine("• books.json - اطلاعات کتابها");
Console.WriteLine("• members.json - اطلاعات اعضا");
Console.WriteLine("• library.log - لاگ فعالیتها");
Console.WriteLine("• backups/ - پوشه پشتیبانها");
}
static void ConfigureFineSettings()
{
Console.WriteLine("🔧 تنظیمات جریمه:");
Console.WriteLine($"• جریمه روزانه: {library.FinePerDay} تومان");
Console.WriteLine("• برای تغییر این مقدار، کد برنامه را ویرایش کنید.");
}
static void ShowSystemInfo()
{
Console.WriteLine("📊 اطلاعات سیستم:");
Console.WriteLine($"• نسخه: 2.0");
Console.WriteLine($"• تاریخ اجرا: {DateTime.Now:yyyy/MM/dd HH:mm:ss}");
Console.WriteLine($"• سیستم عامل: {Environment.OSVersion}");
Console.WriteLine($"• مسیر برنامه: {Environment.CurrentDirectory}");
}
static void ShowLogs()
{
try
{
string logFile = "library.log";
if (File.Exists(logFile))
{
Console.WriteLine("🗂️ آخرین فعالیتها:");
string[] lines = File.ReadAllLines(logFile);
int startIndex = Math.Max(0, lines.Length - 10);
for (int i = startIndex; i < lines.Length; i++)
{
Console.WriteLine($"• {lines[i]}");
}
}
else
{
Console.WriteLine("📝 هنوز فعالیتی ثبت نشده است.");
}
}
catch (Exception ex)
{
Console.WriteLine($"❌ خطا در خواندن لاگ: {ex.Message}");
}
}
}
💪 تمرینهای پیشرفته: توسعه سیستم مدیریت کتابخانه
🎯 تمرین 1: سیستم رزرو کتاب
هدف: اضافه کردن قابلیت رزرو کتابهای امانت داده شده
- ایجاد کلاس
BookReservationبا خصوصیات رزرو - اضافه کردن صف انتظار برای هر کتاب
- اطلاعرسانی خودکار هنگام آزاد شدن کتاب
- مدیریت اولویت رزرو بر اساس تاریخ درخواست
💡 راهنمایی:
- از
Queue<BookReservation>برای صف انتظار استفاده کنید - هنگام بازگشت کتاب، اولین نفر در صف را اطلاعرسانی کنید
- رزرو را با مهلت زمانی محدود کنید (مثلاً 3 روز)
🎯 تمرین 2: سیستم امتیازدهی و پیشنهاد
هدف: اضافه کردن سیستم امتیازدهی و پیشنهاد کتاب
- امکان امتیازدهی به کتابها (1 تا 5 ستاره)
- نظرات و کامنتهای اعضا
- پیشنهاد کتاب بر اساس سابقه مطالعه
- فهرست پرطرفدارترین کتابها
💡 راهنمایی:
- کلاس
BookRatingبرای امتیازات ایجاد کنید - از الگوریتمهای ساده برای پیشنهاد استفاده کنید
- میانگین امتیازات را محاسبه و نمایش دهید
🎯 تمرین 3: گزارشگیری پیشرفته و آمار
هدف: ایجاد سیستم گزارشگیری جامع
- گزارش فعالیت روزانه، هفتگی، ماهانه
- آمار محبوبترین کتابها و نویسندگان
- تحلیل رفتار اعضا (فعالترین اعضا، بیشترین تأخیر)
- پیشبینی تقاضا برای کتابهای جدید
- صادرات گزارشها به فرمتهای مختلف (CSV, PDF)
💡 راهنمایی:
- از
LINQبرای تحلیل دادهها استفاده کنید - کلاس
ReportGeneratorبرای تولید گزارشها - از
StringBuilderبرای ساخت گزارشهای متنی - الگوی Strategy برای انواع مختلف گزارش
🎯 تمرین 4: سیستم اطلاعرسانی و یادآوری
هدف: پیادهسازی سیستم اطلاعرسانی خودکار
- یادآوری سررسید امانت (2 روز قبل از انقضا)
- اطلاعرسانی آزاد شدن کتاب رزرو شده
- اعلان کتابهای جدید بر اساس علایق
- گزارش جریمههای معوقه
💡 راهنمایی:
- از الگوی Observer برای اطلاعرسانی استفاده کنید
- کلاس
NotificationServiceایجاد کنید - از
Timerبرای بررسیهای دورهای - انواع مختلف اطلاعرسانی (ایمیل، SMS، داخلی)
🎯 تمرین 5: بهینهسازی و عملکرد
هدف: بهبود عملکرد و مقیاسپذیری سیستم
- پیادهسازی Cache برای جستجوهای پرتکرار
- ایندکسگذاری برای جستجوی سریع
- بارگذاری تنبل (Lazy Loading) برای دادههای بزرگ
- پردازش موازی برای عملیات سنگین
- مدیریت حافظه و منابع
💡 راهنمایی:
- از
Dictionaryبرای Cache استفاده کنید Task.Run()برای پردازش موازی- الگوی Singleton برای مدیریت Cache
- از
usingبرای مدیریت منابع
🏆 چالش نهایی: سیستم کامل مدیریت کتابخانه
تمام قابلیتهای بالا را در یک سیستم یکپارچه ترکیب کنید:
- معماری لایهای (Data, Business, Presentation)
- الگوهای طراحی مناسب (Repository, Factory, Observer)
- مدیریت خطا و لاگگیری جامع
- تست واحد برای بخشهای مهم
- رابط کاربری بهتر با منوهای تعاملی
- پیکربندی سیستم از طریق فایل تنظیمات
📋 معیارهای موفقیت:
- ✅ سیستم بدون خطا اجرا شود
- ✅ تمام قابلیتها کامل پیادهسازی شده باشند
- ✅ کد تمیز و قابل نگهداری باشد
- ✅ عملکرد مناسب با حجم داده بالا
- ✅ رابط کاربری دوستانه و آسان
🛠️ نکات پیادهسازی:
📁 ساختار پروژه:
- • Models/ - کلاسهای مدل
- • Services/ - منطق کسبوکار
- • Data/ - مدیریت داده
- • Utils/ - ابزارهای کمکی
🔧 ابزارهای مفید:
- • Newtonsoft.Json برای JSON
- • System.IO برای فایلها
- • System.Threading برای Timer
- • System.Linq برای تحلیل
📊 مدیریت داده:
- • فایلهای JSON جداگانه
- • پشتیبانگیری منظم
- • اعتبارسنجی دادهها
- • مدیریت همزمانی
🎨 رابط کاربری:
- • منوهای سلسلهمراتبی
- • پیامهای واضح
- • اعتبارسنجی ورودی
- • راهنمای کاربر
آفرین! پروژه کنسولی تموم شد! 🎉
شما با موفقیت یک سیستم مدیریت کتابخانه کامل ساختین! حالا برای Windows Forms آمادهای؟