[TOC]
pip install -r requirements.txt
apt install nginx uwsgi mysql-server
在LostAndFound/settings.py文件中注释掉
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
在LostAndFound/settings.py文件中取消以下内容的注释
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'lostandfound',
'USER': '',
'PASSWORD': '',
'HOST': '127.0.0.1',
'PORT': '3306',
'OPTIONS': {'charset': 'utf8mb4'},
}
}
在LostAndFound/settings.py 文件夹中填写数据库的地址、用户名和密码。
设置mysql utf-8编码
输入下面的命令,打开第一个配置文件
vim /etc/mysql/conf.d/mysql.cnf
在 [mysql] 标签的下一行添加下面的配置
default-character-set=utf8
输入下面的命令,打开第二个配置文件
vim /etc/mysql/mysql.conf.d/mysqld.cnf
找到 [mysqld] 标签,在其下一行添加下面的配置
character-set-server=utf8
配置文件修改成功之后,输入下面的命令重启mysql服务
service mysql restart
重启之后再去查看数据库的默认编码方式
show variables like '%character%';
mysql> show variables like '%character%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+
创建数据库并设置数据库编码
CREATE DATABASE lostandfound DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
默认选择的是这种数据库,不需要更改
在LostAndFound/settings.py文件中注释掉
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'lostandfound',
'USER': '',
'PASSWORD': '',
'HOST': '127.0.0.1',
'PORT': '3306',
'OPTIONS': {'charset': 'utf8mb4'},
}
}
在LostAndFound/settings.py文件中取消以下内容的注释
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
在LostAndFound/settings.py文件中,设置媒体文件media/的位置、静态文件static/的位置
将models的改动同步到数据库
python manage.py makemigrations user
python manage.py makemigrations item
python manage.py migrate
运行调试(仅调试,上线请勿用此方法)
python manage.py runserver
需要Nginx,uwsgi支持
创建数据库并设置数据库编码
CREATE DATABASE lostandfound DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
在LostAndFound/settings.py 文件夹中填写数据库的用户名和密码。
python manage.py makemigrations user
python manage.py makemigrations item
python manage.py migrate
在LostAndFound/settings.py 文件夹中填写DOMAIN为服务器地址
python manage.py collectstatic
创建超级用户
python manage.py createsuperuser
访问DOMAIN/admin来管理内容
用户交互流程
注:用户的openid是所有操作的必须项
变量名 | 类型 | 变量含义 |
---|---|---|
id | int | 数据模型内部自增索引。前端无需操作。 |
openid | string | 前端获取的用户唯一标识 |
name | string | 用户姓名 |
phone | string | 用户手机号 |
cardno | string | 用户的学号 |
wxid | string | 用户微信号 |
created_at | string | 数据创建时间(所有model共有的特性) |
modified_at | string | 数据修改时间(所有model共有的特性) |
[Token账户鉴权系统][https://gogs.itoken.team/634308664/token-sso/src/master]
请前端同学先调用token账户鉴权系统,鉴权成功后再以流程验证登录。
鉴权成功后,鉴权返回的手机号、姓名、学号可以直接作为login的参数进行注册。
graph LR
H(Token鉴权) --> A[获取openid]
A --> B(loginByOpenid)
B --> C{数据库存在此openid}
C -->|是| D(缓存用户信息)
C -->|否| E[调用login注册]
E -->D
数据库是否存在openid这一过程是依靠返回值判断的。
所有正确操作的返回值都是0
login 用户登录(无状态注册)
如果没有数据库内用户的openid,则用login进行注册
url = www.example.com/service/user/login
method = post
params:
名称 | 类型 | 必须 | 备注 |
---|---|---|---|
openid | string | 是 | 可通过云函数或getOpenid获取,是每个用户的唯一凭证 |
phone | string | 是 | 手机号 |
name | string | 否 | 用户姓名 |
cardno | string | 否 | 用户的学号 |
wxid | string | 否 | (可选)用户的其他联系方式,如QQ/微信等 |
return:
{
"code": 0,
"msg": "success",
"data": {
"id": 1,
"openid": "xxxxxxxx",
"phone": "12345678912",
"name": "张三",
"cardno": "0111111111111",
"wxid": "weixin_id123",
"created_at": "2020-03-26 11:34:29",
"modified_at": "2020-03-26 11:34:35"
}
}
错误码:
code | 含义 |
---|---|
-1 | 提交的参数非法 |
-2 | 其他错误,详情见错误输出 |
getOpenid 获取用户openid
url = www.example.com/service/user/getOpenid
method = post
params:
不建议使用
名称 | 类型 | 必须 | 备注 |
---|---|---|---|
js_code | string | 是 |
**建议使用云函数: ** https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/functions/userinfo.html
loginByOpenid 通过openid登陆,获取个人信息
url = www.example.com/service/user/loginByOpenid
method = post
params:
名称 | 类型 | 必须 | 备注 |
---|---|---|---|
openid | string | 是 |
return:
{
"code": 0,
"msg": "success",
"data": {
"id": 1,
"openid": "xxxxxxxx",
"phone": "12345678912",
"name": "张三",
"cardno": "0111111111111",
"wxid": "weixin_id123",
"created_at": "2020-03-26 11:34:29",
"modified_at": "2020-03-26 11:34:35"
}
}
错误码:
code | 含义 |
---|---|
-1 | 提交的参数非法 |
-2 | 不存在此用户,此时应该调用login方法 |
get 获取用户详情
url = www.example.com/service/user/get
method = post
params:
名称 | 类型 | 必须 | 备注 |
---|---|---|---|
openid | int | 是 |
return:
{
"code": 0,
"msg": "success",
"data": {
"id": 1,
"openid": "xxxxxxxx",
"phone": "12345678912",
"name": "张三",
"cardno": "0111111111111",
"wxid": "weixin_id123",
"created_at": "2020-03-26 11:34:29",
"modified_at": "2020-03-26 11:34:35"
}
}
错误码:
code | 含义 |
---|---|
-1 | 提交的参数非法 |
-2 | 返回了多组数据(一个openid对应了多个用户) |
-3 | 其他错误,详情见错误输出 |
-4 | 用户不存在 |
update 更新用户信息
url = www.example.com/service/user/update
method = post
params:
名称 | 类型 | 必须 | 备注 |
---|---|---|---|
user_id | int | 是 | |
update | json(string) | 是 | 如果提交的是字符串格式的json程序会loads,但最好提交json格式 |
e.g.:
update={"phone":"13333333333"}
return:
{
"code": 0,
"msg": "success",
"data": []
}
错误码:
code | 含义 |
---|---|
-1 | 提交的参数非法 |
-2 | 其他错误,详情见错误输出 |
-3 | update参数提交的不是有效的json格式 |
-4 | json处理错误 |
addHistory 添加历史搜索记录
历史记录以json字符串保存在数据库中
url = www.example.com/service/user/addHistory
method = post
params:
名称 | 类型 | 必须 | 备注 |
---|---|---|---|
openid | string | 是 | |
hist | string | 是 | 添加的单条历史记录 |
return:
{
"code": 0,
"msg": "success",
"data": ['123'] //返回json格式的历史记录
}
getHistory 获取历史搜索记录
url = www.example.com/service/user/getHistory
method = post
params:
名称 | 类型 | 必须 | 备注 |
---|---|---|---|
openid | string | 是 |
return:
{
"code": 0,
"msg": "success",
"data": ['123'] //返回json格式的历史记录
}
cleanHistory 清除历史搜索记录
url = www.example.com/service/user/cleanHistory
method = post
params:
名称 | 类型 | 必须 | 备注 |
---|---|---|---|
openid | string | 是 |
return:
{
"code": 0,
"msg": "success",
"data": [] //成功清除会返回空值
}
favor 收藏
/service/user/favor
只需要两个参数:openid和id(物品的id)
收藏的物品会保存在user的favored数组中
如果用户已经收藏过,就会返回
{'code': -6, 'msg': 'ThisItemHasAlreadyBeenFavored', 'data': []}
最大收藏数是50(因为数据库限制最大字符数是160,所以稳妥起见最多保存50个id),如果超过了最大收藏数会返回
{'code': -5, 'msg': 'MaxFavoredItems', 'data': []}
如果没有以上错误,参数都正确会返回
{"code": 0, "msg": "success", "data": ["123"]}
data中是一个数组,里面保存着收藏的item的id
disfavor 取消收藏
/service/user/disfavor
也只需要两个参数:openid和id(物品的id)
在user的favored数组中移除这个id
如果用户没有收藏过这个物品,就会返回
{'code': -6, 'msg': 'ThisItemHasNotEverBeenFavored', 'data': []}
如果没有以上错误,参数都正确会返回
{"code": 0, "msg": "success", "data": []}
data中是一个数组,里面保存着收藏的item的id
listFavored 列出收藏的内容
/service/user/listFavored
只需要一个参数:openid
和getHistory方法用法相似,以数组形式返回用户的收藏的所有物品的id。
{"code": 0, "msg": "success", "data": ["123"]}
请注意!:物品在服务端的唯一标识为id。删除、恢复和更新都需要提供id来进行操作。
错误返回值和含义:
code | 含义 |
---|---|
-1 | 提供的参数非法 |
-2 | 其他错误,详见具体输出 |
变量名 | 类型 | 变量含义 |
---|---|---|
id | int | 模型内自动生成的自增索引,物品的唯一标识 |
openid | string | 发布者的openid |
status | int | 1寻找失主;2寻找此物品 |
type | string | 物品类型 |
area | int | 校区(自行定义校区对应序号,例如: 0.余区 1.东院 2.西院 3.南湖 4.鉴湖 5.升升) |
address | string | 具体地点 |
time | string | 丢失或捡到的时间 |
goods | string | 物品名称 |
descr | string | 物品描述 |
img | json_string | 物品图片 |
visible | int | 1:未找到。0:已找到。更新状态通过update操作 |
created_at | string | 数据创建时间(所有model共有的特性) |
modified_at | string | 数据修改时间(所有model共有的特性) |
user_info | json | 发布者的个人用户信息 |
name | string | 发布者留下的姓名 |
phone | string | 发布者留下的电话 |
wxid | string | 发布者留下的微信号 |
create 创建动态
url = www.example.com/service/item/create
method = post
params:
变量名 | 类型 | 必须 | 变量含义 |
---|---|---|---|
openid | string | 是 | 发布者的openid |
status | int | 是 | 1寻找失主;2寻找此物品 |
type | string | 否 | 物品类型 |
area | int | 否 | 校区(自行定义校区对应序号,例如: 0.余区 1.东院 2.西院 3.南湖 4.鉴湖 5.升升),默认为0 |
address | string | 否 | 具体地点,可以为空 |
time | string | 否 | 丢失或捡到的时间,可以为空 |
goods | string | 否 | 物品名称 |
descr | string | 否 | 物品描述,可以为空 |
img | json_string | 否 | 物品图片,可以为空 |
visible | int | 否 | 1:未找到。0:已找到。 |
name | string | 否 | 发布者留下的姓名 |
phone | string | 否 | 发布者留下的电话 |
wxid | string | 否 | 发布者留下的微信号 |
返回该物品的信息。物品信息格式化输出时中包含了发布者的信息
return:
{
"code": 0,
"msg": "success",
"data": [{
"id": 1,
"openid": "xxxxxxxx",
"goods": "XXX的校园卡",
"type": "校园卡",
"status": 1,
"area": 1,
"img": [],
"time": "2020-03-25 14:55:20",
"address": "东院教四601",
"descr": "在教室里丢失了一张校园卡",
"created_at": "2020-03-26 14:55:20",
"modified_at": "2020-03-26 14:55:28",
"visible": 1,
"name": "李四",
"phone": "12345678901",
"wxid": "wxid_123",
"user_info": {
"id": 1,
"openid": "xxxxxxxx",
"phone": "12345678912",
"name": "张三",
"cardno": "012121212121",
"wxid": "weixin_id123",
"created_at": "2020-03-26 11:34:29",
"modified_at": "2020-03-26 11:34:35"
}
}]
}
list 查询动态列表
url = www.example.com/service/item/list
method = post s
params:
按照传递的不同参数可实现不同功能。如果是广场则传status=1是列出寻找失主,status=2是列出寻找此物品。
添加page和size的原因是控制一次呈现的物品数量,以免一次性返回过多数据。前端可以用“下一页”之类功能来使page+1来达到翻页效果
变量名 | 类型 | 必须 | 变量含义 |
---|---|---|---|
openid | string | 否 | 以发布者查询 |
status | int | 否 | 1寻找失主;2寻找此物品 |
type | string | 否 | 物品类型 |
area | int | 否 | 校区(自行定义校区对应序号,例如: 0.余区 1.东院 2.西院 3.南湖 4.鉴湖 5.升升) |
address | string | 否 | 具体地点 |
time | string | 否 | 丢失或捡到的时间 |
goods | string | 否 | 物品名称 |
descr | string | 否 | 物品描述 |
page | int | 否 | 呈现第几页(默认是0,为了控制一次返回的物品数量以免爆页) |
size | int | 否 | 每页物品数量(默认是10,为了控制一次返回的物品数量以免爆页) |
img | json_string | 否 | 物品图片 |
visible | int | 否 | 1:未找到。0:已找到。 |
name | string | 否 | |
phone | string | 否 | |
wxid | string | 否 |
列表返回的物品都是以id降序排序的,也就是指按发布时间降序排序,越新越靠前
return:
{
"code": 0,
"msg": "success",
"data": {
"cnt": 2,
"items": [
{
"id": 1,
"openid": "xxxxxxxx",
"goods": "XXX的校园卡",
"type": "校园卡",
"status": 1,
"area": 1,
"img": [],
"time": "2020-03-25 14:55:20",
"address": "东院教四601",
"descr": "在教室里丢失了一张校园卡",
"created_at": "2020-03-26 14:55:20",
"modified_at": "2020-03-26 14:55:28",
"visible": 1,
"name": "李四",
"phone": "12345678901",
"wxid": "wxid_123",
"user_info": {
"id": 1,
"openid": "xxxxxxxx",
"phone": "12345678912",
"name": "张三",
"cardno": "012121212121",
"wxid": "weixin_id123",
"created_at": "2020-03-26 11:34:29",
"modified_at": "2020-03-26 11:34:35"
}
},
{
"id": 2,
"openid": "xxxxxxxx",
"goods": "XXX的校园卡",
"type": "校园卡",
"status": 2,
"area": 3,
"img": [],
"time": "2020-03-25 14:55:20",
"address": "南湖新食堂",
"descr": "在越苑食堂里捡到了一张校园卡",
"created_at": "2020-03-26 14:55:20",
"modified_at": "2020-03-26 14:55:28",
"visible": 1,
"user_info": {
"id": 1,
"openid": "xxxxxxxx",
"phone": "12345678912",
"name": "张三",
"cardno": "012121212121",
"wxid": "weixin_id123",
"created_at": "2020-03-26 11:34:29",
"modified_at": "2020-03-26 11:34:35"
}
}
]
}
}
delete 删除动态
url = www.example.com/service/item/delete
method = post
params:
名称 | 类型 | 必须 | 备注 |
---|---|---|---|
id | int | 是 | 动态id |
openid | int | 是 | 用户openid,用户只能删除自己发布的信息 |
return:
{
"code": 0,
"msg": "success",
"data": []
}
update 更新动态
url = www.example.com/service/item/update
method = post
params:
变量名 | 类型 | 必须 | 变量含义 |
---|---|---|---|
id | int | 是 | 物品id |
openid | string | 是 | 发布者的openid |
status | int | 否 | 1寻找失主;2寻找此物品 |
type | string | 否 | 物品类型 |
area | int | 否 | 校区(自行定义校区对应序号,例如: 0.余区 1.东院 2.西院 3.南湖 4.鉴湖 5.升升) |
address | string | 否 | 具体地点 |
time | string | 否 | 丢失或捡到的时间 |
goods | string | 否 | 物品名称 |
descr | string | 否 | 物品描述 |
img | json_string | 否 | 物品图片 |
visible | int | 否 | 是否可见。(用来完成删除和重新发布操作)(默认为1,即为可见) |
name | string | 否 | |
phone | string | 否 | |
wxid | string | 否 |
return:
{
"code": 0,
"msg": "success",
"data": []
}
recover 恢复动态
根据要求,此功能暂时不使用。
用于重新发布
url = www.example.com/service/item/recover
method = post
params:
名称 | 类型 | 必须 | 备注 |
---|---|---|---|
id | int | 是 | 动态id |
openid | int | 是 | 用户openid,用户只能恢复自己发布的信息 |
return:
{
"code": 0,
"msg": "success",
"data": []
}
itemImg 上传物品图片
这个接口上传的是图片文件,用来在物品描述中上传图片用。
url = www.example.com/service/upload/itemImg
method = post
params:
名称 | 类型 | 必须 | 备注 |
---|---|---|---|
img | file | 是 | 可传多个、要将input标签中的name设置为img |
return:
{
"code": 0,
"msg": "success",
"data": ["https://www.example.com/media/item/2020/3/27/011216_59730.jpg", "https://www.example.com/media/item/2020/3/27/011216_89864.jpg"]
}
code | 含义 |
---|---|
-1 | 提交的参数非法或文件不是图片 |
-2 | 其他错误,详情见错误输出 |