目录
推荐资源
学习视频:http://www.xuetangx.com/courses/course-v1:TsinghuaX+2018032801X+2018_T1/about
https://blog.csdn.net/wangguang1995/article/details/79801933
社区和模板等:https://blog.csdn.net/qq_37205708/article/details/88296589 看里面的小程序部分的连接
前端的一些问题
1.使用dataset
比如我想实现下图中点击不同的订单信息跳到不同的界面,那么我需要获取一个"下标"来直到是第几条记录
只需要加上一个data-xxx属性,比如这里的data-index
js中通过e.currentTarget.dataset.xxx来获取即可
2.view组件英文字母无法换行的问题
在css里加一个样式:word-break: break-all;
3.动态绑定class
4.block和wx:for wx:key
<block></block>不是一个组件,仅仅是一个包装元素,不会再页面中做任何渲染,只接受控制属性(如wx:for wx:if)
实现短信验证注册
界面不是很美观,主要记录下怎么使用榛子云来发短信吧
http://smsow.zhenzikj.com/doc/weixinmp_code_sdk_doc.html
里面介绍的很详细了,总结下就是
1.配置域名
2.zhenzisms.js放到utils文件夹下
3.在需要的地方引入并初始化
涂掉的是你在榛子云注册后给你的appId和appSecrect
4.直接使用提供的接口即可
使用小程序·云开发记录
云函数获取用户信息的问题
// 云函数入口文件 这个云函数用于增加指定数量的水滴数
const cloud = require('wx-server-sdk')
cloud.init({ env: 'test-ae626c' })
const db = cloud.database();
const _ = db.command;
let wxOpenId
// 云函数入口函数
exports.main = async (event, context) => {
const addPoints = event.addPoints
const signOrLottery = event.signOrLottery
const wxContext = cloud.getWXContext()
wxOpenId = wxContext.OPENID
// 通过_openid获取对应的doc
let res = await getDocId()
let docId = res.data[0]._id
return updateUsers(signOrLottery, docId, addPoints)
}
function getDocId() {
return db.collection('users').where({
_openid: wxOpenId // 注意这里,如果直接写wxContext.OPENID,即把cloud.getWXContext()
// 放在main外面然后这里获取OPENID的话会获取错误的OPENID
}).get()
}
function updateUsers(signOrLottery, docId, addPoints) {
if (signOrLottery === 'sign') {
return db.collection('users').doc(docId).update({
data: {
waterPoints: _.inc(addPoints),
hasSigned: true
}
})
}
else if (signOrLottery === 'lottery') {
return db.collection('users').doc(docId).update({
data: {
waterPoints: _.inc(addPoints),
hasLotteryed: true
}
})
}
}
比如上面这个云函数,如果cloud.getWXContext()放在main外面,然后在定义的函数中直接使用wxContext.OPENID的话会有问题;比方说其他人在小程序端调用了这个云函数,按道理来说应该获取的是他的OPENID,但是获取的却仍然是开发者的OPENID,不知道为什么会有这种问题......
小程序端API
数据库 API 都是懒执行的,这意味着只有真实需要网络请求的 API 调用才会发起网络请求,其余如获取数据库、集合、记录的引用、在集合上构造查询条件等都是不会触发网络请求的。触发网络请求的 API 有如下几个:
get |
获取集合 / 记录数据 |
add |
在集合上新增记录 |
update |
更新集合 / 记录数据 |
set |
替换更新一个记录 |
remove |
删除记录 |
count |
统计查询语句对应的记录条数 |
获取引用的 API 有如下几个:
database |
获取数据库引用,返回 Database 对象 |
collection |
获取集合引用,返回 Collection 对象 |
doc |
获取对一个记录的引用,返回 Document 对象 |
在数据库 (Database) 对象上有如下字段:
字段 |
说明
|
command |
获取数据库查询及更新指令,返回 Command |
serverDate |
构造服务端时间 |
Geo |
获取地理位置操作对象,返回 Geo 对象 |
在集合 (Collection) 对象上有如下 API:
doc |
获取对一个记录的引用,返回 Document 对象 |
add |
在集合上新增记录 |
where |
构建一个在当前集合上的查询条件,返回 Query,查询条件中可使用查询指令 |
orderBy |
指定查询数据的排序方式 |
limit |
指定返回数据的数量上限 |
skip |
指定查询时从命中的记录列表中的第几项之后开始返回 |
field |
指定返回结果中每条记录应包含的字段 |
在记录 (Document) 对象上有如下 API:
get |
获取记录数据 |
update |
局部更新数据 |
set |
替换更新记录 |
remove |
删除记录 |
field |
指定返回结果中记录应包含的字段 |
Command (db.command) 对象上有如下查询指令:
eq |
字段是否等于指定值 |
neq |
字段是否不等于指定值 |
lt |
字段是否小于指定值 |
lte |
字段是否小于或等于指定值 |
gt |
字段是否大于指定值 |
gte |
字段是否大于或等于指定值 |
in |
字段值是否在指定数组中 |
nin |
字段值是否不在指定数组中 |
and |
条件与,表示需同时满足另一个条件 |
or |
条件或,表示如果满足另一个条件也匹配 |
Command (db.command) 对象上有如下更新指令:
set |
设置字段为指定值 |
remove |
删除字段 |
inc |
原子自增字段值 |
mul |
原子自乘字段值 |
push |
如字段值为数组,往数组尾部增加指定值 |
pop |
如字段值为数组,从数组尾部删除一个元素 |
shift |
如字段值为数组,从数组头部删除一个元素 |
unshift |
如字段值为数组,往数组头部增加指定值 |
db.command的使用
Command (db.command) 对象上有如下查询指令:调用db.where时使用
eq |
字段是否等于指定值 |
neq |
字段是否不等于指定值 |
lt |
字段是否小于指定值 |
lte |
字段是否小于或等于指定值 |
gt |
字段是否大于指定值 |
gte |
字段是否大于或等于指定值 |
in |
字段值是否在指定数组中 |
nin |
字段值是否不在指定数组中 |
and |
条件与,表示需同时满足另一个条件 |
or |
条件或,表示如果满足另一个条件也匹配 |
Command (db.command) 对象上有如下更新指令:调用db.update时使用
set |
设置字段为指定值 |
remove |
删除字段 |
inc |
原子自增字段值 |
mul |
原子自乘字段值 |
push |
如字段值为数组,往数组尾部增加指定值 |
pop |
如字段值为数组,从数组尾部删除一个元素 |
shift |
如字段值为数组,从数组头部删除一个元素 |
unshift |
如字段值为数组,往数组头部增加指定值 |
服务器端API
在 wx-server-sdk 中不再兼容 success、fail、complete 回调,总是只会返回 Promise。
Server 端的 API 与小程序端基本保持一致,有如下不同:
Server API 不再接受回调(success, fail, complete),统一返回 Promise
Server 端有批量写和批量删除的权限,即可在集合或查询语句上调用 update 或 remove
Server 端独有 API 如创建集合(db.createCollection)
即小程序端只能在Document对象上执行update和remove操作,服务器端可以在Collection对象上执行这两个操作(多了两个API)
如何在服务器端执行多个Promise?
const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database()
const MAX_LIMIT = 100
exports.main = async (event, context) => {
// 先取出集合记录总数
const countResult = await db.collection('todos').count()
const total = countResult.total
// 计算需分几次取
const batchTimes = Math.ceil(total / 100)
// 承载所有读操作的 promise 的数组
const tasks = []
for (let i = 0; i < batchTimes; i++) {
const promise = db.collection('todos').skip(i * MAX_LIMIT).limit(MAX_LIMIT).get()
tasks.push(promise)
}
// 等待所有
return (await Promise.all(tasks)).reduce((acc, cur) => ({
data: acc.data.concat(cur.data),
errMsg: acc.errMsg,
}))
}
设置云函数的触发器的注意事项
注意JSON里不能有注释,然后注意点上传触发器这个选项(右键你的云函数找到这个选项)
未完待续......