0) { $where[] = ['g.category_id', '=', $categoryId]; } if ($areaId > 0) { $where[] = ['g.area_id', '=', $areaId]; } $where[] = ['g.status', '=', 0];//进行中 $query = \app\model\Goods::alias('g') ->leftJoin('goods_category gc', 'gc.id = g.category_id') ->leftJoin('account a', 'a.id = g.account_id') ->leftJoin('goods_area ga', 'ga.id = g.area_id') ->field('g.id,g.cover,g.title,g.images,price,original_price') ->where($where); $total = $query->count(); $res = [ 'total' => $total, 'current' => $page ?: 1, 'size' => $size ?: 20, 'list' => new Collection(), ]; if ($total > 0) { $res['list'] = $query->page($page, $size)->order('g.sort', 'desc')->order('g.id', 'desc')->select(); $domain = request()->domain(true); $res['list']->each(function ($item) use ($domain) { $item->cover = resourceJoin((string) $item->cover, $domain); $images = explode(',', $item->images); foreach ($images as $k => $img) { if (!empty($img)) { $images[$k] = resourceJoin($img, $domain); } else { unset($images[$k]); } } $item->images = $images; }); } return $this->json(0, 'success', $res); } // 物品详情 public function detail(): Json { $id = input('id/d', 0); $field = 'g.id,g.title,g.cover,g.images,g.content,g.price,g.original_price,g.phone,ga.title as area_name,gc.title as category_name'; $item = \app\model\Goods::alias('g') ->leftJoin('goods_area ga','ga.id = g.area_id') ->leftJoin('goods_category gc','gc.id = g.category_id') ->where('g.status', 0) ->where('g.id', $id) ->field($field) ->find(); if (!$item) { return $this->json(4004, '物品不存在或已售出'); } $domain = request()->domain(true); $item->cover = resourceJoin((string) $item->cover, $domain); $images = explode(',', $item->images); foreach ($images as &$img) { $img = resourceJoin($img, $domain); } $item->images = $images; return $this->json(0, 'success', $item); } /** * 物品添加 * @return \think\response\Json * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException * @throws \Exception */ public function add(): Json { if (!$this->request->isPost()) { return $this->json(4000, '无效请求'); } $accountId = $this->request->user['user_id'] ?? 0; if (!$account = Account::field('id,nickname,status')->find((int) $accountId)) { return $this->json(6001, '请先登录'); } if ($account['status'] != Account::STATUS_NORMAL) { return $this->json(4003, '用户状态异常'); } $input = input('post.'); $rules = [ 'title|标题' => 'require|max:100|min:4', 'cover|封面图' => 'require', 'category_id|所属分类' => 'require', 'area_id|所属小区' => 'require', 'price|价格' => 'require|number', ]; $validate = $this->validateByApi($input, $rules); if ($validate !== true) { return $validate; } if (!isset($input['images']) && !isset($input['content'])) { return $this->json(4005, '详情组图和内容至少填一个'); } try { $originalPrice = 0; if (isset($input['original_price'])) { $originalPrice = $input['original_price'] ?: $input['price']; } \app\model\Goods::create([ 'title' => $input['title'], 'cover' => $input['cover'], 'category_id' => $input['category_id'], 'content' => $input['content'] ?? '', 'phone' => $input['phone'] ?? '', 'price' => $input['price'] ?? 0, 'original_price' => $originalPrice, 'account_id' => $accountId, 'area_id' => $input['area_id'] ?? 0, 'images' => $input['images'] ?? '', 'created_at' => date('Y-m-d H:i:s'), ]); return $this->json(); } catch (\Exception $e) { Log::error('闲置物品添加失败:line '.$e->getLine().' '.$e->getMessage()); return $this->json(5000, '物品添加失败'); } } /** * 物品编辑 * * @return \think\response\Json * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException * @throws \Exception */ public function edit(): Json { if (!$this->request->isPost()) { return $this->json(4000, '无效请求'); } $accountId = $this->request->user['user_id'] ?? 0; if (!$account = Account::field('id,nickname,status')->find((int) $accountId)) { return $this->json(6001, '请先登录'); } if ($account['status'] != Account::STATUS_NORMAL) { return $this->json(4003, '用户状态异常'); } $input = input('post.'); $rules = [ 'id|ID' => 'require|number', 'title|标题' => 'require|max:100|min:4', 'cover|封面图' => 'require', 'category_id|所属分类' => 'require', 'area_id|所属小区' => 'require', 'price|价格' => 'require|number', ]; $validate = $this->validateByApi($input, $rules); if ($validate !== true) { return $validate; } try { if (!$item = \app\model\Goods::find((int) $input['id'])) { return $this->json(4004, '记录不存在'); } if ($item['account_id'] != $accountId) { return $this->json(4003, '不是您发布的物品'); } if (!isset($input['images']) && !isset($input['content'])) { return $this->json(4005, '详情组图和内容至少填一个'); } $originalPrice = 0; if (isset($input['original_price'])) { $originalPrice = $input['original_price'] ?: $input['price']; } $item->save([ 'title' => $input['title'], 'cover' => $input['cover'], 'category_id' => $input['category_id'], 'content' => $input['content'] ?? '', 'phone' => $input['phone'] ?? '', 'price' => $input['price'] ?? 0, 'original_price' => $originalPrice, 'area_id' => $input['area_id'] ?? 0, 'images' => $input['images'] ?? '', ]); return $this->json(); } catch (\Exception $e) { Log::error('闲置物品编辑失败:line '.$e->getLine().' '.$e->getMessage()); return $this->json(5000, '物品编辑失败'); } } /** * 删除 * * @return \think\response\Json * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public function del(): Json { if (!$this->request->isPost()) { return $this->json(4000, '无效请求'); } $accountId = $this->request->user['user_id'] ?? 0; if (!$account = Account::field('id,nickname,status')->find((int) $accountId)) { return $this->json(6001, '请先登录'); } if ($account['status'] != Account::STATUS_NORMAL) { return $this->json(4003, '用户状态异常'); } $ids = input('id'); try { $ids = explode(',', $ids); if (!empty($ids)) { \app\model\Goods::whereIn('id', $ids)->where('account_id', $accountId)->delete(); } return $this->json(); } catch (\Exception $e) { Log::error('闲置物品删除失败:line '.$e->getLine().' '.$e->getMessage()); return $this->json(5000, '闲置物品删除失败'); } } // 小区 public function area(): Json { $page = input('page/d', 1); $size = input('size/d', 20); $keyword = input('keyword/s'); $where = []; if (!empty($keyword)) { $where[] = ['title', 'like', '%'.$keyword.'%']; } $query = GoodsArea::field('id,title')->where($where); $total = $query->count(); $res = [ 'total' => $total, 'current' => $page ?: 1, 'size' => $size ?: 20, 'list' => new Collection(), ]; if ($total > 0) { $res['list'] = $query->page($page, $size)->order('sort', 'desc')->order('id', 'desc')->select(); } return $this->json(0, 'success', $res); } // 分类 public function category(): Json { $keyword = input('keyword/s'); $where = []; if (!empty($keyword)) { $where[] = ['title', 'like', '%'.$keyword.'%']; } $res = GoodsCategory::field('id,title')->where($where)->order('sort', 'desc')->order('id', 'asc')->select(); return $this->json(0, 'success', $res); } /** * 设置状态 0=展示 1=不展示(已完成) * * @return \think\response\Json * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public function setStatus(): Json { if (!$this->request->isPost()) { return $this->json(4000, '无效请求'); } $accountId = $this->request->user['user_id'] ?? 0; if (!$account = Account::field('id,nickname,status')->find((int) $accountId)) { return $this->json(6001, '请先登录'); } if ($account['status'] != Account::STATUS_NORMAL) { return $this->json(4003, '用户状态异常'); } $id = input('id/d'); $status = input('status/d', 0); if (!in_array($status, [0, 1])) { return $this->json(4001, '参数错误'); } try { if (!$item = \app\model\Goods::findById($id, ['id', 'status', 'account_id'])) { return $this->json(4004, '物品不存在'); } if ($item['account_id'] != $accountId) { return $this->json(4003, '不是您发布的物品'); } $item->save([ 'status' => $status ]); return $this->json(); } catch (\Exception $e) { Log::error('闲置物品状态修改失败:line '.$e->getLine().' '.$e->getMessage()); return $this->json(5000, '状态设置失败'); } } }