8.用户登录与注册

一. viewmodel意义体现和filter函数的巧妙应用我们想要在搜索页面上每一本书都显示作者/出版社/价格我们在app/view_models/book.py的BookViewModel中已经定义了self.author,self.publisher,self.price, 我们需要将他们用'/'连接起来显示。在Jinja2模版中,做这样的操作比较困难, 我们选择在app/view_mode...
摘要由CSDN通过智能技术生成

一. 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))

gift.py:

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中新增:


                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值