本书未发布

83. 话题管理

未匹配的标注

简介

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

需求分析

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

话题列表

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

删除话题

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

观察者

因为,我们在第7章开发回复删除功能时,已经在话题观察者里已实现话题删除后删除关联回复记录功能,所以不需要更新观察者监听事件。

模型

因为在前面章节里我们已经在话题模型里注册了 Topic 观察者,所以现在我们只需要添加后台管理员使用的搜索方法。

application/common/model/Topic.php

<?php
.
.
.
class Topic 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 'category_id':
                    $self = $self->where('category_id', intval($text));
                    break;
                case 'keyword':
                    if(!empty($text)){
                        $like_text = '%'.$text.'%';
                        $self = $self->whereLike('title', $like_text);
                    }
                    break;
            }
        }
        // 同时预加载user和category进行分页查询
        return $self->with('user,category')->paginate($page_rows, false, ['query' => $params]);
    }
}

控制器

首先创建后台话题管理控制器

$ php think make:controller admin/Topic

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

application/admin/controller/Topic.php

<?php

namespace app\admin\controller;

use think\Request;
use tpadmin\controller\Controller;
use app\common\model\Topic as TopicModel;
use app\common\model\Category as CategoryModel;

class Topic extends Controller
{
    public function index(Request $request)
    {
        $param = $request->param();
        $paginate = TopicModel::adminPaginate($param);
        $this->assign('param', $param);
        $this->assign('categories', CategoryModel::all());
        $this->assign('paginate', $paginate);
        return $this->fetch('topic/index');
    }

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

路由

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

route/admin_content.php

<?php

Route::group([
    'name' => 'admin',
    'middleware' => ['tpadmin.admin', 'tpadmin.admin.role'],
], function () {
    // 用户管理
    Route::get('/user', 'User@index')->name('admin.user.index');
    Route::delete('/user/<id>', 'user/delete')->name('admin.user.delete');
    // 话题管理
    Route::get('/topic', 'Topic@index')->name('admin.topic.index');
    Route::delete('/topic/<id>', 'topic/delete')->name('admin.topic.delete');
})->prefix('\\app\\admin\\controller\\');

视图模板

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

application/admin/view/topic/index.html

{extend name="layout:base" /}
{block name="main_content"}
<div class="row maintop">
    <div class="col-xs-10 col-sm-8">
        <form name="form_search" class="form-search form-horizontal" method="get">
            <div class="row">
                <label class="col-sm-2 control-label" style="padding-right: 0px;">分类:</label>
                <div class="col-sm-3">
                    <select name="category_id" class="form-control">
                        <option value="" hidden disabled selected <?php if(!isset($param['category_id'])){ echo('selected'); } ?>>所有分类</option>
                        {volist name='categories' id='category'}
                            <option value="{$category->id}" <?php if(isset($param['category_id']) && $param['category_id']==$category->id){ echo('selected'); } ?>>
                                {$category->name}
                            </option>
                        {/volist}
                    </select>
                </div>
                <label class="col-sm-2 control-label no-padding-right" style="padding-right: 0px;">关键词:</label>
                <div class="col-sm-5">
                    <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>
                </div>
            </div>
        </form>
    </div>
    <div class="col-xs-4 col-sm-3">
        <div class="input-group-btn">
            <a href="{:url('[admin.topic.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>ID</th>
                    <th>分类</th>
                    <th>标题</th>
                    <th>用户名</th>
                    <th>回复数</th>
                    <th>创建时间</th>
                    <th class="center">操作</th>
                </tr>
            </thead>
            <tbody>
                {foreach $paginate->all() as $key => $topic }
                <tr>
                    <td>{$topic->id}</td>
                    <td>{$topic->category->name}</td>
                    <td>
                        <a href="{:url('topic.read', ['id' => $topic->id])}" target="_blank">
                            {$topic->title}
                        </a>
                    </td>
                    <td>
                        <a href="{:url('user.read', ['id' => $topic->user_id])}" target="_blank">
                            {$topic->user->name}
                        </a>
                    </td>
                    <td>{$topic->reply_count}</td>
                    <td>{$topic->create_time}</td>
                    <td class="center">
                        {if auth_check('topic/delete', $current_adminer->id) }
                            <a class="red" herf="javascript:void(0);" onclick="alert_del(this);" data-del-href="{:url('[admin.topic.delete]', ['id' => $topic.id])}" data-del-id='{$topic.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 账号登录后台,添加以下路由规则并给『运营』 角色组分配访问权限。

新增路由规则清单:

上级菜单 菜单标题 页面名称 路由名称 是否显示 排序编号
内容管理 话题管理 topic/index admin.topic.index 220
话题管理 删除话题 topic/delete admin.topic.delete 221

效果预览

manager 账号登录查看话题管理功能:

Git 版本控制

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

$ git add -A
$ git commit -m "后台话题管理"

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

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


暂无话题~