Files
wechat/.pai/skill-update/generate-mini-app/prompts/cloud-development.md
T
2026-07-14 14:52:44 +08:00

271 lines
9.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 微信云开发规则
## 概述
本文档定义了使用微信云开发(CloudBase)为小程序提供后端服务的开发规范。
当 PRD 分析判定小程序需要后端服务且目标平台包含微信小程序时,在前端开发过程中同步生成云函数代码。部署操作在用户确认后通过 CloudBase MCP 工具完成。
## 适用条件
- 当小程序需要后端服务时启用(Taro 项目默认支持编译为微信小程序)
- `Taro.cloud` API 只在微信小程序(weapp)运行时可用,H5 预览时走 mock 数据
- 所有涉及 `Taro.cloud` 的代码必须用 `process.env.TARO_ENV === 'weapp'` 包裹
---
## 开发流程
### Phase A:后端需求分析
在 PRD 分析阶段(第一阶段)同步完成,识别需要云端支持的功能:
1. 需要用户身份识别 → 云函数 `login`(获取 openid
2. 需要数据持久化 → 对应集合 + 云函数(CRUD)
3. 需要文件上传/下载 → 云存储 API
输出格式:
```
### 数据库集合设计
| 集合名 | 用途 | 核心字段 | 索引字段 |
|--------|------|----------|----------|
| users | 用户信息 | _openid, nickname, avatar, createTime | _openid |
| orders | 订单 | _openid, items, status, createTime | _openid, status |
### 云函数列表
| 函数名 | 用途 | 入参 | 返回 |
|--------|------|------|------|
| login | 获取用户openid | 无 | { openid } |
| getOrders | 查询订单 | { status? } | { orders: [] } |
```
### Phase B:生成云函数代码
在前端页面开发阶段(第六阶段)同步完成。每开发一个需要后端数据的页面时,同时生成对应的云函数代码,写入项目根目录的 `cloudfunctions/` 目录。每个云函数一个独立子目录。
### Phase C:前端调用层
前端统一使用 `src/services/cloud.ts`(模板已预置)封装调用:
- 微信平台(weapp):走真实 `Taro.cloud.callFunction`
- 非微信平台(H5 预览、抖音、支付宝):走 mock 数据
页面通过 service 层获取数据。涉及云函数的 mock 文件命名为 `src/data/<functionName>.ts``cloud.ts` 会在非微信环境下按函数名自动加载对应文件。
### Phase D:通过 MCP 部署(用户确认后执行)
用户确认部署后,使用 CloudBase MCP 工具完成部署(MCP 自动处理认证,无需主动管理登录状态)。
部署成功后,通过 MCP 的 `envQuery` 工具获取当前环境 ID,然后将 `app.tsx``Taro.cloud.init()``env` 参数设置为真实的环境 ID。如果 `envQuery` 无法获取,则询问用户提供环境 ID。
### Phase E:验证(部署后执行)
通过 MCP 调用云函数验证部署成功,输出结果摘要。
---
## 云函数代码规范
### 目录结构
```
cloudfunctions/
├── login/
│ ├── index.js
│ └── package.json
├── getUsers/
│ ├── index.js
│ └── package.json
└── createOrder/
├── index.js
└── package.json
```
### 入口文件模板(index.js
```javascript
const cloud = require('wx-server-sdk')
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV })
const db = cloud.database()
exports.main = async (event, context) => {
try {
const wxContext = cloud.getWXContext()
const openid = wxContext.OPENID
// 业务逻辑...
const result = null // 替换为实际逻辑
return { code: 0, message: 'success', data: result }
} catch (err) {
console.error('[functionName] error:', err)
return { code: -1, message: err.message || '服务异常', data: null }
}
}
```
### package.json 模板
```json
{
"name": "functionName",
"version": "1.0.0",
"main": "index.js",
"dependencies": {
"wx-server-sdk": "~2.6.3"
}
}
```
### 编码规范
- 函数命名:camelCase,动词开头(getXxx, createXxx, updateXxx, deleteXxx
- 必须调用 `cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV })`
- 通过 `cloud.getWXContext().OPENID` 获取用户身份(免鉴权)
- 统一返回格式:`{ code: number, message: string, data: any }`
- code=0 表示成功,code<0 表示失败
- 必须有 try-catch 错误处理
- 日志使用 `console.error('[函数名]', err)` 格式
- 云函数使用 CommonJS`require` / `exports.main`),不使用 ESM
---
## 数据库规范
### 集合命名
- 小写字母 + 下划线:`users`, `user_profiles`, `order_items`
- 避免使用数据库保留字
### 文档结构约定
- 用户相关数据必须包含 `_openid` 字段用于权限控制
- 时间字段使用 `db.serverDate()` 写入
- 必须为高频查询字段建立索引
### 安全规则
- 默认规则:"仅创建者可读写"(通过 _openid 匹配)
- 公开数据(如商品列表):所有人可读,仅管理员可写
---
## 前端调用规范
### 初始化(app.tsx
在 App 组件中初始化云开发,必须做平台判断:
```tsx
import { useEffect } from 'react'
function App(props) {
useEffect(() => {
if (process.env.TARO_ENV === 'weapp') {
Taro.cloud.init({ env: 'your-env-id', traceUser: true })
}
}, [])
return props.children
}
```
注意:`process.env.TARO_ENV` 在编译时被替换为常量,非微信平台的 cloud 代码会被 tree shaking 移除。
### Service 层封装(src/services/cloud.ts
项目模板中已预置 `src/services/cloud.ts`,提供统一的云调用封装:
- 微信平台:走真实云函数调用
- 非微信平台(H5 预览、抖音、支付宝):走 mock 数据
开发云函数时,只需修改此文件中的 mock fallback 逻辑为真实云调用即可。
### 页面中使用
```typescript
import { callFunction } from '@/services/cloud'
const [orders, setOrders] = useState<Order[]>([])
useEffect(() => {
callFunction<Order[]>('getOrders', { status: 'pending' })
.then(setOrders)
.catch(err => console.error('[OrderPage]', err))
}, [])
```
---
## MCP 部署操作
### 配置 MCP
部署前需确认用户 IDE 已配置 CloudBase MCP。如果 MCP 工具不可用,通过以下方式帮助用户配置:
**方式一(推荐):自动触发安装**
使用终端工具执行以下命令(根据操作系统选择),系统会自动打开 Trae 的 MCP 配置确认窗口:
- macOS: `open "trae-cn://trae.ai-ide/mcp-import?type=stdio&name=cloudbase&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIkBjbG91ZGJhc2UvY2xvdWRiYXNlLW1jcEBsYXRlc3QiXX0%3D"`
- Windows: `start "" "trae-cn://trae.ai-ide/mcp-import?type=stdio&name=cloudbase&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIkBjbG91ZGJhc2UvY2xvdWRiYXNlLW1jcEBsYXRlc3QiXX0%3D"`
执行后告知用户:
1. 在弹出的确认窗口中点击「确认」(添加 CloudBase MCP 服务)
2. 在弹出的 MCP 管理面板中,点击「+ 添加」按钮左侧的 🔄 按钮刷新,等待 cloudbase 下的工具列表加载成功
3. 回复「已配置」继续部署
**重要**:MCP 工具只有在用户发起新一轮对话后才能被检测到,因此必须等待用户回复后再继续部署流程,不要尝试在当前轮次中轮询检测。
**方式二:手动配置(仅当方式一失败时使用)**
1. 打开「设置」→「MCP」
2. 点击「+ 添加」→「手动配置」
3. 将以下 JSON 粘贴到输入框中并点击确认:
```json
{
"mcpServers": {
"cloudbase": {
"command": "npx",
"args": [
"-y",
"@cloudbase/cloudbase-mcp@latest"
]
}
}
}
```
用户确认配置完成后,可直接调用以下 MCP 工具。
### 部署顺序
1. 创建所有数据库集合
2. 为集合创建索引
3. 部署所有云函数
4. 调用 login 函数验证部署成功
### 创建数据库集合
- 工具:`writeNoSqlDatabaseStructure`
- 参数:`action: "createCollection"`, `collectionName: "xxx"`
### 创建索引
- 工具:`writeNoSqlDatabaseStructure`
- 参数:`action: "updateCollection"`, `collectionName: "xxx"`, 包含 CreateIndexes 配置
### 部署云函数
- 工具:`manageFunctions`
- 参数:`action: "createFunction"`, `functionName: "xxx"`, `functionRootPath: "<项目路径>/cloudfunctions"`
### 验证部署
- 工具:`manageFunctions`
- 参数:`action: "invoke"`, `functionName: "login"`, `params: {}`
### 输出部署结果
部署完成后,向用户输出摘要(环境 ID 从部署阶段 `envQuery` 获取的真实值动态替换):
```
✅ 后端部署完成:
- 已部署云函数:login, getUsers, createOrder(共 3 个)
- 已创建数据库集合:users, orders(共 2 个)
- 验证结果:login 函数调用成功
🔗 云开发管理控制台:https://tcb.cloud.tencent.com/dev?envId=<环境ID>#/scf
您可以点击上方链接,在腾讯云控制台中查看和管理云函数、数据库等资源。
```
---
## 约束
- **禁止执行任何 CLI 命令**tcb、cloudbase、npm 等),所有云端操作通过 MCP 工具完成
- **H5 预览模式下使用 mock 数据**,不调用真实云端
- **env-id 在部署阶段确定**:生成代码时 `Taro.cloud.init({ env: '' })` 可留空或用任意占位,部署阶段通过 MCP `envQuery` 获取真实环境 ID 后修改 `app.tsx`
- **云函数使用 CommonJS**`require` / `exports.main`,不使用 ESM
- **平台判断是强制的**:所有涉及 `Taro.cloud` 的代码必须用 `process.env.TARO_ENV === 'weapp'` 包裹
- **MCP 认证由 MCP 内部自动处理**:Skill 不需要主动调用 auth 工具或管理登录状态