提交 b4f76f5b 编写于 作者: 雪洛's avatar 雪洛

docs: add uniCloud

上级 9be309e6
* [介绍](README.md)
* [框架](collocation/pages.md)
* [组件](component/README.md)
* [API](api/README.md)
* [API](api/README.md)
* [uniCloud](uniCloud/README.md)
* [其它规范](javascript:;)
- [App扩展规范HTML5 Plus](http://www.html5plus.org/doc/h5p.html)
- [微信小程序](https://developers.weixin.qq.com/miniprogram/dev/framework/)
......
#### 介绍
uniCloud是提供包括云函数、数据存储、文件存储等一整套后端服务,目前服务供应商为腾讯和阿里。开发者可以使用云开发来直接开发网站应用,在开发过程中即便需要后台服务也无需搭建服务器,可以直接使用云开发提供的云端能力。使用云开发后,后端和运维概念将被弱化,开发者无需再担心具体的后台资源及运维,只需使用平台提供的 API 进行核心业务开发,即可实现产品快速上线和迭代。
云开发提供了完整的后台基础能力帮助开发者进行网站应用的开发,主要包括:
- 云函数:在云端运行的代码,开发者只需编写自身业务逻辑代码。
- 数据库:一个既可在网站应用前端操作,也能在云函数中读写的 JSON 数据库。
- 存储:在应用前端直接上传或下载云端文件,并可在云开发控制台进行可视化管理。
* [什么是uniCloud](uniCloud/README.md)
* [快速上手](uniCloud/quickstart.md)
* 服务端sdk
* [身份认证](uniCloud/cf-authentication.md)
* [云函数](uniCloud/cf-functions.md)
* [数据库](uniCloud/cf-database.md)
* [云存储](uniCloud/cf-storage.md)
* 客户端sdk
* [初始化](uniCloud/init.md)
* [云函数](uniCloud/functions.md)
* [云存储](uniCloud/storage.md)
* [登录授权](uniCloud/authentication.md)
* 权限管理
* [腾讯云](uniCloud/policy-tcb.md)
* [阿里云](uniCloud/policy-ali.md)
<li></li>
<div class="contact-box">
<a href="//ask.dcloud.net.cn/explore/" target="_blank" class="contact-item">
<img src="//img-cdn-qiniu.dcloud.net.cn/uniapp/doc/d@2x.png" width="20" height="20"/>
<div class="contact-smg">
<div>论坛</div>
</div>
</a>
<a href="https://tongji.dcloud.net.cn/" target="_blank" class="contact-item">
<img src="//img-cdn-qiniu.dcloud.net.cn/uniapp/doc/uni-tongji-icon.png" width="20" height="20"/>
<div class="contact-smg">
<div>uni统计</div>
</div>
</a>
<div class="contact-item">
<img src="//img-cdn-qiniu.dcloud.net.cn/uniapp/doc/git-1.png" width="20" height="20"/>
<div class="contact-smg">
<div>
代码仓库:<a href="https://gitee.com/dcloud/uni-app" target="_blank">码云</a><a href="http://github.com/dcloudio/uni-app" target="_blank">GitHub</a>
</div>
</div>
</div>
<div class="contact-item">
<img src="//img-cdn-qiniu.dcloud.net.cn/uniapp/doc/qq@2x.png" width="20" height="20"/>
<div class="contact-smg">
<div>官方QQ交流群</div>
<div>群30:371046920 &nbsp;<a target="_blank" href="//shang.qq.com/wpa/qunwpa?idkey=0edd9d985512fdded0dbd8dc9f2185c2438747e6d41ede8c6270e1a5da2ff4cd">点此加入</a></div>
<div>群35:713420817(2000人已满)</div>
<div>群34:530305531(2000人已满)</div>
<div>群33:498071674(2000人已满)</div>
<div>群32:166188631(2000人已满)</div>
<div>群31:567471669(2000人已满)</div>
<!-- <div>群30:371046920(2000人未满)</div> -->
<div>群29:202965481(1000人已满)</div>
<div>群28:166188776(2000人已满)</div>
<div>群27:811363410(2000人已满)</div>
<div>群26:147867597(2000人已满)</div>
<div>群25:165297000(2000人未满)</div>
<div>群24:672494800(2000人未满)</div>
<div>群23:599958679(2000人已满)</div>
<div>群22:687186952(1000人已满)</div>
<div>群21:717019120(2000人已满)</div>
<div>群20:165796402(2000人未满)</div>
<div>群19:165657124(1000人已满)</div>
<div>群18:698592271(1000人已满)</div>
<div>群17:951348804(1000人已满)</div>
<div>群16:719211033(2000人已满)</div>
<div>群15:516984120(2000人已满)</div>
<div>群14:465953250(2000人已满)</div>
<div>群13:699478442(2000人未满)</div>
<div>群12:884860657(2000人已满)</div>
<div>群11:296811328(1000人已满)</div>
<div>群10:959059626(2000人已满)</div>
<div>群9:775128777(2000人已满)</div>
<div>群8:695442854(2000人已满)</div>
<div>群7:942061423(2000人未满)</div>
<div>群6:697264024(2000人已满)</div>
<div>群5:731951419(1000人已满)</div>
<div>群4:942702595(1000人已满)</div>
<div>群3:773794803(1000人已满) </div>
<div>群2:901474938(1000人已满) </div>
<div>群1:531031261(1000人已满)</div>
</div>
</div>
<div class="contact-item">
<img src="//img-cdn-qiniu.dcloud.net.cn/uniapp/doc/weixin@2x.png" width="20" height="20"/>
<div class="contact-smg">
<div>关注微信公众号</div>
<img src="https://img-cdn-qiniu.dcloud.net.cn/uniapp/doc/weixin.jpg" width="90" height="90"/>
</div>
</div>
</div>
\ No newline at end of file
**本章内容仅针对腾讯云开发,阿里侧暂不支持**
## 获取登录对象
**示例代码**
```js
const uniClient = uniCloud.init({
spaceId: 'xxxx-yyy'
});
let auth = uniClient.auth()
```
## 获取登录状态
开发者可以通过 `getLoginState()` 来获取当前的登录状态,调用 `getLoginState()` 后,SDK 会识别本地是否有登录状态,如果有,则会尝试刷新登录状态,若刷新登录状态成功,则会返回新的登录状态,否则返回 `undefined`
**示例代码**
```js
const uniClient = uniCloud.init({
spaceId: 'xxxx-yyy'
});
uniClient.auth().getLoginState().then(loginState => {
if (loginState) {
// 登录态有效
} else {
// 没有登录态,或者登录态已经失效
}
})
```
## 自定义登录
`uniCloud`允许开发者使用特定的登录凭据`Ticket`对用户进行身份认证。开发者可以使用`服务端 SDK`来创建`Ticket`,并且将`token`传入到应用内,然后调用`signInWithTicket()`获得登录态。
### 获取私钥文件
登录腾讯云[云开发控制台](https://console.cloud.tencent.com/tcb),在[用户管理页面](https://console.cloud.tencent.com/tcb/user)中,点击“登录设置”,然后**生成并下载私钥**
**此处链接需替换为UniCloud链接【uniCloud替换标记】**
![云开发下载私钥](https://main.qcloudimg.com/raw/e08751567a86afceda9e3e8536d37c52.png)
**此处图片需替换为UniCloud图片【uniCloud替换标记】**
### 使用云函数创建登录凭据
获取私钥文件之后,重命名为`credentials.json`放在云函数同级目录即可
`服务端 SDK`内置了生成`Ticket`的接口,开发者需要提供一个自定义的`customUserId`作为用户的唯一身份标识。`Ticket`有效期为**5分钟**,过期则失效。
每个用户的`customUserId`不能相同,每次用户重新登录时,原有的登录态将会失效。
```js
let customUserId = '123456';
const ticket = uniCloud.auth().createTicket(customUserId, {
refresh: 10 * 60 * 1000 // 每十分钟刷新一次登录态, 默认为一小时
});
// 然后把 ticket 发送给客户端
```
<!-- ### 在开发者服务器创建登录凭据
获取私钥文件之后,在服务端 SDK 初始化时,加入私钥文件的路径:
```js
// 开发者的服务端代码
// 初始化示例
const tcb = require('tcb-admin-node');
// 1. 直接使用下载的私钥文件
tcb.init({
// ...
spaceId: 'your-space-id',
credentials: require('/path/to/your/tcb_custom_login.json')
});
// 2. 也可以直接传入私钥的内容
tcb.init({
// ...
spaceId: 'your-space-id',
credentials: {
private_key_id: 'xxxxxxxxxxxxx',
private_key: 'xxxxxxxxxxx'
}
});
``` -->
### 客户端上使用Ticket登录
创建`Ticket`之后,开发者应将`Ticket`发送至客户端,然后使用`客户端SDK`提供的 `signInWithTicket()` 登录`UniCloud`
```js
auth.signInWithTicket(ticket).then(() => {
// 登录成功
})
```
## 获取用户信息
任何方式登录成功后,可以调用 `getUserInfo` 获得用户的身份信息。
**响应参数**
|字段 |类型 |是否必备 |说明 |
|:-: |:-: |:-: |:-: |
|uid |string |是 |用户在云开发的唯一ID |
|customUserId |string |否 |用户使用自定义登录传入的用户Id |
**示例代码**
```js
const uniClient = uniCloud.init({
spaceId: 'xxxx-yyy'
});
const auth = uniClient.auth()
auth.signInWithTicket('YourTicket').then(() => {
// 获取用户信息
return auth.getUserInfo()
})
.then(userInfo => {
//...
})
```
## 匿名登录
uniCloud允许开发者使用匿名登录的方式进行静默授权,可以避免强制登录。在匿名状态下可正常的调用uniCloud的资源,开发者同时可以配合安全规则针对匿名用户制定对应的访问限制。
### 开启匿名登录授权
登录腾讯云[云开发控制台](https://console.cloud.tencent.com/tcb),在[用户管理页面](https://console.cloud.tencent.com/tcb/user)中,点击“登录设置”,然后在“匿名登录”一栏打开/关闭可用状态。
**此处链接需替换为UniCloud链接【uniCloud替换标记】**
### 客户端进行匿名登录
```js
const uniClient = uniCloud.init({
spaceId: 'xxxx-yyy'
});
const auth = uniClient.auth();
await auth.signInAnonymously().catch(err=>{
// 登录失败会抛出错误
});
// 匿名登录成功检测登录状态isAnonymous字段为true
const loginState = await auth.getLoginState();
console.log(loginState.isAnonymous) // true
```
#### 匿名用户重新登录
匿名用户如果要重新使用开发者提供的身份登录,可以调用`auth.signInWithTicket`来进行。[参考](#客户端上使用Ticket登录)
#### 匿名用户转化为自定义用户
目前UniCloud支持将匿名用户转化为自定义登录用户,此转正用户将会继承匿名用户在云端创建的资源,流程如下:
1. 首先需要按照自定义登录的流程搭建获取自定义登录凭证`ticket`的服务;
2. 客户端请求接口获取自定义登录凭证`ticket`**请注意**,此`ticket`必须未注册过uniCloud,换句话说,匿名用户只能转化为新的uniCloud用户;
3. 客户端调用`auth.linkAndRetrieveDataWithTicket`API,如下:
```js
// 调用此API之前需先请求接口获取到ticket
auth.linkAndRetrieveDataWithTicket(ticket).then(res => {
// 转正成功
}).catch(err => {
// 转正失败会抛出错误
});
```
## 登录授权相关事件及钩子函数
### Event: 'loginStateExpire'
当登录态失效时,会触发这个事件,开发者可以在这个事件回调内,尝试重新登录 uniCloud。
```js
uniClient.on('loginStateExpire', () => {
// 尝试重新登录
});
```
### Event: 'refreshAccessToken'
JS SDK 会在登录态生效期间,自动刷新和维护短期访问令牌(access token),每次成功刷新时会触发此事件。
对于两种登录态并存(uniCloud、自身业务登录态)的 Web 应用,这个事件可以用于同步登录态之间的状态。
```js
uniClient.on('refreshAccessToken', () => {
// 此时 uniCloud 短期访问令牌已经刷新,可以尝试刷新自身业务的登录态
})
```
### Auth.shouldRefreshAccessToken(callback)
`shouldRefreshAccessToken` 接收一个 `callback` 函数,并且会在刷新短期访问令牌前调用此 `callback` 函数,根据返回值决定是否要刷新短期访问令牌。
对于两种登录态并存(uniCloud、自身业务登录态)的 Web 应用,可以在 `callback` 内判断自身业务登录态是否失效,从而决定是否续期 uniCloud 的短期访问令牌。
```js
auth.shouldRefreshAccessToken(() => {
if (/* 自身业务登录态还有效 */) {
return true;
} else {
return false;
}
});
```
## 获取 auth 的引用
```js
const auth = uniCloud.auth();
```
#### 获取用户信息
```js
const {
uid, //云开发用户唯一ID
customUserId //自定义登录传入的用户Id
} = auth.getUserInfo()
```
## 云函数生成登录凭证
开发者可以使用云函数创建登录凭证,提供给客户端进行登录操作。[详见](uniCloud/authentication.md#自定义登录)
此差异已折叠。
## 执行函数
- 接口名称:callFunction(object)
- 接口功能:远程调用云函数。
### 请求参数
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| name | string | 是 | 云函数名称。|
| data | object | 否 | 云函数参数。|
| callback| function| 否 | 回调函数。 |
### 响应参数
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| code | string| 否 | 状态码,操作成功则不返回。|
| message | string| 否 | 错误描述。 |
| result | object| 否 | 云函数执行结果。 |
| requestId | string| 否 | 请求序列号,用于错误排查。|
### 示例代码
```javascript
//promise
uniCloud.callFunction({
name: "test",
data: { a: 1 }
}).then((res) => {
});
```
\ No newline at end of file
## 上传文件
- 接口名称: uploadFile
- 接口功能:上传文件至云开发存储服务。
- 阿里云暂不支持此接口
### 请求参数
| 字段 | 类型 | 必填 | 说明|
| --- | --- | --- | --- |
| cloudPath | string | 是 | 文件的绝对路径,包含文件名。例如 foo/bar.jpg、foo/bar/baz.jpg 等。[查看详情](https://cloud.tencent.com/document/product/436/13324) 。 |
| fileContent | fs.ReadStream | 是 | buffer或要上传的文件 [可读流](https://nodejs.org/api/stream.html#stream_class_stream_readable) 。|
### 响应参数
| 字段 | 类型 | 必填 | 说明|
| --- | --- | --- | --- |
| code | string | 否 | 状态码,操作成功则不返回。 |
| message | string | 否 | 错误描述。 |
| fileID | fileID | 是 | 文件唯一 ID,用来访问文件,建议存储起来。 |
| requestId | string | 否 | 请求序列号,用于错误排查。 |
### 示例代码
```javascript
const fs = require("fs");
let result = await uniCloud.uploadFile({
cloudPath: "test-admin.jpeg",
fileContent: fs.createReadStream(`${__dirname}/cos.jpeg`)
});
```
## 获取文件下载链接
- 接口名称:getTempFileURL
- 接口功能:获取已上传至云开发的文件的访问链接。
### 请求参数
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| fileList | &lt;Array&gt;.string | 是 | 要下载的文件 ID 组成的数组。 |
fileList
| 字段 | 类型 | 必填 | 说明
| --- | --- | --- | --- |
| fileID | string | 是 | 文件 ID。 |
| maxAge | Integer | 是 | 文件链接有效期。 |
### 响应参数
| 字段 | 类型 | 必填 | 说明
| --- | --- | --- | --- |
| code | string | 否 | 状态码,操作成功则为 SUCCESS。 |
| message | string | 否 | 错误描述。 |
| fileList | &lt;Array&gt;.object | 否 | 存储下载链接的数组。 |
| requestId | string | 否 | 请求序列号,用于错误排查。 |
fileList
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| code | string | 否 | 删除结果,成功为 SUCCESS。 |
| fileID | string | 是 | 文件 ID。 |
| tempFileURL | string | 是 | 文件访问链接。 |
### 示例代码
```javascript
let result = await uniCloud.getTempFileURL({
fileList: ['cloud://test-28farb/a.png']
});
```
## 删除文件
接口名称:deleteFile
接口功能:删除云端文件。
### 请求参数
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| fileList | &lt;Array&gt;.string | 是 | 要删除的文件 ID 组成的数组。 |
### 响应参数
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| code | string | 否 | 状态码,操作成功则不返回。 |
| message | string | 否 | 错误描述 |
| fileList | &lt;Array&gt;.object | 否 | 删除结果组成的数组。 |
| requestId | string | 否 | 请求序列号,用于错误排查。 |
fileList
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| code | string | 否 | 删除结果,成功为SUCCESS。 |
| fileID | string | 是 | 文件 ID。 |
### 示例代码
```javascript
let result = await uniCloud.deleteFile({
fileList: [
"cloud://test-28farb/a.png"
]
});
```
## 下载文件
- 接口名称:downloadFile
- 接口功能:下载已上传至云开发的文件至本地(默认本地根目录/root)。
### 请求参数
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| fileID | string | 是 | 要下载的文件的 ID。 |
| tempFilePath | string | 否 | 下载的文件要存储的位置。 |
### 响应参数
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| code | string | 否 | 状态码,操作成功则不返回。 |
| message | string | 否 | 错误描述。 |
| fileContent | Buffer | 否 | 下载的文件的内容。如果传入 tempFilePath 则不返回该字段。 |
| requestId | string | 否 | 请求序列号,用于错误排查。 |
### 示例代码
```javascript
let result = await uniCloud.downloadFile({
fileID: "cloud://aa-99j9f/my-photo.png",
// tempFilePath: '/tmp/test/storage/my-photo.png'
});
```
\ No newline at end of file
## callFunction(object)
调用云函数
#### 请求参数
|字段 |类型 |必填 |说明 |
|:-: |:-: |:-: |:-: |
|name |String |是 |云函数名称|
|data |Object |否 |云函数参数|
#### 响应参数
|字段 |类型 |说明 |
|:-: |:-: |:-: |
|code |String |状态码,操作成功则不返回 |
|message |String |错误描述 |
|result |Object |云函数执行结果 |
|requestId |String |请求序列号,用于错误排查 |
#### 示例代码
```javascript
// promise
uniClient.callFunction({
name: 'test',
data: { a: 1 }
})
.then(res => {});
// callback
uniClient.callFunction({
name: 'test',
data: { a: 1 },
success(){},
fail(){},
complete(){}
});
```
#### uniCloud.init(Object initOptions)
服务空间初始化,返回uniCloud实例。调用云资源之前必须调用此方法。
**在一个项目只对应一个服务空间的情况下,会自动执行初始化操作用户无需再次执行。后续开发者可以直接使用uniCloud.callFunction等API**
**initOptions 参数说明**
|参数名 |类型 |必填 |默认值 |说明 |平台差异说明 |
|:-: |:-: |:-: |:-: |:-: |:-: |
|provider |String |是 |- |选择服务供应商(可选值tencent,aliyun) | |
|spaceId |String |是 |- |服务空间id | |
|clientSecret |String |阿里云必填 |- |服务空间secret key |仅阿里云侧支持 |
|endpoint |String |否 |https://api.bspapp.com |服务空间地址 |仅阿里云侧支持 |
|autoSignIn |Boolean|否 |true |是否自动匿名登录 |仅腾讯云侧支持 |
|debugFunction|Boolean|否 |true |是否启用云函数日志输出 |仅开发阶段生效,平台支持:APP、H5(使用`HBuilderX`内置浏览器获得更好的调试体验) |
**示例**
```javascript
const uniClient = uniCloud.init({
provider: 'tencent',
spaceId: 'xxxx-yyy',
clientSecret: 'xxxx',
endpoint: 'https://api.bspapp.com'
});
```
**注意**
- 服务提供商为腾讯云时,需要开发者手动去管理控制台开启匿名登录才可以操作云函数[详情](/uniCloud/authentication#匿名登录)
\ No newline at end of file
## 简介
云开发提供了一套简明易懂的JSON语法用来控制**客户端**对资源的访问,类似于身份验证体系里的IAM或者网络权限中的ACL。您可以在控制台上通过修改默认权限规则来管理数据表的权限。
**注意**
- 权限控制仅针对客户端
**阿里云侧目前实现为由开发者自行控制登录状态,所以auth相关的权限判断条件不会生效**
## 云数据库
开发者可以在uniCloud控制台设置数据库权限,如下图所示
**此处需补充uniCloud控制台截图【uniCloud替换标记】**
**目前实现端上不可直接访问数据库,推荐将数据表权限设置为以下形式**
```
{
"db": {
"*": {
".read": false,
".write": false,
"*": false
}
}
}
```
## 云存储
阿里侧端上直接上传文件到云存储的功能正在完善中,开发者可以先将云存储配置为客户端不可读写
**权限配置示例**
```
{
"file": {
"*": {
"*": false
}
}
}
```
## 简介
为了保护用户的数据安全,云开发提供更灵活、可扩展、更细粒度的安全规则能力,开发者可以在云后台或者小程序开发工具上自定义安全规则,限制**客户端**对数据库的访问权限。本文档主要介绍如何配置安全规则以及表达式的相关说明。
安全规则本身不收费,但是安全规则额外的数据访问会统计到计费中。
**注意**
- `get`函数会产生额外的数据访问。
- 指定文档ID查询的所有写操作会产生一次数据访问。
- 权限控制仅针对客户端
## 安全规则示例
**规则示例**
```
//云数据库
{
"read": "auth.uid==doc._openid",
"write": "doc.name=='zzz'"
}
//云存储
{
"read": true,
"write": "resource.openid == auth.uid"
}
```
以上 json 配置中解释如下:
- key:指用户的操作类型。
- value:指一个表达式。
## 操作类型
- [云数据库操作类型](#云数据库操作类型)
- [云存储操作类型](#云存储操作类型)
## 表达式
表达式是伪代码的语句,配置的时候不能过长。
### 变量
**全局变量**
|变量名 |类型 |说明 |
|:-: |:-: |:-: |
|auth |object |用户登录信息,字段说明参见下文 |
|now |number |当前时间 |
|doc |any |文档数据或查询条件 |
**auth**
|字段名 |类型 |说明 |
|:-: |:-: |:-: |
|loginType|string |登录方式,取值为ANONYMOUS(匿名登录)、CUSTOM(自定义登录) |
|uid |string |用户唯一 ID(对应数据库文档的doc._openid、云存储的resource.openid),见下面示例|
```
//云数据库
{
"read": "auth.uid == doc._openid", //仅创建者可读
"write": "auth.uid == doc._openid" //仅创建者可写
}
//云存储
{
"read": "resource.openid == auth.uid", //仅创建者可读
"write": "resource.openid == auth.uid" //仅创建者可写
}
```
### 运算符
|运算符 |说明 |示例 |示例解释(集合查询) |
|:-: |:-: |:-: |:-: |
|== |等于 |auth.uid == 'zzz' |用户的 uid 为 zzz |
|!= |不等于 |auth.uid != 'zzz' |用户的 uid 不为 zzz |
|> |大于 |doc.age>10 |查询条件的 age 属性大于10 |
|>= |大于等于 |doc.age>=10 |查询条件的 age 属性大于等于10 |
|< |小于 |doc.age>10 |查询条件的 age 属性小于10 |
|<= |小于等于 |doc.age>=10 |查询条件的 age 属性小于等于10 |
|in |存在于集合中 |auth.uid in ['zzz','aaa'] |用户的 uid 是['zzz','aaa']中的一个 |
|!(xx in [])|不存在于集合中,使用 in 的方式描述 !(a in [1,2,3]) |!(auth.uid in ['zzz','aaa']) |用户的 uid 不是['zzz','aaa']中的任何一个 |
|&& |与 |auth.uid == 'zzz' && doc.age>10 |用户的 uid 为 zzz 并且查询条件的 age 属性大于10 |
|&#124;&#124; |或者 |auth.uid == 'zzz' &#124;&#124; doc.age>10 |用户的 uid 为 zzz 或者查询条件的 age 属性大于10 |
|. |对象元素访问符 |auth.uid |用户的 uid |
|[] |数组访问符属性 |get('database.collection_a.user')[auth.uid] == 'zzz' |collection_a集合中id为user的文档,key 为用户 uid 的属性值为 zzz|
**注意**
- 比较运算符的右值必须为数值。
### 函数
#### get
目前仅支持`get`函数,唯一的参数必须为`database.集合名称.文档id`。通过访问其它文档的数据来判断用户操作是否符合安全规则。
**使用示例**
```
{
"read":"get('xxxx')[auth.uid] in [1,2,3]",
"delete":"get('xxxx')[auth.uid] == 1 && doc.user in ['ersed','sfsdf'] "
}
```
**注意**
- 一个表达式最多可以有3个get函数。
- 最多可以访问2个不同的文档。
- 不允许嵌套调用,例如:get("xxxx").prop[get("xxxxx").zzzz];
## 云数据库
### 配置说明
开发者可以在uniCloud控制台设置数据库权限
**步骤**
1.
2.
3.
**此处需补充uniCloud控制台截图【uniCloud替换标记】**
### 云数据库操作类型
|操作类型 |说明 |默认值 |
|:-: |:-: |:-: |
|read |读文档 |false |
|write |写文档,可以细分为 create、update、delete|false |
|create |新建文档 |无 |
|update |更新文档 |无 |
|delete |删除文档 |无 |
## 云存储
### 配置说明
开发者可以在uniCloud控制台设置云存储权限
**步骤**
1.
2.
3.
**此处需补充uniCloud控制台截图【uniCloud替换标记】**
### 云存储操作类型
|操作类型 |说明 |默认值 |
|:-: |:-: |:-: |
|read |读取文件,例如:download |- |
|write |上传/覆盖文件,删除文件 |- |
\ No newline at end of file
## 通过HBuilderX创建云开发项目
**此处需配合HBuilderX截图进行说明【uniCloud替换标记】**
**注意**
- 服务提供商为腾讯云时,需要开发者手动去管理控制台开启匿名登录[详情](/uniCloud/authentication#匿名登录)
\ No newline at end of file
## uploadFile(Object uploadOptions)
上传文件到云存储
#### 请求参数
|参数名 |类型 |必填 |默认值 |说明 |平台差异说明 |
|:-: |:-: |:-: |:-: |:-: |:-: |
|cloudPath |String |是 |- |文件的绝对路径,包含文件名 |仅腾讯云侧支持 |
|filePath |String |是 |- |要上传的文件对象 | |
|onUploadProgress |Function |否 |- |上传进度回调 |仅腾讯云侧支持 |
**注意**
- `cloudPath` 为文件的绝对路径,包含文件名 foo/bar.jpg、foo/bar/baz.jpg 等,不能包含除[0-9 , a-z , A-Z]、/、!、-、\_、.、、\*和中文以外的字符,使用 / 字符来实现类似传统文件系统的层级结构。[查看详情](https://cloud.tencent.com/document/product/436/13324)
#### 响应参数
|字段 |类型 |说明 |
|:-: |:-: |:-: |
|code |String |状态码,操作成功则不返回 |
|message |String |错误描述 |
|fileID |String |文件唯一 ID,用来访问文件,建议存储起来 |
|requestId |String |请求序列号,用于错误排查 |
#### 示例代码
```javascript
uni.chooseImage({
count: 1,
success(res) {
console.log(res);
if (res.tempFilePaths.length > 0) {
let filePath = res.tempFilePaths[0]
//进行上传操作
// promise
const result = await uniClient.uploadFile({
cloudPath: 'test-admin.jpeg',
filePath: filePath,
onUploadProgress: function(progressEvent) {
console.log(progressEvent);
var percentCompleted = Math.round(
(progressEvent.loaded * 100) / progressEvent.total
);
}
});
// callback
uniClient.uploadFile({
cloudPath: 'test-admin.jpeg',
filePath: filePath,
onUploadProgress: function(progressEvent) {
console.log(progressEvent);
var percentCompleted = Math.round(
(progressEvent.loaded * 100) / progressEvent.total
);
},
success() {},
fail() {},
complete() {}
});
}
}
});
```
**注意**
- 为了提高文件上传性能,文件上传方式为直接上传到对象存储,为了防止在使用过程中出现 CORS 报错,需要到 Web 控制台/用户管理/登录设置选项中设置安全域名。如果已有域名出现 CORS 报错,请删除安全域名,重新添加。
- 阿里云返回的fileID为链接形式
## getTempFileURL(Object getTempFileURLOptions)
获取文件临时下载链接,**仅腾讯云支持**
#### 请求参数
|字段 |类型 |必填 |默认值 |说明 |平台差异说明 |
|:-: |:-: |:-: |:-: |:-: |:-: |
|fileList |&lt;Array&gt;.String,Object|是 |- |要获取下载链接的文件 ID 组成的数组 |仅腾讯云支持 |
**fileList**
|字段 |类型 |必填 |说明 |
|:-: |:-: |:-: |:-: |
|fileID |String |是 |文件 ID |
|maxAge |Number |是 |文件链接有效期,单位:秒 |
#### 响应参数
|字段 |类型 |说明 |
|:-: |:-: |:-: |
|code |String |状态码,操作成功则为 SUCCESS |
|message |String |错误描述 |
|fileList |&lt;Array&gt;.Object |存储下载链接的数组 |
|requestId |String |请求序列号,用于错误排查 |
**fileList**
|字段 |类型 |说明 |
|:-: |:-: |:-: |
|fileID |String |文件 ID |
|tempFileURL|String |文件访问链接 |
#### 示例代码
```javascript
// promise
uniClient.getTempFileURL({
fileList: ['cloud://test-28farb/a.png']
})
.then(res => {});
// callback
uniClient.getTempFileURL({
fileList: ['cloud://test-28farb/a.png'],
success() {},
fail() {},
complete() {}
});
```
## deleteFile(Object deleteFileOptions)
删除云端文件
#### 请求参数
|字段 |类型 |必填 |说明 |
|:-: |:-: |---- |:-: |
|fileList |&lt;Array&gt;.String |是 |要删除的文件 ID 组成的数组,**阿里云只支持一次删除一个文件**|
#### 响应参数
|字段 |类型 |必填 |说明 |
|:-: |:-: |:-: |:-: |
|code |String |否 |状态码,操作成功则不返回 |
|message |String |否 |错误描述 |
|fileList |&lt;Array&gt;.Object |否 |删除结果组成的数组 |
|requestId |String |否 |请求序列号,用于错误排查 |
**fileList**
|字段 |类型 |必填 |说明 |
|:-: |:-: |:-: |:-: |
|code |String |否 |删除结果,成功为 SUCCESS |
|fileID |String |是 |文件 ID |
#### 示例代码
```javascript
// promise
uniClient
.deleteFile({
fileList: ['cloud://jimmytest-088bef/1534576354877.jpg']
})
.then(res => {});
// callback
uniClient.deleteFile(
{
fileList: ['cloud://jimmytest-088bef/1534576354877.jpg'],
success(){},
fail(){},
complete(){}
}
);
```
<!-- ### 下载文件
downloadFile(Object)
请求参数
| 字段 | 类型 | 必填 | 说明
| :-: | :-: | :-: | :-: |
| fileID | String | 是 | 要下载的文件的id
| tempFilePath | String | 否 | 下载的文件要存储的位置
响应参数
| 字段 | 类型 | 必填 | 说明
| :-: | :-: | :-: | :-: |
| code | String | 否 | 状态码,操作成功则不返回
| message | String | 否 | 错误描述
| fileContent | Buffer | 否 | 下载的文件的内容。如果传入tempFilePath则不返回该字段
| requestId | String | 否 | 请求序列号,用于错误排查
示例代码
```javascript
let result = await tcb.downloadFile({
fileID: "cloud://aa-99j9f/my-photo.png",
// tempFilePath: '/tmp/test/storage/my-photo.png',
success(){},
fail(){},
complete(){}
});
``` -->
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册