ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 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)