• 在thinkphp5中实现购物车的功能


    简单思路分析

    首先需要理解的是,购物车操作是SESSION的原理

    一个物品加进去是一个数组,存ID NAME NUM

    那么两个物品就是二维数组,所以用二维数组来操作就可以了。

    1. 点击购买之后转到buy方法中
    2. 判断购物车的SESSION是否是数组,是则购物车有物品[产品ID是数组的KEY]
    3. 判断传递的ID在购物车的SESSION是否存在,不存在就添加进去,数量默认为1[产品ID是数组的KEY]
    4. 判断传递的ID在购物车的SESSION是否存在,存在就把数量+1[产品ID是数组的KEY]
    5. 判断购物车的SESSION是否是数组,不是则直接存入SESSION[产品ID是数组的KEY]
    6. 添加完成后转到car.php,循环展示出购买的东西
    7. 点击不想购买的商品,删除delete.php,删除对应SESSION下key对应的ID值即可

    表结构:

    1. SET FOREIGN_KEY_CHECKS=0;
    2. -- ----------------------------
    3. -- Table structure for `produce`
    4. -- ----------------------------
    5. DROP TABLE IF EXISTS `produce`;
    6. CREATE TABLE `produce` (
    7. `id` int(11) NOT NULL AUTO_INCREMENT,
    8. `name` varchar(50) DEFAULT NULL,
    9. `pimg` varchar(200) DEFAULT NULL,
    10. `price` int(11) DEFAULT NULL,
    11. PRIMARY KEY (`id`)
    12. ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
    13. -- ----------------------------
    14. -- Records of produce
    15. -- ----------------------------
    16. INSERT INTO `produce` VALUES ('1', '测试', 'test.png', '1');
    17. INSERT INTO `produce` VALUES ('2', '测试2', 'test.png', '2');
    18. INSERT INTO `produce` VALUES ('3', '测试3', 'test.png', '1');
    19. INSERT INTO `produce` VALUES ('4', '测试4', 'test.png', '2');
    20. INSERT INTO `produce` VALUES ('5', '测试5', 'test.png', '9');

    商品列表方法:

    1. public function index()
    2. {
    3. $produce = Db::name('produce')->select();
    4. return view('index',['list'=>$produce]);
    5. }

    商品列表页面:

     

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. head>
    7. <body>
    8. <h1><header>商品列表header>h1>
    9. <table width="343" height="152" border="1" style="float:left">
    10. {volist name="list" id="row"}
    11. <tr>
    12. <td width="124" rowspan="3"><img src="" width="123" height="121" border="0"/>td>
    13. <td width="203" height="35">货物名称:td>
    14. tr>
    15. <tr>
    16. <td height="28">货物价格:td>
    17. tr>
    18. <tr>
    19. <td height="27"align="center"><a href="buy?pid={$row['id']}&pname={$row['name']}">加入购物车a>td>
    20. tr>
    21. {/volist}
    22. table>
    23. body>
    24. html>

    加入购物车处理方法,加入成功后跳转到购物车列表页

    1. public function buy()
    2. {
    3. // echo '
      ';
    4. // Session::clear();die;
    5. $param = request()->param();
    6. //物品id
    7. $pid = $param['pid'];
    8. //物品名称
    9. $pname = $param['pname'];
    10. $arr = session('mycar');
    11. //先判断这个变量是否是数组,可以得到以前是否买过东西
    12. if(is_array($arr)){
    13. //是数组,买过东西
    14. //买过东西分两种,这种东西是否买过,买过对其数量加1,没买过,将此商品id和name值组建成一个一维数组
    15. if(array_key_exists($pid,$arr)){
    16. //拿出这个商品的信息
    17. $uu = $arr[$pid];
    18. $uu['num'] = $uu['num']+1;
    19. //该商品加1后重新赋值
    20. $arr[$pid] = $uu;
    21. }else{
    22. $arr[$pid] = array('pid'=>$pid,'name'=>$pname,'num'=>1);
    23. }
    24. }else{
    25. $arr[$pid] = array('pid'=>$pid,'name'=>$pname,'num'=>1);
    26. }
    27. //处理完后,重新将此数据放入session中,便可以在各个页面进行赋值
    28. session('mycar',$arr);
    29. //这里要使用重定向
    30. return redirect('/car');
    31. }

    购物车列表页

    1. //购物车页面
    2. public function car()
    3. {
    4. $arr = session('mycar');
    5. return view('car',['list'=>$arr]);
    6. }
    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>购物车title>
    6. head>
    7. <body>
    8. <h1><header>购物车header>h1>
    9. <table width="600" height="37"border="1">
    10. <tr>
    11. <td width="96">商品IDtd>
    12. <td width="158">商品名称td>
    13. <td width="154">商品数量td>
    14. <td width="177">删除td>
    15. tr>
    16. {volist name="list" id="a"}
    17. <tr>
    18. <td width="96">{$a['pid']}td>
    19. <td width="158">{$a['name']}td>
    20. <td width="154">{$a['num']}td>
    21. <td width="177"><a href="delete?pid={$a['pid']}">移除该商品a>  <a href="reduce?pid={$a['pid']}">减1a> <a href="buy?pid={$a['pid']}&pname={$a['name']}">加1a>td> 
    22. tr>
    23. {/volist}
    24. table>
    25. body>
    26. html>

     从购物车移除该商品

    1. //从购物车移除该商品
    2. public function delete()
    3. {
    4. $param = request()->param();
    5. $pid = $param['pid'];
    6. $arr = session('mycar');;//拿出session里的二维数组
    7. foreach($arr as $key=>$proId)//遍历该二维数组中的键值,这里也就是商品的id
    8. {
    9. if($key==$pid)//判断键值等于传过来的商品id
    10. {
    11. unset($arr[$key]);//清除该一维数组
    12. }
    13. }
    14. session('mycar',$arr);
    15. return redirect('/car');
    16. }

    购物车商品数量减1

    1. //购物车商品数量减1
    2. public function reduce()
    3. {
    4. $param = request()->param();
    5. $pid = $param['pid'];
    6. // echo '
      ';
    7. // echo $pid;
    8. $arr = session('mycar');//拿出session里的二维数组
    9. foreach($arr as $key=>$proId)//遍历该二维数组中的键值,这里也就是商品的id
    10. {
    11. if($key==$pid)//判断键值等于传过来的商品id
    12. {
    13. $uu = $arr[$key];
    14. $uu['num'] = $uu['num'] - 1;
    15. //减1后等于0,移除该商品
    16. if($uu['num'] == 0 || $uu['num'] < 0){
    17. unset($arr[$key]);//清除该一维数组
    18. }else{
    19. $arr[$key] = $uu;
    20. }
    21. }
    22. }
    23. // print_r($arr);die;
    24. session('mycar',$arr);
    25. return redirect('/car');
    26. }

    相关路由:

    1. //加入购物车
    2. Route::get('buy', 'index/index/buy','GET');
    3. //购物车列表
    4. Route::rule('car', 'index/index/car');
    5. //从购物车移除
    6. Route::get('delete', 'index/index/delete');
    7. //从购物车减去该商品数量1个
    8. Route::get('reduce', 'index/index/reduce');

    以上就是在thinkphp5中实现购物车功能的全部代码,逻辑大部分写在注释里面

  • 相关阅读:
    多点DMALL × Apache Kyuubi:构建统一SQL Proxy探索实践
    Windows10安装blender教程
    使用ElementUI结合Mock完成主页的搭建
    SAP 操作:怎么设定屏幕前台字段显示/编辑
    JSP中include指令的功能简介说明
    腐烂橘子图问题
    java基础 API Calendar类
    DDD架构中的领域是什么?
    Error: error:0308010C:digital envelope routines::unsupported
    (codeforce547)C-Mike and Foam(质因子+容斥原理)
  • 原文地址:https://blog.csdn.net/W07028057/article/details/126345421