Skip to content

Ảnh minh hoạ khoá học: cover, thumbnail, avatar ​

Mỗi khoá có một cảnh, ba khổ, mỗi khổ vẽ lại bố cục (không cắt từ nhau):

KhổviewBoxBố cụcHiện ở
cover0 0 1600 900cảnh rộng, vật chính lệch phải, dải mặt quầy dưới ~30%hero trang khoá (www), thẻ 16:9 (www)
thumb0 0 1200 900gọn hơn, vật chính to hơn, bớt vật phụthẻ khoá ở /c/:slug (tokyo, 4:3)
avatar0 0 512 512chỉ vật chính, nét dày, trong vòng tròn r=210thẻ vuông "khoá của tôi", danh sách (tokyo)

Nguồn sự thật ​

  • Tệp: com.conan.school/public/images/course-art/<slug>-{cover,thumb,avatar}.svg, <slug> là slug của legacy_courses (slug tiếng Việt), khớp theo course_id, không theo slug pack.
  • Prompt + metadata: api.conan.school/content/courses/art/<community>.json. Mỗi khoá có source (câu hỏi lớn, outcomes, tên unit, trích từ pack), scene, hero_object, supporting, why (vì sao vật này nói đúng khoá), layouts (bố cục thực tế ba khổ), prompt (≥ 160 ký tự). Đầu tệp có style và avoid (ý đã dùng ở bìa sách cùng kệ).
  • D1 (20260930a): legacy_courses.art_cover_url / art_thumb_url / art_avatar_url (đường dẫn cùng gốc tokyo), art_prompt, art_meta_json. Không ghi đè cover_prompt, cột đó đi với cover_svg thế hệ trước.

Đường đi của ảnh ​

shared/svgDataUri.ts → withCourseArt(row, { absolute }) trả image_url (cover), thumbnail_url, avatar_url: image_url tải lên > art_*_url > cover_svg (data URI). Cột thô không bao giờ ra ngoài. absolute: true cho route công khai mà www gọi (public/courses, public/misc), đường dẫn tương đối ở www trỏ vào chính www và ra ảnh hỏng im lặng.

Dùng ở: communities/:slug/courses, communities/:slug/home, api/learning/courses (trước đây trả nguyên chuỗi cover_svg ra ngoài, đã gỡ), public/courses*, public/misc. Frontend: tokyo c.$slug.tsx (thumbnail), CourseCard/CourseCover (avatar, lùi về bảng slug cứng), www _index, courses, courses.$slug (cover, lùi về bảng slug cứng).

Lệnh ​

bash
cd api.conan.school
python3 scripts/course_art_to_sql.py inputs drink            # metadata khoá để phân cảnh
python3 scripts/course_art_to_sql.py check drink             # cửa kiểm
python3 scripts/course_art_to_sql.py preview drink /tmp/d.html
python3 scripts/course_art_to_sql.py sql drink > migrations/<prefix>_course_art_drink.sql

Bẫy đã gặp ​

  • Vẽ song song mà chưa phân cảnh thì mười agent vẽ mười cái ly. Người điều phối chốt scene/hero_object trước; cửa kiểm chặn hero_object trùng trong một cộng đồng.
  • id gradient trùng giữa các SVG cùng một trang HTML: url(#vg) trỏ về định nghĩa đầu tiên của cả trang (bẫy đã gặp ở bìa sách). Mọi id mang hậu tố -<slug>-<khổ>.
  • Bảng slug cứng (app/lib/course-images.ts ở cả tokyo và www) từng đè mọi ảnh từ API. Giờ nó chỉ là đường lùi.
  • Chỉ một màu nhấn nên trái cây/nguyên liệu khác màu ngoài đời phải phân biệt bằng hình, không bằng màu.

Chạy cho nhiều cộng đồng cùng lúc ​

Mỗi cộng đồng một agent "trưởng nhóm" (brief: phân cảnh → giao vẽ → gộp → kiểm → migration), mỗi khoá một agent vẽ. Ba bẫy của cách chạy này, đều đã gặp 27.09.2026:

  • Thông báo hoàn thành của agent vẽ đi về người điều phối, không về trưởng nhóm, trưởng nhóm "đợi" mãi. Trưởng nhóm phải tự theo dõi tệp frag, không kết thúc lượt để đợi.
  • Thư mục làm việc chung: hai agent cùng đặt tên gen7.py thì một agent chạy nhầm script của khoá khác và ghi đè ảnh. Mỗi agent vẽ dùng work/<slug>/ riêng.
  • Cửa kiểm chỉ đọc mã, không đọc hình: chữ "vẽ ra bằng hình" (hàng ghế hình chữ L) và vật không nhận ra được (tay thành ống nhòm) qua cửa xanh. Trưởng nhóm phải xem bảng tổng các cover bằng mắt trước khi báo xong.

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