tp5 模拟商品详情添加购物车处理及HTML

1、控制器页面

<?php

namespace app\home\controller;

use app\home\model\Spec;
use app\home\model\SpecValue;
use think\Controller;
use think\model\Collection;

class Goods extends Controller
{
//    商品详情
    function details()
    {
        $id=1;
        $goods= \app\home\model\Goods::with('specGoods')->where('id',$id)->find()->toArray();

//        取出商品的规格值id
        $specIds = array_unique(explode('_',implode('_',array_column($goods['spec_goods'],'value_ids'))));
        $spec_values = SpecValue::with('spec')->where('id','in',$specIds)->select();
        $spec_values = \collection($spec_values)->toArray();
//        数据处理
         $res = [];
         foreach($spec_values as $k =>$v)
        {
            $res[$v['spec_id']] = [
              'spec_id'=>$v['spec_id'],
                'spec_name'=>$v['spec']['spec_name'],
                'spec_values'=>[]
            ];
        }
        foreach($spec_values as $v){
            //$v['spec_id']
            $res[$v['spec_id']]['spec_values'][] = $v;
        }

        //规格值ids组合--规格商品SKU的映射关系  页面需要使用
        /*$goods['spec_goods'] = [
            0=>['id'=>1, 'value_ids'=>'28_32'],
           1=> ['id'=>2, 'value_ids'=>'28_33'],
           2=> ['id'=>3, 'value_ids'=>'29_32'],
           3=> ['id'=>4, 'value_ids'=>'29_33'],
        ];*/
        /*$value_ids_map = [
            '规格值ids组合' => '规格商品SKU的id和price'
            '28_32' => ['id'=>1, 'price'=>'1000'],
            '28_33' => ['id'=>2, 'price'=>'1000'],
            '29_32' => ['id'=>3, 'price'=>'1000'],
            '29_33' => ['id'=>4, 'price'=>'2000']
        ];*/
        $value_ids_map = [];
        foreach($goods['spec_goods'] as $v){
            //$v['id']  $v['price']
            $row = [
                'id' => $v['id'],
                'price' => $v['price']
            ];
            $value_ids_map[$v['value_ids']] = $row;
        }
        //数据最终在js中使用,转化为json格式,用于输出到
        $value_ids_map = json_encode($value_ids_map);
//        print_r($res);die;
        return view('details', ['goods' => $goods, 'specs'=>$res, 'value_ids_map' => $value_ids_map]);
    }



}

2.HTML页面布局及jquery

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
         .box{width: 1000px;height: 1000px;margin: 50px auto;
             background-color: #f9f9f9;}
         .left{width: 450px;height: 600px;float: left;}
         .right{width: 450px;height: 600px;float: right;
             background-color: #f8cbcb;}
         a{display: inline-block;padding: 5px;
          color: black;    background-color:white;margin: 5px;text-decoration: none;
         }
         .selected{border:2px solid red;color:red};
    </style>
</head>
<body>
<div class="box">
  <div class="left">
  </div>
    <div class="right">
         <h2>{$goods.goods_name}</h2>
         <div class="fl title">
            <i>价  格</i>
         </div>
        <div class="fl price">
            <i>¥</i>
            <em id="goods_price" style="color: red">{$goods.goods_price}</em>
            <span>降价通知</span>
        </div>
        <div id="specification" class="summary-wrap clearfix">
<!--          商品的规格、规格值-->
            {foreach $specs as $v}
            <dl>
                <dt>
                    <div class="fl title">
                        <i>{$v.spec_name}</i>
                    </div>
                </dt>
                {foreach $v['spec_values'] as $k=>$value}
                <dd><a spec_value_id="{$value.id}" href="javascript:;" class="{if($k==0)}selected{/if}">{$value.value_name}<span title="点击取消选择">&nbsp;</span></a></dd>
                {/foreach}
            </dl>
            {/foreach}
        </div>
        <div class="summary-wrap">
            <div class="fl title">
                <div class="control-group">
                    <div class="controls">
                        <input id="number" autocomplete="off" type="text" value="1" minnum="1" class="itxt" />
                        <a href="javascript:void(0)" id="plus" class="increment plus"><button>+</button></a>
                        <a href="javascript:void(0)" id="mins" class="increment mins"><button>-</button></a>
                    </div>
                </div>
            </div>
        </div>
        <div class="fl">
            <ul class="btn-choose unstyled">
                <li>
                    <a href="javascript:;" id="addshopcar" class="sui-btn  btn-danger addshopcar">加入购物车</a>
                </li>
            </ul>
        </div>
    </div>
</div>
    <form action="{:url('home/cart/addcart')}" method="post" style="display: none">
        <input type="hidden" name="goods_id" value="{$goods.id}">
        <input type="hidden" name="spec_goods_id" value="">
        <input type="hidden" name="number" value="">
    </form>
</body>
</html>
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js">
</script>
<script>
    $(function(){
        //规格值选中效果
        $('#specification').find('a').click(function(){
            //给当前行标签 移除selected这个class
            $(this).closest('dl').find('a').removeClass('selected');
            // //再给当前点击的a标签加上selected
            $(this).addClass('selected');
            // //获取选中的规格值的组合
            var value_ids = '';
            $('.selected').each(function(i,v){
                value_ids += $(v).attr('spec_value_id') + '_';
            });
            //去除最后一个下划线  value_ids = '19_21_'   '19_21'
            value_ids = value_ids.slice(0, -1);
            // //获取对应的规格商品SKU的id值
            var spec_goods_price = value_ids_map[value_ids].price;
            // console.log(spec_goods_price);
            // //将价格显示到页面
            $('#goods_price').html(spec_goods_price);
        });

        //规格值ids 到 规格商品id的映射关系
        var value_ids_map = {$value_ids_map};
//		var value_ids_map = {"18_21":{"id":813,"price":"1000.00"},"18_22":{"id":814,"price":"1000.00"},"19_21":{"id":815,"price":"1000.00"},"19_22":{"id":816,"price":"1000.00"}};
        //加入购物车
        $('#addshopcar').click(function(){
            //获取选中的规格值的组合
            var value_ids = '';//18_21
            $('.selected').each(function(i,v){
                value_ids += $(v).attr('spec_value_id') + '_';
            });
            //去除最后一个下划线  value_ids = '18_21'
            value_ids = value_ids.slice(0, -1);
            //value_ids = '18_21'
            //获取对应的规格商品SKU的id值 考虑到部分商品可能没有SKU 使用三元判断
            var spec_goods_id = value_ids_map[value_ids] ? value_ids_map[value_ids].id : '';
            // console.log(spec_goods_id);
            //后续加入购物车 需要使用spec_goods_id
            //将spec_goods_id放到隐藏表单中
            $('input[name=spec_goods_id]').val(spec_goods_id);
            //获取购买数量
            var number = $('#number').val();
            //将购买数量放到隐藏表单中
            $('input[name=number]').val(number);
            //提交表单
            $('form').submit();
        });
        //加号
        $('#plus').click(function(){
            //获取数量
            var number = parseInt( $('#number').val() );
            //计算新的数量
            number += 1;
            //展示新的数量
            $('#number').val(number);
        });
        //减号
        $('#mins').click(function(){
            //获取数量
            var number = parseInt( $('#number').val() );
            //计算新的数量
            if(number == 1) return;
            number -= 1;
            //展示新的数量
            $('#number').val(number);
        });
    })
</script><!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
         .box{width: 1000px;height: 1000px;margin: 50px auto;
             background-color: #f9f9f9;}
         .left{width: 450px;height: 600px;float: left;}
         .right{width: 450px;height: 600px;float: right;
             background-color: #f8cbcb;}
         a{display: inline-block;padding: 5px;
          color: black;    background-color:white;margin: 5px;text-decoration: none;
         }
         .selected{border:2px solid red;color:red};
    </style>
</head>
<body>
<div class="box">
  <div class="left">
  </div>
    <div class="right">
         <h2>{$goods.goods_name}</h2>
         <div class="fl title">
            <i>价  格</i>
         </div>
        <div class="fl price">
            <i>¥</i>
            <em id="goods_price" style="color: red">{$goods.goods_price}</em>
            <span>降价通知</span>
        </div>
        <div id="specification" class="summary-wrap clearfix">
<!--          商品的规格、规格值-->
            {foreach $specs as $v}
            <dl>
                <dt>
                    <div class="fl title">
                        <i>{$v.spec_name}</i>
                    </div>
                </dt>
                {foreach $v['spec_values'] as $k=>$value}
                <dd><a spec_value_id="{$value.id}" href="javascript:;" class="{if($k==0)}selected{/if}">{$value.value_name}<span title="点击取消选择">&nbsp;</span></a></dd>
                {/foreach}
            </dl>
            {/foreach}
        </div>
        <div class="summary-wrap">
            <div class="fl title">
                <div class="control-group">
                    <div class="controls">
                        <input id="number" autocomplete="off" type="text" value="1" minnum="1" class="itxt" />
                        <a href="javascript:void(0)" id="plus" class="increment plus"><button>+</button></a>
                        <a href="javascript:void(0)" id="mins" class="increment mins"><button>-</button></a>
                    </div>
                </div>
            </div>
        </div>
        <div class="fl">
            <ul class="btn-choose unstyled">
                <li>
                    <a href="javascript:;" id="addshopcar" class="sui-btn  btn-danger addshopcar">加入购物车</a>
                </li>
            </ul>
        </div>
    </div>
</div>
    <form action="{:url('home/cart/addcart')}" method="post" style="display: none">
        <input type="hidden" name="goods_id" value="{$goods.id}">
        <input type="hidden" name="spec_goods_id" value="">
        <input type="hidden" name="number" value="">
    </form>
</body>
</html>
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js">
</script>
<script>
    $(function(){
        //规格值选中效果
        $('#specification').find('a').click(function(){
            //给当前行标签 移除selected这个class
            $(this).closest('dl').find('a').removeClass('selected');
            // //再给当前点击的a标签加上selected
            $(this).addClass('selected');
            // //获取选中的规格值的组合
            var value_ids = '';
            $('.selected').each(function(i,v){
                value_ids += $(v).attr('spec_value_id') + '_';
            });
            //去除最后一个下划线  value_ids = '19_21_'   '19_21'
            value_ids = value_ids.slice(0, -1);
            // //获取对应的规格商品SKU的id值
            var spec_goods_price = value_ids_map[value_ids].price;
            // console.log(spec_goods_price);
            // //将价格显示到页面
            $('#goods_price').html(spec_goods_price);
        });

        //规格值ids 到 规格商品id的映射关系
        var value_ids_map = {$value_ids_map};
//		var value_ids_map = {"18_21":{"id":813,"price":"1000.00"},"18_22":{"id":814,"price":"1000.00"},"19_21":{"id":815,"price":"1000.00"},"19_22":{"id":816,"price":"1000.00"}};
        //加入购物车
        $('#addshopcar').click(function(){
            //获取选中的规格值的组合
            var value_ids = '';//18_21
            $('.selected').each(function(i,v){
                value_ids += $(v).attr('spec_value_id') + '_';
            });
            //去除最后一个下划线  value_ids = '18_21'
            value_ids = value_ids.slice(0, -1);
            //value_ids = '18_21'
            //获取对应的规格商品SKU的id值 考虑到部分商品可能没有SKU 使用三元判断
            var spec_goods_id = value_ids_map[value_ids] ? value_ids_map[value_ids].id : '';
            // console.log(spec_goods_id);
            //后续加入购物车 需要使用spec_goods_id
            //将spec_goods_id放到隐藏表单中
            $('input[name=spec_goods_id]').val(spec_goods_id);
            //获取购买数量
            var number = $('#number').val();
            //将购买数量放到隐藏表单中
            $('input[name=number]').val(number);
            //提交表单
            $('form').submit();
        });
        //加号
        $('#plus').click(function(){
            //获取数量
            var number = parseInt( $('#number').val() );
            //计算新的数量
            number += 1;
            //展示新的数量
            $('#number').val(number);
        });
        //减号
        $('#mins').click(function(){
            //获取数量
            var number = parseInt( $('#number').val() );
            //计算新的数量
            if(number == 1) return;
            number -= 1;
            //展示新的数量
            $('#number').val(number);
        });
    })
</script>

3、商品添加购物车

1.创建Cart控制器


    function addCart()
    {
//        接受商品添加购物车参数
        $data = request()->param();
        unset($data['/home/cart/addcart_html']);
//        数据验证
        $validate = $this->validate($data, [
            'goods_id' => 'require|integer|gt:0',
            'number' => 'require|integer|gt:0',
            'spec_goods_id' => 'integer|gt:0',
        ]);
        if($validate !== true){
            $this->error($validate);
        }
        //假设登录 用户id为1
        $user_info = [
            'id'=>1,
        ];
        session::set('user_info',$user_info);
//        print_r(\session('user_info.id'));die;
//        判断用户是否登录
        if(session('user_info'))
        {
//            已登录
            $user_id  = session('user_info.id');
            $where = [
                'user_id'=>$user_id,
                'goods_id'=>$data['goods_id'],
                'spec_goods_id'=>$data['spec_goods_id']
            ];
            $info  = \app\common\model\Cart::where($where)->find();

            if($info)
            {
//                            echo 13;die;
//            存在相同的记录 只需要数量增加 修改操作
                $info->number += $data['number'];
                $info->is_selected = 1;
                $info->save();
            }else{
                //不存在相同记录 添加新数据
                $where['number'] = $data['number'];
                $where['is_selected'] = 1;
                \app\common\model\Cart::create($where);
            }
        }else{
//            未登录,太哪家cookie
            $cart = cookie('cart')?:[];
//            添加或修改数据数组 判断是否存在相同的记录(商品id相同,sku的id相同);
            $key = $data['goods_id'].'_'.$data['spec_goods_id'];
           if(isset($cart[$key]))
           {
//               存在相同记录,则累加数量
               $cart[$key]['number']+=$data['number'];
               $cart[$key]['is_selected'] = 1;
           }else{
//                不存在相同的记录,则添加新的数据(键值对)
                $cart[$key] = [
                    'id'=>$key,
                    'user_id'=>'',
                    'spec_goods_id'=>$data['goods_id'],
                    'number'=>$data['number'],
                    'is_selected'=>1
                ];
           }
           cookie('cart',$cart,86400*7);//存cookie设置过期时间为一周
        }

        return view('add_cart');
    }

//    购物车列表
     function  cart()
     {
         $data  = \app\common\model\Cart::with('user,goods,specGoods')->where('user_id',1) ->select();
         $data = collection($data)->toArray();
//         print_r($data);die;
         return view('cart',['data'=>$data]);

     }

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值