Flask项目
- 这次项目,是用flask框架实现一个可以显示租房信息的网站,提供了买家和卖家的入口,一个身份既可以发布房源,也可以根据入住时间,地区查找租房信息,并下订单,完成租房。
- 项目源码
接口文档
这次项目完全实现了前后端分离,所以在项目我们写了接口文档,以下是其中的一部分
"""
#这部分文档,为整个项目的文档提供一个目录功能,一般写在主项目文件夹下。
### 爱家接口文档
#### 用户模块
- [注册接口](docs/user/user_register.md)
- [登录接口](docs/user/user_login.md)
- [登出接口](docs/user/user_logout.md)
"""
"""
# 这部分是具体对某个接口具体描述,以便前端可以了解请求类型,参数,以及各种响应状态
# 文件一般写在docs文件夹下
### 注册接口
#### request请求
post /user/register/
##### params参数:
mobile str 电话
password str 密码
password2 str 确认密码
#### response响应
##### 失败响应1:
{
"code": 900,
"msg": "参数错误"
}
##### 失败响应2:
{
"code": 1002,
"msg": "手机号码已注册"
}
##### 失败响应3:
{
"code": 1003,
"msg": "两次密码不一致"
}
##### 失败响应4:
{
"code": 1001,
"msg": "手机号码不符合规则"
}
##### 成功响应:
{
"code": 200,
"msg": "请求成功"
}
"""
"""
#### 我的房源接口
#### request请求
get /house/auth_myhouse/
#### response
##### 成功响应
{
"code": 200,
"hlist_list": [
{
"address": "\u91d1\u878d\u4e2d\u5fc3",
"area": "\u91d1\u725b\u533a",
"create_time": "2018-05-24 18:48:14",
"id": 9,
"image": "/static/upload\\jinrongcheng1.jpg",
"order_count": 0,
"price": 399,
"room": 8,
"title": "\u91d1\u878d\u57ce"
}
]
}
##### params参数:
address str 地址
area str 房屋所在区域
create_time data 创建时间
id int 房屋id
image str 房屋主图片路径
order_count int 订单数
price int 单价 单位分
room int 房屋数
title str 房屋标题
"""
Status Code
- 这次项目中自定义了各种状态及其状态码,以便可以反映各种问题, 并根据不同问题做不同的处理
OK = 200
SUCCESS = {
'code': 200, 'msg': '请求成功'}
DATABASE_ERROR = {
'code': 401, 'msg': '数据库访问失败'}
PARAMS_ERROR = {
'code': 900, 'msg': '参数错误'}
# 用户模块
USER_REGISTER_PARAMS_ERROR = {
'code': 1000, 'msg': '注册信息参数错误'}
USER_REGISTER_MOBILE_ERROR = {
'code': 1001, 'msg': '手机号码不符合规则'}
USER_REGISTER_MOBILE_IS_EXSITS = {
'code': 1002, 'msg': '手机号码已存在'}
USER_REGISTER_PASSWORD_IS_ERROR = {
'code': 1003, 'msg': '两次密码不一致'}
USER_LOGIN_IS_NOT_EXSIST = {
'code': 1004, 'msg': '用户不存在'}
USER_LOGIN_PASSWORD_IS_ERROR = {
'code': 1005, 'msg': '密码错误'}
USER_UPLOAD_IMAGE_IS_ERROR = {
'code': 1006, 'msg': '上传图片格式错误'}
USER_NAME_IS_EXSIT = {
'code': 1007, 'msg': '用户名已存在'}
USER_AUTH_ID_CARD_IS_ERROR = {
'code': 1008, 'msg': '身份证格式错误'}
# 房屋模块
MYHOUSE_USER_IS_NOT_AUTH = {
'code': 2000, 'msg': '用户没有实名认证'}
MYHOUSE_UPLOAD_IMAGE_IS_ERROR = {
'code': 2001, 'msg': '上传图片格式错误'}
MYHOUSE_UPLOAD_IMAGE_IS_EXIST = {
'code': 2002, 'msg': '图片已存在'}
# 订单模块
ORDER_START_TIME_GT_END_TIME = {
'code': 3000, 'msg': '创建订单时间有误'}
Model
- 为了减少重复代码,这次为数据创建类的时候,用到了很多新的方法。
from datetime import datetime
from werkzeug.security import generate_password_hash, check_password_hash
from utils.functions import db
class BaseModel(object):
# 定义基础的模型
create_time = db.Column(db.DATETIME, default=datetime.now())
update_time = db.Column(db.DATETIME, default=datetime.now(), onupdate=datetime.now())
# 不用重复写添加和提交
def add_update(self):
db.session.add(self)
db.session.commit()
def delete(self):
db.session.delete(self)
db.session.commit()
# 多重继承
class User(BaseModel, db.Model):
__tablename__ = 'ihome_user'
id = db.Column(db.Integer, primary_key=True)
phone = db.Column(db.String(11), unique=True)
pwd_hash = db.Column(db.String(200))
name = db.Column(db.String(30), unique=True)
avatar = db.Column(db.String(100)) # 头像
id_name = db.Column(db.String(30)) # 实名认证的姓名
id_card = db.Column(db.String(18), unique=True) # 实名认证的身份证号码
houses = db.relationship('House', backref='user')
orders = db.relationship('Order', backref='user')
# 读
@property
def password(self):
return ''
# 写
# 在保存密码时直接加密
@password.setter
def password(self, pwd):
self.pwd_hash = generate_password_hash(pwd)
# 对比
def check_pwd(self, pwd):
return check_password_hash(self.pwd_hash, pwd)
# 为每个类写了一个转换为Json格式的方法,这样就不用在每次向前端传接口时,在编写额外的代码
def to_basic_dict<