🏗️ 1. סקירה כללית וארכיטקטורה
ארכיטקטורת המערכת — MVP
| שכבה | טכנולוגיה | תפקיד |
| Frontend | HTML + Vanilla JS + Tailwind | ממשקי משתמש (23 דפים) |
| Web Server | Caddy v2 | HTTPS, reverse proxy, static files |
| VPS | Hostinger 8GB RAM | IP: 76.13.2.214, Ubuntu |
| Storage | localStorage (client-side) | הגדרות, נתונים, sessions |
| Grading API | Google Apps Script | שליחת תוצאות ל-Google Sheets |
| DNS | Porkbun (volxim.com) | math.volxim.com → VPS |
ℹ️
הבהרה: ב-MVP, אין backend/DB מרכזי. כל הנתונים מאוחסנים ב-localStorage בדפדפן. זה מספק הפרדה טבעית — כל מורה/תלמיד רואה רק את הנתונים שלו. בשלב 2 (Supabase) תתווסף הפרדה ברמת שרת.
תרשים רכיבים
Browser (Teacher/Admin/Student)
│
├── HTTPS (TLS 1.3) ──► Caddy (port 80/443)
│ │
│ ├── /exam_system/admin.html [Admin Dashboard]
│ ├── /exam_system/exam.html [Student Exam]
│ ├── /exam_system/chatbot.html [Knowledge Bot]
│ └── ... (23 pages total)
│
└── Google Apps Script ──► Google Sheets (Exam Results)
📄 3. מחזור חיי תוכן (Content Lifecycle)
Draft
→
Pending Approval
→
Approved
→
Published
→
Archived
Pending Approval
→
Rejected
→
Draft (חוזר לעריכה)
כללים
- מורה יוצר תוכן → סטטוס
Draft
- מורה שולח לאישור → סטטוס
Pending Approval
- מנהל מאשר/דוחה + מוסיף הערות →
Approved / Rejected
- מנהל מפרסם →
Published (נגיש לתלמידים)
- תוכן ישן →
Archived (לא ניתן לגישה, נשמר לתיעוד)
- כל מעבר סטטוס מתועד ביומן פעולות עם חותמת זמן ושם מבצע
מימוש
טאב "אישור תכנים" ב-admin.html — טבלה עם סינון לפי סטטוס/סוג, מודל שינוי סטטוס עם הערות, שליטה בנראות פתרונות, ו-scheduled release.
🔐 4. אימות והזדהות (Authentication)
דשבורד מנהל — 2FA
| שלב | מנגנון | פרטים |
| שלב 1 | סיסמה | סיסמת מנהל (ניתנת לשינוי בהגדרות) |
| שלב 2 | OTP (Time-based) | קוד 6 ספרות, תקף 5 דקות, נוסחה: floor(now/60000)*7 % 1000000 |
| נעילה | Lockout | 3 ניסיונות כושלים → נעילה ל-15 דקות |
| Session | sessionStorage | נמחק בסגירת טאב, ללא persistence |
🚨
מגבלות MVP: OTP נוצר בצד הלקוח (לא SMS/Email חיצוני). מספיק לסביבה חינוכית סגורה אך לא מתאים לסביבת production פתוחה.
שלב 2: Supabase Auth + JWT + Email OTP / Magic Link.
דשבורד מורה
כרגע — גישה פתוחה. בשלב 2 תתווסף הזדהות.
מבחנים (תלמידים)
הזדהות בטופס הרשמה: שם פרטי + שם משפחה + כיתה + קוד מבחן. הקוד מונע גישה בלתי מורשית.
🛡️ 8. אנטי-העתקה במבחנים
| # | מנגנון | תיאור | סטטוס |
| 1 | Seeded PRNG | כל תלמיד מקבל סדר שאלות ייחודי לפי hash של השם+כיתה | פעיל |
| 2 | Question Shuffle | שאלות מעורבלות בתוך כל קטגוריה (שברים, כפל) | פעיל |
| 3 | Answer Shuffle | סדר אפשרויות התשובה מעורבל (שאלות אמריקאיות) | פעיל |
| 4 | Version Badge | קוד גרסה 3-ספרות בממשק — מאפשר למורה לזהות גרסאות | פעיל |
| 5 | Anti-Copy | חסימת right-click, Ctrl+C/V/A, CSS user-select:none | פעיל |
| 6 | Tab Switch Detection | זיהוי מעבר בין טאבים + באנר אדום + דיווח | פעיל |
| 7 | Suspicion Flagging | 5+ תשובות ב-10 שניות → דגל חשוד + נקודה כתומה | פעיל |
נתונים שנשלחים למורה (Google Sheets)
{
versionCode: "417",
seed: 2847156,
questionOrder: [3,1,5,2,4,...],
tabSwitches: 2,
suspiciousActivity: "לא",
timestamp: "2026-02-22T10:45:30"
}
🤖 9. מדיניות צ׳אטבוט — 3 Strikes
תהליך
- Strike 1: שאלה לא רלוונטית → הודעת אזהרה ידידותית
- Strike 2: שאלה נוספת לא רלוונטית → אזהרה חמורה יותר
- Strike 3: ניסיון שלישי → חסימה אוטומטית + הודעה למנהל
הודעת ברירת מחדל
"אני בוט שנותן מענה רק על תוכן האתר math.volxim.com. אם יש לך שאלה על שברים, כפל מאונך או שימוש במערכת — אשמח לעזור! 😊"
localStorage Keys
| מפתח | תוכן |
chatbot_history | היסטוריית שיחה מלאה (שחזור בטעינה מחדש) |
chatbot_blocked | true/false — סטטוס חסימה |
chatbot_blocked_time | חותמת זמן חסימה |
chatbot_abuse_log | לוג ניסיונות סטייה מפורט |
admin_alerts | התראות שנשלחות לדשבורד מנהל |
שחרור חסימה
מנהל → טאב "התראות אבטחה" ב-admin.html → רשימת משתמשים חסומים → כפתור "שחרר".