Appearance
利用codex生成微信小程序
前期准备
prd文档
怎么去写一个PRD文档呢?从PRD文档获取到一个最核心的信息,就是功能和页面的描述。或者说你可以把这两个拆成不同的文档也行。
- 功能描述
- 实现范围
- 页面描述(最好有,方便做设计)
PRD文档解决的是你要做什么的问题。
要生成一个PRD文档,非常简单,只要你的关键词里面带PRD就行。后描述你要重点包括的内容。
我现在需要做一个户外和摄影小帮手的微信小程序,一进去选择地点,然后有个朝霞晚霞页面和工具页面,首页包含当前位置的海拔和天气,日出日落,月出月落,蓝调时刻时间,工具包含指北针,七日预报,银河观察的预报,帮我生成prd文档,包括功能描述,前台页面描述申请微信小程序及安装微信开发者工具
https://mp.weixin.qq.com/cgi-bin/wx
申请好小程序功能,并安装好小程序开发工具
安装好开发环境
nodejs,claude code或codex
生成原型
OpenDesign 介绍
Open Design是一款类似claude Design的设计工具,里面集成了非常多用于设计的技能、插件以及样式规范等等。使用OpenDesign可以制作APP、Web等等前端的原型。
Open Design可以调用本地的CLI工具,比如Claude Code, Codex,gemini CLI 等等。意思就是它不需要单独配置模型,可以用你自己本身的编程模型来进行设计,这极大地提升了便利性,而且可以使用多种模型来对比一下设计的效果。
可以进入这个链接下载桌面端,支持Windows、Mac以及Linux。
https://github.com/nexu-io/open-design/releases
配置OpenDesign AI工具关联
可以自己配资openAI key,也可以用本机的claude code 和codex,这里选择了本机codex
生成原型并优化
接下来新建项目,把之前生成的prd.md文档放进去
然后和他对话
阅读 @prd.md 完成小程序开发
这样他就会自动执行他的skills,开始设计原型
原型生成后,可以在里面选择方块并调整自己的设计
导出原型
导出很方便,直接导出为zip格式,里面是生成的页面的html和一些描述文件
-DESIGN-HANDOFF.md
-DESIGN-MANIFEST.json -outdoor-photography-helper.html -prd.md
原型转小程序代码
准备工作
在小程序开发者工具上在本地新建自己的项目
把prd.md 和导出的设计文件放入项目中
生成agnet.md 指导ai生成项目
先了解一下这个项目,这是一个微信小程序,Web-Prototype是html页面原型,这个页面是不需要做改动的,阅读就可以了,了解完后,编写一个Agent.md的项目开发规范代码转换
上面的原型设计目的是得到一个最终的原型HTML文件,但要做小程序,也就是我们需要把HTML代码转成我们的小程序代码,所以在这一步,最重要的流程就是代码转换。
小程序的代码和结构跟APP区别比较大,所以我们在转换的时候一定要写好约束。在这里,我准备好一个技能,专门将HTML代码转换为小程序的代码。
SKILL.md
---
name: html-to-wechat-miniprogram
description: 将 HTML、React、Vue 或其他 Web 原型转换成微信小程序代码,并强制遵守小程序特有的页面结构、原生顶部导航、app.json tabBar、跳转 API、安全区布局、本地资源和验收规范。用于把 Web/HTML 原型转成微信小程序文件,或检查、修复已生成的小程序转换结果是否符合微信平台规范。
---
# HTML 转微信小程序
使用此技能将 Web 原型转换为微信小程序,同时约束通用大模型容易忽略的平台规则。
不要把上下文浪费在解释基础 WXML、WXSS、TypeScript 语法上,除非当前代码库确实需要。这个技能的重点是避免错误架构和平台不匹配。
## 必读规则
在创建或编辑小程序文件之前,必须阅读:
- `references/conversion-rules.md`
该文件是页面拆分、`app.json`、原生导航栏、`tabBar`、跳转 API、安全区、资源和验收清单的转换契约。
## 工作流程
1. 识别原型来源:HTML、React、Vue、静态截图或已有 Web App 文件。
2. 将原型中的 screen/route 映射为真实小程序页面。不要用一个 `index` 页面加本地状态模拟多页面。
3. 先设计 `app.json`:`pages`、`window`、`tabBar`。
4. 在 `miniprogram/pages/**` 下为每个页面创建独立目录。
5. 页面标题默认放进页面 `.json`,除非用户明确要求自定义顶部导航栏。
6. 底部主导航必须放进 `app.json tabBar`,不要在 WXML 里手写底部导航。
7. 实现页面内容和本地 mock 数据;除非用户要求后端,否则不要假设后端存在。
8. 每个页面跳转都使用正确的微信小程序 API。
9. 为 tab 页面和固定底部操作栏页面添加安全区 padding。
10. 运行静态检查;条件允许时打开微信开发者工具验证导航和 UI 交互。
## 强制规则
- 不要为多页面应用构建单页状态机。
- 不要把 Web `Header` 复制到每个页面里做假顶部导航。
- 不要把 Web `BottomNav` 复制进 WXML。
- 不要用 `wx.navigateTo` 打开 `tabBar` 页面。
- 不要通过 `wx.switchTab` 传 query 参数;使用 storage 或小型本地 store。
- 不要让固定底部栏遮挡内容或原生 tabBar。
- 不要依赖远程 tab 图标;`tabBar` 图标必须是本地文件。
- 不要遗漏每个页面 `.json` 的 `navigationBarTitleText`。
## 交付内容
转换完成后提供:
- `miniprogram/` 或现有小程序项目结构下的文件。
- 原型 screen 到小程序 page 的映射说明。
- 因微信平台规范导致的有意差异。
- 验证结果,包括 TypeScript/build 检查,以及已执行的微信开发者工具交互检查。references/conversion-rules.md
# HTML/Web 原型转微信小程序通用规则
本参考文档只描述通用转换规范,不绑定任何具体项目、行业或业务页面。默认执行者已经知道基础 WXML、WXSS、TypeScript/JavaScript 语法;这里重点约束大模型容易忽略的微信小程序平台规则。
## 1. 先定架构
将 Web 原型中的页面级 screen/route 转换成真实小程序页面,不要做单页状态机。
推荐结构:
```text
miniprogram/
app.json
app.ts
app.wxss
pages/
home/
home.wxml
home.wxss
home.ts
home.json
list/
list.wxml
list.wxss
list.ts
list.json
detail/
detail.wxml
detail.wxss
detail.ts
detail.json
profile/
profile.wxml
profile.wxss
profile.ts
profile.json
components/
utils/
assets/
tab/
icons/
images/实际页面名称必须根据原型业务调整。上面的 home/list/detail/profile 只是通用占位示例。
禁止用一个 pages/index/index 加 currentPage、activeScreen、routeName 等本地状态模拟整个 App。
2. app.json 是导航契约
必须先设计 app.json,再写页面实现。
通用示例:
json
{
"pages": [
"pages/home/home",
"pages/list/list",
"pages/detail/detail",
"pages/profile/profile"
],
"window": {
"navigationBarTextStyle": "black",
"navigationBarTitleText": "应用名称",
"navigationBarBackgroundColor": "#ffffff",
"backgroundColor": "#ffffff"
},
"tabBar": {
"color": "#666666",
"selectedColor": "#111111",
"backgroundColor": "#ffffff",
"borderStyle": "white",
"list": [
{
"pagePath": "pages/home/home",
"text": "首页",
"iconPath": "assets/tab/home.png",
"selectedIconPath": "assets/tab/home-active.png"
},
{
"pagePath": "pages/list/list",
"text": "列表",
"iconPath": "assets/tab/list.png",
"selectedIconPath": "assets/tab/list-active.png"
},
{
"pagePath": "pages/profile/profile",
"text": "我的",
"iconPath": "assets/tab/profile.png",
"selectedIconPath": "assets/tab/profile-active.png"
}
]
}
}规则:
pages必须声明所有页面。tabBar只放主入口页面。- 不要把详情页、表单提交页、结果页、详情二级页等流程页面放进
tabBar。 tabBar.list保持 2 到 5 项。- 生产级 UI 必须提供本地
iconPath和selectedIconPath。 - 如果暂时没有图标资源,必须在交付说明里明确标记为未完成的视觉资产。
3. 页面拆分规则
Web 原型中常见的结构:
text
App
Header
CurrentScreen
BottomNav转换后应该变成:
text
app.json
window
tabBar
pages/
page-a/
page-b/
page-c/拆分判断:
- Web router 中的一级 route 通常是小程序页面。
- 可被分享、回退、直接进入的 screen 应该是小程序页面。
- 仅在当前页面内部切换的小块内容,可以保留为组件或局部状态。
- 弹窗、筛选器、抽屉、步骤中的局部模块,不要盲目拆成页面。
4. 顶部导航转换规则
不要直接把 Web Header 复制进 WXML 做假顶部导航。
默认做法:
- 使用小程序原生导航栏。
- 页面标题写入每个页面的
.json:
json
{
"navigationBarTitleText": "页面标题"
}页面内容区可以保留:
- 副标题
- 地理位置
- 搜索栏
- 筛选条件
- 业务状态
- banner/hero 文案
- 页面内操作按钮
这些通常不应该变成自定义顶部导航。
只有用户明确要求完全自定义顶部视觉时,才使用自定义导航。使用自定义导航时必须:
- 设置
"navigationStyle": "custom"。 - 处理状态栏高度。
- 处理微信胶囊按钮位置和安全距离。
- 添加顶部安全区。
- 在多机型上验证。
5. 底部导航转换规则
Web 原型中的底部主导航组件必须转换成 app.json tabBar。
不要创建:
text
components/bottom-nav
pages/* 里的全局底部导航 WXML
每个页面里 position: fixed 的底部主导航允许保留的底部区域:
- 当前页面独有的提交栏。
- 当前页面独有的购买/确认/保存操作栏。
- 非主导航性质的底部工具栏。
但这些底部操作栏不能和原生 tabBar 重叠。
6. 页面跳转 API 规则
根据目标页面类型选择 API。
ts
// 普通页面
wx.navigateTo({ url: '/pages/detail/detail?id=123' })
// tabBar 页面
wx.switchTab({ url: '/pages/home/home' })
// 提交完成后替换当前页
wx.redirectTo({ url: '/pages/result/result?id=123' })
// 原生返回
wx.navigateBack()重点:
wx.switchTab不能携带 query 参数。- 如果需要切到 tab 页并带筛选、搜索、定位或临时状态,用小型本地 store 或
wx.setStorageSync暂存,再在 tab 页onShow消费。 - 不要用
wx.navigateTo打开 tabBar 页面。 - 不要在小程序转换后继续依赖 Web router。
7. 跨 tab 状态传递
当 Web 原型中存在“从 A 页面进入某个 tab 并带参数”的逻辑时,小程序要改写。
推荐模式:
ts
// utils/navigation-state.ts
let pendingState: Record<string, unknown> | null = null
export function setPendingState(value: Record<string, unknown>) {
pendingState = value
}
export function popPendingState() {
const value = pendingState
pendingState = null
return value
}使用:
ts
setPendingState({ keyword: 'abc', filterId: 'x' })
wx.switchTab({ url: '/pages/list/list' })在目标 tab 页:
ts
onShow() {
const pending = popPendingState()
if (pending) {
this.setData({ ...pending })
}
}也可以用 wx.setStorageSync,但要及时消费和清理,避免旧状态污染新页面。
8. 无后端时的数据状态
如果后端暂不在范围内:
- 将本地 mock 数据和状态放在
utils/。 - 使用
wx.setStorageSync和wx.getStorageSync持久化需要保留的本地状态。 - 数据结构尽量接近未来后端 DTO。
- 除非用户要求 API 脚手架,否则不要制造假的网络请求。
通用 store 可以包含:
text
getItems()
getItem(id)
filterItems(filter, query)
getLocalState()
updateLocalState(next)
createRecord(payload)
getRecords()
getRecord(id)
setPendingState()
popPendingState()具体命名必须根据业务调整。
9. 固定底部栏和安全区
有原生 tabBar 的页面需要底部 padding:
css
.tab-page {
padding-bottom: calc(156rpx + env(safe-area-inset-bottom));
}有固定底部操作栏的页面需要给内容区留足空间:
css
.with-fixed-action {
padding-bottom: calc(176rpx + env(safe-area-inset-bottom));
}固定底部栏示例:
css
.fixed-action-bar {
position: fixed;
left: 0;
right: 0;
bottom: 0;
padding: 22rpx 30rpx calc(22rpx + env(safe-area-inset-bottom));
}如果 tabBar 页面同时有固定操作栏:
css
.tab-fixed-action-bar {
position: fixed;
left: 0;
right: 0;
bottom: calc(112rpx + env(safe-area-inset-bottom));
}必须目测确认:
- 固定操作栏不遮挡关键内容。
- 页面内底部操作栏不和原生 tabBar 撞在一起。
- 列表最后一项可以滚到固定栏上方完整显示。
10. 视觉映射规则
优先保留产品信息架构,再保留装饰。
建议映射:
- Web hero/banner -> WXML 页面区块。
- Web card/list/grid -> WXML 卡片、列表或网格。
- Web badge/tag -> 小型文字标签。
- Web modal ->
wx.showModal;如果设计强相关,再做自定义弹窗。 - Web toast ->
wx.showToast,但避免长时间 toast 跨页面残留。 - Web tab/filter -> 页面内
scroll-view、segmented control 或普通筛选区。
如果和平台规范冲突,不要保留:
- 自定义 Web 底部主导航。
- 手机壳外框。
- 假状态栏。
- 假顶部标题栏。
- 与 tabBar 功能重复的悬浮主入口。
11. 资源规范
生产级小程序不能依赖随意的远程图片作为核心 UI。
规则:
tabBar图标必须是本地文件。- 搜索、菜单、操作图标应使用本地资源或明确的图标方案。
- 远程业务图片只适合原型/测试;生产前必须说明域名/CDN 配置工作。
- 如果远程图片在开发者工具里失败,必须替换或本地化。
12. 样式转换规则
从 Web CSS 转 WXSS 时:
- 使用
rpx做移动端尺寸适配。 - 不要照搬 Web 手机壳、外层 stage、浏览器模拟框。
- 不要依赖
position: absolute还原整屏布局,优先使用自然页面流。 - 保留颜色、字号、圆角、阴影、间距的视觉意图,但服从小程序原生导航和 tabBar。
- 复杂 CSS 特性要确认小程序支持情况;不确定时使用更稳妥的布局。
13. 验收清单
交付前检查:
text
[ ] app.json 声明了所有页面
[ ] app.json tabBar 只包含主入口页面
[ ] 每个页面都有独立目录和 .json 标题
[ ] WXML 中不存在假的全局底部导航
[ ] 不存在重复的假顶部导航,除非明确使用自定义导航
[ ] tab 页面使用 wx.switchTab
[ ] 非 tab 页面使用 wx.navigateTo / wx.redirectTo / wx.navigateBack
[ ] switchTab 的临时状态通过 store/storage 传递,而不是 URL query
[ ] tabBar badge 或动态 tab 状态符合业务需要
[ ] tabBar 图标是本地资源,或明确列为缺失资产
[ ] 固定底部栏不遮挡内容
[ ] tab 页面和底部操作页有安全区 padding
[ ] 原型核心模块没有遗漏
[ ] TypeScript/build 检查通过
[ ] 微信开发者工具能编译并跑通主流程主流程验证要根据具体业务定义,例如:
text
入口页 -> 列表/功能页 -> 详情/编辑页 -> 提交/保存 -> 结果页 -> 返回主入口不要把某个项目的业务流程固化为通用技能规则。
14. 交付说明格式
完成后说明:
- 原型 screen 到小程序 page 的映射。
- 改动文件。
- 因微信平台规范导致的有意差异。
- 验证命令和结果。
- 剩余资源或生产就绪问题。
将这个技能放到项目的.codex/skills目录下面
接下来就可以执行生成页面指令了阅读原型下页面,转换成小程序界面,数据使用模拟数据,地址使用小程序自带的功能实现
剩下的小程序图标可以用emoji替代
### 优化页面设计查找bug
然后就是优化页面设计以及查找bug,因为Codex APP 没有内置的小程序预览界面,所以要借助Computer use这个插件,让它模拟人类去打开小程序,去浏览当前的界面是否是正常。
### 添加数据和优化需求使用微信者开发工具测试小程序ui交互是否有问题
在搜索到气的公开接口并添加进小程序,和完成几个预测模型 指北针添加西南北表盘,并添加星空方位速查。 添加海拔测量功能,带地点和坐标。 天气添加请求,不要再使用假数据同时切换日期有反应。 布局更加弹性化,不要一个模块一行,两个模块一行。 优化首页的信息展示布局


### 对接后端需求
如果需要后端,可以在codex中让ai设计sql.md,并设计后端接口,这里做个纯前端展示足以,所以没有相关的设计