- Web框架用rails
- 数据库用postgresql
- Json builder用Rabl
- 检索书会用到模糊查找,书库比较大时查询效率会比较低,即使加了索引效果也不太理想,故用Gin替换默认的Btree
- 借还书时涉及到修改库存,在高并发的场景下会有数据不一致的问题,故使用
with_lock锁行的方法解决高并发问题 - 关于库存问题,每次借还书系统自动添加一条租赁记录(Rental record), 之后将借还次数放写到book表中来快速判断书的库存
- users: 用户信息
- books: 书籍信息
- rental_records: 借还记录表
API接口基本路径:
https://murmuring-bayou-58304.herokuapp.com/api
POST /users
参数
| 参数名 | 类型 | 描述 | 是否必填 |
|---|---|---|---|
| name | String | 用户名 | 是 |
| String | 用户邮件 | 是 |
返回:
用户基本信息
例如
{
"id": 2,
"name": "fisherboat",
"email": "[email protected]"
}POST /users/{id}
参数
| 参数名 | 类型 | 描述 | 是否必填 |
|---|---|---|---|
| id | Ingeter | 用户ID | 是 |
返回:
用户基本所有信息
例如:
{
"id": 2,
"name": "fisherboat",
"email": "[email protected]",
"balance": 76.0,
"books": [
{
"id": 5,
"name": "No Highway",
"price": "56.0"
}
]
}GET /books
参数:
| 参数名 | 类型 | 描述 | 是否必填 |
|---|---|---|---|
| name | String | 按名称模糊搜索书 | 否 |
| page | Integer | 分页页码 | 否 |
返回:
书列表和分页信息
例如
{
"books": [
{
"id": 2,
"name": "Ruby 原理剖析",
"borrow_times": 0,
"repay_times": 0,
"price": 10.0
}
],
"pageination": {
"total_count": 3,
"total_pages": 1,
"current_page": 1,
"next_page": null,
"prev_page": null,
"is_first_page": true,
"is_last_page": true
}
}GET /books/{id}
参数:
| 参数名 | 类型 | 描述 | 是否必填 |
|---|---|---|---|
| id | Integer | 书ID | 是 |
返回:
书详细信息
例如
{
"id": 5,
"name": "No Highway",
"borrow_times": 5,
"repay_times": 4,
"stock": 20,
"price": 56.0,
"remaining_stock": 19
}GET /books/{id}/actual_income
参数:
| 参数名 | 类型 | 描述 | 是否必填 |
|---|---|---|---|
| id | Integer | 书ID | 是 |
返回:
书的实际收益
例如
{
"actual_income": 224.0
}GET /books/{id}/borrow
参数:
| 参数名 | 类型 | 描述 | 是否必填 |
|---|---|---|---|
| id | Integer | 书ID | 是 |
| user_id | Integer | 用户ID | 是 |
返回:
成功和失败的信息
成功例如
{
"message": "Borrow book success"
}GET /books/{id}/borrow
参数:
| 参数名 | 类型 | 描述 | 是否必填 |
|---|---|---|---|
| id | Integer | 书ID | 是 |
| user_id | Integer | 用户ID | 是 |
返回:
成功和失败的信息
成功例如
{
"message": "Repay book success"
}- 放回操作成功信息,示例如下:
{
"message": "Repay book success"
}- 放回具体数据,示例如下:
{
"id": 5,
"name": "No Highway",
"borrow_times": 5,
"repay_times": 4,
"stock": 20,
"price": 56.0,
"remaining_stock": 19
}- 直接返回错误信息, 示例如下:
{
"errors": "Not find record"
}- 放回错误信息和集体的字段
{
"errors": {
"book_id": "Book cannot be replied"
}
}