# 微信云开发规则 ## 概述 本文档定义了使用微信云开发(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/.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([]) useEffect(() => { callFunction('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 工具或管理登录状态