Flask开发微电影网站(七)

1.后台管理之电影管理

1.1 定义电影表单

在app的admin目录的forms.py文件中,定义电影表单

# 电影表单
class MovieForm(FlaskForm):
    title = StringField(
        label="片名",
        validators=[
            DataRequired("请输入片名!")
        ],
        description="片名",
        render_kw={
            "class": "form-control",
            "id": 'input_name',
            'placeholder': '请输入片名!'
        }
    )

    url = FileField(
        label="文件",
        validators=[
            DataRequired("请上传文件!")
        ],
        description="文件"
    )

    info = TextAreaField(
        label="简介",
        validators=[
            DataRequired("请输入简介!")
        ],
        description="简介",
        render_kw={
            "class": "form-control",
            "rows": 10
        }
    )

    logo = FileField(
        label="封面",
        validators=[
            DataRequired("请上传封面!")
        ],
        description="封面",
    )
    star = SelectField(
        label="星级",
        validators=[
            DataRequired("请选择星级!")
        ],
        coerce=int,
        choices=[(1, "1星"), (2, "2星"), (3, "3星"), (4, "4星"), (5, "5星")],
        render_kw={
            "class": "form-control",
        }
    )
    tag_id = SelectField(
        label="标签",
        validators=[
            DataRequired("请选择标签!"),
        ],
        coerce=int,
        choices=[(v.id, v.name) for v in tags],
        description="标签",
        render_kw={
            "class": "form-control",
        }
    )
    area = StringField(
        label="地区",
        validators=[
            DataRequired("请输入地区!")
        ],
        description="地区",
        render_kw={
            "class": "form-control",
            'placeholder': '请输入地区!'
        }
    )
    length = StringField(
        label="片长",
        validators=[
            DataRequired("请输入片长!")
        ],
        description="片长",
        render_kw={
            "class": "form-control",
            "id": 'input_name',
            'placeholder': '请输入片长!'
        }
    )
    release_time = StringField(
        label="上映时间",
        validators=[
            DataRequired("请输入上映时间!")
        ],
        description="上映时间",
        render_kw={
            "class": "form-control",
            "id": 'input_release_time',
            'placeholder': '请输入上映时间!'
        }
    )
    submit = SubmitField(
        "编辑",
        render_kw={
            'class': 'btn btn-primary'
        }
    )

1.2 电影管理之所有电影列表

1.2.1 电影管理之电影列表视图函数

获取电影的所有相关信息,返回给前端进行展示

# 电影列表
@admin.route('/movie/list/', methods=["GET"])
@admin_login_req
@admin_auth
def movie_list(page=None):
    if page is None:
        page = 1
    page_data = Movie.query.join(Tag).filter(Tag.id == Movie.tag_id).order_by(
        Movie.addtime.desc()
    ).paginate(page=page, per_page=10)
    return render_template("admin/movie_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.length }} {{ v.tag.name }} {{ v.area }} {{ v.star }} {{ v.playnum }} {{ v.commentnum }} {{ v.release_time }} 编辑   删除
{% endblock %} {% block js %} {% endblock %}

1.3 电影管理之添加电影

1.3.1 电影管理之上传电影修改文件名称方法

电影上传到网站后台,要重新生成新的文件名,然后保存在数据库中

在admin目录的views.py文件中定义修改上传电影名称的方法

# 修改文件名称
def change_filename(filename):
    fileinfo = os.path.splitext(filename)
    filename = datetime.datetime.now().strftime("%Y%m%d%H%M%S") + str(uuid.uuid4().hex) + fileinfo[-1]
    return filename

1.3.2 电影管理之添加电影视图函数

# 添加电影
@admin.route('/movie/add/', methods=["POST", "GET"])
@admin_login_req
@admin_auth
def movie_add():
    form = MovieForm()
    if form.validate_on_submit():
        data = form.data

        file_url = secure_filename(form.url.data.filename)
        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'], "rw")
        url = change_filename(file_url)
        logo = change_filename(file_logo)
        form.url.data.save(app.config['UP_DIR'] + url)
        form.logo.data.save(app.config['UP_DIR'] + logo)

        movie = Movie(
            title=data.get("title"),
            url=url,
            info=data.get("info"),
            star=int(data.get("star")),
            tag_id=int(data.get("tag_id")),
            area=data.get("Searching for Usages in Project Files..."),
            release_time=data.get("release_time"),
            length=data.get("length"),
            logo=logo,
            playnum=0,
            commentnum=0,
        )
        db.session.add(movie)
        db.session.commit()
        flash("添加电影成功!", "ok")
        return redirect(url_for("admin.movie_list", page=1))

    return render_template("admin/movie_add.html", form=form)

1.3.3 电影管理之添加电影前端页面

添加电影前端页面继承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.url }} {% for err in form.url.errors %}
{{ err }}
{% endfor %}
{{ form.info }} {% for err in form.info.errors %}
{{ err }}
{% endfor %}
{{ form.logo }} {% for err in form.logo.errors %}
{{ err }}
{% endfor %}
{{ form.star }} {% for err in form.star.errors %}
{{ err }}
{% endfor %}
{{ form.tag_id }} {% for err in form.tag_id.errors %}
{{ err }}
{% endfor %}
{{ form.area }} {% for err in form.area.errors %}
{{ err }}
{% endfor %}
{{ form.length }} {% for err in form.length.errors %}
{{ err }}
{% endfor %}
{{ form.release_time }} {% for err in form.release_time.errors %}
{{ err }}
{% endfor %}
{% endblock %} {% block js %} {% endblock %}

1.4 电影管理之编辑电影

1.4.1 电影管理之编辑电影视图函数

# 编辑电影
@admin.route("/movie/edit/", methods=["GET", "POST"])
@admin_login_req
@admin_auth
def movie_edit(id=None):
    form = MovieForm()
    form.url.validators = []
    form.logo.validators = []
    movie = Movie.query.get_or_404(int(id))

    if request.method == 'GET':
        form.info.data = movie.info
        form.tag_id.data = movie.tag_id
        form.star.data = movie.star
    if form.validate_on_submit():
        data = form.data
        movie_count = Movie.query.filter_by(title=data["title"]).count()
        if movie_count == 1 and movie.title != data.get("title"):
            flash("片名已经存在,请重新输入!", "err")
            return redirect(url_for("admin.movie_edit", id=id))
        if not os.path.exists(app.config['UP_DIR']):
            os.makedirs(app.config['UP_DIR'])
            os.chmod(app.config['UP_DIR'])

        if form.url.data.filename != "":
            file_url = secure_filename(form.url.data.filename)
            movie_url = change_filename(file_url)
            form.url.data.save(app.config["UP_DIR"] + movie.url)

        if form.logo.data.filename != "":
            file_logo = secure_filename(form.logo.data.filename)
            movie.logo = change_filename(file_logo)
            form.logo.data.save(app.config["UP_DIR"] + movie.logo)

        movie.title = data.get("title")
        movie.info = data.get("info")
        movie.star = data.get("star")
        movie.tag_id = data.get("tag_id")
        movie.area = data.get("area")
        movie.release_time = data.get("release_time")
        movie.length = data.get("length")

        db.session.add(movie)
        db.session.commit()
        flash("修改电影成功!", "ok")
        return redirect(url_for("admin.movie_list", page=1))
    return render_template("admin/movie_edit.html", form=form, movie=movie)

1.4.2 电影管理之编辑电影前端页面

编辑电影前端页面继承admin.html页面

{% extends "admin/admin.html" %}

{% block content %}

微电影管理系统

修改电影

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

操作成功

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

操作失败

{{ msg }}
{% endfor %}
{{ form.title(value=movie.title) }} {% for err in form.title.errors %}
{{ err }}
{% endfor %}
{{ form.url }} {% for err in form.url.errors %}
{{ err }}
{% endfor %}
{{ form.info }} {% for err in form.info.errors %}
{{ err }}
{% endfor %}
{{ form.logo }} {% for err in form.logo.errors %}
{{ err }}
{% endfor %}
{{ form.star }} {% for err in form.star.errors %}
{{ err }}
{% endfor %}
{{ form.tag_id }} {% for err in form.tag_id.errors %}
{{ err }}
{% endfor %}
{{ form.area(value=movie.area) }} {% for err in form.area.errors %}
{{ err }}
{% endfor %}
{{ form.length(value=movie.length) }} {% for err in form.length.errors %}
{{ err }}
{% endfor %}
{{ form.release_time(value=movie.release_time) }} {% for err in form.release_time.errors %}
{{ err }}
{% endfor %}
{% endblock %} {% block js%} {% endblock %}

1.5 电影管理之删除电影

1.5 电影管理之删除电影视图函数

# 电影删除
@admin.route("/movie/del//", methods=['GET'])
@admin_login_req
@admin_auth
def movie_del(id=None):
    movie = Movie.query.get_or_404(int(id))
    db.session.delete(movie)
    db.session.commit()

    flash("删除电影成功!", "ok")
    return redirect(url_for("admin.movie_list", page=1))

你可能感兴趣的:(Flask开发微电影网站(七))