了解两种架构方案的区别,以及 AI Agent 生成代码时遵循的标准规范
| 对比维度 | 微信云开发 | 自有服务器 |
|---|---|---|
| 后端技术 | wx-server-sdk 云函数 | Node.js + Express |
| 数据库 | 微信云数据库(NoSQL文档型) | MySQL(关系型SQL) |
| 文件存储 | 微信云存储(fileID) | 服务器本地 /uploads/ |
| 域名 | 不需要 | 需要备案域名 + SSL |
| 费用 | 免费额度 | 服务器 ~50-100元/月 |
| 部署方式 | miniprogram-ci + 开发者工具 | SSH + PM2 + Nginx |
| 用户认证 | getWXContext().OPENID | wx.login → code → JWT |
| 上手难度 | ⭐ 低 | ⭐⭐ 中 |
| 灵活性 | ⭐⭐ 中 | ⭐⭐⭐ 高 |
项目根目录/
├── 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 数据库初始化脚本
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 };
};
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 });
}
});