Browse Source

添加购物车

Cherry 2 years ago
parent
commit
7b5417307b

+ 32 - 0
application/api/controller/Base.php

@@ -0,0 +1,32 @@
+<?php
+
+namespace app\api\controller;
+
+use app\common\controller\Api;
+use think\Lang;
+
+class Base extends Api
+{
+    public function _initialize()
+    {
+
+        parent::_initialize();
+//        $controllername = strtolower($this->request->controller());
+//        $this->loadlang($controllername);
+
+    }
+
+//    protected function loadlang($name)
+//    {
+//        Lang::load(ADDON_PATH  . 'shopro/lang/' . $this->request->langset() . '/' . str_replace('.', '/', $name) . '.php');
+//    }
+
+    // 表单验证
+    protected function shoproValidate($params, $class, $scene, $rules = []) {
+        $validate = validate(str_replace('controller', 'validate', $class));
+
+        if (!$validate->check($params, $rules, $scene)) {
+            $this->error($validate->getError());
+        }
+    }
+}

+ 63 - 0
application/api/controller/shop/Cart.php

@@ -0,0 +1,63 @@
+<?php
+
+namespace app\api\controller\shop;
+
+use app\api\controller\Base;
+use app\api\model\Cart as CartModel;
+use app\common\controller\Api;
+
+/**
+ * 商城购物车
+ * @package app\api\controller\shop
+ */
+class Cart extends Base
+{
+
+    protected $noNeedLogin = [];
+    protected $noNeedRight = ['*'];
+
+    /**
+     * 购物车列表
+     * @ApiMethod (Get)
+     * @ApiParams (name=per_page,type="int", required=false, description="每页数量")
+     * @ApiParams (name=page,type="int", required=false, description="页数")
+     */
+    public function index()
+    {
+        $data = CartModel::info();
+        $this->success('我的购物车', $data);
+    }
+
+    /**
+     * 购物车添加
+     * @ApiMethod (POST)
+     * @ApiParams (name="goods_list", type="array", sample="[{'goods_id':'int','goods_num':'int','sku_price_id':'int'},{'goods_id':'48','goods_num':'1','sku_price_id':'135'}]", description="商品数据")
+     */
+    public function add()
+    {
+        $params = $this->request->post();
+
+        // 表单验证
+        $this->shoproValidate($params, get_class(), 'add');
+
+        $goodsList = $params['goods_list'];
+        $this->success('已添加', CartModel::add($goodsList));
+    }
+
+    /**
+     * 购物车修改/删除
+     * @ApiMethod (POST)
+     * @ApiParams (name="act", type="int", required=false, description="方法:change=修改,delete=删除")
+     * @ApiParams (name="cart_list", type="array", sample="[{'id':148,'goods_num':10}]", description="购物车商品数据,删除时:只传id也可")
+     */
+    public function edit()
+    {
+        $params = $this->request->post();
+
+        // 表单验证
+        $this->shoproValidate($params, get_class(), 'edit');
+
+        $this->success('', CartModel::edit($params));
+    }
+
+}

+ 147 - 0
application/api/model/Cart.php

@@ -0,0 +1,147 @@
+<?php
+
+namespace app\api\model;
+
+use think\Model;
+
+/**
+ * 购物车模型
+ */
+class Cart extends Model
+{
+
+    // 表名,不含前缀
+    protected $name = 'shopro_cart';
+    // 自动写入时间戳字段
+    protected $autoWriteTimestamp = 'int';
+    // 定义时间戳字段名
+    protected $createTime = 'createtime';
+    protected $updateTime = 'updatetime';
+    protected $deleteTime = 'deletetime';
+
+    protected $hidden = ['createtime', 'updatetime', 'deletetime'];
+    //列表动态隐藏字段
+//    protected static $listHidden = ['content', 'params', 'images', 'service_ids'];
+
+    // 追加属性
+    protected $append = [
+    ];
+
+    public static function info()
+    {
+        $user = User::info();
+        // 被物理删除的商品直接删掉购物车,只删除自己的
+        $cartData = self::whereNotExists(function ($query) {
+            $goodsTableName = (new Goods())->getQuery()->getTable();
+            $tableName = (new self())->getQuery()->getTable();
+            $query = $query->table($goodsTableName)->where($goodsTableName . '.id=' . $tableName . '.goods_id');
+
+            return $query;
+        })->where([
+            'user_id' => $user->id
+        ])->delete();
+
+        $cartData = self::with(['goods' => function ($query) {
+            $query->removeOption('soft_delete');
+        }, 'sku_price' => function ($query) {
+                $query->removeOption('soft_delete');
+            }
+        ])->where([
+            'user_id' => $user->id
+        ]);
+
+        // 关联是否是活动--del 1.4
+//        $cartTableName = (new self)->getQuery()->getTable();
+//        // 这里只查秒杀拼团的, 并且不限制活动是否开始或者结束
+//        $actSubSql = Activity::field('type as activity_type, id as activity_id, goods_ids')->where('type', 'in', ['groupon', 'seckill'])->buildSql();
+//        $cartData = $cartData->join([$actSubSql => 'act'], "find_in_set(" . $cartTableName . ".goods_id, goods_ids)", 'left')->group('id');
+
+        // 关闭 sql mode 的 ONLY_FULL_GROUP_BY
+        //$oldModes = closeStrict(['ONLY_FULL_GROUP_BY']);
+
+        $cartData = $cartData->select();
+
+        // 恢复 sql mode
+        //recoverStrict($oldModes);
+
+        foreach ($cartData as $key => &$cart) {
+            $cart['cart_type'] = null;
+
+//            if ($cart['activity_type'] != null) {
+//                $cart['cart_type'] = 'activity';
+//            }
+
+            if (!is_null($cart['goods']['deletetime']) || $cart['goods']['status'] === 'down' || empty($cart['sku_price']) || !is_null($cart['sku_price']['deletetime'])) {
+                $cart['cart_type'] = 'invalid';
+            }
+        }
+
+        return $cartData;
+    }
+
+    public static function add($goodsList)
+    {
+
+        $user = User::info();
+
+        foreach ($goodsList as $v) {
+            $where = [
+                'user_id' => $user->id,
+                'goods_id' => $v['goods_id'],
+                'sku_price_id' => $v['sku_price_id'],
+                'deletetime' => null
+            ];
+            $cart = self::get($where);
+            if ($cart) {
+                $cart->goods_num += $v['goods_num'];
+                $cart->save();
+            }else{
+                $cartData = [
+                    'user_id' => $user->id,
+                    'goods_id' => $v['goods_id'],
+                    'goods_num' => $v['goods_num'],
+                    'sku_price_id' => $v['sku_price_id']
+                ];
+                $cart = self::create($cartData);
+            }
+
+        }
+
+        return $cart;
+    }
+
+    public static function edit($params)
+    {
+        extract($params);
+        $user = User::info();
+        $where['user_id'] = $user->id;
+        switch ($act) {
+            case 'delete':
+                foreach ($cart_list as $v) {
+                    $where['id'] = $v['id'];
+                    self::where($where)->delete();
+                }
+                break;
+            case 'change':
+                foreach ($cart_list as $v) {
+                    $where['id'] = $v['id'];
+                    self::where($where)->update(['goods_num' => $v['goods_num']]);
+                }
+                break;
+        }
+
+        return true;
+    }
+
+    public function goods()
+    {
+        return $this->hasOne(Goods::class, 'id', 'goods_id');
+    }
+
+    public function skuPrice()
+    {
+        return $this->hasOne(GoodsSkuPrice::class, 'id', 'sku_price_id');
+    }
+
+
+}

+ 0 - 0
application/common/validate/Common.php


+ 45 - 0
application/common/validate/shop/Cart.php

@@ -0,0 +1,45 @@
+<?php
+
+namespace app\common\validate\shop;
+
+use think\Validate;
+
+class Cart extends Validate
+{
+
+    /**
+     * 验证规则
+     */
+    protected $rule = [
+        'goods_list' => 'require|array',
+        'cart_list' => 'require|array',
+        'act' => 'require'
+    ];
+
+    /**
+     * 提示消息
+     */
+    protected $message = [
+        'goods_list.require' => '请选择商品',
+        'goods_list.array' => '请选择商品',
+        'cart_list.require' => '请选择购物车商品',
+        'cart_list.array' => '请选择购物车商品',
+        'act.require' => '参数错误',
+    ];
+
+    /**
+     * 字段描述
+     */
+    protected $field = [
+        
+    ];
+
+    /**
+     * 验证场景
+     */
+    protected $scene = [
+        'add' => ['goods_list'],
+        'edit' => ['cart_list', 'act'],
+    ];
+
+}