Web App
HTTPS + IndexedDB cache. Luôn ưu tiên server, có thể giữ draft/note nhẹ khi mất mạng.
Web và bản cài trên máy dùng cùng API, cùng quyền và cùng cloud database. Desktop chỉ giữ cache/offline queue; khi có mạng, mọi thay đổi đi qua Sync Engine rồi mới trở thành dữ liệu chính thức trên server.
HTTPS + IndexedDB cache. Luôn ưu tiên server, có thể giữ draft/note nhẹ khi mất mạng.
PostgreSQL + Storage + Realtime + Auth. Đây là nguồn sự thật duy nhất cho toàn bộ tổ chức.
Cùng frontend, đóng gói bằng Tauri. SQLite cache + file cache + Outbox để làm việc khi offline.
Những chỉ số này phải có trên cả web và desktop để người dùng luôn biết dữ liệu đã lên cloud chưa.
Không phải chức năng nào cũng nên cho “offline rồi tự ghi đè”; các phần nhạy cảm cần policy khác nhau.
| Tính năng | Web online | Desktop online | Desktop offline | Khi có mạng lại | Quy tắc xung đột |
|---|---|---|---|---|---|
| Tài khoản / vai trò / quyền | Đầy đủ | Đầy đủ | Dùng quyền đã cache | Refresh token + quyền mới | Server luôn thắng; role bị thu hồi phải khóa local ngay khi sync. |
| Lịch lớp / giáo viên / dạy thay | Tạo & xác nhận | Tạo & xác nhận | Chỉ lưu nháp | Server chạy conflict check rồi mới publish | Hard conflict không auto-merge |
| Điểm danh | Realtime | Realtime | Được nhập | Sync từng học viên | Merge theo record học viên; nếu 2 GV sửa cùng một người thì hiện conflict. |
| Đăng thông báo / note lớp | Đăng ngay | Đăng ngay | Queue | Đăng theo thứ tự Outbox | Post mới là append-only; edit dùng version. |
| Tạo bài tập / test | Đầy đủ | Đầy đủ | Draft được | Upload file → kiểm tra → publish | Không publish offline nếu có deadline/lịch cần kiểm tra. |
| Làm test online | Autosave | Autosave | Nếu test đã tải | Gửi attempt + answers | Final submit bất biến theo attempt ID; không để answer key nhạy cảm trong cache. |
| Nộp bài file / PDF / Word / Excel | Upload | Upload | Queue file | Resumable upload + checksum | Chỉ hiện “Đã nộp” sau server ACK; trước đó là “Chờ đồng bộ”. |
| Bài luyện nói / audio | Upload | Record + upload | Record local | Resume upload khi online | Giữ file local tới khi server xác nhận hash + storage object. |
| Chấm điểm / feedback | Đầy đủ | Đầy đủ | Draft feedback | Optimistic-lock publish | Nếu bài đã được GV khác chấm, bắt buộc chọn bản nào giữ. |
| Sổ tay / từ vựng / ngữ pháp | Đầy đủ | Đầy đủ | Đầy đủ | Delta sync từng item | Item UUID riêng; sửa khác trường thì merge, cùng trường thì hỏi người dùng. |
| Chat / comment / reaction | Realtime | Realtime | Queue gửi | Send theo client_message_id | Idempotent; không gửi trùng khi retry. |
| Tài liệu đã tải về | Browser cache | File cache | Xem offline | Kiểm tra version/hash | File mới tạo version mới; không ghi đè file đang mở. |
| Khóa học hết hạn / archive | Server | Server | Read-only cache | Nhận trạng thái mới | Server authoritative; local tự khóa khi nhận trạng thái ended/archived. |
Thử tắt mạng rồi tạo các thay đổi. Khi online lại, Sync Engine đẩy từng mutation và kiểm tra quyền/xung đột.
Frontend web và desktop tuyệt đối không tự coi local database là nguồn chính.
Người dùng chọn khóa cần mang theo. Không tải toàn bộ dữ liệu doanh nghiệp về máy.
Sync tốt không chỉ “retry”; phải giúp người dùng hiểu bản nào mới hơn và tránh ghi đè im lặng.
Desktop: Group B · 18:30–19:30 · tạo 16:20 offline.
Cloud: Cô Hà đã được gán IELTS B1 · 18:00–19:30 · cập nhật 16:27.
Ưu tiên tài liệu của 3 buổi tới + assignment đang mở + audio đã ghim; không tải toàn bộ kho tài nguyên.