6
0
Fork 0

购物车管理

release
李静 2021-12-07 11:55:33 +08:00
parent 21a8732860
commit 57c07be090
7 changed files with 199 additions and 3 deletions

View File

@ -0,0 +1,96 @@
<?php
namespace App\Endpoint\Api\Http\Controllers;
use App\Endpoint\Api\Http\Resources\ShoppingCartItemResource;
use App\Exceptions\BizException;
use App\Models\ProductSku;
use Illuminate\Http\Request;
class ShoppingCartItemController extends Controller
{
/**
* 购物车商品列表
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function index(Request $request)
{
$items = $request->user()->shoppingCartItems()->with(['sku'])->has('sku')->latest('id')->get();
return ShoppingCartItemResource::collection($items);
}
/**
* 添加购物车商品
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$input = $request->validate([
'sku_id' => ['bail', 'required'],
'qty' => ['bail', 'required', 'int', 'min:1'],
]);
$sku = ProductSku::whereRelation('category', 'is_show', true)->online()->find($input['sku_id']);
if ($sku === null) {
throw new BizException(__('Product has been removed'));
}
$item = $request->user()->shoppingCartItems()->firstOrCreate([
'sku_id' => $sku->id,
], [
'qty' => $input['qty'],
]);
if (! $item->wasRecentlyCreated) {
$item->increment('qty', $input['qty']);
}
return response()->noContent();
}
/**
* 修改购物车商品
*
* @param int $id
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function update($id, Request $request)
{
$input = $request->validate([
'qty' => ['bail', 'required', 'int', 'min:1'],
]);
$item = $request->user()->shoppingCartItems()->find($id);
if ($item === null) {
}
$item->update($input);
return response()->noContent();
}
/**
* 删除购物车商品
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function delete(Request $request)
{
$input = $request->validate([
'ids' => ['bail', 'required', 'array'],
]);
$request->user()->shoppingCartItems()->whereIn('id', $input['ids'])->delete();
return response()->noContent();
}
}

View File

@ -0,0 +1,24 @@
<?php
namespace App\Endpoint\Api\Http\Resources;
use App\Endpoint\Api\Http\Resources\ProductSku\ProductSkuSimpleResource;
use Illuminate\Http\Resources\Json\JsonResource;
class ShoppingCartItemResource 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,
'sku' => ProductSkuSimpleResource::make($this->whenLoaded('sku')),
'qty' => $this->qty,
];
}
}

View File

@ -13,6 +13,7 @@ use App\Endpoint\Api\Http\Controllers\Product\ProductCategoryController;
use App\Endpoint\Api\Http\Controllers\Product\ProductSkuController;
use App\Endpoint\Api\Http\Controllers\Product\ProductSkuFavoriteController;
use App\Endpoint\Api\Http\Controllers\Product\ProductViewLogController;
use App\Endpoint\Api\Http\Controllers\ShoppingCartItemController;
use App\Endpoint\Api\Http\Controllers\SmsCodeController;
use Illuminate\Support\Facades\Route;
@ -58,5 +59,11 @@ Route::group([
Route::get('product/view-logs', [ProductViewLogController::class, 'index']);
// 商品收藏记录
Route::get('product/favorites', [ProductSkuFavoriteController::class, 'index']);
// 购物车
Route::get('shopping-cart-items', [ShoppingCartItemController::class, 'index']);
Route::post('shopping-cart-items', [ShoppingCartItemController::class, 'store']);
Route::delete('shopping-cart-items', [ShoppingCartItemController::class, 'delete']);
Route::put('shopping-cart-items/{shopping_cart_item}', [ShoppingCartItemController::class, 'update']);
});
});

View File

@ -0,0 +1,32 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class ShoppingCartItem extends Model
{
/**
* @var array
*/
protected $casts = [
'qty' => 'int',
];
/**
* @var array
*/
protected $fillable = [
'user_id',
'sku_id',
'qty',
];
/**
* 此购物车物品所属的商品
*/
public function sku()
{
return $this->belongsTo(ProductSku::class);
}
}

View File

@ -79,11 +79,11 @@ class User extends Model implements AuthorizableContract, AuthenticatableContrac
}
/**
* 属于此用户的收货地址
* 属于此用户的购物车中的商品
*/
public function addresses()
public function shoppingCartItems()
{
return $this->hasMany(Address::class);
return $this->hasMany(ShoppingCartItem::class);
}
/**

View File

@ -0,0 +1,36 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateShoppingCartItemsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('shopping_cart_items', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('user_id')->comment('用户ID');
$table->unsignedBigInteger('sku_id')->comment('商品ID');
$table->unsignedInteger('qty')->default(0)->comment('购买数量');
$table->timestamps();
$table->unique(['user_id', 'sku_id']);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('shopping_cart_items');
}
}

View File

@ -6,6 +6,7 @@
"Invalid verification code type": "无效的验证码类型",
"Invalid old password": "原密码错误",
"Inviter does not exist": "邀请人不存在",
"Product has been removed": "商品已下架",
"Registration failed, please try again": "注册失败,请重试",
"Sending too frequently, please try again later": "发送过于频繁,请稍后再试",
"The phone number is already registered": "手机号码已被注册",