购物车是商城系统的重要组成部分之一,也是本次课程的难点之一。
设计思路
- 用户在商品详情页点击“加入购物车”按钮,添加商品至购物车;
- 当用户点击购物车底部菜单时,获取用户购物车商品数据,若用户没有登录则跳转至会员登陆界面;
- 修改购物车商品选中状态;
- 购物车全选功能和反选功能,当有一个商品不处于选中状态,全选也取消选中状态;
- 获取用户第一次打开购物车时的商品数据的结算总价,购物车中的商品是随时更新的,不能在onload()中执行,只能在onshow()中执行;
- 用户在购物车界面,修改购物车商品选中状态,结算总价也会跟着改变;
创建cart购物车数据表
CREATE TABLE `shancloudy`.`ims_shangcheng_xk_cart` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`goods_name` VARCHAR(100) NOT NULL COMMENT '商品名称' ,
`price` DECIMAL(10,2) NOT NULL DEFAULT '0' COMMENT '商品价格' ,
`member_id` MEDIUMINT NOT NULL COMMENT '会员ID' ,
`goods_id` MEDIUMINT NOT NULL COMMENT '商品ID' ,
`goods_num` MEDIUMINT NOT NULL DEFAULT '0' COMMENT '购买商品数量' ,
`selected` TINYINT(1) NOT NULL DEFAULT '1' COMMENT '是否被选中' ,
PRIMARY KEY (`id`)) ENGINE = InnoDB;
购物车cart.wxml文件
<!--shangcheng_xk/pages/cart/cart.wxml-->
<view class="container">
<view class="cart">
<view class="cart-title">
<view class="sendfree">
<text>满包邮</text>
<text>全场满88元包邮,还差15.8元</text>
</view>
<view class="collage">去凑单></view>
</view>
<scroll-view scroll-y="true" style="height: {{screenHeight}}px;" >
<view class="cart-list">
<view class="cart-item" wx:for="{{ cartGoods }}" wx:key="id">
<view class="left" >
<icon type="success" size="18" color="#ff6700" wx:if="{{ item.selected==1 }}" data-index="{{ index }}" bindtap="modifyStatus"></icon>
<icon type="circle" size="18" wx:else data-index="{{ index }}" bindtap="modifyStatus"></icon>
</view>
<view class="center">
<image src="{{ item.image }}" mode="widthFix"></image>
</view>
<view class="right">
<view class="goods-info">
<text class="goods-title">{{ item.goods_name }}</text>
<text class="goods-desc">{{ item.goods_desc}}</text>
</view>
<view class="goods-saleinfo">
<view class="goods-price">
<text>¥</text>
<text>{{ item.now_price}}</text>
<text>{{ item.original_price}}</text>
</view>
<!-- <view class="goods-num">
<text>-</text>
<input type="number" maxlength="3" value="1"></input>
<text>+</text>
</view> -->
</view>
</view>
</view>
</view>
</scroll-view>
</view>
<view class="buy">
<view class="buy-left">
<view class="choose" bindtap="checkAll" wx:if="{{ checkAlltype }}">
<icon type="success" size="20" color="#ff6700"></icon>
<text>全选</text>
</view>
<view class="choose" bindtap="checkAll" wx:else>
<icon type="circle" size="20" color="#ff6700"></icon>
<text>全选</text>
</view>
<view class="price">
<view>
<text class="total">总计:</text>
<text class="total-price">¥{{ goodsTotalPrice }}</text>
</view>
<view>
<text class="send">配送费:¥5.00</text>
</view>
</view>
</view>
<view class="buy-right">
结算
</view>
</view>
</view>
购物车cart.js文件
// shangcheng_xk/pages/cart/cart.js
var app = getApp();
Page({
/**
* 页面的初始数据
*/
data: {
screenHeight: '',
cartGoods: '',
checkAlltype: false,
goodsTotalPrice: ''
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
var goodsId = options.goodsId
var that = this
// 获取屏幕滚动区域的高度
wx.getSystemInfo({
success: function (res) {
var screenHeight = res.windowHeight - 55 - 60
that.setData({
screenHeight: screenHeight
})
},
})
this.getCartInfo()
},
// 获取购物车商品数据
getCartInfo: function () {
var that = this
var memberInfo = wx.getStorageSync('member')
if (memberInfo) {
var memberId = memberInfo.id
app.util.request({
url: 'entry/wxapp/cart',
data: {
m: 'shangcheng_xk',
memberId: memberId
},
success(res) {
that.setData({
cartGoods: res.data.data
})
}
});
} else {
wx.showToast({
title: '您还有没登录...',
icon: 'success',
duration: 2000
})
setTimeout(function () {
wx.switchTab({
url: '/shangcheng_xk/pages/member/member',
})
}, 2000)
}
},
// 修改购物车选中状态
modifyStatus: function (e) {
var that = this
var cartGoods = that.data.cartGoods
var memberInfo = wx.getStorageSync('member')
var goodsIndex = e.currentTarget.dataset.index
var goodsInfo = cartGoods[goodsIndex]
if (goodsInfo['selected'] == 1) {
goodsInfo['selected'] = 0
} else {
goodsInfo['selected'] = 1
}
that.setData({
cartGoods: cartGoods
})
var member_id = memberInfo.id
var goods_id = goodsInfo.id
var selected = goodsInfo.selected
that.modifyCartStatus(member_id, goods_id, selected)
},
modifyCartStatus: function (member_id, goods_id, selected) {
var that = this
app.util.request({
url: 'entry/wxapp/modifyCartStatus',
data: {
m: 'shangcheng_xk',
member_id: member_id,
goods_id: goods_id,
selected: selected
},
success(res) {
if (res.data.data.status == 1) {
that.setData({
checkAlltype: true
})
} else {
that.setData({
checkAlltype: false
})
}
wx.showToast({
title: '修改成功',
icon: 'success',
duration: 2000
})
}
})
this.getGoodsTotalPrice()
},
// 购物车全选功能
checkAll: function () {
var that = this
var checkAlltype = !that.data.checkAlltype
var cartGoods = that.data.cartGoods
if (checkAlltype) {
for (var i = 0; i < cartGoods.length; i++) {
cartGoods[i]['selected'] = 1;
}
} else {
for (var i = 0; i < cartGoods.length; i++) {
cartGoods[i]['selected'] = 0;
}
}
that.setData({
cartGoods: cartGoods,
checkAlltype: checkAlltype
})
that.modifyCheckAll()
that.getGoodsTotalPrice()
},
modifyCheckAll: function () {
var that = this
var status = that.data.checkAlltype
var memberInfo = wx.getStorageSync('member')
var memberId = memberInfo.id
if (status) {
var selected = 1
} else {
var selected = 0
}
app.util.request({
url: 'entry/wxapp/modifyCheckAll',
data: {
m: 'shangcheng_xk',
selected: selected,
member_id: memberId
},
success(res) {}
});
},
// 获取第一次打开购物车界面商品总价
getFirstGoodsTotalPrice: function () {
var that = this
var memberInfo = wx.getStorageSync('member')
var memberId = memberInfo.id
app.util.request({
url: 'entry/wxapp/getFirstGoodsTotalPrice',
data: {
m: 'shangcheng_xk',
member_id: memberId
},
success(res) {
// console.log(res.data.data)
that.setData({
goodsTotalPrice: res.data.data
})
}
});
},
// 获取修改购物车商品状态时购物车界面商品总价
getGoodsTotalPrice: function () {
var that = this
var cartGoods = that.data.cartGoods
var goodsTotalPrice = 0
for (var i = 0; i < cartGoods.length; i++) {
if (cartGoods[i]['selected'] == 1) {
goodsTotalPrice = Number(goodsTotalPrice) + Number(cartGoods[i]['now_price'])
}
}
that.setData({
goodsTotalPrice: goodsTotalPrice
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
this.getCartInfo()
this.getFirstGoodsTotalPrice()
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
购物车wxapp.php文件
// 添加购物车数据
public function doPageCartAdd(){
global $_W,$_GPC;
$errno = 0;
$message = '返回消息';
$data = array();
$memberId = $_GPC['memberId'];
$goodsId = $_GPC['goodsId'];
$goodsRes = pdo_get('shangcheng_xk_goods',['id'=>$goodsId]);
if($goodsRes){
$data = [
'goods_id' =>$goodsRes['id'],
'member_id' =>$memberId
];
$cartData = pdo_get('shangcheng_xk_cart',$data);
if(!$cartData){
$cartRes = pdo_insert('shangcheng_xk_cart',$data);
if($cartRes){
$data['status'] = 1;
return $this->result($errno, '加入购物车成功', $data);
}else{
$data['status'] = 0;
return $this->result($errno, '加入购物车失败', $data);
}
}else{
$data['status'] = 3;
return $this->result($errno, '商品已添加至购物车', $data);
}
}
return $this->result($errno, $message, $data);
}
// 获取用户购物车列表数据
public function doPageCart(){
global $_W,$_GPC;
$errno = 0;
$message = '返回消息';
$data = array();
$memberId = $_GPC['memberId'];
$cartRes = pdo_getall('shangcheng_xk_cart',['member_id'=>$memberId]);
if($cartRes){
foreach ($cartRes as $k => $v) {
$goodsRes[] = pdo_get('shangcheng_xk_goods',['id'=>$v['goods_id']]);
$goodsRes[$k]['selected'] = $v['selected'];
}
foreach ($goodsRes as $k1 => $v1) {
$goodsRes[$k1]['goods_name'] = cutstr($v1['goods_name'],22,true);
$goodsRes[$k1]['goods_desc'] = cutstr($v1['goods_desc'],22,true);
$goodsImg[] = pdo_get('shangcheng_xk_goodsimages',['goodsid'=>$v1['id']]);
foreach ($goodsImg as $k2 => $v2) {
$goodsRes[$k1]['image'] = $_W['attachurl'].$v2['image'];
}
}
if($goodsRes){
return $this->result($errno, $message, $goodsRes);
}
}
}
// 修改购物车选中状态
public function doPageModifyCartStatus(){
global $_W,$_GPC;
$errno = 0;
$message = '返回消息';
$data = array();
$selected = $_GPC['selected'];
$data = [
'member_id' =>$_GPC['member_id'],
'goods_id' =>$_GPC['goods_id']
];
$modifyRes = pdo_update('shangcheng_xk_cart',['selected'=>$selected],$data);
$selectednum = pdo_fetchcolumn("SELECT COUNT(*) FROM ".tablename('shangcheng_xk_cart')."WHERE member_id = ".$_GPC['member_id']." and selected = 1");
$allnum = pdo_fetchcolumn("SELECT COUNT(*) FROM ".tablename('shangcheng_xk_cart')."WHERE member_id = ".$_GPC['member_id']);
if($selectednum == $allnum){
$data['status'] = 1;
}else{
$data['status'] = 0;
}
return $this->result($errno, '修改成功', $data);
}
// 修改购物车全选状态
public function doPageModifyCheckAll(){
global $_W,$_GPC;
$errno = 0;
$message = '返回消息';
$data = array();
$selected = $_GPC['selected'];
$member_id = $_GPC['member_id'];
$modifyRes = pdo_update('shangcheng_xk_cart',['selected'=>$selected],['member_id'=>$member_id]);
if($modifyRes){
return $this->result($errno, '全选修改成功', ['res'=>1]);
}else{
return $this->result($errno, '全选修改失败', ['res'=>0]);
}
}
// 获取第一次打开购物车界面商品总价
public function doPageGetFirstGoodsTotalPrice(){
global $_W,$_GPC;
$errno = 0;
$message = '返回消息';
$data = array();
$data = [
'member_id' =>$_GPC['member_id'],
'selected' =>1
];
$goodsRes = pdo_getall('shangcheng_xk_cart',$data);
if($goodsRes){
foreach ($goodsRes as $k => $v) {
$goodsPrice = pdo_getcolumn('shangcheng_xk_goods',['id'=>$v['goods_id']],'now_price');
$goodsTotalPrice += $goodsPrice;
}
return $this->result($errno, '获取商品成功', $goodsTotalPrice);
}else{
return $this->result($errno, '获取商品失败', ['res'=>0]);
}
}
以上就是本节课的主要内容,如果有看不懂的同学可以联系小编,还有一个好消息,就是如果文字教程大家看着比较费劲的话,可以关注小编,在8月份小编录制的视频教程就要正式上线了,到时候会对微擎框架进行更有深度的解析,与大家一起交流学习心得。