一. viewmodel意义体现和filter函数的巧妙应用
我们想要在搜索页面上每一本书都显示作者/出版社/价格
我们在app/view_models/book.py的BookViewModel中已经定义了self.author
,self.publisher
,self.price
, 我们需要将他们用'/'连接起来显示。在Jinja2模版中,做这样的操作比较困难, 我们选择在app/view_models/book.py的BookViewModel中实现:
class BookViewModel:
def __init__(self, book):
self.title = book['title']
self.publisher = book['publisher']
self.author = '、'.join(book['author'])
self.image = book['image']
self.price = book['price']
self.summary = book['summary']
self.pages = book['pages']
@property
def intro(self):
intros = filter(lambda x: True if x else False, [self.author, self.publisher, self.price])
# filter(func, iterable) 是比较好用的python内置函数
return '/'.join(intros)
只要在Jinja2模版中{
{ book.intro }}
就可以显示了(search_result.html 28行)
二. 书籍详情页面业务逻辑分析
详情页的业务逻辑:
可以访问网站查看逻辑:http://www.yushu.im/book/9787806579060/detail
三. 实现书籍详情页面
在鱼书搜索结果点击想看的书, 会跳转到详情页面。即book_detail视图函数对应的template页面:
app/web/book.py新增book_detail视图函数:
@web.route('/book/<isbn>/detail')
def book_detail(isbn):
yushu_book = YuShuBook()
yushu_book.search_by_isbn(isbn)
book = BookViewModel(yushu_book.books[0])
return render_template('book_detail.html', book=book, wishes=[], gifts=[])
这里yushu_book.books[0]
对于别人去调用你的代码, 可读性不好。
修改YuShuBook类, 新增first方法:
@property
def first(self):
return self.books[0] if self.total >= 1 else None
yushu_book.books[0]
改为yushu_book.first
四. 模型与模型的关系
实现在详情页中 赠送此书的 逻辑。
我们用新的模型gift
来定义要赠送的书籍, user
定义用户
我们先修改原来的models文件夹的结构:
新增app/models/base.py:
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
让book.py的db从base.py导入:
from app.models.base import db
gift.py, user.py也从base.py导入db
user.py:
from app.models.base import db
from sqlalchemy import Column, Integer, String, Boolean, Float
class User(db.Model):
id = Column(Integer, primary_key=True)
nickname = Column(String(24), nullable=False)
phone_number = Column(String(18), unique=True)
email = Column(String(50), unique=True, nullable=False)
confirmed = Column(Boolean, default=False)
beans = Column(Float, default=0)
send_counter = Column(Integer, default=0)
receive_counter = Column(Integer, default=0)
wx_open_id = Column(String(50)) # 将来开发小程序使用的
wx_name = Column(String(32))
from app.models.base import db
from sqlalchemy import Column, Integer, String, Boolean, ForeignKey
from sqlalchemy.orm import relationship
class Gift(db.model):
id = Column(Integer, primary_key=True)
launched = Column(Boolean, default=False) # 是否送出去了
user = relationship('User')
uid = Column(Integer, ForeignKey('user.id'))
isbn = Column(String(15), nullable=False)
五. 自定义基类模型
数据库存在假删除
, 在数据库模型中增加status项,来判断是否删除。而不是直接物理删除。 这样的好处是: 当我们要分析用户行为时,就能派上用场
.
在app/models/base.py中新增: