本书未发布

84. 回复管理

未匹配的标注

说明

在本节里,我们完成后台回复管理功能。

需求分析

和注册用户管理一样,后台模块只能查看回复列表和删除话题,不能添加或编辑回复信息。

回复列表

  • 有查看权限的管理员用户才可以访问本页面;
  • 按回复创建时间降序排列显示出回复关联的话题标题、回复创建用户昵称、回复创建用户头像和回复创建时间;
  • 点击话题标题跳转到前台话题详情页;
  • 点击创建用户昵称或头像跳转到前台个人中心页面;
  • 可以按分类和标题关键词搜索话题;

删除回复

  • 有删除权限的管理员用户才可以删除记录;
  • 点击删除用户时需要弹出确认提示,当管理员确认后再能删除;
  • 删除操作请求必须是DELETE请求;
  • 回复删除后关联话题的「回复数」减一。

观察者

因为在前台开时我们已经实现回复删除成功后,关联话题的「回复数」减一功能,所以在这里不需要再进行开发。

模型

在回复模型里添加后台管理员使用的搜索方法:

application/common/model/Reply.php

<?php
.
.
.
class Reply extends Model
{
    .
    .
    .
    /**
     * 后台模块搜索方法
     * @Author   zhanghong(Laifuzi)
     * @DateTime 2019-06-25
     * @param    array              $params    [description]
     * @param    integer            $page_rows [description]
     * @return   [type]                        [description]
     */
    public static function adminPaginate($params = [], $page_rows = 15)
    {
        $self = self::order('id', 'DESC');
        $map = [];
        foreach ($params as $name => $text) {
            $text = trim($text);
            switch ($name) {
                case 'keyword':
                    if(!empty($text)){
                        $like_text = '%'.$text.'%';
                        $self = $self->whereLike('content', $like_text);
                    }
                    break;
            }
        }
        return $self->with('user,topic')->paginate($page_rows, false, ['query' => $params]);
    }
}

控制器

创建回复管理控制器:

$ php think make:controller admin/Reply

只保留控制器里的 indexdelete 方法,详细代码如下:

application/admin/controller/Reply.php

<?php

namespace app\admin\controller;

use think\Request;
use tpadmin\controller\Controller;
use app\common\model\Reply as ReplyModel;

class Reply extends Controller
{
    public function index(Request $request)
    {
        $param = $request->param();
        $paginate = ReplyModel::adminPaginate($param);
        $this->assign('param', $param);
        $this->assign('paginate', $paginate);
        return $this->fetch('reply/index');
    }

    public function delete($id)
    {
        $reply = ReplyModel::find($id);
        if(!empty($reply)){
            $reply->delete();
        }
        return $this->success([]);
    }
}

路由

在配置文件里定义控制方法访问路由规则:

route/admin_content.php

<?php

Route::group([
    'name' => 'admin',
    'middleware' => ['tpadmin.admin', 'tpadmin.admin.role'],
], function () {
    .
    .
    .
    // 回复管理
    Route::get('/reply', 'Reply@index')->name('admin.reply.index');
    Route::delete('/reply/<id>', 'reply/delete')->name('admin.reply.delete');
})->prefix('\\app\\admin\\controller\\');

视图模板

创建回复列表视图模板页面,详细代码如下:

application/admin/view/reply/index.html

{extend name="layout:base" /}
{block name="main_content"}
<div class="row maintop">
    <div class="col-xs-10 col-sm-5">
        <form name="form_search" class="form-search" method="get">
            <div class="input-group">
                <span class="input-group-addon">
                    <i class="ace-icon fa fa-check"></i>
                </span>
                <input type="text" name="keyword" id="keyword" class="form-control" value="{$param.keyword|default=''}" placeholder="请输入关键词" />
                <span class="input-group-btn">
                    <button type="submit" class="btn btn-purple btn-sm">
                        <span class="ace-icon fa fa-search icon-on-right bigger-110"></span>
                        搜索
                    </button>
                </span>
            </div>
        </form>
    </div>
    <div class="col-xs-4 col-sm-5">
        <div class="input-group-btn">
            <a href="{:url('[admin.reply.index]')}">
                <button type="button" class="btn btn-sm  btn-purple">
                    <span class="ace-icon fa fa-globe icon-on-right bigger-110"></span>
                    显示全部
                </button>
            </a>
        </div>
    </div>
</div>

<div class="row">
    <div class="col-xs-12">
        <table class="table table-striped table-bordered table-hover" id="dynamic-table">
            <thead>
                <tr>
                    <th>用户名</th>
                    <th>回复内容</th>
                    <th>创建时间</th>
                    <th class="center">操作</th>
                </tr>
            </thead>
            <tbody>
                {foreach $paginate->all() as $key => $reply }
                <tr>
                    <td>
                        <a href="{:url('user.read', ['id' => $reply->id, 'tab' => 'replies'])}" target="_blank">
                            {$reply->user->name}
                        </a>
                    </td>
                    <td>{$reply->content}</td>
                    <td>{$reply->create_time}</td>
                    <td class="center">
                        {if auth_check('user/delete', $current_adminer->id) }
                            <a class="red" herf="javascript:void(0);" onclick="alert_del(this);" data-del-href="{:url('[admin.reply.delete]', ['id' => $reply.id])}" data-del-id='{$reply.id}'>
                                <i class="ace-icon fa fa-trash-o bigger-130"></i>删除
                            </a>
                        {/if}
                    </td>
                </tr>
                {/foreach}
            </tbody>
        </table>
        <div>
            <?php echo($paginate->render()); ?>
        </div>
    </div>
</div>
{/block}

权限管理

admin 账号登录后台,添加以下路由规则并给『运营』 角色组分配访问权限。

新增路由规则清单:

上级菜单 菜单标题 页面名称 路由名称 是否显示 排序编号
内容管理 回复管理 reply/index admin.reply.index 230
回复管理 删除回复 reply/delete admin.reply.delete 231

效果预览

manager 账号登录查看回复管理功能:

Git 版本控制

下面把代码纳入到版本管理:

$ git add -A
$ git commit -m "后台回复管理"

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~