ESP32-S3 Bench Guide
ESP32‑S3 N16R8 벤치 가이드: 실시간 핀아웃, 강의, 시뮬레이터 및 벤치 로그
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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.aREADME 전문 보기 ↗
Подготовка к экзаменам 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.