Skip to content

数据模型的定义

数据模型是对数据结构的定义,可以有效地约束和规范前端页面、后端服务以及前后端交互等逻辑中的数据。可以有效地约束和规范前端页面、后端服务以及前后端交互等逻辑中的数据对象。

目的和优势

数据模型的主要目的是确保前端页面、后端服务以及前后端交互中的数据对象具有一致性、规范性和可靠性。它提供了一种定义数据模型的标准方式,使得前后端可以更好地协同工作,提高开发效率和降低维护成本。它具有以下优势:

  • 易于理解和使用:开发者只需遵循相同的方式,定义、查阅和使用数据结构。
  • 灵活性高:支持自定义数据类型和结构,开发者可以根据业务需求自由扩展和定制数据模型。
  • 前后端通用:适用于前端页面、后端服务以及前后端交互等多种场景,实现了真正的前后端通用。
  • 便于维护:一旦定义好数据模型,后续开发过程中只需遵循即可,大大减少了维护成本。

定义和结构

数据模型使用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数据模型,我们可以使用图形化编辑器。图形化编辑器将提供直观的界面和操作方式,使得开发者可以轻松地完成数据模型的创建和编辑。编辑器应该支持以下功能:

  • 创建和删除数据对象和属性。
  • 编辑数据对象的属性和结构。
  • 查看数据模型的定义和示例。
  • 模型、属性的复制和引用。
  • 保存和导出数据模型。

根据模型快速配置

模拟数据

根据定义,可生成符合规则要求的模拟数据。

工具类

为了方便开发者解析和校验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)