diff --git a/gui/index.html b/gui/index.html new file mode 100644 index 0000000..da5d27e --- /dev/null +++ b/gui/index.html @@ -0,0 +1,37 @@ + + + + + + + + + + + Document + + + + + +
+

Найдите себя и нажмите получить тест:

+

+ + +

+ +
+ + + + + + \ No newline at end of file diff --git a/gui/main.js b/gui/main.js new file mode 100644 index 0000000..b09ca6b --- /dev/null +++ b/gui/main.js @@ -0,0 +1,102 @@ +document.addEventListener("DOMContentLoaded", function () { + // console.log("ok") + var students_selector = document.getElementById("students-selector") + var get_quiz_button = document.getElementById("get-quiz") + + fetch("http://localhost:8000/students") + .then(r => r.json()) + .then(students => { + students.forEach(student => { + students_selector.innerHTML += `` + }) + students_selector.addEventListener("change", function (e) { + get_quiz_button.disabled = false + }, + { once: true } + ) + }) + + get_quiz_button.addEventListener("click", function () { + // console.log(students_selector.value) + // console.log(students_selector.options[students_selector.selectedIndex].text) + fetch('http://localhost:8000/get_quiz?' + new URLSearchParams({ + student_id: students_selector.value, + student: students_selector.options[students_selector.selectedIndex].text + })) + .then(r => r.json()) + .then(quiz => { + // console.log(quiz) + var questions = quiz.questions + + var questions_html = "
" + questions.forEach(q => { + console.log(q) + if (q.options) { + let options_div = "" + q.options.forEach(o => { + options_div += + `
+ + +
` + }) + const question_div = + `
+ Выберите ответ: + ${options_div} +
` + questions_html += + `
+

${q.question}

+ ${q.picture ? `` : ""} + ${question_div} +
` + } else { + const question_div = `` + questions_html += + `
+

${q.question}

+ ${q.picture ? `` : ""} + ${question_div} +
` + } + }) + // console.log(questions_html) + questions_html += "
" + document.getElementById("header").innerHTML = `

Тестирование

${students_selector.options[students_selector.selectedIndex].text}

` + document.getElementById("main").innerHTML = questions_html + + var button = document.createElement('button'); + button.innerHTML = 'Сдать'; + button.onclick = function () { + const form = document.getElementById('form'); + const formData = new FormData(form); + console.log(formData) + for (const [key, value] of formData) { + console.log(quiz) + console.log(`${key}: ${value}\n`) // assume questions are in the same order - can it make code simplier? + quiz.questions.find(q => q.id == key).student_answer = value + // console.log(quiz) + } + fetch('http://localhost:8000/save_student_answers?' + new URLSearchParams({ + student_answers: JSON.stringify(quiz) + })) + document.getElementById("main").innerHTML = "

Тестирование окончено

" + }; + // where do we want to have the button to appear? + // you can append it to another element just by doing something like + // document.getElementById('foobutton').appendChild(button); + document.getElementById("main").appendChild(button) + }) + }) + + document.getElementById("end-quiz").addEventListener("click", function() { + let pass = window.prompt("Уважаемый преподаватель, введите пароль, чтобы завершить тестирование для всех", "Я здесь случайно") + // console.log(pass) + fetch('http://localhost:8000/end_quiz?' + new URLSearchParams({ + password: pass + })) + .then(r => r.text()) + .then(text => window.alert(text)) + }) +}) \ No newline at end of file diff --git a/main.py b/main.py index beb05e0..d0af72b 100644 --- a/main.py +++ b/main.py @@ -1,5 +1,6 @@ from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware # CORS +from fastapi.staticfiles import StaticFiles import json import random from pathlib import Path @@ -64,6 +65,7 @@ def check_answers(student_answers: dict): checked_answers["correct_percent"] = round(checked_answers["correct"] * 100 / len(checked_answers["questions"])) return checked_answers + @app.get("/students") def show_students(): return students @@ -134,4 +136,8 @@ def end_test(password: str): return(f"Тестирование завершено. Сводные результаты сохранены в {results_path.resolve()}") else: return("Неверный пароль") + +app.mount("/", StaticFiles(directory="gui", html = True), name="gui") # must be after method since it uses them + + \ No newline at end of file