本书未发布
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
只保留控制器里的 index
和 delete
方法,详细代码如下。
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 "后台话题管理"
推荐文章: