提交 25a799c8 编写于 作者: Q qiang

Merge branch 'master' into basic

# Conflicts:
#	docs/_navbar.md
#	docs/_sidebar.md
#	docs/api/_sidebar.md
#	docs/api/a-d/rewarded-video.md
#	docs/api/location/map.md
#	docs/api/media/file.md
#	docs/api/media/live-player-context.md
#	docs/api/plugins/login.md
#	docs/api/plugins/provider.md
#	docs/api/plugins/universal-links.md
#	docs/collocation/_sidebar.md
#	docs/collocation/manifest.md
#	docs/collocation/pages.md
#	docs/collocation/ssr.md
#	docs/component/_sidebar.md
#	docs/component/ad.md
#	docs/component/live-pusher.md
#	docs/component/map.md
#	docs/component/page-meta.md
#	docs/univerify.md
......@@ -5,4 +5,4 @@
* [uniCloud](uniCloud/README.md)
* [其它规范](http://www.html5plus.org/doc/h5p.html)
- [App扩展规范HTML5 Plus](http://www.html5plus.org/doc/h5p.html)
- [Weex](https://doc.weex.io/cn/guide/)
- [Weex](http://doc.weex.io/zh/guide/introduction.html)
......@@ -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)
......
......@@ -81,6 +81,7 @@
* [节点信息](api/ui/nodes-info.md)
* [节点布局相交状态](api/ui/intersection-observer.md)
* [媒体查询](api/ui/media-query-observer.md)
* [语言](api/ui/locale.md)
* 页面和窗体
* [页面](api/window/window.md)
* [页面通讯](api/window/communication.md)
......
......@@ -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)
**平台差异说明**
......
### uni.getLocation(OBJECT)
获取当前的地理位置、速度。
在微信小程序中,当用户离开应用后,此接口无法调用,除非申请后台持续定位权限;当用户点击“显示在聊天顶部”时,此接口可继续调用。
**OBJECT 参数说明**
......
......@@ -26,19 +26,15 @@ mapContext
|includePoints|OBJECT|缩放视野展示所有经纬度|app-nvue 2.1.5+||
|getRegion|OBJECT|获取当前地图的视野范围|||
|getScale|OBJECT|获取当前地图的缩放级别|||
|addCustomLayer|OBJECT|添加个性化图层||App暂不支持 (**SDK不支持**)|
|addGroundOverlay|OBJECT|创建自定义图片图层,图片会随着地图缩放而缩放||App-nvue 3.1.0+|
|addMarkers |OBJECT|添加 marker||App-nvue 3.1.0+|
|fromScreenLocation|OBJECT|获取屏幕上的点对应的经纬度,坐标原点为地图左上角||App暂不支持|
|initMarkerCluster|OBJECT|初始化点聚合的配置,未调用时采用默认配置||App-nvue 3.1.0+|
|moveAlong|OBJECT|沿指定路径移动 marker,用于轨迹回放等场景。动画完成时触发回调事件,若动画进行中,对同一 marker 再次调用 moveAlong 方法,前一次的动画将被打断。|支持 android 不支持autoRotate属性设置 默认ture|App-nvue 3.1.0+|
|openMapApp|OBJECT|拉起地图APP选择导航。||App-nvue 3.1.0+|
|removeCustomLayer|OBJECT|移除个性化图层 ||App暂时不支持 (**SDK不支持**)|
|removeGroundOverlay|OBJECT|移除自定义图片图层||App-nvue 3.1.0+|
|removeMarkers|OBJECT|移除 marker。||App-nvue 3.1.0+|
|setCenterOffset|OBJECT|设置地图中心点偏移,向后向下为增长,屏幕比例范围(0.25~0.75),默认偏移为[0.5, 0.5]||App暂时不支持|
|toScreenLocation|OBJECT|获取经纬度对应的屏幕坐标,坐标原点为地图左上角。||App暂时不支持|
|updateGroundOverlay|OBJECT|更新自定义图片图层。||App-nvue 3.1.0+|
|addGroundOverlay|OBJECT|创建自定义图片图层,图片会随着地图缩放而缩放||App-nvue 3.1.0+|
|addMarkers |OBJECT|添加 marker||App-nvue 3.1.0+|
|fromScreenLocation|OBJECT|获取屏幕上的点对应的经纬度,坐标原点为地图左上角||App暂不支持|
|initMarkerCluster|OBJECT|初始化点聚合的配置,未调用时采用默认配置||App-nvue 3.1.0+|
|moveAlong|OBJECT|沿指定路径移动 marker,用于轨迹回放等场景。动画完成时触发回调事件,若动画进行中,对同一 marker 再次调用 moveAlong 方法,前一次的动画将被打断。|支持 android 不支持autoRotate属性设置 默认ture|App-nvue 3.1.0+|
|openMapApp|OBJECT|拉起地图APP选择导航。||App-nvue 3.1.0+|
|removeGroundOverlay|OBJECT|移除自定义图片图层||App-nvue 3.1.0+|
|removeMarkers|OBJECT|移除 marker。||App-nvue 3.1.0+|
|updateGroundOverlay|OBJECT|更新自定义图片图层。||App-nvue 3.1.0+|
|on|EventHandle|监听地图事件。||App-nvue 3.1.0+|
|$getAppMap||获取原生地图对象 [plus.maps.Map](https://www.html5plus.org/doc/zh_cn/maps.html#plus.maps.Map)|app-vue自定义组件模式|1.9.3|
......@@ -104,100 +100,108 @@ mapContext
|fail|Function|否|接口调用失败的回调函数|
|complete|Function|否|接口调用结束的回调函数(调用成功、失败都会执行)|
**addCustomLayer 的 OBJECT 参数列表**
|属性 |类型 |默认值 |必填 |说明 |
|:-|:-|:-|:-|:-|
|layerId |string | |是 |个性化图层id |
|success |function | |否 |接口调用成功的回调函数 |
|fail |function | |否 |接口调用失败的回调函数 |
|complete |function | |否 |接口调用结束的回调函数(调用成功、失败都会执行) |
**addGroundOverlay 的 OBJECT 参数列表**
|属性 |类型 |默认值 |必填 |说明 |
|:-|:-|:-|:-|:-|
|id |String | |是 |图片图层 id |
|src |String | |是 |图片路径,支持网络图片、临时路径、代码包路径 |
|bounds |Object | |是 |图片覆盖的经纬度范围 |
|visible |Boolean |true |否 |是否可见 |
|zIndex |Number |1 |否 |图层绘制顺序 |
|opacity |Number |1 |否 |图层透明度 |
|success |function | |否 |接口调用成功的回调函数 |
|fail |function | |否 |接口调用失败的回调函数 |
|complete |function | |否 |接口调用结束的回调函数(调用成功、失败都会执行) |
`object.bounds` 的结构
|属性 |类型 |默认值 |必填 |说明 |
|:-|:-|:-|:-|:-|
|southwest |Object | |是 |西南角经纬度 |
|northeast |Object | |是 |东北角经纬度 |
`southwest` 的结构
|属性 |类型 |默认值 |必填 |说明 |
|:-|:-|:-|:-|:-|
|longitude |number | |是 |经度 |
|latitude |number | |是 |纬度 |
`northeast` 的结构
|属性 |类型 |默认值 |必填 |说明 |
|:-|:-|:-|:-|:-|
|longitude |number | |是 |经度 |
|latitude |number | |是 |纬度 |
**addMarkers 的 OBJECT 参数列表**
|属性 |类型 |默认值 |必填 |说明 |
|:-|:-|:-|:-|:-|
|markers |Array | |是 |同传入 map 组件的 marker 属性 |
|clear |boolean |false |否 |是否先清空地图上所有 marker |
|success |function | |否 |接口调用成功的回调函数 |
|fail |function | |否 |接口调用失败的回调函数 |
|complete |function | |否 |接口调用结束的回调函数(调用成功、失败都会执行) |
**MapContext.on()** (app-nvue支持)
`markerClusterCreate`
缩放或拖动导致新的聚合簇产生时触发,仅返回新创建的聚合簇信息。
返回参数
|参数 |类型 |说明 |
|:-|:-|:-|
|clusters |Array<ClusterInfo> |聚合簇数据 |
`markerClusterClick`
聚合簇的点击事件。
返回参数
|参数 |类型 |说明 |
|:-|:-|:-|
|cluster|ClusterInfo|聚合簇 |
`ClusterInfo` 结构
|参数 |类型 |说明 |
|:-|:-|:-|
|clusterId |Number |聚合簇的 id |
|center |LatLng |聚合簇的坐标 |
|markerIds |Array<Number>|该聚合簇内的点标记数据数组 |
示例代码
```
MapContext.on('markerClusterCreate', (res) => {})
MapContext.on('markerClusterClick', (res) => {})
```
**addCustomLayer 的 OBJECT 参数列表**
|属性 |类型 |默认值 |必填 |说明 |
|:-|:-|:-|:-|:-|
|layerId |string | |是 |个性化图层id |
|success |function | |否 |接口调用成功的回调函数 |
|fail |function | |否 |接口调用失败的回调函数 |
|complete |function | |否 |接口调用结束的回调函数(调用成功、失败都会执行) |
**addGroundOverlay 的 OBJECT 参数列表**
|属性 |类型 |默认值 |必填 |说明 |
|:-|:-|:-|:-|:-|
|id |String | |是 |图片图层 id |
|src |String | |是 |图片路径,支持网络图片、临时路径、代码包路径 |
|bounds |Object | |是 |图片覆盖的经纬度范围 |
|visible |Boolean |true |否 |是否可见 |
|zIndex |Number |1 |否 |图层绘制顺序 |
|opacity |Number |1 |否 |图层透明度 |
|success |function | |否 |接口调用成功的回调函数 |
|fail |function | |否 |接口调用失败的回调函数 |
|complete |function | |否 |接口调用结束的回调函数(调用成功、失败都会执行) |
`object.bounds` 的结构
|属性 |类型 |默认值 |必填 |说明 |
|:-|:-|:-|:-|:-|
|southwest |Object | |是 |西南角经纬度 |
|northeast |Object | |是 |东北角经纬度 |
`southwest` 的结构
|属性 |类型 |默认值 |必填 |说明 |
|:-|:-|:-|:-|:-|
|longitude |number | |是 |经度 |
|latitude |number | |是 |纬度 |
`northeast` 的结构
|属性 |类型 |默认值 |必填 |说明 |
|:-|:-|:-|:-|:-|
|longitude |number | |是 |经度 |
|latitude |number | |是 |纬度 |
**addMarkers 的 OBJECT 参数列表**
|属性 |类型 |默认值 |必填 |说明 |
|:-|:-|:-|:-|:-|
|markers |Array | |是 |同传入 map 组件的 marker 属性 |
|clear |boolean |false |否 |是否先清空地图上所有 marker |
|success |function | |否 |接口调用成功的回调函数 |
|fail |function | |否 |接口调用失败的回调函数 |
|complete |function | |否 |接口调用结束的回调函数(调用成功、失败都会执行) |
**removeMarkers 的 OBJECT 参数列表**
|属性 |类型 |默认值 |必填 |说明 |
|:-|:-|:-|:-|:-|
|markerIds |Array | |是 |要被删除的marker的id属性组成的数组 |
|success |function | |否 |接口调用成功的回调函数 |
|fail |function | |否 |接口调用失败的回调函数 |
|complete |function | |否 |接口调用结束的回调函数(调用成功、失败都会执行) |
**MapContext.on()** (app-nvue支持)
`markerClusterCreate`
缩放或拖动导致新的聚合簇产生时触发,仅返回新创建的聚合簇信息。
返回参数
|参数 |类型 |说明 |
|:-|:-|:-|
|clusters |Array<ClusterInfo> |聚合簇数据 |
`markerClusterClick`
聚合簇的点击事件。
返回参数
|参数 |类型 |说明 |
|:-|:-|:-|
|cluster|ClusterInfo|聚合簇 |
`ClusterInfo` 结构
|参数 |类型 |说明 |
|:-|:-|:-|
|clusterId |Number |聚合簇的 id |
|center |LatLng |聚合簇的坐标 |
|markerIds |Array<Number>|该聚合簇内的点标记数据数组 |
示例代码
```
MapContext.on('markerClusterCreate', (res) => {})
MapContext.on('markerClusterClick', (res) => {})
```
## mapSearch 模块(仅app-nvue支持)
......
......@@ -87,6 +87,3 @@ uni.chooseFile({
}
})
```
### uni.getLocale()
获取当前设置的语言
如果当前应用设置过语言,会获取到之前设置的语言,未设置会使用系统语言。
### uni.setLocale(locale)
设置当前语言
**参数说明**
|参数名|类型|必填|
|:-|:-|:-|
|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
## 背景
为有效治理App强制授权、过度索权、超范围收集个人信息等现象,落实《网络安全法》《消费者权益保护法》的要求,保障个人信息安全,2019年1月,中央网信办、工信部、公安部、市场监管总局等四部委发布了《关于开展App违法违规收集使用个人信息专项治理的公告》,在全国范围组织开展App违法违规收集使用个人信息专项治理,并陆续出台完善了《App违法违规收集使用个人信息行为认定方法》、《GB/T 35273-2020 信息安全技术 个人信息安全规范》等标准规范。
根据以上规范要求,各大应用市场都加强应用的检测,要求应用必须符合相关政策,否则应用将有被通报或下架的风险。
目前开发者最常碰到的以下问题:
- 违规收集个人信息
- 强制、频繁、过度索取权限
针对以上问题,请参考下文的解决方案,务必仔细阅读,注意各细节问题。
**`首先碰到此问题请更新到HbuilderX3.1.22及以上版本`**
## 如何解决"违规收集个人信息"问题
关于收集个人信息问题,首先应用必须配置“隐私与政策”协议框,其次必须在“隐私与政策”非常清楚、全面地说明(不要用可能收集、了解用户信息这种模糊不清晰的词语)收集用户个人信息的目的、方式和范围,用户个人信息包括但不限于mac地址、设备序列号、imei、imsi、软件安装列表、通讯录信息、短信信息等。
## **注意:根据政策要求隐私提示框显示之前不能调用涉及个人信息相关API(如设备标识),因此需要更新到HBuilderX3.1.22及以上版本重新提交云端打包**
### 第一步:配置隐私与政策提示框
必须确保应用存在《隐私政策》,在应用首次启动时弹出提示并取得用户同意。
## **注意:一定要配置使用`template`模式隐私与政策提示框,详情参考[https://ask.dcloud.net.cn/article/36937](https://ask.dcloud.net.cn/article/36937)**
### 第二步:在隐私政策中添加DCloud相关条款
请在《隐私政策》中必告知用户您的应用基于DCloud uni-app(5+ App/Wap2App)开发,添加如下参考条款:
`我们的产品基于DCloud uni-app(5+ App/Wap2App)开发,应用运行期间需要收集您的设备唯一识别码(IMEI/android ID/DEVICE_ID/IDFA、SIM 卡 IMSI 信息)以提供统计分析服务,并通过应用启动数据及异常错误日志分析改进性能和用户体验,为用户提供更好的服务。`
### 第三步:在隐私政策中添加其它三方SDK的条款
#### uni-app默认集成三方SDK
|SDK名称|SDK包名|SDK用途|可能获取的个人信息类型|调用的设备权限|官网链接|
|:----|:----|:----|:----|:----|:----
|阿里weexSDK|com.taobao|uni-app基础模块默认集成,用于渲染uniapp的nvue页面引擎|存储的个人文件|读取外置存储器、写入外置存储器|[http://doc.weex.io/zh](http://doc.weex.io/zh/)|
|fresco图片库|com.facebook.fresco|uni-app基础模块默认集成,用于nvue页面加载图片使用|存储的个人文件|读取外置存储器、写入外置存储器|[https://www.fresco-cn.org/](https://www.fresco-cn.org/)|
#### UniPush
UniPush是DCloud联合个推公司推出的集成型统一推送服务,使用了个推提供的SDK,因此需要在《隐私政策》中添加“个推消息推送SDK”相关说明。
建议《隐私政策》添加 “与授权合作伙伴共享”条款中,将 个推的用户隐私政策 加入其中,并向终端用户逐一明示您嵌入的SDK收集使用个人信息的目的、方式和范围。参考内容如下:
`消息推送服务供应商:由每日互动股份有限公司提供推送技术服务,我们可能会将您的设备平台、设备厂商、设备品牌、设备识别码等设备信息,应用列表信息、网络信息以及位置相关信息提供给每日互动股份有限公司,用于为您提供消息推送技术服务。我们在向您推送消息时,我们可能会授权每日互动股份有限公司进行链路调节,相互促活被关闭的SDK推送进程,保障您可以及时接收到我们向您推送的消息。详细内容请访问《个推用户隐私政策》(需将《个推用户隐私政策》超链至:http://docs.getui.com/privacy)`
UniPush模块集成的三方SDK说明
|SDK名称|SDK包名|SDK用途|可能获取的个人信息类型|调用的设备权限|SDK隐私政策链接|
|:----|:----|:----|:----|:----|:----
|个推|com.getui.gtc 、com.igexin.sdk|UniPush推送|网络信息、IMEI、openid|获取网络状态、访问Wi-Fi状态、读取手机状态和身份|[https://docs.getui.com/privacy/](https://docs.getui.com/privacy/)
#### Statistic
HX3.1.14+ 友盟SDK已升级到9.3.8版本 适配合规问题
+ 当你集成了统计模块。您需要确保App有《隐私政策》,并且在用户首次启动App时就弹出《隐私政策》取得用户同意!!!
+ 您务必告知用户您选择友盟+SDK服务,请在《隐私政策》中增加如下参考条款:“我们的产品集成友盟+SDK,友盟+SDK需要收集您的设备Mac地址、唯一设备识别码(IMEI/android ID/IDFA/OPENUDID/GUID、SIM 卡 IMSI 信息)以提供统计分析服务,并通过地理位置校准报表数据准确性,提供基础反作弊能力。”
+ 您务必确保用户同意《隐私政策》之后。再调用相关api!!!!
Statistic模块集成的三方SDK说明
|SDK名称|SDK包名|SDK用途|可能获取的个人信息类型|调用的设备权限|SDK隐私政策链接|
|:----|:----|:----|:----|:----|:----
|友盟|com.uc.crashsdk、com.efs、com.umeng|统计|网络信息、IMEI、openid|获取网络状态、访问Wi-Fi状态、读取手机状态和身份|[https://developer.umeng.com/docs/...](https://developer.umeng.com/docs/119267/detail/182050)
#### OAuth
OAuth模块集成的三方SDK说明
|SDK名称|SDK包名|SDK用途|可能获取的信息类型|调用的设备权限|SDK隐私政策链接|
|:----|:----|:----|:----|:----|:----
|微信|com.tencent.mm|微信登录|存储的个人文件|读取外置存储器、写入外置存储器|[https://weixin.qq.com/cgi-bin/readtemplate?lang=zh_CN&t=weixin_agreement&s=privacy](https://weixin.qq.com/cgi-bin/readtemplate?lang=zh_CN&t=weixin_agreement&s=privacy)|
|新浪微博|com.sina.weibo|新浪微博登录|存储的个人文件、IMEI、openid|读取外置存储器、写入外置存储器|[https://weibo.com/signup/v5/privacy?spm=a1zaa.8161610.0.0.4f8776217Wu8R1](https://weibo.com/signup/v5/privacy?spm=a1zaa.8161610.0.0.4f8776217Wu8R1)|
|QQ登录|com.tencent.open|QQ登录|IMEI、openid、位置信息|访问粗略位置、访问精准定位、后台访问地理位置、读取外置存储器、写入外置存储器、读取手机状态和身份|[https://ti.qq.com/agreement/qqface.html?appname=mqq_2019](https://ti.qq.com/agreement/qqface.html?appname=mqq_2019)|
|个验一键登录|com.g.elogin、com.g.gysdk|一键登录|运营商信息|读取外置存储器、写入外置存储器|[https://docs.getui.com/privacy/](https://docs.getui.com/privacy/)|
#### Share
Share模块集成的三方SDK说明
|SDK名称|SDK包名|SDK用途|可能获取的信息类型|调用的设备权限|SDK隐私政策链接|
|:----|:----|:----|:----|:----|:----
|微信|com.tencent.mm|微信分享|存储的个人文件|读取外置存储器、写入外置存储器|[https://weixin.qq.com/cgi-bin/readtemplate?lang=zh_CN&t=weixin_agreement&s=privacy](https://weixin.qq.com/cgi-bin/readtemplate?lang=zh_CN&t=weixin_agreement&s=privacy)|
|新浪微博|com.sina.weibo|新浪微博分享|存储的个人文件、IMEI、openid|读取外置存储器、写入外置存储器|[https://weibo.com/signup/v5/privacy?spm=a1zaa.8161610.0.0.4f8776217Wu8R1](https://weibo.com/signup/v5/privacy?spm=a1zaa.8161610.0.0.4f8776217Wu8R1)|
|QQ|com.tencent.open|QQ分享|IMEI、openid、位置信息|访问粗略位置、访问精准定位、后台访问地理位置、读取外置存储器、写入外置存储器、读取手机状态和身份|[https://ti.qq.com/agreement/qqface.html?appname=mqq_2019](https://ti.qq.com/agreement/qqface.html?appname=mqq_2019)|
#### Payment
Payment模块集成的三方SDK说明
|SDK名称|SDK包名|SDK用途|可能获取的信息类型|调用的设备权限|SDK隐私政策链接|
|:----|:----|:----|:----|:----|:----
|微信|com.tencent.mm|微信支付|存储的个人文件|读取外置存储器、写入外置存储器|[https://weixin.qq.com/cgi-bin/readtemplate?lang=zh_CN&t=weixin_agreement&s=privacy](https://weixin.qq.com/cgi-bin/readtemplate?lang=zh_CN&t=weixin_agreement&s=privacy)|
|支付宝|com.alipay|支付宝支付|暂无|读取网络状态|[https://render.alipay.com/p/c/k2cx0tg8](https://render.alipay.com/p/c/k2cx0tg8)|
#### Speech
Speech模块集成的三方SDK说明
|SDK名称|SDK包名|SDK用途|可能获取的个人信息类型|调用的设备权限|SDK隐私政策链接|
|:----|:----|:----|:----|:----|:----
|百度语音识别|com.baidu.speech|语音识别|IMEI、openid|获取网络状态、访问Wi-Fi状态、读取手机状态和身份|[https://ai.baidu.com/ai-doc/REFERENCE/Qkdykq1r3](https://ai.baidu.com/ai-doc/REFERENCE/Qkdykq1r3)|
|讯飞语音|com.iflytek|语音识别|IMEI、openid|获取网络状态、访问Wi-Fi状态、读取手机状态和身份|[https://www.xfyun.cn/doc/policy/privacy.html](https://www.xfyun.cn/doc/policy/privacy.html)|
#### Map & Geolocation
Map & Geolocation模块集成的三方SDK说明
|SDK名称|SDK包名|SDK用途|可能获取的个人信息类型|调用的设备权限|SDK隐私政策链接|
|:----|:----|:----|:----|:----|:----
|高德|com.amap.api, com.loc, com.autonavi|地图&定位|IMEI、openid、位置信息|获取网络状态、访问Wi-Fi状态、位置信息、访问粗略位置、访问精准定位、读取手机状态和身份|[https://lbs.amap.com/agreement/compliance](https://lbs.amap.com/agreement/compliance)|
|百度|com.baidu|地图&定位|IMEI、openid、位置信息|获取网络状态、访问Wi-Fi状态、位置信息、访问粗略位置、访问精准定位、读取手机状态和身份|[https://map.baidu.com/zt/client/privacy/index.html](https://map.baidu.com/zt/client/privacy/index.html)|
#### uni-AD
uni-AD广告模块集成的三方SDK说明
|SDK名称|SDK包名|SDK用途|可能获取的个人信息类型|调用的设备权限|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)|
#### 腾讯x5内核
|SDK名称|SDK包名|SDK用途|可能获取的个人信息类型|调用的设备权限|SDK隐私政策链接|
|:----|:----|:----|:----|:----|:----
|x5内核|com.tencent.tbs、com.tencent.smtt|x5内核渲染webview|IMEI、openid|读写外置存储器、读取手机状态和身份|[https://x5.tencent.com/docs/privacy.html](https://x5.tencent.com/docs/privacy.html)|
如果您的应用使用了依赖三方SDK的模块也需要将其合规条款添加到《隐私政策》中
#### uni原生插件
如果应用使用了uni原生插件,需要注意一下几点:
+ 使用插件时请查看插件详情页面中的 `隐私、权限声明` 。(插件使用什么sdk?获取了什么用户信息?都应由插件作者提供并填写在 `隐私、权限声明`中)
+ 将插件中用到的三方SDK信息添加到用户隐私协议中。例如集成了`百度定位`。就需要在隐私协议中说明集成了百度定位SDK。获取了xxx用户信息!用于xxx.
+ 如果发现插件有获取用户信息而插件详情页并没有提供`隐私、权限声明`,请与插件开发者或与我们反馈共同督促进行补充。
#### 其它
《隐私政策》必须非常清楚、全面地说明(不要用可能收集、了解用户信息这种模糊不清晰的词语)收集用户个人信息的目的、方式和范围。
如果应用使用“通讯录”、“短信”等相关功能,请根据应用业务场景进行描述。
## 常见问题
#### 如何解决"强制、频繁、过度索取权限"问题
对于权限问题,主要注意以下几个方面:
+ 应用中没有对应的服务或场景时,不要申请对应权限(例如没有使用到位置的服务时,不要申请定位权限)
+ 应用申请权限时,如果用户拒绝,不要直接退出APP无法使用。千万不要将应用启动时申请“读写手机存储”和“访问设备信息”权限设置为“always”,详情参考:[https://ask.dcloud.net.cn/article/36549](https://ask.dcloud.net.cn/article/36549)
+ 调用申请权限相关时,如果用户拒绝,非用户主动触发功能,不要重复调用API触发弹出申请权限窗口影响用户使用
在开发uni-app中还需要注意以下问题:
`不要在页面生命周期onShow中调用可能触发权限提示框的API,如` [uni.getLocation](https://uniapp.dcloud.io/api/location/location?id=getlocation)[uni.chooseImage](https://uniapp.dcloud.io/api/media/image?id=chooseimage)`等`
#### 如何解决“强制用户使用定向推送功能”问题
《隐私政策》中涉及到 “推荐”、“定制”、“个性化”等关键字改为“提供、展示、通知、发送、、、”等字眼,如果确实会涉及到个性化服务请在app的设置中增加个性化推送开关
#### 如何解决 用户点击《隐私政策》“同意”前,APP和SDK不要进行任何行为,包括SDK不能初始化,APP或SDK不能收集用户信息(包括但不限于IMEI、IMSI、设备MAC地址、软件列表、设备序列号、androidID)
注意:`apk是在7月8号之前基于HX3.1.18云打包生产的apk可能存在提前获取IMIE问题,打包机已修复该问题!请使用HX3.1.18重新云打包。离线打包请更新3.1.18紧急更新的aar资源即可`
+ 请先确保APK是基于3.1.18+版本生产的!
+ 确保已配置使用“template”模式隐私与政策提示框!
+ 可以通过小米手机 系统是MIUI12设备。安装你的应用。然后查看`应用详情`-->`应用行为记录`是否在点击“同意”前有获取权限信息等情况。
+ 如果你 app 是离线打包请务必关闭调试开关,修改项目dcloud_control.xml中syncDebug为false
+ 以上都符合条件那就检测app是否集成三方SDK或者uni原生插件请咨询相关SDK提供方平台是否涉及有关合规问题。请更新SDK或找uni原生插件更新相关SDK合规操作。
+ 都符合请重新提交平台检测。
**各大应用市场上架合规审查细节可能存在差异,如果开发者碰到相关问题请及时反馈,我们会及时汇总整理供大家参考**
#### 如何解决“用户不同意强制退出应用”问题
这个问题可能是隐私弹窗显示后,用户选择了“不同意”按钮后应用退出导致的。请按以下修改。
+ 配置二次弹窗提示second,参考[https://ask.dcloud.net.cn/article/36937](https://ask.dcloud.net.cn/article/36937)
+ 二次弹窗配置按钮信息为“同意并继续”和“退出应用”
#### 关于离线SDK需要注意
如果重写了DCloudApplication,需要注意在Application初始化的三方SDK的合规操作。防止导致启动隐私弹窗前获取了用户信息无法上架
#### app上架应用市场,检测集成了广告被拒的解决方案
+ 使用HX云打包时是否勾选了三方广告!如果勾选了请在隐私协议添加广告隐私说明。误勾选请去除并重新打包上架。
+ 离线打包检测是否集成了相关三方广告SDK!如果集成了请在隐私协议添加广告隐私说明。误集成请去除并重新编译apk上架。
#### 应用没有勾选三方广告模块但是上架华为市场检测反馈集成了广告被拒
uni-AD广告基础功能包含管理其它三方广告SDK的逻辑,会通过反射判断广告SDK是否存在,在没有勾选“360广告联盟”、“今日头条穿山甲广告联盟”、“腾讯优量汇广告联盟”、”快手广告联盟“时,也可能会被华为应用市场检测为包含奇虎360、广点通/优量汇、穿山甲等广告SDK,实际上apk中并没有包含相应的广告SDK。我们已经在优化广告基础功能实现方案来避免(请关注新版本更新日志),目前可以通过以下临时方案解决:
+ 向华为应用市场申诉,说明安装包中并没有包含广告SDK,只是存在反射判断广告SDK是否存在
+ 目前我们收到此反馈此问题的都是5+ App项目,uni-app项目可能并不存在此问题,建议有条件的话将5+ App项目升级为uni-app项目
#### 看不懂文档不知道如何修改?
可开通付费技术服务 参考:[https://ask.dcloud.net.cn/article/13015](https://ask.dcloud.net.cn/article/13015)
## 相关参考
Android平台隐私与政策提示框配置方法:[https://ask.dcloud.net.cn/article/36937](https://ask.dcloud.net.cn/article/36937)
Android平台应用启动时读写手机存储、访问设备信息(如IMEI)等权限策略及提示信息:[https://ask.dcloud.net.cn/article/36549](https://ask.dcloud.net.cn/article/36549)
Android平台配置权限参考:[https://ask.dcloud.net.cn/article/36982](https://ask.dcloud.net.cn/article/36982)
\ No newline at end of file
......@@ -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>
......
......@@ -46,7 +46,7 @@
js中操作globalData的方式如下:
`getApp().globalData.text = 'test'`
在应用onLaunch时,getApp对象还未获取,暂时可以使用this.$scope.globalData获取globalData。
在应用onLaunch时,getApp对象还未获取,暂时可以使用this.globalData获取globalData。
如果需要把globalData的数据绑定到页面上,可在页面的onShow页面生命周期里进行变量重赋值。
......
......@@ -63,7 +63,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. 运行测试
```
......@@ -80,7 +80,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为传统的实际像素||
......
注意:本指南仅支持 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 字符串,将它们直接发送到浏览器,最后将这些静态标记"激活"为客户端上完全可交互的应用程序。
......
......@@ -14,7 +14,6 @@ app开发,推荐使用nvue做直播,比使用vue的优势有:
1. nvue也可一套代码编译多端。
2. nvue的cover-view比vue的cover-view更强大,在视频上绘制元素更容易。如果只考虑App端的话,不用cover-view,任意组件都可以覆盖live-pusher组件,因为nvue没有层级问题。
3. 若需要视频内嵌在swiper里上下滑动(类抖音、映客首页模式),App端只有nvue才能实现
当然nvue相比vue的坏处是css写法受限,如果只开发微信小程序,不考虑App,那么使用vue页面也是一样的。
**参数说明**
......@@ -40,7 +39,7 @@ max-bitrate|Number|1000|否|最大码率。|
orientation 的合法值
#### orientation 的合法值
|值|说明|
|:-|:-|
......@@ -48,7 +47,7 @@ orientation 的合法值
|horizontal|水平|
网络状态数据(info)安卓
#### 网络状态数据(info)安卓
键名|说明
:--|:--|
......@@ -61,13 +60,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>
......
......@@ -53,6 +53,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**
标记点用于在地图上显示标记的位置
......@@ -97,13 +103,26 @@
|fontSize|文字大小|Number|App-nvue 2.1.5+、H5|
|x|label的坐标,原点是 marker 对应的经纬度|Number|App-nvue 2.1.5+、H5|
|y|label的坐标,原点是 marker 对应的经纬度|Number|App-nvue 2.1.5+、H5|
|borderWidth|边框宽度|Number||
|borderColor|边框颜色|String||
|borderRadius|边框圆角|Number|App-nvue 2.1.5+|
|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**
......
......@@ -20,8 +20,8 @@
|属性|类型|默认值|必填|说明|版本要求
|:-|:-|:-|:-|:-|:-|
|page-style|string|""|否|页面根节点样式,页面根节点是所有页面节点的祖先节点,相当于 HTML 中的 body 节点|H5 2.6.7、App 2.6.7|
|root-font-size|string|""|否|页面的根字体大小,页面中的所有 rem 单位,将使用这个字体大小作为参考值,即 1rem 等于这个字体大小|H5 2.6.7、App 2.6.7|
|page-style|string|""|否|页面根节点样式,页面根节点是所有页面节点的祖先节点,相当于 HTML 中的 body 节点|H5 2.6.7、App-vue 2.6.7|
|root-font-size|string|""|否|页面的根字体大小,页面中的所有 rem 单位,将使用这个字体大小作为参考值,即 1rem 等于这个字体大小|H5 2.6.7、App-vue 2.6.7|
|enable-pull-down-refresh|Boolean|""|否|是否开启下拉刷新|App 2.6.7|
......
#### 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中指定要查询的条件。比如只查询某个字段的值符合一定条件的记录。
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册