You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
aquaculture/app/Http/Controllers/CarController.php

118 lines
3.2 KiB

<?php
namespace App\Http\Controllers;
use App\Models\Car;
use App\Models\Product;
use App\Models\User;
use Illuminate\Http\Request;
class CarController extends Controller
{
// 构造函数,设置中间件
public function __construct()
{
// 仅对 store 和 destroy 方法应用用户身份验证中间件
$this->middleware('user.auth')->only('store', 'destroy');
}
/**
* 显示购物车列表
*
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View 返回购物车视图
*/
public function index()
{
$cars = collect(); // 初始化购物车集合
/**
* @var $user User
*/
// 获取当前登录用户的购物车
if ($user = \auth()->user()) {
// 直接获取当前用户的购物车及其关联的产品
$cars = $user->cars()->with('product')->get();
}
// 返回购物车视图,并传递购物车数据
return view('cars.index', compact('cars'));
}
/**
* 添加商品到购物车
*
* @param Request $request 请求对象
* @return array 返回操作结果
*/
public function store(Request $request)
{
/**
* @var $car Car
* @var $product Product
* @var $user User
*/
// 根据产品 UUID 查找产品
$product = Product::query()->where('uuid', $request->input('product_id'))->firstOrFail();
// 获取当前用户
$user = auth()->user();
// 查找或新建购物车记录
$car = $user->cars()->firstOrNew([
'user_id' => \auth()->id(),
'product_id' => $product->id
]);
// 处理购物车数量变化
$change = 0; // 数量变化
$number = $request->input('number', 1); // 获取请求中的数量,默认为 1
if ($request->input('action') == 'sync') {
// 如果是同步操作,直接设置数量
$change = $number - $car->number;
$car->number = $number;
} else {
// 否则,增加数量
$car->number += $number;
}
// 检查库存是否足够
if ($car->number > $product->count) {
return responseJson(403, '库存不足'); // 返回库存不足的响应
}
// 保存购物车记录
$car->save();
// 返回成功响应
return responseJson(200, '加入购物车成功', compact('change'));
}
/**
* 从购物车中删除商品
*
* @param $id 购物车项的 ID
* @return array 返回操作结果
*/
public function destroy($id)
{
try {
/**
* @var $user User
*/
// 获取当前用户
$user = auth()->user();
// 查找购物车项并删除
$car = $user->cars()->whereKey($id)->firstOrFail();
$car->delete();
} catch (\Exception $e) {
// 捕获异常并返回错误响应
dd($e); // 可选:调试输出异常信息
return responseJson(500, '服务器异常,请稍后再试');
}
// 返回成功响应
return responseJson(200, '删除成功');
}
}