Skip to content

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ớpChỗ
Nhập liệuadmin, /ops/marketing/photos (legacy/admin-marcom/src/pages/MediaLibraryPage.tsx)
Bảngmedia_albums, media_photos, media_album_photos (migration 0076 trở đi)
Ảnhné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 khaiGET /api/public/albums, /albums/featured, /albums/:slug
wwwtrang 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ớpChỗ
Nhập liệuadmin, /community/mentors (legacy/admin-members/src/pages/MentorsPage.tsx)
Bảnglegacy_mentors (cột status, sort_order), mentor_stories
API adminGET/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 khaiGET /api/public/mentors (kèm quote), GET /api/public/mentors/stories?course=<id hoặc slug>, GET /api/public/mentors/:slug (kèm stories)
wwwtrang 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=published trả 409 kèm danh sách thiếu. Danh sách admin trả kèm publish_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ặn javascript:.
  • 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 immutable mộ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_id dùng được cho cả legacy_courses lẫn courses vì 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.

Tài liệu nội bộ nền tảng Conan School.