Ả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ổ | viewBox | Bố cục | Hiện ở |
|---|---|---|---|
| cover | 0 0 1600 900 | cả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) |
| thumb | 0 0 1200 900 | gọn hơn, vật chính to hơn, bớt vật phụ | thẻ khoá ở /c/:slug (tokyo, 4:3) |
| avatar | 0 0 512 512 | chỉ vật chính, nét dày, trong vòng tròn r=210 | thẻ 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ủalegacy_courses(slug tiếng Việt), khớp theocourse_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óstylevà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ớicover_svgthế 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
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.sqlBẫ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_objecttrước; cửa kiểm chặnhero_objecttrù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.pythì một agent chạy nhầm script của khoá khác và ghi đè ảnh. Mỗi agent vẽ dùngwork/<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.