-
Notifications
You must be signed in to change notification settings - Fork 10
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
xiaoe
committed
Dec 13, 2018
1 parent
e3406bd
commit d01ec82
Showing
10 changed files
with
473 additions
and
9 deletions.
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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' | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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')) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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')) |
Oops, something went wrong.