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 %}
{{ v.id }}
{{ v.title }}
{{ v.length }}
{{ v.tag.name }}
{{ v.area }}
{{ v.star }}
{{ v.playnum }}
{{ v.commentnum }}
{{ v.release_time }}
编辑
删除
{% endfor %}
{% 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 %}
微电影管理系统
添加电影
{% 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 %}
微电影管理系统
修改电影