模式切换
小程序云开发
开通云开发服务
步骤1:在开发者工具中开通
- 打开微信开发者工具
- 点击左侧菜单栏的「云开发」按钮
- 在弹出的窗口中点击「开通云开发服务」
- 选择适合的环境(免费版、专业版等)
步骤2:初始化云开发
javascript
// app.js
App({
onLaunch: function() {
// 初始化云开发
if (wx.cloud) {
wx.cloud.init({
env: 'your-environment-id', // 云环境ID
traceUser: true, // 记录用户访问
})
}
}
})
步骤3:获取环境信息
在云开发控制台中可以看到:
- 环境ID:每个环境的唯一标识
- 默认环境:可以设置一个默认环境
云数据库:直接在前端操作数据库
云数据库是一个 NoSQL 数据库,支持在小程序前端直接操作。
核心概念
- 集合 (Collection):相当于 SQL 的表
- 记录 (Record/Document):相当于 SQL 的行
- 字段 (Field):相当于 SQL 的列
初始化数据库
javascript
// 获取数据库引用
const db = wx.cloud.database()
// 或者指定环境
const db = wx.cloud.database({
env: 'your-environment-id'
})
增删改查操作
增加数据:
javascript
// 添加一条记录
Page({
addData: function() {
db.collection('todos').add({
data: {
description: '学习云开发',
due: new Date('2024-01-01'),
tags: ['study', 'cloud'],
done: false,
progress: 0,
created: db.serverDate() // 服务器时间
},
success: res => {
console.log('添加成功', res._id)
wx.showToast({ title: '添加成功' })
},
fail: err => {
console.error('添加失败', err)
}
})
}
})
查询数据:
javascript
// 基本查询
Page({
getData: function() {
db.collection('todos')
.where({
done: false, // 查询条件
progress: _.gt(50) // 使用数据库命令:progress > 50
})
.orderBy('created', 'desc') // 排序
.limit(10) // 限制数量
.get()
.then(res => {
console.log('查询结果', res.data)
this.setData({ todos: res.data })
})
.catch(err => {
console.error('查询失败', err)
})
}
})
更新数据:
javascript
// 更新记录
Page({
updateData: function(id) {
db.collection('todos').doc(id).update({
data: {
done: true,
progress: 100,
finished: db.serverDate()
},
success: res => {
console.log('更新成功', res)
}
})
},
// 条件更新
updateByCondition: function() {
db.collection('todos')
.where({ done: false })
.update({
data: {
priority: _.inc(1) // 自增1
}
})
}
})
删除数据:
javascript
// 删除单条记录
Page({
deleteData: function(id) {
db.collection('todos').doc(id).remove({
success: res => {
console.log('删除成功', res)
}
})
},
// 条件删除
deleteByCondition: function() {
db.collection('todos')
.where({ done: true })
.remove()
}
})
数据库命令:
javascript
const _ = db.command
// 使用数据库命令进行复杂查询
db.collection('todos')
.where({
progress: _.gt(50), // 大于50
tags: _.all(['study', 'cloud']), // 同时包含study和cloud
created: _.lt(new Date('2024-01-01')) // 小于指定日期
})
.get()
云存储:直接在前端上传和管理文件
云存储提供文件上传、下载、管理的能力。
上传文件
javascript
// 上传图片
Page({
chooseAndUpload: function() {
// 选择图片
wx.chooseImage({
count: 1,
success: res => {
const filePath = res.tempFilePaths[0]
// 上传到云存储
wx.cloud.uploadFile({
cloudPath: `images/${Date.now()}-${Math.random().toString(36).substr(2)}.jpg`,
filePath: filePath,
success: res => {
console.log('上传成功', res.fileID)
this.setData({ imageUrl: res.fileID })
},
fail: err => {
console.error('上传失败', err)
}
})
}
})
},
// 上传其他类型文件
uploadPDF: function() {
wx.chooseMessageFile({
type: 'file',
success: res => {
const file = res.tempFiles[0]
wx.cloud.uploadFile({
cloudPath: `files/${file.name}`,
filePath: file.path,
success: res => {
console.log('文件上传成功', res.fileID)
}
})
}
})
}
})
下载文件
javascript
// 下载文件
Page({
downloadFile: function(fileID) {
wx.cloud.downloadFile({
fileID: fileID,
success: res => {
console.log('下载成功', res.tempFilePath)
// 可以预览或保存文件
},
fail: err => {
console.error('下载失败', err)
}
})
},
// 获取临时链接(用于图片显示等)
getTempURL: function(fileID) {
wx.cloud.getTempFileURL({
fileList: [fileID],
success: res => {
console.log('临时链接', res.fileList[0].tempFileURL)
}
})
}
})
文件管理
javascript
// 删除文件
Page({
deleteFile: function(fileID) {
wx.cloud.deleteFile({
fileList: [fileID],
success: res => {
console.log('删除成功', res.fileList)
}
})
},
// 批量获取文件信息
getFileInfo: function(fileIDs) {
wx.cloud.getFileInfo({
fileList: fileIDs.map(id => ({ fileID: id, maxAge: 3600 })),
success: res => {
console.log('文件信息', res.fileList)
}
})
}
})
云函数:在服务器端运行 Node.js 代码
云函数运行在 Node.js 环境中,可以处理复杂逻辑、调用第三方服务等。
创建和部署云函数
步骤1:创建云函数目录
cloud/
└── functions/
├── login/ # 登录云函数
│ ├── index.js
│ └── config.json
├── payment/ # 支付云函数
│ ├── index.js
│ └── package.json
└── sendSMS/ # 发送短信云函数
├── index.js
└── package.json
步骤2:编写云函数
javascript
// cloud/functions/login/index.js
const cloud = require('wx-server-sdk')
cloud.init()
// 云函数入口函数
exports.main = async (event, context) => {
const wxContext = cloud.getWXContext()
// 在这里可以:
// 1. 调用第三方API
// 2. 进行复杂计算
// 3. 操作数据库(有更高权限)
// 4. 使用敏感信息(如API密钥)
return {
openid: wxContext.OPENID,
appid: wxContext.APPID,
unionid: wxContext.UNIONID,
userInfo: event.userInfo,
timestamp: new Date()
}
}
步骤3:在开发者工具中部署
- 右键云函数目录
- 选择「上传并部署:所有文件」
调用云函数
javascript
// 小程序端调用云函数
Page({
callCloudFunction: function() {
wx.cloud.callFunction({
name: 'login', // 云函数名称
data: { // 传递给云函数的参数
userInfo: this.data.userInfo,
action: 'login'
},
success: res => {
console.log('云函数调用成功', res.result)
this.setData({ userData: res.result })
},
fail: err => {
console.error('云函数调用失败', err)
}
})
}
})
实际应用场景
场景1:敏感信息处理(支付)
javascript
// cloud/functions/payment/index.js
const cloud = require('wx-server-sdk')
cloud.init()
// 引入支付SDK(不要在客户端存储支付密钥)
const paymentSDK = require('payment-sdk')
exports.main = async (event) => {
const { orderId, amount, productName } = event
try {
// 调用支付接口(密钥在服务端,安全)
const paymentResult = await paymentSDK.createOrder({
orderId,
amount,
productName,
apiKey: 'your-secret-api-key' // 安全地使用密钥
})
return {
success: true,
paymentData: paymentResult
}
} catch (error) {
return {
success: false,
error: error.message
}
}
}
场景2:复杂计算(数据统计)
javascript
// cloud/functions/statistics/index.js
exports.main = async (event) => {
const db = cloud.database()
// 进行复杂的数据库聚合查询
const result = await db.collection('orders')
.aggregate()
.match({ // 匹配条件
created: _.gte(new Date('2024-01-01'))
})
.group({ // 分组统计
_id: '$status',
totalAmount: $.sum('$amount'),
count: $.sum(1)
})
.end()
return result
}
场景3:调用第三方服务(发送短信)
javascript
// cloud/functions/sendSMS/index.js
const axios = require('axios')
exports.main = async (event) => {
const { phone, templateId, params } = event
try {
// 调用短信服务商API
const result = await axios.post('https://sms-api.com/send', {
phone,
templateId,
params,
appKey: 'your-sms-app-key', // 敏感信息安全存储
appSecret: 'your-sms-app-secret'
})
return {
success: true,
messageId: result.data.messageId
}
} catch (error) {
return {
success: false,
error: error.message
}
}
}
场景4:数据库高级操作
javascript
// cloud/functions/userManagement/index.js
exports.main = async (event) => {
const db = cloud.database()
const _ = db.command
// 在云函数中可以操作所有集合,不受权限限制
switch (event.action) {
case 'createUser':
return await db.collection('users').add({
data: event.userData
})
case 'updateUser':
return await db.collection('users').doc(event.userId).update({
data: event.updateData
})
case 'deleteUser':
return await db.collection('users').doc(event.userId).remove()
default:
return { error: '未知操作' }
}
}
云函数配置和依赖
json
// cloud/functions/sendSMS/package.json
{
"name": "sendSMS",
"version": "1.0.0",
"description": "发送短信云函数",
"main": "index.js",
"dependencies": {
"wx-server-sdk": "~2.6.3",
"axios": "^1.0.0"
}
}