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('下架成功'); } }