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 %}
    

微电影管理系统

预告列表

{% for msg in get_flashed_messages(category_filter=["ok"]) %}

操作成功

{{ msg }}
{% endfor %} {% for v in page_data.items %} {% endfor %}
编号 预告标题 预告封面 添加时间 操作事项
{{ v.id }} {{ v.title }} {{ v.addtime }} 编辑   删除
{% 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 %}
    

微电影管理系统

添加预告

{% for msg in get_flashed_messages(category_filter=["ok"]) %}

操作成功

{{ msg }}
{% endfor %}
{{ form.title }} {% for err in form.title.errors %}
{{ err }}
{% endfor %}
{{ form.logo }} {% for err in form.logo.errors %}
{{ err }}
{% endfor %}
{% 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 %}
    
    

微电影管理系统

修改预告

{% for msg in get_flashed_messages(category_filter=["ok"]) %}

操作成功

{{ msg }}
{% endfor %}
{{ form.title }} {% for err in form.title.errors %}
{{ err }}
{% endfor %}
{{ form.logo }} {% for err in form.logo.errors %}
{{ err }}
{% endfor %}
{% 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 %}
    

微电影管理系统

会员列表

{% for msg in get_flashed_messages(category_filter=["ok"]) %}

操作成功

{{ msg }}
{% endfor %} {% for v in page_data.items %} {% endfor %}
编号 昵称 邮箱 手机 头像 注册时间 操作事项
{{ v.id }} {{ v.name }} {{ v.email }} {{ v.face }} {{ v.addtime }} 查看   删除
{% 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 %}
User Image
{{ v.user.name }}   {{ v.addtime }} 关于电影《{{ v.movie.title }}》的评论:{{ v.content }}
删除
{% 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))