一、明确前后端分离和前后端不分离的概念:
我的理解:前后端不分离的概念是后端要控制前端的数据显示和模板渲染(django),它有一个缺点就是可复用性不强,也就是它的后端程序只适用于一种前端类型,比如返回的是网页模板,则它只能用于网页端,移动端要用只能重新渲染一个移动端的模板。
而前后端分离则解决了这一问题,它的可复用性极强,一个后端可对接多个类型的前端,因为它不使用模板,而是通过向前端传递json数据的方式,将页面渲染和显示数据交给前端去做。这样写出来的后端可以适用于任何类型的前端。
二、项目的数据库设计:
三、模型类设计
class BaseModel(object):
"""模型基类,为每个模型补充创建时间与更新时间"""
create_time = db.Column(db.DateTime, default=datetime.now) # 记录的创建时间
update_time = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now) # 记录的更新时间
class User(BaseModel, db.Model):
"""用户"""
__tablename__ = "ih_user_profile"
id = db.Column(db.Integer, primary_key=True) # 用户编号
name = db.Column(db.String(32), unique=True, nullable=False) # 用户暱称
password_hash = db.Column(db.String(128), nullable=False) # 加密的密码
mobile = db.Column(db.String(11), unique=True, nullable=False) # 手机号
real_name = db.Column(db.String(32)) # 真实姓名
id_card = db.Column(db.String(20)) # 身份证号
avatar_url = db.Column(db.String(128)) # 用户头像路径
houses = db.relationship("House", backref="user") # 用户发布的房屋
orders = db.relationship("Order", backref="user") # 用户下的订单
class Area(BaseModel, db.Model):
"""城区"""
__tablename__ = "ih_area_info"
id = db.Column(db.Integer, primary_key=True) # 区域编号
name = db.Column(db.String(32), nullable=False) # 区域名字
houses = db.relationship("House", backref="area") # 区域的房屋
# 房屋设施表,建立房屋与设施的多对多关系
house_facility = db.Table(
"ih_house_facility",
db.Column("house_id", db.Integer, db.ForeignKey("ih_house_info.id"), primary_key=True), # 房屋编号
db.Column("facility_id", db.Integer, db.ForeignKey("ih_facility_info.id"), primary_key=True) # 设施编号
)
class House(BaseModel, db.Model):
"""房屋信息"""
__tablename__ = "ih_house_info"
id = db.Column(db.Integer, primary_key=True) # 房屋编号
user_id = db.Column(db.Integer, db.ForeignKey("ih_user_profile.id"), nullable=False) # 房屋主人的用户编号
area_id = db.Column(db.Integer, db.ForeignKey("ih_area_info.id"), nullable=False) # 归属地的区域编号
title = db.Column(db.String(64), nullable=False) # 标题
price = db.Column(db.Integer, default=0) # 单价,单位:分
address = db.Column(db.String(512), default="") # 地址
room_count = db.Column(db.Integer, default=1) # 房间数目
acreage = db.Column(db.Integer, default=0) # 房屋面积
unit = db.Column(db.String(32), default="") # 房屋单元, 如几室几厅
capacity = db.Column(db.Integer, default=1) # 房屋容纳的人数
beds = db.Column(db.String(64), default="") # 房屋床铺的配置
deposit = db.Column(db.Integer, default=0) # 房屋押金
min_days = db.Column(db.Integer, default=1) # 最少入住天数
max_days = db.Column(db.Integer, default=0) # 最多入住天数,0表示不限制
order_count = db.Column(db.Integer, default=0) # 预订完成的该房屋的订单数
index_image_url = db.Column(db.String(256), default="") # 房屋主图片的路径
facilities = db.relationship("Facility", secondary=house_facility) # 房屋的设施
images = db.relationship("HouseImage") # 房屋的图片
orders = db.relationship("Order", backref="house") # 房屋的订单
class Facility(BaseModel, db.Model):
"""设施信息"""
__tablename__ = "ih_facility_info"
id = db.Column(db.Integer, primary_key=True) # 设施编号
name = db.Column(db.String(32), nullable=False) # 设施名字
class HouseImage(BaseModel, db.Model):
"""房屋图片"""
__tablename__ = "ih_house_image"
id = db.Column(db.Integer, primary_key=True)
house_id = db.Column(db.Integer, db.ForeignKey("ih_house_info.id"), nullable=False) # 房屋编号
url = db.Column(db.String(256), nullable=False) # 图片的路径
class Order(BaseModel, db.Model):
"""订单"""
__tablename__ = "ih_order_info"
id = db.Column(db.Integer, primary_key=True) # 订单编号
user_id = db.Column(db.Integer, db.ForeignKey("ih_user_profile.id"), nullable=False) # 下订单的用户编号
house_id = db.Column(db.Integer, db.ForeignKey("ih_house_info.id"), nullable=False) # 预订的房间编号
begin_date = db.Column(db.DateTime, nullable=False) # 预订的起始时间
end_date = db.Column(db.DateTime, nullable=False) # 预订的结束时间
days = db.Column(db.Integer, nullable=False) # 预订的总天数
house_price = db.Column(db.Integer, nullable=False) # 房屋的单价
amount = db.Column(db.Integer, nullable=False) # 订单的总金额
status = db.Column( # 订单的状态
db.Enum(
"WAIT_ACCEPT", # 待接单,
"WAIT_PAYMENT", # 待支付
"PAID", # 已支付
"WAIT_COMMENT", # 待评价
"COMPLETE", # 已完成
"CANCELED", # 已取消
"REJECTED" # 已拒单
),
default="WAIT_ACCEPT", index=True)
comment = db.Column(db.Text) # 订单的评论信息或者拒单原因
四、数据库迁移
python manage.py db init
python manage.py db migrate -m 'init tables'
五、项目架构
5.1项目的整体目录如下图所示:
5.2 ihome的目录结构:
六、项目整体架构配置:
6.1主目录下config.py文件主要是配置数据库和redis缓存
6.2 ihome目录下的__init__.py文件主要是创建app对象:
6.3主目录下的manage.py用来运行项目代码:
6.4 ihome目录下的web_html.py文件用来配置静态文件的蓝图
6.5在ihome/utils/commons.py文件中定义正则转换器: