Skip to content

Commit

Permalink
渲染数据到html
Browse files Browse the repository at this point in the history
  • Loading branch information
xiaoe committed Dec 13, 2018
1 parent e3406bd commit d01ec82
Show file tree
Hide file tree
Showing 10 changed files with 473 additions and 9 deletions.
14 changes: 14 additions & 0 deletions fisher/.idea/webResources.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Empty file added fisher/app/static/test.css
Empty file.
10 changes: 10 additions & 0 deletions fisher/app/templates/layout.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>$Title$</title>
</head>
<body>
$END$
</body>
</html>
10 changes: 10 additions & 0 deletions fisher/app/templates/test.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>$Title$</title>
</head>
<body>
$END$
</body>
</html>
133 changes: 133 additions & 0 deletions fisher/app/web/auth.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
from flask import render_template, redirect, current_app, g
from flask import request, flash, url_for
from flask_login import login_user, login_required, logout_user, current_user
from flask_sqlalchemy import get_debug_queries

from . import web
from app.forms.auth import RegisterForm, LoginForm, ResetPasswordForm, EmailForm, \
ChangePasswordForm
from app.models.user import User
from app.models import db
from app.libs.email import send_email

__author__ = '七月'


@web.route('/register', methods=['GET', 'POST'])
def register():
form = RegisterForm(request.form)
if request.method == 'POST' and form.validate():
user = User()
user.set_attrs(form.data)
db.session.add(user)
db.session.commit()
# token = user.generate_confirmation_token()
# send_email(user.email, 'Confirm Your Account',
# 'email/confirm', user=user, token=token)
login_user(user, False)
# flash('一封激活邮件已发送至您的邮箱,请快完成验证', 'confirm')
# 由于发送的是ajax请求,所以redirect是无效的
# return render_template('index.html')
return redirect(url_for('web.index'))
return render_template('auth/register.html', form=form)


@web.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm(request.form)
if request.method == 'POST' and form.validate():
user = User.query.filter_by(email=form.email.data).first()
if user and user.check_password(form.password.data):
login_user(user, remember=True)
next = request.args.get('next')
if not next or not next.startswith('/'):
next = url_for('web.index')
return redirect(next)
else:
flash('账号不存在或密码错误', category='login_error')
return render_template('auth/login.html', form=form)


@web.route('/reset/password', methods=['GET', 'POST'])
def forget_password_request():
if request.method == 'POST':
form = EmailForm(request.form)
if form.validate():
account_email = form.email.data
user = User.query.filter_by(email=account_email).first_or_404()
send_email(form.email.data, '重置你的密码',
'email/reset_password', user=user,
token=user.generate_token())
flash('一封邮件已发送到邮箱' + account_email + ',请及时查收')
return redirect(url_for('web.login'))
return render_template('auth/forget_password_request.html')


@web.route('/reset/password/<token>', methods=['GET', 'POST'])
def forget_password(token):
if not current_user.is_anonymous:
return redirect(url_for('web.index'))
form = ResetPasswordForm(request.form)
if request.method == 'POST' and form.validate():
result = User.reset_password(token, form.password1.data)
if result:
flash('你的密码已更新,请使用新密码登录')
return redirect(url_for('web.login'))
else:
return redirect(url_for('web.index'))
return render_template('auth/forget_password.html')


@web.route('/change/password', methods=['GET', 'POST'])
@login_required
def change_password():
form = ChangePasswordForm(request.form)
if request.method == 'POST' and form.validate():
current_user.password = form.new_password1.data
db.session.commit()
flash('密码已更新成功')
return redirect(url_for('web.personal'))
return render_template('auth/change_password.html', form=form)


@web.route('/logout')
@login_required
def logout():
logout_user()
return redirect(url_for('web.index'))


@web.route('/register/confirm/<token>')
def confirm(token):
pass
# if current_user.confirmed:
# return redirect(url_for('main.index'))
# if current_user.confirm(token):
# db.session.commit()
# flash('You have confirmed your account. Thanks!')
# else:
# flash('The confirmation link is invalid or has expired.')
# return redirect(url_for('main.index'))


@web.route('/register/ajax', methods=['GET', 'POST'])
def register_ajax():
if request.method == 'GET':
return render_template('auth/register.html')
else:
form = RegisterForm()
form.validate()
user = User(form.nickname.data,
form.email.data, form.password.data)
db.session.add(user)
db.session.commit()
# token = user.generate_confirmation_token()
# send_email(user.email, 'Confirm Your Account',
# 'email/confirm', user=user, token=token)
login_user(user, False)
g.status = True
flash('一封激活邮件已发送至您的邮箱,请快完成验证', 'confirm')
# 由于发送的是ajax请求,所以redirect是无效的
return 'go to index'


129 changes: 129 additions & 0 deletions fisher/app/web/drift.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
from app.forms.book import DriftForm
from app.service.drift import DriftService
from app.libs.enums import PendingStatus
from app.models.base import db
from app.models.drift import Drift
from app.models.wish import Wish
from app.view_models.drift import DriftViewModel
from flask import render_template, flash, request, redirect, url_for, current_app
from flask_login import login_required, current_user
from sqlalchemy import or_, desc
from app import cache

from . import web
from app.models.gift import Gift

__author__ = '七月'


@web.route('/drift/<int:gid>', methods=['GET', 'POST'])
@login_required
def send_drift(gid):
# filter_by(id=gid, launched=True)没有下面这条语句好。下面的语句可以多判断一种状态
current_gift = Gift.query.get_or_404(gid)
# if current_gift.launched:
# flash('这本书正处于交易状态,暂时不可以索要')
# return redirect(url_for('web.book_detail', isbn=current_gift.isbn))
if current_gift.is_yourself_gift(current_user.id):
flash('这本书是你自己的^_^, 不能向自己索要书籍噢')
return redirect(url_for('web.book_detail', isbn=current_gift.isbn))
can = current_user.can_satisfied_wish()
if not can:
return render_template('not_enough_beans.html', beans=current_user.beans)
drift_form = DriftForm(request.form)
if request.method == 'POST':
if drift_form.validate():
DriftService.save_a_drift(drift_form, current_gift)
# flash(drift_form.errors, category='drift_form_error')
# else:
# 反范式设计,会存储一部分冗余信息。
# 1. 减少查询次数
# 2. 交易记录本身就应该是历史记录,不应该动态改变
# with db.auto_commit():
# drift = Drift()
# drift_form.populate_obj(drift)
# drift.gift_id = gid
# drift.requester_id = current_user.id
# drift.requester_nickname = current_user.nickname
# drift.gifter_nickname = current_gift.user.nickname
# drift.gifter_id = current_gift.user.id
# drift.book_title = current_gift.book.title
# drift.book_author = current_gift.book.author_str
# drift.book_img = current_gift.book.image_large
# db.session.add(drift)
# send_email(current_gift.user.email, '有人想要一本书', 'email/get_gift',
# wisher=current_user,
# gift=current_gift)
return redirect(url_for('web.pending'))
# gift = Gift.query.filter(Gift.id == gid).first_or_404()
gifter = current_gift.user.summary
return render_template('drift.html', gifter=gifter,
user_beans=current_user.beans, form=drift_form)


@web.route('/pending')
@login_required
def pending():
drifts = Drift.query.filter(
or_(Drift.requester_id == current_user.id,
Drift.gifter_id == current_user.id)).order_by(
desc(Drift.create_time)).all()
view_model = DriftViewModel.pending(drifts)
return render_template('pending.html', drifts=view_model)


@web.route('/drift/<int:did>/reject')
@login_required
def reject_drift(did):
"""
拒绝请求,只有书籍赠送者才能拒绝请求
注意需要验证超权
"""
with db.auto_commit():
drift = Drift.query.filter(Gift.uid == current_user.id,
Drift.id == did).first_or_404()
drift.pending = PendingStatus.reject
# 当收到一个请求时,书籍不会处于锁定状态, 也就是说一个礼物可以收到多个请求
# gift = Gift.query.filter_by(id=drift.gift_id, status=1).first_or_404()
# gift.launched = False
return redirect(url_for('web.pending'))


@web.route('/drift/<int:did>/redraw')
@login_required
def redraw_drift(did):
"""
撤销请求,只有书籍请求者才可以撤销请求
注意需要验证超权
"""
with db.auto_commit():
# requester_id = current_user.id 这个条件可以防止超权
# 如果不加入这个条件,那么drift_id可能被修改
drift = Drift.query.filter_by(
requester_id=current_user.id, id=did).first_or_404()
drift.pending = PendingStatus.redraw
current_user.beans += current_app.config['BEANS_EVERY_DRIFT']
# gift = Gift.query.filter_by(id=drift.gift_id).first_or_404()
# gift.launched = False
return redirect(url_for('web.pending'))


@web.route('/drift/<int:did>/mailed')
@login_required
def mailed_drift(did):
"""
确认邮寄,只有书籍赠送者才可以确认邮寄
注意需要验证超权
"""
with db.auto_commit():
# requester_id = current_user.id 这个条件可以防止超权
drift = Drift.query.filter_by(
gifter_id=current_user.id, id=did).first_or_404()
drift.pending = PendingStatus.success
current_user.beans += current_app.config['BEANS_EVERY_DRIFT']
gift = Gift.query.filter_by(id=drift.gift_id).first_or_404()
gift.launched = True
# 不查询直接更新;这一步可以异步来操作
Wish.query.filter_by(isbn=drift.isbn, uid=drift.requester_id,
launched=False).update({Wish.launched: True})
return redirect(url_for('web.pending'))
65 changes: 65 additions & 0 deletions fisher/app/web/gift.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
from app.libs.enums import PendingStatus
from app.models.drift import Drift
from flask import render_template, flash, request, redirect, url_for, current_app
from flask_login import login_required, current_user
from sqlalchemy import desc, func

from . import web
from app.spider.yushu_book import YuShuBook
from app.view_models.gift import MyGifts
from app.service.gift import GiftService

from app.models import db
from app.models.gift import Gift

__author__ = '七月'


@web.route('/my/gifts')
@login_required
def my_gifts():
uid = current_user.id
gifts = Gift.query.filter_by(uid=uid, launched=False).order_by(
desc(Gift.create_time)).all()
wishes_count = GiftService.get_wish_counts(gifts)
view_model = MyGifts(gifts, wishes_count).package()
return render_template('my_gifts.html', gifts=view_model)


@web.route('/gifts/book/<isbn>')
@login_required
def save_to_gifts(isbn):
yushu_book = YuShuBook()
yushu_book.search_by_isbn(isbn)
# gifting = Gift.query.filter_by(uid=current_user.id, isbn=isbn, status=1,
# launched=False).first()
# wishing = Wish.query.filter_by(uid=current_user.id, isbn=isbn, status=1,
# launched=False).first()
if current_user.can_save_to_list(isbn):
# 既不在赠送清单,也不在心愿清单才能添加
with db.auto_commit():
gift = Gift()
gift.uid = current_user.id
gift.isbn = isbn
# gift.book_id = yushu_book.data.id
db.session.add(gift)
current_user.beans += current_app.config['BEANS_UPLOAD_ONE_BOOK']
else:
flash('这本书已添加至你的赠送清单或已存在于你的心愿清单,请不要重复添加')
return redirect(url_for('web.book_detail', isbn=isbn))


@web.route('/gifts/<gid>/redraw')
@login_required
def redraw_from_gifts(gid):
gift = Gift.query.filter_by(id=gid, launched=False).first()
if not gift:
flash('该书籍不存在,或已经交易,删除失败')
drift = Drift.query.filter_by(gift_id=gid, pending=PendingStatus.waiting).first()
if drift:
flash('这个礼物正处于交易状态,请先前往鱼漂完成该交易')
else:
with db.auto_commit():
current_user.beans -= current_app.config['BEANS_UPLOAD_ONE_BOOK']
gift.delete()
return redirect(url_for('web.my_gifts'))
Loading

0 comments on commit d01ec82

Please sign in to comment.