Appearance
数据模型的定义
数据模型是对数据结构的定义,可以有效地约束和规范前端页面、后端服务以及前后端交互等逻辑中的数据。可以有效地约束和规范前端页面、后端服务以及前后端交互等逻辑中的数据对象。
目的和优势
数据模型的主要目的是确保前端页面、后端服务以及前后端交互中的数据对象具有一致性、规范性和可靠性。它提供了一种定义数据模型的标准方式,使得前后端可以更好地协同工作,提高开发效率和降低维护成本。它具有以下优势:
- 易于理解和使用:开发者只需遵循相同的方式,定义、查阅和使用数据结构。
- 灵活性高:支持自定义数据类型和结构,开发者可以根据业务需求自由扩展和定制数据模型。
- 前后端通用:适用于前端页面、后端服务以及前后端交互等多种场景,实现了真正的前后端通用。
- 便于维护:一旦定义好数据模型,后续开发过程中只需遵循即可,大大减少了维护成本。
定义和结构
数据模型使用JSON格式定义数据模型,分为多属性模式和单属性模式。
多属性模式
多属性模式,每个数据模型都由若干个数据对象组成,每个数据对象包含若干个属性。属性又包含名称、类型、是否必填、默认值、校验方式、格式等信息。以下是一个简单的数据模型定义示例:
json
[
{
"name": "name",
"type": "String",
"required": true,
"default": "John Doe"
},
{
"name": "email",
"type": "String",
"required": true,
"pattern": "/^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$/",
"validationMessage": "错误的 Email 地址"
},
{
"name": "age",
"type": "Integer",
"required": false,
"default": 0
}
]
在上述示例中,我们定义了一个数据模型,其中包含"name"、"age"和"email"三个属性。每个属性都有各自的名称、类型、是否必填等信息。其中,"email"属性还定义了一个正则表达式模式,用于校验输入的电子邮件地址是否合法。
单属性模式
当数据模型只有一个属性的时候,也可以直接使用单属性模式,此时定义格式如属性定义格式,只是没有 name
属性,示例如下:
json
{
"type": "String",
"required": true,
"default": "John Doe"
}
属性类型
属性类型包括基础数据类型、对象类型和引用类型,具体定义和使用如下:
基础数据类型
基础数据类型分为 String
字符串 Integer
整数 Number
数字 Boolean
布尔类型 Date
日期 List
列表 Map
Key-value结构 等
String 字符串
json
{
"name": "name", // 属性名
"type": "String", // 类型
"required": true, // 是否必填
"pattern": "/^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$/", // 校验正则表达式
"max": 200, // 最大长度
"min": 0, // 最小长度
"validator": "", // 校验器名称,如email、phone等
"default": "" // 默认值
}
Integer 整数
json
{
"name": "name", // 属性名
"type": "Integer", // 类型
"required": true, // 是否必填
"min": 0, // 最小值
"max": 200, // 最大值
"validator": "", // 校验器名称,如email、phone等
"default": 0 // 默认值
}
Number 数字类型
json
{
"name": "name", // 属性名
"type": "Number", // 类型
"required": true, // 是否必填
"min": 0, // 最小值
"max": 2000, // 最大值
"precision": 10, // 精度
"scale": 2, // 小数位数
"validator": "", // 校验器名称,如email、phone等
"default": 0 // 默认值
}
Boolean 布尔类型
json
{
"name": "disabled", // 属性名
"type": "Boolean", // 类型
"required": true, // 是否必填
"validationMessage": "", // 校验错误后的提示信息
"default": false // 默认值
}
Date 日期
json
{
"name": "name", // 属性名
"type": "Date", // 类型
"required": true, // 是否必填
"pattern": "yyyy-MM-dd HH:mm:ss", // 日期格式
"validator": "", // 校验器名称
"default": "" // 默认值
}
List 列表
json
{
"name": "name", // 属性名
"type": "List", // 类型
"required": true, // 是否必填
"itemType": "String" // 元素类型
}
其中
itemType
可以是String
Integer
Number
Boolean
Date
以及 对象类型 或 引用的其他数据模型的名称
Map Key-Value结构
json
{
"name": "name", // 属性名
"type": "Map", // 类型
"required": true, // 是否必填
"itemType": "String" // 元素类型
}
其中
itemType
可以是String
Integer
Number
Boolean
Date
以及 对象类型 或 引用的其他数据模型的名称
对象(复合)类型
对象类型是基础类型的组合,相当于Java中的Object对象,定义如下:
json
[
{
"name": "name",
"type": "String",
"required": true,
"default": "John Doe"
},
{
"name": "email",
"type": "String",
"required": true,
"pattern": "/^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$/"
},
{
"name": "age",
"type": "Integer",
"required": false,
"default": 0
}
]
要定义一个内嵌对象类型的属性如下:
json
{
"name": "name", // 属性名
"required": true, // 是否必填
"type": [
{
"name": "name",
"type": "String",
"required": true,
"default": "John Doe"
},
{
"name": "email",
"type": "String",
"required": true,
"pattern": "/^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$/"
},
{
"name": "age",
"type": "Integer",
"required": false,
"default": 0
}
]
}
此时,type 属性 是可以内嵌定义的数据对象
模型引用
如果需要引用已经定义的数据模型作为属性类型,可以直接将属性的 type
属性,设置为模型名称,其使用方法如下:
json
[
// 属性dept为自定义类型的Department
{
"name": "dept",
"type": "Department",
"required": true
},
// 属性tags为自定义类型的Tag
{
"name": "tags",
"type": "Set",
"itemType": "Tag",
"required": true
},
// 属性actions为自定义类型的Action
{
"name": "actions",
"type": "Map",
"itemType": "Action",
"required": true
}
]
其中,Department
Tag
Action
为创建的数据模型,形成模型和模型之间的引用
综合举例
json
[ // 对象模型
{
"name": "id",
"type": "Integer", // 整型
"required": true,
"min": 0
}, {
"name": "name",
"type": "String", // 字符串
"required": true,
"max": 10,
"pattern": "\\w+"
}, {
"name": "model",
"type": [ // 内嵌对象模型
{
"name": "name",
"type": "String", // 字符串
"required": true,
"max": 10,
"pattern": "\\w+"
}, {
"name": "size",
"type": "Integer", // 整型
"required": true
}
],
"required": true
}, {
"name": "published",
"type": "Boolean", // 布尔类型
"required": true
}, {
"name": "tags",
"type": "List", // 列表
"itemType": "String",
"required": true
}, {
"name": "items",
"type": "List", // 列表
"itemType": "Item", // 自定义模型Item
"required": true
}, {
"name": "models",
"type": "Map", // Key-Value结构,类似Object类型
"itemType": "Model", // 自定义模型 Model
"required": true
}, {
"name": "subModels",
"type": "Map", // Key-Value结构,类似Object类型
"itemType": [ // 内嵌对象模型
{
"name": "name",
"type": "String", // 字符串
"required": true,
"max": 10,
"pattern": "\\w+"
}, {
"name": "published",
"type": "Boolean", // 布尔类型
"required": true
}
],
"required": true
}
]
图形化编辑器
为了方便开发者创建和编辑JSON数据模型,我们可以使用图形化编辑器。图形化编辑器将提供直观的界面和操作方式,使得开发者可以轻松地完成数据模型的创建和编辑。编辑器应该支持以下功能:
- 创建和删除数据对象和属性。
- 编辑数据对象的属性和结构。
- 查看数据模型的定义和示例。
- 模型、属性的复制和引用。
- 保存和导出数据模型。
根据模型快速配置
null
模拟数据
根据定义,可生成符合规则要求的模拟数据。
工具类
为了方便开发者解析和校验JSON数据模型,使用Java语言编写工具类 ModelUtil
。工具类提供以下功能:
- 根据模型名称,解析JSON字符串,转换为Java数据对象。
- 根据模型名称,校验数据对象的合法性。
- 根据模型名称,将数据对象序列化为JSON。
根据模型名称解析JSON字符串为Java数据对象
java
public static <T> T toObj(String jsonStr, String modelName)
根据模型名称校验Java数据对象
java
public static void validate(Object obj, String modelName)
当校验不通过时,会抛出RuntimeException异常。
根据模型名称将Java数据对象序列化成JSON字符串
java
public static String toJson(Object obj, String modelName)
根据模型名称生成包含模拟数据的JSON字符串
java
public static String mock(String modelName)