提交 1962c9d7 编写于 作者: D DCloud_LXH

fix: 修复链接

上级 99195be3
...@@ -61,11 +61,11 @@ Referer防盗链,是基于HTTP请求头中Referer字段来设置访问控制 ...@@ -61,11 +61,11 @@ Referer防盗链,是基于HTTP请求头中Referer字段来设置访问控制
|平台 |Referer | |平台 |Referer |
|:-: |:-: | |:-: |:-: |
|微信 | https://servicewechat.com | |微信 | https://servicewechat.com |
|支付宝 | https://你的支付宝小程序appid.hybrid.alipay-eco.com | |支付宝 | https://你的支付宝小程序appid.hybrid.alipay-eco.com |
|百度 | https://smartapps.cn | |百度 | https://smartapps.cn |
|头条抖音 | https://tmaservice.developer.toutiao.com | |头条抖音 | https://tmaservice.developer.toutiao.com |
|QQ | https://appservice.qq.com | |QQ | https://appservice.qq.com |
注意:如果您启用了白名单,又没有填写上述网址,那么这些小程序将无法访问您的cdn。 注意:如果您启用了白名单,又没有填写上述网址,那么这些小程序将无法访问您的cdn。
...@@ -102,7 +102,7 @@ User-Agent是HTTP请求头的一部分,包含用户访问时所使用的操作 ...@@ -102,7 +102,7 @@ User-Agent是HTTP请求头的一部分,包含用户访问时所使用的操作
uni-app的app端,有默认UA,也可以自定义UA。 uni-app的app端,有默认UA,也可以自定义UA。
如需指定某个特殊UA才能访问cdn,需在manifest.json中配置。详见[App的默认UA和自定义UA教程](/tutorial/app-useragent.md) 如需指定某个特殊UA才能访问cdn,需在manifest.json中配置。详见[App的默认UA和自定义UA教程](https://uniapp.dcloud.net.cn/tutorial/app-useragent.md)
**补充** **补充**
......
...@@ -137,11 +137,11 @@ context对象的属性清单如下: ...@@ -137,11 +137,11 @@ context对象的属性清单如下:
除了上述属性,如果是uni-app客户端通过callfunction访问云函数,那么context还会追加一批客户端信息。 除了上述属性,如果是uni-app客户端通过callfunction访问云函数,那么context还会追加一批客户端信息。
- HBuilderX 3.4.9前,context 添加了一批大写属性,如APPID、OS。 - HBuilderX 3.4.9前,context 添加了一批大写属性,如APPID、OS。
- HBuilderX 3.4.9起,context 的属性包括前端API `uni.getSystemInfo` 的所有属性。比如appId、osName,均以驼峰方式命名。这些属性较多,且可能跟随前端API更新而变化,具体详见 [uni.getSystemInfo](/api/system/info.html#getsysteminfo) - HBuilderX 3.4.9起,context 的属性包括前端API `uni.getSystemInfo` 的所有属性。比如appId、osName,均以驼峰方式命名。这些属性较多,且可能跟随前端API更新而变化,具体详见 [uni.getSystemInfo](https://uniapp.dcloud.net.cn/api/system/info.html#getsysteminfo)
为了保持向下兼容,新版并没有去掉老版那些大写属性的客户端信息,但文档标注为以废弃。对于新版HBuilderX用户而言,请使用 `uni.getSystemInfo` 返回的驼峰属性。 为了保持向下兼容,新版并没有去掉老版那些大写属性的客户端信息,但文档标注为以废弃。对于新版HBuilderX用户而言,请使用 `uni.getSystemInfo` 返回的驼峰属性。
HBuilderX 3.4.9起,context 的属性还可以打印出`channel``scene`,即App的渠道包标记和小程序场景值。但这个功能属于未完成功能,开发者暂不使用这2个属性,后续会升级完善。目前如开发者需要这2个属性,请自行在客户端使用[uni.getLaunchOptionsSync](/api/getLaunchOptionsSync.html#getlaunchoptionssync)上传。 HBuilderX 3.4.9起,context 的属性还可以打印出`channel``scene`,即App的渠道包标记和小程序场景值。但这个功能属于未完成功能,开发者暂不使用这2个属性,后续会升级完善。目前如开发者需要这2个属性,请自行在客户端使用[uni.getLaunchOptionsSync](https://uniapp.dcloud.net.cn/api/getLaunchOptionsSync.html#getlaunchoptionssync)上传。
示例: 示例:
......
...@@ -83,7 +83,7 @@ db.collection('list').get() ...@@ -83,7 +83,7 @@ db.collection('list').get()
.then((res)=>{ .then((res)=>{
// res 为数据库查询结果 // res 为数据库查询结果
}).catch((err)=>{ }).catch((err)=>{
console.log(err); console.log(err);
}) })
``` ```
...@@ -214,7 +214,7 @@ uniCloud服务器给客户端返回的数据格式一般是json,但json的格 ...@@ -214,7 +214,7 @@ uniCloud服务器给客户端返回的数据格式一般是json,但json的格
#### HBuilderX 3.6.10及之后版本的错误规范 #### HBuilderX 3.6.10及之后版本的错误规范
错误规范继承自[uni错误规范](/tutorial/err-spec.md) 错误规范继承自[uni错误规范](https://uniapp.dcloud.net.cn/tutorial/err-spec.md)
#### HBuilderX 3.6.10之前版本的错误规范 #### HBuilderX 3.6.10之前版本的错误规范
...@@ -259,7 +259,7 @@ errMsg用于存放具体错误信息,包括展示给开发者、终端用户 ...@@ -259,7 +259,7 @@ errMsg用于存放具体错误信息,包括展示给开发者、终端用户
} }
``` ```
HBuilderX内使用代码块`returnu`可以快速输入以下代码(`HBuilderX 3.4.0`及以上版本): HBuilderX内使用代码块`returnu`可以快速输入以下代码(`HBuilderX 3.4.0`及以上版本):
```js ```js
return { return {
...@@ -279,7 +279,7 @@ return { ...@@ -279,7 +279,7 @@ return {
|-- |-- | |-- |-- |
|uniCloud.database() |云数据库对象 [详情](uniCloud/cf-database.md) | |uniCloud.database() |云数据库对象 [详情](uniCloud/cf-database.md) |
|uniCloud.databaseJQL() |云函数中使用JQL语法操作数据库 [详见](uniCloud/jql-cloud.md),需添加扩展库 | |uniCloud.databaseJQL() |云函数中使用JQL语法操作数据库 [详见](uniCloud/jql-cloud.md),需添加扩展库 |
|uniCloud.redis() |使用redis [详见](uniCloud/redis.md),需添加扩展库 |uniCloud.redis() |使用redis [详见](uniCloud/redis.md),需添加扩展库
|uniCloud.uploadFile() |云函数上传文件到云存储 [详情](uniCloud/storage?id=clouduploadfile) | |uniCloud.uploadFile() |云函数上传文件到云存储 [详情](uniCloud/storage?id=clouduploadfile) |
|uniCloud.downloadFile() |云函数下载云存储的文件到云函数运行环境 [详情](uniCloud/storage?id=clouddownloadfile) | |uniCloud.downloadFile() |云函数下载云存储的文件到云函数运行环境 [详情](uniCloud/storage?id=clouddownloadfile) |
|uniCloud.deleteFile() |云函数删除云存储的文件 [详情](uniCloud/storage?id=clouddeletefile) | |uniCloud.deleteFile() |云函数删除云存储的文件 [详情](uniCloud/storage?id=clouddeletefile) |
...@@ -657,7 +657,7 @@ uniCloud.getRequestList() ...@@ -657,7 +657,7 @@ uniCloud.getRequestList()
同理,考虑到单实例多并发,`uniCloud.getClientInfos()`获取客户端信息也是一个数组。 同理,考虑到单实例多并发,`uniCloud.getClientInfos()`获取客户端信息也是一个数组。
```js ```js
const clientInfos = uniCloud.getClientInfos() const clientInfos = uniCloud.getClientInfos()
``` ```
返回值 返回值
...@@ -673,7 +673,7 @@ clientInfos = [{ ...@@ -673,7 +673,7 @@ clientInfos = [{
**返回值** **返回值**
getClientInfos返回的信息,是在客户端的[uni.getSystemInfo](/api/system/info.md#getsysteminfo)的基础之上,增加了一些额外的信息。 getClientInfos返回的信息,是在客户端的[uni.getSystemInfo](https://uniapp.dcloud.net.cn/api/system/info.md#getsysteminfo)的基础之上,增加了一些额外的信息。
除了`getSystemInfo`返回字段外,还包含以下信息 除了`getSystemInfo`返回字段外,还包含以下信息
...@@ -683,7 +683,7 @@ getClientInfos返回的信息,是在客户端的[uni.getSystemInfo](/api/syste ...@@ -683,7 +683,7 @@ getClientInfos返回的信息,是在客户端的[uni.getSystemInfo](/api/syste
|clientIP |string |客户端ip | |clientIP |string |客户端ip |
|userAgent|string |客户端ua,注意非本地运行环境下客户端getSystemInfoSync也会获取ua参数并上传给云对象,但是云对象会从http请求头里面获取ua而不是clientInfo里面的ua| |userAgent|string |客户端ua,注意非本地运行环境下客户端getSystemInfoSync也会获取ua参数并上传给云对象,但是云对象会从http请求头里面获取ua而不是clientInfo里面的ua|
|source |string |调用来源,返回值见下。 | |source |string |调用来源,返回值见下。 |
|scene |string |场景值。客户端[uni.getLaunchOptionsSync](/api/getLaunchOptionsSync.md#getlaunchoptionssync)返回的scene参数, | |scene |string |场景值。客户端[uni.getLaunchOptionsSync](https://uniapp.dcloud.net.cn/api/getLaunchOptionsSync.md#getlaunchoptionssync)返回的scene参数, |
云函数调用来源source,它的值域为: 云函数调用来源source,它的值域为:
...@@ -712,7 +712,7 @@ getClientInfos返回的信息,是在客户端的[uni.getSystemInfo](/api/syste ...@@ -712,7 +712,7 @@ getClientInfos返回的信息,是在客户端的[uni.getSystemInfo](/api/syste
**示例** **示例**
```js ```js
const cloudInfos = uniCloud.getCloudInfos() const cloudInfos = uniCloud.getCloudInfos()
cloudInfos = [{ cloudInfos = [{
provider: 'aliyun', provider: 'aliyun',
spaceId: 'xxxxx', spaceId: 'xxxxx',
...@@ -866,7 +866,7 @@ exports.main = async (event, context) => { ...@@ -866,7 +866,7 @@ exports.main = async (event, context) => {
}).then(e=>{ }).then(e=>{
console.log(e.result); console.log(e.result);
}) })
// 等待500毫秒,给一个请求发出去的时间 // 等待500毫秒,给一个请求发出去的时间
return await new Promise((resolve, reject) => { return await new Promise((resolve, reject) => {
setTimeout(() => { setTimeout(() => {
...@@ -885,7 +885,7 @@ exports.main = async (event, context) => { ...@@ -885,7 +885,7 @@ exports.main = async (event, context) => {
//高性能分页查询,以上一次查询的最后一条数据的id被起始id //高性能分页查询,以上一次查询的最后一条数据的id被起始id
where._id = dbCmd.gt(before_id) where._id = dbCmd.gt(before_id)
} }
let res = await userTable.where(where) let res = await userTable.where(where)
.limit(50) .limit(50)
.orderBy("_id", "asc") .orderBy("_id", "asc")
...@@ -959,7 +959,7 @@ serverless是动态分配计算资源的,由此会引发的出一批特有概 ...@@ -959,7 +959,7 @@ serverless是动态分配计算资源的,由此会引发的出一批特有概
3. 启动 node 3. 启动 node
4. 执行云函数代码 4. 执行云函数代码
函数被调用时,执行这些完整步骤的过程称作`冷启动`, 冷启动的耗时一般在一秒左右。 函数被调用时,执行这些完整步骤的过程称作`冷启动`, 冷启动的耗时一般在一秒左右。
一个云函数实例冷启动后,serverless调度中心会保留这个实例一定时间。在实例保留期间,客户端再次请求云函数,不会触发冷启动,速度会更快。实例的详细定义[见下](#instance) 一个云函数实例冷启动后,serverless调度中心会保留这个实例一定时间。在实例保留期间,客户端再次请求云函数,不会触发冷启动,速度会更快。实例的详细定义[见下](#instance)
...@@ -1064,7 +1064,7 @@ exports.main = async (event, context) => { ...@@ -1064,7 +1064,7 @@ exports.main = async (event, context) => {
uniCloud.getRequestList() uniCloud.getRequestList()
// 返回值:['3228166e-3c17-4d58-9707-xxxxxxxx'] // 返回值:['3228166e-3c17-4d58-9707-xxxxxxxx']
``` ```
- 如果未配置阿里云的单实例多并发,getRequestList()返回的数组里面只有一项,即只能拿到当前的请求id。 - 如果未配置阿里云的单实例多并发,getRequestList()返回的数组里面只有一项,即只能拿到当前的请求id。
- 如果配置了阿里云的单实例多并发,当并发发生时,这个列表就会返回多项,当前并发的每个requestId都在里面。 - 如果配置了阿里云的单实例多并发,当并发发生时,这个列表就会返回多项,当前并发的每个requestId都在里面。
...@@ -1083,7 +1083,7 @@ uniCloud.getRequestList() ...@@ -1083,7 +1083,7 @@ uniCloud.getRequestList()
- 如果未配置阿里云的单实例多并发,getRequestList()返回的数组里面只有一项,即只能拿到当前的请求id。 - 如果未配置阿里云的单实例多并发,getRequestList()返回的数组里面只有一项,即只能拿到当前的请求id。
- 如果配置了阿里云的单实例多并发,当并发发生时,这个列表就会返回多项,当前并发的每个requestId都在里面。 - 如果配置了阿里云的单实例多并发,当并发发生时,这个列表就会返回多项,当前并发的每个requestId都在里面。
3. 3.
如果是uniCloud私有云, 如果是uniCloud私有云,
如果想获取与请求相关的信息,比如这次请求的客户端UA,或云函数环境信息,无法直接在uniCloud全局对象中获取。 如果想获取与请求相关的信息,比如这次请求的客户端UA,或云函数环境信息,无法直接在uniCloud全局对象中获取。
...@@ -1114,7 +1114,7 @@ uniCloud.getRequestList() ...@@ -1114,7 +1114,7 @@ uniCloud.getRequestList()
**效果** **效果**
- 有效减少并发请求时云函数冷启动次数 - 有效减少并发请求时云函数冷启动次数
**使用注意** **使用注意**
- 虽然支付宝小程序云与阿里云云函数支持配置多并发,但在高并发下异步请求排队效果未必好于新开一个实例。尤其是并发操作数据库性能不佳。**一般情况下不要设置过大的并发度,可以自己针对业务代码测试比较下是否启用并发或并发数配成多少** - 虽然支付宝小程序云与阿里云云函数支持配置多并发,但在高并发下异步请求排队效果未必好于新开一个实例。尤其是并发操作数据库性能不佳。**一般情况下不要设置过大的并发度,可以自己针对业务代码测试比较下是否启用并发或并发数配成多少**
...@@ -1340,7 +1340,7 @@ uniCloud.httpProxyForEip.get(url: String, params?: Object) ...@@ -1340,7 +1340,7 @@ uniCloud.httpProxyForEip.get(url: String, params?: Object)
await uniCloud.httpProxyForEip.get( await uniCloud.httpProxyForEip.get(
'https://api.weixin.qq.com/cgi-bin/token', 'https://api.weixin.qq.com/cgi-bin/token',
{ {
grant_type: 'client_credential', grant_type: 'client_credential',
appid: 'xxxx', appid: 'xxxx',
secret: 'xxxx' secret: 'xxxx'
} }
...@@ -1360,7 +1360,7 @@ uniCloud.httpProxyForEip.postForm(url: String, data?: Object, headers?: Object) ...@@ -1360,7 +1360,7 @@ uniCloud.httpProxyForEip.postForm(url: String, data?: Object, headers?: Object)
**示例** **示例**
```js ```js
uniCloud.httpProxyForEip.postForm( uniCloud.httpProxyForEip.postForm(
'https://www.example.com/search', 'https://www.example.com/search',
{ {
q: 'nodejs', q: 'nodejs',
...@@ -1382,7 +1382,7 @@ uniCloud.httpProxyForEip.postJson(url: String, json?: Object, headers?: Object) ...@@ -1382,7 +1382,7 @@ uniCloud.httpProxyForEip.postJson(url: String, json?: Object, headers?: Object)
**示例** **示例**
```js ```js
uniCloud.httpProxyForEip.postJson( uniCloud.httpProxyForEip.postJson(
'https://www.example.com/search', 'https://www.example.com/search',
{ {
q: 'nodejs', q: 'nodejs',
...@@ -1402,7 +1402,7 @@ uniCloud.httpProxyForEip.post(url: String, text?: String, headers?: Object) ...@@ -1402,7 +1402,7 @@ uniCloud.httpProxyForEip.post(url: String, text?: String, headers?: Object)
**示例** **示例**
```js ```js
uniCloud.httpProxyForEip.post( uniCloud.httpProxyForEip.post(
'https://www.example.com/search', 'https://www.example.com/search',
'abcdefg', 'abcdefg',
{ {
...@@ -1451,7 +1451,7 @@ package.json是一个标准json文件,不可带注释。下面是一个package ...@@ -1451,7 +1451,7 @@ package.json是一个标准json文件,不可带注释。下面是一个package
"config": "0 0 2 1 * * *" "config": "0 0 2 1 * * *"
}], }],
"path": "", "path": "",
"runtime": "Nodejs8" "runtime": "Nodejs8"
} }
} }
``` ```
...@@ -1528,7 +1528,7 @@ exports.main = async function(event, context) { ...@@ -1528,7 +1528,7 @@ exports.main = async function(event, context) {
```js ```js
exports.main = async function(event, context) { exports.main = async function(event, context) {
uniCloud.callFunction({ uniCloud.callFunction({
name: 'test', name: 'test',
data: {} data: {}
}) })
...@@ -1592,7 +1592,7 @@ package.json是一个标准json文件,不可带注释。下面是一个package ...@@ -1592,7 +1592,7 @@ package.json是一个标准json文件,不可带注释。下面是一个package
"description": "新增文章", "description": "新增文章",
"main": "index.js", "main": "index.js",
"dependencies": { "dependencies": {
}, },
"cloudfunction-config": { "cloudfunction-config": {
"memorySize": 256, "memorySize": 256,
......
...@@ -48,7 +48,7 @@ async function addTodo () { ...@@ -48,7 +48,7 @@ async function addTodo () {
title: '创建成功' title: '创建成功'
}) })
} catch (e) { } catch (e) {
// 符合uniCloud响应体规范 https://uniapp.dcloud.net.cn/uniCloud/cf-functions?id=resformat,自动抛出此错误 // 符合uniCloud响应体规范 https://uniapp.dcloud.net.cn/uniCloud/cf-functions?id=resformat,自动抛出此错误
uni.showModal({ uni.showModal({
title: '创建失败', title: '创建失败',
content: e.errMsg, content: e.errMsg,
...@@ -103,7 +103,7 @@ exports.main = async (event, context) => { ...@@ -103,7 +103,7 @@ exports.main = async (event, context) => {
async function addToDo () { async function addToDo () {
try { try {
const res = await uniCloud.callFunction({ const res = await uniCloud.callFunction({
name: 'todo', name: 'todo',
data: { data: {
method: 'add', method: 'add',
params: { params: {
...@@ -162,7 +162,7 @@ _注:以上例子仅用于方便初学者理解。实际开发中对于简单 ...@@ -162,7 +162,7 @@ _注:以上例子仅用于方便初学者理解。实际开发中对于简单
```js ```js
// cloudfunctions/todo/index.obj.js // cloudfunctions/todo/index.obj.js
module.exports = { module.exports = {
} }
``` ```
...@@ -306,7 +306,7 @@ getClientInfo返回的信息,是在客户端的[uni.getSystemInfo](https://uni ...@@ -306,7 +306,7 @@ getClientInfo返回的信息,是在客户端的[uni.getSystemInfo](https://uni
|userAgent|string|客户端ua,注意非本地运行环境下客户端getSystemInfoSync也会获取ua参数并上传给云对象,但是云对象会从http请求头里面获取ua而不是clientInfo里面的ua | |userAgent|string|客户端ua,注意非本地运行环境下客户端getSystemInfoSync也会获取ua参数并上传给云对象,但是云对象会从http请求头里面获取ua而不是clientInfo里面的ua |
|source |string |调用来源,返回值见下。`HBuilderX 3.5.1+` | |source |string |调用来源,返回值见下。`HBuilderX 3.5.1+` |
|requestId|string |请求id。`HBuilderX 3.5.1+` | |requestId|string |请求id。`HBuilderX 3.5.1+` |
|scene |string |场景值。客户端[uni.getLaunchOptionsSync](/api/getLaunchOptionsSync.html#getlaunchoptionssync)返回的scene参数,新增于`HBuilderX 3.5.1` | |scene |string |场景值。客户端[uni.getLaunchOptionsSync](https://uniapp.dcloud.net.cn/api/getLaunchOptionsSync.html#getlaunchoptionssync)返回的scene参数,新增于`HBuilderX 3.5.1` |
getClientInfo().source,返回云函数调用来源,它的值域为: getClientInfo().source,返回云函数调用来源,它的值域为:
...@@ -623,7 +623,7 @@ uni-app框架在拿到云对象的响应结果后,会识别其中是否包含` ...@@ -623,7 +623,7 @@ uni-app框架在拿到云对象的响应结果后,会识别其中是否包含`
```js ```js
// 云对象代码 todo/index.obj.js // 云对象代码 todo/index.obj.js
module.exports = { module.exports = {
add: async function(title = '', content = '') { add: async function(title = '', content = '') {
title = title.trim() title = title.trim()
content = content.trim() content = content.trim()
if(!title || !content) { if(!title || !content) {
......
...@@ -349,7 +349,7 @@ login('name-demo', 'password-demo') // 调用login方法传入参数'name-demo' ...@@ -349,7 +349,7 @@ login('name-demo', 'password-demo') // 调用login方法传入参数'name-demo'
uni-app前端也支持debug调试,注意不要混淆。 uni-app前端也支持debug调试,注意不要混淆。
在调试面板上方有断点step按钮,鼠标悬浮上去可看到快捷键。可以单步调试。调试面板的使用教程同客户端调试,[详见](/tutorial/debug/h5-debug.md) 在调试面板上方有断点step按钮,鼠标悬浮上去可看到快捷键。可以单步调试。调试面板的使用教程同客户端调试,[详见](https://uniapp.dcloud.net.cn/tutorial/debug/h5-debug.md)
## 云端日志@uniCloudlogger ## 云端日志@uniCloudlogger
......
...@@ -46,7 +46,7 @@ ...@@ -46,7 +46,7 @@
- 如果应用的权限系统比较复杂,使用clientDB不如使用云对象方便,也应该编写好除了权限部分以外的其他的schema。这样联表查询、tree查询、默认值、值域校验等其他功能仍然可以方便使用。 - 如果应用的权限系统比较复杂,使用clientDB不如使用云对象方便,也应该编写好除了权限部分以外的其他的schema。这样联表查询、tree查询、默认值、值域校验等其他功能仍然可以方便使用。
具体来说,如自己在云函数中编写权限控制代码,则需要把`DB Schema`的权限都设为false,在云函数中将操作角色设为admin(通过setuser API),以跳过schema的权限验证。 具体来说,如自己在云函数中编写权限控制代码,则需要把`DB Schema`的权限都设为false,在云函数中将操作角色设为admin(通过setuser API),以跳过schema的权限验证。
当然,云函数中代码控制的权限和`DB Schema`中的权限也可以混合使用,简单权限交由`DB Schema`处理,负责权限再编写代码处理。 当然,云函数中代码控制的权限和`DB Schema`中的权限也可以混合使用,简单权限交由`DB Schema`处理,负责权限再编写代码处理。
所以建议开发者编写好schema,无论云端还是前端操作数据库。最多是云函数处理权限时忽略schema中的权限部分。 所以建议开发者编写好schema,无论云端还是前端操作数据库。最多是云函数处理权限时忽略schema中的权限部分。
...@@ -94,9 +94,9 @@ HBuilderX中运行前端项目,在控制台选择连接本地云函数,或 ...@@ -94,9 +94,9 @@ HBuilderX中运行前端项目,在控制台选择连接本地云函数,或
"bsonType": "object", // 固定节点 "bsonType": "object", // 固定节点
"description": "表的描述", "description": "表的描述",
"required": [], // 必填字段 "required": [], // 必填字段
"permission": { "permission": {
"read": false, // 前端非admin的读取记录权限控制。默认值是false,即可以不写。可以简单的true/false,也可以写表达式 "read": false, // 前端非admin的读取记录权限控制。默认值是false,即可以不写。可以简单的true/false,也可以写表达式
"create": false, // 前端非admin的新增记录权限控制。默认值是false,即可以不写。可以简单的true/false,也可以写表达式 "create": false, // 前端非admin的新增记录权限控制。默认值是false,即可以不写。可以简单的true/false,也可以写表达式
"update": false, // 前端非admin的更新记录权限控制。默认值是false,即可以不写。可以简单的true/false,也可以写表达式 "update": false, // 前端非admin的更新记录权限控制。默认值是false,即可以不写。可以简单的true/false,也可以写表达式
"delete": false, // 前端非admin的删除记录权限控制。默认值是false,即可以不写。可以简单的true/false,也可以写表达式 "delete": false, // 前端非admin的删除记录权限控制。默认值是false,即可以不写。可以简单的true/false,也可以写表达式
"count": false // 前端非admin的求数权限控制。默认值是true,即可以不写。可以简单的true/false,也可以写表达式 "count": false // 前端非admin的求数权限控制。默认值是true,即可以不写。可以简单的true/false,也可以写表达式
...@@ -291,7 +291,7 @@ schema保存后,可以通过代码测试。注意在uniCloud web控制台修 ...@@ -291,7 +291,7 @@ schema保存后,可以通过代码测试。注意在uniCloud web控制台修
官方推出了`openDB`开源数据库规范,包括用户表、文章表、商品表等很多模板表,这些模板表均已经内置`DB Schema`,可学习参考。[详见](opendb.md) 官方推出了`openDB`开源数据库规范,包括用户表、文章表、商品表等很多模板表,这些模板表均已经内置`DB Schema`,可学习参考。[详见](opendb.md)
schema 国际化方案 [详见](/tutorial/i18n?id=schema) schema 国际化方案 [详见](https://uniapp.dcloud.net.cn/tutorial/i18n?id=schema)
### 字段类型bsonType@bsontype ### 字段类型bsonType@bsontype
...@@ -658,7 +658,7 @@ JQL没有像SQL那样提供了join、leftjoin、innerjoin这些语法,只需 ...@@ -658,7 +658,7 @@ JQL没有像SQL那样提供了join、leftjoin、innerjoin这些语法,只需
联表查询内容较多,[详见](jql.md#lookup) 联表查询内容较多,[详见](jql.md#lookup)
<!-- <!--
以简历和招聘系统为例,一个完整系统至少需要如下表: 以简历和招聘系统为例,一个完整系统至少需要如下表:
- 应聘者注册信息表(uni-id-users),包括`_id`、用户名、密码、注册时间 - 应聘者注册信息表(uni-id-users),包括`_id`、用户名、密码、注册时间
- 应聘者简历表(resume),包括`_id`、应聘者uid和简历中各种信息 - 应聘者简历表(resume),包括`_id`、应聘者uid和简历中各种信息
...@@ -1123,7 +1123,7 @@ rule表达式里支持: ...@@ -1123,7 +1123,7 @@ rule表达式里支持:
} }
} }
``` ```
上述示例中,`create_date`为必填项,只需限制`end_date`存在时大于`create_date`即可 上述示例中,`create_date`为必填项,只需限制`end_date`存在时大于`create_date`即可
**注意** **注意**
...@@ -1412,7 +1412,7 @@ HBuilderX 3.1.0起还新增了count权限,即是否有权对该表进行统计 ...@@ -1412,7 +1412,7 @@ HBuilderX 3.1.0起还新增了count权限,即是否有权对该表进行统计
} }
} }
``` ```
**关于count权限的说明** **关于count权限的说明**
- 在HBuilderX 3.1.0之前,count操作都会使用表级的read权限进行验证。HBuilderX 3.1.0及之后的版本,如果配置了count权限则会使用表级的read+count权限进行校验,两条均满足才可以通过校验 - 在HBuilderX 3.1.0之前,count操作都会使用表级的read权限进行验证。HBuilderX 3.1.0及之后的版本,如果配置了count权限则会使用表级的read+count权限进行校验,两条均满足才可以通过校验
...@@ -1586,7 +1586,7 @@ permission的字段级控制,包括读写两种权限,分别称为:read、 ...@@ -1586,7 +1586,7 @@ permission的字段级控制,包括读写两种权限,分别称为:read、
"bsonType": "string", "bsonType": "string",
"title": "名称", "title": "名称",
"permission": { "permission": {
"read": true, "read": true,
"write": "doc._id == auth.uid" // 允许登录的用户修改自己的name字段 "write": "doc._id == auth.uid" // 允许登录的用户修改自己的name字段
} }
}, },
......
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
`uni-push`有服务器API和客户端API。 `uni-push`有服务器API和客户端API。
## 客户端API [详情参考](/api/plugins/push) ## 客户端API [详情参考](https://uniapp.dcloud.net.cn/api/plugins/push)
## 服务端API @uni-cloud-push ## 服务端API @uni-cloud-push
...@@ -49,7 +49,7 @@ ...@@ -49,7 +49,7 @@
**注意**`user_id``user_tag``device_id``push_clientid``getui_custom_tag``getui_big_data_tag``getui_alias`不可多选。全为空表示向所有启动过应用的设备推送。 **注意**`user_id``user_tag``device_id``push_clientid``getui_custom_tag``getui_big_data_tag``getui_alias`不可多选。全为空表示向所有启动过应用的设备推送。
如果用户处于未登录状态,你可以基于`device_id`向用户推送消息,但是推送服务器底层只识别`push_clientid`,需要通过查数据库获得`push_clientid`。而`device_id``push_clientid`的映射关系不由`uni-push`提供,而是由[uni统计](https://uniapp.dcloud.io/uni-stat-v2.html)模块内置的功能实现。如果你不使用uni统计,则需要在应用启动时调用[getPushClientId](/api/plugins/push)获取`push_clientid`,获取成功后(应用未在manifest中启用uni-push2.0则会获取失败)调用服务端云对象的某个方法(参数:`push_clientid`)执行向`opendb-device`表写入或更新(存在时):[设备信息](https://uniapp.dcloud.io/uniCloud/cloud-obj.html#get-client-info)`push_clientid` 如果用户处于未登录状态,你可以基于`device_id`向用户推送消息,但是推送服务器底层只识别`push_clientid`,需要通过查数据库获得`push_clientid`。而`device_id``push_clientid`的映射关系不由`uni-push`提供,而是由[uni统计](https://uniapp.dcloud.io/uni-stat-v2.html)模块内置的功能实现。如果你不使用uni统计,则需要在应用启动时调用[getPushClientId](https://uniapp.dcloud.net.cn/api/plugins/push)获取`push_clientid`,获取成功后(应用未在manifest中启用uni-push2.0则会获取失败)调用服务端云对象的某个方法(参数:`push_clientid`)执行向`opendb-device`表写入或更新(存在时):[设备信息](https://uniapp.dcloud.io/uniCloud/cloud-obj.html#get-client-info)`push_clientid`
同理基于`user_id`向用户推送消息,需要`user_id``push_clientid`的映射关系,可以直接使用[uni-id-pages](https://ext.dcloud.net.cn/plugin?id=8577)插件内置的功能实现。如果你不使用`uni-id-pages`需要在`App.vue`调用[uniCloud.onRefreshToken](https://uniapp.dcloud.io/uniCloud/client-sdk.html#on-refresh-token) 监听token发生变化(即:用户登录和token续期时),调用服务端云对象的某个方法(参数:`push_clientid`)操作`uni-id-device`表,记录`device_id``user_id`(防客户端伪造,需校验`token`)的映射关系;完整字段包含`user_id``device_id``token_expired``push_clientid``appid`。同时再向`opendb-device`表写入或更新(存在时):[设备信息](https://uniapp.dcloud.io/uniCloud/cloud-obj.html#get-client-info)`push_clientid` 同理基于`user_id`向用户推送消息,需要`user_id``push_clientid`的映射关系,可以直接使用[uni-id-pages](https://ext.dcloud.net.cn/plugin?id=8577)插件内置的功能实现。如果你不使用`uni-id-pages`需要在`App.vue`调用[uniCloud.onRefreshToken](https://uniapp.dcloud.io/uniCloud/client-sdk.html#on-refresh-token) 监听token发生变化(即:用户登录和token续期时),调用服务端云对象的某个方法(参数:`push_clientid`)操作`uni-id-device`表,记录`device_id``user_id`(防客户端伪造,需校验`token`)的映射关系;完整字段包含`user_id``device_id``token_expired``push_clientid``appid`。同时再向`opendb-device`表写入或更新(存在时):[设备信息](https://uniapp.dcloud.io/uniCloud/cloud-obj.html#get-client-info)`push_clientid`
...@@ -60,10 +60,10 @@ ...@@ -60,10 +60,10 @@
#### 接口形式 #### 接口形式
可以向设定的(单个、群组、全体)设备,即时或定时推送消息。支持设置:通知栏消息内容、控制响铃,震动,浮动,闪灯;手机桌面应用右上角的角标等。 可以向设定的(单个、群组、全体)设备,即时或定时推送消息。支持设置:通知栏消息内容、控制响铃,震动,浮动,闪灯;手机桌面应用右上角的角标等。
```js ```js
await uniPush.sendMessage(OBJECT) await uniPush.sendMessage(OBJECT)
``` ```
#### 入参说明 #### 入参说明
|名称|类型|必填|默认值|描述|平台特性| |名称|类型|必填|默认值|描述|平台特性|
|--|--|--|--|--|--| |--|--|--|--|--|--|
|user_id|String、Array|否|无|基于uni-id的_id,指定接收消息的用户id。</br>支持多个以数组的形式指定多个用户id,如["user_id-1","user_id-2"],数组长度不大于500| | |user_id|String、Array|否|无|基于uni-id的_id,指定接收消息的用户id。</br>支持多个以数组的形式指定多个用户id,如["user_id-1","user_id-2"],数组长度不大于500| |
...@@ -108,7 +108,7 @@ await uniPush.sendMessage(OBJECT) ...@@ -108,7 +108,7 @@ await uniPush.sendMessage(OBJECT)
- 不同key之间是交集,同一个key之间是根据`opt_type`操作 - 不同key之间是交集,同一个key之间是根据`opt_type`操作
- eg. 需要发送给城市在A,B,C里面,没有设置tagtest标签,手机型号为android的设备,用条件交并补功能可以实现,city(A|B|C) && !tag(tagtest) && phonetype(android) - eg. 需要发送给城市在A,B,C里面,没有设置tagtest标签,手机型号为android的设备,用条件交并补功能可以实现,city(A|B|C) && !tag(tagtest) && phonetype(android)
##### platform 说明 ##### platform 说明
|值|解释| |值|解释|
|:-|:-| |:-|:-|
|app-ios|iOS App| |app-ios|iOS App|
...@@ -241,7 +241,7 @@ await uniPush.sendMessage(OBJECT) ...@@ -241,7 +241,7 @@ await uniPush.sendMessage(OBJECT)
#### 停止任务 #### 停止任务
对正处于推送状态,或者未接收的消息停止下发(只支持批量推和群推任务) 对正处于推送状态,或者未接收的消息停止下发(只支持批量推和群推任务)
##### 接口形式 ##### 接口形式
```js ```js
await uniPush.stopTaskByTaskid(taskId) await uniPush.stopTaskByTaskid(taskId)
``` ```
##### 入参说明 ##### 入参说明
...@@ -252,7 +252,7 @@ await uniPush.stopTaskByTaskid(taskId) ...@@ -252,7 +252,7 @@ await uniPush.stopTaskByTaskid(taskId)
##### 响应体说明 ##### 响应体说明
```js ```js
{ {
"errCode":0, "errCode":0,
"errMsg":"success" "errMsg":"success"
} }
``` ```
...@@ -262,7 +262,7 @@ await uniPush.stopTaskByTaskid(taskId) ...@@ -262,7 +262,7 @@ await uniPush.stopTaskByTaskid(taskId)
#### 查询定时任务 #### 查询定时任务
该接口支持在推送完定时任务之后,查看定时任务状态,定时任务是否发送成功。 该接口支持在推送完定时任务之后,查看定时任务状态,定时任务是否发送成功。
##### 接口形式 ##### 接口形式
```js ```js
await uniPush.getTaskScheduleByTaskid(taskId) await uniPush.getTaskScheduleByTaskid(taskId)
``` ```
##### 入参说明 ##### 入参说明
...@@ -301,7 +301,7 @@ await uniPush.getTaskScheduleByTaskid(taskId) ...@@ -301,7 +301,7 @@ await uniPush.getTaskScheduleByTaskid(taskId)
#### 删除定时任务 #### 删除定时任务
用来删除还未下发的任务,删除后定时任务不再触发(距离下发还有一分钟的任务,将无法删除,后续可以调用停止任务接口。) 用来删除还未下发的任务,删除后定时任务不再触发(距离下发还有一分钟的任务,将无法删除,后续可以调用停止任务接口。)
##### 接口形式 ##### 接口形式
```js ```js
await uniPush.deleteTaskScheduleByTaskid(taskId) await uniPush.deleteTaskScheduleByTaskid(taskId)
``` ```
##### 入参说明 ##### 入参说明
...@@ -325,13 +325,13 @@ await uniPush.deleteTaskScheduleByTaskid(taskId) ...@@ -325,13 +325,13 @@ await uniPush.deleteTaskScheduleByTaskid(taskId)
调用此接口可以查询某任务下某cid的具体实时推送路径情况 调用此接口可以查询某任务下某cid的具体实时推送路径情况
>使用该接口需要申请权限,若有需要,请点击右侧“技术咨询”了解详情 >使用该接口需要申请权限,若有需要,请点击右侧“技术咨询”了解详情
##### 接口形式 ##### 接口形式
```js ```js
await uniPush.getTaskDetail(OBJECT) await uniPush.getTaskDetail(OBJECT)
``` ```
##### 入参说明 ##### 入参说明
| 名称 | 类型 |是否必须 | 默认值|说明 | | 名称 | 类型 |是否必须 | 默认值|说明 |
| ------------ | ----------- |-----------|---|--------| | ------------ | ----------- |-----------|---|--------|
|taskId |string | true | 无|任务id | |taskId |string | true | 无|任务id |
|cid |string | true | 无|cid | |cid |string | true | 无|cid |
##### 响应体说明 ##### 响应体说明
...@@ -374,7 +374,7 @@ await uniPush.getTaskDetail(OBJECT) ...@@ -374,7 +374,7 @@ await uniPush.getTaskDetail(OBJECT)
#### 绑定别名 #### 绑定别名
一个cid只能绑定一个别名,若已绑定过别名的cid再次绑定新别名,则前一个别名会自动解绑,并绑定新别名。 一个cid只能绑定一个别名,若已绑定过别名的cid再次绑定新别名,则前一个别名会自动解绑,并绑定新别名。
##### 接口形式 ##### 接口形式
```js ```js
await uniPush.cidBindAlias(OBJECT) await uniPush.cidBindAlias(OBJECT)
``` ```
##### 入参说明 ##### 入参说明
...@@ -416,7 +416,7 @@ await uniPush.cidBindAlias(OBJECT) ...@@ -416,7 +416,7 @@ await uniPush.cidBindAlias(OBJECT)
#### 根据cid查询别名 #### 根据cid查询别名
通过传入的cid查询对应的别名信息 通过传入的cid查询对应的别名信息
##### 接口形式 ##### 接口形式
```js ```js
await uniPush.getAliasByCid(cid) await uniPush.getAliasByCid(cid)
``` ```
##### 入参说明 ##### 入参说明
...@@ -449,7 +449,7 @@ await uniPush.getAliasByCid(cid) ...@@ -449,7 +449,7 @@ await uniPush.getAliasByCid(cid)
#### 根据别名查询cid #### 根据别名查询cid
通过传入的别名查询对应的cid信息 通过传入的别名查询对应的cid信息
##### 接口形式 ##### 接口形式
```js ```js
await uniPush.getCidByAlias(alias) await uniPush.getCidByAlias(alias)
``` ```
##### 入参说明 ##### 入参说明
...@@ -480,7 +480,7 @@ await uniPush.getCidByAlias(alias) ...@@ -480,7 +480,7 @@ await uniPush.getCidByAlias(alias)
#### 批量解绑别名 #### 批量解绑别名
批量解除别名与cid的关系 批量解除别名与cid的关系
##### 接口形式 ##### 接口形式
```js ```js
await uniPush.unboundAlias(Array) await uniPush.unboundAlias(Array)
``` ```
##### 入参说明 ##### 入参说明
...@@ -522,7 +522,7 @@ await uniPush.unboundAlias(Array) ...@@ -522,7 +522,7 @@ await uniPush.unboundAlias(Array)
#### 解绑所有别名 #### 解绑所有别名
解绑所有与该别名绑定的cid 解绑所有与该别名绑定的cid
##### 接口形式 ##### 接口形式
```js ```js
await uniPush.unboundAllAlias(alias) await uniPush.unboundAllAlias(alias)
``` ```
##### 入参说明 ##### 入参说明
...@@ -551,7 +551,7 @@ await uniPush.unboundAllAlias(alias) ...@@ -551,7 +551,7 @@ await uniPush.unboundAllAlias(alias)
一个设备绑定一批标签,此操作为覆盖操作,会删除历史绑定的标签; 一个设备绑定一批标签,此操作为覆盖操作,会删除历史绑定的标签;
> 此接口对单个cid有频控限制,每天只能修改一次,最多设置100个标签;单个标签长度最大为32字符,标签总长度最大为512个字符,申请修改请点击右侧“技术咨询”了解详情 。 > 此接口对单个cid有频控限制,每天只能修改一次,最多设置100个标签;单个标签长度最大为32字符,标签总长度最大为512个字符,申请修改请点击右侧“技术咨询”了解详情 。
##### 接口形式 ##### 接口形式
```js ```js
await uniPush.cidBindCustomTags(OBJECT) await uniPush.cidBindCustomTags(OBJECT)
``` ```
##### 入参说明 ##### 入参说明
...@@ -592,7 +592,7 @@ await uniPush.cidBindCustomTags(OBJECT) ...@@ -592,7 +592,7 @@ await uniPush.cidBindCustomTags(OBJECT)
一批设备绑定一个标签,此接口为增量 一批设备绑定一个标签,此接口为增量
> 此接口有频次控制(每分钟最多100次,每天最多10000次),申请修改请点击右侧“技术咨询”了解详情 > 此接口有频次控制(每分钟最多100次,每天最多10000次),申请修改请点击右侧“技术咨询”了解详情
##### 接口形式 ##### 接口形式
```js ```js
await uniPush.cidsBindCustomTag(OBJECT) await uniPush.cidsBindCustomTag(OBJECT)
``` ```
...@@ -629,7 +629,7 @@ await uniPush.cidsBindCustomTag(OBJECT) ...@@ -629,7 +629,7 @@ await uniPush.cidsBindCustomTag(OBJECT)
解绑设备的某个标签属性,不影响其它标签 解绑设备的某个标签属性,不影响其它标签
>此接口有频次控制(每分钟最多100次,每天最多10000次),申请修改请点击右侧“技术咨询”了解详情 >此接口有频次控制(每分钟最多100次,每天最多10000次),申请修改请点击右侧“技术咨询”了解详情
##### 接口形式 ##### 接口形式
```js ```js
await uniPush.cidsUnboundCustomTag(OBJECT) await uniPush.cidsUnboundCustomTag(OBJECT)
``` ```
##### 入参说明 ##### 入参说明
...@@ -665,7 +665,7 @@ await uniPush.cidsUnboundCustomTag(OBJECT) ...@@ -665,7 +665,7 @@ await uniPush.cidsUnboundCustomTag(OBJECT)
根据cid查询客户端标签列表 根据cid查询客户端标签列表
>此接口有频次控制(每分钟最多100次,每天最多10000次),申请修改请点击右侧“技术咨询”了解详情 >此接口有频次控制(每分钟最多100次,每天最多10000次),申请修改请点击右侧“技术咨询”了解详情
##### 接口形式 ##### 接口形式
```js ```js
await uniPush.searchCustomTagByCid(cid) await uniPush.searchCustomTagByCid(cid)
``` ```
##### 入参说明 ##### 入参说明
...@@ -704,7 +704,7 @@ await uniPush.searchCustomTagByCid(cid) ...@@ -704,7 +704,7 @@ await uniPush.searchCustomTagByCid(cid)
将单个或多个设备加入黑名单,对于黑名单设备在推送过程中会被过滤掉。 将单个或多个设备加入黑名单,对于黑名单设备在推送过程中会被过滤掉。
##### 接口形式 ##### 接口形式
```js ```js
await uniPush.addCidToBlacklist(push_clientid) await uniPush.addCidToBlacklist(push_clientid)
``` ```
##### 入参说明 ##### 入参说明
...@@ -728,7 +728,7 @@ await uniPush.addCidToBlacklist(push_clientid) ...@@ -728,7 +728,7 @@ await uniPush.addCidToBlacklist(push_clientid)
#### 移除黑名单设备 #### 移除黑名单设备
将单个push_clientid或多个push_clientid设备移出黑名单,对于黑名单设备在推送过程中会被过滤掉的,不会给黑名单设备推送消息 将单个push_clientid或多个push_clientid设备移出黑名单,对于黑名单设备在推送过程中会被过滤掉的,不会给黑名单设备推送消息
##### 接口形式 ##### 接口形式
```js ```js
await uniPush.removeCidInBlacklist(push_clientid) await uniPush.removeCidInBlacklist(push_clientid)
``` ```
##### 入参说明 ##### 入参说明
...@@ -756,7 +756,7 @@ await uniPush.removeCidInBlacklist(push_clientid) ...@@ -756,7 +756,7 @@ await uniPush.removeCidInBlacklist(push_clientid)
注意:该状态为:`offline`离线时,消息可通过:同设备下其他集成个推SDK的在线应用通道完成推送(iOS不支持,Android受限于手机rom的节点设置策略) 注意:该状态为:`offline`离线时,消息可通过:同设备下其他集成个推SDK的在线应用通道完成推送(iOS不支持,Android受限于手机rom的节点设置策略)
##### 接口形式 ##### 接口形式
```js ```js
await uniPush.getClientStatusByCid(push_clientid) await uniPush.getClientStatusByCid(push_clientid)
``` ```
##### 入参说明 ##### 入参说明
...@@ -797,7 +797,7 @@ await uniPush.getClientStatusByCid(push_clientid) ...@@ -797,7 +797,7 @@ await uniPush.getClientStatusByCid(push_clientid)
2. 该接口返回设备不在线时,仅表示不存在集成了个推SDK的应用在线 2. 该接口返回设备不在线时,仅表示不存在集成了个推SDK的应用在线
3. 该接口需要开通权限,如需开通,请联系右侧技术咨询 3. 该接口需要开通权限,如需开通,请联系右侧技术咨询
##### 接口形式 ##### 接口形式
```js ```js
await uniPush.getDeviceStatusByCid(cid) await uniPush.getDeviceStatusByCid(cid)
``` ```
##### 入参说明 ##### 入参说明
...@@ -819,7 +819,7 @@ await uniPush.getDeviceStatusByCid(cid) ...@@ -819,7 +819,7 @@ await uniPush.getDeviceStatusByCid(cid)
"data": { "data": {
"cid_status":"offline", "cid_status":"offline",
"device_status":"online" "device_status":"online"
} }
} }
} }
} }
...@@ -839,7 +839,7 @@ await uniPush.getDeviceStatusByCid(cid) ...@@ -839,7 +839,7 @@ await uniPush.getDeviceStatusByCid(cid)
#### 设备详细信息 #### 设备详细信息
查询设备的信息 查询设备的信息
##### 接口形式 ##### 接口形式
```js ```js
await uniPush.getClientDetailByCid(String|Array) await uniPush.getClientDetailByCid(String|Array)
``` ```
##### 入参说明 ##### 入参说明
...@@ -902,7 +902,7 @@ await uniPush.getClientDetailByCid(String|Array) ...@@ -902,7 +902,7 @@ await uniPush.getClientDetailByCid(String|Array)
#### 查询设备总量 #### 查询设备总量
通过指定查询条件来查询满足条件的设备数量 通过指定查询条件来查询满足条件的设备数量
##### 接口形式 ##### 接口形式
```js ```js
await uniPush.getClientCount(OBJECT) await uniPush.getClientCount(OBJECT)
``` ```
##### 入参说明 ##### 入参说明
...@@ -973,7 +973,7 @@ await uniPush.getClientCount(OBJECT) ...@@ -973,7 +973,7 @@ await uniPush.getClientCount(OBJECT)
#### 设置应用角标(仅支持IOS) #### 设置应用角标(仅支持IOS)
通过cid通知个推服务器当前iOS设备的角标情况。 通过cid通知个推服务器当前iOS设备的角标情况。
##### 接口形式 ##### 接口形式
```js ```js
await uniPush.setBadgeByCid(OBJECT) await uniPush.setBadgeByCid(OBJECT)
``` ```
##### 入参说明 ##### 入参说明
...@@ -997,14 +997,14 @@ await uniPush.setBadgeByCid(OBJECT) ...@@ -997,14 +997,14 @@ await uniPush.setBadgeByCid(OBJECT)
查询推送数据,可查询消息可下发数、下发数,接收数、展示数、点击数等结果。支持单个taskId查询和多个taskId查询。 查询推送数据,可查询消息可下发数、下发数,接收数、展示数、点击数等结果。支持单个taskId查询和多个taskId查询。
>此接口调用,仅可以查询toList或toApp的推送结果数据;不能查询toSingle的推送结果数据。 >此接口调用,仅可以查询toList或toApp的推送结果数据;不能查询toSingle的推送结果数据。
##### 接口形式 ##### 接口形式
```js ```js
await uniPush.getReport(OBJECT) await uniPush.getReport(OBJECT)
``` ```
##### 入参说明 ##### 入参说明
| 名称 | 类型 | 是否必须 | 默认值| 说明 | | 名称 | 类型 | 是否必须 | 默认值| 说明 |
| ------ | ------ | ------ | ------ | ------ | | ------ | ------ | ------ | ------ | ------ |
| taskid | String | 是 | 无 | 任务id,推送时返回,多个taskId以英文逗号隔开,一次最多传200个| | taskid | String | 是 | 无 | 任务id,推送时返回,多个taskId以英文逗号隔开,一次最多传200个|
| actionIdList | String | 否 | 无 | | actionIdList | String | 否 | 无 |
##### 响应体说明 ##### 响应体说明
* content-type:`application/json;charset=utf-8` * content-type:`application/json;charset=utf-8`
...@@ -1042,7 +1042,7 @@ await uniPush.getReport(OBJECT) ...@@ -1042,7 +1042,7 @@ await uniPush.getReport(OBJECT)
* 返回参数`data`说明 * 返回参数`data`说明
| 名称 | 类型 | 描述 | | 名称 | 类型 | 描述 |
| ------ | ---- | -------- | | ------ | ---- | -------- |
|$taskid|Object|key: 任务编号,value: 统计数据| |$taskid|Object|key: 任务编号,value: 统计数据|
|total|Object|总的统计数据| |total|Object|总的统计数据|
...@@ -1060,7 +1060,7 @@ await uniPush.getReport(OBJECT) ...@@ -1060,7 +1060,7 @@ await uniPush.getReport(OBJECT)
根据任务组名查询推送结果,返回结果包括消息可下发数、下发数,接收数、展示数、点击数。 根据任务组名查询推送结果,返回结果包括消息可下发数、下发数,接收数、展示数、点击数。
>此接口调用,仅可以查询toList或toApp的推送结果数据;不能查询toSingle的推送结果数据。 >此接口调用,仅可以查询toList或toApp的推送结果数据;不能查询toSingle的推送结果数据。
##### 接口形式 ##### 接口形式
```js ```js
await uniPush.getReportByGroupName(group_name) await uniPush.getReportByGroupName(group_name)
``` ```
##### 入参说明 ##### 入参说明
...@@ -1121,7 +1121,7 @@ await uniPush.getReportByGroupName(group_name) ...@@ -1121,7 +1121,7 @@ await uniPush.getReportByGroupName(group_name)
获取推送实时结果,可查询消息下发数,接收数、展示数、点击数和消息折损详情等结果。支持单个taskId查询和多个taskId查询。 获取推送实时结果,可查询消息下发数,接收数、展示数、点击数和消息折损详情等结果。支持单个taskId查询和多个taskId查询。
>注意:该接口需要开通权限,如需开通,请联系对应的商务同学开通 >注意:该接口需要开通权限,如需开通,请联系对应的商务同学开通
##### 接口形式 ##### 接口形式
```js ```js
await uniPush.getReportDetailByTaskid(taskid) await uniPush.getReportDetailByTaskid(taskid)
``` ```
##### 入参说明 ##### 入参说明
...@@ -1193,7 +1193,7 @@ await uniPush.getReportDetailByTaskid(taskid) ...@@ -1193,7 +1193,7 @@ await uniPush.getReportDetailByTaskid(taskid)
* 返回参数`data`说明 * 返回参数`data`说明
| 名称 | 类型 | 描述 | | 名称 | 类型 | 描述 |
| ------ | ---- | -------- | | ------ | ---- | -------- |
|$taskid|Object|key: 任务编号,value: 统计数据| |$taskid|Object|key: 任务编号,value: 统计数据|
|total|Object|总的统计数据| |total|Object|总的统计数据|
...@@ -1214,7 +1214,7 @@ await uniPush.getReportDetailByTaskid(taskid) ...@@ -1214,7 +1214,7 @@ await uniPush.getReportDetailByTaskid(taskid)
**折损详情分类如下,`2-14`是折损大类说明,大类说明下面的`7001-8999`是细分的折损原因,total代表各细分原因总和** **折损详情分类如下,`2-14`是折损大类说明,大类说明下面的`7001-8999`是细分的折损原因,total代表各细分原因总和**
| 名称 | 描述 | | 名称 | 描述 |
| ------ | -------- | | ------ | -------- |
|2|参数无效| |2|参数无效|
|3|app鉴权信息错误| |3|app鉴权信息错误|
...@@ -1247,7 +1247,7 @@ await uniPush.getReportDetailByTaskid(taskid) ...@@ -1247,7 +1247,7 @@ await uniPush.getReportDetailByTaskid(taskid)
#### 获取单日推送数据 #### 获取单日推送数据
调用此接口可以获取某个应用单日的推送数据(推送数据包括:下发数,接收数、展示数、点击数)(目前只支持查询非当天的数据) 调用此接口可以获取某个应用单日的推送数据(推送数据包括:下发数,接收数、展示数、点击数)(目前只支持查询非当天的数据)
##### 接口形式 ##### 接口形式
```js ```js
await uniPush.getReportByDate(date) await uniPush.getReportByDate(date)
``` ```
##### 入参说明 ##### 入参说明
...@@ -1310,7 +1310,7 @@ await uniPush.getReportByDate(date) ...@@ -1310,7 +1310,7 @@ await uniPush.getReportByDate(date)
2.vv返回的是请求量push_num,总限额total_num返回的总的到达量,所以会有请求量push_num超过总限额total_num的情况 2.vv返回的是请求量push_num,总限额total_num返回的总的到达量,所以会有请求量push_num超过总限额total_num的情况
3.该接口做了频控限制,请不要频繁调用 3.该接口做了频控限制,请不要频繁调用
##### 接口形式 ##### 接口形式
```js ```js
await uniPush.getTodayReport() await uniPush.getTodayReport()
``` ```
##### 入参说明 ##### 入参说明
...@@ -1385,27 +1385,27 @@ await uniPush.getTodayReport() ...@@ -1385,27 +1385,27 @@ await uniPush.getTodayReport()
| 名称 | 类型 |描述 | | 名称 | 类型 |描述 |
| ------------ | -------------------|-------| | ------------ | -------------------|-------|
|**gt** | Object | 个推通道 | |**gt** | Object | 个推通道 |
|gt/app |Object | 个推群推接口推送限制| |gt/app |Object | 个推群推接口推送限制|
|gt/list |Object | 个推创建消息接口限制 | |gt/list |Object | 个推创建消息接口限制 |
|gt/app\_with\_tag | Object |个推 根据条件筛选设备推送接口推送限制 | |gt/app\_with\_tag | Object |个推 根据条件筛选设备推送接口推送限制 |
|**xm** |Object | xm通道 | |**xm** |Object | xm通道 |
|xm/general |Object | xm通道 普通消息限制,channel是普通级别消息时推送量限制 | |xm/general |Object | xm通道 普通消息限制,channel是普通级别消息时推送量限制 |
|**op** |Object | op通道 | |**op** |Object | op通道 |
|op/general |Object | op通道 公信消息限制,不带channel或公信channel时推送量限制 | |op/general |Object | op通道 公信消息限制,不带channel或公信channel时推送量限制 |
|**vv** |Object | vv通道 | |**vv** |Object | vv通道 |
|vv/special |Object | vv通道系统类消息限制,即classification=1时推送量限制 | |vv/special |Object | vv通道系统类消息限制,即classification=1时推送量限制 |
|vv/general |Object | vv通道运营类消息限制,即classification=0时推送量限制 | |vv/general |Object | vv通道运营类消息限制,即classification=0时推送量限制 |
|vv/grouppush |Object | vv群推消息体配置量 | |vv/grouppush |Object | vv群推消息体配置量 |
| total_num | long | 单日可推送总量 | | total_num | long | 单日可推送总量 |
| remain_num | long| 单日可推送剩余量 | | remain_num | long| 单日可推送剩余量 |
| push_num | long| 单日可推送请求量,**仅vv返回该字段** | | push_num | long| 单日可推送请求量,**仅vv返回该字段** |
| limit |boolean| 是否被限量,当日可推送总量使用完时,该字段更新true| | limit |boolean| 是否被限量,当日可推送总量使用完时,该字段更新true|
#### 获取单日设备数据接口 #### 获取单日设备数据接口
调用此接口可以获取某个应用单日的设备数据(设备数据包括:新增设备数,累计注册设备总数,在线峰值,日联网设备数)(目前只支持查询非当天的数据) 调用此接口可以获取某个应用单日的设备数据(设备数据包括:新增设备数,累计注册设备总数,在线峰值,日联网设备数)(目前只支持查询非当天的数据)
##### 接口形式 ##### 接口形式
```js ```js
await uniPush.getClientReportByDate(date) await uniPush.getClientReportByDate(date)
``` ```
##### 入参说明 ##### 入参说明
......
...@@ -63,7 +63,7 @@ const uniIdCo = uniCloud.importObject('uni-id-co') ...@@ -63,7 +63,7 @@ const uniIdCo = uniCloud.importObject('uni-id-co')
|字段|说明| |字段|说明|
|--|--| |--|--|
|clientInfo|客户端信息; [uni.getSystemInfo](/api/system/info.md#getsysteminfo)返回的字段| |clientInfo|客户端信息; [uni.getSystemInfo](https://uniapp.dcloud.net.cn/api/system/info.md#getsysteminfo)返回的字段|
|uniIdToken|用户Token; 用户登录后必填| |uniIdToken|用户Token; 用户登录后必填|
|params|API接口参数字段| |params|API接口参数字段|
...@@ -71,9 +71,9 @@ const uniIdCo = uniCloud.importObject('uni-id-co') ...@@ -71,9 +71,9 @@ const uniIdCo = uniCloud.importObject('uni-id-co')
| 字段 | 说明 | | 字段 | 说明 |
|-------------|------------------------------------------------------------------| |-------------|------------------------------------------------------------------|
| uniPlatform | 应用运行平台,与条件编译平台相同。[详见](/api/system/info.md#uniplatform) | | uniPlatform | 应用运行平台,与条件编译平台相同。[详见](https://uniapp.dcloud.net.cn/api/system/info.md#uniplatform) |
| appId | manifest 中应用appid,即DCloud appid。如没有请手动指定一个,需确保唯一性。 | | appId | manifest 中应用appid,即DCloud appid。如没有请手动指定一个,需确保唯一性。 |
| deviceId | 设备 id;通过[uni.getSystemInfo](/api/system/info.md#getsysteminfo)获取 | | deviceId | 设备 id;通过[uni.getSystemInfo](https://uniapp.dcloud.net.cn/api/system/info.md#getsysteminfo)获取 |
假设已在uniCloud 控制台已设置URL化域名PATH,以PATH为`/http/uni-id-co`为例,演示登录示例: 假设已在uniCloud 控制台已设置URL化域名PATH,以PATH为`/http/uni-id-co`为例,演示登录示例:
...@@ -1963,10 +1963,10 @@ uni-id-pages已全面支持:app、小程序、web(uni-id-pages 版本号1.0. ...@@ -1963,10 +1963,10 @@ uni-id-pages已全面支持:app、小程序、web(uni-id-pages 版本号1.0.
#### 回调域名的配置@redirect_uri #### 回调域名的配置@redirect_uri
- 手机微信扫码登录 - 手机微信扫码登录
微信开放平台 -> 管理中心 -> 网站应用 -> 选择对应的应用名称,点击查看 -> 开发信息,点击修改 -> 填写授权回调域 微信开放平台 -> 管理中心 -> 网站应用 -> 选择对应的应用名称,点击查看 -> 开发信息,点击修改 -> 填写授权回调域
- 基于微信公众号auth登录 - 基于微信公众号auth登录
登录微信公众号 -> 设置与开发 -> 公众号设置 -> 设置网页授权域名 登录微信公众号 -> 设置与开发 -> 公众号设置 -> 设置网页授权域名
#### 本地调试 #### 本地调试
...@@ -1979,8 +1979,8 @@ uni-id-pages已全面支持:app、小程序、web(uni-id-pages 版本号1.0. ...@@ -1979,8 +1979,8 @@ uni-id-pages已全面支持:app、小程序、web(uni-id-pages 版本号1.0.
> 如果没有启动80端口而是81等,说明你的端口被占用了。你有两个办法1.关闭可疑程序,或直接重启电脑 2.命令行关闭占用的端口[详情查看](https://www.baidu.com/s?&wd=%E5%91%BD%E4%BB%A4%E8%A1%8C%20%E8%A7%A3%E5%86%B3%E7%AB%AF%E5%8F%A3%E8%A2%AB%E5%8D%A0%E7%94%A8) > 如果没有启动80端口而是81等,说明你的端口被占用了。你有两个办法1.关闭可疑程序,或直接重启电脑 2.命令行关闭占用的端口[详情查看](https://www.baidu.com/s?&wd=%E5%91%BD%E4%BB%A4%E8%A1%8C%20%E8%A7%A3%E5%86%B3%E7%AB%AF%E5%8F%A3%E8%A2%AB%E5%8D%A0%E7%94%A8)
2. 实现访问域名直接指向你的本地web Server 2. 实现访问域名直接指向你的本地web Server
可以通过内网穿透实现,但比较麻烦且可能会影响线上用户。这里推荐直接修改hosts,hosts是一个没有扩展名的系统文件,其基本作用就是将一些常用的网址域名与其对应的 IP 地址建立一个关联“ 数据库 ”。当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从hosts文件中寻找对应的 IP 地址,一旦找到,系统就会立即打开对应网页,如果没有找到,系统才会将网址提交 DNS 域名解析服务器进行 IP 地址的解析。 可以通过内网穿透实现,但比较麻烦且可能会影响线上用户。这里推荐直接修改hosts,hosts是一个没有扩展名的系统文件,其基本作用就是将一些常用的网址域名与其对应的 IP 地址建立一个关联“ 数据库 ”。当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从hosts文件中寻找对应的 IP 地址,一旦找到,系统就会立即打开对应网页,如果没有找到,系统才会将网址提交 DNS 域名解析服务器进行 IP 地址的解析。
host文件路径: Windows系统一般为:`C:\Windows\System32\drivers\etc`。mac系统:`/etc/` host文件路径: Windows系统一般为:`C:\Windows\System32\drivers\etc`。mac系统:`/etc/`
用HBuilderX打开hosts文件,在末尾添加一行 `127.0.0.1 你的域名`保存即可。 用HBuilderX打开hosts文件,在末尾添加一行 `127.0.0.1 你的域名`保存即可。
此时访问域名,如果就能看到和你的项目运行到浏览器一样的效果,说明已经成功了。 此时访问域名,如果就能看到和你的项目运行到浏览器一样的效果,说明已经成功了。
...@@ -2055,7 +2055,7 @@ exports.main = async (event, context) => { ...@@ -2055,7 +2055,7 @@ exports.main = async (event, context) => {
## URL化请求鉴权签名@http-reqeust-auth ## URL化请求鉴权签名@http-reqeust-auth
> `uni-id-co@1.1.10`及以上版本支持使用`uni-cloud-s2s`进行请求签名验证,`uni-cloud-s2s`使用方式[详见](../uni-cloud-s2s.md) > `uni-id-co@1.1.10`及以上版本支持使用`uni-cloud-s2s`进行请求签名验证,`uni-cloud-s2s`使用方式[详见](../uni-cloud-s2s.md)
> >
> `uni-id-co`请求鉴权签名与`uni-cloud-s2s`不能同时存在,如果存在`uni-cloud-s2s`,则会优先使用`uni-cloud-s2s`进行请求签名验证 > `uni-id-co`请求鉴权签名与`uni-cloud-s2s`不能同时存在,如果存在`uni-cloud-s2s`,则会优先使用`uni-cloud-s2s`进行请求签名验证
uni-id-co 在URL化请求时,会对以下 API 进行调用鉴权验证, uni-id-co 在URL化请求时,会对以下 API 进行调用鉴权验证,
...@@ -2162,7 +2162,7 @@ class Sign { ...@@ -2162,7 +2162,7 @@ class Sign {
return strtoupper($signature); return strtoupper($signature);
} }
private function getParamsString ($params) { private function getParamsString ($params) {
ksort($params); ksort($params);
...@@ -2174,7 +2174,7 @@ class Sign { ...@@ -2174,7 +2174,7 @@ class Sign {
array_push($paramsStr, $key . '=' . $value); array_push($paramsStr, $key . '=' . $value);
} }
return join('&', $paramsStr); return join('&', $paramsStr);
} }
} }
...@@ -2212,19 +2212,19 @@ class Sign: ...@@ -2212,19 +2212,19 @@ class Sign:
def get_signature (self, params, nonce, timestamp): def get_signature (self, params, nonce, timestamp):
params_str = self.get_params_string(params) params_str = self.get_params_string(params)
signature = hmac.new(bytes("%s%s" % (self.requestAuthSecret, nonce), 'utf-8'), bytes("%s%s" % (timestamp, params_str), 'utf-8'), digestmod = hashlib.sha256).hexdigest().upper() signature = hmac.new(bytes("%s%s" % (self.requestAuthSecret, nonce), 'utf-8'), bytes("%s%s" % (timestamp, params_str), 'utf-8'), digestmod = hashlib.sha256).hexdigest().upper()
return signature return signature
def get_params_string(self, params): def get_params_string(self, params):
params_str = [] params_str = []
for k in sorted(params): for k in sorted(params):
if isinstance(params[k], (list, dict)): if isinstance(params[k], (list, dict)):
continue continue
params_str.append("%s=%s" % (k, params[k])) params_str.append("%s=%s" % (k, params[k]))
return "&".join(params_str) return "&".join(params_str)
if __name__ == "__main__": if __name__ == "__main__":
requestAuthSecret = "testSecret" requestAuthSecret = "testSecret"
nonce = "xxxxxxx" nonce = "xxxxxxx"
timestamp = int(round(time.time() * 1000)) timestamp = int(round(time.time() * 1000))
...@@ -2357,13 +2357,13 @@ public class Sign { ...@@ -2357,13 +2357,13 @@ public class Sign {
try { try {
hmacSha256 = Mac.getInstance(algorithm); hmacSha256 = Mac.getInstance(algorithm);
String key = new StringBuilder().append(requestAuthSecret).append(nonce).toString(); String key = new StringBuilder().append(requestAuthSecret).append(nonce).toString();
String message = new StringBuilder().append(Long.toString(timestamp)).append(paramsStr).toString(); String message = new StringBuilder().append(Long.toString(timestamp)).append(paramsStr).toString();
byte[] keyBytes = key.getBytes("utf-8"); byte[] keyBytes = key.getBytes("utf-8");
byte[] messageBytes = message.getBytes("utf-8"); byte[] messageBytes = message.getBytes("utf-8");
hmacSha256.init(new SecretKeySpec(keyBytes, 0, keyBytes.length, algorithm)); hmacSha256.init(new SecretKeySpec(keyBytes, 0, keyBytes.length, algorithm));
byte[] digestBytes = hmacSha256.doFinal(messageBytes); byte[] digestBytes = hmacSha256.doFinal(messageBytes);
...@@ -2388,7 +2388,7 @@ public class Sign { ...@@ -2388,7 +2388,7 @@ public class Sign {
if (i != 0) { if (i != 0) {
sb.append("&"); sb.append("&");
} }
sb.append(key).append("=").append(params.get(key)); sb.append(key).append("=").append(params.get(key));
} }
......
...@@ -103,8 +103,8 @@ uni-app框架内置了uni-id的token管理。 ...@@ -103,8 +103,8 @@ uni-app框架内置了uni-id的token管理。
uni-app与uniCloud搭配且使用uni-id,登录后自动下发token、网络传输层自动传输token(uni-app 2.7.13+版本)、token临近过期会自动续期(uni-app 3.4.13 +版本),也就是说开发者无需自己管理token了。 uni-app与uniCloud搭配且使用uni-id,登录后自动下发token、网络传输层自动传输token(uni-app 2.7.13+版本)、token临近过期会自动续期(uni-app 3.4.13 +版本),也就是说开发者无需自己管理token了。
uni-app客户端还有一批uni-id相关的内置API: uni-app客户端还有一批uni-id相关的内置API:
- uniIDHasRole:判断当前用户是否拥有某角色。[详情](/api/global.md#uniidhasrole) - uniIDHasRole:判断当前用户是否拥有某角色。[详情](https://uniapp.dcloud.net.cn/api/global.md#uniidhasrole)
- uniIDHasPermission:判断当前用户是否拥有某权限。[详情](/api/global.md#uniidhaspermission) - uniIDHasPermission:判断当前用户是否拥有某权限。[详情](https://uniapp.dcloud.net.cn/api/global.md#uniidhaspermission)
- uniCloud.getCurrentUserInfo():客户端获取当前用户信息。[详情](../client-sdk.md#client-getcurrentuserinfo) - uniCloud.getCurrentUserInfo():客户端获取当前用户信息。[详情](../client-sdk.md#client-getcurrentuserinfo)
5. 云端一体页面模板 [uni-id-pages](redirect.md)(含uni-id-co) 5. 云端一体页面模板 [uni-id-pages](redirect.md)(含uni-id-co)
...@@ -382,7 +382,7 @@ uni-id云端会在login方法成功后自动返回token,uni-app前端框架会 ...@@ -382,7 +382,7 @@ uni-id云端会在login方法成功后自动返回token,uni-app前端框架会
为什么需要角色权限管理? 为什么需要角色权限管理?
- 企业管理系统,比如[uni-admin](../admin.md),除了超级管理员,不同账号通常需根据职位、责任设定不同的系统权限。比如部门管理员、Hr。 - 企业管理系统,比如[uni-admin](../admin.md),除了超级管理员,不同账号通常需根据职位、责任设定不同的系统权限。比如部门管理员、Hr。
- [clientDB](../clientdb.md)允许前端直接操作数据库,但部分字段应该是系统计算或管理员设置的,比如文章的阅读数、收藏数及是否加精置顶,这些字段不允许普通用户在前端通过clientDB直接修改,此时也需要通过权限控制来保证系统的安全稳定。 - [clientDB](../clientdb.md)允许前端直接操作数据库,但部分字段应该是系统计算或管理员设置的,比如文章的阅读数、收藏数及是否加精置顶,这些字段不允许普通用户在前端通过clientDB直接修改,此时也需要通过权限控制来保证系统的安全稳定。
`uni-id`基于经典的RBAC模型实现了角色权限系统。 `uni-id`基于经典的RBAC模型实现了角色权限系统。
...@@ -419,7 +419,7 @@ RBAC:Role-Based Access Control,基于角色的访问控制。 ...@@ -419,7 +419,7 @@ RBAC:Role-Based Access Control,基于角色的访问控制。
"NOTICE_ADMIN" "NOTICE_ADMIN"
], ],
"created_date":1602495783272 "created_date":1602495783272
} }
} }
``` ```
...@@ -467,7 +467,7 @@ RBAC:Role-Based Access Control,基于角色的访问控制。 ...@@ -467,7 +467,7 @@ RBAC:Role-Based Access Control,基于角色的访问控制。
"NOTICE_DEL" "NOTICE_DEL"
], ],
"created_date":1602495784372 "created_date":1602495784372
} }
} }
``` ```
...@@ -478,7 +478,7 @@ RBAC:Role-Based Access Control,基于角色的访问控制。 ...@@ -478,7 +478,7 @@ RBAC:Role-Based Access Control,基于角色的访问控制。
{ {
"permission": { "permission": {
"update":"doc._id == auth.uid || 'USER_ADMIN' in auth.role" //用户自己或人事管理员可执行用户表的.update操作 "update":"doc._id == auth.uid || 'USER_ADMIN' in auth.role" //用户自己或人事管理员可执行用户表的.update操作
} }
} }
``` ```
...@@ -515,7 +515,7 @@ RBAC:Role-Based Access Control,基于角色的访问控制。 ...@@ -515,7 +515,7 @@ RBAC:Role-Based Access Control,基于角色的访问控制。
"permission_id":"USER_DEL", "permission_id":"USER_DEL",
"permission_name":"删除用户", "permission_name":"删除用户",
"created_date":1602495784372 "created_date":1602495784372
} }
} }
``` ```
...@@ -684,7 +684,7 @@ function hasPermission(token, permission) { ...@@ -684,7 +684,7 @@ function hasPermission(token, permission) {
### 验证码表 ### 验证码表
表名:`opendb-verify-codes` 表名:`opendb-verify-codes`
该表的前缀不是uni-id,意味着该表的设计用途是通用的,不管是uni-id的手机号验证码,或者支付等关键业务需要验证码,都使用此表。 该表的前缀不是uni-id,意味着该表的设计用途是通用的,不管是uni-id的手机号验证码,或者支付等关键业务需要验证码,都使用此表。
...@@ -802,7 +802,7 @@ function hasPermission(token, permission) { ...@@ -802,7 +802,7 @@ function hasPermission(token, permission) {
## uniIdRouter自动路由@uni-id-router ## uniIdRouter自动路由@uni-id-router
**支持的HBuilderX版本** **支持的HBuilderX版本**
|uni-app|uni-app x| |uni-app|uni-app x|
|:- |:- | |:- |:- |
| 3.5.0+|3.99+ | | 3.5.0+|3.99+ |
...@@ -1167,14 +1167,14 @@ uni-id-common支持在token内缓存用户的角色权限。但是某些情况 ...@@ -1167,14 +1167,14 @@ uni-id-common支持在token内缓存用户的角色权限。但是某些情况
`uni-config-center`模块内的uni-id插件内创建`custom-token.js`内容如下: `uni-config-center`模块内的uni-id插件内创建`custom-token.js`内容如下:
```js ```js
module.exports = async (tokenObj) => { module.exports = async (tokenObj) => {
// tokenObj为原始token信息结构如下 // tokenObj为原始token信息结构如下
// { // {
// uid: 'abc', // 用户id // uid: 'abc', // 用户id
// role: [], // 用户角色列表 // role: [], // 用户角色列表
// permission: [] // 用户权限列表,admin角色的用户权限列表为空数组 // permission: [] // 用户权限列表,admin角色的用户权限列表为空数组
// } // }
tokenObj.customField = 'hello custom token' // 自定义token字段 tokenObj.customField = 'hello custom token' // 自定义token字段
return tokenObj // 注意务必返回修改后的token对象 return tokenObj // 注意务必返回修改后的token对象
} }
...@@ -1271,7 +1271,7 @@ const openid = wxOpenid[wxPlatform + '_' + appId] || wxOpenid[wxPlatform] ...@@ -1271,7 +1271,7 @@ const openid = wxOpenid[wxPlatform + '_' + appId] || wxOpenid[wxPlatform]
> 新增于 uni-id-pages 1.0.8 > 新增于 uni-id-pages 1.0.8
uni-id-co是一个完整的云对象,里面注册登录等流程都已完全实现,开发者不方便进行修改。例如要实现注册时为某端用户统一添加一个角色的功能,只能去修改uni-id-co的代码。因此uni-id-co提供了通过钩子干涉内置逻辑的功能 uni-id-co是一个完整的云对象,里面注册登录等流程都已完全实现,开发者不方便进行修改。例如要实现注册时为某端用户统一添加一个角色的功能,只能去修改uni-id-co的代码。因此uni-id-co提供了通过钩子干涉内置逻辑的功能
uni-id钩子函数需要在uni-config-center内配置。在`uni-config-center/uni-id`下创建hooks目录并在其内创建`index.js`内容如下 uni-id钩子函数需要在uni-config-center内配置。在`uni-config-center/uni-id`下创建hooks目录并在其内创建`index.js`内容如下
```js ```js
...@@ -1490,9 +1490,9 @@ module.exports = { ...@@ -1490,9 +1490,9 @@ module.exports = {
#### 2. 导出用户数据 #### 2. 导出用户数据
> 导出文件大小最大不超过 50MB,超过 50MB 请导出多个json文件 > 导出文件大小最大不超过 50MB,超过 50MB 请导出多个json文件
> >
> 如果存在表A关联表B的字段的场景需要保证关联字段在A、B内是一致的(特别需要注意的是各种与_id关联的字段) > 如果存在表A关联表B的字段的场景需要保证关联字段在A、B内是一致的(特别需要注意的是各种与_id关联的字段)
> >
> [参考从文件中导入数据](https://uniapp.dcloud.net.cn/uniCloud/hellodb.html#import) > [参考从文件中导入数据](https://uniapp.dcloud.net.cn/uniCloud/hellodb.html#import)
请将用户数据导出为json格式文件,注意json文件不是标准的json文件,请按照以下格式每行是一个json格式的用户记录导出: 请将用户数据导出为json格式文件,注意json文件不是标准的json文件,请按照以下格式每行是一个json格式的用户记录导出:
...@@ -1502,7 +1502,7 @@ module.exports = { ...@@ -1502,7 +1502,7 @@ module.exports = {
``` ```
#### 3. 处理用户数据 #### 3. 处理用户数据
> 在 uni-id 中 userId 是系统自动创建的 _id,如果想保留之前用户的userId,可以将用户的 userId 映射为 _id,如果不保留 userId 建议删除 userId 字段,在数据导入中会创建 _id。 > 在 uni-id 中 userId 是系统自动创建的 _id,如果想保留之前用户的userId,可以将用户的 userId 映射为 _id,如果不保留 userId 建议删除 userId 字段,在数据导入中会创建 _id。
> >
> 注意`password_secret_version`字段,字段值需要修改为自定义密码类型的 `version` > 注意`password_secret_version`字段,字段值需要修改为自定义密码类型的 `version`
导入到 uni-id 之前,需要处理用户数据与 uni-id 字段的映射关系,见下方 uni-id 字段及说明: 导入到 uni-id 之前,需要处理用户数据与 uni-id 字段的映射关系,见下方 uni-id 字段及说明:
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
unicloud的MongoDB数据库,对地理位置查询,提供了比传统数据库更方便的GEO查询方案,比如可以直接查询附近的POI信息。(Point of Interest,地图上的兴趣点) unicloud的MongoDB数据库,对地理位置查询,提供了比传统数据库更方便的GEO查询方案,比如可以直接查询附近的POI信息。(Point of Interest,地图上的兴趣点)
DCloud之前已推出各种云端一体组件,基于[datacom规范](/component/datacom.md),组件在客户端可以直接连数据库。 DCloud之前已推出各种云端一体组件,基于[datacom规范](https://uniapp.dcloud.net.cn/component/datacom.html),组件在客户端可以直接连数据库。
现在进一步封装了地图的datacom组件,将前端地图组件和云端数据库连起来,只需写一个`<unicloud-map>`组件,就可以直接从数据库里拉出附近的POI信息,并显示在地图上。 现在进一步封装了地图的datacom组件,将前端地图组件和云端数据库连起来,只需写一个`<unicloud-map>`组件,就可以直接从数据库里拉出附近的POI信息,并显示在地图上。
...@@ -37,7 +37,7 @@ unicloud-map云端一体组件,主要用于显示数据库里的自定义POI ...@@ -37,7 +37,7 @@ unicloud-map云端一体组件,主要用于显示数据库里的自定义POI
```vue ```vue
<template> <template>
<view> <view>
<unicloud-map <unicloud-map
ref="map" ref="map"
:where="where" :where="where"
...@@ -48,7 +48,7 @@ unicloud-map云端一体组件,主要用于显示数据库里的自定义POI ...@@ -48,7 +48,7 @@ unicloud-map云端一体组件,主要用于显示数据库里的自定义POI
:default-icon="defaultIcon" :default-icon="defaultIcon"
:custom-icons="customIcons" :custom-icons="customIcons"
></unicloud-map> ></unicloud-map>
</view> </view>
</template> </template>
...@@ -58,7 +58,7 @@ export default { ...@@ -58,7 +58,7 @@ export default {
return { return {
// 查询条件 // 查询条件
where:{ where:{
}, },
// 你的经纬度,可通过uni.getLocation获取,注意type需传gcj02,同时在电脑端运行时获取到的经纬度是不准的 // 你的经纬度,可通过uni.getLocation获取,注意type需传gcj02,同时在电脑端运行时获取到的经纬度是不准的
latitude: 39.908823, latitude: 39.908823,
...@@ -90,21 +90,21 @@ export default { ...@@ -90,21 +90,21 @@ export default {
```vue ```vue
<template> <template>
<view class="page"> <view class="page">
<unicloud-map <unicloud-map
ref="map" ref="map"
:debug="false" :debug="false"
loadtime="auto" loadtime="auto"
collection="opendb-poi" collection="opendb-poi"
:where="where" :where="where"
:width="750" :width="750"
:height="heightCom" :height="heightCom"
:latitude="latitude" :latitude="latitude"
:longitude="longitude" :longitude="longitude"
:scale="13" :scale="13"
:poi-maximum="100" :poi-maximum="100"
:default-icon="defaultIcon" :default-icon="defaultIcon"
:custom-icons="customIcons" :custom-icons="customIcons"
:enable-scroll="true" :enable-scroll="true"
:enable-zoom="true" :enable-zoom="true"
:show-compass="true" :show-compass="true"
...@@ -119,7 +119,7 @@ export default { ...@@ -119,7 +119,7 @@ export default {
<button @click="show2" size="mini" class="btn">只显示总部</button> <button @click="show2" size="mini" class="btn">只显示总部</button>
<button @click="show3" size="mini" class="btn">显示总部+门店</button> <button @click="show3" size="mini" class="btn">显示总部+门店</button>
</view> </view>
</view> </view>
</template> </template>
...@@ -261,41 +261,41 @@ export default { ...@@ -261,41 +261,41 @@ export default {
<template> <template>
<view class="page"> <view class="page">
<unicloud-map <unicloud-map
ref="map" ref="map"
:debug="false" :debug="false"
loadtime="auto" loadtime="auto"
collection="opendb-poi" collection="opendb-poi"
:where="where" :where="where"
:width="750" :width="750"
:height="heightCom" :height="heightCom"
:latitude="latitude" :latitude="latitude"
:longitude="longitude" :longitude="longitude"
:scale="13" :scale="13"
:poi-maximum="100" :poi-maximum="100"
:default-icon="defaultIcon" :default-icon="defaultIcon"
:custom-icons="customIcons" :custom-icons="customIcons"
:enable-scroll="true" :enable-scroll="true"
:enable-zoom="true" :enable-zoom="true"
:show-compass="true" :show-compass="true"
:show-location="true" :show-location="true"
></unicloud-map> ></unicloud-map>
<view class="btn-box first"> <view class="btn-box first">
<button @click="initData" size="mini" class="btn">初始化配送点</button> <button @click="initData" size="mini" class="btn">初始化配送点</button>
<button @click="virtuallyTest" size="mini" class="btn">模拟配送(上报位置)</button> <button @click="virtuallyTest" size="mini" class="btn">模拟配送(上报位置)</button>
</view> </view>
<view class="btn-box"> <view class="btn-box">
<button @click="start" size="mini" class="btn" v-if="!isStart">开启监听</button> <button @click="start" size="mini" class="btn" v-if="!isStart">开启监听</button>
<button @click="stop" size="mini" class="btn" v-else>暂停监听</button> <button @click="stop" size="mini" class="btn" v-else>暂停监听</button>
</view> </view>
</view> </view>
</template> </template>
<script> <script>
var timer; var timer;
const uniMapCo = uniCloud.importObject('uni-map-co', { const uniMapCo = uniCloud.importObject('uni-map-co', {
customUI: true customUI: true
}); });
...@@ -323,7 +323,7 @@ export default { ...@@ -323,7 +323,7 @@ export default {
} }
}, },
onLoad() { onLoad() {
}, },
onUnload() { onUnload() {
this.stop(); this.stop();
...@@ -362,7 +362,7 @@ export default { ...@@ -362,7 +362,7 @@ export default {
await this.$refs.map.refresh({ await this.$refs.map.refresh({
needIncludePoints: true needIncludePoints: true
}); });
let res = await uniMapCo.getPolyline(); let res = await uniMapCo.getPolyline();
if (res.end) { if (res.end) {
await this.$refs.map.refresh({ await this.$refs.map.refresh({
...@@ -516,10 +516,10 @@ export default { ...@@ -516,10 +516,10 @@ export default {
使用这些方法前,需要在组件先声明 `ref="map"` 使用这些方法前,需要在组件先声明 `ref="map"`
```vue ```vue
<unicloud-map <unicloud-map
ref="map" ref="map"
...其他属性 ...其他属性
</unicloud-map> </unicloud-map>
``` ```
**refresh** **refresh**
...@@ -555,7 +555,7 @@ this.$refs.map.setMarkers(markers); ...@@ -555,7 +555,7 @@ this.$refs.map.setMarkers(markers);
**getPolyline** **getPolyline**
获取组件内的polyline 获取组件内的polyline
示例 示例
...@@ -576,7 +576,7 @@ this.$refs.map.setPolyline(polyline); ...@@ -576,7 +576,7 @@ this.$refs.map.setPolyline(polyline);
**getCircles** **getCircles**
获取组件内的circles 获取组件内的circles
示例 示例
...@@ -624,6 +624,6 @@ unicloud-map需要创建以下表后才能正常运行,可以右键插件datab ...@@ -624,6 +624,6 @@ unicloud-map需要创建以下表后才能正常运行,可以右键插件datab
- 地图POI表 [opendb-poi](https://gitee.com/dcloud/opendb/blob/master/collection/opendb-poi/collection.json) - 地图POI表 [opendb-poi](https://gitee.com/dcloud/opendb/blob/master/collection/opendb-poi/collection.json)
### 三方定位和地图服务收费说明@fee ### 三方定位和地图服务收费说明@fee
unicloud-map是免费的,但高德、腾讯、百度等地图的使用需向地图厂商采购商业授权。DCloud与地图厂商达成合作,可更优惠的给开发者提供地图服务。[详见](https://uniapp.dcloud.net.cn/component/map.html#%E4%B8%89%E6%96%B9%E5%AE%9A%E4%BD%8D%E5%92%8C%E5%9C%B0%E5%9B%BE%E6%9C%8D%E5%8A%A1%E6%94%B6%E8%B4%B9%E8%AF%B4%E6%98%8E) unicloud-map是免费的,但高德、腾讯、百度等地图的使用需向地图厂商采购商业授权。DCloud与地图厂商达成合作,可更优惠的给开发者提供地图服务。[详见](https://uniapp.dcloud.net.cn/component/map.html#%E4%B8%89%E6%96%B9%E5%AE%9A%E4%BD%8D%E5%92%8C%E5%9C%B0%E5%9B%BE%E6%9C%8D%E5%8A%A1%E6%94%B6%E8%B4%B9%E8%AF%B4%E6%98%8E)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册