ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
Подготовка к экзаменам DİM на основе статистики. Next.js 16 (App Router) + TypeScript + Tailwind 4 + Turso (libSQL) + Drizzle + Auth.js v5. Письма в разработке не отправляются: EMAIL_PROVIDER=console печатает их в терминал npm run dev и сохраняет в .dev-mail/ (ссылки подтверждения и сброса пароля берите оттуда). 2vur2.az (регистратор online.az) подключён к проекту imtahan-app; www.2vur2.az → 308 на `2vur2.a檢視完整 README ↗
Подготовка к экзаменам DİM на основе статистики. Next.js 16 (App Router) + TypeScript + Tailwind 4 + Turso (libSQL) + Drizzle + Auth.js v5.
cp .env.example .env.local # заполнить значения (см. ниже)
npm install
npm run db:migrate # применить миграции к Turso
npm run dev # http://localhost:3000
Письма в разработке не отправляются: EMAIL_PROVIDER=console печатает их в терминал npm run dev и сохраняет в .dev-mail/ (ссылки подтверждения и сброса пароля берите оттуда).
| Команда | Что делает |
|---|---|
npm run dev / build / start | Next.js |
npm run lint / typecheck / format | ESLint, TypeScript, Prettier |
npm test | Unit-тесты (Vitest) |
npm run test:e2e | E2E (Playwright в системном Google Chrome). Тестовые пользователи e2e+…@example.test удаляются после прогона |
npm run db:generate | Новая миграция из src/db/schema.ts → db/migrations/ |
npm run db:migrate / db:studio | Применить миграции / открыть Drizzle Studio |
| Переменная | Назначение |
|---|---|
TURSO_DATABASE_URL, TURSO_AUTH_TOKEN | База Turso (turso db show <db> --url, turso db tokens create <db>) |
AUTH_SECRET | Ключ подписи сессий: openssl rand -base64 33 |
AUTH_TRUST_HOST | true вне Vercel (локальный next start) |
GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET | Google-вход (пока не подключён; пусто — кнопка скрыта) |
APP_URL | Публичный адрес для ссылок в письмах (production: https://2vur2.az) |
EMAIL_PROVIDER, EMAIL_FROM | console (реальный провайдер позже) |
CAPTCHA_PROVIDER | none (провайдер позже) |
FEATURE_GUARDIAN_CONSENT | Шаг для родителя (<18). Выключен до решения юриста |
NEXT_PUBLIC_TELEGRAM_URL, NEXT_PUBLIC_INSTAGRAM_URL | Ссылки на каналы. Пусто — на главной вместо Telegram/Instagram показываются «Pulsuz başla» и «Statistikaya bax» |
2vur2.az (регистратор online.az) подключён к проекту imtahan-app; www.2vur2.az → 308 на 2vur2.az. У online.az можно менять только DNS-серверы, поэтому DNS ведёт Vercel: ns1.vercel-dns.com, ns2.vercel-dns.com. Записи (A и т. д.) Vercel создаёт сам; почтовые MX/TXT, если появятся, добавляются в Vercel → Domains.
src/
app/(auth)/ вход, регистрация, подтверждение почты, сброс пароля + server actions
app/api/auth/ Auth.js и ссылка подтверждения почты
auth.ts Auth.js (Credentials, JWT); auth.config.ts — лёгкая часть для proxy
proxy.ts редирект с защищённых страниц (основная проверка — на сервере)
components/ UI по дизайн-системе (кнопки, поля, пароль, сегменты, алерты…)
config/ бренд, реальные цифры, флаги
content/az.ts все тексты интерфейса
db/ схема Drizzle и подключение к Turso
lib/ пароли (argon2id), токены, rate limit, письма, CAPTCHA
db/migrations/ SQL-миграции
e2e/ Playwright-тесты
Пока нет Excel и банка вопросов, экраны приложения работают на демо-данных из дизайна (src/lib/demo/):
content.ts — темы, 70 вопросов дня (7 тем × 10), 4 пробных экзамена × 25 вопросов (без ответов);keys.ts — ответы и решения, только на сервере (в браузер уходят после ответа);state.ts — прогресс пользователя в httpOnly-cookie (покупки, ответы, результаты, подписка);actions.ts — server actions: ответ на вопрос дня, старт/автосохранение/завершение экзамена, mock-оплата, отмена подписки, сброс демо.Таймер экзамена считается от серверного времени старта. Письменные ответы проверяются вручную (в демо они «на проверке»), бал — демо-формула 4 балла за вопрос. Новый пользователь начинает с нуля и без подписки (бесплатный план): 0 / 70 вопросов дня, ни одного купленного экзамена, серия и прогресс по типам считаются из ответов. Сбросить всё к нулю: Профиль → «Demo məlumatlarını sıfırla».
Вопросы дня (/gunun-suallari — обзор всех тем с номерами 1–10, то же на панели): на бесплатном плане в каждой теме открыт только 1-й вопрос (FREE_DAILY_PER_TOPIC), остальные 9 — с замком и кнопкой «Abunə ol». Доступ проверяется на сервере: у закрытого вопроса текст, варианты и ссылка на сборник не попадают в HTML, server action ответ не принимает. Подписка — mock-оплата «Aylıq abunə» (/odenis), после неё открыты все 70. Переключатель «Pulsuz plan kimi bax» в Профиле показывает бесплатный вид и при активной подписке. Когда придут данные, src/lib/demo/ заменяется таблицами БД, экраны остаются.
Демо-аккаунт: npm run db:seed-demo (логин и пароль — DEMO_* в .env.local).
/)Лендинг по макету заказчика (Landing1 + Landing2): hero с живым топ-5 тем, цифры (вопросы, годы, темы, % найденных в сборнике 2025), «Necə işləyir», пример карточки (ответ не проверяется и не уходит в браузер — после выбора приглашение к регистрации), 8 самых частых тем, формат пробного экзамена, тарифы, блок учителя (заглушки), FAQ, CTA и тёмный футер.
Все цифры — из тех же SQL-представлений, что и /statistika. Страница статическая и обновляется раз в 10 минут (revalidate = 600); если база недоступна, блоки с цифрами скрываются. Тексты — src/content/az-landing.ts, компоненты — src/components/landing/.
/onlayn-repetitor)Вопросы, которые по анализу чаще всего попадают на экзамен (доля — REPETITOR_HIT_RATE в src/lib/repetitor/source.ts, сейчас 90 %, цифра из анализа заказчика). Только для подписчиков: на бесплатном плане — экран с замком и «Abunə ol», страницы вопросов редиректят туда, текст вопросов в HTML не попадает, server actions без подписки не работают.
Режим репетитора: вопрос → «İpucu» (подсказка приходит с сервера только по запросу) → проверка → «Repetitorun izahı» (пошаговое решение) → ссылка на сборник и статистику темы → следующий вопрос. Прогресс (ответ, верно/неверно, была ли подсказка) — в демо-cookie, на панели — карточка с прогрессом.
Сейчас данные — мок: src/lib/repetitor/mock.ts (5 самых частых тем × 4 вопроса, тексты свои). Когда появится админ-панель, меняется только src/lib/repetitor/source.ts (функции уже async: listRepetitorTopics, getRepetitorTopic, findRepetitorQuestion, getRepetitorKey) — страницы не трогаем. Формат вопроса — src/lib/repetitor/types.ts (тема = slug из статистики, тип, сколько раз выпадал, текст, варианты A–E, ссылка на сборник; отдельно на сервере — ответ, подсказка, шаги решения).
/sehvlerim)Собирает ошибки пользователя: вопросы дня (неверно или «Bilmirəm»), онлайн-репетитор, закрытые вопросы пробных экзаменов (неверный ответ; если вопрос экзамена совпадает с вопросом дня — это один вопрос). У каждой ошибки — «Sənin cavabın» / «Düzgün cavab» и ссылка на вопрос с решением; сгруппированы по темам. Вход — пункт бокового меню, карточка на панели, подсказка после неверного ответа.
«Səhvlərimi təkrar et» создаёт сессию (/sehvlerim/tekrar/[n]): каждая активная ошибка, после неё 0–2 похожих вопроса (сначала того же типа, потом той же темы; ещё не решённые — в приоритете), максимум 15 вопросов. Похожие берутся только из доступных пользователю (на бесплатном плане — открытые вопросы дня; репетитор — с подпиской; вопросы экзамена как «похожие» не даются). Верный ответ на ошибку отмечает её «Düzəldildi» (в следующую сессию она не попадает); неверный ответ на похожий вопрос добавляет его в ошибки. Код — src/lib/review/ (pool.ts — единая модель вопроса и ключи на сервере, mistakes.ts — список и сборка сессии, actions.ts).
/bal-simulyatoru)Каркас раздела, контент добавит заказчик. Выбор типа экзамена (сейчас доступен «Buraxılış · 11-ci sinif», «9-cu sinif» и «Qəbul» — «Tezliklə»), по каждому формату вопросов (13 закрытых, 5 кодируемых, 7 письменных) — количество верных ответов (поле и кнопки −/+), «Təxmini bal» пересчитывается сразу; на мобильном балл закреплён под шапкой. Расчёт — демо-формула (4 балла за верный ответ, как в результатах пробных экзаменов). Настоящие формулы DİM, новые типы экзаменов и тексты меняются в одном месте: src/lib/score/simulators.ts (правила) и az.app.score (тексты, блок «Bal necə hesablanır» — заглушка [...]). Доступен всем вошедшим пользователям; вход — боковое меню и плитка на панели.
/statistika)Данные — Excel-анализ DIM_riyaziyyat_YEKUN_statistika.xlsx (в репозиторий не коммитится, лежит в data/):
npm run stats:import # data/DIM_riyaziyyat_YEKUN_statistika.xlsx
npm run stats:import -- путь/к/файлу.xlsx
topics, «Bütün suallar» → exam_questions_stats (без текста вопросов), «Qeydlər» → stat_notes.db/migrations/0002_stats_views.sql, 0003_…): topic_stats, exam_stats, topic_exam_stats, topic_match_stats, topic_type_stats. Все цифры на странице берутся из них.nosniff, Referrer-Policy, X-Frame-Options, Permissions-Policy. CSP — на этапе 8.