提交 dfc5f9ec 编写于 作者: Q qiang

chore: docs sync

上级 2921ad3e
......@@ -5,11 +5,17 @@
* [uni-app的由来](history.md)
* [如何学习](resource.md)
* [框架简介](frame.md)
* vue教程
* vue2教程
* [基础](vue-basics.md)
* [组件](vue-components.md)
* [API](vue-api.md)
* [vuex](vue-vuex.md)
* [从 vue2 迁移到 vue3](migration-to-vue3.md)
* vue3教程
* [基础](vue3-basics.md)
* [组件](vue3-components.md)
* [API](vue3-api.md)
* [vuex](vue3-vuex.md)
* nvue教程
* [综述](nvue-outline.md)
* [样式](nvue-css.md)
......@@ -82,7 +88,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>12:884860657 &nbsp;<a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=JsogY994PmSrFzeSEZ6vC5dgsy3kQ-Fz&jump_from=webapi">点此加入</a></div>
<div>5:731951419 &nbsp;<a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=hCHpbIACm1kddu-ZZlklekvMVp9-S8fL&jump_from=webapi">点此加入</a></div>
<div>群35:713420817(2000人已满)</div>
<div>群34:530305531(2000人已满)</div>
<div>群33:498071674(2000人已满)</div>
......@@ -106,14 +112,14 @@
<div>群15:516984120(2000人已满)</div>
<div>群14:465953250(2000人已满)</div>
<div>群13:699478442(2000人已满)</div>
<!-- <div>群12:884860657(2000人已满)</div> -->
<div>群12:884860657(2000人已满)</div>
<div>群11:296811328(2000人已满)</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(2000人已满)</div>
<!-- <div>群5:731951419(2000人已满)</div> -->
<div>群4:942702595(2000人已满)</div>
<div>群3:773794803(2000人已满) </div>
<div>群2:901474938(2000人已满) </div>
......
......@@ -93,6 +93,7 @@
* [媒体查询](api/ui/media-query-observer.md)
* [自定义组件](api/ui/nextTick.md)
* [菜单](api/ui/menuButton.md)
* [语言](api/ui/locale.md)
* 页面和窗体
* [页面](api/window/window.md)
* [页面通讯](api/window/communication.md)
......@@ -183,7 +184,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>8:695442854 &nbsp;<a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=ojVbbaSsh9pdCVIgFcruPk1mcbxzG8co&jump_from=webapi">点此加入</a></div>
<div>21:717019120 &nbsp;<a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=aohM6OlFkEO8kB7OzlQNSi1jDdoa-rU_&jump_from=webapi">点此加入</a></div>
<div>群35:713420817(2000人已满)</div>
<div>群34:530305531(2000人已满)</div>
<div>群33:498071674(2000人已满)</div>
......@@ -198,7 +199,7 @@
<div>群24:672494800(2000人已满)</div>
<div>群23:599958679(2000人已满)</div>
<div>群22:687186952(2000人已满)</div>
<div>群21:717019120(2000人已满)</div>
<!-- <div>群21:717019120(2000人已满)</div> -->
<div>群20:165796402(2000人已满)</div>
<div>群19:165657124(2000人已满)</div>
<div>群18:698592271(2000人已满)</div>
......@@ -211,7 +212,7 @@
<div>群11:296811328(2000人已满)</div>
<div>群10:959059626(2000人已满)</div>
<div>群9:775128777(2000人已满)</div>
<!-- <div>群8:695442854(2000人已满)</div> -->
<div>群8:695442854(2000人已满)</div>
<div>群7:942061423(2000人已满)</div>
<div>群6:697264024(2000人已满)</div>
<div>群5:731951419(2000人已满)</div>
......
......@@ -836,6 +836,10 @@ code|message|
### manifest 配置@manifest
注: `Sigmob`属于小型广告联盟,收益偏低。如有条件,还需开通优量汇,快手等广告渠道以便提高收益。
`Sigmob`暂不支持打包界面的勾选,如集成需进行如下的配置变动:
`Sigmob`打包需要将`HBuilderX`升级到`3.2.0`以上版本。
打开 `manifest.json` 文件,点击 “源码视图”,`uni-app``app-plus->distribute->sdkConfigs` 下添加如下内容,`5+ app``plus->distribute->plugins` 下添加如下内容:
......
......@@ -53,7 +53,7 @@ uni.offKeyboardHeightChange(callback)
#### uni.getSelectedTextRange(OBJECT)
在input、textarea等focus之后,获取输入框的光标位置。注意:只有在focus的时候调用此接口才有效。目前仅支持 vue 页面,nvue 可以直接使用 weex 的 [getSelectionRange](http://emas.weex.io/zh/docs/components/input.html#%E7%BB%84%E4%BB%B6%E6%96%B9%E6%B3%95)
在input、textarea等focus之后,获取输入框的光标位置。注意:只有在focus的时候调用此接口才有效。目前仅支持 vue 页面,nvue 可以直接使用 weex 的 [getSelectionRange](https://weex.apache.org/zh/docs/components/input.html#getSelectionRange)
**平台差异说明**
......
......@@ -96,5 +96,5 @@ uni.chooseFile({
|App|H5|微信小程序|支付宝小程序|百度小程序|字节跳动小程序|QQ小程序|快手小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|x|x|√`(基础库2.5.0+)`|x|x|x|x|x|
|x|x|√`(基础库2.5.0+)`|x|x|x|`(基础库1.18.0+)`|x|
......@@ -60,143 +60,76 @@ App平台的直播播放,不使用此API,而直接使用video的API。
- app-nvue 平台 2.2.5以下,需要同时设置组件属性id和ref ``<live-pusher id="livepusher1" ref="livepusher1"></live-pusher>``,或者直接使用 ref,例如 ``this.$refs.livepusher1``
- app-vue 平台,需要编写条件编译代码,使用 `plus.video.LivePusher`[业务指南](https://ask.dcloud.net.cn/article/13416)[规范文档](http://www.html5plus.org/doc/zh_cn/video.html#plus.video.LivePusher)
使用nvue做直播,比使用vue的优势有:
1. nvue可一套代码直接编译到App和微信
2. nvue的cover-view比vue的cover-view更强大,在视频上绘制元素更容易。如果只考虑App端的话,不用cover-view,任意组件都可以覆盖live-pusher组件
3. 若需要视频内嵌在swiper里上下滑动(类抖音、映客首页模式),App端只有nvue才能实现
当然nvue相比vue的坏处是css写法受限,如果只开发微信小程序,不考虑App,那么使用vue页面也是一样的。
**参数说明**
设置live-pusher组件的推流地址,推流视频模式等。
属性|类型 |默认值|必填|说明
:--|:--|:--|:--|:--|
url|string| |是|推流地址,支持RTMP协议。
mode |string| |否|推流视频模式,可取值:SD(标清), HD(高清), FHD(超清)。
muted|Boolean|false|否|是否静音。
enable-camera|Boolean|true|否|开启摄像头。
auto-focus|Boolean|true|否|自动聚集。
beauty|Number|0|否|美颜,取值范围 0-9(iOS取值范围为1) ,0 表示关闭。
whiteness|Number|0|否|美白,取值范围 0-9(iOS取值范围为1) ,0 表示关闭。
#### API
#### start(callback)
#### livePusherContext
#### start(OBJECT)
> 开始推流
##### callback 返回 Object 参数说明
属性|类型 |说明
:--|:--|:--|
type | String | "success" 表示成功, "fail" 表示失败
|属性|类型|必填|说明|
|:--|:--|:--|:--|
|success|Function|否|接口调用成功的回调函数||
|fail|Function|否|接口调用失败的回调函数||
|complete|Function|否|接口调用结束的回调函数(调用成功、失败都会执行)|&nbsp;|
#### pause(callback)
#### pause(OBJECT)
> 暂停推流
##### callback 返回 Object 参数说明
参数|类型 |说明
:--|:--|:--|
type | String | "success" 表示成功, "fail" 表示失败
|属性|类型|必填|说明|
|:--|:--|:--|:--|
|success|Function|否|接口调用成功的回调函数||
|fail|Function|否|接口调用失败的回调函数||
|complete|Function|否|接口调用结束的回调函数(调用成功、失败都会执行)|&nbsp;|
#### resume(callback)
#### resume(OBJECT)
> 恢复推流
##### callback 返回 Object 参数说明
参数|类型 |说明
:--|:--|:--|
type | String | "success" 表示成功, "fail" 表示失败
|属性|类型|必填|说明|
|:--|:--|:--|:--|
|success|Function|否|接口调用成功的回调函数||
|fail|Function|否|接口调用失败的回调函数||
|complete|Function|否|接口调用结束的回调函数(调用成功、失败都会执行)|&nbsp;|
#### stop(callback)
#### stop(OBJECT)
> 停止推流
##### callback 返回 Object 参数说明
参数|类型 |说明
:--|:--|:--|
type | String | "success" 表示成功, "fail" 表示失败
|属性|类型|必填|说明|
|:--|:--|:--|:--|
|success|Function|否|接口调用成功的回调函数||
|fail|Function|否|接口调用失败的回调函数||
|complete|Function|否|接口调用结束的回调函数(调用成功、失败都会执行)|&nbsp;|
#### switchCamera(callback)
#### switchCamera(OBJECT)
> 切换前后摄像头
##### callback 返回 Object 参数说明
参数|类型 |说明
:--|:--|:--|
type | String | "success" 表示成功, "fail" 表示失败
|属性|类型|必填|说明|
|:--|:--|:--|:--|
|success|Function|否|接口调用成功的回调函数||
|fail|Function|否|接口调用失败的回调函数||
|complete|Function|否|接口调用结束的回调函数(调用成功、失败都会执行)|&nbsp;|
#### snapshot(callback)
#### snapshot(OBJECT)
> 快照
##### callback 返回 Object 参数说明
##### 成功时的回调
参数|类型 |说明
:--|:--|:--|
type|string|"success" 表示成功, "fail" 表示失败
code|Number| 对应code码
message|object|{width:"快照图片宽度",height:"快照图片高度",tempImagePath:"快照图片路径"}。
##### 失败的回调
参数|类型 |说明
:--|:--|:--|
type|string|"fail" 表示失败
code|Number|
message|object|
|属性|类型|必填|说明|
|:--|:--|:--|:--|
|success|Function|否|接口调用成功的回调函数||
|fail|Function|否|接口调用失败的回调函数||
|complete|Function|否|接口调用结束的回调函数(调用成功、失败都会执行)|&nbsp;|
#### startPreview(callback)
#### startPreview(OBJECT)
> 开启摄像头预览
##### callback 返回 Object 参数说明
参数|类型 |说明
:--|:--|:--|
type | String | "success" 表示成功, "fail" 表示失败
|属性|类型|必填|说明|
|:--|:--|:--|:--|
|success|Function|否|接口调用成功的回调函数||
|fail|Function|否|接口调用失败的回调函数||
|complete|Function|否|接口调用结束的回调函数(调用成功、失败都会执行)|&nbsp;|
#### stopPreview(callback)
#### stopPreview(OBJECT)
> 关闭摄像头预览
##### callback 返回 Object 参数说明
参数|类型 |说明
:--|:--|:--|
type | String | "success" 表示成功, "fail" 表示失败
#### 事件
#### statechange
> 状态变化事件
##### 返回参数(detail)的详细说明
参数|类型|说明
:--|:--|:--|
code|Number|
message|string|
#### netstatus
> 网络状态通知事件
##### 安卓 返回参数(detail)的详细说明
键名|说明
:--|:--|
videoBitrate | 当前视频编/码器输出的比特率,单位 kbps
audioBitrate | 当前音频编/码器输出的比特率,单位 kbps
videoFPS | 当前视频帧率
videoGOP | 当前视频 GOP,也就是每两个关键帧(I帧)间隔时长,单位 s
netSpeed | 当前的发送/接收速度
netJitter | 网络抖动情况,抖动越大,网络越不稳定
videoWidth | 视频画面的宽度
videoHeight | 视频画面的高度
##### iOS 返回参数(detail)的详细说明
参数|类型 |说明
:--|:--|:--|
code|Number| code码
message|string| 具体的网络状态信息
#### error
> 渲染错误事件
##### 返回参数(detail)的详细说明
参数|类型 |说明
:--|:--|:--|
errCode|Number|
errMsg|string|
|属性|类型|必填|说明|
|:--|:--|:--|:--|
|success|Function|否|接口调用成功的回调函数||
|fail|Function|否|接口调用失败的回调函数||
|complete|Function|否|接口调用结束的回调函数(调用成功、失败都会执行)|&nbsp;|
......@@ -23,17 +23,20 @@ H5平台登录注意事项:
|scopes|String/Array|见平台差异说明|授权类型,默认 auth_base。支持 auth_base(静默授权)/ auth_user(主动授权) / auth_zhima(芝麻信用)|支付宝小程序|
|timeout|Number|否|超时时间,单位ms|微信小程序、百度小程序|
|univerifyStyle|Object|否|[一键登录](/univerify)页面样式|App 3.0.0+|
|onlyAuthorize|Boolean|否|`微信登录`仅请求授权认证|App 3.2.3+|
|success|Function|否|接口调用成功的回调||
|fail|Function|否|接口调用失败的回调函数||
|complete|Function|否|接口调用结束的回调函数(调用成功、失败都会执行)|&nbsp;|
**注意:** 微信登录在未配置`onlyAuthorize`的情况下调用此接口,`code`值为使用过的,用以换取`authResult`,这样会导致使用`code`去和微信换取信息时会报错。配置`onlyAuthorize`会把未使用过的`code`值返回。
**success 返回参数说明**
|参数名|说明|
|:-|:-|
|authResult|登录服务商提供的登录信息,服务商不同返回的结果不完全相同|
|code|小程序专有,用户登录凭证。开发者需要在开发者服务器后台,使用 code 换取 openid 和 session_key 等信息|
|errMsg|描述信息|
|参数名|说明|平台差异说明|
|:-|:-|:-|
|authResult|登录服务商提供的登录信息,服务商不同返回的结果不完全相同|微信登录配置`onlyAuthorize`则此项为空,App 3.2.3+ |
|code|用户登录凭证。开发者需要在开发者服务器后台,使用 code 换取 openid 和 session_key 等信息|微信登录配置`onlyAuthorize`code值有效,App 3.2.3+ |
|errMsg|描述信息||
各个平台的登录流程存在差异,详细请参考相关平台的文档说明:
......@@ -272,3 +275,28 @@ uni.login({
|App|H5|微信小程序|支付宝小程序|百度小程序|字节跳动小程序|QQ小程序|快手小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|3.0.0+|x|x|x|x|x|x|x|
### uni.getCheckBoxState(OBJECT)
获取[一键登录](/univerify)条款勾选框状态。
**平台差异说明**
|App|H5|微信小程序|支付宝小程序|百度小程序|字节跳动小程序|QQ小程序|快手小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|3.2.3+|x|x|x|x|x|x|x|
**OBJECT 参数说明**
|参数名|类型|必填|说明|
|:-|:-|:-|:-|
|success|Function|否|接口调用成功的回调|
|fail|Function|否|接口调用失败的回调函数|
|complete|Function|否|接口调用结束的回调函数(调用成功、失败都会执行)|
**success 返回参数说明**
|参数|类型|说明|
|:-|:-|:-|
|state|Boolean|一键登录条款勾选框状态|
|errMsg|String|描述信息|
\ No newline at end of file
......@@ -47,7 +47,7 @@
||sinaweibo|新浪微博登录||
||xiaomi|小米登录||
||univerify|[一键登录](/univerify)|App 3.0.0+|
||apple|[Apple登录](https://ask.dcloud.net.cn/article/36651)|仅iOS13支持,App 2.4.7+|
||apple|[Apple登录](https://ask.dcloud.net.cn/article/36651)| iOS13+支持,App 2.4.7+|
|share|sinaweibo|新浪微博分享||
||qq|分享到QQ好友||
||weixin|分享微信消息、朋友圈及微信小程序||
......
......@@ -49,7 +49,7 @@ HBuilderX (3.2.0 版本起) 新增QQ互联和新浪微博开放平台的通用
![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/53e0141e-d2d4-496a-b0f2-2359005c0c4e.jpg)
* 注意:通用链接默认域名仅供测试使用,访问频次限制60次/分钟,请勿在正式发行的项目中使用。
* 注意:通用链接默认域名仅供测试使用,访问频次限制60次/分钟,请勿在正式发行的项目中使用。正式项目,务必绑定自己的域名(顶级域名,二级域名均可)
* 如何绑定自己的域名详情:[https://uniapp.dcloud.io/uniCloud/hosting?id=domain](https://uniapp.dcloud.io/uniCloud/hosting?id=domain)
![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/1e081fdd-27b2-4c0b-8985-7d59756ed313.jpg)
......
......@@ -60,6 +60,10 @@ var socketTask = uni.connectSocket({
### uni.onSocketOpen(CALLBACK)
监听WebSocket连接打开事件。
**平台兼容性**
字节小程序不支持
**CALLBACK 返回参数**
|属性|类型|说明|
......@@ -81,6 +85,10 @@ uni.onSocketOpen(function (res) {
### uni.onSocketError(CALLBACK)
监听WebSocket错误。
**平台兼容性**
字节小程序不支持
**示例代码**
```javascript
......@@ -98,6 +106,10 @@ uni.onSocketError(function (res) {
### uni.sendSocketMessage(OBJECT)
通过 WebSocket 连接发送数据,需要先 [uni.connectSocket](/api/request/websocket?id=connectsocket),并在 [uni.onSocketOpen](/api/request/websocket?id=onsocketopen) 回调之后才能发送。
**平台兼容性**
字节小程序不支持
**OBJECT 参数说明:**
|参数名|类型|必填|说明|
......@@ -139,6 +151,10 @@ function sendSocketMessage(msg) {
### uni.onSocketMessage(CALLBACK)
监听WebSocket接受到服务器的消息事件。
**平台兼容性**
字节小程序不支持
**CALLBACK 返回参数**
|参数|类型|说明|
......@@ -160,6 +176,10 @@ uni.onSocketMessage(function (res) {
### uni.closeSocket(OBJECT)
关闭 WebSocket 连接。
**平台兼容性**
字节小程序不支持
**OBJECT 参数说明**
|参数名|类型|必填|说明|
......@@ -173,6 +193,10 @@ uni.onSocketMessage(function (res) {
### uni.onSocketClose(CALLBACK)
监听WebSocket关闭。
**平台兼容性**
字节小程序不支持
```javascript
uni.connectSocket({
url: 'wss://www.example.com/socket'
......
### uni.getLocale()
获取当前设置的语言
**平台差异说明**
|App|H5|微信小程序|支付宝小程序|百度小程序|字节跳动小程序|QQ小程序|快手小程序|华为快应用|360小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|3.2.5+|3.2.5+|x|x|x|x|x|x|x|x|
如果当前应用设置过语言,会获取到之前设置的语言,未设置会使用系统语言。
### uni.setLocale(locale)
设置当前语言
**平台差异说明**
|App|H5|微信小程序|支付宝小程序|百度小程序|字节跳动小程序|QQ小程序|快手小程序|华为快应用|360小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|3.2.5+|3.2.5+|x|x|x|x|x|x|x|x|
**参数说明**
|参数名|类型|必填|
|:-|:-|:-|
|locale|String|是|
#### 提示
* 组件和接口显示会根据设置的语言环境自动切换,未支持的系统语言环境会显示为英文。
* 框架内置如下语言:
* 英语 en
* 中文简体 zh-Hans
* 繁体 zh-Hant
* 法语 fr
* 西班牙语 es
*[manifest.json](/collocation/manifest) -> locale 可以配置应用的默认语言。
* 仅 3.1.5 - 3.2.4 版本会自动使用 vue-i18n 内配置的语言。
\ No newline at end of file
......@@ -122,6 +122,7 @@ uni-AD广告模块集成的三方SDK说明
|快手|com.kwad.sdk|广告|IMEI、openid、位置信息|获取网络状态、访问Wi-Fi状态、位置信息、读写外置存储器、读取手机状态和身份|[https://www.kuaishou.com/about/policy](https://www.kuaishou.com/about/policy)|
|优量汇|com.qq.e|广告|IMEI、openid、位置信息|获取网络状态、访问Wi-Fi状态、位置信息、读写外置存储器、读取手机状态和身份|[https://imgcache.qq.com/..privacy](https://imgcache.qq.com/gdt/cdn/adn/uniondoc/ylh_sdk_privacy_statement.html)|
|穿山甲|com.bytedance.sdk. openadsdk.adhost|广告|IMEI、openid、位置信息|获取网络状态、访问Wi-Fi状态、位置信息、读写外置存储器、读取手机状态和身份|[https://www.pangle.cn/privacy/partner](https://www.pangle.cn/privacy/partner)|
|Sigmob|com.sigmob.windad|广告|IMEI、openid、位置信息|获取网络状态、访问Wi-Fi状态、位置信息、读写外置存储器、读取手机状态和身份|[https://support.sigmob.com/#/隐私条款/](https://support.sigmob.com/#/%E9%9A%90%E7%A7%81%E6%9D%A1%E6%AC%BE/)|
#### 腾讯x5内核
......@@ -196,8 +197,7 @@ uni-AD广告模块集成的三方SDK说明
uni-AD广告基础功能包含管理其它三方广告SDK的逻辑,会通过反射判断广告SDK是否存在,在没有勾选“360广告联盟”、“今日头条穿山甲广告联盟”、“腾讯优量汇广告联盟”、”快手广告联盟“时,也可能会被华为应用市场检测为包含奇虎360、广点通/优量汇、穿山甲等广告SDK,实际上apk中并没有包含相应的广告SDK。我们已经在优化广告基础功能实现方案来避免(请关注新版本更新日志),目前可以通过以下临时方案解决:
+ 向华为应用市场申诉,说明安装包中并没有包含广告SDK,只是存在反射判断广告SDK是否存在
+ 目前我们收到此反馈此问题的都是5+ App项目,uni-app项目可能并不存在此问题,建议有条件的话将5+ App项目升级为uni-app项目
+ 请使用HX3.2.1+重新打包
#### 看不懂文档不知道如何修改?
......
......@@ -172,10 +172,10 @@ uni-app助力数百家单位快速上线**抗疫系统**,开源众多项目,
<a href="https://www.cyb520.com/" target="_blank" class="clear-style"><b>宠友帮:</b></a>多端开发的创业公司案例。
<div style="display:flex;justify-content: space-around;">
<a href="https://android.myapp.com/myapp/detail.htm?apkName=com.cyb520.app" target="_blank" class="clear-style barcode-view">
<!-- <a href="https://android.myapp.com/myapp/detail.htm?apkName=com.cyb520.app" target="_blank" class="clear-style barcode-view">
<img src="https://a.app.qq.com/o/image/microQr.png?pkgName=com.cyb520.app" width="200"/>
<span style="margin-top:15px;">App码</span>
</a>
</a>-->
<a href="https://www.cyb520.com/" target="_blank" class="clear-style barcode-view">
<img src="https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-uni-app-doc/46ad6ef0-4f3e-11eb-8ff1-d5dcf8779628.jpg" width="200"/>
<span style="margin-top:15px;">微信小程序码</span>
......
......@@ -56,7 +56,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>8:695442854 &nbsp;<a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=ojVbbaSsh9pdCVIgFcruPk1mcbxzG8co&jump_from=webapi">点此加入</a></div>
<div>21:717019120 &nbsp;<a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=aohM6OlFkEO8kB7OzlQNSi1jDdoa-rU_&jump_from=webapi">点此加入</a></div>
<div>群35:713420817(2000人已满)</div>
<div>群34:530305531(2000人已满)</div>
<div>群33:498071674(2000人已满)</div>
......@@ -71,7 +71,7 @@
<div>群24:672494800(2000人已满)</div>
<div>群23:599958679(2000人已满)</div>
<div>群22:687186952(2000人已满)</div>
<div>群21:717019120(2000人已满)</div>
<!-- <div>群21:717019120(2000人已满)</div> -->
<div>群20:165796402(2000人已满)</div>
<div>群19:165657124(2000人已满)</div>
<div>群18:698592271(2000人已满)</div>
......@@ -84,7 +84,7 @@
<div>群11:296811328(2000人已满)</div>
<div>群10:959059626(2000人已满)</div>
<div>群9:775128777(2000人已满)</div>
<!-- <div>群8:695442854(2000人已满)</div> -->
<div>群8:695442854(2000人已满)</div>
<div>群7:942061423(2000人已满)</div>
<div>群6:697264024(2000人已满)</div>
<div>群5:731951419(2000人已满)</div>
......
......@@ -66,7 +66,7 @@ npm install puppeteer --save-dev
2. 根据API编写测试的js代码,参考测试用例
API文档见:[https://uniapp.dcloud.io/collocation/auto/api](https://uniapp.dcloud.io/collocation/auto/api)
测试文件目录配置见 [jest.config.js](collocation/auto/api?id=jestconfigjs)
测试文件目录配置见 [jest.config.js](collocation/auto/quick-start?id=jestconfigjs)
3. 运行测试
```
......@@ -83,7 +83,7 @@ Snapshots: 0 total
Time: 14.995s, estimated 16s
```
更多配置参考 [jest.config.js](collocation/auto/api?id=jestconfigjs)
更多配置参考 [jest.config.js](collocation/auto/quick-start?id=jestconfigjs)
#### App-Android测试流程
......
......@@ -7,6 +7,7 @@
|name|String||应用名称||
|appid|String|新建 uni-app 项目时,DCloud 云端分配。用途[详见](https://ask.dcloud.net.cn/article/35907)|应用标识||
|description|String||应用描述||
|locale|String|auto|设置当前默认语言,具体参考 [locale](/api/ui/prompt/locale)||
|versionName|String||版本名称,例如:1.0.0。详见下方Tips说明||
|versionCode|String||版本号,例如:36||
|transformPx|Boolean|true|是否转换项目的px,为true时将px转换为rpx,为false时,px为传统的实际像素||
......
......@@ -338,7 +338,7 @@ uni-app 2.9+ 新增 leftWindow, topWindow, rightWindow 配置。用于解决宽
|mp-baidu|Object||设置编译到 mp-baidu 平台的特定样式|百度小程序|
|mp-toutiao|Object||设置编译到 mp-toutiao 平台的特定样式|字节跳动小程序|
|mp-qq|Object||设置编译到 mp-qq 平台的特定样式|QQ小程序|
|mp-kuaishou|Object||设置编译到 mp-kuaishou 平台的特定样式|QQ小程序|
|mp-kuaishou|Object||设置编译到 mp-kuaishou 平台的特定样式|快手小程序|
|usingComponents|Object||引用小程序组件,参考 [小程序组件](/frame?id=小程序组件支持)|App、微信小程序、支付宝小程序、百度小程序|
|leftWindow|Boolean|true|当存在 leftWindow时,当前页面是否显示 leftWindow|H5|
|topWindow|Boolean|true|当存在 topWindow 时,当前页面是否显示 topWindow|H5|
......@@ -1082,7 +1082,7 @@ subPackages 节点接收一个数组,数组每一项都是应用的子包,
- ```subPackages``` 里的pages的路径是 ``root`` 下的相对路径,不是全路径。
- 微信小程序每个分包的大小是2M,总体积一共不能超过20M。
- 百度小程序每个分包的大小是2M,总体积一共不能超过8M。
- 支付宝小程序每个分包的大小是2M,总体积一共不能超过4M。
- 支付宝小程序每个分包的大小是2M,总体积一共不能超过8M。
- QQ小程序每个分包的大小是2M,总体积一共不能超过24M。
- 字节小程序每个分包的大小是2M,总体积一共不能超过16M(字节小程序基础库 1.88.0 及以上版本开始支持,字节小程序开发者工具请使用大于等于 2.0.6 且小于 3.0.0 的版本)。
- 分包下支持独立的 ```static``` 目录,用来对静态资源进行分包。
......
注意:本指南仅支持 vue3 版本的 uni-app 项目(h5平台), vue3项目的升级迁移指南参考:[uni-app 项目小程序端、H5 端支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
`uni-app`已支持`vue 3.0`开发,详见:[https://ask.dcloud.net.cn/article/37834](https://ask.dcloud.net.cn/article/37834)
`uni-app`官方基于`vue 3.0 & uniCloud`提供了简单、易用的SSR支持。
[news.dcloud.io](https://news.dcloud.io)是一套基于`uni-app & uniCloud` 开发的新闻系统,你可以通过浏览器查看源码,这是一个服务端渲染(SSR)的站点示例。
#### 什么是服务器端渲染 (SSR)?
uni-app 默认情况下,是在客户端中输出 Vue 组件,进行生成 DOM 和操作 DOM。然而,也可以将同一个组件渲染为服务器端的 HTML 字符串,将它们直接发送到浏览器,最后将这些静态标记"激活"为客户端上完全可交互的应用程序。
......
......@@ -147,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>8:695442854 &nbsp;<a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=ojVbbaSsh9pdCVIgFcruPk1mcbxzG8co&jump_from=webapi">点此加入</a></div>
<div>21:717019120 &nbsp;<a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=aohM6OlFkEO8kB7OzlQNSi1jDdoa-rU_&jump_from=webapi">点此加入</a></div>
<div>群35:713420817(2000人已满)</div>
<div>群34:530305531(2000人已满)</div>
<div>群33:498071674(2000人已满)</div>
......@@ -162,7 +162,7 @@
<div>群24:672494800(2000人已满)</div>
<div>群23:599958679(2000人已满)</div>
<div>群22:687186952(2000人已满)</div>
<div>群21:717019120(2000人已满)</div>
<!-- <div>群21:717019120(2000人已满)</div> -->
<div>群20:165796402(2000人已满)</div>
<div>群19:165657124(2000人已满)</div>
<div>群18:698592271(2000人已满)</div>
......@@ -175,7 +175,7 @@
<div>群11:296811328(2000人已满)</div>
<div>群10:959059626(2000人已满)</div>
<div>群9:775128777(2000人已满)</div>
<!-- <div>群8:695442854(2000人已满)</div> -->
<div>群8:695442854(2000人已满)</div>
<div>群7:942061423(2000人已满)</div>
<div>群6:697264024(2000人已满)</div>
<div>群5:731951419(2000人已满)</div>
......
......@@ -19,7 +19,7 @@ banner或信息流广告展现场景非常灵活,常见的展现场景为:
|App|H5|微信小程序|支付宝小程序|百度小程序|字节跳动小程序|QQ小程序|快应用|360小程序|快手小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|√(2.5.2+)|√(3.1.22+)|√|x|√|√|√|x|x|√|
|√(2.5.2+)|x|√|x|√|√|√|x|x|√|
**开通配置广告**
......@@ -27,7 +27,7 @@ banner或信息流广告展现场景非常灵活,常见的展现场景为:
开通广告步骤:
1. 开通广告
需在广告平台后台操作:
* App/H5平台:[https://uniad.dcloud.net.cn/](https://uniad.dcloud.net.cn/)
* App平台:[https://uniad.dcloud.net.cn/](https://uniad.dcloud.net.cn/)
* 小程序平台:在各自的小程序管理后台操作。
2. 申请广告位id
在各位后台申请广告位id
......@@ -40,8 +40,6 @@ banner或信息流广告展现场景非常灵活,常见的展现场景为:
|:-|:-|:-|:-|:-|
|data|Object|可选|广告数据,通过 plus.ad.getAds (参考示例代码),设置后adpid将无效|App|
|adpid|String||uni-AD App广告位id,在[uni-AD官网](https://uniad.dcloud.net.cn/)申请广告位|App|
|adpid-widescreen|String||同`adpid`, 一般用于大屏幕生效,当组件的宽度大于 750px 时生效,可以自定义生效的范围,参见 `widescreen-width`|H5|
|widescreen-width|number|750|`widescreen` 自定义组件生效宽度|H5|
|unit-id|String||广告单元id,可在小程序管理后台的流量主模块新建|微信小程序、字节跳动小程序(最低版本1.19.0+)、QQ小程序、快手小程序|
|ad-intervals|number||广告自动刷新的间隔时间,单位为秒,参数值必须大于等于30(该参数不传入时 Banner 广告不会自动刷新)|微信小程序(基础库2.3.1+)|
|appid|String||小程序应用 ID|百度小程序|
......@@ -291,28 +289,6 @@ export default {
```
#### H5特定环境不显示广告示例@h5MicroMessengerHide
```html
<template>
<view>
<!-- 下面的示例在微信中打开H5页面不显示广告 -->
<ad class="ad" v-if="showAd" adpid="1111111111"></ad>
</view>
</template>
<script>
export default {
data() {
let showAd = !navigator.userAgent.includes("MicroMessenger")
return {
showAd
}
},
}
</script>
```
**激励视频广告**
文档地址:[https://uniapp.dcloud.io/api/a-d/rewarded-video](https://uniapp.dcloud.io/api/a-d/rewarded-video)
......@@ -322,5 +298,4 @@ export default {
- App端广告开通指南和收益相关问题:[https://ask.dcloud.net.cn/article/36769](https://ask.dcloud.net.cn/article/36769)
- App端除了ad组件,还支持开屏、激励视频等多种广告形式。详见[uni-AD官网](https://uniad.dcloud.net.cn/)
- App端uni-AD聚合了腾讯广点通、头条穿山甲、360广告联盟等服务,打包时必须勾选相应的sdk,详见:[https://ask.dcloud.net.cn/article/36718](https://ask.dcloud.net.cn/article/36718)
- H5平台仅支持uni-app
![](https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-uni-app-doc/f21eb570-4f32-11eb-b680-7980c8a877b8.jpg)
......@@ -55,7 +55,7 @@ audio-volume-type|string|voicecall|否|音量类型|微信小程序2.10.0
@bgmcomplete|EventHandle|||背景音播放完成时触发|微信小程序2.4.0
orientation 的合法值
#### orientation 的合法值
|值|说明|
|:-|:-|
......@@ -63,7 +63,7 @@ orientation 的合法值
|horizontal|水平|
local-mirror 的合法值
#### local-mirror 的合法值
|值|说明|
|:-|:-|
......@@ -72,7 +72,7 @@ local-mirror 的合法值
|disable|前后置摄像头均不镜像|
audio-reverb-type 的合法值
#### audio-reverb-type 的合法值
|值|说明|
|:-|:-|
......@@ -86,14 +86,14 @@ audio-reverb-type 的合法值
|7|磁性|
audio-volume-type 的合法值
#### audio-volume-type 的合法值
|值|说明|
|:-|:-|
|media|媒体音量|
|voicecall|通话音量|
网络状态数据(info)安卓
#### 网络状态数据(info)安卓
键名|说明
:--|:--|
......@@ -106,13 +106,57 @@ netJitter | 网络抖动情况,抖动越大,网络越不稳定
videoWidth | 视频画面的宽度
videoHeight | 视频画面的高度
网络状态数据(info)iOS
#### 网络状态数据(info)iOS
参数|类型 |说明
:--|:--|:--|
code|Number| code码
message|string| 具体的网络状态信息
#### 事件
#### statechange
> 状态变化事件
##### 返回参数(detail)的详细说明
参数|类型|说明
:--|:--|:--|
code|Number|
message|string|
#### netstatus
> 网络状态通知事件
##### 安卓 返回参数(detail)的详细说明
键名|说明
:--|:--|
videoBitrate | 当前视频编/码器输出的比特率,单位 kbps
audioBitrate | 当前音频编/码器输出的比特率,单位 kbps
videoFPS | 当前视频帧率
videoGOP | 当前视频 GOP,也就是每两个关键帧(I帧)间隔时长,单位 s
netSpeed | 当前的发送/接收速度
netJitter | 网络抖动情况,抖动越大,网络越不稳定
videoWidth | 视频画面的宽度
videoHeight | 视频画面的高度
##### iOS 返回参数(detail)的详细说明
参数|类型 |说明
:--|:--|:--|
code|Number| code码
message|string| 具体的网络状态信息
#### error
> 渲染错误事件
##### 返回参数(detail)的详细说明
参数|类型 |说明
:--|:--|:--|
errCode|Number|
errMsg|string|
```html
<template>
......
......@@ -54,6 +54,12 @@
- `uni-app` 只支持 `gcj02` 坐标
- App平台 `layer-style` 属性需要在地图服务商后台创建,值设置为高德后台申请的字符串,[详情](https://developer.amap.com/api/android-sdk/guide/create-map/custom)
### 近期新增功能
1. 支持点聚合,适用于marker过多场景。
2. 支持彩虹蚯蚓线,常用于路线规划场景。
3. 覆盖物支持调整与其它地图元素的压盖关系。
4. 支持marker(小车)平移动画,适用于轨迹回放场景。
**markers**
标记点用于在地图上显示标记的位置
......@@ -104,9 +110,21 @@
|bgColor|背景色|String|App-nvue 2.1.5+、微信小程序、百度小程序|
|padding|文本边缘留白|Number|App-nvue 2.1.5+、微信小程序、百度小程序|
|textAlign|文本对齐方式。有效值: left, right, center|String|App-nvue 2.1.5+、微信小程序、百度小程序|
|clusterId|自定义点聚合簇效果时使用|Number|App-nvue 3.1.0+、微信小程序|
|customCallout|自定义气泡窗口|Object|App暂时不支持、微信小程序|
|aria-label|无障碍访问,(属性)元素的额外描述|String|App-nvue 3.1.0+、微信小程序|
|joinCluster|是否参与点聚合|Boolean|App-nvue 3.1.0+、微信小程序|
### 点聚合
当地图上需要展示的标记点 marker 过多时,可能会导致界面上 marker 出现压盖,展示不全,并导致整体性能变差。针对此类问题,推出点聚合能力。
使用流程如下:
[MapContext.initMarkerCluster](api/location/map?id=createmapcontext) 对聚合点进行初始化配置(可选);
[MapContext.addMarkers](api/location/map?id=createmapcontext) 指定参与聚合的 marker;
MapContext.on('markerClusterCreate', callback) 触发时,通过 [MapContext.addMarkers](api/location/map?id=createmapcontext) 更新聚合簇的样式 (可选);
[MapContext.removeMarkers](api/location/map?id=createmapcontext) 移除参与聚合的 marker;
**polyline**
......
......@@ -26,8 +26,8 @@
|background-color-bottom|string||否|底部窗口的背景色,必须为十六进制颜色值,仅 iOS 支持|微信基础库 2.9.0|
|scroll-top|string|""|否|滚动位置,可以使用 px 或者 rpx 为单位,在被设置时,页面会滚动到对应位置|微信基础库 2.9.0|
|scroll-duration|number|300|否|滚动动画时长|微信基础库 2.9.0|
|page-style|string|""|否|页面根节点样式,页面根节点是所有页面节点的祖先节点,相当于 HTML 中的 body 节点|微信基础库 2.9.0、H5 2.6.7、App 2.6.7|
|root-font-size|string|""|否|页面的根字体大小,页面中的所有 rem 单位,将使用这个字体大小作为参考值,即 1rem 等于这个字体大小|微信基础库 2.9.0、H5 2.6.7、App 2.6.7|
|page-style|string|""|否|页面根节点样式,页面根节点是所有页面节点的祖先节点,相当于 HTML 中的 body 节点|微信基础库 2.9.0、H5 2.6.7、App-vue 2.6.7|
|root-font-size|string|""|否|页面的根字体大小,页面中的所有 rem 单位,将使用这个字体大小作为参考值,即 1rem 等于这个字体大小|微信基础库 2.9.0、H5 2.6.7、App-vue 2.6.7|
|enable-pull-down-refresh|Boolean|""|否|是否开启下拉刷新|App 2.6.7|
|@resize|eventhandle||否|页面尺寸变化时会触发 resize 事件, event.detail = { size: { windowWidth, windowHeight } }|微信基础库 2.9.0|
|@scroll|eventhandle||否|页面滚动时会触发 scroll 事件, event.detail = { scrollTop }|微信基础库 2.9.0|
......
#### vue2 项目迁移 vue3,必须适配的部分
以下列举迁移到 vue3,必须适配的几个点,vue2 项目才能正常运行在 vue3 上。更多查看完整的[非兼容特性列表](https://github.com/vuejs/vue-next/tree/master/packages/vue-compat#incompatible)
- main.js
- 创建应用实例
```JS
// 之前 - Vue 2
import Vue from 'vue'
import App from './App'
Vue.config.productionTip = false // vue3 不再需要
App.mpType = 'app' // vue3 不再需要
const app = new Vue({
...App
})
app.$mount()
// 之后 - Vue 3
import App from './App'
import { createSSRApp } from 'vue'
export function createApp() {
const app = createSSRApp(App)
return {
app
}
}
```
- 全局属性,例如:全局网络请求
```js
// 之前 - Vue 2
Vue.prototype.$http = () => {};
// 之后 - Vue 3
const app = createApp({});
app.config.globalProperties.$http = () => {};
```
- 插件使用,例如:使用 vuex 的 store
```js
// 之前 - Vue 2
import store from "./store";
Vue.prototype.$store = store;
// 之后 - Vue 3
import store from "./store";
const app = createApp(App);
app.use(store);
```
- 项目根目录必需创建 index.html 文件,粘贴复制如下内容:
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0" />
<title></title>
<!--preload-links-->
<!--app-context-->
</head>
<body>
<div id="app"><!--app-html--></div>
<script type="module" src="/main.js"></script>
</body>
</html>
```
- 只支持使用 ES6 模块规范,commonJS 需改为 ES6 模块规范
- 导入模块, 例如:
```js
// 之前 - Vue 2, 使用 commonJS
var utils = require("../../../common/util.js");
// 之后 - Vue 3, 只支持 ES6 模块
import utils from "../../../common/util.js";
```
- 模块导出,例如:
```js
// 之前 - Vue 2, 依赖如使用 commonJS 方式导出
module.exports.X = X;
// 之后 - Vue 3, 可手动改为 ES6 导出
export default { X };
```
- vuex 用法
```js
// 之前 - Vue 2
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const store = new Vuex.Store({
state: {}
})
export default store
// 之后 - Vue 3
import { createStore } from 'vuex'
const store = createStore({
state: {}
})
export default store
```
- 避免在同一元素上同时使用 v-if 与 v-for
> 而 Vue3 中,v-if 总是优先于 v-for 生效。以上写法将会在 Vue3 中与预期不符合,由于语法上存在歧义,建议避免在同一元素上同时使用两者([更多](https://v3.cn.vuejs.org/guide/migration/v-if-v-for.html#%E6%A6%82%E8%A7%88))。
- 生命周期的适配
在Vue3中组件卸载的生命周期被重新命名
- `destroyed` 修改为 `unmounted`
- `beforeDestroy` 修改为 `beforeUnmount`
- 事件的适配
Vue3 现在提供了一个`emits`选项,类似于现有`props`选项。此选项可用于定义组件可以向其父对象发出的事件, [更多](https://v3.cn.vuejs.org/guide/migration/emits-option.html#overview)
**强烈建议使用`emits`记录每个组件发出的所有事件。**
这一点特别重要,因为去除了`.native`修饰符。`emits` 现在在未使用声明的事件的所有侦听器都将包含在组件的中`$attrs`,默认情况下,该侦听器将绑定到组件的根节点。
```html
<template>
<button @click="onClick">OK</button>
</template>
<script>
export default {
emits: ['click'],
methods:{
onClick(){
this.$emit('click', 'OK')
}
}
}
</script>
```
- v-model 的适配
Vue3 的 v-model 相对 Vue2 来说 ,有了较大的改变。可以使用多 `model`,相应语法也有变化。[更多](https://v3.cn.vuejs.org/guide/migration/v-model.html#%E6%A6%82%E8%A7%88)
- 修改 modelValue
用于自定义组件时,Vue3 v-model prop 和事件默认名称已更改 `props.value` 修改为 `props.modelValue` ,`event.value` 修改为 `update:modelValue`
```javascript
export default {
props: {
// value:String,
// 替换 value 为 modelValue
modelValue:String
}
}
```
- 事件返回
将之前的 `this.$emit('input')` 修改为 `this.$emit('update:modelValue')` ,vue3 中将省略这一步骤
自定义组件上的 v-model 相当于传递了 modelValue prop 并接收抛出的 update:modelValue 事件:
```html
<ChildComponent v-model="pageTitle" />
<!-- 是以下的简写: -->
<ChildComponent
:modelValue="pageTitle"
@update:modelValue="pageTitle = $event"
/>
```
若需要更改 model 名称,作为组件内 model 选项的替代,现在我们可以将一个 argument 传递给 v-model:
```html
<ChildComponent v-model:title="pageTitle" />
<!-- 是以下的简写: -->
<ChildComponent :title="pageTitle" @update:title="pageTitle = $event" />
```
- 插槽的适配
Vue3 将不支持 `slot="xxx"` 的用法 ,请使用 `v-slot:xxx` 用法。[更多](https://v3.cn.vuejs.org/guide/component-slots.html#%E5%85%B7%E5%90%8D%E6%8F%92%E6%A7%BD)
```html
<!-- Vue2 支持的用法 -->
<uni-nav-bar>
<view slot="left" class="city">
<!-- ... -->
</view>
</uni-nav-bar>
```
```html
<!-- Vue3 支持的用法 -->
<uni-nav-bar>
<template v-slot:left>
<view class="city">
<!-- ... -->
</view>
</template>
</uni-nav-bar>
```
- 从 Vue 3.0 开始,过滤器已删除,不再支持,建议用方法调用或计算属性替换它们。[更多](https://v3.cn.vuejs.org/guide/migration/filters.html#%E6%A6%82%E8%A7%88)
\ No newline at end of file
#### 3.2.6.20210901-alpha
* 【uni-app】
+ App平台 修复 3.2.1 引出的 uni.chooseImage 无法压缩拍照图像的Bug [详情](https://ask.dcloud.net.cn/question/129238)
+ 字节小程序平台 修复 部分事件无法触发的Bug [#2774](https://github.com/dcloudio/uni-app/issues/2774)
* 【App插件(含5+App和uni-app的App端)】
+ Android平台 修复 图片选择界面设置 filter 为 video 时仍然显示`原图`按钮的Bug
+ iOS平台 修复 二维码扫码在应用横屏模式时预览画面被旋转了的Bug [详情](https://ask.dcloud.net.cn/question/116187)
* 【uniCloud】
+ 【重要】clientDB 新增 支持使用 getTemp 对主表、副表过滤后再联表查询,大幅提升联表查询性能 [详情](https://uniapp.dcloud.net.cn/uniCloud/clientdb?id=lookup-with-temp)
#### 3.2.5.20210827-alpha
* 【重要】新增 uni-app Vue3 版本 支持运行和发行到 App
* 新增 uni-app Vue3 版本 发行到H5 支持以SSR方式发行
* 【uni-app】
+ App平台、H5平台 新增 uni.getLocale、uni.setLocale 接口,用于获取和设置应用语言 [详情](https://uniapp.dcloud.io/api/ui/locale)
+ App平台、H5平台 修复 scroll-view 组件滚动过快时 scroll 事件回调返回信息不正确的Bug [详情](https://ask.dcloud.net.cn/question/128573)
+ App平台、H5平台 修复 canvas 组件 createPattern 方法无效的Bug [详情](https://ask.dcloud.net.cn/question/128793)
+ App平台 优化 nvue 页面排版机制,解决横竖屏切换可能引起页面显示不正常的Bug
+ App平台 修复 nvue 页面 rich-text 组件解析块元素出现多余换行的Bug [详情](https://ask.dcloud.net.cn/question/116518)
+ App-Android平台 新增 nvue 页面适配支持折叠屏手机
+ App-Android平台 修复 nvue 页面 text 组件 line-height 高度失真引起 picker-view 无法对齐的Bug [详情](https://ask.dcloud.net.cn/question/128610)
+ App-Android平台 修复 nvue 页面 list、swiper、waterfall 组件嵌套时,包含的 header 组件可能无法正常显示Bug [详情](https://ask.dcloud.net.cn/question/128578)
+ App-iOS平台 修复 nvue 页面 textarea 组件的 blur 事件回调参数中缺少 cursor 属性数据的Bug [详情](https://ask.dcloud.net.cn/question/129023)
+ App-iOS平台 修复 nvue 页面 video 组件上方存在其他组件时可能引起显示错乱的Bug [详情](https://ask.dcloud.net.cn/question/129662)
+ App-iOS平台 修复 uni.openDocument 部分情况下回调错误的Bug
+ H5平台 修复 导航栏 searchInput 输入框出现两个清空 icon 的Bug [详情](https://ask.dcloud.net.cn/question/129225)
+ H5平台 修复 titleNView 配置 type 为 transparent 时,float 为 left 的 button 不居中的Bug [详情](https://ask.dcloud.net.cn/question/129598)
+ 支付宝小程序平台 修复 uni.chooseImage 在模拟器上不返回 tempFiles 的Bug [详情](https://ask.dcloud.net.cn/question/128732)
+ 字节小程序平台 修复 同名文件内引用同一个组件作用域插槽渲染错误的Bug [详情](https://ask.dcloud.net.cn/question/127962)
+ 字节小程序平台 修复 使用 .sync 更新父子组件间的值失效的Bug [详情](https://ask.dcloud.net.cn/question/127397)
+ QQ小程序平台 修复 真机运行报错的Bug [#2648](https://github.com/dcloudio/uni-app/issues/2648)
* 【uniCloud】
+ uniCloud本地调试插件 修复 云函数日志 文件路径存在中文时无法点击跳转的Bug
+ uniCloud本地调试插件 修复 阿里云事务执行 updateAndReturn 报错的Bug
* 【App插件(含5+App和uni-app的App端)】
+ 新增 uni-AD Sigmob广告联盟支持激励视频广告 [文档](https://uniapp.dcloud.io/api/a-d/rewarded-video)
+ 更新 uni-AD 腾讯优量汇SDK Android为4.400.1270版,iOS为4.13.02版;快手广告联盟SDK Android为3.3.13版, iOS为3.3.14版;快手内容联盟SDK Android为3.3.22版,iOS为3.3.22版
+ 优化 uni-AD 基础开屏广告填充率
+ 【重要】Android平台 新增 Android Support Library 升级迁移到 AndroidX
+ Android平台 新增 原生隐私政策提示框内容中的链接支持本地 html 页面地址 [详情](https://ask.dcloud.net.cn/article/36937)
+ Android平台 更新 云端打包环境 compileSdkVersion 版本为 30,buildToolsVersion 版本为 29.0.3
+ Android平台 修复 图片选择不设置 sizeType 时默认不显示`原图`按钮,选择图片会进行压缩的Bug [详情](https://ask.dcloud.net.cn/question/129156)
+ iOS平台 修复 3.2.0 版本引出的 微信登录、分享、支付,QQ登录、分享在部分设备可能引起崩溃的Bug [详情](https://ask.dcloud.net.cn/question/129378)
+ iOS平台 修复 视频播放控件 VideoPlayer 视频带有方向属性时 poster 封面图会被旋转的Bug [详情](https://ask.dcloud.net.cn/question/129090)
+ iOS平台 修复 视频播放控件 VideoPlayer 设置 objectFit 为 cover 时封面显示不正确的Bug [详情](https://ask.dcloud.net.cn/question/127991)
+ iOS平台 修复 新浪分享模块在某些安全平台检测可能误报使用 UIWebview APIs 的Bug
+ iOS平台 修复 二维码扫码部分图片可能无法识别的Bug
#### 3.2.1.20210811-alpha
* 【uni-app】
+ App-Andriod平台 优化 uni.chooseImage 图片选择界面增加`原图`按钮
......
#### 3.2.3.20210825
* 【uni-app】
+ App平台 修复 3.2.2 版本引出的资源重复编译的Bug [详情](https://ask.dcloud.net.cn/question/129157)
* 【App插件(含5+App和uni-app的App端)】
+ 更新 uni-AD 腾讯优量汇SDK Android为4.400.1270版,iOS为4.13.02版;快手广告SDK iOS为3.3.14版;快手内容联盟SDK iOS为3.3.22版
+ Android平台 修复 图片选择不设置 sizeType 时默认不显示`原图`按钮,选择图片会进行压缩的Bug [详情](https://ask.dcloud.net.cn/question/129156)
+ iOS平台 修复 3.2.2 版本引出的 微信登录、分享、支付,QQ登录、分享在部分设备可能引起崩溃的Bug [详情](https://ask.dcloud.net.cn/question/129378)
+ iOS平台 修复 新浪分享模块在某些安全平台检测可能误报使用 UIWebview APIs 的Bug
#### 3.2.2.20210818
* 【uni-app】
+ App平台、H5平台 新增 input 组件 type 支持 tel 类型
+ App平台、H5平台 新增 input 组件支持 text-content-type 属性
+ App平台、H5平台 修复 3.1.22 版本引出的 scroll-view 组件下拉刷新失效的Bug
+ App-Andriod平台 优化 uni.chooseImage 图片选择界面增加`原图`按钮
+ App-Android平台 修复 uni.saveFile 保存通过 uni.chooseImage 选择的图片在 Android11 设备上可能失败的Bug [详情](https://ask.dcloud.net.cn/question/128442)
+ App-iOS平台 修复 压缩后的视频无法通过 plus.io 接口操作的Bug
+ App-iOS平台 修复 nvue map 组件 marker 设置 label 的 bgColor 为透明值无效的Bug [详情](https://ask.dcloud.net.cn/question/126459)
+ App-iOS平台 修复 uni.chooseImage 图片选择界面`原图`按钮操作逻辑不正确的Bug
+ H5平台 优化 导航栏搜索框增加清除按钮
+ 小程序平台 修复 作用域插槽内使用事件后默认使用新版作用域插槽编译模式的Bug [详情](https://ask.dcloud.net.cn/question/127297)
+ 支付宝小程序平台 修复 部分内置组件事件当做自定义事件处理的Bug
+ 【重要】 uniad广告的ad组件 支持h5平台 [详情](https://uniapp.dcloud.net.cn/component/ad)
+ 【重要】 uni ui 支持 vue3 [详情](https://ext.dcloud.net.cn/plugin?id=55)
+ HBuilder官方预置项目全面支持 vue3,包括hello uni-app、hello uniCloud、uniCloud admin、uni-starter等
+ 新增 VUE3 条件编译,方便一套代码同时兼容vue2和vue3 [详情](https://uniapp.dcloud.net.cn/platform?id=preprocessor)
+ uni-ui uni-collapse 修复 由1.2.0版本引起的 change 事件返回 undefined 的Bug
+ uni-ui uni-collapse 优化 组件示例
+ uni-ui uni-collapse 新增 组件折叠动画
+ uni-ui uni-collapse 新增 value\v-model 属性 ,动态修改面板折叠状态
+ uni-ui uni-collapse 新增 title 插槽 ,可定义面板标题
+ uni-ui uni-collapse 新增 border 属性 ,显示隐藏面板内容分隔线
+ uni-ui uni-collapse 新增 title-border 属性 ,显示隐藏面板标题分隔线
+ uni-ui uni-collapse 修复 resize 方法失效的Bug
+ uni-ui uni-collapse 修复 change 事件返回参数不正确的Bug
+ uni-ui uni-collapse 优化 H5、App 平台自动更具内容更新高度,无需调用 reszie() 方法
+ uni-ui uni-data-checkbox 优化 在uni-forms组件,与label不对齐的问题
+ uni-ui uni-data-checkbox 修复 单选默认值为0不能选中的Bug
+ uni-ui uni-easyinput 优化 errorMessage 属性支持 Boolean 类型
+ uni-ui uni-file-picker 修复 return-type为object下,返回值不正确的Bug
+ uni-ui uni-file-picker 修复(重要) H5 平台下如果和uni-forms组件一同使用导致页面卡死的问题
+ uni-ui uni-file-picker 优化 h5平台下上传文件导致页面卡死的问题
+ uni-ui uni-forms 修复 vue2 下条件编译导致destroyed生命周期失效的Bug
+ uni-ui uni-forms 修复 1.2.1 引起的示例在小程序平台报错的Bug
+ uni-ui uni-forms 修复 动态校验表单,默认值为空的情况下校验失效的Bug
+ uni-ui uni-forms 修复 不指定name属性时,运行报错的Bug
+ uni-ui uni-forms 优化 label默认宽度从65调整至70,使required为true且四字时不换行
+ uni-ui uni-forms 优化 组件示例,新增动态校验示例代码
+ uni-ui uni-forms 优化 组件文档,使用方式更清晰
+ uni-ui uni-list 修复 与其他组件嵌套使用时,点击失效的Bug
+ uni-ui uni-swipe-action 修复 跨页面修改组件数据 ,导致不能滑动的问题
+ hello-uniapp 新增 同时适配 vue2 和 vue3(HBuilder X 3.2.0+ 支持 vue3)
+ uniCloud admin 新增 同时适配 vue2 和 vue3(HBuilder X 3.2.0+ 支持 vue3)
+ uniCloud admin 新增 应用管理功能,管理用户可登录的应用,如某账户只能登录管理端、不能登录用户端(uni-id@3.3.1+ 支持)
+ uniCloud admin 新增 升级系统管理 list 页的表格功能,支持数据排序、筛选、搜索等功能
+ uniCloud admin 修复 刷新页面时,左侧菜单丢失高亮状态的 bug
+ uniCloud admin 修复 修改密码失败的 bug
+ 新增 插件市场 支持前端文件加密 限付费的云端一体项目类型的前端文件 [详情](https://ask.dcloud.net.cn/article/35408)
* 【App插件(含5+App和uni-app的App端)】
+ 新增 一键登录 服务协议项样式支持设置复选框图标 [详情](https://uniapp.dcloud.io/univerify)
+ 优化 新浪微博 登录、分享 模块配置,去掉appsecret参数
+ 修复 一键登录 应用横屏显示时打开一键登录页面UI显示异常的Bug [详情](https://ask.dcloud.net.cn/question/126597)
+ 【重要】Android平台 新增 androidPrivacy.json 文件配置隐私政策提示框 [详情](https://ask.dcloud.net.cn/article/36937)
+ Android平台 更新 uni-AD 今日头条穿山甲广告SDK为3.8.0.6版;腾讯优量汇广告SDK为4.380.1250版;快手广告联盟SDK为3.3.12版,快手内容联盟SDK为3.3.20版
+ Android平台 更新 腾讯X5内核版本为 4.3.0.176_44076,解决在部分设备无法加载使用X5内核的问题
+ Android平台 更新 UniPush 使用的个推SDK版本为3.2.2.0,个推核心组件SDK版本为3.1.2.0
+ Android平台 修复 3.1.22 版本引出的 template 原生隐私政策提示框内容过多时显示不正常的Bug [详情](https://ask.dcloud.net.cn/question/127582)
+ Android平台 修复 3.1.19 版本引出的 UniPush 云端打包设置 GooglePlay(AAB) 渠道,getClientInfo 无法获取推送标识信息的Bug [详情](https://ask.dcloud.net.cn/question/127434)
+ Android平台 修复 3.1.19 版本引出的 直播推流 LivePusher 无法全屏预览的Bug [详情](https://ask.dcloud.net.cn/question/127987)
+ Android平台 修复 5+App项目打包后提交华为应用市场审核会误报包含三方广告SDK的Bug [详情](https://ask.dcloud.net.cn/question/126498)
+ Android平台 修复 申请权限被用户拒绝后,引导用户跳转设置界面开启权限后返回应用依然无法获取权限的Bug [详情](https://ask.dcloud.net.cn/question/128369)
+ Android平台 修复 页面中 input 标签 type 为 file 时,应用没有读写手机存储权限不会主动申请导致无法正常使用的Bug
+ Android平台 修复 VideoPlayer 播放带方向信息的视频源,暂停时显示方向不正确的Bug [详情](https://ask.dcloud.net.cn/question/125783)
+ Android平台 修复 VideoPlayer 播放部分视频源,暂停时可能显示黑边的Bug [详情](https://github.com/dcloudio/uni-app/issues/2779)
+ Android平台 修复 LivePusher 推流设置的本地缓冲池过大导致延迟时间过长的Bug
+ iOS平台 更新 QQ 登录、分享SDK版本为V3.5.3;新浪微博 登录、分享SDK版本为3.3.1;微信 登录、分享、支付SDK版本为1.9.1
+ iOS平台 更新 UniPush 使用的个推SDK为2.5.10.0无IDFA版
+ iOS平台 修复 一键登录 设置服务协议复选框默认不勾选时授权按钮背景颜色显示不正确的Bug
+ iOS平台 修复 Downloader 下载文件返回的请求头 Content-Range 数据为空时引起应用崩溃的Bug
+ iOS平台 修复 Downloader 下载文件名称出现乱码或包含特殊字符,导致保存文件无法读取的Bug
+ iOS平台 修复 百度语音识别在用户拒绝录音权限时没有返回错误回调的Bug
+ iOS平台 修复 在 iOS14 设备使用 5G 网络可能引起崩溃的Bug
* 【uniCloud】
+ 云数据库 新增 updateAndReturn 方法,可以更新并返回更新后的值(仅可在云函数中使用) [详情](https://uniapp.dcloud.net.cn/uniCloud/cf-database?id=update-and-return)
+ uniCloud本地调试插件 修复 部分情况下项目启动时报 npm 安装失败的Bug
+ uni-id 新增 多系统(如管理端、用户端)的配置隔离 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=isolate-config)
+ uni-id 新增 多系统用户管理,如某账户只能登录管理端,不能登录用户端 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=isolate-user)
* 此版本升级需要开发者处理历史用户数据,请参考 [补齐用户dcloud_appid字段](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=makeup-dcloud-appid)
+ uni-id 新增 QQ登录、注册相关功能 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=qq)
+ uni-id 调整 不再支持绑定手机、邮箱时不填验证码直接绑定
#### 3.1.22.20210709
* 【uni-app】
+ 【重要】调整 App平台、H5平台 input 组件 number 类型在 iOS 平台改用仅数字键盘(九宫格),如需输入负数和小数请改用 digit 类型
......
......@@ -17,8 +17,8 @@
### 看视频,只需25分钟,快速入门uniCloud
<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 target="_blank" href="https://www.bilibili.com/video/BV17p4y1a71x?p=1">
<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是什么和不是什么
......
......@@ -42,9 +42,13 @@
* [uni-sec-check 内容安全](https://ext.dcloud.net.cn/plugin?id=5460)
* [uniCloud响应体规范](uniCloud/unicloud-response-format.md)
* [前端网页托管](uniCloud/hosting.md)
* Redis扩展
* [费用说明](uniCloud/redis-buy.md)
* [开发文档](uniCloud/redis.md)
* [日志输出](uniCloud/cf-logger.md)
* [同时连多服务空间](uniCloud/init.md)
* [案例源码](uniCloud/resource.md)
* [案例](uniCloud/resource.md)
* [开发者使用反馈](https://mp.weixin.qq.com/s/p9GbRqRQuvEbmbpHJhZGmw)
* [学习资料](uniCloud/learning.md)
* [常见问题](uniCloud/faq.md)
* [微信云开发转uniCloud](uniCloud/wx2unicloud.md)
......
# uniCloud admin 框架
#### 看视频,15分钟掌握uniCloud admin
<a target="_blank" href="https://www.bilibili.com/video/BV17p4y1a71x?p=13">
<img src="https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/4332911b-6624-4587-8c77-78b68f1f8c78.jpg" alt="uniCloud admin视频教程" style="width: 60%;">
</a>
### 什么是 uniCloud admin
uniCloud admin 框架,是基于 uni-app 和 uniCloud 的应用后台管理的开源框架。
......
......@@ -2192,7 +2192,7 @@ let res = await db.collection('scores').aggregate()
```js
let res = await db.collection('vehicles').aggregate()
.addFields({
'spec.fuel_type': 'unleaded'
'specs.fuel_type': 'unleaded'
})
.end()
```
......
......@@ -954,6 +954,143 @@ db.collection('article,comment')
}]
```
#### 临时表联表查询@lookup-with-temp
> 新增于`HBuilderX 3.2.6`
在此之前clientDB联表查询只能直接使用虚拟表,而不能先对主表、副表过滤再生成虚拟表。由于生成虚拟表时需要需要整个主表和副表进行联表,在数据量大的情况下性能会很差。
使用临时表进行联表查询,可以先对主表或者副表进行过滤,然后在处理后的临时表的基础上生成虚拟表。
仍以上面article、comment两个表为例
获取article_id为'1'的文章及其评论的数据库操作,在直接联表查询和使用临时表联表查询时写法分别如下
```js
// 直接使用虚拟表查询
const res = await db.collection('article,comment')
.where('article_id._value=="1"')
.get()
// 先过滤article表,再获取虚拟表联表获取评论
const article = db.collection('article').where('article_id=="1"').getTemp() // 注意是getTemp不是get
const res = await db.collection(article, 'comment').get()
```
直接使用虚拟表联表查询,在第一步生成虚拟表时会以主表所有数据和副表进行联表查询,如果主表数据量很大,这一步会浪费相当多的时间。先过滤主表则没有这个问题,过滤之后仅有一条数据和副表进行联表查询。
**临时表(getTemp)内可以使用如下方法**
> 方法调用必须严格按照顺序,比如field不能放在where之前
```js
where
field // 关于field的使用限制见下方说明
orderBy
skip
limit
```
**field使用限制**
- field内仅可以进行字段过滤,不可对字段重命名、进行运算,`field('name as value')``field('add(score1, score2) as totalScore')`都是不支持的用法
- 进行联表查询时仅能使用临时表内已经过滤的字段间的关联关系,例如上面article、comment的查询,如果换成以下写法就无法联表查询
```js
const article = db.collection('article').where('article_id=="1"').field('title').getTemp() // 此处过滤article表,仅保留title字段。会导致下一步查询时找不到关联关系而查询失败
const res = await db.collection(article, 'comment').get()
```
**组合出来的虚拟表查询时可以使用的方法**
```js
foreignKey
where
field // 关于field的使用限制见下方说明
orderBy
skip
limit
```
一般情况下不需要再对虚拟表额外处理,因为数据在临时表内已经进行了过滤排序等操作。以下代码仅供演示,并无实际意义
```js
const article = db.collection('article').getTemp()
const comment = db.collection('comment').getTemp()
const res = await db.collection(article, comment).orderBy('title desc').get() // 按照title倒序排列
```
**权限校验**
要求各个临时表组成的虚拟表要满足权限限制,即权限校验不会计算组合成虚拟表之后使用的where、field
> 如下情况不能通过权限校验:虚拟表本身不满足权限限制,但是虚拟表内还有一个where用来过滤数据,过滤之后满足权限限制
以下为一个订单表(order)和书籍表(book)的schema示例
```js
// order schema
{
"bsonType": "object",
"required": [],
"permission": {
"read": "doc.uid==auth.uid",
"create": false,
"update": false,
"delete": false
},
"properties": {
"id": { // 订单id
"bsonType": "string"
},
"book_id": { // 书籍id
"bsonType": "string"
},
"uid": { // 用户id
"bsonType": "string"
}
}
}
// book schema
{
"bsonType": "object",
"required": [],
"permission": {
"read": true,
"create": false,
"update": false,
"delete": false
},
"properties": {
"id": { // 书籍id
"bsonType": "string"
},
"name": { // 书籍名称
"bsonType": "string"
}
}
}
```
如果先对主表进行过滤`where('uid==$cloudEnv_uid')`,则能满足权限限制(`order表的"doc.uid==auth.uid"`
```js
const order = db.collection('order')
.where('uid==$cloudEnv_uid') // 先过滤order表内满足条件的部分
.getTemp()
const res = await db.collection(order, 'book').get() // 可以通过权限校验
```
如果不对主表过滤,而是对虚拟表(联表结果)进行过滤,则无法满足权限限制(`order表的"doc.uid==auth.uid"`
```js
const order = db.collection('order').getTemp()
const res = await db.collection(order, 'book').where('uid==$cloudEnv_uid').get() // 对虚拟表过滤,无法通过权限校验
```
### 查询记录过滤,where条件@where
> 代码块`dbget`
......@@ -2768,96 +2905,11 @@ let res = await collection.where("name=='hey'").update({
#### 更新数组内指定下标的元素
```js
const db = uniCloud.database();
const res = await db.collection('table1').where({_id:'1'})
.update({
// 更新students[1]
['students.' + 1]: {
name: 'wang'
}
})
```
```json
// 更新前
{
"_id": "1",
"students": [
{
"name": "zhang"
},
{
"name": "li"
}
]
}
// 更新后
{
"_id": "1",
"students": [
{
"name": "zhang"
},
{
"name": "wang"
}
]
}
```
clientDB暂不支持此用法
#### 更新数组内匹配条件的元素
**注意:只可确定数组内只会被匹配到一个的时候使用**
```js
const db = uniCloud.database();
const res = await db.collection('table1').where({
'students.id': '001'
}).update({
// 将students内id为001的name改为li
'students.$.name': 'li'
})
```
```js
// 更新前
{
"_id": "1",
"students": [
{
"id": "001",
"name": "zhang"
},
{
"id": "002",
"name": "wang"
}
]
}
// 更新后
{
"_id": "1",
"students": [
{
"id": "001",
"name": "li"
},
{
"id": "002",
"name": "wang"
}
]
}
```
注意:
- 为方便控制权限,禁止前端使用set方法,一般情况下也不需要前端使用set
- 更新数据库时不可使用更新操作符`db.command.inc`
- 更新数据时键值不可使用`{'a.b.c': 1}`的形式,需要写成`{a:{b:{c:1}}}`形式(后续会对此进行优化)
clientDB暂不支持此用法
### MongoDB聚合操作@aggregate
......
......@@ -45,8 +45,6 @@ uni-app可以开发web界面,详见:[uni-app宽屏适配指南](https://unia
如果是需要pc版admin的话,uniCloud提供了[uniCloud admin](https://uniapp.dcloud.io/uniCloud/admin)
插件市场有很多uniCloud Admin系统可搜索:[https://ext.dcloud.net.cn/search?q=admin&cat1=7&orderBy=UpdatedDate](https://ext.dcloud.net.cn/search?q=admin&cat1=7&orderBy=UpdatedDate)
### 可否通过http url方式访问云函数或云数据库?
- 场景1:比如App端微信支付,需要配服务器回调地址,此时需要一个HTTP URL。
......@@ -55,6 +53,7 @@ uni-app可以开发web界面,详见:[uni-app宽屏适配指南](https://unia
uniCloud提供了`云函数URL化`,来满足上述需求。[详见](https://uniapp.dcloud.io/uniCloud/http)
### 微信云开发支持客户端直接操作数据库,uniCloud支持吗?
uniCloud提供了比微信云开发更优秀的前端操作数据库方案,见:[clientDB](https://uniapp.dcloud.net.cn/uniCloud/database)
### 云开发是nodejs+改良版MongoDB组合,对比php+mysql的传统组合怎么样?
......@@ -138,7 +137,10 @@ clientDB就是这种情况,因为clientDB内部有权限校验系统,某些
从uni-id 3.0起,用户的角色权限缓存在token里,不再查库。clientDB的速度比之前提升了100毫秒左右。如果还未升级,请尽快[升级](https://ext.dcloud.net.cn/plugin?id=2116)。同时注意如果用了uniCloud admin,也要配套升级。如果自己在云函数里编写过相关业务逻辑,请务必阅读升级注意事项。
- 原因4. 数据库索引
查询表的索引要正确配置,需要在where里查询的字段都建议配上索引。
查询表的索引要正确配置,需要在where里查询的字段都建议配上索引,否则查询会很慢。
但注意索引不能太多,否则增删改数据时又会变慢,精准很重要。推荐详细阅读[索引文档](https://uniapp.dcloud.io/uniCloud/db-index)
### 发布H5时还得自己找个服务器部署前端网页,可以不用自己再找服务器吗?
......@@ -151,10 +153,12 @@ uniCloud支持[前端网页托管](https://uniapp.dcloud.io/uniCloud/hosting),
### uniCloud云数据库如何实现全文检索
uniCloud的云数据库本身就是文档型数据库,可以全文检索,无需额外配置ElastciSearch等三方数据库
uniCloud的云数据库本身就是文档型数据库,可以全文检索。
查询数据时可以传入正则表达式。相比sql的like只有前后的%,正则表达式要强大的多。详情请参考[正则表达式查询](https://uniapp.dcloud.io/uniCloud/cf-database?id=regexp)
当然如果你需要额外配置ElastciSearch等三方数据库,也可以自己找服务器安装这些服务,同步数据,把需要搜索的数据同步过去。
### uniCloud内如何使用formdata
nodejs本身不支持formdata,但是可以通过手动拼装formdata的方式来进行支持,[参考](https://www.npmjs.com/package/form-data)
......@@ -352,6 +356,30 @@ uniCloud客户端callFunction及数据库相关接口会返回Promise类型结
</style>
```
### 发生故障时如何判断故障点
当你的系统出问题时,如何判断是DCloud还是阿里云或腾讯云的问题?
首先再次声明,DCloud的服务仅限于开发阶段。发行部署后,应用的访问不经过DCloud的服务器。
1. 通过域名判断故障点
- unicloud.dcloud.net.cn,属于DCloud,这个网站是开发期间使用的,你的应用上线运行时,不经过DCloud服务器。
如果该域名可以访问,但是在该域名下操作连接阿里云或腾讯云的数据出现问题,那么也是阿里云或腾讯云出了问题。
- bspapp.com,属于阿里云。如果该域名访问报错,说明阿里云serverless出故障了。
- tencentcloudapi.com,属于腾讯云。如果该域名访问报错,说明腾讯云serverless出故障了。
当然还有一种情况报错,其实是客户端的问题,包括浏览器的跨域问题,或者小程序的域名白名单问题,导致客户端无法连接uniCloud。这需要通过配置来解决,参考文档:[小程序和浏览器的域名访问配置](https://uniapp.dcloud.io/uniCloud/quickstart?id=%e5%b0%8f%e7%a8%8b%e5%ba%8f%e4%b8%ad%e4%bd%bf%e7%94%a8unicloud%e7%9a%84%e7%99%bd%e5%90%8d%e5%8d%95%e9%85%8d%e7%bd%ae)
2. 通过测试系统判断故障点
- [hello uniCloud 阿里云版](https://hellounicloud.dcloud.net.cn/#/)
- [hello uniCloud 腾讯云版](https://hellounicloud.dcloud.net.cn/tcb/#/)
如果测试系统不正常,那就说明这家云厂商的服务出故障了。
这2个系统是完全独立的,如果两个系统都故障了,那就是2家云厂商都故障了,而不是DCloud服务故障了。再次声明,发布后的服务,不连接DCloud的服务器。
当遇到uniCloud故障时,在uniCloud的QQ群或论坛里反馈即可。因为阿里云、腾讯云其实都有拨测系统,他们也会及时知道故障并解决的。
### 常见数据库错误
**`operation exceeded time limit`、`云数据库执行时间超限`错误**
......
......@@ -355,7 +355,7 @@ uniCloud数据库提供了多种数据导入导出和备份方案。
### 数据库回档备份和恢复@backup
uniCloud腾讯云版会在每天自动备份一次数据库,最多保留7天。这让开发者不再担心数据丢失。
uniCloud会在每天凌晨自动备份一次数据库,最多保留7天。这让开发者不再担心数据丢失。
**操作说明**
......@@ -369,8 +369,6 @@ uniCloud腾讯云版会在每天自动备份一次数据库,最多保留7天
### 数据导出为文件@export
**此功能暂时只有阿里云支持**
此功能主要用于导出整个集合的数据
**用法**
......@@ -389,8 +387,6 @@ uniCloud腾讯云版会在每天自动备份一次数据库,最多保留7天
### 从文件导入数据@import
**此功能暂时只有阿里云支持**
uniCloud提供的`db_init.json`主要是为了对数据库进行初始化,并不适合导入大量数据。与`db_init.json`不同,数据导入功能可以导入大量数据,目前支持导入 CSV、JSON 格式(关于json格式看下面注意事项)的文件数据。
**用法**
......@@ -449,4 +445,93 @@ uniCloud提供的`db_init.json`主要是为了对数据库进行初始化,并
$oid: "601cf1dbf194b200018ed8ec"
}
}
```
### 云厂商之间的迁移@cross-provider
目前可以使用云数据库的导入导出进行迁移,迁移数据库之前可以使用导出db_init.json功能将所有集合及索引导出。再使用数据导入导出功能进行迁移
#### 腾讯云迁移到阿里云@tencent-to-aliyun
迁移数据可以通过在腾讯云服务空间导出数据表为json文件,在阿里云服务空间导入json文件到表的方式进行迁移。
#### 阿里云迁移到腾讯云@aliyun-to-tencent
由于此前腾讯云并未完全支持ObjectId类型的数据,在阿里云迁移到腾讯云时需要注意处理一下`ObjectId`类型的数据,包括自动生成的_id字段以及关联到其他表的_id的字段。简单来说就是将导出的数据内的ObjectId类型的数据处理成字符串且不满足ObjectId的格式。
例:
```js
// 原始数据
{"_id":{"$oid":"60fa6d25cd84d60001ec38a2"},"uid":{"$oid":"60fa6d1d2e5faa0001ade857"}}
// 调整后的数据
{"_id":"60fa6d25cd84d60001ec38a2a","uid":"60fa6d1d2e5faa0001ade857a"} // 在结尾追加了一个“a”使其不满足ObjectId格式
```
以下为一个简单的脚本示例用于处理导出的json文件
如果将此文件存储为`parse.js`,使用`node index.js 输入文件相对或绝对路径 输出文件相对或绝对路径`即可处理导出的json文件
```js
const fs = require('fs')
const path = require('path')
const readline = require('readline')
const cwd = process.cwd()
const inputPath = path.resolve(cwd, process.argv[2])
const outputPath = path.resolve(cwd, process.argv[3])
if (fs.existsSync(outputPath)) {
throw new Error(`输出路径(${outputPath})已存在`)
}
function getType(val) {
return Object.prototype.toString.call(val).slice(8, -1).toLowerCase()
}
function parseRecord(obj) {
const type = getType(obj)
switch (type) {
case 'object':
if (obj.$oid) {
return obj.$oid + 'a'
}
const keys = Object.keys(obj)
for (let i = 0; i < keys.length; i++) {
const key = keys[i];
obj[key] = parseRecord(obj[key])
}
return obj
case 'array':
for (let i = 0; i < obj.length; i++) {
obj[i] = parseRecord(obj[i])
}
return obj
default:
return obj
}
}
async function parseCollection() {
const inputStream = fs.createReadStream(inputPath)
const outputStream = fs.createWriteStream(outputPath)
const rl = readline.createInterface({
input: inputStream
});
for await (const line of rl) {
const recordStr = line.trim()
if (!recordStr) {
continue
}
const record = parseRecord(JSON.parse(recordStr))
outputStream.write(JSON.stringify(record) + '\n')
}
rl.close()
console.log(`处理后的文件已输出到${outputPath}`)
}
parseCollection()
```
\ No newline at end of file
......@@ -119,6 +119,9 @@ DCloud为开发者提供了`uni发布平台`,包括网站发布、App发布和
- 在阿里云开启了泛域名加速的情况下,对应的子域名可能无法配置到前端网页托管,**这种情况下可能会提示:该域名已被添加过,不能重复添加**
- 暂不支持绑定中文域名
- 阿里云要求必须有一个备案在阿里才可以绑定,按照uniCloud web控制台提示操作即可,腾讯云没有此条限制。
**务必注意,如果你是在腾讯购买并备案的域名需要保留一个到腾讯ip的解析,否则备案会被撤销,阿里云同理。具体细节可以咨询购买域名的云厂商**
### 路由规则@routing
......@@ -247,7 +250,15 @@ uni-app项目根据路由模式不同需要做不同的配置
手动部署uni-app项目时需要注意将文件部署在配置的h5基础路径下。**HBuilderX一键部署时会自动按照manifest.json内配置的基础路径进行部署**
如果部署多个项目到一个服务空间可以使用不同的基础路径来区分,需要注意的是这多个项目中只有一个项目可以使用history模式
### 部署多个项目@host-multi-project
如果部署多个项目到一个服务空间可以使用不同的基础路径来区分,需要注意的是这多个项目中只有一个项目可以使用history模式。
以一个admin项目和一个用户端项目为例,可以将用户端项目部署在前端网页托管的根目录下,admin项目部署在`/admin`目录下。通过`https://xxx.com/`访问用户端项目,通过`https://xxx.com/admin/`来访问admin项目
**注意**
- 部署到子目录内的uni-app项目发行前需要将项目下manifest.json内`h5配置-->运行的基础路径`配置为子目录名,例`/admin/`
## 腾讯云计费详细说明
......
......@@ -565,4 +565,8 @@ uniCloud提供包月、按量计费两种计费方式(仅腾讯云),具体
|数据库读操作数|5000万次/天|
|数据库写操作数|3000万次/天|
|数据库集合数量限制|800个|
|备份保留天数|14天|
\ No newline at end of file
|备份保留天数|14天|
## 发生故障时如何判断故障点
当你的线上系统故障时,可以参考此文档判断责任归属:[如何判断是DCloud或阿里云或腾讯云的问题](https://uniapp.dcloud.io/uniCloud/faq?id=%e5%8f%91%e7%94%9f%e6%95%85%e9%9a%9c%e6%97%b6%e5%a6%82%e4%bd%95%e5%88%a4%e6%96%ad%e6%95%85%e9%9a%9c%e7%82%b9)
\ No newline at end of file
## 开通@open
> 仅阿里云服务空间支持
目前可以在uniCloud web控制台购买redis服务,**所购买的实例由阿里云提供,并非由DCloud提供,DCloud只提供购买入口**
1. 登录[uniCloud web控制台](https://unicloud.dcloud.net.cn/)
2. 选择一个**阿里云**服务空间
3. 选择左侧redis菜单,选择实例并购买即可
![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/3a29e715-827d-43bb-b61b-fcff71cb42f6.jpg)
**注意**
- 开通的redis实例会自动和当前服务空间绑定
- 后续可以对redis实例升配降配,请阅读下方升配降配的说明
- 购买redis实例时,选择较长的”购买时长“可以享受更多的折扣
- 付费后,需要等待3-5分钟redis实例才能初始化完成
## 规格说明@type
|规格 |CPU核数|每秒新建连接数上限 |连接数上限 |带宽(MB/s) |QPS参考值|
|-- |-- |-- |-- |-- |-- |
|256MB主从版|2 |10,000 |10,000 |10 |80,000 |
|1GB主从版 |2 |10,000 |10,000 |10 |80,000 |
|2GB主从版 |2 |10,000 |10,000 |16 |80,000 |
|4GB主从版 |2 |10,000 |10,000 |24 |80,000 |
|8GB主从版 |2 |10,000 |10,000 |24 |80,000 |
## 费用说明@fee
### 续费@renew
在uniCloud web控制台redis详情页面可以对redis实例进行续费操作。
![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/d848dd0a-15aa-46ec-89f9-84ade9721246.jpg)
实例到期后的第1~7天,实例状态为被禁用,无法被访问。如需继续使用,您需要及时为实例续费
实例处于被禁用状态后,以您执行续费操作的时间为起点计算包年包月时长,例如您的实例在2021年04月10日到期,在2021年04月15日执行手动续费1个月的操作,那么实例的到期时间即为2021年5月15日。
### 升配@upgrade
在uniCloud web控制台redis详情页面可以对redis实例进行升配操作。升级配置需要按照剩余时间补足差额
升级实例配置所需费用 =(升级后实例每天的价格 - 升级前实例每天的价格)× 服务到期的剩余天数,具体费用以web控制台显示为准
**注意**
- 配置变更将会产生切换操作而带来1-2次30秒内的闪断,建议您在业务低峰期发起变配,避免影响业务。
### 降配@downgrade
在uniCloud web控制台redis详情页面可以对redis实例进行降配操作。
**目前可以降配但是无法退还费用到您的账号**
降配时可以选择以下两种方式
- 立即降配:实时操作降配。
- 自动降配:开启自动降配,系统会在到期当天凌晨进行降配操作。
**注意**
- 配置变更将会产生切换操作而带来1-2次30秒内的闪断,建议您在业务低峰期发起变配,避免影响业务。
- 如果降配时内存用量超过降配目标规格的内存上限,则会导致降配失败
## 在云函数中使用
如何在云函数中使用redis,请参考[扩展能力Redis](uniCloud/redis.md)
## FAQ
- 为什么刚开通的redis实例就用了几十MB内存
redis基础服务会占用一定的内存,大小在32MB-64MB之间
\ No newline at end of file
# 扩展能力Redis
> 目前仅支持阿里云
redis是一个内存中的数据结构存储系统,在项目中通常作为数据库的中间件来使用。相对于直接从数据库中读取数据,速度上会有明显的提升。
## 开通Redis扩展能力@buy
参考[开通redis](uniCloud/redis-buy.md)
## 为云函数启用redis扩展能力@use-in-function
目前需要开发者手动在云函数的package.json内添加云函数的扩展能力,后续HBuilderX会提供图形化界面。(如果云函数目录下没有package.json,可以通过在云函数目录下执行`npm init -y`来生成)
下面是一个开启了redis扩展能力的云函数的package.json示例,**注意不可有注释,以下文件内容中的注释仅为说明,如果拷贝此文件,切记去除注释**
```js
{
"name": "redis-test",
"version": "1.0.0",
"description": "",
"main": "index.js",
"extensions": {
"uni-cloud-redis": {} // 配置为此云函数开启redis扩展能力,值为空对象留作后续追加参数,暂无内容
},
"author": ""
}
```
```js
// 简单的使用示例
'use strict';
const redis = uniCloud.redis()
exports.main = async (event, context) => {
const getResult = await redis.get('my-key')
const setResult = await redis.set('my-key', 'value-test')
return {
getResult,
setResult
}
};
```
## 数据类型@data-type
redis中数据被存储为key-value形式,key均为字符串,value有以下几种类型
### 字符串String
字符串类型,这是最简单Redis类型。需要注意的是redis并没有number类型,如果存入number类型的数据最终也会转为string类型。
```js
await redis.set('string-key', 1) // 设置string-key的值为字符串"1"
await redis.get('string-key') // 获取string-key的值,"1"
```
### 列表List
列表类型,类似JavaScript中的数组,但是有区别。严格来说List是基于链表实现的,和js中数组相比一个显著的差异就是头部插入的效率。如果你测试过往一个长度百万的数组最前面插入一位的话,你会发现这个操作会耗时很久。但是List并没有这个问题,对于List来说在前后插入数据耗时是一样的。
**注意**
- list为空时对应的键会被删除,即redis内不存在空List
```js
await redis.lpush('list-key', 1) // 往list-key左侧添加一个元素,不存在则创建
```
### 散列Hash
Hash类型类似js里面的Object。
```js
await redis.hmset('hash-key', 'key1', 'value1', 'key2', 'value2') // 批量为hash-key添加键值,不存在则创建
await redis.hset('hash-key', 'key1', 'value1') // 为hash-key添加键值,不存在则创建
```
### 集合Set
集合是String的**无序排列**,集合内的元素不可重复
```js
await redis.sadd('set-key', 'value1', 'value2') // 往集合内添加数据,不存在则创建
```
### 有序集合Sorted Sets
有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素将有一个double类型的分数(分数不一定是连续的),用于对元素进行排序
```js
await redis.zadd('sorted-set-key', 1, 'value1') // 往有序集合内添加数据并指定分数,不存在则创建
await redis.zadd('sorted-set-key', 2, 'value2')
```
## API@api
> 此处仅列举常见命令,完整命令支持请查看[redis官方文档](https://redis.io/commands)
### get
用于获取字符串类型的数据
**接口形式**
```js
await redis.get(key: string)
```
**入参说明**
|参数 |说明 |必填 |说明 |
|-- |-- |-- |-- |
|key |键 |是 | |
**返回值**
此接口返回获取到的数据(字符串类型),返回null表示无此键
**示例**
```js
await redis.get('string-key') // '1'
```
### set
用于设置字符串类型数据,新增、修改均可
**接口形式**
该接口有多种形式
```js
await redis.set(key: string, value: string, flag: string)
await redis.set(key: string, value: string, mode: string, duration: number)
await redis.set(key: string, value: string, mode: string, duration: number, flag: string)
```
**入参说明**
|参数 |说明 |必填 |说明 |
|-- |-- |-- |-- |
|key |键 |是 | |
|value |值 |是 | |
|flag |区分状态进行SET |否 |NX:不存在时才设置,EX:存在时才设置 |
|mode |标识duration的单位 |否(duration不为空时必填) |EX:单位秒,PX:单位毫秒 |
|duration |过期时间,到期后自动删除 |否 | |
**返回值**
此接口返回字符串类型'OK'表示操作成功,返回null表示未更新
**示例**
```js
await redis.set('string-key', 1) // redis内存储为字符串"1"
await redis.set('string-key', '1', 'NX') // string-key不存在时设置为1
await redis.set('string-key', '1', 'EX', 100) // string-key 100秒后过期
await redis.set('string-key', '1', 'EX', 100, 'NX') // string-key不存在时设置为1,过期时间设置为100秒
```
### setex
键存在时,设置为指定字符串并指定过期时间
**接口形式**
```js
await redis.setex(key: string, seconds: number, value: string)
```
**入参说明**
|参数 |说明 |必填 |说明 |
|-- |-- |-- |-- |
|key |键 |是 | |
|seconds|过期时间 |是 |单位:秒 |
|value |值 |是 | |
**返回值**
此接口返回字符串类型'OK'表示操作成功,返回null表示未更新
**示例**
```js
await redis.setex('string-key', 10, 'value') // 值设置为value,过期时间10秒
```
### setnx
键不存在时,设置为指定字符串
**接口形式**
```js
await redis.setnx(key: string, value: string)
```
**入参说明**
|参数 |说明 |必填 |说明 |
|-- |-- |-- |-- |
|key |键 |是 | |
|value |值 |是 | |
**返回值**
此接口返回字符串类型'OK'表示操作成功,返回null表示未更新
**示例**
```js
await redis.setnx('string-key', 'value') // 值设置为value,过期时间10秒
```
### mget
批量获取指定键的值
**接口形式**
```js
await redis.mget(key1: string, key2: string, ...)
```
**入参说明**
接收一个键的列表
**返回值**
此接口按传入顺序返回获取到的数据组成的数组,存在的键返回字符串类型,不存在的键返回null
**示例**
```js
await redis.mget('key1', 'key2') // '1'
```
### mset
批量设置键值
**接口形式**
```js
await redis.mset(key1: string, value1: string, key2: string, value2: string, ...)
```
**入参说明**
接收一个键、值的列表
**返回值**
此接口只会返回OK
**示例**
```js
await redis.mset('key1', '1', 'key2', '2') // 'OK'
```
### del
用于删除执行的键
**接口形式**
```js
await redis.del(key: string)
```
**入参说明**
|参数 |说明 |必填 |说明 |
|-- |-- |-- |-- |
|key |键 |是 | |
**返回值**
接口返回数字1表示删除成功,数字0表示键不存在删除失败
**示例**
```js
await redis.del('string-key') // '1'
```
### incr
对指定的键执行加1操作
**接口形式**
```js
await redis.incr(key: string)
```
**入参说明**
|参数 |说明 |必填 |说明 |
|-- |-- |-- |-- |
|key |键 |是 | |
**返回值**
接口返回执行加一操作后的值(number类型)
**注意**
操作的值并非整数形式(例:字符串"1"是整数形式,字符串"a"非整数形式)时会直接抛出错误
**示例**
```js
await redis.set('string-key', '1')
await redis.incr('string-key') // 2
```
### incrby
在指定的键上加一个整数
**接口形式**
```js
await redis.incrby(key: string, increment: number)
```
**入参说明**
|参数 |说明 |必填 |说明 |
|-- |-- |-- |-- |
|key |键 |是 | |
|increment|增加的值 |是 | |
**返回值**
接口返回执行加操作后的值(number类型)
**注意**
操作的值并非整数形式(例:字符串"1"是整数形式,字符串"a"非整数形式)时会直接抛出错误
**示例**
```js
await redis.set('string-key', '1')
await redis.incrby('string-key', 2) // 3
```
### incrbyfloat
在指定的键上加一个浮点数
**接口形式**
```js
await redis.incrbyfloat(key: string, increment: number)
```
**入参说明**
|参数 |说明 |必填 |说明 |
|-- |-- |-- |-- |
|key |键 |是 | |
|increment|增加的值,允许为负值来实现相减功能 |是 | |
**返回值**
接口返回执行加操作后的值(number类型)
**注意**
- 操作的值并非整数形式(例:字符串"1"是整数形式,字符串"a"非整数形式)时会直接抛出错误
- 浮点数相加和js内表现一致,可能与预期结果不一致,见下方示例
**示例**
```js
await redis.set('string-key', '1.1')
await redis.incrbyfloat('string-key', 2.2) // 3.30000000000000027
// js内执行 0.1 + 0.2 会得到类似的值 3.3000000000000003
```
### decr
对指定的键执行减1操作
**接口形式**
```js
await redis.decr(key: string)
```
**入参说明**
|参数 |说明 |必填 |说明 |
|-- |-- |-- |-- |
|key |键 |是 | |
**返回值**
接口返回执行减1操作后的值(number类型)
**注意**
操作的值并非整数形式(例:字符串"1"是整数形式,字符串"a"非整数形式)时会直接抛出错误
**示例**
```js
await redis.set('string-key', '1')
await redis.decr('string-key') // 0
```
### decrby
在指定的键上减一个整数
**接口形式**
```js
await redis.decrby(key: string, decrement: number)
```
**入参说明**
|参数 |说明 |必填 |说明 |
|-- |-- |-- |-- |
|key |键 |是 | |
|decrement|减少的值 |是 | |
**返回值**
接口返回执行加一操作后的值(number类型)
**注意**
操作的值并非整数形式(例:字符串"1"是整数形式,字符串"a"非整数形式)时会直接抛出错误
**示例**
```js
await redis.set('string-key', '1')
await redis.decrby('string-key', 2) // -1
```
### rpush
在List类型数据结尾追加数据
**接口形式**
```js
await redis.rpush(key: string, value: string)
```
**入参说明**
|参数 |说明 |必填 |说明 |
|-- |-- |-- |-- |
|key |键 |是 | |
|value|追加的值 |是 | |
**返回值**
接口返回执行追加操作后List的长度
**注意**
- 如果操作的数据类型不为List,则会抛出错误
- 如果指定的key不存在,则创建一个新的List并将value追加进去
### rpushx
用法同`rpush`,仅在list存在时才在List结尾追加数据
### rpop
从List类型数据结尾删除一条数据,并返回删除的值
**注意:redis内List长度为0时会被自动删除**
**接口形式**
```js
await redis.rpop(key: string)
```
**入参说明**
|参数 |说明 |必填 |说明 |
|-- |-- |-- |-- |
|key |键 |是 | |
**返回值**
接口返回此次操作删除的值,如果key不存在则返回null
**注意**
- 如果操作的数据类型不为List,则会抛出错误
### lpush
在List类型数据开头追加数据
**接口形式**
```js
await redis.lpush(key: string, value: string)
```
**入参说明**
|参数 |说明 |必填 |说明 |
|-- |-- |-- |-- |
|key |键 |是 | |
|value|追加的值 |是 | |
**返回值**
接口返回执行追加操作后List的长度
**注意**
- 如果操作的数据类型不为List,则会抛出错误
- 如果指定的key不存在,则创建一个新的List并将value追加进去
### lpushx
用法同`lpush`,仅在list存在时才在List开头追加数据
### lpop
从List类型数据开头删除一条数据,并返回删除的值
**注意:redis内List长度为0时会被自动删除**
**接口形式**
```js
await redis.rpop(key: string)
```
**入参说明**
|参数 |说明 |必填 |说明 |
|-- |-- |-- |-- |
|key |键 |是 | |
**返回值**
接口返回此次操作删除的值,如果key不存在则返回null
**注意**
- 如果操作的数据类型不为List,则会抛出错误
### linsert
在List内指定元素位置前或后插入元素,未匹配到指定元素时不插入
**接口形式**
```js
await redis.linsert(key: string, dir: 'BEFORE' | 'AFTER', pivot: string, value: string)
```
**入参说明**
|参数 |说明 |必填 |说明 |
|-- |-- |-- |-- |
|key |键 |是 | |
|dir |指定在前还是后插入 |是 | |
|pivot|指定要查找的元素 |是 | |
|value|指定要插入的值 |是 | |
**返回值**
接口返回插入后的list长度,未匹配到要查找的值时返回-1,key不存在时此接口返回0
**注意**
- 如果操作的数据类型不为List,则会抛出错误
### lindex
获取List内指定下标的元素
**接口形式**
```js
await redis.lindex(key: string, index: number)
```
**入参说明**
|参数 |说明 |必填 |说明 |
|-- |-- |-- |-- |
|key |键 |是 | |
|index|指定下标 |是 | |
**返回值**
接口返回指定下标在list内对应的值,如果key不存在则返回null
**注意**
- 如果操作的数据类型不为List,则会抛出错误
### llen
返回List的长度
**接口形式**
```js
await redis.llen(key: string)
```
**入参说明**
|参数 |说明 |必填 |说明 |
|-- |-- |-- |-- |
|key |键 |是 | |
**返回值**
接口返回list的长度,如果key不存在则返回0
**注意**
- 如果操作的数据类型不为List,则会抛出错误
### exists
判断一个键是否存在
**接口形式**
```js
await redis.exists(key: string)
```
**入参说明**
|参数 |说明 |必填 |说明 |
|-- |-- |-- |-- |
|key |键 |是 | |
**返回值**
如果key存在返回数字1,如果key不存在返回数字0
**示例**
```js
await redis.exists('string-key') // 0 | 1
```
### expire
为指定的key设置过期时间
**接口形式**
```js
await redis.expire(key: string, seconds: number)
```
**入参说明**
|参数 |说明 |必填 |说明 |
|-- |-- |-- |-- |
|key |键 |是 | |
|seconds|过期时间 |是 |单位:秒 |
**返回值**
如果成功设置过期时间返回数字1,如果未成功存在返回数字0
**示例**
```js
await redis.expire('key', 600) // 设置key为600秒后过期
```
### ttl
获取过期时间剩余多少秒
**接口形式**
```js
await redis.ttl(key: string)
```
**入参说明**
|参数 |说明 |必填 |说明 |
|-- |-- |-- |-- |
|key |键 |是 | |
**返回值**
如果没有设置过期时间(永久有效)返回数字-1,如果不存在或者已过期返回数字-2,否则返回剩余秒数
**示例**
```js
await redis.ttl('key')
```
### multi
将多条指令作为一个原子执行。
**示例**
```js
const multi = redis.multi()
multi.set('key1', 'value1')
multi.set('key2', 'value2')
multi.set('key3', 'value3')
multi.set('key4', 'value4')
const res = await multi.exec()
// 如果执行成功
res = ['OK','OK','OK','OK']
// 某个操作出现错误
res = ['OK','OK', error, 'OK'] // error为 Error对象的实例
```
### 执行lua脚本@eval
某些情况下需要使用复杂的原子操作以避免高并发下数据修改混乱的问题,这种需求一般可通过执行lua脚本实现。如以下示例,判断redis中不存在key-test时,将其值设置为1;存在且小于10时进行加一操作;大于等于10时不进行操作直接返回。
`{0, 1}`是lua内的table类型,返回到云函数时会转为数组对应的值为`[0, 1]`
```js
const [operationType, currentValue] = await redis.eval(`local val = redis.call('get','key-test')
local valNum = tonumber(val)
if (val == nil) then
redis.call('set', 'key-test', 1)
return {0, 1}
end
if (valNum < 10) then
redis.call('incrby', 'key-test', 1)
return {1, valNum + 1}
else
return {2, valNum}
end
`, 0)
```
## FAQ@faq
- 云函数与redis的连接
和传统开发不同,云函数实例之间是不互通的,也就是说每个使用redis的函数实例都会和redis建立一个连接,在云函数实例复用时此连接也会复用。
- 云函数本地调试
目前不支持本地运行使用了Redis扩展能力的云函数,请上传到云端测试
\ No newline at end of file
注:本更新日志仅限uniCloud,包括uniCloud web控制台、uniCloud 云端运行环境。这些更新不跟随HBuilderX发版更新。
#### 2021-09-01
+ 【重要】clientDB 新增 支持使用 getTemp 对主表、副表过滤后再联表查询,大幅提升联表查询性能 [详情](https://uniapp.dcloud.net.cn/uniCloud/clientdb?id=lookup-with-temp)
+ 阿里云 新增 redis扩展能力,加速云函数响应 [详情](https://uniapp.dcloud.net.cn/uniCloud/redis)
#### 2021-08-27
+ uniCloud本地调试插件 修复 云函数日志 文件路径存在中文时无法点击跳转的Bug
+ uniCloud本地调试插件 修复 阿里云事务执行 updateAndReturn 报错的Bug
#### 2021-08-01
+ 云数据库 新增 updateAndReturn 方法,可以更新并返回更新后的值(仅可在云函数中使用) [详情](https://uniapp.dcloud.net.cn/uniCloud/cf-database?id=update-and-return)
+ uniCloud本地调试插件 修复 部分情况下项目启动时报 npm 安装失败的Bug
......
如下是使用 ``uniCloud`` 的插件市场项目或开源案例。欢迎大家提交插件或开源项目,可以以pr方式直接编辑本文档。
### 开源项目
- [贝壳阅读](https://ext.dcloud.net.cn/plugin?id=5187)
集成签到、抽奖、金币积分多种好玩的激励玩法,免费读书,广告变现。本书城系统可独立部署,也可作为插件集成至任何流量主APP。
- [Hello uniCloud]:在HBuilderX 2.6+版本,新建uni-app项目的项目模板中有 hello unicloud模板,展示了uniCloud的云函数基本用法、cdn使用方式。它对应的H5演示地址是:[https://hellounicloud.m3w.cn/](https://hellounicloud.m3w.cn/)
- [uni抗疫开源项目汇总](https://gitee.com/dcloud/xinguan2020):这是一个项目集合汇总,里面有大量与抗疫项目的开源项目,均基于uniCloud。包括外来人员登记系统、学生健康报备系统、员工疫情筛查工具、消毒检查登记系统、物资管理系统等。这些项目具备一定通用性,可以稍加改造用于其他行业应用。
- [uniPush之unicloud版](https://ext.dcloud.net.cn/plugin?id=1680): 封装好的云函数,直接在服务器端发送push消息。
<a href="https://ext.dcloud.net.cn/plugin?id=5187" target="_blank">
<img width="400" src="https://img-cdn-aliyun.dcloud.net.cn/stream/plugin_screens/baker-app_0.jpg?image_process=quality,q_70&v=1622277334">
</a>
更多项目源码,见**插件市场**[https://ext.dcloud.net.cn/?cat1=7](https://ext.dcloud.net.cn/?cat1=7)
- [中国教育发布(中国教育部官方App )](http://xwapp.moe.gov.cn/h5/sharepage/download.html)[详见报道](http://www.moe.gov.cn/jyb_xwfb/gzdt_gzdt/s5987/202009/t20200904_485105.html)
### 商用案例
- 中国教育发布:中国教育部官方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="https://www.gov.cn/xinwen/2020-09/05/5540909/images/ea39536dd03c46789ec0db62aae5a694.png" width="200"/>
<span style="margin-top:15px;">iOS、Android通用扫码地址</span>
</a>
</div>
<a href="http://xwapp.moe.gov.cn/h5/sharepage/download.html" target="_blank">
<img width="400" src="https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/777555f6-d237-47bb-9677-f8cd8d4761cb.png">
</a>
- 登登多邻国:是登登教育公司为外语学习者提供的题库软件。其服务端整体基于uniCloud,前端包括PC和H5网站、微信小程序,均连接uniCloud。日请求量**百万级**
- [uni-starter](https://ext.dcloud.net.cn/plugin?id=5057)
一个集成了大量商用项目常见功能的,云端一体应用快速开发基本项目模版。
web体验地址:[https://duolingo.91ddedu.com](https://duolingo.91ddedu.com)
<a href="https://ext.dcloud.net.cn/plugin?id=5057" target="_blank">
<img width="400" src="https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/72ccebcc-e9e0-4b9f-9f7b-1249edde3aba.png">
</a>
微信小程序体验方式:微信搜索“登登多邻国真题库”,或扫描下方小程序码
- [Hello uniCloud](https://ext.dcloud.net.cn/plugin?id=4082):在HBuilderX 2.6+版本,新建uni-app项目的项目模板中有 hello unicloud模板,展示了uniCloud的云函数基本用法、cdn使用方式。它对应的H5演示地址是:[https://hellounicloud.m3w.cn/](https://hellounicloud.m3w.cn/)
<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>
- [uni抗疫开源项目汇总](https://gitee.com/dcloud/xinguan2020):这是一个项目集合汇总,里面有大量与抗疫项目的开源项目,均基于uniCloud。包括外来人员登记系统、学生健康报备系统、员工疫情筛查工具、消毒检查登记系统、物资管理系统等。这些项目具备一定通用性,可以稍加改造用于其他行业应用。
- 登登多邻国:是登登教育公司为外语学习者提供的题库软件。其服务端整体基于uniCloud,前端包括PC和H5网站、微信小程序,均连接uniCloud。日请求量**百万级**
web体验地址:[https://duolingo.91ddedu.com](https://duolingo.91ddedu.com)
微信小程序体验方式:微信搜索“登登多邻国真题库”,或扫描下方小程序码
<a href="https://det.91ddedu.com" target="_blank">
<img width="150" src="https://duolingo.91ddedu.com/static/miniapp.4a4ddf6b.jpg">
</a>
- [国云商城](https://ext.dcloud.net.cn/plugin?id=2413):优秀的电商系统,购买本系统,快速上线属于你自己的电商应用。
- [云上商城](https://ext.dcloud.net.cn/plugin?id=1989):完整的线上生活超市,根据当前定位,就近匹配仓库。
......@@ -42,3 +44,5 @@ web体验地址:[https://duolingo.91ddedu.com](https://duolingo.91ddedu.com)
- 小森林集:壁纸、皮肤小程序。微信小程序搜索“小森林集”
- MOODA心情日记:随时随地记录心情。微信小程序搜索“MOODA心情日记”
- 柳州市人民医院流行病学调查表:调查登记小程序。微信小程序搜索“柳州市人民医院流行病学调查表 ”
更多uniClouid项目和插件,见**插件市场**[https://ext.dcloud.net.cn/?cat1=7](https://ext.dcloud.net.cn/?cat1=7)
\ No newline at end of file
......@@ -965,7 +965,7 @@ errorMessage支持字符串,也支持json object。类型为object时,可定
表级控制,包括增删改查四种权限,分别称为:create、delete、update、read。(注意这里使用的是行业通用的crud命名,与操作数据库的方法add()、remove()、update()、get()在命名上有差异,但表意是相同的)
所有的操作的默认值均为false。也就是不配置permission代表前端不能操作数据库(admin用户例外)。
所有的操作的默认值均为false。也就是不配置permission代表前端不能操作数据库(角色为admin用户例外)。
例如一个user表,里面有_id、name、pwd等字段,该表的`DB Schema`如下,代表前端用户可读(包括游客),但前端非admin用户不可新增、删除、更新数据记录。
......@@ -1094,7 +1094,7 @@ permission的字段级控制,包括读写两种权限,分别称为:read、
|action |数据操作请求同时指定的uni-clientDB-action。用于指定前端的数据操作必须同时附带执行一个action云函数,如未触发该action则权限验证失败 |
**注意**
- `auth`表示正在执行操作的用户对象
- `auth.xxx`均由uni-id提供,依赖于[uni-id公共模块](uniCloud/uni-id.md)
- `doc.xxx`表示将要查询/修改/删除的每条数据(注意并不包括新增数据,新增数据应通过值域校验进行验证),如果将要访问的数据不满足permission规则将会拒绝执行
- `uni-id`的角色和权限,也即auth.role和auth.permission是不一样的概念。注意阅读[uni-id 角色权限](/uniCloud/uni-id?id=rbac)
......
......@@ -32,7 +32,7 @@
- 定时触发使用的是utc+8的时间
- 除了在web控制台配置外,还可以在云函数package.json内添加定时触发相关的配置[云函数 package.json](uniCloud/cf-functions.md?id=packagejson)
使用定时触发可以执行一些跑批任务,目前阿里云可以在使用定时触发时将云函数最高超时时间设置为600秒(非定时触发时不支持60秒以上超时时间),腾讯云目前最大超时时间为60秒。
使用定时触发可以执行一些跑批任务,目前阿里云可以在使用定时触发时将云函数最高超时时间设置为600秒(非定时触发时不支持60秒以上超时时间),腾讯云目前最大超时时间为900秒。
### 字段规则
- 定时触发器名称(name) :最大支持60个字符,支持 `a-z`, `A-Z`, `0-9`, `-``_`。必须以字母开头,且一个函数下不支持同名的多个定时触发器。
......
......@@ -752,13 +752,20 @@ exports.main = async function(event,context) {
| --- | --- | --- | --- |
| uid | String | 是 |用户Id |
| needPermission| Boolean | 否 |标识是否需要在checkToken时返回permission |
| role | Array | 否 |指定缓存在token内的角色 |
| permission | Array | 否 |指定缓存在角色内的权限 |
**响应参数**
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| token | String| 是 |生成的token |
| tokenExpired| Number| 是 |token过期时间对应的时间戳|
| tokenExpired| Number| 是 |token过期时间对应的时间戳|
**说明**
- uni-id 3.0.0起默认缓存角色权限到token内,此功能生效时`needPermission`参数不在需要。如需调用createToken接口请自行传入role、permission
### 修改密码 @update-password
......
......@@ -43,7 +43,7 @@ HBuilderX中敲下`udb`代码块,得到如下代码,然后通过collection
|:-|:-|:-|
|v-slot:default||查询状态(失败、联网中)及结果(data)|
|ref|string|vue组件引用标记|
|collection|string|表名。支持输入多个表名,用 `,` 分割|
|collection|string|表名。支持输入多个表名,用 `,` 分割,自`HBuilderX 3.2.6`起也支持传入tempCollection组成的数组|
|field|string|指定要查询的字段,多个字段用 `,` 分割。不写本属性,即表示查询所有字段。支持用 oldname as newname方式对返回字段重命名|
|where|string|查询条件,对记录进行过滤。[见下](/uniCloud/unicloud-db?id=where)|
|orderby|string|排序字段及正序倒序设置|
......@@ -121,6 +121,67 @@ TODO:暂不支持in子查询功能。后续会补充
```
## collection@collection
collection有以下几种形式
**单个collection字符串**
```html
<unicloud-db v-slot:default="{data, loading, error, options}" collection="user">
<view v-if="error">{{error.message}}</view>
<view v-else-if="loading">正在加载...</view>
<view v-else>
{{data}}
</view>
</unicloud-db>
```
**多个collection字符串拼接**
用于联表查询,注意主表副表之间需要在schema内以foreignKey关联(副表支持多个)。如下示例以book作为主表,关联author表进行查询,在book表的schema内设置author_id字段指向author表
```html
<unicloud-db v-slot:default="{data, loading, error, options}" collection="book,author">
<view v-if="error">{{error.message}}</view>
<view v-else-if="loading">正在加载...</view>
<view v-else>
{{data}}
</view>
</unicloud-db>
```
**多个临时表组成的数组**
同样用于联表查询,但是与直接拼接多个字符串的方式不同,可以先对主表进行处理再关联。和直接使用多个表名字符串拼接相比,在主表数据量大的情况下性能有明显提升
```html
<template>
<unicloud-db v-slot:default="{data, loading, error, options}" :collection="colList">
<view v-if="error">{{error.message}}</view>
<view v-else-if="loading">正在加载...</view>
<view v-else>
{{data}}
</view>
</unicloud-db>
</template>
<script>
const db = uniCloud.database()
export default {
data() {
return {
colList: [
db.collection('book').where('name == "水浒传"').getTemp(),
db.collection('author').getTemp()
]
}
},
onReady() {},
methods: {}
}
</script>
```
## where@where
where中指定要查询的条件。比如只查询某个字段的值符合一定条件的记录。
......
......@@ -270,6 +270,24 @@ uni.closeAuthView()
}
```
### 获取用户是否选中了勾选框(HBuilderX 3.2.5+ 版本支持)
`uni.getCheckBoxState(options)`
```js
uni.getCheckBoxState({
success(res){
console.log(res.state) // Boolean 用户是否勾选了选框
console.log(res.errMsg)
},
fail(res){
console.log(res.errCode)
console.log(res.errMsg)
}
})
```
### 用access_token换手机号
客户端获取到 `access_token` 后,传递给uniCloud云函数,云函数中通过`uniCloud.getPhoneNumber`方法获取真正的手机号。
......@@ -496,7 +514,7 @@ exports.main = async(event) => {
### 错误码
| 错误码 | 错误描述 |
| -:- | -:- |
| :-: | :-: |
| -7 | uniAppid 缺失,检查是否配置/已通过审核 |
| 1000 | 当前 uniAppid 尚未开通一键登录 |
| 1001 | 应用所有者账号信息异常,请检查账号一键登录服务是否正常 |
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册