6.2 KiB
6.2 KiB
项目长期记忆(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)。 - 占位模块组件已清理(2026-08-29):
components/pages/下About/Contact/LatestProjects/Portfolio/Login/Register/AuthForm/article等占位/旧详情组件查无引用、也不是真实路由,已删除并移除空目录。这些模块的导航链接(/about/contact/portfolio/latest-projects/login/register)仍是死链——从未有对应页面,待用户决定是否移除导航项。导航(header)本身保持原样未改动(用户 2026-08-07 明确「header 别动」)。/en/login、/en/register实际并非真实页面(旧 MEMORY 记录有误),AuthForm 组件已随清理删除。
架构总览
- 前端: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_v2scripts/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、资源命名showsvsarticles、popularvsfeatured(目标清单见 artifactapi_endpoints_catalog.md)。 - CSS:能 @apply 就 @apply;
<style>顶部@reference "tailwindcss";。Tailwind v4 无零值类。 - 导航(Layout.astro)保持原样未改动(用户「header 别动」),但其部分链接(/about /contact /portfolio /latest-projects /login /register)指向不存在的路由,属待清理死链。
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。
前端组件复用(2026-08-29)
- 详情页统一
/item:走秀 lookbook 与街拍详情全部收口到src/pages/{locale}/item/[id].astro,服务端按getSsrArticle(id)→getSsrStreetSnap(id)回落渲染(先 runway 后 street)。ROUTES.article与ROUTES.streetSnap均指向/item/${id}(runway-looks/[id]、street-snaps/[id]、article.astro(?id=)等旧详情页均已删除)。列表页回链仍指向列表/runway-looks、/street-snaps。 - 列表页共享资源:两个列表组件(RunwayLooks / StreetSnaps)同构,抽成
src/styles/look-grid.css(卡片/网格/分页/侧栏/spinner/骨架/动画)+src/lib/looks-grid.ts(SPIN_SVG、makeCardSlots(images,count,opts)、buildPageList(total,cur));品牌筛选弹窗src/components/BrandModal.astro(仅 RunwayLooks 用,openBrandModal/confirmBrandModal等由页面脚本驱动)。卡片标记因在 Alpinex-for内客户端渲染,不能提成 Astro 组件。
部署(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。