building-sign/app/controller/api/v1/Goods.php

395 lines
12 KiB
PHP
Raw Normal View History

2023-01-09 08:41:41 +00:00
<?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, '状态设置失败');
}
}
}