ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證JohnHasmie/manajemen-sekolah-vue
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
KamilEdu Web — Vue 3 port of the Flutter mobile app
Vue 3 + Vite + TypeScript + Tailwind CSS + Pinia web app that mirrors the
KamilEdu school-management Flutter app.
The Flutter codebase organizes screens by feature, with admin / teacher /
parent / staff variants of each feature. This Vue port follows the same
rule — satu implementasi, tiga role (one implementation, three role
consumers). Shared components live in src/components/; views are
grouped by role under src/views/.
Current state: foundation + login flow complete. The login screen
(Frame A from the Flutter design) supports:檢視完整 README ↗Vue 3 + Vite + TypeScript + Tailwind CSS + Pinia web app that mirrors the KamilEdu school-management Flutter app.
| Concern | Choice |
|---|---|
| Framework | Vue 3 (Composition API, <script setup>) |
| Build tool | Vite |
| Language | TypeScript (strict) |
| Styling | Tailwind CSS 3 + custom design tokens |
| State | Pinia + pinia-plugin-persistedstate |
| Routing | Vue Router 4 |
| HTTP | axios (with Sanctum + X-School-ID interceptors) |
| i18n | vue-i18n (id default, en fallback) |
| Font | Poppins (@fontsource/poppins) |
# 1. Install
npm install
# 2. Configure
cp .env.example .env.local
# edit VITE_API_URL and VITE_AI_API_URL to point at your Laravel backends
# 3. Run dev server
npm run dev # → http://localhost:5173
# 4. Build for production
npm run build # → dist/
npm run preview # serve dist locally for smoke test
The Flutter codebase organizes screens by feature, with admin / teacher /
parent / staff variants of each feature. This Vue port follows the same
rule — satu implementasi, tiga role (one implementation, three role
consumers). Shared components live in src/components/; views are
grouped by role under src/views/.
Current state: foundation + login flow complete. The login screen (Frame A from the Flutter design) supports:
Dashboards for admin / teacher / parent / staff are currently stubbed by
RoleHomeStub.vue. Real implementations land per the task list — see
CLAUDE.md for the working contract.
web-vue/
├── index.html
├── package.json
├── tailwind.config.ts # role colors, slate, AppSpacing tokens
├── tsconfig.app.json # @/ alias → ./src
├── vite.config.ts
├── env.d.ts
├── .env.example
├── CLAUDE.md # working contract (read this first)
└── src/
├── main.ts # bootstrap (Pinia + Router + Poppins + Tailwind)
├── App.vue # rehydrates auth on mount
├── style.css # Tailwind imports + global resets
├── router/
│ └── index.ts # role-aware guard + redirects
├── stores/
│ └── auth.ts # Pinia store mirroring Flutter AuthState
├── services/
│ └── auth.service.ts # /auth/* endpoint wrappers
├── lib/
│ ├── http.ts # axios instances + interceptors
│ └── storage.ts # localStorage wrapper
├── types/
│ ├── api.ts # Laravel envelope types
│ └── auth.ts # AuthStep, User, Role, School
├── composables/
│ └── useRoleColor.ts # ColorUtils.getRoleColor equivalent
├── components/
│ └── ui/
│ ├── Modal.vue
│ └── Toast.vue
└── views/
├── RoleHomeStub.vue # placeholder dashboard
└── auth/
├── LoginView.vue
└── components/
├── BrandBand.vue
├── FormCard.vue
├── LoginForm.vue
├── OtpForm.vue
├── SchoolPicker.vue
├── RolePicker.vue
├── ForgotPasswordModal.vue
└── HelpRequestModal.vue
Mirrors lib/core/utils/color_utils.dart:
| Token | Hex | Role |
|---|---|---|
bg-role-admin | #1E3A8A | Admin (navy) |
bg-role-teacher | #0D9488 | Guru / Wali Kelas (teal) |
bg-role-parent | #7C3AED | Wali Murid (violet) |
bg-role-staff | #B45309 | Staf (amber) |
bg-brand | #4F46E5 | Brand primary (indigo) |
Soft variants (bg-role-*-soft) are used for chip/badge backgrounds.
Use the useRoleColor(role) composable instead of hard-coding.
The app talks to two backends from the Flutter README:
VITE_API_URL. All requests carry
Authorization: Bearer <token> and X-School-ID: <id>.VITE_AI_API_URL. Same auth, separate base URL.Both are wired in src/lib/http.ts via api and aiApi instances.
Response envelope:
{ "success": true, "data": ..., "message": "..." }
extractData() unwraps the envelope; errors throw with the Indonesian
message from the backend.
Backend uses Pending / Approved / Rejected; UI shows
Menunggu / Disetujui / Ditolak. Use mapStatus() from
useRoleColor.ts at the display boundary.
| Flutter (Dart) | Vue equivalent |
|---|---|
lib/features/auth/.../login_screen.dart | src/views/auth/LoginView.vue |
AuthController + AuthState | src/stores/auth.ts (Pinia) |
auth_service.dart | src/services/auth.service.ts |
dio_client.dart | src/lib/http.ts |
color_utils.dart → getRoleColor | src/composables/useRoleColor.ts |
snackbar_utils.dart → showError/showSuccess | src/components/ui/Toast.vue |
AppBottomSheet / AppEditBottomSheet | src/components/ui/Modal.vue (sheet on mobile breakpoint) |
AppNavigator.push / pop | useRouter() from vue-router |
See CLAUDE.md for the full working contract.