Flask开发微电影网站(八)
1.后台管理之电影预告管理
1.1 定义电影预告表单
在app的admin目录的forms.py文件中,定义电影预告表单
# 预告表单
class PreviewForm(FlaskForm):
title = StringField(
label="预告标题",
validators=[
DataRequired("请输入预告标题!")
],
description="预告标题",
render_kw={
"class": "form-control",
"placeholder": "请输入预告标题!",
}
)
logo = FileField(
label="预告封面",
validators=[
DataRequired("请上传预告封面!")
],
description="预告封面",
)
submit = SubmitField(
"编辑",
render_kw={
"class": "btn btn-primary",
}
)
1.2 电影管理之所有电影预告列表
1.2.1 电影管理之电影预告列表视图函数
在admin目录下的views.py文件中定义电影预告列表视图函数
电影预告列表视图函数需要被登录控制装饰器和权限控制装饰器同时装饰
@admin.route('/preview/list/', methods=["GET"])
@admin_login_req
@admin_auth
def preview_list(page=None):
if page is None:
page = 1
page_data = Preview.query.order_by(Preview.addtime.desc()).paginate(page=page, per_page=10)
return render_template("admin/preview_list.html", page_data=page_data)
1.2.2 电影管理之电影预告列表前端页面
电影预告列表页面继承admin.html页面,还需要导入admin_page.html页面以实现分页效果
{% extends 'admin/admin.html' %}
{% import "ui/admin_page.html" as pg %}
{% block content %}
微电影管理系统
{% endblock %}
{% block js %}
<script>
$(document).ready(function () {
$("#g-4").addClass('active');
$("#g-4-2").addClass('active');
});
</script>
{% endblock %}
1.3 电影管理之添加电影预告
1.3.1 电影管理之添加电影预告视图函数
在admin目录下的views.py文件中定义添加电影预告视图函数
添加电影预告视图函数需要被登录控制装饰器和权限控制装饰器同时装饰
@admin.route('/preview/add/', methods=["GET", "POST"])
@admin_login_req
@admin_auth
def preview_add():
form = PreviewForm()
if form.validate_on_submit():
data = form.data
file_logo = secure_filename(form.logo.data.filename)
if not os.path.exists(app.config["UP_DIR"]):
os.makedirs(app.config["UP_DIR"])
os.chmod(app.config["UP_DIR"])
logo = change_filename(file_logo)
form.logo.data.save(app.config["UP_DIR"] + logo)
preview = Preview(
title=data.get("title"),
logo=logo
)
db.session.add(preview)
db.session.commit()
flash("添加预告成功!", "ok")
return redirect(url_for("admin.preview_add"))
return render_template("admin/preview_add.html", form=form)
1.3.2 电影管理之添加电影预告前端页面
电影预告列表页面继承admin.html页面
{% extends 'admin/admin.html' %}
{% block content %}
微电影管理系统
添加预告
{% endblock %}
{% block js %}
<script src="{{ url_for('static',filename='jwplayer/jwplayer.js') }}"></script>
<script type="text/javascript">
jwplayer.key = "P9VTqT/X6TSP4gi/hy1wy23BivBhjdzVjMeOaQ==";
</script>
<script type="text/javascript">
jwplayer("moviecontainer").setup({
flashplayer: "url_for('static',filename='jwplayer/jwplayer.flash.swf')",
playlist: [{
file: "url_for('static',filename='video/htpy.mp4')",
title: "环太平洋"
}],
modes: [{
type: "html5"
}, {
type: "flash",
src: "url_for('static',filename='jwplayer/jwplayer.flash.swf')"
}, {
type: "download"
}],
skin: {
name: "vapor"
},
"playlist.position": "left",
"playlist.size": 200,
height: 250,
width: 387,
});
</script>
<script>
$(document).ready(function () {
$('#input_release_time').datepicker({
autoclose: true,
format: 'yyyy-mm-dd',
language: 'zh-CN',
});
});
</script>
<script>
$(document).ready(function () {
$("#g-4").addClass('active');
$("#g-4-1").addClass('active');
});
</script>
{% endblock %}
1.4 电影管理之编辑电影预告
1.4.1 电影管理之编辑电影预告视图函数
在admin目录下的views.py文件中定义编辑电影预告视图函数
编辑电影预告视图函数需要被登录控制装饰器和权限控制装饰器同时装饰
@admin.route("/preview/edit//", methods=['GET', 'POST'])
@admin_login_req
@admin_auth
def preview_edit(id=None):
form = PreviewForm()
form.logo.validators = []
preview = Preview.query.get_or_404(int(id))
if request.method == "GET":
form.title.data = preview.title
if form.validate_on_submit():
data = form.data
if form.logo.data.filename != "":
file_logo = secure_filename(form.logo.data.filename)
preview.logo = change_filename(file_logo)
form.logo.data.save(app.config["UP_DIR"] + preview.logo)
preview.title = data.get("title")
db.session.add(preview)
db.session.commit()
flash("修改预告成功!", "ok")
return redirect(url_for("admin.preview_edit", id=id))
return render_template("admin/preview_edit.html", form=form, preview=preview)
1.4.2 电影管理之编辑电影预告前端页面
电影预告列表页面继承admin.html页面
{% extends "admin/admin.html" %}
{% block content %}
微电影管理系统
修改预告
{% endblock %}
{% block js %}
<script>
$(document).ready(function () {
$("#g-4").addClass("active");
$("#g-4-1").addClass("active");
});
</script>
{% endblock %}
1.5 电影管理之删除电影预告
1.5.1 电影管理之删除电影视预告图函数
在admin目录下的views.py文件中定义删除电影预告视图函数
删除电影预告视图函数需要被登录控制装饰器和权限控制装饰器同时装饰
@admin.route("/preview/del//", methods=['GET', 'POST'])
@admin_login_req
@admin_auth
def preview_del(id=None):
preview = Preview.query.get_or_404(int(id))
db.session.delete(preview)
db.session.commit()
flash("删除预告成功!", "ok")
return redirect(url_for("admin.preview_list", page=1))
1.后台管理之会员管理
2.1 会员管理之所有会员列表
2.1.1 会员管理之会员列表视图函数
在admin目录下的views.py文件中定义会员列表视图函数
会员列表视图函数需要被登录控制装饰器和权限控制装饰器同时装饰
@admin.route('/user/list//', methods=['GET'])
@admin_login_req
@admin_auth
def user_list(page=None):
if page is None:
page = 1
page_data = User.query.order_by(User.addtime.asc()).paginate(page=page, per_page=3)
return render_template("admin/user_list.html", page_data=page_data)
2.1.2 会员管理之会员列表前端页面
电影预告列表页面继承admin.html页面,还需要导入admin_page.html页面以实现分页效果
{% extends 'admin/admin.html' %}
{% import "ui/admin_page.html" as pg %}
{% block content %}
微电影管理系统
{% endblock %}
{% block js %}
$(document).ready(function () {
$("#g-5").addClass('active');
$("#g-5-1").addClass('active');
});
{% endblock %}
2.2 会员管理之查看会员
2.2.1 会员管理之查看会员视图函数
在admin目录下的views.py文件中定义查看会员详细信息视图函数
查看会员详细信息视图函数需要被登录控制装饰器和权限控制装饰器同时装饰
@admin.route('/user/view//', methods=['GET'])
@admin_login_req
@admin_auth
def user_view(id=None):
user = User.query.get_or_404(int(id))
return render_template("admin/user_view.html", user=user)
2.2.2 会员管理之查看会员前端页面
电影预告列表页面继承admin.html页面
{% extends 'admin/admin.html' %}
{% block css %}
{% endblock %}
{% block content %}
微电影管理系统
会员详情
编号:
{{ user.id }}
昵称:
{{ user.name }}
邮箱:
{{ user.email }}
手机:
{{ user.phone }}
头像:
注册时间:
{{ user.addtime }}
唯一标志符:
{{ user.uuid }}
个性简介:
{{ user.info }}
{% endblock %}
{% block js %}
$(document).ready(function () {
$("#g-5").addClass('active');
$("#g-5-1").addClass('active');
});
{% endblock %}
2.3 会员管理之删除会员
2.3.1 会员管理之删除会员视图函数
在admin目录下的views.py文件中定义删除会员视图函数
删除会员视图函数需要被登录控制装饰器和权限控制装饰器同时装饰
@admin.route("/user/del//", methods=['GET'])
@admin_login_req
@admin_auth
def user_del(id=None):
user = User.query.get_or_404(int(id))
db.session.delete(user)
db.session.commit()
flash("删除会员成功", "ok")
return redirect(url_for('admin.user_list', page=1))
3.后台管理之电影评论管理
3.1 电影管理之所有电影评论列表
3.1.1 电影管理之电影评论列表视图函数
在admin目录下的views.py文件中定义电影评论列表视图函数
电影评论列表视图函数需要被登录控制装饰器和权限控制装饰器同时装饰
@admin.route('/comment/list//', methods=['GET'])
@admin_login_req
@admin_auth
def comment_list(page=None):
if page is None:
page = 1
page_data = Comment.query.join(Movie).join(User).filter(
Movie.id == Comment.movie_id,
User.id == Comment.user_id
).order_by(Comment.addtime).paginate(page=page, per_page=10)
return render_template("admin/comment_list.html", page_data=page_data)
3.1.2 电影管理之电影评论列表前端页面
电影预告列表页面继承admin.html页面,还需要导入admin_page.html页面以实现分页效果
{% extends 'admin/admin.html' %}
{% import "ui/admin_page.html" as pg %}
{% block content %}
微电影管理系统
评论列表
{% for msg in get_flashed_messages(category_filter=["ok"]) %}
操作成功
{{ msg }}
{% endfor %}
{% for v in page_data.items %}
{% endfor %}
{% endblock %}
{% block js %}
$(document).ready(function () {
$("#g-6").addClass('active');
$("#g-6-1").addClass('active');
});
{% endblock %}
3.2 电影管理之删除电影评论
3.2.1 电影管理之删除电影评论视图函数
在admin目录下的views.py文件中定义删除电影评论视图函数
删除电影评论视图函数需要被登录控制装饰器和权限控制装饰器同时装饰
@admin.route("/comment/del//", methods=['GET'])
@admin_login_req
@admin_auth
def comment_del(id=None):
comment = Comment.query.get_or_404(int(id))
db.session.delete(comment)
db.session.commit()
flash("删除评论成功", "ok")
return redirect(url_for("admin.comment_list", page=1))
删除