Скриншот архива с проектом
Структура проекта
Задание
С помощью среды Visual Studio Community 2022 и платформы ASP.NET Core разработать приложение для контроля работы IT компании, удовлетворяющее следующимтребованиям: 1. Программа содержит страницы с информацией о программистах, менеджерах,бухгалтерах и комнатах, в которых работают сотрудники. 2. Начальное количество мест в каждой комнате равняется 10.3. Для программистов, менеджеров и бухгалтеров должны быть предусмотреныоперации добавления (приема на работу), редактирования (изменения данных осотрудниках) и удаления (увольнения). 4. Программисты, менеджеры, бухгалтеры размещаются в конкретных комнатах. 5. После добавления сотрудника количество мест в комнате, в которой размещаетсясотрудник, уменьшается количество мест.
Функционал программы
- добавление, редактирование, удаление сотрудников в соответствующие комнаты
- добавление, удаление и редактирование комнат
- поиск сотрудника по имени или фамилии
- уменьшение количества свободных мест в комнате при каждом новом добавлении сотрудника в соответствующую комнату.
Фрагмент программного кода модели Accountant
using ITСompany.BusinessLayer.Models.Entities.Rooms; using System.ComponentModel.DataAnnotations; namespace ITСompany.BusinessLayer.Models.Entities.Accountants { public class Accountant { public int Id { get; set; } // Идентификационный номер [MaxLength(100)] public string Name { get; set; } // Имя бухгалтера [MaxLength(100)] public string LastName { get; set; } // Фамилия бухгалтера [MaxLength(100)] public string SurName { get; set; } // Отчество бухгалтера public int Age { get; set; } //Возраст public int Experience { get; set; } // Опыт public Room Room { get; set; } // Внешний ключ к таблице Room public int RoomId { get; set; } // Id комнаты } }
Фрагмент программного кода репозитория для модели Accountant
using ITСompany.BusinessLayer.Context; using ITСompany.BusinessLayer.Models.Entities.Accountants; using Microsoft.EntityFrameworkCore; namespace ITСompany.BusinessLayer.Repositories { public class AccountantRepository : IRepository<Accountant> { private readonly ApplicationDbContext _context; public AccountantRepository(ApplicationDbContext context) { _context = context; } public IEnumerable<Accountant> GetAll() { return _context.Accountants.Include(a => a.Room).ToList(); } public Accountant GetById(int id) { return _context.Accountants.FirstOrDefault(a => a.Id == id); } public void Add(Accountant entity) { _context.Accountants.Add(entity); _context.SaveChanges(); } public void Update(Accountant entity) { _context.Entry(entity).State = EntityState.Modified; _context.SaveChanges(); } public void Remove(Accountant entity) { _context.Accountants.Remove(entity); _context.SaveChanges(); } } }
Фрагмент программного кода контроллера для Accountant
using ITСompany.BusinessLayer.Context; using ITСompany.BusinessLayer.Models.Entities.Accountants; using ITСompany.BusinessLayer.Services; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace ITСompany.WebApp.Controllers { public class AccountantsController : Controller { private readonly ApplicationDbContext _context; private readonly IRoomService _roomService; public AccountantsController(ApplicationDbContext context, IRoomService roomService) { _context = context; _roomService = roomService; } public IActionResult Index() { var accountants = _context.Accountants.Include(a => a.Room).ToList(); return View(accountants); } [HttpGet] public IActionResult Index(string searchQuery) { var accountants = _context.Accountants.Include(a => a.Room).AsQueryable(); if (!string.IsNullOrWhiteSpace(searchQuery)) { accountants = accountants.Where(a => a.LastName.Contains(searchQuery) || a.Name.Contains(searchQuery)); } return View(accountants.ToList()); } public IActionResult Details(int? id) { if (id == null || _context.Accountants == null) { return NotFound(); } var accountant = _context.Accountants .FirstOrDefault(m => m.Id == id); if (accountant == null) { return NotFound(); } ViewBag.Rooms = _context.Rooms.ToList(); // Передаем список комнат снова return View(accountant); } public IActionResult Create() { ViewBag.Rooms = _context.Rooms.ToList(); // Передаем список комнат снова return View(); } [HttpPost] [ValidateAntiForgeryToken] public IActionResult Create(Accountant accountant) { if (accountant == null) { return RedirectToAction(nameof(Index)); } if (ModelState.IsValid) { ViewBag.Rooms = _context.Rooms.ToList(); // Передаем список комнат снова return View(accountant); } // Найти комнату по идентификатору var room = _context.Rooms.Find(accountant.RoomId); if (room == null) { ModelState.AddModelError("", "Указанной комнаты не существует."); ViewBag.Rooms = _context.Rooms.ToList(); // Передаем список комнат снова } // Проверить наличие свободных мест if (room?.AvailablePlaces > 0) { // Добавить бухгалтера accountant.RoomId = room.Id; // Убедитесь, что RoomId установлен _context.Accountants.Add(accountant); _context.SaveChanges(); // Сохраняем бухгалтера // Уменьшить количество свободных мест room.AvailablePlaces--; _context.Update(room); _context.SaveChanges(); // Сохраняем изменения в комнате return RedirectToAction(nameof(Index)); } else { ModelState.AddModelError("", "В комнате нет свободных мест."); ViewBag.Rooms = _context.Rooms.ToList(); // Передаем список комнат снова return View(accountant); } } public IActionResult Edit(int? id) { var accountant = _context.Accountants.Include(a => a.Room).FirstOrDefault(a => a.Id == id); if (accountant == null) { return RedirectToAction(nameof(Index)); } ViewData["AccountantId"] = accountant.Id; ViewBag.Rooms = _context.Rooms.ToList(); // Передаем список комнат return View(accountant); // <-- Здесь исправлено } [HttpPost] [ValidateAntiForgeryToken] public IActionResult Edit(Accountant accountant) { if (!ModelState.IsValid) { _context.Update(accountant); _context.SaveChanges(); return RedirectToAction(nameof(Index)); } ViewData["AccountantId"] = accountant.Id; // Обновляем ID для передачи ViewBag.Rooms = _context.Rooms.ToList(); // Передаем список комнат return View(accountant); } public async Task<IActionResult> Delete(int id) { var accountant = await _context.Accountants.FindAsync(id); if (accountant == null) { return RedirectToAction(nameof(Index)); } _context.Remove(accountant); await _context.SaveChangesAsync(); return RedirectToAction(nameof(Index)); } } }
Пояснения по запуску программы
в архиве с данных проектом приложена инструкция в формате Word. Внимательно читаем и в точности выполняем все действия. Инструкция несет своей целью помочь вам разобраться с запуском и рабой с приложением.
Приложения
В качестве приложений представлены: 1. схема БД и 2. Диаграмма классов
-