Skip to content

开发后端项目,设计好数据库表以及库表字段是在写业务代码之前就要准备好的内容。

yiapi 接口框架中,库表字段的定义都在项目的 tables 目录下进行。

库表定义示例

以下为登录日志表的配置示例:

js
export const tableName = '登录日志表';
export const tableData = {
    username: {
        name: '用户名',
        type: 'string',
        default: '',
        max: 30
    },
    nickname: {
        name: '昵称',
        type: 'string',
        default: '',
        max: 50
    },
    role: {
        name: '角色',
        type: 'string',
        default: '',
        max: 50
    },
    ip: {
        name: 'ip',
        type: 'string',
        default: '',
        max: 30
    },
    ua: {
        name: 'ua',
        type: 'string',
        default: '',
        max: 500
    }
};

按照以上格式定义好数据库字段后,执行 pnpm run syncMysql:dev,就能一键把表字段和表数据同步到 mysql 数据库中了。

注意

同步到线上数据库,使用 pnpm run syncMysql:build 命令。

picture 0

👆 同步到 mysql 中的字段属性。

picture 1

👆 同步到 mysql 中的数据列表。

库表默认字段

注意到没有,我们并没有定义 idcreated_atupdated_atdeleted_at 这 4 个字段。

但是执行同步命令后,这 4 个字段却出现在数据库中。

这是因为,yiapi 已经把这 4 个字段作为每个表都有的默认字段了,我们无需定义,定义了也不会生效。

库表定义详解

tables 目录下的每个 xx.js 文件,都是一个数据库表,不要把多个表写到同一个文件中。

每个文件需要导出 tableNametableData 两个变量,分别表示 表名称表定义

其中,表定义 必须为 json 格式,每个属性都是一个字段,每个字段都需要严格按照规范定义,只能使用以下属性和值,否则会报错,无法正常启动服务。

字段类型枚举

javascript
const fieldTypeEnum = [
    // 字符串
    'string', // 字符串
    // 文本
    'text', // 普通文本 64KB
    'mediumText', // 中文本 16MB
    'bigText', // 长文本 4GB
    // 整数
    'tinyInt', // 微整数型 255
    'smallInt', // 小整数型 65,535
    'mediumInt', // 中整数型 16,777,215
    'int', // 整型 4,294,967,295
    'bigInt', // 大整数 18,446,744,073,709,551,615
    // 小数
    'float', // 浮点型
    'double' // 双精度
];
字段名称默认值可用值说明
字段定义
type类型fieldTypeEnum可用值请看上方
name名称字段名称
isIndex是否索引falsefalse,true建议给必要的整型设置
isUnique是否唯一falsefalse,true字段值是否唯一
isUnsigned是否无符号truefalse,true默认不支持负数
precision整数精度8适用于float和double类型
scale小数精度2适用于float和double类型
default字段默认值根据类型来数据库字段的默认值
协议定义
min最小值或最小长度字符串类型最小值为 0
max最大值或最大长度字符串的max值同时也会作为字段的长度
multipleOf倍数最小值为 1
enum枚举值数组类型
pattern模式匹配正则字符串
default2验证默认值根据类型来json-schema协议的默认值

一个属性的定义,分为 字段部分协议部分

字段部分,作用于数据库的字段定义。

协议部分,作用于接口调用时的参数验证,参数验证使用的是 json-schema 的协议格式。

那么现在你再回过头去看上面的 库表定义示例 部分,是不是就一目了然了。

不同类型的定义

不同的字段类型 (type) 值,能够使用的属性也不一样。

比如,字符串类型就不能设置 isUnsignedprecisionscalemultipleOf 属性。

整数类型就不能设置 precisionscalepattern 属性。

那么字段的类型,在 yiapi 中,可以分为 四大类,分别是:

  1. 字符串
  2. 文本
  3. 整数
  4. 小数

以下是各大类别可以使用的属性列表:

字符串

部分
字段typenameisIndexisUniquedefault
协议minmaxenumpatterndefault2

文本

部分
字段typename
协议minmaxenumpattern

整数

部分
字段typenameisIndexisUniqueisUnsigneddefault
协议minmaxenummultipleOfdefault2

小数

部分
字段typenameisIndexisUniqueisUnsignedprecisionscaledefault
协议minmaxenummultipleOfdefault2

为了让我们的程序和数据尽量简单,yiapi 特意降低了字段和协议的定义自由度。

比如字段类型,就不支持 datetimestamp,请用 bigInt 存时间戳。

比如协议类型,就只支持 stringintegernumber 三种,根据我们字段的 type 不同,协议的类型也就不同。

  • 字符串文本 = string
  • 整数 = integer
  • 小数 = number

同步库表定义

配置好数据库的字段定义后,下一步就是把字段结构和定义,同步到数据库中。

执行命令 pnpm run syncMysql:dev 后,就能看到类似下图的同步结果了。

picture 0

如对本节内容还有不明白的地方,请联系笔者微信 chensuiyime

这部分内容呢,是用来做接口验证的,我们看个例子:

js
// 请求参数约束
schemaRequest: {
    type: 'object',
    properties: {
        code: fnSchema(tableData.code),
        name: fnSchema(tableData.name),
        describe: fnSchema(tableData.describe),
        menu_ids: fnSchema(tableData.menu_ids),
        api_ids: fnSchema(tableData.api_ids)
    },
    required: ['name', 'code']
}

当我们定义好字段 schema 部分的验证规则后,就可以将其用于接口的参数请求部分了。

如果从浏览器发送的参数不符合规则,则接口不会继续执行,而是返回参数错误的提示。

这样,我们就能写出更加安全,严谨的接口了。

为了尽量简单,字段的 schema 验证规则只能使用 stringintegernumber 三个类型。

  • type 类型值
  • default 默认值
  • min 最小值
  • max 最大值
  • enum 枚举值
  • pattern 模式匹配
  • multipleOf 倍数

何以解忧,唯有代码。不忘初心,方得始终。