提交 609efffe 编写于 作者: S shutao

Merge branch 'master' of https://gitee.com/dcloud/unidocs-zh

......@@ -38,6 +38,7 @@
* [uni小程序sdk](https://nativesupport.dcloud.net.cn/README)
* 运营服务
* [App升级中心](uniCloud/upgrade-center.md)
* [统一发布页uni-publish](uniCloud/uni-publish.md)
* [uni一键登录](univerify.md)
* [统一推送uniPush](unipush.md)
* [uni统计](uni-stat.md)
......@@ -91,7 +92,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>13:699478442 &nbsp;<a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=Fb4-zKaMCOz4Vm5b-_e4Ry3MLnOaEGwI&jump_from=webapi">点此加入</a></div>
<div>2:901474938 &nbsp;<a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=E-3RyF9wOtGobJB4Aze8H6zlHn4fZuDf&jump_from=webapi">点此加入</a></div>
<div>群35:713420817(2000人已满)</div>
<div>群34:530305531(2000人已满)</div>
<div>群33:498071674(2000人已满)</div>
......@@ -114,7 +115,7 @@
<div>群16:719211033(2000人已满)</div>
<div>群15:516984120(2000人已满)</div>
<div>群14:465953250(2000人已满)</div>
<!-- <div>群13:699478442(2000人已满)</div>-->
<div>群13:699478442(2000人已满)</div>
<div>群12:884860657(2000人已满)</div>
<div>群11:296811328(2000人已满)</div>
<div>群10:959059626(2000人已满)</div>
......@@ -125,7 +126,7 @@
<div>群5:731951419(2000人已满)</div>
<div>群4:942702595(2000人已满)</div>
<div>群3:773794803(2000人已满) </div>
<div>群2:901474938(2000人已满) </div>
<!-- <div>群2:901474938(2000人已满) </div>-->
<div>群1:531031261(2000人已满)</div>
</div>
</div>
......
`uni-app`的js API由标准ECMAScript的js API 和 uni 扩展 API 这两部分组成。
标准ecmascript的API非常多,本文档没有必要列全,仅以console、settimeout为例做简要说明。扩展 API 命名与小程序相同。
标准ECMAScript的js仅是最基础的js。浏览器基于它扩展了window、document、navigator等对象。小程序也基于标准js扩展了各种wx.xx、my.xx、swan.xx的API。node也扩展了fs等模块。
uni-app基于ECMAScript扩展了uni对象,并且API命名与小程序保持兼容。
## 标准js和浏览器js的区别
`uni-app`的js代码,h5端运行于浏览器中。非h5端,Android平台运行在v8引擎中,iOS平台运行在iOS自带的jscore引擎中
`uni-app`的js代码,h5端运行于浏览器中。非h5端(包含小程序和App),Android平台运行在v8引擎中,iOS平台运行在iOS自带的jscore引擎中,都没有运行在浏览器或webview里
非H5端,虽然不支持window、document、navigator等浏览器的js API,但也支持标准ECMAScript。
开发者不要把浏览器里的js等价于标准js。
ECMAScript由Ecma国际管理,是基础js语法。浏览器基于标准js扩充了window、document等js API;Node.js基于标准js扩充了fs等模块;小程序也基于标准js扩展了各种wx.xx、my.xx、swan.xx的API。
请注意不要把浏览器里的js扩展对象等价于标准js。
所以uni-app的非H5端,一样支持标准js,支持if、for等语法,支持字符串、数组、时间等变量及各种处理方法。仅仅是不支持浏览器专用对象。
所以uni-app的非H5端,一样支持标准js,支持if、for等语法,支持字符串、数组、时间等变量及各种处理方法。仅仅是不支持window、document等浏览器专用对象。
## 各端特色API调用
......@@ -432,7 +432,7 @@ uni.addInterceptor({
|[uni.readBLECharacteristicValue](/api/system/ble?id=readblecharacteristicvalue)|读取低功耗蓝牙设备的特征值的二进制数据值|
|[uni.onBLEConnectionStateChange](/api/system/ble?id=onbleconnectionstatechange)|监听低功耗蓝牙连接状态的改变事件|
|[uni.onBLECharacteristicValueChange](/api/system/ble?id=onblecharacteristicvaluechange)|监听低功耗蓝牙设备的特征值变化事件|
|[uni.notifyBLECharacteristicValueChange](/api/system/ble?id=notifyblecharacteristicvaluechange)|监听低功耗蓝牙设备的特征值变化事件|
|[uni.notifyBLECharacteristicValueChange](/api/system/ble?id=notifyblecharacteristicvaluechange)|启用蓝牙低功耗设备特征值变化时的 notify 功能,订阅特征|
|[uni.getBLEDeviceServices](/api/system/ble?id=getbledeviceservices)|获取蓝牙设备所有服务(service)|
|[uni.getBLEDeviceCharacteristics](/api/system/ble?id=getbledevicecharacteristics)|获取蓝牙设备某个服务中所有特征值(characteristic)|
|[uni.createBLEConnection](/api/system/ble?id=createbleconnection)|连接低功耗蓝牙设备|
......
......@@ -5,7 +5,7 @@
|参数名|类型|必填|说明|平台差异说明|
|:-|:-|:-|:-|:-:|
|type|String|否|默认为 wgs84 返回 gps 坐标,gcj02 返回国测局坐标,可用于 ``uni.openLocation`` 的坐标,app平台高德SDK仅支持返回gcj02||
|type|String|否|默认为 wgs84 返回 gps 坐标,gcj02 返回国测局坐标,可用于 ``uni.openLocation`` 和 map 组件坐标,App 和 H5 需配置定位 SDK 信息才可支持 gcj02。||
|altitude|Boolean|否|传入 true 会返回高度信息,由于获取高度需要较高精确度,会减慢接口返回速度|字节跳动小程序、飞书小程序、支付宝小程序不支持|
|geocode|Boolean|否|默认false,是否解析地址信息|仅App平台支持(安卓需配置三方定位SDK)|
|highAccuracyExpireTime|number|否|高精度定位超时时间(ms),指定时间内返回最高精度,该值3000ms以上高精度定位才有效果|App (3.2.11+)、H5 (3.2.11+)|
......
......@@ -14,8 +14,8 @@
|参数名|类型|必填|说明|平台差异说明|
|:-|:-|:-|:-|:-|
|sourceType|Array&lt;String&gt;|否|album 从相册选视频,camera 使用相机拍摄,默认为:['album', 'camera']||
|extension|Array&lt;String&gt;|否|根据文件拓展名过滤,每一项都不能是空字符串。默认不过滤。|H5(HBuilder X2.9.9+)|
|compressed|Boolean|否|是否压缩所选的视频源文件,默认值为 true,需要压缩。|微信小程序、百度小程序、字节跳动小程序、飞书小程序|
|extension|Array&lt;String&gt;|否|根据文件拓展名过滤,每一项都不能是空字符串。默认不过滤。|H5(HBuilder X 2.9.9+)|
|compressed|Boolean|否|是否压缩所选的视频源文件,默认值为 true,需要压缩。|微信小程序、百度小程序、字节跳动小程序、飞书小程序、App(HBuilder X 3.2.7+)|
|maxDuration|Number|否|拍摄视频最长拍摄时间,单位秒。最长支持 60 秒。|APP平台 1.9.7+(iOS支持,Android取决于ROM的拍照组件是否实现此功能,如果没实现此功能则忽略此属性。) 微信小程序、百度小程序|
|camera|String|否|'front'、'back',默认'back'|APP、微信小程序|
|success|Function|否|接口调用成功,返回视频文件的临时文件路径,详见返回参数说明。||
......
......@@ -20,6 +20,7 @@ uni.makePhoneCall({
注:App端关于电话短信的扩展文档
- Android需要在 manifest.json 增加权限 `<uses-permission android:name="android.permission.CALL_PHONE"/>`
- Android不弹出询问框直接拨打电话:[https://ask.dcloud.net.cn/question/4035](https://ask.dcloud.net.cn/question/4035)
- 发送短信:[http://www.html5plus.org/doc/zh_cn/messaging.html](http://www.html5plus.org/doc/zh_cn/messaging.html)
- Android读取短信验证码:[http://ask.dcloud.net.cn/article/676](http://ask.dcloud.net.cn/article/676)
......
......@@ -5,7 +5,7 @@
**OBJECT参数说明**
|参数|类型|必填|说明|平台差异说明|
|:-|:-|:-|:-|:-|:-|
|:-|:-|:-|:-|:-|
|title|String|是|提示的内容,长度与 icon 取值有关。||
|icon|String|否|图标,有效值详见下方说明。||
|image|String|否|自定义图标的本地路径(app端暂不支持gif)|App、H5、微信小程序、百度小程序|
......@@ -20,9 +20,9 @@
|值|说明|平台差异说明|
|:-|:-|:-|
|success|显示成功图标,此时 title 文本最多显示 7 个汉字长度。默认值||
|error|显示错误图标,此时 title 文本最多显示 7 个汉字长度。||
|loading|显示加载图标,此时 title 文本最多显示 7 个汉字长度。|支付宝小程序不支持|
|success|显示成功图标,此时 title 文本`小程序`平台最多显示 7 个汉字长度。||
|error|显示错误图标,此时 title 文本`小程序`平台最多显示 7 个汉字长度。||
|loading|显示加载图标,此时 title 文本`小程序`平台最多显示 7 个汉字长度。|支付宝小程序不支持|
|none|不显示图标,此时 title 文本在`小程序`最多可显示两行,`App`仅支持单行显示。|&nbsp;|
**示例**
......@@ -106,9 +106,9 @@ setTimeout(function () {
|title|String|否|提示的标题||
|content|String|否|提示的内容||
|showCancel|Boolean|否|是否显示取消按钮,默认为 true||
|cancelText|String|否|取消按钮的文字,默认为"取消",最多 4 个字符||
|cancelText|String|否|取消按钮的文字,默认为"取消"||
|cancelColor|HexColor|否|取消按钮的文字颜色,默认为"#000000"|H5、微信小程序、百度小程序|
|confirmText|String|否|确定按钮的文字,默认为"确定",最多 4 个字符||
|confirmText|String|否|确定按钮的文字,默认为"确定"||
|confirmColor|HexColor|否|确定按钮的文字颜色,H5平台默认为"#007aff",微信小程序平台默认为"#576B95",百度小程序平台默认为"#3c76ff"|H5、微信小程序、百度小程序|
|editable|Boolean|否|是否显示输入框|H5 (3.2.10+)、App (3.2.10+)、微信小程序 (2.17.1+)|
|placeholderText|String|否|显示输入框时的提示文本|H5 (3.2.10+)、App (3.2.10+)、微信小程序 (2.17.1+)|
......@@ -119,7 +119,7 @@ setTimeout(function () {
**success返回参数说明**
|参数|类型|说明|
|:-|:-|:-|:-|
|:-|:-|:-|
|confirm|Boolean|为 true 时,表示用户点击了确定按钮|
|cancel|Boolean|为 true 时,表示用户点击了取消(用于 Android 系统区分点击蒙层关闭还是点击取消按钮关闭)|
......@@ -141,9 +141,10 @@ uni.showModal({
```
**注意**
- 弹框同时使用确定取消时,需注意不同平台的确认取消按钮位置不同。在微信、H5中,确认按钮默认在右边。在App中,iOS的确认按钮默认在右边,而Android默认在左边。产生这种差异的原因是uni.showModa在App和小程序上调用的是原生提供的弹出框,原生平台的策略本身就不同。如果需要调整,可以通过自行控制按钮的文字,即“确定”按钮的文字其实可以设置为“取消”。
- showModal不满足需求时,可以自行开发组件弹框。插件市场有很多自定义弹框的组件,需注意在非H5平台,前端组件无法覆盖原生组件(如地图、video),遮罩也无法盖住tabbar和navigationbar。如需覆盖原生组件或遮罩tabbar等,App端推荐使用[subNvue](https://uniapp.dcloud.net.cn/api/window/subNVues)
- App端还有原生的[prompt API](https://www.html5plus.org/doc/zh_cn/nativeui.html#plus.nativeUI.prompt),弹出界面中内置一个输入框。其他平台需自行封装前端组件实现。
- 弹框同时使用确定取消时,需注意不同平台的确认取消按钮位置不同。在微信、H5中,确认按钮默认在右边。在App中,iOS的确认按钮默认在右边,而Android默认在左边。产生这种差异的原因是uni.showModal在App和小程序上调用的是原生提供的弹出框,原生平台的策略本身就不同。如果需要调整,可以通过自行控制按钮的文字,即“确定”按钮的文字其实可以设置为“取消”;
- showModal不满足需求时,可以自行开发组件弹框。插件市场有很多自定义弹框的组件,需注意在非H5平台,前端组件无法覆盖原生组件(如地图、video),遮罩也无法盖住tabbar和navigationbar。如需覆盖原生组件或遮罩tabbar等,App端推荐使用[subNvue](https://uniapp.dcloud.net.cn/api/window/subNVues)
- App端还有原生的[prompt API](https://www.html5plus.org/doc/zh_cn/nativeui.html#plus.nativeUI.prompt),弹出界面中内置一个输入框。其他平台需自行封装前端组件实现;
- 小程序平台,`cancelText``confirmText`有长度限制,最多允许 4 个字符;
- 钉钉小程序真机与模拟器表现有差异,真机title,content均为必填项
......
* 配置
* [pages.json](collocation/pages.md)
* [manifest.json](collocation/manifest.md)
* [pages.json 页面路由](collocation/pages.md)
* [manifest.json 应用配置](collocation/manifest.md)
* [package.json](collocation/package.md)
* [vue.config.js](collocation/vue-config.md)
* [uni.scss](collocation/uni-scss.md)
* [App.vue](collocation/App.md)
* [main.js](collocation/main.md)
* [env](collocation/env.md)
* [小程序插件](collocation/miniprogram-plugin.md)
* [plugin.json 生成小程序插件](collocation/miniprogram-plugin.md)
* 框架接口
* [日志打印](collocation/frame/log.md)
* [定时器](collocation/frame/timer.md)
......@@ -19,7 +19,8 @@
* 自动化测试
* [快速开始](collocation/auto/quick-start.md)
* [API](collocation/auto/api.md)
* [自动化测试插件](collocation/auto/hbuilderx-extension/index.md)
* [HBuilderX自动化测试插件](collocation/auto/hbuilderx-extension/index.md)
* [CLI项目自动化测试](collocation/auto/uniapp-cli-project.md)
<li></li>
<div class="contact-box">
<a href="//unicloud.dcloud.net.cn" target="_blank" class="contact-item">
......
# API
### Page
Page 模块提供了控制页面的方法。
......
# 自动化测试插件@hbuilderxextension
# 自动化测试插件@extension
## 插件说明@description
本插件,用于在HBuilderX内运行uniapp自动化测试,支持H5、微信小程序、android、ios自动化测试。
本插件,用于在HBuilderX内运行uni-app自动化测试,支持H5、微信小程序、android、ios自动化测试。
主要功能有:
- 初始化测试环境(创建测试配置文件、以及安装测试所需的环境)
- 运行测试 (运行项目下所有测试用例、运行某一个测试用例)
- 新建测试用例 (uniapp pages页面,右键菜单【新建测试用例】)
- 查看历史测试报告 (hbuilderx顶部运行菜单)
- 新建测试用例 (uni-app pages页面,右键菜单【新建测试用例】)
- 查看历史测试报告 (HBuilderX顶部运行菜单)
## 测试注意事项@note
1. 本插件支持`uniapp普通项目``uniapp-cli项目`。uniapp-cli项目,运行自动化测试,需要在当前项目下安装自动化测试依赖。
1. 本插件支持`uni-app普通项目``uniapp-cli项目`。uniapp-cli项目,运行自动化测试,需要在当前项目下安装自动化测试依赖。
2. Windows电脑不支持运行测试到`ios手机`
3. MacOSX电脑,仅支持运行测试到`ios模拟器`,不支持ios真机
3. MacOSX电脑,仅支持运行测试到`iOS模拟器`,不支持ios真机,测试iOS模拟器,需要电脑装安装XCode
4. 运行测试到H5,仅支持`chrome`浏览器,不支持其它浏览器。
5. 运行测试到Android手机,如果HBuilderX仅检测到一个android设备,直接运行测试到当前已连接设备。多个设备时,会弹窗要求选择手机。
5. 运行测试到Android手机,如果HBuilderX仅检测到一个android设备,`直接`运行测试到当前已连接设备。`多个`设备时,会弹窗要求选择手机。
6. node: 当本机未安装node时,将使用HBuilderX`内置node`运行测试。反之,本机安装了node,则使用本机的node。
7. 运行测试到微信小程序,必须在manifest.json内,配置微信小程序 appid。如果微信开发者工具无法成功打开项目,首次请手动打开。
## 插件安装@testInstall
## 插件安装@test-install
[插件安装地址](https://ext.dcloud.net.cn/plugin?id=5708)
......@@ -36,16 +37,16 @@
- H5、微信、ios、android自动化测试依赖`puppeteer``adbkit``node-simctl``jest``playwright`,运行插件时,如果未安装此依赖,将会弹窗自动安装。
- `注意`:本插件0.0.3版本及以下,node: 当本机未安装node时,将使用HBuilderX内置的node运行测试。反之,本机安装了node,则使用本机的node。
- `注意`:本插件0.0.4+版本,新增配置项 支持自定义设置使用何种node版本进行uniapp编译
- `注意`:本插件0.0.4+版本,新增配置项 支持自定义设置使用何种node版本进行uni-app编译
**特别注意:**
- uniapp普通项目,需要通过插件`hbuilderx-for-uniapp-test`来安装测试环境。
- uni-app普通项目,需要通过插件`hbuilderx-for-uniapp-test`来安装测试环境。
- uniapp-cli项目,只需在项目下安装相关测试依赖即可。[详情](#uniapp-cli项目)
### uniapp普通项目@uniapp
### uni-app普通项目@uni-app
uniapp普通项目,`初始化测试环境``运行测试`时,如果未安装相关依赖,会自动安装。
uni-app普通项目,`初始化测试环境``运行测试`时,如果未安装相关依赖,会自动安装。
如下图所示,项目管理器,选中项目,右键菜单【初始化测试环境】
......@@ -53,7 +54,7 @@ uniapp普通项目,`初始化测试环境`或`运行测试`时,如果未安
<img src="https://vkceyugu.cdn.bspapp.com/VKCEYUGU-a90b5f95-90ba-4d30-a6a7-cd4d057327db/ca0f9ce4-1d45-4103-9800-36a1608062d4.gif" style="zoom: 70%;border: 1px solid #eee; border-radius: 10px;"/>
### uniapp-cli项目@uniappcli
### uniapp-cli项目@cli
uniapp-cli项目,自动化测试运行,将使用**项目下的依赖库**
......@@ -62,15 +63,15 @@ uniapp-cli项目,自动化测试运行,将使用**项目下的依赖库**。
npm install --save cross-env puppeteer adbkit node-simctl jest playwright @playwright/test
```
## 创建测试用例@createTestCase
## 创建测试用例@create-testcase
uniapp项目,pages页面,右键菜单,创建测试用例
uni-app项目,pages页面,右键菜单,创建测试用例
<img src="https://vkceyugu.cdn.bspapp.com/VKCEYUGU-a90b5f95-90ba-4d30-a6a7-cd4d057327db/2b15f277-5a79-425e-b978-19e16d3062f5.gif" style="zoom: 70%;border: 1px solid #eee;border-radius: 15px;"/>
## 测试运行@testRun
## 测试运行@test-run
创建测试用例之后,选中项目,右键菜单【运行uniapp自动化测试】,选择运行平台,即可开始运行测试。
创建测试用例之后,选中项目,右键菜单【运行uni-app自动化测试】,选择运行平台,即可开始运行测试。
<img src="https://vkceyugu.cdn.bspapp.com/VKCEYUGU-a90b5f95-90ba-4d30-a6a7-cd4d057327db/97a253eb-6c10-4b4d-a66f-1b45de1acc59.gif" style="zoom: 70%;border: 1px solid #eee;border-radius: 10px;"/>
......@@ -83,20 +84,20 @@ uniapp项目,pages页面,右键菜单,创建测试用例
- 运行测试到H5,仅支持`chrome`浏览器,**不支持**其它浏览器。
- 运行测试到Android手机,如果HBuilderX仅检测到**一个android设备**,直接运行测试到当前已连接设备。多个设备时,会弹窗要求选择手机。
### 选择测试平台@selectPlatform
### 选择测试平台@select-platform
如下图所示,运行测试时,支持选择对应平台。
<img src="https://vkceyugu.cdn.bspapp.com/VKCEYUGU-a90b5f95-90ba-4d30-a6a7-cd4d057327db/856d6345-3274-4856-8830-3bccfcc9d747.png" style="zoom: 50%;border: 1px solid #eee;border-radius: 5px;"/>
### 选择设备@selectDevices
### 选择设备@select-devices
> 如果无法获取到设备信息,请[参考](https://ask.dcloud.net.cn/article/97)
<img src="https://vkceyugu.cdn.bspapp.com/VKCEYUGU-a90b5f95-90ba-4d30-a6a7-cd4d057327db/48721bc9-247c-461c-b6f8-8fca1838b734.png" style="zoom: 45%;border: 1px solid #eee;border-radius: 5px;"/>
## 插件配置@extensionConfig
## 插件配置@extension-config
点击菜单【设置】【插件配置】,找到hbuilderx-for-uniapp-test项,即可看到设置项。
......@@ -106,19 +107,19 @@ uniapp项目,pages页面,右键菜单,创建测试用例
- 支持自定义**`测试报告`**路径。
- 自动修改jest.config.js文件中的testMatch,默认为`true`。去掉勾选后,将不再自动修改testMatch。
- 插件0.0.4+版本,新增配置项 支持自定义设置使用何种node版本进行uniapp编译。即您可以选择使用HBuilderX`内置的Node`、还是使用`操作系统`安装的Node进行uniapp编译。
- 插件0.0.4+版本,新增配置项 支持自定义设置使用何种node版本进行uni-app编译。即您可以选择使用HBuilderX`内置的Node`、还是使用`操作系统`安装的Node进行uni-app编译。
## 如何编写测试用例@howToWriteTestcase
> uniapp自动化测试,使用了业内常见的jest测试库。
> uni-app自动化测试,使用了业内常见的jest测试库。
- uniapp项目,pages目录下,右键菜单【创建测试用例】,选择模板。
- uni-app项目,pages目录下,右键菜单【创建测试用例】,选择模板。
- 测试用例文件名,必须为xxx.test.js
- 测试用例编写,请遵循jest规范。
### jest用例解析@jestTestcase
### jest用例解析@jest-testcase
下面将使用一个最简单的示例,来讲解测试用例的组成。
......@@ -144,9 +145,9 @@ describe("sum test", () => {
```
### uniapp页面用例示例@example
### uni-app页面用例示例@example
以uniapp【默认模板】index页面为例。
以uni-app【默认模板】index页面为例。
编写测试用例,检查`index.vue`页面,标题是否为`Hello`
......@@ -234,7 +235,7 @@ Snapshots: 0 total
Time: 0.454 s
```
## 内置Jest代码块@codeblocks
## 内置Jest代码块@snippets
> 为了更快速的编写测试用例,本插件内置了jest部分代码块
......
#### uni-app自动化测试
# uni-app自动化测试@about
uni-app提供了一批API,这些API可以操控uni-app应用,包括运行、跳转页面、触发点击等,并可以获取页面元素状态、进行截图,从而实现对uni-app项目进行自动化测试的目的。
uni-app提供了一批[API](/collocation/auto/api),这些API可以操控uni-app应用,包括运行、跳转页面、触发点击等,并可以获取页面元素状态、进行截图,从而实现对uni-app项目进行自动化测试的目的。
本功能使用到了业内常见的测试库如jest(MIT协议)。
#### 特性
开发者可以利用API做以下事情:
推荐使用方式:研发提交源码到版本库后,持续集成系统自动拉取源码,自动运行自动化测试。
### 特性@features
开发者可以利用[API](/collocation/auto/api)做以下事情:
* 控制跳转到指定页面
* 获取页面数据
......@@ -19,256 +21,22 @@ uni-app提供了一批API,这些API可以操控uni-app应用,包括运行、
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|√(ios仅支持模拟器)|√|√|x|x|x|x|x|x|
### CLI
目前仅 [cli](https://uniapp.dcloud.net.cn/quickstart?id=_2-通过vue-cli命令行) 工程支持。有利于持续集成。
[HBuilderX uniapp自动化测试插件](https://ext.dcloud.net.cn/plugin?id=5708), 支持在HBuilderX内对uniapp普通项目、cli项目进行自动化测试。此插件简化了测试环境安装、测试用例创建、测试运行、测试设备选择等步骤。
推荐使用方式:研发提交源码到版本库后,持续集成系统自动拉取源码,自动运行自动化测试。
暂不支持百度,先忽略百度相关测试代码
创建 `cli` 工程
```
# 全局安装vue-cli
$ npm install -g @vue/cli
$ cd ... // 切换到工程保存目录
$ vue create -p dcloudio/uni-preset-vue#alpha my-project
```
如果之前是HBuilderX工程,则把HBuilderX工程内的文件(除 unpackage、node_modules 目录)拷贝至 vue-cli 工程的 src 目录。
在 vue-cli 工程内重新安装 npm 依赖(如果之前使用了 npm 依赖的话)
cli创建项目时若选择`hello uni-app`模板,可看到其中已经自带部分测试例。
已有 `cli` 工程
1. 更新依赖包 `@dcloudio/*` >= `2.0.0-alpha-27920200613002`
2. 安装依赖包 `@dcloudio/uni-automator`
```
npm install @dcloudio/uni-automator --save-dev
```
3. package.json script节点新增命令
```
"test:h5": "cross-env UNI_PLATFORM=h5 jest -i",
"test:android": "cross-env UNI_PLATFORM=app-plus UNI_OS_NAME=android jest -i",
"test:ios": "cross-env UNI_PLATFORM=app-plus UNI_OS_NAME=ios jest -i",
"test:mp-weixin": "cross-env UNI_PLATFORM=mp-weixin jest -i",
"test:mp-baidu": "cross-env UNI_PLATFORM=mp-baidu jest -i"
```
#### H5平台测试流程
1. 进入工程目录,安装依赖
```
npm install puppeteer --save-dev
```
注意: 从v3.0.0开始,`Puppeteer` 开始依赖于Node 10.18.1+
2. 根据API编写测试的js代码,参考测试用例
API文档见:[https://uniapp.dcloud.io/collocation/auto/api](https://uniapp.dcloud.io/collocation/auto/api)
测试文件目录配置见 [jest.config.js](collocation/auto/quick-start?id=jestconfigjs)
3. 运行测试
```
npm run test:h5
```
4. 测试结果
```
>> cross-env UNI_PLATFORM=h5 jest -i
...
Test Suites: 1 passed, 1 total
Tests: 4 passed, 4 total
Snapshots: 0 total
Time: 14.995s, estimated 16s
```
更多配置参考 [jest.config.js](collocation/auto/quick-start?id=jestconfigjs)
#### App-Android测试流程
1. 配置全局 `adb` 环境变量
2. 配置 `Hbuilder` 调试基座/自定义基座 `android_base.apk` 目录,参考 `jest.config.js`
3. 创建 `cli` 工程/现有 `cli` 工程
切换到工程目录,安装依赖包 `adbkit`
```
npm install adbkit --save-dev
```
4. 编写测试代码,参考测试用例
5. 运行测试
```
npm run test:android
```
#### App-iOS测试流程
目前仅支持 iOS 模拟器(需要mac电脑安装xcode)
1. 安装依赖 `node-simctl`
```
npm install node-simctl --save-dev
```
2. 配置模拟器id,参考 `jest.config.js`
3. 配置 `Hbuilder` 调试基座/自定义基座 `Pandora_simulator.app` 目录,参考 `jest.config.js`
4. 编写测试代码,参考测试用例
5. 运行测试
```
npm run test:ios
```
#### 微信小程序测试流程
1. 创建cli项目,同H5平台 (必须配置微信小程序 appid, manifest.json -> mp-weixin -> appid)
2. 运行测试(如果微信开发者工具无法成功打开项目,请手动打开)
```
npm run test:mp-weixin
```
3. 测试结果
```
> cross-env NODE_ENV=development UNI_PLATFORM=mp-weixin vue-cli-service uni-build --watch "--auto-port" "9520"
Test Suites: 1 passed, 1 total
Tests: 4 passed, 4 total
Snapshots: 0 total
Time: 14.995s, estimated 16s
```
#### 测试示例
使用 hello uni-app 工程测试 H5 平台
1. 创建 `cli` 项目,选择 `hello uni-app`
```
$ vue create -p dcloudio/uni-preset-vue#alpha my-hello-uni-app
# 进入项目目录
$ cd my-hello-uni-app
```
2. 安装 `puppeteer`
```
npm install puppeteer
```
3. 创建测试文件 `src/pages/tabBar/component/component.test.js`,复制下面代码
```
describe('pages/tabBar/component/component.nvue', () => {
let page
beforeAll(async () => {
// 重新reLaunch至首页,并获取首页page对象(其中 program 是uni-automator自动注入的全局对象)
page = await program.reLaunch('/pages/tabBar/component/component')
await page.waitFor(1000)
})
it('u-link', async () => {
// 检测首页u-link的文本内容
expect(await (await page.$('.hello-link')).text()).toBe('https://uniapp.dcloud.io/component/')
})
it('视图容器', async () => {
// 检测首个 panel 是视图容器
expect(await (await page.$('.uni-panel-text')).text()).toBe('视图容器')
// 检测首个 panel 切换展开
const panelH = await page.$('.uni-panel-h');
// 不能做完全匹配,百度小程序会生成额外的class
expect(await panelH.attribute('class')).toContain('uni-panel-h')
await panelH.tap()
await page.waitFor(500)
// 已展开
expect(await panelH.attribute('class')).toContain('uni-panel-h-on')
})
如果您想在`终端命令行`进行自动化测试、或使用持续集成进行测试,请使用uni-app [CLI](https://uniapp.dcloud.net.cn/quickstart?id=_2-通过vue-cli命令行) 工程,[CLI项目自动化测试教程](/collocation/auto/uniapp-cli-project)
it('.uni-panel', async () => {
const lists = await page.$$('.uni-panel')
expect(lists.length).toBe(9)
})
### 测试插件@descriptions
it('.uni-panel action', async () => {
const listHead = await page.$('.uni-panel-h')
expect(await listHead.attribute('class')).toContain('uni-panel-h-on')
await listHead.tap()
await page.waitFor(200)
expect(await listHead.attribute('class')).toContain(
'uni-panel-h',
)
为了方便大家在`HBuilderX`内,进行uni-app自动化测试,开发了 [HBuilderX uni-app自动化测试插件](https://ext.dcloud.net.cn/plugin?id=5708)
// 展开第一个 panel,点击第一个 item,验证打开的新页面是否正确
await listHead.tap()
await page.waitFor(200)
const item = await page.$('.uni-navigate-item')
await item.tap()
await page.waitFor(500)
expect((await program.currentPage()).path).toBe('pages/component/view/view')
await page.waitFor(500)
插件支持在HBuilderX内对`uni-app普通项目``CLI项目`进行自动化测试。
// 执行 navigateBack 验证是否返回
expect((await program.navigateBack()).path).toBe('pages/tabBar/component/component')
})
})
```
4. 运行测试
```
npm run test:h5
```
插件简化了测试环境安装、测试用例创建、测试运行、测试设备选择等步骤。[插件使用文档](/collocation/auto/hbuilderx-extension/index)
5. 测试结果
```
> cross-env UNI_PLATFORM=h5 jest -i
PASS src/pages/tabBar/component/component.test.js (14.789s)
pages/tabBar/component/component.nvue
√ u-link (8ms)
√ 视图容器 (518ms)
√ .uni-panel (2ms)
√ .uni-panel action (4447ms)
Test Suites: 1 passed, 1 total
Tests: 4 passed, 4 total
Snapshots: 0 total
Time: 14.995s, estimated 16s
```
### jest.config.js@jestconfigjs
##### 屏幕截图示例
```
describe('pages/API/set-navigation-bar-title/set-navigation-bar-title.vue', () => {
let page
beforeAll(async () => {
// 重新reLaunch至首页,并获取首页page对象(其中 program 是uni-automator自动注入的全局对象)
page = await program.reLaunch('/pages/API/set-navigation-bar-title/set-navigation-bar-title')
await page.waitFor(3000)
})
it('.uni-hello-text', async () => {
var image = await program.screenshot({
path: "set-navigation-bar-title.png" // 默认项目根目录
})
console.log(image)
})
})
```
更多测试示例见: hello uni-app
GitHub: [https://github.com/dcloudio/hello-uniapp](https://github.com/dcloudio/hello-uniapp)
#### jest.config.js
jest.config.js文件,为测试配置文件,详细内容如下:
```
module.exports = {
......@@ -358,3 +126,7 @@ await tag.$('.test')
3. 微信小程序暂不支持父子选择器
4. 百度小程序选择元素必须有事件的元素才能被选中,否则提示元素不存在
5. 分包中的页面,打开之后要延迟时间长一点,否则不能正确获取到页面信息
### 测试示例
GitHub: [https://github.com/dcloudio/hello-uniapp](https://github.com/dcloudio/hello-uniapp)
\ No newline at end of file
# uni-app cli项目@uniapp-cli
> 本文档仅适用于CLI工程。
创建 `cli` 工程
```
# 全局安装vue-cli
$ npm install -g @vue/cli
$ cd ... // 切换到工程保存目录
$ vue create -p dcloudio/uni-preset-vue#alpha my-project
```
如果之前是HBuilderX工程,则把HBuilderX工程内的文件(除 unpackage、node_modules 目录)拷贝至 vue-cli 工程的 src 目录。
在 vue-cli 工程内重新安装 npm 依赖(如果之前使用了 npm 依赖的话)
cli创建项目时若选择`hello uni-app`模板,可看到其中已经自带部分测试例。
已有 `cli` 工程
1. 更新依赖包 `@dcloudio/*` >= `2.0.0-alpha-27920200613002`
2. 安装依赖包 `@dcloudio/uni-automator`
```
npm install @dcloudio/uni-automator --save-dev
```
3. package.json script节点新增命令
```
"test:h5": "cross-env UNI_PLATFORM=h5 jest -i",
"test:android": "cross-env UNI_PLATFORM=app-plus UNI_OS_NAME=android jest -i",
"test:ios": "cross-env UNI_PLATFORM=app-plus UNI_OS_NAME=ios jest -i",
"test:mp-weixin": "cross-env UNI_PLATFORM=mp-weixin jest -i",
"test:mp-baidu": "cross-env UNI_PLATFORM=mp-baidu jest -i"
```
#### H5平台测试流程
1. 进入工程目录,安装依赖
```
npm install puppeteer --save-dev
```
注意: 从v3.0.0开始,`Puppeteer` 开始依赖于Node 10.18.1+
2. 根据API编写测试的js代码,参考测试用例
API文档见:[https://uniapp.dcloud.io/collocation/auto/api](https://uniapp.dcloud.io/collocation/auto/api)
测试文件目录配置见 [jest.config.js](collocation/auto/quick-start?id=jestconfigjs)
3. 运行测试
```
npm run test:h5
```
4. 测试结果
```
>> cross-env UNI_PLATFORM=h5 jest -i
...
Test Suites: 1 passed, 1 total
Tests: 4 passed, 4 total
Snapshots: 0 total
Time: 14.995s, estimated 16s
```
更多配置参考 [jest.config.js](collocation/auto/quick-start?id=jestconfigjs)
#### App-Android测试流程
1. 配置全局 `adb` 环境变量
2. 配置 `Hbuilder` 调试基座/自定义基座 `android_base.apk` 目录,参考 `jest.config.js`
3. 创建 `cli` 工程/现有 `cli` 工程
切换到工程目录,安装依赖包 `adbkit`
```
npm install adbkit --save-dev
```
4. 编写测试代码,参考测试用例
5. 运行测试
```
npm run test:android
```
#### App-iOS测试流程
目前仅支持 iOS 模拟器(需要mac电脑安装xcode)
1. 安装依赖 `node-simctl`
```
npm install node-simctl --save-dev
```
2. 配置模拟器id,参考 `jest.config.js`
3. 配置 `Hbuilder` 调试基座/自定义基座 `Pandora_simulator.app` 目录,参考 `jest.config.js`
4. 编写测试代码,参考测试用例
5. 运行测试
```
npm run test:ios
```
#### 微信小程序测试流程
1. 创建cli项目,同H5平台 (必须配置微信小程序 appid, manifest.json -> mp-weixin -> appid)
2. 运行测试(如果微信开发者工具无法成功打开项目,请手动打开)
```
npm run test:mp-weixin
```
3. 测试结果
```
> cross-env NODE_ENV=development UNI_PLATFORM=mp-weixin vue-cli-service uni-build --watch "--auto-port" "9520"
Test Suites: 1 passed, 1 total
Tests: 4 passed, 4 total
Snapshots: 0 total
Time: 14.995s, estimated 16s
```
#### 测试示例
使用 hello uni-app 工程测试 H5 平台
1. 创建 `cli` 项目,选择 `hello uni-app`
```
$ vue create -p dcloudio/uni-preset-vue#alpha my-hello-uni-app
# 进入项目目录
$ cd my-hello-uni-app
```
2. 安装 `puppeteer`
```
npm install puppeteer
```
3. 创建测试文件 `src/pages/tabBar/component/component.test.js`,复制下面代码
```
describe('pages/tabBar/component/component.nvue', () => {
let page
beforeAll(async () => {
// 重新reLaunch至首页,并获取首页page对象(其中 program 是uni-automator自动注入的全局对象)
page = await program.reLaunch('/pages/tabBar/component/component')
await page.waitFor(1000)
})
it('u-link', async () => {
// 检测首页u-link的文本内容
expect(await (await page.$('.hello-link')).text()).toBe('https://uniapp.dcloud.io/component/')
})
it('视图容器', async () => {
// 检测首个 panel 是视图容器
expect(await (await page.$('.uni-panel-text')).text()).toBe('视图容器')
// 检测首个 panel 切换展开
const panelH = await page.$('.uni-panel-h');
// 不能做完全匹配,百度小程序会生成额外的class
expect(await panelH.attribute('class')).toContain('uni-panel-h')
await panelH.tap()
await page.waitFor(500)
// 已展开
expect(await panelH.attribute('class')).toContain('uni-panel-h-on')
})
it('.uni-panel', async () => {
const lists = await page.$$('.uni-panel')
expect(lists.length).toBe(9)
})
it('.uni-panel action', async () => {
const listHead = await page.$('.uni-panel-h')
expect(await listHead.attribute('class')).toContain('uni-panel-h-on')
await listHead.tap()
await page.waitFor(200)
expect(await listHead.attribute('class')).toContain(
'uni-panel-h',
)
// 展开第一个 panel,点击第一个 item,验证打开的新页面是否正确
await listHead.tap()
await page.waitFor(200)
const item = await page.$('.uni-navigate-item')
await item.tap()
await page.waitFor(500)
expect((await program.currentPage()).path).toBe('pages/component/view/view')
await page.waitFor(500)
// 执行 navigateBack 验证是否返回
expect((await program.navigateBack()).path).toBe('pages/tabBar/component/component')
})
})
```
4. 运行测试
```
npm run test:h5
```
5. 测试结果
```
> cross-env UNI_PLATFORM=h5 jest -i
PASS src/pages/tabBar/component/component.test.js (14.789s)
pages/tabBar/component/component.nvue
√ u-link (8ms)
√ 视图容器 (518ms)
√ .uni-panel (2ms)
√ .uni-panel action (4447ms)
Test Suites: 1 passed, 1 total
Tests: 4 passed, 4 total
Snapshots: 0 total
Time: 14.995s, estimated 16s
```
##### 屏幕截图示例
```
describe('pages/API/set-navigation-bar-title/set-navigation-bar-title.vue', () => {
let page
beforeAll(async () => {
// 重新reLaunch至首页,并获取首页page对象(其中 program 是uni-automator自动注入的全局对象)
page = await program.reLaunch('/pages/API/set-navigation-bar-title/set-navigation-bar-title')
await page.waitFor(3000)
})
it('.uni-hello-text', async () => {
var image = await program.screenshot({
path: "set-navigation-bar-title.png" // 默认项目根目录
})
console.log(image)
})
})
```
更多测试示例见: hello uni-app
GitHub: [https://github.com/dcloudio/hello-uniapp](https://github.com/dcloudio/hello-uniapp)
\ No newline at end of file
使用uni-app做出海App的开发者越来越多,大家都关心国际化的问题
uni-app的国际化,即多语言,分为应用部分和框架部分
## 框架内置组件和API国际化
- 应用部分,即开发者自己的代码里涉及的界面部分
- 框架部分,即uni-app内置组件和API涉及界面的部分
uni-app 从 3.1.5 版本开始框架内置组件开始完善国际化支持,这些组件内置如下语言:
不同端的国际化方案也有差异,uni-app 自 3.1.5起,App 和 H5 支持框架国际化。小程序平台的国际化依赖于小程序平台框架自身。一般而言海外用户更多使用的是App和H5。
* 中文简体
* 中文繁体
* 英语
* 法语
* 西班牙语
可以在HBuilderX新建项目里选择`Hello i18n`示例或者插件市场查看[https://ext.dcloud.net.cn/plugin?id=6462](https://ext.dcloud.net.cn/plugin?id=6462)
组件和接口显示会根据系统语言环境自动切换,未支持的系统语言环境会显示为英文
## vue界面和js内容的国际化
## 应用内容国际化
vue和js里的内容国际化是通行方案。
vue和js里的内容国际化是与web通行的方案。
main.js 引入并初始化 VueI18n
......@@ -92,63 +88,34 @@ export function createApp() {
注意:页面中设置语言后需要调用 `this.$i18n.locale = 'zh-Hans'` 后生效
## uni-app 框架国际化@uni-framework
## nvue页面国际化@nvue
项目根目录支持 `locale` 目录,locale/uni-app.`语言地区代码`.json,如:uni-app.en.json,uni-app.zh-Hans.json,uni-app.zh-Hant.json
nvue 目前的国际化方案需要在每个页面单独引入uni-i18n,后续框架会抹平差异,抹平差异后和 vue 页面一样只需要在 main.js 中引入
```
├── locale
│ ├── uni-app.en.json
│ ├── uni-app.zh-Hans.json
│ └── uni-app.zh-Hant.json
```
```js
<script>
import {
initVueI18n
} from '@dcloudio/uni-i18n'
uni-app.zh-Hans.json 文件
// const messages = {} 此处内容省略,和 vue 全局引入的写法一致
```json
{
"common": {
"uni.app.quit": "再按一次退出应用",
"uni.async.error": "连接服务器超时,点击屏幕重试",
"uni.showActionSheet.cancel": "取消",
"uni.showToast.unpaired": "请注意 showToast 与 hideToast 必须配对使用",
"uni.showLoading.unpaired": "请注意 showLoading 与 hideLoading 必须配对使用",
"uni.showModal.cancel": "取消",
"uni.showModal.confirm": "确定",
"uni.chooseImage.cancel": "取消",
"uni.chooseImage.sourceType.album": "从相册选择",
"uni.chooseImage.sourceType.camera": "拍摄",
"uni.chooseVideo.cancel": "取消",
"uni.chooseVideo.sourceType.album": "从相册选择",
"uni.chooseVideo.sourceType.camera": "拍摄",
"uni.previewImage.cancel": "取消",
"uni.previewImage.button.save": "保存图像",
"uni.previewImage.save.success": "保存图像到相册成功",
"uni.previewImage.save.fail": "保存图像到相册失败",
"uni.setClipboardData.success": "内容已复制",
"uni.scanCode.title": "扫码",
"uni.scanCode.album": "相册",
"uni.scanCode.fail": "识别失败",
"uni.scanCode.flash.on": "轻触照亮",
"uni.scanCode.flash.off": "轻触关闭",
"uni.startSoterAuthentication.authContent": "指纹识别中...",
"uni.picker.done": "完成",
"uni.picker.cancel": "取消",
"uni.video.danmu": "弹幕",
"uni.video.volume": "音量",
"uni.button.feedback.title": "问题反馈",
"uni.button.feedback.send": "发送"
},
"ios": {},
"android": {}
}
const { t } = initVueI18n(messages)
export default {
data() {
return {
}
}
}
</script>
```
## pages.json 国际化@pages
pages.json不属于vue部分,其中的原生tabbar和原生导航栏里也有文字内容。这部分内容的国际化方案如下:
pages.json不属于vue页面,其中的原生tabbar和原生导航栏里也有文字内容。这部分内容的国际化方案如下:
项目根目录的locale目录下配置语言json文件,locale/`语言地区代码`.json,如:en.json,zh-Hans.json,zh-Hant.json
......@@ -197,6 +164,87 @@ pages.json 支持以下属性配置国际化信息
- titleNView->searchInput->placeholder
- tabBar->list->text
注:小程序下不支持这种国际化方案,也可以使用设置tabbar和navigationbar的API来设置文字。或者废弃原生tabbar和navigationbar,使用自定义方式。
## 框架内置组件和API国际化
uni-app 有内置的基础组件,比如picker,或者与界面相关的API,比如showModal。这些界面包含的文字也需要国际化。
自 3.1.5 版本起,App和H5平台内置的基础组件和接口相关的文字内容支持国际化。
这部分国际化,提供了2种策略,有自动策略,也有自定义方案。
### 自动适配手机或浏览器语言
uni-app 基础组件和API,内置如下语言:
* 中文简体
* 中文繁体
* 英语
* 法语
* 西班牙语
内置组件和接口显示会根据系统语言环境自动切换,未支持的系统语言环境会显示为英文。
> uni-ui在1.4.8版本后也支持国际化
### 自定义国际化内容@uni-framework
如果自动适配语言不满足你的需求,比如需要预置的5种语言外的更多语言。那么可以使用自定义方案。在指定目录创建指定文件,用同名词条来替换。
项目根目录支持 `locale` 目录,locale/uni-app.`语言地区代码`.json,如:uni-app.en.json,uni-app.zh-Hans.json,uni-app.zh-Hant.json
```
├── locale
│ ├── uni-app.en.json
│ ├── uni-app.zh-Hans.json
│ └── uni-app.zh-Hant.json
```
uni-app.zh-Hans.json 文件
```json
{
"common": {
"uni.app.quit": "再按一次退出应用",
"uni.async.error": "连接服务器超时,点击屏幕重试",
"uni.showActionSheet.cancel": "取消",
"uni.showToast.unpaired": "请注意 showToast 与 hideToast 必须配对使用",
"uni.showLoading.unpaired": "请注意 showLoading 与 hideLoading 必须配对使用",
"uni.showModal.cancel": "取消",
"uni.showModal.confirm": "确定",
"uni.chooseImage.cancel": "取消",
"uni.chooseImage.sourceType.album": "从相册选择",
"uni.chooseImage.sourceType.camera": "拍摄",
"uni.chooseVideo.cancel": "取消",
"uni.chooseVideo.sourceType.album": "从相册选择",
"uni.chooseVideo.sourceType.camera": "拍摄",
"uni.previewImage.cancel": "取消",
"uni.previewImage.button.save": "保存图像",
"uni.previewImage.save.success": "保存图像到相册成功",
"uni.previewImage.save.fail": "保存图像到相册失败",
"uni.setClipboardData.success": "内容已复制",
"uni.scanCode.title": "扫码",
"uni.scanCode.album": "相册",
"uni.scanCode.fail": "识别失败",
"uni.scanCode.flash.on": "轻触照亮",
"uni.scanCode.flash.off": "轻触关闭",
"uni.startSoterAuthentication.authContent": "指纹识别中...",
"uni.picker.done": "完成",
"uni.picker.cancel": "取消",
"uni.video.danmu": "弹幕",
"uni.video.volume": "音量",
"uni.button.feedback.title": "问题反馈",
"uni.button.feedback.send": "发送"
},
"ios": {},
"android": {}
}
```
## manifest.json 国际化@manifest
......@@ -215,10 +263,26 @@ pages.json 支持以下属性配置国际化信息
`manifest.json` 中支持配置默认语言,参见上面的示例,默认跟随系统语言
## 小程序国际化@miniprogram
已支持
- 页面
- 组件
不支持
- pages.json,可以通过调用API来设置,例如更改标题 `uni.setNavigationBarTitle()`
- tabbar 不支持动态修改内容,但是可以通过自定义tabbar的方式,详情: [https://uniapp.dcloud.net.cn/collocation/pages?id=custom-tab-bar](https://uniapp.dcloud.net.cn/collocation/pages?id=custom-tab-bar)
## schema 国际化@schema
HBuilderX 3.3.0+
schema中涉及字段的显示名称、错误格式提示语,这些也需要国际化。
在项目根目录 uniCloud/database/locale/{数据库表名}/`语言地区代码`.json 文件,然后在 `*.schema.json` 文件中使用 %% 占位
```
......@@ -279,10 +343,10 @@ zh-Hans 文件内容
```
## 应用中原生ui界面的国际化
应用中调用到相册选择、地图等包含界面的原生能力时,这些原生界面的ui无法在前端控制
- 地图部分,可以使用web-view组件内嵌google的web地图,也可以用uni-app的原生插件机制封装google原生地图sdk。
- 其他原生ui界面如相册选择,无法国际化,可以自己开发一个原生插件来替代之
## App第三方SDK界面的国际化
uni-app App端sdk国际化依赖于sdk自身,一般而言推荐直接使用适配海外的SDK
如map的sdk,海外可直接使用google地图。相关插件在插件市场均可搜到
## 应用名称及iOS隐私提示语的国际化
云打包详见[https://ask.dcloud.net.cn/article/35860](https://ask.dcloud.net.cn/article/35860)
......@@ -291,6 +355,8 @@ zh-Hans 文件内容
## 语言API
uni-app内置了一批与国际化相关的API和生命周期,如下:
[uni.getLocale](/api/ui/locale?id=getlocale)
获取当前区域设置(语言)
......@@ -306,9 +372,7 @@ zh-Hans 文件内容
## 国际化示例项目@helloi18n
Github: [hello i18n](https://github.com/dcloudio/hello-i18n.git)
HBuilderX 3.3 起,新建项目可以直接选择`hello i18n`模板,或者去插件市场查阅[https://ext.dcloud.net.cn/plugin?id=6462](https://ext.dcloud.net.cn/plugin?id=6462)
**注意:**
- 小程序平台暂不支持动态变化,编译时仅生成默认语言json配置
- Android 平台因原生层限制,将自动重启,其他平台均实时变化,包括已打开的所有页面
- Android 平台因原生层限制,将自动重启。其他平台均实时变化,包括已打开的所有页面
现在可以使用 uniapp 编译到微信、支付宝小程序插件。小程序插件是对一组 js 接口、自定义组件或页面的封装,用于嵌入到小程序中使用。
> 本文档意在介绍如何把uni-app项目编译为小程序插件,如果想了解如何在uni-app中引用和使用小程序插件,另见文档:[使用小程序插件](/component/mp-weixin-plugin)
小程序插件规范由小程序厂商定义,插件是对一组 js 接口、自定义组件或页面的封装,用于嵌入到小程序中使用。
uni-app 不仅仅可以开发完整的小程序,也可以编译为小程序插件。
**平台差异说明**
......@@ -9,11 +13,11 @@
**注意**
1. 开发 `微信小程序插件` 时,基础库版本 `1.9.6` 开始支持。(如果插件包含页面,则需要基础库版本 `2.1.0` 。)
2. 开发 `支付宝小程序插件` 时,IDE 版本要求在 0.60 及以上
2. 开发 `支付宝小程序插件` 时,支付宝 IDE 版本要求在 0.60 及以上
#### 插件目录结构
> 编译到小程序插件结果
> 编译到微信小程序插件结果
```
plugin
......@@ -33,7 +37,7 @@ plugin
#### 插件配置文件
> plugin.json 在 uniapp 项目中和 pages.json 同级。向第三方小程序开放的所有组件、页面和 js 接口都必须在 plugin.json 中声明
> plugin.json 在 uni-app 项目中和 pages.json 同级。向第三方小程序开放的所有组件、页面和 js 接口都必须在 plugin.json 中声明
- `mp-weixin`
......@@ -95,7 +99,7 @@ plugin
#### 如何在项目中使用插件
1. 宿主小程序是 `uniapp项目`,在 `manifest.json` 中配置相关信息即可,[详情](https://uniapp.dcloud.io/component/mp-weixin-plugin?id=%e9%85%8d%e7%bd%ae%e5%b0%8f%e7%a8%8b%e5%ba%8f%e6%8f%92%e4%bb%b6)
1. 宿主小程序是 `uni-app项目`,在 `manifest.json` 中配置相关信息即可,[详情](https://uniapp.dcloud.io/component/mp-weixin-plugin?id=%e9%85%8d%e7%bd%ae%e5%b0%8f%e7%a8%8b%e5%ba%8f%e6%8f%92%e4%bb%b6)
2. 宿主为原生小程序,在项目的 `app.json` 中配置即可:
- [mp-weixin 配置](https://developers.weixin.qq.com/miniprogram/dev/framework/plugin/using.html)
- [mp-alipay 配置](https://opendocs.alipay.com/mini/plugin/plugin-development#app.json%20%E9%BB%98%E8%AE%A4%E9%85%8D%E7%BD%AE)
......@@ -104,7 +108,7 @@ plugin
> 有时候项目不仅要编译到插件,也需要作为一个正常的小程序运行,但有些 api 并不适用于两端,此时可以使用自定义条件编译区分开来。
1. 自定义条件编译([详情](https://uniapp.dcloud.io/collocation/package)),在`package.json`中添加如以下配置:
1. 自定义条件编译([详情](/collocation/package)),在`package.json`中添加如以下配置:
```json
"uni-app": {
......@@ -155,7 +159,7 @@ plugin
Vue.component('hello-list', helloList);
```
2. 插件中所编写的页面需要在 `pages.json` 中填写。
3. 如果有多个 `uniapp` 编译的 `插件` 需要运行在同一个小程序中,**不要重名**
3. 如果有多个 `uni-app` 编译的 `插件` 需要运行在同一个小程序中,**不要重名**
4. 名称不要有特殊字符,比如 `\`。会用到这个名字来挂载一个方法。
5. `-` 已经手动替换为 `_` ,其他的特殊字符不要写。
6. 各家小程序插件对各 `api` 的支持情况不同,具体请查看小程序官方文档的相关描述
......@@ -416,7 +416,7 @@ uni-app 2.9+ 新增 leftWindow, topWindow, rightWindow 配置。用于解决宽
|background|HexColor|#FFFFFF|窗体背景色。无论vue页面还是nvue页面,在App上都有一个父级原生窗体,该窗体的背景色生效时间快于页面里的css生效时间|App|
|titleNView|Object||导航栏 ,详见:[导航栏](/collocation/pages?id=app-titleNView)|App、H5|
|subNVues|Object||原生子窗体,详见:[原生子窗体](/collocation/pages?id=app-subNVues)|App 1.9.10+|
|bounce|String||页面回弹效果,设置为 "none" 时关闭效果。|App(nvue Android无页面级bounce效果,仅list、recycle-list、waterfall等滚动组件有bounce效果)|
|bounce|String||页面回弹效果,设置为 "none" 时关闭效果。|App-vue(nvue Android无页面级bounce效果,仅list、recycle-list、waterfall等滚动组件有bounce效果)|
|popGesture|String|close|侧滑返回功能,可选值:"close"(启用侧滑返回)、"none"(禁用侧滑返回)|App-iOS|
|softinputNavBar|String|auto|iOS软键盘上完成工具栏的显示模式,设置为 "none" 时关闭工具栏。|App-iOS|
|softinputMode|String|adjustPan|软键盘弹出模式,支持 adjustResize、adjustPan 两种模式|App|
......
......@@ -24,7 +24,7 @@
|selection-end|Number|-1|光标结束位置,自动聚集时有效,需与selection-start搭配使用||
|adjust-position|Boolean|true|键盘弹起时,是否自动上推页面|App-Android(vue 页面 softinputMode 为 adjustResize 时无效,使用 x5 内核时无效)、微信小程序、百度小程序、QQ小程序|
|hold-keyboard|boolean|false|focus时,点击页面的时候不收起键盘|微信小程序2.8.2|
|auto-blur|boolean|false|键盘收起时,是否自动失去焦点|App 3.0.0+|
|auto-blur|boolean|false|键盘收起时,是否自动失去焦点|App-Vue 3.0.0+|
|@input|EventHandle||当键盘输入时,触发input事件,event.detail = {value}|差异见下方 Tips|
|@focus|EventHandle||输入框聚焦时触发,event.detail = { value, height },height 为键盘高度|仅微信小程序、App(2.2.3+) 、QQ小程序支持 height|
|@blur|EventHandle||输入框失去焦点时触发,event.detail = {value: value}|快手小程序不支持|
......
......@@ -51,7 +51,7 @@
**注意**
- `<map>` 组件的宽/高推荐写直接量,比如:750rpx,不要设置百分比值。
- `uni-app` 只支持 `gcj02` 坐标
- 谷歌地图使用 `wgs84` 坐标,其他地图使用 `gcj02` 坐标,用错坐标类型会显示偏移。
- App平台 `layer-style` 属性需要在地图服务商后台创建,值设置为高德后台申请的字符串,[详情](https://developer.amap.com/api/android-sdk/guide/create-map/custom)
### 近期新增功能
......@@ -102,10 +102,10 @@
|content|文本|String||
|color|文本颜色|String|App-nvue 2.1.5+、微信小程序、H5、百度小程序|
|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、百度小程序|
|anchorX|label的坐标,原点是 marker 对应的经纬度|Number|微信小程序|
|anchorY|label的坐标,原点是 marker 对应的经纬度|Number|微信小程序|
|x|label的坐标,原点是 marker 对应的经纬度|Number|H5、百度小程序|
|y|label的坐标,原点是 marker 对应的经纬度|Number|H5、百度小程序|
|anchorX|label的坐标,原点是 marker 对应的经纬度|Number|App-nvue 2.1.5+、微信小程序|
|anchorY|label的坐标,原点是 marker 对应的经纬度|Number|App-nvue 2.1.5+、微信小程序|
|borderWidth|边框宽度|Number|微信小程序、百度小程序|
|borderColor|边框颜色|String|微信小程序、百度小程序|
|borderRadius|边框圆角|Number|App-nvue 2.1.5+、微信小程序、百度小程序|
......
#### 配置小程序插件
> 本文档意在介绍如何在uni-app中引用和使用小程序插件,如果想了解如何把uni-app项目编译为小程序插件,另见文档:[发布为小程序插件](/collocation/miniprogram-plugin)
小程序插件是可被添加到小程序内直接使用的功能组件,在不同的小程序内叫法可能略有区别。微信小程序、支付宝小程序中叫`插件`,百度小程序中叫`动态库`,方便起见,以下统一称为插件。
#### 什么是小程序插件
小程序插件不同于小程序自定义组件。
小程序自定义组件是将组件源码导入到工程中,整体发布。
小程序插件是第三方插件作者按照微信等小程序厂商规范开发的独立插件,直接发布到小程序的插件平台。开发者在自己的小程序工程里只配置插件id,并不把插件源码导入工程。在运行期,由小程序引擎动态联网装载。开发者无法获取引入的三方小程序插件的源码。
在不同的小程序内叫法可能略有区别。微信小程序、支付宝小程序中叫`插件`,百度小程序中叫`动态库`,方便起见,以下统一称为插件。
**参考文档**
- [微信小程序插件](https://developers.weixin.qq.com/miniprogram/dev/framework/plugin/using.html)
- [支付宝小程序插件](https://opendocs.alipay.com/mini/plugin/plugin-usage)
- [百度小程序动态库](https://smartprogram.baidu.com/docs/develop/framework/dynamiclib_use/)
- [QQ小程序插件](https://q.qq.com/wiki/develop/miniprogram/frame/plugins/)
#### 引入插件代码包
#### 在uni-app中引入插件
使用插件之前开发者需要`manifest.json`中的各平台对应的字段内声明使用的插件,具体配置参照所用插件的开发文档
`manifest.json`中的各平台对应的字段内声明使用的插件,具体配置参照所用插件的开发文档
**代码示例**
......@@ -135,4 +144,3 @@
......@@ -13,7 +13,7 @@
|selectable|Boolean|true|富文本是否可以长按选中,可用于复制,粘贴等场景|百度小程序(仅真机支持,基础库 3.150.1 以下版本默认为 false)|
|image-menu-prevent|Boolean|false|阻止长按图片时弹起默认菜单(将该属性设置为image-menu-prevent或image-menu-prevent="true"),只在初始化时有效,不能动态变更;若不想阻止弹起默认菜单,则不需要设置此属性|百度小程序|
|preview|Boolean||富文本中的图片是否可点击预览。在不设置的情况下,若 rich-text 未监听点击事件,则默认开启。未显示设置 preview 时会进行点击默认预览判断,建议显示设置 preview|百度小程序|
|@itemclick|EventHandle||拦截点击事件(只支持 `a``img`标签),返回当前node信息 `event.detail={node}`|H5 (3.2.13+)、App-vue (3.2.13+)|
|@itemclick|EventHandle||拦截点击事件(只支持 `a``img`标签),返回当前node信息 `event.detail={node}`|H5 (3.2.13+)、App-Vue (3.2.13+)|
##### nodes
......
......@@ -6,6 +6,6 @@ Axurez资源正在整理和完善中。
<div style="width:260px;border:1px #eee solid; padding:15px;border-radius:5px;text-align: center;">
<img style="width:120px;height:120px;margin:30px auto;" src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9Ijg4cHgiIGhlaWdodD0iNzdweCIgdmlld0JveD0iMCAwIDg4IDc3IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCAzOS4xICgzMTcyMCkgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CiAgICA8dGl0bGU+U2tldGNoIFRlbXBsYXRlX2ljb248L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZGVmcz48L2RlZnM+CiAgICA8ZyBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0iU2tldGNoLVRlbXBsYXRlX2ljb24iPgogICAgICAgICAgICA8ZyBpZD0iR3JvdXAtMjUiPgogICAgICAgICAgICAgICAgPGcgaWQ9ImJyb3dzZXIiPgogICAgICAgICAgICAgICAgICAgIDxnIGlkPSJHcm91cCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC4wNDI3MzUsIDYuNzcyMjY5KSIgZmlsbD0iI0M5RTFGQiIgb3BhY2l0eT0iMC4yMzg4MDU5NyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0zLjIwMDg4NDc2LDI4LjUwNTczMzcgTDQ0LjE3MDEzOTEsMjguNTA1NzMzNyBDNDUuOTEwNTI2NSwyOC41MDU3MzM3IDQ3LjMyMTc1NzUsMjcuMTAyNjMxMiA0Ny4zMjE3NTc1LDI1LjM3MjI2ODIgTDQ3LjMyMTc1NzUsMC4zMDU2MDg3MjUgQzQ3LjMyMTc1NzUsMi4wMzU5NzE3MiA0NS45MTA1MjY1LDMuNDM5MDc0MjYgNDQuMTcwMTM5MSwzLjQzOTA3NDI2IEwzLjIwMDg4NDc2LDMuNDM5MDc0MjYgQzEuNDYwNDk3MzksMy40MzkwNzQyNiAwLjA0OTI2NjM1MDMsMi4wMzU5NzE3MiAwLjA0OTI2NjM1MDMsMC4zMDU2MDg3MjUgTDAuMDQ5MjY2MzUwMywyNS4zNzIyNjgyIEMwLjA0OTI2NjM1MDMsMjcuMTAyOTg2MSAxLjQ2MDE0MDM4LDI4LjUwNTczMzcgMy4yMDA4ODQ3NiwyOC41MDU3MzM3IEwzLjIwMDg4NDc2LDI4LjUwNTczMzcgWiIgaWQ9IlNoYXBlIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik01OS45MjcxNjAxLDI4LjUwNTczMzcgTDc4LjgzNjE1NjYsMjguNTA1NzMzNyBDODAuNTc2NTQ0LDI4LjUwNTczMzcgODEuOTg3Nzc1LDI3LjEwMjYzMTIgODEuOTg3Nzc1LDI1LjM3MjI2ODIgTDgxLjk4Nzc3NSwwLjMwNTYwODcyNSBDODEuOTg3Nzc1LDIuMDM1OTcxNzIgODAuNTc2NTQ0LDMuNDM5MDc0MjYgNzguODM2MTU2NiwzLjQzOTA3NDI2IEw1OS45MjcxNjAxLDMuNDM5MDc0MjYgQzU4LjE4Njc3MjgsMy40MzkwNzQyNiA1Ni43NzU1NDE3LDIuMDM1OTcxNzIgNTYuNzc1NTQxNywwLjMwNTYwODcyNSBMNTYuNzc1NTQxNywyNS4zNzIyNjgyIEM1Ni43NzU1NDE3LDI3LjEwMjk4NjEgNTguMTg2NzcyOCwyOC41MDU3MzM3IDU5LjkyNzE2MDEsMjguNTA1NzMzNyBMNTkuOTI3MTYwMSwyOC41MDU3MzM3IFoiIGlkPSJTaGFwZSI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMy4yNDM2MTkyOSwxMC4yMTE2OTg2IEw0NC4yMTI4NzM2LDEwLjIxMTY5ODYgQzQ1Ljk1MzI2MSwxMC4yMTE2OTg2IDQ3LjM2NDQ5Miw4LjgwODU5NjAzIDQ3LjM2NDQ5Miw3LjA3ODIzMzA0IEw0Ny4zNjQ0OTIsMy45NDQ3Njc1MSBDNDcuMzY0NDkyLDIuMjE0NDA0NTEgNDUuOTUzMjYxLDAuODExMzAxOTY5IDQ0LjIxMjg3MzYsMC44MTEzMDE5NjkgTDMuMjQzNjE5MjksMC44MTEzMDE5NjkgQzEuNTAzMjMxOTEsMC44MTEzMDE5NjkgMC4wOTIwMDA4NzY0LDIuMjE0NDA0NTEgMC4wOTIwMDA4NzY0LDMuOTQ0NzY3NTEgTDAuMDkyMDAwODc2NCw3LjA3ODIzMzA0IEMwLjA5MjAwMDg3NjQsOC44MDg1OTYwMyAxLjUwMjg3NDkxLDEwLjIxMTY5ODYgMy4yNDM2MTkyOSwxMC4yMTE2OTg2IEwzLjI0MzYxOTI5LDEwLjIxMTY5ODYgWiIgaWQ9IlNoYXBlIiBmaWxsPSIjRkZENkQyIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTU5Ljk2OTg5NDcsMTAuMjExNjk4NiBMNzguODc4ODkxMSwxMC4yMTE2OTg2IEM4MC42MTkyNzg1LDEwLjIxMTY5ODYgODIuMDMwNTA5Niw4LjgwODU5NjAzIDgyLjAzMDUwOTYsNy4wNzgyMzMwNCBMODIuMDMwNTA5NiwzLjk0NDc2NzUxIEM4Mi4wMzA1MDk2LDIuMjE0NDA0NTEgODAuNjE5Mjc4NSwwLjgxMTMwMTk2OSA3OC44Nzg4OTExLDAuODExMzAxOTY5IEw1OS45Njk4OTQ3LDAuODExMzAxOTY5IEM1OC4yMjk1MDczLDAuODExMzAxOTY5IDU2LjgxODI3NjMsMi4yMTQ0MDQ1MSA1Ni44MTgyNzYzLDMuOTQ0NzY3NTEgTDU2LjgxODI3NjMsNy4wNzgyMzMwNCBDNTYuODE4Mjc2Myw4LjgwODU5NjAzIDU4LjIyOTUwNzMsMTAuMjExNjk4NiA1OS45Njk4OTQ3LDEwLjIxMTY5ODYgTDU5Ljk2OTg5NDcsMTAuMjExNjk4NiBaIiBpZD0iU2hhcGUiIGZpbGw9IiMyMEEwRkYiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8ZyBpZD0iR3JvdXAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDYuMTExNzc4LCA0NC4zOTY1NzIpIiBmaWxsPSIjQzlFMUZCIiBvcGFjaXR5PSIwLjIzODgwNTk3Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTMuNjM5NDk2NTksMjguNDgxNTk3NCBDMy42Mzk0OTY1OSwzMC4yMTE5NjA0IDIuMTM2NTcxMzcsMzEuNjE1MDYyOSAwLjI4MzEwMzAxMywzMS42MTUwNjI5IEw2Mi41NjY3MDg4LDMxLjYxNTA2MjkgQzY0LjQyMDE3NzIsMzEuNjE1MDYyOSA2NS45MjMxMDI0LDMwLjIxMTk2MDQgNjUuOTIzMTAyNCwyOC40ODE1OTc0IEw2NS45MjMxMDI0LDMuNDE0OTM3OTIgQzY1LjkyMzEwMjQsMS42ODQ1NzQ5MiA2NC40MjAxNzcyLDAuMjgxNDcyMzggNjIuNTY2NzA4OCwwLjI4MTQ3MjM4IEwwLjI4MzEwMzAxMywwLjI4MTQ3MjM4IEMyLjEzNjU3MTM3LDAuMjgxNDcyMzggMy42Mzk0OTY1OSwxLjY4NDU3NDkyIDMuNjM5NDk2NTksMy40MTQ5Mzc5MiBMMy42Mzk0OTY1OSwyOC40ODE1OTc0IFoiIGlkPSJTaGFwZSI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMy4yNDM2MTkyOSw3Ni4wMTEyODAzIEw2LjM5NTIzNzcsNzYuMDExMjgwMyBDOC4xMzU2MjUwOCw3Ni4wMTEyODAzIDkuNTQ2ODU2MTEsNzQuNjA4MTc3OCA5LjU0Njg1NjExLDcyLjg3NzgxNDggTDkuNTQ2ODU2MTEsNDcuODExMTU1MyBDOS41NDY4NTYxMSw0Ni4yNjUwMjEgOC40MjAxMzA2Niw0NC45ODAxNzEyIDYuOTM4NjI2MjgsNDQuNzI0MTA1OSBDNi43NjIwOTg1MSw0NC42OTM1OTQ2IDYuNTgwNTMzNjgsNDQuNjc3Njg5OCA2LjM5NTIzNzcsNDQuNjc3Njg5OCBMMy4yNDM2MTkyOSw0NC42Nzc2ODk4IEMxLjUwMzIzMTkxLDQ0LjY3NzY4OTggMC4wOTIwMDA4NzY0LDQ2LjA4MDc5MjMgMC4wOTIwMDA4NzY0LDQ3LjgxMTE1NTMgTDAuMDkyMDAwODc2NCw3Mi44Nzc4MTQ4IEMwLjA5MjAwMDg3NjQsNzQuNjA4MTc3OCAxLjUwMjg3NDkxLDc2LjAxMTI4MDMgMy4yNDM2MTkyOSw3Ni4wMTEyODAzIEwzLjI0MzYxOTI5LDc2LjAxMTI4MDMgWiIgaWQ9IlNoYXBlIiBmaWxsPSIjMjBBMEZGIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgICAgICA8ZyBpZD0iZGlhbW9uZCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNTMuMDAwMDAwLCA0NS4wMDAwMDApIj4KICAgICAgICAgICAgICAgICAgICA8cG9seWdvbiBpZD0iU2hhcGUiIGZpbGw9IiNBRkM4RUIiIHBvaW50cz0iMjQuMTc1MzI2NCA4Ljg2MDY5Nzk1IDE3LjE4NTE4NTIgMjguODM1NzAyNSAzNC4zNzAzNzA0IDguODYwNjk3OTUiPjwvcG9seWdvbj4KICAgICAgICAgICAgICAgICAgICA8ZyBpZD0iR3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICA8cG9seWdvbiBpZD0iU2hhcGUiIGZpbGw9IiM4MEE4RTEiIHBvaW50cz0iNy4xMTExMDg4IDAuMDQ4MTg0MTc5NyAwIDguODYwNjk3OTUgMTAuMTk1MDQ0IDguODYwNjk3OTUiPjwvcG9seWdvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPHBvbHlnb24gaWQ9IlNoYXBlIiBmaWxsPSIjODBBOEUxIiBwb2ludHM9IjI0LjE3NTMyNjQgOC44NjA2OTc5NSAzNC4zNzAzNzA0IDguODYwNjk3OTUgMjcuMjU5MjYxNiAwLjA0ODE4NDE3OTciPjwvcG9seWdvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPHBvbHlnb24gaWQ9IlNoYXBlIiBmaWxsPSIjQUZDOEVBIiBwb2ludHM9IjI0LjE3NTMyNjQgOC44NjA2OTc5NSAxNy4xODUxODUyIDAuMDQ4MTg0MTc5NyAxMC4xOTUwNDQgOC44NjA2OTc5NSI+PC9wb2x5Z29uPgogICAgICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgICAgICA8cG9seWdvbiBpZD0iU2hhcGUiIGZpbGw9IiM2NDk2REMiIHBvaW50cz0iMTcuMTg1MTg1MiAwLjA0ODE4NDE3OTcgNy4xMTExMDg4IDAuMDQ4MTg0MTc5NyAxMC4xOTUwNDQgOC44NjA2OTc5NSI+PC9wb2x5Z29uPgogICAgICAgICAgICAgICAgICAgIDxwb2x5Z29uIGlkPSJTaGFwZSIgZmlsbD0iIzkzQjhFRSIgcG9pbnRzPSIyNy4yNTkyNjE2IDAuMDQ4MTg0MTc5NyAxNy4xODUxODUyIDAuMDQ4MTg0MTc5NyAyNC4xNzUzMjY0IDguODYwNjk3OTUiPjwvcG9seWdvbj4KICAgICAgICAgICAgICAgICAgICA8cG9seWdvbiBpZD0iU2hhcGUiIGZpbGw9IiM4MEE4RTEiIHBvaW50cz0iMTAuMTk1MDQ0IDguODYwNjk3OTUgMTcuMTg1MTg1MiAyOC44MzU3MDI1IDI0LjE3NTMyNjQgOC44NjA2OTc5NSI+PC9wb2x5Z29uPgogICAgICAgICAgICAgICAgICAgIDxwb2x5Z29uIGlkPSJTaGFwZSIgZmlsbD0iIzY0OTZEQyIgcG9pbnRzPSIwIDguODYwNjk3OTUgMTcuMTg1MTg1MiAyOC44MzU3MDI1IDEwLjE5NTA0NCA4Ljg2MDY5Nzk1Ij48L3BvbHlnb24+CiAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDwvZz4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg==">
<p style="font-size:13px;line-height:1.5;">在Sketch中快速调用常用组件,在提升设计效率的同时,保证统一的视觉风格</p>
<a href="https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/ef8f7f42-a0e2-42cd-b5a6-72accafe6c46.sketch" download="uni-ui.sketch" style="cursor: pointer;display:block;border-radius:5px;;border:1px #eee solid;background:#42b983;color:#fff;font-size:14px;padding:10px 25px;text-align: center;text-decoration: none;" target="_black">下载</a>
<a href="https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/ef8f7f42-a0e2-42cd-b5a6-72accafe6c46.sketch" download="uni-ui.sketch" style="cursor: pointer;display:block;border-radius:5px;;border:1px #eee solid;background:#42b983;color:#fff;font-size:14px;padding:10px 25px;text-align: center;text-decoration: none;" target="_blank">下载</a>
</div>
......@@ -73,7 +73,7 @@
```css
@font-face {
font-family: "iconfont";
src : url('./iconfont.ttf) format('truetype');
src: url('./iconfont.ttf') format('truetype');
}
.iconfont {
......
......@@ -28,6 +28,7 @@
|fixed|Boolean|false|是否固定顶部|
|statusBar|Boolean|false|是否包含状态栏|
|shadow|Boolean|false|导航栏下是否有阴影|
|border|Boolean|true|导航栏下是否有边框|
### NavBar Slots
......
......@@ -2,9 +2,9 @@
app端nvue专用组件。
`<waterfall>` 组件是提供瀑布流布局的核心组件。瀑布流,又称瀑布流式布局是比较流行的一种页面布局,视觉表现为参差不齐的多栏布局。随着页面滚动条向下滚动,这种布局还可以不断加载数据块并附加至当前尾部。
`<waterfall>` 组件是提供瀑布流布局的核心组件。瀑布流,又称瀑布流式布局是比较流行的一种页面布局,视觉表现为参差不齐的多栏布局。随着页面滚动条向下滚动,这种布局还可以不断加载数据块并附加至当前尾部。
在nvue中,使用普通view做瀑布流,无法实现重用和不可见渲染资源释放。使用<waterfall>组件,指定cell后,原生引擎会自动优化性能。
在nvue中,使用普通view做瀑布流,无法实现复用和不可见渲染资源释放。使用`<waterfall>`组件且指定`cell`后,原生引擎会自动优化性能。
```
<template>
......
......@@ -220,7 +220,8 @@
}
</script>
<!-- uni 的 SDK -->
<script type="text/javascript" src="https://js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.1.5.2.js"></script>
<!-- 需要把 uni.webview.1.5.2.js 下载到自己的服务器 -->
<script type="text/javascript" src="https://gitee.com/dcloud/uni-app/raw/master/dist/uni.webview.1.5.2.js"></script>
<script type="text/javascript">
// 待触发 `UniAppJSBridgeReady` 事件后,即可调用 uni 的 API。
document.addEventListener('UniAppJSBridgeReady', function() {
......@@ -397,7 +398,8 @@ uni.webView.navigateTo 示例,注意uni sdk放到body下面
<!-- built files will be auto injected -->
</body>
<!-- uni 的 SDK -->
<script type="text/javascript" src="https://js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.1.5.2.js"></script>
<!-- 需要把 uni.webview.1.5.2.js 下载到自己的服务器 -->
<script type="text/javascript" src="https://gitee.com/dcloud/uni-app/raw/master/dist/uni.webview.1.5.2.js"></script>
<script>
document.addEventListener('UniAppJSBridgeReady', function() {
uni.webView.getEnv(function(res) {
......
......@@ -33,7 +33,8 @@
├─main.js Vue初始化入口文件
├─App.vue 应用配置,用来配置App全局样式以及监听 <a href="/collocation/frame/lifecycle?id=应用生命周期">应用生命周期</a>
├─manifest.json 配置应用名称、appid、logo、版本等打包信息,<a href="/collocation/manifest">详见</a>
└─pages.json 配置页面路由、导航条、选项卡等页面类信息,<a href="/collocation/pages">详见</a>
├─pages.json 配置页面路由、导航条、选项卡等页面类信息,<a href="/collocation/pages">详见</a>
└─uni.scss 这里是uni-app内置的常用样式变量
</code>
</pre>
......
......@@ -727,7 +727,7 @@ font-weight {string}:字体粗细程度。默认值: ```normal```;
|line-through |定义穿过文本下的一条线 |
> 只支持 ```text``` 和 ```ricthext```
> 只支持 ```text``` 和 ```richtext```
>
> 不支持 ```text-decoration:overline```
......@@ -756,7 +756,7 @@ font-weight {string}:字体粗细程度。默认值: ```normal```;
|-- |-- |
|clip |修剪文本 |
|ellipsis |显示省略符号来代表被修剪的文本 |
> 只支持 ```text``` 和 ```ricthext```
> 只支持 ```text``` 和 ```richtext```
### lines
```lines {number}```: 正整数,指定最大文本行数,默认```lines```值为0,表示不限制最大行数```lines```。如果文本不够长,实际展示行数会小于指定行数。
......
......@@ -24,7 +24,17 @@ vue create -p dcloudio/uni-preset-vue my-project
vue create -p dcloudio/uni-preset-vue#alpha my-alpha-project
```
此时,会提示选择项目模板,初次体验建议选择 `hello uni-app` 项目模板,如下所示:
**使用Vue3/Vite版**
```shell
# 创建以 javascript 开发的工程
npx degit dcloudio/uni-preset-vue#vite my-vue3-project
# 创建以 typescript 开发的工程
npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project
```
此时,会提示选择项目模板(使用Vue3/Vite版不会提示,目前只支持创建默认模板),初次体验建议选择 `hello uni-app` 项目模板,如下所示:
<div>
<img src="https://img.cdn.aliyun.dcloud.net.cn/guide/uniapp/h5-cli-01.png" width="300">
......
......@@ -38,7 +38,7 @@ uni-app自带的模板有 Hello uni-app ,是官方的组件和API示例。还
<img src="https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-uni-app-doc/1ad34710-4f1a-11eb-8ff1-d5dcf8779628.png"/>
</div>
2. 真机运行:连接手机,开启USB调试,进入hello-uniapp项目,点击工具栏的运行 -> 真机运行 -> 选择运行的设备,即可在该设备里面体验uni-app。
2. 运行App到手机或模拟器:连接手机,开启USB调试,进入hello-uniapp项目,点击工具栏的运行 -> 真机运行 -> 选择运行的设备,即可在该设备里面体验uni-app。
<div align=center>
<img src="https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-uni-app-doc/3a1faaf0-4f1a-11eb-b680-7980c8a877b8.png"/>
</div>
......@@ -78,7 +78,7 @@ uni-app自带的模板有 Hello uni-app ,是官方的组件和API示例。还
<img src="https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-uni-app-doc/42de5370-4f1b-11eb-8ff1-d5dcf8779628.png"/>
</div>
7. 在360开发工具中导入:进入hello-uniapp项目,点击工具栏的运行 -> 运行到小程序模拟器 -> 360开发工具,即可在360开发工具里面体验uni-app。
7. 在360开发工具中导入:进入hello-uniapp项目,点击工具栏的运行 -> 运行到小程序模拟器 -> 360开发工具,即可在360开发工具里面体验uni-app。注意360工具只有windows版
<br/>
<div align=center>
<img src="https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-uni-app-doc/b9edff30-4f37-11eb-97b7-0dc4655d6e68.png"/>
......@@ -96,7 +96,7 @@ uni-app自带的模板有 Hello uni-app ,是官方的组件和API示例。还
<img src="https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-uni-app-doc/bc558950-4f37-11eb-bdc1-8bd33eb6adaa.png"/>
</div>
10. 在QQ小程序开发工具里运行:内容同上,不再重复。
10. 在QQ、快手、飞书等小程序开发工具里运行:内容同上,不再重复。
**Tips**
......@@ -105,6 +105,7 @@ uni-app自带的模板有 Hello uni-app ,是官方的组件和API示例。还
* 如果自动启动小程序开发工具失败,请手动启动小程序开发工具并将 HBuilderX 控制台提示的项目路径,打开项目。
运行的快捷键是`Ctrl+r`
HBuilderX 还提供了快捷运行菜单,可以按数字快速选择要运行的设备:
<div align=center>
<img src="https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-uni-app-doc/aef21b70-4f37-11eb-a16f-5b3e54966275.png"/>
......@@ -132,6 +133,10 @@ HBuilderX 还提供了快捷运行菜单,可以按数字快速选择要运行
虽然安心打包已经满足需求,但如仍然希望自己使用 xcode 或 Android studio 进行离线打包,则在 HBuilderX 发行菜单里找到本地打包菜单,生成离线打包资源,然后参考离线打包文档操作:[https://nativesupport.dcloud.net.cn/AppDocs/README](https://nativesupport.dcloud.net.cn/AppDocs/README)
App打包时,注意如何涉及三方sdk,需进行申请并在manifest.json里配置,否则相关功能无法使用。
iOS App打包需要向Apple申请证书。
### 发布为H5
......@@ -216,7 +221,7 @@ HBuilderX 还提供了快捷运行菜单,可以按数字快速选择要运行
3. 在华为开发者工具中,导入生成的华为快应用项目,测试项目代码运行正常后,点击”构建“打包正式版,在[华为快应用后台](https://developer.huawei.com/consumer/cn/quickApp)上传。
**发布为QQ小程序:**
**发布为QQ、快手、飞书小程序:**
内容同上,不再重复。
发布的快捷键是`Ctrl+u`。同样可拉下快速发布菜单并按数字键选择。
......
......@@ -10,16 +10,17 @@
* [云函数操作云数据库](uniCloud/cf-database.md)
* [DB Schema表结构](uniCloud/schema.md)
* [数据库索引](uniCloud/db-index.md)
* [前端操作数据库的API及JQL语法](uniCloud/clientdb.md)
* [前端操作数据库的API](uniCloud/clientdb.md)
* [unicloud-db前端组件](uniCloud/unicloud-db.md)
* [JQL数据库管理](uniCloud/jql-runner.md)
<!-- * [云函数内使用JQL语法](uniCloud/jql-cloud.md) -->
* [JQL语法](uniCloud/jql.md)
* [openDB](https://gitee.com/dcloud/opendb)
* [性能优化](uniCloud/db-performance.md)
* 云函数
* [开发云函数](uniCloud/cf-functions.md)
* [云函数公共模块](uniCloud/cf-common.md)
* [日志输出](uniCloud/cf-logger.md)
* [身份认证](uniCloud/cf-authentication.md)
* [定时触发](uniCloud/trigger.md)
* [云函数URL化](uniCloud/http.md)
* 云存储
......@@ -33,6 +34,7 @@
* [uni-starter](https://ext.dcloud.net.cn/plugin?id=5057)
* [uni-admin](uniCloud/admin.md)
* [uni-upgrade-center App升级中心](uniCloud/upgrade-center.md)
* [统一发布页uni-publish](uniCloud/uni-publish.md)
* [uni-cloud-router](uniCloud/uni-cloud-router.md)
* [unipay 统一支付](uniCloud/unipay.md)
* [发送短信](uniCloud/send-sms.md)
......@@ -42,7 +44,7 @@
* [uni-sec-check 内容安全](https://ext.dcloud.net.cn/plugin?id=5460)
* [uniCloud响应体规范](uniCloud/unicloud-response-format.md)
* [前端网页托管](uniCloud/hosting.md)
* Redis扩展
* Redis扩展
* [简介](uniCloud/redis-introduction.md)
* [费用说明](uniCloud/redis-buy.md)
* [开发文档](uniCloud/redis.md)
......
**本章内容仅针对腾讯云,阿里云暂不支持**
### uniCloud.auth()
获取`auth`的引用
```js
const auth = uniCloud.auth();
```
### auth.getUserInfo()
获取用户信息
```js
const {
uid, //云开发用户唯一ID
customUserId //自定义登录传入的用户Id
} = auth.getUserInfo()
```
### auth.getClientIP()
获取客户端IP地址,上传并运行时返回空
```js
const IP = auth.getClientIP()
```
### auth.createTicket(String customUserId, Object createTicketOptions)@createticket
此Api现在直接调用有问题,正在修复。可以先使用下面的方式调用
```js
const app = uniCloud.init({
spaceId: 'your-space-id',
credentials: require('./credentials.json')
})
const auth = app.auth();
let customUserId = '123456';
const ticket = auth.createTicket(customUserId, {
refresh: 10 * 60 * 1000 // 每十分钟刷新一次登录态, 默认为一小时
});
```
开发者可以使用云函数创建登录凭证,提供给客户端进行登录操作。[详见](uniCloud/authentication.md#自定义登录)
**createTicketOptions参数说明**
|参数名 |类型 |必填 |默认值 |说明 |平台差异说明 |
|:- |:- |:- |:- |:- |:- |
|refresh|Number |否 |3600000|token刷新间隔|- |
```js
let customUserId = '123456';
const ticket = auth.createTicket(customUserId, {
refresh: 10 * 60 * 1000 // 每十分钟刷新一次登录态, 默认为一小时
});
// 然后把 ticket 发送给客户端,由客户端调用auth.signInWithTicket()使用
```
......@@ -2067,6 +2067,31 @@ db.collection('scores').aggregate()
**注意:聚合操作实例仅用于查询,不可执行增删改操作。在聚合操作实例上只能使用聚合操作方法,不能使用where/orderBy等基础方法,where需改为match,orderBy应使用sort实现,细节请阅读下方聚合操作文档。**
云函数中使用时切勿复用aggregate实例,容易引发Bug。
以下两种写法均为错误示例:
```js
const db = uniCloud.database()
const collection = db.collection('test')
const aggregate = collection.aggregate() // 云函数实例复用时,此聚合实例也会复用,导致Bug
exports.main = async function(){
const res = await aggregate.match({a:1}).end()
return {res}
}
```
```js
const db = uniCloud.database()
const collection = db.collection('test')
exports.main = async function(){
const aggregate = collection.aggregate() // 此聚合实例分别在两个请求内使用,导致Bug
const res1 = await aggregate.match({a:1}).end()
const res2 = await aggregate.match({a:2}).end()
return {res1, res2}
}
```
### 聚合表达式
表达式可以是字段路径、常量、或聚合操作符。表达式可以嵌套表达式。
......
......@@ -70,7 +70,6 @@ exports.main = async (event, context) => {
|uniCloud.logger |云函数中打印日志到uniCloud日志记录系统(非HBuilderX控制台)[详情](uniCloud/cf-logger) |
|uniCloud.sendSms() |发送短信 [详见](uniCloud/send-sms.md) |
## 特殊属性
**注意:下面所有的“客户端”均是相对于云函数而言,如果你使用自己的服务器调用云函数此时客户端是指你的服务器**
......@@ -258,6 +257,29 @@ Tips:
云函数支持公共模块。多个云函数的共享部分,可以抽离为公共模块,然后被多个云函数引用。[详见](uniCloud/cf-common)
## 扩展库
uniCloud内置了一些扩展库,但是为了减小云函数体积,并不会对所有云函数默认开启。如需使用需要在云函数的package.json内的extensions字段下配置。
**目前支持的扩展库有以下几个**
<!-- - 用于在云函数内使用JQL语法操作数据库的JQL扩展库[uni-cloud-jql],参考:[JQL扩展库](uniCloud/jql-cloud.md) -->
- 用于在云函数内使用redis的redis扩展库[uni-cloud-redis],参考:[redis扩展库](uniCloud/redis.md)
以下是一个开启了Redis扩展库的云函数package.json示例,注意此文件不支持注释,下方示例中的注释仅为演示
```js
{
"name": "add-article",
"version": "1.0.0",
"description": "新增文章",
"main": "index.js",
"extensions": {
"uni-cloud-redis": {} // 配置为空对象即可,后续如有扩展参数会在此处配置
}
}
```
## 客户端调用云函数@clientcallfunction
前端代码(H5前端、App、小程序),不再执行uni.request联网,而是通过`uniCloud.callFunction`调用云函数,`callFunction`定义如下:
......@@ -443,19 +465,22 @@ package.json是一个标准json文件,不可带注释。下面是一个package
"description": "新增文章",
"main": "index.js",
"dependencies": {
// 云函数的依赖,包括公共模块及自行安装的npm依赖
},
"extensions": {
// 云函数使用的扩展库
},
"cloudfunction-config": {
"memorySize": 256,
"timeout": 5,
"triggers": [{
"name": "myTrigger",
"type": "timer",
"config": "0 0 2 1 * * *"
}],
"path": "",
"runtime": "Nodejs8"
}
"memorySize": 256,
"timeout": 5,
"triggers": [{
"name": "myTrigger",
"type": "timer",
"config": "0 0 2 1 * * *"
}],
"path": "",
"runtime": "Nodejs8"
}
}
```
......
此差异已折叠。
......@@ -93,30 +93,10 @@
}
```
组合索引具有以下特点:
组合索引**字段顺序决定组合索引效果**
1. **字段顺序决定组合索引效果**
例如定义组合索引分别为 **name, age****age, name** 是不同的。当组合索引为 **name, age** 时,其索引前缀为 **name**, 对字段 **name** 的查询可以命中 **name, age** 索引, 而对字段 **age** 的查询无法命中该索引,因为 **age** 不属于 **name, age** 的前缀(反之字段 **age** 能命中 **age, name** 索引)。
例如定义组合索引分别为 **name, age****age, name** 是不同的。当组合索引为 **name, age** 时,其索引前缀为 **name**, 对字段 **name** 的查询可以命中 **name, age** 索引, 而对字段 **age** 的查询无法命中该索引,因为 **age** 不属于 **name, age** 的前缀(反之字段 **age** 能命中 **age, name** 索引)。
2. **查询字段排序影响命中索引**
组合索引为 **age: 升序, score: 降序**,字段排序对索引命中效果如下:
| **age: 升序, score: 降序** | **age: 降序, score: 升序** | **age: 升序, score: 升序** | **age: 降序, score: 降序** | **score: 升序/降序, age: 升序/降序** |
| -------------------------- | -------------------------- | -------------------------- | -------------------------- | ------------------------------------ |
| 命中 | 命中 | 未命中 | 未命中 | 未命中 |
组合索引为 **age: 升序, score: 升序**,字段排序对索引命中效果如下:
| **age: 升序, score: 升序** | **age: 降序, score: 降序** | **age: 升序, score: 降序** | **age: 降序, score: 升序** | **score: 升序/降序, age: 升序/降序** |
| -------------------------- | -------------------------- | -------------------------- | -------------------------- | ------------------------------------ |
| 命中 | 命中 | 未命中 | 未命中 | 未命中 |
**说明**
- 未进行排序的字段设置正序倒序均可。
- 排序字段内存在索引不存在的情况下不会命中索引,例:组合索引为 **age: 升序, score: 升序**,使用`age、score、name`三个字段进行排序不会使用上述组合索引。
### 地理位置索引
......@@ -135,7 +115,7 @@
### TTL索引@ttl
ttl索引用于设置数据过期时间,并在数据过期后进行删除。
ttl索引用于设置数据过期时间,并在数据过期后进行删除。**仅阿里云支持**
配置方式如下:
......
......@@ -55,7 +55,13 @@
**关于证书内容与私钥**
申请证书时通常会有下载选项,下载到证书之后找到对应Nginx的证书(包含一个crt文件和一个key文件),以文本形式打开crt文件即可看到证书内容,同样的key文件对应着私钥。
申请证书时通常会有下载选项,下载到证书之后找到对应Nginx的证书(包含一个crt文件和一个key文件或者一个pem文件和一个key文件),以文本形式打开crt/pem文件即可看到证书内容,同样的key文件对应着私钥。其他情况请查阅证书颁发者文档。
例:
在腾讯云申请的ssl证书包含一个crt文件和一个key文件,crt的文本内容为证书内容,key文件的内容为私钥
在阿里云申请的ssl证书包含一个pem文件和一个key文件,pem的文本内容为证书内容,key文件的内容为私钥
### 通过 HTTP URL 方式访问云函数
......@@ -142,12 +148,12 @@ uni.request({
**注意**
- 阿里云目前请求与响应有如下限制
+ 请求Body大小限制,不能超过1M。
+ 响应Body大小限制,不能超过1M。
+ 请求Body大小限制,不能超过1MB
+ 响应Body大小限制,不能超过1MB
- 腾讯云目前请求与响应有如下限制
+ 请求Body大小限制,不能超过4M
+ 响应Body大小限制,不能超过6M。
+ 请求Body大小限制,不能超过6MB
+ 响应Body大小限制,不能超过6MB
>在云函数URL化的场景无法获取客户端平台信息,可以在调用依赖客户端平台的接口接口之前(推荐在云函数入口)通过修改context.PLATFORM手动传入客户端平台信息
......@@ -238,7 +244,7 @@ content-length: 13
`content-type`设置为`text/html`,即可在`body`中返回 HTML,会被浏览器自动解析:
**阿里云目前无法返回html并在浏览器中展示,只可以触发下载**
**阿里云默认域名无法返回html并在浏览器中展示,只可以触发下载。绑定自定义域名无此限制**
```js
exports.main = function() {
......@@ -323,7 +329,7 @@ content-length: 9897
如需重定向或返回4xx,5xx等自定义状态码等,可以使用如下方式
**注意:阿里云暂不支持在返回的header里面使用location**
**注意:阿里云默认域名不支持在返回的header里面使用location,绑定自定义域名能正常使用**
```js
exports.main = function() {
......
......@@ -6,11 +6,11 @@ HBuilderX 3.3.1之前JQL只能在clientDB及JQL数据库管理里面使用,此
关于JQL语法及其他注意事项请参考此文档:[JQL数据库操作](uniCloud/jql.md)
## 为云函数启用jql扩展能力@use-in-function
## 为云函数启用jql扩展@use-in-function
需要开发者手动在云函数的package.json内添加云函数的扩展能力。(如果云函数目录下没有package.json,可以通过在云函数目录下执行`npm init -y`来生成)
需要开发者手动在云函数的package.json内添加云函数的扩展。(如果云函数目录下没有package.json,可以通过在云函数目录下执行`npm init -y`来生成)
下面是一个开启了jql扩展能力的云函数的package.json示例,**注意不可有注释,以下文件内容中的注释仅为说明,如果拷贝此文件,切记去除注释**
下面是一个开启了jql扩展的云函数的package.json示例,**注意不可有注释,以下文件内容中的注释仅为说明,如果拷贝此文件,切记去除注释**
```js
{
......@@ -19,7 +19,7 @@ HBuilderX 3.3.1之前JQL只能在clientDB及JQL数据库管理里面使用,此
"description": "",
"main": "index.js",
"extensions": {
"uni-cloud-jql": {} // 配置为此云函数开启jql扩展能力,值为空对象留作后续追加参数,暂无内容
"uni-cloud-jql": {} // 配置为此云函数开启jql扩展,值为空对象留作后续追加参数,暂无内容
},
"author": ""
}
......
......@@ -17,4 +17,4 @@
- 此处代码运行不受DB Schema的权限控制,移植代码到实际业务中注意在schema中配好permission
- 不支持clientDB的action
- 数据库查询有最大返回条数限制,详见:[limit](https://uniapp.dcloud.net.cn/uniCloud/cf-database?id=limit)
- 详细JQL语法,请参考:[JQL](https://uniapp.dcloud.net.cn/uniCloud/clientdb?id=jsquery)
\ No newline at end of file
- 详细JQL语法,请参考:[JQL](uniCloud/jql.md)
\ No newline at end of file
......@@ -106,11 +106,11 @@ sql写法,对js工程师而言有学习成本,而且无法处理非关系型
## JQL的使用场景@scene
你可以在以下种场景使用JQL
你可以在以下种场景使用JQL
- 客户端clientDB,包括js内以及unicloud-db组件内,参考:[clientDB](uniCloud/clientdb.md)
- HBuilderX JQL数据库管理器,参考:[JQL数据库管理器](uniCloud/jql-runner.md)
- 启用了jql扩展的云函数,参考:[云函数内使用JQL](uniCloud/jql-cloud.md)
<!-- - 启用了jql扩展的云函数,参考:[云函数内使用JQL](uniCloud/jql-cloud.md) -->
### 不同场景的区别
......@@ -127,10 +127,10 @@ sql写法,对js工程师而言有学习成本,而且无法处理非关系型
- 完整的权限校验,执行操作的用户不可以操作自己权限之外的数据
- admin用户不可操作password类型的数据
**云函数JQL:**
<!-- **云函数JQL:**
- 同clientDB,但是password类型的数据可以配置权限,默认权限是false,可以被admin用户操作。
- 可以指定当前执行数据库操作的用户身份。
- 可以指定当前执行数据库操作的用户身份。 -->
## JQL的限制@limit
......@@ -287,7 +287,7 @@ db.collection('user').where({
如需自定义返回的err对象,可以在clientDB中挂一个[action云函数](uniCloud/database?id=action),在action云函数的`after`内用js修改返回结果,传入`after`内的result不带code和message。
## 查询数据
## 查询数据@query
### 查询数组字段@querywitharr
......@@ -947,7 +947,7 @@ db.collection('article,comment')
> 新增于`HBuilderX 3.2.6`
在此之前JQL联表查询只能直接使用虚拟表,而不能先对主表、副表过滤再生成虚拟表。由于生成虚拟表时需要需要整个主表和副表进行联表,在数据量大的情况下性能会很差。
在此之前JQL联表查询只能直接使用虚拟表,而不能先对主表、副表过滤再生成虚拟表。由于生成虚拟表时需要整个主表和副表进行联表,在数据量大的情况下性能会很差。
使用临时表进行联表查询,可以先对主表或者副表进行过滤,然后在处理后的临时表的基础上生成虚拟表。
......@@ -1474,7 +1474,7 @@ db.collection('order,book')
### 各种字段运算方法@db-operator
`HBuilderX 3.1.0`起,JQL支持在云端数据库对字段进行一定的操作运算之后再返回,详细可用的方法列表请参考:[数据库运算方法](uniCloud/clientdb.md?id=aggregate-operator)
`HBuilderX 3.1.0`起,JQL支持在云端数据库对字段进行一定的操作运算之后再返回,详细可用的方法列表请参考:[数据库运算方法](uniCloud/jql.md?id=aggregate-operator)
> 需要注意的是,为方便书写,JQL内将数据库运算方法的用法进行了简化(相对于云函数内使用数据库运算方法而言)。用法请参考上述链接
......@@ -1519,7 +1519,7 @@ const res = await db.collection('class')
**注意**
- 如果要访问数组的某一项请使用arrayElemAt操作符,形如:`arrayElemAt(arr,1)`
- 在进行权限校验时,会计算field内访问的所有字段计算权限。上面的例子中会使用表的read权限和grade、class字段的权限,来进行权限校验。
- 在进行权限校验时,会field内访问的所有字段计算权限。上面的例子中会使用表的read权限和grade、class字段的权限,来进行权限校验。
### 排序orderBy@order-by
......@@ -2643,7 +2643,7 @@ db.collection("user")
指定要删除的记录有2种方式:
#### 方式1 通过指定文档ID删除
### 通过指定文档ID删除
collection.doc(_id).remove()
......@@ -2653,7 +2653,7 @@ const db = uniCloud.database();
await db.collection("table1").doc("5f79fdb337d16d0001899566").remove()
```
#### 方式2 条件查找文档后删除
### 条件查找文档后删除
collection.where().remove()
......@@ -2681,7 +2681,7 @@ await db.collection("table1").where({
}).remove()
```
#### 回调的res响应参数
**响应结果**
| 字段 | 类型 | 必填 | 说明 |
| --------- | ------- | ---- | ------------------------ |
......@@ -2794,7 +2794,7 @@ let res = await collection.where({_id:'doc-id'})
}
```
#### 批量更新文档
### 批量更新文档
```js
const db = uniCloud.database();
......@@ -2804,11 +2804,11 @@ let res = await collection.where("name=='hey'").update({
})
```
#### 更新数组内指定下标的元素
### 更新数组内指定下标的元素
JQL暂不支持此用法
#### 更新数组内匹配条件的元素
### 更新数组内匹配条件的元素
JQL暂不支持此用法
......
......@@ -65,9 +65,8 @@ uniCloud提供包月、按量计费两种计费方式(仅腾讯云),具体
- 非免费包月套餐到期之后如果不进行续费会在一周后销毁
**自动降配注意事项:**
- 自动降配会在到期之后的24小时后开始执行
- 被设置自动降配的服务空间到期之后,会尝试自动降配,但并不能保证一定可以成功,如果你的资源超出了免费版的额度则无法降配
- 被设置自动降配的服务空间到期之后,会尝试自动降配,但并不能保证一定可以成功,如果你的资源超出了免费版的额度则无法降配。切勿过度依赖此行为
- 特别要注意的一点是:自动降配为免费版之后,配置的云函数固定出口IP将会失效
- 腾讯云资源用量统计有延迟,请密切关注自己的业务用量,企业用户推荐直接改用按量计费
......@@ -162,7 +161,6 @@ uniCloud提供包月、按量计费两种计费方式(仅腾讯云),具体
- 按量计费服务空间开通时会自动开通前端网页托管,如果按量付费服务空间拥有免费额度,会默认赠送一个月前端网站托管(容量1GB、流量5GB),一个月之后会正常按量收费。
- 按量计费服务空间删除有次数限制,每个月最多删除一次,每个账号一共可以删除4次,删除之前需要关闭前端网页托管服务并删除所有云端资源(包括云函数、数据库、云存储)
- 按量计费是延迟结算,可能存在余额超支的情况,故创建按量付费服务空间时,需支付一定的保证金,用以抵消超支结算的情况。如果您不再申请使用uniCloud服务,可以申请退还保证金(目前需要发送邮件到service@dcloud.io)。
- 目前使用腾讯云包月套餐会默认自动续费,如果包月套餐到期时uniCloud腾讯云账户余额够用则自动从余额中扣除一个月的费用,近期会提供关闭选项
**关于云函数1000并发的说明**
......
......@@ -92,7 +92,7 @@ HBuilderX 3.0之前版本目录结构如下:
**说明**
- 如果未进行实名认证,会跳转至实名认证页面进行实名认证,等待实名认证审核之后可以开通服务空间。若腾讯云实名认证提示身份证下已创建过多账户,则需要在腾讯云官网注销不用的账户。
- 第一次创建腾讯云服务空间时会为用户创建腾讯云账号并跳转到腾讯云实名界面,等待实名认证审核之后可以开通服务空间。若腾讯云实名认证提示身份证下已创建过多账户,则需要在腾讯云官网注销不用的账户。
- 创建服务空间可能需要几十秒的时间,可以在web控制台查看是否创建完成。
- 一个应用,可以在[dev.dcloud.net.cn](https://dev.dcloud.net.cn)设置协作者(选择应用->设置项目成员),实现多人共同使用一个云服务空间。(需 HBuilderX 2.5.9+)。协作者可以在HBuilderX和web控制台中操作被授权的服务空间,除了删除服务空间,其他功能均可正常操作。授权其他用户访问的详细步骤请参考:[授权其他用户访问服务空间](https://uniapp.dcloud.net.cn/uniCloud/faq?id=collaborator)
- 多个项目可以复用一个服务空间,比如一个应用的用户端和管理端,在HBuilderX里可以创建成2个项目,但2个项目的服务空间可以指向一个,或者干脆把其中一个项目的服务空间绑定到另一个项目上,[详见](https://ask.dcloud.net.cn/article/37949)
......
## 短信发送
## 发送短信
<!--
/// meta
......@@ -75,47 +75,6 @@ keyword: 短信,sms
1. 每日最多给10个手机号发送不超过100条短信;
2. 使用该模板也会正常收取费用,请保证账户有充足余额。
<!--
目前短信功能包括如下模版,暂不可扩展新模版,模版形式如下。参数data内的字段会填充到模版内容里。
|模版Id |模板内容 |
|:-: |:-: |
|`uniID_code` |【uniID】“${name}”验证码:${code},用于${action},${expMinute}分钟内有效,请勿泄露并尽快验证。 |
|`uni_verify_code` |【uni验证】“${name}”验证码:${code},用于${action},${expMinute}分钟内有效,请勿泄露并尽快验证。 |
|`uni_order_unpaid` |【uni订单通知】您在“${name}”的订单${orderNo}未支付,将在${minute}分钟后自动关闭,请及时完成订单|
|`uni_booking` |【uni预约通知】您已成功预订“${name}”提供的${service}。预约时间${dateTime}。注意事项:${notice}|
|`uni_order_shipped` |【uni订单通知】您在“${name}”的订单${orderNo}已发货,${expressCompany}单号${expressNo},请注意签收|
`uniID_code`模板为uni-ID业务专用。如使用uniCloud的uni-id账户服务,无需自行开发代码调用本API,直接用uni-id即可,内置了注册和忘记密码的短信验证码服务。[详见](https://uniapp.dcloud.io/uniCloud/uni-id)
`uni_verify_code`模板为开发者自定义使用,如未使用uni-id,则可以使用本模板发送短信验证码,也可以在支付等需要再次验证身份的场景中使用。
本地运行云函数时,需要`2.8.5+`版本的HBuilderX才可以使用`uni_order_unpaid``uni_booking``uni_order_shipped`三个模板,上传并运行不受HBuilderX版本影响。
每个短信模板的商用均必须在运营商备案。上述模板之所以带有uni前缀,是因为它们是DCloud已经在运营商备案过的模板,这些模板开发者可以直接使用。
开发者若需自定义短信模板(包括去掉前面的uni前缀),则需要人工处理,再次向运营商备案。如有相关需求的开发者,可以发送申请邮件到service@dcloud.io,说明账户、预计发送量和新模板格式。
模板中`${}`中的内容为自定义字段,在data中填写每个自定义字段后拼接成完整的短信内容。
**上述模版对应的data内参数限制如下**
所有参数中均不可包含`【``】`
|参数名 |类型 |长度限制 |说明 |
|:-: |:-: |:-: |:-: |
|name |String |长度最大15 |应用名称 |
|code |String |长度最大6 |验证码串,注意一般需要自行提供随机数并在数据库中存储以方便校验,只允许使用字母或数字 |
|action |String |长度最大6 |验证码用途 |
|expMinute |String |长度最大2 |验证码过期时间,单位分钟,即不超过99分钟。过期校验逻辑需自行开发 |
|orderNo |String |长度最大20 |订单号 |
|minute |String |长度最大2 |单位分钟,即不超过99分钟。 |
|service |String |长度最大10 |- |
|dateTime |String |长度最大18 |- |
|notice |String |长度最大20 |- |
|expressCompany |String |长度最大12 |- |
|expressNo |String |长度最大20 |- |
-->
**返回值**
......@@ -224,3 +183,4 @@ exports.main = async (event, context) => {
- Android手机在App端获取短信验证码,参考:[https://ask.dcloud.net.cn/article/676](https://ask.dcloud.net.cn/article/676)
- 短信内容超过70个字符时为长短信,需分条发送,每67个字按一条短信计算
- 如果本地运行提示`不支持的模板ID`,请更新到`2.9.9+`版本的HBuilderX
- 单个手机号码使用同一短信模板发送短信时,1分钟内只能发送1次,超过1次会被运营商判定为短信重发而被拦截导致短信发送失败
......@@ -158,12 +158,12 @@ const Controller = require("uni-cloud-router").Controller;
module.exports = class PostController extends Controller {
async create() {
const { ctx, service } = this;
// 校验参数
// 校验参数,注意:uni-cloud-router本身不包含validate方法,此方法需要由用户自行实现建议在中间件挂载
ctx.validate({
title: { type: "string" },
content: { type: "string" },
});
// 组装参数
// 组装参数,ctx.auth.uid是由用户自己的auth中间件挂载到ctx上的
const author = ctx.auth.uid;
const post = Object.assign(ctx.data, { author });
// 调用 Service 进行业务处理
......
......@@ -233,9 +233,9 @@ tokenExpiresThreshold用于指定token还有多长时间过期时自动刷新tok
- [保存token及其过期时间](uniCloud/uni-id?id=save-token)
- [删除token及其过期时间](uniCloud/uni-id?id=remove-token)
用户token为明文存储,可以在token内查看用户相关信息。uniCloud也提供了一个接口用于直接获取token内的用户信息,参考:[uniCloud.getUserInfo](uniCloud/client-sdk.md?id=client-getcurrentuserinfo)
用户token为明文存储,可以在token内查看用户相关信息。uniCloud也提供了一个接口用于直接获取token内的用户信息,参考:[uniCloud.getCurrentUserInfo](uniCloud/client-sdk.md?id=client-getcurrentuserinfo)
uniCloud.getUserInfo接口大致逻辑如下,需要注意的是某些小程序平台不支持atob,getUserInfo接口内已包含atob的polyfill
uniCloud.getCurrentUserInfo接口大致逻辑如下,需要注意的是某些小程序平台不支持atob,getCurrentUserInfo接口内已包含atob的polyfill
```js
const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiI2MWE1OTNiYTkxYTc1MDAwMDE2NmY3OGQiLCJyb2xlIjpbImFkbWluIl0sInBlcm1pc3Npb24iOltdLCJpYXQiOjE2MzgyNDMzNjUsImV4cCI6MTYzODI1MDU2NX0.MRHEvNYhj9yXjPK04rhZOdnitaxRdF2Ek9BbZjPJyDE'
......
# uni-publish 统一发布页
### 为什么需要uni-publish 统一发布页?
App/小程序/网站做好后,如何告知你的用户?
你需要开发App的下载页、小程序二维码的展示页面,这些内容最好汇总在统一入口,也就是发行平台。
自己从头开发这么一个发行平台,需要考虑的事情太多了:
- 响应式布局,兼容PC/Mobile各种尺寸
- 微信/微博浏览器判断不同逻辑,右上角提示通过浏览器打开
- PC上制作二维码,方便用户直接扫码下载
- 如果小程序有多个版本,微信、支付宝、百度、QQ、快应用,那搞起来。。。
别急,有了`uni-publish 统一发布页`,一切迎刃而解,10分钟内搞定所有。
### 概述
`uni-publish 统一发布页`分为管理端和用户端两个插件:
- 管理端:作为`uni-admin`的插件,通过表单的形式,在线录入App安装包下载地址、上传小程序二维码;插件地址为:[https://ext.dcloud.net.cn/plugin?id=6690](https://ext.dcloud.net.cn/plugin?id=6690)
- 用户端:将App下载/小程序二维码展示/H5链接等信息统一展示,智能判断运行环境,给出引导(如微信浏览器下,右上角提示通过浏览器打开),插件地址为:[https://ext.dcloud.net.cn/plugin?id=6860](https://ext.dcloud.net.cn/plugin?id=6860)
`uni-publish 统一发布页`具有如下特征:
- 基于 `uni-app` & `uniCloud` 实现
- 数据库设计遵循 [opendb 规范](https://gitee.com/dcloud/opendb)
- 管理端遵循 [uni-admin 插件规范](/uniCloud/admin),可直接导入 `Admin` 项目中
### 使用
统一发布门户分为两个部分:`uni-publish 统一发布页 - 管理端``uni-publish 统一发布页 - 用户端`
> 前台展示页面需要使用前端托管或部署到服务器
#### uni-publish 统一发布页 - 管理端
负责应用发布信息的管理。
<div align="left">
<img src="https://vkceyugu.cdn.bspapp.com/VKCEYUGU-8ed92fab-502d-4290-af3c-1d65c4dbfc4d/31110f50-1b09-4a50-9d43-7f7436d96c1d.png" alt="统一发布门户管理" width="800"></img>
</div>
提供了如下功能:
- 云储存安装包免费 CDN 加速,使安装包下载的更快、更稳定
- 应用发布,填写 App 发布信息,可选发布与暂存
- 应用发布管理,包括对 更新标题,版本内容,App 下载信息,小程序上架信息,H5 等灵活修改,实时线上更新
-`升级中心` 的数据联动
在插件市场安装,根据 readme 部署即可。[插件地址](https://ext.dcloud.net.cn/plugin?id=6690)
#### uni-publish 统一发布页 - 用户端
负责对所填写应用发布信息的展示与正确引导下载方式。
<div align="left" style="display:flex;align-items:center;">
<img src="https://vkceyugu.cdn.bspapp.com/VKCEYUGU-8ed92fab-502d-4290-af3c-1d65c4dbfc4d/14b02d74-57ab-48eb-9933-8d40037f5397.png" height="400"></img>
<img style="margin-left:20px;" src="https://vkceyugu.cdn.bspapp.com/VKCEYUGU-8ed92fab-502d-4290-af3c-1d65c4dbfc4d/e3b2171c-baf7-4be0-a2f3-fedd4f421e4c.png" height="400"></img>
<img style="margin-left:20px;" src="https://vkceyugu.cdn.bspapp.com/VKCEYUGU-8ed92fab-502d-4290-af3c-1d65c4dbfc4d/53e49880-d751-4510-9d92-7656069e01de.png" height="400"></img>
<img style="margin-left:20px;" src="https://vkceyugu.cdn.bspapp.com/VKCEYUGU-8ed92fab-502d-4290-af3c-1d65c4dbfc4d/f4b41d5f-861b-4bef-b670-9a2597643e3c.jpg" height="400"></img>
</div>
提供了如下功能:
- 基于 `uni-publish 统一发布页 - 管理端` 填写数据,实时请求展示 App 上线详情信息
- 自由组合展示顺序
- 自动判断浏览器环境进行提示
- 实时生成当前页面、应用下载二维码,方便手机扫码访问、下载
- 多版本灵活展示,多平台适配
> 注:https://m3w.cn/uniapp 将会在三个月之后关闭。
在插件市场安装,根据 readme 部署即可。[插件地址](https://ext.dcloud.net.cn/plugin?id=6691)
......@@ -56,7 +56,7 @@ const unipay = require('@dcloudio/unipay')
| subAppId| String | 否 | - | 子商户appId |
| subMchId| String | 否 | - | 子商户号 |
| key | String | 是 | - | 支付商户 key (API密钥) |
| pfx | String | Buffer| 使用退款功能必填 | 微信支付商户 API 证书,主要用于退款 |
| pfx | String&#124;Buffer| 使用退款功能必填|- | 微信支付商户 API 证书,主要用于退款 |
| timeout | Number | 否 | 5000 | 请求超时时间,单位:毫秒 |
| signType | String | 否 | MD5 | 签名类型 |
| sandbox | Boolean | 否 | false | 是否启用沙箱环境 |
......@@ -67,7 +67,7 @@ const unipayIns = unipay.initWeixin({
appId: 'your appId',
mchId: 'your mchId',
key: 'you parterner key',
pfx: fs.readFileSync('/path/to/your/pfxfile'), // p12文件路径,使用微信退款时需要,需要注意的是阿里云目前不支持以相对路径读取文件,请使用绝对路径的形式
pfx: fs.readFileSync('/path/to/your/pfxfile'), // 建议以p12文件绝对路径进行读取,使用微信退款时需要
})
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册