ESP32-S3 Bench Guide
ESP32‑S3 N16R8 벤치 가이드: 실시간 핀아웃, 강의, 시뮬레이터 및 벤치 로그
학생 과제 제출·피드백·코드 실행 추적으로 학습을 지원하는 플랫폼
A platform that supports student's learning via submission, feedback tracking and code execution tracing for programming assignment, built for NAB training program
교육TypeScript · JavaScriptGitHub @suki-amalie온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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