学习 & 规范手册

了解两种架构方案的区别,以及 AI Agent 生成代码时遵循的标准规范

微信云开发

零服务器、免域名,最快上手
  • 不需要买服务器,不需要域名
  • 不需要配置 Nginx、SSL 证书
  • 云函数 + 云数据库 + 云存储一站式
  • 免费额度够个人/小团队使用
  • 微信官方维护,稳定性高
  • 锁定微信生态,迁移成本高
  • 高级功能(定时触发器等)有限制

自有服务器

完全掌控,自由度最高
  • 代码完全属于你,可迁移到任何平台
  • 可接入任意第三方服务(支付、短信等)
  • 数据库用 MySQL,工具生态更丰富
  • 一台服务器可以跑多个项目
  • 需要买服务器(约 50-100 元/月)
  • 需要备案域名(首次约 7-15 天)
  • 需要管理服务器安全和运维
对比维度微信云开发自有服务器
后端技术wx-server-sdk 云函数Node.js + Express
数据库微信云数据库(NoSQL文档型)MySQL(关系型SQL)
文件存储微信云存储(fileID)服务器本地 /uploads/
域名不需要需要备案域名 + SSL
费用免费额度服务器 ~50-100元/月
部署方式miniprogram-ci + 开发者工具SSH + PM2 + Nginx
用户认证getWXContext().OPENIDwx.login → code → JWT
上手难度⭐ 低⭐⭐ 中
灵活性⭐⭐ 中⭐⭐⭐ 高

如何选择?

想快速验证一个想法,还不确定会不会做大 → 选 云开发
第一次做小程序,对服务器运维不熟 → 选 云开发
已有服务器,或项目未来要迁移到 App/Web → 选 自有服务器
需要接入第三方支付/短信/推送 → 选 自有服务器
想学全栈开发,了解后端是怎么回事 → 选 自有服务器
标准目录结构

云开发模式

项目根目录/
├── app.js              全局入口,wx.cloud.init() 在此执行
├── app.json            页面路由 + 分包 + tabBar 配置
├── app.wxss            全局样式变量
├── project.config.json AppID + 云函数目录配置
├── config/
│   ├── env.js          云环境ID配置(必改)
│   └── constants.js    角色、业务类型等常量
├── utils/
│   ├── cloudApi.js     云函数统一调用封装
│   └── date.js         日期工具
├── pages/              主包页面(tabBar 页必须在这里)
│   ├── splash/         启动分流页
│   ├── login/          登录页
│   └── ...
├── packageA/           分包(低频页面)
└── cloudfunctions/     云函数目录(每个子目录=一个云函数)
    ├── login/
    └── ...

自有服务器模式

小程序前端/(同上,但不含 cloudfunctions/)
├── config/api.js       后端 API 基础 URL
├── utils/request.js    wx.request 统一封装(带 JWT)
└── utils/auth.js       登录 & token 管理

服务器 /home/miniapp/
├── app.js              Express 入口
├── .env                数据库密码、AppSecret、JWT 密钥
├── routes/             路由模块
├── middleware/auth.js  JWT 验证中间件
├── models/             MySQL 查询封装
├── uploads/            用户上传的文件
└── init.sql            数据库初始化脚本
云函数 / API 编写规范

云开发 — 云函数模板

const cloud = require('wx-server-sdk');
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV });
const db = cloud.database();

exports.main = async (event, context) => {
  const { OPENID } = cloud.getWXContext();
  const { param1 } = event;

  // 权限验证
  const user = (await db.collection('users')
    .where({ _openid: OPENID }).get()).data[0];
  if (!user) throw new Error('请先登录');

  // 业务逻辑
  const result = await db.collection('xxx')
    .add({ data: { ...param1, createdAt: Date.now() }});

  return { success: true, data: result };
};

自有服务器 — Express 路由模板

const router = require('express').Router();
const { verifyToken } = require('../middleware/auth');
const db = require('../models/db');

router.post('/xxx', verifyToken, async (req, res) => {
  try {
    const userId = req.user.openid; // JWT 解析
    const { param1 } = req.body;

    const [result] = await db.execute(
      'INSERT INTO xxx (user_id, data, created_at) VALUES (?, ?, ?)',
      [userId, param1, Date.now()]
    );

    res.json({ success: true, data: { id: result.insertId } });
  } catch (err) {
    res.status(500).json({ success: false, error: err.message });
  }
});
云函数用 getWXContext().OPENID 鉴权;自有服务器用 JWT 中间件
返回格式统一为 { success, data, error }
所有写操作前验证用户权限
禁止:AppSecret 或任何密钥写入代码文件
数据库设计规范
时间戳统一用 Date.now() 毫秒数(BIGINT)
删除用软删除(status: 'removed'),不物理删除
云开发:图片只存 fileID,不存 URL
自有服务器:图片存相对路径(/uploads/xxx.jpg)
自有服务器:用参数化查询(? 占位符)防 SQL 注入
云开发字段用小驼峰 camelCase;MySQL 字段用 snake_case
禁止:无 LIMIT 的全量查询
文件上传 & 存储规范
代码包内只放小图标(单个 < 200KB,主包 < 2MB)
用户上传的动态图片必须走云存储/服务器存储
自有服务器:Nginx 配置 client_max_body_size 10M
云存储路径格式:[业务类型]/[recordId]/[文件名]
禁止把大图(>100KB)放入代码包
上线前检查清单
下载完整模板工程

包含标准目录结构、云函数模板,导入开发者工具即可用

下载