diff --git a/application/Common/Model/CartModel.class.php b/application/Common/Model/CartModel.class.php index 3faf44c..7c03733 100644 --- a/application/Common/Model/CartModel.class.php +++ b/application/Common/Model/CartModel.class.php @@ -39,6 +39,24 @@ class CartModel extends CommonModel { ->select(); } + // 获取用户购物车某一商品 + public function getOneByUser($user_id,$goods_id) { + $where['c.user_id'] = $user_id; + $where['c.goods_id'] = $goods_id; + return $this->field(array('c.*,g.num as goods_num,g.goods_price')) + ->alias('c') + ->join('__GOODS__ as g on c.goods_id = g.id') + ->where($where) + ->find(); + } + + // 获取用户购物车某一商品数 + public function getOneNumByUser($user_id,$goods_id) { + $where['user_id'] = $user_id; + $where['goods_id'] = $goods_id; + return $this->where($where)->getField('num'); + } + // 获取用户购物车总商品数 public function getCountByUser($user_id) { $where['user_id'] = $user_id; diff --git a/application/Common/Model/GoodsModel.class.php b/application/Common/Model/GoodsModel.class.php index 7286a62..e0a43e4 100644 --- a/application/Common/Model/GoodsModel.class.php +++ b/application/Common/Model/GoodsModel.class.php @@ -63,4 +63,11 @@ class GoodsModel extends CommonModel { $where['id'] = $id; return $this->where($where)->find(); } + + // 获取商品库存 + public function getInfoNum($id) { + $where['is_del'] = 0; + $where['id'] = $id; + return $this->where($where)->getField('num'); + } } \ No newline at end of file diff --git a/application/Common/Model/OrderModel.class.php b/application/Common/Model/OrderModel.class.php index 52054ad..7fde9c1 100644 --- a/application/Common/Model/OrderModel.class.php +++ b/application/Common/Model/OrderModel.class.php @@ -17,13 +17,13 @@ class OrderModel extends CommonModel { //array(验证字段,验证规则,错误提示,验证条件,附加规则,验证时间) array('order_sn', 'require', '订单号不能为空', 1, 'regex', CommonModel::MODEL_BOTH), array('user_id', 'number', '用户ID不能为空', 1, 'regex', CommonModel::MODEL_BOTH), - array('country', 'require', '国家不能为空', 1, 'regex', CommonModel::MODEL_BOTH), - array('province', 'require', '省、城市不能为空', 1, 'regex', CommonModel::MODEL_BOTH), - array('city', 'require', '城市不能为空', 1, 'regex', CommonModel::MODEL_BOTH), - array('region', 'require', '地区不能为空', 1, 'regex', CommonModel::MODEL_BOTH), - array('address', 'require', '详细地址不能为空', 1, 'regex', CommonModel::MODEL_BOTH), - array('realname', 'require', '收货人姓名不能为空', 1, 'regex', CommonModel::MODEL_BOTH), - array('mobile', 'require', '收货人电话不能为空', 1, 'regex', CommonModel::MODEL_BOTH), +// array('country', 'require', '国家不能为空', 1, 'regex', CommonModel::MODEL_BOTH), +// array('province', 'require', '省、城市不能为空', 1, 'regex', CommonModel::MODEL_BOTH), +// array('city', 'require', '城市不能为空', 1, 'regex', CommonModel::MODEL_BOTH), +// array('region', 'require', '地区不能为空', 1, 'regex', CommonModel::MODEL_BOTH), +// array('address', 'require', '详细地址不能为空', 1, 'regex', CommonModel::MODEL_BOTH), +// array('realname', 'require', '收货人姓名不能为空', 1, 'regex', CommonModel::MODEL_BOTH), +// array('mobile', 'require', '收货人电话不能为空', 1, 'regex', CommonModel::MODEL_BOTH), array('pay_sort', array(1,2), '支付方式错误', 1, 'regex', CommonModel::MODEL_BOTH), array('price_count', 'require', '订单价格不能为空', 1, 'regex', CommonModel::MODEL_BOTH), ); diff --git a/application/Portal/Controller/GoodsController.class.php b/application/Portal/Controller/GoodsController.class.php index 3bb0847..03af2a5 100644 --- a/application/Portal/Controller/GoodsController.class.php +++ b/application/Portal/Controller/GoodsController.class.php @@ -90,6 +90,15 @@ class GoodsController extends HomebaseController { $this->ajaxReturn(array('status'=>false,'msg'=>'该商品不存在')); } $cartGoodsList = $this->cart_model->getListByUser($user_id); + $cartNum = $this->cart_model->getOneNumByUser($user_id,$goods_id); + $goodsNum = $this->goods_model->getInfoNum($goods_id); + if($cartNum >= $goodsNum) { + $this->cart_model->where(array('user_id'=>$user_id,'goods_id'=>$goods_id))->save(array('num'=>$goodsNum)); + $this->ajaxReturn(array('status'=>false,'msg'=>'商品库存不足')); + } + if(($cartNum+$num) > $goodsNum) { + $this->ajaxReturn(array('status'=>false,'msg'=>'商品库存不足')); + } if(in_array($goods_id,$cartGoodsList)) { $result = $this->cart_model->where(array('user_id'=>$user_id,'goods_id'=>$goods_id))->setInc('num',$num); } else { diff --git a/application/User/Controller/CartController.class.php b/application/User/Controller/CartController.class.php index 3c5082b..f55ab97 100644 --- a/application/User/Controller/CartController.class.php +++ b/application/User/Controller/CartController.class.php @@ -41,6 +41,89 @@ class CartController extends MemberbaseController { } /** + * 修改购物车商品数量 + * @param id 商品id + * @param sort 类型(增加/减少) + */ + public function changeNum() { + if(IS_AJAX) { + $user_id = sp_get_current_userid(); + $id = I('post.id',0,'intval'); + $sort = I('post.sort'); + $num = I('post.num',0,'intval'); + if($sort == 'reduce') { + $num = -1; + } + // 判断传参是否正常 + if(!$num) { + $this->ajaxReturn(array('status'=>false,'msg'=>'请输入正确的商品数量')); + } + if($sort != 'plus' && $sort != 'reduce' && $sort != 'change') { + $this->ajaxReturn(array('status'=>false,'msg'=>'参数错误')); + } + // 判断购物车及商品数据 + $info = $this->cart_model->getOneByUser($user_id,$id); + if(!$info) { + $this->ajaxReturn(array('status'=>false,'msg'=>'购物车不存在该商品')); + } + if($sort == 'plus' || $sort == 'reduce') { + if(($info['num']+$num)>$info['goods_num']) { + $this->ajaxReturn(array('status'=>false,'msg'=>'商品库存不足')); + } + $info['num'] += $num; + } + if($sort == 'change') { + if(($num)>$info['goods_num']) { + $this->ajaxReturn(array('status'=>false,'msg'=>'商品库存不足')); + } + $info['num'] = $num; + } + // 更新购物车数据(价格及数量) + $this->cart_model->where(array('user_id'=>$user_id,'goods_id'=>$id))->save(array('num'=>$info['num'],'price'=>$info['goods_price'])); + $info['amount'] = $info['num'] * $info['goods_price']; + $info['sort'] = $sort; + $this->ajaxReturn(array('status'=>true,'msg'=>'修改成功','data'=>$info)); + } else { + $this->error('非法操作'); + } + } + + /** + * 删除(去付款)购物车商品 + * @param ids 要删除(去付款)的商品 + */ + public function del() { + if(IS_AJAX) { + $user_id = sp_get_current_userid(); + $ids = I('post.ids'); + $sort = I('post.sort'); + $redirect_url = ''; + if($sort != 'delete' && $sort != 'topay') { + $this->ajaxReturn(array('status'=>false,'msg'=>'参数错误')); + } + if($sort == 'delete') { + $name = '删除'; + } + if($sort == 'topay') { + $redirect_url = U('User/Cart/confirm',array('ids'=>implode(',',$ids))); + $name = '购买'; + } + if(!$ids) { + $this->ajaxReturn(array('status'=>false,'msg'=>'请选择要'.$name.'的商品')); + } + if($sort == 'delete') { + $result = $this->cart_model->where(array('goods_id'=>array('in',$ids),'user_id'=>$user_id))->delete(); + if(!$result) { + $this->ajaxReturn(array('status'=>false,'msg'=>'删除失败')); + } + } + $this->ajaxReturn(array('status'=>true,'msg'=>$name.'成功','data'=>$redirect_url)); + } else { + $this->error('非法操作'); + } + } + + /** * 确认订单页面 */ public function confirm() { @@ -55,11 +138,73 @@ class CartController extends MemberbaseController { $cartList[$k]['amount'] = $v['goods_price']*$v['num']; $count_amount += $cartList[$k]['amount']; } - $this->assign('list',$cartList); + $this->assign('cartList',$cartList); $this->assign('count_amount', $count_amount); $this->display(); } else { $this->error('非法操作'); } } + + /** + * 确认订单 + * @param address_id 收货地址信息 + * @param ids 购买的商品id + */ + public function createOrder() { + if(IS_AJAX) { + $user_id = $info['user_id'] = sp_get_current_userid(); + if(!$user_id) { + $this->ajaxReturn(array('status'=>false,'msg'=>'未登录')); + } + $info['address_id'] = $address_id = I('post.address_id',0,'intval'); + $ids = explode(',',I('post.ids')); + if(!$ids) { + $this->ajaxReturn(array('status'=>false,'msg'=>'参数错误')); + } + $list = $this->cart_model->where(array('goods_id'=>array('in',$ids),'user_id'=>$user_id))->select(); + if(!$list) { + $this->ajaxReturn(array('status'=>false,'msg'=>'购物车出现变化,请重新购买')); + } + $count_amount = 0; + foreach($list as $k=>$v) { + $count_amount += $v['num'] * $v['goods_price']; + } + // 生成订单 + M('Order')->startTrans(); + $order_model = D('Common/Order'); + $order_detail_model = D('Common/OrderDetail'); + $info['order_sn'] = $detail['order_sn'] = sp_get_order_sn(); + $info['status'] = 1; + $info['price_count'] = $count_amount; + $info['ctime'] = time(); + if(!$order_model->create($info)) { + M('Order')->rollback(); + $this->ajaxReturn(array('status'=>false,'msg'=>$order_model->getError())); + } + $order_id = $order_model->add($info); + if(!$order_id) { + M('Order')->rollback(); + $this->ajaxReturn(array('status'=>false,'msg'=>'添加订单失败')); + } + foreach($list as $k=>$v) { + $detail['goods_id'] = $v['goods_id']; + $detail['goods_price'] = $v['goods_price']; + $detail['num'] = $v['num']; + $detail['amount'] = $v['num'] * $v['goods_price']; + $detail['ctime'] = time(); + if(!$order_detail_model->create($detail)) { + M('Order')->rollback(); + $this->ajaxReturn(array('status'=>false,'msg'=>$order_detail_model->getError())); + } + if(!$order_detail_model->create($detail)) { + M('Order')->rollback(); + $this->ajaxReturn(array('status'=>false,'msg'=>'添加订单失败')); + } + } + $this->ajaxReturn(array('status'=>true,'msg'=>'添加订单成功','data'=>$order_id)); + } else { + $this->error('非法操作'); + } + } } \ No newline at end of file diff --git a/simplewind/Core/Library/Vendor/PHPExcel/PHPExcel/Calculation/Functions.php b/simplewind/Core/Library/Vendor/PHPExcel/PHPExcel/Calculation/Functions.php index 71bfa19..59dd75d 100644 --- a/simplewind/Core/Library/Vendor/PHPExcel/PHPExcel/Calculation/Functions.php +++ b/simplewind/Core/Library/Vendor/PHPExcel/PHPExcel/Calculation/Functions.php @@ -578,7 +578,6 @@ class PHPExcel_Calculation_Functions { return 4; } elseif(is_array($value)) { return 64; - break; } elseif(is_string($value)) { // Errors if ((strlen($value) > 0) && ($value{0} == '#')) { diff --git a/themes/simplebootx/Public/assets/js/shop.js b/themes/simplebootx/Public/assets/js/shop.js index 386089a..f10add5 100644 --- a/themes/simplebootx/Public/assets/js/shop.js +++ b/themes/simplebootx/Public/assets/js/shop.js @@ -34,9 +34,8 @@ $(function(){ //单选 var length = $('.cart-check').length-1; $('.cart-check').click(function() { - $(this).toggleClass('chrenActive'); var chrenLength = $('.chrenActive').length; - console.log(length,chrenLength) + $(this).toggleClass('chrenActive'); if(length==chrenLength){ $('#checkAll').prop('checked',true); $('#checkAll').addClass('active'); @@ -44,24 +43,157 @@ $(function(){ $('#checkAll').prop('checked',false); $('#checkAll').removeClass('active'); } + coin(); }); //数字 $('.total-number').each(function(){ + var sort = ''; var t = $(this).find(".numberbox"); - $(this).find(".btn-plus").click(function(){ - t.val(parseInt(t.val())+1) - if (parseInt(t.val())!=1){ - $('.btn-less').attr('disabled',false); - } - }) + var id = $(this).parents('.cart-cell').data('id'); + $(this).find(".btn-plus").click(function(){ + sort = 'plus'; + if (parseInt(t.val())!=1){ + $('.btn-less').attr('disabled',false); + } + change(id, sort, 1, $(this)); + }); $(this).find(".btn-less").click(function(){ - t.val(parseInt(t.val())-1); - if (parseInt(t.val())<=0){ + if (parseInt(t.val())<=1){ $(this).siblings(".numberbox").val(1); - } - }) + } else { + sort = 'reduce'; + change(id, sort, 1, $(this)); + } + }); }); + + // 数量输入框 + $('.p-table-border').on('focus','.numberbox',function(){ + var id = $(this).parents('.cart-cell').data('id'); + var num = $(this).val(); + $(this).data('old',num); + }); + + // 数量输入框 + $('.p-table-border').on('blur','.numberbox',function(){ + var id = $(this).parents('.cart-cell').data('id'); + var num = $(this).val(); + if(typeof num == 'undefined' || num<1) { + $(this).val($(this).data('old')); + } else { + change(id, 'change', num, $(this)); + } + }); + + // 执行修改数量ajax + function change(id, sort, num, obj) { + $.ajax({ + url:param.changeNum, + type:"POST", + data:{ + id:id, + sort:sort, + num:num + }, + dateType:"json", + success:function (data) { + if(data.status) { + if(data.data.sort == 'reduce') { + obj.parent().find(".numberbox").val(parseInt(obj.parent().find(".numberbox").val())-1); + } + if(data.data.sort == 'plus') { + obj.parent().find(".numberbox").val(parseInt(obj.parent().find(".numberbox").val())+1); + } + obj.parents('.cart-cell').find('.amount').text(data.data.amount); + coin(); + } else { + alert(data.msg); + } + }, + error: function (data, status, e) { //提交失败自动执行的处理函数 + alert(e); + } + }); + } + + // 删除购物车商品 + $('#delete').click(function(){ + var chrenLength = $('.chrenActive').length; + if(chrenLength == 0) { + alert('请选择要删除的商品'); + } else { + if(confirm('确认删除所选商品?')) { + var ids = []; + $('.chrenActive').each(function() { + ids.push($(this).parent().data('id')); + }); + handleCart(ids,'delele'); + } + } + }); + + // 去付款 + $('.pay-button').click(function(){ + var chrenLength = $('.chrenActive').length; + if(chrenLength == 0) { + alert('请选择要购买的商品'); + } else { + var ids = []; + $('.chrenActive').each(function() { + ids.push($(this).parent().data('id')); + }); + handleCart(ids,'topay'); + } + }); + + // 删除(去付款)购物车商品 + function handleCart(ids,sort) { + $.ajax({ + url:param.del, + type:"POST", + data:{ + ids:ids, + sort:sort + }, + dateType:"json", + success:function (data) { + console.log(data); + if(data.status) { + if(data.data) { + window.location.href = data.data; + } else { + $('.chrenActive').each(function(){ + $(this).parent().remove(); + }); + } + coin(); + } else { + alert(data.msg); + } + }, + error: function (data, status, e) { //提交失败自动执行的处理函数 + alert(e); + } + }); + } + + //合计 + function coin(){ + Coin = 0; + Num = 0; + $(".chrenActive").each(function() { + Num = parseFloat(Num)+parseFloat($(this).parent().find("input[name=num]").val()); + Coin = parseFloat(Coin)+parseFloat($(this).parent().find(".amount").text()); + }) + $("#choose").html(Num); + $(".all_price").html(Coin); + } + + // 确认订单 + $('#pay_confirm').click(function(){ + + }); //收藏 $(document).on('click','.btn-collect', function(){ diff --git a/themes/simplebootx/Public/nav.html b/themes/simplebootx/Public/nav.html index de86010..52437f9 100644 --- a/themes/simplebootx/Public/nav.html +++ b/themes/simplebootx/Public/nav.html @@ -2,7 +2,7 @@ <ul class="nav"> <volist name="site_nav" id="vo"> <eq name='key' value='0'> - <li><a href="__ROOT__">{$vo.label}</a></li> + <li><a href="/">{$vo.label}</a></li> <else/> <li class="{$vo.active}"><a href="{:U($vo['href'])}">{$vo.label}</a></li> </eq> diff --git a/themes/simplebootx/User/Cart/confirm.html b/themes/simplebootx/User/Cart/confirm.html index 860a79d..344f452 100644 --- a/themes/simplebootx/User/Cart/confirm.html +++ b/themes/simplebootx/User/Cart/confirm.html @@ -80,7 +80,7 @@ </tr> </thead> <tbody> - <volist name="list" id="vo"> + <volist name="cartList" id="vo"> <tr> <td class="td-cell-title"> <div class="orders-inbox"> @@ -97,11 +97,11 @@ </div> </td> <td class="td-cell-item"> - <div class="total-num">×1</div> + <div class="total-num">×{$vo.num}</div> </td> <td class="td-cell-item"> <div class="dd-price"> - ¥{$vo.goods_price} + ¥{$vo.amount} </div> </td> </tr> @@ -115,7 +115,7 @@ </div> </div> <div class="pay-footer"> - <a href="" class="pay-button">提交订单</a> + <a href="javascript:;" class="pay-button" id="pay_confirm">提交订单</a> <div class="pay-price">应付总额:<span>¥<i>{$count_amount}</i></span></div> </div> </div> diff --git a/themes/simplebootx/User/Cart/index.html b/themes/simplebootx/User/Cart/index.html index 054d779..c736c34 100644 --- a/themes/simplebootx/User/Cart/index.html +++ b/themes/simplebootx/User/Cart/index.html @@ -38,12 +38,12 @@ <input type="checkbox" id="checkAll" class="cart-check" />全选 </label> <div class="checkaction"> - <a href="">删除</a> + <a href="javascript:;" id="delete">删除</a> </div> </div> <div class="cart-list"> <volist name="cartList" id="vo"> - <div class="cart-cell" data-id="{$vo.id}"> + <div class="cart-cell" data-id="{$vo.goods_id}"> <input type="checkbox" class="cart-check" name="cart" /> <table class="p-table p-table-border"> <thead> @@ -58,7 +58,7 @@ <tr> <td class="td-cell-title"> <div class="orders-inbox"> - <a href="" class="pic"><img src="{:sp_get_image_preview_url($vo['thumb'])}"></a> + <a href="{:U('Portal/Goods/detail',array('id'=>$vo['goods_id']))}" class="pic"><img src="{:sp_get_image_preview_url($vo['thumb'])}"></a> <div class="auto"> <div class="title"><a href="{:U('Portal/Goods/detail',array('id'=>$vo['goods_id']))}">{$vo.goods_name}</a></div> <div class="desc">{$vo.short_name}</div> @@ -67,19 +67,19 @@ </td> <td class="td-cell-item"> <div class="dd-price"> - ¥{$vo.goods_price}<br><span class="dd-num">×1</span> + ¥<span class="goods_price">{$vo.goods_price}</span><br><span class="dd-num">×1</span> </div> </td> <td class="td-cell-item"> <div class="total-number"> <input type="button" class="btn-less" /> - <input type="text" class="numberbox" value="{$vo.num}"/> + <input type="number" onkeyup="value=value.replace(/[^\d]/g,'')" name="num" class="numberbox" value="{$vo.num}" data-old="0" /> <input type="button" class="btn-plus" /> </div> </td> <td class="td-cell-item"> <div class="dd-price"> - ¥{$vo.amount} + ¥<span class="amount">{$vo.amount}</span> </div> </td> </tr> @@ -91,9 +91,9 @@ </div> </div> <div class="pay-footer"> - <a href="" class="pay-button">去付款</a> + <a href="javascript:;" class="pay-button">去付款</a> <div class="pay-price"> - 已选商品 <span id="choose">0</span> 件 合计:<span>¥<i>{$count_amount}</i></span> + 已选商品 <span id="choose">0</span> 件 合计:<span>¥<i class="all_price">0</i></span> </div> </div> </div> @@ -101,6 +101,13 @@ </div> <tc_include file="Public:footer"/> <!-- js --> +<script> + var param = { + changeNum : "{:U('User/Cart/changeNum')}", + del : "{:U('User/Cart/del')}", + topay : "{:U('User/Cart/topay')}", + }; +</script> <script src="__TMPL__Public/assets/js/jquery.min.js"></script> <script src="__TMPL__Public/assets/js/shop.js"></script> <tc_include file="Public:script"/> diff --git a/themes/simplebootx_mobile/assets/html/cart.html b/themes/simplebootx_mobile/assets/html/cart.html index 917b916..0cf7af4 100644 --- a/themes/simplebootx_mobile/assets/html/cart.html +++ b/themes/simplebootx_mobile/assets/html/cart.html @@ -232,7 +232,7 @@ that.parent().parent().parent().remove() } }); - }) + }); //合计 function coin(){ Coin =0;