写在最前面
这篇文章主要记录微信小程序【云】开发用到的学习笔记~~~
云开发免费版是永久免费的噢
但是,免费版的存储读请求次数很快就会用完的。。。
学习视频
快速访问
数据库 MongoDB
- 创建集合 === 新建表
- 数据默认自带
_id
- 通过
索引管理
,可优化性能,和设置数据规则
读取全部
const db = wx.cloud.database()
db.collection('posts')
.get()
.then(res => {
console.log(res)
})
.catch(err => {
console.log(err)
})
返回指定字段
const db = wx.cloud.database()
db.collection('posts')
.field({
_id: true,
title: true
})
.get()
.then(res => {
console.log(res)
})
.catch(err => {
console.log(err)
})
读取指定 _id
const db = wx.cloud.database()
db.collection('posts')
.doc('posts_id')
.get()
.then(res => {
console.log(res)
})
.catch(err => {
console.log(err)
})
读取指定 _openid
const db = wx.cloud.database()
db.collection('posts')
.where({
_openid: 'posts_openid'
})
.get()
.then(res => {
console.log(res)
})
.catch(err => {
console.log(err)
})
添加
// 添加数据时,表自动添加 _openid
const db = wx.cloud.database()
db.collection('posts')
.add({
data: {
title: '标题',
content: '内容'
}
})
.then(res => {
console.log(res)
})
.catch(err => {
console.log(err)
})
表单添加
index.wxml
<form
catchsubmit="formSubmit"
>
<input
name="title"
type="text"
placeholder="请输入标题"
/>
<textarea
name="content"
placeholder="请输入内容"
></textarea>
<button
form-type="submit"
type="primary"
>发送</button>
</form>
index.js
Page({
data: { },
formSubmit(e){
let {title,content} = e.detail.value;
if(!title){
wx.showToast({
icon:'none',
title: '请输入标题',
})
return;
}
if(!content){
wx.showToast({
icon:'none',
title: '请输入内容',
})
return;
}
const db = wx.cloud.database()
db.collection('posts')
.add({
data: {
title,
content,
time: new Date()
}
})
.then(res => {
console.log(res)
})
.catch(err => {
console.log(err);
})
}
})
删除一个指定 _id
// 前段只能删除一个,使用 where 也不能批量删除,云函数可以批量删除
const db = wx.cloud.database()
db.collection('posts')
.doc('posts_id')
.remove()
.then(res => {
console.log(res)
})
.catch(err => {
console.log(err)
})
更新一个指定 _id
// update 只能更新
const db = wx.cloud.database()
db.collection('posts')
.doc('posts_id')
.update({
data: {
title: '更细标题',
content: '更细内容'
}
})
.then(res => {
console.log(res)
})
.catch(err => {
console.log(err)
})
// set 有则替换,无则插入,覆盖操作
const db = wx.cloud.database()
db.collection('posts')
.doc('posts_id')
.set({
data: {
title: '更细标题',
content: '更细内容'
}
})
.then(res => {
console.log(res)
})
.catch(err => {
console.log(err)
})
云函数
- 新建项目时候选择云开发
- 可以轻松获取 OPENID
- 云函数添加数据不会自动添加
_openid
需要自行添加
添加云函数
cloudfunctions
文件夹右键新建 Node.js 云函数
起名- 新的云函数文件夹右键
上传并部署:云端安装依赖
- 更新同2步骤,或者右键具体文件
云函数增量上传:更新文件
- 调用云函数 Cloud.callFunction()
云函数读取全部
云函数 getPosts
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database()
// 云函数入口函数
exports.main = async (event, context) => {
try {
return await db.collection('posts').get()
} catch(e) {
console.error(e)
}
}
调用云函数 getPosts
Page({
data: {},
onLoad:function(){
wx.cloud.callFunction({
name: 'getPosts'
})
.then(res => {
console.log(res)
})
.catch(err => {
console.log(err)
})
}
});
异步方式调用云函数 getPosts
// pages/detail/index.js
Page({
data: {},
onLoad: async function () {
wx.showLoading({
title: 'loading...',
})
try {
let {result} = await wx.cloud.callFunction({
name: 'getPosts'
})
console.log(result)
} catch(e) {
console.error(e)
}
wx.hideLoading()
},
})
云函数读取指定 _id
云函数 getPost
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database()
// 云函数入口函数
exports.main = async (event, context) => {
try {
return await db.collection('posts').doc(event._id).get()
} catch(e) {
console.error(e)
}
}
调用云函数 getPost
Page({
data: {},
onLoad:function(options){
wx.cloud.callFunction({
name: 'getPost',
data: {
_id: options.id
}
})
.then(res => {
console.log(res)
})
.catch(err => {
console.log(err)
})
}
});
云函数添加
云函数 addPost
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database()
// 云函数入口函数
exports.main = async (event, context) => {
const {OPENID} = cloud.getWXContext()
try {
return await db.collection('posts')
.add({
data: {
_openid:OPENID,
title,
content,
time: new Date()
}
})
} catch(e) {
console.error(e)
}
}
调用云函数 addPost
Page({
data: {},
onLoad:function(options){
wx.cloud.callFunction({
name: 'addPost',
data: {
title: '标题',
content: '内容'
}
})
.then(res => {
console.log(res)
})
.catch(err => {
console.log(err)
})
}
});
云函数删除指定 _id
云函数 removePost
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database()
// 云函数入口函数
exports.main = async (event, context) => {
try {
return await db.collection('posts').doc(event._id).remove()
} catch(e) {
console.error(e)
}
}
调用云函数 removePost
Page({
data: {},
onLoad:function(options){
wx.cloud.callFunction({
name: 'removePost',
data: {
_id: options.id
}
})
.then(res => {
console.log(res)
})
.catch(err => {
console.log(err)
})
}
});
云函数更新指定 _id
云函数 updatePost
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database()
// 云函数入口函数
exports.main = async (event, context) => {
try {
return await db.collection('posts')
.doc(event._id)
.update({
data: {
title: event.title,
content: event.content
}
})
} catch(e) {
console.error(e)
}
}
调用云函数 updatePost
Page({
data: {},
onLoad:function(options){
wx.cloud.callFunction({
name: 'updatePost',
data: {
_id: options.id,
title: '更细标题',
content: '更细内容'
}
})
.then(res => {
console.log(res)
})
.catch(err => {
console.log(err)
})
}
});
云存储
wx.getFileSystemManager
图片选择可追加和删除
图片数据
Page({
data: {
fileList:[]
}
})
可追加照片
async choose(){
try {
let {tempFilePaths} = await wx.chooseImage()
this.setData({
fileList:[...this.data.fileList,...tempFilePaths]
})
} catch(e) {
console.error(e)
}
}
可删除
<view wx:for="{{fileList}}" wx:key="index">
<image src="{{item}}" />
<button bindtap="del" data-key="{{index}}">删除</button>
</view>
del(e){
let {key} = e.target.dataset
this.data.fileList.splice(key,1)
this.setData({
fileList: this.data.fileList
})
}
上传图片并写入数据
async submit(e){
// 验证输入
if(!this.data.fileList.length){
wx.showToast({
icon:'none',
title: '请选择图片',
})
return;
}
// 图片上传
let imgs = [];
for (let i = 0; i < this.data.fileList.length; i++) {
let res = await wx.cloud.uploadFile({
cloudPath: 'userupload' + this.data.fileList[i].substring(this.data.fileList[i].lastIndexOf('/')),
filePath: this.data.fileList[i]
})
wx.showLoading({
title: `正在上传第${i+1}张`,
})
imgs.push(res.fileID);
}
// 添加数据
const db = wx.cloud.database()
try {
let res = await db.collection('albums')
.add({
data: {
imgs,
time: new Date()
}
})
wx.showToast({
title: '添加成功',
duration: 1500
})
setTimeout(() => {
wx.navigateBack();
this.getOpenerEventChannel().emit('reload');
}, 1500);
} catch(e) {
console.error(e)
}
wx.hideLoading()
}
实用篇
获取用户信息并存储到云数据库
- 云函数通过
OPENDID
判断users
数据库是否有数据 - 如果没有则使用 wx.getUserProfile() 获取用户信息
- 再通过云函数存储到
users
云数据库
云函数 logined
判断 users
数据库是否有数据
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database()
// 云函数入口函数
exports.main = async (event, context) => {
const {OPENID} = cloud.getWXContext()
try {
return await db.collection('users')
.where({
_openid: OPENID
})
.get()
} catch(e) {
console.error(e)
}
}
小程序 pages/login/index
如果 users
没有数据就获取用户信息 必须用户点击事件
<button
wx:if="{{show}}"
bindtap="getUserProfile"
>登录</button>
Page({
data: {
show: false
},
onLoad: function () {
wx.cloud.callFunction({
name: 'logined'
}).then(res => {
if(!res.result.data.length){// 如果没有数据 显示登陆按钮
this.setData({
show:true
})
}else{// 有数据 跳转到首页
wx.redirectTo({
url: '/pages/index/index',
})
}
}).catch(err => {
console.log(err)
})
},
getUserProfile(){
wx.getUserProfile({
desc: '用于完善会员资料',
success: (res) => {
let {userInfo} = res;
wx.cloud.callFunction({
name: 'addUser',// 运行云函数添加数据
data:{
userInfo
}
})
.then(res => {
wx.redirectTo({// 数据添加好后 跳转到首页
url: '/pages/index/index',
})
})
.catch(err => {
console.log(err)
})
},
fail:function(){
wx.showToast({
icon:'none',
title: '请登录',
})
}
})
}
})
登录验证
globalData
判断是否已经登录this.globalData = { logined:wx.getStorageSync('logined') };
- 登录授权如果
users
数据库有数据则不添加没有则添加// 云函数入口文件 const cloud = require('wx-server-sdk') cloud.init() const db = cloud.database() // 云函数入口函数 exports.main = async (event, context) => { const {OPENID} = cloud.getWXContext() try { let res = await db.collection('users') .where({ _openid: OPENID }) .get() if(!res.data.length){// 如果没有数据就添加 try { let res = await db.collection('users') .add({ data: { _openid:OPENID, ...event.userInfo, time: new Date() } }) return res; } catch(e) { console.error(e) } }else{// 有数据就返回数据 return res.data[0] } } catch(e) { console.error(e) } }
- 然后修改
logined
值wx.setStorageSync('logined', true)
获取数据和对应的用户信息
获取全部数据 getAlbums
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database()
// 云函数入口函数
exports.main = async (event, context) => {
try {
let {data:albums} = await db.collection('albums').get()
let {data:users} = await db.collection('users').get()
return albums.map(album => {
let user = users.find(user => user._openid == album._openid);
if(user){
album.nickName = user.nickName;
album.avatarUrl = user.avatarUrl;
}
album.time = `${album.time.getFullYear()}-${album.time.getMonth()+1}-${album.time.getDate()}`;
album.imgs = album.imgs.slice(0,3);
delete album._openid;
return album;
})
} catch(e) {
console.error(e)
}
}
获取一条数据 getAlbum
<navigator url="/pages/detail/index?id={{item._id}}"></navigator>
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database()
// 云函数入口函数
exports.main = async (event, context) => {
try {
let {data:album} = await db.collection('albums').doc(event._id).get()
let {data:user} = await db.collection('users').where({
_openid: album._openid
}).get()
if(user.length){
album.nickName = user[0].nickName;
album.avatarUrl = user[0].avatarUrl;
}
album.time = `${album.time.getFullYear()}-${album.time.getMonth()+1}-${album.time.getDate()}`;
return album;
} catch(e) {
return e;
}
}
每天定时清空数据库
顾名思义,指定时间定时运行某个云函数。比如每天定时清空当天数据。
云函数 clearOrders
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database()
// 云函数入口函数
exports.main = async (event, context) => {
await db.collection('orders').remove()
}
云函数 clearOrders
的 config.json
,每天凌晨 4 点运行 clearOrders
云函数
{
"permissions": {
"openapi": [
]
},
"triggers": [
{
"name": "clearOrders",
"type": "timer",
"config": "0 0 4 * * * *"
}
]
}
持续更新