购物车管理
parent
21a8732860
commit
57c07be090
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
@ -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,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
@ -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']);
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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');
|
||||
}
|
||||
}
|
||||
|
|
@ -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": "手机号码已被注册",
|
||||
|
|
|
|||
Loading…
Reference in New Issue