Files
frontend_v2/.workbuddy/memory/MEMORY.md
toom1996 eee2265e15
Some checks failed
deploy / deploy (push) Has been cancelled
update
2026-08-26 19:42:10 +08:00

4.7 KiB
Raw Blame History

项目长期记忆(Project MEMORY.md)

模块策略(重要)

  • 站点按模块逐个完善。当前上线「发布会模块」:首页 index + 走秀列表/详情(RunwayLooks = 走秀档案页,articles/shows 页面已在 i18n 重构中重组)。
  • 品牌索引页已下线(2026-08-26 确认):src/pages/brands.astro 及孤儿组件 src/components/pages/brands.astro 均已删除;品牌数据现在只通过走秀页侧栏 filter + 品牌弹窗呈现(热门 30 条走 SSG 接口,搜索/字母走运行时 /api/v1/public/brands)。
  • 其余模块(Portfolio / Latest Projects / About / Contact / 根路径登录注册)为 ComingSoon 占位页;导航(header)保持原样未改动(用户 2026-08-07 明确「header 别动」),门禁完全靠占位页实现。/en/login、/en/register 已是真实页面(AuthForm.astro,mode login/register)。

架构总览

  • 前端:d:/project/frontend_v2 — Astro SSG + Tailwind v4 + Alpine.js。npm run build(SSG 取数走 ssgRequest,失败回落空/假数据不影响构建)。
  • 后端:d:/project/backend_v2 — Go + Gin + GORM(MySQL),公开引擎 :8090(/api/v1/public/*、/api/v1/auth/*),SSG 内部引擎 :8091(仅 127.0.0.1,/api/v1/ssg/*,SSGToken 中间件,nginx 不反代)。
  • SSG 分组现状(2026-08-26):只剩两个端点——/api/v1/ssg/index/runway(首页 runway 区块,IndexService.Runway,hotBrand 20 条)+ /api/v1/ssg/brands/hot(走秀页热门品牌,BrandService.Hot,固定 30 条、按图片总数热度顺序,零参数)。/ssg/brands(全量 A-Z)与 /ssg/articles/ids 均已删除。
  • 接口 i18n 约定:后端按 ?locale=cn|en 选列返回(pickLocale 缺翻译回落另一语言);前端取数统一复用带 locale 的原语(request/ssgRequest 等),绝不裸写 fetch;语言以 URL 前缀为准。
  • 走秀标题 title_cn 已规则回填(backend_v2 scripts/backfill_title_cn/main.go,幂等);description_cn 为空白属预期,中文页回落英文。

关键约定

  • 视觉语言:黑白极简编辑风(monospace + Georgia 衬线大标题 + 细线),HBX / 时尚档案调性。字体全走 Tailwind 体系,禁止自写字体栈。
  • 品牌名前端一律只显示英文(用户偏好 2026-08-26:「前端品牌不要展示中文名称,标题可以留着」):api.ts 映射 display = nameEn;走秀标题/描述仍按 locale 选列。
  • API 命名哲学(用户原则):「每一个地方尽可能不要通过参数来复用接口,尽量一个功能一个接口」。查询参数仅限「同一资源的列表筛选/分页」;跨资源/独立功能一律独立路径(如 brands/hot 而非 ?featured=1)。待办:公开侧 /api/v1/public/brands 的 featured/keyword/letter 参数拆分、/articles 的 brand_id 拆 brands/:id/shows、资源命名 shows vs articles、popular vs featured(目标清单见 artifact api_endpoints_catalog.md)。
  • CSS:能 @apply 就 @apply;<style> 顶部 @reference "tailwindcss";。Tailwind v4 无零值类。
  • 导航(Layout.astro)保持原样,门禁仅由占位页承担。

Layout 陷阱(2026-08-12)

  • Layout 把 <slot /> 包在 flex-1 flex flex-col 容器里;页内根容器禁用 m-auto(cross-axis margin:auto 触发 shrink-to-fit → 内容多少决定宽度、页面抖动)。用 w-full(可配 max-w-[xxx] + mx-auto)。

Astro <script> 两大坑

  • 作用域隔离:frontmatter 的 import/变量在打包型 <script> 里拿不到(运行时 ReferenceError);脚本里要用什么就在脚本顶部重新 import。
  • 不做模板插值:打包型 <script> 里 {t('...')} 不会被执行 → t is not defined。预翻译用 define:vars={{ hiLabel }} 注入;模板区 {t()} 正常。
  • 打包后脚本在 _astro/*.js 而非内联;查 dist 产物用 search_content(ripgrep),PowerShell 无 Select-String -Recurse。

走秀数据分类(brand_runway)

  • 三维分类字段:collection_type(rtw/menswear/couture/resort/pre_fall)、season(spring/fall/null)、season_code(SS26/FW25…派生)。靠 title 规则回填(幂等,25,206 行)。
  • 公开列表 ?collection_type=&season=&season_code=&year= 筛选;前端走秀页有系列/季节/年份 chips。
  • 地理/城市维度:用户明确暂不做。
  • 分布:rtw 15203 / menswear 4061 / couture 672 / resort 2894 / pre_fall 2376。

部署(Docker + Gitea Actions)

  • 交付文件:前端 Dockerfile / nginx.conf / docker-compose.yml / deploy.sh / .gitea/workflows/deploy.yml / .env.example / DEPLOY.md;后端 Dockerfile。nginx 拦截 /api/v1/ssg/ 404;健康检查 /api/v1/public/brands。