Programmeerimine

eduka projekti kirjeldus

HelloWorld("print")

Projekt – TallinnaRakenduslikKolledž

Projekti eesmärk on luua algeline andmebaas tulevase kooli jaoks õppe eesmärgil.

Projekt kasutab MVC struktuuri, kus mudel, vaade ja kontroller töötavad harmoonias. Mudel on andmemudeli alus, kus on kõik kasutatavad andmed olemas. Vaade on veebilehe struktuur, kuhu paigutatakse andmebaasi ehitus ja nupud. Controller on MVC struktuuri tehniline osa, kus on näiteks erinevad meetodid, et luua, kustutada ja muuta andmeid andmebaasis.

Näited koodist:

Osakondade mudel: Loob algelise mudeli osakondade andmebaasi jaoks

using System.ComponentModel.DataAnnotations;

namespace TallinnaRakenduslikKolledž.Models
{
    public class Department
    {
        [Key]
        public int DepartmentID {  get; set; }
        public string Name { get; set; }
        public decimal Budget {  get; set; }
        public DateTime StartDate { get; set; }
        public int? InstructorIDˇ {  get; set; }
        public Instructor? Administrator { get; set; }
        public ICollection<Course>? Courses { get; set; }
        public byte? RowVersion { get; set; }

        /* 3 isiklikku unikaalset andmevälja kursusele juurde */
        public DateTime EndDate { get; set; }
        public int? SocialCreditScore { get; set; }
        public bool SigmaStatus { get; set; }
    }
}

Osakondade index vaade: loob veebilehe struktuuri.

@model IEnumerable<TallinnaRakenduslikKolledž.Models.Department>
@{
	ViewData["Title"] = "Osakonnad";
}
<h1>Osakonnad</h1>
<p>
	<a asp-action="Create">Loo uus osakond</a>
</p>
<table class="table">
	<thead>
		<tr>
			<th>@Html.DisplayNameFor(model => model.Name)</th>
			<th>@Html.DisplayNameFor(model => model.Budget)</th>
			<th>@Html.DisplayNameFor(model => model.StartDate)</th>
			<th>@Html.DisplayNameFor(model => model.Administrator)</th>
			<th>@Html.DisplayNameFor(model => model.RowVersion)</th>
			<th>@Html.DisplayNameFor(model => model.EndDate)</th>
			<th>@Html.DisplayNameFor(model => model.SigmaStatus)</th>
			<th>Tööriistad)</th>
		</tr>
	</thead>
	<tbody>
		@foreach(var department in Model)
		{
			<tr>
				<td> @Html.DisplayFor(modelItem => department.Name)</td>
				<td> @Html.DisplayFor(modelItem => department.Budget)</td>
				<td> @Html.DisplayFor(modelItem => department.StartDate)</td>
				<td> @Html.DisplayFor(modelItem => department.Administrator)</td>
				<td> @Html.DisplayFor(modelItem => department.RowVersion)</td>
				<td> @Html.DisplayFor(modelItem => department.EndDate)</td>
				<td> @Html.DisplayFor(modelItem => department.SigmaStatus)</td>
				<td>
					@* /* Muuda */ *@
					@* /* Vaata */ *@
					@* /* Vaata Adminit */ *@
					@* /* Kustuta */ *@
					<a asp-action="Delete" asp-route-id="@department.DepartmentID" class="btn btn-danger">Eemalda</a>
					<a class="btn btn-danger" asp-area="" asp-controller="Departments" asp-action="Details">Vaata</a>
				</td>
			</tr>
		}
	</tbody>
</table>

Osakondade kontroller: kõik tehniline kood vajalik andmebaasi tööks.

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.EntityFrameworkCore;
using TallinnaRakenduslikKolledž.Data;
using TallinnaRakenduslikKolledž.Models;

namespace TallinnaRakenduslikKolledž.Controllers
{
    public class DepartmentsController : Controller
    {
        private readonly SchoolContext _context;
        public DepartmentsController(SchoolContext context)
        {
            _context = context;
        }

        public async Task<IActionResult> Index()
        {
            var schoolContext = _context.Departments.Include(d => d.Administrator);
            return View(await schoolContext.ToListAsync());
        }
        [HttpGet]
        public IActionResult Create()
        {
            ViewData["InstructorID"] = new SelectList(_context.Instructors, "ID", "FullName");
            ViewData["StudentId"] = new SelectList(_context.Instructors, "Id", "LastName", "FirstName");
            return View();
        }

        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Create([Bind("Name,Budget,StartDate,RowVersion,InstructorID,SigmaStatus,EndDate,SocialCreditScore")] Department department)
        {
            if (ModelState.IsValid)
            {
                _context.Add(department);
                await _context.SaveChangesAsync();
                return RedirectToAction("Index");
            }
            ViewData["InstructorID"] = new SelectList(_context.Instructors, "Id", "FullName", department.InstructorIDˇ);
            return View(department);
        }
        [HttpGet]
        public async Task<IActionResult> Delete(int? id)
        {
            ViewData["Värv"] = "punane";
            if (id == null)
            {
                return NotFound();
            }
            var department = await _context.Departments.Include(d => d.Administrator).FirstOrDefaultAsync(d => d.DepartmentID == id);
            if (department == null)
            {
                return NotFound();
            }
            return View(department);
        }
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Delete(Department department)
        {

            if (await _context.Departments.AnyAsync(m => m.DepartmentID == department.DepartmentID))
            {
                _context.Departments.Remove(department);
                await _context.SaveChangesAsync();
            }
            return RedirectToAction("Index");
        }

        [HttpGet]
        public async Task<IActionResult> Details(int? id)
        {
            ViewData["Värv"] = "sinine";
            var instructor = await _context.Departments.FindAsync(id);
            return View("Delete",instructor);
        }
    }
}

Selles projektis saab kasutaja lisada andmeid veebilehel, mis sisaldatakase andmebaasi ja kuvatakse lehel. Veebilehel on olemas õpilasete osa, õpetajate osa, korrarikkujate osa, osakondade osa ja kursuste osa.

Kõik andmebaasi muutujad iga tabeli kohta:

Õpilased: Id, Ees ja perekonnanimi, kursusega liitumis aeg, kursus, sugu ja telefoninumber.

Õpetajad: Ees, pere- ja täisnimi, tööle võtmis kuupäev, palk, vanus ja osakond.

Osakonnad: Osakonna nimi, id, eelarve, asutamis kuupäev, õpetaja Id, administraator, kursused, lõpp kuupäev, sotsiaalse krediidi skoor ja sigmasuse staatus.

Kursused: Kursuse id, tiitel, krediidid, osakond, osakonna id, ja liitunud õpilased.

Kasutatavad meetodid

Kasutame näitena StudentsControllerit

Create meetod:

        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Create([Bind("Id,LastName,FirstName,EnrollmentDate,Course")] Student student)
        {
            if (ModelState.IsValid)
            {
                _context.Students.Add(student);
                await _context.SaveChangesAsync();
                return RedirectToAction("Index");
                //return RedirectToAction(nameof(Index)) 
            }
            return View(student);

        }

Kui mudeliga on kõik korras, siis see postitab andmebaasi uue õpilase, koos kõikide sisestatud andmetega, ja läheb algvaatesse tagasi. Siin pole kasutusel ühtegi LINQ meetodit.

Delete meetod:

        [HttpGet]
        public async Task<IActionResult> Delete(int? id)
        {
            if(id == null)
            {
                return NotFound();
            }
            var student = await _context.Students.FirstOrDefaultAsync(m => m.Id == id);
            if (student == null)
            {
                return NotFound();
            }
            return View(student);
        }
        /// <summary>
        /// Confirms student deletion
        /// </summary>
        /// <param name="id"> id of student</param>
        /// <returns></returns>
        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> DeleteConfirmed(int id)
        {
            var student = await _context.Students.FindAsync(id);
            _context.Students.Remove(student);
            await _context.SaveChangesAsync();
            return RedirectToAction("Index");
        }

Alguses kontrollitakse, kas selle ID’ga õpilane on olemas, kui on siis jätkame. Siis järgmises meetodis kustutatakse ära õpilane ja muudatused salvestatakse asünkroonselt, siis minnake tagasi Index lehele.

Linq meetod: FirstOrDefaultAsync(m => m.Id == id)

Tagastab esimese õpilase, mis vastab tingimusele.

Details meetod:

        [HttpGet]
        public async Task<IActionResult> Details(int? id)
        {
            var student = await _context.Students.FindAsync(id);
            return View(student);
        }

Avab lihtsalt seotud Id’ga details view õpilase jaoks.

Edit meetod:

[HttpGet]
        public async Task<IActionResult> Edit(int id)
        {
            var student = await _context.Students.FindAsync(id);
            return View(student);
        }
        [HttpPost, ActionName("Edit")]
        public async Task<IActionResult> Edit([Bind("Id,LastName,FirstName,EnrollmentDate,Course")] Student student)
        {
            if (ModelState.IsValid)
            {
                _context.Students.Update(student);
                await _context.SaveChangesAsync();
                return RedirectToAction("Index");
            }
            return View(student);

        }

Alguses otsitakse ülesse õpilane konkreetse Id’ga ja siis viiakse Edit vaate lehele, kus on andmed selle õpilase kohta. Kui uued andmed on korras, siis uuendatakse see õpilane ja muudatused salvestatakse asünkrsoonselt.