Flask开发微电影网站(十)


1.后台管理之角色管理

1.1 角色管理之定义角色表单

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

# 角色表单
class RoleForm(FlaskForm):
    name = StringField(
        label="角色名称",
        validators=[
            DataRequired("请输入角色名称!")
        ],
        description="角色名称",
        render_kw={
            "class": "form-control",
            "placeholder": "请输入角色名称!"
        }
    )
    auths = SelectField(
        label="权限列表",
        validators=[
            DataRequired("请选择权限列表!")
        ],
        coerce=int,
        choices=[(v.id, v.name) for v in auth_list],
        description="权限列表",
        render_kw={
            "class": "form-control"
        }
    )

    submit = SubmitField(
        "编辑",
        render_kw={
            "class": "btn btn-primary",
        }
    )

1.2 角色管理之所有角色列表

1.2.1 角色管理之所有角色列表视图函数

在admin目录下的views.py文件中定义所有角色列表视图函数

所有角色列表视图函数需要被登录控制装饰器权限控制装饰器同时装饰

@admin.route('/role/list//', methods=["GET", "POST"])
@admin_login_req
@admin_auth
def role_list(page=None):
    if page is None:
        page = 1
    page_data = Role.query.order_by(Role.id).paginate(page=page, per_page=10)
    return render_template("admin/role_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.name }} {{ v.addtime }} 编辑   删除
{% endblock %} {% block js %} $(document).ready(function () { $("#g-10").addClass('active'); $("#g-10-2").addClass('active'); }); {% endblock %}

1.3 角色管理之添加角色

1.3.1 角色管理之添加角色视图函数

在admin目录下的views.py文件中定义添加角色视图函数

添加角色视图函数需要被登录控制装饰器权限控制装饰器同时装饰

@admin.route('/role/add/', methods=["GET", "POST"])
@admin_login_req
@admin_auth
def role_add():
    form = RoleForm()
    if form.validate_on_submit():
        data = form.data
        role = Role(
            name=data.get("name"),
            auths=",".join(map(lambda v: str(v), data.get("auths")))
        )
        db.session.add(role)
        db.session.commit()
        flash("添加角色成功!", "ok")
        return redirect(url_for("admin.role_list", page=1))
    return render_template("admin/role_add.html", form=form)

1.3.2 角色管理之添加角色前端页面

添加角色前端页面继承admin.html页面

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

{% block css %}
    
{% endblock %}

{% block content %}
    

微管理员管理系统

添加角色

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

操作成功

{{ msg }}
{% endfor %}
{{ form.name }} {% for err in form.name.errors %}
{{ err }}
{% endfor %}
{{ form.auths }} {% for err in form.auths.errors %}
{{ err }}
{% endfor %}
{% endblock %} {% block js %} $(document).ready(function () { $("#g-10").addClass('active'); $("#g-10-1").addClass('active'); }); {% endblock %}

1.4 角色管理之编辑角色

1.4.1 角色管理之编辑角色视图函数

在admin目录下的views.py文件中定义编辑角色视图函数

编辑角色视图函数需要被登录控制装饰器权限控制装饰器同时装饰

@admin.route("/role/edit//", methods=['GET', 'POST'])
@admin_login_req
@admin_auth
def role_edit(id=None):
    form = RoleForm()
    role = Role.query.get_or_404(id)
    if request.method == 'GET':
        auths = role.auths
        form.auths.data = list(map(lambda v: int(v), auths.split(",")))
    if form.validate_on_submit():
        data = form.data
        role.name = data.get("name")
        role.auths = ",".join(map(lambda v: str(v), data.get('auths')))
        db.session.add(role)
        db.session.commit()
        flash("修改角色成功!", "ok")
    return render_template("admin/role_edit.html", form=form, role=role)

1.4.2 角色管理之编辑角色前端页面

编辑角色前端页面继承admin.html页面

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

{% block css %}
    
{% endblock %}

{% block content %}
    

微管理员管理系统

添加角色

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

操作成功

{{ msg }}
{% endfor %}
{{ form.name(value=role.name) }} {% for err in form.name.errors %}
{{ err }}
{% endfor %}
{{ form.auths }} {% for err in form.auths.errors %}
{{ err }}
{% endfor %}
{% endblock %} {% block js %} $(document).ready(function () { $("#g-10").addClass('active'); $("#g-10-1").addClass('active'); }); {% endblock %}

1.5 角色管理之删除角色

1.5 角色管理之删除角色视图函数

在admin目录下的views.py文件中定义删除角色视图函数

删除角色视图函数需要被登录控制装饰器权限控制装饰器同时装饰

@admin.route("/role/del//", methods=['GET'])
@admin_login_req
@admin_auth
def role_del(id=None):
    role = Role.query.filter_by(id=id).first_or_404()
    db.session.delete(role)
    db.session.commit()
    flash("角色删除成功!", "ok")
    return redirect(url_for("admin.role_list", page=1))

2.后台管理之管理员管理

2.1 定义管理员表单

在app的admin目录的forms.py文件中,定义管理员表单

# 管理员列表
class AdminForm(FlaskForm):
    name = StringField(
        label="用户名",
        validators=[
            DataRequired("请输入管理员用户名!")
        ],
        description="用户名",
        render_kw={
            "class": "form-control",
            "placeholder": "请输入管理员用户名!"
        },
    )

    pwd = PasswordField(
        label="管理员密码",
        validators=[
            DataRequired("请输入管理员密码!")
        ],
        description="管理员密码",
        render_kw={
            "class": "form-control",
            "placeholder": "请输入管理员密码!"
        },
    )
    repwd = PasswordField(
        label="管理员重复输入密码",
        validators=[
            DataRequired("请管理员重复输入密码!"),
            EqualTo("pwd", message="两次输入密码不一致!")
        ],
        description="管理员重复输入密码",
        render_kw={
            "class": "form-control",
            "placeholder": "请管理员重复输入密码!"
        },
    )
    role_id = SelectField(
        label="所属角色",
        validators=[
            DataRequired("请选择所属角色!")
        ],
        coerce=int,
        choices=[(v.id, v.name) for v in role_list],
        render_kw={
            "class": "form-control"
        }
    )

    submit = SubmitField(
        "编辑",
        render_kw={
            "class": "btn btn-primary",
        }
    )

2.2 管理员管理之所有管理员列表

2.2.1 管理员管理之管理员列表视图函数

在admin目录下的views.py文件中定义所有管理员列表视图函数

所有管理员列表视图函数需要被登录控制装饰器权限控制装饰器同时装饰

@admin.route('/admin/list//', methods=['GET'])
@admin_login_req
@admin_auth
def admin_list(page=None):
    if page is None:
        page = 1
    page_data = Admin.query.join(Role).filter(Role.id == Admin.role_id).order_by(
        Admin.id
    ).paginate(page=page, per_page=10)

    print("page_data:", page_data)
    return render_template("admin/admin_list.html", page_data=page_data)

2.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 %} {% if v.is_super ==0 %} {% else %} {% endif %} {% endfor %}
编号 管理员名称 管理员类型 管理员角色 添加时间
{{ v.id }} {{ v.name }}超级管理员普通管理员{{ v.role.name }} {{ v.addtime }}
{% endblock %} {% block js %} $(document).ready(function () { $("#g-11").addClass('active'); $("#g-11-2").addClass('active'); }); {% endblock %}

2.3 管理员管理之添加管理员

2.3.1 管理员管理之添加管理员视图函数

在admin目录下的views.py文件中定义添加管理员视图函数

添加管理员视图函数需要被登录控制装饰器权限控制装饰器同时装饰

@admin.route('/admin/add/', methods=['GET', 'POST'])
@admin_login_req
@admin_auth
def admin_add():
    form = AdminForm()
    from werkzeug.security import generate_password_hash
    if form.validate_on_submit():
        data = form.data
        admin = Admin(
            name=data.get("name"),
            pwd=generate_password_hash(data.get('pwd')),
            role_id=data.get("role_id"),
            is_super=1,
        )
        db.session.add(admin)
        db.session.commit()
        flash("添加管理员成功!", "ok")
        return redirect(url_for('admin.admin_list', page=1))
    return render_template("admin/admin_add.html", form=form)

2.3.2 管理员管理之添加管理员前端页面

添加管理员前端页面继承admin.html页面

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

{% block content %}
    
    

微电影管理系统

添加管理员

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

操作成功

{{ msg }}
{% endfor %}
{{ form.name }} {% for err in form.name.errors %}
{{ err }}
{% endfor %}
{{ form.pwd }} {% for err in form.pwd.errors %}
{{ err }}
{% endfor %}
{{ form.repwd }} {% for err in form.repwd.errors %}
{{ err }}
{% endfor %}
{{ form.role_id }} {% for err in form.role_id.errors %}
{{ err }}
{% endfor %}
{% endblock %} {% block js %} $(document).ready(function () { $("#g-11").addClass('active'); $("#g-11-1").addClass('active'); }); {% endblock %}