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

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

刻意练习,每日精进
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

@等车的猪 代码如下:
``
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());
}

``

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

@等车的猪

5年前 评论
AmberLavigne 4年前
讨论数量: 15

@等车的猪 代码如下:
``
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());
}

``

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

@等车的猪

5年前 评论
AmberLavigne 4年前
leo

可以存到 Session 或者 Cookie 里

5年前 评论

@leo 具体怎么实现的 大神

5年前 评论

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

5年前 评论

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

5年前 评论

@等车的猪 代码如下:
``
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());
}

``

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

@等车的猪

5年前 评论
AmberLavigne 4年前

@Gebriel 不能跑成功啊

file

5年前 评论

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

5年前 评论

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

5年前 评论

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

5年前 评论

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

5年前 评论

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

5年前 评论

@Gebriel 谢谢,这个方法可以成功将未登录用户的商品加入购物车,但检视购物车怎么让未登录用户看到商品呢?

4年前 评论

@1822070681 这个你可以将商品存在本地 App 缓存上或者是浏览器

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!