微擎模块开发-微擎小程序商城购物车功能详解(后端篇)

购物车是商城系统的重要组成部分之一,也是本次课程的难点之一。

设计思路

  1. 用户在商品详情页点击“加入购物车”按钮,添加商品至购物车;
  2. 当用户点击购物车底部菜单时,获取用户购物车商品数据,若用户没有登录则跳转至会员登陆界面;
  3. 修改购物车商品选中状态;
  4. 购物车全选功能和反选功能,当有一个商品不处于选中状态,全选也取消选中状态;
  5. 获取用户第一次打开购物车时的商品数据的结算总价,购物车中的商品是随时更新的,不能在onload()中执行,只能在onshow()中执行;
  6. 用户在购物车界面,修改购物车商品选中状态,结算总价也会跟着改变;
创建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月份小编录制的视频教程就要正式上线了,到时候会对微擎框架进行更有深度的解析,与大家一起交流学习心得。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值