cùng Cardlish
Cardlish Phonics Assistant
🎓 Học viên (P1 cốt lõi)
Bao gồm các bước đăng ký tài khoản, tạo hồ sơ, luyện tập và nộp bài. Đối tượng chính là bé An từ 6 đến 11 tuổi, có phụ huynh đồng hành.
cùng Cardlish
States
- DEFAULT Static brand intro — no data dependency
- AUTH-REDIRECT Valid JWT in localStorage thì auto-redirect to S06/S08
Interactions
- Tap Đăng ký miễn phí 5 tháng chuyển đến màn hình S02
- Tap Đã có tài khoản? chuyển đến màn hình S04
- Tap Liên hệ hỗ trợ sẽ mở support modal
Data
- Reads: localStorage
jwtfor auto-redirect - Writes: none
States
- DEFAULT Empty form, submit disabled until terms ticked
- EMAIL-EXISTS Inline: "Email này đã được đăng ký"
- NETWORK-ERR Toast: "Không thể kết nối"
- SUBMITTING Button spinner
Interactions
- Tap tab để chuyển Email / Phone format
- Tap Tạo tài khoản rồi gọi API POST
/auth/registerchuyển đến màn hình S03 - Tap Google thì OAuth và bỏ qua bước OTP chuyển đến màn hình S06
Data
- Reads: GET
/classesdropdown - Writes: POST
/auth/register, creates trial=5mo user - Validation: email regex · VN phone (+84/0 + 9–10 digits) · password ≥8 chars +1 letter +1 number
Mã OTP đã gửi tới
pa****@gmail.com
States
- DEFAULT 6 empty boxes, 60s countdown
- TYPING Auto-advance focus per digit
- INVALID Red boxes + "Còn 2 lần thử"
- EXPIRED "Mã đã hết hạn" + active Gửi lại
- LOCKED 3 wrong rồi tạm khoá 5 phút
Interactions
- Type digit để tự động sang ô kế
- Paste 6-digit code để tự động điền
- Tap Xác nhận rồi gọi API POST
/auth/otp/verifychuyển đến màn hình S06 - Tap Gửi lại mã rồi gọi API POST
/auth/otp/resendrồi đặt lại bộ đếm 60 giây
Data
- Reads: session_id from S02
- Writes: POST
/auth/otp/verify { session_id, code } - TTL: 5 minutes server-side
States
- DEFAULT Empty form
- SUBMITTING Button spinner
- WRONG-CREDS Inline: "Email/SĐT hoặc mật khẩu không đúng"
- LOCKED "Tạm khoá 15 phút"
- TRIAL-EXPIRED On success rồi chuyển sang S17 instead of S08
Interactions
- Tap Đăng nhập rồi gọi API POST
/auth/loginchuyển đến màn hình S06 (≥2 profiles) or S08 (1) - Tap Quên mật khẩu chuyển đến màn hình S05
- 5× failed khiến hệ thống khoá tạm thời
Data
- Writes: localStorage
jwt,refresh_token(24h JWT rotation)
Vui lòng nhập email hoặc số điện thoại bạn đã đăng ký. Chúng tôi sẽ gửi mã OTP để bạn đặt lại mật khẩu mới.
States
- STEP-1 Input email/phone — request reset
- NOT-FOUND "Không tìm thấy tài khoản"
- STEP-2 OTP entry (reuses S03 layout)
- STEP-3 New password + confirm
- MISMATCH "Hai mật khẩu không khớp"
- SUCCESS Toast rồi chuyển sang S04
Interactions
- Step 1 rồi gọi API POST
/auth/forgotrồi sang Bước 2 - Step 2 rồi gọi API POST
/auth/forgot/verifyrồi trả về reset_token rồi sang Bước 3 - Step 3 rồi gọi API POST
/auth/forgot/resetwith reset_token chuyển đến màn hình S04
Data
- Writes: bcrypt password update on
userstable - TTL: reset_token valid 10 minutes
Hôm nay bé nào sẽ luyện tập đây?
Mỗi tài khoản được tạo tối đa 5 hồ sơ học viên
States
- DEFAULT Grid of 1–5 profile cards + "Thêm" card
- ZERO-PROFILES Auto-redirect to S07 with empty form
- MAX-PROFILES "Thêm" disabled with tooltip "Đã đạt tối đa 5 hồ sơ"
- LOADING Skeleton cards
Interactions
- Tap profile card thì set
active_profile_idchuyển đến màn hình S08 - Tap Thêm học viên mới chuyển đến màn hình S07 (Add mode)
- Tap top-right account menu thì Settings / Logout
Data
- Reads: GET
/profiles(max 5) - Writes: session.active_profile_id
Chọn ảnh đại diện
(chỉ hiển thị trong chế độ chỉnh sửa)
States
- ADD-MODE Title "Thêm học viên", no delete button
- EDIT-MODE Title "Sửa hồ sơ", Xoá button visible
- VALIDATION-ERR Inline error under name input
- DELETE-CONFIRM Modal: "Xoá hồ sơ Bé An? Hành động không thể hoàn tác"
- DELETE-BLOCKED "Không thể xoá hồ sơ đang có phiên luyện tập"
Interactions
- Tap avatar tile thì select active radio
- Tap Lưu thì POST/PATCH
/profileschuyển đến màn hình S06 - Tap Xoá hồ sơ rồi hiện modal xác nhận rồi gọi API DELETE
/profiles/:id
Data
- Validation: name 1–100 chars · age 3–99
- Writes:
profilestable
States
- DEFAULT Lessons fetched, status icons per progress
- LOADING Skeleton tiles
- TRIAL-EXPIRING Yellow banner: "Dùng thử còn 5 ngày. [Nâng cấp]"
- TRIAL-EXPIRED Redirect to S17
- NO-CARDS Lesson tile disabled with "—" icon
Interactions
- Tap profile chip chuyển đến màn hình S06 (switch profile)
- Tap lesson tile chuyển đến màn hình S09 (if has cards) / no-op (if disabled)
- Tap trial badge chuyển đến màn hình S16 (Subscription)
- Bottom nav thì Home / History (S13) / Settings (S15)
Data
- Reads: GET
/lessons(48), GET/profiles/:id/progress
Bài này có 8 thẻ. Lần luyện gần nhất vào ngày 22/05/2026
States
- DEFAULT Both CTAs enabled
- NO-CARDS Empty list + "Bài này chưa có thẻ luyện tập"
- NEVER-PRACTICED Sub-header: "Chưa luyện"
- LOADING Skeleton card rows
Interactions
- Tap card row thì preview modal (read-only)
- Tap Bắt đầu luyện tập chuyển đến màn hình S10 in mode=practice
- Tap Nộp bài chuyển đến màn hình S10 in mode=submit (4-step disabled)
Data
- Reads: GET
/lessons/:id/cards, GET/profiles/:id/lessons/:id/last_attempt
States
- IDLE Blue mic circle, "NHẤN ĐỂ ĐỌC"
- RECORDING Red pulsing 🔴 + timer "0:03" + "NHẤN ĐỂ DỪNG"
- PROCESSING Spinner + "Đang chấm điểm…" (Azure call, target <3s)
- FEEDBACK Transition to S11a–e overlay
- FLIPPED Card shows back-side (4–8 word list)
- MIC-DENIED Modal C04 with browser instructions
- NETWORK-FAIL Banner: "[Thử lại] [Lưu để gửi sau]"
- TIMEOUT-10S Auto-stop + warn toast
- ABANDONED ✕ thì confirm "Thoát giữa chừng?" rồi lưu trạng thái bỏ dở
Interactions
- Tap Xem mặt sau để lật thẻ
- Tap Nghe âm mẫu để phát
audio_phoneme_url - Tap MIC (idle) để bắt đầu ghi âm within 200ms
- Tap MIC (recording) để dừng và tải lên hoặc tự động dừng at 5s silence / 10s max
- Tap ✕ rồi hiện modal xác nhận chuyển đến màn hình S09
Data
- Reads: GET
/cards/:id(phoneme, IPA, images, audio_urls) - Writes: POST
/attempts(audio blob, max 10MB) rồi trả về Azure score - All attempts logged to
pronunciation_attemptstable (BR-3)
Bé đã phát âm chuẩn âm /æk/ rồi đó
Tự động chuyển sang thẻ tiếp theo sau 1,5 giây
State
- CORRECT Green theme, star burst animation
Interactions
- Auto-advance after 1.5s OR tap Tiếp theo rồi sang card / S12 if last
Data
- Increment
correct_attempts, log topronunciation_attempts
Bé phát âm chưa rõ âm /k/ trong từ "back".
Bé hãy nghe lại Thẻ số 3 để ôn âm /æk/ nhé.
State
- ATTEMPT-1-WRONG Amber theme, error phoneme highlighted
Interactions
- Tap Nghe lại thẻ để phát
audio_phoneme_url - Tap Thử lại rồi quay về S10 ở trạng thái chờ, attempt counter = 2
Data
- Azure response includes per-phoneme score; surface lowest scoring phoneme
Bé nghe cô đọc mẫu rồi đọc theo nha:
State
- ATTEMPT-2-AUTO-PLAY Reference audio auto-plays on entry
- AUDIO-FALLBACK-TTS If
audio_words_urlmissing thì Azure TTS Neural Voice en-US
Interactions
- Same buttons as S11b
Data
- Audio source priority (BR-6): real-human word audio thì TTS fallback
CỐ LÊN NÀO 💪
Bé nghe thật kỹ âm mẫu rồi đọc theo nhé:
State
- ATTEMPT-3-LAST Orange-amber theme, encouraging tone, reference audio re-plays
Interactions
- Same as S11c
Data
- Tracks
attempt_count = 3
Bé hãy nghe lại Thẻ 3 và luyện tập thêm nha.
Mình cùng sang thẻ tiếp theo nhé.
Tự động chuyển sang thẻ tiếp theo sau 3 giây
State
- ATTEMPT-4-SKIP Neutral/friendly orange, NOT punishing
Interactions
- Auto-advance after 3s OR tap Tiếp tục ngay
- Tap Nghe lại thẻ này để phát
audio_phoneme_url
Data
- Mark card with
error_logged=true; surface in S12 top-5 errors
Những lỗi bé cần chú ý:
States
- PASS Score ≥90, green, confetti, "🎉 Đạt!"
- NEAR-PASS Score 70–89, orange, "Cần luyện thêm"
- FAIL Score <70, red, emphasize errors
- NO-ERRORS-PASS Hide "Lỗi cần chú ý" section
Interactions
- Tap Luyện tập lại chuyển đến màn hình S10 (practice mode)
- Tap Về trang chủ chuyển đến màn hình S08
- Tap Xem chi tiết chuyển đến màn hình S14
- Tap error row thì jump to that card in S09
Data
- Reads: GET
/sessions/:id/summary - Writes: session saved with
type=submit, score, top_errors
📅 Học viên (P2 gắn kết)
Bao gồm lịch sử luyện tập, cài đặt tài khoản, đăng ký gói và xử lý khi hết hạn dùng thử.
States
- DEFAULT Last 7 days grouped by date
- EMPTY Illustration + "Chưa có buổi luyện tập nào" + CTA chuyển đến màn hình S08
- LOADING Skeleton rows
- FILTER-30D / ALL Reload with date range
- INFINITE-SCROLL Load more on scroll end
Interactions
- Tap chip rồi truy vấn lại with date range (debounced)
- Tap session row chuyển đến màn hình S14
- Tap profile chip chuyển đến màn hình S06
Data
- Reads: GET
/profiles/:id/sessions?range=7d|30d|all&page=N
Bài 02. Âm /æ/ với "ack" và "ap"
Ngày 23 tháng 5, lúc 18 giờ 32. Hình thức: Nộp bài lấy điểm.
States
- DEFAULT Session loaded with per-card breakdown
- AUDIO-EXPIRED If >30d for practice sessions: "Audio đã hết hạn lưu trữ" (BR-7)
- LOADING Skeleton
Interactions
- Tap card row rồi xem nhanh (phoneme + words)
- Tap Luyện lại bài này chuyển đến màn hình S10 (practice mode)
Data
- Reads: GET
/sessions/:id/details(per-card attempts, audio_url if within retention)
States
- DEFAULT Trial badge yellow
- ACTIVE-SUB Green badge "Đang hoạt động", "Còn lại 22 ngày"
- EXPIRED Red badge "Đã hết hạn"
- LANG-DROPDOWN Tiếng Việt (selected) + English/日本語/한국어/ລາວ (Sắp có)
- DELETE-CONFIRM Modal: 2-step confirmation with typed "XOÁ"
Interactions
- Tap profile row chuyển đến màn hình S07 (Edit mode)
- Tap Đổi mật khẩu mở luồng đổi mật khẩu (reuses S05 step 3)
- Tap Quản lý gói chuyển đến màn hình S16
- Tap Đăng xuất thì confirm rồi xoá localStorage chuyển đến màn hình S01
- Tap Xoá tài khoản rồi mở modal rồi gọi API DELETE
/users/me(30d soft delete per PDPA)
Data
- Reads: GET
/users/me, GET/subscriptions/me - Writes: PATCH on password change; DELETE for account
States
- DEFAULT Plan B pre-selected with Đề xuất badge
- PROCESSING Button: "Đang chuyển đến VNPay…"
- REDIRECT Opens VNPay/Stripe hosted page
- SUCCESS-RETURN Toast: "Thanh toán thành công"
- FAIL-RETURN Toast + retry CTA
- NO-HISTORY Empty state under history
Interactions
- Tap plan radio thì highlight + update button amount
- Tap payment radio để chuyển gateway
- Tap Thanh toán rồi gọi API POST
/payments/createrồi chuyển sang to gateway - Tap history row rồi mở modal hoá đơn
Data
- Reads: GET
/subscriptions/me, GET/payments?user_id=me - Writes: POST
/payments/create; webhook khi thành công sẽsubscription_status=active
👋
Cảm ơn bạn đã đồng hành cùng Cardlish
Để tiếp tục cho bé luyện tập, bạn vui lòng chọn gói phù hợp với gia đình mình nhé.
States
- BLOCKED Full-screen, non-dismissible, no nav available
- MID-SESSION-EXPIRED If session expires mid-practice và lưu phần đã làm rồi bắt buộc S17
Interactions
- Tap Xem các gói chuyển đến màn hình S16
- Tap Đăng xuất thì clear session chuyển đến màn hình S01
- Back button / swipe và bị chặn (intercepted)
Data
- Reads: subscription_status from JWT claims or
/me - Writes: none
👩🏫 Giao diện dành cho Giáo viên
Sử dụng trên máy tính hoặc máy tính bảng. Có thanh điều hướng bên trái và khu vực nội dung chính. Mỗi giáo viên có thể theo dõi từ 15 đến 30 học viên.
Tổng quan lớp
Danh sách học viên
| Tên học viên | Lớp | Số phiên 7 ngày | Điểm trung bình | Âm sai nhiều nhất | Hoạt động gần nhất |
|---|---|---|---|---|---|
| 👧Bé An | Lớp 2 | 5 phiên | 88% | /æ/ | Hôm nay |
| 👦Bé Bin | Lớp 4 | 7 phiên | 92% | /θ/ | Hôm qua |
| 👶Bé Cốm | Lớp 1 | 3 phiên | 74% | /ɪ/ | 2 ngày trước |
| 👧Bé Đào | Lớp 2 | 0 phiên | chưa có | chưa có | Chưa hoạt động |
| 👦Bé Em | Lớp 3 | 4 phiên | 81% | /s/ | 3 ngày trước |
States
- DEFAULT 20 rows/page, sortable
- LOADING Skeleton rows
- EMPTY-CLASS "Chưa có học viên nào được gán"
- SEARCH-NO-MATCH "Không tìm thấy học viên khớp"
- ROW-INACTIVE Greyed + "Chưa hoạt động"
Interactions
- Tap column header thì sort asc/desc
- Type in search thì debounced filter (300ms)
- Bấm vào dòng để mở T02 (Student Detail)
- Side nav thì T01/T02/T03/Settings
Responsive
- Mobile (375px): hamburger menu replaces side nav; table thì card list
- Desktop (1024px+): side nav fixed 240px, content fluid
Data
- Reads: GET
/teachers/me/classes, GET/teachers/me/students?sort=&q=&page=
Xu hướng điểm nộp bài trong 30 ngày qua
Những âm bé hay phát âm sai
| Âm | Số lần sai | Thẻ nên ôn lại | Ví dụ từ |
|---|---|---|---|
/æ/ | 14 lần | Thẻ số 3 và 5 | back, sad |
/θ/ | 9 lần | Thẻ số 18 và 22 | think, three |
/s/ | 6 lần | Thẻ số 9 | sun, sip |
Các phiên luyện tập gần đây
Ngày 22/05, Bài 03 Luyện 6 thẻ
Ngày 21/05, Bài 03 Nộp bài được 72%
States
- DEFAULT Chart + tables populated
- NO-SUBMITS Hide chart, show "Chưa có lần nộp bài nào"
- LOADING Skeleton chart bars
- DATA-EXPORT (sẽ phát triển ở giai đoạn 2) nút Tải CSV
Interactions
- Tap chart point rồi hiện chú thích with exact score + date
- Tap error row rồi hiển thị danh sách of attempts for that phoneme
- Tap session bullet thì session detail (read-only T14 equivalent)
Data
- Reads: GET
/students/:id/summary, /errors, /sessions
Báo cáo lỗi
Bảng xếp hạng 10 âm bị sai nhiều nhất
Bản đồ nhiệt thể hiện tỷ lệ lỗi của từng thẻ
States
- DEFAULT All classes, 30d default
- EMPTY "Chưa có dữ liệu cho khoảng thời gian này"
- LOADING Skeleton bars
- EXPORT-PENDING Spinner during CSV generation (sẽ phát triển ở giai đoạn 2)
Interactions
- Change class dropdown rồi tải lại dữ liệu
- Change date range rồi tải lại dữ liệu
- Tap bar rồi hiển thị danh sách students who erred this phoneme
- Tap heatmap cell để xem chi tiết down to card-level errors
Data
- Reads: GET
/analytics/errors?class_id=&range=
🛠 Giao diện dành cho Quản trị viên
Sử dụng trên máy tính. Bao gồm quản lý người dùng, phân học viên vào lớp và xem thống kê toàn hệ thống.
Người dùng
| Họ và tên | Vai trò | Gói đăng ký | Ngày tạo | Hành động | ||
|---|---|---|---|---|---|---|
| Chị Nguyễn Lan Anh | lananh.nguyen@gmail.com | Học viên | Dùng thử | 01/05 | ⋮ | |
| Anh Trần Văn Hùng | vanhung.tran@gmail.com | Học viên | Đang hoạt động | 03/05 | ⋮ | |
| Chị Phạm Thu Hương | thuhuong.pham@gmail.com | Học viên | Hết hạn | 12/01 | ⋮ | |
| Cô Lê Thị Mai | mai.le@cardlish.edu.vn | Giáo viên | không áp dụng | 15/04 | ⋮ | |
| Anh Lê Quang Minh | quangminh.le@gmail.com | Học viên | Dùng thử | 22/04 | ⋮ | |
| Chị Vũ Mai Hoa | maihoa.vu@gmail.com | Học viên | Đang hoạt động | 28/04 | ⋮ |
States
- DEFAULT Table loaded, 50/page
- BULK-ACTIVE When ≥1 row checked rồi hiện thanh công cụ thao tác hàng loạt
- SEARCH-NO-MATCH Empty results message
- FILTER-APPLIED Chip-style filter badges
- DELETE-CONFIRM Modal: "Xoá 3 người dùng? Không thể hoàn tác"
Interactions
- Type in search thì debounced filter (300ms)
- Toggle role/subscription filter rồi tải lại dữ liệu
- Bấm vào dòng để xem chi tiết người dùng (sẽ phát triển ở giai đoạn 2)
- Tap Gán lớp (bulk) thì A02 modal
- Tap Thêm người dùng mới rồi mở modal mời
Data
- Reads: GET
/admin/users?q=&role=&sub=&page= - Writes: POST
/admin/users/bulk/assign-class, DELETE bulk
Người dùng
| Tên | Gói | |
|---|---|---|
| Bé An | pa@x.com | Trial |
| Bé Bin | pb@x.com | Active |
Gán 3 học viên vào lớp học
✕- Bé An, con chị Lan Anh
- Bé Bin, con anh Văn Hùng
- Bé Cốm, con chị Thu Hương
Ngày 23/05 lúc 10 giờ 15. Admin đã gán 2 học viên vào Lớp 4.
Ngày 22/05 lúc 18 giờ 02. Admin đã bỏ gán 1 học viên khỏi Lớp 1.
Ngày 22/05 lúc 09 giờ 45. Super Admin đã tạo Lớp 5 và phân cho Cô Lan.
Ngày 21/05 lúc 16 giờ 20. Admin đã gán 8 học viên vào Lớp 3.
Bấm để xem thêm hoạt động cũ hơn
States
- DEFAULT Modal open with selected students listed
- NO-CLASS-SELECTED Confirm button disabled
- SUBMITTING Spinner on button
- SUCCESS Toast rồi đóng modal rồi làm mới A01
- ERROR Inline "Không thể gán. Vui lòng thử lại"
Interactions
- Tap ✕ / Huỷ rồi đóng modal, retain selection in A01
- Select dropdown để bật confirm
- Tap Xác nhận rồi gọi API POST
/admin/students/bulk/assignvà ghi nhật ký entry - Audit log scroll để tải thêm
Data
- Reads: GET
/admin/classes, GET/admin/audit?type=assign - Writes: POST
/admin/students/bulk/assign { class_id, student_ids[], notify }
Thống kê tổng quan toàn hệ thống
Doanh thu tháng này
Số người đăng ký mới
Top âm bị sai nhiều nhất trên toàn hệ thống trong 30 ngày qua
States
- DEFAULT Stats fetched as of "now"
- LOADING Skeleton cards
- STALE Banner: "Dữ liệu cập nhật 5 phút trước"
- ERROR Card-level error with retry per section
Interactions
- Bấm vào ô thống kê để lọc và xem chi tiết trong A01 (sẽ phát triển ở giai đoạn 2)
- Tap "Gói active" rồi hiển thị danh sách view filtered to active
Data
- Reads: GET
/admin/stats/{users, activity, revenue, errors}
👑 Giao diện dành cho Quản trị cấp cao
Theo dõi sức khoẻ hệ thống, chi phí hạ tầng, quản lý các lớp học và giáo viên.
Tình trạng sức khoẻ hệ thống
Các chỉ số hiệu năng
Chi phí dịch vụ Azure trong tháng này
| Tên dịch vụ | Chi phí | Lượng sử dụng |
|---|---|---|
| Chấm điểm phát âm | 284,50 đô la | 12.847 lượt gọi |
| Tổng hợp giọng nói | 38,20 đô la | 1.920 nghìn ký tự |
Dung lượng lưu trữ
Lỗi hệ thống trong 24 giờ qua (báo cáo từ Sentry)
States
- DEFAULT All metrics green dots
- DEGRADED Yellow dot on metric exceeding threshold
- CRITICAL Red dot + auto-alert badge
- STORAGE-WARN R2 > 80% thì red bar
- COST-WARN If month projection > budget threshold thì highlight
Interactions
- Tap metric row rồi sang trang ngoài link (Datadog / Sentry / Posthog)
- Tap Mở Sentry rồi sang trang ngoài auth thì Sentry dashboard
- Tap "Xem chi tiết" thì Sentry critical errors view
Data
- Reads: GET
/sa/health, /sa/azure-usage, /sa/storage, integrations with Sentry/Posthog APIs
Lớp học
| Tên lớp | Giáo viên phụ trách | Sĩ số | Đang hoạt động | Hành động |
|---|---|---|---|---|
| Lớp 1 | Cô Lan | 18 học viên | 16 trên 18 | ⋮ |
| Lớp 2 | Cô Mai | 28 học viên | 24 trên 28 | ⋮ |
| Lớp 3 | Cô Linh | 22 học viên | 19 trên 22 | ⋮ |
| Lớp 4 | Thầy Hùng | 25 học viên | 21 trên 25 | ⋮ |
| Lớp 5 | Chưa có giáo viên | 14 học viên | 9 trên 14 | ⋮ |
Giáo viên
| Họ và tên | Lớp phụ trách | Trạng thái | |
|---|---|---|---|
| 👩Cô Nguyễn Thị Lan | lan.nguyen@cardlish.edu.vn | Lớp 1 | Đang hoạt động |
| 👩Cô Lê Thị Mai | mai.le@cardlish.edu.vn | Lớp 2 | Đang hoạt động |
| 👩Cô Phạm Mỹ Linh | linh.pham@cardlish.edu.vn | Lớp 3 | Đang hoạt động |
| 👨Thầy Trần Quang Hùng | hung.tran@cardlish.edu.vn | Lớp 4 | Đang hoạt động |
| 👩Cô Vũ Thu Hà | ha.vu@cardlish.edu.vn | Chưa được phân lớp | Đang chờ kích hoạt |
Thống kê nhanh
States
- DEFAULT Both tables loaded
- CLASS-NO-TEACHER Row highlighted with "(chưa gán)" + CTA
- TEACHER-PENDING Status "Chờ kích hoạt" (invite sent, not accepted)
- CRUD-MODAL Add/Edit class or teacher modal
- DELETE-CONFIRM "Xoá Lớp 5? 14 học viên sẽ bị bỏ gán"
Interactions
- Tap Thêm lớp học mới rồi mở modal với tên lớp và giáo viên (có thể bỏ qua)
- Tap Mời giáo viên tham gia rồi mở modal với email và họ tên rồi gửi email mời
- Tap row ⋮ rồi mở menu ngữ cảnh với Sửa / Xoá / Gán giáo viên
- Bấm vào dòng để sang trang chi tiết lớp với danh sách học viên (Phase 2)
- Tap "Gán giáo viên cho Lớp 5" rồi mở modal with teacher dropdown
Data
- Reads: GET
/sa/classes,/sa/teachers - Writes: POST/PATCH/DELETE on
/sa/classes,/sa/teachers/invite
Tổng cộng 29 màn hình chi tiết, cho 4 vai trò người dùng, tối ưu cho điện thoại 375px
Bản quyền thuộc Syncore và Cardlish. Đã được duyệt ngày 24 tháng 5 năm 2026.