提交 5ce9ffad 编写于 作者: Q qiang

Merge branch 'master' into dev

# Conflicts:
#	packages/vue-cli-plugin-uni/packages/uni-cloud/dist/index.js
......@@ -81,7 +81,7 @@
<img src="https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-uni-app-doc/759713d0-4f2d-11eb-a16f-5b3e54966275.png" width="20" height="20"/>
<div class="contact-smg">
<div>官方QQ交流群</div>
<div>群27:811363410 &nbsp;<a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=noDvG6kfZgzXh-Wbp5MRhNutYCojx08G&jump_from=webapi">点此加入</a></div>
<div>群23:599958679 &nbsp;<a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=YDAuvwgiE1Bss5uBA67GSIwfKbDRLuuE&jump_from=webapi">点此加入</a></div>
<div>群35:713420817(2000人已满)</div>
<div>群34:530305531(2000人已满)</div>
<div>群33:498071674(2000人已满)</div>
......@@ -90,11 +90,11 @@
<div>群30:371046920(2000人已满)</div>
<div>群29:202965481(2000人已满)</div>
<div>群28:166188776(2000人已满)</div>
<!-- <div>群27:811363410(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>群23:599958679(2000人已满)</div> -->
<div>群22:687186952(2000人已满)</div>
<div>群21:717019120(2000人已满)</div>
<div>群20:165796402(2000人已满)</div>
......
......@@ -6,6 +6,7 @@
* [生命周期](api/lifecycle.md)
* [应用级事件](api/application.md)
* [拦截器](api/interceptor.md)
* [全局API](api/global.md)
* 网络
* [发起请求](api/request/request.md)
* [上传、下载](api/request/network-file.md)
......@@ -117,6 +118,7 @@
* [全屏视频广告](api/a-d/full-screen-video.md)
* [内容联盟广告](api/a-d/content-page.md)
* [插屏广告](api/a-d/interstitial.md)
* [互动游戏](api/a-d/interactive.md)
* 第三方服务
* [获取服务供应商](api/plugins/provider.md)
* [登录](api/plugins/login.md)
......@@ -181,7 +183,7 @@
<img src="https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-uni-app-doc/759713d0-4f2d-11eb-a16f-5b3e54966275.png" width="20" height="20"/>
<div class="contact-smg">
<div>官方QQ交流群</div>
<div>群27:811363410 &nbsp;<a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=noDvG6kfZgzXh-Wbp5MRhNutYCojx08G&jump_from=webapi">点此加入</a></div>
<div>群23:599958679 &nbsp;<a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=YDAuvwgiE1Bss5uBA67GSIwfKbDRLuuE&jump_from=webapi">点此加入</a></div>
<div>群35:713420817(2000人已满)</div>
<div>群34:530305531(2000人已满)</div>
<div>群33:498071674(2000人已满)</div>
......@@ -190,11 +192,11 @@
<div>群30:371046920(2000人已满)</div>
<div>群29:202965481(2000人已满)</div>
<div>群28:166188776(2000人已满)</div>
<!-- <div>群27:811363410(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>群23:599958679(2000人已满)</div> -->
<div>群22:687186952(2000人已满)</div>
<div>群21:717019120(2000人已满)</div>
<div>群20:165796402(2000人已满)</div>
......
# 互动游戏
## 简介
互动游戏是DCloud联合三方服务商为开发者提供新的广告场景增值服务。开发者在App中放置入口,用户点击入口参与权益化、趣味性的活动。通过观看激励视频广告加速获取权益。沉浸的游戏体验能够降低对广告的抵触心理,增加激励视频广告展示的同时有效提高广告收益。
![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-a90b5f95-90ba-4d30-a6a7-cd4d057327db/c19c9518-c953-49c3-89a0-33a1e595be7f.png)
## 活动场景类型:
共抽奖类、游戏类、养成类3种场景类型,开发者可根据自身情况选择活动类型:
1. 抽奖类活动:通过转盘、扭蛋、摇骰子等抽奖玩法获得奖品碎片或红包奖励
2. 游戏类活动:通过合成游戏、成语答题、捕鱼等游戏玩法获得金币或红包奖励
3. 养成类活动:果园、农场、养牛等长期活动,用户通过连续签到、道具收集、任务体系等玩法提升养成对象的等级,升级后可获得红包奖励或兑换奖品
![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-a90b5f95-90ba-4d30-a6a7-cd4d057327db/994e3f54-d498-4642-8e61-3177dcfef63a.jpg)
### 活动分类表
<table>
<thead style="background-color: #f8f8f8;">
<tr>
<td>活动分类</td>
<td>活动名称</td>
<td>发放奖励</td>
<td>活动周期</td>
<td>是否支持积分打通</td>
</tr>
</thead>
<tbody>
<tr>
<td rowspan="3">抽奖</td>
<td>集碎片</td>
<td>多奖品</td>
<td>7天</td>
<td></td>
</tr>
<tr>
<td>印钞机</td>
<td>现金</td>
<td>7天</td>
<td></td>
</tr>
<tr>
<td>扭蛋机</td>
<td>多奖品</td>
<td>7天</td>
<td></td>
</tr>
<tr>
<td rowspan="4">游戏</td>
<td>大富翁</td>
<td>现金</td>
<td>7天</td>
<td>支持</td>
</tr>
<tr>
<td>成语大赢家</td>
<td>现金</td>
<td>7天</td>
<td></td>
</tr>
<tr>
<td>合成招财猫</td>
<td>现金</td>
<td>7天</td>
<td></td>
</tr>
<tr>
<td>捕鱼达人</td>
<td>现金</td>
<td>长期</td>
<td>新增支持</td>
</tr>
<tr>
<td rowspan="5">养成</td>
<td>福牛</td>
<td>现金</td>
<td>7天</td>
<td></td>
</tr>
<tr>
<td>果园</td>
<td>水果</td>
<td>长期</td>
<td></td>
</tr>
<tr>
<td>农场</td>
<td>现金</td>
<td>30天</td>
<td></td>
</tr>
<tr>
<td>养鸡</td>
<td>现金</td>
<td>长期</td>
<td></td>
</tr>
<tr>
<td>走路赚</td>
<td>现金</td>
<td>7天</td>
<td>支持</td>
</tr>
</tbody>
</table>
注:活动名称在开通时不能选择,如需修改,请邮件联系[uniad@dcloud.io](mailto:uniad@dcloud.io)
## 关于奖励发放的说明
互动游戏的目的是吸引用户参与活动,引导用户观看广告,通过活动获取奖励,满足特定条件后需要向用户发放奖励。目前有两种奖励发放方式,一种是由DCloud联合三方服务商为开发者提供用户奖励线下代发;一种是由开发者对接App自身积分系统,将用户奖励转换为App积分,提高用户参与度和体验。
### 用户奖励线下代发服务
默认使用用户奖励线下代发服务,具体说明如下:
1. 用户参与以上活动达到一定资产时(奖品碎片或金币到达兑换门槛,红包金额到达提现门槛),可发起兑奖申请。如用户申请提现,需要填写收款的支付宝或微信账号;如用户申请兑换虚拟或者实物奖品,需要填写联系人联系方式和收货地址等;具体以兑奖弹窗为准。
2. 用户提交兑奖申请后,客服将在5个工作日内确认,确认后将尽快为您进行发货,如实物奖品有发货时间较长等问题请联系客服。
3. 如实物奖品(水果生鲜等)因为时令问题、疫情区域或者新疆、西藏等偏远地区暂时无法寄送,客服将联系用户赠送奖品价值相等的现金奖励。
4. 实物奖品发放后,快递配送请在24小时内收货,如有质量问题,请于签收后48小时内进行售后申请,超出时间不予赔付。
5. 用户不得使用任何外挂、插件以及其他破坏破坏活动规则、违背活动公平原则的方式参加本次活动,否则服务商有权取消用户参与活动的资格以及清空获得的奖励。
### 用户奖励对接App积分
积分对接需要开发者业务系统与三方服务商的互动游戏进行对接,需要一定的开发工作量,请邮件联系[uniad@dcloud.io](mailto:uniad@dcloud.io)
**平台差异说明**
|App|H5|微信小程序|支付宝小程序|百度小程序|字节跳动小程序|QQ小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|App 3.1.15+|x|x|x|x|x|x|
**开通配置广告**
开通广告步骤:
1. 开通广告
需在广告平台后台操作:
* App平台:[https://uniad.dcloud.net.cn/](https://uniad.dcloud.net.cn/)
2. 申请广告位id
在各位后台申请广告位id
3. App端打包后生效,打包时必须选择要集成的广告SDK互动游戏(变现猫),优量汇、穿山甲、快手至少选择其中一个。
### 语法
`uni.createInteractiveAd(options)`
### 参数说明
`options` 为 object 类型,属性如下:
|属性名 |类型 |必填 |描述 |
|:-:|:-:|:-:|:-:|
|adpid |string | 是 |广告位 id |
|provider |string | 是 |服务商标识,即插件id |
|userData |object | 否 |对接App积分系统参数 |
### 广告创建
广告组件默认是隐藏的,因此可以提前创建,以提前初始化组件。开发者可以在页面的 onReady 事件回调中创建广告实例,并在该页面的生命周期内重复调用该广告实例。
### 显示/隐藏
广告组件默认是隐藏的,开发者需要调用 CreateInteractiveAd.show() 进行显示。如果广告拉取失败或触发频率限制,CreateInteractiveAd.show() 方法会返回一个rejected Promise,开发者可自行监听错误信息
```js
CreateInteractiveAd.show().catch((err) => {
console.error(err)
})
```
用户可以主动关闭广告。开发者不可控制广告组件的隐藏。
### 监听广告加载成功事件
如果广告加载成功,通过 CreateInteractiveAd.onLoad() 注册的回调函数会执行,回调函数返回广告素材参数。
|属性名 |类型 |描述 |
|:-:|:-:|:-:|
|imgUrl |string | 广告素材图片的url地址 |
```js
CreateInteractiveAd.onLoad(res => {
console.log('图片素材地址', res.imgUrl);
console.log('广告加载成功');
})
```
HBuilder基座的测试广告位 adpid: `1042956255` (游戏); `1620839118` (抽奖); `1064042976` (养成)
示例代码
```html
<template>
<view>
<image class="ad-icon" v-if="imgUrl" :src="imgUrl" @click="showInteractiveAd"></image>
</view>
</template>
<script>
export default {
data() {
return {
title: '互动游戏',
loading: false,
imgUrl: ""
}
},
onReady() {
this.adOption = {
adpid: '1042956255',
provider: "BXM-AD"
};
// 创建广告实例
this.createInteractiveAd();
},
methods: {
createInteractiveAd() {
var interactiveAd = this.interactiveAd = uni.createInteractiveAd(this.adOption);
interactiveAd.onLoad((e) => {
this.loading = false;
this.imgUrl = e.imgUrl;
console.log("广告加载成功");
// 如果有广告图片素材, 通过 e.imgUrl 获取
});
interactiveAd.onClose(() => {
// 用户点击了关闭或返回键(仅Android有返回键)
console.log("广告关闭");
});
interactiveAd.onError((err) => {
this.loading = false;
console.log("广告加载失败");
});
// 广告实例创建成功后默认会执行一次 load,加载广告数据
// 如果界面有 "显示广告" 按钮,需要先禁用掉,防止用户点击,等待广告数据加载成功后在放开
this.loading = true;
},
showInteractiveAd() {
// 调用 interactiveAd.show(),如果数据正在加载中不会显示广告,加载成功后才显示
// 在数据没有加载成功时,需要防止用户频繁点击显示广告
if (this.loading == true) {
return
}
this.loading = true;
this.interactiveAd.show().then(() => {
this.loading = false;
});
}
},
onUnload() {
// 页面关闭后销毁实例
this.interactiveAd.destroy();
}
}
</script>
<style>
.ad-icon {
display: block;
width: 80px;
height: 80px;
margin: 10px;
}
</style>
```
#### 方法
`Promise CreateInteractiveAd.load()`
加载广告。
`Promise CreateInteractiveAd.show()`
显示广告。
`CreateInteractiveAd.reportExposure()`
场景入口曝光打点。
`CreateInteractiveAd.destroy()`
销毁广告实例。
`CreateInteractiveAd.onLoad(function callback)`
监听广告加载事件。
`CreateInteractiveAd.offLoad(function callback)`
取消监听广告加载事件
`CreateInteractiveAd.onError(function callback)`
监听错误事件。
`CreateInteractiveAd.offError(function callback)`
取消监听错误事件
### 积分对接
### 开通
1. 开发者需要提供广告位 `adpid`
2. 开发者需要提供服务器接口
1. 获取积分接口
2. 操作积分接口
4. 三方服务商需要提供 `secretKey` 让开发者来验签请求来源
### 获取积分
简要描述:
该接口用于获取用户总积分数量;
开发者提供url用户查询积分
请求方式 `GET`
参数:
|参数名|必选|类型|说明|
|:-:|:-:|:-:|:-:|
|appUserId|是|String|app用户Id|
|appId|是|String|SSP后台注册的appId|
|timestamp|是|String|时间戳(自1970年起,精确到毫秒)|
|sign|是|String|签名,用于验证身份。按照按 secretKey + timestamp 的进行MD5加密(注意加密后字符串要转大写,不要加上“+”号)|
返回参数说明
|参数名|类型|说明|
|:-:|:-:|:-:|
|appUserId|String|app用户Id|
|avatar|String|用户头像|
|nickname|String|用户昵称|
|amount|Long|用户总积分|
示例
```json
{
"appUserId" : "dcloud",
"avatar": "https://xxx.yyy.com/xxxx.jpg",
"nickname": "jack",
"amount": 100
}
```
### 操作积分
简要描述:
此接口用于操作用户积分数量,如增加、扣除;
请求参数放在body里,以JSON格式提交;
考虑到接口的安全,建议开发者采用IP白名单+签名的方式校验来源,以防备被第三方利用。
失败情况:
- URL存在特殊字符或无法通过外网访问;
- 没有按照响应格式要求返回的内容;
- 接口返回状态码非`200`的情况;
- 接口响应时间超过`3`秒。
开发者提供url用户查询积分
请求方式 `POST`
参数:
|参数名|必选|类型|说明|
|:-:|:-:|:-:|:-:|
|appUserId|是|String|App用户Id(唯一标识)|
|appId|是|String|SSP后台注册的appId|
|operateType|是|Long|操作类型:1.增加 2.扣除|
|amount|是|Long|本次操作的积分值|
|timestamp|是|String|时间戳(自1970年起,精确到毫秒)|
|sign|是|String|签名,用于验证身份。按照按 secretKey + timestamp 进行MD5加密(注意加密后字符串要转大写,不要加上“+”号)|
返回参数说明
|参数名|类型|说明|
|:-:|:-:|:-:|
|appUserId|String|App用户Id(唯一标识)|
|status|int|状态码:0. 处理失败 1. 处理成功|
|message|String|失败原因|
|amount|Long|操作后的用户总积分|
返回结果示例
```json
{
"appUserId": "dcloud",
"status": 1,
"amount": 100
}
```
......@@ -538,9 +538,9 @@ rewardedVideoAd.onClose(res => {
```
### 服务器回调
### 服务器回调@callback
App平台 2.6.8+ **仅穿山甲支持。优量汇和快手自身不支持**
App平台 3.1.15+ 支持穿山甲/优量汇/快手
激励视频广告可以支持广告服务器到业务服务器的回调,用于业务系统判断是否提供奖励给观看广告的用户。配置服务器回调后,当用户成功看完广告时,广告服务器会访问配置的回调链接,通知用户完成观看激励视频。
......@@ -557,8 +557,6 @@ urlCallback示例
rewardedVideoAd = uni.createRewardedVideoAd({
adpid: '',
urlCallback: {
amount: '6',
name: 'RewardVideoAD1',
userId: 'testuser',
extra: 'testdata'
}
......@@ -575,37 +573,31 @@ rewardedVideoAd.onVerify(e => {
})
```
### 服务器回调数据说明
### 服务器回调说明
当最终用户观看激励视频广告完成后,广告服务器会以GET方式请求业务服务器的回调链接,并拼接以下参数回传:
`user_id=%s&trans_id=%s&reward_name=%s&reward_amount=%d&extra=%s&sign=%s`
服务器回调基于[uniCloud](https://uniapp.dcloud.net.cn/uniCloud/README),详细流程如下:
字段名称|说明|字段类型|备注|
:-|:-|:-|:-|
sign|签名|String|签名信息|
user_id|用户id|String |调用API传入的userId|
trans_id|交易id|String |广告平台生成的唯一交易ID|
reward_amount|奖励数量|String |广告后台配置或调用API传入的amount|
reward_name|奖励名称|String|广告后台配置或调用API传入的name|
extra|自定义数据,可以为空|String|透传给回调服务器的数据,调用API传入的extra|
1. 登陆 [uniCloud](https://unicloud.dcloud.net.cn/) web控制台,新建服务空间或选择已有服务空间,然后在HBuilderX中新建uni-app项目并关联服务空间,新建云函数上传,用于接收广告的回调
2.[uniAD](https://uniad.dcloud.net.cn/) web控制台开通服务器回调并选择上一步新建的云函数
3. 开通后将在选择的服务空间下自动部署一个加密云函数 `uniAdCallback`
4. `uniAdCallback` 接收广告商服务器回调验证签名并抹平穿山甲/优量汇/快手参数差异,然后以 [callFunction](https://uniapp.dcloud.net.cn/uniCloud/cf-functions?id=callbyfunction) 方式调用用户云函数
5. 用户在自己的云函数中处理业务
#### 签名信息
注意:服务器通信和前端事件是并行的,前端需要轮询向服务器请求并验证结果
在uni-AD广告平台申请激励视频广告位通过后,如果开启服务器回调则会生成appSecurityKey。
appSecurityKey用于签名校验服务器回调请求的合法性(请务必保管好),sign字段值生成规则为:sign=sha256(appSecurityKey,trans_id)
Python示例:
### 云函数uniAdCallback传递的参数
```
import hashlib
|字段定义|类型|字段名称|备注|
|:-:|:-:|:-:|:-:|
|adpid|String|DCloud广告位id||
|provider|String|广告服务商|csj、ks、gdt|
|platform|String|平台|iOS、Android|
|trans_id|String|交易id|完成观看的唯一交易ID|
|user_id|String|用户id|调用SDK透传,应用对用户的唯一标识|
|extra|String|自定义数据|调用SDK传入并透传,如无需要则为空|
if __name__ == "__main__":
trans_id = "6FEB23ACB0374985A2A52D282EDD5361u6643"
app_security_key = "7ca31ab0a59d69a42dd8abc7cf2d8fbd"
check_sign_raw = "%s:%s" % (app_security_key, trans_id)
sign = hashlib.sha256(check_sign_raw).hexdigest()
```
#### 回调请求返回数据约定
#### 用户的云函数返回数据约定
返回json数据,字段如下:
......@@ -614,18 +606,145 @@ if __name__ == "__main__":
isValid|校验结果|Blean|判定结果,是否发放奖励|
示例
```js
exports.main = async (event, context) => {
//event为客户端上传的参数
console.log('event : ', event);
return {
"isValid": true
}
};
```
{
"isValid": true
#### 用户云函数详细说明
如果业务使用了uniCloud,可以直接在云函数内部处理
也可以将结果发送给已有业务服务器
示例代码
```js
'use strict';
const crypto = require('crypto');
const db = uniCloud.database();
const DEFAUTL_TIMEOUT = 30000;
const DEFAUTL_RETRY_COUNT = 3;
const RETRY_TIMEOUT = 3000;
const ProviderType = {
CSJ: "csj",
GDT: "gdt",
KS: "ks"
};
const collectionName = "opendb-uniad-callback-log";
class DB {
static save(data) {
return new DB().add(data);
}
add(data) {
const collection = db.collection(collectionName);
const data2 = Object.assign(data, {
ad_type: 0,
create_date: new Date()
})
return collection.add(data2);
}
}
class UserServer {
static send(url, data) {
return new UserServer().sendHttpRequest(url, data);
}
async sendHttpRequest(url, data) {
let needRetry = parameters.provider !== ProviderType.GDT;
let retryCount = needRetry ? DEFAUTL_RETRY_COUNT : 1;
let timeout = needRetry ? RETRY_TIMEOUT : DEFAUTL_TIMEOUT;
let result = null;
while (retryCount > 0) {
console.log("sendHttpRequest::count::" + retryCount + "::", url, data);
try {
result = await uniCloud.httpclient.request(url, {
data,
dataType: 'json',
contentType: 'json',
timeout
});
if (result.data && result.data.isValid === true) {
break;
}
} catch (e) {
console.log(e);
}
retryCount--;
}
return result;
}
}
exports.main = async (event, context) => {
//event为客户端上传的参数
console.log('event : ', event);
const {
path,
queryStringParameters
} = event;
const data = {
adpid: event.adpid,
platform: event.platform,
provider: event.provider,
trans_id: event.trans_id,
sign: event.sign,
user_id: event.user_id,
extra: event.extra,
}
// 注意::必须验签请求来源
const secret = "";// uniad 后台开通激励视频回调后生成的 secret
const trans_id = event.trans_id;
const sign2 = crypto.createHash('sha256').update(`${secret}:${trans_id}`).digest('hex');
if (event.sign !== sign2) {
return null;
}
// 可选将回调记录保存到uniCloud,避免用户服务器没有响应时有日志可查,如果选择了保存记录需要做定时清理日志,避免日志过多影响性能
// try {
// await DB.save(data);
// } catch (e) {
// console.log(e);
// }
//const url = "https://"; // 用户业务服务器地址,为了避免请求被伪造,必须使用签名的方式请求
//let reuslt = await UserServer.send(url, data);
return {
"isValid": true
}
};
```
#### 安全注意
由于激励视频对应着用户奖励,可能会遇到恶意刷激励奖励但实际上并不看广告的情况。此时广告平台不给结算,但开发者却可能把激励送出去。
穿山甲有服务器回调,情况略好。但腾讯优量汇和快手均不支持服务器回调。
为了提升安全性,建议所有使用激励视频的开发者都要做如下工作来加强保护:
1. 前端代码加密。涉及激励相关的,在manifest中配置好要加密的代码文件,打包后会自动加密相应文件。[详见](https://ask.dcloud.net.cn/article/36437)
2. apk加固。即便前端代码加密,原生层引擎的java代码仍然可能被反编译,需要对apk加固。市面上很多加固服务,比如360加固、爱加密加固均可以自行选择。
......
### uni.onPageNotFound(funciton callback)
### uni.onPageNotFound(function callback)
监听应用要打开的页面不存在事件。该事件与 `App.onPageNotFound` 的回调时机一致
......@@ -26,7 +26,7 @@
- 如果回调中又重定向到另一个不存在的页面,将推入客户端原生的页面不存在提示页面,并且不再第二次回调。
- 在除了 `App.vue` 的其他时机中调用 `uni.onPageNotFound` 的话,需要用uni.offPageNotFound取消监听,否则会出现监听多次的情况
### uni.onError(funciton callback)
### uni.onError(function callback)
监听小程序错误事件。如脚本错误或 `API` 调用报错等。该事件与 `App.onError` 的回调时机与参数一致。
......@@ -117,7 +117,7 @@
应用要打开的页面不存在事件的回调函数
### uni.offError(funciton callback)
### uni.offError(function callback)
取消监听应用错误事件。
......
## uniIDHasRole
新增于`HBuilderX 3.1.15-alpha`,判断当前用户是否拥有某角色。
> 需要在token内缓存角色权限才可使用,请参考:[缓存角色权限](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=cachepermissionintoken)
**在模板内使用**
```html
<template>
<view v-if="uniIDHasRole('admin')">仅管理员可见</view>
</template>
```
**在页面/组件js代码中使用**
```html
<template>
<view>xxx</view>
</template>
<script>
export default {
onLoad(){
console.log('当前用户是否拥有管理员角色:', this.uniIDHasRole('admin'))
}
}
</script>
```
## uniIDHasPermission
新增于`HBuilderX 3.1.15-alpha`,判断当前用户是否拥有某权限,注意:admin角色的用户拥有所有权限
> 需要在token内缓存角色权限才可使用,请参考:[缓存角色权限](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=cachepermissionintoken)
**在模板内使用**
```html
<template>
<view v-if="uniIDHasPermission('edit')">拥有编辑权限时可见</view>
</template>
```
**在页面/组件js代码中使用**
```html
<template>
<view>xxx</view>
</template>
<script>
export default {
onLoad(){
console.log('当前用户是否拥有编辑权限:', this.uniIDHasPermission('edit'))
}
}
</script>
```
\ No newline at end of file
......@@ -59,4 +59,7 @@ uni.addInterceptor('request', {
uni.removeInterceptor('request')
```
\ No newline at end of file
```
##### 拦截器的适用场景非常多,比如路由拦截,权限引导等。
> 你可以参考插件市场,拦截器应用示例:图片选择api时无权限,引导用户快捷打开系统设置:[https://ext.dcloud.net.cn/plugin?id=5095](https://ext.dcloud.net.cn/plugin?id=5095)
\ No newline at end of file
......@@ -83,8 +83,8 @@ uni.getLocation({
|参数名|类型|必填|说明|
|:-|:-|:-|:-|
|latitude|String|否|目标地纬度,仅微信小程序2.9.0+支持|
|longitude|String|否|目标地经度,仅微信小程序2.9.0+支持|
|latitude|Number|否|目标地纬度,仅微信小程序2.9.0+支持|
|longitude|Number|否|目标地经度,仅微信小程序2.9.0+支持|
|keyword|String|否|搜索关键字,仅App平台支持|
|success|Function|是|接口调用成功的回调函数,返回内容详见返回参数说明。|
|fail|Function|否|接口调用失败的回调函数(获取定位失败、用户取消等情况下触发)|
......
......@@ -2,7 +2,7 @@
选择用户的发票抬头,需要用户授权 scope.invoiceTitle。
在微信小程序中,当前当前小程序必须关联一个公众号,且这个公众号是完成了[微信认证](https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1496554031_RD4xe)的,才能调用 chooseInvoiceTitle。
在微信小程序中,当前小程序必须关联一个公众号,且这个公众号是完成了[微信认证](https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1496554031_RD4xe)的,才能调用 chooseInvoiceTitle。
**平台差异说明**
......
......@@ -66,4 +66,13 @@ uni.onNetworkStatusChange(function (res) {
|HBuilderX 3.0.1+|HBuilderX 3.0.1+|基础库 2.9.3+|x|x|x|x|
**Tips**
- `CALLBACK`为调用`uni.onNetworkStatusChange`时传入的`CALLBACK`
- `CALLBACK`必须为调用`uni.onNetworkStatusChange`时传入的`CALLBACK`
例如:
```
var CALLBACK = function(res) {
// ...这里写你的业务逻辑
}
uni.offNetworkStatusChange(CALLBACK)
uni.onNetworkStatusChange(CALLBACK);
```
\ No newline at end of file
......@@ -167,7 +167,7 @@ view.boundingClientRect(data => {
```
**注意**
- nvue 已经支持 uni.createSelectorQuery,无需再使用下面的方案
- nvue 暂不支持 uni.createSelectorQuery,暂时使用下面的方案
```
<template>
......
......@@ -8,7 +8,7 @@
|:-|:-|:-|:-|:-|:-|
|title|String|是|提示的内容,长度与 icon 取值有关。||
|icon|String|否|图标,有效值详见下方说明。||
|image|String|否|自定义图标的本地路径|App、H5、微信小程序、百度小程序|
|image|String|否|自定义图标的本地路径(app端暂不支持gif)|App、H5、微信小程序、百度小程序|
|mask|Boolean|否|是否显示透明蒙层,防止触摸穿透,默认:false|App、微信小程序|
|duration|Number|否|提示的延迟时间,单位毫秒,默认:1500||
|position|String|否|纯文本轻提示显示位置,填写有效值后只有 `title` 属性生效, 有效值详见下方说明。|App|
......
......@@ -2,6 +2,18 @@
将页面滚动到目标位置。
**平台差异说明**
|App|H5|微信小程序|支付宝小程序|百度小程序|字节跳动小程序|QQ小程序|华为快应用|360小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|√(nvue不支持)|√|√|√|√|√|√|√|√|
**OBJECT参数说明**
|参数名 |类型 |必填 |说明 |
......
......@@ -14,8 +14,8 @@
|:-|:-|:-|:-|:-|:-|
|index|number||是|tabBar 的哪一项,从左边算起||
|text|String||否|tab 上的按钮文字||
|iconPath|String||否|图片路径,icon 大小限制为 40kb,建议尺寸为 81px * 81px,当 postion 为 top 时,此参数无效,不支持网络图片||
|selectedIconPath|String||否|选中时的图片路径,icon 大小限制为 40kb,建议尺寸为 81px * 81px ,当 postion 为 top 时,此参数无效||
|iconPath|String||否|图片路径,icon 大小限制为 40kb,建议尺寸为 81px * 81px,当 position 为 top 时,此参数无效,不支持网络图片||
|selectedIconPath|String||否|选中时的图片路径,icon 大小限制为 40kb,建议尺寸为 81px * 81px ,当 position 为 top 时,此参数无效||
|pagePath|String||否|页面绝对路径,必须在 [pages](/collocation/pages?id=pages) 中先定义,被替换掉的 pagePath 不会变成普通页面(仍然需要使用 uni.swichTab 跳转)|App(2.8.4+)、H5(2.8.4+)|
|success|Funtion||否|接口调用成功的回调函数||
|fail|Funtion||否|接口调用失败的回调函数||
......
......@@ -8,7 +8,7 @@
|uniCloud.database() |客户端访问云数据库,获取云数据库对象引用 [详情](https://uniapp.dcloud.net.cn/uniCloud/clientdb) |
|uniCloud.uploadFile() |客户端直接上传文件到云存储 [详情](https://uniapp.dcloud.net.cn/uniCloud/storage?id=uploadfile) |
|uniCloud.getTempFileURL() |客户端获取云存储文件的临时路径 [详情](https://uniapp.dcloud.net.cn/uniCloud/storage?id=gettempfileurl) |
|uniCloud.getCurrentUserInfo() |客户端获取当前用户信息 [详情](https://uniapp.dcloud.net.cn/uniCloud/storage?id=client-getcurrentuserinfo) |
|uniCloud.getCurrentUserInfo() |客户端获取当前用户信息 [详情](https://uniapp.dcloud.io/uniCloud/client-sdk?id=client-getcurrentuserinfo) |
......@@ -228,9 +228,11 @@ uni-app助力数百家单位快速上线**抗疫系统**,开源众多项目,
**字节跳动:** 抖音小游戏中心。
**美团:** 微信小程序搜索“美团充电宝”、App内充电宝栏目
**美团:** 微信小程序搜索“美团团购”、“美团充电宝”,App内充电宝栏目
**快手:** 微信小程序搜索“快手短视频”、App中搜索“快手每日一答”
**快手:** 微信小程序、QQ小程序搜索“快手短视频”、App中搜索“快手每日一答”
**腾讯:** 微信小程序搜索“我的医保凭证”。国家医疗保障局监制。
**腾讯医生:** 微信小程序搜索“腾讯医生”、[H5](https://doctor.baike.qq.com/)
......@@ -263,6 +265,8 @@ uni-app助力数百家单位快速上线**抗疫系统**,开源众多项目,
**搜狐狐友圈:**微信、支付宝、百度、头条小程序均支持。
**58转转:** 微信小程序搜索“转转二手交易网”
**中华英才网:** 百度小程序搜索“中华英才网”
**CSDN App:** Appstore新闻类榜单前十。[uni小程序SDK](https://nativesupport.dcloud.net.cn)案例。App内部众多栏目做成小程序形式。[App下载](https://www.csdn.net/apps/download)
......@@ -295,6 +299,8 @@ uni-app助力数百家单位快速上线**抗疫系统**,开源众多项目,
**金山:** WPS智能PPT,[H5](https://aippt.wps.cn/m/)
**快递100:** 微信、百度、头条、QQ小程序搜索“快递100”
<!-- **达内在线:** 达内教育的在线培训App。[App官网下载](http://www.tmooc.cn/app/index.shtml) -->
......@@ -314,12 +320,12 @@ uni-app助力数百家单位快速上线**抗疫系统**,开源众多项目,
#### 国企
**中国移动:** 微信小程序搜索“中国移动10086+”
**中国移动咪咕商城:**[H5](https://mgmall.migudm.cn/)
**中国移动咪咕爱看App:** 内嵌[uni小程序SDK](https://nativesupport.dcloud.net.cn)。App内部部分栏目做成小程序形式。[Android](https://android.myapp.com/myapp/detail.htm?apkName=com.wondertek.miguaikan)[iOS](https://apps.apple.com/cn/app/id1168490851)
**中国移动微信平台个人中心**
**北京移动:**App部分页面使用uni-app制作
**浙江移动境外出行指南:**[H5](https://wap.zj.10086.cn/szhy/business/20190610gmh5/#/)
......@@ -509,12 +515,18 @@ uni-app助力数百家单位快速上线**抗疫系统**,开源众多项目,
**星巴克:** 微信小程序搜索 “星巴克” 、App部分页面使用uni-app制作
**麦当劳:** 微信小程序搜索“麦咖啡”
**必胜客App:** 部分页面使用uni-app制作
**中通快递:** 微信、百度小程序搜索“中通快递”
**同济医院官方App:** [App官网下载页](https://tjhapp.com.cn/app/appdown.html)
**张亮麻辣烫:** 百度小程序搜索 “张亮麻辣烫”
**蜜雪冰城:**微信小程序搜索 “蜜雪冰城”
**碧桂园:**凤凰云[h5](https://fhyhub.bgy.com.cn/h5/activity/#/)
**西贝骑手:** 西贝莜面村外卖骑手App
......
......@@ -6,6 +6,7 @@
* [uni.scss](collocation/uni-scss.md)
* [App.vue](collocation/App.md)
* [main.js](collocation/main.md)
* [env](collocation/env.md)
* 框架接口
* [日志打印](collocation/frame/log.md)
* [定时器](collocation/frame/timer.md)
......@@ -54,7 +55,7 @@
<img src="https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-uni-app-doc/759713d0-4f2d-11eb-a16f-5b3e54966275.png" width="20" height="20"/>
<div class="contact-smg">
<div>官方QQ交流群</div>
<div>群27:811363410 &nbsp;<a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=noDvG6kfZgzXh-Wbp5MRhNutYCojx08G&jump_from=webapi">点此加入</a></div>
<div>群23:599958679 &nbsp;<a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=YDAuvwgiE1Bss5uBA67GSIwfKbDRLuuE&jump_from=webapi">点此加入</a></div>
<div>群35:713420817(2000人已满)</div>
<div>群34:530305531(2000人已满)</div>
<div>群33:498071674(2000人已满)</div>
......@@ -63,11 +64,11 @@
<div>群30:371046920(2000人已满)</div>
<div>群29:202965481(2000人已满)</div>
<div>群28:166188776(2000人已满)</div>
<!-- <div>群27:811363410(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>群23:599958679(2000人已满)</div> -->
<div>群22:687186952(2000人已满)</div>
<div>群21:717019120(2000人已满)</div>
<div>群20:165796402(2000人已满)</div>
......
uni-app 项目中配置环境变量主要有如下三种方式:
### vue-config.js
在 vue.config.js 中可以修改 webpack 配置,包括环境变量,具体参考 [vue-config.js](/collocation/vue-config)
### package.json
在自定义条件编译平台时,可以在 package.json 文件的 env 节点下配置环境变量,具体参考 [package.json](/collocation/package)
### .env
CLI 创建的项目中可以在根目录中放置 ``.env`` 文件来指定环境变量,具体参考:[环境变量](https://cli.vuejs.org/zh/guide/mode-and-env.html#%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F)
\ No newline at end of file
......@@ -13,7 +13,8 @@ package.json扩展配置用法(拷贝代码记得去掉注释!):
"title":"自定义扩展名称", // 在HBuilderX中会显示在 运行/发行 菜单中
"BROWSER":"", //运行到的目标浏览器,仅当UNI_PLATFORM为h5时有效
"env": {//环境变量
"UNI_PLATFORM": "" //基准平台
"UNI_PLATFORM": "", //基准平台
"MY_TEST": "", // ... 其他自定义环境变量
},
"define": { //自定义条件编译
"CUSTOM-CONST": true //自定义条件编译常量,建议为大写
......@@ -41,7 +42,7 @@ Tips:
"uni-app": {
"scripts": {
"mp-dingtalk": {
"title":"钉钉小程序",
"title":"钉钉小程序",
"env": {
"UNI_PLATFORM": "mp-alipay"
},
......
......@@ -950,7 +950,7 @@ midButton没有pagePath,需监听点击事件,自行处理点击后的行为
#### **tabbar常见问题** @tips-tabbar
- tabbar 的 js api 见[接口-界面-tabbar](https://uniapp.dcloud.io/api/ui/tabbar),可实现动态显示隐藏(如弹出层无法覆盖tabbar)、内容修改(如国际化)、item加角标等功能。hello uni-app中也有示例。
- tabbar 的 item 点击事件见[页面生命周期的onTabItemTap](https://uniapp.dcloud.io/frame?id=%E9%A1%B5%E9%9D%A2%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F)
- tabbar 的 item 点击事件见[页面生命周期的onTabItemTap](https://uniapp.dcloud.io/collocation/frame/lifecycle?id=%E9%A1%B5%E9%9D%A2%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F)
- 代码跳转到 tabbar 页面,api只能使用[uni.switchTab](https://uniapp.dcloud.io/api/router?id=switchtab),不能使用uni.navigateTo、uni.redirectTo;使用navigator组件跳转时必须设置[open-type="switchTab"](https://uniapp.dcloud.io/component/navigator)
- tabbar 的默认高度,在不同平台不一样。App端的默认高度在HBuilderX 2.3.4起从56px调整为50px,与H5端统一。开发者也可以自行设定高度,调回56px。[详见](https://uniapp.dcloud.io/frame?id=%e5%9b%ba%e5%ae%9a%e5%80%bc)
- tabbar 在H5端是div模拟的,属于前端屏幕窗口的一部分,如果要使用bottom居底定位方式,应该使用css变量`--window-bottom`,比如悬浮在tabbar上方10px的按钮,样式如下`bottom: calc(var(--window-bottom) + 10px)`
......@@ -1057,7 +1057,7 @@ subPackages 节点接收一个数组,数组每一项都是应用的子包,
**注意:**
- ```subPackages``` 里的pages的路径是 ``root`` 下的相对路径,不是全路径。
- 微信小程序每个分包的大小是2M,总体积一共不能超过16M。
- 微信小程序每个分包的大小是2M,总体积一共不能超过20M。
- 百度小程序每个分包的大小是2M,总体积一共不能超过8M。
- 支付宝小程序每个分包的大小是2M,总体积一共不能超过4M。
- QQ小程序每个分包的大小是2M,总体积一共不能超过24M。
......
......@@ -59,6 +59,23 @@ module.exports = {
}
```
**配置环境变量**
```js
const webpack = require('webpack')
module.exports = {
chainWebpack: config => {
config
.plugin('define')
.tap(args => {
args[0]['process.env'].VUE_APP_TEST = '"test"'
return args
})
}
}
```
**发布时删除console**
`HBuilderX 2.6.8+`支持
......
......@@ -422,7 +422,7 @@ datacom组件是一种数据驱动的、可云端一体的组件。
### 如何封装组件
封装组件涉及的知识点较多,相关文档详见:[vue组件详解](/vue-componets)
封装组件涉及的知识点较多,相关文档详见:[vue组件详解](https://uniapp.dcloud.io/vue-components)
### 扩展组件(uni-ui)@uniui
......
......@@ -45,6 +45,7 @@
* 广告
* [ad](component/ad.md)
* [ad-draw](component/ad-draw.md)
* [ad-content-page](component/ad-content-page.md)
* [Grid 广告](component/ad-grid.md)
* 页面属性配置节点
* [page-meta](component/page-meta.md)
......@@ -146,7 +147,7 @@
<img src="https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-uni-app-doc/759713d0-4f2d-11eb-a16f-5b3e54966275.png" width="20" height="20"/>
<div class="contact-smg">
<div>官方QQ交流群</div>
<div>群27:811363410 &nbsp;<a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=noDvG6kfZgzXh-Wbp5MRhNutYCojx08G&jump_from=webapi">点此加入</a></div>
<div>群23:599958679 &nbsp;<a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=YDAuvwgiE1Bss5uBA67GSIwfKbDRLuuE&jump_from=webapi">点此加入</a></div>
<div>群35:713420817(2000人已满)</div>
<div>群34:530305531(2000人已满)</div>
<div>群33:498071674(2000人已满)</div>
......@@ -155,11 +156,11 @@
<div>群30:371046920(2000人已满)</div>
<div>群29:202965481(2000人已满)</div>
<div>群28:166188776(2000人已满)</div>
<!-- <div>群27:811363410(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>群23:599958679(2000人已满)</div> -->
<div>群22:687186952(2000人已满)</div>
<div>群21:717019120(2000人已满)</div>
<div>群20:165796402(2000人已满)</div>
......
## 短视频内容联盟组件
### 简介
**平台差异说明**
|App|H5|微信小程序|支付宝小程序|百度小程序|字节跳动小程序|QQ小程序|快应用|360小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|√(3.1.17)|x|x|x|x|x|x|x|x|
**仅Android nvue支持**
**开通配置广告**
开通广告步骤:
1. 开通广告
需在广告平台后台操作:
* App平台:[https://uniad.dcloud.net.cn/](https://uniad.dcloud.net.cn/)
2. 申请广告位id
在各位后台申请广告位id
3. 在页面合适位置编写代码,放置`ad-content-page`组件,配上广告位adpid
4. App端打包后生效,打包时必须选择快手内容联盟。
**属性说明**
|属性名|类型|默认值|说明|平台差异|
|:-|:-|:-|:-|:-|
|adpid|String||uni-AD App广告位id,在[uni-AD官网](https://uniad.dcloud.net.cn/)申请广告位|仅Android nvue支持|
|@load|EventHandle||广告加载成功的回调||
|@error|EventHandle||广告加载失败的回调||
HBuilder 基座的测试广告位 `adpid``1111111112`
**示例:**
```html
<template>
<view class="content">
<ad-content-page ref="adContentPage" adpid="1111111112" @load="onadload" @error="onaderror"></ad-content-page>
</view>
</template>
<script>
export default {
data() {
return {
title: 'ad-content-page'
}
},
onShow() {
// 需要在页面显示时调用广告组件的 show 方法
this.$refs.adContentPage.show();
},
onHide() {
// 需要在页面隐藏时调用广告组件的 hide 方法停止广告内容的声音
this.$refs.adContentPage.hide();
},
methods: {
onadload(e) {
console.log("onload");
},
onaderror(e) {
console.log("onerror");
}
}
}
</script>
```
**注意**
- 需要在页面隐藏时调用组件的 `hide` 方法以停止广告内容的声音
......@@ -9,7 +9,7 @@
* 在 App 和 H5 端,可以使用API方式来调用全屏摄像头,而不是组件内嵌方式,详见:[uni.chooseImage](/api/media/image?id=chooseimage)[uni.chooseVideo](/api/media/video?id=choosevideo) *
* 如开发身份证扫描、银行卡识别等ocr识别需求,在微信小程序和百度小程序中使用本camera组件,将图片发送给服务器识别,插件市场有封装好的[模板](https://ext.dcloud.net.cn/search?q=%E5%B0%8F%E7%A8%8B%E5%BA%8F%E7%9B%B8%E6%9C%BA);在App端使用[原生插件](https://ext.dcloud.net.cn/search?q=ocr)
* 活体检测、人脸识别另见文档[生物认证](/api/other/authentication)
* 活体检测、人脸识别另见文档[生物认证](/api/system/authentication)
* app-nvue下支持barcode组件,可实现自定义扫码。[参考](https://uniapp.dcloud.io/component/barcode)
**属性说明**
......
......@@ -19,6 +19,7 @@
**注意事项:**
* canvas 标签默认宽度 300px、高度 225px,动态修改 canvas 大小后需要重新绘制。
* h5、app-vue 中单个尺寸过大的 canvas 在 iOS/Safari 无法绘制(具体限制尺寸未公布)。
* 同一页面中的 canvas-id 不可重复,如果使用一个已经出现过的 canvas-id,该 canvas 标签对应的画布将被隐藏并不再正常工作。
* canvas 在微信小程序、百度小程序、QQ小程序中为原生组件,层级高于前端组件,请勿内嵌在 scroll-view、swiper、picker-view、movable-view 中使用。解决 canvas 层级过高无法覆盖,参考 [native-component](/component/native-component)。其他小程序端的 canvas 仍然为 webview 中的 canvas。
* app-vue 中的 canvas 仍然是 webview 的 canvas。app-nvue下如需使用canvas,需下载插件,详见文档底部章节。
......
......@@ -90,7 +90,7 @@ app-vue上可覆盖的原生组件:`<video>`、`<map>`
<!-- 本示例未包含完整css,获取外链css请参考上文,在hello uni-app项目中查看 -->
<template>
<view class="page">
<video class="video" id="demoVideo" :controls="false" :enable-progress-gesture="false" :show-center-play-btn="disable" src="https://img.cdn.aliyun.dcloud.net.cn/guide/uniapp/%E7%AC%AC1%E8%AE%B2%EF%BC%88uni-app%E4%BA%A7%E5%93%81%E4%BB%8B%E7%BB%8D%EF%BC%89-%20DCloud%E5%AE%98%E6%96%B9%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B@20181126-lite.m4v">
<video class="video" id="demoVideo" :controls="false" :enable-progress-gesture="false" :show-center-play-btn="true" src="https://img.cdn.aliyun.dcloud.net.cn/guide/uniapp/%E7%AC%AC1%E8%AE%B2%EF%BC%88uni-app%E4%BA%A7%E5%93%81%E4%BB%8B%E7%BB%8D%EF%BC%89-%20DCloud%E5%AE%98%E6%96%B9%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B@20181126-lite.m4v">
<cover-view class="controls-title">简单的自定义 controls</cover-view>
<cover-image class="controls-play img" @click="play" src="/static/play.png"></cover-image>
<cover-image class="controls-pause img" @click="pause" src="/static/pause.png"></cover-image>
......
......@@ -297,7 +297,7 @@ datacom组件规范还要求支持绑定 value,且支持双向绑定,即:
|属性名 |类型 |默认值 |说明 |
|-- |-- |-- |-- |
|step-searh |Boolean |true |是否分步查询云端数据。常用于树,picker,分页列表等,参考:`uni-data-picker` |
|step-search |Boolean |true |是否分步查询云端数据。常用于树,picker,分页列表等,参考:`uni-data-picker` |
|step-search-url|String | |分步查询的云端数据请求地址。常用于树,picker,分页列表等,参考:`uni-data-picker` |
|self-field |String | |"树"结构的当前字段名称。常用于树,picker,参考:`uni-data-picker` |
|parent-field |String | |"树"结构的父字段名称。常用于树,picker,参考:`uni-data-picker` |
......
......@@ -26,7 +26,7 @@
**mode 有效值:**
mode 有 13 种模式,其中 4 种是缩放模式,9 种是裁剪模式。
mode 有 14 种模式,其中 5 种是缩放模式,9 种是裁剪模式。
|模式|值|说明|
|:-|:-|:-|
......
......@@ -7,7 +7,7 @@
|属性名|类型|默认值|说明|平台差异说明|
|:-|:-|:-|:-|:-|
|value|String||输入框的初始内容||
|type|String|text|input 的类型|H5 暂未支持动态切换请使用 v-if 进行整体切换|
|type|String|text|input 的类型|H5 暂未支持动态切换,详见下方 Tips,请使用 v-if 进行整体切换|
|password|Boolean|false|是否是密码类型|H5和App写此属性时,type失效|
|placeholder|String||输入框为空时占位符||
|placeholder-style|String||指定 placeholder 的样式||
......@@ -35,6 +35,17 @@
- `input` 事件处理函数可以直接 return 一个字符串,将替换输入框的内容。仅微信小程序支持。
- 如果遇到 value 属性设置不生效的问题参考:[组件属性设置不生效解决办法](/vue-api?id=_4-组件属性设置不生效解决办法)
- `input` 组件上有默认的 `min-height` 样式,如果 `min-height` 的值大于 `height` 的值那么 `height` 样式无效。
- H5 暂未支持动态切换,请使用 `v-if`进行整体切换。
```html
<!-- 错误写法 -->
<input :type="isText?'text':'number'" placeholder="请输入内容" />
<!-- 正确写法 -->
<input v-if="isText" type="text" placeholder="请输入文本" />
<input v-else type="number" placeholder="请输入数字" />
```
**type 有效值**
......@@ -51,7 +62,7 @@
- 小程序平台,`number` 类型只支持输入整型数字。微信开发者工具上体现不出效果,请使用真机预览。
- 如果需要在小程序平台输入浮点型数字,请使用 `digit` 类型。
- 小程序端input在置焦时,会表现为原生控件,此时会层级变高。如需前端组件遮盖input,需让input失焦,或使用cover-view等覆盖原生控件的方案,[参考](https://uniapp.dcloud.io/component/native-component)。具体来讲,阿里小程序的input为text且置焦为原生控件;微信、头条、QQ所有input置焦均为原生控件;百度小程序置焦时仍然是非原生的。也可以参考[原生控件](https://uniapp.dcloud.io/component/native-component)文档
- input组件若不想弹出软键盘,可设置为disable
- input组件若不想弹出软键盘,可设置为disabled
**confirm-type 有效值**
......
#### movable-area
可拖动区域组件。
可拖动区域
由于app和小程序的架构是逻辑层与视图层分离,使用js监听拖动时会引发逻辑层和视图层的频繁通讯,影响性能。为了方便高性能的实现拖动,平台特封装了`movable-area`组件。
......
......@@ -85,7 +85,7 @@ export default {
methods: {
radioChange: function(evt) {
for (let i = 0; i < this.items.length; i++) {
if (this.items[i].value === evt.target.value) {
if (this.items[i].value === evt.detail.value) {
this.current = i;
break;
}
......
......@@ -88,6 +88,25 @@ export default {
- 如果遇到 focus 属性设置不生效的问题参考:[组件属性设置不生效解决办法](/vue-api?id=_4-组件属性设置不生效解决办法)
- 软键盘的弹出和收起逻辑,详见[input的文档](/component/input?id=app%E5%B9%B3%E5%8F%B0ios%E7%AB%AF%E8%BD%AF%E9%94%AE%E7%9B%98%E4%B8%8A%E6%96%B9%E6%A8%AA%E6%9D%A1%E5%8E%BB%E9%99%A4%E6%96%B9%E6%A1%88)
- 如需禁止点击其他位置收起键盘的默认行为,可以监听`touch`事件并使用`prevent`修饰符(仅支持App-v3、H5,其他平台可以通过设置`focus`来使输入框重新获取焦点),例如在确认按钮上使用:```@touchend.prevent="onTap"```
- js中给textarea组件赋值为字符串,在字符串中加\n可实现换行。
```
<template>
<view class="content">
<textarea class="textarea" v-model="txt"></textarea>
</view>
</template>
<script>
export default {
data() {
return {
"txt":"hello world!\n textarea多行输入框"
}
}
}
</script>
```
nvue下键盘右下角按钮点击仅触发换行;如想监听该按钮事件可以参考,示例代码如下:
......
......@@ -224,6 +224,9 @@ switch(uni.getSystemInfoSync().platform){
如有必要,也可以在条件编译里自己定义一个变量,赋不同值。在后续运行代码中动态判断环境。
### 其他环境变量
其他环境变量的定义方式参考 [环境变量](/collocation/env)。
## 页面样式与布局
uni-app的css与web的css基本一致。本文没有讲解css的用法。在你了解web的css的基础之上,本文讲述一些样式相关的注意事项。
......
每个端有每个端的特点,有的能被抹平,有的不可能被抹平。
注意:跨端,不是把web的习惯迁移到全平台。而是按照uni的写法,然后全平台使用。
### H5正常但App异常的可能性
1. css异常:
......
......@@ -5,18 +5,15 @@
### 注意事项
- nvue的css**仅支持flex布局**,是webview的css语法的子集。这是因为操作系统原生排版不支持非flex之外的web布局。当然flex足以排布出各种页面,只是写法需要适应。
- 在选择器方面支持的较少,只支持简单的```class="classA"```
- class 进行绑定时只支持数组语法。
- 不支持媒体查询
- 不支持 class 以外的选择器
- 不支持组合选择器(3.1.0+ 开始支持)
- 不支持简写样式(3.1.0+ 开始支持)
- 不能在 style 中引入字体文件
- 布局不能使用百分比,如```width:100%```
- 有些web的css属性在nvue里无法支持,比如背景图。但可以使用image组件和层级来实现类似web中的背景效果。因为原生开发本身也没有web这种背景图概念
- nvue 的各组件在安卓端默认是透明的,如果不设置```background-color```,可能会导致出现重影的问题
- 文字内容,必须只能在```text```组件下,```text```组件不能换行写内容,否则会出现无法去除的周边空白
- 只有```text```标签可以设置字体大小,字体颜色
- 不能使用百分比布局,如`width:100%`
- 不支持在css里写背景图`background-image`,但可以使用image组件和层级来实现类似web中的背景效果。因为原生开发本身也没有web这种背景图概念
- 使用`image`标签,支持使用base64
- nvue 的各组件在安卓端默认是透明的,如果不设置`background-color`,可能会导致出现重影的问题
- 文字内容,必须只能在`text`组件下,`text`组件不能换行写内容,否则会出现无法去除的周边空白
- 只有`text`标签可以设置字体大小,字体颜色
**HBuilderX 3.1.0+ 开始支持更多简写样式**
......@@ -37,97 +34,23 @@
- 新增 `nvueStyleCompiler` 配置,支持组合选择器(相邻兄弟选择器、普通兄弟选择器、子选择器、后代选择器)。[详见](https://ask.dcloud.net.cn/article/38751)
下面有些正确和错误的写法示例对比:
- 选择器类型仅支持 class 选择器
```css
/* 错误 */
#id {}
/* 正确 */
.class {}
```
- 仅支持单个选择器(3.1.0+ 开始支持组合选择器)
```css
/* 错误 */
.a .b .c {}
.a > .b {}
/* 正确 */
.class {}
```
- 不支持简写样式(3.1.0+ 开始支持更多简写样式)
```css
/* 错误 */
.class {
border: 1px red solid;
}
/* 正确 */
.class {
border-width: 1px;
border-style: solid;
border-color: red;
}
/* 错误 */
.class {
background: red;
}
/* 正确 */
.class {
background-color: red;
}
```
- nvue的```uni-app```编译模式下,App.vue 中的样式,会编译到每个 nvue文件。对于共享样式,如果有不合法属性控制台会给出警告,可以通过[条件编译](https://uniapp.dcloud.io/platform)```APP-PLUS-NVUE```屏蔽 App 中的警告。
```css
/* 错误 */
/* 控制台警告:
WARNING: `border` is not a standard property name (may not be supported)
WARNING: `-webkit-transform` is not a standard property name (may not be supported)
*/
.class {
border: 1px red solid;
-webkit-transform: scaleY(.5);
}
/* 正确 */
.class {
border-width: 1px;
border-style: solid;
border-color: red;
/* #ifndef APP-PLUS-NVUE */
-webkit-transform: scaleY(.5);
/* #endif*/
}
```
## 盒模型
nvue盒模型基于 CSS 盒模型,每个 nvue 元素都可视作一个盒子。我们一般在讨论设计或布局时,会提到「盒模型」这个概念。
盒模型描述了一个元素所占用的空间。每一个盒子有四条边界:外边距边界 ```margin edge```, 边框边界 ```border edge```, 内边距边界 ```padding edge``` 与内容边界 ```content edge```。这四层边界,形成一层层的盒子包裹起来,这就是盒模型大体上的含义。
盒模型描述了一个元素所占用的空间。每一个盒子有四条边界:外边距边界 `margin edge`, 边框边界 `border edge`, 内边距边界 `padding edge` 与内容边界 `content edge`。这四层边界,形成一层层的盒子包裹起来,这就是盒模型大体上的含义。
![图片描述文字](https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-dc-site/ec4f2810-2fec-11eb-899d-733ae62bed2f.png)
> nvue盒模型的 ```box-sizing``` 默认为 ```border-box```,即盒子的宽高包含内容、内边距和边框的宽度,不包含外边距的宽度。
> nvue盒模型的 `box-sizing` 默认为 `border-box`,即盒子的宽高包含内容、内边距和边框的宽度,不包含外边距的宽度。
> 在 Android 平台,nvue只支持 ```overflow:hidden```。
> 在 Android 平台,nvue只支持 `overflow:hidden`。
> 在 iOS 上,nvue支持 ```overflow:hidden``` 和 ```overflow:visible```,默认是 ```overflow:visible```。
> 在 iOS 上,nvue支持 `overflow:hidden` 和 `overflow:visible`,默认是 `overflow:visible`。
......
#### 3.1.17.20210603-alpha
* 【uni-app】
+ App-Android平台 新增 nvue ad-content-page组件支持页面内显示快手短视频内容联盟 [规范](https://uniapp.dcloud.net.cn/component/ad-content-page)
+ App-Android平台 修复 nvue map 组件 marker 上的 label 可能会被 marker 本身覆盖的Bug [详情](https://ask.dcloud.net.cn/question/122872)
* 【uniCloud】
+ 修复 HBuilderX 3.1.16 引出的未关联服务空间时无法获取 uniCloud.mixinDatacom 的Bug
+ 修复 HBuilderX 3.1.16 引出的某些情况下关联腾讯云服务空间的项目运行报错的Bug
+ uniCloud本地调试插件 修复 HBuilderX 3.1.16 引出的云函数日志内的文件链接点击无法跳转到对应文件的Bug
* 【App插件(含5+App和uni-app的App端)】
+ Android平台 优化 云端打包googleplay渠道使用 Android App Bundle (AAB) 格式 [详情](https://ask.dcloud.net.cn/article/39052)
+ iOS平台 修复 视频播放控件 VideoPlayer 调用 playbackRate 方法设置倍数播放值为 1.25、1.5 不生效的Bug [详情](https://ask.dcloud.net.cn/question/107802)
+ iOS平台 修复 扫码时息屏后再次打开引起扫描线动画停止的Bug [详情](https://ask.dcloud.net.cn/question/124001)
#### 3.1.16.20210526-alpha
* 【uni-app】
+ 【重要】H5端 新增 支持在 CLI 工程使用 vue3/vite [详情](https://ask.dcloud.net.cn/article/37834)
+ 补充 addInterceptor 拦截器文档 [详情](https://uniapp.dcloud.io/api/interceptor)
+ App-Android平台 修复 nvue swiper 组件动态加载数据时会跳到第一个 swiper-item 的bug [详情](https://ask.dcloud.net.cn/question/121687)
* 【uniCloud】
+ clientDB 新增 使用副表 foreignKey 进行联表查询时增加 _value 用于存储主表关联字段原始值 [详情](https://uniapp.dcloud.net.cn/uniCloud/clientdb?id=st-foreign-key)
+ clientDB 修复 部分情况下 action.after 会重复执行一次的bug
+ JQL数据管理 修复 使用云端 schema 时找不到 schema 的Bug [详情](https://ask.dcloud.net.cn/question/123285)
* 【App插件(含5+App和uni-app的App端)】
+ Android平台 修复 3.1.15 版本引出的 云端打包同时勾选 UniPush 和 一键登录 模块会引起打包失败的Bug
+ iOS平台 更新 百度语音识别 SDK 为 3.0.10.0 版
+ iOS平台 优化 相册目录选择操作界面
#### 3.1.15.20210518-alpha
* 【uni-app】
+ App平台 新增 uni-AD 互动游戏,无需自行设计激励视频场景,快速嵌入激励视频变现 [详情](https://uniapp.dcloud.net.cn/api/a-d/interactive)
+ App平台 新增 激励视频服务器回调 [详情](https://uniapp.dcloud.net.cn/api/a-d/rewarded-video?id=callback)
+ App平台、H5平台 修复 3.1.10 版本引出的 textarea 组件固定 box-sizing 导致部分情况显示异常的Bug [详情](https://ask.dcloud.net.cn/question/121893)
+ App平台 修复 3.1.10 版本引出的 input 组件类型为 number 时在低版本 webview 失去焦点时报错的Bug [详情](https://ask.dcloud.net.cn/question/122328)
+ App平台 修复 3.1.0 版本引出的 dataset 使用驼峰写法时获取数据格式与其他平台不一致的Bug [详情](https://ask.dcloud.net.cn/question/119034)
+ App-Android平台 修复 3.1.14 版本引出的 nvue web-view 组件无法加载本地 html 页面的Bug [详情](https://ask.dcloud.net.cn/question/122944)
+ App-Android平台 修复 nvue map 组件 markers 中的 id 属性值重复导致标记点显示异常的Bug
+ App-iOS平台 修复 uni.downloadFile 下载文件名称存在中文时无法通过 uni.saveFile 保存的Bug [详情](https://ask.dcloud.net.cn/question/122212)
+ App-iOS平台 修复 nvue video 组件播放 mov 格式视频时显示尺寸会变小的Bug [详情](https://ask.dcloud.net.cn/question/121175)
+ H5平台 修复 3.1.0 版本引出的样式中包含媒体查询时部分 rpx 单位失效的Bug [#2600](https://github.com/dcloudio/uni-app/issues/2600)
+ uni-ui 发布新版本 1.3.1
* uni-badge 新增 uni-badge 的 absolute 属性,支持定位
* uni-badge 新增 uni-badge 的 offset 属性,支持定位偏移
* uni-badge 新增 uni-badge 的 is-dot 属性,支持仅显示有一个小点
* uni-badge 新增 uni-badge 的 max-num 属性,支持自定义封顶的数字值,超过 99 显示99+
* uni-badge 优化 uni-badge 属性 custom-style, 支持以对象形式自定义样式
* uni-badge 修复 uni-badge 在 App 端,数字小于10时不是圆形的bug
* uni-badge 修复 uni-badge 在父元素不是 flex 布局时,宽度缩小的bug
* uni-badge 新增 uni-badge 属性 custom-style, 支持自定义样式
* uni-datetime-picker 修复 ios 下不识别 '-' 日期格式的 bug
* uni-datetime-picker 优化 pc 下弹出层添加边框和阴影
* uni-datetime-picker 修复 在 admin 中获取弹出层定位错误的bug
* uni-datetime-picker 修复 type 属性向下兼容,默认值从 date 变更为 datetime
* uni-datetime-picker 支持日历形式的日期+时间的范围选择
* uni-steps 修复 uni-steps 横向布局时,多行文字高度不合理的 bug
* uni-countdown 修复 uni-countdown 不能控制倒计时的 bug
* uni-tag 修复 royal 类型无效的bug
* uni-tag 修复 uni-tag 宽度不自适应的bug
* uni-tag 新增 uni-tag 支持属性 custom-style 自定义样式
* uni-link 新增 href 属性支持 tel:|mailto:
* uni-popup 修复 组件内放置 input 、textarea 组件,无法聚焦的问题
* uni-popup 新增 type 属性的 left\right 值,支持左右弹出
* uni-popup 新增 open(String:type) 方法参数 ,可以省略 type 属性 ,直接传入类型打开指定弹窗
* uni-popup 新增 backgroundColor 属性,可定义主窗口背景色,默认不显示背景色
* uni-popup 新增 safeArea 属性,是否适配底部安全区
* uni-popup 修复 App\h5\微信小程序底部安全区占位不对的Bug
* uni-popup 修复 App 端弹出等待的Bug
* uni-popup 优化 提升低配设备性能,优化动画卡顿问题
* uni-popup 优化 更简单的组件自定义方式
* uni-table 修复 示例项目缺少组件的Bug
* uni-forms 修复 自定义检验器失效的问题
* uni-title 修复 示例项目缺少组件的Bug
* uni-transition 修复 示例项目缺少组件的Bug
* uni-swiper-dot 修复 示例项目缺少组件的Bug
* uni-ui 新增 组件示例地址
* 【uniCloud】
+ 【重要】新增 uni-starter 集成商用项目开发常见功能的云端一体项目模板 [详情](https://ext.dcloud.net.cn/plugin?id=5057)
+ clientDB 修复 删除记录、统计记录数时受字段权限影响的bug [详情](https://ask.dcloud.net.cn/question/122846)
+ clientDB 修复 日期类型(date)数据校验出错的Bug [详情](https://ask.dcloud.net.cn/question/122517)
+ clientDB 修复 action、validateFunction 内打印日志无法在web控制台查看的Bug
+ unicloud-db组件 修复 联表查询时无法调用remove方法的问题 [详情](https://ask.dcloud.net.cn/question/122934)
* 【App插件(含5+App和uni-app的App端)】
+ 新增 uni-AD 快手广告联盟支持插屏广告
+ 更新 uni-AD 快手广告联盟SDK 为3.3.9 版;快手内容联盟SDK 为3.3.16 版;腾讯优量汇SDK Android为4.360.1230版;穿山甲SDK Android为3.6.1.3版,iOS为3.6.1.2版
+ Android平台 更新 腾讯X5内核版本为 4.3.0.93,解决X5内核渲染页面时获取的UA中不包含 MQQBrowser 关键字的Bug
+ Android平台 更新 UniPush 使用的个推SDK版本为3.2.0.0,提升在Android高版本设备上的推送消息到达率
+ Android平台 修复 QQ登录获取用户信息 getUserInfo 返回的昵称可能出现乱码的Bug [详情](https://ask.dcloud.net.cn/question/120265)
+ iOS平台 更新 高德地图 SDK 为 1.6.4无IDFA版,适配 iOS14.5 开始 AppStore 审核要求用户许可访问IDFA数据
+ iOS平台 修复 3.1.11 版本引出的 横屏状态 toast 消息提示框 和 loading 提示框显示异常的Bug [详情](https://ask.dcloud.net.cn/question/121979)
+ iOS平台 修复 保存文件名称中存在中文时报错的Bug
+ iOS平台 修复 一键登录 授权登录时需要读取IDFA的Bug
#### 3.1.14.20210430-alpha
* 【uni-app】
+ App平台、小程序平台 新增 uni.getUserProfile 方法用于获取用户信息 [详情](https://uniapp.dcloud.io/api/plugins/login?id=getuserprofile)
......
#### 3.1.13.20210514
* 【uni-app】
+ App平台、H5平台 修复 3.1.11 版本引出的 textarea 组件固定 box-sizing 导致部分情况显示异常的Bug [详情](https://ask.dcloud.net.cn/question/121893)
+ App平台 修复 3.1.11 版本引出的 input 组件类型为 number 时在低版本 webview 失去焦点时报错的Bug [详情](https://ask.dcloud.net.cn/question/122328)
+ App平台 修复 3.1.2 版本引出的 dataset 使用驼峰写法时获取数据格式与其他平台不一致的Bug [详情](https://ask.dcloud.net.cn/question/119034)
+ H5平台 修复 3.1.2 版本引出的样式中包含媒体查询时部分 rpx 单位失效的Bug [#2600](https://github.com/dcloudio/uni-app/issues/2600)
* 【uniCloud】
+ clientDB 修复 删除记录、统计记录数时受字段权限影响的bug [详情](https://ask.dcloud.net.cn/question/122846)
+ unicloud-db组件 修复 联表查询时无法调用remove方法的问题 [详情](https://ask.dcloud.net.cn/question/122934)
* 【App插件(含5+App和uni-app的App端)】
+ Android平台 更新 腾讯X5内核版本为 4.3.0.93,解决X5内核渲染页面时获取的UA中不包含 MQQBrowser 关键字的Bug
+ 【重要】iOS平台 优化 广告标识 IDFA 操作逻辑,适配从 iOS14.5 开始 AppStore 审核要求用户许可收集跟踪数据 [详情](https://ask.dcloud.net.cn/article/36107)
+ iOS平台 修复 3.1.11 版本引出的 横屏状态 toast 消息提示框 和 loading 提示框显示异常的Bug [详情](https://ask.dcloud.net.cn/question/121979)
+ iOS平台 修复 一键登录 登录和其它登录按钮的默认圆角值不一致的Bug [详情](https://ask.dcloud.net.cn/question/121572)
+ iOS平台 修复 微信授权登录调用 authorize 动态传入 appid 参数不生效的Bug [详情](https://ask.dcloud.net.cn/question/121292)
#### 3.1.12.20210428
* 【uni-app】
+ App平台 修复 3.1.11 版本引出的 uni.chooseVideo 选取视频失败的Bug
......
......@@ -29,6 +29,7 @@
* [《uni-app 5小时快速入门》](https://www.imooc.com/learn/1215),出品人:meHaoTian
* [《uni-app 快速入门 从零开始实现新闻资讯类跨端应用》](https://coding.imooc.com/class/433.html),出品人:meHaoTian
* [《uni-app实战直播app全栈开发》](https://study.163.com/course/courseMain.htm?courseId=1210217810&share=2&shareId=480000001892585),出品人:帝莎IT学院
* [《uni-app博客实战开发教程》](https://ke.qq.com/course/3455428?tuin=258d8def),出品人:卢小兵
目前各大视频学习网站都有不少uni-app的学习资源,更多资源请点击搜索链接:
......
......@@ -17,8 +17,9 @@
### 看视频,只需25分钟,快速入门uniCloud
- [腾讯课堂视频教程](https://ke.qq.com/course/3416784?taid=11123338234831568&tuin=4025c735)
<a target="_blank" href="https://www.bilibili.com/video/BV17p4y1a71x?p=9">
<img src="https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/707756af-e9a9-4d08-8db9-5d1f34b84ea6.jpg" alt="腾讯课堂uniCloud视频教程" style="width: 70%;">
</a>
### uniCloud是什么和不是什么
......@@ -138,7 +139,7 @@ uniCloud最吸引人的是,它将开发效率提升了10倍以上。
开发效率提升10倍,并非某个杀手功能的功劳,而是庞大的生态共同的作用。本章节篇幅较长,请耐心阅读。
![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/c50d2741-6a47-4dcd-a02c-fdd683fa4ea4.png)
![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/80364c0b-2dd8-4629-b0f7-cbead0df7922.png)
#### 一个故事
2020年初,uniCloud刚发布,新冠肺炎突然来袭,各地涌现大量抗疫项目需求。
......@@ -181,7 +182,8 @@ uni云端一体生态的内容太多,让我们抽丝剥茧、归纳分类,
下面列举些常用的轮子
1. 官方维护的插件
**1. 官方维护的插件**
- uni-id:不用再开发用户系统。用户注册、登录(含社交登录、短信验证码登录、App一键登录)、修改或重置密码、token管理、图形验证码、RBAC权限角色系统...所有与用户相关的,不管前端还是云端,代码都是现成的。[详见](https://uniapp.dcloud.net.cn/uniCloud/uni-id)
- uniPay:不管微信还是支付宝,不管App、微信小程序、还是支付宝小程序,不管前端还是服务端,一切都现成的,拿来即用。[详见](https://uniapp.dcloud.net.cn/uniCloud/unipay)
- uSearch:云端一体搜索。搜索页面、输入联想、搜索历史记录、热搜词分析提取...一应俱全。[详见](https://ext.dcloud.net.cn/plugin?id=3851)
......@@ -189,7 +191,8 @@ uni云端一体生态的内容太多,让我们抽丝剥茧、归纳分类,
- uni-file-picker:前端直传uniCloud存储组件。[详见](https://ext.dcloud.net.cn/plugin?id=4079)
- uni-captcha:云端一体图形验证码组件。[详见](https://ext.dcloud.net.cn/plugin?id=4048)
2. 社区的优秀插件
**2. 社区的优秀插件**
- cms
- 城市选择
- banner管理
......@@ -200,9 +203,11 @@ uni云端一体生态的内容太多,让我们抽丝剥茧、归纳分类,
- push
- 图表统计
3. 项目模板
**3. 项目模板**
上面的轮子,是与业务无关的通用轮子。除此之外,还有大量的云端一体的项目模板。
使用这些现成的项目模板,那开发效率更是极大幅的提升。过去5、6人月的项目,现在几天就能搞定上线!
| | | |
|-- |-- |-- |
|电商 |博客 |排班 |
......@@ -213,7 +218,7 @@ uni云端一体生态的内容太多,让我们抽丝剥茧、归纳分类,
|新闻 |考勤打卡 |红包封面 |
在这里,我们还必须提到2个新概念:uni_module和datacom
在这里,我们还必须提到2个新概念:`uni_module``datacom`
- uni_module:云端一体组件最佳的承载方式。传统的npm无法处理云端一体的需求,把前端和云端的代码,一起打包到一个uni_module中,整体传播与发布,对云端一体组件的生态有重大的帮助。[详见](https://uniapp.dcloud.net.cn/uni_modules)
- datacom:datacom是一种在前端绑定后端数据源的组件。[详见](https://uniapp.dcloud.net.cn/component/datacom)
......@@ -300,7 +305,7 @@ HBuilderX提升了uni-app的开发效率,自然也将提升uniCloud的开发
![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/88f093d0-1abd-487d-bf24-e0627c471977.jpg)
#### 第层提效:语言统一的价值
#### 第层提效:语言统一的价值
前端和云端都使用js编程语言,提高了沟通效率。
......@@ -310,7 +315,7 @@ js和其他服务器语言,比如php或java,在过去需要Mock来翻译,
由于统一了技术栈,招聘效率、管理效率也会相应提升。。
#### 第层提效:测试效率的提升
#### 第层提效:测试效率的提升
代码量的减少到原来的十分之一,这自然可以让code review效率和白盒测试的效率也提升了十倍。
......@@ -318,7 +323,7 @@ js和其他服务器语言,比如php或java,在过去需要Mock来翻译,
现在,开发、测试都将变的更加轻松。
#### 第层提效:serverless让开发者专注于业务,无需分心运维
#### 第层提效:serverless让开发者专注于业务,无需分心运维
因为serverless的免运维特点,开发商再也不用操心扩容、高并发、ddos攻击、安全漏洞补丁等一系列麻烦事。只需专注于自己的业务。
......
......@@ -12,7 +12,7 @@
* [数据库索引](uniCloud/db-index.md)
* [前端操作数据库的API及JQL语法](uniCloud/clientdb.md)
* [unicloud-db前端组件](uniCloud/unicloud-db.md)
* [JQL查询调试器](uniCloud/jql-runner.md)
* [JQL数据库管理](uniCloud/jql-runner.md)
* [openDB](https://gitee.com/dcloud/opendb)
* [性能优化](uniCloud/db-performance.md)
* 云函数
......
......@@ -300,11 +300,11 @@ admin 提供了两个内置方法,方便在页面中鉴定登录用户权限
- 体验账号:admin 密码:123456
##### 2. 创建权限。在uniCloud admin左侧菜单的权限管理,新增权限“查询信息”,标识为“read”
![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/4f4333ed-2a54-4e98-85b6-ec5095a43805.jpg)
![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/ab997406-d36e-4d42-87ab-339bd5a8a50a.jpg)
##### 3. 创建角色。在左侧菜单的角色管理里,新增角色“普通成员”,标识为“member”,绑定上面的“查询信息”权限
![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/f3b563b3-3e86-4823-9373-64c9bebdd51c.jpg)
##### 4. 创建账户并赋予角色。在左侧菜单的用户管理里,添加用户“张三”,然后给用户赋予角色“普通成员”
![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/16f173a2-e889-404b-b509-346d3b929a0d.jpg)
![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/18676740-4be8-419b-8c12-40559ded1413.jpg)
##### 5.如果你退出账户,登陆刚刚创建的账户张三。我们发现会提示:该账户没有被赋予登录admin系统的权限, 请联系系统管理员绑定角色赋权限。因为:你登陆的账户没有访问任何admin系统菜单的权限,所以不能访问admin系统。
![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/0b627d45-da68-435b-995b-a191e7330624.jpg)
##### 6.设置有查询信息权限的人,拥有访问admin系统菜单"用户管理"的权限。在左侧菜单的菜单管理里,找到菜单“用户管理”,点修改,在权限列表里勾选“查询信息”,也就是有查询信息权限的人,可以看到本菜单
......
......@@ -7,14 +7,14 @@
以下面的目录结构为例,介绍一下如何使用。
```
|--cloudfunctions
|--common // 云函数公用模块目录
|--hello-common // 云函数公用模块
|--package.json
|--index.js // 公用模块代码,可以不使用index.js,修改 package.json 内的 main 字段可以指定此文件名
|--use-common // 使用公用模块的云函数
|--package.json // 在 use-common 目录执行 npm init -y 生成
|--index.js // 云函数入口文件
cloudfunctions
├─common // 云函数公用模块目录
| └─hello-common // 云函数公用模块
| ├─package.json
| └─index.js // 公用模块代码,可以不使用index.js,修改 package.json 内的 main 字段可以指定此文件名
└─use-common // 使用公用模块的云函数
├─package.json // 在 use-common 目录执行 npm init -y 生成
└─index.js // 云函数入口文件
```
**创建并引入公用模块**
......
......@@ -1244,7 +1244,7 @@ const res = await db.collection('query').doc('1').update({
const res = await db.collection('query').where({
'students.id': '001'
}).update({
// 将students内id为001的name改为li
// 将students内id为001的name改为li,$代表where内匹配到的数组项的序号
'students.$.name': 'li'
})
```
......@@ -1765,8 +1765,6 @@ let res = await db.collection('user').where({
> 事务因为要锁行,是有时间限制的。从事务开始到事务提交/回滚,时间不可超过10s。
> 事务因为要锁行,是有时间限制的。从事务开始到事务提交/回滚,时间不可超过10s。
### runTransaction
**阿里云不支持此用法,请换成startTransaction以使用事务**
......@@ -2499,7 +2497,6 @@ let res = await db.collection('items').aggregate()
|---- |---- |---- |---- |---- |
|near |GeoPoint | |是 |GeoJSON Point,用于判断距离的点 |
|spherical |true | |是 |必填,值为 true |
|limit |number | |否 |限制返回记录数 |
|maxDistance |number | |否 |距离最大值 |
|minDistance |number | |否 |距离最小值 |
|query |Object | |否 |要求记录必须同时满足该条件(语法同 where) |
......
......@@ -201,6 +201,33 @@ console.log(res)
}
}
```
**发送formdata类型数据**
实际业务中常有使用云函数发送formdata类型数据的需求,比如微信小程序提供的一些服务端接口(图片内容安全检测、识别图片二维码等),可以参考以下示例进行发送
```js
'use strict';
const fs = require('fs')
const path = require('path')
const FormData = require('form-data'); // 此form-data需要使用npm安装,地址:https://www.npmjs.com/package/form-data
exports.main = async (event, context) => {
const form = new FormData()
form.append('media', fs.readFileSync(path.resolve(__dirname, './test.jpg')), { // 为方便演示此处直接使用云函数目录下的test.jpg文件
filename: 'test.jpg',
contentType: 'image/jpeg'
});
form.append('otherParam', 'otherParam content');
const res = await uniCloud.httpclient.request('https://httpbin.org/post', {
method: 'POST',
content: form.getBuffer(), // 请求内容
headers: form.getHeaders(), // 请求头
dataType: 'json' // 此处指定为json表示将此请求的返回值解析为json
})
return res
};
```
## 使用npm
......@@ -439,6 +466,7 @@ package.json是一个标准json文件,不可带注释。下面是一个package
- 在web控制台修改云函数配置后,通过HBuilderX的下载云函数菜单会在package.json内添加修改后的云函数配置
- 上传云函数时,如果项目下的package.json内包含云函数配置会同时进行云函数的配置更新
- package.json只有云端部署才生效,本地运行不生效。
- cloudfunction-config不可删除云端配置。例:云端已配置triggers(定时触发器),删除cloudfunction-config内的trigger不会删掉云端的定时触发器
## 使用cloudfunctions_init初始化云函数@init
......
......@@ -14,24 +14,30 @@ uniCloud分为客户端和云端两部分,有些接口名称相同,参数也
|uniCloud.uploadFile() |客户端直接上传文件到云存储 [详情](https://uniapp.dcloud.net.cn/uniCloud/storage?id=uploadfile) |
|uniCloud.getTempFileURL() |客户端获取云存储文件的临时路径 [详情](https://uniapp.dcloud.net.cn/uniCloud/storage?id=gettempfileurl) |
|uniCloud.chooseAndUploadFile() |客户端选择文件并上传 [详情](https://uniapp.dcloud.net.cn/uniCloud/storage?id=chooseanduploadfile) |
|uniCloud.getCurrentUserInfo() |获取当前用户信息 [详情](https://uniapp.dcloud.net.cn/uniCloud/storage?id=client-getcurrentuserinfo) |
|uniCloud.getCurrentUserInfo() |获取当前用户信息 [详情](https://uniapp.dcloud.io/uniCloud/client-sdk?id=client-getcurrentuserinfo) |
|uniCloud.init() |同时使用多个服务空间时初始化额外服务空间 [详情](https://uniapp.dcloud.net.cn/uniCloud/init) |
### 获取当前用户信息@client-getcurrentuserinfo
### 获取当前用户信息getCurrentUserInfo@client-getcurrentuserinfo
新增于HBuilderX 3.1.0版本,通过解析客户端token获取用户信息,不会发送网络请求,**注意这个仅仅是客户端接口,不校验token的合法性**
> HBuilderX 3.1.0+
> 需要搭配uni-id使用并要求客户端必须将token存储在storage内的`uni_id_token`内
解析客户端token获取用户信息。常用于在前端判断当前登录的用户状态和用户权限,比如根据不同的权限显示隐藏某些按钮。
注意:不会发送网络请求,**注意这个仅仅是客户端接口,不校验token的合法性**
注意:需要搭配uni-id使用并要求客户端必须将token存储在storage内的`uni_id_token`
用法:`uniCloud.getCurrentUserInfo()`
该方法为同步方法。
**响应参数**
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| uid | Number| 是 |当前用户uid |
| role | Array | 是 |用户角色列表 |
| permission| Array | 是 |用户权限列表,admin角色此数组为空|
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| uid | Number|当前用户uid |
| role | Array |用户角色列表。admin用户返回["admin"] |
| permission | Array |用户权限列表。注意admin角色此数组为空|
未能获取用户信息时返回以下结果
......@@ -43,6 +49,86 @@ uniCloud分为客户端和云端两部分,有些接口名称相同,参数也
}
```
**示例**
```js
console.log(uniCloud.getCurrentUserInfo().role.indexOf('admin')>-1); // 如果是admin用户的话,打印结果为true
```
<!-- ### 新增拦截器@add-interceptor
```
+ clientDB客户端sdk 新增 添加拦截器、移除拦截器API [详情](https://uniapp.dcloud.net.cn/uniCloud/client-sdk?id=add-interceptor)
```
接口形式:`uniCloud.addInterceptor(String apiName, Object interceptorMap)`
**平台兼容性**
|阿里云 |腾讯云 |
|---- |---- |
|√ |√ |
**入参说明**
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| apiName | string| 是 | 要拦截的Api名称,可选值:callFunction、database、uploadFile |
| interceptorMap| object| 是 | 要添加的拦截器 |
**interceptorMap参数说明**
|参数名 |类型 |必填 |默认值 |说明 |平台差异说明 |
|--- |--- |--- |--- |--- |--- |
|invoke |Function |否 | |拦截前触发 | |
|success |Function |否 | |成功回调拦截 | |
|fail |Function |否 | |失败回调拦截 | |
|complete |Function |否 | |完成回调拦截 | |
示例
```js
uniCloud.addInterceptor('callFunction', {
invoke(param) {
// param为拦截Api的参数 例 {name: 'functionName', data: {'functionParam1': 1, 'functionParam2': 2}}
// 此处返回错误可终止api执行
},
success(res) {
// res为callFunction的返回值,此处可以对返回值进行修改
},
fail(err) {
// err为callFunction抛出的错误
},
complete(res){
// complete内res为上面的res或err
}
})
```
### 移除拦截器@remove-interceptor
接口形式:`uniCloud.removeInterceptor(String apiName, Object interceptorMap)`
**入参说明**
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| apiName | string| 是 | 要拦截的Api名称,可选值:callFunction、database、uploadFile |
| interceptorMap| object| 是 | 要移除的拦截器,选填,不传递此参数时移除此Api所有拦截器 |
**interceptorMap参数说明**
|参数名 |类型 |必填 |默认值 |说明 |平台差异说明 |
|--- |--- |--- |--- |--- |--- |
|invoke |Function |否 | |拦截前触发 | |
|success |Function |否 | |成功回调拦截 | |
|fail |Function |否 | |失败回调拦截 | |
|complete |Function |否 | |完成回调拦截 | |
**注意:**
- 要移除的拦截器内方法需和添加的方法一致才可以移除 -->
## 属性
### 获取当前uniCloud实例的服务商
......
......@@ -4,6 +4,8 @@
> `HBuilderX 2.9.5`以前的用户如使用过`clientDB`,在升级后请将`clientDB`的前端库和云函数删除,新版已经在前端和云端内置了`clientDB`
大白话:传统的数据库操作只能在服务端实现,因为他在前端使用有安全问题。而uniCloud的云数据库有表结构(DB Schema)他通过简单的js表达式,配置了:各种角色权限的账号是否可以读取和写入某种规范的数据等,解决了在前端操作的安全问题;因此uniCloud的云数据库可以直接在前端调用。
使用`clientDB`的好处:**不用写服务器代码了!**
1个应用开发的一半的工作量,就此直接省去。
......@@ -263,7 +265,7 @@ sql写法,对js工程师而言有学习成本,而且无法处理非关系型
```js
const db = uniCloud.database()
// 上面的示例中的where条件可以使用以下写法
// 使用`jql`查询list表内`name`字段值为`hello-uni-app`的记录
db.collection('list')
.where('name == "hello-uni-app"')
.get()
......@@ -293,11 +295,11 @@ sql写法,对js工程师而言有学习成本,而且无法处理非关系型
以下变量同[前端环境变量](uniCloud/database.md?id=variable)
|参数名 |说明 |
|:-: |:-: |
|$env.uid |用户uid,依赖uni-id|
|$env.now |服务器时间戳 |
|$env.clientIP|当前客户端IP |
|参数名 |说明 |
|:-: |:-: |
|$cloudEnv_uid |用户uid,依赖uni-id|
|$cloudEnv_now |服务器时间戳 |
|$cloudEnv_clientIP |当前客户端IP |
**jql条件语句的运算符**
......@@ -319,8 +321,6 @@ sql写法,对js工程师而言有学习成本,而且无法处理非关系型
具体到这个正则 `/abc/.test(content)`,类似于sql中的`content like '%abc%'`,即查询所有字段content包含abc的数据记录。
**云函数中node版本为8.9不支持正则断言**
**注意编写查询条件时,除test外,均为运算符左侧为数据库字段,右侧为常量**
#### 查询数组字段@querywitharr
......@@ -389,7 +389,7 @@ sql写法,对js工程师而言有学习成本,而且无法处理非关系型
### JQL联表查询@lookup
> clientDB将于2021年4月26日优化联表查询策略,详情参考:[联表查询策略调整](https://ask.dcloud.net.cn/article/38966)
> clientDB于2021年4月28日优化了联表查询策略,详情参考:[联表查询策略调整](https://ask.dcloud.net.cn/article/38966)
`JQL`提供了更简单的联表查询方案。不需要学习join、lookup等复杂方法。
......@@ -533,7 +533,7 @@ db.collection('order')
as: 'book_id'
})
.match({
book: {
book_id: {
title: '三国演义'
}
})
......@@ -556,7 +556,7 @@ db.collection('order')
as: 'book_id'
})
.match({
book: {
book_id: {
title: '三国演义'
}
})
......@@ -599,6 +599,58 @@ db.collection('order')
不止js,`<unicloud-db>`组件也支持所有`jql`功能,包括联表查询。
在前端页面调试JQL联表查询且不过滤字段时会受权限影响,导致调试比较困难。可以通过HBuilderX提供的[JQL数据库管理](uniCloud/jql-runner.md)功能方便的查看联表查询时的虚拟表结构。
如上述查询可以直接在`JQL文件`中执行以下代码查看完整的虚拟表字段
```js
db.collection('order,book').get()
```
#### 设置字段别名@lookup-field-alias
联表查询时也可以在field内对字段进行重命名,写法和简单查询时别名写法类似,`原字段名 as 新字段名`即可。[简单查询时的字段别名](uniCloud/clientdb.md?id=alias)
仍以上述order、book两个表为例,以下查询将联表查询时order表的quantity字段重命名为order_quantity,将book表的title重命名为book_title、author重命名为book_author
```js
// 客户端联表查询
const db = uniCloud.database()
db.collection('order,book')
.where('book_id.title == "三国演义"')
.field('book_id{title as book_title,author as book_author},quantity as order_quantity')
.get()
.then(res => {
console.log(res);
}).catch(err => {
console.error(err)
})
```
查询结果如下
```js
{
"code": "",
"message": "",
"data": [{
"_id": "b8df3bd65f8f0d06018fdc250a5688bb",
"book_id": [{
"book_author": "罗贯中",
"book_title": "三国演义"
}],
"order_quantity": 555
}, {
"_id": "b8df3bd65f8f0d06018fdc2315af05ec",
"book_id": [{
"book_author": "罗贯中",
"book_title": "三国演义"
}],
"order_quantity": 333
}]
}
```
#### 手动指定使用的foreignKey@lookup-foreign-key
如果存在多个foreignKey且只希望部分生效,可以使用foreignKey来指定要使用的foreignKey
......@@ -615,7 +667,6 @@ db.collection('comment,user')
**注意**
- field参数字符串内没有冒号
- 联表查询时关联字段会被替换成被关联表的内容,因此不可在where内使用关联字段作为条件。举个例子,在上面的示例,`where({book_id:"1"})`,但是可以使用`where({'book_id._id':"1"})`
- 上述示例中如果order表的`book_id`字段是数组形式存放多个book_id,也跟上述写法一致,clientDB会自动根据字段类型进行联表查询
- 各个表的_id字段会默认带上,即使没有指定返回
......@@ -623,15 +674,51 @@ db.collection('comment,user')
#### 副表foreignKey联查@st-foreign-key
`2021年4月28日`之前的clientDB版本,只支持主表的foreignKey,把副本内容嵌入主表的foreignKey字段下面。不支持处理副本的foreignKey。(如果你觉得能用,其实是bug,查出来的数是乱的,别依赖这种写法)
`2021年4月28日`之前的clientDB版本,只支持主表的foreignKey,把副表内容嵌入主表的foreignKey字段下面。不支持处理副本的foreignKey。
`2021年4月28日`调整后,新版支持副表foreignKey联查。副表的数据以数组的方式嵌入到主表中作为一个虚拟表使用。
调整后,新版将正式支持副表foreignKey联查。将把副表的数据以数组的方式嵌入到主表中。
**关联查询后的数据结构如下:**
> 通过HBuilderX提供的[JQL数据库管理](uniCloud/jql-runner.md)功能方便的查看联表查询时的虚拟表结构
主表某字段foreignKey指向副表时
```js
{
"主表字段名1": "xxx",
"主表字段名2": "xxx",
"主表内foreignKey指向副表的字段名": [{
"副表字段名1": "xxx",
"副表字段名2": "xxx",
}]
}
```
副表某字段foreignKey指向主表时
```js
{
"主表字段名1": "xxx",
"主表字段名2": "xxx",
"副表foreignKey指向的主表字段名": {
"副表1表名": [{ // 一个主表字段可能对应多个副表字段的foreignKey
"副表1字段名1": "xxx",
"副表1字段名2": "xxx",
}],
"副表2表名": [{ // 一个主表字段可能对应多个副表字段的foreignKey
"副表2字段名1": "xxx",
"副表2字段名2": "xxx",
}],
"_value": "主表字段原始值" // 使用副表foreignKey查询时会在关联的主表字段内以_value存储该字段的原始值,新增于HBuilderX 3.1.16-alpha
}
}
```
例:
数据库内schema及数据如下:
```js
// comment - 评论表
......@@ -753,7 +840,7 @@ db.collection('comment,user')
```js
db.collection('article,comment')
.where('article_id=="1"')
.where('article_id._value=="1"')
.field('content,article_id')
.get()
```
......@@ -764,7 +851,7 @@ db.collection('article,comment')
[{
"content": "content1",
"article_id": {
"comment": [{ // 逆向foreignKey查询时此处会自动插入一层副表表名
"comment": [{ // 使用副表foreignKey查询时此处会自动插入一层副表表名
"comment_id": "1-1",
"content": "comment1-1",
"article": "1",
......@@ -777,7 +864,8 @@ db.collection('article,comment')
"article": "1",
"sender": "2",
"receiver": "1"
}]
}],
"_value": "1"
}
}]
```
......@@ -787,7 +875,7 @@ db.collection('article,comment')
```js
// 过滤副表字段
db.collection('article,comment')
.where('article_id=="1"')
.where('article_id._value=="1"')
.field('content,article_id{comment{content}}')
.get()
......@@ -795,11 +883,36 @@ db.collection('article,comment')
[{
"content": "content1",
"article_id": {
"comment": [{ 使用副本foreignKey联查时此处会自动插入一层副表表名
"comment": [{ // 使用副表foreignKey联查时此处会自动插入一层副表表名
"content": "comment1-1"
},
{
"content": "comment1-2"
}],
"_value": "1"
}
}]
```
副表内的字段也可以使用`as`进行重命名,例如上述查询中如果希望将副表的content重命名为value可以使用如下写法
```js
// 重命名副表字段
db.collection('article,comment')
.where('article_id._value=="1"')
.field('content,article_id{comment{content as value}}')
.get()
// 查询结果如下
[{
"content": "content1",
"article_id": {
"comment": [{ // 使用副本foreignKey联查时此处会自动插入一层副表表名
"value": "comment1-1"
},
{
"value": "comment1-2"
}]
}
}]
......@@ -1026,6 +1139,26 @@ db.collection('order,book') // 注意collection方法内需要传入所有用到
.get()
```
**不使用`{}`过滤副表字段**
> 此写法于2021年4月28日起支持
field方法内可以不使用`{}`进行副表字段过滤,以上面示例为例可以写为
```js
const db = uniCloud.database()
db.collection('order,book')
.where('book_id.title == "三国演义"')
.field('book_id.title,book_id.author,quantity as order_quantity') // book_id.title、book_id.author为副表字段,使用别名时效果和上一个示例不同,请见下方说明
.orderBy('order_quantity desc') // 按照order_quantity降序排列
.get()
.then(res => {
console.log(res);
}).catch(err => {
console.error(err)
})
```
### 字段别名as@alias
`2020-11-20`起clientDB jql写法支持字段别名,主要用于在前端需要的字段名和数据库字段名称不一致的情况下对字段进行重命名。
......@@ -1034,6 +1167,71 @@ db.collection('order,book') // 注意collection方法内需要传入所有用到
仍以上面的order表和book表为例
```js
// 客户端联表查询
const db = uniCloud.database()
db.collection('book')
.where('title == "三国演义"')
.field('title as book_title,author as book_author')
.get()
.then(res => {
console.log(res);
}).catch(err => {
console.error(err)
})
```
上述查询返回结果如下
```js
{
"code": "",
"message": "",
"data": [{
"_id": "3",
"book_author": "罗贯中",
"book_title": "三国演义"
}]
}
```
> _id是比较特殊的字段,如果对_id设置别名会同时返回_id和设置的别名字段
例:
```js
// 客户端联表查询
const db = uniCloud.database()
db.collection('book')
.where('title == "三国演义"')
.field('_id as book_id,title as book_title,author as book_author')
.get()
.then(res => {
console.log(res);
}).catch(err => {
console.error(err)
})
```
上述查询返回结果如下
```js
{
"code": "",
"message": "",
"data": [{
"_id": "3",
"book_id": "3",
"book_author": "罗贯中",
"book_title": "三国演义"
}]
}
```
#### 联表查询时字段别名
联表查询时字段别名写法和简单查询类似
```js
// 客户端联表查询
const db = uniCloud.database()
......@@ -1073,25 +1271,6 @@ db.collection('order,book')
}
```
**不使用`{}`过滤副表字段**
> 此写法于2021年4月28日起支持
field方法可以不使用`{}`进行副表字段过滤,以上面示例为例可以写为
```js
const db = uniCloud.database()
db.collection('order,book')
.where('book_id.title == "三国演义"')
.field('book_id.title,book_id.author,quantity as order_quantity') // book_id.title、book_id.author为副表字段,使用别名时效果和上一个示例不同,请见下方说明
.orderBy('order_quantity desc') // 按照order_quantity降序排列
.get()
.then(res => {
console.log(res);
}).catch(err => {
console.error(err)
})
```
副表字段使用别名需要注意,如果写成`.field('book_id.title as book_id.book_title,book_id.author,quantity as order_quantity')` book_title将会是由book_id下每一项的title组成的数组,这点和mongoDB内数组表现一致
......@@ -1132,7 +1311,7 @@ db.collection('order,book')
**注意**
- as后面的别名,不可以和表schema中已经存在的字段重名
- 上面的查询指令中,上一阶段处理结果输出到下一阶段,上面的例子中表现为where中使用的是原名,orderBy中使用的是别名
- mongoDB查询指令中,上一阶段处理完毕将结果输出到下一阶段。在上面的例子中表现为where中使用的是原名,orderBy中使用的是别名
- 目前不支持对联表查询的关联字段使用别名,即上述示例中的book_id不可设置别名
### 各种字段运算方法@operator
......@@ -1423,7 +1602,7 @@ department部门表的schema中,将字段`parent_id`的"parentKey"设为"_id"
parentKey字段将数据表不同记录的父子关系描述了出来。查询就可以直接写了。
注意一个表内只能有一个父子关系,即一个表的schema里只能配置一份parentKey
注意:一个表的一次查询中只能有一个父子关系。如果一个表的schema里多个字段均设为了parentKey,那么需要在JQL中通过parentKey()方法指定某个要使用的parentKey字段
schema里描述好后,查询就变的特别简单。
......@@ -1634,6 +1813,22 @@ db.collection("department")
}
```
**通过parentKey方法指定某个parentKey**
如果表的schema中有多个字段都配置了parentKey,但查询时其实只能有一个字段的parentKey关系可以生效,那么此时就需要通过parentKey()方法来指定这次查询需要的哪个parentKey关系生效。
parentKey()方法的参数是字段名。
```js
db.collection('department')
.parentKey('parent_id') // 如果表schema只有一个字段设了parentKey,其实不需要指定。有多个字段被设parentKey才需要用这个方法指定
.get({
getTree: true
})
```
**示例**
插件市场有一个 家谱 的示例,可以参阅:[https://ext.dcloud.net.cn/plugin?id=3798](https://ext.dcloud.net.cn/plugin?id=3798)
......@@ -2870,8 +3065,6 @@ action支持一次使用多个,比如使用`db.action("action-a,action-b")`,
action是一种特殊的云函数,它不占用服务空间的云函数数量。
**目前action还不支持本地运行。后续会支持。**
**新建action**
![新建action](https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-dc-site/b6846d00-1460-11eb-b997-9918a5dda011.jpg)
......@@ -2972,6 +3165,15 @@ module.exports = {
**如需在before和after内传参,建议直接在state上挂载。但是切勿覆盖上述属性**
### action内可以使用的公共模块
目前clientDB依赖了`uni-id`,uni-id 3.0.7及以上版本又依赖了`uni-config-center`,这两个公共模块是可以在action内使用的。
**参考:**
- [uni-id 文档](https://uniapp.dcloud.net.cn/uniCloud/uni-id)
- [uni-config-center 文档](https://ext.dcloud.net.cn/plugin?id=4425)
## 数据库运算方法列表@aggregate-operator
uniCloud的云数据库,提供了一批强大的运算方法。这些方法是数据库执行的,而不是云函数执行的。
......
一个服务空间对应一整套独立的云开发资源,包括数据库、存储空间、云函数等资源。服务空间之间彼此隔离。
每个服务空间都有一个全局唯一的space ID。未来会支持一个应用同时连接多个服务空间,届时需要在代码中声明space ID以告诉代码要连接哪个云服务空间。
每个服务空间都有一个全局唯一的space ID。
开发者可在 HBuilderX 中新建服务空间,如下:
......
......@@ -208,7 +208,7 @@ uniCloud的每个云函数是一个独立进程,不存在云函数级别的多
### 海外用户访问比较慢怎么办
uniCloud服务商为阿里云时支持配置全球加速,步骤如下:
国外用户需要使用全球加速。uniCloud服务商为阿里云时支持配置全球加速,步骤如下:
1. 参考[阿里云全球加速](https://help.aliyun.com/document_detail/153198.html)文档,开通服务并对`自有域名`进行加速
2. 将上述域名CNAME到`api.bspapp.com`
......
......@@ -103,6 +103,8 @@ js中敲下代码块`cdb`,即可快速输入上述代码。
**DBOptions参数说明**
> DBOptions仅腾讯云在云函数内可用
|字段 |类型 |必填 |描述 |平台差异说明 |
|:-: |:-: |:-: |:-: |:-: |
|spaceId|String |否 |同一账号下的,服务空间ID |仅腾讯云支持 |
......@@ -163,7 +165,11 @@ data很简单,就是存放的数据记录(record)。
`_id`字段是每个数据表默认自带且不可删除的字段。同时,它也是数据表的索引。
`_id`长度是12位,它是自增的,后创建的记录的`_id`总是大于先生成的`_id`。传统数据库的自然数自增字段在多物理机的大型数据库下很难保持同步,大型数据库均使用`_id`这种长度较长、不会重复且仍然保持自增规律的方式。
阿里云使用的是标准的mongoDB,`_id`是自增的,后创建的记录的`_id`总是大于先生成的`_id`。传统数据库的自然数自增字段在多物理机的大型数据库下很难保持同步,大型数据库均使用`_id`这种长度较长、不会重复且仍然保持自增规律的方式。
**腾讯云使用的是兼容mongoDB的自研数据库,`_id`并非自增**
插入/导入数据时也可以自行指定`_id`而不使用自动生成的`_id`,这样可以很方便的将其他数据库的数据迁移到uniCloud云数据库
### 数据库索引@dbindex
......@@ -289,7 +295,7 @@ uniCloud数据库提供了多种数据导入导出和备份方案。
"MgoIsSparse": false // 是否为稀疏索引,请参考 https://uniapp.dcloud.net.cn/uniCloud/db-index.md?id=sparse
}
}],
"schema": {
"schema": { // HBuilderX 3.0.0以上版本schema不在此处,而是放在database目录下单独的`表名.schema.json`文件内
"bsonType": "object",
"permission": {
".read": true,
......@@ -349,8 +355,6 @@ uniCloud数据库提供了多种数据导入导出和备份方案。
### 数据库回档备份和恢复@backup
**此功能暂时只有腾讯云支持**
uniCloud腾讯云版会在每天自动备份一次数据库,最多保留7天。这让开发者不再担心数据丢失。
**操作说明**
......
......@@ -85,12 +85,13 @@ DCloud为开发者提供了`uni发布平台`,包括网站发布、App发布和
### 配置域名@domain
`前端网页托管`,自带一个测试域名,可快速体验前端网页部署的完整流程,但该域名有如下限制:
+ 阿里云每分钟最多60次请求
`前端网页托管`,自带一个测试域名,仅用于产品体验及测试可快速体验前端网页部署的完整流程,该域名有如下限制:
+ 阿里云每分钟最多60次请求,默认每日仅允许10个公网IP访问,超出部分,需通过手动方式将来源IP加入白名单,IP白名单也会有数量限制
+ 腾讯云限速100K/s
业务如要上线商用,请配置自己的正式域名,配置自己的正式域名后,将不受上述测试域名的限制。(尤其注意阿里云测试域名是公共的,任意一个服务空间如果有上传恶意文件被投诉,会导致测试域名被微信内置浏览器整体禁封)
前端网页托管配置自己域名的步骤如下:
1、登录[uniCloud控制台](https://unicloud.dcloud.net.cn/)
......@@ -131,6 +132,8 @@ DCloud为开发者提供了`uni发布平台`,包括网站发布、App发布和
**重定向规则**
> 仅腾讯云支持
支持以下三种组合配置
- 类型:错误码、规则:替换路径。将特定错误码的请求重定向到目标文档,仅支持对4xx错误码。
......@@ -159,6 +162,8 @@ DCloud为开发者提供了`uni发布平台`,包括网站发布、App发布和
### 缓存配置@cache
> 仅腾讯云支持
- 文件类型:根据填入的文件后缀进行缓存过期时间设置,格式为.jpg形式,不同后缀之间用;间隔。
- 文件夹:根据填入的目录路径进行缓存过期时间设置,格式为/test形式,无需以/结尾,不同目录之间用;间隔。
- 全路径文件:指定完整的文件路径进行缓存过期时间设置,格式为/index.html,支持完整路径加文件类型匹配模式,如/test/*.jpg。
......@@ -171,6 +176,8 @@ DCloud为开发者提供了`uni发布平台`,包括网站发布、App发布和
### 防盗链配置@referer
> 仅腾讯云支持
**referer 黑名单:**
- 若请求的 referer 字段匹配黑名单内设置的内容,CDN 节点拒绝返回该请求信息,直接返回403状态码。
......@@ -191,6 +198,8 @@ DCloud为开发者提供了`uni发布平台`,包括网站发布、App发布和
### IP黑白名单配置@ip-filter
> 仅腾讯云支持
**IP 黑名单**
用户端 IP 匹配黑名单中的 IP 或 IP 段时 ,访问 CDN 节点时将直接返回403状态码。
......@@ -206,8 +215,18 @@ DCloud为开发者提供了`uni发布平台`,包括网站发布、App发布和
- 不支持IP:端口形式的黑白名单
- 名单最多可输入50个。
### 默认域名IP白名单@default-domain-ip-whitelist
> 仅阿里云支持
为保障默认域名不被滥用,阿里云对默认域名做出了如下限制:每天前10个IP可以直接访问,超出10个IP后需要配置IP白名单才可以访问
仅支持配置ipv4,可以配置IP或者IP网段,掩码位数取值范围24-31。最多可同时配置三个,多个之间用逗号隔开,如:123.120.5.235/24,123.123.123.123
### IP访问限频配置@ip-freq
> 仅腾讯云支持
**配置说明**
- 配置开启后,超出 QPS 限制的请求会直接返回514,设置较低频次限制可能会影响您的正常高频用户的使用,请根据业务情况、使用场景合理设置阈值。
......
......@@ -30,16 +30,22 @@
**目前阿里云不支持绑定自定义域名,只能使用其默认提供的域名,但是需要手动在【云函数域名绑定】处开启云函数Url化开关**
**2021年5月25日起腾讯云绑定域名CNAME记录值由默认域名调整为腾讯云给定的`CNAME域名`,已经绑定正常使用的域名无需调整**
1. 单击左侧菜单栏【云函数】,进入云函数页面。
2. 单击【云函数域名绑定】,在弹出的配置窗口中进行配置。
<img style="max-width:800px;height:auto;" src="https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-dc-site/55897b30-5993-11eb-8ff1-d5dcf8779628.jpg"></img>
>- 每个服务空间最多绑定1个自定义域名。
>- uniCloud提供默认域名供体验和测试该特性。
>- 绑定自定义域名之前,请先设置您默认域名的 CNAME 记录值为默认域名,CNAME 记录不存在时会导致域名绑定失败,另外需要注意的是此域名必须已经备案。
>- 单个服务空间可支持被访问的最大 QPS 为5000,单个云函数可支持被访问的最大 QPS 为2000(具体频次受函数并发限制)。
>- 默认域名可支持被访问的最大 QPS 为200,推荐您绑定自定义域名以获取更大的访问频次。
上一步中填写域名证书且绑定成功后会返回一个`CNAME域名`,将绑定的域名配置CNAME记录值为此`CNAME域名`即可
**注意**
- 每个服务空间最多绑定1个自定义域名
- uniCloud提供默认域名供体验和测试该特性
- 需要注意的是绑定的域名必须已经备案
- 单个服务空间可支持被访问的最大 QPS 为5000,单个云函数可支持被访问的最大 QPS 为2000(具体频次受函数并发限制)
- 默认域名可支持被访问的最大 QPS 为200,推荐您绑定自定义域名以获取更大的访问频次
如需要更高的QPS支持,请发邮件到service@dcloud.io申请。若您还没有SSL证书,点此[快速获取](https://cloud.tencent.com/act/cps/redirect?redirect=33848&cps_key=c858f748f10419214b870236b5bb94c6)
......
## JQL查询调试器简介
## JQL数据库管理简介
为方便开发者调试查询语句,`HBuilderX 3.1.5`起内置了JQL查询调试器。用法如下
1.`uniCloud/database`目录右键选择`新建JQL查询文件`(HBuilderX创建项目时勾选uniCloud会自带一个jql文件,直接使用自带的jql文件也可以)
1.`uniCloud/database`目录右键选择`新建JQL数据库管理`(HBuilderX创建项目时勾选uniCloud会自带一个jql文件,直接使用自带的jql文件也可以)
2. 在jql文件内写上自己的语句
3. 使用工具栏上的运行按钮运行(快捷键:Ctrl+R 或 F5)即可
......
......@@ -6,7 +6,7 @@
#### DCloud出品的视频教程:
<video style="width:50vw;height:37.5vw;margin-bottom:20px;" id="video" preload="none" controls="controls" poster="https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/e5da48fa-33c1-4379-8927-65edc6d05d5f.mp4?x-oss-process=video/snapshot,t_1000,f_jpg" src="https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/e5da48fa-33c1-4379-8927-65edc6d05d5f.mp4"></video>
- [更多视频教程](https://ke.qq.com/course/3416784?taid=11123338234831568&tuin=4025c735)
- [更多视频教程](https://www.bilibili.com/video/BV17p4y1a71x?p=9)
#### 三方提供的视频教程
......
......@@ -22,7 +22,7 @@ uniCloud提供包月、按量计费两种计费方式(仅腾讯云),具体
|资源类目 |限制 |说明 |
|:-: |:-: |:-: |
|云函数并发限制 |1000个实例/服务空间 |实际普通项目很难达到这个并发数,阿里云可以设置单实例多并发单实例最多100,理论最大并发量1000*100=100000 |
|云函数并发限制 |1000个实例/服务空间 |实际普通项目很难达到这个并发数,阿里云可以设置单实例多并发单实例最多100,理论最大并发量1000*100=100000 (10万) ,关于单实例多并发请参考:[单实例多并发](uniCloud/cf-functions.md?id=concurrency) |
|每个服务空间的云函数数量 |48个 |实际项目中由于clientDB和单路由云函数,只会用到几个云函数,达不到限制数字。[详见](https://uniapp.dcloud.net.cn/uniCloud/faq?id=merge-functions) |
尤其注意阿里云的cdn确实是全免费的,这些免费资源可用于正常公司业务,阿里云不允许开发者使用这些免费的存储及CDN资源来开展图床类业务。
......
......@@ -11,11 +11,11 @@
- 对于老的uni-app项目,也可以对项目点右键,菜单中选择“创建uniCloud云开发环境”
- 新建uni-app项目的模板中,有一个`Hello uniCloud`项目模板,演示了各种云函数的使用。
uniCloud云开发环境创建成功后,项目根目录下会有一个带有云图标的特殊目录,名为“cloudfunctions”。(即便是cli创建的项目,云函数目录也在项目的根目录下,而不是src下)
uniCloud云开发环境创建成功后,项目根目录下会有一个带有云图标的特殊目录,名为“uniCloud”。(即便是cli创建的项目,云函数目录也在项目的根目录下,而不是src下)
非uni-app项目也可以通过使用[云函数Url化](uniCloud/http.md)来享受云函数的带来的便利。
## 目录结构
## 目录结构@structure
HBuilderX 3.0起目录结构做了调整如下:
......@@ -94,7 +94,7 @@ HBuilderX 3.0之前版本目录结构如下:
- 如果未进行实名认证,会跳转至实名认证页面进行实名认证,等待实名认证审核之后可以开通服务空间。若腾讯云实名认证提示身份证下已创建过多账户,则需要在腾讯云官网注销不用的账户。
- 创建服务空间可能需要几十秒的时间,可以在web控制台查看是否创建完成。
- 一个应用,可以在[dev.dcloud.net.cn](https://dev.dcloud.net.cn)设置协作者(选择应用->设置项目成员),实现多人共同使用一个云服务空间。(需 HBuilderX 2.5.9+)。协作者可以在HBuilderX和web控制台中操作被授权的服务空间,除了删除服务空间,其他功能均可正常操作。
- 一个应用,可以在[dev.dcloud.net.cn](https://dev.dcloud.net.cn)设置协作者(选择应用->设置项目成员),实现多人共同使用一个云服务空间。(需 HBuilderX 2.5.9+)。协作者可以在HBuilderX和web控制台中操作被授权的服务空间,除了删除服务空间,其他功能均可正常操作。授权其他用户访问的详细步骤请参考:[授权其他用户访问服务空间](https://uniapp.dcloud.net.cn/uniCloud/faq?id=collaborator)
- 多个项目可以复用一个服务空间,比如一个应用的用户端和管理端,在HBuilderX里可以创建成2个项目,但2个项目的服务空间可以指向一个,或者干脆把其中一个项目的服务空间绑定到另一个项目上,[详见](https://ask.dcloud.net.cn/article/37949)
## 创建云函数
......@@ -187,7 +187,7 @@ exports.main = async (event, context) => {
**注意**
- HBuilderX 3.0.0版本云函数目录有调整,请参考:[目录结构说明](https://uniapp.dcloud.io/uniCloud/quickstart?id=%e7%9b%ae%e5%bd%95%e7%bb%93%e6%9e%84)
- HBuilderX 3.0.0版本云函数目录有调整,请参考:[目录结构说明](uniCloud/quickstart.md?id=structure)
### 上传并运行云函数@uploadandrun
......@@ -362,7 +362,6 @@ const hour = getOffsetDate(8).getHours()
{
"otherParam": "***",
"clientInfo":{
CLIENT_SDK_VERSION: "1.0.0"
OS: "ios" // 系统类型 ios、android
PLATFORM: "h5" // 客户端类型 app-plus、h5、mp-weixin、mp-alipay等
}
......@@ -460,9 +459,9 @@ H5前端js访问云函数,涉及跨域问题,导致前端js无法连接云
- 运行到H5端时,使用HBuilderX内置浏览器,可以忽略跨域问题(mac版需2.5.10+)。
- 发行到H5端时,需要在uniCloud后台操作,绑定安全域名(在部署云函数的服务空间配置部署h5的域名作为安全域名),否则会因为跨域问题而无法访问。(在`cloudfunctions`目录右键可打开uniCloud后台)
> 注意跨域配置需要带上端口信息。例如:前端页面运行于:www.xxx.com:5001,跨域配置内配置:www.xxx.com不会对此页面生效,需要配置为:
> 注意跨域配置需要带上端口信息。例如:前端页面运行于:www.xxx.com:5001,跨域配置内配置:www.xxx.com不会对此页面生效,需要配置为:www.xxx.com:5001
**uniCloud后台配置安全域名:**
**uniCloud后台跨域配置:**
![](https://img.cdn.aliyun.dcloud.net.cn/uni-app/uniCloud/uniCloud-add-domain.png)
......
#### 2021-06-03
+ 修复 HBuilderX 3.1.16 引出的未关联服务空间时无法获取 uniCloud.mixinDatacom 的Bug
+ 修复 HBuilderX 3.1.16 引出的某些情况下关联腾讯云服务空间的项目运行报错的Bug
+ uniCloud本地调试插件 修复 HBuilderX 3.1.16 引出的云函数日志内的文件链接点击无法跳转到对应文件的Bug
#### 2021-05-26
+ clientDB 新增 使用副表 foreignKey 进行联表查询时增加 _value 用于存储主表关联字段原始值 [详情](https://uniapp.dcloud.net.cn/uniCloud/clientdb?id=st-foreign-key)
+ clientDB 修复 部分情况下 action.after 会重复执行一次的bug
+ JQL数据管理 修复 使用云端 schema 时找不到 schema 的Bug [详情](https://ask.dcloud.net.cn/question/123285)
+ web控制台 腾讯云 调整 云函数超时时间最大可配置为900秒
#### 2021-05-25
+ web控制台 腾讯云 调整 云函数Url化需要配置CNAME为腾讯云给定的域名,此前配置为默认域名 [详情](https://uniapp.dcloud.net.cn/uniCloud/http)
#### 2021-05-18
+ 【重要】新增 uni-starter 集成商用项目开发常见功能的云端一体项目模板 [详情](https://ext.dcloud.net.cn/plugin?id=5057)
+ clientDB 修复 删除记录、统计记录数时受字段权限影响的bug [详情](https://ask.dcloud.net.cn/question/122846)
+ clientDB 修复 日期类型(date)数据校验出错的Bug [详情](https://ask.dcloud.net.cn/question/122517)
+ clientDB 修复 action、validateFunction 内打印日志无法在web控制台查看的Bug
+ unicloud-db组件 修复 联表查询时无法调用remove方法的问题 [详情](https://ask.dcloud.net.cn/question/122934)
#### 2021-04-30
+ 【重要】clientDB联表查询策略调整,请参考此文档进行进行排查并调整:[clientDB联表查询策略调整](https://ask.dcloud.net.cn/article/38966)
+ clientDB 新增 联表查询支持副表foreignKey联查,即副表字段的foreignKey指向主表,把副表数据挂在主表下面 [详情](https://uniapp.dcloud.net.cn/uniCloud/clientdb?id=st-foreign-key)
......
......@@ -12,7 +12,7 @@
- 中国教育发布:中国教育部官方App。[详见报道](http://www.moe.gov.cn/jyb_xwfb/gzdt_gzdt/s5987/202009/t20200904_485105.html)
<div style="display:flex;justify-content: space-around;">
<a href="javascript:;" target="_blank" class="clear-style barcode-view">
<img src="http://www.moe.gov.cn/jyb_xwfb/gzdt_gzdt/s5987/202009/W020200904300248750807.jpg" width="200"/>
<img src="https://www.gov.cn/xinwen/2020-09/05/5540909/images/ea39536dd03c46789ec0db62aae5a694.png" width="200"/>
<span style="margin-top:15px;">iOS、Android通用扫码地址</span>
</a>
</div>
......@@ -23,7 +23,12 @@ web体验地址:[https://duolingo.91ddedu.com](https://duolingo.91ddedu.com)
微信小程序体验方式:微信搜索“登登多邻国真题库”,或扫描下方小程序码
![登登多邻国小程序码](https://duolingo.91ddedu.com/static/miniapp.4a4ddf6b.jpg)
<div style="display:flex;justify-content: space-around;">
<a href="javascript:;" target="_blank" class="clear-style barcode-view">
<img src="https://duolingo.91ddedu.com/static/miniapp.4a4ddf6b.jpg" width="200"/>
<span style="margin-top:15px;">登登多邻国小程序码</span>
</a>
</div>
- [国云商城](https://ext.dcloud.net.cn/plugin?id=2413):优秀的电商系统,购买本系统,快速上线属于你自己的电商应用。
- [云上商城](https://ext.dcloud.net.cn/plugin?id=1989):完整的线上生活超市,根据当前定位,就近匹配仓库。
......@@ -35,3 +40,5 @@ web体验地址:[https://duolingo.91ddedu.com](https://duolingo.91ddedu.com)
- 优悦学课堂:高效学习考证。支持iOS、Android App及小程序多端连接uniCloud,[详见](https://school.youyuexue.com/#/downLoad)
- 柠檬趣味测:心理性格测试。微信小程序搜索“柠檬趣味测”、QQ小程序搜索“柠檬测试”
- 小森林集:壁纸、皮肤小程序。微信小程序搜索“小森林集”
- MOODA心情日记:随时随地记录心情。微信小程序搜索“MOODA心情日记”
- 柳州市人民医院流行病学调查表:调查登记小程序。微信小程序搜索“柳州市人民医院流行病学调查表 ”
......@@ -97,7 +97,7 @@ properties里的字段列表,每个字段都有很多可以设置的属性,
|enum|Array|字段值枚举范围,数组中至少要有一个元素,且数组内的每一个元素都是唯一的。|
|enumType|String|字段值枚举类型,可选值tree。设为tree时,代表enum里的数据为树形结构。此时schema2code可生成多级级联选择组件|
|arrayType|String|数组项类型,bsonType="array" 时有效,HBuilderX 3.1.0+ 支持,具体见下表arrayType可用类型|
|fileMediaType|String|文件类型,可选值 all&#124;image&#124;video 默认值为all,表示所有文件,image表示图片类型文件,video表示视频类型文件,详情参考[文件上传示例](https://uniapp.dcloud.net.cn/uniCloud/schema?id=filepicker) HBuilderX 3.1.0+ 支持|
|fileMediaType|String|文件类型,可选值 all&#124;image&#124;video 默认值为all,表示所有文件,image表示图片类型文件,video表示视频类型文件 HBuilderX 3.1.0+|
|fileExtName|String|文件扩展名过滤,多个用 "," 分割,例如: jpg,png,HBuilderX 3.1.0+ 支持|
|maximum|number|如果bsonType为数字时,可接受的最大值|
|exclusiveMaximum|boolean|是否排除 maximum|
......@@ -179,29 +179,107 @@ uniCloud推出了`openDB`开源数据库规范,包括用户表、文章表、
#### 字段类型bsonType@bsontype
- bool (布尔值)
- bool (布尔值,true|false
- string (字符串)
- int (整数)
- double (精度数。由于浮点精度问题,慎用)
- object (对象。其中地理位置也属于object)
- object (对象。地理位置也属于object)
- array (数组)
- timestamp (时间戳)
- date (日期)
- file 云存储文件的信息体。不直接存储文件,而是一个json object,包括云存储文件的名称、路径、文件体积等信息。
- file 云存储文件的信息体。不直接存储文件,而是一个json object,包括云存储文件的名称、路径、文件体积等信息。(HBuilderX 3.1.0+ )
- password (一种特殊的string。这类字段不会通过clientDB传递给前端,所有用户都不能通过clientDB读写,即使是admin管理员)
注意
复杂格式说明
- timestamp是一串数字的时间戳,一般通过如下js获取`var timestamp = new Date().getTime();`。它的好处是屏蔽了时区差异。阿里云和腾讯云的云端时区是0,但在HBuilderX本地运行云函数时,如果是中国的电脑,时区则会变成8,导致显示错乱。所以推荐使用时间戳。但时间戳是一串记录毫秒的数字,不合适直接渲染到前端界面上。推荐的做法是在前端渲染时使用[`<uni-dateformat>`组件](https://ext.dcloud.net.cn/plugin?id=3279)
- 时间戳和地理位置在web控制台的数据库管理界面上无法直接在引号里录入值,需参考[文档](uniCloud/quickstart?id=editdb)
- 日期和地理位置在web控制台的数据库管理界面上无法直接在引号里录入值,需参考[文档](uniCloud/quickstart?id=editdb)
- double类型慎重,由于js不能精准处理浮点运算,0.1+0.2=0.30000000000000004。所以涉及金额时,建议使用int而不是double,以分为单位而不是以元为单位存储。比如微信支付默认就是以分为单位。如果使用[uniPay](uniCloud/unipay)处理支付的话,它的默认单位也是分。
- file的json object格式存储文件的基本信息和路径,如下:
```json
{
"name": "filename.jpg",
"extname": "jpg",
"fileType": "image",
"url": "https://xxxx", // 必填
"size": 0, //单位是字节
"image": { //图片扩展
"width":10,//单位是像素
"height":10
},
"video":{ //video和image不会同时存在。此处仅为列举所有数据规范
"duration":123,//视频时长,单位是秒
"poster":"https://xxx" //视频封面
}
}
```
在上述格式中,除了`url`外,其他均为非必填。
`image`键是图片的扩展键,除了基本的宽高像素外,开发者可以自己扩展其他键,比如色位。同理`video`也可以自行扩展。
举例:表的schema中定义了2个字段:_id和image,image为file类型,定义格式如下:
```json
{
"schema": {
"bsonType": "object",
"required": [],
"properties": {
"_id": {
"description": "ID,系统自动生成"
},
"image": {
"bsonType": "file",
"title": "图片",
"description": "图片",
"fileMediaType": "image", // 可选值 all|image|video 默认值为all,表示所有文件,image表示图片类型文件,video表示视频类型文件
"fileExtName": "jpg,png", // 扩展名过滤,多个用 , 分割
}
}
}
}
```
前端配套组件:
uni-ui组件库中包含组件:`<uni-file-picker>` 。该组件和file字段的数据库完美搭配。组件首先选择文件,并上传到uniCloud云存储,在表单提交后将上传文件的地址写入file字段中。详见:[https://ext.dcloud.net.cn/plugin?id=4079](https://ext.dcloud.net.cn/plugin?id=4079)
schema2code:
DB Schema定义好字段类型为file后,可以通过schema2code工具,直接生成上传表单页面,前端页面包含`<uni-file-picker>`组件,选择、上传、写库一气呵成。详见:[schema2code](/uniCloud/schema?id=autocode)
#### 数组字段类型的子类型arrayType@arraytype
一个字段如果bsonType是array,那么它可以进一步通过arrayType指定这个数组里每个数组项目的bsonType,值域仍然是所有的字段类型。
比如一个字段存储了多张图片,那么可以设置bsonType为array,然后进一步设置arrayTpye为file。
比如一个字段存储了多张图片,那么可以设置bsonType为array,然后进一步设置arrayType为file。
比如某表的schema定义了2个字段:_id和images,images存储用户批量上传的多张图,如下:
```json
{
"schema": {
"bsonType": "object",
"required": [],
"properties": {
"_id": {
"description": "ID,系统自动生成"
},
"images": {
"bsonType": "array",
"title": "图片",
"description": "多张图片",
"arrayType": "file",
"fileMediaType": "image", // 可选值 all|image|video 默认值为all,表示所有文件,image表示图片类型文件,video表示视频类型文件
"fileExtName": "jpg,png", // 扩展名过滤,多个用 , 分割
"maxLength": 3 // 限制最大数量
}
}
}
}
```
arrayType为file时,与单独的bsonType为file相同,`<uni-file-picker>`组件和schema2code均可使用。
#### url格式@url
......@@ -364,6 +442,10 @@ enum支持3种数据格式:
```
**注意**
- enum内对普通的二维数据表枚举时,此表数据不可超过500条
#### 默认值defaultValue/forceDefaultValue@defaultvalue
- defaultValue指定新增时当前字段默认值,客户端可以修改此值。
......@@ -1013,7 +1095,7 @@ permission的字段级控制,包括读写两种权限,分别称为:read、
**注意**
- `auth.xxx`均由uni-id提供,依赖于[uni-id公共模块](uniCloud/uni-id.md)
- `doc.xxx`表示将要查询/修改/删除的每条数据,如果将要访问的数据不满足permission规则将会拒绝执行
- `doc.xxx`表示将要查询/修改/删除的每条数据(注意并不包括新增数据,新增数据应通过值域校验进行验证),如果将要访问的数据不满足permission规则将会拒绝执行
- `uni-id`的角色和权限,也即auth.role和auth.permission是不一样的概念。注意阅读[uni-id 角色权限](/uniCloud/uni-id?id=rbac)
- 如果想支持使用多个`action`的用法,可以通过`"'actionRequired' in action"`的形式配置权限,限制客户端使用的action内必须包含名为`actionRequired`的action
- doc是由客户端条件里面提取的变量,可以理解为将要访问的数据,因此create权限内不可使用doc变量,建议使用forceDefaultValue或自定义校验函数实现插入数据的校验。
......@@ -1273,6 +1355,10 @@ DCloud提供了`uni-forms`前端组件,该组件的表单校验规范完全符
> 注意:需HBuilderX 3.0.5+ 支持
> HBuilderX 3.1.15 schema2code 生成文件结构调整, 生成的 `pages.json` 改为 `page_init.json`,确认导入工程时自动合并到项目的 `pages.json`,`page_init.json`不会导入到工程中,仅在预览界面显示
> HBuilderX 3.1.15 之前的版本 `pages.json` 导入时会覆盖用户工程中已有的 `pages.json`,导入确认时选择不导入该文件手动拷贝内容到 `pages.json`
**全程演示视频**
</br>
<video style="width:50vw;height:28vw;" id="video" preload="none" controls="controls"
......@@ -1595,75 +1681,3 @@ const dbSearchFields = ['username', 'role_name', 'mobile', 'email'] // 模糊搜
在web控制台的 用户地址表,选择表结构schema,点schema2code生成页面,在生成的代码中会使用多级联选择组件 `<uni-data-picker>`,效果是懒加载的,选择省后,会根据省的选择去拉取市的数据。
`<uni-data-picker>` 组件的文档另见:[https://ext.dcloud.net.cn/plugin?id=3796](https://ext.dcloud.net.cn/plugin?id=3796)
#### 生成文件上传示例@filepicker
> HBuilderX 3.1.0+ 支持
单个文件上传示例
```json
{
"schema": {
"bsonType": "object",
"required": [],
"properties": {
"_id": {
"description": "ID,系统自动生成"
},
"image": {
"bsonType": "file",
"title": "图片",
"description": "图片",
"fileMediaType": "image", // 可选值 all|image|video 默认值为all,表示所有文件,image表示图片类型文件,video表示视频类型文件
"fileExtName": "jpg,png", // 扩展名过滤,多个用 , 分割
}
}
}
}
```
多个文件上传示例
```json
{
"schema": {
"bsonType": "object",
"required": [],
"properties": {
"_id": {
"description": "ID,系统自动生成"
},
"image": {
"bsonType": "array",
"title": "图片",
"description": "图片",
"arrayType": "file",
"fileMediaType": "image", // 可选值 all|image|video 默认值为all,表示所有文件,image表示图片类型文件,video表示视频类型文件
"fileExtName": "jpg,png", // 扩展名过滤,多个用 , 分割
"maxLength": 3 // 限制最大数量
}
}
}
}
```
上传后的file对象
```json
{
"name": "filename.jpg",
"extname": "jpg",
"fileType": "image",
"url": "https://xxxx",
"size": 0, //单位是字节
"image": {
"width":10,//单位是像素
"height":10
}
}
```
`<uni-file-picker>` 组件的文档另见:[https://ext.dcloud.net.cn/plugin?id=4079](https://ext.dcloud.net.cn/plugin?id=4079)
......@@ -562,7 +562,7 @@ let result = await uniCloud.getTempFileURL({
// 云函数删除文件示例代码
let result = await uniCloud.deleteFile({
fileList: [
"cloud://test-28farb/a.png"
"cloud://test-28farb/a.png" // 阿里云fileID是url形式,例:https://xxx.com/xxx.png
]
});
```
......
此差异已折叠。
......@@ -471,7 +471,7 @@ udb为unicloud-db组件的ref属性值
|属性|类型|默认值|描述|
|:-|:-|:-|:-|
|id|Object||新增数据|
|value|Object||新增数据|
可选参数 options
......@@ -533,7 +533,7 @@ udb为unicloud-db组件的ref属性值
|属性|类型|默认值|描述|
|:-|:-|:-|:-|
|id|Object||需要修改的新数据|
|value|Object||需要修改的新数据|
可选参数 options
......
## uniCloud响应体规范
uniCloud响应体规范(uniCloud response format),是DCloud官方制定的、服务器给客户端返回json数据的一种建议格式。
**由来**
uniCloud服务器给客户端返回的数据格式是json,但json的格式具体是什么没有约定。比如返回错误码,是叫code还是叫errCode?错误内容是message还是errMsg?内容的国际化如何处理?
如果没有一套统一的格式,在客户端将无法编写有效的网络拦截器,无法统一处理错误。
同时如果不同的插件,云端返回的数据格式千差万别,那使用者整合这些插件也会非常麻烦。国际化更无法落地。
为此DCloud推出了`uniCloud响应体规范`
为尽可能的与uni-app前端的API错误回调风格接近,uniCloud响应体规范定义的云端返回信息内应包含`errCode``errMsg`,示例如下
```js
// 失败返回值
{
errCode: 'uni-id-account-banned',
errMsg: '账号被禁用'
}
// 成功返回值
{
errCode: 0,
errMsg: '登录成功',
uid: 'xxx' // 其他信息
}
```
## errCode
errCode在成功时应返回数字`0`,失败时应返回一个以插件id开头的“字符串”,每个单词以连字符(`-`)分割。做出这样的规定是为了防止不同插件之间出现重复错误码
`'uni-id-account-banned'`错误码为例,`uni-id`为插件id,`account-banned`为错误缩写。
如果业务开发的代码并不发布插件市场,那么为了避免下载了一个市场的插件产生冲突,推荐使用不包含“-”的字符串来做errCode(插件市场的所有插件ID必须包含“-”)。
后续uniCloud会提供自动根据errCode对errMsg进行国际化处理的功能,开发者仅需保证云函数返回值满足`uniCloud响应体规范`即可。
## errMsg
errMsg用于存放具体错误信息,包括展示给开发者、终端用户的错误信息
占位变量格式说明:
## 支持情况
1. 从xx版本开始,clientDB遵循该格式
2. 推荐开发者的云函数在返回json数据给客户端时也遵循这种格式。
3. uniCloud客户端sdk后续会提供callFunction及数据库操作的拦截器,开发者可以在拦截器内对特定的错误码进行处理。例如:在收到token过期的错误码时进行提示并跳转到登录页面
4. uniCloud admin和uni-starter等插件内置的网络拦截器也均将支持该格式。
历史兼容说明:
\ No newline at end of file
......@@ -4,7 +4,7 @@
uniCloud,可以自选阿里云和腾讯云的serverless。类似于uni-app屏蔽了各家小程序的端侧差异,uniCloud也屏蔽了微信小程序云开发和支付宝小程序云开发的差异。
也就是说,uniCloud选择腾讯云时,和微信小程序云开发,连的是一套云服务。
也就是说,uniCloud选择腾讯云时,和微信小程序云开发,连的是一套云服务,都是腾讯云官方提供的
虽然硬件相同,包括API也很相似,但uniCloud和微信云开发仍然有一些软件层面的差异。
......
......@@ -142,7 +142,9 @@ package.json在每个`uni_modules`插件中都必须存在,包含了插件的
```json
{
"scripts": {
"postupdate": "node scripts/upgrade.js" // 更新插件后执行该脚本,可从process.env.UNI_MODULES_ID获取当前被更新的插件ID,如果存在多个,以,隔开
"postupdate": "node scripts/upgrade.js", // 更新插件后执行该脚本,可从process.env.UNI_MODULES_ID获取当前被更新的插件ID,如果存在多个,以,隔开
"preupload": "node scripts/preupload.js", // 上传插件之前执行该脚本,可从process.env.UNI_MODULES_ID获取当前被更新的插件ID,如果存在多个,以,隔开
"postupload": "node scripts/postupload.js" // 上传插件之后(无论上传成功还是失败)执行该脚本,可从process.env.UNI_MODULES_ID获取当前被更新的插件ID,如果存在多个,以,隔开
},
"uni_modules": {
"uni-id": { // 插件ID
......
......@@ -208,6 +208,17 @@ univerifyStyle 数据结构:
"title": "用户服务协议" // 协议名称
}
]
},
"buttons": { // 自定义登陆按钮
"iconWidth": "45px", // 图标宽度(高度等比例缩放) 默认值:45px
"list": [
{
"iconPath": "/static/apple.png" // 图标路径仅支持本地图片
},
{
"iconPath": "/static/wechat.png" // 图标路径仅支持本地图片
}
]
}
}
```
......@@ -241,6 +252,19 @@ univerifyStyle 属性对应配置的界面指示图
uni.closeAuthView()
```
### 用户点击一键登录自定义按钮
`univerifyStyle`中如果配置了`"fullScreen": "true"``buttons`选项并且`buttons`数组不为空时,在全屏的时候会渲染出自定义按钮。
当用户点击`自定义按钮`时,会触发`uni.login``fail`回调,返回数据如下:
```json
{
"code": "30008",
"errMsg": "用户点击了自定义按钮",
"index": 0 // 第几个按钮
}
```
### 用access_token换手机号
......
此差异已折叠。
......@@ -219,7 +219,7 @@ vue 是单页面应用,使页面局部刷新,不用每次跳转页面都要
## 在 uni-app 中使用差异
`uni-app` 在发布到H5时支持所有vue的语法;发布到App和小程序时,由于平台限制,无法实现全部vue语法,但 `uni-app` 仍是对vue语法支持度最高的跨端框架。
`uni-app` 在发布到H5时支持所有vue的语法;发布到App和小程序时,由于平台限制,无法实现全部vue语法,但 `uni-app` 仍是对vue语法支持度最高的跨端框架。
相比Web平台, Vue.js 在 `uni-app` 中使用差异主要集中在两个方面:
......@@ -1463,8 +1463,7 @@ Vue 提供了一种更通用的方式来观察和响应 Vue 实例上的数据
data() {
return {
firstName: 'Foo',
lastName: 'Bar',
fullName: 'Foo Bar'
lastName: 'Bar'
}
},
computed: {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册