Main site structure with first uni quiz

This commit is contained in:
2025-01-10 23:05:02 +01:00
parent e0be650607
commit 72c21d6d81
19 changed files with 1311 additions and 0 deletions

38
main.py Normal file
View File

@ -0,0 +1,38 @@
from flask import Flask, render_template, request, redirect, url_for, session, Blueprint
from portalfejlesztes_net_ben import portalfejlesztes_net_ben
app = Flask(__name__)
app.secret_key = 'your_secret_key'
@app.route('/')
@app.route('/home')
def home():
return render_template('home.html')
@app.route('/about')
def about():
return render_template('about.html')
@app.route('/uni')
def uni():
return render_template('uni/uni.html')
@app.route('/projects')
def projects():
return render_template('projects.html')
@app.route('/git')
def git():
return render_template('git.html')
# Register the blueprint with a URL prefix
app.register_blueprint(portalfejlesztes_net_ben, url_prefix='/uni/portalfejlesztes_net_ben')
if __name__ == '__main__':
app.run(debug=True)
app.run(host='192.168.2.182', port=5000)

View File

@ -0,0 +1,119 @@
from flask import Flask, render_template, request, redirect, url_for, session, Blueprint
import os
import random
TEXTFILES = ["./portalfejlesztes_net_ben/kerdessor1_manual.txt", "./portalfejlesztes_net_ben/kerdessor2_manual.txt", "./portalfejlesztes_net_ben/kerdessor3.txt"]
portalfejlesztes_net_ben = Blueprint(
'portalfejlesztes_net_ben',
__name__,
template_folder='templates' # Ensure this matches the folder location
)
def parse_questions():
content = []
for file_path in TEXTFILES:
with open(file_path, 'r', encoding='utf-8') as file:
content.extend(file.read().split("\n\n"))
questions = []
for block in content:
lines = block.strip().split("\n")
question = lines[0].replace("Kérdés: ", "").strip()
answers = []
correct_answers = []
for line in lines[1:]:
answer = line.strip()
if answer.startswith('!'):
correct_answers.append(answer[1:].strip())
else:
answers.append(answer)
if correct_answers:
questions.append({
'question': question,
'answers': answers + correct_answers,
'correct_answers': correct_answers
})
return questions
@portalfejlesztes_net_ben.route('/')
@portalfejlesztes_net_ben.route('/quiz', methods=['GET', 'POST'])
def quiz():
if 'selected_questions' not in session:
questions = parse_questions()
selected_questions = random.sample(questions, 20)
session['selected_questions'] = selected_questions
session['question_index'] = 0
session['answers'] = []
else:
selected_questions = session['selected_questions']
question_index = session.get('question_index', 0)
if question_index >= len(selected_questions):
return redirect(url_for('portalfejlesztes_net_ben.result'))
current_question = selected_questions[question_index]
random.shuffle(current_question['answers'])
return render_template('quiz.html', question=current_question, question_index=question_index)
@portalfejlesztes_net_ben.route('/submit_answer', methods=['POST'])
def submit_answer():
user_answers = request.form.getlist('answer')
question_index = int(request.form.get('question_index'))
answers = session.get('answers', [])
answers.append(user_answers)
session['answers'] = answers
question_index += 1
session['question_index'] = question_index
return redirect(url_for('portalfejlesztes_net_ben.quiz'))
@portalfejlesztes_net_ben.route('/result')
def result():
selected_questions = session.get('selected_questions', None)
answers = session.get('answers', None)
score = 0
mistakes = []
for i, user_answer in enumerate(answers):
correct_answers = selected_questions[i]['correct_answers']
if set(user_answer) == set(correct_answers):
score += 1
else:
mistakes.append({
'question': selected_questions[i]['question'],
'correct_answer': correct_answers,
'user_answer': user_answer
})
questions_with_answers = zip(selected_questions, answers)
session.pop('question_index', None)
session.pop('answers', None)
session.pop('selected_questions', None)
return render_template('result.html', score=score, total=len(selected_questions), mistakes=mistakes, questions_with_answers=questions_with_answers)
@portalfejlesztes_net_ben.route('/restart')
def restart():
session.pop('question_index', None)
session.pop('answers', None)
session.pop('selected_questions', None)
return redirect(url_for('portalfejlesztes_net_ben.quiz'))
@portalfejlesztes_net_ben.route('/allquestions')
def allquestions():
questions = parse_questions()
return render_template('allquestions.html', questions=questions)

View File

@ -0,0 +1,132 @@
Kérdés: Miért van külön Web.Debug.config és Web.Release.config fájl a webalkalmazásban?
Azért, mert így külön definiálhatóak beállítások éles és demo környezetekhez.
!Azért, mert így külön definiálhatóak beállítások a SolutionConfiguration alatt választható build típusokhoz.
Azért, mert így külön definiálhatóak változtatható a kinézetéles és demo környezetek között.
Kérdés: Web alkalmazásban adatbáziskapcsolat adatai hol tárolhatóak?
ConfigurationSettings.cs fájlban
!Web.config fájlban
Global.asax fájlban
Kérdés: Web alkalmazásban mit tartalmaz a Global.asax.cs fájl?
!Az egész alkalmazás működését érintő események bekövetkezésekor végrehajtandó kódot.
Az egész alkalmazásból elérhető metódusokat.
Globális változók definíciója
Kérdés: Web alkalmazásban mi a különbség valami.aspx, valami.aspx.cs és valami.aspx.designer.cs fájlok tartalma között?
!Az aspx tartalmazza a vezérlőelemek elhelyezkedését, típusát és alapvelő működését, az aspx.cs a hozzá tartozó codebehind fájl (főként vezérlőelemek kezelésére vonatkozó kóddal), míg az aspx.designer.cs generált fájl, mely a vezérlők definícióját tartalmazza.
Az .cs tartalmazza a vezérlőelemek elhelyezkedését, típusát és alapvelő működését, az aspx.designer.cs a hozzá tartozó codebehind fájl (főként vezérlőelemek kezelésére vonatkozó kóddal), míg az aspx.csgenerált fájl, mely a vezérlők definícióját tartalmazza.
Az aspx.designer.cs tartalmazza a vezérlőelemek elhelyezkedését, típusát és alapvelő működését, az aspx.cs a hozzá tartozó codebehind fájl (főként vezérlőelemek kezelésére vonatkozó kóddal), míg az aspx generált fájl, mely a vezérlők definícióját tartalmazza.
Kérdés: Web alkalmazásban mit tartalmaz a Site.master fájl?
Az oldal kerete, kinézete és működése, melyet az .cs fájlok töltenek meg tartalommal
!Az oldal kerete, kinézete és működése, melyet az .aspx fájlok töltenek meg tartalommal
Az egész alkalmazás működését érintő események bekövetkezésekor végrehajtandó kódot.
Az egész alkalmazásból elérhető metódusokat.
Globális változók definíciója
Kérdés: Web alkalmazásban lehet-e több site.master fájl?
!Igen, lehet
Nem, nem lehet.
Kérdés: Web alkalmazásban egy aspx fájlban a <%: %> jel található, mit jelent?
A végleges, browsernek küldött html tartalom előállítása során c# nyelven kell értelmezni a jelek közötti részt.
!A végleges, browsernek küldött html tartalomban jelenjen meg a jelek között található kifejezés értéke.
Kérdés: Web alkalmazásban egy aspx fájlban a <% %> jel található, mit jelent?
!A végleges, browsernek küldött html tartalom előállítása során c# nyelven kell értelmezni a jelek közötti részt.
A végleges, browsernek küldött html tartalomban jelenjen meg a jelek között található kifejezés értéke.
Kérdés: Web alkalmazásban(Web forms) mit értünk a codebehind fájl alatt?
!Azt a .aspx.cs fájlt, mely az aspx fájllal összhangban tartalmazza többek között az események kezelőit.
Azt a POCO .cs fájlt, mely az aspx fájllal összhangban tartalmazza többek között az események kezelőit.
Azt a .designer.cs fájlt, mely az aspx fájllal összhangban tartalmazza többek között az események kezelőit.
Kérdés: Web alkalmazásban (web forms) hogyan generáltatható egy vezérlőelem default eseménykezelője?
!Dupla kattintás a vezérlőelemen
!Properties panel, event gomb alapján a kiválasztott eseményen dupla kattintás
Tools menü, events... és ott kiválasztható 'adddefault'
Kérdés: Web alkalmazásban (web forms) válassza ki,melyek a választható/használható vezérlő elemek?
Clock
!Button
!Textbox
!DropdownList
!Checkbox
Kérdés: Web alkalmazásban (Web forms) mit tudhatunk meg az IsPostBacktulajdonsából?
!Értéke hamis, ha ez az első oldalbetöltés.
Értéke hamis, ha az oldalbetöltés vezérlés hatására történt
Kérdés: Web alkalmazásban DropdownList vezérlőhöz hogyan tudunk elemeket hozzáadni?
!Példány.Itemskollekció manipulálásával
Példány.Selectionkollekció manipulálásával
Példány.CustomElementskollekció manipulálásával
Kérdés: Web alkalmazásban (Web forms) egy Label típusú vezérlőelemen megjelenő szöveg melyik tulajdonsággal állítható be?
Példány.Label
Példány.Caption
!Példány.Text
Példány.ShowText()
Kérdés: Web alkalmazásban (Web forms) egy Textbox típusú vezérlőelembe user által írt szöveg melyik tulajdonsággal olvasható ki?
Példány.Label
Példány.Caption
!Példány.Text
Példány.ShowText()
Kérdés: Web alkalmazásban (Web forms) egy Textbox típusú melyik tulajdonsággal tiltható le (user nem szerkesztheti)?
Disabled tulajdonság true értékre állításával
!Enabled tulajdonság false értékre állításával
Visible tulajdonság false értékre állításával
Opacity tulajdonság 0 értékre állításával
Kérdés: Web alkalmazásban (web forms) egy TextBox típusú vezérlőben hogyan tudunk több sornyi szöveget megjeleníteni?
Nem lehetséges, alapvetően userinput-ra való
Text tulajdonságba sortöréssel ellátott szöveget helyezünk, EnableMultiLine tulajdonságot true értékre állítva
!Text tulajdonságba sortöréssel ellátott szöveget helyezünk, TextMode tulajdonságot MultiLine értékre állítva
Kérdés: MVC projekt esetén tipikusan hova futnak be a browser kérései?
Controller osztályok ActionResult attribútummal ellátott metóduasihoz.
!Controller osztályok publikus metódusaihoz.
Manager osztályok publikus metódusaihoz.
Kérdés: Mi határozza meg, hogy a browser címsorában lévő uri hova mutat az alkalmazásban?
Controllerek publikus metódusaihoz futnak be.
!Routing szabályokkal kell megadni.
A Contextben kell megadni.
Kérdés: MVC projekt esetén tipikusan mit értünk ViewModel alatt?
!Egy View alapját szolgáltató osztály, mely tipikusan tartalmaz számított mezőket és lekérdezett értékeket.
Azon osztályok ezek, melyek az adatbázisban kerülnek perzisztálásra.
Egy View alapját szolgáltató osztály, mely tipikusan nem tartalmaz számított mezőket és lekérdezett értékeket.
Kérdés: Mire utal az MVC minta?
!Model-View-Controller
Model-ViewModel-Control
Kérdés: MVC Web alkalmazásban hogyan kerül egy View megjelenítésre?
A megadott URL egy HTML oldalra mutat, melyet a browser megjelenít, ez a View.
!A megadott URL egy Controller metódusra mutat, mely View-t adhat vissza.
ViewModel generálódik és jeleníti meg a browser.
Kérdés: MVC alkalmazás esetén mikor fog kiértékelődni a <%%> jelek közötti kifejezés?
Csak az első megjelenítés során
!Az oldal minden elkészítése során
Az oldal minden elkészítése során, ami nem IsPostBack
Kérdés: Web alkalmazásban (Web forms) tipikusan milyen típusú fájlok lehetnek az előre definiált Scripts mappában?
SQL script fájlok
!Javascript fájlok
.cs fájlok
Kérdés: Web alkalmazásban (Web forms) tipikusan milyen típusú fájlok lehetnek az előre definiált Styles mappában?
!CSS fájlok
Aspx fájlok
Ascx fájlok
Kérdés: Web alkalmazásban (Web forms) tipikusan milyen típusú fájlok lehetnek az előre definiált App_Data mappában?
Metadata fájlok (.cs)
!Helyi adatbázis fájlok
Konfigurációs fájlok

View File

@ -0,0 +1,131 @@
Kérdés: Miért van külön Web.Debug.config és Web.Release.config fájl a webalkalmazásban?
Azért, mert így külön definiálhatóak beállítások éles és demo környezetekhez.
!Azért, mert így külön definiálhatóak beállítások a Solution Configuration alatt választható build típusokhoz.
Azért, mert így külön definiálhatóak változtatható a kinézet éles és demo környezetek között.
Kérdés: Web alkalmazásban adatbáziskapcsolat adatai hol tárolhatóak?
ConfigurationSettings.cs fájlban
!Web.config fájlban
Global.asax fájlban
Kérdés: Web alkalmazásban mit tartalmaz a Global.asax.cs fájl?
!Az egész alkalmazás működését érintő események bekövetkezésekor végrehajtandó kódot.
Az egész alkalmazásból elérhető metódusokat.
Globális változók definíciója
Kérdés: Web alkalmazásban mi a különbség valami.aspx, valami.aspx.cs és valami.aspx.designer.cs fájlok tartalma között?
!Az aspx tartalmazza a vezérlőelemek elhelyezkedését, típusát és alapvelő működését, az aspx.cs a hozzá tartozó code behind fájl (főként vezérlőelemek kezelésére vonatkozó kóddal), míg az aspx.designer.cs generált fájl, mely a vezérlők definícióját tartalmazza.
Az .cs tartalmazza a vezérlőelemek elhelyezkedését, típusát és alapvelő működését, az aspx.designer.cs a hozzá tartozó code behind fájl (főként vezérlőelemek kezelésére vonatkozó kóddal), míg az aspx.cs generált fájl, mely a vezérlők definícióját tartalmazza.
Az aspx.designer.cs tartalmazza a vezérlőelemek elhelyezkedését, típusát és alapvelő működését, az aspx.cs a hozzá tartozó code behind fájl (főként vezérlőelemek kezelésére vonatkozó kóddal), míg az aspx generált fájl, mely a vezérlők definícióját tartalmazza.
Kérdés: Web alkalmazásban mit tartalmaz a Site.master fájl?
Az oldal kerete, kinézete és működése, melyet az .cs fájlok töltenek meg tartalommal
!Az oldal kerete, kinézete és működése, melyet az .aspx fájlok töltenek meg tartalommal
Az egész alkalmazás működését érintő események bekövetkezésekor végrehajtandó kódot.
Az egész alkalmazásból elérhető metódusokat.
Globális változók definíciója
Kérdés: Web alkalmazásban lehet-e több site.master fájl?
!Igen, lehet
Nem, nem lehet.
Kérdés: Web alkalmazásban egy aspx fájlban a <%: %> jel található, mit jelent?
A végleges, browsernek küldött html tartalom előállítása során c# nyelven kell értelmezni a jelek közötti részt.
!A végleges, browsernek küldött html tartalomban jelenjen meg a jelek között található kifejezés értéke.
Kérdés: Web alkalmazásban egy aspx fájlban a <% %> jel található, mit jelent?
!A végleges, browsernek küldött html tartalom előállítása során c# nyelven kell értelmezni a jelek közötti részt.
A végleges, browsernek küldött html tartalomban jelenjen meg a jelek között található kifejezés értéke.
Kérdés: Web alkalmazásban(Web forms) mit értünk a code behind fájl alatt?
!Azt a .aspx.cs fájlt, mely az aspx fájllal összhangban tartalmazza többek között az események kezelőit.
Azt a POCO .cs fájlt, mely az aspx fájllal összhangban tartalmazza többek között az események kezelőit.
Azt a .designer.cs fájlt, mely az aspx fájllal összhangban tartalmazza többek között az események kezelőit.
Kérdés: Web alkalmazásban (web forms) hogyan generáltatható egy vezérlőelem default eseménykezelője?
!Dupla kattintás a vezérlőelemen
!Properties panel, event gomb alapján a kiválasztott eseményen dupla kattintás
Tools menü, events… és ott kiválasztható add default
Kérdés: Web alkalmazásban (web forms) válassza ki,melyek a választható/használható vezérlő elemek?
Clock
!Button
!Textbox
!DropdownList
!Checkbox
Kérdés: Web alkalmazásban (Web forms) mit tudhatunk meg az IsPostBack tulajdonsából?
!Értéke hamis, ha ez az első oldalbetöltés.
Értéke hamis, ha az oldalbetöltés vezérlés hatására történt
Kérdés: Web alkalmazásban DropdownList vezérlőhöz hogyan tudunk elemeket hozzáadni?
!Példány.Items kollekció manipulálásával
Példány.Selection kollekció manipulálásával
Példány.CustomElements kollekció manipulálásával
Kérdés: Web alkalmazásban (Web forms) egy Label típusú vezérlőelemen megjelenő szöveg melyik tulajdonsággal állítható be?
Példány.Label
Példány.Caption
!Példány.Text
Példány.ShowText()
Kérdés: Web alkalmazásban (Web forms) egy Textbox típusú vezérlőelembe user által írt szöveg melyik tulajdonsággal olvasható ki?
Példány.Label
Példány.Caption
!Példány.Text
Példány.ShowText()
Kérdés: Web alkalmazásban (Web forms) egy Textbox típusú melyik tulajdonsággal tiltható le (user nem szerkesztheti)?
Disabled tulajdonság true értékre állításával
!Enabled tulajdonság false értékre állításával
Visible tulajdonság false értékre állításával
Opacity tulajdonság 0 értékre állításával
Kérdés: Web alkalmazásban (web forms) egy TextBox típusú vezérlőben hogyan tudunk több sornyi szöveget megjeleníteni?
Nem lehetséges, alapvetően user input-ra való
Text tulajdonságba sortöréssel ellátott szöveget helyezünk, EnableMultiLine tulajdonságot true értékre állítva
!Text tulajdonságba sortöréssel ellátott szöveget helyezünk, TextMode tulajdonságot MultiLine értékre állítva
Kérdés:MVC projekt esetén tipikusan hova futnak be a browser kérései?
Controller osztályok ActionResult attribútummal ellátott metóduasihoz.
!Controller osztályok publikus metódusaihoz.
Manager osztályok publikus metódusaihoz.
Kérdés: Mi határozza meg, hogy a browser címsorában lévő uri hova mutat az alkalmazásban?
Controllerek publikus metódusaihoz futnak be.
!Routing szabályokkal kell megadni.
A Contextben kell megadni.
Kérdés: MVC projekt esetén tipikusan mit értünk ViewModel alatt?
!Egy View alapját szolgáltató osztály, mely tipikusan tartalmaz számított mezőket és lekérdezett értékeket.
Azon osztályok ezek, melyek az adatbázisban kerülnek perzisztálásra.
Egy View alapját szolgáltató osztály, mely tipikusan nem tartalmaz számított mezőket és lekérdezett értékeket.
Kérdés: Mire utal az MVC minta?
!Model-View-Controller
Model-ViewModel-Control
Kérdés: MVC Web alkalmazásban hogyan kerül egy View megjelenítésre?
A megadott URL egy HTML oldalra mutat, melyet a browser megjelenít, ez a View.
!A megadott URL egy Controller metódusra mutat, mely View-t adhat vissza.
ViewModel generálódik és jeleníti meg a browser.
Kérdés: MVC alkalmazás esetén mikor fog kiértékelődni a <%%> jelek közötti kifejezés?
Csak az első megjelenítés során
!Az oldal minden elkészítése során
Az oldal minden elkészítése során, ami nem IsPostBack
Kérdés: Web alkalmazásban (Web forms) tipikusan milyen típusú fájlok lehetnek az előre definiált Scripts mappában?
SQL script fájlok
!Javascript fájlok
.cs fájlok
Kérdés: Web alkalmazásban (Web forms) tipikusan milyen típusú fájlok lehetnek az előre definiált Styles mappában?
!CSS fájlok
Aspx fájlok
Ascx fájlok
Kérdés: Web alkalmazásban (Web forms) tipikusan milyen típusú fájlok lehetnek az előre definiált App_Data mappában?
Metadata fájlok (.cs)
!Helyi adatbázis fájlok
Konfigurációs fájlok

View File

@ -0,0 +1,84 @@
Kérdés: MVC projekt esetén tipikusan mit értünk ViewModel alatt?
!Egy View alapját szolgáltató osztály, mely tipikusan tartalmaz számított mezőket és lekérdezett értékeket.
Azon osztályok ezek, melyek az adatbázisban kerülnek perzisztálásra.
Egy View alapját szolgáltató osztály, mely tipikusan nem tartalmaz számított mezőket és lekérdezett értékeket.
Kérdés: Tipikusan mit értünk Context alatt?
Minden ide tartozik, ami a Model osztályokban van.
Minden ide tartozik, mely megmondja, hogy hol és milyen adatok érhetőek el.
!Minden ide tartozik, amely a tárolt adatokat írja le (tulajdonságok, kapcsolatok).
Kérdés: MVC projektben, adatkezeléssel kapcsolatban, miért/mikor előnyös Initializer használata?
Mert így minden Model osztályból tábla készíthető, egy lépésben.
!Mert így nem kell újra felvinni teszt adatokat fejlesztés közben, amikor intenzíven változik a db séma.
Mert így minden változás a sémában automatikusan rögzítve lesz.
Kérdés: Entity Framework mit jelent a Table-per-hierarchy pattern használata/mit eredményez?
Minden keletkezett táblában benne lesz az összes tulajdonság, ami csak felmerül a Context-ben, így gyorsul a hozzáférés.
!Minden öröklődési hierarchiához egy tábla készül az ős nevével, mely minden leszármazott tulajdonságot és Discriminatort tartalmaz.
Annyi tábla keletkezik belső hivatkozásokkal, ahány osztály részt vesz az öröklésben.
Kérdés: Entity Framework mit jelent a Table-per-type pattern használata/mit eredményez?
!Annyi tábla keletkezik belső hivatkozásokkal, ahány osztály részt vesz az öröklésben.
Minden öröklődési hierarchiához egy tábla készül az ős nevével, mely minden leszármazott tulajdonságot és Discriminatort tartalmaz.
Minden keletkezett táblában benne lesz az összes tulajdonság, ami csak felmerül a Context-ben, így gyorsul a hozzáférés.
Kérdés: Entity Framework konkurencia kezelésére melyek a lehetséges módok?
Contextben lock segítségével.
!Timestamp/RowVersion használata.
!Where feltételben az összes tulajdonság megjelenítése.
Kérdés: MVC projekt esetén mire való a MasterPage?
Ez tipikusan a nyitóoldal.
Ez tipikusan a kezdőoldal.
!Ez adhatja a keretet, melyben a tartalom megjelenhet.
Kérdés: MVC projekt esetén mire használható a ViewBag?
!Egy View kollekciót lehet segítsségével megjeleníteni, akár egyszerre több controllerből is.
Olyan objektum, melynek nincsenek előre definiált tulajdonságai, kétirányban bármi bele tehető.
View-kat lehet controllerekhez küldeni vele.
Kérdés: Entity Framework tipikusan milyen típusú elemekből lesznek táblák?
ViewModelekből, ez attributummal jelezhető.
!Model folder POCO osztályaiból.
Controller metódusok ActionResult visszatérésű elemeiből.
Kérdés: Entity Framework Ha tulajdonságként 1:N kapcsolat megvalósítása a cél, akkor…
…generikus IDictionary interfészt megvalósító tulajdonság kell.
…IList<long> tulajdonság kell az idegen kulcs miatt.
!…generikus ICollection interfészt megvalósító tulajdonság kell.
Kérdés: Entity Framework Ha tulajdonságként 1:1 kapcsolat megvalósítása a cél, akkor…
…protected property kell, olyan típussal, ami a hivatkozott elem típusa.
…virtual property kell, olyan típussal, ami a másik elem típusa.
!…publikus property get részében kell lekérdezni ID alapján és visszaadni.
Kérdés: Entity Framework mivel szabályozható, hogy mely osztályokból készüljön tábla?
Ezt Context generikus DbSet tulajdonságai határozzák meg.
Web.config fájl ConnectionStrings részében kell megadni.
!A model osztályok atributumai határozzák meg.
Kérdés: Entity Framework hogyan állíthatjuk be az adatok inicializálását?
Initializer osztály kell / Initialize() metódus felülbírálatával.
Az Application_Start() metódus való erre.
!Initializer osztály kell / Seed metódus override.
Kérdés: MVC projekt esetén tipikusan hova futnak be a browser kérései?
Controller osztályok ActionResult attribútummal ellátott metódusaihoz.
!Controller osztályok publikus metódusaihoz.
Manager osztályok publikus metódusaihoz.
Kérdés: Mi határozza meg, hogy a browser címsorában lévő URI hova mutat az alkalmazásban?
Controllerek publikus metódusaihoz futnak be.
!Routing szabályokkal kell megadni.
A Contextben kell megadni.
Kérdés: MVC - Hogyan tud egy View értékeket visszaadni egy Controllernek?
!FormCollection segítségével.
QueryString segítségével.
ViewModel postolásával.
Kérdés: Miért előnyös az IQueryable interfész használata?
Mert így az adatbázisba nem kell külön elmenteni az adatokat, ez azonnal megtörténik.
!Mert Query Object pattern megvalósítás miatt, csak a lekérdezést tárolja, késői kiértékelés lehetséges.
Mert így azonnal rendelkezésre áll az egész halmaz, igaz több adat kerülhet átvitelre.

View File

@ -0,0 +1,159 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Quiz Results</title>
<style>
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background: linear-gradient(to right, #6a11cb, #2575fc);
color: #333;
padding: 20px;
margin: 0;
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
}
.container {
background-color: #ffffff;
width: 90%;
max-width: 900px;
padding: 30px;
border-radius: 10px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
overflow-y: auto;
max-height: 90vh;
}
.container::-webkit-scrollbar{
display: none;
}
h1 {
text-align: center;
color: #4CAF50;
margin-bottom: 20px;
}
h2 {
color: #333;
margin-top: 20px;
font-size: 1.5em;
}
p {
font-size: 1.1em;
}
ul {
list-style: none;
padding-left: 0;
}
li {
background-color: #f9f9f9;
border: 1px solid #ddd;
padding: 15px;
margin-bottom: 10px;
border-radius: 8px;
word-wrap: break-word;
}
li strong {
font-weight: bold;
color: #333;
}
.correct-answer {
color: #4CAF50;
}
.user-answer {
color: #FF5722;
}
.mistake-item {
background-color: #FFEBEE;
border: 1px solid #FFCDD2;
}
.no-mistakes {
text-align: center;
font-size: 1.2em;
color: #4CAF50;
}
a {
display: block;
text-align: center;
margin-top: 20px;
padding: 10px 20px;
background-color: #4CAF50;
color: white;
text-decoration: none;
border-radius: 5px;
font-size: 1.1em;
}
a:hover {
background-color: #45a049;
}
.button-container {
display: flex;
justify-content: center;
margin-top: 20px;
gap: 10px;
}
.action-button {
padding: 12px 20px;
background-color: #3498db;
color: white;
border: none;
border-radius: 8px;
font-size: 1.2em;
cursor: pointer;
text-transform: uppercase;
letter-spacing: 1px;
transition: background-color 0.3s ease, transform 0.2s ease;
width: 48%;
}
.action-button:hover {
background-color: #2980b9;
transform: scale(1.05);
}
.action-button:active {
transform: scale(0.98);
}
</style>
</head>
<body>
<div class="container">
<h1>Programozás .Net ben</h1>
<p>Here are all the questions that will appear in the quiz!</p>
<ul>
{% for question in questions %}
<li>
<strong>{{ question['question'] }}</strong><br>
{% for correct in question['correct_answers'] %}
<ul>
<li><strong class="correct-answer">{{correct}}</strong></li>
</ul>
{% endfor %}
</li>
{% endfor %}
</ul>
<div class="button-container">
<a href="{{ url_for('uni') }}" class="action-button">Exit to Home</a>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,130 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Portalfejlesztes .Net ben Quiz</title>
<style>
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background: linear-gradient(to right, #6a11cb, #2575fc);
color: #333;
padding: 20px;
margin: 0;
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
}
.container {
max-width: 600px;
background-color: white;
padding: 30px;
border-radius: 15px;
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2);
transform: scale(1);
transition: transform 0.3s ease-in-out;
}
h1 {
text-align: center;
color: #2C3E50;
font-size: 2.2em;
margin-bottom: 20px;
}
.question {
margin-bottom: 20px;
font-size: 1.3em;
font-weight: 600;
color: #34495e;
}
.answer-options {
margin-top: 15px;
}
.answer-options label {
display: block;
position: relative;
background: #ecf0f1;
padding: 10px 15px;
margin-bottom: 10px;
border-radius: 8px;
cursor: pointer;
transition: all 0.3s ease;
}
.answer-options label:hover {
background: #3498db;
color: white;
transform: translateX(5px);
}
.answer-options input {
display: none;
}
.answer-options input:checked + label {
background: #2ecc71;
color: white;
border: 2px solid #27ae60;
}
.submit-button {
display: block;
width: 100%;
padding: 12px;
background-color: #e74c3c;
color: white;
border: none;
border-radius: 8px;
font-size: 1.2em;
cursor: pointer;
text-transform: uppercase;
letter-spacing: 1px;
transition: background-color 0.3s ease, transform 0.2s ease;
margin-top: 15px;
}
.submit-button:hover {
background-color: #c0392b;
transform: scale(1.05);
}
.submit-button:active {
transform: scale(0.98);
}
.quit-button {
background-color: #95a5a6;
}
.quit-button:hover {
background-color: #7f8c8d;
}
</style>
</head>
<body>
<div class="container">
<h1>Question {{ question_index + 1 }} / 20</h1>
<p class="question">{{ question['question'] }}</p>
<form method="POST" action="{{ url_for('portalfejlesztes_net_ben.submit_answer') }}">
<div class="answer-options">
{% for answer in question['answers'] %}
<input type="checkbox" id="answer_{{ loop.index }}" name="answer" value="{{ answer }}">
<label for="answer_{{ loop.index }}">
{{ answer }}
</label>
{% endfor %}
</div>
<input type="hidden" name="question_index" value="{{ question_index }}">
<input type="submit" value="Next" class="submit-button">
</form>
<form method="GET" action="{{ url_for('portalfejlesztes_net_ben.result') }}">
<button type="submit" class="submit-button quit-button">Quit</button>
</form>
</div>
</body>
</html>

View File

@ -0,0 +1,173 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Quiz Results</title>
<style>
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background: linear-gradient(to right, #6a11cb, #2575fc);
color: #333;
padding: 20px;
margin: 0;
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
}
.container {
background-color: #ffffff;
width: 90%;
max-width: 900px;
padding: 30px;
border-radius: 10px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
overflow-y: auto;
max-height: 90vh;
}
.container::-webkit-scrollbar{
display: none;
}
h1 {
text-align: center;
color: #4CAF50;
margin-bottom: 20px;
}
h2 {
color: #333;
margin-top: 20px;
font-size: 1.5em;
}
p {
font-size: 1.1em;
}
ul {
list-style: none;
padding-left: 0;
}
li {
background-color: #f9f9f9;
border: 1px solid #ddd;
padding: 15px;
margin-bottom: 10px;
border-radius: 8px;
word-wrap: break-word;
}
li strong {
font-weight: bold;
color: #333;
}
.correct-answer {
color: #4CAF50;
}
.user-answer {
color: #FF5722;
}
.mistake-item {
background-color: #FFEBEE;
border: 1px solid #FFCDD2;
}
.no-mistakes {
text-align: center;
font-size: 1.2em;
color: #4CAF50;
}
a {
display: block;
text-align: center;
margin-top: 20px;
padding: 10px 20px;
background-color: #4CAF50;
color: white;
text-decoration: none;
border-radius: 5px;
font-size: 1.1em;
}
a:hover {
background-color: #45a049;
}
.button-container {
display: flex;
justify-content: center;
margin-top: 20px;
gap: 10px;
}
.action-button {
padding: 12px 20px;
background-color: #3498db;
color: white;
border: none;
border-radius: 8px;
font-size: 1.2em;
cursor: pointer;
text-transform: uppercase;
letter-spacing: 1px;
transition: background-color 0.3s ease, transform 0.2s ease;
width: 48%;
}
.action-button:hover {
background-color: #2980b9;
transform: scale(1.05);
}
.action-button:active {
transform: scale(0.98);
}
</style>
</head>
<body>
<div class="container">
<h1>Quiz Results</h1>
<p><strong>Score:</strong> {{ score }} out of {{ total }}</p>
<h2>Mistakes</h2>
{% if mistakes %}
<ul>
{% for mistake in mistakes %}
<li class="mistake-item">
<strong>Question:</strong> {{ mistake.question }}<br>
<strong class="user-answer">Your Answer:</strong> {{ mistake.user_answer }}<br>
<strong class="correct-answer">Correct Answer:</strong> {{ mistake.correct_answer }}<br>
</li>
{% endfor %}
</ul>
{% else %}
<p class="no-mistakes">No mistakes!</p>
{% endif %}
<h2>All Answers</h2>
<ul>
{% for question, answer in questions_with_answers %}
<li>
<strong>{{ question['question'] }}</strong><br>
<strong class="user-answer">Your Answer:</strong> {{ answer }}<br>
<strong class="correct-answer">Correct Answer:</strong> {{ question['correct_answers'] }}<br>
</li>
{% endfor %}
</ul>
<div class="button-container">
<a href="{{ url_for('portalfejlesztes_net_ben.restart') }}" class="action-button">Restart Quiz</a>
<a href="{{ url_for('uni') }}" class="action-button">Exit to Home</a>
</div>
</div>
</body>
</html>

220
static/css/main.css Normal file
View File

@ -0,0 +1,220 @@
/* General Reset */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background: linear-gradient(to right, #5a0fb8, #1f65d6);
color: #fff;
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
overflow-x: hidden;
}
.container {
display: flex;
flex-direction: column;
width: 90%;
max-width: 1200px;
background: rgba(255, 255, 255, 0.1);
border-radius: 16px;
overflow: hidden;
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.4);
}
/* Header Section */
.header {
display: flex;
flex-direction: column;
align-items: center;
padding: 20px;
background: rgba(0, 0, 0, 0.7);
}
.header .brand {
font-family: 'Lucida Handwriting', cursive;
font-size: 2rem;
background: linear-gradient(to right, #5a0fb8, #1f65d6);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.6);
}
.header .name {
font-size: 1.2rem;
color: #ccc;
margin-top: 5px;
}
.header nav {
display: flex;
margin-top: 15px;
position: relative;
}
.header nav a {
position: relative;
color: #fff;
text-decoration: none;
font-size: 1rem;
font-family: 'Orbitron', sans-serif;
padding: 12px 30px;
display: inline-block;
clip-path: polygon(15% 0, 100% 0, 85% 100%, 0 100%);
background: rgba(255, 255, 255, 0.1);
border: 1px solid rgba(255, 255, 255, 0.3);
transition: all 0.3s ease;
text-align: center;
margin-right: -15px;
width: 10ch;
}
.header nav a:hover {
background: rgba(255, 255, 255, 0.3);
border-color: rgba(255, 255, 255, 0.5);
color: #5a0fb8;
transform: scale(1.05);
}
@media (max-width: 768px) {
.header nav {
flex-wrap: wrap;
justify-content: center;
}
.header nav a {
margin-right: -15px;
margin-bottom: 5px;
}
}
/* Main Section */
.main {
display: flex;
flex-direction: column;
padding: 40px 20px;
gap: 20px;
text-align: center;
}
.main .intro {
font-size: 1.3rem;
line-height: 1.8;
margin-bottom: 20px;
color: #f0f0f0;
}
.main .quote {
font-family: 'Playfair Display', serif;
font-size: 2rem;
font-style: italic;
color: #fff;
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4);
}
.main .author {
font-size: 1.2rem;
margin-top: 10px;
color: #ccc;
}
.main .card-container {
display: flex;
flex-wrap: wrap;
gap: 20px;
}
.main .card {
background: rgba(255, 255, 255, 0.2);
padding: 20px;
border-radius: 12px;
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.2);
flex: 1 1 calc(33.333% - 20px);
max-width: calc(33.333% - 20px);
display: flex;
flex-direction: column;
justify-content: space-between;
transition: transform 0.3s ease, box-shadow 0.3s ease;
}
.main .card:hover {
transform: translateY(-10px);
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.4);
}
.main .card img {
width: 100%;
height: 150px;
object-fit: cover;
border-radius: 8px;
margin-bottom: 10px;
}
.main .card h3 {
margin-bottom: 5px;
font-size: 1.2rem;
}
.main .card .date {
font-size: 0.9rem;
color: #ccc;
margin-bottom: 10px;
}
.main .card p {
font-size: 0.9rem;
line-height: 1.4;
flex-grow: 1;
}
.main .card a {
display: inline-block;
margin-top: 10px;
padding: 10px 15px;
color: #fff;
text-decoration: none;
font-size: 0.9rem;
border-radius: 8px;
background: linear-gradient(to right, #5a0fb8, #1f65d6);
transition: background 0.3s ease;
}
.main .card a:hover {
background: linear-gradient(to right, #1f65d6, #5a0fb8);
}
@media (max-width: 768px) {
.main .card {
flex: 1 1 calc(50% - 20px);
max-width: calc(50% - 20px);
}
}
@media (max-width: 480px) {
.main .card {
flex: 1 1 100%;
max-width: 100%;
}
}
/* Footer Section */
.footer {
text-align: center;
padding: 20px;
background: rgba(0, 0, 0, 0.7);
font-size: 0.9rem;
}
.footer a {
color: #5a0fb8;
text-decoration: none;
}
.footer a:hover {
text-decoration: underline;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

1
templates/about.html Normal file
View File

@ -0,0 +1 @@
{% extends "main.html" %}

1
templates/git.html Normal file
View File

@ -0,0 +1 @@
{% extends "main.html" %}

35
templates/home.html Normal file
View File

@ -0,0 +1,35 @@
{% extends "main.html" %}
{% block content %}
<main class="main">
<div class="intro">
Welcome to my portfolio! I'm a passionate Computer Science Engineer dedicated to crafting innovative and efficient digital solutions.
Feel free to explore my projects, read my blogs, and learn more about me and my work.
</div>
<div class="quote">"Programs must be written for people to read, and only incidentally for machines to execute."</div>
<div class="author"> Harold Abelson</div>
<div class="card-container">
<div class="card">
<img src="profile.jpg" alt="Post Image">
<h3>Post Title 1</h3>
<div class="date">January 5, 2025</div>
<p>Explore the basics of computer science and its applications in the modern world.</p>
<a href="#post1">Read More</a>
</div>
<div class="card">
<img src="profile.jpg" alt="Post Image">
<h3>Post Title 2</h3>
<div class="date">January 6, 2025</div>
<p>Dive into advanced programming concepts and learn the secrets of clean code.</p>
<a href="#post2">Read More</a>
</div>
<div class="card">
<img src="profile.jpg" alt="Post Image">
<h3>Post Title 3</h3>
<div class="date">January 7, 2025</div>
<p>Discover the latest trends in AI and machine learning and their impact on society.</p>
<a href="#post3">Read More</a>
</div>
</div>
</main>
{% endblock %}

33
templates/main.html Normal file
View File

@ -0,0 +1,33 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>My Portfolio</title>
<link href="https://fonts.googleapis.com/css2?family=Orbitron:wght@400;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="{{ url_for('static', filename='css/main.css') }}">
</head>
<body>
<div class="container">
<!-- Header Section -->
<header class="header">
<div class="brand">Computer Science Engineer</div>
<div class="name">Máté Gosztolya's personal website</div>
<nav>
<a href="{{ url_for('home') }}">Home</a>
<a href="{{ url_for('git') }}">Git</a>
<a href="{{ url_for('projects') }}">Projects</a>
<a href="{{ url_for('uni') }}">UNI</a>
<a href="{{ url_for('about') }}">About</a>
</nav>
</header>
{% block content %}{% endblock %}
<footer class="footer">
© 2025 Máté Gosztolya's Portfolio. All rights reserved. | <a href="#contact">Get in Touch</a>
</footer>
</div>
</body>
</html>

1
templates/projects.html Normal file
View File

@ -0,0 +1 @@
{% extends "main.html" %}

54
templates/uni/uni.html Normal file
View File

@ -0,0 +1,54 @@
{% extends "main.html" %}
{% block content%}
<style>
.card-buttons {
display: flex;
justify-content: center;
gap: 20px;
margin-top: 15px;
}
.card-buttons .btn {
padding: 12px 24px;
font-size: 1rem;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
text-transform: uppercase;
color: #fff;
border: none;
border-radius: 8px;
cursor: pointer;
transition: transform 0.3s ease, background 0.3s ease;
width: 100%;
max-width: 160px;
}
.card-buttons .btn {
background: linear-gradient(to right, #5a0fb8, #1f65d6);
}
.card-buttons .btn:hover {
background: linear-gradient(to right, #1f65d6, #5a0fb8);
transform: scale(1.05);
}
</style>
<main class="main">
<div class="card">
<img src="{{ url_for('static', filename='images/uni/portalfejlesztes-logo.png')}}" alt="Post Image">
<h3>Portálfejlesztés .Net ben</h3>
<div class="date">January 10, 2025</div>
<p>
This test is made for SZE University students to practice. Be aware that the test might become outdated
as the course material may change in the future. In case of modifications or incorrect answers, please contact me!
</p>
<div class="card-buttons">
<form method="GET" action="{{ url_for('portalfejlesztes_net_ben.allquestions') }}">
<button class="btn display-questions" type="submit">Display Questions</button>
</form>
<form method="POST" action="{{ url_for('portalfejlesztes_net_ben.quiz') }}">
<button class="btn start-quiz" type="submit">Start Quiz</button>
</form>
</div>
</div>
</main>
{% endblock %}