相关视频
-
B站视频:ajv schema数据验证原理(1)
-
B站视频:ajv schema数据验证原理(2)
-
B站视频:表单渲染与数据验证(1)
-
B站视频:表单渲染与数据验证(2)
-
B站视频:表单渲染与数据验证(3)
验证是什么
在前后端各自为政的开发模式下,前端和后端需要单独实现各自的Form表单验证
逻辑。CabloyJS充分发挥全栈开发的优势,只需定义好JSON Schema
配置信息,就可以同时支持前端与后端的Form表单验证
逻辑。同时,还具备数据清洗
特性,根据JSON Schema
配置信息自动把表单字段
转换成后端所需的数据类型
CabloyJS的验证
机制底层采用ajv,建议您对ajv有初步的了解
定义验证信息
以模块test-party
的表单formTest
为例:
1. 定义Schema
配置formTest
的JSON Schema
,定义表单字段:userName
、password
、passwordAgain
、sex
、language
、avatar
、rememberMe
JSON Schema
中的字段定义
主要有两个用途:
- 在前端可以自动渲染
Form表单
- 在后端
验证Form表单数据
,并清洗Form表单数据
src/suite-vendor/test-party/modules/test-party/backend/src/config/validation/schemas.js
- 1schemas.formTest = {
- 2 type: 'object',
- 3 properties: {
- 4 userName: {
- 5 type: 'string',
- 6 ebType: 'text',
- 7 ebTitle: 'Username',
- 8 notEmpty: true,
- 9 'x-exists': true,
- 10 },
- 11 password: {
- 12 type: 'string',
- 13 ebType: 'text',
- 14 ebTitle: 'Password',
- 15 ebSecure: true,
- 16 notEmpty: true,
- 17 minLength: 6,
- 18 },
- 19 passwordAgain: {
- 20 type: 'string',
- 21 ebType: 'text',
- 22 ebTitle: 'Password again',
- 23 ebSecure: true,
- 24 notEmpty: true,
- 25 const: { $data: '1/password' },
- 26 },
- 27 sex: {
- 28 type: 'number',
- 29 ebType: 'select',
- 30 ebTitle: 'Sex',
- 31 ebMultiple: false,
- 32 ebOptions: [
- 33 { title: 'Male', value: 1 },
- 34 { title: 'Female', value: 2 },
- 35 ],
- 36 ebOptionsBlankAuto: true,
- 37 ebParams: {
- 38 openIn: 'page',
- 39 closeOnSelect: true,
- 40 },
- 41 notEmpty: true,
- 42 },
- 43 language: {
- 44 type: 'string',
- 45 ebType: 'select',
- 46 ebTitle: 'Language',
- 47 ebOptionsUrl: '/a/base/base/locales',
- 48 ebOptionsUrlParams: null,
- 49 ebOptionsBlankAuto: true,
- 50 'x-languages': true,
- 51 notEmpty: true,
- 52 },
- 53 avatar: {
- 54 type: 'string',
- 55 ebType: 'file',
- 56 ebTitle: 'Avatar',
- 57 ebParams: { mode: 1 },
- 58 notEmpty: true,
- 59 },
- 60 rememberMe: {
- 61 type: 'boolean',
- 62 ebType: 'toggle',
- 63 ebTitle: 'Remember me',
- 64 },
- 65 },
- 66};
名称 | 说明 |
---|---|
type | 字段类型,如string/number/boolean |
ebType | 字段渲染类型,用于标示前端渲染组件类型,如text/toggle/select |
ebTitle | 字段标题,用于前端渲染 |
notEmpty | 标示此字段是否为空 |
2. 定义validation
src/suite-vendor/test-party/modules/test-party/backend/src/meta.js
- 1validation: {
- 2 validators: {
- 3 formTest: {
- 4 schemas: 'formTest',
- 5 },
- 6 },
- 7 keywords: {
- 8 'x-languages': keywords.languages,
- 9 },
- 10 schemas: {
- 11 formTest: schemas.formTest,
- 12 },
- 13},
名称 | 说明 |
---|---|
validation.validators | 声明模块所提供的validators 清单 |
validation.keywords | 声明模块所提供的keywords 清单 |
validation.schemas | 声明模块所提供的schemas 清单 |
validator
与schema
的关系
- 一个
validator
可以对应多个schema
,但是一般场景只需提供一个schema
后端验证
模块a-validation
提供了两种验证方式:中间件
、Api
- 中间件验证
模块a-validation
提供了中间件validate
,根据路由配置的中间件参数,自动进行Form表单
的验证
和清洗
逻辑
src/suite-vendor/test-party/modules/test-party/backend/src/routes.js
- 1{ method: 'post', path: 'kitchen-sink/form-schema-validation/saveValidation',
- 2 controller: 'testKitchensinkFormSchemaValidation',
- 3 middlewares: 'validate',
- 4 meta: { validate: { validator: 'formTest' } },
- 5},
名称 | 说明 |
---|---|
middlewares: ‘validate’ | 由于validate 是局部中间件,需要显式声明 |
meta.validate | 中间件参数 |
meta.validate.module | 验证器所属模块,缺省为当前模块 |
meta.validate.validator | 需要使用的验证器名称 |
- Api验证
模块a-validation
提供了全局Bean组件validation
,便于直接通过代码进行验证
a-authsimple/backend/src/config/passport/auth.js
- 1// validate
- 2await ctx.bean.validation.validate({
- 3 module: 'a-authsimple', validator: 'signin', data: body.data
- 4});
名称 | 说明 |
---|---|
module | 验证器所属模块,缺省为当前模块 |
validator | 需要使用的验证器名称 |
data | 需要验证的Form表单数据 |
前端渲染
模块a-components
提供了一个全局vue组件eb-validate
,主要有两个用途:
- 进行Form表单渲染
- 拦截后端返回的
验证错误信息
,并进行显示
- 自动渲染
由eb-validate
根据validator
提供的schema
信息自动渲染Form表单
src/suite-vendor/test-party/modules/test-party/front/src/kitchen-sink/pages/form-schema-validation/formSchemaAuto.vue
- 1<eb-validate v-if="item" ref="validate" auto :data="item" :params="validateParams" :onPerform="onPerformValidate" @submit="onFormSubmit">
- 2</eb-validate>
名称 | 说明 |
---|---|
auto | true:自动渲染 false:自定义渲染 |
data | Form表单数据 |
params | 自动布局参数 |
params.module | 验证器所属模块,默认为当前模块 |
params.validator | 验证器名称 |
onPerform | 在这里调用后端API接口 |
submit | 响应Submit事件 |
- 当点击按钮
Save
或者响应Submit事件
时,执行eb-validate
的方法perform
,从而触发eb-validate
的onPerform
- 在
onPerform
中调用后端API接口,如果有验证错误,就会自动显示出来
- 自定义渲染
在eb-validate
内部自定义Form组件布局,这样可以有更强的针对性和灵活性
src/suite-vendor/test-party/modules/test-party/front/src/kitchen-sink/pages/form-schema-validation/formSchemaCustom.vue
- 1<eb-validate v-if="item" ref="validate" :auto="false" :data="item" :params="validateParams" :onPerform="onPerformValidate">
- 2 <eb-list form inline-labels no-hairlines-md @submit="onFormSubmit">
- 3 <eb-list-item-validate dataKey="userName"></eb-list-item-validate>
- 4 <eb-list-item-validate dataKey="password"></eb-list-item-validate>
- 5 <eb-list-item-validate dataKey="passwordAgain"></eb-list-item-validate>
- 6 <eb-list-item-validate dataKey="sex"></eb-list-item-validate>
- 7 <eb-list-item-validate dataKey="birthday"></eb-list-item-validate>
- 8 <eb-list-item-validate dataKey="language"></eb-list-item-validate>
- 9 <eb-list-item-validate dataKey="avatar"></eb-list-item-validate>
- 10 <f7-list-item v-if="item.avatar">
- 11 <img class="avatar avatar48" :src="getAvatarUrl(item.avatar,48)">
- 12 </f7-list-item>
- 13 <eb-list-item-validate dataKey="rememberMe"></eb-list-item-validate>
- 14 <eb-list-item-validate dataKey="motto"></eb-list-item-validate>
- 15 </eb-list>
- 16</eb-validate>
评论: