6
0
Fork 0

优化购物车商品

release
李静 2021-12-10 10:34:45 +08:00
parent 4811472d88
commit 4901ee6f16
4 changed files with 52 additions and 8 deletions

View File

@ -17,7 +17,8 @@ class ShoppingCartItemController extends Controller
*/
public function index(Request $request)
{
$items = $request->user()->shoppingCartItems()->with(['sku'])->has('sku')->latest('id')->get();
$items = $request->user()->shoppingCartItems()->latest('id')->get();
$items->load('sku:id,name,cover,sell_price,vip_price,specs,stock,release_at');
return ShoppingCartItemResource::collection($items);
}
@ -31,19 +32,22 @@ class ShoppingCartItemController extends Controller
public function store(Request $request)
{
$input = $request->validate([
'sku_id' => ['bail', 'required'],
'sku_id' => ['bail', 'required', 'int'],
'quantity' => ['bail', 'required', 'int', 'min:1'],
]);
$sku = ProductSku::whereRelation('category', 'is_show', true)->online()->find($input['sku_id']);
if ($sku === null) {
if (is_null($sku = ProductSku::online()->find($input['sku_id']))) {
throw new ProductOfflineException();
}
$item = $request->user()->shoppingCartItems()->firstOrCreate([
'sku_id' => $sku->id,
], [
'name' => $sku->name,
'cover' => $sku->cover,
'sell_price' => $sku->sell_price,
'vip_price' => $sku->vip_price,
'specs' => $sku->specs,
'quantity' => $input['quantity'],
]);
@ -69,7 +73,17 @@ class ShoppingCartItemController extends Controller
$item = $request->user()->shoppingCartItems()->findOrFail($id);
$item->update($input);
if (is_null($sku = $item->sku()->online()->first())) {
throw new ProductOfflineException();
}
$item->update(array_merge($input, [
'name' => $sku->name,
'cover' => $sku->cover,
'sell_price' => $sku->sell_price,
'vip_price' => $sku->vip_price,
'specs' => $sku->specs,
]));
return response()->noContent();
}

View File

@ -0,0 +1,28 @@
<?php
namespace App\Endpoint\Api\Http\Resources\ProductSku;
use Illuminate\Http\Resources\Json\JsonResource;
class ProductSkuShoppingCartResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
*/
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
'cover' => (string) $this->cover,
'sell_price' => $this->sell_price,
'vip_price' => (string) $this->vip_price,
'specs' => array_values((array) $this->specs),
'stock' => (int) $this->saleable_stock,
'is_online' => $this->isOnline(),
];
}
}

View File

@ -2,7 +2,7 @@
namespace App\Endpoint\Api\Http\Resources;
use App\Endpoint\Api\Http\Resources\ProductSku\ProductSkuSimpleResource;
use App\Endpoint\Api\Http\Resources\ProductSku\ProductSkuShoppingCartResource;
use Illuminate\Http\Resources\Json\JsonResource;
class ShoppingCartItemResource extends JsonResource
@ -17,7 +17,7 @@ class ShoppingCartItemResource extends JsonResource
{
return [
'id' => $this->id,
'sku' => ProductSkuSimpleResource::make($this->whenLoaded('sku')),
'sku' => ProductSkuShoppingCartResource::make($this->whenLoaded('sku')),
'quantity' => $this->quantity,
];
}

View File

@ -40,6 +40,8 @@ class ShoppingCartItem extends Model
$sku->sell_price = $item->sell_price;
$sku->vip_price = $item->vip_price;
$sku->specs = $item->specs;
$sku->stock = 0;
$sku->release_at = null;
});
}
}