ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
A class-based assignment and submission platform for students, trainers, and admins.
• Frontend: React + Vite
• Backend: Node.js + Express
• Database: MongoDB Atlas / MongoDB
• Auth: JWT with HttpOnly cookies
• Node.js 18+
• npm
• MongoDB Atlas or local MongoDB instance
Create a .env file inside the server folder:查看完整 README ↗A class-based assignment and submission platform for students, trainers, and admins.
AlgoZoo/
├── client/ # React frontend
│ ├── src/
│ ├── package.json
│ └── vite.config.ts
├── server/ # Express backend
│ ├── src/
│ ├── package.json
│ └── .env
├── .gitignore
├── README.md
└── package-lock.json
Create a .env file inside the server folder:
APP_NAME="AGLOZOO"
APP_PORT=3000
APP_BASE_URL="http://localhost:5173"
APP_SERVICE_URL="http://localhost:3000"
# DATABASE VARIABLES
MONGO_URI='mongodb+srv://<username>:<password>@<cluster>.mongodb.net/<database>?retryWrites=true&w=majority'
# JWT VARIABLES
JWT_SECRET_KEY='your-access-secret-key'
JWT_REFRESH_TOKEN_SECRET_KEY='your-refresh-secret-key'
JWT_ACCESS_TOKEN_EXPIRES='1d'
JWT_REFRESH_TOKEN_EXPIRES='5d'
JWT_TOKEN_COOKIE_EXPIRES=1000
Important:
MONGO_URI must point to the actual database containing your users.APP_BASE_URL should point to the frontend URL because invitation links open the frontend registration page.mongos)..env files to Git.cd server
npm install
npm run dev
Backend runs at:
http://localhost:3000Open a second terminal:
cd client
npm install
npm run dev
Frontend runs at:
http://localhost:5173The frontend is organized around the backend API contract. Backend routes and response shapes are the source of truth; frontend mock data should not be added when an API endpoint exists.
client/src/
├── pages/ Route-level screens and user workflows
├── components/ Reusable visual components
├── services/ HTTP requests and backend response mapping
├── hooks/ Reusable React data-loading and state logic
├── types/ Shared TypeScript models and API response types
└── context/ Global state such as the authenticated user
Responsibilities:
types/ describes backend models and response contracts. Examples include User, Class, ClassMember, Problem, ClassProblem, Submission, and File.services/ calls backend endpoints. Services use the shared API client, send cookies, unwrap response envelopes, and normalize backend field names for the UI.hooks/ owns reusable loading/error state around services. For example, useAuth, useAdminClasses, useAdminUsers, useClassDetail, and useProblems.context/ owns application-wide state. AuthContext stores the current user and delegates network requests to authService.pages/ renders data from hooks/services. Pages should not contain duplicated fetch calls or hard-coded records.server/src/routes and its controller.client/src/types.client/src/services using the shared api client._id, fullname, class_id, and isActive at the service boundary when the UI needs different names.npm run build in client and syntax-check the affected backend files.Use client/src/services/api.ts for the current backend-integrated feature pages. It:
VITE_API_URL or VITE_API_BASE_URL./api.credentials: 'include'.GET, POST, PATCH, DELETE, and multipart upload requests.ApiError objects.Authentication uses client/src/services/authService.ts and client/src/hooks/useAuth.ts. Auth cookies are HttpOnly, so the browser must send them rather than JavaScript reading them directly.
| Service | Backend responsibility |
|---|---|
authService | Login, registration, logout, current user, token refresh |
adminService | Admin users, classes, dashboard, member removal, invitation links |
classroomService | Trainer dashboards, classes, assigned class problems |
problemService | Trainer/admin problem bank CRUD |
submissionService | Trainer submission lists, details, and reviews |
studentService | Student classes, dashboards, assigned problems, submissions |
fileService | Authenticated file uploads for submission attachments |
All backend routes are mounted under /api.
POST /api/auth/loginPOST /api/auth/registerPOST /api/auth/logoutGET /api/auth/meGET /api/auth/refresh-tokenLogin and registration set accessToken and refreshToken HttpOnly cookies. Browser requests must use credentials: 'include'.
GET /api/admin/dashboard?class_id=:idGET /api/admin/get-userGET /api/admin/get-user/:idGET /api/admin/users?role=studentPATCH /api/admin/users/:user_idGET /api/admin/classesPOST /api/admin/classesGET /api/admin/classes/:class_idPATCH /api/admin/classes/:class_idPATCH /api/admin/classes/:class_id/activeDELETE /api/admin/classes/:class_id/student/:student_idDELETE /api/admin/classes/:class_id/trainer/:trainer_idPOST /api/classes/:classId/generate-join-linkAdmin pages now use live class, user, member, dashboard, progress, and invitation data. Unsupported UI actions, such as class deletion when no delete route exists, should remain unavailable.
GET /api/trainer/dashboardGET /api/trainer/classesGET /api/trainer/classes/:class_idGET /api/trainer/classes/:class_id/problems?search=...POST /api/trainer/classes/:class_id/problemsDELETE /api/trainer/classes/:class_id/problems/:problem_idGET /api/trainer/submissionsGET /api/trainer/submissions/:submission_idPATCH /api/trainer/review/:submission_idTrainer pages use these endpoints for class lists, class detail, assignment management, review queues, submission details, and feedback. Trainer-only routes require the trainer role; class reads allow trainer/admin where defined by the backend middleware.
GET /api/problems?search=...&difficulty=EasyPOST /api/problemsGET /api/problems/:problem_idPATCH /api/problems/:problem_idDELETE /api/problems/:problem_idBackend problem values are OS, DB, DSA, and OTHER. The UI maps DB to Database and OTHER to Other only at the service boundary.
GET /api/student/classesGET /api/student/classes/:classId/dashboardGET /api/student/classes/:classId/problemsGET /api/student/problems/:classProblemIdPOST /api/student/submissionsStudent dashboard, class, problem-list, submission-list, submission-detail, and workspace pages use these endpoints. The student workspace submits the authenticated student account's work; it does not send student_id from the browser.
POST /api/filesThe request is authenticated multipart/form-data with a file field. Accepted types are PNG, JPG, JPEG, GIF, and PDF files up to 10 MB. The response returns a file_id, which can be included in a student submission content block.
For DSA submissions, the backend requires both:
code or text content block.image or file content block.The student workspace uploads the proof file first, then submits both blocks to /api/student/submissions.
All backend routes are mounted under /api.
POST /api/auth/login
{ "email": "[email protected]", "password": "yourPassword" }POST /api/auth/register
{ "token": "invite-token", "fullname": "Alice Nguyen", "email": "[email protected]", "password": "secret123" }POST /api/auth/logout
GET /api/auth/refresh-token
GET /api/admin/get-userGET /api/admin/get-user/:idGET /api/admin/users?role=studentPATCH /api/admin/users/:user_id
{ "isActive": false }POST /api/admin/classes
{ "name": "WeCamp Batch 23", "description": "Optional description" }GET /api/admin/classesPATCH /api/admin/classes/:class_id
PATCH /api/admin/classes/:class_id/active
{ "isActive": false }archivedAtAll admin routes require an authenticated user with the admin role.
POST /api/classes/:classId/generate-join-link
{ "role": "student", "expiresInDays": 2 }POST /api/files
fileThis app uses JWTs in cookies:
Typical flow:
http://localhost:5173/register?token=INVITE_TOKEN&role=trainerLog in and join instead flow.ClassMember record, and sets authentication cookies.The registration page is not a public sign-up page. Opening /register without a token shows an invitation-required message.
/login.email exists exactly in MongoDBMONGO_URIJWT_SECRET_KEY and JWT_REFRESH_TOKEN_SECRET_KEY are not emptyhttp://localhost:5173.http://localhost:3000 and restart it after changing .env.username_1 index from a previous schema, remove that obsolete index before retrying registration..env local and do not push it to GitTo verify the frontend:
cd client
npm run build
The backend currently has no automated test suite; npm test is still a placeholder. Use the API examples above or Postman for manual integration testing.
To start the backend in dev mode:
cd server
npm run dev