Lanhu Design
概览
通过内置脚本直接调用蓝湖 HTTP API,读取 UI 设计稿、分析设计规格、获取切图信息,并把切图落到当前项目的资源目录。
需要详细工具契约、返回结构和还原规则时,读取 references/lanhu-design-tools.md。
需要设计还原实现规则(CSS 值保真、DOM 结构映射、切图命名策略、目录选择、倍率指引)时,读取 references/design-implementation-rules.md。
前置条件
所有脚本依赖 LANHU_COOKIE 环境变量。蓝湖没有公开 API 或 OAuth,脚本通过浏览器会话 Cookie 模拟登录用户请求。Cookie 缺失或过期时,脚本调用报认证错误。
获取 Cookie 的步骤:
- 在浏览器打开
https://lanhuapp.com并登录。 - 按 F12(macOS 为 Cmd+Option+I)打开开发者工具,切换到 Network 标签页。
- 刷新页面,在请求列表中点击任意
lanhuapp.com请求。 - 在 Request Headers 中找到
Cookie字段,复制完整值(通常 200–500 字符)。 - 将该值设置为环境变量
LANHU_COOKIE。
注意事项:
- Cookie 会过期(通常数天到数周),出现认证错误时需重新获取。
- Cookie 是敏感凭据,不要提交到版本控制或输出给用户。
- 所有脚本需要 Node.js >= 18(使用原生 fetch)。
脚本列表
| 脚本 | 用途 |
|---|---|
scripts/get_designs.mjs |
列出蓝湖项目的设计图 |
scripts/get_design_specs.mjs |
获取设计规格 HTML+CSS(主路径:DDS Schema;降级:Sketch JSON) |
scripts/download_design_images.mjs |
下载设计图原图到本地目录(视觉校验用) |
scripts/get_design_slices.mjs |
获取单个设计图的切图/素材元数据 |
scripts/download_slices.mjs |
从切图 JSON 批量下载切图文件 |
scripts/lanhu-client.mjs |
共享 HTTP 客户端模块(被上述脚本引用,不直接运行) |
scripts/design-converter.mjs |
纯转换模块(被 get_design_specs.mjs 引用,不直接运行) |
工作流
- 确认
LANHU_COOKIE环境变量已设置。如果首次运行脚本返回认证错误,提示用户检查 Cookie 是否已配置且未过期,参考上方「前置条件」重新获取。不要在认证失败后继续调用其他脚本。 - 先判断用户给的是蓝湖 UI 设计项目链接,而不是需求文档链接。UI 设计项目通常是
https://lanhuapp.com/web/#/item/project/stage?tid=xxx&pid=xxx,必须有pid,tid可选;不要把带docId的 PRD 链接当设计稿处理。 - 运行
node scripts/get_designs.mjs <url>获取设计图列表。后续分析和切图都以这个列表里的index、name、id为准。 - 如果设计图很多,先让用户指定范围;如果用户已经明确说"全部",再用
all。不要默认一次分析大量设计图。 - 【还原 UI 的强制前置步骤】查看或实现 UI 前,必须先下载并用 Read 工具查看设计图原图:运行
node scripts/download_design_images.mjs <url> --designs <names> --output <dir>下载原图,--designs支持序号(逗号分隔)、精确名称或all,下载后用 Read 工具实际查看。不要跳过看图直接基于 HTML 规格还原——原图是布局、层级、视觉效果的最终核对依据,source="sketch"降级时更是布局结构的主力参考。 4.5. 获取设计规格 HTML+CSS:运行node scripts/get_design_specs.mjs <url> --design <name_or_index>获取规格。返回的source字段决定数据权威性,必须先判断:source="dds":从 DDS Schema 生成的高精度 flex 布局 HTML+CSS,html字段是颜色、字号、间距、渐变、圆角、布局等所有参数的权威来源,直接复用、不得主观修改;原图用于核对布局是否错位。source="sketch":降级路径,html仅为绝对定位的元素清单,不可当作布局权威。此时以原图视觉为布局主力参考,以design_tokens/sketch_annotations的原始数值为精确数值来源。source="sketch"时,HTML 元素带data-css,返回还包含design_scale和layer_css_annotations,用于逐图层核对路径、文本、切图和 CSS 标注。image_url_mapping列出需要下载的图片资源映射表。若返回dds_error,说明已降级到 sketch,应更依赖原图。- 返回的
source_guidance字段是针对当前source的数据权威性指引,直接按它执行。 - 加
--output <dir> --download-images可在保存 HTML 的同时自动把引用图片下载到<dir>/assets/slices/,使保存的 HTML 可直接在浏览器渲染核对。
- 下载切图、图标、图片素材时,运行
node scripts/get_design_slices.mjs <url> --design <name>获取切图 JSON。单次只传一个设计图名称或序号。 - 下载前确认平台和倍率偏好。用户不指定时推荐 Web 2x,但仍要明确说明选择;常用键包括
1x、2x、3x、ios_1x、ios_2x、ios_3x、android_mdpi、android_hdpi、android_xhdpi、android_xxhdpi、android_xxxhdpi。除2x可回退到download_url外,其它倍率必须由切图 JSON 的scale_urls提供,不要复制同一文件伪造成多倍率资源。 - 将步骤 5 的切图 JSON 输出保存为文件,然后运行
node scripts/download_slices.mjs <json_file> --output <dir> --scale <scale>批量下载。识别当前项目资源目录和命名风格,执行后核对文件数量和失败列表。
设计还原规则
完整规则见 references/design-implementation-rules.md。以下是必须遵守的核心要求。
数据来源优先级(按 get_design_specs.mjs 返回的 source 分级)
还原前必须先看 source 字段,不同来源的权威性完全不同:
source="dds"(高保真,HTML 权威):
html字段:颜色、尺寸、间距、字体、圆角、渐变、定位、布局结构的权威来源。直接复制精确的 CSS 属性值,不得修改。design_tokens字段:补充 HTML 中可能被合并的高风险视觉信息(复合渐变、非均匀圆角、阴影、opacity<100)。- 设计图原图:用于核对布局是否错位、元素是否齐全,不覆盖 HTML 数值。
- 切图元数据(
get_design_slices.mjs):补充fills、borders、opacity、rotation、text_style、shadows、border_radius。
source="sketch"(降级,原图为布局主力):
- 设计图原图:布局结构、层级关系、视觉效果的主力参考。
html是扁平的绝对定位元素清单,不能当作布局权威,仅用于核对元素是否齐全。 design_tokens/sketch_annotations字段:颜色、字号、间距、圆角、阴影等精确数值的权威来源。html字段:仅作元素清单和绝对定位参考,布局意图需结合原图重建。- 切图元数据:同上,补充视觉细节。
禁止修改 CSS 值
- 不要转换色值格式(
rgba()↔ hex 保持原样)。 - 不要四舍五入或简化数值(如
0.30000001192092896保持原样)。 - 不要把
linear-gradient简化成纯色。 - 不要调整
font-family顺序或删除 fallback 字体。 - 不要把 margin/padding 取整为"干净"的数字。
- 不要用 SVG、CSS shape、emoji 或占位图替换切图。
- 不要省略任何可见的设计元素。
- 不要在最终代码中保留蓝湖远程 CDN URL。
DOM 结构映射
HTML 的 class 名称表达布局意图,需转译为目标框架组件,同时保持 CSS 值不变:
flex-row→ 水平排列(React:display:flex,Flutter:Row(),SwiftUI:HStack)flex-col→ 垂直排列(React:flex-direction:column,Flutter:Column(),SwiftUI:VStack)justify-between→ 两端对齐(space-between/MainAxisAlignment.spaceBetween)relative/absolute→ 定位层叠(Flutter:Stack+Positioned,SwiftUI:ZStack)
详细映射表见 references/design-implementation-rules.md。
框架检测与代码生成
实现 UI 前先检测项目类型(读取 package.json、pubspec.yaml、build.gradle、Podfile 等),生成匹配框架的代码(React JSX、Vue SFC、Flutter Widget、SwiftUI View、Android Compose 等)。CSS 属性需按平台做单位映射(px→dp/pt),但不能改变数值精度。未检测到框架时默认生成纯 HTML。各框架的 CSS 属性映射表和资源引用方式见 references/design-implementation-rules.md。
若项目根目录存在 DESIGN.md(或同等职责的设计系统文档),解析规格与落盘代码前必须先读取并遵守其令牌、排版、组件与命名约定;图层级具体数值仍以规格数据为准,冲突时以规格数值保证当前屏还原度并向用户说明取舍。详见 references/design-implementation-rules.md。
生成后保真审计
代码生成后必须逐属性对照设计规格 HTML+CSS 执行保真检查,覆盖 10 项:尺寸约束、裁剪、色值、渐变、绝对定位、字体、间距、图片资源、元素完整性、无远程 URL。对每个差异标注是平台适配还是错误,错误必须修正后交付。完整清单见 references/design-implementation-rules.md。
切图下载
从 get_design_slices.mjs 保存返回结果为 JSON 后,可运行:
node scripts/download_slices.mjs slices.json --output ./src/assets/images/slices/home --scale 2x
常用参数:
--scale 2x:下载 Web 2x,文件名后缀默认@2x。--scale ios-all:下载 iOS1x/@2x/@3x。--scale android-all:下载 Android 全套并放入mipmap-*子目录。--name-map names.json:提供{slice_id_or_name_or_layer_path: "semantic_name"},覆盖自动文件名。--referer https://lanhuapp.com/:需要带 Referer 时使用。
脚本只负责稳定下载和基础去重。语义化命名应优先结合当前项目已有命名规范处理。
全套倍率依赖 scale_urls 中的真实多倍率地址;缺失时脚本会报错而不是复制 download_url。
Photoshop 稿(设计 JSON 根节点 type=ps)的切图登记在 assets[],脚本会自动按图层 id 提取 png_xxxhd/svg 地址并推导多倍率(PS 稿图层像素尺寸为 @2x 基准)。
切图下载前置步骤
下载切图前,按以下顺序准备:
- 识别项目类型:检查
package.json、pubspec.yaml、*.xcodeproj、build.gradle等标志文件,判断 React/Vue/Flutter/iOS/Android。 - 确定输出目录:用户指定 > 项目已有资源目录 > 通用默认路径。详细规则见
references/design-implementation-rules.md。 - 确认倍率:用户不指定时推荐 Web 2x,但必须明确告知选择。
- 准备命名映射:根据切图的
layer_path、parent_name生成语义化英文文件名(icon_、bg_、btn_等前缀),沿用项目已有命名风格。命名策略详见references/design-implementation-rules.md。
完成检查
交付前确认:
- 已先运行
get_designs.mjs并基于列表匹配目标设计图。 - 还原 UI 前已下载并用 Read 工具实际查看过设计图原图。
- UI 实现已按
source分级核对:dds以 HTML+CSS 为权威,sketch以原图布局 +design_tokens数值为主,没有用设计截图主观改 DDS 的精确值。 - 已执行生成后保真审计(10 项清单),所有错误已修正,仅保留合理的平台适配差异。
- 生成代码匹配检测到的项目框架,遵循项目已有约定(命名、目录、样式方案)。
- 所有远程图片/切图已下载为本地资源,代码中没有蓝湖 CDN URL。
- 图片资源使用目标框架约定的引用方式(如 React
import、FlutterAssetImage)。 - 切图下载数量、失败数量、输出目录已向用户说明。
- 中间产物已按
references/design-implementation-rules.md的「临时文件清理规则」处理:先列出候选路径并检查引用,取得用户明确确认后再删除;仅保留被代码引用的切图文件。用户未确认时保留文件并报告路径。 - 工作流中未出现认证错误。如果出现过,已引导用户刷新 Cookie 并重试。
交付输出
最终回复简要列出:处理的设计图和 source、新增或修改的代码/资源路径、切图下载成功与失败数量、执行的验证及结果、仍需用户处理的认证或平台适配事项。不要输出 Cookie、带认证参数的完整请求头或不必要的远程资源 URL。