To manage books in 113
Deployment target: book.113continue.com
SSH supported
##noSQL DB model
mongodb:
- database: continue
- collections: members, books, wunbooks
members {
"_id": "member_id", // NOT NULL
"fullname": "string", // DEFAULT NULL
"password_hash": "string", // NOT NULL
"url_token": "string", // DEFAULT NULL
"avatar_path": "string", // DEFAULT NULL
"created": "string", // NOT NULL
"last_updated": "string", // NOT NULL
"contact": {
"email": "string", // NULL
"phone": "string" // NULL
// More can add here
},
"info": {
"grade": "string", // DEFAULT NULL
"gender": "string", // DEFAULT NULL
"school": "string", // DEFAULT NULL
"self_introduction": "string" // DEFAULT NULL
}
}
books {
"title": "string", // 标题
"alt": "string", // 豆瓣链接
"author": [],
"publisher": "string",
"image": "string", // 豆瓣图片链接
"tags": [],
"isdonated": "bool", // If true then set owner to "113"
"donor": [],
"pub_date": "string",
"updated_at": "string",
"created_at": "string"
}
wunbooks {
"title": "string",
"alt": "string", // 豆瓣链接
"author": [],
"publisher": "string",
"image": "string", // 豆瓣图片链接
"tags": [],
"pub_date": "string", // 出版时间
"created_at": "string",
"updated_at": "string",
"voter": ["member_id", ""],
"vote_count": "int"
}
borrowbooks {
"book": "isbn",
"user": "fullname",
"borrow_time": "ISODate Object",
"return_time": "ISODate Object",
"count": "int" //记录续借的次数,不能超过三次
}
blacklist {
"user": "fullname",
"count": "int" //记录不按时还书的次数,超过三次将不能借书
}
##RESTful API About
- Format refer to douban API
- Concept refer to - REST API Quick Tips - Principles of good RESTful API Design - RESTful API 设计指南 - 理解 RESTful 架构
##API V1 说明
- 数据返回格式统一使用 json
- API 里面的通配符, :id 代表纯数字, :name 代表由数字+字母+[-_.]这些特殊字符
- 使用 HTTP Status Code 表示状态
- 时间格式: yyyy-MM-dd HH:mm:ss, Ex."2015-02-16 01:58:00"
- HTTP Method: GET, POST, PUT, DELETE, ...
##API V1 错误 发生错误时, HTTP Status Code 为 400
错误格式:
{
"errmsg": "uri_not_found",
"errcode": 12,
"request": "GET \/v1\/book\/12345678910"
}
##API V1 返回
API返回值有两种
- 返回单个对象, 具体结构见相关接口
- 返回对象列表
请求参数
参数 | 意义 | 备注 |
---|---|---|
start | 起始元素 | |
count | 返回结果的数量 |
返回:
{
"start": 0,
"count": 10,
"total": 50,
"targets": []
}
##返回状态说明 通过 HTTP Status Code 来说明 API 请求是否成功. 下面的表格展示了可能的 HTTP Status Code 以及其含义
状态码 | 含义 | 说明 |
---|---|---|
200 | OK | 请求成功 |
201 | CREATED | 创建成功 |
202 | ACCEPTED | 更新成功 |
400 | BAD REQUEST | 请求的地址不存在或者包含不支持的参数 |
401 | UNAUTHORIZED | 未授权 |
403 | FORBIDDEN | 被禁止访问 |
404 | NOT FOUND | 请求的资源不存在 |
500 | INTERNAL SERVER ERROR | 内部错误 |
##通用的错误码
错误码 | 错误信息 | 含义 | status code |
---|---|---|---|
10 | unknow_v1_error | 未知错误 | 400 |
11 | need_permission | 需要权限 | 403 |
12 | uri_not_found | 资源不存在 | 404 |
13 | missing_args | 参数不全 | 400 |
14 | image_too_large | 上传图片太大 | 400 |
15 | has_ban_word | 输入有违禁词 | 400 |
16 | target_not_found | 相关的对象不存在 | 400 |
17 | image_unknow | 不支持的图片格式 | 400 |
18 | image_wrong_format | 照片格式有误(仅支持JPG,GIF,PNG) | 400 |
##Bookcase ####添加书籍
POST /v1/books/
参数 | 意义 | 备注 |
---|---|---|
必选 | ||
isbn | ||
可选 | ||
title | 标题 | |
alt | 豆瓣链接 | |
author | 作者 | 数组 |
image | 豆瓣图片链接 | |
tags | 数组 | |
isdonated | 该书是否被捐赠 | 如果被捐赠,就设置 owner 值为 113 |
donor | 捐赠人 | 数组 |
pub_date | 出版时间 |
返回: status=201 及 该图书的信息(单个对象)
####更新书籍信息
PUT /v1/books/
参数 | 意义 | 备注 |
---|---|---|
必选 | ||
isbn | ||
可选 | ||
title | 标题 | |
alt | 豆瓣链接 | |
author | 作者 | 数组 |
image | 豆瓣图片链接 | |
tags | 数组 | |
isdonated | 该书是否被捐赠 | 如果被捐赠,就设置 owner 值为 113 |
donor | 捐赠人 | 数组 |
pub_date | 出版时间 |
返回: status=202 及 该图书的信息(单个对象)
####删除图书
DELETE /v1/books/
返回: status=200, OK
####fields参数选择需求的指定字段
- 对于使用 GET 方式获取数据的 API, 可以通过
fields
参数指定返回数据中的信息项的字段,以减少返回数据中并不需要的部分 fields
参数的格式支持用逗号分隔字段名, 没有fields
参数或者fields
参数为all
表示不做过滤
Ex.
GET /v1/books/isbn?fields=isbn,title
返回数据:
{
"isbn": "1234567890123",
"title": "没有这本书"
}
####获取图书
GET /v1/books/
参数 | 意义 | 备注 |
---|---|---|
start | 取结果的 offset | 默认为 0 |
count | 取结果的条数 | 默认为 20, 最大 50 |
返回status=200,
{
"start": 0,
"count": 20,
"total": 50,
"books": []
}
####根据isbn获取图书信息
GET /v1/books/isbn/:name
返回图形信息,status=200
####搜索图书
GET /v1/books/s
参数 | 意义 | 备注 |
---|---|---|
q | 查询关键字 | q和tag必传其一 |
tag | 查询的tag | q和tag必传其一 |
start | 取结果的 offset | 默认 0 |
count | 去结果的条数 | 默认 20, 最大 100 |
返回: status=200,
{
"start": 0,
"count": 20,
"total": 30,
"books": []
}
##Old version API ####Edit books
method: POST
uri: /book/edit
para:
required:
isbn: string
_xsrf: string in cookie
optional:
title: 标题, string
alt: 豆瓣链接, string
author: 作者, array, []
publisher: 出版社, array
image: 豆瓣图片链接, string
tags: array, []
isdonated: true or false, if true then set owner to "113"
donor: 捐赠人, array
pub_date: 出版时间, string
return:
errmsg: ""
errcode: 成功 0 错误 1
####Get all books
method: GET
uri: /book/get
return:
[
{
"isbn": "...",
...
"created_at": "2015-02-16 00:00:00",
"updated_at": "2015-02-16 00:00:00",
...
},
...
]
####Delete book
method: GET
uri: /book/delete?isbn=isbn_code
Ex: /book/delete?isbn=9780136019299
return:
errmsg: "book_not_found"
errcode: 成功 0, 失败 1
para: required: isbn: string
####Register
method: POST
uri: /auth/register
para:
required:
member_id: string
password: string
_xrfs: string in cookie
optional:
fullname: string
return:
errcode: 1 错误 0 成功
errmsg: "no_member_id" | "no_password" | "member_existed"
####Login
method: POST
uri: /auth/login
para:
required:
member_id: 现在用学号作为用户名
password: string
_xrfs: string in cookie
return:
errcode: 0 成功 1 失败
errmsg: "para_error" | "not_found" | "login_fail"
####Logout
method: GET
uri: /auth/logout
return:
errcode: 0 成功
####Get user stat
method: GET
uri: /auth/
return:
errcode: 1 错误
errmsg: "not_login"
or
{
"member_id": "",
"fullname": "",
"created": "",
"last_updated": "",
"avatar_path": "",
"url_token": ""
}
####Get books in wunderlist - pagination
method: GET
uri: /wunderlist/get?page=int&pmax=max_books_each_page&sort=sort_method
Ex: /wunderlist/get?page=1&pmax=8&sort=updated_at
return:
{
"pages": 3,
"page": 1,
books: [
{
"isbn": "...",
"created_at": "2015-02-16 00:00:00",
"updated_at": "2015-02-16 00:00:00",
...
voter: [
{
"member_id": "20xx2323",
...
}
]
},
...
]
}
or
"no_page" | "invalid_pmax" | "no_sort" | "no_sort_field" | "illegal_request"`
####Insert book in wunder list
method: POST
uri: /wunderlist/edit
para:
required:
isbn: string
_xsrf: string in cookie
optional:
title: string,
alt: 豆瓣链接
author: array,
publisher: 出版社,
image: 豆瓣图片链接,
tags: 标签,
pub_date: 出版时间
return:
errmsg: "no_isbn",
errcode: 1
// 已购买
errcode: 1,
errmsg: "book_got"
// 已存在在清单里
errcode: 1,
errmsg: "book_exist"
// 成功
errcode 0
####Vote in wunder list
method: GET
uri: /wunderlist/vote?isbn=isbn_code
Ex: /wunderlist/vote?isbn=1234567890123
return:
// 成功
errcode: 0
or
errmsg: "no_isbn",
errcode: 1
or
errmsg: "already_vote
errcode: 1
##Updated API ####搜索图书
method: GET
uri: /book/search?qs=xxx
Ex: /book/search/?qs=Python
return:
// 该书已借
{
books: [
{
"isbn": "...",
"title": "...",
...,
"borrow_status": 1,
"borrow_user": "fullname",
"return_time": "..."
},
...
]
}
//该书未借
{
books: [
{
"isbn": "...",
"title": "...",
...,
"borrow_status": 0,
},
...
]
}
//发生错误
{
"errmsg": "no_qs",
"errcode": 1
}
####获取所借书籍
method: GET
uri: /book/borrowing?page=1 //默认为1,且每页不超过8本书
return:
{
current_page: ...,
books: [
{
"borrow_time": "...",
"return_time": "...",
"book_info": {
"isbn": "...",
...
}
},
...
]
}
####借书
notice:
借书时间期限是15天,可以续借,但是最多三次
未在期限之后1天内归还者,记入黑名单一次,超过三次将不能再借书
不能借书时,再想借书就找官加文
method: POST
uri: /book/borrowing
param:
required:
isbn: string
_xsrf: string in cookie
return:
// 成功
errcode: 0
or
errmsg: "no_isbn",
errcode: 1
####续借图书
method: PUT
uri: /book/borrowing
param:
required:
isbn: string
_xsrf: string in cookie
return:
// 成功
errcode: 0
or
errmsg: "no_isbn",
errcode: 1
or
errmsg: "out_of_number", //续借超过三次
errcode: 1
####归还图书
method: DELETE
uri: /book/borrowing
param:
required:
isbn: string
_xsrf: string in cookie
return:
// 成功
errcode: 0
or
errmsg: "no_isbn",
errcode: 1
or
超过期限1天不归还记入黑名单一次
##Python module
passlib
, pymongo
, tornado
##Server about
nginx 1.6.2 - proxy pass
supervisor - daemon
|
|--server.py