开发后端项目,设计好数据库表以及库表字段是在写业务代码之前就要准备好的内容。
在 yiapi
接口框架中,库表字段的定义都在项目的 tables
目录下进行。
库表定义示例
以下为登录日志表的配置示例:
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
命令。
👆 同步到 mysql 中的字段属性。
👆 同步到 mysql 中的数据列表。
库表默认字段
注意到没有,我们并没有定义 id
、created_at
、updated_at
、deleted_at
这 4 个字段。
但是执行同步命令后,这 4 个字段却出现在数据库中。
这是因为,yiapi 已经把这 4 个字段作为每个表都有的默认字段了,我们无需定义,定义了也不会生效。
库表定义详解
tables
目录下的每个 xx.js
文件,都是一个数据库表,不要把多个表写到同一个文件中。
每个文件需要导出 tableName
和 tableData
两个变量,分别表示 表名称
和 表定义
。
其中,表定义
必须为 json
格式,每个属性都是一个字段,每个字段都需要严格按照规范定义,只能使用以下属性和值,否则会报错,无法正常启动服务。
字段类型枚举
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 | 是否索引 | false | false,true | 建议给必要的整型设置 |
isUnique | 是否唯一 | false | false,true | 字段值是否唯一 |
isUnsigned | 是否无符号 | true | false,true | 默认不支持负数 |
precision | 整数精度 | 8 | 无 | 适用于float和double类型 |
scale | 小数精度 | 2 | 无 | 适用于float和double类型 |
default | 字段默认值 | 根据类型来 | 无 | 数据库字段的默认值 |
协议定义 | ||||
min | 最小值或最小长度 | 无 | 无 | 字符串类型最小值为 0 |
max | 最大值或最大长度 | 无 | 无 | 字符串的max值同时也会作为字段的长度 |
multipleOf | 倍数 | 无 | 无 | 最小值为 1 |
enum | 枚举值 | 无 | 无 | 数组类型 |
pattern | 模式匹配 | 无 | 无 | 正则字符串 |
default2 | 验证默认值 | 根据类型来 | 无 | json-schema协议的默认值 |
一个属性的定义,分为 字段部分
和 协议部分
。
字段部分
,作用于数据库的字段定义。
协议部分
,作用于接口调用时的参数验证,参数验证使用的是 json-schema
的协议格式。
那么现在你再回过头去看上面的 库表定义示例
部分,是不是就一目了然了。
不同类型的定义
不同的字段类型 (type
) 值,能够使用的属性也不一样。
比如,字符串类型就不能设置 isUnsigned
,precision
,scale
和 multipleOf
属性。
整数类型就不能设置 precision
,scale
和 pattern
属性。
那么字段的类型,在 yiapi
中,可以分为 四大类
,分别是:
- 字符串
- 文本
- 整数
- 小数
以下是各大类别可以使用的属性列表:
字符串
部分 | 值 | 值 | 值 | 值 | 值 |
---|---|---|---|---|---|
字段 | type | name | isIndex | isUnique | default |
协议 | min | max | enum | pattern | default2 |
文本
部分 | 值 | 值 | 值 | 值 |
---|---|---|---|---|
字段 | type | name | ||
协议 | min | max | enum | pattern |
整数
部分 | 值 | 值 | 值 | 值 | 值 | 值 |
---|---|---|---|---|---|---|
字段 | type | name | isIndex | isUnique | isUnsigned | default |
协议 | min | max | enum | multipleOf | default2 |
小数
部分 | 值 | 值 | 值 | 值 | 值 | 值 | 值 | 值 |
---|---|---|---|---|---|---|---|---|
字段 | type | name | isIndex | isUnique | isUnsigned | precision | scale | default |
协议 | min | max | enum | multipleOf | default2 |
为了让我们的程序和数据尽量简单,yiapi 特意降低了字段和协议的定义自由度。
比如字段类型,就不支持 date
,timestamp
,请用 bigInt
存时间戳。
比如协议类型,就只支持 string
,integer
,number
三种,根据我们字段的 type
不同,协议的类型也就不同。
字符串
,文本
=string
整数
=integer
小数
=number
同步库表定义
配置好数据库的字段定义后,下一步就是把字段结构和定义,同步到数据库中。
执行命令 pnpm run syncMysql:dev
后,就能看到类似下图的同步结果了。
如对本节内容还有不明白的地方,请联系笔者微信 chensuiyime
。
这部分内容呢,是用来做接口验证的,我们看个例子:
// 请求参数约束
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 验证规则只能使用 string
、integer
和 number
三个类型。
type
类型值default
默认值min
最小值max
最大值enum
枚举值pattern
模式匹配multipleOf
倍数