尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗nmt.in.ua — тренажер підготовки до НМТ з математики. Учень проходить діагностику, тренується за темами і на офіційних варіантах, бачить прогрес і отримує наступний крок. Викладач веде своїх учнів, призначає тести і читає результати. Адмін тримає банк завдань, профілі й денні марафони.
Кабінет учня безкоштовний: реєстрація за хвилину, без картки. Інтерфейс українською, англійською і німецькою, зручний з телефона.
| 20+ | тем сертифікаційної роботи |
| 13 | офіційних варіантів НМТ у симуляторі |
| 1 | підручник зі змістом за темами |
Окремий кабінет після реєстрації з роллю «викладач». Публічна сторінка викладача живе за адресою /t/slug.
/join.Адмін входить тим самим логіном. На головній замість тренажера — редактор банку.
/settings: теми, зв’язки тем, тести і за бажанням задачник. Одна транзакція на весь файл.Свій акаунт з адмінки забанити або видалити не можна.
| Сторінка | Адреса | Хто |
|---|---|---|
| Вітальна | /welcome | усі |
| Діагностика | /diagnostic | усі, без акаунта |
| Реєстрація | /register | гість, учень або викладач |
| Вхід | /login | гість |
| Тест за темою | /topic | учень |
| Симулятор | /simulator | учень |
| Підручник | /materials/textbook | учень |
| Задачник | /problems | учень |
| Результати і сесії | /results, /sessions | учень; викладач бачить клас |
| Мої учні | /students | викладач, адмін |
| Призначити тест | /assign | викладач, адмін |
| Консультації | /consultations | учень пише, викладач читає чергу |
| Візитка | /t/{slug} | усі, якщо опублікована |
| Профілі | /profiles | адмін |
| Імпорт | /settings | адмін |
| Відгуки | /feedback | адмін |
| Марафони | /admin/marathons | адмін |
Новому учаснику команди варто почати з гіда онбордингу. Беклог — docs/Goldener-Rechner-beklog-PM.md. Пам’ятка релізу — .cursor/rules/deploy-hosting.mdc.
Потрібні Node.js 20+ і npm. Працюйте з гілки dev: у main напряму не пушимо, merge в main одразу деплоїть хостинг.
git clone https://github.com/tony-kobs/nmt.in.ua.git
cd nmt.in.ua
git checkout dev
npm install
cp .env.example .env.local
npm run dev
Локально сайт відкриється на http://localhost:3000.
| Команда | Що робить |
|---|---|
npm run dev | локальна розробка |
npm run build | продакшен-збірка |
npm start | зібраний сайт через server.js |
npm test | unit-тести |
npm run lint | ESLint |
npm run migrate | SQL-міграції |
Демо-логінів немає. Тестовий акаунт — через /register. Адміна підвищують у базі: node scripts/promote-admin.mjs <login>.
Секрети живуть у .env.local (локально) або .env.production (хостинг). У git їх немає.
| Змінна | Призначення |
|---|---|
DB_HOST, DB_PORT, DB_USER, DB_PASSWORD, DB_NAME | MySQL |
SESSION_SECRET | cookie nmt_session; без неї логін на проді падає |
NEXT_PUBLIC_SITE_URL | canonical URL |
SITE_URL | origin у листах підтвердження і скидання пароля |
BREVO_API_KEY | листи; без ключа локально текст іде в консоль |
CONTENT_IMPORT_API_KEY | Bearer для POST /api/import |
ADMIN_API_KEY | Bearer для POST /api/admin/sessions |
MAX_BODY_BYTES | ліміт тіла HTTP на server.js (дефолт 8 МіБ) |
TELEGRAM_BOT_TOKEN, TELEGRAM_BOT_USERNAME, TELEGRAM_WEBHOOK_SECRET | бот; без пари токен+username канал Telegram вимкнено |
TELEGRAM_SUPPORT_CHAT_ID | необов’язково, чат команди для звернень; той самий .env.production на хості |
Порожній ключ імпорту або адмін-API відхиляє всі такі запити (401).
Імпорт — одна форма за запит. CSV-поля: themes, themeConnections, quizTasks, опційно problems. JSON: file + format=json.
curl -X POST http://localhost:3000/api/import \
-H "Authorization: Bearer $CONTENT_IMPORT_API_KEY" \
-F "[email protected];type=text/csv" \
-F "themeConnections=@theme_connections.csv;type=text/csv" \
-F "quizTasks=@quiz_tasks.csv;type=text/csv"
Гілка фічі від свіжого dev, pull request у dev. Реліз: pull request dev → main.