6-5 退出登录的视图函数
@home.route('/logout/')
@is_login
def logout():
session.pop('user_id', None)
session.pop('user', None)
return redirect(url_for('home.login'))
由于退出登录只跟sesson信息有关,则不必有页面实现
6-6 用户主页的视图函数
@home.route('/user/', methods=['GET', 'POST'])
@is_login
def user():
form = EditUserForm()
# 先在页面表单显示用户已经填写的信息
user = User.query.filter_by(name=session.get('user')).first()
form.username.data = user.name
form.email.data = user.email
form.phone.data = user.phone
if form.validate_on_submit():
# request.form - 获取表单填写的内容
username = request.form['username']
email = request.form['email']
phone = request.form['phone']
info = request.form['info']
# 1. 判断更改的用户名是否已经存在;
if username != user.name and \
User.query.filter_by(name=username).count():
flash("用户名%s已经存在" % (username))
return redirect(url_for('home.user'))
# 2. 判断更改的email地址是否已经存在;
if User.query.filter_by(email=email).count() and \
email != user.email:
flash("邮箱%s已经注册" % (email))
return redirect(url_for('home.user'))
# 2. 判断更改的电话号码是否已经存在;
if username != user.name and \
User.query.filter_by(phone=phone).count():
flash("电话%s已经注册" % (phone))
return redirect(url_for('home.user'))
# 保存更改的信息到数据库中;(难点: 存储用户头像)
# *****存储用户的头像;
file_save_path = app.config['FC_DIR']
if not os.path.exists(file_save_path):
os.makedirs(file_save_path)
# 判断是否上传了新的头像;
if form.face.data:
# 判断之前是否已经有用户头像, 如果有, 则删除;
if user.face and os.path.exists(os.path.join(file_save_path, user.face)):
os.remove(os.path.join(file_save_path, user.face)) # 删除旧头像
# 保存新的头像, 获取用户头像文件的文件名
face_name = form.face.data.filename
face_name = change_filename(face_name)
# 保存新的头像文件
form.face.data.save(os.path.join(file_save_path, face_name))
user.face = face_name
user.name = username
user.email = email
user.phone = phone
user.info = info
db.session.add(user)
db.session.commit()
flash("修改会员信息成功")
# ******修改用户信息, 如果修改的是用户名, 一定要登录出, 再重新登录。
if username != session.get('user'):
logout()
# 如果用户名没有修改,则不必退出
return render_template('home/user.html',
form=form)
页面实现的user.html
{% extends 'home/base.html' %}
{% import 'bootstrap/wtf.html' as wtf %}
{% block title %}
用户中心
{% endblock %}
{% block scripts %}
{{ super() }}
<script>
$(document).ready(function () {
$("#md-1").addClass('active');
});
</script>
{% endblock %}
{% block content %}
<div class="container-fluid">
{# 左侧菜单栏 #}
{% include 'home/usermenu.html' %}
{# 右侧用户中心 #}
<div class="col-lg-9">
{# 面板中心 #}
<div class="panel panel-warning">
{# 面板头部 #}
<div class="panel-heading">
<h3 class="panel-title"><span class="glyphicon glyphicon-map-marker"></span> 会员中心</h3>
</div>
{# 面板主体 #}
<div class="panel-body">
{{ wtf.quick_form(form) }}
</div>
</div>
</div>
</div>
{% endblock %}
若不更改用户名:
若更改用户名,则退出登录:
6-7 修改密码的视图函数
@home.route('/pwd/', methods=['GET', 'POST'])
def pwd():
form = PwdForm()
if form.validate_on_submit():
# 获取当前登录用户的密码
user = User.query.filter_by(name=session.get('user')).first()
# 判断用户的旧密码是否正确
if user.verify_password(form.old_pwd.data):
#数据库里面的是password,需加密存入
user.password = generate_password_hash(form.new_pwd.data)
db.session.add(user)
db.session.commit()
flash("密码更新成功")
else:
flash("旧密码错误, 请重新输入")
return redirect(url_for('home.pwd'))
return render_template('home/pwd.html', form=form)
页面实现的pwd.html
{% extends 'home/base.html' %}
{% import 'bootstrap/wtf.html' as wtf %}
{% block title %}
修改密码
{% endblock %}
{% block scripts %}
{{ super() }}
<script>
$(document).ready(function () {
$("#md-2").addClass('active');
});
</script>
{% endblock %}
{% block content %}
<div class="container-fluid">
{# 左侧菜单栏 #}
{% include 'home/usermenu.html' %}
{# 右侧用户中心 #}
<div class="col-lg-9">
{# 面板中心 #}
<div class="panel panel-warning">
{# 面板头部 #}
<div class="panel-heading">
<h3 class="panel-title">
<span class="glyphicon glyphicon-lock"></span> 修改密码
</h3>
</div>
{# 面板主体 #}
<div class="panel-body">
{{ wtf.quick_form(form) }}
</div>
</div>
</div>
</div>
{% endblock %}
6-8 个人评论页面的视图函数
@home.route('/comments/')
@home.route('/comments/<int:page>/')
def comments(page=1):
# 只能查看自己的所有电影评论信息
commentsPageObj = Comment.query.filter_by(user_id=session.get('user_id')
).paginate(page, per_page=app.config['PER_PAGE'])
return render_template('home/comments.html',
commentsPageObj=commentsPageObj)
页面实现的comments.html
{% extends 'home/base.html' %}
{#
参考代码:
bootstrap媒体对象: https://v3.bootcss.com/components/#panels
bootstrap面板对象: https://v3.bootcss.com/components/#panels-heading
#}
{% block scripts %}
{{ super() }}
<script>
$(document).ready(function () {
$("#md-3").addClass('active');
});
</script>
{% endblock %}
{% block content %}
<div class="container-fluid">
{% include 'home/usermenu.html' %}
<div class="col-md-9">
<div class="panel panel-warning">
<div class="panel-heading">
<h3 class="panel-title">
<span class="glyphicon glyphicon-map-marker"></span>
评论记录</h3>
</div>
<div class="panel-body">
{% for i in range(10) %}
<ul class="media-list">
<li class="media">
<div class="media-right">
<a href="#">
<img class="media-object"
src="/static/upload/userFaceImg/20190323_11270930ca91ef76c6a7ef6e9494def1faaf51f1de66f7.jpg"
alt="..."
style="width: 60px; height: 60px">
</a>
</div>
<div class="media-body">
<div class="panel panel-default">
<div class="panel-heading">
westos评论xxxx电影于2019-10-12 23:00:00
</div>
<div class="panel-body">
评论的内容
</div>
</div>
</li>
</ul>
{% endfor %}
<div class="col-md-12 text-center">
<nav aria-label="Page navigation">
<ul class="pagination">
<li>
<a href="#" aria-label="First">
<span aria-hidden="true">首页</span>
</a>
</li>
<li>
<a href="#" aria-label="Previous">
<span aria-hidden="true">上一页</span>
</a>
</li>
<li><a href="#">1 / 10</a></li>
<li>
<a href="#" aria-label="Next">
<span aria-hidden="true">下一页</span>
</a>
</li>
<li>
<a href="#" aria-label="Last">
<span aria-hidden="true">尾页</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
</div>
</div>
{% endblock %}
6-9 个人登录日志的视图函数
@home.route('/userlog/')
@home.route('/userlog/<int:page>/')
def userlog(page=1):
# 只能查看自己的登录日志
userlogsPageObj = Userlog.query.filter_by(user_id=session.get('user_id')
).paginate(page, per_page=app.config['PER_PAGE'])
return render_template('home/userlog.html',
userlogsPageObj=userlogsPageObj)
实现页面的userlog.html
{% extends 'home/base.html' %}
{% block title %}
登录日志
{% endblock %}
{% block scripts %}
{{ super() }}
<script>
$(document).ready(function () {
$("#md-4").addClass('active');
});
</script>
{% endblock %}
{% block content %}
{% include 'home/usermenu.html' %}
<div class="col-lg-9">
<div class="panel panel-warning">
<div class="panel-heading">
<h3 class="panel-title"><span class="glyphicon glyphicon-map-marker"></span> 登录日志</h3>
</div>
<div class="panel-body">
<table class="table table-hover">
<tr class="info">
<th>编号</th>
<th>登录时间</th>
<th>登录IP</th>
</tr>
{% for userlog in userlogsPageObj.items %}
<tr>
<td>{{ userlog.id }}</td>
<td>{{ userlog.addtime }}</td>
<td>{{ userlog.ip }}</td>
</tr>
{% endfor %}
</table>
</div>
</div>
</div>
{% endblock %}
6-10 个人电影收藏查看的视图函数
@home.route('/moviecollect/')
@home.route('/moviecollect/<int:page>/')
def moviecollect(page=1):
# 只能查看自己的电影收藏
moviecollectsPageObj = MovieCollect.query.filter_by(user_id = session.get('user_id')
).paginate(page, per_page=app.config['PER_PAGE'])
return render_template('home/moviecollect.html',
moviecollectsPageObj=moviecollectsPageObj
)
实现页面的moviecollect.html
{% extends 'home/base.html' %}
{#
参考代码:
bootstrap媒体对象: https://v3.bootcss.com/components/#panels
bootstrap面板对象: https://v3.bootcss.com/components/#panels-heading
#}
{% block scripts %}
{{ super() }}
<script>
$(document).ready(function () {
$("#md-5").addClass('active');
});
</script>
{% endblock %}
{% block content %}
<div class="container-fluid">
{% include 'home/usermenu.html' %}
<div class="col-lg-9">
<div class="panel panel-warning">
<div class="panel-heading">
<h3 class="panel-title">
<span class="glyphicon glyphicon-map-marker"></span> 收藏电影
</h3>
</div>
<div class="panel-body">
{% for i in range(10) %}
<div class="media" style="border: 1px solid lightgray; margin-top: 10px">
<div class="media-left">
<a href="#">
<img class="media-object"
src="/static/upload/userFaceImg/20190323_11270930ca91ef76c6a7ef6e9494def1faaf51f1de66f7.jpg"
alt="..."
style="width: 60px; height: 60px"
>
</a>
</div>
<div class="media-body">
<h4 class="media-heading">电影名
<a href="#" class="label label-primary pull-right">
<span class="glyphicon glyphicon-play"></span>播放影片
</a>
</h4>
该片主要讲述了人类为了抵抗怪兽的进攻,研制出了高大的机器战士与来犯怪兽进行对
</div>
</div>
{% endfor %}
<div class="col-md-12 text-center">
<nav aria-label="Page navigation">
<ul class="pagination">
<li>
<a href="#" aria-label="First">
<span aria-hidden="true">首页</span>
</a>
</li>
<li>
<a href="#" aria-label="Previous">
<span aria-hidden="true">上一页</span>
</a>
</li>
<li><a href="#">1 / 10</a></li>
<li>
<a href="#" aria-label="Next">
<span aria-hidden="true">下一页</span>
</a>
</li>
<li>
<a href="#" aria-label="Last">
<span aria-hidden="true">尾页</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
</div>
</div>
{% endblock %}
7.播放页面的实现
视图函数
@home.route('/play/<int:id>/', methods=['GET', 'POST'])
@home.route('/play/<int:id>/<int:page>/', methods=['GET', 'POST'])
def play(id, page=1):
movie = Movie.query.get_or_404(id)
# if not movie.play_num:
# movie.play_num = 0
# movie.play_num += 1
count = Comment.query.filter_by(movie_id=id).count()
form = CommentForm()
if form.validate_on_submit():
if session.get('user_id'):
content = form.content.data
comment = Comment(
content=content,
movie_id=id,
user_id=session.get('user_id')
)
# if not movie.comment_num:
# movie.comment_num = Comment.query.filter_by(movie_id=id).count()
# movie.comment_num += 1
db.session.add(comment)
db.session.commit()
flash("提交评论成功")
else:
flash("提交评论失败, 请先登录")
return redirect(url_for('home.play', id=id))
commentsPageObj=Comment.query.filter_by(movie_id=id).paginate(page, per_page=app.config['PER_PAGE'])
return render_template('home/play.html',
app=app,
movie=movie,
count=count,
form=form,
commentsPageObj=commentsPageObj,
session=session)
# 添加电影收藏
@home.route('/moviecollect/addto/')
@is_login
def moviecollect_add():
print('a')
movie_id = request.args.get('movie_id', '')
user_id = request.args.get('user_id', '')
movie_collect = MovieCollect.query.filter_by(
user_id=int(user_id),
movie_id=int(movie_id)
)
# 如果用户已经收藏, 则返回OK=0;
if movie_collect.count() == 1:
data = dict(ok=0)
# 如果用户未收藏, 则返回OK=1;
elif movie_collect.count() == 0:
movie_collect = MovieCollect(
user_id=int(user_id),
movie_id=int(movie_id)
)
db.session.add(movie_collect)
db.session.commit()
data = dict(ok=1)
else:
data = dict(ok='error')
import json
return json.dumps(data)
页面实现的html文件:play.html
{% extends 'home/base.html' %}
{% block title %}
播放页面
{% endblock %}
{% block scripts %}
{{ super() }}
<!-- 配置文件 -->
<script type="text/javascript" src="{{ url_for('static', filename='asset/ueditor/ueditor.config.js') }}"></script>
<!-- 编辑器源码文件 -->
<script type="text/javascript" src="{{ url_for('static', filename='asset/ueditor/ueditor.all.js') }}"></script>
<script type="text/javascript" src="{{ url_for('static', filename='asset/ueditor/lang/zh-cn/zh-cn.js') }}"></script>
<!-- 实例化编辑器 -->
<script>
var ue = UE.getEditor('input_content',
{
toolbars: [
['fullscreen', 'source', 'undo', 'redo', 'bold']
],
autoHeightEnabled: true,
autoWidthEnabled: true,
autoFloatEnabled: true
});
$("#btn-col").click(function () {
var movie_id ={{ movie.id }};
var user_id ={{ session.get('user_id ')}};
$.ajax({
url: "{{ url_for('home.moviecollect_add') }}",
type: "GET",
data: "movie_id=" + movie_id + "&user_id=" + user_id,
dataType: "json",
success: function (res) {
if (res.ok === 1) {
alert("收藏成功!");
} else {
alert("已经收藏!");
{#type: 'GET',#}
{#data: 'movie_id=' + movie_id + '&user_id=' + user_id,#}
{#dataType: 'json',#}
{#success: function (res) {#}
{# if (res.ok === 1) {#}
{# alert("收藏成功!");#}
{#$('#show_collect_msg').empty();#}
{##}
{#$('#show_collect_msg').append('收藏成功');#}
{# } else {#}
{# alert("已经收藏!");#}
{#$("#show_collect_msg").empty();#}
{#$("#show_collect_msg").append("已经收藏!");#}
}
}
})
});
</script>
<!--播放页面-->
{% endblock %}
{% block content %}
<div class="container-fluid">
{# 电影播放部分 #}
<div class="col-md-6" style="margin-left: 50px">
<video src="{{ url_for('static',filename=app.config['MOVIE_UP_DIR_LAST'] + movie.url) }}" controls="controls">
您的浏览器不支持 video 标签。
</video>
</div>
{# 右侧电影信息页面 #}
<div class="col-md-4" style="height:500px;">
<div class="panel panel-info">
<div class="panel-heading">
<h3 class="panel-title"><span class="glyphicon glyphicon-facetime-video"></span> 电影介绍</h3>
</div>
<div class="panel-body" style="height:459px;">
<table class="table">
<tr>
<td style="width:30%;color:#ccc;font-weight:bold;font-style:italic;">
<span class="glyphicon glyphicon-film"></span> 片名
</td>
<td>{{ movie.name }}</td>
</tr>
<tr>
<td style="color:#ccc;font-weight:bold;font-style:italic;">
<span class="glyphicon glyphicon-tag"></span> 标签
</td>
<td>{{ movie.tag.name }}</td>
</tr>
<tr>
<td style="color:#ccc;font-weight:bold;font-style:italic;">
<span class="glyphicon glyphicon-time"></span> 片长
</td>
<td>{{ movie.length }}</td>
</tr>
<tr>
<td style="color:#ccc;font-weight:bold;font-style:italic;">
<span class="glyphicon glyphicon-map-marker"></span> 地区
</td>
<td>{{ movie.area }}</td>
</tr>
<tr>
<td style="color:#ccc;font-weight:bold;font-style:italic;">
<span class="glyphicon glyphicon-star"></span> 星级
</td>
<td>
<div>
{% for i in range(movie.star) %}
<span class="glyphicon glyphicon-star" style="color:#FFD119"></span>
{% endfor %}
{% for j in range(5-movie.star) %}
<span class="glyphicon glyphicon-star-empty" style="color:#FFD119"></span>
{% endfor %}
</div>
</td>
</tr>
<tr>
<td style="color:#ccc;font-weight:bold;font-style:italic;">
<span class="glyphicon glyphicon-calendar"></span> 上映时间
</td>
<td>{{ movie.release_time }}</td>
</tr>
<tr>
<td style="color:#ccc;font-weight:bold;font-style:italic;">
<span class="glyphicon glyphicon-play"></span> 播放数量
</td>
<td>{{ movie.play_num }}</td>
</tr>
<tr>
<td style="color:#ccc;font-weight:bold;font-style:italic;">
<span class="glyphicon glyphicon-comment"></span> 评论数量
</td>
<td>{{ movie.comment_num }}</td>
</tr>
<tr>
<td style="color:#ccc;font-weight:bold;font-style:italic;">
<span class="glyphicon glyphicon-picture"></span> 影片介绍
</td>
<td>
{{ movie.info }}
</td>
</tr>
</table>
</div>
</div>
</div>
{# 电影评论信息 #}
<div class="col-md-12" style="margin-top:6px;">
<div class="panel panel-danger">
<div class="panel-heading">
<h3 class="panel-title"><span class="glyphicon glyphicon-comment"></span> 电影评论</h3>
</div>
<div class="panel-body">
{% if not session.get('user_id') %}
<div class="alert alert-danger alert-dismissible" role="alert">
<button type="button" class="close" data-dismiss="alert">
<span aria-hidden="true">×</span>
<span class="sr-only">Close</span>
</button>
<strong>请先<a href="{{ url_for('home.login') }}"
target="_blank" class="text-info">
登录</a>,才可参与评论!</strong>
</div>
{% endif %}
<ol class="breadcrumb" style="margin-top:6px;">
<li>全部评论({{ count }})</li>
</ol>
<form role="form" style="margin-bottom:6px;" method="post">
<div class="form-group">
<div>
{{ form.csrf_token }}
<label for="input_content">{{ form.content.label }}</label>
{# <textarea id="input_content">{{ form.content }}</textarea>#}
{{ form.content }}
</div>
<div class="col-xs-12" id="error_content"></div>
</div>
{{ form.submit }}
{# <a class="btn btn-success pull pull-right" id="btn-sub"><span class="glyphicon glyphicon-edit"></span> 提交评论</a>#}
{% if session.get('user_id') %}
<a class="btn btn-danger pull pull-left" id="btn-col">
<span class="glyphicon glyphicon-heart"></span> 收藏电影</a>
{# <span id="show_collect_msg"></span>#}
{% endif %}
</form>
<div class="col-md-12">
<div class="panel panel-info" style="margin-top: 50px">
<div class="panel-heading">
<h3 class="panel-title">
<span class="glyphicon glyphicon-map-marker"></span>
评论记录</h3>
</div>
<div class="panel-body">
<ul class="media-list">
{% for comment in commentsPageObj.items %}
<li class="media">
<div class="media-right">
{% if comment.user.face %}
<a href="#">
<img class="media-object"
src="{{ url_for('static',filename=app.config('FC_DIR_LAST')+comment.user.face) }}"
alt="..."
style="width: 60px; height: 60px">
</a>
{% else %}
<a href="#">
<img class="media-object"
src="https://dummyimage.com/50x50/0000/fffff&text={{ session.get('user') }}"
alt="..."
style="width: 60px; height: 60px">
</a>
{% endif %}
</div>
<div class="media-body">
<div class="panel panel-default">
<div class="panel-heading">
{{ comment.user.name }}评论{{ comment.movie.name }}电影于{{ comment.addtime }}
</div>
<div class="panel-body">
{{ comment.content | safe }}
</div>
</div>
</div>
</li>
{% endfor %}
</ul>
</div>
{% if commentsPageObj.pages > 0 %}
<div class="col-md-12 text-center">
<nav aria-label="Page navigation">
<ul class="pagination">
<li>
<a href="{{ url_for('home.play', id=movie.id, page=1) }}" aria-label="First">
<span aria-hidden="true">首页</span>
</a>
</li>
{% if commentsPageObj.has_prev %}
<li>
<a href="{{ url_for('home.play', id=movie.id, page=commentsPageObj.prev_num) }}"
aria-label="Previous">
<span aria-hidden="true">上一页</span>
</a>
</li>
{% else %}
<li class="disabled">
<a aria-label="Previous">
<span aria-hidden="true">上一页</span>
</a>
</li>
{% endif %}
<li><a href="#">{{ commentsPageObj.page }} / {{ commentsPageObj.pages }}</a>
</li>
{% if commentsPageObj.has_next %}
<li>
<a href="{{ url_for('home.play', id=movie.id, page=commentsPageObj.next_num) }}"
aria-label="Next">
<span aria-hidden="true">下一页</span>
</a>
</li>
{% else %}
<li class="disabled">
<a aria-label="Next">
<span aria-hidden="true">下一页</span>
</a>
</li>
{% endif %}
<li>
<a href="{{ url_for('home.play', id=movie.id, page=commentsPageObj.pages) }}"
aria-label="Last">
<span aria-hidden="true">尾页</span>
</a>
</li>
</ul>
</nav>
</div>
{% endif %}
</div>
</div>
</div>
{% endblock %}
</div></div></div>