8.2 书籍详情页面

1.业务逻辑梳理

  • 书籍详情页面,首先应该展示数据详情信息。

  • 书籍详情页面应该有加入心愿清单和赠送此书的功能

  • 书籍详情页面默认展示想要赠书次数的人,并且可以向他们索要书籍

  • 如果用户点击了赠送此书,那么他就成了一个赠书人,这个时候书籍详情页面会展示出想要这本书的人

2.编写思路

  • 书籍详情页面接受一个isbn作为参数,直接访问我们之前编写的yushu_book的search_by_isbn函数即可。这需要我们在之前的BookViewModel中加入isbn属性

  • search_by_isbn返回的原始数据不应该直接返回,而应该经过裁剪加工,这里也可以复用我们之前写的BookViewModel。

  • BookViewModel需要接受一个book对象,由于search_by_isbn只会返回只有一个对象的列表,所以我们返回结果的第一个元素即可

  • 但是yushu_book.books[0]的写法并不是很好的编程规范,我们之所以可以这么写是因为我们清楚的内部结构,但是我们写的代码不一定是给我们自己用,给被人用的时候要让被人清晰易懂,所以这里,我们在yushu_book加入一个first函数返回第一个对象。

3.实现代码

web/book.py

@web.route("/book/<isbn>/detail")
def book_detail(isbn):
    yushu_book = YuShuBook()
    yushu_book.search_by_isbn(isbn)
    book = BookViewModel(yushu_book.first)
    return render_template("book_detail.html", book=book, wishes=[], gifts=[])

spider/yushu_book.py

    @property
    def first(self):
        return self.books[0] if self.total >= 1 else None

view_models/book.py

class BookViewModel:

    def __init__(self, data):
        self.title = data['title']
        self.author = '、'.join(data['author'])
        self.binding = data['binding']
        self.publisher = data['publisher']
        self.image = data['image']
        self.price = '¥' + data['price'] if data['price'] else data['price']
        self.isbn = data['isbn']
        self.pubdate = data['pubdate']
        self.summary = data['summary']
        self.pages = data['pages']

    @property
    def intro(self):
        intros = filter(lambda x: True if x else False,
                        [self.author, self.publisher, self.price])
        return ' / '.join(intros)

Last updated