Skip to content

后台管理

需求分析

  • 管理员用户进行登录,并且根据不同的情况报出不同的错误信息
  • 如果当前已登录用户是管理员,在访问登录页面时直接跳转到后台管理主页
  • 登录界面可以直接使用 Form 表单提交 (也可以采用 ajax 的方式)

后端首页

views/admin.py 中,添加视图返回函数

python
from flask import Blueprint, render_template

admin_bp = Blueprint('admin', __name__)


@admin_bp.route('/admin/index.html')
def admin_index():
    return render_template('admin/index.html')

前端代码准备

templates 目录下创建 admin 文件夹,然后新建 index.html 目录,里面存放后台首页的静态页面。

html
<!doctype html>
<html lang="zh-CN">
  <head>
    <meta charset="UTF-8" />
    <title>后台管理</title>
    <link rel="stylesheet" href="/static/layui/css/layui.css" />
    <link rel="stylesheet" href="/static/css/admin.css" />
    <script src="/static/layui/layui.js"></script>
  </head>
  <body>
    <div class="layui-layout layui-layout-admin">
      <div class="layui-header">
        <div class="layui-logo layui-hide-xs layui-bg-black">后台管理页面</div>
        <!-- 头部区域(可配合 layui 已有的水平导航) -->

        <ul class="layui-nav layui-layout-right" style="margin-right: 20px">
          <li class="layui-nav-item layui-hide layui-show-md-inline-block">
            <a href="javascript:;">
              <img src="/static/images/person.png" class="layui-nav-img" />
              正心
            </a>
            <dl class="layui-nav-child">
              <dd><a href="">个人中心</a></dd>
              <dd><a href="">退出</a></dd>
            </dl>
          </li>
        </ul>
      </div>

      <div class="layui-side layui-bg-black">
        <div class="layui-side-scroll">
          <!-- 左侧导航区域(可配合 layui 已有的垂直导航) -->
          <ul class="layui-nav layui-nav-tree" lay-filter="test">
            <li class="layui-nav-item">
              <a class="" href="javascript:;">用户管理</a>
              <dl class="layui-nav-child">
                <dd>
                  <a href="user_count.html" target="main_iframe">用户统计</a>
                </dd>
                <dd>
                  <a href="user_list.html" target="main_iframe">用户列表</a>
                </dd>
              </dl>
            </li>
            <li class="layui-nav-item">
              <a href="javascript:;">新闻管理</a>
              <dl class="layui-nav-child">
                <dd>
                  <a href="article_list.html" target="main_iframe">文章列表</a>
                </dd>
                <dd>
                  <a href="article_edit.html" target="main_iframe">文章审核</a>
                </dd>
              </dl>
            </li>
          </ul>
        </div>
      </div>

      <div class="layui-body">
        <!-- 内容主体区域 -->
        <iframe src="" id="main_iframe" name="main_iframe"></iframe>
      </div>

      <div class="layui-footer">
        <!-- 底部固定区域 -->
        底部固定区域
      </div>
    </div>
  </body>
</html>

后台权限检测

后端需要进行权限登录,因为是后端部分,建议使用 cls 的方式进行处理,后端只要提供接口就可以了。

进入后台页面之后,请求后端获取个人信息接口,在前端判断是否拥有权限,没有的话跳转到后端登录页面。

前端发送请求

html

后端接口返回个人数据

python

如果个人数据没有权限,跳转到后台登录页

问题:在当前代码逻辑下,如果一个普通用户直接访问管理后台的主页,或者访问后续实现的视图函数路由,是直接可以进入的,如何解决?

后台登录

编写后台登录视图

python
from flask import Blueprint, render_template

admin_bp = Blueprint('admin', __name__)


@admin_bp.route('/admin/login.html')
def login_index():
    return render_template('admin/login.html')

然后编写前端视图

html
<!doctype html>
<html lang="zh-CN">
  <head>
    <meta charset="UTF-8" />
    <title>后台页面登录</title>
  </head>
  <body></body>
</html>

前端登录页面

实现登录的逻辑

html

后端逻辑实现

python

添加测试用户

  • 为了更直观的展示后台数据效果,使用代码添加测试用户数据
python
@app.cli.command()
def add_test_users():
    users = []
    now = datetime.datetime.now()
    for num in range(0, 10000):
        try:
            user = models.User()
            user.nick_name = "%011d" % num
            user.mobile = "%011d" % num
            user.password_hash = "pbkdf2:sha256:50000$SgZPAbEj$a253b9220b7a916e03bf27119d401c48ff4a1c81d7e00644e0aaf6f3a8c55829"
            user.last_login = now - datetime.timedelta(seconds=random.randint(0, 2678400))
            users.append(user)
            print(user.mobile)
        except Exception as e:
            print(e)
    db.session.commit()
    click.echo('OK')

执行以上方法,添加测试用户