Mentor và album ảnh trên trang chủ
Hai khối trên trang chủ www.conan.school có mục đích tăng niềm tin: album ảnh của các buổi học đã diễn ra, và mentor kèm một câu quote. Cả hai đều do người soạn nhập ở admin.conan.school, không có nội dung viết cứng trong mã.
Album ảnh
| Lớp | Chỗ |
|---|---|
| Nhập liệu | admin, /ops/marketing/photos (legacy/admin-marcom/src/pages/MediaLibraryPage.tsx) |
| Bảng | media_albums, media_photos, media_album_photos (migration 0076 trở đi) |
| Ảnh | nén WebP tối đa 300 KB bằng binding IMAGES, lưu R2 conan-cms, phục vụ ở image.conan.school |
| API công khai | GET /api/public/albums, /albums/featured, /albums/:slug |
| www | trang chủ: dải 6 ảnh featured + lưới tối đa 4 album; trang /photos, /photos/:slug |
Trang chủ chỉ hiện album có ảnh bìa và ít nhất một ảnh. Muốn một album lên trang chủ: thêm ảnh vào album; muốn ẩn: đặt hidden_at (nút ẩn trong admin). Thứ tự theo display_order của album.
Mentor
| Lớp | Chỗ |
|---|---|
| Nhập liệu | admin, /community/mentors (legacy/admin-members/src/pages/MentorsPage.tsx) |
| Bảng | legacy_mentors (cột status, sort_order), mentor_stories |
| API admin | GET/POST /api/admin/mentors, GET/PATCH/DELETE /api/admin/mentors/:id, POST /:id/avatar, GET/POST /:id/stories, PATCH/DELETE /stories/:sid, GET /options/courses |
| API công khai | GET /api/public/mentors (kèm quote), GET /api/public/mentors/stories?course=<id hoặc slug>, GET /api/public/mentors/:slug (kèm stories) |
| www | trang chủ: tối đa 8 thẻ mentor kèm quote; /mentors/:slug hiện quote & story nhóm theo khoá; /courses/:slug hiện khối "Mentor chia sẻ về chương trình" |
Các quyết định, học từ dolphin.nemo12.com
- Ba trạng thái:
draft,published,archived. Mentor mới luôn bắt đầu ởdraft. - Gác xuất bản ở máy chủ. Thiếu họ tên, slug, chức danh, ảnh chân dung hoặc tiểu sử thì
PATCH status=publishedtrả 409 kèm danh sách thiếu. Danh sách admin trả kèmpublish_blockersđể UI khoá nút và nói rõ còn thiếu gì trước khi bấm. - PATCH chỉ ghi khoá có mặt. Sửa một ô không xoá ô khác.
- Thứ tự theo bước 10 (
sort_order), chèn người vào giữa không phải đánh số lại. - Slug lưu cố định, không sinh lại khi đổi tên: đổi slug là link cũ hỏng.
- Liên kết phải bắt đầu bằng
http, chặnjavascript:. - Không xoá người còn gắn khoá học hoặc cảm nhận, gợi ý "Lưu trữ".
- Ảnh chân dung đi cùng đường ống ảnh của album; mỗi lần tải là một khoá R2 mới vì URL được cache
immutablemột năm.
Quote và story theo chương trình
Mỗi mục trong mentor_stories thuộc một mentor, có kind là quote (tối đa 400 ký tự) hoặc story (bắt buộc tiêu đề), và course_id:
NULL= dùng chung, hiện ở trang chủ (quote đầu tiên) và trang mentor.- id một khoá = gắn với chương trình đó.
course_iddùng được cho cảlegacy_courseslẫncoursesvì hai bảng chung id; vì vậy bảng không khai FOREIGN KEY tới khoá.
Thẻ trên trang chủ lấy một quote mỗi người, ưu tiên quote dùng chung. Trang khoá /courses/:slug gọi GET /api/public/mentors/stories?course=<slug> song song với hai lượt gọi khác của loader, và chỉ hiện mục gắn đúng khoá đó (mục dùng chung không lặp lại ở mọi trang khoá). Lượt gọi hỏng thì khối ẩn, trang khoá vẫn phục vụ.
Hỏng mà vẫn trông như đang chạy
Xem known-risks: trước 03.10.2026 danh sách mentor công khai là 5 slug viết cứng, và hai truy vấn lọc theo cột is_active không tồn tại.