什么是ibird,什么是Kuu?
- ibird:是我前几年在 Koa 上层封装的一个 NodeJS 快速开发框架;
- Kuu:算是ibird的下一代产品,它功能上更完整,既有前端也有后端,也更接近于我心目中对于框架的目标;虽然技术栈和语言都换了,但设计思想基本上是一样的,其中最最重要的一点就是默认接口。
什么是数据模型,什么是默认接口?
- 数据模型
是数据特征的抽象。数据(Data)是描述事物的符号记录,模型(Model)是现实世界的抽象;例如,下面是一个图书的数据模型:
Book(图书信息) {
ID(数据ID) integer
Subject(书名) string
Intro(简介) string
Class(分类) integer
Price(价格) number
InStock(是否有货) boolean
PubDate(出版日期) string
}
程序上我们一般通过表、类、结构体等方式进行描述。
- 默认接口
ibird和Kuu都会为每一个数据模型自动生成 RESTful 风格的增删改查接口(当然你可以选择只挂载部分接口,也可以在默认接口的Hooks里做切面控制),这部分接口我就把它们叫做默认接口:
查询图书:GET /api/book
新增图书:POST /api/book
修改图书:PUT /api/book
删除图书:DELETE /api/book
默认查询接口
四个默认接口中,最灵活、最强大也相对最复杂的就是查询接口,它是重中之重,基本上覆盖了大部分的查询场景,下面我们通过示例来逐个讲解。
首先使用 GET 调用接口地址,然后以 query string 的方式传递各个查询参数,如JSON字符串格式的查询条件(cond)、分页参数(page、size)、排序参数(sort)等。
- 基本查询
// 查询ID为3的数据
GET /api/book?cond={"ID":3}
// 查询ID为3且书名为“安徒生童话”的数据
GET /api/book?cond={"ID":3,"Subject":"安徒生童话"}
// 查询ID为3、书名为“安徒生童话”且有货的数据
GET /api/book?cond={"ID":3,"Subject":"安徒生童话","InStock":true}
- 模糊查询
// 查询包含书名“童话”的数据
GET /api/book?cond={"Subject":{"$regex":"童话"}}
// 查询包含书名和简介同时包含“童话”的数据
GET /api/book?cond={"Subject":{"$regex":"童话"},"Intro":{"$regex":"童话"}}
- 分页查询
// 查询包含书名“童话”的数据,并按每页20条分页
GET /api/book?cond={"Subject":{"$regex":"童话"}}&size=20
// 按每页20条分页,查询第3页的数据
GET /api/book?cond={"Subject":{"$regex":"童话"}}&size=20&page=3
- 全量查询
// 查询包含书名“童话”的所有数据
GET /api/book?cond={"Subject":{"$regex":"童话"}}&range=ALL
// 不指定任何查询条件查询所有数据
GET /api/book?range=ALL
- 排序查询
// 查询包含书名“童话”的数据,并按价格逆序
GET /api/book?cond={"Subject":{"$regex":"童话"}}&sort=-Price
// 查询包含书名“童话”的数据,并按价格升序
GET /api/book?cond={"Subject":{"$regex":"童话"}}&sort=Price
// 查询包含书名“童话”的数据,先按价格升序,价格相同时再按ID逆序
GET /api/book?cond={"Subject":{"$regex":"童话"}}&sort=Price,-ID
- 字段查询
// 只查询书名和价格字段
GET /api/book?project=Subject,Price
// 查询包含书名“童话”的数据,只查询ID和价格字段
GET /api/book?cond={"Subject":{"$regex":"童话"}}&project=ID,Price
- 等于查询
// 查询价格不等于50的数据
GET /api/book?cond={"Price":{"$ne":50}}
- 范围查询
// 查询价格大于50的数据
GET /api/book?cond={"Price":{"$gt":50}}
// 查询100以内的数据
GET /api/book?cond={"Price":{"$lt":100}}
// 查询大于等于10元,小于等于100的数据
GET /api/book?cond={"Price":{"$gte":10,"$lte":100}}
// 查询ID为10、55、29的数据
GET /api/book?cond={"ID":{"$in":[10,55,29]}}
// 查询ID不为100、78且有货的数据
GET /api/book?cond={"ID":{"$nin":[100,78]},"InStock":true}
- 逻辑查询
// 查询书名包含“童话”或包含“故事”的数据
GET /api/book?cond={"Subject":{"$or":[{"$regex":"童话"},{"$regex":"故事"}]}}
// 查询价格大于50且书名包含“童话”的数据
GET /api/book?cond={"$and":[{"Price":{"$gt":50}},{"$regex":"童话"}]}
注意事项:
- 一定要注意cond的格式为JSON字符串;
- 逻辑操作符 $or 和 $and ,可以用在根级也可以作为字段的子级;
- 目前支持的查询参数有:range、cond、sort、project、page、size,所有参数都是可选的,可以自由组合使用;
- 目前支持的操作符有:$or、$and、$gt、$gte、$lt、$lte、$ne、$regex、$in、$nin,所有操作符也可以自由组合使用。
默认新增接口
使用 POST 调用接口地址,传递由数据模型字段组成的 JSON 字符串到请求体即可。
- 单个新增:
POST /api/book
// 指定body为以下参数:
{
"Subject": "安徒生童话888888",
"Intro": "暂无简介",
"Price": 13.73,
"PubDate": "2019-08-27T06:31:20.176Z",
"InStock": true,
"Class": 300,
"Remark": "务必发顺丰"
}
- 批量新增:
POST /api/book
// 指定body为以下参数:
[
{
"Subject": "安徒生童话",
"Intro": "暂无简介",
"Price": 13.73,
"PubDate": "2019-08-27T06:31:20.176Z",
"InStock": true,
"Class": 300,
"Remark": "务必发顺丰"
},
{
"Subject": "格林童话",
"Intro": "经典童话巨制",
"Price": 55.88,
"PubDate": "2015-02-17T05:11:10.316Z",
"InStock": true,
"Class": 100,
"Remark": "暂无"
}
]
默认修改接口
使用 PUT 调用接口地址,传递由修改条件(cond)和修改字段(doc)组成的 JSON 字符串到请求体(body)即可。
- 单个修改:
PUT /api/book
// 指定body为以下参数:
// 1. cond:指定修改条件,字段格式基本同查询时的cond
// 2. doc:指定需要更新的字段
{
"cond": {
"ID": 159
},
"doc": {
"Intro": "这是修改后的简介"
}
}
- 批量修改:
PUT /api/book
// 多指定一个multi字段即可
{
"cond": {
"ID": {
"$in": [ 159, 160, 170 ]
}
},
"doc": {
"Intro": "这是修改后的简介"
},
"multi": true
}
默认删除接口
使用 DELETE 调用接口地址,与修改相似,只需传递由删除条件(cond)组成的 JSON 字符串到请求体(body)即可。
- 单个删除:
DELETE /api/book
// 指定body为以下参数:
// 1. cond:指定修改条件,字段格式基本同查询时的cond
{
"cond": {
"ID": 159
}
}
- 批量删除:
DELETE /api/book
// 多指定一个multi字段即可
{
"cond": {
"ID": {
"$in": [ 159, 160, 170 ]
}
},
"multi": true
}
- 物理删除:
DELETE /api/book
// 多指定一个unsoft字段即可
{
"cond": {
"ID": {
"$in": 159
}
},
"unsoft": true
}
// 也可与multi结合使用
{
"cond": {
"ID": {
"$in": [ 159, 160, 170 ]
}
},
"multi": true,
"unsoft": true
}
扩展阅读
目前ibird和Kuu都主要是团队内部在使用,对外并没有太多的推广,如果你对它们感兴趣,欢迎留言沟通。
https://github.com/kuuland/kuu#create-record
https://github.com/yinfxs/ibird/wiki
https://yinfxs.github.io/koa-json-rest