提交 bdb94e52 编写于 作者: W wanganxp

更新uni-id-summary链接、opendb链接、数据库入门教程及不少文档措辞完善

上级 a4da504b
......@@ -124,10 +124,10 @@ serverless不是传统云,它不需要开发者选择CPU和内存配置,也
而有了uniCloud,这些门槛全都降了下去:
1. uniCloud采用js编写后端服务代码,无需单独学习php或java,甚至也无需提前掌握nodejs。看下uniCloud的api文档即可。
2. uniCloud基于serverless,开发者无需了解linux、nginx,无需熟悉负载均衡、大并发处理,不用关心系统补丁和DDoS攻击,只需要用js写好云端业务代码,上传到uniCloud即可。
3. uniCloud推出了[opendb](https://gitee.com/dcloud/opendb),包含了大量的开源数据库模板,常见数据表无需自己设计。通过opendb模板,开发者可以快速掌握数据库设计。
3. uniCloud推出了[opendb](opendb.md),包含了大量的开源数据库模板,常见数据表无需自己设计。通过opendb模板,开发者可以快速掌握数据库设计。
4. SQL在过去也需要单独学习,尤其是复杂的联表查询、Tree查询,掌握很不容易。uniCloud推出了JQL(Javascript Query Language),会js即可掌握数据库查询,更对联表查询、Tree查询提供了非常简便的操作封装。
5. uniCloud提供了[uni-id](https://uniapp.dcloud.net.cn/uniCloud/uni-id),无需自己开发账户体系,登录、注册、修改密码、角色权限体系、token管理一应俱全。
6. uniCloud在[DB Schema](https://uniapp.dcloud.net.cn/uniCloud/schema)中提供了与[uni-id](https://uniapp.dcloud.net.cn/uniCloud/uni-id)的角色权限体系配套的数据权限控制方案。这套方案让初学者也不会在权限控制中犯错。
5. uniCloud提供了[uni-id](uni-id-summary.md),无需自己开发账户体系,登录、注册、修改密码、角色权限体系、token管理一应俱全。
6. uniCloud在[DB Schema](schema.md)中提供了与[uni-id](uni-id-summary.md)的角色权限体系配套的数据权限控制方案。这套方案让初学者也不会在权限控制中犯错。
在一目了然的权限配置清单中可以轻松发现漏做的事情,比以往在大坨php代码中分析是否存在权限漏洞要简单的多。
这套方案还能让多人协作、或项目二次开发变的更容易,因为规范的存在,新人可以轻易读懂老代码的权限体系逻辑。
......@@ -165,8 +165,8 @@ uni云端一体生态的内容太多,让我们抽丝剥茧、归纳分类,
开发效率提升,分7个层次:
1. 提供众多现成轮子,不用自己写代码
2. 如果没有现成轮子,那么用[schema2code](https://uniapp.dcloud.net.cn/uniCloud/schema?id=autocode)代码生成工具,生成数据库的增删改查页面(是直接生成页面,不是生成接口)
3. 如果schema2code搞不定,需要手写代码,那么使用[clientDB](https://uniapp.dcloud.net.cn/uniCloud/clientdb),将节省80%的服务端开发工作
2. 如果没有现成轮子,那么用[schema2code](schema2code.md)代码生成工具,生成数据库的增删改查页面(是直接生成页面,不是生成接口)
3. 如果schema2code搞不定,需要手写代码,那么使用[clientDB](clientdb.md),将节省80%的服务端开发工作
4. 如果仍然需要写云端代码,那么云对象让你的开发更简单
5. HBuilderX在云端协同中提供工具助力
6. 端和云的语言统一,提高了沟通效率、招聘效率
......@@ -189,14 +189,14 @@ uni云端一体生态的内容太多,让我们抽丝剥茧、归纳分类,
**1. 官方维护的插件**
- uni-id:不用再开发用户系统。用户注册、登录(含社交登录、短信验证码登录、App一键登录)、修改或重置密码、token管理、图形验证码、RBAC权限角色系统...所有与用户相关的,不管前端还是云端,代码都是现成的。[详见](/uniCloud/uni-id-summary)
- uni-pay:不管微信还是支付宝,不管App、微信小程序、还是支付宝小程序,不管前端还是服务端,一切都现成的,拿来即用。[详见](/uniCloud/unipay)
- uni-pay:不管微信还是支付宝,不管App、微信小程序、还是支付宝小程序,不管前端还是服务端,一切都现成的,拿来即用。[详见](unipay.md)
- uni-starter:云端一体应用快速开发基本项目模版,实现快速搭建一款应用。它集成了很多通用的功能,比如登录注册、头像、设置、拦截器、banner...[详见](https://ext.dcloud.net.cn/plugin?id=5057)
- uni-admin:全端可用的admin后台。自带用户管理、权限管理、角色管理、菜单管理、业务图表统计。更有众多admin插件,比如cms插件、banner管理插件、App升级管理插件...[详见](/uniCloud/admin)
- uni-admin:全端可用的admin后台。自带用户管理、权限管理、角色管理、菜单管理、业务图表统计。更有众多admin插件,比如cms插件、push、banner管理插件、App升级管理插件...[详见](admin.md)
- uni-search:云端一体搜索。搜索页面、输入联想、搜索历史记录、热搜词分析提取...一应俱全。[详见](https://ext.dcloud.net.cn/plugin?id=3851)
- uni-file-picker:前端直传uniCloud存储组件。[详见](https://ext.dcloud.net.cn/plugin?id=4079)
- uni-captcha:云端一体图形验证码组件。[详见](https://ext.dcloud.net.cn/plugin?id=4048)
- uni-sec-check:免费的内容安全审查,防止用户提交违法的文字或图片。[详见](https://ext.dcloud.net.cn/plugin?id=5460)
- uni-upgrade-center:App升级中心。支持整包升级、wgt热更新;支持直接下载安装包或跳转应用商店。[详见](uniCloud/upgrade-center.md)
- uni-upgrade-center:App升级中心。支持整包升级、wgt热更新;支持直接下载安装包或跳转应用商店。[详见](upgrade-center.md)
**2. 社区的优秀插件**
......@@ -207,8 +207,6 @@ uni云端一体生态的内容太多,让我们抽丝剥茧、归纳分类,
- IM
- 日志管理
- 敏感词过滤
- push
- 图表统计
**3. 项目模板**
......@@ -226,43 +224,43 @@ uni云端一体生态的内容太多,让我们抽丝剥茧、归纳分类,
在这里,我们还必须提到2个新概念:`uni_module``datacom`
- uni_module:云端一体组件最佳的承载方式。传统的npm无法处理云端一体的需求,把前端和云端的代码,一起打包到一个uni_module中,整体传播与发布,对云端一体组件的生态有重大的帮助。[详见](https://uniapp.dcloud.net.cn/uni_modules)
- uni_module:云端一体组件最佳的承载方式。传统的npm无法处理云端一体的需求,把前端和云端的代码,一起打包到一个`uni_module`中,整体传播与发布,对云端一体组件的生态有重大的帮助。[详见](https://uniapp.dcloud.net.cn/uni_modules)
- datacom:datacom是一种在前端绑定后端数据源的组件。[详见](https://uniapp.dcloud.net.cn/component/datacom)
优良的模块化方案让生态越发繁荣。
#### 第二层提效:schema2code自动生成代码
如果在第一层提效中,找不到现成的轮子,需要自己写代码时。那么首先要做的,是使用[schema2code](https://uniapp.dcloud.net.cn/uniCloud/schema?id=autocode)这个神器,自动生成代码。
如果在第一层提效中,找不到现成的轮子,需要自己写代码时。那么首先要做的,是使用[schema2code](schema2code.md)这个神器,自动生成代码。
uniCloud云数据的schema,是一项重要的创新。
为数据表编写schema,可以实现非常多功能:数据结构定义、权限管理、数据值域管理,以及非常神奇的功能 -- 《[schema2code](https://uniapp.dcloud.net.cn/uniCloud/schema?id=autocode)
为数据表编写schema,可以实现非常多功能:数据结构定义、权限管理、数据值域管理,以及非常神奇的功能 -- 《[schema2code](schema2code.md)
在传统开发中,有了数据库,可以生成crud后台接口。然后前端再写代码调用接口。
但在uni云端一体生态中,有了数据库的schema,可以直接生成云端一体的页面。而不仅仅是只生成接口。
[schema2code](https://uniapp.dcloud.net.cn/uniCloud/schema?id=autocode),可以生成手机端的列表、详情或增删改页面,也可以生成admin管理端的所有数据管理功能的页面。
[schema2code](schema2code.md),可以生成手机端的列表、详情或增删改页面,也可以生成admin管理端的所有数据管理功能的页面。
如下是[schema2code](https://uniapp.dcloud.net.cn/uniCloud/schema?id=autocode)的操作演示视频:
如下是[schema2code](schema2code.md)的操作演示视频:
<video style="width:50vw;height:28vw;" id="video" preload="none" controls="controls"
poster="https://vkceyugu.cdn.bspapp.com/VKCEYUGU-b537e2ca-0f4e-4ff0-a097-48fdeafb9873/bfcc37f1-389f-40e9-a538-bf6d53ab0990.mp4?x-oss-process=video/snapshot,t_1000,f_jpg" src="https://vkceyugu.cdn.bspapp.com/VKCEYUGU-b537e2ca-0f4e-4ff0-a097-48fdeafb9873/bfcc37f1-389f-40e9-a538-bf6d53ab0990.mp4"></video>
可以实战体验这个[云端一体通讯录](https://ext.dcloud.net.cn/plugin?id=2574)的项目,几乎没有单独写代码。设计好通讯录的表schema,用[schema2code](https://uniapp.dcloud.net.cn/uniCloud/schema?id=autocode)即可生成这个项目。
可以实战体验这个[云端一体通讯录](https://ext.dcloud.net.cn/plugin?id=2574)的项目,几乎没有单独写代码。设计好通讯录的表schema,用[schema2code](schema2code.md)即可生成这个项目。
前述提到的返乡人员管理项目,之所以只花费了半小时就可以做好,也是[schema2code](https://uniapp.dcloud.net.cn/uniCloud/schema?id=autocode)的功劳。
前述提到的返乡人员管理项目,之所以只花费了半小时就可以做好,也是[schema2code](schema2code.md)的功劳。
数据的权限管理也很简单,在schema中可以快速定义指定的数据记录或字段,只能由什么样角色或权限的人来操作。
数据入库的值域校验就更简单了。传统开发中,一个手机号的校验,需要在前端页面写一遍,服务器入库前再检查一遍,很多余。既然云端协同了,自然会优化掉这个问题。
现在只需在DB Schema中定义好手机号这个字段的可选值域,比如一个正则,那么[schema2code](https://uniapp.dcloud.net.cn/uniCloud/schema?id=autocode)将自动生成前端表单,且遵循schema的定义,只接受相同正则。
现在只需在DB Schema中定义好手机号这个字段的可选值域,比如一个正则,那么[schema2code](schema2code.md)将自动生成前端表单,且遵循schema的定义,只接受相同正则。
这样不但提高了开发效率,还可以避免传统开发中各种漏洞,保持严谨和一致性。
[schema2code](https://uniapp.dcloud.net.cn/uniCloud/schema?id=autocode)生成的代码清晰易读,易于二次开发。这比低代码平台更有效率、且完全开放开源,随意扩展。
[schema2code](schema2code.md)生成的代码清晰易读,易于二次开发。这比低代码平台更有效率、且完全开放开源,随意扩展。
#### 第三层提效:clientDB,让服务器代码减少80%
......@@ -289,10 +287,10 @@ uni-app提供了`<unicloud-db>`组件(代码块触发键是udb),在前端
是的,仅需5行代码,就可以完成过去前后端合计得写几十行代码才能完成的事情,代码量大幅减少到原来的十分之一。
无需担心前端直接访问数据库会造成安全隐患,上一节提过了DB Schema,在云端的schema中可以定义什么角色可以操作数据库。[详见](https://uniapp.dcloud.net.cn/uniCloud/schema?id=permission)
无需担心前端直接访问数据库会造成安全隐患,上一节提过了DB Schema,在云端的schema中可以定义什么角色可以操作数据库。[详见](schema.md#permission)
clientDB技术,有前端的[JS API](https://uniapp.dcloud.net.cn/uniCloud/clientdb)[前端组件](https://uniapp.dcloud.net.cn/uniCloud/unicloud-db),为了进一步提高开发效率,clientDB还提供了几大利器:
[JQL](https://uniapp.dcloud.net.cn/uniCloud/clientdb?id=jsquery)是一种基于js的数据库操作语言,它改进了SQL语言的诸多不便之处。
clientDB技术,有前端的[JS API](clientdb.md)[前端组件](unicloud-db.md),为了进一步提高开发效率,clientDB还提供了几大利器:
[JQL](jql.md)是一种基于js的数据库操作语言,它改进了SQL语言的诸多不便之处。
- 在传统mysql或MongoDB中,联表查询的写法非常麻烦,tree查询mysql根本没有,需要oracle等专业数据库。但在uniCloud中,只需在数据库的schema中定义两个表的字段之间的关系,比如是引用关系(foreignKey)、还是父子关系(parentKey),前端就可以直接查询,轻松完成[联表查询](https://uniapp.dcloud.net.cn/uniCloud/clientdb?id=lookup)[tree查询](https://uniapp.dcloud.net.cn/uniCloud/clientdb?id=gettree)
- SQL语言的运算方法非常少,而JQL则提供了大量的运算方法,比如日期运算dayOfMonth()、字符串操作方法substr()、数字运算方法add()...可以对数据库字段的值直接进行运算和筛选。比如对数据库2个字段进行加权求和然后排序,这传统的SQL语句可搞不定了
......@@ -300,9 +298,9 @@ clientDB技术,有前端的[JS API](https://uniapp.dcloud.net.cn/uniCloud/clie
#### 第四层提效:云对象,改变前后端协同
如果clientDB仍然不能满足需求,必须编写云端代码,那么[云对象](uniCloud/cloud-obj.md)的出现,彻底改变了后端开发json接口和前端联调的低效局面。
如果clientDB仍然不能满足需求,必须编写云端代码,那么[云对象](cloud-obj.md)的出现,彻底改变了后端开发json接口和前端联调的低效局面。
[云对象](uniCloud/cloud-obj.md)把云端的代码变成对象方式,让前端js直接import这个对象,然后使用这个对象的方法,就像使用前端的js对象一样顺畅。
[云对象](cloud-obj.md)把云端的代码变成对象方式,让前端js直接import这个对象,然后使用这个对象的方法,就像使用前端的js对象一样顺畅。
云端新加一个`todo`云对象,写一个add方法,代码如下:
```js
......@@ -381,5 +379,4 @@ js和其他服务器语言,比如php或java,在过去需要Mock来翻译,
uniCloud是开发界的革命。在HBuilderX、uni-app、uniCloud三位一体的协同下、创新的功能设计下、丰富的生态和轮子支持下,开发者的开发效率,超过传统开发10倍以上。
> 目前uniCloud已发展2年多,活跃服务空间数万,云函数日请求数量过亿。请放心使用。
......@@ -22,6 +22,7 @@
* [unicloud-db前端组件](uniCloud/unicloud-db.md)
* [云函数通过JQL操作数据库](uniCloud/jql-cloud.md)
* [JQL调试器](uniCloud/jql-runner.md)
* [schema2code自动生成代码](schema2code.md)
* [性能优化](uniCloud/db-performance.md)
* [缓存JQL查询到redis](uniCloud/jql-cache-redis.md)
* [云函数通过传统方式操作数据库](uniCloud/cf-database.md)
......
......@@ -8,7 +8,7 @@
在微信小程序云的开发中,自定义登录还可以用于前端操作数据库。
但因为腾讯云提供的这套方案不够灵活和完善,uniCloud单独做了[uni-id](/uniCloud/uni-id)用于完善的账户体系,单独做了[clientDB](/uniCloud/clientdb),用于完善快捷的前端操作数据库。
但因为腾讯云提供的这套方案不够灵活和完善,uniCloud单独做了[uni-id](uni-id-summary.md)用于完善的账户体系,单独做了[clientDB](clientdb.md),用于完善快捷的前端操作数据库。
所以目前腾讯云的自定义登录功能,在uniCloud中的价值只剩下前端删除云存储。DCloud不建议开发者这么用,前端直传云存储不需要腾讯云自定义登录,而删除云存储,还是应该在云端进行。
......
......@@ -139,15 +139,13 @@ async function sum () { //注意方法或生命周期需使用async异步方式
}
```
由于篇幅较长,学习云对象需另见文档[云对象](/uniCloud/cloud-obj)
由于篇幅较长,学习云对象需另见文档[云对象](cloud-obj.md)
### 普通云函数callFunction方式
- 普通云函数适用的情况:
云函数是uniCloud的基础,它什么问题都可以解决,但在clientDB和云对象适用的场景中,使用普通云函数反而低效。
clientDB和云对象不能解决的包括:需要云函数URL化与非uni-app系统通信、云端定时运行云函数。
在HBuilderX 3.5.2之前,需要URL化和定时运行时,只能使用普通云函数;在HBuilderX 3.5.2+,云对象也支持了URL化和定时运行,此时推荐使用云对象替代云函数。
**直观体验代码示例**
......@@ -194,9 +192,9 @@ exports.main = async (event, context) => {
-->
### 云函数URL化方式
云函数URL化,可以让云函数生成一个HTTP URL。在创建了普通云函数后,可以在Web控制台进行URL化配置。它本质上属于普通云函数的一种调用方式。
可以让云函数/云对象生成一个HTTP URL。可以在Web控制台进行URL化配置。它本质上属于云函数的一种调用方式。
由于篇幅较长,需另见文档[云函数URL化](/uniCloud/http)
由于篇幅较长,需另见文档[云函数URL化](http.md)
### uniCloud响应体规范@resformat
......
......@@ -9,14 +9,14 @@ uniCloud分为客户端和云端两部分,有些接口名称相同,参数也
|API |描述 |
|-- |-- |
|uniCloud.importObject() |获取云对象引用以调用云对象接口 [详情](uniCloud/cloud-obj.md) |
|uniCloud.callFunction() |客户端调用云函数 [详情](uniCloud/cf-functions.md?id=clientcallfunction) |
|uniCloud.database() |客户端访问云数据库,获取云数据库对象引用 [详情](uniCloud/clientdb.md) |
|uniCloud.uploadFile() |客户端直接上传文件到云存储 [详情](uniCloud/storage.md?id=uploadfile) |
|uniCloud.getTempFileURL() |客户端获取云存储文件的临时路径 [详情](uniCloud/storage.md?id=gettempfileurl) |
|uniCloud.chooseAndUploadFile() |客户端选择文件并上传 [详情](uniCloud/storage.md?id=chooseanduploadfile) |
|uniCloud.importObject() |获取云对象引用以调用云对象接口 [详情](cloud-obj.md) |
|uniCloud.callFunction() |客户端调用云函数 [详情](cf-functions.md#clientcallfunction) |
|uniCloud.database() |客户端访问云数据库,获取云数据库对象引用 [详情](clientdb.md) |
|uniCloud.uploadFile() |客户端直接上传文件到云存储 [详情](storage.md#uploadfile) |
|uniCloud.getTempFileURL() |客户端获取云存储文件的临时路径 [详情](storage.md#gettempfileurl) |
|uniCloud.chooseAndUploadFile() |客户端选择文件并上传 [详情](storage.md#chooseanduploadfile) |
|uniCloud.getCurrentUserInfo() |获取当前用户信息 [详情](#client-getcurrentuserinfo) |
|uniCloud.init() |同时使用多个服务空间时初始化额外服务空间 [详情](uniCloud/init.md) |
|uniCloud.init() |同时使用多个服务空间时初始化额外服务空间 [详情](init.md) |
|uniCloud.addInterceptor() |新增拦截器 [详情](#add-interceptor) |
|uniCloud.removeInterceptor() |移除拦截器 [详情](#remove-interceptor) |
|uniCloud.onResponse() |监听服务端(云函数、云对象、clientDB)响应 [详情](#on-response) |
......@@ -36,7 +36,7 @@ uniCloud分为客户端和云端两部分,有些接口名称相同,参数也
- 此接口不会发送网络请求,**此接口仅仅是客户端接口,不校验token的合法性以及是否过期**
- 需要搭配uni-id使用并要求客户端必须将token存储在storage内的`uni_id_token`
- 如需获取role、permission需要将角色权限缓存在token内,此功能自uni-id 3.0.0其默认开启,参考:[缓存角色权限](uniCloud/uni-id.md?id=cache-permission-in-token)
- 如需获取role、permission需要将角色权限缓存在token内,此功能自uni-id 3.0.0 或 uni-id-common中默认开启
用法:`uniCloud.getCurrentUserInfo()`
......@@ -263,7 +263,7 @@ uniCloud.offResponse(logResponse)
> 新增于HBuilderX 3.5.0
用于监听客户端需要登录事件,此接口需要搭配uniIdRouter使用,参考:[uniIdRouter](uniCloud/uni-id.md?id=uni-id-router)
用于监听客户端需要登录事件,此接口需要搭配uniIdRouter使用,参考:[uniIdRouter](uni-id-summary.md#uni-id-router)
代码示例:
......
......@@ -148,7 +148,6 @@ _注:以上例子仅用于方便初学者理解。实际开发中对于简单
4. 客户端调用时在ide里有完善的代码提示,方法参数均可提示。(传输json可没法在ide里提示)
5. 默认支持[uniCloud响应体规范](uniCloud/cf-functions.md?id=resformat),方便错误拦截和统一处理
注:目前云对象还不支持URL化和定时触发,未来会补充
## 快速上手
......@@ -404,9 +403,13 @@ module.exports = {
}
```
相关文档:[云函数url化的入参](uniCloud/cf-function.md?id=input)
相关文档:[云函数url化的入参](cf-functions.md#input)
## 预处理与后处理@before-and-after
## 内置特殊方法@before-and-after
注意:所有`_`开头的方法都是私有方法,客户端不可访问。也就是客户端调用云对象时不能调用_开头的方法。
目前有3个内置特殊方法:`_before``_after``_timing`
### 预处理 _before@before
......@@ -463,7 +466,13 @@ module.exports = {
}
```
注意:所有`_`开头的方法都是私有方法,客户端不可访问。也就是客户端调用云对象时不能调用_开头的方法。
### 定时运行 _timing
> 新增于HBuilderX 3.5.2
在 uniCloud web控制台可以配置定时任务。给一个云对象配置后,将定时执行该云对象的内置方法 `_after`
详细用法参考:[云对象使用定时触发](trigger.md#cloudobject)
## 云对象的返回值@return-value
......@@ -570,13 +579,13 @@ const res = await todo.add('title demo', 'content demo')
> 新增于HBuilderX 3.5.2
详细用法参考:[云对象使用定时触发](uniCloud/trigger.md?id=cloudobject)
详细用法参考:[云对象使用定时触发](trigger.md#cloudobject)
### url化@http-trigger
> 新增于HBuilderX 3.5.2
详细用法参考:[云对象使用url化](uniCloud/http.md?id=cloudobject)
当需要外部系统访问云对象时,可以把云对象封装成一个HTTP的URL。详细用法参考:[云对象使用url化](http.md#cloudobject)
### 跨服务空间调用云对象@call-by-cloud-cross-space
......@@ -598,6 +607,34 @@ const res = await todo.add('title demo', 'content demo')
**注意**
- 上述示例代码,在实际开发中均应该使用 try catch 或 then catch 处理错误捕获
### 云对象方法不能互相调用@call-internal-method
一个云对象导出的不同方法之间不能互相调用。比如下面示例中 tryAddTodo 方法内部无法调用 addTodo 方法。
只能将多个方法共享的逻辑放到云对象导出的对象外部来供云对象的方法调用。例如下面抽离公共函数 pureAddTodo :
```js
// todo.obj.js
async function pureAddTodo(title, content) {
// ...add todo 逻辑
}
module.exports = {
async tryAddTodo() {
try {
return addTodo(title, content)
} catch (e) {
return {
errCode: 'add-todo-failed'
}
}
},
async addTodo(title, content) {
return pureAddTodo(title, content)
}
}
```
### 云对象的接收参数的体积上限
- 阿里云接收参数大小不可超过1MB
- 腾讯云接收参数大小不可超过5MB
......@@ -726,30 +763,3 @@ uniCloud的服务器和客户端交互,有云函数、云对象、clientDB三
如果服务器端不操作数据库外,或者还有复杂的、不宜公开在前端的逻辑,此时推荐使用云对象。
但云对象仅适用于与uni-app前端交互使用。如果不与uni-app前端交互,比如使用云函数URL化与其他系统通信、或者使用定时云函数,此时不适用云对象,还是需要使用云函数。
### 云对象方法互相调用@call-internal-method
云对象导出的方法之间不能互相调用,如果开发中遇到需要方法间互相调用的场景,请考虑将多个方法共享的逻辑放到云对象导出的对象外部来供云对象的方法调用。例:
```js
// todo.obj.js
async function pureAddTodo(title, content) {
// ...add todo 逻辑
}
module.exports = {
async tryAddTodo() {
try {
return addTodo(title, content)
} catch (e) {
return {
errCode: 'add-todo-failed'
}
}
},
async addTodo(title, content) {
return pureAddTodo(title, content)
}
}
```
\ No newline at end of file
......@@ -7,10 +7,10 @@
简单来说,uniCloud和微信小程序云开发、支付宝小程序云开发一样稳定健壮,但有更多优势:
- 跨平台。不管你在uniCloud里选择了阿里还是腾讯的serverless,均可以跨uni-app的全端使用。从pc到h5,从Android到iOS,以及各家小程序快应用,十几个平台全端支持
- uniCloud提供了`clientDB`神器,减少90%的服务器开发工作量,且保障数据安全。[详见](/uniCloud/database)
- uniCloud提供了[uni-id](/uniCloud/uni-id)[uniPay](/uniCloud/unipay)等重要框架,大幅减少开发者的相应功能开发量。
- uniCloud提供了[uni-id](uni-id-summary.md)[uniPay](/uniCloud/unipay)等重要框架,大幅减少开发者的相应功能开发量。
- uniCloud提供了[uni-starter](https://ext.dcloud.net.cn/plugin?id=5057),客户端开发工作量大幅减少。
- uniCloud提供了[uniCloud admin](/uniCloud/admin),管理端开发工作量大幅减少。
- uniCloud提供了[schema2code](/uniCloud/schema?id=autocode),只需编制数据库schema文件,用户端和管理端的数据列表、分页、搜索、详情查看、修改、删除,全套代码均能自动生成。
- uniCloud提供了[schema2code](schema2code.md),只需编制数据库schema文件,用户端和管理端的数据列表、分页、搜索、详情查看、修改、删除,全套代码均能自动生成。
- 更易学。uniCloud提供了`JQL`查询语言,比SQL和MongoDB的查询语法更简单易掌握,尤其是联表查询非常简单。[详见](https://uniapp.dcloud.io/uniCloud/database?id=jsquery)
- 更完善的工具链。前端uni-app、云端uniCloud、还有ide端的HBuilderX,互相紧密搭配,打造闭环的优秀开发体验
- 更丰富的生态。插件市场有大量现成的轮子和资源 [详见](https://ext.dcloud.net.cn/?cat1=7&orderBy=TotalDownload)
......@@ -54,7 +54,7 @@ uniCloud提供了`云函数URL化`,来满足上述需求。[详见](https://un
### 微信云开发支持客户端直接操作数据库,uniCloud支持吗?
uniCloud提供了比微信云开发更优秀的前端操作数据库方案,见:[clientDB](https://uniapp.dcloud.net.cn/uniCloud/database)
uniCloud提供了比微信云开发更优秀的前端操作数据库方案,见:[clientDB](clientdb.md)
### 云开发是nodejs+改良版MongoDB组合,对比php+mysql的传统组合怎么样?
......@@ -114,7 +114,7 @@ uniCloud在MongoDB的基础上改良,进一步提供了`DB Schema`和`JQL`。
1. 使用clientDB可以减少遇到冷启动问题的概率
2. 非高频访问的云函数,合并到高频云函数中。有的开发者使用纯单页方式编写云函数,即在一个云函数中通过路由处理实现了整个应用的所有后台逻辑。参考[插件](https://ext.dcloud.net.cn/search?q=%E8%B7%AF%E7%94%B1&cat1=7&orderBy=UpdatedDate)
3. 非高频访问的云函数,可以通过定时任务持续运行它(注意腾讯云可以使用这个方式完全避开冷启动,而阿里云的定时任务最短周期大于资源回收周期)
4. 配置云函数的单实例多并发,请参考:[单实例多并发](uniCloud/cf-functions.md?id=concurrency)
4. 配置云函数的单实例多并发,请参考:[单实例多并发](cf-functions.md#concurrency)
### uniCloud访问速度感觉不如传统服务器?@slow
有开发者在一台单机上安装php或java,连接同电脑的mysql。然后与uniCloud比较速度,认为uniCloud偏慢。这里需要澄清如下差异:
......@@ -195,9 +195,8 @@ uniCloud.httpclient.request('https://example.com',{
2. 使用[uni-cloud-router单路由云函数框架](https://uniapp.dcloud.net.cn/uniCloud/uni-cloud-router),这种方式只有一个云函数,所有接口都是这个云函数的不同参数,它有统一的路由管理。
以免费空间的48个云函数举例,一般情况下:
- 后台管理系统使用[uniCloud admin](https://uniapp.dcloud.net.cn/uniCloud/admin),会自带一个uni-admin的云函数;
- 前端项目,会有一个[uni-id](https://uniapp.dcloud.net.cn/uniCloud/uni-id)配套的user-center云函数。如果和uniCloud admin复用一个服务空间,此云函数也不需要;
- 如果有热搜词统计跑批,[uni-search](https://ext.dcloud.net.cn/plugin?id=3851)配套一个云函数uni-analyse-searchhot;
- [uni-id](uni-id-summary.md)会有一个云对象(uni-id-co)或老版的云函数(uni-id-cf),这是必备的一个云函数
- 如果使用uni统计、app升级中心、uni发布平台、uniPush2、[uni-search热搜词统计跑批](https://ext.dcloud.net.cn/plugin?id=3851),这些会自带云函数
上述几个是官方推荐的几个常用框架所带的云函数,然后开发者自己的代码里,大多数业务使用clientDB开发,不写云函数,或者写了配套的action云函数也不占用云函数数量;如果还需要自己写一些云函数,再加上uni-cloud-router,用这个单路由云函数搞定剩余需求;另外如果有跑批数据的需求可以再来一个云函数。所以无论如何48个云函数都占不满。
......
......@@ -2,19 +2,22 @@
`uniCloud`提供了一个 JSON 格式的文档型数据库。顾名思义,数据库中的每条记录都是一个 JSON 格式的文档。
它是nosql非关系型数据库,如果您之前熟悉sql关系型数据库,那么两者概念对应关系如下表:
它是 nosql 非关系型数据库,如果您之前熟悉 sql 关系型数据库,那么两者概念对应关系如下表:
|关系型 |JSON 文档型 |
|:- |:- |
|数据库 database|数据库 database |
|表 table |集合 collection。但行业里也经常称之为“表”。无需特意区分 |
|行 row |记录 record / doc |
|字段 column |字段 field |
|使用sql语法操作|使用MongoDB语法或jql操作 |
|字段 column / field |字段 field |
|使用sql语法操作|使用MongoDB语法或jql语法操作 |
一个`uniCloud`服务空间,有且只有一个数据库。一个数据库支持多个集合(表)。一个集合可以有多个记录。每个记录可以有多个字段。
- 一个`uniCloud`服务空间,有且只有一个数据库;
- 一个数据库可以有多个表;
- 一个表可以有多个记录;
- 一个个记录可以有多个字段。
例如,数据库中有一个集合,名为user,存放用户信息。集合user的数据内容如下:
例如,数据库中有一个表,名为user,存放用户信息。表user的数据内容如下:
```json
{"name":"张三","tel":"13900000000"}
......@@ -23,11 +26,11 @@
上述数据中,每行数据表示一个用户的信息,被称之为“记录(record/doc)”。name和tel称之为“字段(field)”。而“13900000000”则是第一条记录的字段tel的值。
每行记录,都是一个完整的json文档,获取到记录后可以使用常规json方式操作。但集合并非json文档,集合是多个json文档的汇总,获取集合需要使用专门的API。
每行记录,都是一个完整的json文档,获取到记录后可以使用常规json方式操作。但表并非json文档,表是多个json文档的汇总,获取表需要使用专门的API。
与关系型数据库的二维表格式不同,json文档数据库支持不同记录拥有不同的字段、支持多层嵌套数据。
仍然以user集合举例,要在数据库中存储每个人的每次登录时间和登录ip,则变成如下:
仍然以user举例,要在数据库中存储每个人的每次登录时间和登录ip,则变成如下:
```json
{
......@@ -44,9 +47,9 @@
可以看出json文档数据库相对于关系型数据库的灵活,李四可以没有login_log字段,也可以有这个字段但登录次数记录与张三不同。
_此处仅为举例,实际业务中,登录日志单独存放在另一个集合更好_
_此处仅为举例,实际业务中,登录日志单独存放在另一个表更合适_
对于初学者,如果不了解数据库设计,可以参考[opendb](https://gitee.com/dcloud/opendb),已经预置了大量常见的数据库设计。
对于初学者,如果不了解数据库设计,可以参考[opendb](opendb.md),已经预置了大量常见的数据库设计。
对于不熟悉传统数据库,但掌握json的js工程师而言,uniCloud的云数据库更亲切,没有传统数据库高昂的学习成本。
......@@ -54,63 +57,186 @@ _此处仅为举例,实际业务中,登录日志单独存放在另一个集
uniCloud同时支持阿里云和腾讯云,它们的数据库大体相同,有细微差异。阿里云的数据库是mongoDB4.0,腾讯云则使用自研的文档型数据库(兼容mongoDB 4.0版本)。uniCloud基本抹平了不同云厂商的差异,有差异的部分会在文档中单独标注。
如果想在云函数连接其他数据库,如mysql,用法和nodejs连接这些数据库是一样的。插件市场已经有人提供了插件,见下。但注意这些用法推荐用于数据导入,主业务开发不建议这么使用。因为其他服务器上的数据库和云函数环境物理上不在一起,连接会比较慢。
## 创建第一个表
- [云函数连接Mysql数据库示例](https://ext.dcloud.net.cn/plugin?id=1925)
1. 打开 uniCloud web控制台 [https://unicloud.dcloud.net.cn/](https://unicloud.dcloud.net.cn/)
如需使用redis,请参考文档:[Redis扩展库](uniCloud/redis.md)
2. 创建或进入一个已存在的服务空间,选择 云数据库->云数据库,创建一个新表
## 操作数据库的方式@db-operation-type
比如我们创建一个简历表,名为 `resume`。点击上方右侧的 创建 按钮即可。
云数据库支持通过云函数访问,也支持在客户端访问云数据库。
![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/e8ca747e-d39f-4da2-8a82-733f9d486cb0.jpg)
- 传统方式云函数操作数据库,使用nodejs写云函数、使用传统的MongoDB的API操作云数据库。
- 客户端访问云数据库,称为[clientDB](uniCloud/clientdb.md)。这种开发方式可大幅提升开发效率,避免开发者开发服务器代码,并且支持更易用的`jql`语法操作数据库,是更为推荐的开发方式。[clientDB](uniCloud/clientdb.md)有单独一套权限和字段值控制系统,无需担心数据库安全。需要`HBuilderX 2.9.5`及以上版本
- 云函数内使用jql语法操作数据库,需要使用[jql扩展库](uniCloud/jql-cloud.md)。与clientDB写法一致,仅在访问password类型的数据时有区别。clientDB完全不可访问password类型字段(即使为此字段设置permission也不生效)。云函数内password类型字段默认权限为false(可以被admin用户访问),开发者配置的字段权限会覆盖此默认权限。需要`HBuilderX 3.3.1`及以上版本
新建表时,支持选择现成的 [opendb](opendb.md) 表模板,选择一个或多个模板表,可以点击右下方按钮创建。
创建表一共有3种方式:
1. 在web控制台创建
2. 在HBuilderX中,项目根目录/uniCloud/database点右键新建schema,上传时创建
3. 在代码中也可以创建表,但不推荐使用,[见下](?id=createCollection)
## 数据表的3个组成部分
每个数据表,包含3个部分:
- data:数据内容
- index:索引
- schema:数据表格式定义
在uniCloud的web控制台可以看到一个数据表的3部分内容。
### 数据内容@dbdata
data,就是存放的数据记录(record)。里面是一条一条的json文档。
record可以增删改查、排序统计。后续有API介绍。
可以先在 web控制台 为之前的 `resume` 表创建一条记录。
输入一个json
```json
{
"name": "张三",
"birth_year": 2000,
"tel": "13900000000",
"email": "zhangsan@zhangsan.com",
"intro": "擅于学习,做事严谨"
}
```
![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/cf0ffb14-c81d-486f-a687-55f84bc99969.jpg)
创建一条新记录,是不管在web控制台创建,还是通过API创建,每条记录都会自带一个`_id`字段用以作为该记录的唯一标志。
`_id`字段是每个数据表默认自带且不可删除的字段。同时,它也是数据表的索引。
![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/7ed5185c-cfcd-461b-a178-5516e9937798.jpg)
阿里云使用的是标准的mongoDB,`_id`是自增的,后创建的记录的`_id`总是大于先生成的`_id`。传统数据库的自然数自增字段在多物理机的大型数据库下很难保持同步,大型数据库均使用`_id`这种长度较长、不会重复且仍然保持自增规律的方式。
**腾讯云使用的是兼容mongoDB的自研数据库,`_id`并非自增**
插入/导入数据时也可以自行指定`_id`而不使用自动生成的`_id`,这样可以很方便的将其他数据库的数据迁移到uniCloud云数据库。
### 数据库索引@dbindex
所谓索引,是指在数据表的众多字段中挑选一个或多个字段,让数据库引擎优先处理这些字段。
设置为索引的字段,在通过该字段查询(where)或排序(orderBy)时可以获得更快的查询速度。
但设置过多索引也不合适,会造成数据新增和删除变慢。
新建的表,默认只有一个索引`_id`
一个数据表可以有多个字段被设为索引。
索引分唯一型和非唯一型。
唯一型索引要求整个数据表多个记录的该字段的值不能重复。比如`_id`就是唯一型索引。
假使有2个人都叫“张三”,那么他们在user数据表里的区分就是依靠不同的`_id`来区分。
如果我们要根据name字段来查询,为了提升查询速度,此时可以把name字段设为非唯一索引。
索引内容较多,还有“组合索引”、“稀疏索引”、“地理位置索引”、“TTL索引”等概念。有单独的文档详细讲述索引,另见:[数据库索引](uniCloud/db-index.md)
**在web控制台添加上述索引**
![](https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-dc-site/fca53140-1d91-11eb-880a-0db19f4f74bb.jpg)
**注意**
- 如果记录中已经存在多个记录某字段相同的情况,那么将该字段设为唯一型索引会失败。
- 如果已经设置某字段为唯一索引,在新增和修改记录时如果该字段的值之前在其他记录已存在,会失败。
- 假如记录中不存在某个字段,则对索引字段来说其值默认为 null,如果该索引字段设为唯一型索引,则不允许存在两个或以上的该字段为null或不存在该字段的记录。此时需要设置稀疏索引来解决多个null重复的问题
### 数据表格式定义@dbschema
`DB Schema`是表结构描述。描述数据表有哪些字段、值域类型是什么、是否必填、数据操作权限等很多内容。
因为 MongoDB 的灵活性,理论上`DB Schema`不是必须的,使用传统 MongoDB API 操作数据库不需要`DB Schema`
但如果使用 JQL,那`DB Schema`就是必须的。
`DB Schema`涉及内容较多,另见文档:[https://uniapp.dcloud.io/uniCloud/schema](uniCloud/schema)
## API操作数据库的方式@db-operation-type
uniCloud 的云数据库有多种操作方式。
- 支持在云函数操作,也支持在客户端操作。
- 支持使用传统MongoDB语法操作,也支持JQL语法操作。
uniCloud 默认推荐使用 JQL 语法操作数据库,它是一种更简单易用、对js开发者更友好的、开发效率更高的数据库操作语法。[详见](jql.md)
不管在云函数中还是在uni-app客户端中,均支持JQL。
同时 uniCloud 保留了在云函数中使用传统 MongoDB 的 nodejs API 操作云数据库。
| |运行在云端 |运行在客户端 |支持 DB Schema |
|-- |-- |-- |-- |
|JQL云函数 |√ |√ |√ |
|传统MongoDB客户端 |√ |X |X |
关于几种操作数据库方式的选择:
1. 优先使用客户端操作数据库(称为[clientDB](uniCloud/clientdb.md)
传统开发中,其实大多数服务器接口开发,就是检验下前端数据和身份的合法性,然后写个SQL操作下数据库,返回JSON给前端。其实很无聊。
clientDB最大的好处就是不用写服务端代码,客户端直接操作数据库。因为uniCloud提供了[DB Schema](schema.md)[uni-id](uni-id-summary.md),可以直接控制数据库的内容和权限校验。
clientDB同时支持`action云函数`作为补充,当发起一个客户端操作云数据库的请求时,可以同时触发一个`action云函数`,在云端对数据库操作进行前置或后置处理。
如下场景不适用clientDB:
- 相关数据库操作逻辑不适合暴露在前端,比如抽奖
- 注册、修改密码等操作password类型数据(password类型不会传给前端)的情况。一般情况下开发者不涉及相关问题。因为注册、修改密码等账户管理相关,官方已提供了[uni-id-pages](uni-id-pages.md),里面有uni-id-co云对象。所以开发者无需自己编写相关逻辑,直接用这个插件就好了。
- 三方服务器回调。在登录、支付等涉及隐私的地方较常见。比如从微信服务器获取用户手机号,只支持云端获取,获取后要入库保存
2. 其次使用云函数的JQL扩展库来操作数据库
对于clientDB不适应的场景,推荐在云函数或云对象中使用JQL。
目前云函数中JQL不适用的场景:使用 set 操作符动态修改字段名称(不是字段值)。这个场景常规业务不涉及,未来JQL可能会完善并支持这个场景。
3. 除非开发者原本就对 nodejs 操作 MongoDB 非常熟悉,且需要使用 set 操作符动态修改字段名等,否则不推荐使用传统MongoDB写法。
MongoDB API操作数据库,不能在客户端操作、不支持 DB Schema,不支持HBuilderX的jql查询器,不能在客户端的代码提示中提示数据库的表名、字段。
不管使用哪种方法,都有很多公共的概念或功能。本文档将讲述这些公共的内容。
同时左侧导航有三种方法的专项链接,描述它们各自特有的功能。
- [云函数使用传统MongoDB语法操作数据库](uniCloud/cf-database.md)
- [前端操作数据库clientDB](uniCloud/clientdb.md)
- [云函数内使用JQL语法操作数据库](uniCloud/jql-cloud.md)
- [客户端操作数据库clientDB](clientdb.md)
- [云函数内使用JQL语法操作数据库](jql-cloud.md)
- [云函数使用传统MongoDB语法操作数据库](cf-database.md)
## 获取数据库对象@database
## 获取数据库对象的API@database
想要通过代码操作数据库,第一步要获取服务空间里的数据库对象。
**云函数使用传统MongoDB语法操作数据库以及客户端使用clientDB获取数据库实例:**
```js
const db = uniCloud.database(); //代码块为cdb
```
js中敲下代码块`cdb`,即可快速输入上述代码。
**云函数内使用JQL扩展库时获取数据库实例写法为:**
其中,云函数内使用JQL扩展库时,还需要做一个工作,就是指定操作用户身份。[详见](jql-cloud.md?id=use-in-object)
```js
// 简单的使用示例
// 云函数中JQL使用示例
'use strict';
exports.main = async (event, context) => {
const dbJQL = uniCloud.databaseForJQL({ // 获取JQL database引用,此处需要传入云函数的event和context,必传
event,
context
})
const bookQueryRes = dbJQL.collection('book').where("name=='三国演义'").get() // 直接执行数据库操作
return {
bookQueryRes
dbJQL.collection('book').get() // 直接执行数据库操作
}
};
```
## 获取其他服务空间数据库实例@init-db
如果当前应用仅使用一个服务空间,在HBuilderX中做好服务空间关联即可。获取当前空间的数据库实例时无需传递配置,直接调用database方法即可
### 获取其他服务空间数据库实例@init-db
```js
const db = uniCloud.database()
```
如果当前应用仅使用一个服务空间,在HBuilderX中做好服务空间关联即可。获取当前空间的数据库实例时无需传递配置,直接调用database方法默认就是操作关联服务空间的数据库。
如果应用有连接其他服务空间数据库的需求,可以在获取database实例时传递对应服务空间的配置
......@@ -141,15 +267,9 @@ db.collection('uni-id-users').get()
|provider |String |是 |- |aliyun、tencent |
|spaceId |String |是 |- |服务空间ID,**注意是服务空间ID,不是服务空间名称** |
|clientSecret |String |是 |- |仅阿里云支持,可以在[uniCloud控制台](https://unicloud.dcloud.net.cn)服务空间列表中查看 |
|endpoint |String |否 |`https://api.bspapp.com` |服务空间地址,仅阿里云支持 |
|endpoint |String |否 |`https://api.bspapp.com` |服务空间地址,仅阿里云支持 |
## 创建一个集合/数据表@createCollection
新建的服务空间,没有数据表。需要首先创建集合/数据表。
可以在uniCloud的web控制台([https://unicloud.dcloud.net.cn](https://unicloud.dcloud.net.cn))在web页面创建数据表,也可以通过代码创建数据表。
通过代码创建数据表的方式,阿里云和腾讯云有差别:
## 创建集合/表的API@createCollection
- 阿里云
......@@ -174,7 +294,7 @@ db.createCollection("table1")
- 如果数据表已存在,腾讯云调用createCollection方法会报错
- 腾讯云调用collection的add方法不会自动创建数据表,不存在的数据表会报错
- 阿里云没有createCollection方法
- 使用代码方式创建的表没有索引,请谨慎使用此方式
- **使用代码方式创建的表没有索引、schema,性能和功能都受影响,不建议使用这种方式**
## 获取集合/数据表对象@collection
......@@ -183,7 +303,7 @@ db.createCollection("table1")
```js
const db = uniCloud.database();
// 获取名为 `table1` 数据表的引用
const collection = db.collection('table1');
const resume = db.collection('resume');
```
**集合/数据表 Collection 的方法**
......@@ -204,29 +324,68 @@ const collection = db.collection('table1');
collection对象的方法可以增和查数据,删和改不能直接操作,需要collection对象通过doc或get得到指定的记录后再调用remove或update方法进行删改。
具体前端clientDB和云函数各自增删改查的方法,请单独参考文档:
- [云函数使用传统MongoDB语法操作数据库](uniCloud/cf-database)
- [前端操作数据库,clientDB和jql](uniCloud/clientdb)
数据操作的API较多,请单独参考文档:
- [JQL语法操作数据库](jql.md)
- [MongoDB语法操作数据库](cf-database.md)
## 数据类型@data-type
**示例**
这里我们使用clientDB,实现一个简单的在前端获取刚才输入 resume 表的记录的功能。
1. 创建一个uni-app项目,开通uniCloud环境,并在uniCloud初始化向导中关联 resume表所在的服务空间;或者使用老项目对uniCloud目录点右键关联服务空间。
2. 对项目下的 uniCloud/database 点右键,下载所有DB Schema。
3. 打开新下载的 resume.schema.json ,将其中的 "permission" 节点下的 "read" 从 false 改为 true。即设置该表允许任意用户读 (后续可以深入学习 DB Schema)
4. 在客户端 pages/index/index.vue 编写代码
```html
<template>
<view class="content">
<button @click="testclientdb()">请求数据库</button>
</view>
</template>
<script>
export default {
data() {
return {}
},
methods: {
testclientdb() {
const db = uniCloud.database();
db.collection("resume").get().then((res) => {
// res 为数据库查询结果
console.log(res)
}).catch((e) => {
console.log(e)
});
}
}
}
</script>
```
5. 运行项目,点击按钮,即打印出查询到的数据库内容
`res.result.data`下即为数据表 resume 中的数据。
数据库内数据基础类型有以下几种:
## 数据类型@data-type
* String:字符串
* Number:数字
* Object:对象
* Array:数组
* Bool:布尔值
数据库内数据类型有以下几种:
* string:字符串
+ password:[DB Schema]中扩展的特殊string。用于保存密码。这类字段不会通过clientDB传递给前端,所有用户都不能通过clientDB读写,即使是admin管理员
* number:数字
+ 在[DB Schema]中细化为int和double
* bool:布尔值
* date:时间
* timestamp 时间戳
* object:对象
+ file:[DB Schema]中扩展的特殊 object,用于云存储文件的信息体。不直接存储文件,而是一个json object,包括云存储文件的名称、路径、文件体积等信息。(HBuilderX 3.1.0+ )
* array:数组
* null:相当于一个占位符,表示一个字段存在但是值为空。
* GeoPoint:地理位置点
* GeoLineStringLine: 地理路径
* GeoPolygon: 地理多边形
* GeoMultiPoint: 多个地理位置点
* GeoMultiLineString: 多个地理路径
* GeoMultiPolygon: 多个地理多边形
* Date:时间
* Null:相当于一个占位符,表示一个字段存在但是值为空。
DB Schema中还扩展了其他字段类型,但其实都是基本类型的扩展,比如file类型其实是一种特殊的object,而password类型是一种特殊的string类型。
DB Schema的数据类型有专门文档,[详见](schema.md?id=bsontype)
### Date类型
......@@ -343,73 +502,14 @@ new db.Geo.MultiPolygon([
])
```
## 集合/数据表的3个组成部分
每个数据表,其实包含3个部分:
- data:数据内容
- index:索引
- schema:数据表格式定义
在uniCloud的web控制台可以看到一个数据表的3部分内容。
### 数据内容@dbdata
data很简单,就是存放的数据记录(record)。
实际上,创建一条新记录,是不管在web控制台创建,还是通过API创建,每条记录都会自带一个`_id`字段用以作为该记录的唯一标志。
`_id`字段是每个数据表默认自带且不可删除的字段。同时,它也是数据表的索引。
阿里云使用的是标准的mongoDB,`_id`是自增的,后创建的记录的`_id`总是大于先生成的`_id`。传统数据库的自然数自增字段在多物理机的大型数据库下很难保持同步,大型数据库均使用`_id`这种长度较长、不会重复且仍然保持自增规律的方式。
**腾讯云使用的是兼容mongoDB的自研数据库,`_id`并非自增**
插入/导入数据时也可以自行指定`_id`而不使用自动生成的`_id`,这样可以很方便的将其他数据库的数据迁移到uniCloud云数据库
### 数据库索引@dbindex
所谓索引,是指在数据表的众多字段中挑选一个或多个字段,让数据库引擎优先处理这些字段。设置为索引的字段,在通过该字段查询记录时可以获得更快的查询速度。但设置过多索引也不合适,会造成数据新增和删除变慢。
一个数据表可以有多个字段被设为索引。
索引分唯一型和非唯一型。
唯一型索引要求整个数据表多个记录的该字段的值不能重复。比如`_id`就是唯一型索引。
假使有2个人都叫“张三”,那么他们在user数据表里的区分就是依靠不同的`_id`来区分。
如果我们要根据name字段来查询,为了提升查询速度,此时可以把name字段设为非唯一索引。
索引内容较多,还有“组合索引”、“稀疏索引”、“地理位置索引”、“TTL索引”等概念。有单独的文档详细讲述索引,另见:[数据库索引](uniCloud/db-index.md)
**在web控制台添加上述索引**
![](https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-dc-site/fca53140-1d91-11eb-880a-0db19f4f74bb.jpg)
**注意**
- 如果记录中已经存在多个记录某字段相同的情况,那么将该字段设为唯一型索引会失败。
- 如果已经设置某字段为唯一索引,在新增和修改记录时如果该字段的值之前在其他记录已存在,会失败。
- 假如记录中不存在某个字段,则对索引字段来说其值默认为 null,如果该索引字段设为唯一型索引,则不允许存在两个或以上的该字段为null或不存在该字段的记录。此时需要设置稀疏索引来解决多个null重复的问题
### 数据表格式定义@dbschema
`DB Schema`是集合的表结构描述。描述数据表有哪些字段、值域类型是什么、是否必填、数据操作权限等很多内容。
因为json文档数据库的灵活性,data数据的字段可以不在schema的描述范围内。
`DB Schema`更多是为搭配jql语法使用的,如果使用jql语法(clientDB或者使用了jql扩展库的云函数内)则需要详细阅读`DB Schema`的文档。
`DB Schema`涉及内容较多,另见文档:[https://uniapp.dcloud.io/uniCloud/schema](uniCloud/schema)
## 与传统开发区别@difference
不同于传统开发,云函数连接数据库有单次操作时长限制,目前单次操作时间限制如下。超出此时间会报超时错误。一般情况下在设置了合适的索引时不会遇到超时错误,如何优化查询速度请参考:[数据库性能优化](uniCloud/db-performance.md)
不同于传统开发,连接数据库有单次操作时长限制,目前单次操作时间限制如下。超出此时间会报超时错误。一般情况下在设置了合适的索引时不会遇到超时错误,如何优化查询速度请参考:[数据库性能优化](uniCloud/db-performance.md)
|腾讯云 |阿里云 |
|-- |-- |
|5秒 |1秒 |
|5秒 |3秒 |
## 数据导入导出和备份@dbmigration
......@@ -495,7 +595,7 @@ uniCloud数据库提供了多种数据导入导出和备份方案。
在HBuilderX中对上述`db_init.json`点右键,可初始化数据库到云服务空间,创建`collection_test`表,并按上述json配置设置该表的index索引和schema,以及插入data下的数据。
[opendb](https://gitee.com/dcloud/opendb)的表,在`db_init.json`中初始化时,不建议自定义index和schema。系统会自动从opendb规范中读取最新的index和schema。
[opendb](opendb.md)的表,在`db_init.json`中初始化时,不建议自定义index和schema。系统会自动从opendb规范中读取最新的index和schema。
**使用`db_init.json`导入数据库**
......@@ -533,19 +633,19 @@ uniCloud会在每天凌晨自动备份一次数据库,最多保留7天。这
1. 登录[uniCloud后台](https://unicloud-dev.dcloud.net.cn/)
2. 点击左侧菜单`云数据库 --> 数据库回档`,点击`新建回档`
3. 选择可回档时间
4. 选择需要回档的集合(注意:回档后集合不能与现有集合重名,如需对集合重命名可以在集合列表处操作)
4. 选择需要回档的表(注意:回档后表不能与现有表重名,如需对表重命名可以在表列表处操作)
![数据库回档](https://img.cdn.aliyun.dcloud.net.cn/uni-app/uniCloud/unicloud-db-backup.jpg)
### 数据导出为文件@export
此功能主要用于导出整个集合的数据
此功能主要用于导出整个的数据
**用法**
1. 进入[uniCloud web控制台](https://unicloud.dcloud.net.cn/home),选择服务空间,或者直接在HBuilderX云函数目录`cloudfunctions`上右键打开uniCloud web控制台
2. 进入云数据库选择希望导入数据的集合
2. 进入云数据库选择希望导入数据的
3. 点击导出按钮
4. 选择导出格式,如果选择csv格式还需要选择导出字段
5. 点击确定按钮等待下载开始即可
......@@ -564,7 +664,7 @@ uniCloud提供的`db_init.json`主要是为了对数据库进行初始化,并
**用法**
1. 进入[uniCloud web控制台](https://unicloud.dcloud.net.cn/home),选择服务空间,或者直接在HBuilderX云函数目录`cloudfunctions`上右键打开uniCloud web控制台
2. 进入云数据库选择希望导入数据的集合
2. 进入云数据库选择希望导入数据的
3. 点击导入,选择json文件或csv文件
4. 选择处理冲突模式(关于处理冲突模式请看下方注意事项)
5. 点击确定按钮等待导入完成即可
......@@ -581,7 +681,7 @@ uniCloud提供的`db_init.json`主要是为了对数据库进行初始化,并
{"a":2}
```
> 如果是自己拼接的json格式数据请注意:如果存在集合A关联集合B的字段的场景需要保证关联字段在A、B内是一致的(特别需要注意的是各种与_id关联的字段)
> 如果是自己拼接的json格式数据请注意:如果存在表A关联表B的字段的场景需要保证关联字段在A、B内是一致的(特别需要注意的是各种与_id关联的字段)
例:
......@@ -589,13 +689,13 @@ uniCloud提供的`db_init.json`主要是为了对数据库进行初始化,并
```js
// 这里为了方便看数据进行了格式化,实际导入所需的json文件是每行一条记录
// article集合
// article
{
"user_id": {
$oid: "601cf1dbf194b200018ed8ec"
}
}
// user集合
// user
{
"_id": {
$oid: "601cf1dbf194b200018ed8ec"
......@@ -607,11 +707,11 @@ uniCloud提供的`db_init.json`主要是为了对数据库进行初始化,并
```js
// 这里为了方便看数据进行了格式化,实际导入所需的json文件是每行一条记录
// article集合
// article
{
"user_id": "601cf1dbf194b200018ed8ec"
}
// user集合
// user
{
"_id": {
$oid: "601cf1dbf194b200018ed8ec"
......
## 操作场景
## 使用场景
云函数URL化 是 uniCloud 为开发者提供的 HTTP 访问服务,让开发者可以通过 HTTP URL 方式访问到云函数
云函数/云对象URL化 是 uniCloud 为开发者提供的 HTTP 访问服务,让开发者可以通过 HTTP URL 方式访问到云函数或云对象
- 场景1:比如App端微信支付,需要配服务器回调地址,此时需要一个HTTP URL。
- 场景2:非uni-app开发的系统,想要连接uniCloud,读数据,也需要通过HTTP URL方式访问。
- 场景2:非uni-app开发的系统,想要连接uniCloud,读数据,也需要通过HTTP URL方式访问。
url化后需要注意以下几点
- 安全:为了保障业务安全性,开发者需在代码中做好权限控制和安全防护,避免未授权访问触发敏感操作。
- 计费:云函数开启了URL化后,如果遇到大量恶意访问,消耗云函数资源,开发者可以将云函数访问地址设置为空即可停止 HTTP 访问支持。
> 云函数自上线就支持URL化。云对象的URL化需HBuilderX 3.5.2+。下文除非特别提到云对象,否则云函数通指普通云函数和云对象。
本文档主要指导您如何在uniCloud web控制台管理和使用云函数URL化。
**使用限制**
......@@ -20,7 +22,7 @@ url化后需要注意以下几点
### 设置云函数 HTTP 访问地址@set-path
1. 登录[uniCloud后台](https://unicloud.dcloud.net.cn/),选择需要管理的服务空间。
1. 登录[uniCloud后台](https://unicloud.dcloud.net.cn/),选择服务空间。
2. 单击左侧菜单栏【云函数】,进入云函数页面。
3. 点击需要配置的云函数的【详情】按钮,配置访问路径。
......@@ -370,11 +372,11 @@ module.exports = {
}
```
如果通过`https://xxx.com/todo/addTodo?title=todo-title&content=todo-content`调用云对象,todo方法内的console.log会输出以下内容`{title: 'todo-title', content: 'todo-content'}`
如果通过`https://xxx.com/todo/addTodo?title=todo-title&content=todo-content`调用云对象,todo方法内的console.log会输出以下内容`{title: 'todo-title', content: 'todo-content'}`
需要注意的是自url内解析出的参数均为字符串类型。
**注意**
- url化方式调用云对象时,`_before``_after`均正常执行
- 如果需要获取其他方式传入云对象的参数(如:post一个json内容到云对象),请使用[this.getHttpInfo](uniCloud/cloud-obj.md?id=get-http-info)获取
\ No newline at end of file
- 如果需要获取其他方式传入云对象的参数(如:post一个json内容到云对象),请使用[this.getHttpInfo](cloud-obj.md#get-http-info)获取
\ No newline at end of file
......@@ -2,13 +2,22 @@
> 新增于HBuilderX 3.3.1版本
HBuilderX 3.3.1之前JQL只能在clientDB及JQL数据库管理里面使用,此次更新为云函数带来了JQL语法,云函数内也可以享受便捷的数据库操作语句编写
对于不适合在前端暴露的数据库操作,过去只能在云函数中使用传统MongoDB语法。此次更新让云函数也可以使用 JQL 来操作数据库
关于JQL语法及其他注意事项请参考此文档:[JQL数据库操作](uniCloud/jql.md)
相比于传统 MongoDB语法,JQL 为云函数带来如下价值:
## 为云函数启用jql扩展库@use-in-function
1. JQL 优化了联表查询、Tree查询、虚拟表查询等,比 MongoDB语法更易用
2. 支持 DB Schema,包括各种值域约束和权限校验。无需再开发接口的权限和数据合法性验证代码
需要开发者手动在云函数的package.json内添加云函数的扩展库。(如果云函数目录下没有package.json,可以通过在云函数目录下执行`npm init -y`来生成)
本文主要讲解云函数中如何使用 JQL 。详细的 JQL 语法另见文档:[JQL数据库操作](uniCloud/jql.md)
## 为云函数添加jql扩展库
JQL 操作的引擎代码体积不小,考虑到有的云函数并不操作数据库或不使用JQL,所以相关功能被剥离在`uni-cloud-jql`扩展库中。
HBuilderX 3.4起,新建云函数/云对象,**默认加载**`uni-cloud-jql`扩展库。对于老云函数,也可以对云函数点右键 -> 管理公共模块或扩展库依赖 -> 选择`uni-cloud-jql`
HBuilderX 3.4以前的开发者,需要在云函数的package.json内手动添加扩展库。(如果云函数目录下没有package.json,可以通过在云函数目录下执行`npm init -y`来生成)
下面是一个开启了jql扩展库的云函数的package.json示例,**注意不可有注释,以下文件内容中的注释仅为说明,如果拷贝此文件,切记去除注释**
......@@ -25,6 +34,12 @@ HBuilderX 3.3.1之前JQL只能在clientDB及JQL数据库管理里面使用,此
}
```
对于确定在云函数/云对象中不需要使用 JQL 扩展库的,请对云函数右键,取消`uni-cloud-jql`扩展库。这样可以减少云函数体积,提高性能。
## 云函数中使用@use-in-function
`uniCloud.databaseForJQL`方法,传入客户端信息,就可以得到一个JQL数据库操作对象。
```js
// 简单的使用示例
'use strict';
......@@ -40,7 +55,32 @@ exports.main = async (event, context) => {
};
```
上述示例中jql扩展将会使用event内带有的uniIdToken对应的用户作为执行数据库操作的用户,如需指定执行当前数据库操作的用户请使用`setUser`方法
## 云对象中使用@use-in-object
> 新增于 HBuilderX 3.4.10
云对象中无法获取`event``context`,为方便在云对象中使用jql扩展,自HBuilderX 3.4.10起,`uniCloud.databaseForJQL`方法接收云对象`clientInfo`作为参数
**示例**
```js
module.exports = {
addTodo (title, content) {
const dbJQL = uniCloud.databaseForJQL({ // 获取JQL database引用,此处需要传入云对象的clientInfo
clientInfo: this.getClientInfo()
})
}
}
```
## setUser指定用户身份
上述示例中,jql扩展使用的是客户端的身份,准确的说是客户端的uniIdToken对应的用户作为执行数据库操作的用户。
如需在云函数/云对象中指定执行其他用户身份,需使用`setUser`方法
setUser方法的参数是一个json对象,可传入uni-id的uid、role、permission,组合生效。
例:
......@@ -53,7 +93,7 @@ exports.main = async (event, context) => {
})
dbJQL.setUser({ // 指定后续执行操作的用户信息,此虚拟用户将同时拥有传入的uid、role、permission
uid: 'user-id', // 建议此处使用真实uid
role: ['admin'], // 指定当前执行用户的角色为admin
role: ['admin'], // 指定当前执行用户的角色为admin。如果只希望指定为admin身份,可以删除uid和permission节点
permission: []
})
const bookQueryRes = dbJQL.collection('book').where("name=='三国演义'").get() // 直接执行数据库操作
......@@ -63,27 +103,16 @@ exports.main = async (event, context) => {
};
```
## 云对象中使用@use-in-object
> 新增于 HBuilderX 3.4.10
## 与clientDB的差异
云对象中无法获取`event``context`,为方便在云对象中使用jql扩展,自HBuilderX 3.4.10起,`uniCloud.databaseForJQL`方法接收云对象`clientInfo`作为参数
虽然都使用 JQL,但云端和客户端还是有一点区别
**示例**
```js
module.exports = {
addTodo (title, content) {
const dbJQL = uniCloud.databaseForJQL({ // 获取JQL database引用,此处需要传入云对象的clientInfo
clientInfo: this.getClientInfo()
})
}
}
```
- clientDB无论如何不可访问password类型字段,不管schema的权限如何,这类数据不传输到客户端。云函数内可以访问password类型字段,但受schema配置的权限约束。
- clientDB有action云函数的概念,为了弥补客户端操作数据库的不足。云函数没有再使用action的必要了。
## 注意事项
- JQL扩展依赖`uni-id`公共模块
- JQL扩展库依赖redis扩展库进行数据缓存,未开通redis的服务空间无法使用缓存功能
- 启用了JQL扩展的云函数在本地调试时会自动使用本地schema、action、validateFunction以及uni-id公共模块
- 由于此扩展会将`schema``action``validateFunction`带到模块内,如果你的上述文件较多会大幅增大云函数体积,因此启用此扩展的云函数**冷启动**时间会稍长,建议不要为太多云函数启用此扩展
\ No newline at end of file
- 由于此扩展会将`schema``action``validateFunction`带到模块内,如果你的上述文件较多会大幅增大云函数体积,因此启用此扩展的云函数**冷启动**时间会稍长,建议不要为太多云函数启用此扩展
## JQL数据库操作
`jql`,全称javascript query language,是一种js方式操作数据库的语法规范。
`JQL`,全称 javascript query language,是一种js方式操作数据库的规范。
`jql`大幅降低了js工程师操作数据库的难度、大幅缩短开发代码量。并利用json数据库的嵌套特点,极大的简化了联表查询和树查询的复杂度。
- `JQL`大幅降低了js工程师操作数据库的难度,比SQL和传统MongoDB API更清晰、易掌握。
- `JQL`支持强大的[DB Schema](schema.md),内置数据规则和权限。DB Schema 支持[uni-id](uni-id-summary.md),可直接使用其角色和权限。无需再开发各种数据合法性校验和鉴权代码。
- `JQL`利用json数据库的嵌套特点,极大的简化了联表查询和树查询的复杂度,并支持更加灵活的虚拟表。
#### jql的诞生背景
......@@ -163,7 +165,7 @@ db.collection('user').where({
**注意**
- 这些变量使用时并非直接获取对应的值,而是生成一个标记,在执行数据库操作时再将这个标记替换为实际的值
- 这些变量使用时并非直接获取对应的值,而是生成一个标记,在云端执行数据库操作时再将这个标记替换为实际的值
## jql条件语句的运算符@operator
......@@ -2943,13 +2945,13 @@ const res = await db.collection('test').aggregate()
.end()
```
## 更新操作符@update-command
## 更新操作符(重命名或删除字段)@update-command
> 新增于 HBuilderX 3.5.1,JQL数据库管理支持使用更新操作符
更新操作符可以在执行更新时使用。比如对字段重命名(rename)、删除字段(remove)等
更新操作符可以在执行更新时使用。比如对字段重命名(rename)、删除字段(remove)等。适用于表结构变更后,使用 HBuilderX 的 JQL管理器进行数据变更。
重命名字段示例
`db.command.rename`重命名字段
```js
db.collection('test').update({
......@@ -2957,7 +2959,7 @@ db.collection('test').update({
})
```
删除字段示例
`db.command.remove`删除字段
```js
db.collection('test').update({
......@@ -2967,8 +2969,9 @@ db.collection('test').update({
**注意**
- 仅JQL数据库管理支持
- 使用更新操作符后,将完全跳过所有数据校验操作
- 仅 HBuilderX 3.5.1+ 中的 JQL数据库管理器中可用
- 支持批量传入重命名或删除指令
- 使用更新操作符后,将完全跳过所有数据校验操作,即无论schema中如何配置数据的值域规则,都将无法生效。所以更新操作符不宜与普通的数据增删改混在一起执行。
## DBSchema@schema
......@@ -3337,9 +3340,8 @@ module.exports = {
**参考:**
- [uni-id 文档](https://uniapp.dcloud.net.cn/uniCloud/uni-id)
- [uni-config-center 文档](https://ext.dcloud.net.cn/plugin?id=4425)
- [uni-id 文档](uni-id-summary.md)
- [uni-config-center 文档](uni-config-center.md)
扩展库:
......@@ -3350,7 +3352,6 @@ module.exports = {
**注意**
- action上传后可能需要一段时间才会在云端生效,通常是3分钟左右
## 数据库运算方法列表@aggregate-operator
uniCloud的云数据库,提供了一批强大的运算方法。这些方法是数据库执行的,而不是云函数执行的。
......@@ -3562,16 +3563,16 @@ const res = await db.collection('stats')
groupField内可使用且仅能使用如下运算方法。
|操作符 |用途 |用法 |说明 |
|--- |--- |--- |--- |
|addToSet |向数组中添加值,如果数组中已存在该值,不执行任何操作 |addToSet(表达式) |- |
|avg |返回指定表达式对应数据的平均值 |avg(表达式) |- |
|first |返回指定字段在一组集合的第一条记录对应的值。仅当这组集合是按照某种定义排序( sort )后,此操作才有意义 |first(表达式) |- |
|last |返回指定字段在一组集合的最后一条记录对应的值。仅当这组集合是按照某种定义排序( sort )后,此操作才有意义。 |last(表达式) |- |
|max |返回一组数值的最大值 |max(表达式) |- |
|min |返回一组数值的最小值 |min(表达式) |- |
|push |返回一组中表达式指定列与对应的值,一起组成的数组 |push(表达式) |- |
|stdDevPop |返回一组字段对应值的标准差 |stdDevPop(表达式) |- |
|stdDevSamp |计算输入值的样本标准偏差 |stdDevSamp(表达式) |- |
|sum |返回一组字段所有数值的总和 |sum(表达式) |- |
|mergeObjects |将一组对象合并为一个对象 |mergeObjects(表达式) |在groupField内使用时仅接收一个参数 |
|操作符 |用途 |用法 |说明 |
|--- |--- |--- |--- |
|addToSet |向数组中添加值,如果数组中已存在该值,不执行任何操作 |addToSet(表达式) |- |
|avg |返回指定表达式对应数据的平均值 |avg(表达式) |- |
|first |返回指定字段在一组集合的第一条记录对应的值。仅当这组集合是按照某种定义排序( sort )后,此操作才有意义 |first(表达式) |- |
|last |返回指定字段在一组集合的最后一条记录对应的值。仅当这组集合是按照某种定义排序( sort )后,此操作才有意义。 |last(表达式) |- |
|max |返回一组数值的最大值 |max(表达式) |- |
|min |返回一组数值的最小值 |min(表达式) |- |
|push |返回一组中表达式指定列与对应的值,一起组成的数组 |push(表达式) |- |
|stdDevPop |返回一组字段对应值的标准差 |stdDevPop(表达式) |- |
|stdDevSamp |计算输入值的样本标准偏差 |stdDevSamp(表达式) |- |
|sum |返回一组字段所有数值的总和 |sum(表达式) |- |
|mergeObjects |将一组对象合并为一个对象 |mergeObjects(表达式) |在groupField内使用时仅接收一个参数 |
......@@ -19,7 +19,7 @@
- 数据孤岛问题。当多个应用之间的数据库规范相同,他们之间的跨应用数据交换就变的更容易。未来uniCloud会提供更方便的跨应用数据交换机制。
- 统一的初始数据。比如地区表等数据,在openDB中有初始化数据,开发者们共享一个相同数据源即可。
[uni-id](https://uniapp.dcloud.io/uniCloud/uni-id)的账户统一,是`openDB`的成功实践。基于uni-id规范,有电商插件、有IM插件、有PC管理插件,开发者可以方便的把这些插件整合到自己的同一应用中。
[uni-id](uni-id-summary.md)的账户统一,是`openDB`的成功实践。基于uni-id规范,有电商插件、有IM插件、有PC管理插件,开发者可以方便的把这些插件整合到自己的同一应用中。
## openDB中的已有规范
......
......@@ -41,40 +41,6 @@ Hello uniCloud 的源码地址:[https://ext.dcloud.net.cn/plugin?id=4082](http
3. 运行 hello uniCloud项目
- 在运行菜单运行项目,浏览器、app、小程序均可。uniCloud项目是云端一体的,运行前端后控制台会同时出现前端和云端的控制台。
## 目录结构@structure
uniCloud云开发环境创建成功后,项目根目录下会有一个带有云图标的特殊目录,名为“uniCloud”。(即便是cli创建的项目,云函数目录也在项目的根目录下,而不是src下)
<pre v-pre="" data-lang="">
<code class="lang-" style="padding:0">
┌──uniCloud-aliyun 云空间目录,阿里云为uniCloud-aliyun,腾讯云为uniCloud-tcb。但HBuilderX项目管理器会隐藏显示后缀,只显示uniCloud
| |——— cloudfunctions 云函数目录
| | │───common 云函数公用模块目录 <a target="_blank" href="https://uniapp.dcloud.io/uniCloud/cf-common">详情</a>
| | | └──hello-common 云函数公用模块
| | | │──index.js 公用模块代码
| | | └──package.json 公用模块package.json
| | │───uni-clientDB-actions
| | │ └──new_action.js clientDB action代码 <a target="_blank" href="https://uniapp.dcloud.net.cn/uniCloud/clientdb?id=action">详情</a>
| | └───function-name 普通云函数目录
| | │──index.js 云函数入口代码
| | └──package.json 包含云函数的配置信息,如url化、定时设置、内存等内容 <a target="_blank" href="https://uniapp.dcloud.io/uniCloud/cf-functions?id=packagejson">详情</a>
| | └───object-name 云对象目录
| | │──index.obj.js 云对象入口代码
| | └──package.json 包含云对象的配置信息<a target="_blank" href="https://uniapp.dcloud.io/uniCloud/cf-functions?id=packagejson">详情</a>
│ └──database 云数据目录
│ │──validateFunction 数据库扩展校验函数目录
│ │ └──new_validation.js 扩展校验函数代码 <a target="_blank" href="https://uniapp.dcloud.net.cn/uniCloud/schema?id=validatefunction">详情</a>
│ │──db_init.json db_init.json初始化数据库文件,其中不再包含schema <a target="_blank" href="https://uniapp.dcloud.net.cn/uniCloud/hellodb?id=db-init">详情</a>
│ └──xxx.schema.json 数据表xxx的 DB Schema <a target="_blank" href="https://uniapp.dcloud.net.cn/uniCloud/schema">详情</a>
根目录
</code>
</pre>
**注意**
- uniCloud目录是存放服务端文件的目录,它和前端代码在同一个项目下是为了方便管理。在发行前端部分,比如打包app、小程序、h5的代码包里并不会包含uniCloud目录。
- HBuilderX 3.0之前目录结构较老,没有uniCloud目录,根目录直接是cloudfunctions。不支持database和云对象,不推荐再使用老版。
## 开发自己的第一个uniCloud项目
1. 创建uniCloud项目
......@@ -87,9 +53,7 @@ uniCloud云开发环境创建成功后,项目根目录下会有一个带有云
一个开发者可以拥有多个服务空间,每个服务空间都是一个独立的serverless云环境,不同服务空间之间的云函数、数据库、存储都是隔离的。
服务空间和手机端项目是多对多绑定关系。同账号下,一个项目可以关联到多个服务空间。一个服务空间也可以被多个项目访问。
对目录`uniCloud`点右键选择`关联云服务空间`,绑定之前创建的服务空间,或者新建一个服务空间。
对项目根目录`uniCloud`点右键选择`关联云服务空间`,绑定之前创建的服务空间,或者新建一个服务空间。
3. 创建云函数/云对象
......@@ -102,8 +66,8 @@ uniCloud云开发环境创建成功后,项目根目录下会有一个带有云
<img style="max-width:750px;" src="https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-dc-site/a18b3bb0-53d8-11eb-8ff1-d5dcf8779628.jpg"/>
</div>
创建云函数后,生成一个目录,该目录下自动生成index.js,是该云函数的入口文件,不可改名。
创建云对象后,生成一个目录,该目录下自动生成index.obj.js,是该云对象的入口文件,不可改名。
- 创建云函数后,生成一个目录,该目录下自动生成index.js,是该云函数的入口文件,不可改名。
- 创建云对象后,生成一个目录,该目录下自动生成index.obj.js,是该云对象的入口文件,不可改名。
如果该云函数/云对象还需要引入其他js,可在index.js入口文件中引用。
......@@ -128,7 +92,7 @@ module.exports = {
在项目首页,pages/index/index.vue 里,添加一个按钮,点击后执行异步方法sum。
js中import这个 helloco 对象,调用它的 sum 方法
js 中 import 这个 helloco 对象,调用它的 sum 方法
```html
<template>
......@@ -166,6 +130,8 @@ HBuilderX自带一个云函数本地运行环境,运行项目时也默认选
可以对helloco云对象点右键上传到uniCloud服务空间,然后在前端控制台右上角切换为 连接云端云函数,那么此时客户端连接的就是真正的现网uniCloud服务器了。
关于运行调试,有单独文档,[详见](rundebug.md)
7. 小结
到此为止,你已经开发了第一个 first uniCloud 项目,完成了客户端和服务器的第一次交互。
......@@ -182,18 +148,17 @@ HBuilderX自带一个云函数本地运行环境,运行项目时也默认选
如果要在cli项目中使用uniCloud,可以参考以下步骤
1. 将cli项目导入`HBuilderX`
2. 在项目根目录(src同级)创建`cloudfunctions-aliyun`或者`cloudfunctions-tcb`目录(HBuilderX 3.0以上版本请创建`uniCloud-aliyun``uniCloud-tcb`目录)
3. 打开`src/manifest.json`,在`基础配置-->uni-app应用标示`处点击`重新获取`
4. 在步骤2创建的目录右键关联服务空间
2. 如果没有appid的话,需要打开`src/manifest.json`,在`基础配置-->uni-app应用标识`处点击`重新获取`
3. 在项目根目录(src同级)点右键创建uniCloud云开发环境
4. 对uniCloud目录点右键关联服务空间
5. 完成
**注意**
- 运行与发行云函数只能使用HBuilderX的菜单,不可使用`package.json`内的命令
- 如果HBuilderX菜单运行不能满足需求可以考虑自行初始化服务空间[服务空间初始化](uniCloud/init.md)
**Tips**
- 虽然uni-app支持vscode等其他ide开发,但因为uniCloud对安全性要求极高,仅支持使用HBuilderX开发。
- 虽然uni-app支持vscode等其他ide开发,但因为uniCloud对安全性要求极高,仅支持使用HBuilderX开发
- HBuilderX 也支持 cli。[详见](https://hx.dcloud.net.cn/cli/README)
## web控制台@webcp
......
......@@ -36,13 +36,13 @@ keyword: 短信,sms
**注意**
- 如果使用uni-id发送短信,请参考[uni-id发送短信验证码](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=sendsmscode)
- 如果使用uni-id发送短信,无需自行开发,请参考[uni-id-pages](uni-id-pages.md)
#### 云函数使用短信扩展库@extension
自HBuilderX 3.4.0起,短信相关功能移至扩展库`uni-cloud-sms`内。在一段时间内无论开发者是否使用扩展库云函数都可以正常使用`uniCloud.sendSms`。预计于2022年3月初发布的HBuilderX内强制使用扩展库,即使用在此时间点后发布的HBuilderX上传云函数时如果没有指定使用`uni-cloud-sms`扩展库的云函数将无法调用uniCloud.sendSms接口。
关于扩展库的说明见:[云函数扩展库](uniCloud/cf-functions.md?id=extension)
关于扩展库的说明见:[云函数扩展库](cf-functions.md#extension)
在云函数的package.json内添加`uni-cloud-sms`的引用即可为云函数启用此扩展,无需做其他调整,完整的package.json示例如下:
......@@ -197,8 +197,8 @@ exports.main = async (event, context) => {
- data内如果有`测试``test`等字样,系统可能会被判定为测试用途,不会真正把短信下发到对应手机(此行为由运营商控制,可能真实发送,也可能不发送)
-[DCloud开发者中心](https://dev.dcloud.net.cn/uniSms)绑定`uniCloud`服务空间后,将会只允许绑定的服务空间调用此接口,绑定列表为空时表示不限制服务空间
- 短信内容不可包含★、 ※、 →、 ●等特殊符号,可能会导致短信乱码
- 如果是用于用户注册的短信验证码,那么强烈推荐使用uni-id,这是一套云端一体的、完善的用户管理方案,已经内置封装好的短信验证码功能,详见:[https://uniapp.dcloud.net.cn/uniCloud/uni-id](https://uniapp.dcloud.net.cn/uniCloud/uni-id)
- 发送短信如果需要图形验证码来防止机刷,可以使用[uni-captcha图形验证码](https://ext.dcloud.net.cn/plugin?id=4048)。在云端一体登录模板中已经集成了uni-id、uni-captcha,详见:[https://ext.dcloud.net.cn/plugin?id=13](https://ext.dcloud.net.cn/plugin?id=13)
- 如果是用于用户注册的短信验证码,那么强烈推荐使用uni-id,这是一套云端一体的、完善的用户管理方案,已经内置封装好的短信验证码功能,详见:[uni-id-pages](uni-id-pages.md)
- 发送短信如果需要图形验证码来防止机刷,可以使用[uni-captcha图形验证码](https://ext.dcloud.net.cn/plugin?id=4048)。在[uni-id-pages](uni-id-pages.md)模板中已经集成了uni-id、uni-captcha
- Android手机在App端获取短信验证码,参考:[https://ask.dcloud.net.cn/article/676](https://ask.dcloud.net.cn/article/676)
- 短信内容超过70个字符时为长短信,需分条发送,每67个字按一条短信计算
- 如果本地运行提示`不支持的模板ID`,请更新到`2.9.9+`版本的HBuilderX
......
......@@ -25,7 +25,7 @@
["cron:0 0 * * * *"]
```
**在package.json内配置定时触发时统一了腾讯阿里的写法,请参考:[云函数package.json](uniCloud/cf-functions.md?id=packagejson)**
**在package.json内配置定时触发时统一了腾讯阿里的写法,请参考:[云函数package.json](cf-functions.md#packagejson)**
**注意**
......@@ -109,7 +109,7 @@ Cron 表达式有七个**必需**字段,按空格分隔。其中,每个字
配置方式和云函数一致,请参阅上方章节
配置完成后会触发云对象导出的`_timing`方法
配置完成后会定时触发云对象内置特殊方法`_timing`
云对象代码示例:
......
......@@ -246,7 +246,7 @@ uni.navigateTo({
})
```
可以配套使用[uniIdRouter](uniCloud/uni-id.md?id=uni-id-router);当用户未登录,但访问了需强制登录的页面,或接口提示token无效或过期(响应体以TOKEN_INVALID开头)时均需要打开登录页面。你需要把以上两个路径路径定义为`loginPage`
可以配套使用[uniIdRouter](uni-id-summary.md#uni-id-router);当用户未登录,但访问了需强制登录的页面,或接口提示token无效或过期(响应体以TOKEN_INVALID开头)时均需要打开登录页面。你需要把以上两个路径路径定义为`loginPage`
# 云对象(uni-id-co)
......
本文档适用于`uni-id 4.0.0`及以上版本,需 HBuilderX 3.5.0 及以上版本。旧版本文档请访问:[uni-id 3.x.x 文档](uniCloud/uni-id-3.md)
本文档适用于`uni-id 4.0.0`及以上版本,需 HBuilderX 3.5.0 及以上版本。旧版本文档请访问:[uni-id 3.x.x 文档](uni-id-3.md)
## 需求背景
......@@ -10,7 +10,7 @@
`uni-id``uniCloud`开发者提供了开源、易用、安全、丰富、可扩展的用户管理框架。
[clientDB](uniCloud/clientDB)[DB Schema](uniCloud/schema)[uni-starter](https://ext.dcloud.net.cn/plugin?id=5057)[uni-admin](uniCloud/admin),这些产品都基于`uni-id`的账户体系。可以说`uni-id`是uniCloud不可或缺的基础能力。
[clientDB](clientDB.md)[DB Schema](schema.md)[uni-starter](https://ext.dcloud.net.cn/plugin?id=5057)[uni-admin](admin.md),这些产品都基于`uni-id`的账户体系。可以说`uni-id`是uniCloud不可或缺的基础能力。
## uni-id 的价值
......@@ -69,7 +69,7 @@
1. 云数据库的uni-id相关表
数据库是一个系统的核心,uni-id首先规范化了十几张用户相关的[opendb数据表](uniCloud/opendb)
数据库是一个系统的核心,uni-id首先规范化了十几张用户相关的[opendb数据表](opendb.md)
其中最为重要的4张opendb表,如下:
- 用户表 [uni-id-users](https://gitee.com/dcloud/opendb/blob/master/collection/uni-id-users/collection.json)
......@@ -89,13 +89,13 @@ uni-id-common公共模块包含了账户体系服务端的核心权限、token
uniCloud众多功能(如`DB Schema`的权限、uni-id-co)也都依赖 uni-id-common。
[详见](uniCloud/uni-id-common.md)
[详见](uni-id-common.md)
3. 云端[uni-config-center](/uniCloud/uni-config-center.md)下的uni-id配置
3. 云端[uni-config-center](uni-config-center.md)下的uni-id配置
`uni-id`在云端有很多配置,比如密码加密秘钥、短信和微信登录的appsecret等等。在`uni-config-center`下的`uni-id`目录下的config.json里存放着这些配置。
[详见](uniCloud/uni-id-summary.md?id=config)
[见下](#config)
4. 客户端API
uni-app框架内置了uni-id的token管理。
......@@ -103,18 +103,18 @@ uni-app框架内置了uni-id的token管理。
uni-app与uniCloud搭配且使用uni-id,登录后自动下发token、网络传输层自动传输token(uni-app 2.7.13+版本)、token临近过期会自动续期(uni-app 3.4.13 +版本),也就是说开发者无需自己管理token了。
uni-app客户端还有一批uni-id相关的内置API:
- uniIDHasRole:判断当前用户是否拥有某角色。[详情](/api/global.html#uniidhasrole)
- uniIDHasPermission:判断当前用户是否拥有某权限。[详情](/api/global.html#uniidhaspermission)
- uniCloud.getCurrentUserInfo():客户端获取当前用户信息。[详情](/uniCloud/client-sdk.html#client-getcurrentuserinfo)
- uniIDHasRole:判断当前用户是否拥有某角色。[详情](/api/global.md#uniidhasrole)
- uniIDHasPermission:判断当前用户是否拥有某权限。[详情](/api/global.md#uniidhaspermission)
- uniCloud.getCurrentUserInfo():客户端获取当前用户信息。[详情](client-sdk.md#client-getcurrentuserinfo)
5. 云端一体页面模板 [uni-id-pages](uniCloud/uni-id-pages)(含uni-id-co)
基于uni-id-common,DCloud还提供了一组完整的前端页面和后端[云对象](/uniCloud/cloud-obj.html) ,合称`uni-id-pages`
基于uni-id-common,DCloud还提供了一组完整的前端页面和后端[云对象](cloud-obj.md) ,合称`uni-id-pages`
uni-id-pages的功能包括:用户注册(含用户协议、隐私协议)、退出、修改密码、忘记密码等各种功能,同时适配PC宽屏和各种手机平台(App、H5、小程序)。
此外,DCloud的其他产品也为uni-id提供了众多支持:
- [uni-admin后台管理框架](/uniCloud/admin.html),为uni-id提供了现成的用户、角色、权限的后台管理功能,以及注册用户统计报表。
- [uni-admin后台管理框架](admin.md),为uni-id提供了现成的用户、角色、权限的后台管理功能,以及注册用户统计报表。
以上全部是开源的。
......@@ -124,25 +124,25 @@ uni-id-pages的功能包括:用户注册(含用户协议、隐私协议)
老的公共模块uni-id是一个大而全的账户管理公共模块,体积太大,不适合被其他云函数引用。比如某个业务云函数需要校验用户token,引用的uni-id公共模块还包含了忘记密码的代码,很浪费资源。
在云对象发布之前,DCloud基于云函数方式提供了uni-id-cf。但在HBuilderX 3.5 以后,推荐使用基于云对象的[uni-id-pages](uniCloud/uni-id-pages),代码更简单清晰。
在云对象发布之前,DCloud基于云函数方式提供了uni-id-cf。但在HBuilderX 3.5 以后,推荐使用基于云对象的[uni-id-pages](uni-id-pages.md),代码更简单清晰。
从HBuilder 3.5起,[uni-id](https://ext.dcloud.net.cn/plugin?id=2116)和uni-id-cf都将被淘汰,不再更新。老的公共模块uni-id被拆开,变成了[uni-id-common](uniCloud/uni-id-common)公共模块和uni-id-co云对象。
从HBuilder 3.5起,[uni-id](https://ext.dcloud.net.cn/plugin?id=2116)和uni-id-cf都将被淘汰,不再更新。老的公共模块uni-id被拆开,变成了[uni-id-common](uni-id-common.md)公共模块和uni-id-co云对象。
uni-id-common很精简,只包括token和权限,适合被所有云函数引用。
uni-id-co则是一个更加比uni-id-cf更完善和规范的用户管理的云对象。
老版升级指南,[详见](uniCloud/uni-id-pages?id=m-to-co)
老版升级指南,[详见](uni-id-pages.md#m-to-co)
## 快速上手@start
uni-id-common的插件市场地址为:[uni-id-common插件](【待定】)。但一般不需要单独下载这个插件,但更新uni-id-common公共模块时需要从这里下载更新。
uni-id-common的插件市场地址为:[uni-id-common插件](https://ext.dcloud.net.cn/plugin?id=8576)。但一般不需要单独下载这个插件,但更新uni-id-common公共模块时需要从这里下载更新。
一般推荐直接使用uni-starter项目模板来开始开发,或者在新项目里导入uni-id-pages页面模板来使用。
uni-id云端的配置是依赖[uni-config-center](/uniCloud/uni-config-center)公用模块的,在工程目录uniCloud/cloudfunctions/common/uni-config-center/uni-id/config.json。(如未安装uni-config-center需安装,如缺少目录需手动创建)
uni-id云端的配置是依赖[uni-config-center](uni-config-center.md)公用模块的,在工程目录uniCloud/cloudfunctions/common/uni-config-center/uni-id/config.json。(如未安装uni-config-center需安装,如缺少目录需手动创建)
uni-id云端同时依赖了公共模块[uni-captcha](https://ext.dcloud.net.cn/plugin?id=4048),这个功能模块负责生成和校验验证码,进行人机验证。
......@@ -154,7 +154,7 @@ uni-id云端同时依赖了公共模块[uni-captcha](https://ext.dcloud.net.cn/p
你的应用采用什么方式注册登录?比如用户名密码、手机号+短信验证码、或者微信登录。
很多登录方式涉及三方服务,需要开通[短信验证码服务](uniCloud/send-sms)、开通[App一键登录](https://uniapp.dcloud.net.cn/univerify.html)、或者向微信等申请登录的appid和appsecret信息。
很多登录方式涉及三方服务,需要开通[短信验证码服务](send-sms.md)、开通[App一键登录](univerify.md)、或者向微信等申请登录的appid和appsecret信息。
申请开通相关服务后,需要把配置信息填写在云端配置文件config.json中。
......@@ -308,8 +308,8 @@ uni-id云端会在login方法成功后自动返回token,uni-app前端框架会
## 用户角色权限@rbac
为什么需要角色权限管理?
- 企业管理系统,比如[uni-admin](/uniCloud/admin),除了超级管理员,不同账号通常需根据职位、责任设定不同的系统权限。比如部门管理员、Hr。
- [clientDB](/uniCloud/database)允许前端直接操作数据库,但部分字段应该是系统计算或管理员设置的,比如文章的阅读数、收藏数及是否加精置顶,这些字段不允许普通用户在前端通过clientDB直接修改,此时也需要通过权限控制来保证系统的安全稳定。
- 企业管理系统,比如[uni-admin](admin.md),除了超级管理员,不同账号通常需根据职位、责任设定不同的系统权限。比如部门管理员、Hr。
- [clientDB](clientdb.md)允许前端直接操作数据库,但部分字段应该是系统计算或管理员设置的,比如文章的阅读数、收藏数及是否加精置顶,这些字段不允许普通用户在前端通过clientDB直接修改,此时也需要通过权限控制来保证系统的安全稳定。
`uni-id`基于经典的RBAC模型实现了角色权限系统。
......@@ -461,7 +461,7 @@ RBAC:Role-Based Access Control,基于角色的访问控制。
### 其他说明
uni-id将用户的角色权限缓存在token内。详情参考:[缓存角色权限](uniCloud/uni-id-summary?id=cache-permission-in-token)
uni-id将用户的角色权限缓存在token内。详情参考:[缓存角色权限](#cache-permission-in-token)
如下是通过token判断权限的简单示例:
......@@ -477,11 +477,11 @@ function hasPermission(token, permission) {
}
```
注意:**在uniCloud admin中,封装了可视化的用户、权限、角色的管理,新增删除修改均支持。**无需自己维护。[详见](https://uniapp.dcloud.net.cn/uniCloud/admin?id=mutiladmin)
注意:**在uniCloud admin中,封装了可视化的用户、权限、角色的管理,新增删除修改均支持。**无需自己维护。[详见](admin.md#mutiladmin)
## uni-id数据表@db-schema
`uni-id`的所有数据表,都在[opendb](https://gitee.com/dcloud/opendb/)规范中。
`uni-id`的所有数据表,都在[opendb](opendb.md)规范中。
在unicloud [web控制台](https://unicloud.dcloud.net.cn/) 新建数据表时,可以从`uni-id`的模板分类里找到下面的表,并一键创建这些表。HBuilderX 3.4.11起新建 DB Schema 也有模板可选择。
......@@ -495,16 +495,16 @@ function hasPermission(token, permission) {
| ---------------- | --------- | ---- | ------------------------------------------- |
| \_id | Object ID | 是 | 存储文档 ID(用户 ID),系统自动生成 |
| username | String | 否 | 用户名,不允许重复 |
| password | String | 否 | 密码。加密存储 |
| password | password | 否 | 密码。加密存储 |
| nickname | String | 否 | 用户昵称 |
| gender | Integer | 否 | 用户性别:0 未知 1 男性 2 女性 |
| gender | int | 否 | 用户性别:0 未知 1 男性 2 女性 |
| role | Array | 否 | 用户角色列表,由role_id组成的数组 |
| status | Integer | 是 | 用户状态:0 正常,1 禁用,2 审核中,3 审核拒绝,4 已注销 |
| dcloud_appid | Array | 否 | 允许登录的客户端的appid列表,不同应用同时复用一个user表时适用,比如 司机端和乘客端是2个appid,在登陆时可以隔离,[详见](uniCloud/uni-id-summary?id=isolate-user)|
| status | int | 是 | 用户状态:0 正常,1 禁用,2 审核中,3 审核拒绝,4 已注销 |
| dcloud_appid | Array | 否 | 允许登录的客户端的appid列表,不同应用同时复用一个user表时适用,比如 司机端和乘客端是2个appid,在登陆时可以隔离,[见下](#isolate-user)|
| mobile | String | 否 | 手机号码 |
| mobile_confirmed | Integer | 否 | 手机号验证状态:0 未验证 1 已验证,未验证用户不可登录 |
| mobile_confirmed | int | 否 | 手机号验证状态:0 未验证 1 已验证,未验证用户不可登录 |
| email | String | 否 | 邮箱地址 |
| email_confirmed | Integer | 否 | 邮箱验证状态:0 未验证 1 已验证,未验证用户不可登录 |
| email_confirmed | int | 否 | 邮箱验证状态:0 未验证 1 已验证,未验证用户不可登录 |
| avatar | String | 否 | 头像地址 |
| wx_unionid | String | 否 | 微信unionid |
| wx_openid | Object | 否 | 微信各个平台openid。子结构详见下文 |
......@@ -525,11 +525,12 @@ function hasPermission(token, permission) {
**注意**
- 本表格只列出部分字段,完整字段[详见](https://gitee.com/dcloud/opendb/blob/master/collection/uni-id-users/collection.json)
- 最后登录时间、IP,并非只有登录操作会修改,token刷新时也会修改最后登录时间、ip。应用启动时若token有效则不会触发登录行为,也不会更新本值。
**wx_openid字段定义**
> opendb中uni-id-users表1.0.0调整为下面的结构,uni-id-co使用此标准。如何处理旧数据请参考:[自uni-id升级为uni-id-co+uni-id-common](uniCloud/uni-id-pages.md?id=m-to-co)
> opendb中uni-id-users表1.0.0调整为下面的结构,uni-id-co使用此标准。如何处理旧数据请参考:[自uni-id升级为uni-id-co+uni-id-common](uni-id-pages.md#m-to-co)
| 字段 | 类型 | 必填 | 描述 |
| ------- | ------| ---- | -------- |
......@@ -540,7 +541,7 @@ function hasPermission(token, permission) {
**qq_openid字段定义**
> opendb中uni-id-users表1.0.0调整为下面的结构,uni-id-co使用此标准。如何处理旧数据请参考:[自uni-id升级为uni-id-co+uni-id-common](uniCloud/uni-id-pages.md?id=m-to-co)
> opendb中uni-id-users表1.0.0调整为下面的结构,uni-id-co使用此标准。如何处理旧数据请参考:[自uni-id升级为uni-id-co+uni-id-common](uni-id-pages.md#m-to-co)
| 字段 | 类型 | 必填 | 描述 |
| ------- | ------| ---- | -------- |
......@@ -583,7 +584,7 @@ function hasPermission(token, permission) {
用户集合示例:
```
```json
{
"_id": "f2a60d815ee1da3900823d45541bb162",
"username": "姓名"
......@@ -606,7 +607,7 @@ function hasPermission(token, permission) {
例:项目内只使用了微信登录,不使用其他登录方式,可以只保留`wx_unionid、wx_openid.mp`这些账号相关的索引,删除其他登录方式的索引(比如username、mobile)
不了解索引请参考:[索引](/uniCloud/db-index.html)
不了解索引请参考:[索引](db-index.md)
### 验证码表
......@@ -777,8 +778,8 @@ uniIdRouter 是一个运行在前端的、对前端页面访问权限路由进
以下为登录页面跳转到之前访问页面的简单示例:
pages/login/login.vue
```html
// pages/login/login.vue
<template>
<view>
<button @click="login">login</button>
......@@ -840,8 +841,8 @@ module.exports = {
}
```
客户端add-todo.vue
```html
// 客户端add-todo.vue
<template>
<!-- 略 -->
</template>
......@@ -869,7 +870,7 @@ module.exports = {
- pages.json内有`uniIdRouter`节点上述逻辑才会生效,自HBuilderX 3.5.0起创建空项目模板会自动配置空的`uniIdRouter`节点
- uniIdRouter底层使用navigateTo、redirectTo、reLaunch、switchTab的拦截器进行页面跳转拦截,不会拦截进入首页和点击原生tabbar。
一般tabbar页面都不做自动跳转,而是在页面内再提供登录按钮。比如tabbar上有购物车或个人中心,点击购物车后在购物车页面内部会放一个提示语和按钮,告知用户需要登录。
在页面内判断用户是否登录,使用API[uniCloud.getCurrentUserInfo()](https://uniapp.dcloud.io/uniCloud/client-sdk.html#client-getcurrentuserinfo)
在页面内判断用户是否登录,使用API[uniCloud.getCurrentUserInfo()](client-sdk.md#client-getcurrentuserinfo)
## 云端错误码@errcode
......@@ -920,7 +921,7 @@ uni-id-user表中有一个数组型字段`dcloud_appid`,可以存贮这个用
uni-id 3.3.0版本起用户注册时会自动在用户表的记录内标记为注册应用对应的用户,如果没有单独授权登录其他应用的话则只能登录这个应用。即在乘客端应用注册的,默认只能在乘客端应用登录。
如何授权登录其他应用请参考:[授权、禁止用户在特定客户端应用登录](uniCloud/uni-id-summary?id=authorize-app)
如何授权登录其他应用请参考:[授权、禁止用户在特定客户端应用登录](#authorize-app)
需要注意的是客户端APPID信息是由端上传上来的,并非完全可信,尽量在入口处进行校验。例:
......@@ -960,11 +961,11 @@ exports.main = async function(event, context){
**示例**
> 数组每一项都是一个完整的配置文件,全部选项请参考:[uni-id 配置](uniCloud/uni-id-summary?id=config)
> 数组每一项都是一个完整的配置文件,全部选项请参考:[uni-id 配置](#config)
**注意:如果允许同一账号在不同端使用相同的账号+密码登录需要将不同端的passwordSecret设置成一样的**
```js
```json
[{
"dcloudAppid": "__UNI__xxxx1", // 务必替换为对应项目manifest.json内的DCloud Appid
"isDefaultConfig": true, // 默认配置标记,未匹配到dcloudAppid的情况下使用默认配置
......@@ -1112,6 +1113,3 @@ module.exports = {
```
uni-id会自动进行语言匹配,无需额外配置
......@@ -24,7 +24,7 @@ App/小程序/网站做好后,如何告知你的用户?
`uni-publish 统一发布页`具有如下特征:
- 基于 `uni-app` & `uniCloud` 实现
- 数据库设计遵循 [opendb 规范](https://gitee.com/dcloud/opendb)
- 数据库设计遵循 [opendb 规范](opendb.md)
- 管理端遵循 [uni-admin 插件规范](/uniCloud/admin),可直接导入 `Admin` 项目中
### 使用
......
......@@ -474,7 +474,7 @@ uni-starter
│ │ | | └─uni-id uni-id模块配置目录
│ │ | | ├─config.json uni-id对应的配置数据:微信登录、一键登录、短信验证码登录等key都在这里填写<a target="_blank" href="https://ext.dcloud.net.cn/plugin?id=4425">详情</a>
│ │ | | └─file.cert uni-id依赖的配置文件,假如你使用微信发红包功能,需要的证书文件就是放到这里
│ | | └───uni-id uni-id用户体系 <a target="_blank" href="https://uniapp.dcloud.io/uniCloud/uni-id">详情</a>
│ | | └───uni-id uni-id用户体系 <a target="_blank" href="https://uniapp.dcloud.io/uniCloud/uni-id-summary">详情</a>
│ | ├─uni-analyse-searchhot 云端一体搜索模板依赖的云函数 <a target="_blank" href="https://ext.dcloud.net.cn/plugin?id=3851">详情</a>
│ | └─uni-id-cf 用户中心云函数,实现用户注册、修改密码、发送验证码、快捷登录(微信、短信、账户、一键登录)
│ └──database 云数据目录
......
......@@ -148,7 +148,7 @@ const unipayIns = unipay.initAppleIapPayment({
| 参数名 | 类型 | 必填 | 默认值| 说明 | 支持平台 |
| :--------: | :----:| :--------------------------------: | :----:| :------------------------------------------------------------------------: | :----------------------:|
| openid | String|支付宝小程序、微信小程序必填,App端支付不需要| - |通过对应 [uni-id](uniCloud/uni-id.md) 接口进行获取,服务商模式应使用子商户获取的openid | 支付宝小程序、微信小程序|
| openid | String|支付宝小程序、微信小程序必填,App端支付不需要| - |通过对应 [uni-id](uni-id-summary.md) 接口进行获取,服务商模式应使用子商户获取的openid | 支付宝小程序、微信小程序|
| subject | String|支付宝支付必填,微信支付时忽略此项 | - |订单标题 | 支付宝支付 |
| body | String|微信支付必填 | - |商品描述 | 微信支付 |
| outTradeNo | String|必填 | - |商户订单号,有长度限制(微信支付为32字符以内,支付宝为64字符以内)、只能包含字母、数字、下划线;需保证在商户端不重复| |
......@@ -215,13 +215,13 @@ uniCloud.callFunction({
name: 'getOrderInfo',
success(res) {
uni.requestPayment({
// #ifdef APP
// #ifdef APP-PLUS
provider: selectedProvider, // App端此参数必填,可以通过uni.getProvider获取
// #endif
// #ifdef MP-WEIXIN
...res.result.orderInfo,
// #endif
// #ifdef APP || MP-ALIPAY
// #ifdef APP-PLUS || MP-ALIPAY
orderInfo: res.result.orderInfo,
// #endif
...res.result.orderInfo
......
......@@ -22,10 +22,10 @@ uniCloud去掉了微信云开发的一些功能,添加了更多功能。以及
|数据库查询语法 |MongoDB语法。学习门槛高、写法复杂,尤其联表查询很难用 |除了MongoDB语法外,支持JQL语法,大幅降低学习门槛,减少数据库操作的代码量,快速完成复杂查询 |
|开发工具 |微信小程序工具,编码体验欠佳 |通用编程工具HBuilderX,高效操作完善,插件体系开放 |
|前端数据库watch |支持。权限按微信账户体系执行 |暂未集成。有需求可到需求墙投票:[http://dev.dcloud.net.cn/wish/](http://dev.dcloud.net.cn/wish/)。同时有插件可用于解决聊天场景,[详见](https://ext.dcloud.net.cn/search?q=im&cat1=7) |
|opendb |无 |开放的数据库规范,众多价值,[详情](https://gitee.com/dcloud/opendb) |
|账户服务 |仅微信登录 |[uni-id](https://uniapp.dcloud.io/uniCloud/uni-id)支持应用自己的账户体系,手机号或email,内置短信验证码和app端一键登录,支持微信、支付宝等三方登录,支持权限、角色、社交裂变等众多功能 |
|opendb |无 |开放的数据库规范,众多价值,[详情](opendb.md) |
|账户服务 |仅微信登录,但鉴权更简单 |[uni-id](uni-id-summary.md)支持应用自己的账户体系,手机号或email,内置短信验证码和app端一键登录,支持微信、支付宝等三方登录,支持权限、角色、社交裂变等众多功能 |
|admin系统 |不自带 |自带开源[uniCloud admin](https://uniapp.dcloud.io/uniCloud/admin)系统,大小屏自适配,自带用户、角色、权限功能,还有更多[插件](https://ext.dcloud.net.cn/?cat1=7&cat2=74&orderBy=UpdatedDate)拿来即用 |
|支付 |仅微信支付 |[uniPay](https://uniapp.dcloud.io/uniCloud/unipay),跨端统一支付 |
|支付 |仅微信支付,但鉴权更简单 |[uniPay](https://uniapp.dcloud.io/uniCloud/unipay),跨端统一支付 |
|cms |支持。但前端部分跨端不足 |支持。前端跨端、[管理端](https://ext.dcloud.net.cn/plugin?id=3543)开源 |
|插件生态 |腾讯云开发了部分插件 |丰富的插件生态,包含腾讯云为uniCloud开发的插件,众多现成项目模块,[详情](https://ext.dcloud.net.cn/?cat1=7&orderBy=UpdatedDate) |
......@@ -41,7 +41,7 @@ uniCloud去掉了微信云开发的一些功能,添加了更多功能。以及
#### 对接微信登录
uniCloud可以使用uni-id更简单的接入微信小程序登录。参考[uni-id微信登录](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=%e5%be%ae%e4%bf%a1%e7%99%bb%e5%bd%95)
uniCloud可以使用uni-id更简单的接入微信小程序登录。参考[uni-id](uni-id-summary.md)
不同于微信云开发中的直接获取openid,uni-id提供的登录接口会在数据库的uni-id-users表内添加用户记录。
......@@ -256,4 +256,4 @@ uniCloud内也支持客户端操作数据库(下面成为clientDB),但是
- 数据校验能力,参考:[DB schema](https://uniapp.dcloud.net.cn/uniCloud/schema)
- 在数据库操作前/后执行额外操作,参考:[action](https://uniapp.dcloud.net.cn/uniCloud/clientdb?id=action)
- 更加简单的查询方式,参考:[JQL](https://uniapp.dcloud.net.cn/uniCloud/clientdb?id=jsquery)
- 更加简单的查询方式,参考:[JQL](jql.md)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册