• 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/<int:page>', 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 %}
        <section class="content-header">
            <h1>微电影管理系统</h1>
            <ol class="breadcrumb">
                <li><a href="#"><i class="fa fa-dashboard"></i> 电影管理</a></li>
                <li class="active">电影列表</li>
            </ol>
        </section>
        <section class="content" id="showcontent">
            <div class="row">
                <div class="col-md-12">
                    <div class="box box-primary">
                        <div class="box-header">
                            <h3 class="box-title">电影列表</h3>
                            <div class="box-tools">
                                <div class="input-group input-group-sm" style=" 150px;">
                                    <input type="text" name="table_search" class="form-control pull-right"
                                           placeholder="请输入关键字...">
    
                                    <div class="input-group-btn">
                                        <button type="submit" class="btn btn-default"><i class="fa fa-search"></i>
                                        </button>
                                    </div>
                                </div>
                            </div>
                        </div>
                        <div class="box-body table-responsive no-padding">
                            {% for msg in get_flashed_messages(category_filter=["ok"]) %}
                                <div class="alert alert-success alert-dismissible">
                                    <button type="button" class="close" data-dismiss="alert" aria-hidden="true">x</button>
                                    <h4><i class="icon fa fa-check"></i>操作成功</h4>
                                    {{ msg }}
                                </div>
                            {% endfor %}
                            <table class="table table-hover">
                                <tbody>
                                <tr>
                                    <th>编号</th>
                                    <th>片名</th>
                                    <th>片长</th>
                                    <th>标签</th>
                                    <th>地区</th>
                                    <th>星级</th>
                                    <th>播放数量</th>
                                    <th>评论数量</th>
                                    <th>上映时间</th>
                                    <th>操作事项</th>
                                </tr>
                                {% for v in page_data.items %}
                                    <tr>
                                        <td>{{ v.id }}</td>
                                        <td>{{ v.title }}</td>
                                        <td>{{ v.length }}</td>
                                        <td>{{ v.tag.name }}</td>
                                        <td>{{ v.area }}</td>
                                        <td>{{ v.star }}</td>
                                        <td>{{ v.playnum }}</td>
                                        <td>{{ v.commentnum }}</td>
                                        <td>{{ v.release_time }}</td>
                                        <td>
                                            <a href="{{ url_for("admin.movie_edit",id=v.id) }}" class="label label-success">编辑</a>
                                            &nbsp;
                                            <a href="{{ url_for("admin.movie_del",id=v.id) }}"
                                               class="label label-danger">删除</a>
                                        </td>
                                    </tr>
                                {% endfor %}
                                </tbody>
                            </table>
                        </div>
                        <div class="box-footer clearfix">
                            {{ pg.page(page_data,"admin.movie_list") }}
                        </div>
                    </div>
                </div>
            </div>
        </section>
    {% endblock %}
    
    {% block js %}
        <script>
            $(document).ready(function () {
                $("#g-3").addClass('active');
                $("#g-3-2").addClass('active');
            });
        </script>
    {% 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 %}
        <section class="content-header">
            <h1>微电影管理系统</h1>
            <ol class="breadcrumb">
                <li><a href="#"><i class="fa fa-dashboard"></i> 电影管理</a></li>
                <li class="active">添加电影</li>
            </ol>
        </section>
        <section class="content" id="showcontent">
            <div class="row">
                <div class="col-md-12">
                    <div class="box box-primary">
                        <div class="box-header with-border">
                            <h3 class="box-title">添加电影</h3>
                        </div>
                        <form role="form" method="post" enctype="multipart/form-data">
                            <div class="box-body">
    
                                {% for msg in get_flashed_messages(category_filter=["ok"]) %}
                                    <div class="alert alert-success alert-dismissible">
                                        <button type="button" class="close" data-dismiss="alert" aria-hidden="true">×
                                        </button>
                                        <h4><i class="icon fa fa-check"></i>操作成功</h4>
                                        {{ msg }}
                                    </div>
                                {% endfor %}
    
                                <div class="form-group">
                                    <label for="input_title">{{ form.title.label }}</label>
                                    {{ form.title }}
                                    {% for err in form.title.errors %}
                                        <div class="col-md-2">
                                            <font style="color:red">{{ err }}</font>
                                        </div>
                                    {% endfor %}
                                </div>
                                <div class="form-group">
                                    <label for="input_url">{{ form.url.label }}</label>
                                    {{ form.url }}
                                    {% for err in form.url.errors %}
                                        <div class="col-md-2">
                                            <font style="color:red">{{ err }}</font>
                                        </div>
                                    {% endfor %}
                                    <div style="margin-top:5px;">
                                        <div id="moviecontainer"></div>
                                    </div>
                                </div>
                                <div class="form-group">
                                    <label for="input_info">{{ form.info.label }}</label>
                                    {{ form.info }}
                                    {% for err in form.info.errors %}
                                        <div class="col-md-2">
                                            <font style="color:red">{{ err }}</font>
                                        </div>
                                    {% endfor %}
                                </div>
                                <div class="form-group">
                                    <label for="input_logo">{{ form.logo.label }}</label>
                                    {{ form.logo }}
                                    {% for err in form.logo.errors %}
                                        <div class="col-md-2">
                                            <font style="color:red">{{ err }}</font>
                                        </div>
                                    {% endfor %}
                                    <img data-src="holder.js/262x166" style="margin-top:5px;" class="img-responsive"
                                         alt="">
                                </div>
                                <div class="form-group">
                                    <label for="input_star">{{ form.star.label }}</label>
                                    {{ form.star }}
                                    {% for err in form.star.errors %}
                                        <div class="col-md-2">
                                            <font style="color:red">{{ err }}</font>
                                        </div>
                                    {% endfor %}
                                </div>
                                <div class="form-group">
                                    <label for="input_tag_id">{{ form.tag_id.label }}</label>
                                    {{ form.tag_id }}
                                    {% for err in form.tag_id.errors %}
                                        <div class="col-md-2">
                                            <font style="color:red">{{ err }}</font>
                                        </div>
                                    {% endfor %}
                                </div>
                                <div class="form-group">
                                    <label for="input_area">{{ form.area.label }}</label>
                                    {{ form.area }}
                                    {% for err in form.area.errors %}
                                        <div class="col-md-2">
                                            <font style="color:red">{{ err }}</font>
                                        </div>
                                    {% endfor %}
                                </div>
                                <div class="form-group">
                                    <label for="input_length">{{ form.length.label }}</label>
                                    {{ form.length }}
                                    {% for err in form.length.errors %}
                                        <div class="col-md-2">
                                            <font style="color:red">{{ err }}</font>
                                        </div>
                                    {% endfor %}
                                </div>
                                <div class="form-group">
                                    <label for="input_release_time">{{ form.release_time.label }}</label>
                                    {{ form.release_time }}
                                    {% for err in form.release_time.errors %}
                                        <div class="col-md-2">
                                            <font style="color:red">{{ err }}</font>
                                        </div>
                                    {% endfor %}
                                </div>
                            </div>
                            <div class="box-footer">
                                {{ form.csrf_token }}
                                {{ form.submit }}
                            </div>
                        </form>
                    </div>
                </div>
            </div>
        </section>
    {% endblock %}
    
    {% block js %}
        <script src="{{ url_for('static',filename='jwplayer/jwplayer.js') }}"></script>
        <script type="text/javascript">
            jwplayer.key = "P9VTqT/X6TSP4gi/hy1wy23BivBhjdzVjMeOaQ==";
        </script>
    
        <script>
            $(document).ready(function () {
                $('#input_release_time').datepicker({
                    autoclose: true,
                    format: 'yyyy-mm-dd',
                    language: 'zh-CN',
                });
    
                $("#g-3").addClass('active');
                $("#g-3-1").addClass('active');
            });
        </script>
    
    {% endblock %}
    

    1.4 电影管理之编辑电影

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

    # 编辑电影
    @admin.route("/movie/edit/<int:id>", 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 %}
    <!--内容-->
    <section class="content-header">
        <h1>微电影管理系统</h1>
        <ol class="breadcrumb">
            <li><a href="#"><i class="fa fa-dashboard"></i> 电影管理</a></li>
            <li class="active">修改电影</li>
        </ol>
    </section>
    <section class="content" id="showcontent">
        <div class="row">
            <div class="col-md-12">
                <div class="box box-primary">
                    <div class="box-header with-border">
                        <h3 class="box-title">修改电影</h3>
                    </div>
                    <form role="form" method="post" enctype="multipart/form-data">
                        <div class="box-body">
                            <!--消息闪现-->
                              {% for msg in get_flashed_messages(category_filter=["ok"]) %}
                            <div class="alert alert-success alert-dismissible">
                                <button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
                                <h4><i class="icon fa fa-check"></i> 操作成功</h4>
                                {{ msg }}
                            </div>
                            {% endfor %}
    
                            {% for msg in get_flashed_messages(category_filter=["err"]) %}
                            <div class="alert alert-danger alert-dismissible">
                                <button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
                                <h4><i class="icon fa fa-ban"></i> 操作失败</h4>
                                {{ msg }}
                            </div>
                        </div>
                        {% endfor %}
    
                            <div class="form-group">
                                <label for="input_title">{{ form.title.label }}</label>
                                <!--给个初始值-->
                                {{ form.title(value=movie.title) }}
                                <!--报错信息-->
                                {% for err in form.title.errors %}
                                <div class="col-md-12">
                                    <font style="color:red">{{ err }}</font>
                                </div>
                                {% endfor %}
                            </div>
                            <div class="form-group">
                                <label for="input_url">{{ form.url.label }}</label>
                                {{ form.url }}
                                {% for err in form.url.errors %}
                                <div class="col-md-12">
                                    <font style="color:red">{{ err }}</font>
                                </div>
                                {% endfor %}
                                <div style="margin-top:5px;">
                                    <div id="moviecontainer"></div>
                                </div>
                            </div>
                            <div class="form-group">
                                <label for="input_info">{{ form.info.label }}</label>
                                {{ form.info }}
                                {% for err in form.info.errors %}
                                <div class="col-md-12">
                                    <font style="color:red">{{ err }}</font>
                                </div>
                                {% endfor %}
                            </div>
                            <div class="form-group">
                                <label for="input_logo">{{ form.logo.label}}</label>
                                {{ form.logo }}
                                {% for err in form.logo.errors %}
                                <div class="col-md-12">
                                    <font style="color:red">{{ err }}</font>
                                </div>
                                {% endfor %}
                                <img src="{{ url_for('static',filename='uploads/'+movie.logo) }}" style="margin-top:5px;" class="img-responsive"
                                     alt="">
                            </div>
                            <div class="form-group">
                                <label for="input_star">{{ form.star.label }}</label>
                                {{ form.star }}
                                {% for err in form.star.errors %}
                                <div class="col-md-12">
                                    <font style="color:red">{{ err }}</font>
                                </div>
                                {% endfor %}
                            </div>
                            <div class="form-group">
                                <label for="input_tag_id">{{ form.tag_id.label }}</label>
                                {{ form.tag_id }}
                                {% for err in form.tag_id.errors %}
                                <div class="col-md-12">
                                    <font style="color:red">{{ err }}</font>
                                </div>
                                {% endfor %}
                            </div>
                            <div class="form-group">
                                <label for="input_area">{{ form.area.label }}</label>
                                {{ form.area(value=movie.area) }}
                                {% for err in form.area.errors %}
                                <div class="col-md-12">
                                    <font style="color:red">{{ err }}</font>
                                </div>
                                {% endfor %}
                            </div>
                            <div class="form-group">
                                <label for="input_length">{{ form.length.label }}</label>
                                {{ form.length(value=movie.length) }}
                                {% for err in form.length.errors %}
                                <div class="col-md-12">
                                    <font style="color:red">{{ err }}</font>
                                </div>
                                {% endfor %}
                            </div>
                            <div class="form-group">
                                <label for="input_release_time">{{ form.release_time.label }}</label>
                                {{ form.release_time(value=movie.release_time) }}
                                {% for err in form.release_time.errors %}
                                <div class="col-md-12">
                                    <font style="color:red">{{ err }}</font>
                                </div>
                                {% endfor %}
                            </div>
                        </div>
                        <div class="box-footer">
                            {{ form.csrf_token }}
                            {{ form.submit }}
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </section>
    <!--内容-->
    {% 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='uploads/'+movie.url) }}",
                title: "{{ movie.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,
             387,
        });
    
    </script>
    <script>
        $(document).ready(function () {
            $('#input_release_time').datepicker({
                autoclose: true,
                format: 'yyyy-mm-dd',
                language: 'zh-CN',
            });
    
            $("#g-3").addClass("active");
            $("#g-3-1").addClass("active");
        });
    
    </script>
    {% endblock %}
    

    1.5 电影管理之删除电影

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

    # 电影删除
    @admin.route("/movie/del/<int:id>/", 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))
  • 相关阅读:
    kubernetes部署jenkins(Docker in Docker)及认证
    helm生产环境离线安装
    helm在kubernetes环境中搭建
    GlusterFs卷类型分析及创建、使用(结合kubernetes集群分析)
    glusterfs详解及kubernetes 搭建heketi-glusterfs
    kubernetes搭建Harbor无坑及Harbor仓库同步
    生产环境:ansible自动化部署kubernetes-1.14
    Gluserfs 架构详解【译】官网
    k8s部署高可用Ingress
    《A Survey on Transfer Learning》迁移学习研究综述 翻译
  • 原文地址:https://www.cnblogs.com/renpingsheng/p/9142100.html
Copyright © 2020-2023  润新知