后台管理中涉及到的会员管理功能为: 会员列表, 会员查看, 会员删除. 因此不涉及表单提交, 没有form类.
本节涉及展示会员列表, 需要插入会员数据.可以自己插入,也可以先学习 "第8章 会员模块实现" 后再反过来进行本节学习!
关注点:
- 会员删除视图函数中的如何删除内存中存下的文件?
if user.face is not None and os.path.exists(os.path.join(app.config["FC_DIR"], user.face)): # 删除磁盘旧文件 os.remove(os.path.join(app.config["FC_DIR"], user.face))
- 会员列表和会员查看中当该会员没有头像时如何显示?
{% if v.face %} <img src="{{ url_for('static', filename='uploads/users/'+v.face) }}" style="width:60px" class="img-responsive center-block" alt=""> {% else %} <img data-src="holder.js/60x60" class="img-responsive center-block" alt=""> {% endif %}
视图函数
视图函数movie2101/app/admin/views.py文件涉及到的三个视图函数如下:
# 会员管理视图函数 会员列表 @admin.route("/user/list/<int:page>", methods=['GET']) @admin_login_req def user_list(page=None): if page is None: page = 1 page_data = User.query.order_by( User.addtime.desc() ).paginate(page=page, per_page=10) return render_template("admin/user_list.html", page_data=page_data) # 会员查看 @admin.route("/user/view/<int:id>", methods=['GET']) @admin_login_req def user_view(id=None): user = User.query.get_or_404(int(id)) return render_template("admin/user_view.html", user=user) # 会员删除 @admin.route("/user/del/<int:id>", methods=['GET']) @admin_login_req def user_del(id=None): user = User.query.get_or_404(int(id)) if user.face is not None and os.path.exists(os.path.join(app.config["FC_DIR"], user.face)): # 删除磁盘旧文件 os.remove(os.path.join(app.config["FC_DIR"], user.face)) db.session.delete(user) db.session.commit() flash("删除会员成功!", "ok") # return render_template("admin/user_list.html", page=1) # 会报错 jinja2.exceptions.UndefinedError: 'page_data' is undefined return redirect(url_for("admin.user_list", page=1))
会员列表html
movie2101/app/templates/admin/user_list.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="width: 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">×</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> {% endfor %} <table class="table table-hover"> <tbody> <tr> <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.name }}</td> <td>{{ v.email }}</td> <td>{{ v.phone }}</td> <td> {% if v.face %} <img src="{{ url_for('static', filename='uploads/users/'+v.face) }}" style="width:60px" class="img-responsive center-block" alt=""> {% else %} <img data-src="holder.js/60x60" class="img-responsive center-block" alt=""> {% endif %} </td> <td>正常/冻结</td> <td>{{ v.addtime }}</td> <td> <a class="label label-success" href="{{ url_for('admin.user_view', id=v.id)}}">查看</a> <a class="label label-info">解冻</a> <a class="label label-warning">冻结</a> <a class="label label-danger" href="{{ url_for('admin.user_del', id=v.id)}}">删除</a> </td> </tr> {% endfor %} </tbody> </table> </div> <div class="box-footer clearfix"> {{ pg.page(page_data, 'admin.user_list') }} </div> </div> </div> </div> </section> <!--内容--> {% endblock %} {% block js %} <script> $(document).ready(function () { $("#g-5").addClass("active"); $("#g-5-1").addClass("active") }) </script> {% endblock %}
会员查看html
movie2101/app/templates/admin/user_view.html文件涉及内容如下:
{% extends "admin/admin.html" %} {% block css %} <style> .table > tbody > tr > td, .table > tbody > tr > th, .table > tfoot > tr > td, .table > tfoot > tr > th, .table > thead > tr > td, .table > thead > tr > th { vertical-align: middle; text-align: left; } .td_bd { font-weight: bold; } </style> {% endblock %} {% 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> <div class="box-body table-responsive no-padding"> <table class="table table-hover"> <tbody> <tr> <td class="td_bd">编号:</td> <td>{{ user.id }}</td> </tr> <tr> <td class="td_bd">昵称:</td> <td>{{ user.name }}</td> </tr> <tr> <td class="td_bd">邮箱:</td> <td>{{ user.email }}</td> </tr> <tr> <td class="td_bd">手机:</td> <td>{{ user.phone }}</td> </tr> <tr> <td class="td_bd">头像:</td> <td> {% if user.face %} <img src="{{ url_for('static', filename='uploads/users/'+user.face) }}" style="width: 100px" class="img-responsive" alt=""> {% else %} <img data-src="holder.js/100x100" class="img-responsive img-rounded"> {% endif %} </td> </tr> <tr> <td class="td_bd">注册时间:</td> <td> {{ user.addtime }} </td> </tr> <tr> <td class="td_bd">唯一标志符:</td> <td> {{ user.addtime }} </td> </tr> <tr> <td class="td_bd">个性简介:</td> <td> {{ user.info }} </td> </tr> </tbody> </table> </div> </div> </div> </div> </section> <!--内容--> {% endblock %} {% block js %} <script> $(document).ready(function () { $("#g-5").addClass("active"); $("#g-5-1").addClass("active") }) </script> {% endblock %}