加入购物车,在点击加入购物车判断已经登陆之后
在GoodsController的add_cart() 里面 判断确实登陆了
//接收ajax传过来的值
$data['goods_id'] = I("post.goods_id",0,"int");
$data['num'] = I("post.goods_num",0,"int");
$data['user_id'] = session("user.id");
$cart = M("cart");
//先查询是否有这个人的这个商品
加入购物车的时候,同一个人同一个商品只存在一条数据
$old_data = $cart->where("user_id=".$data['user_id']." and goods_id=".$data['goods_id'])->find();
if($old_data){
//存在
$data['num'] += $old_data['num'];
if($cart->where("id=".$old_data['id'])->save($data)!==false){
echo 1;
}else{
echo 0;//加入失败
}
}else{
if($cart->add($data)){
echo 1;
}else{
echo 0;//加入失败
}
在detail.html里面的ajax里面补充
else if(data == 0){
alert("加入购物车失败,请刷新后重试,或者尝试直接购买");
}else if(data == 1){
alert("加入购物车成功");
}
一般不用alert进行输出而是在下面写上一个100%的div,透明度设为0,这样网页里面的东西就不可点了,然后再再这个div里面键一个小的div
<div id="msg" style="display:none;width: 100%;height: 100%;position: fixed;top:0;opacity: 50%;;z-index: 999;">
<div style="text-align:center;margin: 300px auto;border: 1px solid red;width: 300px;height: 130px;">
</div>
</div>
<script>
var goods_id = {$goods_data.id};//读取到当前产品的id
/**
* 加入购物车的方法 ajax提交
*/
function addCart(){
var num = $("#buy_num").val();//购买数量
$.post("{:U('Goods/add_cart')}",{goods_id:goods_id,goods_num:num},function(data){
if(data == -2){
$("#msg").find("div").html("请求有误,请刷新后重拾");
}else if(data == -1){
$("#msg").find("div").html("请先登录后再进行购买");
$("#msg").show('slow');
window.location.href="{:U('User/login')}";//没有登录的话 直接跳转到登陆界面
}else if(data == 0){
$("#msg").find("div").html("加入购物车失败,请刷新后重试,或者尝试直接购买");
// alert("加入购物车失败,请刷新后重试,或者尝试直接购买");
}else if(data == 1){
$("#msg").find("div").html("加入购物车成功");
//alert("加入购物车成功");
}
$("#msg").show('slow');
setTimeout(function(){
$("#msg").hide("slow");
},1000);
})
}
</script>
点击立即购买 用js的方法将值传递过去
<button type="button" class="btn btn-danger">立即购买</button>
$(".btn.btn-danger").click(function(){
var num = $("#buy_num").val();//购买数量
window.location.href="{:U('Goods/buy')}?goods_id="+goods_id+"&num="+num;
})
/**
* 点击立即购买时的界面 立即购买之只针对单个商品,如果是点击购物车进去就是多个商品
*/
public function buy(){
$id = I("get.goods_id",0,"int");
$num = I("get.num",0,"int");
//看有没有登陆
if(session("?user")){
//看你有没有收货地址
$address = M("address");
$address_data = $address->where("user_id=".session("user.id"))->select();
if($address_data){
$goods = M("goods");
$goods_data = $goods->field("id,name,img,info,shop_price")->where("id=".$id)->find();
$this->assign("address_data",$address_data);
$this->assign("goods_data",$goods_data);
$this->assign("num",$num);
$this->display(); (order.html)
}else{
//没有收货地址 我需要进行添加
$this->error("请先添加收获地址",U('User/add_address')); (看下面)
}
}else{
$this->error("请先登录后在购买",U('User/login'));
}
}
在视图里面order.html 将名字改为buy
选择地址
<volist name="address_data" id="v">
<div class="m-order-item">
<a href="javascript:change({$v.id});" class="m-order-address">
<input class="a{$v.id}" type="radio" <if condition="$v['is_default'] eq 1">checked</if> name="address_id" value="{$v.id}">
{$v.name} {$v.tel}<span class="orange">[{$v.name}]</span>
<p>{$v.address}</p>
</a>
</div>
</volist>
<script>
function change(id){
$(".a"+id).click();
}
</script>
<li>
<a href="{:U('Goods/detail',array('id'=>$goods_data['id']))}">
<img class="lazy pull-left" src="{$goods_data.img}" alt="">
<div class="m-cartlist-info">
<h3>{$goods_data.name}</h3>
<h4>{$goods_data.info}</h4>
<h5>¥{$goods_data.shop_price}</h5>
</div>
</a>
<span class="m-cartlist-nums">x {$num}</span>
</li>
支付方式仅限于支付宝
购物车: 新建CartController 由于购物车里面的所有方法都需要判断是否登陆
所以新建
namespace Home\Controller;
use Think\Controller;
class BackController extends Controller{
public function __construct(){
parent::__construct();
if(!session("?user")){
$this->error("请先进行登录",U("User/login"));
}
}
}
新建视图模型
namespace Home\Model;
use Think\Model\ViewModel;
class CartViewModel extends ViewModel{
public $viewFields = array(
'cart'=>array('id','num'),//主表以及要查询的字段 'goods'=>array('id'=>'goods_id','img','name','info','shop_price','_on'=>'cart.goods_id=goods.id'),
);
}
在CartController中
namespace Home\Controller;
use Think\Controller;
class CartController extends BackController{
public function index(){
$cart = D("CartView");
$data = $cart->where("cart.user_id=".session("user.id"))->select();
//print_r($data);
$this->assign("data",$data);
$this->display();
}
}
在购物车视图中
<foreach name="data" item="v">
<li type="normal">
<a href="{:U('Goods/detail',array('id'=>$v['goods_id']))}" >
<img class="lazy pull-left" src="{$v.img}">
<div class="m-cartlist-info">
<h3>{$v.name}</h3>
<h4>{$v.info}</h4>
<h5>¥{$v.shop_price}</h5>
</div>
</a>
<span class="m-cartlist-delete" data-dismiss="alert">
<i class="glyphicon fdayicon fdayicon-delete"></i>
</span>
<div class="m-cart-numswrap">
<div class="num_sel_lage pull-right clearfix">
<span class="inC">-</span>
<input type="text" disabled="" name='qty' autocomplete='on' value="{$v.num}" >
<span class="deC">+</span>
</div>
</div>
</li>
</foreach>
删除就是有ajax删除就可以了 自己做
<button type="button" class="btn btn-warning navbar-btn pull-right" οnclick="location.href='{:U(\'Cart/buy\')}'">去结算</button> 通过购物车点进结算中心
在CartController中新建
public function buy(){
$address = M("address");
$address_data = $address->where("user_id=".session("user.id"))->select();
if($address_data){
$cart = D("CartView");
$data = $cart->where("cart.user_id=".session("user.id"))->select();
$this->assign("address_data",$address_data);
$this->assign("data",$data);
$this->display("Goods:buy");
}else{
$this->error("请先添加收获地址",U('User/add_address'));
}
}
在add_address.html里面 市区县的下拉框删掉,到时候自己去找个插件,这是连动的
设为默认地址:
<input name="is_default" type="checkbox" class="onoffswitch-checkbox hide" id="myonoffswitch" value='1'>
地址类型删掉
<form class="form-horizontal m-order-address-form" role="form" method="post" action="{:U('User/add_address')}">
在UserController里面添加
public function add_address(){
if(session("?user")){
添加完收货地址应该跳回到前一个页面
if(!(strstr($_SERVER['HTTP_REFERER'],"User/add_address"))){
setcookie("prev_href",$_SERVER['HTTP_REFERER']);
}
if(IS_POST){
$address = M("address");
$data['name'] = I("post.name","","addslashes");
$data['address'] = I("post.address","","addslashes");
$data['tel'] = I("post.tel","","addslashes");
$data['is_default'] = I("post.is_default",0,"int");
//记住 一个人的默认地址只有一个 如果is_default是1的话 你需要先去修改原来的默认地址为0
if($data['is_default'] == 1){
$new_data['is_default'] = 0;
$address->where("user_id=".session("user.id")." and is_default=1")->save($new_data);
}
$data['user_id'] = session("user.id");
if($address->add($data)){
if($_COOKIE['prev_href']){
$this->success('新增成功',$_COOKIE['prev_href']);
}else{
$this->success('新增成功',U('User/address_list'));
}
}else{
$this->error("新增失败");
}
}else{
$this->display();
}
}else{
$this->error("请先登录后在添加收货地址",U('User/login'));
}
}
在goods的buy界面
<if condition="$num"> 如果有$num传过来,说明是立即购买传过来的 这时购买单个商品
<li>
<a href="{:U('Goods/detail',array('id'=>$goods_data['id']))}">
<img class="lazy pull-left" src="{$goods_data.img}" alt="">
<div class="m-cartlist-info">
<h3>{$goods_data.name}</h3>
<h4>{$goods_data.info}</h4>
<h5>¥{$goods_data.shop_price}</h5>
</div>
</a>
<span class="m-cartlist-nums">x {$num}</span>
</li>
<else /> 否则是购物车点击过来的, 这时购买多个商品
<volist name="data" id="v">
<li>
<a href="{:U('Goods/detail',array('id'=>$v['goods_id']))}">
<img class="lazy pull-left" src="{$v.img}" alt="">
<div class="m-cartlist-info">
<h3>{$v.name}</h3>
<h4>{$v.info}</h4>
<h5>¥{$v.shop_price}</h5>
</div>
</a>
<span class="m-cartlist-nums">x {$v.num}</span>
</li>
</volist>
</if>
在GoodsController的add_cart() 里面 判断确实登陆了
//接收ajax传过来的值
$data['goods_id'] = I("post.goods_id",0,"int");
$data['num'] = I("post.goods_num",0,"int");
$data['user_id'] = session("user.id");
$cart = M("cart");
//先查询是否有这个人的这个商品
加入购物车的时候,同一个人同一个商品只存在一条数据
$old_data = $cart->where("user_id=".$data['user_id']." and goods_id=".$data['goods_id'])->find();
if($old_data){
//存在
$data['num'] += $old_data['num'];
if($cart->where("id=".$old_data['id'])->save($data)!==false){
echo 1;
}else{
echo 0;//加入失败
}
}else{
if($cart->add($data)){
echo 1;
}else{
echo 0;//加入失败
}
在detail.html里面的ajax里面补充
else if(data == 0){
alert("加入购物车失败,请刷新后重试,或者尝试直接购买");
}else if(data == 1){
alert("加入购物车成功");
}
一般不用alert进行输出而是在下面写上一个100%的div,透明度设为0,这样网页里面的东西就不可点了,然后再再这个div里面键一个小的div
<div id="msg" style="display:none;width: 100%;height: 100%;position: fixed;top:0;opacity: 50%;;z-index: 999;">
<div style="text-align:center;margin: 300px auto;border: 1px solid red;width: 300px;height: 130px;">
</div>
</div>
<script>
var goods_id = {$goods_data.id};//读取到当前产品的id
/**
* 加入购物车的方法 ajax提交
*/
function addCart(){
var num = $("#buy_num").val();//购买数量
$.post("{:U('Goods/add_cart')}",{goods_id:goods_id,goods_num:num},function(data){
if(data == -2){
$("#msg").find("div").html("请求有误,请刷新后重拾");
}else if(data == -1){
$("#msg").find("div").html("请先登录后再进行购买");
$("#msg").show('slow');
window.location.href="{:U('User/login')}";//没有登录的话 直接跳转到登陆界面
}else if(data == 0){
$("#msg").find("div").html("加入购物车失败,请刷新后重试,或者尝试直接购买");
// alert("加入购物车失败,请刷新后重试,或者尝试直接购买");
}else if(data == 1){
$("#msg").find("div").html("加入购物车成功");
//alert("加入购物车成功");
}
$("#msg").show('slow');
setTimeout(function(){
$("#msg").hide("slow");
},1000);
})
}
</script>
点击立即购买 用js的方法将值传递过去
<button type="button" class="btn btn-danger">立即购买</button>
$(".btn.btn-danger").click(function(){
var num = $("#buy_num").val();//购买数量
window.location.href="{:U('Goods/buy')}?goods_id="+goods_id+"&num="+num;
})
/**
* 点击立即购买时的界面 立即购买之只针对单个商品,如果是点击购物车进去就是多个商品
*/
public function buy(){
$id = I("get.goods_id",0,"int");
$num = I("get.num",0,"int");
//看有没有登陆
if(session("?user")){
//看你有没有收货地址
$address = M("address");
$address_data = $address->where("user_id=".session("user.id"))->select();
if($address_data){
$goods = M("goods");
$goods_data = $goods->field("id,name,img,info,shop_price")->where("id=".$id)->find();
$this->assign("address_data",$address_data);
$this->assign("goods_data",$goods_data);
$this->assign("num",$num);
$this->display(); (order.html)
}else{
//没有收货地址 我需要进行添加
$this->error("请先添加收获地址",U('User/add_address')); (看下面)
}
}else{
$this->error("请先登录后在购买",U('User/login'));
}
}
在视图里面order.html 将名字改为buy
选择地址
<volist name="address_data" id="v">
<div class="m-order-item">
<a href="javascript:change({$v.id});" class="m-order-address">
<input class="a{$v.id}" type="radio" <if condition="$v['is_default'] eq 1">checked</if> name="address_id" value="{$v.id}">
{$v.name} {$v.tel}<span class="orange">[{$v.name}]</span>
<p>{$v.address}</p>
</a>
</div>
</volist>
<script>
function change(id){
$(".a"+id).click();
}
</script>
<li>
<a href="{:U('Goods/detail',array('id'=>$goods_data['id']))}">
<img class="lazy pull-left" src="{$goods_data.img}" alt="">
<div class="m-cartlist-info">
<h3>{$goods_data.name}</h3>
<h4>{$goods_data.info}</h4>
<h5>¥{$goods_data.shop_price}</h5>
</div>
</a>
<span class="m-cartlist-nums">x {$num}</span>
</li>
支付方式仅限于支付宝
购物车: 新建CartController 由于购物车里面的所有方法都需要判断是否登陆
所以新建
namespace Home\Controller;
use Think\Controller;
class BackController extends Controller{
public function __construct(){
parent::__construct();
if(!session("?user")){
$this->error("请先进行登录",U("User/login"));
}
}
}
新建视图模型
namespace Home\Model;
use Think\Model\ViewModel;
class CartViewModel extends ViewModel{
public $viewFields = array(
'cart'=>array('id','num'),//主表以及要查询的字段 'goods'=>array('id'=>'goods_id','img','name','info','shop_price','_on'=>'cart.goods_id=goods.id'),
);
}
在CartController中
namespace Home\Controller;
use Think\Controller;
class CartController extends BackController{
public function index(){
$cart = D("CartView");
$data = $cart->where("cart.user_id=".session("user.id"))->select();
//print_r($data);
$this->assign("data",$data);
$this->display();
}
}
在购物车视图中
<foreach name="data" item="v">
<li type="normal">
<a href="{:U('Goods/detail',array('id'=>$v['goods_id']))}" >
<img class="lazy pull-left" src="{$v.img}">
<div class="m-cartlist-info">
<h3>{$v.name}</h3>
<h4>{$v.info}</h4>
<h5>¥{$v.shop_price}</h5>
</div>
</a>
<span class="m-cartlist-delete" data-dismiss="alert">
<i class="glyphicon fdayicon fdayicon-delete"></i>
</span>
<div class="m-cart-numswrap">
<div class="num_sel_lage pull-right clearfix">
<span class="inC">-</span>
<input type="text" disabled="" name='qty' autocomplete='on' value="{$v.num}" >
<span class="deC">+</span>
</div>
</div>
</li>
</foreach>
删除就是有ajax删除就可以了 自己做
<button type="button" class="btn btn-warning navbar-btn pull-right" οnclick="location.href='{:U(\'Cart/buy\')}'">去结算</button> 通过购物车点进结算中心
在CartController中新建
public function buy(){
$address = M("address");
$address_data = $address->where("user_id=".session("user.id"))->select();
if($address_data){
$cart = D("CartView");
$data = $cart->where("cart.user_id=".session("user.id"))->select();
$this->assign("address_data",$address_data);
$this->assign("data",$data);
$this->display("Goods:buy");
}else{
$this->error("请先添加收获地址",U('User/add_address'));
}
}
在add_address.html里面 市区县的下拉框删掉,到时候自己去找个插件,这是连动的
设为默认地址:
<input name="is_default" type="checkbox" class="onoffswitch-checkbox hide" id="myonoffswitch" value='1'>
地址类型删掉
<form class="form-horizontal m-order-address-form" role="form" method="post" action="{:U('User/add_address')}">
在UserController里面添加
public function add_address(){
if(session("?user")){
添加完收货地址应该跳回到前一个页面
if(!(strstr($_SERVER['HTTP_REFERER'],"User/add_address"))){
setcookie("prev_href",$_SERVER['HTTP_REFERER']);
}
if(IS_POST){
$address = M("address");
$data['name'] = I("post.name","","addslashes");
$data['address'] = I("post.address","","addslashes");
$data['tel'] = I("post.tel","","addslashes");
$data['is_default'] = I("post.is_default",0,"int");
//记住 一个人的默认地址只有一个 如果is_default是1的话 你需要先去修改原来的默认地址为0
if($data['is_default'] == 1){
$new_data['is_default'] = 0;
$address->where("user_id=".session("user.id")." and is_default=1")->save($new_data);
}
$data['user_id'] = session("user.id");
if($address->add($data)){
if($_COOKIE['prev_href']){
$this->success('新增成功',$_COOKIE['prev_href']);
}else{
$this->success('新增成功',U('User/address_list'));
}
}else{
$this->error("新增失败");
}
}else{
$this->display();
}
}else{
$this->error("请先登录后在添加收货地址",U('User/login'));
}
}
在goods的buy界面
<if condition="$num"> 如果有$num传过来,说明是立即购买传过来的 这时购买单个商品
<li>
<a href="{:U('Goods/detail',array('id'=>$goods_data['id']))}">
<img class="lazy pull-left" src="{$goods_data.img}" alt="">
<div class="m-cartlist-info">
<h3>{$goods_data.name}</h3>
<h4>{$goods_data.info}</h4>
<h5>¥{$goods_data.shop_price}</h5>
</div>
</a>
<span class="m-cartlist-nums">x {$num}</span>
</li>
<else /> 否则是购物车点击过来的, 这时购买多个商品
<volist name="data" id="v">
<li>
<a href="{:U('Goods/detail',array('id'=>$v['goods_id']))}">
<img class="lazy pull-left" src="{$v.img}" alt="">
<div class="m-cartlist-info">
<h3>{$v.name}</h3>
<h4>{$v.info}</h4>
<h5>¥{$v.shop_price}</h5>
</div>
</a>
<span class="m-cartlist-nums">x {$v.num}</span>
</li>
</volist>
</if>