From a657aa76c09c6189bdd3c2d6248afce9daa77287 Mon Sep 17 00:00:00 2001 From: xucong <850806214@qq.com> Date: Thu, 15 May 2025 14:48:06 +0800 Subject: [PATCH] =?UTF-8?q?1.=E6=8F=90=E4=BA=A4=E7=BC=BA=E5=A4=B1=E7=9A=84?= =?UTF-8?q?=E4=B8=9C=E8=A5=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/controller/CartController.php | 98 +++++++++++++ app/api/logic/CartLogic.php | 198 ++++++++++++++++++++++++++ 2 files changed, 296 insertions(+) create mode 100644 app/api/controller/CartController.php create mode 100644 app/api/logic/CartLogic.php diff --git a/app/api/controller/CartController.php b/app/api/controller/CartController.php new file mode 100644 index 0000000..fdc2ebf --- /dev/null +++ b/app/api/controller/CartController.php @@ -0,0 +1,98 @@ +success('', CartLogic::lists($this->userId)); + } + + + public function add() + { + $post = $this->request->post(); + $check = $this->validate($post, 'app\api\validate\Cart.add'); + if (true !== $check) { + $this->fail($check); + } + $res = CartLogic::add($post['item_id'], $post['goods_num'], $this->userId); + if ($res === true) { + $this->success('加入成功'); + } + $this->fail($res); + } + + + public function change() + { + $post = $this->request->post(); + $check = $this->validate($post, 'app\api\validate\Cart.change'); + if ($check !== true) { + $this->_error($check); + } + $res = CartLogic::change($post['cart_id'], $post['goods_num']); + if ($res === true) { + $this->_success(); + } + $this->_error($res); + } + + + public function del() + { + $post = $this->request->post(); + $check = $this->validate($post, 'app\api\validate\Cart.del'); + if (true !== $check) { + $this->_error($check); + } + if (CartLogic::del($post['cart_id'], $this->user_id)) { + $this->_success('删除成功'); + } + $this->_error('删除失败'); + } + + + public function selected() + { + $post = $this->request->post(); + $check = $this->validate($post, 'app\api\validate\Cart.selected'); + if (true !== $check) { + $this->_error($check); + } + CartLogic::selected($post, $this->user_id); + $this->_success(); + } + + + public function num() + { + $this->_success('',CartLogic::cartNum($this->user_id)); + } +} \ No newline at end of file diff --git a/app/api/logic/CartLogic.php b/app/api/logic/CartLogic.php new file mode 100644 index 0000000..f418699 --- /dev/null +++ b/app/api/logic/CartLogic.php @@ -0,0 +1,198 @@ +field('i.goods_id') + ->join('goods_item i', 'i.goods_id = g.id') + ->where('i.id', $item_id) + ->find(); + + $time = time(); + $where = [ + 'user_id' => $user_id, + 'item_id' => $item_id, + ]; + $info = Cart::where($where)->find(); + + $cart_num = $goods_num + (isset($info) ? $info['goods_num'] : 0); + + if (self::checkStock($item_id, $cart_num)) { + return '很抱歉,商品库存不足'; + } + + if ($info) { + //购物车内已有该商品 + $update_data = [ + 'goods_num' => $goods_num + $info['goods_num'], + 'update_time' => $time, + ]; + $res = Db::name('cart') + ->where('id', $info['id']) + ->update($update_data); + } else { + //新增购物车记录 + $data = [ + 'user_id' => $user_id, + 'goods_id' => $goods['goods_id'], + 'goods_num' => $goods_num, + 'item_id' => $item_id, + 'create_time' => $time, + ]; + $res = Db::name('cart')->insert($data); + } + + if (!$res) { + return '添加失败'; + } + + // 钩子-记录足迹(添加购物车) + Hook::listen('footprint', [ + 'type' => Footprint::add_cart, + 'user_id' => $user_id, + 'foreign_id' => $goods['goods_id'] //商品ID + ]); + + return true; + } + + //删除购物车 + public static function del($cart_id, $user_id) + { + return Db::name('cart')->where(['id' => $cart_id, 'user_id' => $user_id])->delete(); + } + + //变动购物车数量 + public static function change($cart_id, $goods_num) + { + $cart = Db::name('cart')->where(['id' => $cart_id])->find(); + + if (self::checkStock($cart['item_id'], $goods_num)) { + return '很抱歉,库存不足'; + } + + if ($goods_num <= 0) { + $goods_num = 1; + } + + $update = [ + 'update_time' => time(), + 'goods_num' => $goods_num, + ]; + + Db::name('cart')->where(['id' => $cart_id])->update($update); + + return true; + } + + //购物车选中状态 + public static function selected($post, $user_id) + { + return Db::name('cart') + ->where(['id' => $post['cart_id'], 'user_id' => $user_id]) + ->update(['selected' => $post['selected'], 'update_time' => time()]); + } + + //检查库存 + public static function checkStock($item_id, $goods_num) + { + $item_info = Db::name('goods_item') + ->where('id', $item_id)->find(); + + if ($goods_num > $item_info['stock']) { + return true; + } + return false; + } + + //列表 + public static function lists($user_id) + { + $field = 'g.name,g.image,g.id as goods_id,g.status as g_status,g.del as g_del, + i.spec_value_str,i.price,i.image as item_image,c.goods_num,c.selected,c.id as cart_id,c.item_id,i.stock as item_stock'; + + $carts = Db::name('cart c') + ->field($field) + ->join('goods g', 'g.id = c.goods_id') + ->join('goods_item i', 'i.id = c.item_id') + ->where('c.user_id', $user_id) + ->order('c.create_time desc') + ->select(); + + $goods_num = 0; + $total = 0; + $lists = []; + + foreach ($carts as $k1 => $cart) { + + $cart_img = empty($cart['item_image']) ? $cart['image'] : $cart['item_image']; + $cart['img'] = UrlServer::getFileUrl($cart_img); + + $cart['cart_status'] = 0; + if ($cart['g_status'] == 0) { + $cart['cart_status'] = 1; + } + + if ($cart['g_del'] == 1) { + $cart['cart_status'] = 2; + } + + $cart['sub_price'] = 0; + if ($cart['selected'] == Cart::IS_SELECTED && $cart['cart_status'] == 0) { + $goods_num += $cart['goods_num']; + $total += $cart['price'] * $cart['goods_num']; + $cart['sub_price'] = round($cart['price'] * $cart['goods_num'], 2); + } + + $cart['selected'] = intval($cart['selected']); + unset($cart['image'], $cart['item_image']); + $lists[] = $cart; + } + + return [ + 'lists' => $lists, + 'total_amount' => round($total, 2), + 'total_num' => $goods_num, + ]; + } + + //获取购物车数量 + public static function cartNum($user_id) + { + $num = Db::name('cart')->alias('c') + ->join('goods g', 'g.id = c.goods_id') + ->join('goods_item i', 'i.id = c.item_id') + ->where('c.user_id', $user_id) + ->sum('goods_num'); + return ['num' => $num ?? 0]; + } + +} \ No newline at end of file