未登录用户可以先将商品加入购物车后再登录执行进一步的操作,想请教一下代码具体实现或者提供一个比较完整的思路

大神你好。参考京东,未登录用户可以先将商品加入购物车后再登录执行进一步的操作,自己是新手,不明白具体怎么实现的,不知道后续教程中是否有所提及

前凸后翘大长腿

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
最佳答案

@等车的猪 代码如下:
``
CartController 类
public function add(AddCardRequest $request) {
$user = $request->user();
$skuId = $request->input('sku_id');
$amount = $request->input('amount');

    // 判断是否登陆
    if(!$user) {

        // 如果未登录,将数据存储 session 中
        $request->session()->push('sku_id',$skuId.'-'.$amount);

    } else {
        if($cart = $user->cartItems()->where('product_sku_id',$skuId)->first()) {
            $cart->update([
                'amount' => $cart->amount + $amount,
            ]);
        } else {
            $cart = new CartItem(['amount' => $amount]);
            $cart->user()->associate($user);
            $cart->productSku()->associate($skuId);
            $cart->save();
        }
    }

    return [];
}

``

然后在登陆方法中 ,通过路由找到方法
AuthenticatesUsers 中的方法
处理读取出来的 session
``
protected function sendLoginResponse(Request $request)
{
$user = $request->user();
// 读取session
$skus = $request->session()->all();

   // 判断 session 是否存在

    if(isset($skus['sku_id'])) {
        foreach($skus['sku_id'] as $value) {
          // 遍历数据,
            $array = explode('-',$value);
            if($cart = $user->cartItems()->where('product_sku_id',$array[0])->first()) {
                $cart->update([
                    'amount' => $cart->amount + $array[1],
                ]);
            } else {
                $cart = new CartItem(['amount' => $array[1]]);
                $cart->user()->associate($user);
                $cart->productSku()->associate($array[0]);
                $cart->save();
            }
        }
        $request->session()->forget('sku_id');
    }

    $request->session()->regenerate();

    $this->clearLoginAttempts($request);

    return $this->authenticated($request, $this->guard()->user())
            ?: redirect()->intended($this->redirectPath());
}

``

代码是:类和方法的对应,没有改源代码,只是增加代码

@等车的猪

2个月前
讨论数量: 13
leo

可以存到 Session 或者 Cookie 里

3个月前
等车的猪

@leo 具体怎么实现的 大神

3个月前

请先存入 session 中,然后登陆点击购物车的时候,先查询 session 中是否有存在商品数据,有的话,那数据写入数据库,然后清除 session 中的数据。

2个月前
等车的猪

@Gebriel 意思懂,关键不会写代码

2个月前

@等车的猪 代码如下:
``
CartController 类
public function add(AddCardRequest $request) {
$user = $request->user();
$skuId = $request->input('sku_id');
$amount = $request->input('amount');

    // 判断是否登陆
    if(!$user) {

        // 如果未登录,将数据存储 session 中
        $request->session()->push('sku_id',$skuId.'-'.$amount);

    } else {
        if($cart = $user->cartItems()->where('product_sku_id',$skuId)->first()) {
            $cart->update([
                'amount' => $cart->amount + $amount,
            ]);
        } else {
            $cart = new CartItem(['amount' => $amount]);
            $cart->user()->associate($user);
            $cart->productSku()->associate($skuId);
            $cart->save();
        }
    }

    return [];
}

``

然后在登陆方法中 ,通过路由找到方法
AuthenticatesUsers 中的方法
处理读取出来的 session
``
protected function sendLoginResponse(Request $request)
{
$user = $request->user();
// 读取session
$skus = $request->session()->all();

   // 判断 session 是否存在

    if(isset($skus['sku_id'])) {
        foreach($skus['sku_id'] as $value) {
          // 遍历数据,
            $array = explode('-',$value);
            if($cart = $user->cartItems()->where('product_sku_id',$array[0])->first()) {
                $cart->update([
                    'amount' => $cart->amount + $array[1],
                ]);
            } else {
                $cart = new CartItem(['amount' => $array[1]]);
                $cart->user()->associate($user);
                $cart->productSku()->associate($array[0]);
                $cart->save();
            }
        }
        $request->session()->forget('sku_id');
    }

    $request->session()->regenerate();

    $this->clearLoginAttempts($request);

    return $this->authenticated($request, $this->guard()->user())
            ?: redirect()->intended($this->redirectPath());
}

``

代码是:类和方法的对应,没有改源代码,只是增加代码

@等车的猪

2个月前
等车的猪

@Gebriel 不能跑成功啊

file

2个月前

file
你看看代码

2个月前
等车的猪

@Gebriel 但是我在logincontroller中重写了这个方法,按道理是一样的

2个月前
等车的猪

@Gebriel 大佬,我想知道为啥我重写这个方法就不行了呢

2个月前

@等车的猪 你重新的方法的话是你继承的父类,但是这个方法不存在您写的父类中 ,是在 AuthenticatesUsers,php 这个类中。

2个月前
等车的猪

@Gebriel 不是啊,这是个trait。logincontroller引用了的

2个月前
等车的猪

@Gebriel 找到原因了 我把use Illuminate\Http\Request;写成了use App\Http\Requests\Request;

2个月前

@等车的猪 忘记贴路由了

file

2个月前

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!