基于flask的微电影管理——后台管理(3)

6.电影评论管理

6.1 直接从用户获取信息,所以不必有forms表单

6.2 用户管理的视图函数



from app import app, db
from flask import render_template, flash, redirect, url_for, request
from app.admin import admin
from app.admin.utils import write_adminlog, is_admin_login, permission_control
from app.models import User, Comment


# ***************************评论管理*****************************
@admin.route("/comment/list/")
@admin.route("/comment/list/<int:page>/")
@is_admin_login
@permission_control
def comment_list(page=1):
    commentsPageObj = Comment.query.paginate(page, per_page=app.config['PER_PAGE'])
    return render_template('admin/comment/list.html', commentsPageObj=commentsPageObj)


@admin.route("/comment/delete/<int:id>/")
@is_admin_login
@permission_control
def comment_del(id=None):
    if id:
        comment = Comment.query.get_or_404(id)
        db.session.delete(comment)
        db.session.commit()
        flash('删除%s用户%s电影评论成功!' % (comment.user.name, comment.movie.name), category='ok')
        write_adminlog('删除%s用户%s电影评论成功!' % (comment.user.name, comment.movie.name))
        return redirect(url_for('admin.comment_list', page=1))

6.3 实现评论管理的页面显示

{% extends 'admin/base.html' %}

{% block title %}评论列表{% endblock %}
{% block content %}
    <div class="col-lg-11">
        {#   参考 路径导航:  https://v3.bootcss.com/components/#breadcrumbs           #}
        <h1>微电影管理系统</h1>
        <ol class="breadcrumb">
            <li><a href="{{ url_for('admin.index') }}"><i class="fa fa-dashboard"></i> 首页</a></li>
            <li><i class="fa fa-dashboard"></i> 评论管理</li>
            <li><a href="{{ url_for('admin.comment_list') }}"><i class="fa fa-dashboard"></i> 评论列表</a></li>
        </ol>

        <div class="panel panel-default panel-info">
            <div class="panel-heading">
                <h3 class="panel-title"><span class="glyphicon glyphicon-map-marker"></span>
                    评论列表
                </h3>
            </div>
            <div class="panel-body">

                {% for comment in commentsPageObj.items %}
                    <div class="box-comment">
                        <img class="img-circle img-sm"
                        #因为没有上传图像,头像是根据用户名在评论电影时网上生成的,所以并没有存入到地址中
                        #src="{{  url_for('static',filename='upload/userFaceImg/'+comment.user.face) }}"
                             src="{{  url_for('static',filename='upload/userFaceImg/') }}"
                             alt="User Image">
                        <div class="comment-text">
                <span class="username">
                    {{ comment.user.name }}
                    <span class="text-muted pull-right">
                        <i class="fa fa-calendar" aria-hidden="true"></i>
                        &nbsp;
                        {{ comment.addtime }}
                    </span>
                </span>
                            关于电影<a>《{{ comment.movie.name }}》</a>的评论:{{ comment.content | safe}}
                            <br><a class="label label-danger pull-right"
                                   href="{{ url_for('admin.comment_del', id=comment.id) }}">删除</a>
                        </div>
                    </div>
                {% endfor %}
            </div>
        </div>


        <div class="col-md-12 text-center">
            <nav aria-label="Page navigation">
                <ul class="pagination">
                    <li>
                        <a href="#" aria-label="First">
                            <span aria-hidden="true">首页</span>
                        </a>
                    </li>
                    <li>
                        <a href="#" aria-label="Previous">
                            <span aria-hidden="true">上一页</span>
                        </a>
                    </li>
                    <li><a href="#">1&nbsp;/&nbsp;10</a></li>
                    <li>
                        <a href="#" aria-label="Next">
                            <span aria-hidden="true">下一页</span>
                        </a>
                    </li>
                    <li>
                        <a href="#" aria-label="Last">
                            <span aria-hidden="true">尾页</span>
                        </a>
                    </li>
                </ul>
            </nav>
        </div>


    </div>

{% endblock %}

在这里插入图片描述

7.电影收藏管理

7.1 根据用户得知收藏的电影,所以不用forms表单

7.2 电影收藏的视图函数


import os

from werkzeug.utils import secure_filename

from app import app, db
from flask import render_template, flash, redirect, url_for, request
from app.admin import admin
from app.admin.forms.movie import MovieForm
from app.admin.utils import write_adminlog, is_admin_login, permission_control
from app.models import MovieCollect


# ********************************收藏管理***********************


@admin.route("/collect/list/")
@admin.route("/collect/list/<int:page>/")
@is_admin_login
@permission_control
def collect_list(page=1):
    moviecollectsPageObj = MovieCollect.query.paginate(page=page, per_page=app.config['PER_PAGE'])
    return render_template('admin/collect/list.html', moviecollectsPageObj=moviecollectsPageObj, app=app)


@admin.route("/collect/delete/<int:id>")
@is_admin_login
@permission_control
def collect_del(id=None):
    if id:
        moviecollect = MovieCollect.query.get_or_404(id)
        db.session.delete(moviecollect)
        db.session.commit()
        flash('删除%s用户对%s电影收藏成功!' % (moviecollect.user.name, moviecollect.movie.name), category='ok')
        write_adminlog('删除%s用户对%s电影收藏成功')
        return redirect(url_for('admin.comment_list', page=1))

7.3 实现显示的页面

{% extends 'admin/base.html' %}

{% block title %}收藏列表{% endblock %}
{% block content %}
    <div class="col-lg-11">
        {#   参考 路径导航:  https://v3.bootcss.com/components/#breadcrumbs           #}
        <h1>微电影管理系统</h1>
        <ol class="breadcrumb">
            <li><a href="{{ url_for('admin.index') }}"><i class="fa fa-dashboard"></i> 首页</a></li>
            <li><i class="fa fa-dashboard"></i> 收藏管理</li>
            <li><a href="{{ url_for('admin.collect_list') }}"><i class="fa fa-dashboard"></i> 收藏列表</a></li>
        </ol>

        <div class="panel panel-default panel-info">
            <div class="panel-heading">
                <h3 class="panel-title"><span class="glyphicon glyphicon-map-marker"></span>
                    收藏列表
                </h3>
            </div>
            <div class="panel-body">

                <table class="table table-hover">

                    <tbody>
                    <tr>
                        <th>编号</th>
                        <th>电影</th>
                        <th>用户</th>
                        <th>添加时间</th>
                        <th>操作事项</th>
                    </tr>
                    {% for moviecollect in moviecollectsPageObj.items %}
                        <tr>
                            <td>{{ moviecollect.id }}</td>
                            <td>{{ moviecollect.movie.name }}</td>
                            <td>{{ moviecollect.user.name }}</td>
                            <td>{{ moviecollect.addtime }}</td>
                            <td>

                                <a href="{{ url_for('admin.collect_del' ,id=moviecollect.id) }}" class="label label-danger">删除</a>
                            </td>
                        </tr>
                    {% endfor %}
                    </tbody>
                </table>


            </div>
        </div>


        <div class="col-md-12 text-center">
            <nav aria-label="Page navigation">
                <ul class="pagination">
                    <li>
                        <a href="#" aria-label="First">
                            <span aria-hidden="true">首页</span>
                        </a>
                    </li>
                    <li>
                        <a href="#" aria-label="Previous">
                            <span aria-hidden="true">上一页</span>
                        </a>
                    </li>
                    <li><a href="#">1&nbsp;/&nbsp;10</a></li>
                    <li>
                        <a href="#" aria-label="Next">
                            <span aria-hidden="true">下一页</span>
                        </a>
                    </li>
                    <li>
                        <a href="#" aria-label="Last">
                            <span aria-hidden="true">尾页</span>
                        </a>
                    </li>
                </ul>
            </nav>
        </div>


    </div>

{% endblock %}

在这里插入图片描述

8.日志管理

8.1 会员登录日志,管理员登录及操作日志视图函数:

import os

from werkzeug.utils import secure_filename

from app import app, db
from flask import render_template, flash, redirect, url_for, request, session
from app.admin import admin
from app.admin.forms.movie import MovieForm
from app.admin.utils import write_adminlog, is_admin_login,permission_control
from app.home import change_filename
from app.models import Movie, Admin, AdminOplog, Adminlog, Userlog


# **************************管理员操作日志*****************************
@admin.route("/logs/operate_log/")
@admin.route("/logs/operate_log/<int:page>/")
@is_admin_login
@permission_control
def logs_operate_log(page=1):
    admin_id = session.get('admin_id')
    admin = Admin.query.get_or_404(admin_id)
    if admin.is_super:
        adminOplogPageObj = AdminOplog.query.paginate(page, per_page=app.config['PER_PAGE'])
    else:
        adminOplogPageObj = AdminOplog.query.filter_by(admin_id=admin_id
                                                       ).paginate(page,
                                                                  per_page=app.config['PER_PAGE'])

    return render_template('admin/logs/operate_log.html',
                           adminOplogPageObj=adminOplogPageObj)


# 管理员登录日志
@admin.route("/logs/admin_log/")
@admin.route("/logs/admin_log/<int:page>/")
@is_admin_login
@permission_control
def logs_admin_log(page=1):
    admin_id = session.get('admin_id')
    admin = Admin.query.get_or_404(admin_id)
    if admin.is_super:
        adminlogPageObj = Adminlog.query.paginate(page, per_page=app.config['PER_PAGE'])
    else:
        adminlogPageObj = Adminlog.query.filter_by(admin_id=admin_id
                                                   ).paginate(page,
                                                              per_page=app.config['PER_PAGE'])
    return render_template('admin/logs/admin_log.html',
                           adminlogPageObj=adminlogPageObj)


@admin.route("/logs/user_log/")
@admin.route("/logs/user_log/<int:page>/")
@is_admin_login
@permission_control
def logs_user_log(page=1):
    userlogPageObj = Userlog.query.paginate(page,
                                            per_page=app.config['PER_PAGE'])
    return render_template('admin/logs/user_log.html',
                           userlogPageObj=userlogPageObj)

8.2 页面显示

## 会员登录日志

{% extends 'admin/base.html' %}
{% block title %}会员登录日志列表{% endblock %}
{% block content %}


    <div class="col-lg-11">


        {#   参考 路径导航:  https://v3.bootcss.com/components/#breadcrumbs           #}
        <h1>微电影管理系统</h1>
        <ol class="breadcrumb">
            <li><a href="{{ url_for('admin.index') }}"><i class="fa fa-dashboard"></i> 首页</a></li>
            <li><a href="{{ url_for('admin.logs_operate_log') }}"><i class="fa fa-dashboard"></i> 操作日志列表</a></li>
            <li><a href="{{ url_for('admin.logs_user_log') }}"><i class="fa fa-dashboard"></i> 会员日志列表</a></li>
            <li><a href="{{ url_for('admin.logs_admin_log') }}"><i class="fa fa-dashboard"></i> 管理员登录日志列表</a></li>

        </ol>


        <div>
            <div class="panel panel-default panel-info">
                <div class="panel-heading">
                    <h3 class="panel-title"><span class="glyphicon glyphicon-map-marker"></span>
                        会员登录日志列表
                    </h3>
                </div>
                <div class="panel-body">

                    <br/>

                    {#                   登录日志表格#}
                    <table class="table table-hover">
                        <tbody>
                        <tr>
                            <th>编号</th>
                            <th>会员名</th>
                            <th>会员登录时间</th>
                            <th>会员登录IP</th>
                        </tr>


                        {% for userlog in userlogPageObj.items %}
                            <tr>
                                <td>{{ userlog.id }}</td>
                                <td>{{ userlog.user.name }}</td>
                                <td>{{ userlog.addtime }}</td>
                                <td>{{ userlog.ip }}</td>
                            </tr>
                        {% endfor %}

                        </tbody>
                    </table>

                </div>
            </div>

        </div>

    </div>




{% endblock %}



## 管理员登录日志

{% extends 'admin/base.html' %}
{% block title %}管理员登录日志列表{% endblock %}
{% block content %}


    <div class="col-lg-11">


        {#   参考 路径导航:  https://v3.bootcss.com/components/#breadcrumbs           #}
        <h1>微电影管理系统</h1>
        <ol class="breadcrumb">
            <li><a href="{{ url_for('admin.index') }}"><i class="fa fa-dashboard"></i> 首页</a></li>
            <li><a href="{{ url_for('admin.logs_operate_log') }}"><i class="fa fa-dashboard"></i> 操作日志列表</a></li>
            <li><a href="{{ url_for('admin.logs_user_log') }}"><i class="fa fa-dashboard"></i> 会员日志列表</a></li>
            <li><a href="{{ url_for('admin.logs_admin_log') }}"><i class="fa fa-dashboard"></i> 管理员登录日志列表</a></li>

        </ol>


        <div>
            <div class="panel panel-default panel-info">
                <div class="panel-heading">
                    <h3 class="panel-title"><span class="glyphicon glyphicon-map-marker"></span>
                        管理员登录日志列表
                    </h3>
                </div>
                <div class="panel-body">

                    <br/>

                    {#                   登录日志表格#}
                    <table class="table table-hover">
                        <tbody>
                        <tr>
                            <th>编号</th>
                            <th>管理员</th>
                            <th>登录时间</th>
                            <th>登录IP</th>
                        </tr>


                        {% for adminlog in adminlogPageObj.items %}
                            <tr>
                                <td>{{ adminlog.id }}</td>
                                <td>{{ adminlog.admin.name }}</td>
                                <td>{{ adminlog.addtime }}</td>
                                <td>{{ adminlog.ip }}</td>
                            </tr>
                        {% endfor %}

                        </tbody>
                    </table>

                </div>
            </div>

        </div>

    </div>

{% endblock %}



## 管理员操作日志

{% extends 'admin/base.html' %}
{% block title %}操作日志列表{% endblock %}
{% block content %}


    <div class="col-lg-11">


        {#   参考 路径导航:  https://v3.bootcss.com/components/#breadcrumbs           #}
        <h1>微电影管理系统</h1>
        <ol class="breadcrumb">
            <li><a href="{{ url_for('admin.index') }}"><i class="fa fa-dashboard"></i> 首页</a></li>
            <li><a href="{{ url_for('admin.logs_operate_log') }}"><i class="fa fa-dashboard"></i> 操作日志列表</a></li>
            <li><a href="{{ url_for('admin.logs_user_log') }}"><i class="fa fa-dashboard"></i> 会员日志列表</a></li>
            <li><a href="{{ url_for('admin.logs_admin_log') }}"><i class="fa fa-dashboard"></i> 管理员登录日志列表</a></li>

        </ol>


        <div>
            <div class="panel panel-default panel-info">
                <div class="panel-heading">
                    <h3 class="panel-title"><span class="glyphicon glyphicon-map-marker"></span>
                        操作日志列表
                    </h3>
                </div>
                <div class="panel-body">

                    <br/>

                    {#                   登录日志表格#}
                    <table class="table table-hover">
                        <tbody>
                        <tr>
                            <th>编号</th>
                            <th>管理员</th>
                            <th>操作时间</th>
                            <th>操作原因</th>
                            <th>操作IP</th>
                        </tr>


                        {% for adminOplog in adminOplogPageObj.items %}
                            <tr>
                                <td>{{ adminOplog.id }}</td>
                                <td>{{ adminOplog.admin.name }}</td>
                                <td>{{ adminOplog.addtime }}</td>
                                <td>{{ adminOplog.content }}</td>
                                <td>{{ adminOplog.ip }}</td>
                            </tr>
                        {% endfor %}

                        </tbody>
                    </table>

                </div>
            </div>

        </div>

    </div>
{% endblock %}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

9.权限管理

9.1 得生成权限列表分发,需要forms表单


from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired


class BaseForm(FlaskForm):
    name = StringField(
        label='权限名称',
        validators=[
            DataRequired('请输入权限名称!')
        ],
    )
    url = StringField(
        label='访问链接',
        validators=[
            DataRequired('请输入访问链接!')
        ],
    )


class AuthForm(BaseForm):
    submit = SubmitField(
        label='添加权限',
    )


class EditAuthForm(BaseForm):
    submit = SubmitField(
        label='更新权限',
    )

9.2 权限管理的视图函数

import os

from werkzeug.utils import secure_filename

from app import app, db
from flask import render_template, flash, redirect, url_for, request
from app.admin import admin
from app.admin.forms.auth import AuthForm
from app.admin.utils import write_adminlog, is_admin_login, permission_control

# ***********************************权限管理操作*****************************
from app.models import Auth


@admin.route("/auth/add/", methods=['GET', 'POST'])
@is_admin_login
@permission_control
def auth_add():
    form = AuthForm()
    if form.validate_on_submit():
        data = form.data
        if Auth.query.filter_by(url=data['url']).count() == 1:
            flash('权限链接地址已存在!', category='err')
            return redirect(url_for('admin.auth_add'))
        auth = Auth(
            name=data['name'],
            url=data['url']
        )
        db.session.add(auth)
        db.session.commit()
        flash('权限地址%s添加成功!' % (auth.name), category='ok')
        write_adminlog('权限地址%s添加成功!' % (auth.name))
    return render_template('admin/auth/add.html', form=form)


@admin.route("/auth/list/")
@admin.route("/auth/list/<int:page>/")
@is_admin_login
@permission_control
def auth_list(page=1):
    authsPageObj = Auth.query.order_by(Auth.addtime.desc()).paginate(page=page, per_page=app.config['PER_PAGE'])
    return render_template('admin/auth/list.html', authsPageObj=authsPageObj)


@admin.route("/auth/delete/<int:id>/")
@is_admin_login
@permission_control
def auth_del(id=None):
    if id:
        auth = Auth.query.get_or_404(id)
        db.session.delete(auth)
        db.session.commit()
        flash('删除权限地址%s成功' % (auth.name), category='ok')
        write_adminlog('删除权限地址%s成功' % (auth.name))
        return redirect(url_for('admin.auth_list', page=1))


@admin.route("/auth/edit/<int:id>/", methods=['GET', 'POST'])
@permission_control
@is_admin_login
def auth_edit(id=None):
    auth = Auth.query.get_or_404(id)
    form = AuthForm(
        name=auth.name,
        url=auth.url
    )
    if form.validate_on_submit():
        data = form.data
        if Auth.query.filter_by(url=data['url']).count() == 1 and auth.url != data['url']:
            flash('权限链接地址已存在!', category='err')
            return redirect(url_for('admin.auth_edit', id=id))
        auth.name = data['name']
        auth.url = data['url']
        db.session.commit()
        flash('权限地址<%s>修改成功!' % (auth.url), category='ok')
        write_adminlog('权限地址<%s>修改成功!' % (auth.url))
    return render_template('admin/auth/edit.html', form=form)

9.3 权限管理的页面实现

# 添加权限

{% extends 'admin/base.html' %}
{% import "bootstrap/wtf.html" as wtf %}


{% block title %}添加权限{% endblock %}
{% block content %}
    <div class="col-lg-11">
        {#   参考 路径导航:  https://v3.bootcss.com/components/#breadcrumbs           #}
        <h1>微电影管理系统</h1>
        <ol class="breadcrumb">
            <li><a href="{{ url_for('admin.index') }}"><i class="fa fa-dashboard"></i> 首页</a></li>
            <li><a href="{{ url_for('admin.auth_add') }}"><i class="fa fa-dashboard"></i> 权限管理</a></li>
            <li><a href="{{ url_for('admin.auth_add') }}"><i class="fa fa-dashboard"></i> 添加权限</a></li>
            <li><a href="{{ url_for('admin.auth_list') }}"><i class="fa fa-dashboard"></i> 权限列表</a></li>

        </ol>
        {#    面板   #}
        <div class="panel panel-default panel-info">
            <div class="panel-heading">
                <h3 class="panel-title"><span class="glyphicon glyphicon-plus-sign"></span>
                    添加权限</h3>
            </div>
            <div class="panel-body">

                {{ wtf.quick_form(form) }}

            </div>
        </div>
    </div>
{% endblock %}


## 修改权限

{% extends 'admin/base.html' %}
{% import "bootstrap/wtf.html" as wtf %}


{% block title %}编辑权限{% endblock %}
{% block content %}
    <div class="col-lg-11">
        {#   参考 路径导航:  https://v3.bootcss.com/components/#breadcrumbs           #}
        <h1>微电影管理系统</h1>
        <ol class="breadcrumb">
            <li><a href="{{ url_for('admin.index') }}"><i class="fa fa-dashboard"></i> 首页</a></li>
            <li><a href="{{ url_for('admin.auth_add') }}"><i class="fa fa-dashboard"></i> 权限管理</a></li>
            <li><a href="{{ url_for('admin.auth_add') }}"><i class="fa fa-dashboard"></i> 添加权限</a></li>
            <li><a href="{{ url_for('admin.auth_list') }}"><i class="fa fa-dashboard"></i> 权限列表</a></li>

        </ol>
        {#    面板   #}
        <div class="panel panel-default panel-info">
            <div class="panel-heading">
                <h3 class="panel-title"><span class="glyphicon glyphicon-plus-sign"></span>
                    编辑权限</h3>
            </div>
            <div class="panel-body">

                {{ wtf.quick_form(form) }}

            </div>
        </div>
    </div>
{% endblock %}


## 权限列表

{% extends 'admin/base.html' %}

{% block title %}权限列表{% endblock %}
{% block content %}
    <div class="col-lg-11">
        {#   参考 路径导航:  https://v3.bootcss.com/components/#breadcrumbs           #}
        <h1>微电影管理系统</h1>
        <ol class="breadcrumb">
            <li><a href="{{ url_for('admin.index') }}"><i class="fa fa-dashboard"></i> 首页</a></li>
            <li><i class="fa fa-dashboard"></i> 权限管理</li>
            <li><a href="{{ url_for('admin.auth_add') }}"><i class="fa fa-dashboard"></i> 添加权限</a></li>
            <li><a href="{{ url_for('admin.auth_list') }}"><i class="fa fa-dashboard"></i> 权限列表</a></li>
        </ol>

        <div class="panel panel-default panel-info">
            <div class="panel-heading">
                <h3 class="panel-title"><span class="glyphicon glyphicon-map-marker"></span>
                    权限列表
                </h3>
            </div>
            <div class="panel-body">

                <br/>

                {#                   登录日志表格#}
                <table class="table table-bordered">
                    <tbody>
                    <tr>
                        <th>编号</th>
                        <th>名称</th>
                        <th>地址</th>
                        <th>添加时间</th>
                        <th>操作事项</th>
                    </tr>
                    {% for auth in authsPageObj.items %}
                        <tr>
                            <td>{{ auth.id }}</td>
                            <td>{{ auth.name }}</td>
                            <td>{{ auth.url }}</td>
                            <td>{{ auth.addtime }}</td>
                            <td>
                                <a class="label label-success" href="{{ url_for('admin.auth_edit', id=auth.id) }}">编辑</a>
                                &nbsp;
                                <a class="label label-danger" href="{{ url_for('admin.auth_del', id=auth.id) }}">删除</a>
                            </td>
                        </tr>
                    {% endfor %}
                    </tbody>
                </table>


            </div>
        </div>


        <div class="col-md-12 text-center">
            <nav aria-label="Page navigation">
                <ul class="pagination">
                    <li>
                        <a href="#" aria-label="First">
                            <span aria-hidden="true">首页</span>
                        </a>
                    </li>
                    <li>
                        <a href="#" aria-label="Previous">
                            <span aria-hidden="true">上一页</span>
                        </a>
                    </li>
                    <li><a href="#">1&nbsp;/&nbsp;10</a></li>
                    <li>
                        <a href="#" aria-label="Next">
                            <span aria-hidden="true">下一页</span>
                        </a>
                    </li>
                    <li>
                        <a href="#" aria-label="Last">
                            <span aria-hidden="true">尾页</span>
                        </a>
                    </li>
                </ul>
            </nav>
        </div>


    </div>

{% endblock %}

在这里插入图片描述
在这里插入图片描述

10.角色管理

10.1 角色管理需要生成新的角色,其中包含该角色的权限,需要生成表单


from flask_wtf import FlaskForm
from wtforms import StringField, FileField, SubmitField, SelectMultipleField
from wtforms.validators import DataRequired

from app.models import Auth


class BaseForm(FlaskForm):
    name = StringField(
        label='角色名称',
        validators=[
            DataRequired('请输入角色名称!')
        ],
    )
    auths = SelectMultipleField(
        label='权限列表',
        description='请选择权限列表!(可多选)',
        coerce=int,
        # choices=[(item.id, item.name) for item in Auth.query.all()]
    )

    def __init__(self, *args, **kwargs):
        super(BaseForm, self).__init__(*args, **kwargs)
        self.auths.choices = [(item.id, item.name) for item in Auth.query.all()]


class RoleForm(BaseForm):
    submit = SubmitField(
        label='添加角色',

    )


class EditRoleForm(BaseForm):
    submit = SubmitField(
        label='编辑角色',
    )

10.2 角色管理的视图函数


import os

from werkzeug.utils import secure_filename

from app import app, db
from flask import render_template, flash, redirect, url_for,request
from app.admin import admin
from app.admin.forms.movie import MovieForm
from app.admin.forms.role import RoleForm, EditRoleForm
from app.admin.utils import write_adminlog, is_admin_login, permission_control
from app.home import change_filename


# **************************管理员角色操作********************************
from app.models import Role


@admin.route("/role/add/", methods=['GET', 'POST'])
@is_admin_login
@permission_control
def role_add():
    form = RoleForm()
    if form.validate_on_submit():
        data = form.data
        if Role.query.filter_by(name=data['name']).count() == 1:
            flash('管理员角色已存在!', category='err')
            return redirect(url_for('admin.role_add'))
        print(data['auths'])
        print(",".join(list(map(str, data['auths']))))
        role = Role(
            name=data['name'],
            # 默认多选返回的是一个列表, 里面存储的是权限的id号;
            auths=",".join(list(map(str, data['auths'])))
        )
        db.session.add(role)
        db.session.commit()
        flash('角色地址%s添加成功!' % (role.name), category='ok')
        write_adminlog('角色地址%s添加成功!' % (role.name))
    return render_template('admin/role/add.html', form=form)


@admin.route("/role/list/")
@admin.route("/role/list/<int:page>/")
@is_admin_login
@permission_control
def role_list(page=1):
    rolesPageObj = Role.query.order_by(Role.addtime.desc()).paginate(page=page, per_page=app.config['PER_PAGE'])
    return render_template('admin/role/list.html', rolesPageObj=rolesPageObj)


@admin.route("/role/delete/<int:id>/")
@is_admin_login
@permission_control
def role_del(id=None):
    if id:
        role = Role.query.get_or_404(id)
        db.session.delete(role)
        db.session.commit()
        flash('删除角色地址%s成功' % (role.name), category='ok')
        write_adminlog('删除角色地址%s成功' % (role.name))
        return redirect(url_for('admin.role_list', page=1))


@admin.route("/role/edit/<int:id>/", methods=['GET', 'POST'])
@is_admin_login
@permission_control
def role_edit(id=None):
    role = Role.query.get_or_404(id)
    form = EditRoleForm(
        name=role.name,
        auths=list(map(lambda item: int(item), role.auths.split(','))) if role.auths else ''  # 换回int型列表
    )
    if form.validate_on_submit():
        data = form.data
        if Role.query.filter_by(name=data['name']).count() == 1 and role.name != data['name']:
            flash('角色名已存在!', category='err')
            return redirect(url_for('admin.role_edit', id=id))
        role.name = data['name']
        role.auths = ",".join(map(str, data['auths']))
        db.session.commit()
        flash('角色<%s>修改成功!' % (role.name), category='ok')
        write_adminlog('角色地址<%s>修改成功!' % (role.name))
    return render_template('admin/role/edit.html', form=form)

10.3 角色管理的页面实现

## 添加角色

{% extends 'admin/base.html' %}
{% import "bootstrap/wtf.html" as wtf %}


{% block title %}添加角色{% endblock %}
{% block content %}
    <div class="col-lg-11">
        {#   参考 路径导航:  https://v3.bootcss.com/components/#breadcrumbs           #}
        <h1>微电影管理系统</h1>
        <ol class="breadcrumb">
            <li><a href="{{ url_for('admin.index') }}"><i class="fa fa-dashboard"></i> 首页</a></li>
            <li><a href="{{ url_for('admin.role_add') }}"><i class="fa fa-dashboard"></i> 角色管理</a></li>
            <li><a href="{{ url_for('admin.role_add') }}"><i class="fa fa-dashboard"></i> 添加角色</a></li>
            <li><a href="{{ url_for('admin.role_list') }}"><i class="fa fa-dashboard"></i> 角色列表</a></li>

        </ol>
        {#    面板   #}
        <div class="panel panel-default panel-info">
            <div class="panel-heading">
                <h3 class="panel-title"><span class="glyphicon glyphicon-plus-sign"></span>
                    添加角色</h3>
            </div>
            <div class="panel-body">

                {{ wtf.quick_form(form) }}

            </div>
        </div>
    </div>
{% endblock %}

## 编辑角色
{% extends 'admin/base.html' %}
{% import "bootstrap/wtf.html" as wtf %}


{% block title %}编辑角色{% endblock %}
{% block content %}
    <div class="col-lg-11">
        {#   参考 路径导航:  https://v3.bootcss.com/components/#breadcrumbs           #}
        <h1>微电影管理系统</h1>
        <ol class="breadcrumb">
            <li><a href="{{ url_for('admin.index') }}"><i class="fa fa-dashboard"></i> 首页</a></li>
            <li><a href="{{ url_for('admin.role_add') }}"><i class="fa fa-dashboard"></i> 角色管理</a></li>
            <li><a href="{{ url_for('admin.role_add') }}"><i class="fa fa-dashboard"></i> 添加角色</a></li>
            <li><a href="{{ url_for('admin.role_list') }}"><i class="fa fa-dashboard"></i> 角色列表</a></li>

        </ol>
        {#    面板   #}
        <div class="panel panel-default panel-info">
            <div class="panel-heading">
                <h3 class="panel-title"><span class="glyphicon glyphicon-plus-sign"></span>
                    编辑角色</h3>
            </div>
            <div class="panel-body">

                {{ wtf.quick_form(form) }}

            </div>
        </div>
    </div>
{% endblock %}

## 角色列表

{% extends 'admin/base.html' %}

{% block title %}角色列表{% endblock %}
{% block content %}
    <div class="col-lg-11">
        {#   参考 路径导航:  https://v3.bootcss.com/components/#breadcrumbs           #}
        <h1>微电影管理系统</h1>
        <ol class="breadcrumb">
            <li><a href="{{ url_for('admin.index') }}"><i class="fa fa-dashboard"></i> 首页</a></li>
            <li><i class="fa fa-dashboard"></i> 角色管理</li>
            <li><a href="{{ url_for('admin.role_add') }}"><i class="fa fa-dashboard"></i> 添加角色</a></li>
            <li><a href="{{ url_for('admin.role_list') }}"><i class="fa fa-dashboard"></i> 角色列表</a></li>
        </ol>

        <div class="panel panel-default panel-info">
            <div class="panel-heading">
                <h3 class="panel-title"><span class="glyphicon glyphicon-map-marker"></span>
                    角色列表
                </h3>
            </div>
            <div class="panel-body">

                <br/>

                {#                   登录日志表格#}
                <table class="table table-bordered">
                    <tbody>
                    <tr>
                        <th>编号</th>
                        <th>角色名称</th>
                        <th>添加时间</th>
                        <th>操作事项</th>
                    </tr>
                    {% for role in rolesPageObj.items %}
                        <tr>
                            <td>{{ role.id }}</td>
                            <td>{{ role.name }}</td>
                            <td>{{ role.addtime }}</td>
                            <td>
                                <a class="label label-success" href="{{ url_for('admin.role_edit', id=role.id) }}">编辑</a>
                                &nbsp;
                                <a class="label label-danger" href="{{ url_for('admin.role_del', id=role.id) }}">删除</a>
                            </td>
                        </tr>
                    {% endfor %}
                    </tbody>
                </table>


            </div>
        </div>


        <div class="col-md-12 text-center">
            <nav aria-label="Page navigation">
                <ul class="pagination">
                    <li>
                        <a href="#" aria-label="First">
                            <span aria-hidden="true">首页</span>
                        </a>
                    </li>
                    <li>
                        <a href="#" aria-label="Previous">
                            <span aria-hidden="true">上一页</span>
                        </a>
                    </li>
                    <li><a href="#">1&nbsp;/&nbsp;10</a></li>
                    <li>
                        <a href="#" aria-label="Next">
                            <span aria-hidden="true">下一页</span>
                        </a>
                    </li>
                    <li>
                        <a href="#" aria-label="Last">
                            <span aria-hidden="true">尾页</span>
                        </a>
                    </li>
                </ul>
            </nav>
        </div>


    </div>

{% endblock %}

在这里插入图片描述
在这里插入图片描述

11.管理员管理

11.1 需要生成新的管理员赋予一些权限,需要表单


from wtforms.validators import DataRequired, ValidationError, EqualTo
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField, PasswordField, SelectField
from wtforms.validators import DataRequired

from app.models import Role


class BaseForm(FlaskForm):
    name = StringField(
        label='管理员名称',
        validators=[
            DataRequired('请输入管理员名称!')
        ],
    )

    pwd = PasswordField(
        label='管理员密码',
        validators=[
            DataRequired('请输入管理员密码!')
        ],
    )
    repwd = PasswordField(
        label='管理员确认密码',
        validators=[
            DataRequired('请输入管理员确认密码!'),
            EqualTo('pwd', message='两次密码不一致')
        ],
    )
    is_super = SelectField(
        label='是否超级管理员',
        description='默认为普通管理员',
        coerce=int,
        choices=[(0, '普通管理员'), (1, '超级管理员')],

    )
    role_id = SelectField(
        label='所属角色',
        validators=[
            DataRequired('请选择所属角色!')
        ],
        coerce=int,
        # choices=[(role.id, role.name) for role in Role.query.all()],
        description='所属角色',

    )

    def __init__(self, *args, **kwargs):
        super(BaseForm, self).__init__(*args, **kwargs)
        self.role_id.choices = [(v.id, v.name) for v in Role.query.all()]


class AdminForm(BaseForm):
    submit = SubmitField(
        label='添加管理员',
    )


class EditAdminForm(BaseForm):
    submit = SubmitField(
        label='编辑管理员',
    )

11.2 管理员管理的视图函数‘

import os

from werkzeug.utils import secure_filename

from app import app, db
from flask import render_template, flash, redirect, url_for, request
from app.admin import admin
from app.admin.forms.admin import AdminForm
from app.admin.forms.movie import MovieForm
from app.admin.utils import write_adminlog, is_admin_login, permission_control
from app.home import change_filename


# *************************************管理员操作**************************************
from app.models import Admin


@admin.route("/admin/add/", methods=['GET', 'POST'])
@is_admin_login
@permission_control
def admin_add():
    form = AdminForm()
    from werkzeug.security import generate_password_hash
    if form.validate_on_submit():
        data = form.data
        if Admin.query.filter_by(name=data['name']).count() == 1:
            flash('管理员已存在!', category='err')
            return redirect(url_for('admin.admin_add'))

        if not data['is_super']:
            data['is_super'] = 0

        add_admin = Admin(
            name=data['name'],
            password=generate_password_hash(data['pwd']),
            role_id=data['role_id'],
            is_super=data['is_super']
        )
        db.session.add(add_admin)
        db.session.commit()
        flash('管理员添加成功', category='ok')
    return render_template('admin/admin/add.html', form=form)


@admin.route("/admin/list/")
@admin.route("/admin/list/<int:page>/")
@is_admin_login
@permission_control
def admin_list(page=1):
    adminsPageObj = Admin.query.order_by(
        Admin.addtime.desc()
    ).paginate(page=page, per_page=app.config['PER_PAGE'])
    return render_template('admin/admin/list.html', adminsPageObj=adminsPageObj)

11.3 管理员管理页面的实现

## 管理员的添加

{% extends 'admin/base.html' %}
{% import "bootstrap/wtf.html" as wtf %}


{% block title %}添加管理员{% endblock %}
{% block content %}
    <div class="col-lg-11">
        {#   参考 路径导航:  https://v3.bootcss.com/components/#breadcrumbs           #}
        <h1>微电影管理系统</h1>
        <ol class="breadcrumb">
            <li><a href="{{ url_for('admin.index') }}"><i class="fa fa-dashboard"></i> 首页</a></li>
            <li><a href="{{ url_for('admin.admin_add') }}"><i class="fa fa-dashboard"></i> 管理员管理</a></li>
            <li><a href="{{ url_for('admin.admin_add') }}"><i class="fa fa-dashboard"></i> 添加管理员</a></li>
            <li><a href="{{ url_for('admin.admin_list') }}"><i class="fa fa-dashboard"></i> 管理员列表</a></li>

        </ol>
        {#    面板   #}
        <div class="panel panel-default panel-info">
            <div class="panel-heading">
                <h3 class="panel-title"><span class="glyphicon glyphicon-plus-sign"></span>
                    添加管理员</h3>
            </div>
            <div class="panel-body">

                {{ wtf.quick_form(form) }}

            </div>
        </div>
    </div>
{% endblock %}


## 管理员的查看列表

{% extends 'admin/base.html' %}

{% block title %}管理员列表{% endblock %}
{% block content %}
    <div class="col-lg-11">
        {#   参考 路径导航:  https://v3.bootcss.com/components/#breadcrumbs           #}
        <h1>微电影管理系统</h1>
        <ol class="breadcrumb">
            <li><a href="{{ url_for('admin.index') }}"><i class="fa fa-dashboard"></i> 首页</a></li>
            <li><i class="fa fa-dashboard"></i> 管理员管理</li>
            <li><a href="{{ url_for('admin.admin_add') }}"><i class="fa fa-dashboard"></i> 添加管理员</a></li>
            <li><a href="{{ url_for('admin.admin_list') }}"><i class="fa fa-dashboard"></i> 管理员列表</a></li>
        </ol>

        <div class="panel panel-default panel-info">
            <div class="panel-heading">
                <h3 class="panel-title"><span class="glyphicon glyphicon-map-marker"></span>
                    管理员列表
                </h3>
            </div>
            <div class="panel-body">

                <br/>

                {#                   登录日志表格#}
                <table class="table table-bordered">
                    <tbody>
                    <tr>
                        <th>编号</th>
                        <th>管理员名称</th>
                        <th>管理员类型</th>
                        <th>管理员角色</th>
                        <th>添加时间</th>
                    </tr>
                    {% for admin in adminsPageObj.items %}
                        <tr>
                            <td>{{ admin.id }}</td>
                            <td>{{ admin.name }}</td>
                            <td>
                                {% if admin.is_super %}
                                    超级管理员
                                {% else %}
                                    普通管理员
                                {% endif %}
                            </td>
                            <td>
                                {% if admin.role %}
                                    {{ admin.role.name }}
                                {% else %}
                                    未选择角色
                                {% endif %}
                            </td>
                            <td>{{ admin.addtime }}</td>
                            {#                            <td>#}
                            {#                                <a class="label label-success"#}
                            {#                                   href="{{ url_for('admin.admin_edit', id=admin.id) }}">编辑</a>#}
                            {#                                &nbsp;#}
                            {#                                <a class="label label-danger"#}
                            {#                                   href="{{ url_for('admin.admin_del', id=admin.id) }}">删除</a>#}
                            {#                            </td>#}
                        </tr>
                    {% endfor %}
                    </tbody>
                </table>


            </div>
        </div>


        <div class="col-md-12 text-center">
            <nav aria-label="Page navigation">
                <ul class="pagination">
                    <li>
                        <a href="#" aria-label="First">
                            <span aria-hidden="true">首页</span>
                        </a>
                    </li>
                    <li>
                        <a href="#" aria-label="Previous">
                            <span aria-hidden="true">上一页</span>
                        </a>
                    </li>
                    <li><a href="#">1&nbsp;/&nbsp;10</a></li>
                    <li>
                        <a href="#" aria-label="Next">
                            <span aria-hidden="true">下一页</span>
                        </a>
                    </li>
                    <li>
                        <a href="#" aria-label="Last">
                            <span aria-hidden="true">尾页</span>
                        </a>
                    </li>
                </ul>
            </nav>
        </div>


    </div>

{% endblock %}

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/GLH_2236504154/article/details/89099330
今日推荐