文件
fenleixinxi/application/admin/controller/fc/Post.php
MiAn 3a2fcf7142 feat: 重构后台管理界面样式并新增商户/帖子审核功能
- 重构后台所有管理页面工具栏,移除图标改用纯文字按钮
- 新增商户管理的批量审核功能与商家详情/审核页面
- 新增帖子管理的批量审核/上下架功能与帖子详情/审核页面
- 新增多媒体相册字段的前后台处理逻辑
- 新增微信订阅消息兼容导出层
- 更新站点版本号并优化品牌色变量
- 新增商户/帖子控制器的详情与审核方法
- 新增 .sql 文件忽略规则
2026-10-23 09:26:22 +08:00

266 行
9.4 KiB
PHP

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

<?php
namespace app\admin\controller\fc;
use app\common\controller\Backend;
use think\Db;
/**
* 同城-信息
*
* @icon fa fa-circle-o
*/
class Post extends Backend
{
/**
* FcPost模型对象
* @var \app\admin\model\FcPost
*/
protected $model = null;
/**
* 无需鉴权的方法(后台登录管理员均可访问)
* @var array
*/
protected $noNeedRight = ['detail', 'audit', 'top', 'offline'];
public function _initialize()
{
parent::_initialize();
$this->model = new \app\admin\model\FcPost;
}
/**
* 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个基础方法、destroy/restore/recyclebin三个回收站方法
* 因此在当前控制器中可不用编写增删改查的代码,除非需要自己控制这部分逻辑
* 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
*/
/**
* 审核信息
*/
/**
* 查看信息详情或进入审核工作台
*
* @param int|null $ids 信息ID
* @return string|\think\response\Json
*/
public function detail($ids = null)
{
$id = $this->request->param('ids', 0) ?: $this->request->param('id/d', 0);
if (!$id) {
$this->error('缺少参数ID');
}
$row = $this->model->where('id', $id)->find();
if (!$row) {
$this->error('信息不存在或已删除');
}
// 补齐分类名称
if ($row->category_id) {
$category = Db::name('fc_category')->where('id', $row->category_id)->find();
$row->category_name = $category ? $category['name'] : '未分类';
} else {
$row->category_name = '未分类';
}
// 解析多图相册
$mediaList = [];
$rawMedia = $row->getData('media');
if (!empty($rawMedia)) {
$decoded = is_string($rawMedia) ? json_decode($rawMedia, true) : $rawMedia;
if (is_array($decoded)) {
$mediaList = array_values(array_filter($decoded));
} else {
$mediaList = array_values(array_filter(explode(',', (string)$rawMedia)));
}
}
if (empty($mediaList) && !empty($row->cover)) {
$mediaList[] = $row->cover;
}
// 获取用户画像
$userInfo = [
'id' => $row->user_id,
'nickname' => $row->user_name ?: '未知用户',
'mobile' => '',
'avatar' => '/assets/img/avatar.png',
'post_count' => 0
];
$user = Db::name('user')->where('id', $row->user_id)->field('id,nickname,mobile,avatar')->find();
if ($user) {
$userInfo['nickname'] = $user['nickname'] ?: $userInfo['nickname'];
$userInfo['mobile'] = $user['mobile'] ?: '';
$userInfo['avatar'] = $user['avatar'] ?: $userInfo['avatar'];
$userInfo['post_count'] = Db::name('fc_post')->where('user_id', $user['id'])->count();
}
// 支持请求 JSON 详情
if ($this->request->param('format') === 'json') {
$data = [
'id' => $row->id,
'title' => $row->title,
'content' => $row->content,
'category_name' => $row->category_name,
'price' => $row->price,
'price_unit' => $row->price_unit,
'area' => $row->area,
'address' => $row->address,
'contact' => $row->contact,
'phone' => $row->phone,
'wechat' => $row->wechat,
'tags' => $row->tags ? explode(',', $row->tags) : [],
'is_paid' => $row->is_paid,
'amount' => $row->amount,
'pay_type' => $row->pay_type,
'audit_status' => $row->audit_status,
'audit_reason' => $row->audit_reason,
'status' => $row->status,
'is_top' => $row->is_top,
'views' => $row->views,
'likes' => $row->likes,
'createtime_text' => date('Y-m-d H:i:s', $row->createtime),
'media_list' => $mediaList,
'user' => $userInfo
];
$this->success('获取成功', null, $data);
}
// 区分模式:audit=专属审核界面,view=纯净详情档案界面
$mode = $this->request->param('mode', '');
if (!$mode) {
$mode = ((int)$row->audit_status === 0) ? 'audit' : 'view';
}
$this->view->assign('mode', $mode);
$this->view->assign('row', $row);
$this->view->assign('userInfo', $userInfo);
$this->view->assign('mediaList', $mediaList);
// 如果是审核模式渲染 audit.html,详情模式渲染 detail.html
if ($mode === 'audit') {
return $this->view->fetch('audit');
}
return $this->view->fetch('detail');
}
public function audit()
{
$ids = $this->request->post('ids');
$auditStatus = (int)$this->request->post('auditStatus');
$reason = $this->request->post('reason', '');
if (!in_array($auditStatus, [1, 2])) {
$this->error('审核状态仅支持通过(1)/驳回(2)');
}
$ids = is_array($ids) ? $ids : explode(',', (string)$ids);
$ids = array_filter($ids);
if (!$ids) {
$this->error('请选择要审核的信息');
}
$posts = Db::name('fc_post')->where('id', 'in', $ids)->select();
if (!$posts) {
$this->error('信息不存在');
}
foreach ($posts as $post) {
Db::name('fc_post')->where('id', $post['id'])->update([
'audit_status' => $auditStatus,
'audit_reason' => $reason,
'updatetime' => time(),
]);
if ($auditStatus === 1 && !empty($post['category_id'])) {
Db::name('fc_category')->where('id', $post['category_id'])->setInc('post_count');
}
Db::name('fc_message')->insert([
'user_id' => $post['user_id'],
'type' => 'system',
'title' => $auditStatus === 1 ? '审核通过' : '审核驳回',
'content' => $auditStatus === 1
? '您发布的信息「' . $post['title'] . '」已审核通过'
: '您发布的信息「' . $post['title'] . '」审核未通过' . ($reason ? ',原因:' . $reason : ''),
'isread' => 0,
'createtime' => time(),
]);
}
$this->success('审核成功');
}
/**
* 置顶 / 取消置顶(支持批量)
* POST fc/post/top {ids:'1,2', isTop:1|0}
* 说明:置顶信息在用户端主页与列表**排在非置顶之前**(Home::feed / Post::mine 均按 is_top desc 排序)
*/
public function top()
{
$ids = $this->request->post('ids');
$isTop = (int)$this->request->post('isTop', 1);
if (!in_array($isTop, [0, 1], true)) {
$this->error('置顶状态仅支持置顶(1)/取消置顶(0)');
}
$ids = is_array($ids) ? $ids : explode(',', (string)$ids);
$ids = array_filter($ids);
if (!$ids) {
$this->error('请选择要操作的信息');
}
$posts = Db::name('fc_post')->where('id', 'in', $ids)->select();
if (!$posts) {
$this->error('信息不存在');
}
foreach ($posts as $post) {
Db::name('fc_post')->where('id', $post['id'])->update([
'is_top' => $isTop,
'updatetime' => time(),
]);
Db::name('fc_message')->insert([
'user_id' => $post['user_id'],
'type' => 'system',
'title' => $isTop === 1 ? '信息已置顶' : '已取消置顶',
'content' => $isTop === 1
? '您发布的信息「' . $post['title'] . '」已被置顶,将在首页优先展示'
: '您发布的信息「' . $post['title'] . '」已取消置顶',
'isread' => 0,
'createtime' => time(),
]);
}
$this->success($isTop === 1 ? '置顶成功' : '已取消置顶');
}
/**
* 下架信息
*/
public function offline()
{
$ids = $this->request->post('ids');
$ids = is_array($ids) ? $ids : explode(',', (string)$ids);
$ids = array_filter($ids);
if (!$ids) {
$this->error('请选择要下架的信息');
}
$posts = Db::name('fc_post')->where('id', 'in', $ids)->select();
if (!$posts) {
$this->error('信息不存在');
}
foreach ($posts as $post) {
Db::name('fc_post')->where('id', $post['id'])->update([
'status' => 0,
'updatetime' => time(),
]);
Db::name('fc_message')->insert([
'user_id' => $post['user_id'],
'type' => 'system',
'title' => '信息已下架',
'content' => '您发布的信息「' . $post['title'] . '」已被下架',
'isread' => 0,
'createtime' => time(),
]);
}
$this->success('下架成功');
}
}