提交 a540c221 编写于 作者: d-u-a's avatar d-u-a

docs: schema clientdb-component

上级 f917f926
......@@ -20,15 +20,11 @@ DB Schema是一种基于 JSON 格式定义的数据结构的规范。
编写好schema后,您可以进一步导出表单校验规则。方法如下:
1. 点击 “导出表单校验规则”,在左侧选择要校验的字段,然后点击“下载zip”按钮,将导出一个工程源码压缩包,其中含有clientDB、uni-id等库,最重要的是cloudfunctions目录下uni-clientDB/validator/下的js文件。该文件包含了根据schema生成的校验规则。
1. 点击 “导出表单校验规则”,在左侧选择要校验的字段,然后点击“下载zip”按钮,将导出一个工程源码压缩包,其中js_sdk目录下validator/validator/下的js文件。该文件包含了根据schema生成的校验规则。
![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-uni-app-doc/38cdc790-ff2e-11ea-9dfb-6da8e309e0d8.png)
2. 解压导出的zip包,拷贝到已有工程(以后会支持直接导入到HBuilderX)
- 如果你的项目下还没有clientDB,可以把整个zip解压到工程下,然后上传云函数到服务空间。
- 如果你的项目下已经有clientDB,且版本大于等于2.0,只需要把zip里的cloudfunctions目录下`uni-clientDB/validator/`下的js文件copy到工程的对应目录下即可。
- 如果你已经自行编写过`db-permission`文件,注意不要把`db-permission`也覆盖了,如果您未编写过`db-permission`,可以覆盖过去,并打开该文件根据自己的需求进行修改。
clientDB的工程目录结构见:[详情](https://uniapp.dcloud.net.cn/uniCloud/uni-clientDB?id=structure)
注意数据校验,只有使用clientDB 2.0+,才有效。不用clientDB,在云函数中直接操作数据库无法使用该校验规则。
#### Schema字段
......@@ -48,7 +44,8 @@ clientDB的工程目录结构见:[详情](https://uniapp.dcloud.net.cn/uniClou
|description|string|描述,开发者维护时自用|
|format|'url'|'email'|数据格式|
|pattern|String|正则表达式,如设置为手机号的正则表达式后,不符合该正则表达式则校验失败|
|db-permission|Object|数据库权限,参考: [https://uniapp.dcloud.net.cn/uniCloud/uni-clientDB?id=db-permission](https://uniapp.dcloud.net.cn/uniCloud/uni-clientDB?id=db-permission)|
|validateFunction|string|扩展校验函数名|
|permission|Object|数据库权限,参考: [https://uniapp.dcloud.net.cn/uniCloud/uni-clientDB?id=db-permission](https://uniapp.dcloud.net.cn/uniCloud/uni-clientDB?id=db-permission)|
|label|string|字段标题。用于生成数据维护ui界面时,渲染表单项前面的label标题|
|defaultValue|string|Object|默认值|
|forceDefaultValue|string|Object|强制默认值,不可通过clientDB的代码修改,常用于存放用户id、时间、客户端ip等固定值。具体参考下表的defaultValue|
......@@ -59,7 +56,7 @@ clientDB的工程目录结构见:[详情](https://uniapp.dcloud.net.cn/uniClou
**注意:**
1. 数据校验,只有使用clientDB 2.0+,才有效。不用clientDB,在云函数中直接操作数据库无法使用该校验规则
2. 字段属性 `db-permission`, 仅支持 ".read", ".write"
2. 字段属性 `permission`, 仅支持 ".read", ".write"
3. 生成数据维护ui页面,该功能暂未开放。
### bsonType可用类型
......@@ -124,7 +121,7 @@ clientDB的工程目录结构见:[详情](https://uniapp.dcloud.net.cn/uniClou
```
### db-permission属性
### permission属性
数据库权限示例
......@@ -132,7 +129,7 @@ clientDB的工程目录结构见:[详情](https://uniapp.dcloud.net.cn/uniClou
{
"bsonType": "object",
"required": [],
"db-permission": {
"permission": {
".read": true, // 任何用户都可以读
".create": false, // 禁止新增数据记录(admin权限用户不受限)
".update": false, // 禁止更新数据(admin权限用户不受限)
......@@ -143,7 +140,7 @@ clientDB的工程目录结构见:[详情](https://uniapp.dcloud.net.cn/uniClou
"name": {
"bsonType": "string",
"label": "姓名",
"db-permission": {
"permission": {
".read": false, // 禁止读取 name 字段的数据(admin权限用户不受限)
".write": false // 禁止写入 name 字段的数据(admin权限用户不受限)
}
......@@ -328,6 +325,51 @@ clientDB的工程目录结构见:[详情](https://uniapp.dcloud.net.cn/uniClou
```
### validateFunction属性@validateFunction
扩展校验函数
如何使用
1. uniCloud 控制台,选择服务空间,切换到数据表
2. 底部 “扩展校验函数” 点击 “+” 增加校验函数 ![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-uni-app-doc/2f4d0230-12a2-11eb-b244-a9f5e5565f30.png)
```
// 扩展校验函数示例
exports = function (rule, value, data) {
// rule 当前规则
// value 当前规则校验数据
// data 全部校验数据
return value.length < 10
}
```
3. 在表结构 schema 编辑页面中配置需要校验的函数名称
```json
{
"bsonType": "object",
"required": ["name"],
"properties": {
"name": {
"bsonType": "string",
"label": "姓名",
"validateFunction": "name",
"errorMessage": {
"required": "{label}不能为空",
"pattern": "{label}格式无效"
}
}
}
}
```
4. 保存后生效
### errorMessage属性
clientDB的validator校验库,会根据schema配置的规范进行校验。数据不符合要求时,无法入库,此时会根据errorMessage的定义报出错误提示。
......@@ -399,7 +441,7 @@ errorMessage支持字符串,也支持json object。类型为object时,可定
{
"bsonType": "object",
"required": ["name", "nickname"],
"db-permission": {
"permission": {
".read": false,
".create": false,
".update": false,
......@@ -418,7 +460,7 @@ errorMessage支持字符串,也支持json object。类型为object时,可定
"required": "{label}必填",
"minLength": "{label}不能小于{minLength}个字符"
},
"db-permission": {
"permission": {
".read": false,
".write": false
},
......
......@@ -26,6 +26,9 @@ HBuilderX 2.9.5+ 全端支持
|field|string|查询字段,多个字段用 `,` 分割|
|where|string|查询条件,内容较多,另见文档:[详情](https://uniapp.dcloud.net.cn/uniCloud/uni-clientDB?id=jsquery)|
|orderby|string|排序字段及正序倒叙设置|
|page-current|Number|当前页|
|page-size|Number|每页数据数量|
|need-total|Number|分页模式,默认 `false`,需要分页模式时指定为 `true`|
|getone|Boolean|指定查询结果是否返回数组第一条数据,默认 false。在false情况下返回的是数组,即便只有一条结果,也需要[0]的方式获取。在true下,直接返回结果数据,少一层数组。应用场景:详情页|
|action|string|云端执行数据库查询的前或后,触发某个action函数操作,进行预处理或后处理,[详情](https://uniapp.dcloud.net.cn/uniCloud/uni-clientDB?id=%e4%ba%91%e7%ab%af%e9%83%a8%e5%88%86)。场景:前端无权操作的数据,比如阅读数+1|
|manual|Boolean|是否手动加载数据,默认为 false,页面onready时自动联网加载数据。如果设为 true,则需要自行指定时机通过方法`this.$refs.udb.loadData()`来触发联网,其中的`udb`指组件的ref值|
......@@ -63,16 +66,6 @@ HBuilderX 2.9.5+ 全端支持
```
#### pagination属性
|属性|类型|描述|
|:-|:-|:-|
|current|Number|当前页|
|size|Number|每页多少条数据|
|total|Boolean|分页模式,默认 `false`,需要分页模式时指定为 `true`|
#### 事件
load事件在查询执行后、渲染前触发,一般用于查询数据的二次加工。比如查库结果不能直接渲染时,可以在load事件里先对data进行预处理。
......@@ -120,7 +113,7 @@ this.$refs.udb.loadMore() //udb为uni-clientdb组件的ref属性值
```html
<template>
<view>
<uni-clientdb v-slot:default="{data, pagination, loading, error, options}" collection="user" field="name" :getone="true" where="id=='1'">
<uni-clientdb v-slot:default="{data, loading, error, options}" collection="user" field="name" :getone="true" where="id=='1'">
<view>
{{ data.name}}
</view>
......@@ -145,8 +138,7 @@ this.$refs.udb.loadMore() //udb为uni-clientdb组件的ref属性值
:getone="false"
:action="action"
:where="where"
:pagination="pagination" @load="onqueryload" @error="onqueryerror">
<view>{{pagination}}</view>
@load="onqueryload" @error="onqueryerror">
<view v-if="error" class="error">{{error.errMsg}}</view>
<view v-else class="list">
<view v-for="(item, index) in data" :key="index" class="list-item">
......@@ -240,12 +232,10 @@ this.$refs.udb.loadMore() //udb为uni-clientdb组件的ref属性值
<view class="content">
<uni-clientdb ref="udb" v-slot:default="{data, pagination, loading, error, options}"
:options="options"
collection="table1"
collection="unicloud-test"
orderby="createTime desc"
field="name,subType,createTime"
:getone="false"
:action="action"
:pagination="pagination" @load="onqueryload" @error="onqueryerror">
@load="onqueryload" @error="onqueryerror">
<view>{{pagination}}</view>
<view v-if="error" class="error">{{error.errMsg}}</view>
<view v-else class="list">
......@@ -255,7 +245,7 @@ this.$refs.udb.loadMore() //udb为uni-clientdb组件的ref属性值
</view>
<view class="loading" v-if="loading">加载中...</view>
<!-- 分页组件 -->
<uni-pagination show-icon :page-size="pagination.size" v-model="options.current" total="pagination.total" @change="onpagination" />
<uni-pagination show-icon :page-size="pagination.size" total="pagination.total" @change="onpagination" />
</uni-clientdb>
</view>
</template>
......@@ -265,13 +255,6 @@ this.$refs.udb.loadMore() //udb为uni-clientdb组件的ref属性值
data() {
return {
options: {}, // 插槽不能访问外面的数据,通过此参数传递, 不支持传递函数
pagination: {
current: 1,
size: 20,
total: true
},
action: '',
where: {} // 类型为对象或字符串
}
},
onPullDownRefresh() {
......@@ -286,7 +269,7 @@ this.$refs.udb.loadMore() //udb为uni-clientdb组件的ref属性值
data.forEach((item) => {
item.createTime = new Date(item.createTime).toLocaleString()
})
// 上述时间格式化仅为演示,实际开发中推荐在组件里直接使用`<uni-dataformat>`组件,不用在load事件中通过js格式化数据
// 上述时间格式化仅为演示,实际开发中推荐在组件里直接使用`<uni-dateformat>`组件,不用在load事件中通过js格式化数据
if (ended) {
// 没有更多数据了
}
......@@ -329,10 +312,43 @@ this.$refs.udb.loadMore() //udb为uni-clientdb组件的ref属性值
```
组件嵌套示例,访问父组件 data
```
<uni-clientdb ref="dataQuery" v-slot:default="{data, pagination, loading, error, options}" :options="options" collection="unicloud-test"
orderby="createTime desc" field="name,createTime"
:where="where" @load="onqueryload" @error="onqueryerror">
<view>{{pagination}}</view>
<view v-if="error" class="error">{{error.errMsg}}</view>
<view v-else class="list">
<view v-for="(item, index) in data" :key="index" class="list-item">
{{ item.name }}
{{ item.createTime }}
</view>
</view>
<view class="loading" v-if="loading">加载中...</view>
<!-- 嵌套测试 -->
<!-- :options="data",将 父组件返回的 data 通过 options 传递到组件,子组件通过 options 访问 -->
<uni-clientdb ref="dataQuery1" v-slot:default="{loading, data, error, options}" :options="data" collection="unicloud-test"
orderby="createTime desc" field="name,createTime" @load="onqueryload" @error="onqueryerror">
<view v-if="options" class="error">{{options}}</view>
<view v-if="error" class="error">{{error.errMsg}}</view>
<view v-else class="list">
<view v-for="(item, index) in data" :key="index" class="list-item">
{{ item.name }}
</view>
</view>
</uni-clientdb>
</uni-clientdb>
```
**调试小技巧**
- H5平台,开发模式下浏览器控制台输入 `unidev.clientDB.data`,可查看组件内部数据,多个组件通过索引查看 `unidev.clientDB.data[0]`
**Tips**
- 时间显示,推荐使用`<uni-data-format>`组件,可以避免在 load 事件中写代码对时间进行格式处理。
- 时间显示,推荐使用`<uni-dateformat>`组件,可以避免在 load 事件中写代码对时间进行格式处理。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册