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