Changeset 3c5605e in flexograder
- Timestamp:
- 02/23/26 11:01:31 (7 days ago)
- Branches:
- main
- Children:
- 4d2dd3a
- Parents:
- d00fc86
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
README.md
rd00fc86 r3c5605e 9 9 Alle Komponenten sind leichtgewichtig, transparent und portabel. 10 10 11 # Projektrichtlinien 12 13 - Minimale, auditierbare JavaScript-Logik 14 - Vollständig portable und selbstenthaltende Prüfungen 15 - Keine Framework-Abhängigkeiten 16 11 17 # Komponenten 12 18 13 Das System besteht aus drei unabhängig nutzbaren Werkzeugen:19 Das System besteht aus drei unabhängig nutzbaren Komponenten: 14 20 15 | Werkzeug | Zweck | Technologie|16 |------------- |-------------------------------------------------------------------------------------------------------------|---------------------------|17 | ` builder` | Erstellen und Exportieren von Prüfungsfragen | Python (Tkinter)|18 | ` generator` | Generierte statisches HTML anhand einer json/Beschreibung zur Durchführung der Prüfung im Browser (offline) | PYTHON/HTML/CSS/JS|19 | ` evaluator` | Auswertung der Antworten & Statistiken | Python (CLI/GUI)|21 | Komponente | Zweck | Technologie | 22 |-------------------|----------------------------------------------|-----------------| 23 | `Exam builder` | Erstellen und Exportieren von Prüfungsfragen | Python(Tkinter) | 24 | `isolierter Test` | isolierte Testdurchführung | HTML/JS/CSS | 25 | `Evaluator` | Auswertung der Antworten & Statistiken | Python | 20 26 21 27 Alle Werkzeuge arbeiten lokal, ohne Netzwerkanbindung oder zentrale 22 28 Server. 23 29 24 # builder: Frageneditor & Export30 # Exam builder: Manager für Fragenkataloge und Examen 25 31 26 Das Python-GUI-Tool erlaubt Prüfern:32 Das Tool erlaubt Prüfern: 27 33 28 34 - Aufbau eines Fragenkatalogs zur Wiederverwendung 29 35 - Zuweisung von Metadaten pro Frage: 30 - `domain` (z. B. „Elektronik“)31 - `topic` (z. B. „Spannungsteiler“)32 - ` difficulty` (1 = leicht, 5 = schwer)36 - `domain` (z. B. "ELINT") 37 - `topic` (z. B. "Grundlagen Elektrotechnik") 38 - `subtopic` ("Spannungsteiler") 33 39 - Einbindung von Bildern, Video- oder Audiodateien 34 - Export ausgewählter Fragen als Archiv mit: 35 - `exam.json` 36 - zugehörigen Medien (`/media/images/`, `/media/audio/`, 37 `/media/video/`) 40 - Export ausgewählter Fragen: 41 - als json-Katalog 42 - mit Verweis auf zugehörige Medien (`/media/images/`, 43 `/media/audio/`, `/media/video/`) 44 - Erzeugung eines statischen HTML-/JavaScript-Prüfungsclients, lauffähig 45 ohne Server: 46 - Startbar direkt im Browser (USB-Stick, CD, Airgap-Systeme) 47 - Keine Internetverbindung oder Anmeldung erforderlich 38 48 39 # generator: Generiert offline-Prüfungsumgebung im Browser 40 41 Erzeugt statischen HTML-/JavaScript-Prüfungsclient, lauffähig ohne 42 Server: 43 44 - Startbar direkt im Browser (USB-Stick, CD, Airgap-Systeme) 45 - Keine Internetverbindung oder Anmeldung erforderlich 49 # Isolierter Test 46 50 47 51 ****Funktionen:**** … … 50 54 - Unterstützte Fragetypen: 51 55 - Einfachauswahl (Radio) 52 - Mehrfachauswahl (Multiple_Choice) 53 - Freitextantwort 56 - Mehrfachauswahl (Checkbox) 54 57 - optional Bild-, Video- oder Audiowiedergabe pro Frage 55 58 - Eingabe von PersDat 56 59 - Antworten werden am Ende des Tests im json-Format heruntergeladen 57 60 58 # Beispiel: Antwortdatei 59 60 ``` json 61 { 62 "meta": { 63 "test_id": "ET-2025-09-001", 64 "test_name": "Elektrotechnik", 65 "created_on": "2025-09-17T08:30:00Z", 66 "candidate_name": "Enrico Schwass", 67 "candidate_id": "12345678", 68 "submitted_at": "2025-09-23T15:55:51.158Z" 69 }, 70 "answers": [ 71 { 72 "id": "candidate_id", 73 "fields": [ 74 { 75 "name": "last_name", 76 "value": "Schwass" 77 }, 78 { 79 "name": "first_name", 80 "value": "Enrico" 81 }, 82 { 83 "name": "personal_id", 84 "value": "12345678" 85 } 86 ] 87 }, 88 { 89 "id": "TB801", 90 "value": "A" 91 }, 92 { 93 "id": "TB802", 94 "value": "D" 95 }, 96 { 97 "id": "TB803", 98 "value": "D" 99 }, 100 { 101 "id": "TB804", 102 "value": [ 103 "C", 104 "B" 105 ] 106 }, 107 { 108 "id": "TB805", 109 "value": "A" 110 }, 111 { 112 "id": "TB806", 113 "value": "B" 114 }, 115 { 116 "id": "TB807", 117 "value": "B" 118 } 119 ] 120 } 121 ``` 122 123 # evaluator: Auswertung & Statistik 61 # Evaluator: Auswertung & Statistik 124 62 125 63 Ein Python-Tool zur Auswertung eingereichter Antworten. … … 140 78 - PDF als Zertifikat 141 79 142 # Datenstruktur: Examen (`exam.json`)80 # Beispiel für Examen 143 81 144 ``` json 145 { 146 "meta": { 147 "title": "Elektrotechnik", 148 "duration": "30 Minuten", 149 "allowed_aids": "keine", 150 "headline": "DATAV Schutzbereich 2, 10039691S", 151 "intro_note": "Bitte lesen Sie jede Frage sorgfältig und beachten Sie die Hinweise.", 152 "submit_note": "Sie können Ihre Antworten jetzt einreichen. Eine spätere Änderung ist nicht mehr möglich.", 153 "exam_id": "ET-2025-09-001", 154 "created_on": "2025-09-17T08:30:00Z", 155 "created_by": "OSF Schwass" 156 }, 157 "pages": [ 158 { 159 "title": "Personaldaten", 160 "questions": [ 161 { 162 "id": "candidate_id", 163 "type": "candidate_id", 164 "domain": "management", 165 "topic": "identification", 166 "text": "Bitte geben Sie Ihre Personaldaten ein:", 167 "fields": [ 168 { 169 "id": "last_name", 170 "label": "Nachname", 171 "validation": { 172 "required": true, 173 "maxlength": 30 174 } 175 }, 176 { 177 "id": "first_name", 178 "label": "Vorname", 179 "validation": { 180 "required": true, 181 "maxlength": 30 182 } 183 }, 184 { 185 "id": "personal_id", 186 "label": "Personalnummer", 187 "validation": { 188 "required": true, 189 "pattern": "^\\d{8}", 190 "maxlength": 8 191 } 192 } 193 ] 194 } 195 ] 196 }, 197 { 198 "title": "Seitenband", 199 "questions": [ 200 { 201 "id": "TB801", 202 "type": "radio", 203 "domain": "signals", 204 "topic": "forms", 205 "text": "Was ist der Unterschied zwischen AM und SSB?", 206 "options": [ 207 {"id": "A", "points": 1, "text": "AM hat einen Träger und zwei Seitenbänder, SSB arbeitet mit Trägerunterdrückung und einem Seitenband."}, 208 {"id": "B", "points": 0, "text": "AM hat einen Träger und ein Seitenband, SSB arbeitet mit Trägerunterdrückung und hat zwei Seitenbänder."}, 209 {"id": "C", "points": 0, "text": "AM hat keinen Träger und zwei Seitenbänder, SSB arbeitet mit Trägerunterdrückung und einem Seitenband."}, 210 {"id": "D", "points": 0, "text": "AM hat keinen Träger und zwei Seitenbänder, SSB arbeitet mit Träger und einem Seitenband."} 211 ] 212 }, 213 { 214 "id": "TB802", 215 "type": "radio", 216 "domain": "signals", 217 "topic": "forms", 218 "text": "Was ist der Unterschied zwischen LSB und USB?", 219 "options": [ 220 {"id": "A", "points": 1, "text": "LSB arbeitet mit Trägerunterdrückung und dem unteren Seitenband, USB arbeitet mit Trägerunterdrückung und dem oberen Seitenband."}, 221 {"id": "B", "points": 0, "text": "LSB arbeitet mit Träger und zwei Seitenbändern, USB arbeitet mit Trägerunterdrückung und einem Seitenband."}, 222 {"id": "C", "points": 0, "text": "LSB arbeitet mit Träger und einem Seitenband, USB arbeitet mit Trägerunterdrückung und beiden Seitenbändern."}, 223 {"id": "D", "points": 0, "text": "LSB arbeitet mit Trägerunterdrückung und dem oberen Seitenband, USB arbeitet mit Trägerunterdrückung und dem unteren Seitenband."} 224 ] 225 } 226 ] 227 }, 228 { 229 "title": "Modulation", 230 "questions": [ 231 { 232 "id": "TB803", 233 "type": "radio", 234 "domain": "signals", 235 "topic": "forms", 236 "text": "Welche Aussage über modulierte Signale ist richtig?", 237 "options": [ 238 {"id": "A", "points": 1, "text": "Bei FM ändert sich die Amplitude des Sendesignals bei Modulation nicht."}, 239 {"id": "B", "points": 0, "text": "Bei SSB ändert sich die Amplitude des Sendesignals bei Modulation nicht."}, 240 {"id": "C", "points": 0, "text": "Bei FM ändert sich die Amplitude des Sendesignals bei Modulation im Rhythmus der Sprache."}, 241 {"id": "D", "points": 0, "text": "Bei AM ändert sich die Amplitude des Sendesignals bei Modulation nicht."} 242 ] 243 }, 244 { 245 "id": "TB804", 246 "type": "multiple_choice", 247 "domain": "signals", 248 "topic": "forms", 249 "text": "Welche der folgenden Antworten beschreiben Modulationsverfahren?", 250 "options": [ 251 {"id": "A", "points": 1, "text": "FM"}, 252 {"id": "B", "points": 1, "text": "AM"}, 253 {"id": "C", "points": 1, "text": "QAM"}, 254 {"id": "D", "points": 0, "text": "PSK"} 255 ] 256 } 257 ] 258 }, 259 { 260 "title": "Strassenverkehr", 261 "questions": [ 262 { 263 "id": "TB805", 264 "type": "radio", 265 "domain": "traffic", 266 "topic": "right of way", 267 "text": "Welches Fahrzeug verhaelt sich falsch??", 268 "options": [ 269 {"id": "A", "points": 1, "text": "Das rote"}, 270 {"id": "B", "points": 0, "text": "Das blaue"} 271 ], 272 "media": [{"type": "image", "src": "media/Vorfahrt.png"}] 273 } 274 ] 275 }, 276 { 277 "title": "Signale", 278 "questions": [ 279 { 280 "id": "TB806", 281 "type": "radio", 282 "domain": "signals", 283 "topic": "sound", 284 "text": "Was hoeren Sie?", 285 "options": [ 286 {"id": "A", "points": 0, "text": "Fernschreiber"}, 287 {"id": "B", "points": 1, "text": "Tastfunk"} 288 ], 289 "media": [{"type": "audio", "src": "media/Code_40.mp3"}] 290 }, 291 { 292 "id": "TB807", 293 "type": "radio", 294 "domain": "signals", 295 "topic": "visual", 296 "text": "Was sehen Sie?", 297 "options": [ 298 {"id": "A", "points": 0, "text": "Fernschreiber"}, 299 {"id": "B", "points": 1, "text": "Stoerungen"} 300 ], 301 "media": [{"type": "video", "src": "media/spectrum.mp4"}] 302 } 303 ] 304 } 305 ] 306 } 307 ``` 82 [file:../examples/exams/KIZG_EXAM.json](../examples/exams/KIZG_EXAM.json) 308 83 309 # Projektziele84 # Beispiel für Antwortdatei 310 85 311 - Minimale, auditierbare JavaScript-Logik 312 - Vollständig portable und selbstenthaltende Prüfungen 313 - Keine Framework-Abhängigkeiten 86 [file:../examples/exams/GENERAL-C251110-B854C645BF40@001D-12345678-2026-02-20T09-20-46.452Z.json](../examples/exams/GENERAL-C251110-B854C645BF40@001D-12345678-2026-02-20T09-20-46.452Z.json) 314 87 315 # Optionale Erweiterungen88 # Beispiel für Fragenkatalog 316 89 317 - Git-Versionierung von Fragen 318 - Feedback-Auswertung pro Thema 319 - Anpassbares Layout/CSS 90 [file:../catalogs/radio.json](../catalogs/radio.json) 320 91 321 92 # Lizenz
Note:
See TracChangeset
for help on using the changeset viewer.
