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="点击取消选择"> </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="点击取消选择"> </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]);
}