购物车思路laravel

购物车思路图:

在这里插入图片描述

##数据库表:

goods 商品表

字段名称类型注释
idint自增id
cat_id1mediumint一级分类ID
cat_id2mediumint二级分类ID
cat_id3mediumint三级分类ID
brand_idmediumint品牌ID
goods_namevarchar商品名称
mapricedecimal市场价格
shpricedecimal本店价格
is_on_saleenum y/n是否上架
weightsmallint重量
lengthsmallint长度
widthsmallint宽度
heightsmallint高度
goods_desclongtext商品描述
sale_servicelongtext商品保障

goods_cat 商品分类表

字段名称类型注释
idint自增id
namevarchar分类名称
parent1_idint一级分类
parent2_idint所有上级的分类

购物车表

cart 购物车表

字段名称类型注释
idint自增id
user_idint用户id
sku_idintsku表id
goods_countint商品数量

具体代码:

控制器:CartController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Cart;
use App\Models\Address;
use App\Models\Order;
use App\Models\OrderGoods;
use App\Models\GoodsStock;
use DB;
class CartController extends Controller
{
    //加入购物车
    public function addcatr($skuid,$gocount){
        $cart = new Cart;
        $cart->add($skuid,$gocount);
        return redirect()->route('cart');
    }

    // 显示购物车列表页面
    public function index(){
        // 取出数据
        $cart = new Cart;
        $cartdata = $cart->data();
        // dd($cartdata);
        return view('cart/cart',[
            'cartData'=>$cartdata
        ]);
    }

    // 显示结算页面
    public function checkout(Request $req){
        // dd($req->all());
        // 判断是否登录
        if(session('userid')){
            // 取出购物车的数据
            $cart = new Cart;
            $cartdata = $cart->data();
            // dd($cartdata);
            // 显示地址
            $address = Address::get();
            // dd($address);
            // dd($req->get('sku_id'));
            return view('cart/checkout',[
                'cartData'=>$cartdata,
                'address'=>$address,
                'skuids' => $req->get('sku_id'),
            ]);
        }
        else{
            // 如果没登录 就跳转到登录页面
            return redirect()->route('belogin');
        }

    }

    // 生成订单
    public function order_pay(Request $req){
        $order = new Order;
        $paymethods = $req->get('pay_method');
        // 判断是否登录
        $id = session('userid');
        if(!$id){
            return redirect('/');
        }
        // 收货人信息
        $address = Address::where('user_id',$id)->orderby('id','desc')->get();
        // dd($address);
        if(!$address){
            return redirect('/cart');
        }
        // 取出购物车的数据
        $cart = new Cart;
        $cartdata = $cart->data();
        if(!$cartdata){
            return redirect('/cart');
        }
        $skuids = explode('|', $req->get('skuids'));
        // dd($skuids);
        // 总价
        $countPirce= 0;
        // 是否勾选了商品
        $xuangoods = false;

        // 循环检测购物车中商品信息
        foreach($cartdata as $v)
        {
            // 过滤未勾选的商品
            if(!in_array($v->sku_id, $skuids))
                continue;
            // 检查库存量
            if($v->goods_count > $v->stock)
                return redirect('/cart');
            // 勾选了商品
            $xuangoods = true;
            // 邮费
            $youfei = 0;
            // 累加总价(有规格价格使用规格价格,否则使用本店价)
            $countPirce += $v->goods_count * ($v->price>0?$v->price:$v->shprice)+$youfei;
            // dd($countPirce);
        }

        // 如果没有勾选商品
        if(!$xuangoods)
            return redirect('/cart');


        /**
         * 下订单
         */
       // 开启事务
       DB::beginTransaction();

       // 订单号
       $orID = $this->StrOrderOne();
    //    dd($orID);
       $orderId = Order::insertGetId([
                    'orders_id' => $orID,
                    'user_id' => $id,
                    'name' => $address[0]->name,
                    'phone' => $address[0]->phone,
                    'province' => $address[0]->province,
                    'city' => $address[0]->city,
                    'area' => $address[0]->area,
                    'address' => $address[0]->address,
                    'pay_method' => $paymethods,
                ]);
        // dd($orderId);
        if($orderId)
        {
            // 购物车中ID
            $cart_sku_id = [];
            // 循环保存购物车中商品
            foreach($cartdata as $v)
            {
                // 过滤未勾选的商品
                if(!in_array($v->sku_id, $skuids))
                    continue;
                // 添加订单商品
                $dindan = OrderGoods::insert([
                                'order_id' => $orderId,
                                'goods_price' => $v->price>0?$v->price:$v->shprice,
                                'goods_count' => $v->goods_count,
                                'goods_attr_list' => $v->goods_attr_list,
                                'goods_id' => $v->goods_id,
                                'goods_name' => $v->goods_name,
                                'goods_pic' => $v->sm_pic,
                                'sku_id' => $v->sku_id,
                                'cat_id1' => $v->cat_id1,
                                'cat_id2' => $v->cat_id2,
                                'cat_id3' => $v->cat_id3,
                            ]);
                // 如果出错就回滚事务
                if(!$dindan)
                {
                    DB::rollback();
                    return redirect('/cart');
                }

                $cartsku[] = $v->sku_id;
                // 减库存量
                $dindan = GoodsStock::where('sku_id',$v->sku_id)->decrement('stock',$v->goods_count);
                // 如果出错就回滚事务
                if(!$dindan)
                {
                    DB::rollback();
                    return redirect()->route('cart');
                }
            }
            // 如果都成功就提交整个事务
            DB::commit();
            // 从购物车中删除已下单商品
            Cart::whereIn('sku_id',$cartsku)->delete();
        }
        else
        {
            DB::rollback();
            return redirect()->route('cart');
        }
        // dd($req->get('pay_method') );
        // 跳转去支付
        if($paymethods == '支付宝' ){
             return redirect('/pay/'.$orID.'/'.$countPirce);
        }elseif($paymethods == '微信'){
            return redirect('/payByWechat/'.$orID.'/'.$countPirce);
        }

     }


    //  生成唯一的订单号
    public function StrOrderOne(){
        /* 选择一个随机的方案 */
        mt_srand((double) microtime() * 1000000);

        return date('Ymd') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT);
    }

}

模型代码: Cart.php


<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use App\Models\Member;
use App\Models\GoodsStock;
use Cookie;
use DB;
class Cart extends Model
{
    protected $table='cart';
    protected $fillable = ['user_id','sku_id','goods_count'];
    public $timestamps = false;

     // 把COOKIE中的购物车数据移动到数据库中
     public static function hebin()
     {
         // 只有登录了才可以执行这个操作
         if($id = session('userid'))
         {
             $cart = Cookie::get('cart');
            //  dd($cart);
             if($cart)
             {
                 $data = [];
                // 取出反序列化的值
                 $cart = unserialize($cart);
                //  循环的到  在给字段赋值
                 foreach($cart as $k => $v)
                 {
                     $data[] = [
                         'user_id' => $id,
                         'sku_id' => $k,
                         'goods_count' => $v,
                     ];
                 }
                //  插入到cart 这个表中
                 self::insert($data);
                 // 删除COOKIE中购物车数据
                 Cookie::queue('cart', 'value', -1);
             }
         }
     }

    public function add($skuid,$gocount){
        // dd($skuid);
        $cartsku = self::get();
        // dd($cartsku);
        $casku = [];
        $cascount = [];
        foreach($cartsku as $v){
           $casku[] = $v->sku_id;
           $cascount[] = $v->goods_count;
        }
        // dd($cascount);
        // 判断是否登录
        if($user_id = session('userid')){
            // 判断sku(商品规格)  是否是第一次 如果是第一次就插入数据库 如果不是就把商品数量++
            if($casku==$skuid){
                $this->goods_count = $cascount+$gocount;
            }else{
                $this->sku_id = $skuid;
                $this->goods_count = $gocount;
            }
            $this->user_id = $user_id;
                // dd($skuid,$gocount,$user_id);
                // 保存
            $this->save();
        }else{
            // 如果没有登录
            // 1 数据暂时放到cookie中
            $cart = Cookie::get('cart');
            $cart[$skuid] = $gocount;
            // dd($gocount);
    		// 保存一个月
    		Cookie::queue('cart', serialize($cart), 43200);
        }
    }

    // 取出数据
    public function data(){
        // 判断是否登录
        if($user_id=session('userid')){
            // 登陆了就返回 数据
            $db = DB::table('cart')
                    ->select('*')
                    ->leftJoin('goods_stock','cart.sku_id','=','goods_stock.sku_id')
                    ->leftJoin('goods','goods_stock.goods_id','=','goods.id')
                    ->leftJoin('goods_pic','goods_pic.goods_id','=','goods.id')
                    ->where('user_id',$user_id)
                    ->get();
            return $db;
        }else{
            // 如果没有登录
            // 1 数据暂时放到cookie中
            $cart = Cookie::get('cart');
            // dd($cart);
            // 2 判断 cookie 是否有cart这个数据
            if($cart){
                // 取出反序列化
                $cart = unserialize($cart);
                $skuids = array_keys($cart); //返回数组所有键名的一个新数组
                // dd($skuids);
                $gsData = DB::table('cart')
                            ->select('*')
                            ->leftJoin('goods_stock','cart.sku_id','=','goods_stock.sku_id')
                            ->leftJoin('goods','goods_stock.goods_id','=','goods.id')
                            ->leftJoin('goods_pic','goods_pic.goods_id','=','goods.id')
                            ->where('goods_stock.sku_id',$skuids)
                            ->get();
                // dd($gsData);
                $gsData->goods_count = $cart;
                // dd($gsData);
    			return $gsData;
    		}
    		else
    			return [];
        }
    }
}

注释:写的不是很好 有好的思路和代码请留言
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值