master
student 2026-06-10 02:56:19 +10:00
parent 8feb1afc41
commit 4b66724b9b
63 changed files with 2533 additions and 1999 deletions

View File

@ -2,8 +2,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="CourseProject1125.App"
xmlns:local="using:CourseProject1125"
RequestedThemeVariant="Default">
<!-- "Default" ThemeVariant follows system theme variant. "Dark" or "Light" are other available options. -->
RequestedThemeVariant="Light">
<Application.DataTemplates>
<local:ViewLocator/>

View File

@ -33,10 +33,7 @@ public partial class App : Application
// Avoid duplicate validations from both Avalonia and the CommunityToolkit.
// More info: https://docs.avaloniaui.net/docs/guides/development-guides/data-validation#manage-validationplugins
DisableAvaloniaDataAnnotationValidation();
desktop.MainWindow = new MainWindow
{
DataContext = new MainWindowViewModel(),
};
desktop.MainWindow = new MainWindow();
}
base.OnFrameworkInitializationCompleted();

View File

@ -3,5 +3,5 @@ namespace CourseProject1125.DB;
public class Connection
{
public static string ConnectionString =
@"server=127.0.0.1; userid=root; password=; database=courseproject1125; port=3306; characterset=utf8";
@"server=192.168.200.13; userid=student; password=student; database=1125_CourseSolop; port=3306; characterset=utf8; Convert Zero Datetime=True";
}

View File

@ -517,8 +517,8 @@ public static class DatabaseService
FROM loans l
JOIN book_copies c ON l.copy_id = c.id
JOIN books b ON c.book_id = b.id
JOIN users r ON l.reader_id = r.id
JOIN users lib ON l.librarian_id = lib.id
LEFT JOIN users r ON l.reader_id = r.id
LEFT JOIN users lib ON l.librarian_id = lib.id
ORDER BY l.issue_date DESC";
using var cmd = new MySqlCommand(sql, conn);
using var reader = cmd.ExecuteReader();
@ -542,19 +542,19 @@ public static class DatabaseService
var readerUser = new User
{
Id = Convert.ToInt32(reader["reader_id"]),
Full_name = reader["reader_name"].ToString() ?? "",
Email = reader["reader_email"].ToString() ?? ""
Id = reader["reader_id"] != DBNull.Value ? Convert.ToInt32(reader["reader_id"]) : 0,
Full_name = reader["reader_name"]?.ToString() ?? "",
Email = reader["reader_email"]?.ToString() ?? ""
};
var librarianUser = new User
{
Id = Convert.ToInt32(reader["librarian_id"]),
Full_name = reader["librarian_name"].ToString() ?? ""
Id = reader["librarian_id"] != DBNull.Value ? Convert.ToInt32(reader["librarian_id"]) : 0,
Full_name = reader["librarian_name"]?.ToString() ?? ""
};
var returnDateVal = reader["return_date"];
DateTime retDate = DateTime.MinValue;
DateTime? retDate = null;
if (returnDateVal != DBNull.Value)
{
// Check if it's '0000-00-00 00:00:00' or default MySQL empty timestamp
@ -612,6 +612,18 @@ public static class DatabaseService
cmdUpdate.Parameters.AddWithValue("@copyId", copyId);
cmdUpdate.ExecuteNonQuery();
// 3. Deactivate reservation for this reader for the issued book if it exists
string sqlDeactivateReservation = @"
UPDATE reservations
SET is_active = 0
WHERE reader_id = @readerId
AND is_active = 1
AND book_id = (SELECT book_id FROM book_copies WHERE id = @copyId LIMIT 1)";
using var cmdDeactivateRes = new MySqlCommand(sqlDeactivateReservation, conn, tr);
cmdDeactivateRes.Parameters.AddWithValue("@readerId", readerId);
cmdDeactivateRes.Parameters.AddWithValue("@copyId", copyId);
cmdDeactivateRes.ExecuteNonQuery();
tr.Commit();
return true;
}
@ -623,6 +635,24 @@ public static class DatabaseService
}
}
public static bool RequestBookReturn(int loanId)
{
try
{
using var conn = GetConnection();
conn.Open();
string sql = "UPDATE loans SET status = 'pending_return' WHERE id = @loanId";
using var cmd = new MySqlCommand(sql, conn);
cmd.Parameters.AddWithValue("@loanId", loanId);
return cmd.ExecuteNonQuery() > 0;
}
catch (Exception ex)
{
Console.WriteLine("Error in RequestBookReturn: " + ex.Message);
return false;
}
}
public static decimal ReturnLoan(int loanId, DateTime returnDate)
{
MySqlTransaction? tr = null;
@ -712,12 +742,13 @@ public static class DatabaseService
string sql = @"
SELECT f.id, f.loan_id, f.amount, f.is_paid, f.created_at,
b.title AS book_title, r.full_name AS reader_name,
l.issue_date, l.due_date, l.return_date, l.status AS loan_status
l.issue_date, l.due_date, l.return_date, l.status AS loan_status,
l.reader_id
FROM fines f
JOIN loans l ON f.loan_id = l.id
JOIN book_copies c ON l.copy_id = c.id
JOIN books b ON c.book_id = b.id
JOIN users r ON l.reader_id = r.id
LEFT JOIN loans l ON f.loan_id = l.id
LEFT JOIN book_copies c ON l.copy_id = c.id
LEFT JOIN books b ON c.book_id = b.id
LEFT JOIN users r ON l.reader_id = r.id
ORDER BY f.created_at DESC";
using var cmd = new MySqlCommand(sql, conn);
using var reader = cmd.ExecuteReader();
@ -725,7 +756,7 @@ public static class DatabaseService
{
var book = new Book
{
Title = reader["book_title"].ToString() ?? ""
Title = reader["book_title"]?.ToString() ?? ""
};
var copy = new Book_copies
@ -735,11 +766,12 @@ public static class DatabaseService
var readerUser = new User
{
Full_name = reader["reader_name"].ToString() ?? ""
Id = reader["reader_id"] != DBNull.Value ? Convert.ToInt32(reader["reader_id"]) : 0,
Full_name = reader["reader_name"]?.ToString() ?? ""
};
var returnDateVal = reader["return_date"];
DateTime retDate = DateTime.MinValue;
DateTime? retDate = null;
if (returnDateVal != DBNull.Value)
{
string strVal = returnDateVal.ToString() ?? "";
@ -751,10 +783,10 @@ public static class DatabaseService
var loan = new Loan
{
Id = Convert.ToInt32(reader["loan_id"]),
Status = reader["loan_status"].ToString() ?? "",
Issue_date = Convert.ToDateTime(reader["issue_date"]),
Due_date = Convert.ToDateTime(reader["due_date"]),
Id = reader["loan_id"] != DBNull.Value ? Convert.ToInt32(reader["loan_id"]) : 0,
Status = reader["loan_status"]?.ToString() ?? "",
Issue_date = reader["issue_date"] != DBNull.Value ? Convert.ToDateTime(reader["issue_date"]) : DateTime.MinValue,
Due_date = reader["due_date"] != DBNull.Value ? Convert.ToDateTime(reader["due_date"]) : DateTime.MinValue,
Return_date = retDate,
CopyId = copy,
ReaderId = readerUser

View File

@ -7,5 +7,11 @@ public class Book_copies
public string Status { get; set; }
public string Shelf_location { get; set; }
public Book BookId { get; set; }
public string StatusText => Status switch
{
"available" => "Доступна",
"issued" => "Выдана",
"repair" => "В ремонте",
_ => Status
};
}

View File

@ -9,4 +9,5 @@ public class Fine
public int Is_paid { get; set; }
public DateTime Created_at { get; set; }
public Loan LoanId { get; set; }
public string StatusText => Is_paid == 1 ? "Оплачен" : "Не оплачен";
}

View File

@ -8,9 +8,15 @@ public class Loan
public string Status { get; set; }
public DateTime Issue_date { get; set; }
public DateTime Due_date { get; set; }
public DateTime Return_date { get; set; }
public DateTime? Return_date { get; set; }
public Book_copies CopyId { get; set; }
public User ReaderId { get; set; }
public User LibrarianId { get; set; }
public string StatusText => Status switch
{
"active" => "На руках",
"pending_return" => "Ожидает возврата",
"returned" => "Возвращена",
_ => Status
};
}

View File

@ -10,20 +10,15 @@ namespace CourseProject1125;
sealed class Program
{
// Initialization code. Don't use any Avalonia, third-party APIs or any
// SynchronizationContext-reliant code before AppMain is called: things aren't initialized
// yet and stuff might break.
[STAThread]
public static void Main(string[] args)
{
var host = Host.CreateDefaultBuilder(args) // Добавили args для порядка
// --- ДОБАВЬ ЭТОТ БЛОК ---
var host = Host.CreateDefaultBuilder(args)
.ConfigureLogging(logging =>
{
logging.ClearProviders(); // Удаляет EventLog, который не работает на Linux
logging.AddConsole(); // Оставляет вывод в консоль
logging.ClearProviders();
logging.AddConsole();
})
// ------------------------
.ConfigureAppConfiguration((context, config) =>
{
config.SetBasePath(AppContext.BaseDirectory)
@ -39,11 +34,46 @@ sealed class Program
}
}).Build();
if (args.Length > 0 && args[0] == "--diagnose")
{
RunDiagnostics();
return;
}
BuildAvaloniaApp(host.Services)
.StartWithClassicDesktopLifetime(args);
}
// Avalonia configuration, don't remove; also used by visual designer.
private static void RunDiagnostics()
{
try
{
Console.WriteLine("=== DIAGNOSTICS START ===");
using var conn = new MySqlConnector.MySqlConnection(Connection.ConnectionString);
conn.Open();
Console.WriteLine("Connected to database successfully!");
Console.WriteLine("Printing all users...");
var users = DatabaseService.GetUsers();
foreach (var u in users)
{
Console.WriteLine($"- User: {u.Login}, Pass: {u.Password_hash}, RoleId: {u.RoleId?.id} ({u.RoleId?.Name})");
}
Console.WriteLine("Testing DatabaseService.GetLoans()...");
var loans = DatabaseService.GetLoans();
Console.WriteLine($"GetLoans returned {loans.Count} loans.");
foreach (var l in loans)
{
Console.WriteLine($"- Loan ID: {l.Id}, Book: {l.CopyId?.BookId?.Title}, Reader: {l.ReaderId?.Full_name} (ID: {l.ReaderId?.Id}), Status: {l.Status}");
}
}
catch (Exception ex)
{
Console.WriteLine("Diagnostics error: " + ex);
}
}
public static AppBuilder BuildAvaloniaApp(IServiceProvider hostServices)
=> AppBuilder.Configure(() => new App(hostServices))
.UsePlatformDetect()

View File

@ -0,0 +1,708 @@
using System;
using System.Collections.Generic;
using System.Linq;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using CourseProject1125.DB;
using CourseProject1125.Models;
namespace CourseProject1125.ViewModels
{
public class PopularBookItem
{
public string Title { get; set; } = string.Empty;
public int BorrowCount { get; set; }
}
public class OverdueLoanItem
{
public string Title { get; set; } = string.Empty;
public string Reader { get; set; } = string.Empty;
public string IssueDate { get; set; } = string.Empty;
public string DueDate { get; set; } = string.Empty;
public int OverdueDays { get; set; }
}
public partial class AdminWindowViewModel : ViewModelBase
{
private List<Author> _allAuthors = new();
private List<Book> _allBooks = new();
private List<Role> _allRoles = new();
public Action? OnLogoutRequested { get; set; }
public string AdminName => UserSession.UserName;
[ObservableProperty]
[NotifyPropertyChangedFor(nameof(BooksTabBackground), nameof(BooksTabForeground), nameof(IsBooksVisible))]
[NotifyPropertyChangedFor(nameof(AuthorsTabBackground), nameof(AuthorsTabForeground), nameof(IsAuthorsVisible))]
[NotifyPropertyChangedFor(nameof(CopiesTabBackground), nameof(CopiesTabForeground), nameof(IsCopiesVisible))]
[NotifyPropertyChangedFor(nameof(UsersTabBackground), nameof(UsersTabForeground), nameof(IsUsersVisible))]
[NotifyPropertyChangedFor(nameof(ReportsTabBackground), nameof(ReportsTabForeground), nameof(IsReportsVisible))]
private string _currentTab = "Books";
[ObservableProperty] private string _activeTabHeader = "Управление книгами";
public string BooksTabBackground => CurrentTab == "Books" ? "LightGray" : "Transparent";
public string BooksTabForeground => CurrentTab == "Books" ? "Black" : "Gray";
public bool IsBooksVisible => CurrentTab == "Books";
public string AuthorsTabBackground => CurrentTab == "Authors" ? "LightGray" : "Transparent";
public string AuthorsTabForeground => CurrentTab == "Authors" ? "Black" : "Gray";
public bool IsAuthorsVisible => CurrentTab == "Authors";
public string CopiesTabBackground => CurrentTab == "Copies" ? "LightGray" : "Transparent";
public string CopiesTabForeground => CurrentTab == "Copies" ? "Black" : "Gray";
public bool IsCopiesVisible => CurrentTab == "Copies";
public string UsersTabBackground => CurrentTab == "Users" ? "LightGray" : "Transparent";
public string UsersTabForeground => CurrentTab == "Users" ? "Black" : "Gray";
public bool IsUsersVisible => CurrentTab == "Users";
public string ReportsTabBackground => CurrentTab == "Reports" ? "LightGray" : "Transparent";
public string ReportsTabForeground => CurrentTab == "Reports" ? "Black" : "Gray";
public bool IsReportsVisible => CurrentTab == "Reports";
[ObservableProperty] private List<Author> _authorsList = new();
[ObservableProperty] private Author? _selectedAuthor;
[ObservableProperty] private string _authorName = string.Empty;
[ObservableProperty] private string _authorStatus = string.Empty;
[ObservableProperty] private string _authorStatusColor = "Black";
[ObservableProperty] private List<Book> _booksList = new();
[ObservableProperty] private Book? _selectedBook;
[ObservableProperty] private string _bookTitle = string.Empty;
[ObservableProperty] private string _searchBookAuthorText = string.Empty;
[ObservableProperty] private List<Author> _filteredBookAuthors = new();
[ObservableProperty] private Author? _selectedBookAuthor;
[ObservableProperty] private string _bookIsbn = string.Empty;
[ObservableProperty] private string _bookYear = string.Empty;
[ObservableProperty] private string _bookDesc = string.Empty;
[ObservableProperty] private string _bookStatus = string.Empty;
[ObservableProperty] private string _bookStatusColor = "Black";
[ObservableProperty] private List<Book_copies> _copiesList = new();
[ObservableProperty] private Book_copies? _selectedCopy;
[ObservableProperty] private string _searchCopyBookText = string.Empty;
[ObservableProperty] private List<Book> _filteredCopyBooks = new();
[ObservableProperty] private Book? _selectedCopyBook;
[ObservableProperty] private string _copyInv = string.Empty;
[ObservableProperty] private string _copyStatusField = string.Empty;
[ObservableProperty] private string _copyShelf = string.Empty;
[ObservableProperty] private string _copyStatus = string.Empty;
[ObservableProperty] private string _copyStatusColor = "Black";
[ObservableProperty] private List<User> _usersList = new();
[ObservableProperty] private User? _selectedUser;
[ObservableProperty] private string _userFullName = string.Empty;
[ObservableProperty] private string _searchUserRoleText = string.Empty;
[ObservableProperty] private List<Role> _filteredUserRoles = new();
[ObservableProperty] private Role? _selectedUserRole;
[ObservableProperty] private string _userLogin = string.Empty;
[ObservableProperty] private string _userPass = string.Empty;
[ObservableProperty] private string _userEmail = string.Empty;
[ObservableProperty] private string _userPhone = string.Empty;
[ObservableProperty] private string _userStatus = string.Empty;
[ObservableProperty] private string _userStatusColor = "Black";
[ObservableProperty] private string _finesCollected = "0.00 руб.";
[ObservableProperty] private string _finesUnpaid = "0.00 руб.";
[ObservableProperty] private List<PopularBookItem> _popularBooksList = new();
[ObservableProperty] private List<OverdueLoanItem> _overdueLoansList = new();
public AdminWindowViewModel()
{
LoadAllData();
ShowTab("Books");
}
private void LoadAllData()
{
RefreshAuthors();
RefreshBooks();
RefreshCopies();
RefreshUsers();
RefreshReports();
}
[RelayCommand]
private void ShowTab(string tabName)
{
CurrentTab = tabName;
switch (tabName)
{
case "Books":
ActiveTabHeader = "Управление книгами";
RefreshBooks();
break;
case "Authors":
ActiveTabHeader = "Управление авторами";
RefreshAuthors();
break;
case "Copies":
ActiveTabHeader = "Управление экземплярами";
RefreshCopies();
break;
case "Users":
ActiveTabHeader = "Управление пользователями";
RefreshUsers();
break;
case "Reports":
ActiveTabHeader = "Аналитические отчеты";
RefreshReports();
break;
}
}
[RelayCommand]
private void Logout()
{
OnLogoutRequested?.Invoke();
}
private void RefreshAuthors()
{
_allAuthors = DatabaseService.GetAuthors();
AuthorsList = _allAuthors;
FilterBookAuthors();
}
partial void OnSelectedAuthorChanged(Author? value)
{
if (value != null)
{
AuthorName = value.Name;
}
}
[RelayCommand]
private void AddAuthor()
{
string name = AuthorName?.Trim() ?? string.Empty;
if (string.IsNullOrEmpty(name))
{
AuthorStatusColor = "Red";
AuthorStatus = "Имя автора не может быть пустым.";
return;
}
if (DatabaseService.AddAuthor(name))
{
RefreshAuthors();
ClearAuthor();
AuthorStatusColor = "Green";
AuthorStatus = "Автор добавлен!";
}
else
{
AuthorStatusColor = "Red";
AuthorStatus = "Ошибка добавления автора.";
}
}
[RelayCommand]
private void EditAuthor()
{
if (SelectedAuthor == null)
{
AuthorStatusColor = "Red";
AuthorStatus = "Выберите автора для редактирования.";
return;
}
string name = AuthorName?.Trim() ?? string.Empty;
if (string.IsNullOrEmpty(name)) return;
if (DatabaseService.UpdateAuthor(SelectedAuthor.Id, name))
{
RefreshAuthors();
ClearAuthor();
AuthorStatusColor = "Green";
AuthorStatus = "Автор обновлен!";
}
else
{
AuthorStatusColor = "Red";
AuthorStatus = "Ошибка обновления автора.";
}
}
[RelayCommand]
private void DeleteAuthor()
{
if (SelectedAuthor == null) return;
if (DatabaseService.DeleteAuthor(SelectedAuthor.Id))
{
RefreshAuthors();
ClearAuthor();
AuthorStatusColor = "Green";
AuthorStatus = "Автор удален!";
}
else
{
AuthorStatusColor = "Red";
AuthorStatus = "Ошибка удаления автора (возможно, он связан с книгами).";
}
}
[RelayCommand]
private void ClearAuthor()
{
SelectedAuthor = null;
AuthorName = string.Empty;
AuthorStatus = string.Empty;
}
private void RefreshBooks()
{
_allBooks = DatabaseService.GetBooks();
BooksList = _allBooks;
FilterCopyBooks();
}
partial void OnSearchBookAuthorTextChanged(string value)
{
FilterBookAuthors();
}
private void FilterBookAuthors()
{
string filter = SearchBookAuthorText?.Trim() ?? string.Empty;
if (string.IsNullOrEmpty(filter))
{
FilteredBookAuthors = _allAuthors.Take(20).ToList();
}
else
{
FilteredBookAuthors = _allAuthors.Where(a =>
a.Name.Contains(filter, StringComparison.OrdinalIgnoreCase)
).ToList();
}
}
partial void OnSelectedBookChanged(Book? value)
{
if (value != null)
{
BookTitle = value.Title;
BookIsbn = value.Isbn;
BookYear = value.Year_published.ToString();
BookDesc = value.Description;
SearchBookAuthorText = value.AuthorId?.Name ?? string.Empty;
SelectedBookAuthor = _allAuthors.FirstOrDefault(a => a.Id == value.AuthorId?.Id);
}
}
[RelayCommand]
private void AddBook()
{
string title = BookTitle?.Trim() ?? string.Empty;
string isbn = BookIsbn?.Trim() ?? string.Empty;
string desc = BookDesc?.Trim() ?? string.Empty;
int.TryParse(BookYear?.Trim(), out int year);
var author = SelectedBookAuthor;
if (string.IsNullOrEmpty(title))
{
BookStatusColor = "Red";
BookStatus = "Название книги не может быть пустым.";
return;
}
if (author == null)
{
BookStatusColor = "Red";
BookStatus = "Выберите автора из списка (введите имя для поиска).";
return;
}
if (DatabaseService.AddBook(title, isbn, desc, year, author.Id))
{
RefreshBooks();
ClearBook();
BookStatusColor = "Green";
BookStatus = "Книга добавлена!";
}
else
{
BookStatusColor = "Red";
BookStatus = "Ошибка добавления (проверьте ISBN на уникальность).";
}
}
[RelayCommand]
private void EditBook()
{
if (SelectedBook == null)
{
BookStatusColor = "Red";
BookStatus = "Выберите книгу для редактирования.";
return;
}
string title = BookTitle?.Trim() ?? string.Empty;
string isbn = BookIsbn?.Trim() ?? string.Empty;
string desc = BookDesc?.Trim() ?? string.Empty;
int.TryParse(BookYear?.Trim(), out int year);
var author = SelectedBookAuthor;
if (string.IsNullOrEmpty(title) || author == null)
{
BookStatusColor = "Red";
BookStatus = "Заполните название и выберите автора.";
return;
}
if (DatabaseService.UpdateBook(SelectedBook.Id, title, isbn, desc, year, author.Id))
{
RefreshBooks();
ClearBook();
BookStatusColor = "Green";
BookStatus = "Книга обновлена!";
}
else
{
BookStatusColor = "Red";
BookStatus = "Ошибка обновления книги.";
}
}
[RelayCommand]
private void DeleteBook()
{
if (SelectedBook == null) return;
if (DatabaseService.DeleteBook(SelectedBook.Id))
{
RefreshBooks();
ClearBook();
BookStatusColor = "Green";
BookStatus = "Книга удалена!";
}
else
{
BookStatusColor = "Red";
BookStatus = "Ошибка удаления книги (возможно, есть выданные экземпляры).";
}
}
[RelayCommand]
private void ClearBook()
{
SelectedBook = null;
BookTitle = string.Empty;
BookIsbn = string.Empty;
BookYear = string.Empty;
BookDesc = string.Empty;
SearchBookAuthorText = string.Empty;
SelectedBookAuthor = null;
BookStatus = string.Empty;
}
private void RefreshCopies()
{
CopiesList = DatabaseService.GetBookCopies();
}
partial void OnSearchCopyBookTextChanged(string value)
{
FilterCopyBooks();
}
private void FilterCopyBooks()
{
string filter = SearchCopyBookText?.Trim() ?? string.Empty;
if (string.IsNullOrEmpty(filter))
{
FilteredCopyBooks = _allBooks.Take(20).ToList();
}
else
{
FilteredCopyBooks = _allBooks.Where(b =>
b.Title.Contains(filter, StringComparison.OrdinalIgnoreCase) ||
(b.AuthorId?.Name != null && b.AuthorId.Name.Contains(filter, StringComparison.OrdinalIgnoreCase))
).ToList();
}
}
partial void OnSelectedCopyChanged(Book_copies? value)
{
if (value != null)
{
CopyInv = value.Inventory_number ?? string.Empty;
CopyShelf = value.Shelf_location ?? string.Empty;
CopyStatusField = value.Status ?? string.Empty;
SearchCopyBookText = value.BookId?.Title ?? string.Empty;
SelectedCopyBook = _allBooks.FirstOrDefault(b => b.Id == value.BookId?.Id);
}
}
[RelayCommand]
private void AddCopy()
{
var book = SelectedCopyBook;
string inv = CopyInv?.Trim() ?? string.Empty;
string shelf = CopyShelf?.Trim() ?? string.Empty;
string status = CopyStatusField?.Trim() ?? "available";
if (string.IsNullOrEmpty(status)) status = "available";
if (book == null)
{
CopyStatusColor = "Red";
CopyStatus = "Выберите книгу из списка (введите название для поиска).";
return;
}
if (string.IsNullOrEmpty(inv))
{
CopyStatusColor = "Red";
CopyStatus = "Инвентарный номер обязателен.";
return;
}
if (DatabaseService.AddBookCopy(book.Id, inv, status, shelf))
{
RefreshCopies();
ClearCopy();
CopyStatusColor = "Green";
CopyStatus = "Экземпляр добавлен!";
}
else
{
CopyStatusColor = "Red";
CopyStatus = "Ошибка добавления (проверьте уникальность инв. номера).";
}
}
[RelayCommand]
private void EditCopy()
{
if (SelectedCopy == null)
{
CopyStatusColor = "Red";
CopyStatus = "Выберите экземпляр для редактирования.";
return;
}
var book = SelectedCopyBook;
string inv = CopyInv?.Trim() ?? string.Empty;
string shelf = CopyShelf?.Trim() ?? string.Empty;
string status = CopyStatusField?.Trim() ?? "available";
if (string.IsNullOrEmpty(status)) status = "available";
if (book == null || string.IsNullOrEmpty(inv))
{
CopyStatusColor = "Red";
CopyStatus = "Выберите книгу и заполните инв. номер.";
return;
}
if (DatabaseService.UpdateBookCopy(SelectedCopy.Id, book.Id, inv, status, shelf))
{
RefreshCopies();
ClearCopy();
CopyStatusColor = "Green";
CopyStatus = "Экземпляр обновлен!";
}
else
{
CopyStatusColor = "Red";
CopyStatus = "Ошибка обновления.";
}
}
[RelayCommand]
private void DeleteCopy()
{
if (SelectedCopy == null) return;
if (DatabaseService.DeleteBookCopy(SelectedCopy.Id))
{
RefreshCopies();
ClearCopy();
CopyStatusColor = "Green";
CopyStatus = "Экземпляр удален!";
}
else
{
CopyStatusColor = "Red";
CopyStatus = "Ошибка удаления экземпляра.";
}
}
[RelayCommand]
private void ClearCopy()
{
SelectedCopy = null;
CopyInv = string.Empty;
CopyShelf = string.Empty;
SearchCopyBookText = string.Empty;
SelectedCopyBook = null;
CopyStatusField = string.Empty;
CopyStatus = string.Empty;
}
private void RefreshUsers()
{
UsersList = DatabaseService.GetUsers();
_allRoles = DatabaseService.GetRoles();
FilterUserRoles();
}
partial void OnSearchUserRoleTextChanged(string value)
{
FilterUserRoles();
}
private void FilterUserRoles()
{
string filter = SearchUserRoleText?.Trim() ?? string.Empty;
if (string.IsNullOrEmpty(filter))
{
FilteredUserRoles = _allRoles.ToList();
}
else
{
FilteredUserRoles = _allRoles.Where(r =>
r.Name.Contains(filter, StringComparison.OrdinalIgnoreCase)
).ToList();
}
}
partial void OnSelectedUserChanged(User? value)
{
if (value != null)
{
UserFullName = value.Full_name ?? string.Empty;
UserLogin = value.Login ?? string.Empty;
UserPass = value.Password_hash ?? string.Empty;
UserEmail = value.Email ?? string.Empty;
UserPhone = value.Phone ?? string.Empty;
SearchUserRoleText = value.RoleId?.Name ?? string.Empty;
SelectedUserRole = _allRoles.FirstOrDefault(r => r.id == value.RoleId?.id);
}
}
[RelayCommand]
private void AddUser()
{
string name = UserFullName?.Trim() ?? string.Empty;
string login = UserLogin?.Trim() ?? string.Empty;
string pass = UserPass?.Trim() ?? string.Empty;
string email = UserEmail?.Trim() ?? string.Empty;
string phone = UserPhone?.Trim() ?? string.Empty;
var role = SelectedUserRole;
if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(login) || string.IsNullOrEmpty(pass) || role == null)
{
UserStatusColor = "Red";
UserStatus = "Заполните обязательные поля (ФИО, Логин, Пароль, Роль).";
return;
}
if (DatabaseService.AddUser(name, email, phone, login, pass, role.id))
{
RefreshUsers();
ClearUser();
UserStatusColor = "Green";
UserStatus = "Пользователь добавлен!";
}
else
{
UserStatusColor = "Red";
UserStatus = "Ошибка добавления (проверьте уникальность Логина/Email).";
}
}
[RelayCommand]
private void EditUser()
{
if (SelectedUser == null)
{
UserStatusColor = "Red";
UserStatus = "Выберите пользователя для редактирования.";
return;
}
string name = UserFullName?.Trim() ?? string.Empty;
string login = UserLogin?.Trim() ?? string.Empty;
string pass = UserPass?.Trim() ?? string.Empty;
string email = UserEmail?.Trim() ?? string.Empty;
string phone = UserPhone?.Trim() ?? string.Empty;
var role = SelectedUserRole;
if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(login) || string.IsNullOrEmpty(pass) || role == null)
{
UserStatusColor = "Red";
UserStatus = "Заполните все обязательные поля и выберите роль.";
return;
}
if (DatabaseService.UpdateUser(SelectedUser.Id, name, email, phone, login, pass, role.id))
{
RefreshUsers();
ClearUser();
UserStatusColor = "Green";
UserStatus = "Пользователь обновлен!";
}
else
{
UserStatusColor = "Red";
UserStatus = "Ошибка обновления пользователя.";
}
}
[RelayCommand]
private void DeleteUser()
{
if (SelectedUser == null) return;
if (DatabaseService.DeleteUser(SelectedUser.Id))
{
RefreshUsers();
ClearUser();
UserStatusColor = "Green";
UserStatus = "Пользователь удален!";
}
else
{
UserStatusColor = "Red";
UserStatus = "Ошибка удаления пользователя.";
}
}
[RelayCommand]
private void ClearUser()
{
SelectedUser = null;
UserFullName = string.Empty;
UserLogin = string.Empty;
UserPass = string.Empty;
UserEmail = string.Empty;
UserPhone = string.Empty;
SearchUserRoleText = string.Empty;
SelectedUserRole = null;
UserStatus = string.Empty;
}
[RelayCommand]
private void RefreshReports()
{
decimal collected = DatabaseService.GetTotalFinesCollected();
decimal unpaid = DatabaseService.GetTotalFinesUnpaid();
FinesCollected = $"{collected:N2} руб.";
FinesUnpaid = $"{unpaid:N2} руб.";
PopularBooksList = DatabaseService.GetPopularBooks().Rows.Cast<System.Data.DataRow>().Select(r => new PopularBookItem
{
Title = r["Title"]?.ToString() ?? string.Empty,
BorrowCount = r["BorrowCount"] != DBNull.Value ? Convert.ToInt32(r["BorrowCount"]) : 0
}).ToList();
OverdueLoansList = DatabaseService.GetOverdueLoans().Rows.Cast<System.Data.DataRow>().Select(r => new OverdueLoanItem
{
Title = r["Title"]?.ToString() ?? string.Empty,
Reader = r["Reader"]?.ToString() ?? string.Empty,
IssueDate = r["IssueDate"] != DBNull.Value ? Convert.ToDateTime(r["IssueDate"]).ToString("dd.MM.yyyy") : string.Empty,
DueDate = r["DueDate"] != DBNull.Value ? Convert.ToDateTime(r["DueDate"]).ToString("dd.MM.yyyy") : string.Empty,
OverdueDays = r["OverdueDays"] != DBNull.Value ? Convert.ToInt32(r["OverdueDays"]) : 0
}).ToList();
}
}
}

View File

@ -0,0 +1,413 @@
using System;
using System.Collections.Generic;
using System.Linq;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using CourseProject1125.DB;
using CourseProject1125.Models;
namespace CourseProject1125.ViewModels
{
public partial class LibrarianWindowViewModel : ViewModelBase
{
private List<Book_copies> _availableCopies = new();
private List<User> _readers = new();
public Action? OnLogoutRequested { get; set; }
public string LibrarianName => UserSession.UserName;
[ObservableProperty]
[NotifyPropertyChangedFor(nameof(IssueTabBackground), nameof(IssueTabForeground), nameof(IsIssueVisible))]
[NotifyPropertyChangedFor(nameof(ReturnsTabBackground), nameof(ReturnsTabForeground), nameof(IsReturnsVisible))]
[NotifyPropertyChangedFor(nameof(RegisterTabBackground), nameof(RegisterTabForeground), nameof(IsRegisterVisible))]
[NotifyPropertyChangedFor(nameof(FinesTabBackground), nameof(FinesTabForeground), nameof(IsFinesVisible))]
[NotifyPropertyChangedFor(nameof(ReservationsTabBackground), nameof(ReservationsTabForeground), nameof(IsReservationsVisible))]
private string _currentTab = "Issue";
[ObservableProperty] private string _activeTabHeader = "📖 Оформление выдачи книг";
public string IssueTabBackground => CurrentTab == "Issue" ? "LightGray" : "Transparent";
public string IssueTabForeground => CurrentTab == "Issue" ? "Black" : "Gray";
public bool IsIssueVisible => CurrentTab == "Issue";
public string ReturnsTabBackground => CurrentTab == "Returns" ? "LightGray" : "Transparent";
public string ReturnsTabForeground => CurrentTab == "Returns" ? "Black" : "Gray";
public bool IsReturnsVisible => CurrentTab == "Returns";
public string RegisterTabBackground => CurrentTab == "Register" ? "LightGray" : "Transparent";
public string RegisterTabForeground => CurrentTab == "Register" ? "Black" : "Gray";
public bool IsRegisterVisible => CurrentTab == "Register";
public string FinesTabBackground => CurrentTab == "Fines" ? "LightGray" : "Transparent";
public string FinesTabForeground => CurrentTab == "Fines" ? "Black" : "Gray";
public bool IsFinesVisible => CurrentTab == "Fines";
public string ReservationsTabBackground => CurrentTab == "Reservations" ? "LightGray" : "Transparent";
public string ReservationsTabForeground => CurrentTab == "Reservations" ? "Black" : "Gray";
public bool IsReservationsVisible => CurrentTab == "Reservations";
[ObservableProperty] private string _searchCopyText = string.Empty;
[ObservableProperty] private List<Book_copies> _filteredCopies = new();
[ObservableProperty] private Book_copies? _selectedAvailableCopy;
[ObservableProperty] private string _searchReaderText = string.Empty;
[ObservableProperty] private List<User> _filteredReaders = new();
[ObservableProperty] private User? _selectedReader;
[ObservableProperty] private DateTime? _issueDueDate = DateTime.Now.AddDays(14);
[ObservableProperty] private string _issueStatus = string.Empty;
[ObservableProperty] private string _issueStatusColor = "Black";
[ObservableProperty] private List<Loan> _activeLoansList = new();
[ObservableProperty] private Loan? _selectedActiveLoan;
[ObservableProperty] private string _returnDetails = "Выберите выдачу из списка слева.";
[ObservableProperty] private string _returnStatus = string.Empty;
[ObservableProperty] private string _returnStatusColor = "Black";
[ObservableProperty] private bool _isReturnEnabled;
[ObservableProperty] private string _regFullName = string.Empty;
[ObservableProperty] private string _regEmail = string.Empty;
[ObservableProperty] private string _regPhone = string.Empty;
[ObservableProperty] private string _regLogin = string.Empty;
[ObservableProperty] private string _regPass = string.Empty;
[ObservableProperty] private string _regStatus = string.Empty;
[ObservableProperty] private string _regStatusColor = "Black";
[ObservableProperty] private List<Fine> _finesList = new();
[ObservableProperty] private Fine? _selectedFine;
[ObservableProperty] private string _fineDetails = "Выберите штраф из списка.";
[ObservableProperty] private string _fineStatus = string.Empty;
[ObservableProperty] private string _fineStatusColor = "Black";
[ObservableProperty] private bool _isPayFineEnabled;
[ObservableProperty] private List<Reservation> _reservationsList = new();
[ObservableProperty] private Reservation? _selectedReservation;
[ObservableProperty] private string _reservationDetails = "Выберите бронь из списка.";
[ObservableProperty] private string _reservationStatus = string.Empty;
[ObservableProperty] private string _reservationStatusColor = "Black";
[ObservableProperty] private bool _isCancelReservationEnabled;
public LibrarianWindowViewModel()
{
LoadAllData();
ShowTab("Issue");
}
private void LoadAllData()
{
RefreshIssueCombos();
RefreshActiveLoans();
RefreshFines();
RefreshReservations();
}
[RelayCommand]
private void ShowTab(string tabName)
{
CurrentTab = tabName;
switch (tabName)
{
case "Issue":
ActiveTabHeader = "Оформление выдачи книг";
RefreshIssueCombos();
break;
case "Returns":
ActiveTabHeader = "Приём возврата книг";
RefreshActiveLoans();
break;
case "Register":
ActiveTabHeader = "Регистрация читателей";
break;
case "Fines":
ActiveTabHeader = "Управление штрафами";
RefreshFines();
break;
case "Reservations":
ActiveTabHeader = "Бронирования читателей";
RefreshReservations();
break;
}
}
[RelayCommand]
private void Logout()
{
OnLogoutRequested?.Invoke();
}
private void RefreshIssueCombos()
{
var allCopies = DatabaseService.GetBookCopies();
_availableCopies = allCopies.Where(c => string.Equals(c.Status, "available", StringComparison.OrdinalIgnoreCase)).ToList();
var allUsers = DatabaseService.GetUsers();
_readers = allUsers.Where(u => u.RoleId?.id == 3 || string.Equals(u.RoleId?.Name, "Читатель", StringComparison.OrdinalIgnoreCase)).ToList();
FilterIssueCopies();
FilterIssueReaders();
IssueStatus = string.Empty;
}
partial void OnSearchCopyTextChanged(string value)
{
FilterIssueCopies();
}
partial void OnSearchReaderTextChanged(string value)
{
FilterIssueReaders();
}
private void FilterIssueCopies()
{
var filter = SearchCopyText?.Trim() ?? string.Empty;
if (string.IsNullOrEmpty(filter))
{
FilteredCopies = _availableCopies.Take(15).ToList();
}
else
{
FilteredCopies = _availableCopies.Where(c =>
(c.BookId?.Title != null && c.BookId.Title.Contains(filter, StringComparison.OrdinalIgnoreCase)) ||
(c.Inventory_number != null && c.Inventory_number.Contains(filter, StringComparison.OrdinalIgnoreCase)) ||
(c.BookId?.AuthorId?.Name != null && c.BookId.AuthorId.Name.Contains(filter, StringComparison.OrdinalIgnoreCase))
).ToList();
}
}
private void FilterIssueReaders()
{
var filter = SearchReaderText?.Trim() ?? string.Empty;
if (string.IsNullOrEmpty(filter))
{
FilteredReaders = _readers.Take(15).ToList();
}
else
{
FilteredReaders = _readers.Where(r =>
(r.Full_name != null && r.Full_name.Contains(filter, StringComparison.OrdinalIgnoreCase)) ||
(r.Login != null && r.Login.Contains(filter, StringComparison.OrdinalIgnoreCase))
).ToList();
}
}
[RelayCommand]
private void IssueBook()
{
if (SelectedAvailableCopy == null || SelectedReader == null || IssueDueDate == null)
{
IssueStatusColor = "Red";
IssueStatus = "Ошибка: Выберите книгу, читателя и укажите дату сдачи.";
return;
}
var dueDate = IssueDueDate.Value;
if (dueDate <= DateTime.Now)
{
IssueStatusColor = "Red";
IssueStatus = "Ошибка: Срок возврата должен быть в будущем.";
return;
}
int librarianId = UserSession.UserId;
if (DatabaseService.IssueLoan(SelectedAvailableCopy.Id, SelectedReader.Id, librarianId, dueDate))
{
IssueStatusColor = "Green";
IssueStatus = $"Успешно! Книга '{SelectedAvailableCopy.BookId?.Title}' выдана читателю '{SelectedReader.Full_name}'.";
SearchCopyText = string.Empty;
SearchReaderText = string.Empty;
RefreshIssueCombos();
}
else
{
IssueStatusColor = "Red";
IssueStatus = "Ошибка при оформлении выдачи в базе данных.";
}
}
private void RefreshActiveLoans()
{
var allLoans = DatabaseService.GetLoans();
ActiveLoansList = allLoans.Where(l =>
string.Equals(l.Status, "active", StringComparison.OrdinalIgnoreCase) ||
string.Equals(l.Status, "pending_return", StringComparison.OrdinalIgnoreCase)
).ToList();
SelectedActiveLoan = null;
}
partial void OnSelectedActiveLoanChanged(Loan? value)
{
if (value != null)
{
ReturnDetails = $"Книга: {value.CopyId?.BookId?.Title}\n" +
$"Инвентарный номер: {value.CopyId?.Inventory_number}\n" +
$"Читатель: {value.ReaderId?.Full_name}\n" +
$"Дата выдачи: {value.Issue_date:dd.MM.yyyy}\n" +
$"Срок сдачи: {value.Due_date:dd.MM.yyyy}\n" +
$"Статус: {value.StatusText}";
IsReturnEnabled = true;
}
else
{
ReturnDetails = "Выберите выдачу из списка слева.";
IsReturnEnabled = false;
}
ReturnStatus = string.Empty;
}
[RelayCommand]
private void ReturnBook()
{
if (SelectedActiveLoan == null) return;
DateTime returnDate = DateTime.Now;
decimal fine = DatabaseService.ReturnLoan(SelectedActiveLoan.Id, returnDate);
if (fine >= 0)
{
RefreshActiveLoans();
if (fine > 0)
{
ReturnStatusColor = "Red";
ReturnStatus = $"Книга возвращена! Зафиксирована просрочка. Выписан штраф: {fine:N2} руб.";
}
else
{
ReturnStatusColor = "Green";
ReturnStatus = "Книга возвращена успешно! Просрочек нет.";
}
}
else
{
ReturnStatusColor = "Red";
ReturnStatus = "Ошибка выполнения возврата книги.";
}
}
[RelayCommand]
private void RegisterReader()
{
string name = RegFullName?.Trim() ?? string.Empty;
string email = RegEmail?.Trim() ?? string.Empty;
string phone = RegPhone?.Trim() ?? string.Empty;
string login = RegLogin?.Trim() ?? string.Empty;
string pass = RegPass?.Trim() ?? string.Empty;
if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(login) || string.IsNullOrEmpty(pass))
{
RegStatusColor = "Red";
RegStatus = "Пожалуйста, заполните ФИО, логин и пароль.";
return;
}
if (DatabaseService.AddUser(name, email, phone, login, pass, 3))
{
RegStatusColor = "Green";
RegStatus = $"Успешно! Читатель '{name}' зарегистрирован.";
RegFullName = string.Empty;
RegEmail = string.Empty;
RegPhone = string.Empty;
RegLogin = string.Empty;
RegPass = string.Empty;
}
else
{
RegStatusColor = "Red";
RegStatus = "Ошибка: Пользователь с таким логином или Email уже существует.";
}
}
private void RefreshFines()
{
FinesList = DatabaseService.GetFines().Where(f => f.Is_paid == 0).ToList();
SelectedFine = null;
}
partial void OnSelectedFineChanged(Fine? value)
{
if (value != null)
{
string paidStr = value.Is_paid == 1 ? "Оплачен" : "НЕ оплачен";
FineDetails = $"Читатель: {value.LoanId?.ReaderId?.Full_name}\n" +
$"Книга: {value.LoanId?.CopyId?.BookId?.Title}\n" +
$"Сумма штрафа: {value.Amount:N2} руб.\n" +
$"Статус: {paidStr}\n" +
$"Дата начисления: {value.Created_at:dd.MM.yyyy}";
IsPayFineEnabled = value.Is_paid == 0;
}
else
{
FineDetails = "Выберите штраф из списка.";
IsPayFineEnabled = false;
}
FineStatus = string.Empty;
}
[RelayCommand]
private void PayFine()
{
if (SelectedFine == null) return;
if (DatabaseService.PayFine(SelectedFine.Id))
{
RefreshFines();
FineStatusColor = "Green";
FineStatus = "Штраф успешно отмечен как оплаченный!";
}
else
{
FineStatusColor = "Red";
FineStatus = "Ошибка при оплате штрафа.";
}
}
private void RefreshReservations()
{
ReservationsList = DatabaseService.GetReservations().Where(r => r.is_active == 1 && r.Expiry_date >= DateTime.Now).ToList();
SelectedReservation = null;
}
partial void OnSelectedReservationChanged(Reservation? value)
{
if (value != null)
{
string activeStr = value.is_active == 1 ? "Активна" : "Неактивна/Отменена";
ReservationDetails = $"Книга: {value.BookId?.Title}\n" +
$"Читатель: {value.ReaderId?.Full_name}\n" +
$"Дата бронирования: {value.Reservation_date:dd.MM.yyyy}\n" +
$"Истекает: {value.Expiry_date:dd.MM.yyyy}\n" +
$"Статус: {activeStr}";
IsCancelReservationEnabled = value.is_active == 1;
}
else
{
ReservationDetails = "Выберите бронь из списка.";
IsCancelReservationEnabled = false;
}
ReservationStatus = string.Empty;
}
[RelayCommand]
private void CancelReservation()
{
if (SelectedReservation == null) return;
if (DatabaseService.CancelReservation(SelectedReservation.Id))
{
RefreshReservations();
ReservationStatusColor = "Green";
ReservationStatus = "Бронирование успешно отменено!";
}
else
{
ReservationStatusColor = "Red";
ReservationStatus = "Ошибка при отмене бронирования.";
}
}
}
}

View File

@ -1,20 +1,55 @@
using System;
using System.Data;
using Microsoft.Data.SqlClient;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using Avalonia.Controls;
using Avalonia.Interactivity;
using System;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using CourseProject1125.DB;
using Tmds.DBus.Protocol;
using Microsoft.Extensions.DependencyInjection;
using Connection = CourseProject1125.DB.Connection;
namespace CourseProject1125.ViewModels
{
public partial class MainWindowViewModel
public partial class MainWindowViewModel : ViewModelBase
{
[ObservableProperty]
private string _loginInput = string.Empty;
[ObservableProperty]
private string _passwordInput = string.Empty;
[ObservableProperty]
private string _errorMessage = string.Empty;
public Action<int>? OnLoginSuccess { get; set; }
[RelayCommand]
private void Login()
{
ErrorMessage = string.Empty;
var login = LoginInput?.Trim() ?? string.Empty;
var password = PasswordInput?.Trim() ?? string.Empty;
if (string.IsNullOrEmpty(login) || string.IsNullOrEmpty(password))
{
ErrorMessage = "Пожалуйста, введите логин и пароль.";
return;
}
try
{
var user = DatabaseService.AuthenticateUser(login, password);
if (user != null)
{
OnLoginSuccess?.Invoke(user.RoleId.id);
}
else
{
ErrorMessage = "Неверный логин или пароль.";
}
}
catch (Exception ex)
{
ErrorMessage = $"Ошибка: {ex.Message}";
}
}
[RelayCommand]
private void FullExit()
{

View File

@ -0,0 +1,357 @@
using System;
using System.Collections.Generic;
using System.Linq;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using CourseProject1125.DB;
using CourseProject1125.Models;
namespace CourseProject1125.ViewModels
{
public partial class ReaderWindowViewModel : ViewModelBase
{
private List<Book> _allBooks = new();
private List<Book_copies> _allCopies = new();
public Action? OnLogoutRequested { get; set; }
public string ReaderName => UserSession.UserName;
[ObservableProperty]
[NotifyPropertyChangedFor(nameof(CatalogTabBackground), nameof(CatalogTabForeground), nameof(IsCatalogVisible))]
[NotifyPropertyChangedFor(nameof(MyLoansTabBackground), nameof(MyLoansTabForeground), nameof(IsMyLoansVisible))]
[NotifyPropertyChangedFor(nameof(ReturnBookTabBackground), nameof(ReturnBookTabForeground), nameof(IsReturnBookVisible))]
[NotifyPropertyChangedFor(nameof(MyFinesTabBackground), nameof(MyFinesTabForeground), nameof(IsMyFinesVisible))]
[NotifyPropertyChangedFor(nameof(MyReservationsTabBackground), nameof(MyReservationsTabForeground), nameof(IsMyReservationsVisible))]
private string _currentTab = "Catalog";
[ObservableProperty] private string _activeTabHeader = "Каталог и бронирование книг";
public string CatalogTabBackground => CurrentTab == "Catalog" ? "LightGray" : "Transparent";
public string CatalogTabForeground => CurrentTab == "Catalog" ? "Black" : "Gray";
public bool IsCatalogVisible => CurrentTab == "Catalog";
public string MyLoansTabBackground => CurrentTab == "MyLoans" ? "LightGray" : "Transparent";
public string MyLoansTabForeground => CurrentTab == "MyLoans" ? "Black" : "Gray";
public bool IsMyLoansVisible => CurrentTab == "MyLoans";
public string ReturnBookTabBackground => CurrentTab == "ReturnBook" ? "LightGray" : "Transparent";
public string ReturnBookTabForeground => CurrentTab == "ReturnBook" ? "Black" : "Gray";
public bool IsReturnBookVisible => CurrentTab == "ReturnBook";
public string MyFinesTabBackground => CurrentTab == "MyFines" ? "LightGray" : "Transparent";
public string MyFinesTabForeground => CurrentTab == "MyFines" ? "Black" : "Gray";
public bool IsMyFinesVisible => CurrentTab == "MyFines";
public string MyReservationsTabBackground => CurrentTab == "MyReservations" ? "LightGray" : "Transparent";
public string MyReservationsTabForeground => CurrentTab == "MyReservations" ? "Black" : "Gray";
public bool IsMyReservationsVisible => CurrentTab == "MyReservations";
[ObservableProperty] private string _searchQuery = string.Empty;
[ObservableProperty] private List<Book> _booksList = new();
[ObservableProperty] private Book? _selectedBook;
[ObservableProperty] private string _catalogBookTitle = "Выберите книгу из списка.";
[ObservableProperty] private string _catalogBookAuthor = string.Empty;
[ObservableProperty] private string _catalogBookDesc = string.Empty;
[ObservableProperty] private string _catalogAvailability = "Доступно копий: -";
[ObservableProperty] private string _catalogStatus = string.Empty;
[ObservableProperty] private string _catalogStatusColor = "Black";
[ObservableProperty] private bool _isReserveEnabled;
[ObservableProperty] private List<Loan> _myLoansList = new();
[ObservableProperty] private List<Loan> _activeLoansList = new();
[ObservableProperty] private Loan? _selectedReturnLoan;
[ObservableProperty] private string _returnBookDetails = "Выберите выданную книгу из списка слева.";
[ObservableProperty] private string _returnBookStatus = string.Empty;
[ObservableProperty] private string _returnBookStatusColor = "Black";
[ObservableProperty] private bool _isSubmitReturnEnabled;
[ObservableProperty] private List<Fine> _myFinesList = new();
[ObservableProperty] private Fine? _selectedFine;
[ObservableProperty] private string _myFineDetails = "Выберите штраф из списка слева.";
[ObservableProperty] private string _myFineStatus = string.Empty;
[ObservableProperty] private string _myFineStatusColor = "Black";
[ObservableProperty] private bool _isPayMyFineEnabled;
[ObservableProperty] private List<Reservation> _myReservationsList = new();
[ObservableProperty] private Reservation? _selectedReservation;
[ObservableProperty] private string _myReservationDetails = "Выберите бронь из списка.";
[ObservableProperty] private string _myReservationStatus = string.Empty;
[ObservableProperty] private string _myReservationStatusColor = "Black";
[ObservableProperty] private bool _isCancelMyReservationEnabled;
public ReaderWindowViewModel()
{
LoadAllData();
ShowTab("Catalog");
}
private void LoadAllData()
{
_allBooks = DatabaseService.GetBooks();
_allCopies = DatabaseService.GetBookCopies();
RefreshCatalog();
RefreshMyLoans();
RefreshMyFines();
RefreshMyReservations();
}
[RelayCommand]
private void ShowTab(string tabName)
{
CurrentTab = tabName;
switch (tabName)
{
case "Catalog":
ActiveTabHeader = "Каталог и бронирование книг";
LoadAllData();
break;
case "MyLoans":
ActiveTabHeader = "Мои выданные книги";
RefreshMyLoans();
break;
case "ReturnBook":
ActiveTabHeader = "Сдать книгу";
RefreshReturnLoans();
break;
case "MyFines":
ActiveTabHeader = "Мои штрафы";
RefreshMyFines();
break;
case "MyReservations":
ActiveTabHeader = "Мои бронирования";
RefreshMyReservations();
break;
}
}
[RelayCommand]
private void Logout()
{
OnLogoutRequested?.Invoke();
}
private void RefreshCatalog()
{
BooksList = _allBooks;
SelectedBook = null;
}
[RelayCommand]
private void Search()
{
var query = SearchQuery?.Trim() ?? string.Empty;
if (string.IsNullOrEmpty(query))
{
BooksList = _allBooks;
}
else
{
BooksList = _allBooks.Where(b =>
b.Title.Contains(query, StringComparison.OrdinalIgnoreCase) ||
(b.AuthorId?.Name != null && b.AuthorId.Name.Contains(query, StringComparison.OrdinalIgnoreCase)) ||
(b.Isbn != null && b.Isbn.Contains(query, StringComparison.OrdinalIgnoreCase))
).ToList();
}
}
partial void OnSelectedBookChanged(Book? value)
{
if (value != null)
{
CatalogBookTitle = value.Title;
CatalogBookAuthor = $"Автор: {value.AuthorId?.Name} | ISBN: {value.Isbn} | Год: {value.Year_published}";
CatalogBookDesc = string.IsNullOrEmpty(value.Description) ? "Описание отсутствует." : value.Description;
int totalCopies = _allCopies.Count(c => c.BookId?.Id == value.Id);
int availableCopies = _allCopies.Count(c => c.BookId?.Id == value.Id && string.Equals(c.Status, "available", StringComparison.OrdinalIgnoreCase));
CatalogAvailability = $"Всего экземпляров: {totalCopies} | Доступно для выдачи: {availableCopies}";
IsReserveEnabled = availableCopies > 0;
CatalogStatus = string.Empty;
}
else
{
CatalogBookTitle = "Выберите книгу из списка.";
CatalogBookAuthor = string.Empty;
CatalogBookDesc = string.Empty;
CatalogAvailability = "Доступно копий: -";
IsReserveEnabled = false;
CatalogStatus = string.Empty;
}
}
[RelayCommand]
private void ReserveBook()
{
if (SelectedBook == null) return;
int readerId = UserSession.UserId;
DateTime expiryDate = DateTime.Now.AddDays(3);
if (DatabaseService.CreateReservation(SelectedBook.Id, readerId, expiryDate))
{
_allCopies = DatabaseService.GetBookCopies();
var currentBook = SelectedBook;
SelectedBook = null;
SelectedBook = currentBook;
CatalogStatusColor = "Green";
CatalogStatus = "Успешно! Книга забронирована на 3 дня. Заберите её на стойке выдачи.";
}
else
{
CatalogStatusColor = "Red";
CatalogStatus = "Ошибка создания бронирования.";
}
}
private void RefreshMyLoans()
{
int readerId = UserSession.UserId;
var allLoans = DatabaseService.GetLoans();
MyLoansList = allLoans.Where(l => l.ReaderId?.Id == readerId).ToList();
}
private void RefreshReturnLoans()
{
int readerId = UserSession.UserId;
var allLoans = DatabaseService.GetLoans();
ActiveLoansList = allLoans.Where(l => l.ReaderId?.Id == readerId && string.Equals(l.Status, "active", StringComparison.OrdinalIgnoreCase)).ToList();
SelectedReturnLoan = null;
}
partial void OnSelectedReturnLoanChanged(Loan? value)
{
if (value != null)
{
ReturnBookDetails = $"Книга: {value.CopyId?.BookId?.Title}\n" +
$"Инвентарный номер: {value.CopyId?.Inventory_number}\n" +
$"Дата выдачи: {value.Issue_date:dd.MM.yyyy}\n" +
$"Срок сдачи: {value.Due_date:dd.MM.yyyy}";
IsSubmitReturnEnabled = true;
}
else
{
ReturnBookDetails = "Выберите выданную книгу из списка слева.";
IsSubmitReturnEnabled = false;
}
ReturnBookStatus = string.Empty;
}
[RelayCommand]
private void SubmitReturn()
{
if (SelectedReturnLoan == null) return;
if (DatabaseService.RequestBookReturn(SelectedReturnLoan.Id))
{
RefreshReturnLoans();
RefreshMyLoans();
ReturnBookStatusColor = "Green";
ReturnBookStatus = "Запрос на возврат успешно отправлен. Пожалуйста, передайте книгу библиотекарю для подтверждения.";
}
else
{
ReturnBookStatusColor = "Red";
ReturnBookStatus = "Ошибка при отправке запроса на возврат.";
}
}
private void RefreshMyFines()
{
int readerId = UserSession.UserId;
var allFines = DatabaseService.GetFines();
MyFinesList = allFines.Where(f => f.LoanId?.ReaderId?.Id == readerId && f.Is_paid == 0).ToList();
SelectedFine = null;
}
partial void OnSelectedFineChanged(Fine? value)
{
if (value != null)
{
MyFineDetails = $"Книга: {value.LoanId?.CopyId?.BookId?.Title}\n" +
$"Инвентарный номер: {value.LoanId?.CopyId?.Inventory_number}\n" +
$"Сумма штрафа: {value.Amount:N2} руб.\n" +
$"Дата начисления: {value.Created_at:dd.MM.yyyy}";
IsPayMyFineEnabled = true;
}
else
{
MyFineDetails = "Выберите штраф из списка слева.";
IsPayMyFineEnabled = false;
}
MyFineStatus = string.Empty;
}
[RelayCommand]
private void PayMyFine()
{
if (SelectedFine == null) return;
if (DatabaseService.PayFine(SelectedFine.Id))
{
RefreshMyFines();
MyFineStatusColor = "Green";
MyFineStatus = "Штраф успешно оплачен!";
}
else
{
MyFineStatusColor = "Red";
MyFineStatus = "Ошибка при оплате штрафа.";
}
}
private void RefreshMyReservations()
{
int readerId = UserSession.UserId;
var allRes = DatabaseService.GetReservations();
MyReservationsList = allRes.Where(r => r.ReaderId?.Id == readerId && r.is_active == 1 && r.Expiry_date >= DateTime.Now).ToList();
SelectedReservation = null;
}
partial void OnSelectedReservationChanged(Reservation? value)
{
if (value != null)
{
string activeStr = value.is_active == 1 ? "Активна" : "Неактивна/Отменена";
MyReservationDetails = $"Книга: {value.BookId?.Title}\n" +
$"Дата брони: {value.Reservation_date:dd.MM.yyyy}\n" +
$"Истекает: {value.Expiry_date:dd.MM.yyyy}\n" +
$"Статус: {activeStr}";
IsCancelMyReservationEnabled = value.is_active == 1;
}
else
{
MyReservationDetails = "Выберите бронь из списка.";
IsCancelMyReservationEnabled = false;
}
MyReservationStatus = string.Empty;
}
[RelayCommand]
private void CancelMyReservation()
{
if (SelectedReservation == null) return;
if (DatabaseService.CancelReservation(SelectedReservation.Id))
{
RefreshMyReservations();
MyReservationStatusColor = "Green";
MyReservationStatus = "Бронирование успешно отменено!";
}
else
{
MyReservationStatusColor = "Red";
MyReservationStatus = "Ошибка при отмене бронирования.";
}
}
}
}

View File

@ -1,50 +1,50 @@
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:CourseProject1125.ViewModels"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="1100" d:DesignHeight="650"
x:Class="CourseProject1125.Views.AdminWindow"
x:DataType="vm:AdminWindowViewModel"
Title="Панель администратора - Библиотека"
Width="1100" Height="650"
WindowStartupLocation="CenterScreen"
Background="#0f172a">
Background="White">
<Grid ColumnDefinitions="240, *">
<Border Grid.Column="0" Background="#1e293b" BorderBrush="#334155" BorderThickness="0,0,1,0" Padding="15">
<Border Grid.Column="0" Background="LightGray" BorderBrush="Gray" BorderThickness="0,0,1,0" Padding="15">
<Grid RowDefinitions="Auto, *, Auto">
<StackPanel Grid.Row="0" Margin="0,10,0,30">
<TextBlock Text="БИБЛИОТЕКА" Foreground="#38bdf8" FontSize="20" FontWeight="Bold" HorizontalAlignment="Center" LetterSpacing="1"/>
<TextBlock Text="Панель администратора" Foreground="#94a3b8" FontSize="11" HorizontalAlignment="Center"/>
<TextBlock Name="TxtAdminName" Foreground="#cbd5e1" FontSize="12" FontWeight="SemiBold" HorizontalAlignment="Center" Margin="0,10,0,0"/>
<TextBlock Text="БИБЛИОТЕКА" Foreground="Black" FontSize="20" FontWeight="Bold" HorizontalAlignment="Center" LetterSpacing="1"/>
<TextBlock Text="Панель администратора" Foreground="Black" FontSize="11" HorizontalAlignment="Center"/>
<TextBlock Name="TxtAdminName" Text="{Binding AdminName}" Foreground="Black" FontSize="12" FontWeight="SemiBold" HorizontalAlignment="Center" Margin="0,10,0,0"/>
</StackPanel>
<StackPanel Grid.Row="1">
<Button Name="BtnTabBooks" Content=" Книги" Click="BtnTab_Click" Tag="Books" HorizontalAlignment="Stretch" Height="40" Background="Transparent" Foreground="#94a3b8" FontWeight="SemiBold" CornerRadius="6" HorizontalContentAlignment="Left" Padding="15,0,0,0"/>
<Button Name="BtnTabAuthors" Content=" Авторы" Click="BtnTab_Click" Tag="Authors" HorizontalAlignment="Stretch" Height="40" Background="Transparent" Foreground="#94a3b8" FontWeight="SemiBold" CornerRadius="6" HorizontalContentAlignment="Left" Padding="15,0,0,0"/>
<Button Name="BtnTabCopies" Content=" Экземпляры" Click="BtnTab_Click" Tag="Copies" HorizontalAlignment="Stretch" Height="40" Background="Transparent" Foreground="#94a3b8" FontWeight="SemiBold" CornerRadius="6" HorizontalContentAlignment="Left" Padding="15,0,0,0"/>
<Button Name="BtnTabUsers" Content=" Пользователи" Click="BtnTab_Click" Tag="Users" HorizontalAlignment="Stretch" Height="40" Background="Transparent" Foreground="#94a3b8" FontWeight="SemiBold" CornerRadius="6" HorizontalContentAlignment="Left" Padding="15,0,0,0"/>
<Button Name="BtnTabReports" Content=" Отчеты" Click="BtnTab_Click" Tag="Reports" HorizontalAlignment="Stretch" Height="40" Background="Transparent" Foreground="#94a3b8" FontWeight="SemiBold" CornerRadius="6" HorizontalContentAlignment="Left" Padding="15,0,0,0"/>
<Button Name="BtnTabBooks" Content=" Книги" Command="{Binding ShowTabCommand}" CommandParameter="Books" Background="{Binding BooksTabBackground}" Foreground="{Binding BooksTabForeground}" HorizontalAlignment="Stretch" Height="40" FontWeight="SemiBold" CornerRadius="6" HorizontalContentAlignment="Left" Padding="15,0,0,0"/>
<Button Name="BtnTabAuthors" Content=" Авторы" Command="{Binding ShowTabCommand}" CommandParameter="Authors" Background="{Binding AuthorsTabBackground}" Foreground="{Binding AuthorsTabForeground}" HorizontalAlignment="Stretch" Height="40" FontWeight="SemiBold" CornerRadius="6" HorizontalContentAlignment="Left" Padding="15,0,0,0"/>
<Button Name="BtnTabCopies" Content=" Экземпляры" Command="{Binding ShowTabCommand}" CommandParameter="Copies" Background="{Binding CopiesTabBackground}" Foreground="{Binding CopiesTabForeground}" HorizontalAlignment="Stretch" Height="40" FontWeight="SemiBold" CornerRadius="6" HorizontalContentAlignment="Left" Padding="15,0,0,0"/>
<Button Name="BtnTabUsers" Content=" Пользователи" Command="{Binding ShowTabCommand}" CommandParameter="Users" Background="{Binding UsersTabBackground}" Foreground="{Binding UsersTabForeground}" HorizontalAlignment="Stretch" Height="40" FontWeight="SemiBold" CornerRadius="6" HorizontalContentAlignment="Left" Padding="15,0,0,0"/>
<Button Name="BtnTabReports" Content=" Отчеты" Command="{Binding ShowTabCommand}" CommandParameter="Reports" Background="{Binding ReportsTabBackground}" Foreground="{Binding ReportsTabForeground}" HorizontalAlignment="Stretch" Height="40" FontWeight="SemiBold" CornerRadius="6" HorizontalContentAlignment="Left" Padding="15,0,0,0"/>
</StackPanel>
<Button Grid.Row="3" Content=" Выйти из системы" Click="BtnLogout_Click" HorizontalAlignment="Stretch" Height="40" Background="#ef4444" Foreground="White" FontWeight="Bold" CornerRadius="6" HorizontalContentAlignment="Center"/>
<Button Grid.Row="3" Content=" Выйти из системы" Command="{Binding LogoutCommand}" HorizontalAlignment="Stretch" Height="40" Background="Red" Foreground="White" FontWeight="Bold" CornerRadius="6" HorizontalContentAlignment="Center"/>
</Grid>
</Border>
<Grid Grid.Column="1" RowDefinitions="Auto, *">
<Border Grid.Row="0" Background="#1e293b" Height="60" Padding="20,0" BorderBrush="#334155" BorderThickness="0,0,0,1">
<Border Grid.Row="0" Background="LightGray" Height="60" Padding="20,0" BorderBrush="Gray" BorderThickness="0,0,0,1">
<Grid ColumnDefinitions="*, Auto">
<TextBlock Name="TxtActiveTabHeader" Text="📚 Управление книгами" Foreground="White" FontSize="18" FontWeight="Bold" VerticalAlignment="Center"/>
<TextBlock Grid.Column="1" Text="Роль: Администратор" Foreground="#94a3b8" FontSize="12" VerticalAlignment="Center"/>
<TextBlock Name="TxtActiveTabHeader" Text="{Binding ActiveTabHeader}" Foreground="Black" FontSize="18" FontWeight="Bold" VerticalAlignment="Center"/>
<TextBlock Grid.Column="1" Text="Роль: Администратор" Foreground="Black" FontSize="12" VerticalAlignment="Center"/>
</Grid>
</Border>
<Grid Grid.Row="1" Margin="20">
<Grid Name="GridBooks" ColumnDefinitions="*, 320">
<Grid Name="GridBooks" ColumnDefinitions="*, 320" IsVisible="{Binding IsBooksVisible}">
<Grid Grid.Column="0" RowDefinitions="*, Auto">
<DataGrid Name="DgBooks" Grid.Row="0" AutoGenerateColumns="False" IsReadOnly="True" GridLinesVisibility="All" BorderThickness="1" BorderBrush="#334155" Background="#1e293b" SelectionChanged="DgBooks_SelectionChanged">
<DataGrid Name="DgBooks" ItemsSource="{Binding BooksList}" SelectedItem="{Binding SelectedBook, Mode=TwoWay}" Grid.Row="0" AutoGenerateColumns="False" IsReadOnly="True" GridLinesVisibility="All" BorderThickness="1" BorderBrush="LightGray" Background="White">
<DataGrid.Columns>
<DataGridTextColumn Header="ID" Binding="{Binding Id}" Width="50"/>
<DataGridTextColumn Header="Название" Binding="{Binding Title}" Width="2*"/>
<DataGridTextColumn Header="Автор" Binding="{Binding AuthorId.Name}" Width="1.5*"/>
<DataGridTextColumn Header="ISBN" Binding="{Binding Isbn}" Width="1*"/>
@ -52,115 +52,122 @@
</DataGrid.Columns>
</DataGrid>
</Grid>
<Border Grid.Column="1" Background="#1e293b" CornerRadius="8" Padding="15" BorderBrush="#334155" BorderThickness="1">
<Border Grid.Column="1" Background="White" CornerRadius="8" Padding="15" BorderBrush="LightGray" BorderThickness="1">
<ScrollViewer>
<StackPanel>
<TextBlock Text="Редактирование Книги" Foreground="#38bdf8" FontSize="15" FontWeight="Bold" Margin="0,0,0,5"/>
<TextBlock Text="Редактирование Книги" Foreground="Black" FontSize="15" FontWeight="Bold" Margin="0,0,0,5"/>
<StackPanel>
<TextBlock Text="Название" Foreground="#cbd5e1" FontSize="12"/>
<TextBox Name="TxtBookTitle" Height="34" CornerRadius="4"/>
<TextBlock Text="Название" Foreground="Black" FontSize="12"/>
<TextBox Name="TxtBookTitle" Text="{Binding BookTitle, Mode=TwoWay}" Height="34" CornerRadius="4"/>
</StackPanel>
<StackPanel>
<TextBlock Text="Автор" Foreground="#cbd5e1" FontSize="12"/>
<ComboBox Name="CbBookAuthor" HorizontalAlignment="Stretch" Height="34" CornerRadius="4"/>
<TextBlock Text="Автор (поиск)" Foreground="Black" FontSize="12"/>
<TextBox Name="TxtSearchBookAuthor" Text="{Binding SearchBookAuthorText, Mode=TwoWay}" Height="34" CornerRadius="4" Watermark="Начните вводить имя автора..."/>
<ListBox Name="LbBookAuthors" ItemsSource="{Binding FilteredBookAuthors}" SelectedItem="{Binding SelectedBookAuthor, Mode=TwoWay}" Height="80" Margin="0,2,0,0" CornerRadius="4" Background="White" BorderBrush="LightGray" BorderThickness="1">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" Foreground="Black" FontSize="12"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
<StackPanel>
<TextBlock Text="ISBN" Foreground="#cbd5e1" FontSize="12"/>
<TextBox Name="TxtBookIsbn" Height="34" CornerRadius="4"/>
<TextBlock Text="ISBN" Foreground="Black" FontSize="12"/>
<TextBox Name="TxtBookIsbn" Text="{Binding BookIsbn, Mode=TwoWay}" Height="34" CornerRadius="4"/>
</StackPanel>
<StackPanel>
<TextBlock Text="Год издания" Foreground="#cbd5e1" FontSize="12"/>
<TextBox Name="TxtBookYear" Height="34" CornerRadius="4"/>
<TextBlock Text="Год издания" Foreground="Black" FontSize="12"/>
<TextBox Name="TxtBookYear" Text="{Binding BookYear, Mode=TwoWay}" Height="34" CornerRadius="4"/>
</StackPanel>
<StackPanel>
<TextBlock Text="Описание" Foreground="#cbd5e1" FontSize="12"/>
<TextBox Name="TxtBookDesc" Height="80" TextWrapping="Wrap" AcceptsReturn="True" CornerRadius="4"/>
<TextBlock Text="Описание" Foreground="Black" FontSize="12"/>
<TextBox Name="TxtBookDesc" Text="{Binding BookDesc, Mode=TwoWay}" Height="80" TextWrapping="Wrap" AcceptsReturn="True" CornerRadius="4"/>
</StackPanel>
<StackPanel Margin="0,10,0,0">
<Button Content=" Добавить" Click="BtnAddBook_Click" Background="#22c55e" Foreground="White" HorizontalAlignment="Stretch" Height="36" FontWeight="Bold" CornerRadius="4" HorizontalContentAlignment="Center"/>
<Button Content=" Сохранить" Click="BtnEditBook_Click" Background="#3b82f6" Foreground="White" HorizontalAlignment="Stretch" Height="36" FontWeight="Bold" CornerRadius="4" HorizontalContentAlignment="Center"/>
<Button Content=" Удалить" Click="BtnDeleteBook_Click" Background="#ef4444" Foreground="White" HorizontalAlignment="Stretch" Height="36" FontWeight="Bold" CornerRadius="4" HorizontalContentAlignment="Center"/>
<Button Content=" Очистить поля" Click="BtnClearBook_Click" Background="#64748b" Foreground="White" HorizontalAlignment="Stretch" Height="34" CornerRadius="4" HorizontalContentAlignment="Center"/>
<TextBlock Name="TxtBookStatus" Foreground="#ef4444" FontSize="12" Margin="0,10,0,0" TextWrapping="Wrap" HorizontalAlignment="Center"/>
<Button Content=" Добавить" Command="{Binding AddBookCommand}" Background="Green" Foreground="White" HorizontalAlignment="Stretch" Height="36" FontWeight="Bold" CornerRadius="4" HorizontalContentAlignment="Center"/>
<Button Content=" Сохранить" Command="{Binding EditBookCommand}" Background="Blue" Foreground="White" HorizontalAlignment="Stretch" Height="36" FontWeight="Bold" CornerRadius="4" HorizontalContentAlignment="Center"/>
<Button Content=" Удалить" Command="{Binding DeleteBookCommand}" Background="Red" Foreground="White" HorizontalAlignment="Stretch" Height="36" FontWeight="Bold" CornerRadius="4" HorizontalContentAlignment="Center"/>
<Button Content=" Очистить поля" Command="{Binding ClearBookCommand}" Background="Gray" Foreground="White" HorizontalAlignment="Stretch" Height="34" CornerRadius="4" HorizontalContentAlignment="Center"/>
<TextBlock Name="TxtBookStatus" Text="{Binding BookStatus}" Foreground="{Binding BookStatusColor}" FontSize="12" Margin="0,10,0,0" TextWrapping="Wrap" HorizontalAlignment="Center"/>
</StackPanel>
</StackPanel>
</ScrollViewer>
</Border>
</Grid>
<Grid Name="GridAuthors" ColumnDefinitions="*, 320" IsVisible="False">
<DataGrid Name="DgAuthors" Grid.Column="0" AutoGenerateColumns="False" IsReadOnly="True" GridLinesVisibility="All" BorderThickness="1" BorderBrush="#334155" Background="#1e293b" SelectionChanged="DgAuthors_SelectionChanged">
<Grid Name="GridAuthors" ColumnDefinitions="*, 320" IsVisible="{Binding IsAuthorsVisible}">
<DataGrid Name="DgAuthors" ItemsSource="{Binding AuthorsList}" SelectedItem="{Binding SelectedAuthor, Mode=TwoWay}" Grid.Column="0" AutoGenerateColumns="False" IsReadOnly="True" GridLinesVisibility="All" BorderThickness="1" BorderBrush="LightGray" Background="White">
<DataGrid.Columns>
<DataGridTextColumn Header="ID" Binding="{Binding Id}" Width="80"/>
<DataGridTextColumn Header="Имя Автора" Binding="{Binding Name}" Width="*"/>
</DataGrid.Columns>
</DataGrid>
<Border Grid.Column="1" Background="#1e293b" CornerRadius="8" Padding="15" BorderBrush="#334155" BorderThickness="1" VerticalAlignment="Top">
<Border Grid.Column="1" Background="White" CornerRadius="8" Padding="15" BorderBrush="LightGray" BorderThickness="1" VerticalAlignment="Top">
<StackPanel>
<TextBlock Text="Редактирование Автора" Foreground="#38bdf8" FontSize="15" FontWeight="Bold" Margin="0,0,0,5"/>
<TextBlock Text="Редактирование Автора" Foreground="Black" FontSize="15" FontWeight="Bold" Margin="0,0,0,5"/>
<StackPanel>
<TextBlock Text="Имя Автора" Foreground="#cbd5e1" FontSize="12"/>
<TextBox Name="TxtAuthorName" Height="34" CornerRadius="4"/>
<TextBlock Text="Имя Автора" Foreground="Black" FontSize="12"/>
<TextBox Name="TxtAuthorName" Text="{Binding AuthorName, Mode=TwoWay}" Height="34" CornerRadius="4"/>
</StackPanel>
<StackPanel Margin="0,10,0,0">
<Button Content=" Добавить" Click="BtnAddAuthor_Click" Background="#22c55e" Foreground="White" HorizontalAlignment="Stretch" Height="36" FontWeight="Bold" CornerRadius="4" HorizontalContentAlignment="Center"/>
<Button Content=" Сохранить" Click="BtnEditAuthor_Click" Background="#3b82f6" Foreground="White" HorizontalAlignment="Stretch" Height="36" FontWeight="Bold" CornerRadius="4" HorizontalContentAlignment="Center"/>
<Button Content=" Удалить" Click="BtnDeleteAuthor_Click" Background="#ef4444" Foreground="White" HorizontalAlignment="Stretch" Height="36" FontWeight="Bold" CornerRadius="4" HorizontalContentAlignment="Center"/>
<Button Content=" Очистить поля" Click="BtnClearAuthor_Click" Background="#64748b" Foreground="White" HorizontalAlignment="Stretch" Height="34" CornerRadius="4" HorizontalContentAlignment="Center"/>
<TextBlock Name="TxtAuthorStatus" Foreground="#ef4444" FontSize="12" Margin="0,10,0,0" TextWrapping="Wrap" HorizontalAlignment="Center"/>
<Button Content=" Добавить" Command="{Binding AddAuthorCommand}" Background="Green" Foreground="White" HorizontalAlignment="Stretch" Height="36" FontWeight="Bold" CornerRadius="4" HorizontalContentAlignment="Center"/>
<Button Content=" Сохранить" Command="{Binding EditAuthorCommand}" Background="Blue" Foreground="White" HorizontalAlignment="Stretch" Height="36" FontWeight="Bold" CornerRadius="4" HorizontalContentAlignment="Center"/>
<Button Content=" Удалить" Command="{Binding DeleteAuthorCommand}" Background="Red" Foreground="White" HorizontalAlignment="Stretch" Height="36" FontWeight="Bold" CornerRadius="4" HorizontalContentAlignment="Center"/>
<Button Content=" Очистить поля" Command="{Binding ClearAuthorCommand}" Background="Gray" Foreground="White" HorizontalAlignment="Stretch" Height="34" CornerRadius="4" HorizontalContentAlignment="Center"/>
<TextBlock Name="TxtAuthorStatus" Text="{Binding AuthorStatus}" Foreground="{Binding AuthorStatusColor}" FontSize="12" Margin="0,10,0,0" TextWrapping="Wrap" HorizontalAlignment="Center"/>
</StackPanel>
</StackPanel>
</Border>
</Grid>
<Grid Name="GridCopies" ColumnDefinitions="*, 320" IsVisible="False">
<DataGrid Name="DgCopies" Grid.Column="0" AutoGenerateColumns="False" IsReadOnly="True" GridLinesVisibility="All" BorderThickness="1" BorderBrush="#334155" Background="#1e293b" SelectionChanged="DgCopies_SelectionChanged">
<Grid Name="GridCopies" ColumnDefinitions="*, 320" IsVisible="{Binding IsCopiesVisible}">
<DataGrid Name="DgCopies" ItemsSource="{Binding CopiesList}" SelectedItem="{Binding SelectedCopy, Mode=TwoWay}" Grid.Column="0" AutoGenerateColumns="False" IsReadOnly="True" GridLinesVisibility="All" BorderThickness="1" BorderBrush="LightGray" Background="White">
<DataGrid.Columns>
<DataGridTextColumn Header="ID" Binding="{Binding Id}" Width="50"/>
<DataGridTextColumn Header="Книга" Binding="{Binding BookId.Title}" Width="2*"/>
<DataGridTextColumn Header="Инв. номер" Binding="{Binding Inventory_number}" Width="1*"/>
<DataGridTextColumn Header="Статус" Binding="{Binding Status}" Width="100"/>
<DataGridTextColumn Header="Статус" Binding="{Binding StatusText}" Width="100"/>
<DataGridTextColumn Header="Полка" Binding="{Binding Shelf_location}" Width="100"/>
</DataGrid.Columns>
</DataGrid>
<Border Grid.Column="1" Background="#1e293b" CornerRadius="8" Padding="15" BorderBrush="#334155" BorderThickness="1" VerticalAlignment="Top">
<Border Grid.Column="1" Background="White" CornerRadius="8" Padding="15" BorderBrush="LightGray" BorderThickness="1" VerticalAlignment="Top">
<StackPanel>
<TextBlock Text="Редактирование Экземпляра" Foreground="#38bdf8" FontSize="15" FontWeight="Bold" Margin="0,0,0,5"/>
<TextBlock Text="Редактирование Экземпляра" Foreground="Black" FontSize="15" FontWeight="Bold" Margin="0,0,0,5"/>
<StackPanel>
<TextBlock Text="Книга" Foreground="#cbd5e1" FontSize="12"/>
<ComboBox Name="CbCopyBook" HorizontalAlignment="Stretch" Height="34" CornerRadius="4"/>
<TextBlock Text="Книга (поиск)" Foreground="Black" FontSize="12"/>
<TextBox Name="TxtSearchCopyBook" Text="{Binding SearchCopyBookText, Mode=TwoWay}" Height="34" CornerRadius="4" Watermark="Начните вводить название книги..."/>
<ListBox Name="LbCopyBooks" ItemsSource="{Binding FilteredCopyBooks}" SelectedItem="{Binding SelectedCopyBook, Mode=TwoWay}" Height="80" Margin="0,2,0,0" CornerRadius="4" Background="White" BorderBrush="LightGray" BorderThickness="1">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Title}" Foreground="Black" FontSize="12"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
<StackPanel>
<TextBlock Text="Инвентарный номер" Foreground="#cbd5e1" FontSize="12"/>
<TextBox Name="TxtCopyInv" Height="34" CornerRadius="4"/>
<TextBlock Text="Инвентарный номер" Foreground="Black" FontSize="12"/>
<TextBox Name="TxtCopyInv" Text="{Binding CopyInv, Mode=TwoWay}" Height="34" CornerRadius="4"/>
</StackPanel>
<StackPanel>
<TextBlock Text="Статус" Foreground="#cbd5e1" FontSize="12"/>
<ComboBox Name="CbCopyStatus" HorizontalAlignment="Stretch" Height="34" CornerRadius="4">
<ComboBoxItem Content="available"/>
<ComboBoxItem Content="issued"/>
<ComboBoxItem Content="repair"/>
</ComboBox>
<TextBlock Text="Статус (available - доступна / issued - выдана / repair - в ремонте)" Foreground="Black" FontSize="12"/>
<TextBox Name="TxtCopyStatusField" Text="{Binding CopyStatusField, Mode=TwoWay}" Height="34" CornerRadius="4" Watermark="available (доступна)"/>
</StackPanel>
<StackPanel>
<TextBlock Text="Расположение (Полка)" Foreground="#cbd5e1" FontSize="12"/>
<TextBox Name="TxtCopyShelf" Height="34" CornerRadius="4"/>
<TextBlock Text="Расположение (Полка)" Foreground="Black" FontSize="12"/>
<TextBox Name="TxtCopyShelf" Text="{Binding CopyShelf, Mode=TwoWay}" Height="34" CornerRadius="4"/>
</StackPanel>
<StackPanel Margin="0,10,0,0">
<Button Content=" Добавить" Click="BtnAddCopy_Click" Background="#22c55e" Foreground="White" HorizontalAlignment="Stretch" Height="36" FontWeight="Bold" CornerRadius="4" HorizontalContentAlignment="Center"/>
<Button Content=" Сохранить" Click="BtnEditCopy_Click" Background="#3b82f6" Foreground="White" HorizontalAlignment="Stretch" Height="36" FontWeight="Bold" CornerRadius="4" HorizontalContentAlignment="Center"/>
<Button Content=" Удалить" Click="BtnDeleteCopy_Click" Background="#ef4444" Foreground="White" HorizontalAlignment="Stretch" Height="36" FontWeight="Bold" CornerRadius="4" HorizontalContentAlignment="Center"/>
<Button Content=" Очистить поля" Click="BtnClearCopy_Click" Background="#64748b" Foreground="White" HorizontalAlignment="Stretch" Height="34" CornerRadius="4" HorizontalContentAlignment="Center"/>
<TextBlock Name="TxtCopyStatus" Foreground="#ef4444" FontSize="12" Margin="0,10,0,0" TextWrapping="Wrap" HorizontalAlignment="Center"/>
<Button Content=" Добавить" Command="{Binding AddCopyCommand}" Background="Green" Foreground="White" HorizontalAlignment="Stretch" Height="36" FontWeight="Bold" CornerRadius="4" HorizontalContentAlignment="Center"/>
<Button Content=" Сохранить" Command="{Binding EditCopyCommand}" Background="Blue" Foreground="White" HorizontalAlignment="Stretch" Height="36" FontWeight="Bold" CornerRadius="4" HorizontalContentAlignment="Center"/>
<Button Content=" Удалить" Command="{Binding DeleteCopyCommand}" Background="Red" Foreground="White" HorizontalAlignment="Stretch" Height="36" FontWeight="Bold" CornerRadius="4" HorizontalContentAlignment="Center"/>
<Button Content=" Очистить поля" Command="{Binding ClearCopyCommand}" Background="Gray" Foreground="White" HorizontalAlignment="Stretch" Height="34" CornerRadius="4" HorizontalContentAlignment="Center"/>
<TextBlock Name="TxtCopyStatus" Text="{Binding CopyStatus}" Foreground="{Binding CopyStatusColor}" FontSize="12" Margin="0,10,0,0" TextWrapping="Wrap" HorizontalAlignment="Center"/>
</StackPanel>
</StackPanel>
</Border>
</Grid>
<Grid Name="GridUsers" ColumnDefinitions="*, 320" IsVisible="False">
<DataGrid Name="DgUsers" Grid.Column="0" AutoGenerateColumns="False" IsReadOnly="True" GridLinesVisibility="All" BorderThickness="1" BorderBrush="#334155" Background="#1e293b" SelectionChanged="DgUsers_SelectionChanged">
<Grid Name="GridUsers" ColumnDefinitions="*, 320" IsVisible="{Binding IsUsersVisible}">
<DataGrid Name="DgUsers" ItemsSource="{Binding UsersList}" SelectedItem="{Binding SelectedUser, Mode=TwoWay}" Grid.Column="0" AutoGenerateColumns="False" IsReadOnly="True" GridLinesVisibility="All" BorderThickness="1" BorderBrush="LightGray" Background="White">
<DataGrid.Columns>
<DataGridTextColumn Header="ID" Binding="{Binding Id}" Width="50"/>
<DataGridTextColumn Header="ФИО" Binding="{Binding Full_name}" Width="1.5*"/>
<DataGridTextColumn Header="Логин" Binding="{Binding Login}" Width="1*"/>
<DataGridTextColumn Header="Роль" Binding="{Binding RoleId.Name}" Width="100"/>
@ -168,75 +175,95 @@
<DataGridTextColumn Header="Телефон" Binding="{Binding Phone}" Width="100"/>
</DataGrid.Columns>
</DataGrid>
<Border Grid.Column="1" Background="#1e293b" CornerRadius="8" Padding="15" BorderBrush="#334155" BorderThickness="1">
<Border Grid.Column="1" Background="White" CornerRadius="8" Padding="15" BorderBrush="LightGray" BorderThickness="1">
<ScrollViewer>
<StackPanel>
<TextBlock Text="Редактирование Пользователя" Foreground="#38bdf8" FontSize="15" FontWeight="Bold" Margin="0,0,0,5"/>
<TextBlock Text="Редактирование Пользователя" Foreground="Black" FontSize="15" FontWeight="Bold" Margin="0,0,0,5"/>
<StackPanel>
<TextBlock Text="ФИО" Foreground="#cbd5e1" FontSize="12"/>
<TextBox Name="TxtUserFullName" Height="34" CornerRadius="4"/>
<TextBlock Text="ФИО" Foreground="Black" FontSize="12"/>
<TextBox Name="TxtUserFullName" Text="{Binding UserFullName, Mode=TwoWay}" Height="34" CornerRadius="4"/>
</StackPanel>
<StackPanel>
<TextBlock Text="Роль" Foreground="#cbd5e1" FontSize="12"/>
<ComboBox Name="CbUserRole" HorizontalAlignment="Stretch" Height="34" CornerRadius="4"/>
<TextBlock Text="Роль (поиск)" Foreground="Black" FontSize="12"/>
<TextBox Name="TxtSearchUserRole" Text="{Binding SearchUserRoleText, Mode=TwoWay}" Height="34" CornerRadius="4" Watermark="Начните вводить название роли..."/>
<ListBox Name="LbUserRoles" ItemsSource="{Binding FilteredUserRoles}" SelectedItem="{Binding SelectedUserRole, Mode=TwoWay}" Height="60" Margin="0,2,0,0" CornerRadius="4" Background="White" BorderBrush="LightGray" BorderThickness="1">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" Foreground="Black" FontSize="12"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
<StackPanel>
<TextBlock Text="Логин" Foreground="#cbd5e1" FontSize="12"/>
<TextBox Name="TxtUserLogin" Height="34" CornerRadius="4"/>
<TextBlock Text="Логин" Foreground="Black" FontSize="12"/>
<TextBox Name="TxtUserLogin" Text="{Binding UserLogin, Mode=TwoWay}" Height="34" CornerRadius="4"/>
</StackPanel>
<StackPanel>
<TextBlock Text="Пароль" Foreground="#cbd5e1" FontSize="12"/>
<TextBox Name="TxtUserPass" Height="34" CornerRadius="4"/>
<TextBlock Text="Пароль" Foreground="Black" FontSize="12"/>
<TextBox Name="TxtUserPass" Text="{Binding UserPass, Mode=TwoWay}" Height="34" CornerRadius="4"/>
</StackPanel>
<StackPanel>
<TextBlock Text="Email" Foreground="#cbd5e1" FontSize="12"/>
<TextBox Name="TxtUserEmail" Height="34" CornerRadius="4"/>
<TextBlock Text="Email" Foreground="Black" FontSize="12"/>
<TextBox Name="TxtUserEmail" Text="{Binding UserEmail, Mode=TwoWay}" Height="34" CornerRadius="4"/>
</StackPanel>
<StackPanel>
<TextBlock Text="Телефон" Foreground="#cbd5e1" FontSize="12"/>
<TextBox Name="TxtUserPhone" Height="34" CornerRadius="4"/>
<TextBlock Text="Телефон" Foreground="Black" FontSize="12"/>
<TextBox Name="TxtUserPhone" Text="{Binding UserPhone, Mode=TwoWay}" Height="34" CornerRadius="4"/>
</StackPanel>
<StackPanel Margin="0,10,0,0">
<Button Content=" Добавить" Click="BtnAddUser_Click" Background="#22c55e" Foreground="White" HorizontalAlignment="Stretch" Height="36" FontWeight="Bold" CornerRadius="4" HorizontalContentAlignment="Center"/>
<Button Content=" Сохранить" Click="BtnEditUser_Click" Background="#3b82f6" Foreground="White" HorizontalAlignment="Stretch" Height="36" FontWeight="Bold" CornerRadius="4" HorizontalContentAlignment="Center"/>
<Button Content=" Удалить" Click="BtnDeleteUser_Click" Background="#ef4444" Foreground="White" HorizontalAlignment="Stretch" Height="36" FontWeight="Bold" CornerRadius="4" HorizontalContentAlignment="Center"/>
<Button Content=" Очистить поля" Click="BtnClearUser_Click" Background="#64748b" Foreground="White" HorizontalAlignment="Stretch" Height="34" CornerRadius="4" HorizontalContentAlignment="Center"/>
<TextBlock Name="TxtUserStatus" Foreground="#ef4444" FontSize="12" Margin="0,10,0,0" TextWrapping="Wrap" HorizontalAlignment="Center"/>
<Button Content=" Добавить" Command="{Binding AddUserCommand}" Background="Green" Foreground="White" HorizontalAlignment="Stretch" Height="36" FontWeight="Bold" CornerRadius="4" HorizontalContentAlignment="Center"/>
<Button Content=" Сохранить" Command="{Binding EditUserCommand}" Background="Blue" Foreground="White" HorizontalAlignment="Stretch" Height="36" FontWeight="Bold" CornerRadius="4" HorizontalContentAlignment="Center"/>
<Button Content=" Удалить" Command="{Binding DeleteUserCommand}" Background="Red" Foreground="White" HorizontalAlignment="Stretch" Height="36" FontWeight="Bold" CornerRadius="4" HorizontalContentAlignment="Center"/>
<Button Content=" Очистить поля" Command="{Binding ClearUserCommand}" Background="Gray" Foreground="White" HorizontalAlignment="Stretch" Height="34" CornerRadius="4" HorizontalContentAlignment="Center"/>
<TextBlock Name="TxtUserStatus" Text="{Binding UserStatus}" Foreground="{Binding UserStatusColor}" FontSize="12" Margin="0,10,0,0" TextWrapping="Wrap" HorizontalAlignment="Center"/>
</StackPanel>
</StackPanel>
</ScrollViewer>
</Border>
</Grid>
<Grid Name="GridReports" RowDefinitions="Auto, *" IsVisible="False">
<Grid Name="GridReports" RowDefinitions="Auto, *" IsVisible="{Binding IsReportsVisible}">
<Grid Grid.Row="0" ColumnDefinitions="*, *, Auto">
<Border Grid.Column="0" Background="#1e293b" CornerRadius="8" Padding="15" BorderBrush="#334155" BorderThickness="1">
<Border Grid.Column="0" Background="White" CornerRadius="8" Padding="15" BorderBrush="LightGray" BorderThickness="1">
<StackPanel>
<TextBlock Text="Собрано штрафов" Foreground="#94a3b8" FontSize="12" FontWeight="SemiBold"/>
<TextBlock Name="TxtFinesCollected" Text="0.00 руб." Foreground="#22c55e" FontSize="22" FontWeight="Bold"/>
<TextBlock Text="Собрано штрафов" Foreground="Black" FontSize="12" FontWeight="SemiBold"/>
<TextBlock Name="TxtFinesCollected" Text="{Binding FinesCollected}" Foreground="Green" FontSize="22" FontWeight="Bold"/>
</StackPanel>
</Border>
<Border Grid.Column="1" Background="#1e293b" CornerRadius="8" Padding="15" BorderBrush="#334155" BorderThickness="1">
<Border Grid.Column="1" Background="White" CornerRadius="8" Padding="15" BorderBrush="LightGray" BorderThickness="1">
<StackPanel>
<TextBlock Text="Невыплаченные штрафы" Foreground="#94a3b8" FontSize="12" FontWeight="SemiBold"/>
<TextBlock Name="TxtFinesUnpaid" Text="0.00 руб." Foreground="#ef4444" FontSize="22" FontWeight="Bold"/>
<TextBlock Text="Невыплаченные штрафы" Foreground="Black" FontSize="12" FontWeight="SemiBold"/>
<TextBlock Name="TxtFinesUnpaid" Text="{Binding FinesUnpaid}" Foreground="Red" FontSize="22" FontWeight="Bold"/>
</StackPanel>
</Border>
<Button Grid.Column="2" Content="🔄 Обновить отчеты" Click="BtnRefreshReports_Click" Background="#3b82f6" Foreground="White" Height="60" Width="160" FontWeight="Bold" CornerRadius="8" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
<Button Grid.Column="2" Content="🔄 Обновить отчеты" Command="{Binding RefreshReportsCommand}" Background="Blue" Foreground="White" Height="60" Width="160" FontWeight="Bold" CornerRadius="8" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
</Grid>
<Grid Grid.Row="1" ColumnDefinitions="*, *">
<Border Grid.Column="0" Background="#1e293b" CornerRadius="8" Padding="15" BorderBrush="#334155" BorderThickness="1">
<Border Grid.Column="0" Background="White" CornerRadius="8" Padding="15" BorderBrush="LightGray" BorderThickness="1">
<Grid RowDefinitions="Auto, *">
<TextBlock Grid.Row="0" Text="Самые популярные книги (Топ 5)" Foreground="#38bdf8" FontSize="15" FontWeight="Bold" Margin="0,0,0,10"/>
<DataGrid Name="DgPopularBooks" Grid.Row="1" AutoGenerateColumns="True" IsReadOnly="True" GridLinesVisibility="All" Background="Transparent"/>
<TextBlock Grid.Row="0" Text="Самые популярные книги (Топ 5)" Foreground="Black" FontSize="15" FontWeight="Bold" Margin="0,0,0,10"/>
<DataGrid Name="DgPopularBooks" ItemsSource="{Binding PopularBooksList}" Grid.Row="1" AutoGenerateColumns="False" IsReadOnly="True" GridLinesVisibility="All" Background="Transparent">
<DataGrid.Columns>
<DataGridTextColumn Header="Название книги" Binding="{Binding Title}" Width="2*"/>
<DataGridTextColumn Header="Кол-во выдач" Binding="{Binding BorrowCount}" Width="1*"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Border>
<Border Grid.Column="1" Background="#1e293b" CornerRadius="8" Padding="15" BorderBrush="#334155" BorderThickness="1">
<Border Grid.Column="1" Background="White" CornerRadius="8" Padding="15" BorderBrush="LightGray" BorderThickness="1">
<Grid RowDefinitions="Auto, *">
<TextBlock Grid.Row="0" Text="Просроченные выдачи книг" Foreground="#ef4444" FontSize="15" FontWeight="Bold" Margin="0,0,0,10"/>
<DataGrid Name="DgOverdueLoans" Grid.Row="1" AutoGenerateColumns="True" IsReadOnly="True" GridLinesVisibility="All" Background="Transparent"/>
<TextBlock Grid.Row="0" Text="Просроченные выдачи книг" Foreground="Red" FontSize="15" FontWeight="Bold" Margin="0,0,0,10"/>
<DataGrid Name="DgOverdueLoans" ItemsSource="{Binding OverdueLoansList}" Grid.Row="1" AutoGenerateColumns="False" IsReadOnly="True" GridLinesVisibility="All" Background="Transparent">
<DataGrid.Columns>
<DataGridTextColumn Header="Название книги" Binding="{Binding Title}" Width="1.5*"/>
<DataGridTextColumn Header="Читатель" Binding="{Binding Reader}" Width="1.5*"/>
<DataGridTextColumn Header="Дата выдачи" Binding="{Binding IssueDate}" Width="1*"/>
<DataGridTextColumn Header="Срок сдачи" Binding="{Binding DueDate}" Width="1*"/>
<DataGridTextColumn Header="Дней просрочки" Binding="{Binding OverdueDays}" Width="1*"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Border>
</Grid>

View File

@ -1,609 +1,23 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Interactivity;
using Avalonia.Media;
using CourseProject1125.DB;
using CourseProject1125.Models;
using CourseProject1125.ViewModels;
namespace CourseProject1125.Views;
public partial class AdminWindow : Window
namespace CourseProject1125.Views
{
private Author? _selectedAuthor;
private Book? _selectedBook;
private Book_copies? _selectedCopy;
private User? _selectedUser;
private List<Author> _allAuthors = new();
private List<Book> _allBooks = new();
private List<Role> _allRoles = new();
public AdminWindow()
public partial class AdminWindow : Window
{
InitializeComponent();
// Show current logged-in user name
TxtAdminName.Text = UserSession.UserName;
// Initialize view
LoadAllData();
ShowTab("Books");
}
private void LoadAllData()
{
RefreshAuthors();
RefreshBooks();
RefreshCopies();
RefreshUsers();
RefreshReports();
}
#region Tab Navigation
private void BtnTab_Click(object? sender, RoutedEventArgs e)
{
if (sender is Button btn && btn.Tag is string tabName)
public AdminWindow()
{
ShowTab(tabName);
}
}
private void ShowTab(string tabName)
{
// Set all tab panels visibility to false
GridBooks.IsVisible = false;
GridAuthors.IsVisible = false;
GridCopies.IsVisible = false;
GridUsers.IsVisible = false;
GridReports.IsVisible = false;
// Set all buttons background and foreground to default
ResetButtonStyles(BtnTabBooks);
ResetButtonStyles(BtnTabAuthors);
ResetButtonStyles(BtnTabCopies);
ResetButtonStyles(BtnTabUsers);
ResetButtonStyles(BtnTabReports);
switch (tabName)
{
case "Books":
GridBooks.IsVisible = true;
TxtActiveTabHeader.Text = "📚 Управление книгами";
SetActiveButtonStyles(BtnTabBooks);
RefreshBooks();
break;
case "Authors":
GridAuthors.IsVisible = true;
TxtActiveTabHeader.Text = "✍️ Управление авторами";
SetActiveButtonStyles(BtnTabAuthors);
RefreshAuthors();
break;
case "Copies":
GridCopies.IsVisible = true;
TxtActiveTabHeader.Text = "🔢 Управление экземплярами";
SetActiveButtonStyles(BtnTabCopies);
RefreshCopies();
break;
case "Users":
GridUsers.IsVisible = true;
TxtActiveTabHeader.Text = "👥 Управление пользователями";
SetActiveButtonStyles(BtnTabUsers);
RefreshUsers();
break;
case "Reports":
GridReports.IsVisible = true;
TxtActiveTabHeader.Text = "📊 Аналитические отчеты";
SetActiveButtonStyles(BtnTabReports);
RefreshReports();
break;
}
}
private void ResetButtonStyles(Button btn)
{
btn.Background = Brushes.Transparent;
btn.Foreground = Brush.Parse("#94a3b8");
}
private void SetActiveButtonStyles(Button btn)
{
btn.Background = Brush.Parse("#0f172a");
btn.Foreground = Brush.Parse("#38bdf8");
}
private void BtnLogout_Click(object? sender, RoutedEventArgs e)
{
var mainWin = new MainWindow();
mainWin.Show();
this.Close();
}
#endregion
#region CRUD Authors
private void RefreshAuthors()
{
_allAuthors = DatabaseService.GetAuthors();
DgAuthors.ItemsSource = null;
DgAuthors.ItemsSource = _allAuthors;
// Update Author Combobox in Books Editor
CbBookAuthor.ItemsSource = null;
CbBookAuthor.ItemsSource = _allAuthors;
}
private void DgAuthors_SelectionChanged(object? sender, SelectionChangedEventArgs e)
{
if (DgAuthors.SelectedItem is Author author)
{
_selectedAuthor = author;
TxtAuthorName.Text = author.Name;
}
}
private void BtnAddAuthor_Click(object? sender, RoutedEventArgs e)
{
string name = TxtAuthorName.Text?.Trim() ?? "";
if (string.IsNullOrEmpty(name))
{
TxtAuthorStatus.Foreground = Brush.Parse("#ef4444");
TxtAuthorStatus.Text = "Имя автора не может быть пустым.";
return;
}
if (DatabaseService.AddAuthor(name))
{
RefreshAuthors();
BtnClearAuthor_Click(null, e);
TxtAuthorStatus.Foreground = Brush.Parse("#22c55e");
TxtAuthorStatus.Text = "Автор добавлен!";
}
else
{
TxtAuthorStatus.Foreground = Brush.Parse("#ef4444");
TxtAuthorStatus.Text = "Ошибка добавления автора.";
}
}
private void BtnEditAuthor_Click(object? sender, RoutedEventArgs e)
{
if (_selectedAuthor == null)
{
TxtAuthorStatus.Foreground = Brush.Parse("#ef4444");
TxtAuthorStatus.Text = "Выберите автора для редактирования.";
return;
}
string name = TxtAuthorName.Text?.Trim() ?? "";
if (string.IsNullOrEmpty(name)) return;
if (DatabaseService.UpdateAuthor(_selectedAuthor.Id, name))
{
RefreshAuthors();
BtnClearAuthor_Click(null, e);
TxtAuthorStatus.Foreground = Brush.Parse("#22c55e");
TxtAuthorStatus.Text = "Автор обновлен!";
}
else
{
TxtAuthorStatus.Foreground = Brush.Parse("#ef4444");
TxtAuthorStatus.Text = "Ошибка обновления автора.";
}
}
private void BtnDeleteAuthor_Click(object? sender, RoutedEventArgs e)
{
if (_selectedAuthor == null) return;
if (DatabaseService.DeleteAuthor(_selectedAuthor.Id))
{
RefreshAuthors();
BtnClearAuthor_Click(null, e);
TxtAuthorStatus.Foreground = Brush.Parse("#22c55e");
TxtAuthorStatus.Text = "Автор удален!";
}
else
{
TxtAuthorStatus.Foreground = Brush.Parse("#ef4444");
TxtAuthorStatus.Text = "Ошибка удаления автора (возможно, он связан с книгами).";
}
}
private void BtnClearAuthor_Click(object? sender, RoutedEventArgs e)
{
_selectedAuthor = null;
TxtAuthorName.Text = "";
DgAuthors.SelectedItem = null;
TxtAuthorStatus.Text = "";
}
#endregion
#region CRUD Books
private void RefreshBooks()
{
_allBooks = DatabaseService.GetBooks();
DgBooks.ItemsSource = null;
DgBooks.ItemsSource = _allBooks;
// Update Books Combobox in Copies Editor
CbCopyBook.ItemsSource = null;
CbCopyBook.ItemsSource = _allBooks;
}
private void DgBooks_SelectionChanged(object? sender, SelectionChangedEventArgs e)
{
if (DgBooks.SelectedItem is Book book)
{
_selectedBook = book;
TxtBookTitle.Text = book.Title;
TxtBookIsbn.Text = book.Isbn;
TxtBookYear.Text = book.Year_published.ToString();
TxtBookDesc.Text = book.Description;
// Select matching author in ComboBox
CbBookAuthor.SelectedItem = _allAuthors.FirstOrDefault(a => a.Id == book.AuthorId.Id);
}
}
private void BtnAddBook_Click(object? sender, RoutedEventArgs e)
{
string title = TxtBookTitle.Text?.Trim() ?? "";
string isbn = TxtBookIsbn.Text?.Trim() ?? "";
string desc = TxtBookDesc.Text?.Trim() ?? "";
int.TryParse(TxtBookYear.Text?.Trim(), out int year);
var author = CbBookAuthor.SelectedItem as Author;
if (string.IsNullOrEmpty(title))
{
TxtBookStatus.Foreground = Brush.Parse("#ef4444");
TxtBookStatus.Text = "Название книги не может быть пустым.";
return;
}
if (author == null)
{
TxtBookStatus.Foreground = Brush.Parse("#ef4444");
TxtBookStatus.Text = "Выберите автора (сначала добавьте его во вкладке 'Авторы').";
return;
}
if (DatabaseService.AddBook(title, isbn, desc, year, author.Id))
{
RefreshBooks();
BtnClearBook_Click(null, e);
TxtBookStatus.Foreground = Brush.Parse("#22c55e");
TxtBookStatus.Text = "Книга добавлена!";
}
else
{
TxtBookStatus.Foreground = Brush.Parse("#ef4444");
TxtBookStatus.Text = "Ошибка добавления (проверьте ISBN на уникальность).";
}
}
private void BtnEditBook_Click(object? sender, RoutedEventArgs e)
{
if (_selectedBook == null)
{
TxtBookStatus.Foreground = Brush.Parse("#ef4444");
TxtBookStatus.Text = "Выберите книгу для редактирования.";
return;
}
string title = TxtBookTitle.Text?.Trim() ?? "";
string isbn = TxtBookIsbn.Text?.Trim() ?? "";
string desc = TxtBookDesc.Text?.Trim() ?? "";
int.TryParse(TxtBookYear.Text?.Trim(), out int year);
var author = CbBookAuthor.SelectedItem as Author;
if (string.IsNullOrEmpty(title) || author == null) return;
if (DatabaseService.UpdateBook(_selectedBook.Id, title, isbn, desc, year, author.Id))
{
RefreshBooks();
BtnClearBook_Click(null, e);
TxtBookStatus.Foreground = Brush.Parse("#22c55e");
TxtBookStatus.Text = "Книга обновлена!";
}
else
{
TxtBookStatus.Foreground = Brush.Parse("#ef4444");
TxtBookStatus.Text = "Ошибка обновления книги.";
}
}
private void BtnDeleteBook_Click(object? sender, RoutedEventArgs e)
{
if (_selectedBook == null) return;
if (DatabaseService.DeleteBook(_selectedBook.Id))
{
RefreshBooks();
BtnClearBook_Click(null, e);
TxtBookStatus.Foreground = Brush.Parse("#22c55e");
TxtBookStatus.Text = "Книга удалена!";
}
else
{
TxtBookStatus.Foreground = Brush.Parse("#ef4444");
TxtBookStatus.Text = "Ошибка удаления книги (возможно, есть выданные экземпляры).";
}
}
private void BtnClearBook_Click(object? sender, RoutedEventArgs e)
{
_selectedBook = null;
TxtBookTitle.Text = "";
TxtBookIsbn.Text = "";
TxtBookYear.Text = "";
TxtBookDesc.Text = "";
CbBookAuthor.SelectedItem = null;
DgBooks.SelectedItem = null;
TxtBookStatus.Text = "";
}
#endregion
#region CRUD Copies
private void RefreshCopies()
{
var copies = DatabaseService.GetBookCopies();
DgCopies.ItemsSource = null;
DgCopies.ItemsSource = copies;
}
private void DgCopies_SelectionChanged(object? sender, SelectionChangedEventArgs e)
{
if (DgCopies.SelectedItem is Book_copies copy)
{
_selectedCopy = copy;
TxtCopyInv.Text = copy.Inventory_number;
TxtCopyShelf.Text = copy.Shelf_location;
CbCopyBook.SelectedItem = _allBooks.FirstOrDefault(b => b.Id == copy.BookId.Id);
// Select matching status in combobox
foreach (ComboBoxItem item in CbCopyStatus.Items)
var viewModel = new AdminWindowViewModel();
viewModel.OnLogoutRequested = () =>
{
if (item.Content?.ToString() == copy.Status)
{
CbCopyStatus.SelectedItem = item;
break;
}
}
var mainWin = new MainWindow();
mainWin.Show();
this.Close();
};
DataContext = viewModel;
InitializeComponent();
}
}
private void BtnAddCopy_Click(object? sender, RoutedEventArgs e)
{
var book = CbCopyBook.SelectedItem as Book;
string inv = TxtCopyInv.Text?.Trim() ?? "";
string shelf = TxtCopyShelf.Text?.Trim() ?? "";
var statusItem = CbCopyStatus.SelectedItem as ComboBoxItem;
string status = statusItem?.Content?.ToString() ?? "available";
if (book == null)
{
TxtCopyStatus.Foreground = Brush.Parse("#ef4444");
TxtCopyStatus.Text = "Выберите книгу.";
return;
}
if (string.IsNullOrEmpty(inv))
{
TxtCopyStatus.Foreground = Brush.Parse("#ef4444");
TxtCopyStatus.Text = "Инвентарный номер обязателен.";
return;
}
if (DatabaseService.AddBookCopy(book.Id, inv, status, shelf))
{
RefreshCopies();
BtnClearCopy_Click(null, e);
TxtCopyStatus.Foreground = Brush.Parse("#22c55e");
TxtCopyStatus.Text = "Экземпляр добавлен!";
}
else
{
TxtCopyStatus.Foreground = Brush.Parse("#ef4444");
TxtCopyStatus.Text = "Ошибка добавления (проверьте уникальность инв. номера).";
}
}
private void BtnEditCopy_Click(object? sender, RoutedEventArgs e)
{
if (_selectedCopy == null)
{
TxtCopyStatus.Foreground = Brush.Parse("#ef4444");
TxtCopyStatus.Text = "Выберите экземпляр для редактирования.";
return;
}
var book = CbCopyBook.SelectedItem as Book;
string inv = TxtCopyInv.Text?.Trim() ?? "";
string shelf = TxtCopyShelf.Text?.Trim() ?? "";
var statusItem = CbCopyStatus.SelectedItem as ComboBoxItem;
string status = statusItem?.Content?.ToString() ?? "available";
if (book == null || string.IsNullOrEmpty(inv)) return;
if (DatabaseService.UpdateBookCopy(_selectedCopy.Id, book.Id, inv, status, shelf))
{
RefreshCopies();
BtnClearCopy_Click(null, e);
TxtCopyStatus.Foreground = Brush.Parse("#22c55e");
TxtCopyStatus.Text = "Экземпляр обновлен!";
}
else
{
TxtCopyStatus.Foreground = Brush.Parse("#ef4444");
TxtCopyStatus.Text = "Ошибка обновления.";
}
}
private void BtnDeleteCopy_Click(object? sender, RoutedEventArgs e)
{
if (_selectedCopy == null) return;
if (DatabaseService.DeleteBookCopy(_selectedCopy.Id))
{
RefreshCopies();
BtnClearCopy_Click(null, e);
TxtCopyStatus.Foreground = Brush.Parse("#22c55e");
TxtCopyStatus.Text = "Экземпляр удален!";
}
else
{
TxtCopyStatus.Foreground = Brush.Parse("#ef4444");
TxtCopyStatus.Text = "Ошибка удаления экземпляра.";
}
}
private void BtnClearCopy_Click(object? sender, RoutedEventArgs e)
{
_selectedCopy = null;
TxtCopyInv.Text = "";
TxtCopyShelf.Text = "";
CbCopyBook.SelectedItem = null;
CbCopyStatus.SelectedIndex = 0;
DgCopies.SelectedItem = null;
TxtCopyStatus.Text = "";
}
#endregion
#region CRUD Users
private void RefreshUsers()
{
var users = DatabaseService.GetUsers();
DgUsers.ItemsSource = null;
DgUsers.ItemsSource = users;
_allRoles = DatabaseService.GetRoles();
CbUserRole.ItemsSource = null;
CbUserRole.ItemsSource = _allRoles;
}
private void DgUsers_SelectionChanged(object? sender, SelectionChangedEventArgs e)
{
if (DgUsers.SelectedItem is User user)
{
_selectedUser = user;
TxtUserFullName.Text = user.Full_name;
TxtUserLogin.Text = user.Login;
TxtUserPass.Text = user.Password_hash; // Plain compare standard
TxtUserEmail.Text = user.Email;
TxtUserPhone.Text = user.Phone;
CbUserRole.SelectedItem = _allRoles.FirstOrDefault(r => r.id == user.RoleId.id);
}
}
private void BtnAddUser_Click(object? sender, RoutedEventArgs e)
{
string name = TxtUserFullName.Text?.Trim() ?? "";
string login = TxtUserLogin.Text?.Trim() ?? "";
string pass = TxtUserPass.Text?.Trim() ?? "";
string email = TxtUserEmail.Text?.Trim() ?? "";
string phone = TxtUserPhone.Text?.Trim() ?? "";
var role = CbUserRole.SelectedItem as Role;
if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(login) || string.IsNullOrEmpty(pass) || role == null)
{
TxtUserStatus.Foreground = Brush.Parse("#ef4444");
TxtUserStatus.Text = "Заполните обязательные поля (ФИО, Логин, Пароль, Роль).";
return;
}
if (DatabaseService.AddUser(name, email, phone, login, pass, role.id))
{
RefreshUsers();
BtnClearUser_Click(null, e);
TxtUserStatus.Foreground = Brush.Parse("#22c55e");
TxtUserStatus.Text = "Пользователь добавлен!";
}
else
{
TxtUserStatus.Foreground = Brush.Parse("#ef4444");
TxtUserStatus.Text = "Ошибка добавления (проверьте уникальность Логина/Email).";
}
}
private void BtnEditUser_Click(object? sender, RoutedEventArgs e)
{
if (_selectedUser == null)
{
TxtUserStatus.Foreground = Brush.Parse("#ef4444");
TxtUserStatus.Text = "Выберите пользователя для редактирования.";
return;
}
string name = TxtUserFullName.Text?.Trim() ?? "";
string login = TxtUserLogin.Text?.Trim() ?? "";
string pass = TxtUserPass.Text?.Trim() ?? "";
string email = TxtUserEmail.Text?.Trim() ?? "";
string phone = TxtUserPhone.Text?.Trim() ?? "";
var role = CbUserRole.SelectedItem as Role;
if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(login) || string.IsNullOrEmpty(pass) || role == null) return;
if (DatabaseService.UpdateUser(_selectedUser.Id, name, email, phone, login, pass, role.id))
{
RefreshUsers();
BtnClearUser_Click(null, e);
TxtUserStatus.Foreground = Brush.Parse("#22c55e");
TxtUserStatus.Text = "Пользователь обновлен!";
}
else
{
TxtUserStatus.Foreground = Brush.Parse("#ef4444");
TxtUserStatus.Text = "Ошибка обновления пользователя.";
}
}
private void BtnDeleteUser_Click(object? sender, RoutedEventArgs e)
{
if (_selectedUser == null) return;
if (DatabaseService.DeleteUser(_selectedUser.Id))
{
RefreshUsers();
BtnClearUser_Click(null, e);
TxtUserStatus.Foreground = Brush.Parse("#22c55e");
TxtUserStatus.Text = "Пользователь удален!";
}
else
{
TxtUserStatus.Foreground = Brush.Parse("#ef4444");
TxtUserStatus.Text = "Ошибка удаления пользователя.";
}
}
private void BtnClearUser_Click(object? sender, RoutedEventArgs e)
{
_selectedUser = null;
TxtUserFullName.Text = "";
TxtUserLogin.Text = "";
TxtUserPass.Text = "";
TxtUserEmail.Text = "";
TxtUserPhone.Text = "";
CbUserRole.SelectedItem = null;
DgUsers.SelectedItem = null;
TxtUserStatus.Text = "";
}
#endregion
#region Reports
private void RefreshReports()
{
// 1. Stats card
decimal collected = DatabaseService.GetTotalFinesCollected();
decimal unpaid = DatabaseService.GetTotalFinesUnpaid();
TxtFinesCollected.Text = $"{collected:N2} руб.";
TxtFinesUnpaid.Text = $"{unpaid:N2} руб.";
// 2. DataGrids
DgPopularBooks.ItemsSource = null;
DgPopularBooks.ItemsSource = DatabaseService.GetPopularBooks().DefaultView;
DgOverdueLoans.ItemsSource = null;
DgOverdueLoans.ItemsSource = DatabaseService.GetOverdueLoans().DefaultView;
}
private void BtnRefreshReports_Click(object? sender, RoutedEventArgs e)
{
RefreshReports();
}
#endregion
}

View File

@ -1,171 +1,191 @@
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:CourseProject1125.ViewModels"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="1100" d:DesignHeight="650"
x:Class="CourseProject1125.Views.LibrarianWindow"
x:DataType="vm:LibrarianWindowViewModel"
Title="Панель библиотекаря - Библиотека"
Width="1100" Height="650"
WindowStartupLocation="CenterScreen"
Background="#0f172a">
Background="White">
<Grid ColumnDefinitions="240, *">
<Border Grid.Column="0" Background="#1e293b" BorderBrush="#334155" BorderThickness="0,0,1,0" Padding="15">
<Border Grid.Column="0" Background="LightGray" BorderBrush="Gray" BorderThickness="0,0,1,0" Padding="15">
<Grid RowDefinitions="Auto, *, Auto">
<StackPanel Grid.Row="0" Margin="0,10,0,30">
<TextBlock Text="БИБЛИОТЕКА" Foreground="#38bdf8" FontSize="20" FontWeight="Bold" HorizontalAlignment="Center" LetterSpacing="1"/>
<TextBlock Text="Панель библиотекаря" Foreground="#94a3b8" FontSize="11" HorizontalAlignment="Center"/>
<TextBlock Name="TxtLibrarianName" Foreground="#cbd5e1" FontSize="12" FontWeight="SemiBold" HorizontalAlignment="Center" Margin="0,10,0,0"/>
<TextBlock Text="БИБЛИОТЕКА" Foreground="Black" FontSize="20" FontWeight="Bold" HorizontalAlignment="Center" LetterSpacing="1"/>
<TextBlock Text="Панель библиотекаря" Foreground="Black" FontSize="11" HorizontalAlignment="Center"/>
<TextBlock Name="TxtLibrarianName" Text="{Binding LibrarianName}" Foreground="Black" FontSize="12" FontWeight="SemiBold" HorizontalAlignment="Center" Margin="0,10,0,0"/>
</StackPanel>
<StackPanel Grid.Row="1">
<Button Name="BtnTabIssue" Content=" Выдача книг" Click="BtnTab_Click" Tag="Issue" HorizontalAlignment="Stretch" Height="40" Background="Transparent" Foreground="#94a3b8" FontWeight="SemiBold" CornerRadius="6" HorizontalContentAlignment="Left" Padding="15,0,0,0"/>
<Button Name="BtnTabReturns" Content=" Возврат книг" Click="BtnTab_Click" Tag="Returns" HorizontalAlignment="Stretch" Height="40" Background="Transparent" Foreground="#94a3b8" FontWeight="SemiBold" CornerRadius="6" HorizontalContentAlignment="Left" Padding="15,0,0,0"/>
<Button Name="BtnTabRegister" Content=" Регистрация читателей" Click="BtnTab_Click" Tag="Register" HorizontalAlignment="Stretch" Height="40" Background="Transparent" Foreground="#94a3b8" FontWeight="SemiBold" CornerRadius="6" HorizontalContentAlignment="Left" Padding="15,0,0,0"/>
<Button Name="BtnTabFines" Content=" Штрафы" Click="BtnTab_Click" Tag="Fines" HorizontalAlignment="Stretch" Height="40" Background="Transparent" Foreground="#94a3b8" FontWeight="SemiBold" CornerRadius="6" HorizontalContentAlignment="Left" Padding="15,0,0,0"/>
<Button Name="BtnTabReservations" Content=" Бронирования" Click="BtnTab_Click" Tag="Reservations" HorizontalAlignment="Stretch" Height="40" Background="Transparent" Foreground="#94a3b8" FontWeight="SemiBold" CornerRadius="6" HorizontalContentAlignment="Left" Padding="15,0,0,0"/>
<Button Name="BtnTabIssue" Content=" Выдача книг" Command="{Binding ShowTabCommand}" CommandParameter="Issue" Background="{Binding IssueTabBackground}" Foreground="{Binding IssueTabForeground}" HorizontalAlignment="Stretch" Height="40" FontWeight="SemiBold" CornerRadius="6" HorizontalContentAlignment="Left" Padding="15,0,0,0"/>
<Button Name="BtnTabReturns" Content=" Возврат книг" Command="{Binding ShowTabCommand}" CommandParameter="Returns" Background="{Binding ReturnsTabBackground}" Foreground="{Binding ReturnsTabForeground}" HorizontalAlignment="Stretch" Height="40" FontWeight="SemiBold" CornerRadius="6" HorizontalContentAlignment="Left" Padding="15,0,0,0"/>
<Button Name="BtnTabRegister" Content=" Регистрация читателей" Command="{Binding ShowTabCommand}" CommandParameter="Register" Background="{Binding RegisterTabBackground}" Foreground="{Binding RegisterTabForeground}" HorizontalAlignment="Stretch" Height="40" FontWeight="SemiBold" CornerRadius="6" HorizontalContentAlignment="Left" Padding="15,0,0,0"/>
<Button Name="BtnTabFines" Content=" Штрафы" Command="{Binding ShowTabCommand}" CommandParameter="Fines" Background="{Binding FinesTabBackground}" Foreground="{Binding FinesTabForeground}" HorizontalAlignment="Stretch" Height="40" FontWeight="SemiBold" CornerRadius="6" HorizontalContentAlignment="Left" Padding="15,0,0,0"/>
<Button Name="BtnTabReservations" Content=" Бронирования" Command="{Binding ShowTabCommand}" CommandParameter="Reservations" Background="{Binding ReservationsTabBackground}" Foreground="{Binding ReservationsTabForeground}" HorizontalAlignment="Stretch" Height="40" FontWeight="SemiBold" CornerRadius="6" HorizontalContentAlignment="Left" Padding="15,0,0,0"/>
</StackPanel>
<Button Grid.Row="3" Content=" Выйти из системы" Click="BtnLogout_Click" HorizontalAlignment="Stretch" Height="40" Background="#ef4444" Foreground="White" FontWeight="Bold" CornerRadius="6" HorizontalContentAlignment="Center"/>
<Button Grid.Row="3" Content=" Выйти из системы" Command="{Binding LogoutCommand}" HorizontalAlignment="Stretch" Height="40" Background="Red" Foreground="White" FontWeight="Bold" CornerRadius="6" HorizontalContentAlignment="Center"/>
</Grid>
</Border>
<Grid Grid.Column="1" RowDefinitions="Auto, *">
<Border Grid.Row="0" Background="#1e293b" Height="60" Padding="20,0" BorderBrush="#334155" BorderThickness="0,0,0,1">
<Border Grid.Row="0" Background="LightGray" Height="60" Padding="20,0" BorderBrush="Gray" BorderThickness="0,0,0,1">
<Grid ColumnDefinitions="*, Auto">
<TextBlock Name="TxtActiveTabHeader" Text=" Оформление выдачи книг" Foreground="White" FontSize="18" FontWeight="Bold" VerticalAlignment="Center"/>
<TextBlock Grid.Column="1" Text="Роль: Библиотекарь" Foreground="#94a3b8" FontSize="12" VerticalAlignment="Center"/>
<TextBlock Name="TxtActiveTabHeader" Text="{Binding ActiveTabHeader}" Foreground="Black" FontSize="18" FontWeight="Bold" VerticalAlignment="Center"/>
<TextBlock Grid.Column="1" Text="Роль: Библиотекарь" Foreground="Black" FontSize="12" VerticalAlignment="Center"/>
</Grid>
</Border>
<Grid Grid.Row="1" Margin="20">
<Grid Name="GridIssue" ColumnDefinitions="450, *">
<Border Grid.Column="0" Background="#1e293b" CornerRadius="8" Padding="20" BorderBrush="#334155" BorderThickness="1" VerticalAlignment="Top">
<Grid Name="GridIssue" ColumnDefinitions="450, *" IsVisible="{Binding IsIssueVisible}">
<Border Grid.Column="0" Background="White" CornerRadius="8" Padding="20" BorderBrush="LightGray" BorderThickness="1" VerticalAlignment="Top">
<StackPanel>
<TextBlock Text="Выдача книги читателю" Foreground="#38bdf8" FontSize="16" FontWeight="Bold" Margin="0,0,0,5"/>
<TextBlock Text="Выдача книги читателю" Foreground="Black" FontSize="16" FontWeight="Bold" Margin="0,0,0,5"/>
<StackPanel>
<TextBlock Text="Выберите экземпляр книги (доступные)" Foreground="#cbd5e1" FontSize="12"/>
<ComboBox Name="CbIssueCopy" HorizontalAlignment="Stretch" Height="36" CornerRadius="4"/>
<StackPanel Margin="0,0,0,10">
<TextBlock Text="Поиск и выбор книги" Foreground="Black" FontSize="12" Margin="0,0,0,4"/>
<TextBox Name="TxtSearchCopy" Text="{Binding SearchCopyText, Mode=TwoWay}" Watermark="Введите название, инв. номер или автора..." Height="36" CornerRadius="4"/>
<ListBox Name="LbIssueCopies" ItemsSource="{Binding FilteredCopies}" SelectedItem="{Binding SelectedAvailableCopy, Mode=TwoWay}" Height="120" Margin="0,4,0,0" CornerRadius="4" Background="White" BorderBrush="LightGray" BorderThickness="1">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Margin="4">
<TextBlock Text="{Binding BookId.Title}" Foreground="Black" FontSize="13" FontWeight="Bold"/>
<TextBlock Text="{Binding Inventory_number}" Foreground="Black" FontSize="11"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
<StackPanel Margin="0,0,0,10">
<TextBlock Text="Поиск и выбор читателя" Foreground="Black" FontSize="12" Margin="0,0,0,4"/>
<TextBox Name="TxtSearchReader" Text="{Binding SearchReaderText, Mode=TwoWay}" Watermark="Введите ФИО или логин читателя..." Height="36" CornerRadius="4"/>
<ListBox Name="LbIssueReaders" ItemsSource="{Binding FilteredReaders}" SelectedItem="{Binding SelectedReader, Mode=TwoWay}" Height="120" Margin="0,4,0,0" CornerRadius="4" Background="White" BorderBrush="LightGray" BorderThickness="1">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Margin="4">
<TextBlock Text="{Binding Full_name}" Foreground="Black" FontSize="13" FontWeight="Bold"/>
<TextBlock Text="{Binding Login}" Foreground="Black" FontSize="11"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
<StackPanel>
<TextBlock Text="Выберите читателя" Foreground="#cbd5e1" FontSize="12"/>
<ComboBox Name="CbIssueReader" HorizontalAlignment="Stretch" Height="36" CornerRadius="4"/>
<TextBlock Text="Срок возврата" Foreground="Black" FontSize="12"/>
<CalendarDatePicker Name="DpIssueDueDate" SelectedDate="{Binding IssueDueDate, Mode=TwoWay}" HorizontalAlignment="Stretch" Height="36" CornerRadius="4"/>
</StackPanel>
<StackPanel>
<TextBlock Text="Срок возврата" Foreground="#cbd5e1" FontSize="12"/>
<CalendarDatePicker Name="DpIssueDueDate" HorizontalAlignment="Stretch" Height="36" CornerRadius="4"/>
</StackPanel>
<Button Content=" Оформить выдачу" Click="BtnIssueBook_Click" Background="#22c55e" Foreground="White" HorizontalAlignment="Stretch" Height="40" FontWeight="Bold" CornerRadius="4" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Margin="0,10,0,0"/>
<Button Content=" Оформить выдачу" Command="{Binding IssueBookCommand}" Background="Green" Foreground="White" HorizontalAlignment="Stretch" Height="40" FontWeight="Bold" CornerRadius="4" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Margin="0,10,0,0"/>
<TextBlock Name="TxtIssueStatus" Text="" Foreground="#cbd5e1" FontSize="13" TextWrapping="Wrap" HorizontalAlignment="Center"/>
<TextBlock Name="TxtIssueStatus" Text="{Binding IssueStatus}" Foreground="{Binding IssueStatusColor}" FontSize="13" TextWrapping="Wrap" HorizontalAlignment="Center"/>
</StackPanel>
</Border>
<Border Grid.Column="1" Background="#1e293b" CornerRadius="8" Padding="20" BorderBrush="#334155" BorderThickness="1">
<Border Grid.Column="1" Background="White" CornerRadius="8" Padding="20" BorderBrush="LightGray" BorderThickness="1">
<StackPanel>
<TextBlock Text=" Памятка библиотекаря" Foreground="#38bdf8" FontSize="15" FontWeight="Bold"/>
<TextBlock Text="1. Книга выдается только зарегистрированным читателям." Foreground="#cbd5e1" TextWrapping="Wrap"/>
<TextBlock Text="2. Рекомендуемый срок выдачи — 14 дней." Foreground="#cbd5e1" TextWrapping="Wrap"/>
<TextBlock Text="3. При просрочке сдачи книги система автоматически начислит штраф в размере 15 руб. за каждый день задержки при возврате." Foreground="#cbd5e1" TextWrapping="Wrap"/>
<TextBlock Text="Памятка библиотекаря" Foreground="Black" FontSize="15" FontWeight="Bold"/>
<TextBlock Text="1. Книга выдается только зарегистрированным читателям." Foreground="Black" TextWrapping="Wrap"/>
<TextBlock Text="2. Рекомендуемый срок выдачи — 14 дней." Foreground="Black" TextWrapping="Wrap"/>
<TextBlock Text="3. При просрочке сдачи книги система автоматически начислит штраф в размере 15 руб. за каждый день задержки при возврате." Foreground="Black" TextWrapping="Wrap"/>
</StackPanel>
</Border>
</Grid>
<Grid Name="GridReturns" RowDefinitions="*, Auto" IsVisible="False">
<Grid Name="GridReturns" RowDefinitions="*, Auto" IsVisible="{Binding IsReturnsVisible}">
<Grid Grid.Row="0" ColumnDefinitions="*, 320">
<DataGrid Name="DgActiveLoans" Grid.Column="0" AutoGenerateColumns="False" IsReadOnly="True" GridLinesVisibility="All" BorderThickness="1" BorderBrush="#334155" Background="#1e293b" SelectionChanged="DgActiveLoans_SelectionChanged">
<DataGrid Name="DgActiveLoans" Grid.Column="0" ItemsSource="{Binding ActiveLoansList}" SelectedItem="{Binding SelectedActiveLoan, Mode=TwoWay}" AutoGenerateColumns="False" IsReadOnly="True" GridLinesVisibility="All" BorderThickness="1" BorderBrush="LightGray" Background="White">
<DataGrid.Columns>
<DataGridTextColumn Header="ID" Binding="{Binding Id}" Width="50"/>
<DataGridTextColumn Header="Инв. номер" Binding="{Binding CopyId.Inventory_number}" Width="120"/>
<DataGridTextColumn Header="Книга" Binding="{Binding CopyId.BookId.Title}" Width="2*"/>
<DataGridTextColumn Header="Читатель" Binding="{Binding ReaderId.Full_name}" Width="1.5*"/>
<DataGridTextColumn Header="Дата выдачи" Binding="{Binding Issue_date, StringFormat={}{0:dd.MM.yyyy}}" Width="110"/>
<DataGridTextColumn Header="Срок сдачи" Binding="{Binding Due_date, StringFormat={}{0:dd.MM.yyyy}}" Width="110"/>
<DataGridTextColumn Header="Статус" Binding="{Binding StatusText}" Width="120"/>
</DataGrid.Columns>
</DataGrid>
<Border Grid.Column="1" Background="#1e293b" CornerRadius="8" Padding="15" BorderBrush="#334155" BorderThickness="1" VerticalAlignment="Top">
<Border Grid.Column="1" Background="White" CornerRadius="8" Padding="15" BorderBrush="LightGray" BorderThickness="1" VerticalAlignment="Top">
<StackPanel>
<TextBlock Text="Приём возврата" Foreground="#38bdf8" FontSize="15" FontWeight="Bold"/>
<TextBlock Name="TxtReturnDetails" Text="Выберите выдачу из списка слева." Foreground="#cbd5e1" TextWrapping="Wrap" FontSize="13"/>
<TextBlock Text="Приём возврата" Foreground="Black" FontSize="15" FontWeight="Bold"/>
<TextBlock Name="TxtReturnDetails" Text="{Binding ReturnDetails}" Foreground="Black" TextWrapping="Wrap" FontSize="13"/>
<Button Name="BtnReturnBook" Content=" Принять возврат" Click="BtnReturnBook_Click" Background="#3b82f6" Foreground="White" HorizontalAlignment="Stretch" Height="40" FontWeight="Bold" CornerRadius="4" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsEnabled="False"/>
<Button Name="BtnReturnBook" Content=" Принять возврат" Command="{Binding ReturnBookCommand}" IsEnabled="{Binding IsReturnEnabled}" Background="Blue" Foreground="White" HorizontalAlignment="Stretch" Height="40" FontWeight="Bold" CornerRadius="4" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
<TextBlock Name="TxtReturnStatus" Text="" Foreground="#22c55e" FontSize="13" TextWrapping="Wrap" HorizontalAlignment="Center" FontWeight="SemiBold"/>
<TextBlock Name="TxtReturnStatus" Text="{Binding ReturnStatus}" Foreground="{Binding ReturnStatusColor}" FontSize="13" TextWrapping="Wrap" HorizontalAlignment="Center" FontWeight="SemiBold"/>
</StackPanel>
</Border>
</Grid>
</Grid>
<Grid Name="GridRegister" ColumnDefinitions="450, *" IsVisible="False">
<Border Grid.Column="0" Background="#1e293b" CornerRadius="8" Padding="20" BorderBrush="#334155" BorderThickness="1" VerticalAlignment="Top">
<Grid Name="GridRegister" ColumnDefinitions="450, *" IsVisible="{Binding IsRegisterVisible}">
<Border Grid.Column="0" Background="White" CornerRadius="8" Padding="20" BorderBrush="LightGray" BorderThickness="1" VerticalAlignment="Top">
<StackPanel>
<TextBlock Text="Регистрация нового читателя" Foreground="#38bdf8" FontSize="16" FontWeight="Bold" Margin="0,0,0,5"/>
<TextBlock Text="Регистрация нового читателя" Foreground="Black" FontSize="16" FontWeight="Bold" Margin="0,0,0,5"/>
<StackPanel>
<TextBlock Text="ФИО читателя" Foreground="#cbd5e1" FontSize="12"/>
<TextBox Name="TxtRegFullName" Height="34" CornerRadius="4"/>
<TextBlock Text="ФИО читателя" Foreground="Black" FontSize="12"/>
<TextBox Name="TxtRegFullName" Text="{Binding RegFullName, Mode=TwoWay}" Height="34" CornerRadius="4"/>
</StackPanel>
<StackPanel>
<TextBlock Text="Email" Foreground="#cbd5e1" FontSize="12"/>
<TextBox Name="TxtRegEmail" Height="34" CornerRadius="4"/>
<TextBlock Text="Email" Foreground="Black" FontSize="12"/>
<TextBox Name="TxtRegEmail" Text="{Binding RegEmail, Mode=TwoWay}" Height="34" CornerRadius="4"/>
</StackPanel>
<StackPanel>
<TextBlock Text="Телефон" Foreground="#cbd5e1" FontSize="12"/>
<TextBox Name="TxtRegPhone" Height="34" CornerRadius="4"/>
<TextBlock Text="Телефон" Foreground="Black" FontSize="12"/>
<TextBox Name="TxtRegPhone" Text="{Binding RegPhone, Mode=TwoWay}" Height="34" CornerRadius="4"/>
</StackPanel>
<StackPanel>
<TextBlock Text="Логин для входа" Foreground="#cbd5e1" FontSize="12"/>
<TextBox Name="TxtRegLogin" Height="34" CornerRadius="4"/>
<TextBlock Text="Логин для входа" Foreground="Black" FontSize="12"/>
<TextBox Name="TxtRegLogin" Text="{Binding RegLogin, Mode=TwoWay}" Height="34" CornerRadius="4"/>
</StackPanel>
<StackPanel>
<TextBlock Text="Пароль" Foreground="#cbd5e1" FontSize="12"/>
<TextBox Name="TxtRegPass" Height="34" CornerRadius="4"/>
<TextBlock Text="Пароль" Foreground="Black" FontSize="12"/>
<TextBox Name="TxtRegPass" Text="{Binding RegPass, Mode=TwoWay}" Height="34" CornerRadius="4"/>
</StackPanel>
<Button Content=" Зарегистрировать" Click="BtnRegisterReader_Click" Background="#22c55e" Foreground="White" HorizontalAlignment="Stretch" Height="38" FontWeight="Bold" CornerRadius="4" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Margin="0,10,0,0"/>
<Button Content=" Зарегистрировать" Command="{Binding RegisterReaderCommand}" Background="Green" Foreground="White" HorizontalAlignment="Stretch" Height="38" FontWeight="Bold" CornerRadius="4" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Margin="0,10,0,0"/>
<TextBlock Name="TxtRegStatus" Text="" Foreground="#cbd5e1" FontSize="13" HorizontalAlignment="Center"/>
<TextBlock Name="TxtRegStatus" Text="{Binding RegStatus}" Foreground="{Binding RegStatusColor}" FontSize="13" HorizontalAlignment="Center"/>
</StackPanel>
</Border>
</Grid>
<Grid Name="GridFines" ColumnDefinitions="*, 320" IsVisible="False">
<DataGrid Name="DgFines" Grid.Column="0" AutoGenerateColumns="False" IsReadOnly="True" GridLinesVisibility="All" BorderThickness="1" BorderBrush="#334155" Background="#1e293b" SelectionChanged="DgFines_SelectionChanged">
<Grid Name="GridFines" ColumnDefinitions="*, 320" IsVisible="{Binding IsFinesVisible}">
<DataGrid Name="DgFines" Grid.Column="0" ItemsSource="{Binding FinesList}" SelectedItem="{Binding SelectedFine, Mode=TwoWay}" AutoGenerateColumns="False" IsReadOnly="True" GridLinesVisibility="All" BorderThickness="1" BorderBrush="LightGray" Background="White">
<DataGrid.Columns>
<DataGridTextColumn Header="ID" Binding="{Binding Id}" Width="50"/>
<DataGridTextColumn Header="Читатель" Binding="{Binding LoanId.ReaderId.Full_name}" Width="1.5*"/>
<DataGridTextColumn Header="Книга" Binding="{Binding LoanId.CopyId.BookId.Title}" Width="2*"/>
<DataGridTextColumn Header="Сумма" Binding="{Binding Amount}" Width="90"/>
<DataGridTextColumn Header="Статус" Binding="{Binding Is_paid, Converter={x:Null}}" Width="100"/>
<DataGridTextColumn Header="Статус" Binding="{Binding StatusText}" Width="100"/>
<DataGridTextColumn Header="Дата выписки" Binding="{Binding Created_at, StringFormat={}{0:dd.MM.yyyy}}" Width="110"/>
</DataGrid.Columns>
</DataGrid>
<Border Grid.Column="1" Background="#1e293b" CornerRadius="8" Padding="15" BorderBrush="#334155" BorderThickness="1" VerticalAlignment="Top">
<Border Grid.Column="1" Background="White" CornerRadius="8" Padding="15" BorderBrush="LightGray" BorderThickness="1" VerticalAlignment="Top">
<StackPanel>
<TextBlock Text="Управление штрафами" Foreground="#38bdf8" FontSize="15" FontWeight="Bold"/>
<TextBlock Name="TxtFineDetails" Text="Выберите штраф из списка." Foreground="#cbd5e1" TextWrapping="Wrap" FontSize="13"/>
<TextBlock Text="Управление штрафами" Foreground="Black" FontSize="15" FontWeight="Bold"/>
<TextBlock Name="TxtFineDetails" Text="{Binding FineDetails}" Foreground="Black" TextWrapping="Wrap" FontSize="13"/>
<Button Name="BtnPayFine" Content=" Отметить как оплаченный" Click="BtnPayFine_Click" Background="#22c55e" Foreground="White" HorizontalAlignment="Stretch" Height="40" FontWeight="Bold" CornerRadius="4" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsEnabled="False"/>
<Button Name="BtnPayFine" Content=" Отметить как оплаченный" Command="{Binding PayFineCommand}" IsEnabled="{Binding IsPayFineEnabled}" Background="Green" Foreground="White" HorizontalAlignment="Stretch" Height="40" FontWeight="Bold" CornerRadius="4" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
<TextBlock Name="TxtFineStatus" Text="" Foreground="#22c55e" FontSize="13" TextWrapping="Wrap" HorizontalAlignment="Center"/>
<TextBlock Name="TxtFineStatus" Text="{Binding FineStatus}" Foreground="{Binding FineStatusColor}" FontSize="13" TextWrapping="Wrap" HorizontalAlignment="Center"/>
</StackPanel>
</Border>
</Grid>
<Grid Name="GridReservations" RowDefinitions="*, Auto" IsVisible="False">
<Grid Name="GridReservations" RowDefinitions="*, Auto" IsVisible="{Binding IsReservationsVisible}">
<Grid Grid.Row="0" ColumnDefinitions="*, 320">
<DataGrid Name="DgReservations" Grid.Column="0" AutoGenerateColumns="False" IsReadOnly="True" GridLinesVisibility="All" BorderThickness="1" BorderBrush="#334155" Background="#1e293b" SelectionChanged="DgReservations_SelectionChanged">
<DataGrid Name="DgReservations" Grid.Column="0" ItemsSource="{Binding ReservationsList}" SelectedItem="{Binding SelectedReservation, Mode=TwoWay}" AutoGenerateColumns="False" IsReadOnly="True" GridLinesVisibility="All" BorderThickness="1" BorderBrush="LightGray" Background="White">
<DataGrid.Columns>
<DataGridTextColumn Header="ID" Binding="{Binding Id}" Width="50"/>
<DataGridTextColumn Header="Книга" Binding="{Binding BookId.Title}" Width="2*"/>
<DataGridTextColumn Header="Читатель" Binding="{Binding ReaderId.Full_name}" Width="1.5*"/>
<DataGridTextColumn Header="Дата брони" Binding="{Binding Reservation_date, StringFormat={}{0:dd.MM.yyyy}}" Width="110"/>
@ -174,14 +194,14 @@
</DataGrid.Columns>
</DataGrid>
<Border Grid.Column="1" Background="#1e293b" CornerRadius="8" Padding="15" BorderBrush="#334155" BorderThickness="1" VerticalAlignment="Top">
<Border Grid.Column="1" Background="White" CornerRadius="8" Padding="15" BorderBrush="LightGray" BorderThickness="1" VerticalAlignment="Top">
<StackPanel>
<TextBlock Text="Детали бронирования" Foreground="#38bdf8" FontSize="15" FontWeight="Bold"/>
<TextBlock Name="TxtReservationDetails" Text="Выберите бронь из списка." Foreground="#cbd5e1" TextWrapping="Wrap" FontSize="13"/>
<TextBlock Text="Детали бронирования" Foreground="Black" FontSize="15" FontWeight="Bold"/>
<TextBlock Name="TxtReservationDetails" Text="{Binding ReservationDetails}" Foreground="Black" TextWrapping="Wrap" FontSize="13"/>
<Button Name="BtnCancelReservation" Content=" Отменить бронь" Click="BtnCancelReservation_Click" Background="#ef4444" Foreground="White" HorizontalAlignment="Stretch" Height="40" FontWeight="Bold" CornerRadius="4" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsEnabled="False"/>
<Button Name="BtnCancelReservation" Content=" Отменить бронь" Command="{Binding CancelReservationCommand}" IsEnabled="{Binding IsCancelReservationEnabled}" Background="Red" Foreground="White" HorizontalAlignment="Stretch" Height="40" FontWeight="Bold" CornerRadius="4" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
<TextBlock Name="TxtReservationStatus" Text="" Foreground="#cbd5e1" FontSize="13" TextWrapping="Wrap" HorizontalAlignment="Center"/>
<TextBlock Name="TxtReservationStatus" Text="{Binding ReservationStatus}" Foreground="{Binding ReservationStatusColor}" FontSize="13" TextWrapping="Wrap" HorizontalAlignment="Center"/>
</StackPanel>
</Border>
</Grid>

View File

@ -1,377 +1,23 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Interactivity;
using Avalonia.Media;
using CourseProject1125.DB;
using CourseProject1125.Models;
using CourseProject1125.ViewModels;
namespace CourseProject1125.Views;
public partial class LibrarianWindow : Window
namespace CourseProject1125.Views
{
private Book_copies? _selectedAvailableCopy;
private User? _selectedReader;
private Loan? _selectedActiveLoan;
private Fine? _selectedFine;
private Reservation? _selectedReservation;
private List<Book_copies> _availableCopies = new();
private List<User> _readers = new();
private List<Loan> _activeLoans = new();
private List<Fine> _fines = new();
private List<Reservation> _reservations = new();
public LibrarianWindow()
public partial class LibrarianWindow : Window
{
InitializeComponent();
// Show current logged-in librarian name
TxtLibrarianName.Text = UserSession.UserName;
// Initialize defaults
DpIssueDueDate.SelectedDate = DateTime.Now.AddDays(14);
LoadAllData();
ShowTab("Issue");
}
private void LoadAllData()
{
RefreshIssueCombos();
RefreshActiveLoans();
RefreshFines();
RefreshReservations();
}
#region Navigation
private void BtnTab_Click(object? sender, RoutedEventArgs e)
{
if (sender is Button btn && btn.Tag is string tabName)
public LibrarianWindow()
{
ShowTab(tabName);
}
}
private void ShowTab(string tabName)
{
// Hide all grids
GridIssue.IsVisible = false;
GridReturns.IsVisible = false;
GridRegister.IsVisible = false;
GridFines.IsVisible = false;
GridReservations.IsVisible = false;
// Reset styles
ResetButtonStyles(BtnTabIssue);
ResetButtonStyles(BtnTabReturns);
ResetButtonStyles(BtnTabRegister);
ResetButtonStyles(BtnTabFines);
ResetButtonStyles(BtnTabReservations);
switch (tabName)
{
case "Issue":
GridIssue.IsVisible = true;
TxtActiveTabHeader.Text = "📖 Оформление выдачи книг";
SetActiveButtonStyles(BtnTabIssue);
RefreshIssueCombos();
break;
case "Returns":
GridReturns.IsVisible = true;
TxtActiveTabHeader.Text = "🔄 Приём возврата книг";
SetActiveButtonStyles(BtnTabReturns);
RefreshActiveLoans();
break;
case "Register":
GridRegister.IsVisible = true;
TxtActiveTabHeader.Text = "👤 Регистрация читателей";
SetActiveButtonStyles(BtnTabRegister);
break;
case "Fines":
GridFines.IsVisible = true;
TxtActiveTabHeader.Text = "💰 Управление штрафами";
SetActiveButtonStyles(BtnTabFines);
RefreshFines();
break;
case "Reservations":
GridReservations.IsVisible = true;
TxtActiveTabHeader.Text = "🛎️ Бронирования читателей";
SetActiveButtonStyles(BtnTabReservations);
RefreshReservations();
break;
}
}
private void ResetButtonStyles(Button btn)
{
btn.Background = Brushes.Transparent;
btn.Foreground = Brush.Parse("#94a3b8");
}
private void SetActiveButtonStyles(Button btn)
{
btn.Background = Brush.Parse("#0f172a");
btn.Foreground = Brush.Parse("#38bdf8");
}
private void BtnLogout_Click(object? sender, RoutedEventArgs e)
{
var mainWin = new MainWindow();
mainWin.Show();
this.Close();
}
#endregion
#region Issue Book Tab
private void RefreshIssueCombos()
{
// 1. Get copies and filter those that are available
var allCopies = DatabaseService.GetBookCopies();
_availableCopies = allCopies.Where(c => c.Status.Equals("available", StringComparison.OrdinalIgnoreCase)).ToList();
CbIssueCopy.ItemsSource = null;
CbIssueCopy.ItemsSource = _availableCopies.Select(c => $"{c.Inventory_number} - {c.BookId.Title}").ToList();
// 2. Get readers
var allUsers = DatabaseService.GetUsers();
_readers = allUsers.Where(u => u.RoleId.id == 3 || u.RoleId.Name.Equals("Читатель", StringComparison.OrdinalIgnoreCase)).ToList();
CbIssueReader.ItemsSource = null;
CbIssueReader.ItemsSource = _readers.Select(r => $"{r.Full_name} (Логин: {r.Login})").ToList();
TxtIssueStatus.Text = "";
}
private void BtnIssueBook_Click(object? sender, RoutedEventArgs e)
{
int copyIndex = CbIssueCopy.SelectedIndex;
int readerIndex = CbIssueReader.SelectedIndex;
var selectedDate = DpIssueDueDate.SelectedDate;
if (copyIndex < 0 || readerIndex < 0 || selectedDate == null)
{
TxtIssueStatus.Foreground = Brush.Parse("#ef4444");
TxtIssueStatus.Text = "Ошибка: Выберите книгу, читателя и укажите дату сдачи.";
return;
}
var copy = _availableCopies[copyIndex];
var reader = _readers[readerIndex];
var dueDate = selectedDate.Value;
if (dueDate <= DateTime.Now)
{
TxtIssueStatus.Foreground = Brush.Parse("#ef4444");
TxtIssueStatus.Text = "Ошибка: Срок возврата должен быть в будущем.";
return;
}
// LibrarianId comes from UserSession.UserId
int librarianId = UserSession.UserId;
if (DatabaseService.IssueLoan(copy.Id, reader.Id, librarianId, dueDate))
{
TxtIssueStatus.Foreground = Brush.Parse("#22c55e");
TxtIssueStatus.Text = $"Успешно! Книга '{copy.BookId.Title}' выдана читателю '{reader.Full_name}'.";
RefreshIssueCombos();
}
else
{
TxtIssueStatus.Foreground = Brush.Parse("#ef4444");
TxtIssueStatus.Text = "Ошибка при оформлении выдачи в базе данных.";
}
}
#endregion
#region Returns Tab
private void RefreshActiveLoans()
{
var allLoans = DatabaseService.GetLoans();
_activeLoans = allLoans.Where(l => l.Status.Equals("active", StringComparison.OrdinalIgnoreCase)).ToList();
DgActiveLoans.ItemsSource = null;
DgActiveLoans.ItemsSource = _activeLoans;
BtnReturnBook.IsEnabled = false;
TxtReturnDetails.Text = "Выберите выдачу из списка слева.";
TxtReturnStatus.Text = "";
_selectedActiveLoan = null;
}
private void DgActiveLoans_SelectionChanged(object? sender, SelectionChangedEventArgs e)
{
if (DgActiveLoans.SelectedItem is Loan loan)
{
_selectedActiveLoan = loan;
TxtReturnDetails.Text = $"Книга: {loan.CopyId.BookId.Title}\n" +
$"Инвентарный номер: {loan.CopyId.Inventory_number}\n" +
$"Читатель: {loan.ReaderId.Full_name}\n" +
$"Дата выдачи: {loan.Issue_date:dd.MM.yyyy}\n" +
$"Срок сдачи: {loan.Due_date:dd.MM.yyyy}";
BtnReturnBook.IsEnabled = true;
}
}
private void BtnReturnBook_Click(object? sender, RoutedEventArgs e)
{
if (_selectedActiveLoan == null) return;
DateTime returnDate = DateTime.Now;
decimal fine = DatabaseService.ReturnLoan(_selectedActiveLoan.Id, returnDate);
if (fine >= 0)
{
if (fine > 0)
var viewModel = new LibrarianWindowViewModel();
viewModel.OnLogoutRequested = () =>
{
TxtReturnStatus.Foreground = Brush.Parse("#ef4444");
TxtReturnStatus.Text = $"Книга возвращена! Зафиксирована просрочка. Выписан штраф: {fine:N2} руб.";
}
else
{
TxtReturnStatus.Foreground = Brush.Parse("#22c55e");
TxtReturnStatus.Text = "Книга возвращена успешно! Просрочек нет.";
}
RefreshActiveLoans();
}
else
{
TxtReturnStatus.Foreground = Brush.Parse("#ef4444");
TxtReturnStatus.Text = "Ошибка выполнения возврата книги.";
var mainWin = new MainWindow();
mainWin.Show();
this.Close();
};
DataContext = viewModel;
InitializeComponent();
}
}
#endregion
#region Register Reader Tab
private void BtnRegisterReader_Click(object? sender, RoutedEventArgs e)
{
string name = TxtRegFullName.Text?.Trim() ?? "";
string email = TxtRegEmail.Text?.Trim() ?? "";
string phone = TxtRegPhone.Text?.Trim() ?? "";
string login = TxtRegLogin.Text?.Trim() ?? "";
string pass = TxtRegPass.Text?.Trim() ?? "";
if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(login) || string.IsNullOrEmpty(pass))
{
TxtRegStatus.Foreground = Brush.Parse("#ef4444");
TxtRegStatus.Text = "Пожалуйста, заполните ФИО, логин и пароль.";
return;
}
// Reader role ID is 3
if (DatabaseService.AddUser(name, email, phone, login, pass, 3))
{
TxtRegStatus.Foreground = Brush.Parse("#22c55e");
TxtRegStatus.Text = $"Успешно! Читатель '{name}' зарегистрирован.";
TxtRegFullName.Text = "";
TxtRegEmail.Text = "";
TxtRegPhone.Text = "";
TxtRegLogin.Text = "";
TxtRegPass.Text = "";
}
else
{
TxtRegStatus.Foreground = Brush.Parse("#ef4444");
TxtRegStatus.Text = "Ошибка: Пользователь с таким логином или Email уже существует.";
}
}
#endregion
#region Fines Tab
private void RefreshFines()
{
_fines = DatabaseService.GetFines();
DgFines.ItemsSource = null;
DgFines.ItemsSource = _fines;
BtnPayFine.IsEnabled = false;
TxtFineDetails.Text = "Выберите штраф из списка.";
TxtFineStatus.Text = "";
_selectedFine = null;
}
private void DgFines_SelectionChanged(object? sender, SelectionChangedEventArgs e)
{
if (DgFines.SelectedItem is Fine fine)
{
_selectedFine = fine;
string paidStr = fine.Is_paid == 1 ? "Оплачен" : "НЕ оплачен";
TxtFineDetails.Text = $"Читатель: {fine.LoanId.ReaderId.Full_name}\n" +
$"Книга: {fine.LoanId.CopyId.BookId.Title}\n" +
$"Сумма штрафа: {fine.Amount:N2} руб.\n" +
$"Статус: {paidStr}\n" +
$"Дата начисления: {fine.Created_at:dd.MM.yyyy}";
BtnPayFine.IsEnabled = fine.Is_paid == 0;
}
}
private void BtnPayFine_Click(object? sender, RoutedEventArgs e)
{
if (_selectedFine == null) return;
if (DatabaseService.PayFine(_selectedFine.Id))
{
TxtFineStatus.Foreground = Brush.Parse("#22c55e");
TxtFineStatus.Text = "Штраф успешно отмечен как оплаченный!";
RefreshFines();
}
else
{
TxtFineStatus.Foreground = Brush.Parse("#ef4444");
TxtFineStatus.Text = "Ошибка при оплате штрафа.";
}
}
#endregion
#region Reservations Tab
private void RefreshReservations()
{
_reservations = DatabaseService.GetReservations();
DgReservations.ItemsSource = null;
DgReservations.ItemsSource = _reservations;
BtnCancelReservation.IsEnabled = false;
TxtReservationDetails.Text = "Выберите бронь из списка.";
TxtReservationStatus.Text = "";
_selectedReservation = null;
}
private void DgReservations_SelectionChanged(object? sender, SelectionChangedEventArgs e)
{
if (DgReservations.SelectedItem is Reservation res)
{
_selectedReservation = res;
string activeStr = res.is_active == 1 ? "Активна" : "Неактивна/Отменена";
TxtReservationDetails.Text = $"Книга: {res.BookId.Title}\n" +
$"Читатель: {res.ReaderId.Full_name}\n" +
$"Дата бронирования: {res.Reservation_date:dd.MM.yyyy}\n" +
$"Истекает: {res.Expiry_date:dd.MM.yyyy}\n" +
$"Статус: {activeStr}";
BtnCancelReservation.IsEnabled = res.is_active == 1;
}
}
private void BtnCancelReservation_Click(object? sender, RoutedEventArgs e)
{
if (_selectedReservation == null) return;
if (DatabaseService.CancelReservation(_selectedReservation.Id))
{
TxtReservationStatus.Foreground = Brush.Parse("#22c55e");
TxtReservationStatus.Text = "Бронирование успешно отменено!";
RefreshReservations();
}
else
{
TxtReservationStatus.Foreground = Brush.Parse("#ef4444");
TxtReservationStatus.Text = "Ошибка при отмене бронирования.";
}
}
#endregion
}

View File

@ -11,35 +11,27 @@
Width="600" Height="400"
WindowStartupLocation="CenterScreen">
<Grid>
<!-- Background Gradient -->
<Grid.Background>
<LinearGradientBrush StartPoint="0%,0%" EndPoint="100%,100%">
<GradientStop Color="#0f172a" Offset="0"/>
<GradientStop Color="#1e293b" Offset="1"/>
</LinearGradientBrush>
</Grid.Background>
<Border Margin="30" Padding="30" CornerRadius="12" Background="#1e293b" Width="360" VerticalAlignment="Center" HorizontalAlignment="Center" BoxShadow="0 4 20 #000000">
<Grid Background="White">
<Border Margin="30" Padding="30" CornerRadius="12" Background="LightGray" BorderBrush="Gray" BorderThickness="1" Width="360" VerticalAlignment="Center" HorizontalAlignment="Center" BoxShadow="0 4 20 Black">
<StackPanel>
<TextBlock Text="БИБЛИОТЕКА" Foreground="#38bdf8" FontSize="24" FontWeight="Bold" HorizontalAlignment="Center"/>
<TextBlock Text="Панель авторизации" Foreground="#94a3b8" FontSize="14" HorizontalAlignment="Center" Margin="0,0,0,10"/>
<TextBlock Text="БИБЛИОТЕКА" Foreground="Black" FontSize="24" FontWeight="Bold" HorizontalAlignment="Center"/>
<TextBlock Text="Панель авторизации" Foreground="Black" FontSize="14" HorizontalAlignment="Center" Margin="0,0,0,10"/>
<StackPanel>
<TextBlock Text="Логин" Foreground="#cbd5e1" FontSize="12" FontWeight="SemiBold"/>
<TextBox Name="TxtLogin" Watermark="Введите ваш логин" Height="40" Background="#0f172a" Foreground="White" BorderBrush="#475569" CornerRadius="6" VerticalContentAlignment="Center"/>
<TextBlock Text="Логин" Foreground="Black" FontSize="12" FontWeight="SemiBold"/>
<TextBox Name="TxtLogin" Text="{Binding LoginInput, Mode=TwoWay}" Watermark="Введите ваш логин" Height="40" Background="White" Foreground="Black" BorderBrush="Gray" CornerRadius="6" VerticalContentAlignment="Center"/>
</StackPanel>
<StackPanel>
<TextBlock Text="Пароль" Foreground="#cbd5e1" FontSize="12" FontWeight="SemiBold"/>
<TextBox Name="TxtPassword" Watermark="Введите ваш пароль" PasswordChar="*" Height="40" Background="#0f172a" Foreground="White" BorderBrush="#475569" CornerRadius="6" VerticalContentAlignment="Center"/>
<TextBlock Text="Пароль" Foreground="Black" FontSize="12" FontWeight="SemiBold"/>
<TextBox Name="TxtPassword" Text="{Binding PasswordInput, Mode=TwoWay}" Watermark="Введите ваш пароль" PasswordChar="*" Height="40" Background="White" Foreground="Black" BorderBrush="Gray" CornerRadius="6" VerticalContentAlignment="Center"/>
</StackPanel>
<Button Content="Войти"
Click="BtnLogin_Click"
Command="{Binding LoginCommand}"
HorizontalAlignment="Stretch"
Height="40"
Background="#0284c7"
Background="Blue"
Foreground="White"
CornerRadius="6"
FontWeight="Bold"
@ -47,7 +39,7 @@
VerticalContentAlignment="Center"
Margin="0,10,0,0"/>
<TextBlock Name="LblError" Foreground="#ef4444" FontSize="12" HorizontalAlignment="Center" TextWrapping="Wrap" Margin="0,5,0,0"/>
<TextBlock Name="LblError" Text="{Binding ErrorMessage}" Foreground="Red" FontSize="12" HorizontalAlignment="Center" TextWrapping="Wrap" Margin="0,5,0,0"/>
</StackPanel>
</Border>
</Grid>

View File

@ -1,8 +1,6 @@
using System;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Interactivity;
using CourseProject1125.DB;
using CourseProject1125.ViewModels;
namespace CourseProject1125.Views;
@ -10,43 +8,12 @@ public partial class MainWindow : Window
{
public MainWindow()
{
var viewModel = new MainWindowViewModel();
viewModel.OnLoginSuccess = (roleId) => NavigateByRole(roleId);
DataContext = viewModel;
InitializeComponent();
}
private void BtnLogin_Click(object sender, RoutedEventArgs e)
{
var loginInput = this.FindControl<TextBox>("TxtLogin")?.Text?.Trim();
var passwordInput = this.FindControl<TextBox>("TxtPassword")?.Text?.Trim();
var lblError = this.FindControl<TextBlock>("LblError");
if (lblError != null)
{
lblError.Text = "";
}
if (string.IsNullOrEmpty(loginInput) || string.IsNullOrEmpty(passwordInput))
{
if (lblError != null) lblError.Text = "Пожалуйста, введите логин и пароль.";
return;
}
try
{
var user = DatabaseService.AuthenticateUser(loginInput, passwordInput);
if (user != null)
{
NavigateByRole(user.RoleId.id);
}
else
{
if (lblError != null) lblError.Text = "Неверный логин или пароль.";
}
}
catch (Exception ex)
{
if (lblError != null) lblError.Text = $"Ошибка: {ex.Message}";
}
}
private void NavigateByRole(int roleId)
{
@ -63,8 +30,10 @@ public partial class MainWindow : Window
nextWindow = new ReaderWindow();
break;
default:
var lblError = this.FindControl<TextBlock>("LblError");
if (lblError != null) lblError.Text = "Неизвестная роль пользователя.";
if (DataContext is MainWindowViewModel vm)
{
vm.ErrorMessage = "Неизвестная роль пользователя.";
}
return;
}

View File

@ -1,51 +1,54 @@
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:CourseProject1125.ViewModels"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="1100" d:DesignHeight="650"
x:Class="CourseProject1125.Views.ReaderWindow"
x:DataType="vm:ReaderWindowViewModel"
Title="Личный кабинет читателя - Библиотека"
Width="1100" Height="650"
WindowStartupLocation="CenterScreen"
Background="#0f172a">
Background="White">
<Grid ColumnDefinitions="240, *">
<Border Grid.Column="0" Background="#1e293b" BorderBrush="#334155" BorderThickness="0,0,1,0" Padding="15">
<Border Grid.Column="0" Background="LightGray" BorderBrush="Gray" BorderThickness="0,0,1,0" Padding="15">
<Grid RowDefinitions="Auto, *, Auto">
<StackPanel Grid.Row="0" Margin="0,10,0,30">
<TextBlock Text="БИБЛИОТЕКА" Foreground="#38bdf8" FontSize="20" FontWeight="Bold" HorizontalAlignment="Center" LetterSpacing="1"/>
<TextBlock Text="Личный кабинет" Foreground="#94a3b8" FontSize="11" HorizontalAlignment="Center"/>
<TextBlock Name="TxtReaderName" Foreground="#cbd5e1" FontSize="12" FontWeight="SemiBold" HorizontalAlignment="Center" Margin="0,10,0,0"/>
<TextBlock Text="БИБЛИОТЕКА" Foreground="Black" FontSize="20" FontWeight="Bold" HorizontalAlignment="Center" LetterSpacing="1"/>
<TextBlock Text="Личный кабинет" Foreground="Black" FontSize="11" HorizontalAlignment="Center"/>
<TextBlock Name="TxtReaderName" Text="{Binding ReaderName}" Foreground="Black" FontSize="12" FontWeight="SemiBold" HorizontalAlignment="Center" Margin="0,10,0,0"/>
</StackPanel>
<StackPanel Grid.Row="1">
<Button Name="BtnTabCatalog" Content=" Поиск книг" Click="BtnTab_Click" Tag="Catalog" HorizontalAlignment="Stretch" Height="40" Background="Transparent" Foreground="#94a3b8" FontWeight="SemiBold" CornerRadius="6" HorizontalContentAlignment="Left" Padding="15,0,0,0"/>
<Button Name="BtnTabMyLoans" Content=" Мои выдачи" Click="BtnTab_Click" Tag="MyLoans" HorizontalAlignment="Stretch" Height="40" Background="Transparent" Foreground="#94a3b8" FontWeight="SemiBold" CornerRadius="6" HorizontalContentAlignment="Left" Padding="15,0,0,0"/>
<Button Name="BtnTabMyFines" Content=" Мои штрафы" Click="BtnTab_Click" Tag="MyFines" HorizontalAlignment="Stretch" Height="40" Background="Transparent" Foreground="#94a3b8" FontWeight="SemiBold" CornerRadius="6" HorizontalContentAlignment="Left" Padding="15,0,0,0"/>
<Button Name="BtnTabMyReservations" Content=" Мои брони" Click="BtnTab_Click" Tag="MyReservations" HorizontalAlignment="Stretch" Height="40" Background="Transparent" Foreground="#94a3b8" FontWeight="SemiBold" CornerRadius="6" HorizontalContentAlignment="Left" Padding="15,0,0,0"/>
<Button Name="BtnTabCatalog" Content=" Поиск книг" Command="{Binding ShowTabCommand}" CommandParameter="Catalog" Background="{Binding CatalogTabBackground}" Foreground="{Binding CatalogTabForeground}" HorizontalAlignment="Stretch" Height="40" FontWeight="SemiBold" CornerRadius="6" HorizontalContentAlignment="Left" Padding="15,0,0,0"/>
<Button Name="BtnTabMyLoans" Content=" Мои выдачи" Command="{Binding ShowTabCommand}" CommandParameter="MyLoans" Background="{Binding MyLoansTabBackground}" Foreground="{Binding MyLoansTabForeground}" HorizontalAlignment="Stretch" Height="40" FontWeight="SemiBold" CornerRadius="6" HorizontalContentAlignment="Left" Padding="15,0,0,0"/>
<Button Name="BtnTabReturnBook" Content=" Сдать книгу" Command="{Binding ShowTabCommand}" CommandParameter="ReturnBook" Background="{Binding ReturnBookTabBackground}" Foreground="{Binding ReturnBookTabForeground}" HorizontalAlignment="Stretch" Height="40" FontWeight="SemiBold" CornerRadius="6" HorizontalContentAlignment="Left" Padding="15,0,0,0"/>
<Button Name="BtnTabMyFines" Content=" Мои штрафы" Command="{Binding ShowTabCommand}" CommandParameter="MyFines" Background="{Binding MyFinesTabBackground}" Foreground="{Binding MyFinesTabForeground}" HorizontalAlignment="Stretch" Height="40" FontWeight="SemiBold" CornerRadius="6" HorizontalContentAlignment="Left" Padding="15,0,0,0"/>
<Button Name="BtnTabMyReservations" Content=" Мои брони" Command="{Binding ShowTabCommand}" CommandParameter="MyReservations" Background="{Binding MyReservationsTabBackground}" Foreground="{Binding MyReservationsTabForeground}" HorizontalAlignment="Stretch" Height="40" FontWeight="SemiBold" CornerRadius="6" HorizontalContentAlignment="Left" Padding="15,0,0,0"/>
</StackPanel>
<Button Grid.Row="3" Content=" Выйти из системы" Click="BtnLogout_Click" HorizontalAlignment="Stretch" Height="40" Background="#ef4444" Foreground="White" FontWeight="Bold" CornerRadius="6" HorizontalContentAlignment="Center"/>
<Button Grid.Row="3" Content=" Выйти из системы" Command="{Binding LogoutCommand}" HorizontalAlignment="Stretch" Height="40" Background="Red" Foreground="White" FontWeight="Bold" CornerRadius="6" HorizontalContentAlignment="Center"/>
</Grid>
</Border>
<Grid Grid.Column="1" RowDefinitions="Auto, *">
<Border Grid.Row="0" Background="#1e293b" Height="60" Padding="20,0" BorderBrush="#334155" BorderThickness="0,0,0,1">
<Border Grid.Row="0" Background="LightGray" Height="60" Padding="20,0" BorderBrush="Gray" BorderThickness="0,0,0,1">
<Grid ColumnDefinitions="*, Auto">
<TextBlock Name="TxtActiveTabHeader" Text="🔍 Каталог и бронирование книг" Foreground="White" FontSize="18" FontWeight="Bold" VerticalAlignment="Center"/>
<TextBlock Grid.Column="1" Text="Роль: Читатель" Foreground="#94a3b8" FontSize="12" VerticalAlignment="Center"/>
<TextBlock Name="TxtActiveTabHeader" Text="{Binding ActiveTabHeader}" Foreground="Black" FontSize="18" FontWeight="Bold" VerticalAlignment="Center"/>
<TextBlock Grid.Column="1" Text="Роль: Читатель" Foreground="Black" FontSize="12" VerticalAlignment="Center"/>
</Grid>
</Border>
<Grid Grid.Row="1" Margin="20">
<Grid Name="GridCatalog" RowDefinitions="Auto, *">
<Grid Name="GridCatalog" RowDefinitions="Auto, *" IsVisible="{Binding IsCatalogVisible}">
<Grid Grid.Row="0" ColumnDefinitions="*, Auto">
<TextBox Name="TxtSearchQuery" Watermark="Введите название книги, автора или ISBN для поиска..." Height="40" CornerRadius="6" VerticalContentAlignment="Center"/>
<Button Grid.Column="1" Content="🔍 Поиск" Click="BtnSearch_Click" Background="#3b82f6" Foreground="White" Width="120" Height="40" FontWeight="Bold" CornerRadius="6" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
<TextBox Name="TxtSearchQuery" Text="{Binding SearchQuery, Mode=TwoWay}" Watermark="Введите название книги, автора или ISBN для поиска..." Height="40" CornerRadius="6" VerticalContentAlignment="Center"/>
<Button Grid.Column="1" Content="🔍 Поиск" Command="{Binding SearchCommand}" Background="Blue" Foreground="White" Width="120" Height="40" FontWeight="Bold" CornerRadius="6" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
</Grid>
<Grid Grid.Row="1" ColumnDefinitions="*, 320">
<DataGrid Name="DgCatalog" Grid.Column="0" AutoGenerateColumns="False" IsReadOnly="True" GridLinesVisibility="All" BorderThickness="1" BorderBrush="#334155" Background="#1e293b" SelectionChanged="DgCatalog_SelectionChanged">
<DataGrid Name="DgCatalog" Grid.Column="0" ItemsSource="{Binding BooksList}" SelectedItem="{Binding SelectedBook, Mode=TwoWay}" AutoGenerateColumns="False" IsReadOnly="True" GridLinesVisibility="All" BorderThickness="1" BorderBrush="LightGray" Background="White">
<DataGrid.Columns>
<DataGridTextColumn Header="Название книги" Binding="{Binding Title}" Width="2*"/>
<DataGridTextColumn Header="Автор" Binding="{Binding AuthorId.Name}" Width="1.5*"/>
@ -54,58 +57,84 @@
</DataGrid.Columns>
</DataGrid>
<Border Grid.Column="1" Background="#1e293b" CornerRadius="8" Padding="15" BorderBrush="#334155" BorderThickness="1" VerticalAlignment="Top">
<Border Grid.Column="1" Background="White" CornerRadius="8" Padding="15" BorderBrush="LightGray" BorderThickness="1" VerticalAlignment="Top">
<StackPanel>
<TextBlock Text="Информация о книге" Foreground="#38bdf8" FontSize="15" FontWeight="Bold"/>
<TextBlock Name="TxtCatalogBookTitle" Text="Выберите книгу из списка." Foreground="White" FontSize="14" FontWeight="SemiBold" TextWrapping="Wrap"/>
<TextBlock Name="TxtCatalogBookAuthor" Text="" Foreground="#cbd5e1" FontSize="13" TextWrapping="Wrap"/>
<TextBlock Name="TxtCatalogBookDesc" Text="" Foreground="#94a3b8" FontSize="12" TextWrapping="Wrap" MaxHeight="120"/>
<TextBlock Text="Информация о книге" Foreground="Black" FontSize="15" FontWeight="Bold"/>
<TextBlock Name="TxtCatalogBookTitle" Text="{Binding CatalogBookTitle}" Foreground="Black" FontSize="14" FontWeight="SemiBold" TextWrapping="Wrap"/>
<TextBlock Name="TxtCatalogBookAuthor" Text="{Binding CatalogBookAuthor}" Foreground="Black" FontSize="13" TextWrapping="Wrap"/>
<TextBlock Name="TxtCatalogBookDesc" Text="{Binding CatalogBookDesc}" Foreground="Black" FontSize="12" TextWrapping="Wrap" MaxHeight="120"/>
<Separator Background="#334155"/>
<TextBlock Name="TxtCatalogAvailability" Text="Доступно копий: -" Foreground="#cbd5e1" FontSize="13"/>
<Separator Background="LightGray"/>
<TextBlock Name="TxtCatalogAvailability" Text="{Binding CatalogAvailability}" Foreground="Black" FontSize="13"/>
<Button Name="BtnReserveBook" Content=" Забронировать" Click="BtnReserveBook_Click" Background="#22c55e" Foreground="White" HorizontalAlignment="Stretch" Height="40" FontWeight="Bold" CornerRadius="4" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsEnabled="False"/>
<Button Name="BtnReserveBook" Content=" Забронировать" Command="{Binding ReserveBookCommand}" IsEnabled="{Binding IsReserveEnabled}" Background="Green" Foreground="White" HorizontalAlignment="Stretch" Height="40" FontWeight="Bold" CornerRadius="4" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
<TextBlock Name="TxtCatalogStatus" Text="" Foreground="#22c55e" FontSize="12" TextWrapping="Wrap" HorizontalAlignment="Center"/>
<TextBlock Name="TxtCatalogStatus" Text="{Binding CatalogStatus}" Foreground="{Binding CatalogStatusColor}" FontSize="12" TextWrapping="Wrap" HorizontalAlignment="Center"/>
</StackPanel>
</Border>
</Grid>
</Grid>
<Grid Name="GridMyLoans" IsVisible="False">
<DataGrid Name="DgMyLoans" AutoGenerateColumns="False" IsReadOnly="True" GridLinesVisibility="All" BorderThickness="1" BorderBrush="#334155" Background="#1e293b">
<Grid Name="GridMyLoans" IsVisible="{Binding IsMyLoansVisible}">
<DataGrid Name="DgMyLoans" ItemsSource="{Binding MyLoansList}" AutoGenerateColumns="False" IsReadOnly="True" GridLinesVisibility="All" BorderThickness="1" BorderBrush="LightGray" Background="White">
<DataGrid.Columns>
<DataGridTextColumn Header="Книга" Binding="{Binding CopyId.BookId.Title}" Width="2*"/>
<DataGridTextColumn Header="Инв. Номер" Binding="{Binding CopyId.Inventory_number}" Width="120"/>
<DataGridTextColumn Header="Дата выдачи" Binding="{Binding Issue_date, StringFormat={}{0:dd.MM.yyyy}}" Width="120"/>
<DataGridTextColumn Header="Срок сдачи" Binding="{Binding Due_date, StringFormat={}{0:dd.MM.yyyy}}" Width="120"/>
<DataGridTextColumn Header="Дата сдачи" Binding="{Binding Return_date, StringFormat={}{0:dd.MM.yyyy}}" Width="120"/>
<DataGridTextColumn Header="Статус" Binding="{Binding Status}" Width="110"/>
<DataGridTextColumn Header="Статус" Binding="{Binding StatusText}" Width="130"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
<Grid Name="GridMyFines" ColumnDefinitions="*, 320" IsVisible="False">
<DataGrid Name="DgMyFines" Grid.Column="0" AutoGenerateColumns="False" IsReadOnly="True" GridLinesVisibility="All" BorderThickness="1" BorderBrush="#334155" Background="#1e293b">
<Grid Name="GridReturnBook" ColumnDefinitions="*, 320" IsVisible="{Binding IsReturnBookVisible}">
<DataGrid Name="DgReturnLoans" Grid.Column="0" ItemsSource="{Binding ActiveLoansList}" SelectedItem="{Binding SelectedReturnLoan, Mode=TwoWay}" AutoGenerateColumns="False" IsReadOnly="True" GridLinesVisibility="All" BorderThickness="1" BorderBrush="LightGray" Background="White">
<DataGrid.Columns>
<DataGridTextColumn Header="Книга" Binding="{Binding LoanId.CopyId.BookId.Title}" Width="2*"/>
<DataGridTextColumn Header="Сумма штрафа" Binding="{Binding Amount}" Width="120"/>
<DataGridTextColumn Header="Статус" Binding="{Binding Is_paid}" Width="110"/>
<DataGridTextColumn Header="Дата начисления" Binding="{Binding Created_at, StringFormat={}{0:dd.MM.yyyy}}" Width="130"/>
<DataGridTextColumn Header="Книга" Binding="{Binding CopyId.BookId.Title}" Width="2*"/>
<DataGridTextColumn Header="Инв. Номер" Binding="{Binding CopyId.Inventory_number}" Width="120"/>
<DataGridTextColumn Header="Дата выдачи" Binding="{Binding Issue_date, StringFormat={}{0:dd.MM.yyyy}}" Width="120"/>
<DataGridTextColumn Header="Срок сдачи" Binding="{Binding Due_date, StringFormat={}{0:dd.MM.yyyy}}" Width="120"/>
<DataGridTextColumn Header="Статус" Binding="{Binding StatusText}" Width="110"/>
</DataGrid.Columns>
</DataGrid>
<Border Grid.Column="1" Background="#1e293b" CornerRadius="8" Padding="15" BorderBrush="#334155" BorderThickness="1" VerticalAlignment="Top">
<Border Grid.Column="1" Background="White" CornerRadius="8" Padding="15" BorderBrush="LightGray" BorderThickness="1" VerticalAlignment="Top">
<StackPanel>
<TextBlock Text=" Оплата штрафов" Foreground="#38bdf8" FontSize="15" FontWeight="Bold"/>
<TextBlock Text="Штрафы начисляются за несвоевременный возврат книг (15 руб./день)." Foreground="#cbd5e1" TextWrapping="Wrap"/>
<TextBlock Text="Для оплаты штрафа обратитесь к библиотекарю в физический филиал библиотеки." Foreground="#cbd5e1" TextWrapping="Wrap" Margin="0,5,0,0"/>
<TextBlock Text="Возврат книги" Foreground="Black" FontSize="15" FontWeight="Bold"/>
<TextBlock Name="TxtReturnBookDetails" Text="{Binding ReturnBookDetails}" Foreground="Black" TextWrapping="Wrap" FontSize="13" Margin="0,5,0,10"/>
<Button Name="BtnSubmitReturn" Content=" Сдать книгу" Command="{Binding SubmitReturnCommand}" IsEnabled="{Binding IsSubmitReturnEnabled}" Background="Blue" Foreground="White" HorizontalAlignment="Stretch" Height="40" FontWeight="Bold" CornerRadius="4" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
<TextBlock Name="TxtReturnBookStatus" Text="{Binding ReturnBookStatus}" Foreground="{Binding ReturnBookStatusColor}" FontSize="13" TextWrapping="Wrap" HorizontalAlignment="Center" FontWeight="SemiBold" Margin="0,10,0,0"/>
</StackPanel>
</Border>
</Grid>
<Grid Name="GridMyReservations" ColumnDefinitions="*, 320" IsVisible="False">
<DataGrid Name="DgMyReservations" Grid.Column="0" AutoGenerateColumns="False" IsReadOnly="True" GridLinesVisibility="All" BorderThickness="1" BorderBrush="#334155" Background="#1e293b" SelectionChanged="DgMyReservations_SelectionChanged">
<Grid Name="GridMyFines" ColumnDefinitions="*, 320" IsVisible="{Binding IsMyFinesVisible}">
<DataGrid Name="DgMyFines" Grid.Column="0" ItemsSource="{Binding MyFinesList}" SelectedItem="{Binding SelectedFine, Mode=TwoWay}" AutoGenerateColumns="False" IsReadOnly="True" GridLinesVisibility="All" BorderThickness="1" BorderBrush="LightGray" Background="White">
<DataGrid.Columns>
<DataGridTextColumn Header="Книга" Binding="{Binding LoanId.CopyId.BookId.Title}" Width="2*"/>
<DataGridTextColumn Header="Сумма штрафа" Binding="{Binding Amount}" Width="120"/>
<DataGridTextColumn Header="Статус" Binding="{Binding StatusText}" Width="110"/>
<DataGridTextColumn Header="Дата начисления" Binding="{Binding Created_at, StringFormat={}{0:dd.MM.yyyy}}" Width="130"/>
</DataGrid.Columns>
</DataGrid>
<Border Grid.Column="1" Background="White" CornerRadius="8" Padding="15" BorderBrush="LightGray" BorderThickness="1" VerticalAlignment="Top">
<StackPanel>
<TextBlock Text="Оплата штрафа" Foreground="Black" FontSize="15" FontWeight="Bold"/>
<TextBlock Name="TxtMyFineDetails" Text="{Binding MyFineDetails}" Foreground="Black" TextWrapping="Wrap" FontSize="13" Margin="0,5,0,10"/>
<Button Name="BtnPayMyFine" Content=" Оплатить штраф" Command="{Binding PayMyFineCommand}" IsEnabled="{Binding IsPayMyFineEnabled}" Background="Green" Foreground="White" HorizontalAlignment="Stretch" Height="40" FontWeight="Bold" CornerRadius="4" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
<TextBlock Name="TxtMyFineStatus" Text="{Binding MyFineStatus}" Foreground="{Binding MyFineStatusColor}" FontSize="13" TextWrapping="Wrap" HorizontalAlignment="Center" FontWeight="SemiBold" Margin="0,10,0,0"/>
</StackPanel>
</Border>
</Grid>
<Grid Name="GridMyReservations" ColumnDefinitions="*, 320" IsVisible="{Binding IsMyReservationsVisible}">
<DataGrid Name="DgMyReservations" Grid.Column="0" ItemsSource="{Binding MyReservationsList}" SelectedItem="{Binding SelectedReservation, Mode=TwoWay}" AutoGenerateColumns="False" IsReadOnly="True" GridLinesVisibility="All" BorderThickness="1" BorderBrush="LightGray" Background="White">
<DataGrid.Columns>
<DataGridTextColumn Header="Книга" Binding="{Binding BookId.Title}" Width="2*"/>
<DataGridTextColumn Header="Дата бронирования" Binding="{Binding Reservation_date, StringFormat={}{0:dd.MM.yyyy}}" Width="150"/>
@ -114,14 +143,14 @@
</DataGrid.Columns>
</DataGrid>
<Border Grid.Column="1" Background="#1e293b" CornerRadius="8" Padding="15" BorderBrush="#334155" BorderThickness="1" VerticalAlignment="Top">
<Border Grid.Column="1" Background="White" CornerRadius="8" Padding="15" BorderBrush="LightGray" BorderThickness="1" VerticalAlignment="Top">
<StackPanel>
<TextBlock Text="Действия с бронью" Foreground="#38bdf8" FontSize="15" FontWeight="Bold"/>
<TextBlock Name="TxtMyReservationDetails" Text="Выберите бронь из списка." Foreground="#cbd5e1" TextWrapping="Wrap" FontSize="13"/>
<TextBlock Text="Действия с бронью" Foreground="Black" FontSize="15" FontWeight="Bold"/>
<TextBlock Name="TxtMyReservationDetails" Text="{Binding MyReservationDetails}" Foreground="Black" TextWrapping="Wrap" FontSize="13"/>
<Button Name="BtnCancelMyReservation" Content=" Отменить бронь" Click="BtnCancelMyReservation_Click" Background="#ef4444" Foreground="White" HorizontalAlignment="Stretch" Height="40" FontWeight="Bold" CornerRadius="4" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsEnabled="False"/>
<Button Name="BtnCancelMyReservation" Content=" Отменить бронь" Command="{Binding CancelMyReservationCommand}" IsEnabled="{Binding IsCancelMyReservationEnabled}" Background="Red" Foreground="White" HorizontalAlignment="Stretch" Height="40" FontWeight="Bold" CornerRadius="4" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
<TextBlock Name="TxtMyReservationStatus" Text="" Foreground="#cbd5e1" FontSize="13" TextWrapping="Wrap" HorizontalAlignment="Center"/>
<TextBlock Name="TxtMyReservationStatus" Text="{Binding MyReservationStatus}" Foreground="{Binding MyReservationStatusColor}" FontSize="13" TextWrapping="Wrap" HorizontalAlignment="Center"/>
</StackPanel>
</Border>
</Grid>

View File

@ -1,276 +1,23 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Interactivity;
using Avalonia.Media;
using CourseProject1125.DB;
using CourseProject1125.Models;
using CourseProject1125.ViewModels;
namespace CourseProject1125.Views;
public partial class ReaderWindow : Window
namespace CourseProject1125.Views
{
private Book? _selectedBook;
private Reservation? _selectedReservation;
private List<Book> _allBooks = new();
private List<Book_copies> _allCopies = new();
private List<Loan> _myLoans = new();
private List<Fine> _myFines = new();
private List<Reservation> _myReservations = new();
public ReaderWindow()
public partial class ReaderWindow : Window
{
InitializeComponent();
// Show reader's name
TxtReaderName.Text = UserSession.UserName;
LoadAllData();
ShowTab("Catalog");
}
private void LoadAllData()
{
_allBooks = DatabaseService.GetBooks();
_allCopies = DatabaseService.GetBookCopies();
RefreshCatalog();
RefreshMyLoans();
RefreshMyFines();
RefreshMyReservations();
}
#region Navigation
private void BtnTab_Click(object? sender, RoutedEventArgs e)
{
if (sender is Button btn && btn.Tag is string tabName)
public ReaderWindow()
{
ShowTab(tabName);
}
}
private void ShowTab(string tabName)
{
// Hide all grids
GridCatalog.IsVisible = false;
GridMyLoans.IsVisible = false;
GridMyFines.IsVisible = false;
GridMyReservations.IsVisible = false;
// Reset button styles
ResetButtonStyles(BtnTabCatalog);
ResetButtonStyles(BtnTabMyLoans);
ResetButtonStyles(BtnTabMyFines);
ResetButtonStyles(BtnTabMyReservations);
switch (tabName)
{
case "Catalog":
GridCatalog.IsVisible = true;
TxtActiveTabHeader.Text = "🔍 Каталог и бронирование книг";
SetActiveButtonStyles(BtnTabCatalog);
LoadAllData(); // Reload catalog to get latest availability
break;
case "MyLoans":
GridMyLoans.IsVisible = true;
TxtActiveTabHeader.Text = "📚 Мои выданные книги";
SetActiveButtonStyles(BtnTabMyLoans);
RefreshMyLoans();
break;
case "MyFines":
GridMyFines.IsVisible = true;
TxtActiveTabHeader.Text = "💰 Мои штрафы";
SetActiveButtonStyles(BtnTabMyFines);
RefreshMyFines();
break;
case "MyReservations":
GridMyReservations.IsVisible = true;
TxtActiveTabHeader.Text = "🛎️ Мои бронирования";
SetActiveButtonStyles(BtnTabMyReservations);
RefreshMyReservations();
break;
}
}
private void ResetButtonStyles(Button btn)
{
btn.Background = Brushes.Transparent;
btn.Foreground = Brush.Parse("#94a3b8");
}
private void SetActiveButtonStyles(Button btn)
{
btn.Background = Brush.Parse("#0f172a");
btn.Foreground = Brush.Parse("#38bdf8");
}
private void BtnLogout_Click(object? sender, RoutedEventArgs e)
{
var mainWin = new MainWindow();
mainWin.Show();
this.Close();
}
#endregion
#region Catalog Tab (Search & Reserve)
private void RefreshCatalog()
{
DgCatalog.ItemsSource = null;
DgCatalog.ItemsSource = _allBooks;
_selectedBook = null;
TxtCatalogBookTitle.Text = "Выберите книгу из списка.";
TxtCatalogBookAuthor.Text = "";
TxtCatalogBookDesc.Text = "";
TxtCatalogAvailability.Text = "Доступно копий: -";
BtnReserveBook.IsEnabled = false;
TxtCatalogStatus.Text = "";
}
private void BtnSearch_Click(object? sender, RoutedEventArgs e)
{
string query = TxtSearchQuery.Text?.Trim() ?? "";
if (string.IsNullOrEmpty(query))
{
DgCatalog.ItemsSource = _allBooks;
}
else
{
var filtered = _allBooks.Where(b =>
b.Title.Contains(query, StringComparison.OrdinalIgnoreCase) ||
b.AuthorId.Name.Contains(query, StringComparison.OrdinalIgnoreCase) ||
b.Isbn.Contains(query, StringComparison.OrdinalIgnoreCase)
).ToList();
DgCatalog.ItemsSource = filtered;
}
}
private void DgCatalog_SelectionChanged(object? sender, SelectionChangedEventArgs e)
{
if (DgCatalog.SelectedItem is Book book)
{
_selectedBook = book;
TxtCatalogBookTitle.Text = book.Title;
TxtCatalogBookAuthor.Text = $"Автор: {book.AuthorId.Name} | ISBN: {book.Isbn} | Год: {book.Year_published}";
TxtCatalogBookDesc.Text = string.IsNullOrEmpty(book.Description) ? "Описание отсутствует." : book.Description;
// Calculate availability
int totalCopies = _allCopies.Count(c => c.BookId.Id == book.Id);
int availableCopies = _allCopies.Count(c => c.BookId.Id == book.Id && c.Status.Equals("available", StringComparison.OrdinalIgnoreCase));
TxtCatalogAvailability.Text = $"Всего экземпляров: {totalCopies} | Доступно для выдачи: {availableCopies}";
// Enable reservation button only if there is at least one copy available
BtnReserveBook.IsEnabled = availableCopies > 0;
TxtCatalogStatus.Text = "";
}
}
private void BtnReserveBook_Click(object? sender, RoutedEventArgs e)
{
if (_selectedBook == null) return;
int readerId = UserSession.UserId;
DateTime expiryDate = DateTime.Now.AddDays(3); // Reserve valid for 3 days
if (DatabaseService.CreateReservation(_selectedBook.Id, readerId, expiryDate))
{
TxtCatalogStatus.Foreground = Brush.Parse("#22c55e");
TxtCatalogStatus.Text = "Успешно! Книга забронирована на 3 дня. Заберите её на стойке выдачи.";
// Reload copies to update lists
_allCopies = DatabaseService.GetBookCopies();
// Update UI details
if (DgCatalog.SelectedItem is Book currentBook)
var viewModel = new ReaderWindowViewModel();
viewModel.OnLogoutRequested = () =>
{
int totalCopies = _allCopies.Count(c => c.BookId.Id == currentBook.Id);
int availableCopies = _allCopies.Count(c => c.BookId.Id == currentBook.Id && c.Status.Equals("available", StringComparison.OrdinalIgnoreCase));
TxtCatalogAvailability.Text = $"Всего экземпляров: {totalCopies} | Доступно для выдачи: {availableCopies}";
BtnReserveBook.IsEnabled = availableCopies > 0;
}
}
else
{
TxtCatalogStatus.Foreground = Brush.Parse("#ef4444");
TxtCatalogStatus.Text = "Ошибка создания бронирования.";
var mainWin = new MainWindow();
mainWin.Show();
this.Close();
};
DataContext = viewModel;
InitializeComponent();
}
}
#endregion
#region My Loans Tab
private void RefreshMyLoans()
{
int readerId = UserSession.UserId;
var allLoans = DatabaseService.GetLoans();
_myLoans = allLoans.Where(l => l.ReaderId.Id == readerId).ToList();
DgMyLoans.ItemsSource = null;
DgMyLoans.ItemsSource = _myLoans;
}
#endregion
#region My Fines Tab
private void RefreshMyFines()
{
int readerId = UserSession.UserId;
var allFines = DatabaseService.GetFines();
_myFines = allFines.Where(f => f.LoanId.ReaderId.Id == readerId).ToList();
DgMyFines.ItemsSource = null;
DgMyFines.ItemsSource = _myFines;
}
#endregion
#region My Reservations Tab
private void RefreshMyReservations()
{
int readerId = UserSession.UserId;
var allRes = DatabaseService.GetReservations();
_myReservations = allRes.Where(r => r.ReaderId.Id == readerId).ToList();
DgMyReservations.ItemsSource = null;
DgMyReservations.ItemsSource = _myReservations;
BtnCancelMyReservation.IsEnabled = false;
TxtMyReservationDetails.Text = "Выберите бронь из списка.";
TxtMyReservationStatus.Text = "";
_selectedReservation = null;
}
private void DgMyReservations_SelectionChanged(object? sender, SelectionChangedEventArgs e)
{
if (DgMyReservations.SelectedItem is Reservation res)
{
_selectedReservation = res;
string activeStr = res.is_active == 1 ? "Активна" : "Неактивна/Отменена";
TxtMyReservationDetails.Text = $"Книга: {res.BookId.Title}\n" +
$"Дата брони: {res.Reservation_date:dd.MM.yyyy}\n" +
$"Истекает: {res.Expiry_date:dd.MM.yyyy}\n" +
$"Статус: {activeStr}";
BtnCancelMyReservation.IsEnabled = res.is_active == 1;
}
}
private void BtnCancelMyReservation_Click(object? sender, RoutedEventArgs e)
{
if (_selectedReservation == null) return;
if (DatabaseService.CancelReservation(_selectedReservation.Id))
{
TxtMyReservationStatus.Foreground = Brush.Parse("#22c55e");
TxtMyReservationStatus.Text = "Бронирование успешно отменено!";
RefreshMyReservations();
}
else
{
TxtMyReservationStatus.Foreground = Brush.Parse("#ef4444");
TxtMyReservationStatus.Text = "Ошибка при отмене бронирования.";
}
}
#endregion
}

View File

@ -1,5 +1,5 @@
{
"DatabaseConnection": {
"ConnectionString": "server=127.0.0.1; userid=root; password=; database=courseproject1125; port=3306; characterset=utf8"
"ConnectionString": "server=192.168.200.13; userid=student; password=student; database=1125_CourseSolop; port=3306; characterset=utf8; Convert Zero Datetime=True"
}
}

View File

@ -25,7 +25,6 @@
},
"Avalonia/11.3.4": {
"dependencies": {
"Avalonia.BuildServices": "0.0.31",
"Avalonia.Remote.Protocol": "11.3.4",
"MicroCom.Runtime": "0.11.0"
},
@ -95,7 +94,6 @@
}
}
},
"Avalonia.BuildServices/0.0.31": {},
"Avalonia.Controls.ColorPicker/11.3.4": {
"dependencies": {
"Avalonia": "11.3.4",
@ -201,10 +199,8 @@
"Avalonia": "11.3.4",
"HarfBuzzSharp": "8.3.1.1",
"HarfBuzzSharp.NativeAssets.Linux": "8.3.1.1",
"HarfBuzzSharp.NativeAssets.WebAssembly": "8.3.1.1",
"SkiaSharp": "2.88.9",
"SkiaSharp.NativeAssets.Linux": "2.88.9",
"SkiaSharp.NativeAssets.WebAssembly": "2.88.9"
"SkiaSharp.NativeAssets.Linux": "2.88.9"
},
"runtime": {
"lib/net8.0/Avalonia.Skia.dll": {
@ -352,7 +348,6 @@
}
}
},
"HarfBuzzSharp.NativeAssets.WebAssembly/8.3.1.1": {},
"HarfBuzzSharp.NativeAssets.Win32/8.3.1.1": {
"runtimeTargets": {
"runtimes/win-arm64/native/libHarfBuzzSharp.dll": {
@ -605,8 +600,7 @@
"Microsoft.Extensions.Configuration": "8.0.0",
"Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
"Microsoft.Extensions.Configuration.FileExtensions": "8.0.0",
"Microsoft.Extensions.FileProviders.Abstractions": "8.0.0",
"System.Text.Json": "8.0.0"
"Microsoft.Extensions.FileProviders.Abstractions": "8.0.0"
},
"runtime": {
"lib/net8.0/Microsoft.Extensions.Configuration.Json.dll": {
@ -664,8 +658,7 @@
"Microsoft.Extensions.Diagnostics.Abstractions/8.0.0": {
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
"Microsoft.Extensions.Options": "8.0.2",
"System.Diagnostics.DiagnosticSource": "8.0.0"
"Microsoft.Extensions.Options": "8.0.2"
},
"runtime": {
"lib/net8.0/Microsoft.Extensions.Diagnostics.Abstractions.dll": {
@ -801,8 +794,7 @@
"Microsoft.Extensions.Logging": "8.0.0",
"Microsoft.Extensions.Logging.Abstractions": "8.0.2",
"Microsoft.Extensions.Logging.Configuration": "8.0.0",
"Microsoft.Extensions.Options": "8.0.2",
"System.Text.Json": "8.0.0"
"Microsoft.Extensions.Options": "8.0.2"
},
"runtime": {
"lib/net8.0/Microsoft.Extensions.Logging.Console.dll": {
@ -845,8 +837,7 @@
"Microsoft.Extensions.Logging": "8.0.0",
"Microsoft.Extensions.Logging.Abstractions": "8.0.2",
"Microsoft.Extensions.Options": "8.0.2",
"Microsoft.Extensions.Primitives": "8.0.0",
"System.Text.Json": "8.0.0"
"Microsoft.Extensions.Primitives": "8.0.0"
},
"runtime": {
"lib/net8.0/Microsoft.Extensions.Logging.EventSource.dll": {
@ -1023,7 +1014,6 @@
}
}
},
"SkiaSharp.NativeAssets.WebAssembly/2.88.9": {},
"SkiaSharp.NativeAssets.Win32/2.88.9": {
"runtimeTargets": {
"runtimes/win-arm64/native/libSkiaSharp.dll": {
@ -1055,7 +1045,6 @@
}
}
},
"System.Diagnostics.DiagnosticSource/8.0.0": {},
"System.Diagnostics.EventLog/8.0.1": {
"runtime": {
"lib/net8.0/System.Diagnostics.EventLog.dll": {
@ -1122,12 +1111,6 @@
}
}
},
"System.Text.Encodings.Web/8.0.0": {},
"System.Text.Json/8.0.0": {
"dependencies": {
"System.Text.Encodings.Web": "8.0.0"
}
},
"Tmds.DBus.Protocol/0.21.2": {
"dependencies": {
"System.IO.Pipelines": "8.0.0"
@ -1161,13 +1144,6 @@
"path": "avalonia.angle.windows.natives/2.1.25547.20250602",
"hashPath": "avalonia.angle.windows.natives.2.1.25547.20250602.nupkg.sha512"
},
"Avalonia.BuildServices/0.0.31": {
"type": "package",
"serviceable": true,
"sha512": "sha512-KmCN6Hc+45q4OnF10ge450yVUvWuxU6bdQiyKqiSvrHKpahNrEdk0kG6Ip6GHk2SKOCttGQuA206JVdkldEENg==",
"path": "avalonia.buildservices/0.0.31",
"hashPath": "avalonia.buildservices.0.0.31.nupkg.sha512"
},
"Avalonia.Controls.ColorPicker/11.3.4": {
"type": "package",
"serviceable": true,
@ -1287,13 +1263,6 @@
"path": "harfbuzzsharp.nativeassets.macos/8.3.1.1",
"hashPath": "harfbuzzsharp.nativeassets.macos.8.3.1.1.nupkg.sha512"
},
"HarfBuzzSharp.NativeAssets.WebAssembly/8.3.1.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-loJweK2u/mH/3C2zBa0ggJlITIszOkK64HLAZB7FUT670dTg965whLFYHDQo69NmC4+d9UN0icLC9VHidXaVCA==",
"path": "harfbuzzsharp.nativeassets.webassembly/8.3.1.1",
"hashPath": "harfbuzzsharp.nativeassets.webassembly.8.3.1.1.nupkg.sha512"
},
"HarfBuzzSharp.NativeAssets.Win32/8.3.1.1": {
"type": "package",
"serviceable": true,
@ -1623,13 +1592,6 @@
"path": "skiasharp.nativeassets.macos/2.88.9",
"hashPath": "skiasharp.nativeassets.macos.2.88.9.nupkg.sha512"
},
"SkiaSharp.NativeAssets.WebAssembly/2.88.9": {
"type": "package",
"serviceable": true,
"sha512": "sha512-kt06RccBHSnAs2wDYdBSfsjIDbY3EpsOVqnlDgKdgvyuRA8ZFDaHRdWNx1VHjGgYzmnFCGiTJBnXFl5BqGwGnA==",
"path": "skiasharp.nativeassets.webassembly/2.88.9",
"hashPath": "skiasharp.nativeassets.webassembly.2.88.9.nupkg.sha512"
},
"SkiaSharp.NativeAssets.Win32/2.88.9": {
"type": "package",
"serviceable": true,
@ -1644,13 +1606,6 @@
"path": "system.configuration.configurationmanager/8.0.1",
"hashPath": "system.configuration.configurationmanager.8.0.1.nupkg.sha512"
},
"System.Diagnostics.DiagnosticSource/8.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-c9xLpVz6PL9lp/djOWtk5KPDZq3cSYpmXoJQY524EOtuFl5z9ZtsotpsyrDW40U1DRnQSYvcPKEUV0X//u6gkQ==",
"path": "system.diagnostics.diagnosticsource/8.0.0",
"hashPath": "system.diagnostics.diagnosticsource.8.0.0.nupkg.sha512"
},
"System.Diagnostics.EventLog/8.0.1": {
"type": "package",
"serviceable": true,
@ -1686,20 +1641,6 @@
"path": "system.security.cryptography.protecteddata/8.0.0",
"hashPath": "system.security.cryptography.protecteddata.8.0.0.nupkg.sha512"
},
"System.Text.Encodings.Web/8.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==",
"path": "system.text.encodings.web/8.0.0",
"hashPath": "system.text.encodings.web.8.0.0.nupkg.sha512"
},
"System.Text.Json/8.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-OdrZO2WjkiEG6ajEFRABTRCi/wuXQPxeV6g8xvUJqdxMvvuCCEk86zPla8UiIQJz3durtUEbNyY/3lIhS0yZvQ==",
"path": "system.text.json/8.0.0",
"hashPath": "system.text.json.8.0.0.nupkg.sha512"
},
"Tmds.DBus.Protocol/0.21.2": {
"type": "package",
"serviceable": true,

View File

@ -1,5 +1,5 @@
{
"DatabaseConnection": {
"ConnectionString": "server=127.0.0.1; userid=root; password=; database=courseproject1125; port=3306; characterset=utf8"
"ConnectionString": "server=192.168.200.13; userid=student; password=student; database=1125_CourseSolop; port=3306; characterset=utf8; Convert Zero Datetime=True"
}
}

View File

@ -1,5 +1,5 @@
{
"DatabaseConnection": {
"ConnectionString": "server=127.0.0.1; userid=root; password=; database=courseproject1125; port=3306; characterset=utf8"
"ConnectionString": "server=127.0.0.1; userid=root; password=; database=courseproject1125; port=3306; characterset=utf8; Convert Zero Datetime=True"
}
}

View File

@ -1,26 +1,33 @@
{
"format": 1,
"restore": {
"C:\\Users\\danii\\OneDrive\\Desktop\\Project\\CourseProject1125\\CourseProject1125.csproj": {}
"C:\\Users\\student\\Desktop\\Project\\CourseProject1125\\CourseProject1125.csproj": {}
},
"projects": {
"C:\\Users\\danii\\OneDrive\\Desktop\\Project\\CourseProject1125\\CourseProject1125.csproj": {
"C:\\Users\\student\\Desktop\\Project\\CourseProject1125\\CourseProject1125.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "C:\\Users\\danii\\OneDrive\\Desktop\\Project\\CourseProject1125\\CourseProject1125.csproj",
"projectUniqueName": "C:\\Users\\student\\Desktop\\Project\\CourseProject1125\\CourseProject1125.csproj",
"projectName": "CourseProject1125",
"projectPath": "C:\\Users\\danii\\OneDrive\\Desktop\\Project\\CourseProject1125\\CourseProject1125.csproj",
"packagesPath": "C:\\Users\\danii\\.nuget\\packages\\",
"outputPath": "C:\\Users\\danii\\OneDrive\\Desktop\\Project\\CourseProject1125\\obj\\",
"projectPath": "C:\\Users\\student\\Desktop\\Project\\CourseProject1125\\CourseProject1125.csproj",
"packagesPath": "C:\\Users\\student\\.nuget\\packages\\",
"outputPath": "C:\\Users\\student\\Desktop\\Project\\CourseProject1125\\obj\\",
"projectStyle": "PackageReference",
"fallbackFolders": [
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
],
"configFilePaths": [
"C:\\Users\\danii\\AppData\\Roaming\\NuGet\\NuGet.Config"
"C:\\Users\\student\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
"net8.0"
],
"sources": {
"https://api.nuget.org/v3/index.json": {}
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"C:\\Program Files\\dotnet\\library-packs": {},
"http://192.168.200.81:8081/repository/nuget.org-proxy/index.json": {}
},
"frameworks": {
"net8.0": {
@ -38,7 +45,7 @@
"auditLevel": "low",
"auditMode": "direct"
},
"SdkAnalysisLevel": "9.0.300"
"SdkAnalysisLevel": "10.0.300"
},
"frameworks": {
"net8.0": {
@ -119,7 +126,7 @@
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Users\\danii\\.dotnet\\sdk\\9.0.314/PortableRuntimeIdentifierGraph.json"
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.300/PortableRuntimeIdentifierGraph.json"
}
}
}

View File

@ -5,12 +5,13 @@
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\danii\.nuget\packages\</NuGetPackageFolders>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\student\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">7.0.0</NuGetToolVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="C:\Users\danii\.nuget\packages\" />
<SourceRoot Include="C:\Users\student\.nuget\packages\" />
<SourceRoot Include="C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages\" />
</ItemGroup>
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<Import Project="$(NuGetPackageRoot)skiasharp.nativeassets.webassembly\2.88.9\buildTransitive\netstandard1.0\SkiaSharp.NativeAssets.WebAssembly.props" Condition="Exists('$(NuGetPackageRoot)skiasharp.nativeassets.webassembly\2.88.9\buildTransitive\netstandard1.0\SkiaSharp.NativeAssets.WebAssembly.props')" />
@ -19,7 +20,7 @@
<Import Project="$(NuGetPackageRoot)avalonia\11.3.4\buildTransitive\Avalonia.props" Condition="Exists('$(NuGetPackageRoot)avalonia\11.3.4\buildTransitive\Avalonia.props')" />
</ImportGroup>
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<PkgAvalonia_BuildServices Condition=" '$(PkgAvalonia_BuildServices)' == '' ">C:\Users\danii\.nuget\packages\avalonia.buildservices\0.0.31</PkgAvalonia_BuildServices>
<PkgAvalonia Condition=" '$(PkgAvalonia)' == '' ">C:\Users\danii\.nuget\packages\avalonia\11.3.4</PkgAvalonia>
<PkgAvalonia_BuildServices Condition=" '$(PkgAvalonia_BuildServices)' == '' ">C:\Users\student\.nuget\packages\avalonia.buildservices\0.0.31</PkgAvalonia_BuildServices>
<PkgAvalonia Condition=" '$(PkgAvalonia)' == '' ">C:\Users\student\.nuget\packages\avalonia\11.3.4</PkgAvalonia>
</PropertyGroup>
</Project>

View File

@ -1 +1 @@
294271ec211234fd079b4594ff340682c693cd43445f59eb9b6345b1035925e6
fa28311452cd50c3f966bd5240424614abe3050f072b61080a48759c142d79fe

View File

@ -1,236 +1,236 @@
C:\Users\danii\.nuget\packages\avalonia\11.3.4\ref\net8.0\Avalonia.Base.dll
C:\Users\danii\.nuget\packages\avalonia.controls.colorpicker\11.3.4\lib\net8.0\Avalonia.Controls.ColorPicker.dll
C:\Users\danii\.nuget\packages\avalonia.controls.datagrid\11.3.4\lib\net8.0\Avalonia.Controls.DataGrid.dll
C:\Users\danii\.nuget\packages\avalonia\11.3.4\ref\net8.0\Avalonia.Controls.dll
C:\Users\danii\.nuget\packages\avalonia\11.3.4\ref\net8.0\Avalonia.DesignerSupport.dll
C:\Users\danii\.nuget\packages\avalonia.desktop\11.3.4\lib\net8.0\Avalonia.Desktop.dll
C:\Users\danii\.nuget\packages\avalonia.diagnostics\11.3.4\lib\net8.0\Avalonia.Diagnostics.dll
C:\Users\danii\.nuget\packages\avalonia\11.3.4\ref\net8.0\Avalonia.Dialogs.dll
C:\Users\danii\.nuget\packages\avalonia\11.3.4\ref\net8.0\Avalonia.dll
C:\Users\danii\.nuget\packages\avalonia.fonts.inter\11.3.4\lib\net8.0\Avalonia.Fonts.Inter.dll
C:\Users\danii\.nuget\packages\avalonia.freedesktop\11.3.4\lib\net8.0\Avalonia.FreeDesktop.dll
C:\Users\danii\.nuget\packages\avalonia\11.3.4\ref\net8.0\Avalonia.Markup.dll
C:\Users\danii\.nuget\packages\avalonia\11.3.4\ref\net8.0\Avalonia.Markup.Xaml.dll
C:\Users\danii\.nuget\packages\avalonia\11.3.4\ref\net8.0\Avalonia.Metal.dll
C:\Users\danii\.nuget\packages\avalonia\11.3.4\ref\net8.0\Avalonia.MicroCom.dll
C:\Users\danii\.nuget\packages\avalonia.native\11.3.4\lib\net8.0\Avalonia.Native.dll
C:\Users\danii\.nuget\packages\avalonia\11.3.4\ref\net8.0\Avalonia.OpenGL.dll
C:\Users\danii\.nuget\packages\avalonia.remote.protocol\11.3.4\lib\net8.0\Avalonia.Remote.Protocol.dll
C:\Users\danii\.nuget\packages\avalonia.skia\11.3.4\lib\net8.0\Avalonia.Skia.dll
C:\Users\danii\.nuget\packages\avalonia.themes.fluent\11.3.4\lib\net8.0\Avalonia.Themes.Fluent.dll
C:\Users\danii\.nuget\packages\avalonia.themes.simple\11.3.4\lib\net8.0\Avalonia.Themes.Simple.dll
C:\Users\danii\.nuget\packages\avalonia\11.3.4\ref\net8.0\Avalonia.Vulkan.dll
C:\Users\danii\.nuget\packages\avalonia.win32\11.3.4\lib\net8.0\Avalonia.Win32.Automation.dll
C:\Users\danii\.nuget\packages\avalonia.win32\11.3.4\lib\net8.0\Avalonia.Win32.dll
C:\Users\danii\.nuget\packages\avalonia.x11\11.3.4\lib\net8.0\Avalonia.X11.dll
C:\Users\danii\.nuget\packages\communitytoolkit.mvvm\8.2.1\lib\net6.0\CommunityToolkit.Mvvm.dll
C:\Users\danii\.nuget\packages\harfbuzzsharp\8.3.1.1\lib\net8.0\HarfBuzzSharp.dll
C:\Users\danii\.nuget\packages\microcom.runtime\0.11.0\lib\net5.0\MicroCom.Runtime.dll
C:\Users\danii\.nuget\packages\microsoft.bcl.cryptography\8.0.0\lib\net8.0\Microsoft.Bcl.Cryptography.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\Microsoft.CSharp.dll
C:\Users\danii\.nuget\packages\microsoft.data.sqlclient\7.0.1\ref\net8.0\Microsoft.Data.SqlClient.dll
C:\Users\danii\.nuget\packages\microsoft.data.sqlclient.extensions.abstractions\1.0.0\lib\netstandard2.0\Microsoft.Data.SqlClient.Extensions.Abstractions.dll
C:\Users\danii\.nuget\packages\microsoft.data.sqlclient.internal.logging\1.0.0\lib\netstandard2.0\Microsoft.Data.SqlClient.Internal.Logging.dll
C:\Users\danii\.nuget\packages\microsoft.extensions.configuration.abstractions\8.0.0\lib\net8.0\Microsoft.Extensions.Configuration.Abstractions.dll
C:\Users\danii\.nuget\packages\microsoft.extensions.configuration.binder\8.0.0\lib\net8.0\Microsoft.Extensions.Configuration.Binder.dll
C:\Users\danii\.nuget\packages\microsoft.extensions.configuration.commandline\8.0.0\lib\net8.0\Microsoft.Extensions.Configuration.CommandLine.dll
C:\Users\danii\.nuget\packages\microsoft.extensions.configuration\8.0.0\lib\net8.0\Microsoft.Extensions.Configuration.dll
C:\Users\danii\.nuget\packages\microsoft.extensions.configuration.environmentvariables\8.0.0\lib\net8.0\Microsoft.Extensions.Configuration.EnvironmentVariables.dll
C:\Users\danii\.nuget\packages\microsoft.extensions.configuration.fileextensions\8.0.0\lib\net8.0\Microsoft.Extensions.Configuration.FileExtensions.dll
C:\Users\danii\.nuget\packages\microsoft.extensions.configuration.json\8.0.0\lib\net8.0\Microsoft.Extensions.Configuration.Json.dll
C:\Users\danii\.nuget\packages\microsoft.extensions.configuration.usersecrets\8.0.0\lib\net8.0\Microsoft.Extensions.Configuration.UserSecrets.dll
C:\Users\danii\.nuget\packages\microsoft.extensions.dependencyinjection.abstractions\8.0.2\lib\net8.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll
C:\Users\danii\.nuget\packages\microsoft.extensions.dependencyinjection\8.0.0\lib\net8.0\Microsoft.Extensions.DependencyInjection.dll
C:\Users\danii\.nuget\packages\microsoft.extensions.diagnostics.abstractions\8.0.0\lib\net8.0\Microsoft.Extensions.Diagnostics.Abstractions.dll
C:\Users\danii\.nuget\packages\microsoft.extensions.diagnostics\8.0.0\lib\net8.0\Microsoft.Extensions.Diagnostics.dll
C:\Users\danii\.nuget\packages\microsoft.extensions.fileproviders.abstractions\8.0.0\lib\net8.0\Microsoft.Extensions.FileProviders.Abstractions.dll
C:\Users\danii\.nuget\packages\microsoft.extensions.fileproviders.physical\8.0.0\lib\net8.0\Microsoft.Extensions.FileProviders.Physical.dll
C:\Users\danii\.nuget\packages\microsoft.extensions.filesystemglobbing\8.0.0\lib\net8.0\Microsoft.Extensions.FileSystemGlobbing.dll
C:\Users\danii\.nuget\packages\microsoft.extensions.hosting.abstractions\8.0.0\lib\net8.0\Microsoft.Extensions.Hosting.Abstractions.dll
C:\Users\danii\.nuget\packages\microsoft.extensions.hosting\8.0.0\lib\net8.0\Microsoft.Extensions.Hosting.dll
C:\Users\danii\.nuget\packages\microsoft.extensions.logging.abstractions\8.0.2\lib\net8.0\Microsoft.Extensions.Logging.Abstractions.dll
C:\Users\danii\.nuget\packages\microsoft.extensions.logging.configuration\8.0.0\lib\net8.0\Microsoft.Extensions.Logging.Configuration.dll
C:\Users\danii\.nuget\packages\microsoft.extensions.logging.console\8.0.0\lib\net8.0\Microsoft.Extensions.Logging.Console.dll
C:\Users\danii\.nuget\packages\microsoft.extensions.logging.debug\8.0.0\lib\net8.0\Microsoft.Extensions.Logging.Debug.dll
C:\Users\danii\.nuget\packages\microsoft.extensions.logging\8.0.0\lib\net8.0\Microsoft.Extensions.Logging.dll
C:\Users\danii\.nuget\packages\microsoft.extensions.logging.eventlog\8.0.0\lib\net8.0\Microsoft.Extensions.Logging.EventLog.dll
C:\Users\danii\.nuget\packages\microsoft.extensions.logging.eventsource\8.0.0\lib\net8.0\Microsoft.Extensions.Logging.EventSource.dll
C:\Users\danii\.nuget\packages\microsoft.extensions.options.configurationextensions\8.0.0\lib\net8.0\Microsoft.Extensions.Options.ConfigurationExtensions.dll
C:\Users\danii\.nuget\packages\microsoft.extensions.options\8.0.2\lib\net8.0\Microsoft.Extensions.Options.dll
C:\Users\danii\.nuget\packages\microsoft.extensions.primitives\8.0.0\lib\net8.0\Microsoft.Extensions.Primitives.dll
C:\Users\danii\.nuget\packages\microsoft.identitymodel.abstractions\8.16.0\lib\net8.0\Microsoft.IdentityModel.Abstractions.dll
C:\Users\danii\.nuget\packages\microsoft.identitymodel.jsonwebtokens\8.16.0\lib\net8.0\Microsoft.IdentityModel.JsonWebTokens.dll
C:\Users\danii\.nuget\packages\microsoft.identitymodel.logging\8.16.0\lib\net8.0\Microsoft.IdentityModel.Logging.dll
C:\Users\danii\.nuget\packages\microsoft.identitymodel.protocols\8.16.0\lib\net8.0\Microsoft.IdentityModel.Protocols.dll
C:\Users\danii\.nuget\packages\microsoft.identitymodel.protocols.openidconnect\8.16.0\lib\net8.0\Microsoft.IdentityModel.Protocols.OpenIdConnect.dll
C:\Users\danii\.nuget\packages\microsoft.identitymodel.tokens\8.16.0\lib\net8.0\Microsoft.IdentityModel.Tokens.dll
C:\Users\danii\.nuget\packages\microsoft.sqlserver.server\1.0.0\lib\netstandard2.0\Microsoft.SqlServer.Server.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\Microsoft.VisualBasic.Core.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\Microsoft.VisualBasic.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\Microsoft.Win32.Primitives.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\Microsoft.Win32.Registry.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\mscorlib.dll
C:\Users\danii\.nuget\packages\mysqlconnector\2.5.0\lib\net8.0\MySqlConnector.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\netstandard.dll
C:\Users\danii\.nuget\packages\skiasharp\2.88.9\lib\net6.0\SkiaSharp.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.AppContext.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Buffers.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Collections.Concurrent.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Collections.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Collections.Immutable.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Collections.NonGeneric.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Collections.Specialized.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.ComponentModel.Annotations.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.ComponentModel.DataAnnotations.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.ComponentModel.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.ComponentModel.EventBasedAsync.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.ComponentModel.Primitives.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.ComponentModel.TypeConverter.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Configuration.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Console.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Core.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Data.Common.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Data.DataSetExtensions.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Data.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Diagnostics.Contracts.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Diagnostics.Debug.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Diagnostics.DiagnosticSource.dll
C:\Users\danii\.nuget\packages\system.diagnostics.eventlog\8.0.1\lib\net8.0\System.Diagnostics.EventLog.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Diagnostics.FileVersionInfo.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Diagnostics.Process.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Diagnostics.StackTrace.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Diagnostics.TextWriterTraceListener.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Diagnostics.Tools.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Diagnostics.TraceSource.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Diagnostics.Tracing.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Drawing.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Drawing.Primitives.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Dynamic.Runtime.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Formats.Asn1.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Formats.Tar.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Globalization.Calendars.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Globalization.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Globalization.Extensions.dll
C:\Users\danii\.nuget\packages\system.identitymodel.tokens.jwt\8.16.0\lib\net8.0\System.IdentityModel.Tokens.Jwt.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.IO.Compression.Brotli.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.IO.Compression.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.IO.Compression.FileSystem.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.IO.Compression.ZipFile.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.IO.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.IO.FileSystem.AccessControl.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.IO.FileSystem.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.IO.FileSystem.DriveInfo.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.IO.FileSystem.Primitives.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.IO.FileSystem.Watcher.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.IO.IsolatedStorage.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.IO.MemoryMappedFiles.dll
C:\Users\danii\.nuget\packages\system.io.pipelines\8.0.0\lib\net8.0\System.IO.Pipelines.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.IO.Pipes.AccessControl.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.IO.Pipes.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.IO.UnmanagedMemoryStream.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Linq.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Linq.Expressions.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Linq.Parallel.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Linq.Queryable.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Memory.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Net.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Net.Http.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Net.Http.Json.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Net.HttpListener.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Net.Mail.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Net.NameResolution.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Net.NetworkInformation.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Net.Ping.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Net.Primitives.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Net.Quic.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Net.Requests.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Net.Security.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Net.ServicePoint.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Net.Sockets.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Net.WebClient.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Net.WebHeaderCollection.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Net.WebProxy.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Net.WebSockets.Client.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Net.WebSockets.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Numerics.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Numerics.Vectors.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.ObjectModel.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Reflection.DispatchProxy.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Reflection.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Reflection.Emit.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Reflection.Emit.ILGeneration.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Reflection.Emit.Lightweight.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Reflection.Extensions.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Reflection.Metadata.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Reflection.Primitives.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Reflection.TypeExtensions.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Resources.Reader.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Resources.ResourceManager.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Resources.Writer.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Runtime.CompilerServices.Unsafe.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Runtime.CompilerServices.VisualC.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Runtime.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Runtime.Extensions.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Runtime.Handles.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Runtime.InteropServices.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Runtime.InteropServices.JavaScript.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Runtime.InteropServices.RuntimeInformation.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Runtime.Intrinsics.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Runtime.Loader.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Runtime.Numerics.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Runtime.Serialization.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Runtime.Serialization.Formatters.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Runtime.Serialization.Json.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Runtime.Serialization.Primitives.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Runtime.Serialization.Xml.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Security.AccessControl.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Security.Claims.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Security.Cryptography.Algorithms.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Security.Cryptography.Cng.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Security.Cryptography.Csp.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Security.Cryptography.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Security.Cryptography.Encoding.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Security.Cryptography.OpenSsl.dll
C:\Users\danii\.nuget\packages\system.security.cryptography.pkcs\8.0.1\lib\net8.0\System.Security.Cryptography.Pkcs.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Security.Cryptography.Primitives.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Security.Cryptography.X509Certificates.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Security.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Security.Principal.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Security.Principal.Windows.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Security.SecureString.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.ServiceModel.Web.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.ServiceProcess.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Text.Encoding.CodePages.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Text.Encoding.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Text.Encoding.Extensions.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Text.Encodings.Web.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Text.Json.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Text.RegularExpressions.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Threading.Channels.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Threading.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Threading.Overlapped.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Threading.Tasks.Dataflow.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Threading.Tasks.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Threading.Tasks.Extensions.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Threading.Tasks.Parallel.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Threading.Thread.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Threading.ThreadPool.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Threading.Timer.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Transactions.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Transactions.Local.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.ValueTuple.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Web.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Web.HttpUtility.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Windows.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Xml.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Xml.Linq.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Xml.ReaderWriter.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Xml.Serialization.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Xml.XDocument.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Xml.XmlDocument.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Xml.XmlSerializer.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Xml.XPath.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Xml.XPath.XDocument.dll
C:\Users\danii\.nuget\packages\tmds.dbus.protocol\0.21.2\lib\net8.0\Tmds.DBus.Protocol.dll
C:\Users\danii\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\WindowsBase.dll
C:\Users\student\.nuget\packages\avalonia\11.3.4\ref\net8.0\Avalonia.Base.dll
C:\Users\student\.nuget\packages\avalonia.controls.colorpicker\11.3.4\lib\net8.0\Avalonia.Controls.ColorPicker.dll
C:\Users\student\.nuget\packages\avalonia.controls.datagrid\11.3.4\lib\net8.0\Avalonia.Controls.DataGrid.dll
C:\Users\student\.nuget\packages\avalonia\11.3.4\ref\net8.0\Avalonia.Controls.dll
C:\Users\student\.nuget\packages\avalonia\11.3.4\ref\net8.0\Avalonia.DesignerSupport.dll
C:\Users\student\.nuget\packages\avalonia.desktop\11.3.4\lib\net8.0\Avalonia.Desktop.dll
C:\Users\student\.nuget\packages\avalonia.diagnostics\11.3.4\lib\net8.0\Avalonia.Diagnostics.dll
C:\Users\student\.nuget\packages\avalonia\11.3.4\ref\net8.0\Avalonia.Dialogs.dll
C:\Users\student\.nuget\packages\avalonia\11.3.4\ref\net8.0\Avalonia.dll
C:\Users\student\.nuget\packages\avalonia.fonts.inter\11.3.4\lib\net8.0\Avalonia.Fonts.Inter.dll
C:\Users\student\.nuget\packages\avalonia.freedesktop\11.3.4\lib\net8.0\Avalonia.FreeDesktop.dll
C:\Users\student\.nuget\packages\avalonia\11.3.4\ref\net8.0\Avalonia.Markup.dll
C:\Users\student\.nuget\packages\avalonia\11.3.4\ref\net8.0\Avalonia.Markup.Xaml.dll
C:\Users\student\.nuget\packages\avalonia\11.3.4\ref\net8.0\Avalonia.Metal.dll
C:\Users\student\.nuget\packages\avalonia\11.3.4\ref\net8.0\Avalonia.MicroCom.dll
C:\Users\student\.nuget\packages\avalonia.native\11.3.4\lib\net8.0\Avalonia.Native.dll
C:\Users\student\.nuget\packages\avalonia\11.3.4\ref\net8.0\Avalonia.OpenGL.dll
C:\Users\student\.nuget\packages\avalonia.remote.protocol\11.3.4\lib\net8.0\Avalonia.Remote.Protocol.dll
C:\Users\student\.nuget\packages\avalonia.skia\11.3.4\lib\net8.0\Avalonia.Skia.dll
C:\Users\student\.nuget\packages\avalonia.themes.fluent\11.3.4\lib\net8.0\Avalonia.Themes.Fluent.dll
C:\Users\student\.nuget\packages\avalonia.themes.simple\11.3.4\lib\net8.0\Avalonia.Themes.Simple.dll
C:\Users\student\.nuget\packages\avalonia\11.3.4\ref\net8.0\Avalonia.Vulkan.dll
C:\Users\student\.nuget\packages\avalonia.win32\11.3.4\lib\net8.0\Avalonia.Win32.Automation.dll
C:\Users\student\.nuget\packages\avalonia.win32\11.3.4\lib\net8.0\Avalonia.Win32.dll
C:\Users\student\.nuget\packages\avalonia.x11\11.3.4\lib\net8.0\Avalonia.X11.dll
C:\Users\student\.nuget\packages\communitytoolkit.mvvm\8.2.1\lib\net6.0\CommunityToolkit.Mvvm.dll
C:\Users\student\.nuget\packages\harfbuzzsharp\8.3.1.1\lib\net8.0\HarfBuzzSharp.dll
C:\Users\student\.nuget\packages\microcom.runtime\0.11.0\lib\net5.0\MicroCom.Runtime.dll
C:\Users\student\.nuget\packages\microsoft.bcl.cryptography\8.0.0\lib\net8.0\Microsoft.Bcl.Cryptography.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\Microsoft.CSharp.dll
C:\Users\student\.nuget\packages\microsoft.data.sqlclient\7.0.1\ref\net8.0\Microsoft.Data.SqlClient.dll
C:\Users\student\.nuget\packages\microsoft.data.sqlclient.extensions.abstractions\1.0.0\lib\netstandard2.0\Microsoft.Data.SqlClient.Extensions.Abstractions.dll
C:\Users\student\.nuget\packages\microsoft.data.sqlclient.internal.logging\1.0.0\lib\netstandard2.0\Microsoft.Data.SqlClient.Internal.Logging.dll
C:\Users\student\.nuget\packages\microsoft.extensions.configuration.abstractions\8.0.0\lib\net8.0\Microsoft.Extensions.Configuration.Abstractions.dll
C:\Users\student\.nuget\packages\microsoft.extensions.configuration.binder\8.0.0\lib\net8.0\Microsoft.Extensions.Configuration.Binder.dll
C:\Users\student\.nuget\packages\microsoft.extensions.configuration.commandline\8.0.0\lib\net8.0\Microsoft.Extensions.Configuration.CommandLine.dll
C:\Users\student\.nuget\packages\microsoft.extensions.configuration\8.0.0\lib\net8.0\Microsoft.Extensions.Configuration.dll
C:\Users\student\.nuget\packages\microsoft.extensions.configuration.environmentvariables\8.0.0\lib\net8.0\Microsoft.Extensions.Configuration.EnvironmentVariables.dll
C:\Users\student\.nuget\packages\microsoft.extensions.configuration.fileextensions\8.0.0\lib\net8.0\Microsoft.Extensions.Configuration.FileExtensions.dll
C:\Users\student\.nuget\packages\microsoft.extensions.configuration.json\8.0.0\lib\net8.0\Microsoft.Extensions.Configuration.Json.dll
C:\Users\student\.nuget\packages\microsoft.extensions.configuration.usersecrets\8.0.0\lib\net8.0\Microsoft.Extensions.Configuration.UserSecrets.dll
C:\Users\student\.nuget\packages\microsoft.extensions.dependencyinjection.abstractions\8.0.2\lib\net8.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll
C:\Users\student\.nuget\packages\microsoft.extensions.dependencyinjection\8.0.0\lib\net8.0\Microsoft.Extensions.DependencyInjection.dll
C:\Users\student\.nuget\packages\microsoft.extensions.diagnostics.abstractions\8.0.0\lib\net8.0\Microsoft.Extensions.Diagnostics.Abstractions.dll
C:\Users\student\.nuget\packages\microsoft.extensions.diagnostics\8.0.0\lib\net8.0\Microsoft.Extensions.Diagnostics.dll
C:\Users\student\.nuget\packages\microsoft.extensions.fileproviders.abstractions\8.0.0\lib\net8.0\Microsoft.Extensions.FileProviders.Abstractions.dll
C:\Users\student\.nuget\packages\microsoft.extensions.fileproviders.physical\8.0.0\lib\net8.0\Microsoft.Extensions.FileProviders.Physical.dll
C:\Users\student\.nuget\packages\microsoft.extensions.filesystemglobbing\8.0.0\lib\net8.0\Microsoft.Extensions.FileSystemGlobbing.dll
C:\Users\student\.nuget\packages\microsoft.extensions.hosting.abstractions\8.0.0\lib\net8.0\Microsoft.Extensions.Hosting.Abstractions.dll
C:\Users\student\.nuget\packages\microsoft.extensions.hosting\8.0.0\lib\net8.0\Microsoft.Extensions.Hosting.dll
C:\Users\student\.nuget\packages\microsoft.extensions.logging.abstractions\8.0.2\lib\net8.0\Microsoft.Extensions.Logging.Abstractions.dll
C:\Users\student\.nuget\packages\microsoft.extensions.logging.configuration\8.0.0\lib\net8.0\Microsoft.Extensions.Logging.Configuration.dll
C:\Users\student\.nuget\packages\microsoft.extensions.logging.console\8.0.0\lib\net8.0\Microsoft.Extensions.Logging.Console.dll
C:\Users\student\.nuget\packages\microsoft.extensions.logging.debug\8.0.0\lib\net8.0\Microsoft.Extensions.Logging.Debug.dll
C:\Users\student\.nuget\packages\microsoft.extensions.logging\8.0.0\lib\net8.0\Microsoft.Extensions.Logging.dll
C:\Users\student\.nuget\packages\microsoft.extensions.logging.eventlog\8.0.0\lib\net8.0\Microsoft.Extensions.Logging.EventLog.dll
C:\Users\student\.nuget\packages\microsoft.extensions.logging.eventsource\8.0.0\lib\net8.0\Microsoft.Extensions.Logging.EventSource.dll
C:\Users\student\.nuget\packages\microsoft.extensions.options.configurationextensions\8.0.0\lib\net8.0\Microsoft.Extensions.Options.ConfigurationExtensions.dll
C:\Users\student\.nuget\packages\microsoft.extensions.options\8.0.2\lib\net8.0\Microsoft.Extensions.Options.dll
C:\Users\student\.nuget\packages\microsoft.extensions.primitives\8.0.0\lib\net8.0\Microsoft.Extensions.Primitives.dll
C:\Users\student\.nuget\packages\microsoft.identitymodel.abstractions\8.16.0\lib\net8.0\Microsoft.IdentityModel.Abstractions.dll
C:\Users\student\.nuget\packages\microsoft.identitymodel.jsonwebtokens\8.16.0\lib\net8.0\Microsoft.IdentityModel.JsonWebTokens.dll
C:\Users\student\.nuget\packages\microsoft.identitymodel.logging\8.16.0\lib\net8.0\Microsoft.IdentityModel.Logging.dll
C:\Users\student\.nuget\packages\microsoft.identitymodel.protocols\8.16.0\lib\net8.0\Microsoft.IdentityModel.Protocols.dll
C:\Users\student\.nuget\packages\microsoft.identitymodel.protocols.openidconnect\8.16.0\lib\net8.0\Microsoft.IdentityModel.Protocols.OpenIdConnect.dll
C:\Users\student\.nuget\packages\microsoft.identitymodel.tokens\8.16.0\lib\net8.0\Microsoft.IdentityModel.Tokens.dll
C:\Users\student\.nuget\packages\microsoft.sqlserver.server\1.0.0\lib\netstandard2.0\Microsoft.SqlServer.Server.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\Microsoft.VisualBasic.Core.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\Microsoft.VisualBasic.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\Microsoft.Win32.Primitives.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\Microsoft.Win32.Registry.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\mscorlib.dll
C:\Users\student\.nuget\packages\mysqlconnector\2.5.0\lib\net8.0\MySqlConnector.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\netstandard.dll
C:\Users\student\.nuget\packages\skiasharp\2.88.9\lib\net6.0\SkiaSharp.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.AppContext.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Buffers.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Collections.Concurrent.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Collections.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Collections.Immutable.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Collections.NonGeneric.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Collections.Specialized.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.ComponentModel.Annotations.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.ComponentModel.DataAnnotations.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.ComponentModel.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.ComponentModel.EventBasedAsync.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.ComponentModel.Primitives.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.ComponentModel.TypeConverter.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Configuration.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Console.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Core.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Data.Common.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Data.DataSetExtensions.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Data.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Diagnostics.Contracts.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Diagnostics.Debug.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Diagnostics.DiagnosticSource.dll
C:\Users\student\.nuget\packages\system.diagnostics.eventlog\8.0.1\lib\net8.0\System.Diagnostics.EventLog.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Diagnostics.FileVersionInfo.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Diagnostics.Process.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Diagnostics.StackTrace.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Diagnostics.TextWriterTraceListener.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Diagnostics.Tools.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Diagnostics.TraceSource.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Diagnostics.Tracing.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Drawing.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Drawing.Primitives.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Dynamic.Runtime.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Formats.Asn1.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Formats.Tar.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Globalization.Calendars.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Globalization.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Globalization.Extensions.dll
C:\Users\student\.nuget\packages\system.identitymodel.tokens.jwt\8.16.0\lib\net8.0\System.IdentityModel.Tokens.Jwt.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.IO.Compression.Brotli.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.IO.Compression.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.IO.Compression.FileSystem.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.IO.Compression.ZipFile.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.IO.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.IO.FileSystem.AccessControl.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.IO.FileSystem.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.IO.FileSystem.DriveInfo.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.IO.FileSystem.Primitives.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.IO.FileSystem.Watcher.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.IO.IsolatedStorage.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.IO.MemoryMappedFiles.dll
C:\Users\student\.nuget\packages\system.io.pipelines\8.0.0\lib\net8.0\System.IO.Pipelines.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.IO.Pipes.AccessControl.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.IO.Pipes.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.IO.UnmanagedMemoryStream.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Linq.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Linq.Expressions.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Linq.Parallel.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Linq.Queryable.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Memory.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Net.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Net.Http.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Net.Http.Json.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Net.HttpListener.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Net.Mail.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Net.NameResolution.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Net.NetworkInformation.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Net.Ping.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Net.Primitives.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Net.Quic.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Net.Requests.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Net.Security.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Net.ServicePoint.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Net.Sockets.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Net.WebClient.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Net.WebHeaderCollection.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Net.WebProxy.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Net.WebSockets.Client.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Net.WebSockets.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Numerics.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Numerics.Vectors.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.ObjectModel.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Reflection.DispatchProxy.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Reflection.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Reflection.Emit.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Reflection.Emit.ILGeneration.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Reflection.Emit.Lightweight.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Reflection.Extensions.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Reflection.Metadata.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Reflection.Primitives.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Reflection.TypeExtensions.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Resources.Reader.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Resources.ResourceManager.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Resources.Writer.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Runtime.CompilerServices.Unsafe.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Runtime.CompilerServices.VisualC.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Runtime.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Runtime.Extensions.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Runtime.Handles.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Runtime.InteropServices.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Runtime.InteropServices.JavaScript.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Runtime.InteropServices.RuntimeInformation.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Runtime.Intrinsics.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Runtime.Loader.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Runtime.Numerics.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Runtime.Serialization.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Runtime.Serialization.Formatters.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Runtime.Serialization.Json.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Runtime.Serialization.Primitives.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Runtime.Serialization.Xml.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Security.AccessControl.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Security.Claims.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Security.Cryptography.Algorithms.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Security.Cryptography.Cng.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Security.Cryptography.Csp.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Security.Cryptography.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Security.Cryptography.Encoding.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Security.Cryptography.OpenSsl.dll
C:\Users\student\.nuget\packages\system.security.cryptography.pkcs\8.0.1\lib\net8.0\System.Security.Cryptography.Pkcs.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Security.Cryptography.Primitives.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Security.Cryptography.X509Certificates.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Security.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Security.Principal.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Security.Principal.Windows.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Security.SecureString.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.ServiceModel.Web.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.ServiceProcess.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Text.Encoding.CodePages.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Text.Encoding.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Text.Encoding.Extensions.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Text.Encodings.Web.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Text.Json.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Text.RegularExpressions.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Threading.Channels.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Threading.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Threading.Overlapped.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Threading.Tasks.Dataflow.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Threading.Tasks.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Threading.Tasks.Extensions.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Threading.Tasks.Parallel.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Threading.Thread.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Threading.ThreadPool.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Threading.Timer.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Transactions.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Transactions.Local.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.ValueTuple.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Web.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Web.HttpUtility.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Windows.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Xml.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Xml.Linq.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Xml.ReaderWriter.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Xml.Serialization.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Xml.XDocument.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Xml.XmlDocument.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Xml.XmlSerializer.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Xml.XPath.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\System.Xml.XPath.XDocument.dll
C:\Users\student\.nuget\packages\tmds.dbus.protocol\0.21.2\lib\net8.0\Tmds.DBus.Protocol.dll
C:\Users\student\.nuget\packages\microsoft.netcore.app.ref\8.0.27\ref\net8.0\WindowsBase.dll

View File

@ -13,10 +13,10 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("CourseProject1125")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+8a542dab9a38ef76bd9f1d3f21c3efa28fec406b")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+8feb1afc41ab0268c0655bdf1f0c0c50fe4e0e27")]
[assembly: System.Reflection.AssemblyProductAttribute("CourseProject1125")]
[assembly: System.Reflection.AssemblyTitleAttribute("CourseProject1125")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
// Создано классом WriteCodeFragment MSBuild.
// Generated by the MSBuild WriteCodeFragment class.

View File

@ -1 +1 @@
9a4025adff3d649d85b89675111898ab0bc2a30a8f4af1b135b7e618fe0229bf
ee16a13c8d80696a1409757858a26b0cc6ab98af091aafd19fd898a3fe69a60c

View File

@ -7,31 +7,34 @@ build_property.AvaloniaNameGeneratorFilterByNamespace = *
build_property.AvaloniaNameGeneratorViewFileNamingStrategy = NamespaceAndClassName
build_property.AvaloniaNameGeneratorAttachDevTools = true
build_property.TargetFramework = net8.0
build_property.TargetFrameworkIdentifier = .NETCoreApp
build_property.TargetFrameworkVersion = v8.0
build_property.TargetPlatformMinVersion =
build_property.UsingMicrosoftNETSdkWeb =
build_property.ProjectTypeGuids =
build_property.InvariantGlobalization =
build_property.PlatformNeutralAssembly =
build_property.EnforceExtendedAnalyzerRules =
build_property.EntryPointFilePath =
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = CourseProject1125
build_property.ProjectDir = C:\Users\danii\OneDrive\Desktop\Project\CourseProject1125\
build_property.ProjectDir = C:\Users\student\Desktop\Project\CourseProject1125\
build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop =
build_property.EffectiveAnalysisLevelStyle = 8.0
build_property.EnableCodeStyleSeverity =
[C:/Users/danii/OneDrive/Desktop/Project/CourseProject1125/App.axaml]
[C:/Users/student/Desktop/Project/CourseProject1125/App.axaml]
build_metadata.AdditionalFiles.SourceItemGroup = AvaloniaXaml
[C:/Users/danii/OneDrive/Desktop/Project/CourseProject1125/Views/AdminWindow.axaml]
[C:/Users/student/Desktop/Project/CourseProject1125/Views/AdminWindow.axaml]
build_metadata.AdditionalFiles.SourceItemGroup = AvaloniaXaml
[C:/Users/danii/OneDrive/Desktop/Project/CourseProject1125/Views/LibrarianWindow.axaml]
[C:/Users/student/Desktop/Project/CourseProject1125/Views/LibrarianWindow.axaml]
build_metadata.AdditionalFiles.SourceItemGroup = AvaloniaXaml
[C:/Users/danii/OneDrive/Desktop/Project/CourseProject1125/Views/MainWindow.axaml]
[C:/Users/student/Desktop/Project/CourseProject1125/Views/MainWindow.axaml]
build_metadata.AdditionalFiles.SourceItemGroup = AvaloniaXaml
[C:/Users/danii/OneDrive/Desktop/Project/CourseProject1125/Views/ReaderWindow.axaml]
[C:/Users/student/Desktop/Project/CourseProject1125/Views/ReaderWindow.axaml]
build_metadata.AdditionalFiles.SourceItemGroup = AvaloniaXaml

View File

@ -1 +1 @@
934eb599446bfddb12088eff59fa7ca51412e2c09fb67767b78244ebb5fc3969
7ddebecfdef30b1b546334067783a94e59af5883a01072dee889cf21917cd434

View File

@ -143,3 +143,148 @@ C:\Users\danii\OneDrive\Desktop\Project\CourseProject1125\obj\Debug\net8.0\Cours
C:\Users\danii\OneDrive\Desktop\Project\CourseProject1125\obj\Debug\net8.0\CourseProject1125.genruntimeconfig.cache
C:\Users\danii\OneDrive\Desktop\Project\CourseProject1125\obj\Debug\net8.0\ref\CourseProject1125.dll
C:\Users\danii\OneDrive\Desktop\Project\CourseProject1125\obj\Debug\net8.0\CourseProject1125.sourcelink.json
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\appsettings.json
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\CourseProject1125.exe
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\CourseProject1125.deps.json
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\CourseProject1125.runtimeconfig.json
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\CourseProject1125.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\CourseProject1125.pdb
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Avalonia.Base.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Avalonia.Controls.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Avalonia.DesignerSupport.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Avalonia.Dialogs.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Avalonia.Markup.Xaml.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Avalonia.Markup.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Avalonia.Metal.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Avalonia.MicroCom.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Avalonia.OpenGL.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Avalonia.Vulkan.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Avalonia.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Avalonia.Controls.ColorPicker.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Avalonia.Controls.DataGrid.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Avalonia.Desktop.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Avalonia.Diagnostics.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Avalonia.Fonts.Inter.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Avalonia.FreeDesktop.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Avalonia.Native.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Avalonia.Remote.Protocol.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Avalonia.Skia.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Avalonia.Themes.Fluent.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Avalonia.Themes.Simple.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Avalonia.Win32.Automation.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Avalonia.Win32.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Avalonia.X11.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\CommunityToolkit.Mvvm.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\HarfBuzzSharp.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\MicroCom.Runtime.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Microsoft.Bcl.Cryptography.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Microsoft.Data.SqlClient.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Microsoft.Data.SqlClient.Extensions.Abstractions.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Microsoft.Data.SqlClient.Internal.Logging.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Microsoft.Extensions.Caching.Abstractions.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Microsoft.Extensions.Caching.Memory.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Microsoft.Extensions.Configuration.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Microsoft.Extensions.Configuration.Abstractions.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Microsoft.Extensions.Configuration.Binder.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Microsoft.Extensions.Configuration.CommandLine.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Microsoft.Extensions.Configuration.EnvironmentVariables.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Microsoft.Extensions.Configuration.FileExtensions.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Microsoft.Extensions.Configuration.Json.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Microsoft.Extensions.Configuration.UserSecrets.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Microsoft.Extensions.DependencyInjection.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Microsoft.Extensions.Diagnostics.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Microsoft.Extensions.Diagnostics.Abstractions.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Microsoft.Extensions.FileProviders.Abstractions.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Microsoft.Extensions.FileProviders.Physical.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Microsoft.Extensions.FileSystemGlobbing.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Microsoft.Extensions.Hosting.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Microsoft.Extensions.Hosting.Abstractions.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Microsoft.Extensions.Logging.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Microsoft.Extensions.Logging.Abstractions.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Microsoft.Extensions.Logging.Configuration.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Microsoft.Extensions.Logging.Console.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Microsoft.Extensions.Logging.Debug.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Microsoft.Extensions.Logging.EventLog.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Microsoft.Extensions.Logging.EventSource.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Microsoft.Extensions.Options.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Microsoft.Extensions.Options.ConfigurationExtensions.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Microsoft.Extensions.Primitives.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Microsoft.IdentityModel.Abstractions.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Microsoft.IdentityModel.JsonWebTokens.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Microsoft.IdentityModel.Logging.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Microsoft.IdentityModel.Protocols.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Microsoft.IdentityModel.Protocols.OpenIdConnect.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Microsoft.IdentityModel.Tokens.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Microsoft.SqlServer.Server.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\MySqlConnector.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\SkiaSharp.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\System.Configuration.ConfigurationManager.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\System.Diagnostics.EventLog.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\System.IdentityModel.Tokens.Jwt.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\System.IO.Pipelines.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\System.Security.Cryptography.Pkcs.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\System.Security.Cryptography.ProtectedData.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\Tmds.DBus.Protocol.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\cs\Microsoft.Data.SqlClient.resources.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\de\Microsoft.Data.SqlClient.resources.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\es\Microsoft.Data.SqlClient.resources.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\fr\Microsoft.Data.SqlClient.resources.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\it\Microsoft.Data.SqlClient.resources.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\ja\Microsoft.Data.SqlClient.resources.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\ko\Microsoft.Data.SqlClient.resources.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\pl\Microsoft.Data.SqlClient.resources.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\pt-BR\Microsoft.Data.SqlClient.resources.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\ru\Microsoft.Data.SqlClient.resources.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\tr\Microsoft.Data.SqlClient.resources.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\zh-Hans\Microsoft.Data.SqlClient.resources.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\zh-Hant\Microsoft.Data.SqlClient.resources.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\runtimes\win-arm64\native\av_libglesv2.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\runtimes\win-x64\native\av_libglesv2.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\runtimes\win-x86\native\av_libglesv2.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\runtimes\osx\native\libAvaloniaNative.dylib
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\runtimes\linux-arm\native\libHarfBuzzSharp.so
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\runtimes\linux-arm64\native\libHarfBuzzSharp.so
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\runtimes\linux-loongarch64\native\libHarfBuzzSharp.so
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\runtimes\linux-musl-arm\native\libHarfBuzzSharp.so
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\runtimes\linux-musl-arm64\native\libHarfBuzzSharp.so
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\runtimes\linux-musl-loongarch64\native\libHarfBuzzSharp.so
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\runtimes\linux-musl-riscv64\native\libHarfBuzzSharp.so
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\runtimes\linux-musl-x64\native\libHarfBuzzSharp.so
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\runtimes\linux-riscv64\native\libHarfBuzzSharp.so
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\runtimes\linux-x64\native\libHarfBuzzSharp.so
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\runtimes\linux-x86\native\libHarfBuzzSharp.so
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\runtimes\osx\native\libHarfBuzzSharp.dylib
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\runtimes\win-arm64\native\libHarfBuzzSharp.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\runtimes\win-x64\native\libHarfBuzzSharp.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\runtimes\win-x86\native\libHarfBuzzSharp.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\runtimes\unix\lib\net8.0\Microsoft.Data.SqlClient.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\runtimes\win\lib\net8.0\Microsoft.Data.SqlClient.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\runtimes\win-arm64\native\Microsoft.Data.SqlClient.SNI.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\runtimes\win-x64\native\Microsoft.Data.SqlClient.SNI.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\runtimes\win-x86\native\Microsoft.Data.SqlClient.SNI.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\runtimes\linux-arm\native\libSkiaSharp.so
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\runtimes\linux-arm64\native\libSkiaSharp.so
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\runtimes\linux-musl-x64\native\libSkiaSharp.so
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\runtimes\linux-x64\native\libSkiaSharp.so
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\runtimes\osx\native\libSkiaSharp.dylib
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\runtimes\win-arm64\native\libSkiaSharp.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\runtimes\win-x64\native\libSkiaSharp.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\runtimes\win-x86\native\libSkiaSharp.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\runtimes\win\lib\net8.0\System.Diagnostics.EventLog.Messages.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\runtimes\win\lib\net8.0\System.Diagnostics.EventLog.dll
C:\Users\student\Desktop\Project\CourseProject1125\bin\Debug\net8.0\runtimes\win\lib\net8.0\System.Security.Cryptography.Pkcs.dll
C:\Users\student\Desktop\Project\CourseProject1125\obj\Debug\net8.0\CourseProject1125.csproj.AssemblyReference.cache
C:\Users\student\Desktop\Project\CourseProject1125\obj\Debug\net8.0\Avalonia\Resources.Inputs.cache
C:\Users\student\Desktop\Project\CourseProject1125\obj\Debug\net8.0\Avalonia\resources
C:\Users\student\Desktop\Project\CourseProject1125\obj\Debug\net8.0\CourseProject1125.GeneratedMSBuildEditorConfig.editorconfig
C:\Users\student\Desktop\Project\CourseProject1125\obj\Debug\net8.0\CourseProject1125.AssemblyInfoInputs.cache
C:\Users\student\Desktop\Project\CourseProject1125\obj\Debug\net8.0\CourseProject1125.AssemblyInfo.cs
C:\Users\student\Desktop\Project\CourseProject1125\obj\Debug\net8.0\CourseProject1125.csproj.CoreCompileInputs.cache
C:\Users\student\Desktop\Project\CourseProject1125\obj\Debug\net8.0\CourseProject1125.sourcelink.json
C:\Users\student\Desktop\Project\CourseProject1125\obj\Debug\net8.0\CoursePr.26FDDDF7.Up2Date
C:\Users\student\Desktop\Project\CourseProject1125\obj\Debug\net8.0\CourseProject1125.dll
C:\Users\student\Desktop\Project\CourseProject1125\obj\Debug\net8.0\refint\CourseProject1125.dll
C:\Users\student\Desktop\Project\CourseProject1125\obj\Debug\net8.0\CourseProject1125.pdb
C:\Users\student\Desktop\Project\CourseProject1125\obj\Debug\net8.0\CourseProject1125.genruntimeconfig.cache
C:\Users\student\Desktop\Project\CourseProject1125\obj\Debug\net8.0\ref\CourseProject1125.dll

View File

@ -1 +1 @@
9896a188e684aeedb31b7a8f88f8521d94f6bf7b1d5e61f1f45d20d690580446
a1309d5791342db5a8674cc0944d7ad17782fe7bb707d27e32a6fb3f870507ef

View File

@ -13,7 +13,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("CourseProject1125")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+8feb1afc41ab0268c0655bdf1f0c0c50fe4e0e27")]
[assembly: System.Reflection.AssemblyProductAttribute("CourseProject1125")]
[assembly: System.Reflection.AssemblyTitleAttribute("CourseProject1125")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]

View File

@ -1 +1 @@
3143da7a9898d8f7eb03faab55b0f25d554966f0b3b51c2a3275e4d0d9dd1331
cd3b7678dcf92e2e829678347e602af12da8fd45bdeea413aa2fea91825f9b80

View File

@ -291,3 +291,4 @@ C:\Users\danii\OneDrive\Desktop\Project\CourseProject1125\obj\Release\net8.0\win
C:\Users\danii\OneDrive\Desktop\Project\CourseProject1125\obj\Release\net8.0\win-x64\CourseProject1125.pdb
C:\Users\danii\OneDrive\Desktop\Project\CourseProject1125\obj\Release\net8.0\win-x64\CourseProject1125.genruntimeconfig.cache
C:\Users\danii\OneDrive\Desktop\Project\CourseProject1125\obj\Release\net8.0\win-x64\ref\CourseProject1125.dll
C:\Users\danii\OneDrive\Desktop\Project\CourseProject1125\obj\Release\net8.0\win-x64\CourseProject1125.sourcelink.json

View File

@ -1 +1 @@
035840ac61047c0edf0defbc8902d40519923fb4851b8f3dc12fb39162d5ec96
23b442f6ac6917d790427dbb563fb0973c7f4dff6143d7949ac361c65054e556

View File

@ -4151,25 +4151,33 @@
]
},
"packageFolders": {
"C:\\Users\\danii\\.nuget\\packages\\": {}
"C:\\Users\\student\\.nuget\\packages\\": {},
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages": {}
},
"project": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "C:\\Users\\danii\\OneDrive\\Desktop\\Project\\CourseProject1125\\CourseProject1125.csproj",
"projectUniqueName": "C:\\Users\\student\\Desktop\\Project\\CourseProject1125\\CourseProject1125.csproj",
"projectName": "CourseProject1125",
"projectPath": "C:\\Users\\danii\\OneDrive\\Desktop\\Project\\CourseProject1125\\CourseProject1125.csproj",
"packagesPath": "C:\\Users\\danii\\.nuget\\packages\\",
"outputPath": "C:\\Users\\danii\\OneDrive\\Desktop\\Project\\CourseProject1125\\obj\\",
"projectPath": "C:\\Users\\student\\Desktop\\Project\\CourseProject1125\\CourseProject1125.csproj",
"packagesPath": "C:\\Users\\student\\.nuget\\packages\\",
"outputPath": "C:\\Users\\student\\Desktop\\Project\\CourseProject1125\\obj\\",
"projectStyle": "PackageReference",
"fallbackFolders": [
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
],
"configFilePaths": [
"C:\\Users\\danii\\AppData\\Roaming\\NuGet\\NuGet.Config"
"C:\\Users\\student\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
"net8.0"
],
"sources": {
"https://api.nuget.org/v3/index.json": {}
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"C:\\Program Files\\dotnet\\library-packs": {},
"http://192.168.200.81:8081/repository/nuget.org-proxy/index.json": {}
},
"frameworks": {
"net8.0": {
@ -4187,7 +4195,7 @@
"auditLevel": "low",
"auditMode": "direct"
},
"SdkAnalysisLevel": "9.0.300"
"SdkAnalysisLevel": "10.0.300"
},
"frameworks": {
"net8.0": {
@ -4268,7 +4276,7 @@
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Users\\danii\\.dotnet\\sdk\\9.0.314/PortableRuntimeIdentifierGraph.json"
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.300/PortableRuntimeIdentifierGraph.json"
}
}
}

View File

@ -1,93 +1,93 @@
{
"version": 2,
"dgSpecHash": "UkVq0d5pW7M=",
"dgSpecHash": "U84BEbBS94Q=",
"success": true,
"projectFilePath": "C:\\Users\\danii\\OneDrive\\Desktop\\Project\\CourseProject1125\\CourseProject1125.csproj",
"projectFilePath": "C:\\Users\\student\\Desktop\\Project\\CourseProject1125\\CourseProject1125.csproj",
"expectedPackageFiles": [
"C:\\Users\\danii\\.nuget\\packages\\avalonia\\11.3.4\\avalonia.11.3.4.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\avalonia.angle.windows.natives\\2.1.25547.20250602\\avalonia.angle.windows.natives.2.1.25547.20250602.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\avalonia.buildservices\\0.0.31\\avalonia.buildservices.0.0.31.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\avalonia.controls.colorpicker\\11.3.4\\avalonia.controls.colorpicker.11.3.4.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\avalonia.controls.datagrid\\11.3.4\\avalonia.controls.datagrid.11.3.4.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\avalonia.desktop\\11.3.4\\avalonia.desktop.11.3.4.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\avalonia.diagnostics\\11.3.4\\avalonia.diagnostics.11.3.4.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\avalonia.fonts.inter\\11.3.4\\avalonia.fonts.inter.11.3.4.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\avalonia.freedesktop\\11.3.4\\avalonia.freedesktop.11.3.4.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\avalonia.native\\11.3.4\\avalonia.native.11.3.4.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\avalonia.remote.protocol\\11.3.4\\avalonia.remote.protocol.11.3.4.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\avalonia.skia\\11.3.4\\avalonia.skia.11.3.4.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\avalonia.themes.fluent\\11.3.4\\avalonia.themes.fluent.11.3.4.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\avalonia.themes.simple\\11.3.4\\avalonia.themes.simple.11.3.4.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\avalonia.win32\\11.3.4\\avalonia.win32.11.3.4.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\avalonia.x11\\11.3.4\\avalonia.x11.11.3.4.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\communitytoolkit.mvvm\\8.2.1\\communitytoolkit.mvvm.8.2.1.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\harfbuzzsharp\\8.3.1.1\\harfbuzzsharp.8.3.1.1.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\harfbuzzsharp.nativeassets.linux\\8.3.1.1\\harfbuzzsharp.nativeassets.linux.8.3.1.1.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\harfbuzzsharp.nativeassets.macos\\8.3.1.1\\harfbuzzsharp.nativeassets.macos.8.3.1.1.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\harfbuzzsharp.nativeassets.webassembly\\8.3.1.1\\harfbuzzsharp.nativeassets.webassembly.8.3.1.1.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\harfbuzzsharp.nativeassets.win32\\8.3.1.1\\harfbuzzsharp.nativeassets.win32.8.3.1.1.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microcom.runtime\\0.11.0\\microcom.runtime.0.11.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.bcl.cryptography\\8.0.0\\microsoft.bcl.cryptography.8.0.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.data.sqlclient\\7.0.1\\microsoft.data.sqlclient.7.0.1.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.data.sqlclient.extensions.abstractions\\1.0.0\\microsoft.data.sqlclient.extensions.abstractions.1.0.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.data.sqlclient.internal.logging\\1.0.0\\microsoft.data.sqlclient.internal.logging.1.0.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.data.sqlclient.sni.runtime\\6.0.2\\microsoft.data.sqlclient.sni.runtime.6.0.2.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.extensions.caching.abstractions\\8.0.0\\microsoft.extensions.caching.abstractions.8.0.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.extensions.caching.memory\\8.0.1\\microsoft.extensions.caching.memory.8.0.1.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.extensions.configuration\\8.0.0\\microsoft.extensions.configuration.8.0.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.extensions.configuration.abstractions\\8.0.0\\microsoft.extensions.configuration.abstractions.8.0.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.extensions.configuration.binder\\8.0.0\\microsoft.extensions.configuration.binder.8.0.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.extensions.configuration.commandline\\8.0.0\\microsoft.extensions.configuration.commandline.8.0.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.extensions.configuration.environmentvariables\\8.0.0\\microsoft.extensions.configuration.environmentvariables.8.0.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.extensions.configuration.fileextensions\\8.0.0\\microsoft.extensions.configuration.fileextensions.8.0.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.extensions.configuration.json\\8.0.0\\microsoft.extensions.configuration.json.8.0.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.extensions.configuration.usersecrets\\8.0.0\\microsoft.extensions.configuration.usersecrets.8.0.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.extensions.dependencyinjection\\8.0.0\\microsoft.extensions.dependencyinjection.8.0.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.extensions.dependencyinjection.abstractions\\8.0.2\\microsoft.extensions.dependencyinjection.abstractions.8.0.2.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.extensions.diagnostics\\8.0.0\\microsoft.extensions.diagnostics.8.0.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.extensions.diagnostics.abstractions\\8.0.0\\microsoft.extensions.diagnostics.abstractions.8.0.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.extensions.fileproviders.abstractions\\8.0.0\\microsoft.extensions.fileproviders.abstractions.8.0.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.extensions.fileproviders.physical\\8.0.0\\microsoft.extensions.fileproviders.physical.8.0.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.extensions.filesystemglobbing\\8.0.0\\microsoft.extensions.filesystemglobbing.8.0.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.extensions.hosting\\8.0.0\\microsoft.extensions.hosting.8.0.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.extensions.hosting.abstractions\\8.0.0\\microsoft.extensions.hosting.abstractions.8.0.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.extensions.logging\\8.0.0\\microsoft.extensions.logging.8.0.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.extensions.logging.abstractions\\8.0.2\\microsoft.extensions.logging.abstractions.8.0.2.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.extensions.logging.configuration\\8.0.0\\microsoft.extensions.logging.configuration.8.0.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.extensions.logging.console\\8.0.0\\microsoft.extensions.logging.console.8.0.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.extensions.logging.debug\\8.0.0\\microsoft.extensions.logging.debug.8.0.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.extensions.logging.eventlog\\8.0.0\\microsoft.extensions.logging.eventlog.8.0.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.extensions.logging.eventsource\\8.0.0\\microsoft.extensions.logging.eventsource.8.0.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.extensions.options\\8.0.2\\microsoft.extensions.options.8.0.2.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.extensions.options.configurationextensions\\8.0.0\\microsoft.extensions.options.configurationextensions.8.0.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.extensions.primitives\\8.0.0\\microsoft.extensions.primitives.8.0.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.identitymodel.abstractions\\8.16.0\\microsoft.identitymodel.abstractions.8.16.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.identitymodel.jsonwebtokens\\8.16.0\\microsoft.identitymodel.jsonwebtokens.8.16.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.identitymodel.logging\\8.16.0\\microsoft.identitymodel.logging.8.16.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.identitymodel.protocols\\8.16.0\\microsoft.identitymodel.protocols.8.16.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.identitymodel.protocols.openidconnect\\8.16.0\\microsoft.identitymodel.protocols.openidconnect.8.16.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.identitymodel.tokens\\8.16.0\\microsoft.identitymodel.tokens.8.16.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.sqlserver.server\\1.0.0\\microsoft.sqlserver.server.1.0.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\mysqlconnector\\2.5.0\\mysqlconnector.2.5.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\skiasharp\\2.88.9\\skiasharp.2.88.9.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\skiasharp.nativeassets.linux\\2.88.9\\skiasharp.nativeassets.linux.2.88.9.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\skiasharp.nativeassets.macos\\2.88.9\\skiasharp.nativeassets.macos.2.88.9.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\skiasharp.nativeassets.webassembly\\2.88.9\\skiasharp.nativeassets.webassembly.2.88.9.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\skiasharp.nativeassets.win32\\2.88.9\\skiasharp.nativeassets.win32.2.88.9.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\system.configuration.configurationmanager\\8.0.1\\system.configuration.configurationmanager.8.0.1.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\system.diagnostics.diagnosticsource\\8.0.0\\system.diagnostics.diagnosticsource.8.0.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\system.diagnostics.eventlog\\8.0.1\\system.diagnostics.eventlog.8.0.1.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\system.identitymodel.tokens.jwt\\8.16.0\\system.identitymodel.tokens.jwt.8.16.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\system.io.pipelines\\8.0.0\\system.io.pipelines.8.0.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\system.security.cryptography.pkcs\\8.0.1\\system.security.cryptography.pkcs.8.0.1.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\system.security.cryptography.protecteddata\\8.0.0\\system.security.cryptography.protecteddata.8.0.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\system.text.encodings.web\\8.0.0\\system.text.encodings.web.8.0.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\system.text.json\\8.0.0\\system.text.json.8.0.0.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\tmds.dbus.protocol\\0.21.2\\tmds.dbus.protocol.0.21.2.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.netcore.app.ref\\8.0.27\\microsoft.netcore.app.ref.8.0.27.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.windowsdesktop.app.ref\\8.0.27\\microsoft.windowsdesktop.app.ref.8.0.27.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.aspnetcore.app.ref\\8.0.27\\microsoft.aspnetcore.app.ref.8.0.27.nupkg.sha512",
"C:\\Users\\danii\\.nuget\\packages\\microsoft.netcore.app.host.win-x64\\8.0.27\\microsoft.netcore.app.host.win-x64.8.0.27.nupkg.sha512"
"C:\\Users\\student\\.nuget\\packages\\avalonia\\11.3.4\\avalonia.11.3.4.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\avalonia.angle.windows.natives\\2.1.25547.20250602\\avalonia.angle.windows.natives.2.1.25547.20250602.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\avalonia.buildservices\\0.0.31\\avalonia.buildservices.0.0.31.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\avalonia.controls.colorpicker\\11.3.4\\avalonia.controls.colorpicker.11.3.4.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\avalonia.controls.datagrid\\11.3.4\\avalonia.controls.datagrid.11.3.4.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\avalonia.desktop\\11.3.4\\avalonia.desktop.11.3.4.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\avalonia.diagnostics\\11.3.4\\avalonia.diagnostics.11.3.4.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\avalonia.fonts.inter\\11.3.4\\avalonia.fonts.inter.11.3.4.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\avalonia.freedesktop\\11.3.4\\avalonia.freedesktop.11.3.4.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\avalonia.native\\11.3.4\\avalonia.native.11.3.4.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\avalonia.remote.protocol\\11.3.4\\avalonia.remote.protocol.11.3.4.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\avalonia.skia\\11.3.4\\avalonia.skia.11.3.4.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\avalonia.themes.fluent\\11.3.4\\avalonia.themes.fluent.11.3.4.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\avalonia.themes.simple\\11.3.4\\avalonia.themes.simple.11.3.4.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\avalonia.win32\\11.3.4\\avalonia.win32.11.3.4.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\avalonia.x11\\11.3.4\\avalonia.x11.11.3.4.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\communitytoolkit.mvvm\\8.2.1\\communitytoolkit.mvvm.8.2.1.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\harfbuzzsharp\\8.3.1.1\\harfbuzzsharp.8.3.1.1.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\harfbuzzsharp.nativeassets.linux\\8.3.1.1\\harfbuzzsharp.nativeassets.linux.8.3.1.1.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\harfbuzzsharp.nativeassets.macos\\8.3.1.1\\harfbuzzsharp.nativeassets.macos.8.3.1.1.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\harfbuzzsharp.nativeassets.webassembly\\8.3.1.1\\harfbuzzsharp.nativeassets.webassembly.8.3.1.1.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\harfbuzzsharp.nativeassets.win32\\8.3.1.1\\harfbuzzsharp.nativeassets.win32.8.3.1.1.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microcom.runtime\\0.11.0\\microcom.runtime.0.11.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.bcl.cryptography\\8.0.0\\microsoft.bcl.cryptography.8.0.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.data.sqlclient\\7.0.1\\microsoft.data.sqlclient.7.0.1.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.data.sqlclient.extensions.abstractions\\1.0.0\\microsoft.data.sqlclient.extensions.abstractions.1.0.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.data.sqlclient.internal.logging\\1.0.0\\microsoft.data.sqlclient.internal.logging.1.0.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.data.sqlclient.sni.runtime\\6.0.2\\microsoft.data.sqlclient.sni.runtime.6.0.2.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.extensions.caching.abstractions\\8.0.0\\microsoft.extensions.caching.abstractions.8.0.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.extensions.caching.memory\\8.0.1\\microsoft.extensions.caching.memory.8.0.1.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.extensions.configuration\\8.0.0\\microsoft.extensions.configuration.8.0.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.extensions.configuration.abstractions\\8.0.0\\microsoft.extensions.configuration.abstractions.8.0.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.extensions.configuration.binder\\8.0.0\\microsoft.extensions.configuration.binder.8.0.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.extensions.configuration.commandline\\8.0.0\\microsoft.extensions.configuration.commandline.8.0.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.extensions.configuration.environmentvariables\\8.0.0\\microsoft.extensions.configuration.environmentvariables.8.0.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.extensions.configuration.fileextensions\\8.0.0\\microsoft.extensions.configuration.fileextensions.8.0.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.extensions.configuration.json\\8.0.0\\microsoft.extensions.configuration.json.8.0.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.extensions.configuration.usersecrets\\8.0.0\\microsoft.extensions.configuration.usersecrets.8.0.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.extensions.dependencyinjection\\8.0.0\\microsoft.extensions.dependencyinjection.8.0.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.extensions.dependencyinjection.abstractions\\8.0.2\\microsoft.extensions.dependencyinjection.abstractions.8.0.2.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.extensions.diagnostics\\8.0.0\\microsoft.extensions.diagnostics.8.0.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.extensions.diagnostics.abstractions\\8.0.0\\microsoft.extensions.diagnostics.abstractions.8.0.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.extensions.fileproviders.abstractions\\8.0.0\\microsoft.extensions.fileproviders.abstractions.8.0.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.extensions.fileproviders.physical\\8.0.0\\microsoft.extensions.fileproviders.physical.8.0.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.extensions.filesystemglobbing\\8.0.0\\microsoft.extensions.filesystemglobbing.8.0.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.extensions.hosting\\8.0.0\\microsoft.extensions.hosting.8.0.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.extensions.hosting.abstractions\\8.0.0\\microsoft.extensions.hosting.abstractions.8.0.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.extensions.logging\\8.0.0\\microsoft.extensions.logging.8.0.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.extensions.logging.abstractions\\8.0.2\\microsoft.extensions.logging.abstractions.8.0.2.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.extensions.logging.configuration\\8.0.0\\microsoft.extensions.logging.configuration.8.0.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.extensions.logging.console\\8.0.0\\microsoft.extensions.logging.console.8.0.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.extensions.logging.debug\\8.0.0\\microsoft.extensions.logging.debug.8.0.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.extensions.logging.eventlog\\8.0.0\\microsoft.extensions.logging.eventlog.8.0.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.extensions.logging.eventsource\\8.0.0\\microsoft.extensions.logging.eventsource.8.0.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.extensions.options\\8.0.2\\microsoft.extensions.options.8.0.2.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.extensions.options.configurationextensions\\8.0.0\\microsoft.extensions.options.configurationextensions.8.0.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.extensions.primitives\\8.0.0\\microsoft.extensions.primitives.8.0.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.identitymodel.abstractions\\8.16.0\\microsoft.identitymodel.abstractions.8.16.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.identitymodel.jsonwebtokens\\8.16.0\\microsoft.identitymodel.jsonwebtokens.8.16.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.identitymodel.logging\\8.16.0\\microsoft.identitymodel.logging.8.16.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.identitymodel.protocols\\8.16.0\\microsoft.identitymodel.protocols.8.16.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.identitymodel.protocols.openidconnect\\8.16.0\\microsoft.identitymodel.protocols.openidconnect.8.16.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.identitymodel.tokens\\8.16.0\\microsoft.identitymodel.tokens.8.16.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.sqlserver.server\\1.0.0\\microsoft.sqlserver.server.1.0.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\mysqlconnector\\2.5.0\\mysqlconnector.2.5.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\skiasharp\\2.88.9\\skiasharp.2.88.9.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\skiasharp.nativeassets.linux\\2.88.9\\skiasharp.nativeassets.linux.2.88.9.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\skiasharp.nativeassets.macos\\2.88.9\\skiasharp.nativeassets.macos.2.88.9.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\skiasharp.nativeassets.webassembly\\2.88.9\\skiasharp.nativeassets.webassembly.2.88.9.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\skiasharp.nativeassets.win32\\2.88.9\\skiasharp.nativeassets.win32.2.88.9.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\system.configuration.configurationmanager\\8.0.1\\system.configuration.configurationmanager.8.0.1.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\system.diagnostics.diagnosticsource\\8.0.0\\system.diagnostics.diagnosticsource.8.0.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\system.diagnostics.eventlog\\8.0.1\\system.diagnostics.eventlog.8.0.1.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\system.identitymodel.tokens.jwt\\8.16.0\\system.identitymodel.tokens.jwt.8.16.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\system.io.pipelines\\8.0.0\\system.io.pipelines.8.0.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\system.security.cryptography.pkcs\\8.0.1\\system.security.cryptography.pkcs.8.0.1.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\system.security.cryptography.protecteddata\\8.0.0\\system.security.cryptography.protecteddata.8.0.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\system.text.encodings.web\\8.0.0\\system.text.encodings.web.8.0.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\system.text.json\\8.0.0\\system.text.json.8.0.0.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\tmds.dbus.protocol\\0.21.2\\tmds.dbus.protocol.0.21.2.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.netcore.app.ref\\8.0.27\\microsoft.netcore.app.ref.8.0.27.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.windowsdesktop.app.ref\\8.0.27\\microsoft.windowsdesktop.app.ref.8.0.27.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.aspnetcore.app.ref\\8.0.27\\microsoft.aspnetcore.app.ref.8.0.27.nupkg.sha512",
"C:\\Users\\student\\.nuget\\packages\\microsoft.netcore.app.host.win-x64\\8.0.27\\microsoft.netcore.app.host.win-x64.8.0.27.nupkg.sha512"
],
"logs": []
}

View File

@ -1 +1 @@
"restore":{"projectUniqueName":"C:\\Users\\danii\\OneDrive\\Desktop\\Project\\CourseProject1125\\CourseProject1125.csproj","projectName":"CourseProject1125","projectPath":"C:\\Users\\danii\\OneDrive\\Desktop\\Project\\CourseProject1125\\CourseProject1125.csproj","outputPath":"C:\\Users\\danii\\OneDrive\\Desktop\\Project\\CourseProject1125\\obj\\","projectStyle":"PackageReference","originalTargetFrameworks":["net8.0"],"sources":{"https://api.nuget.org/v3/index.json":{}},"frameworks":{"net8.0":{"targetAlias":"net8.0","projectReferences":{}}},"warningProperties":{"warnAsError":["NU1605"]},"restoreAuditProperties":{"enableAudit":"true","auditLevel":"low","auditMode":"direct"},"SdkAnalysisLevel":"9.0.300"}"frameworks":{"net8.0":{"targetAlias":"net8.0","dependencies":{"Avalonia":{"target":"Package","version":"[11.3.4, )"},"Avalonia.Controls.DataGrid":{"target":"Package","version":"[11.3.4, )"},"Avalonia.Desktop":{"target":"Package","version":"[11.3.4, )"},"Avalonia.Diagnostics":{"target":"Package","version":"[11.3.4, )"},"Avalonia.Fonts.Inter":{"target":"Package","version":"[11.3.4, )"},"Avalonia.Themes.Fluent":{"target":"Package","version":"[11.3.4, )"},"CommunityToolkit.Mvvm":{"target":"Package","version":"[8.2.1, )"},"Microsoft.Data.SqlClient":{"target":"Package","version":"[7.0.1, )"},"Microsoft.Extensions.Hosting":{"target":"Package","version":"[8.0.0, )"},"MySqlConnector":{"target":"Package","version":"[2.5.0, )"}},"imports":["net461","net462","net47","net471","net472","net48","net481"],"assetTargetFallback":true,"warn":true,"downloadDependencies":[{"name":"Microsoft.AspNetCore.App.Ref","version":"[8.0.27, 8.0.27]"},{"name":"Microsoft.NETCore.App.Host.win-x64","version":"[8.0.27, 8.0.27]"},{"name":"Microsoft.NETCore.App.Ref","version":"[8.0.27, 8.0.27]"},{"name":"Microsoft.WindowsDesktop.App.Ref","version":"[8.0.27, 8.0.27]"}],"frameworkReferences":{"Microsoft.NETCore.App":{"privateAssets":"all"}},"runtimeIdentifierGraphPath":"C:\\Users\\danii\\.dotnet\\sdk\\9.0.314/PortableRuntimeIdentifierGraph.json"}}
"restore":{"projectUniqueName":"C:\\Users\\student\\Desktop\\Project\\CourseProject1125\\CourseProject1125.csproj","projectName":"CourseProject1125","projectPath":"C:\\Users\\student\\Desktop\\Project\\CourseProject1125\\CourseProject1125.csproj","packagesPath":"","outputPath":"C:\\Users\\student\\Desktop\\Project\\CourseProject1125\\obj\\","projectStyle":"PackageReference","fallbackFolders":["C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"],"originalTargetFrameworks":["net8.0"],"sources":{"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\":{},"C:\\Program Files\\dotnet\\library-packs":{},"http://192.168.200.81:8081/repository/nuget.org-proxy/index.json":{}},"frameworks":{"net8.0":{"targetAlias":"net8.0","projectReferences":{}}},"warningProperties":{"warnAsError":["NU1605"]},"restoreAuditProperties":{"enableAudit":"true","auditLevel":"low","auditMode":"direct"},"SdkAnalysisLevel":"10.0.300"}"frameworks":{"net8.0":{"targetAlias":"net8.0","dependencies":{"Avalonia":{"target":"Package","version":"[11.3.4, )"},"Avalonia.Controls.DataGrid":{"target":"Package","version":"[11.3.4, )"},"Avalonia.Desktop":{"target":"Package","version":"[11.3.4, )"},"Avalonia.Diagnostics":{"target":"Package","version":"[11.3.4, )"},"Avalonia.Fonts.Inter":{"target":"Package","version":"[11.3.4, )"},"Avalonia.Themes.Fluent":{"target":"Package","version":"[11.3.4, )"},"CommunityToolkit.Mvvm":{"target":"Package","version":"[8.2.1, )"},"Microsoft.Data.SqlClient":{"target":"Package","version":"[7.0.1, )"},"Microsoft.Extensions.Hosting":{"target":"Package","version":"[8.0.0, )"},"MySqlConnector":{"target":"Package","version":"[2.5.0, )"}},"imports":["net461","net462","net47","net471","net472","net48","net481"],"assetTargetFallback":true,"warn":true,"downloadDependencies":[{"name":"Microsoft.AspNetCore.App.Ref","version":"[8.0.27, 8.0.27]"},{"name":"Microsoft.NETCore.App.Host.win-x64","version":"[8.0.27, 8.0.27]"},{"name":"Microsoft.NETCore.App.Ref","version":"[8.0.27, 8.0.27]"},{"name":"Microsoft.WindowsDesktop.App.Ref","version":"[8.0.27, 8.0.27]"}],"frameworkReferences":{"Microsoft.NETCore.App":{"privateAssets":"all"}},"runtimeIdentifierGraphPath":"C:\\Program Files\\dotnet\\sdk\\10.0.300/PortableRuntimeIdentifierGraph.json"}}

View File

@ -1 +1 @@
17793773331207376
17810233640385401

View File

@ -1 +1 @@
17793773331207376
17810234653456215