395 lines
12 KiB
PHP
395 lines
12 KiB
PHP
|
<?php
|
|||
|
|
|||
|
namespace app\controller\api\v1;
|
|||
|
|
|||
|
use app\controller\api\Base;
|
|||
|
use app\model\Account;
|
|||
|
use app\model\GoodsArea;
|
|||
|
use app\model\GoodsCategory;
|
|||
|
use think\Collection;
|
|||
|
use think\facade\Log;
|
|||
|
use think\response\Json;
|
|||
|
|
|||
|
class Goods extends Base
|
|||
|
{
|
|||
|
protected $noNeedLogin = [
|
|||
|
'list', 'detail', 'category', 'area'
|
|||
|
];
|
|||
|
|
|||
|
// 物品列表
|
|||
|
public function list(): Json
|
|||
|
{
|
|||
|
$page = input('page/d', 1);
|
|||
|
$size = input('size/d', 20);
|
|||
|
$keyword = input('keyword/s');
|
|||
|
$categoryId = input('category_id/d', 0);
|
|||
|
$areaId = input('area_id/d', 0);
|
|||
|
|
|||
|
$where = [];
|
|||
|
|
|||
|
if (!empty($keyword)) {
|
|||
|
$where[] = ['a.nickname|g.title|gc.title|g.phone|ga.title', 'like', '%'.$keyword.'%'];
|
|||
|
}
|
|||
|
|
|||
|
if ($categoryId > 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, '状态设置失败');
|
|||
|
}
|
|||
|
}
|
|||
|
}
|