6.3 KiB
6.3 KiB
2026-08-08
走秀数据分类设计(进行中,尚未落地)
- 用户希望给 brand_runway 加分类:地理(国家/城市)、系列(季节/类型如 Resort/春季巡游)、时间(year)。
- 现状:brand_runway 仅有 year,无 city/country/season/type 字段。source_url 形如
vogue.com/fashion-shows/fall-2017-ready-to-wear/fendi/...不含城市,无法自动解析城市。 - 采样确认 title 为 Vogue 标准格式,系列+季节+年份 100% 可正则解析
^(Spring|Fall|Resort|Pre-Fall)\s+(\d{4})\s*(.*)$(已验证 600 条)。 - 三维模型:① 地理(国家→城市→地区)② 系列(collection_type: rtw/menswear/couture/resort/pre_fall × season: spring/fall)③ 时间(year)。
- 用户修正:城市 ≠ 品牌总部城市(Fendi 总部罗马但 RTW 在米兰走;Valentino 意牌在巴黎走;Resort/早秋满世界巡演)。
- 主系列(rtw/menswear/couture)城市 = 「品牌所属时装周城市」映射(非总部,更准),内置主流品牌映射表自动填充。
- Resort/Pre-Fall 为巡演系列,城市不固定,UI 归「巡演/Cruise」桶,不硬绑城市。
- country/region 由 city→country 推导。
- 待用户确认是否落地(字段+迁移+回填脚本+API 筛选+前端筛选器)。
网络抓取城市可行性实测(结论:不现实)
- 实测拉取 Vogue 真实秀场页(vogue.com/fashion-shows/fall-2017-ready-to-wear/fendi/slideshow/collection, 5.8MB):
- title 仅 "Fendi Fall 2017 Ready-to-Wear Fashion Show",无城市;正文 city 命中全是误命中(Romee Strijd 模特名 / model-romee-strijd.jpg / 文案)。
- 唯一结构化片段
{"name":"New York City","score":1}/{"name":"Rome","score":1}是相关实体联想,非秀场城市,不可信。 - Vogue 现 URL 已去掉城市段,无法反推。
- 数据集 total=25206 条;逐页爬 25k 需 ~14h(礼貌速率)+ Cloudflare/封禁/ToS 风险 → 不现实。
- 现实方案:品牌→所属时装周城市映射表(非总部,准确捕捉 Fendi→Milan 等),主系列秒级批量回填;Resort/Pre-Fall 归「巡演/Cruise」桶不绑城市。
落地:三维分类 + 筛选(已完成)
- 用户选「暂不做城市维度」,只做 系列+季节+年份 三维与筛选。
- models.go: BrandRunway 加 collection_type/season/season_code 三字段。
- main.go: migrateSchema 加三列 + backfillRunwayClassification()(单条 UPDATE CASE 解析 title 回填,幂等);仅处理 collection_type='' 行。重启后端实测 25206 行 ~338ms 完成。
- handlers/public_article.go: PublicListArticles 加 ?collection_type=&season=&season_code=&year= 筛选,响应含三字段。
- 前端: data.ts RawArticle 增可选三字段; articles.astro 加 #typefilter/#seasonfilter 两组 chips,loadBackend() 带参重拉。
npm run build通过;dist/articles 含筛选条,JS 含 collection_type 参数。- 分布: rtw 15203 / menswear 4061 / couture 672 / resort 2894 / pre_fall 2376;spring 9140 / fall 9049。
首页发布会面板优化(已完成)
- 用户要求:① 首页也展示「系列 + 季节」标签;② 优化发布会面板更吸引人。
- data.ts: ArticleCard 增加
collection_type/season_code两字段(mapArticle 透传);新增SERIES_LABELS+seriesLabel()(rtw→成衣 RTW / menswear→男装 / couture→高定 / resort→度假 / pre_fall→早秋)。 - index.astro 发布会面板重构:
- 区块标题
RUNWAY ARCHIVE / 走秀档案+ 「全部走秀 →」(链 /articles)。 - 系列快速筛选条
#seriesbar(全部/成衣/男装/高定/度假/早秋),前端按data-ct本地过滤 Hero + 网格,纯本地无请求;空结果显示#showempty。 - 精选 Hero(取 shows[0]):大图 + 品牌大字 + 系列/季节 chip + 查看全部 N 张,形成视觉焦点。
- 网格卡片(剩余 shows)品牌名下方加
prod-meta行: [系列中文] + [season_code 如 FW16] 小 chip。 - 卡片底部改纯 CTA(去掉原 AW16 season 文本与 new/hot 徽标,改由系列/季节 chip 表达)。
- JS 同步:ensurePanelData 透传 collection_type/season_code;cardHTML 渲染 prod-meta(此路径首页当前为死路径,仅保持一致)。
- 区块标题
npm run build通过;dist/index.html 校验:sec-head/seriesbar/feat/prod-meta/prod-chip 均在,真实 season_code(SS16/FW16/PF16…)与中文系列标签分布正确,Hero 显示 FENDI。- 预览: http://localhost:4420/ (构建需带 PUBLIC_API_BASE 才能让 SSR 首页拉到真实数据;Docker 生产因 PUBLIC_API_BASE 为空、index.astro 用顶层 await getShows 会导致首页空——属既有行为,非本次引入)。
首页 feat 竖版拼图 + 查看更多 + /shows 页(已完成)
- 用户要求:① 首页走秀栏加「查看更多」;② 加一个「所有走秀」页面;③ feat 图都是竖版,问能否改成多竖版或更好创意。
- feat 创意:用同一场秀自己的 gallery(loadArticlesWithImages 带 with_images=5,每秀最多5张 own looks)做「左侧大竖图 + 右侧 3 张竖版 rail」编辑拼图(aspect 3/4),比混排不同秀更好——保留单一焦点秀场且尊重竖版比例。优于用户提的"多竖版混排"。
- index.astro 改动:
- 前端 matter 计算
feat = shows[0]、featRail = gallery.slice(1,4)(不足则退化为 [img])。 - feat 块重写为 feat-main(竖图 + feat-fill 渐变浮层含品牌/系列/季节/CTA) + feat-rail(3 个竖版 rail-item)。
- CSS: 删旧 .feat hero(4:3),加 .feat-main/.feat-fill/.feat-ovl/.feat-rail/.feat-rail-item(全部 3:4 竖版)。
- 网格下加 #showmore 按钮 + .showmore CSS。
- JS: 系列筛选 IIFE 重构为
seriesApply()暴露homeFType;新增 load-more IIFE(fetch ?page=2..&size=8&with_images=5 追加到 #showgrid,带 homeFType,无更多显示「没有更多了」)。 - sec-more「全部走秀 →」href 改 /shows。
- 前端 matter 计算
- 新建 src/pages/shows.astro(所有走秀页):基于 articles.astro,标题「All Runway」;保留系列/季节/品牌筛选 + 三视图(Grid/Magazine/Timeline);新增分页 Load More(page/total/busy,append 模式,后端 ?page=&size=30&with_images=5);SSR getShows(30) 覆盖;cardTemplate 用
data-ct与 date 字段,去掉 fmtDate 依赖。 npm run build通过(11 页);dist 校验:首页 feat-main/feat-rail/3 rail-item/showmore 均在(共4竖图),系列标签分布正确;/shows 含 All Runway + loadmore + 30 SSR 卡片。- 后端验证:page=2 size=8 with_images=5 返回 8 行带 images;collection_type=resort 筛选正确。
- 预览: http://localhost:4430/ 与 http://localhost:4430/shows/ 。