ESP32-S3 Bench Guide
ESP32‑S3 N16R8 벤치 가이드: 실시간 핀아웃, 강의, 시뮬레이터 및 벤치 로그
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Платформа для изучения английского языка: уроки, личный словарь с данными из Cambridge Dictionary, три режима тренировки слов, домашние задания и тесты.
Стек: Next.js 16 (App Router, Server Actions), React 19, Prisma ORM 7 + PostgreSQL (Prisma Postgres), Tailwind CSS 4, TypeScript.
npm install # зависимости + генерация Prisma Client
npm run setup # generate + создание таблиц в БД + демо-данные
npm run dev # http://localhost:3000
npm run setup можно разложить на шаги: npx prisma generate,
npm run db:push, npm run db:seed.
Про Prisma 7. В седьмой версии строка подключения больше не пишется в
schema.prisma— блокdatasourceсодержит толькоprovider, а URL живёт вprisma.config.ts(datasource: { url: env("DATABASE_URL") }). Там жеimport "dotenv/config", потому что Prisma 7 не подхватывает.envсама. Клиент создаётся с драйвер-адаптером:new PrismaClient({ adapter })вlib/prisma.ts.
npm run db:seed| Роль | Логин | Пароль |
|---|---|---|
| Администратор | admin | admin123 |
| Ученик | student | student123 |
Пароли демонстрационные — смените их в профиле или в админке.
Если запускать без сида, первый зарегистрировавшийся пользователь автоматически получает роль администратора.
Библиотека уроков общая: администратор создаёт урок один раз и назначает его нужным ученикам (вкладка «Ученики»). У урока есть номер, тема, цель, уровень, план занятия по минутам и указание, по какому учебнику он собран. Материал состоит из блоков: правила с формулами, интерактивные задания с объяснением ответа, лексика с озвучкой, аудирование с плеером, тексты на понимание и задания на говорение.
Учебники лежат в папке books/ в корне проекта; их названия
подставляются подсказкой в поле «Учебник».
Задание состоит из упражнений пяти типов:
| Тип | Как проверяется |
|---|---|
| Варианты ответа | автоматически, с объяснением |
| Вписать ответ | автоматически, синонимы засчитываются |
| Понимание текста | автоматически, текст показан рядом |
| Аудирование | автоматически, есть плеер с перемоткой и скоростью |
| Развёрнутый ответ | проверяет преподаватель, ставит оценку 1–5 |
Таблица со столбцами: слово (с транскрипцией, частью речи и озвучкой), перевод, пример употребления, определение и статистика. Ученик может искать слова в Cambridge, добавляет их в словарь преподаватель — вручную или автоматически при назначении урока.
На каждой карточке показана часть речи. В конце — статистика и разбор каждой ошибки: верный ответ, определение и пример употребления.
Озвучка берёт mp3 из Cambridge, а если его нет — синтезирует речь,
выбирая лучший голос из установленных в системе (lib/speech.ts).
Конструктор и автосборка теста из слов урока — только у администратора. После проверки показывается разбор ошибок. Со страницы теста есть кнопка возврата в урок.
У Cambridge нет бесплатного публичного API: ключ к
dictionary-api.cambridge.org выдаётся по заявке на коммерческих условиях,
а сам сайт отвечает ботам ошибкой 403.
Поэтому lib/dictionary.ts работает по цепочке:
DictionaryCache) — если слово уже искали, ответ мгновенный./dictionary/english-russian/<word>) с браузерными заголовками и
вынимаем определение, пример, транскрипцию, mp3-произношение и русский
перевод.Любое поле можно поправить руками — в форме добавления и в окне редактирования слова.
Если у вас появится официальный ключ Cambridge, интеграцию достаточно дописать одной функцией в
lib/dictionary.ts— остальной код не изменится.
Скан страницы учебника, картинка к слову и запись для аудирования грузятся одной кнопкой «📎 Загрузить». Хранилище выбирается само:
Что в .env | Куда уходит файл |
|---|---|
UPLOADTHING_TOKEN задан | напрямую в UploadThing, минуя наш сервер |
| не задан | в public/uploads через /api/upload |
Токен берётся в личном кабинете uploadthing.com:
создайте приложение и скопируйте UPLOADTHING_TOKEN в .env. Клиент
спрашивает у сервера, какое хранилище включено, одним запросом при первой
загрузке — второй переменной заводить не нужно.
Локальный вариант годится для разработки и обычного сервера. На бессерверном хостинге (Vercel и подобные) он не подойдёт по двум причинам: файловая система между запросами не сохраняется, а тело запроса ограничено несколькими мегабайтами — часовая запись занятия туда просто не влезет. Поэтому для такого деплоя нужен UploadThing.
Ограничения размера: картинки — 8 МБ, аудио — 64 МБ.
Пока в .env не заданы SMTP_HOST / SMTP_USER / SMTP_PASSWORD, код
восстановления печатается в консоль сервера — этого достаточно для
разработки. Как только переменные заданы, письма уходят через nodemailer.
SMTP_HOST — это адрес почтового сервера (smtp.gmail.com,
smtp.yandex.ru, smtp.mail.ru), а не ваш email; email идёт в SMTP_USER
и SMTP_FROM. В качестве пароля — «пароль приложения», обычный пароль от
почты не подойдёт. Порт 465 — SSL, 587 — STARTTLS (выбирается автоматически).
Письма уходят в двух случаях: код восстановления пароля и новый комментарий преподавателя к работе ученика. Про комментарии пишем только один раз за цикл — пока ученик не открыл страницу и не прочитал замечание, следующие комментарии письмом не дублируются.
Ссылки в письмах строятся из APP_URL (по умолчанию http://localhost:3000).
При выкладке на домен задайте её в .env, иначе ученик получит ссылку на
localhost.
Проверить настройки, не заходя на сайт:
npm run mail:test # письмо на адрес из SMTP_USER
npm run mail:test -- [email protected] # на произвольный адрес
Исходные уроки лежат в content/lessons (HTML), аудио — в public/audio.
npm run lessons:convert # HTML → content/lessons/lessons.json
npm run lessons:import # JSON → база
Конвертер (scripts/convert-lessons.py) разбирает блоки, задания с
атрибутами data-answer / data-explain, словарь, listening и домашние
задания. Импорт идемпотентный: содержимое урока перезаписывается,
ответы учеников не трогаются.
app/
page.tsx вход и регистрация
forgot/ reset/ восстановление пароля
(app)/ всё, что за авторизацией (общий header)
dashboard/ главная после входа
lessons/ lessons/[id]/ библиотека и карточка урока
homework/ homework/[id]/ домашние задания
dictionary/ словарь
training/ [mode]/ выбор режима и тренажёр
tests/ tests/[id]/ тесты
students/ students/[id]/ ученики (администратор)
profile/ профиль
admin/ admin/users/[id]/ аккаунты и роли
actions/ серверные экшены
api/dictionary/lookup/ поиск слова в Cambridge
api/upload/ загрузка картинок и аудио
components/ UI: шапка с боковым меню, формы, тренажёр, плеер
lib/ prisma, сессии, пароли, словарь, речь, контент урока
content/lessons/ исходные HTML-уроки и lessons.json
lesson5-extra-blocks.json — копия блоков и заданий урока №5
(глаголы состояния, чтение, транскрипция); живут в базе, не в HTML
lessons-6-7.json — копия уроков 6 и 7 (Present Perfect; планы и will),
их слов и домашних заданий; живут в базе, не в HTML
lessons-8-9.json — копия уроков 8 и 9 (по Empower B1: Unit 5 «правила на работе», Unit 6 «советы»),
слов и домашних заданий; записи Track 05.xx и 06.xx — public/audio/empower/unit5, unit6
(из папки audio/, она в .gitignore). Загрузка в базу:
npx tsx --env-file=.env scripts/import-lessons-file.ts content/lessons/lessons-8-9.json
lib/word-decks/ готовые наборы слов для словаря всех пользователей (частотные слова, фразы,
слова по темам): строки «слово | перевод | часть речи | пример» в *.ts;
страница /dictionary/decks; scripts/prefill-deck-definitions.ts подтягивает
определения Cambridge в кэш
lib/study/ личный раздел «Мой английский» (виден только владельцу, см. lib/self-study-access.ts):
расписание на 24 недели (schedule.ts), задания на говорение (speaking-*.ts),
грамматика (drills-*.ts), юниты Empower C1 (units-*.ts), письмо (writing.ts).
Записи с реплик для шэдоуинга: lib/study/cues/, аудио: public/audio/empower-c1/ —
готовит scripts/prepare_empower_c1.py из папки audio/ (она в .gitignore).
Прогресс, ошибки, карточки и записи речи хранятся в браузере (localStorage, IndexedDB), не в базе
scripts/prefill-plan-definitions.ts подтягивает определения Cambridge для слов плана (кэш в базе)
self-study-inbox/ работы, отправленные на проверку (в .gitignore): <дата>__<задание>.json и рядом
.review.json с отзывом проверяющего (поля см. lib/study/inbox.ts); работает локально
components/plan/ интерфейс раздела: «Сегодня», запись речи, упражнения, карточки, журнал ошибок
books/ учебники (PDF)
public/audio/ public/uploads/ аудио уроков и загруженные файлы
prisma/schema.prisma схема БД
scripts/ конвертер уроков, импорт, диагностика, роли
proxy.ts защита маршрутов (в Next.js 16 вместо middleware)