Trình đọc sách: người đọc cần làm gì
Trang này đóng vai người đọc sách nghề trên tokyo (chủ quán, trưởng nhóm, nhân viên văn phòng, đọc trên điện thoại giữa hai ca hoặc trên máy tính buổi tối) và viết ra các việc họ cần làm khi đọc, kèm điểm vướng của từng việc. Mỗi tính năng của trình đọc phải trỏ về được một việc ở đây; tính năng không trỏ về việc nào là đồ trang trí.
Đối chiếu: Apple Books là trình đọc mà phần đông người đọc trên iPhone/Mac đã quen, nên những gì nó làm tốt là mức người đọc kỳ vọng sẵn.
Bảy việc của người đọc
| # | Việc (Job to be done) | Điểm vướng (Pains) |
|---|---|---|
| 1 | Quay lại đúng chỗ đang đọc sau một khoảng gián đoạn (hết giờ nghỉ, chuyển máy) | Mở lại quyển là về trang bìa; phải tự nhớ đang ở chương nào; tải lại trang là mất chỗ; nút Back của trình duyệt thoát hẳn khỏi quyển |
| 2 | Đọc liền mạch hết một chương | Đọc xong một section phải quay ra trang chương rồi chọn tiếp; không biết chương còn dài bao nhiêu nên không dám bắt đầu khi chỉ có 10 phút |
| 3 | Đọc dễ chịu trên thiết bị và giờ giấc của mình | Chữ nhỏ trên điện thoại; nền trắng chói khi đọc tối; dòng chữ sát nhau khó dò |
| 4 | Biết mình đã đi được bao xa | Không có tiến độ cả quyển hay cả chương; không thấy section nào đã đọc, section nào chưa |
| 5 | Định hướng và nhảy tới phần cần (tra lại một mục, đọc không theo thứ tự) | Mục lục chỉ ở trang tổng quan; đang đọc giữa section muốn nhảy phải quay ra |
| 6 | Nhớ và mang ý ra dùng (giữ lại câu đáng nhớ, ghi chú việc phải làm) | Không đánh dấu được câu nào; ghi chú phải chép sang ứng dụng khác |
| 7 | Hình dung được vấn đề trước khi đọc chữ | Mỗi section là một tường chữ; mười section trông y hệt nhau nên khó nhớ section nào nói gì |
Đối chiếu Apple Books
| Apple Books | Việc | Conan (03.10.2026) |
|---|---|---|
| Mở là về đúng trang đang đọc; "Continue reading" ở thư viện | 1 | Có: nút "Đọc tiếp" đầu trang quyển, vị trí đọc nằm trên URL (?c=2&s=3) nên tải lại/Back/gửi link đều đúng chỗ |
| Lật trang liên tục sang chương sau | 2 | Có: cuối section có "Trước / Tiếp", sang được cả chương kế |
| "X phút còn lại trong chương" | 2, 4 | Có: ước lượng theo 200 chữ/phút trên thân bài thật của các section còn lại |
| Nút "Aa": cỡ chữ, phông, nền (trắng/sepia/tối), giãn dòng | 3 | Có: bốn cỡ chữ, ba mức giãn dòng, ba nền (Sáng/Giấy/Tối), nhớ theo thiết bị |
| Thanh tiến độ cả quyển | 4 | Có: ở khối "Đọc tiếp" (số section đã đọc / tổng) và trong mục lục từng chương |
| Mục lục mở đè lên trang đang đọc | 5 | Có: nút "Mục lục" mở ngăn bên, có dấu đã đọc |
| Đánh dấu câu nhiều màu, ghi chú, trang Ghi chú | 6 | Chưa: cần bảng lưu và cách neo đoạn chọn vào Portable Text (xem dưới) |
| Bookmark trang | 6 | Chưa, gộp chung với đánh dấu câu |
| Tìm trong quyển | 5 | Chưa |
| Đọc to (Speak Screen) | 3 | Chưa, dùng tính năng đọc màn hình của hệ điều hành |
| Mục tiêu đọc mỗi ngày, chuỗi ngày đọc | 4 | Chưa, dữ liệu đã có (sự kiện đọc), chỉ thiếu giao diện |
| Ảnh minh hoạ trong sách | 7 | Có (thí điểm "Đêm trống"): mỗi chương và section một ảnh, xem Ảnh minh hoạ chương/section |
Lỗi đã gặp khi làm: dữ liệu đọc chưa từng được ghi
Trước khi làm "Đọc tiếp", bảng legacy_ebook_learning_events có 0 dòng, tức trình đọc chưa từng ghi được một sự kiện đọc nào. Hai chỗ chặn cùng lúc:
- Lệnh ghi là
upsert ... ON CONFLICT (event_id)nhưng bảng không có ràng buộc duy nhất trênevent_id, nên SQLite ném lỗi ở mọi lượt ghi (migration20261007athêm chỉ mục duy nhất). - Schema API bắt
ebook_id,section_idlà UUID, mà 216/245 quyển có id dạngfood-book-03.
Client nuốt lỗi, nên trang đọc chạy trơn tru và không ai thấy. Hệ quả kéo dài: không có tiến độ đọc, và Learner Model không nhận được bằng chứng đọc sách nào. Xem known-risks.
Kiểm trên production (03.10.2026): bốn lỗi chỉ thấy khi dùng thật
| Thấy gì | Vì sao | Sửa |
|---|---|---|
| Ảnh minh hoạ mất ~4 giây mới hiện | middleware chung của api ghi đè mọi Cache-Control thành no-store, Worker vẽ lại SVG mỗi lượt | bỏ qua /api/book-art/* (src/index.ts) |
| "Hết chương" ở section 1/4 | section sau bị khoá (chưa Pro) trả thân bài rỗng, đếm ra 0 chữ | đếm không được thì nói "còn N section" |
| Nền Tối thành hộp đen giữa trang trắng | thuộc tính chủ đề đặt trên div bọc nội dung | đặt lên <main> (không phải <html>, vì thanh trên dùng token foreground làm nền) |
Link ?c=&s= sau đăng nhập về trang bìa | root.tsx chỉ chuyển pathname vào next | chuyển cả pathname + search |
Đã xác nhận cùng lượt kiểm: sự kiện đọc vào D1 thật (book_open, chapter_view, section_view), và SVG phục vụ trên production khớp từng byte với bản xem trước ở máy.
Việc kế tiếp, theo thứ tự đáng làm
- Đánh dấu và ghi chú (việc 6): bảng
ebook_highlights(user, section, khối_key, vị trí ký tự, màu, ghi chú); neo theo_keycủa khối Portable Text vì khối có khoá ổn định qua các lần sửa chữ. - Mục tiêu đọc mỗi ngày (việc 4): tính từ
reading_heartbeatđã có. - Tìm trong quyển (việc 5).
- Ảnh minh hoạ cho 244 quyển còn lại (việc 7): xem skill
book-illustrations.