ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证MCNA Technology School Learning Management System (LMS)
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
LMS MCNA - Hệ thống học trực tuyến Học viện Công nghệ MCNA Nền tảng bán và vận hành khóa học trực tuyến của Học viện MCNA: danh mục khóa học công khai, học viên tự đăng ký và thanh toán VietQR, học trực tuyến qua Zoom với tài liệu từng buổi, admin xác nhận học phí và xếp lớp, tích hợp CRM MCNA.查看完整 README ↗
Nền tảng vận hành lớp học trực tuyến của Học viện MCNA theo mô hình direct sale: khách thanh toán với bộ phận tư vấn, MCNA tạo tài khoản học viên từ bảng "đã thanh toán", Quản lý lớp xếp học viên vào lớp, giảng viên đưa tài liệu từng buổi, học viên xem slide trực tuyến và tải file data.
admin)manager).xlsx/.csv, hoặc nhập tay), chọn học viên và gán vào mã lớp, gửi lại email xếp lớp, chuyển lớp.teacher)student)Hướng dẫn vận hành từng bước: docs/direct-sale-van-hanh.md.
SALES_MODE=direct (mặc định) đóng tự đăng ký tài khoản, tự ghi danh, quét QR và màn duyệt đơn. Trang công khai chỉ còn giới thiệu khóa học kèm nút liên hệ tư vấn.SALES_MODE=self_service mở lại luồng cũ (mô tả ở mục dưới): học viên tự đăng ký, quét QR, admin duyệt đơn.SALES_MODE=self_service) và kết nối CRMpublished (GET /api/public/courses, GET /api/public/courses/:id): lớp đang mở, số chỗ trống, lịch hàng tuần và danh sách buổi.pending_payment, lớp đã chọn được lưu (requested_section_id) và chọn sẵn ở màn xếp lớp. Khóa miễn phí: ghi danh pending, học viên vào danh sách chờ.course_sections) tự sinh các buổi "Buổi N" (attendance_sessions) theo số buổi và lịch học.session_materials): slide (.pdf/.ppt/.pptx), tài liệu (.pdf/.doc/.docx), file data (.xlsx/.xls/.csv/.pbix/.zip/.rar/.json/.txt/.sql/.ipynb/.py/.md), video YouTube hoặc liên kết ngoài. Tài liệu mở đầu của khóa (sách/tài liệu tham khảo, bài luyện tập) dùng chung bảng này với session_id để trống.MATERIALS_DIR.GET /api/materials/:id/download; slide/tài liệu PDF chỉ mở trong trình xem của LMS (máy chủ trả nội dung trực tiếp, không cấp link tải); slide/tài liệu chưa có bản PDF thì học viên chưa xem được. Giảng viên, Quản lý lớp và admin tải được file gốc.POST /api/auth/register (họ tên, email cá nhân, số điện thoại) tạo tài khoản học viên và gửi mật khẩu tạm tới email.me, logout, change-password) trả PASSWORD_CHANGE_REQUIRED.POST /api/auth/forgot-password gửi liên kết đặt lại mật khẩu một lần.devTemporaryPassword để kiểm thử.CRM_DATABASE_URL bằng tài khoản chỉ đọc bảng revenue_records; Quản lý lớp dùng Lấy từ CRM → Kiểm tra → Nhập. Không tự tạo tài khoản khi chỉ lấy danh sách và không ghi vào CRM. Xem cấu hình, phân trang và giới hạn đối soát tại docs/crm-integration.md.contact.registered, enrollment.requested, enrollment.status_changed ghi vào crm_outbox cùng transaction nghiệp vụ, gửi mỗi 30 giây tới CRM_WEBHOOK_URL kèm chữ ký HMAC, thử lại tối đa 10 lần./api/integrations/crm/courses, /students, /enrollments, /payments/confirm, xác thực bằng API key + chữ ký HMAC, chống trùng theo X-CRM-Event-Id.src/components/: giao diện theo vai trò (AdminPanel, TeacherPanel, StudentPanel) và các màn dùng chung.src/store.ts: dữ liệu mẫu ban đầu và AppStore phía client.src/server/: backend - repositories PostgreSQL, cache Redis, xác thực JWT, scheduler, tích hợp CRM và email.scripts/: migration, seed, đối soát schema và kiểm thử E2E.server.ts: máy chủ Express, kiêm proxy Vite dev server.src/components/ui/: hệ thống thiết kế dùng chung (nút, hộp thoại dạng sheet, toast, badge, ảnh bìa khóa học, trạng thái trống); token màu và kiểu chữ ở src/index.css.src/components/layout/AppShell.tsx: khung ứng dụng cho cả ba vai trò (thanh bên trên máy tính, thanh tab dưới trên điện thoại).src/assets/illustrations/: hình minh họa linh vật Bít (SVG), tự hiển thị theo tên file. Sửa nhân vật hoặc cảnh trong scripts/mascot/build-illustrations.mjs rồi chạy node scripts/mascot/build-illustrations.mjs để tạo lại cả bộ.npm install
.envTạo .env ở thư mục gốc dựa trên .env.example:
PORT=3000
DATABASE_URL=postgresql://username:password@localhost:5432/lms_mcna
JWT_SECRET=chuoi_bao_mat_jwt_dai_va_kho_doan
PAYMENT_WEBHOOK_SECRET=chuoi_bao_mat_webhook_thanh_toan
PAYMENT_WEBHOOK_TOLERANCE_SECONDS=300
PASSWORD_RESET_TOKEN_TTL_MINUTES=30
DISABLE_RATE_LIMIT=true
npm run db:migrate # áp dụng migrations
npm run db:seed # nạp dữ liệu (tùy chọn - server cũng tự seed khi khởi động)
npm run db:drift # đối soát schema
Database mới được nạp 3 tài khoản gốc và catalog thật của mcna.vn (src/server/data/mcnaCatalog.json: 14 khóa học, lịch khai giảng và syllabus từng buổi). Giá trong file chỉ là giá tạm vì web không công bố học phí — sửa lại trong giao diện, lệnh import không ghi đè giá admin đã đặt.
Cần dữ liệu demo để thử tải (20 giảng viên, 40 khóa học, 300 học viên) thì đặt SEED_DEMO_DATA=true trong .env trước khi seed.
Khi file catalog thay đổi, nạp lại bằng:
npm run import:mcna -- --hide-other-courses
npm run dev
Ứng dụng chạy tại http://localhost:3000.
Tài khoản mẫu: [email protected] / admine16, [email protected] / teachere16, [email protected] / studente16.
npm run lint
Trên Windows PowerShell, nếu bị chặn script: npm.cmd run lint.
Cả hai script cần server đang chạy với NODE_ENV khác production và DATABASE_URL trỏ cùng database với server.
Luồng direct sale (mặc định): chặn tự đăng ký → quyền Quản lý lớp → nạp khóa học → tạo lớp → nhập bảng đã thanh toán → tài khoản trống → xếp lớp và email → tài liệu mở đầu, slide chỉ xem, file data tải được. Script tự tạo tài khoản và lớp riêng cho mỗi lần chạy:
E2E_BASE_URL=http://localhost:3000 npm run test:direct-sale
Luồng tự đăng ký + CRM: danh mục → tự đăng ký → CRM → tài liệu buổi học. Server phải chạy với SALES_MODE=self_service và có CRM_API_KEY/CRM_INBOUND_SECRET; script dùng cùng giá trị đó. Script dùng ca học và số điện thoại cố định nên mỗi database chỉ chạy được một lần:
E2E_BASE_URL=http://localhost:3000 CRM_API_KEY=... CRM_INBOUND_SECRET=... npm run test:signup-crm
CRM giả để thử webhook: CRM_WEBHOOK_SECRET=dev-secret npm run mock:crm, rồi khởi động LMS với CRM_WEBHOOK_URL=http://localhost:4100/webhooks/lms và cùng CRM_WEBHOOK_SECRET.
npm ci # cài đúng theo lockfile
npm run db:migrate # cập nhật schema
npm run build # đóng gói frontend (dist/client) và backend (dist/server.cjs)
npm start # chạy production
Trên máy chủ tự quản (VPS), migration còn thiếu được chạy mỗi khi ứng dụng khởi động. Vercel không chạy bước khởi động đó, nên vercel.json dùng npm run vercel-build: bản build production chạy migration còn thiếu trước rồi mới build (scripts/deployMigrate.ts); migration lỗi thì build dừng và bản cũ tiếp tục chạy. Bản build preview không đụng tới database. DATABASE_URL phải có ở bước build; nếu không, bước này bị bỏ qua (có cảnh báo trong log build) và cần chạy npm run db:migrate bằng tay với database đó.
Khi không tải được dữ liệu sau đăng nhập (ví dụ database chưa có migration mới), LMS hiện màn "Chưa tải được dữ liệu" kèm nút thử lại, không hiển thị dữ liệu mẫu.
NODE_ENV=production, PORTDATABASE_URL, JWT_SECRETPAYMENT_WEBHOOK_SECRET, PAYMENT_WEBHOOK_TOLERANCE_SECONDS, PASSWORD_RESET_TOKEN_TTL_MINUTESSALES_MODE (direct mặc định | self_service), DEFAULT_STUDENT_PASSWORD (mật khẩu mặc định cho tài khoản tạo từ bảng đã thanh toán, tối thiểu 8 ký tự), SUPPORT_PHONE (in trong email và trang đăng nhập), ALLOW_HOMEWORK_DOWNLOAD (true thì học viên tải được tệp đính kèm bài tập về nhà).GEMINI_API_KEY, GEMINI_MODEL: soạn thư chúc mừng bằng AI. Bỏ trống thì nút soạn thư trả về thư mẫu của MCNA.SCHOOL_EMAIL_DOMAIN, GOOGLE_ADMIN_EMAIL, GOOGLE_SERVICE_ACCOUNT_JSON, LMS_LOGIN_URLSMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASS, SMTP_FROM. Hộp thư @mcna.vn nằm trên OneMail (mail.mcna.vn, cổng 465). Thiếu cấu hình SMTP thì email tài khoản và email xếp lớp không được gửi mà chỉ ghi vào scratch/emails.log; màn Học viên & Xếp lớp hiện trạng thái email của từng học viên.SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY, SUPABASE_STORAGE_BUCKET (bucket private), hoặc MATERIALS_DIR khi chạy không có Supabase.CRM_WEBHOOK_URL, CRM_WEBHOOK_SECRET, CRM_API_KEY, CRM_INBOUND_SECRET, CRM_SIGNATURE_TOLERANCE_SECONDSCRON_SECRET: xác thực lịch gửi lại hàng đợi CRM (Vercel Cron và GitHub Actions).Sau khi triển khai, quản trị vào Tổng quan → Cấu hình hệ thống để xem mục nào còn thiếu (chỉ hiện có hay chưa, không hiện giá trị).
DEPLOY_URL=https://ten-mien-cua-ban.com npm run smoke:deploy
Nếu bản mới lỗi nặng: xác định commit ổn định gần nhất, build lại commit đó, và nếu dữ liệu bị ảnh hưởng thì phục hồi theo docs/backup-restore-policy.md.