WIN-2308041133\Administrator há 21 horas atrás
pai
commit
58c0a7ca45

+ 182 - 0
app/api/controller/Address.php

@@ -0,0 +1,182 @@
+<?php
+declare (strict_types=1);
+
+namespace app\api\controller;
+
+use app\BaseController;
+use app\model\api\UserAddress;
+use app\Request;
+use library\services\UtilService;
+use think\facade\Db;
+
+class Address extends BaseController
+{
+    /**
+     * 获取地址列表
+     * @param Request $request
+     */
+    public function list(Request $request)
+    {
+        $list = (new UserAddress())->getAddressList($request->user['uid']);
+        return app('json')->success($list);
+    }
+
+    /**
+     * 获取地址详情
+     * @param Request $request
+     */
+    public function detail(Request $request)
+    {
+        $post = UtilService::getMore([
+            ['id', '', 'empty', '参数错误'],
+        ], $request);
+
+        $address = Db::name('user_address')
+            ->where('id', $post['id'])
+            ->where('uid', $request->user['uid'])
+            ->find();
+
+        if (!$address) {
+            return app('json')->fail('地址不存在');
+        }
+
+        return app('json')->success($address);
+    }
+
+    /**
+     * 添加地址
+     * @param Request $request
+     */
+    public function add(Request $request)
+    {
+        $post = UtilService::getMore([
+            ['real_name', '', 'empty', '请输入收货人姓名'],
+            ['phone', '', 'empty', '请输入联系电话'],
+            ['province', '', 'empty', '请选择省份'],
+            ['city', '', 'empty', '请选择城市'],
+            ['district', '', 'empty', '请选择区县'],
+            ['detail', '', 'empty', '请输入详细地址'],
+            ['is_default', 0],
+        ], $request);
+
+        // 验证手机号
+        if (!preg_match('/^1[3-9]\d{9}$/', $post['phone'])) {
+            return app('json')->fail('手机号格式不正确');
+        }
+
+        $data = [
+            'uid' => $request->user['uid'],
+            'real_name' => $post['real_name'],
+            'phone' => $post['phone'],
+            'province' => $post['province'],
+            'city' => $post['city'],
+            'district' => $post['district'],
+            'detail' => $post['detail'],
+            'is_default' => $post['is_default'] == 1 ? 1 : 0,
+            'time' => time(),
+        ];
+
+        // 如果设置为默认地址,先取消其他默认地址
+        if ($data['is_default'] == 1) {
+            Db::name('user_address')->where('uid', $request->user['uid'])->update(['is_default' => 0]);
+        }
+
+        $id = Db::name('user_address')->insertGetId($data);
+
+        if ($id) {
+            return app('json')->success('添加成功');
+        } else {
+            return app('json')->fail('添加失败');
+        }
+    }
+
+    /**
+     * 编辑地址
+     * @param Request $request
+     */
+    public function edit(Request $request)
+    {
+        $post = UtilService::getMore([
+            ['id', '', 'empty', '参数错误'],
+            ['real_name', '', 'empty', '请输入收货人姓名'],
+            ['phone', '', 'empty', '请输入联系电话'],
+            ['province', '', 'empty', '请选择省份'],
+            ['city', '', 'empty', '请选择城市'],
+            ['district', '', 'empty', '请选择区县'],
+            ['detail', '', 'empty', '请输入详细地址'],
+            ['is_default', 0],
+        ], $request);
+
+        // 验证手机号
+        if (!preg_match('/^1[3-9]\d{9}$/', $post['phone'])) {
+            return app('json')->fail('手机号格式不正确');
+        }
+
+        $data = [
+            'real_name' => $post['real_name'],
+            'phone' => $post['phone'],
+            'province' => $post['province'],
+            'city' => $post['city'],
+            'district' => $post['district'],
+            'detail' => $post['detail'],
+            'is_default' => $post['is_default'] == 1 ? 1 : 0,
+        ];
+
+        // 如果设置为默认地址,先取消其他默认地址
+        if ($data['is_default'] == 1) {
+            Db::name('user_address')->where('uid', $request->user['uid'])->update(['is_default' => 0]);
+        }
+
+        $result = Db::name('user_address')
+            ->where('id', $post['id'])
+            ->where('uid', $request->user['uid'])
+            ->update($data);
+
+        if ($result) {
+            return app('json')->success('修改成功');
+        } else {
+            return app('json')->fail('修改失败');
+        }
+    }
+
+    /**
+     * 删除地址
+     * @param Request $request
+     */
+    public function delete(Request $request)
+    {
+        $post = UtilService::getMore([
+            ['id', '', 'empty', '参数错误'],
+        ], $request);
+
+        $result = Db::name('user_address')
+            ->where('id', $post['id'])
+            ->where('uid', $request->user['uid'])
+            ->delete();
+
+        if ($result) {
+            return app('json')->success('删除成功');
+        } else {
+            return app('json')->fail('删除失败');
+        }
+    }
+
+    /**
+     * 设置默认地址
+     * @param Request $request
+     */
+    public function setDefault(Request $request)
+    {
+        $post = UtilService::getMore([
+            ['id', '', 'empty', '参数错误'],
+        ], $request);
+
+        $result = (new UserAddress())->setDefault($post['id'], $request->user['uid']);
+
+        if ($result) {
+            return app('json')->success('设置成功');
+        } else {
+            return app('json')->fail('设置失败');
+        }
+    }
+}

+ 125 - 0
app/api/controller/Cart.php

@@ -0,0 +1,125 @@
+<?php
+declare (strict_types=1);
+
+namespace app\api\controller;
+
+use app\BaseController;
+use app\model\api\StoreCart;
+use app\model\api\StoreProductAttrValue;
+use app\Request;
+use library\services\UtilService;
+use think\facade\Db;
+
+class Cart extends BaseController
+{
+    /**
+     * 获取购物车列表
+     * @param Request $request
+     */
+    public function list(Request $request)
+    {
+        $list = (new StoreCart())->getCartList($request->user['uid']);
+        return app('json')->success($list);
+    }
+
+    /**
+     * 添加购物车
+     * @param Request $request
+     */
+    public function add(Request $request)
+    {
+        $post = UtilService::getMore([
+            ['product_id', '', 'empty', '参数错误'],
+            ['cart_num', 1],
+            ['product_attr_unique', ''],
+        ], $request);
+
+        // 获取商品信息
+        $product = Db::name('store_product')->where('id', $post['product_id'])->find();
+        if (!$product) {
+            return app('json')->fail('商品不存在');
+        }
+
+        // 获取SKU信息
+        $skuInfo = null;
+        if (!empty($post['product_attr_unique'])) {
+            $skuInfo = (new StoreProductAttrValue())->getSkuBySuk($post['product_id'], $post['product_attr_unique']);
+            if (!$skuInfo) {
+                return app('json')->fail('商品规格不存在');
+            }
+        }
+
+        $data = [
+            'uid' => $request->user['uid'],
+            'product_id' => $post['product_id'],
+            'cart_num' => $post['cart_num'],
+            'product_attr_unique' => $post['product_attr_unique'],
+            'time' => time(),
+        ];
+
+        $result = (new StoreCart())->addToCart($data);
+
+        if ($result) {
+            return app('json')->success('添加成功');
+        } else {
+            return app('json')->fail('添加失败');
+        }
+    }
+
+    /**
+     * 修改购物车数量
+     * @param Request $request
+     */
+    public function updateNum(Request $request)
+    {
+        $post = UtilService::getMore([
+            ['id', '', 'empty', '参数错误'],
+            ['cart_num', 1],
+        ], $request);
+
+        if ($post['cart_num'] <= 0) {
+            return app('json')->fail('数量必须大于0');
+        }
+
+        $result = (new StoreCart())->updateCartNum($post['id'], $post['cart_num'], $request->user['uid']);
+
+        if ($result) {
+            return app('json')->success('修改成功');
+        } else {
+            return app('json')->fail('修改失败');
+        }
+    }
+
+    /**
+     * 删除购物车
+     * @param Request $request
+     */
+    public function delete(Request $request)
+    {
+        $post = UtilService::getMore([
+            ['ids', '', 'empty', '参数错误'],
+        ], $request);
+
+        $ids = explode(',', $post['ids']);
+        $result = (new StoreCart())->deleteCart($ids, $request->user['uid']);
+
+        if ($result) {
+            return app('json')->success('删除成功');
+        } else {
+            return app('json')->fail('删除失败');
+        }
+    }
+
+    /**
+     * 获取购物车数量
+     * @param Request $request
+     */
+    public function count(Request $request)
+    {
+        $count = Db::name('store_cart')
+            ->where('uid', $request->user['uid'])
+            ->count();
+
+        return app('json')->success(['count' => $count]);
+    }
+}

+ 222 - 0
app/api/controller/Order.php

@@ -0,0 +1,222 @@
+<?php
+declare (strict_types=1);
+
+namespace app\api\controller;
+
+use app\BaseController;
+use app\model\api\Order as OrderModel;
+use app\model\api\PayTrade;
+use app\model\api\User as UserModel;
+use app\model\api\UserScoreDetail;
+use app\Request;
+use library\services\UtilService;
+use think\db\exception\DbException;
+use think\facade\Db;
+
+class Order extends BaseController
+{
+    /**
+     * 订单列表
+     * @param Request $request
+     */
+    public function list(Request $request)
+    {
+        $pageSize = 20;
+        $post = UtilService::getMore([
+            ['page', 1],
+            ['status', ''],
+        ], $request);
+
+        $where = [
+            ['uid', '=', $request->user['uid']]
+        ];
+
+        if ($post['status'] !== '' && in_array((string)$post['status'], ["0", "1", "2", "3", "-1"])) {
+            $where[] = ['status', '=', (int)$post['status']];
+        }
+
+        $order = new OrderModel;
+        $data = $order
+            ->where($where)
+            ->page((int)$post["page"], $pageSize)
+            ->order("id", "desc")
+            ->select()
+            ->toArray();
+
+        $pageCount = $order->where($where)->count();
+
+        return app('json')->success([
+            'list' => $data,
+            'pageCount' => $pageCount,
+            'pageSize' => $pageSize,
+            'page' => $post['page'],
+        ]);
+    }
+
+    /**
+     * 订单详情
+     * @param Request $request
+     */
+    public function info(Request $request)
+    {
+        $post = UtilService::getMore([
+            ['order_id', '', 'empty', '参数错误'],
+        ], $request);
+
+        $orderData = (new OrderModel)
+            ->where("order_id", $post['order_id'])
+            ->where("uid", $request->user['uid'])
+            ->find();
+
+        if (empty($orderData)) {
+            return app('json')->fail('订单不存在');
+        }
+
+        return app('json')->success($orderData);
+    }
+
+    /**
+     * 取消订单
+     * @param Request $request
+     */
+    public function cancel(Request $request)
+    {
+        $post = UtilService::getMore([
+            ['order_id', '', 'empty', '参数错误'],
+        ], $request);
+
+        $orderData = (new OrderModel)
+            ->where("order_id", $post['order_id'])
+            ->where("uid", $request->user['uid'])
+            ->where("status", 0)
+            ->find();
+
+        if (empty($orderData)) {
+            return app('json')->fail('订单不存在或已取消');
+        }
+
+        (new OrderModel)->where("id", $orderData['id'])->update(['status' => -1]);
+
+        return app('json')->success('订单已取消');
+    }
+
+    /**
+     * 确认收货
+     * @param Request $request
+     */
+    public function confirm(Request $request)
+    {
+        $post = UtilService::getMore([
+            ['order_id', '', 'empty', '参数错误'],
+        ], $request);
+
+        $orderData = (new OrderModel)
+            ->where("order_id", $post['order_id'])
+            ->where("uid", $request->user['uid'])
+            ->where("status", 2)
+            ->find();
+
+        if (empty($orderData)) {
+            return app('json')->fail('订单不存在或状态错误');
+        }
+
+        (new OrderModel)->where("id", $orderData['id'])->update([
+            'status' => 3,
+            'ok_time' => time()
+        ]);
+
+        return app('json')->success('确认收货成功');
+    }
+
+    /**
+     * 积分支付
+     * @param Request $request
+     */
+    public function scorePay(Request $request)
+    {
+        $post = UtilService::getMore([
+            ['order_id', '', 'empty', '参数错误'],
+        ], $request);
+
+        // 查询订单
+        $orderData = (new OrderModel)
+            ->where("order_id", $post['order_id'])
+            ->where("uid", $request->user['uid'])
+            ->find();
+
+        if (empty($orderData)) {
+            return app('json')->fail('订单不存在');
+        }
+
+        if ($orderData['status'] != 0) {
+            return app('json')->fail('订单状态错误');
+        }
+
+        // 查询支付流水
+        $payTradeData = (new PayTrade)
+            ->where("o_id", $orderData['id'])
+            ->where("code", "shop_order")
+            ->find();
+
+        if (empty($payTradeData)) {
+            return app('json')->fail('支付流水不存在');
+        }
+
+        if ($payTradeData['status'] == 1) {
+            return app('json')->fail('订单已支付');
+        }
+
+        // 检查用户积分
+        $userData = (new UserModel)->where("uid", $request->user['uid'])->find();
+        if (empty($userData)) {
+            return app('json')->fail('用户不存在');
+        }
+
+        if ($userData['score'] < $orderData['pay_money']) {
+            return app('json')->fail('积分不足');
+        }
+
+        // 开启事务
+        PayTrade::beginTrans();
+        try {
+            // 扣除积分
+            $scoreResult = (new UserScoreDetail)->payScore(
+                $request->user['uid'],
+                floatval($orderData['pay_money']),
+                'outcome_score',
+                '订单支付:'.$orderData['order_id'],
+                ['o_id' => $orderData['id']]
+            );
+
+            if (!$scoreResult) {
+                PayTrade::rollbackTrans();
+                return app('json')->fail('积分扣除失败');
+            }
+
+            // 更新支付流水
+            $pay_json = json_encode([
+                'pay_type' => 'score',
+                'score' => $orderData['pay_money'],
+                'pay_time' => time()
+            ]);
+
+            (new PayTrade)->where('id', $payTradeData['id'])->update([
+                'status' => 1,
+                'pay_time' => time(),
+                'pay_json' => $pay_json
+            ]);
+
+            // 更新订单状态
+            (new OrderModel)->where("id", $orderData['id'])->update([
+                'status' => 1,
+                'pay_time' => time()
+            ]);
+
+            PayTrade::commitTrans();
+            return app('json')->success('积分支付成功');
+        } catch (DbException $e) {
+            PayTrade::rollbackTrans();
+            return app('json')->fail('支付失败');
+        }
+    }
+}

+ 191 - 0
app/api/controller/Product.php

@@ -0,0 +1,191 @@
+<?php
+declare (strict_types=1);
+
+namespace app\api\controller;
+
+use app\BaseController;
+use app\model\api\StoreCategory;
+use app\model\api\StoreBrand;
+use app\model\api\StoreProduct;
+use app\model\api\StoreProductAttrValue;
+use app\model\api\StoreProductReply;
+use app\Request;
+use library\services\UtilService;
+use think\facade\Db;
+
+class Product extends BaseController
+{
+    /**
+     * 获取分类列表
+     * @param Request $request
+     */
+    public function categoryList(Request $request)
+    {
+        $post = UtilService::getMore([
+            ['page', 1],
+            ['pageSize', 20],
+            ['pid', 0],
+        ], $request);
+
+        $where = [];
+        if ($post['pid'] > 0) {
+            $where[] = ['pid', '=', $post['pid']];
+        }
+
+        $result = (new StoreCategory())->getList($where, $post['page'], $post['pageSize']);
+
+        return app('json')->success($result);
+    }
+
+    /**
+     * 获取分类树
+     */
+    public function categoryTree()
+    {
+        $tree = (new StoreCategory())->getTree();
+        return app('json')->success($tree);
+    }
+
+    /**
+     * 获取品牌列表
+     * @param Request $request
+     */
+    public function brandList(Request $request)
+    {
+        $post = UtilService::getMore([
+            ['page', 1],
+            ['pageSize', 20],
+        ], $request);
+
+        $result = (new StoreBrand())->getList([], $post['page'], $post['pageSize']);
+
+        return app('json')->success($result);
+    }
+
+    /**
+     * 获取商品列表
+     * @param Request $request
+     */
+    public function productList(Request $request)
+    {
+        $post = UtilService::getMore([
+            ['page', 1],
+            ['pageSize', 20],
+            ['category_id', ''],
+            ['brand_id', ''],
+            ['keyword', ''],
+            ['sort', ''],
+            ['order', ''],
+        ], $request);
+
+        $where = [
+            ['is_show', '=', 1]
+        ];
+
+        if (!empty($post['category_id'])) {
+            $where[] = ['category_id', '=', $post['category_id']];
+        }
+
+        if (!empty($post['brand_id'])) {
+            $where[] = ['brand_id', '=', $post['brand_id']];
+        }
+
+        if (!empty($post['keyword'])) {
+            $where[] = ['title', 'like', '%' . $post['keyword'] . '%'];
+        }
+
+        $orderField = $post['sort'] ?: 'id';
+        $orderType = $post['order'] ?: 'desc';
+
+        $query = (new StoreProduct())->where($where);
+        $totalCount = $query->count();
+        $list = $query
+            ->order($orderField, $orderType)
+            ->page($post['page'], $post['pageSize'])
+            ->select()
+            ->toArray();
+
+        return app('json')->success([
+            'list' => $list,
+            'totalCount' => $totalCount,
+            'pageSize' => $post['pageSize'],
+            'page' => $post['page'],
+        ]);
+    }
+
+    /**
+     * 获取商品详情
+     * @param Request $request
+     */
+    public function productDetail(Request $request)
+    {
+        $post = UtilService::getMore([
+            ['id', '', 'empty', '参数错误'],
+        ], $request);
+
+        $detail = (new StoreProduct())->getDetail($post['id']);
+
+        if (!$detail) {
+            return app('json')->fail('商品不存在');
+        }
+
+        return app('json')->success($detail);
+    }
+
+    /**
+     * 获取商品评价列表
+     * @param Request $request
+     */
+    public function replyList(Request $request)
+    {
+        $post = UtilService::getMore([
+            ['page', 1],
+            ['pageSize', 20],
+            ['product_id', ''],
+        ], $request);
+
+        $where = [];
+        if (!empty($post['product_id'])) {
+            $where[] = ['product_id', '=', $post['product_id']];
+        }
+
+        $result = (new StoreProductReply())->getList($where, $post['page'], $post['pageSize']);
+
+        return app('json')->success($result);
+    }
+
+    /**
+     * 添加商品评价
+     * @param Request $request
+     */
+    public function addReply(Request $request)
+    {
+        $post = UtilService::getMore([
+            ['product_id', '', 'empty', '参数错误'],
+            ['order_id', '', 'empty', '参数错误'],
+            ['score', 5],
+            ['comment', ''],
+            ['pics', ''],
+        ], $request);
+
+        $data = [
+            'uid' => $request->user['uid'],
+            'product_id' => $post['product_id'],
+            'order_id' => $post['order_id'],
+            'score' => $post['score'],
+            'comment' => $post['comment'],
+            'pics' => $post['pics'],
+            'time' => time(),
+        ];
+
+        $id = Db::name('store_product_reply')->insertGetId($data);
+
+        if ($id) {
+            // 更新商品评价数
+            Db::name('store_product')->where('id', $post['product_id'])->inc('reply_count', 1)->update();
+            return app('json')->success('评价成功');
+        } else {
+            return app('json')->fail('评价失败');
+        }
+    }
+}

+ 1 - 1
app/api/controller/Pub.php

@@ -73,7 +73,7 @@ class Pub extends BaseController
     {
         $data = [
             ["code" => "wxpay", "title" => "微信支付", "img" => env('appinfo.app_api_domain', '') . "/resource/icon/" . "wxicon.png"],
-            ["code" => "balance", "title" => "余额支付", "img" => env('appinfo.app_api_domain', '') . "/resource/icon/" . "balance.png"],
+            ["code" => "score", "title" => "积分支付", "img" => env('appinfo.app_api_domain', '') . "/resource/icon/" . "score.png"],
         ];
         return app('json')->success($data);
     }

+ 274 - 0
app/api/controller/Shop.php

@@ -0,0 +1,274 @@
+<?php
+declare (strict_types=1);
+
+namespace app\api\controller;
+
+use app\BaseController;
+use app\model\api\StoreOrder;
+use app\model\api\StoreOrderCartInfo;
+use app\model\api\StoreCart;
+use app\model\api\PayTrade;
+use app\model\api\UserAddress;
+use app\model\api\StoreProductAttrValue;
+use app\Request;
+use library\services\UtilService;
+use think\facade\Db;
+use think\db\exception\DbException;
+
+class Shop extends BaseController
+{
+    /**
+     * 创建订单
+     * @param Request $request
+     */
+    public function createOrder(Request $request)
+    {
+        $post = UtilService::getMore([
+            ['cart_ids', '', 'empty', '参数错误'],
+            ['address_id', 0],
+        ], $request);
+
+        // 获取购物车商品
+        $cartIds = explode(',', $post['cart_ids']);
+        $cartList = Db::name('store_cart')
+            ->whereIn('id', $cartIds)
+            ->where('uid', $request->user['uid'])
+            ->select()
+            ->toArray();
+
+        if (empty($cartList)) {
+            return app('json')->fail('购物车商品不存在');
+        }
+
+        // 获取收货地址
+        $address = null;
+        if ($post['address_id'] > 0) {
+            $address = Db::name('user_address')->where('id', $post['address_id'])->find();
+        }
+
+        if (!$address) {
+            $address = (new UserAddress())->getDefaultAddress($request->user['uid']);
+        }
+
+        if (!$address) {
+            return app('json')->fail('请先添加收货地址');
+        }
+
+        // 计算订单金额
+        $totalMoney = 0;
+        $payMoney = 0;
+        $cartInfo = [];
+
+        foreach ($cartList as $cart) {
+            $product = Db::name('store_product')->where('id', $cart['product_id'])->find();
+            if (!$product) {
+                continue;
+            }
+
+            $price = $product['price'];
+            $skuPrice = null;
+
+            // 如果有SKU,获取SKU价格
+            if (!empty($cart['product_attr_unique'])) {
+                $sku = (new StoreProductAttrValue())->getSkuBySuk($cart['product_id'], $cart['product_attr_unique']);
+                if ($sku) {
+                    $price = $sku['price'];
+                }
+            }
+
+            $productMoney = $price * $cart['cart_num'];
+            $totalMoney += $productMoney;
+
+            $cartInfo[] = [
+                'product_id' => $cart['product_id'],
+                'cart_num' => $cart['cart_num'],
+                'product_attr_unique' => $cart['product_attr_unique'],
+                'title' => $product['title'],
+                'image' => $product['image'],
+                'price' => $price,
+                'total_price' => $productMoney,
+            ];
+        }
+
+        // 运费(暂时设置为0,后续可以根据运费模板计算)
+        $postage = 0;
+        $payMoney = $totalMoney + $postage;
+
+        // 生成订单号
+        $orderId = makeOrderId($request->user['uid'], 'SO');
+
+        // 开启事务
+        Db::startTrans();
+        try {
+            // 创建订单
+            $orderData = [
+                'order_id' => $orderId,
+                'uid' => $request->user['uid'],
+                'real_name' => $address['real_name'],
+                'phone' => $address['phone'],
+                'province' => $address['province'],
+                'city' => $address['city'],
+                'district' => $address['district'],
+                'detail' => $address['detail'],
+                'total_price' => $totalMoney,
+                'total_num' => count($cartInfo),
+                'total_postage' => $postage,
+                'pay_price' => $payMoney,
+                'pay_postage' => $postage,
+                'paid' => 0,
+                'status' => 0,
+                'time' => time(),
+            ];
+
+            $orderIdDb = Db::name('store_order')->insertGetId($orderData);
+
+            // 创建订单商品
+            foreach ($cartInfo as &$item) {
+                $item['oid'] = $orderIdDb;
+                $item['time'] = time();
+            }
+            Db::name('store_order_cart_info')->insertAll($cartInfo);
+
+            // 创建支付流水
+            $payTrade = new PayTrade();
+            $payNo = $payTrade->credentials(
+                'score',
+                $request->user['uid'],
+                'shop_order',
+                $payMoney,
+                '商城订单支付',
+                $orderId,
+                ['order_id' => $orderId],
+                0
+            );
+
+            // 更新支付流水的o_id
+            if ($payNo) {
+                Db::name('pay_trade')->where('pay_no', $payNo)->update(['o_id' => $orderIdDb]);
+            }
+
+            // 清除购物车
+            Db::name('store_cart')->whereIn('id', $cartIds)->delete();
+
+            Db::commit();
+
+            return app('json')->success([
+                'order_id' => $orderId,
+                'pay_money' => $payMoney,
+                'pay_no' => $payNo
+            ], '订单创建成功');
+
+        } catch (DbException $e) {
+            Db::rollback();
+            return app('json')->fail('订单创建失败');
+        }
+    }
+
+    /**
+     * 订单列表
+     * @param Request $request
+     */
+    public function orderList(Request $request)
+    {
+        $post = UtilService::getMore([
+            ['page', 1],
+            ['pageSize', 20],
+            ['status', ''],
+        ], $request);
+
+        $where = [
+            ['uid', '=', $request->user['uid']]
+        ];
+
+        if ($post['status'] !== '' && in_array((string)$post['status'], ["0", "1", "2", "3", "-1"])) {
+            $where[] = ['status', '=', (int)$post['status']];
+        }
+
+        $result = (new StoreOrder())->getList($where, $post['page'], $post['pageSize']);
+
+        return app('json')->success($result);
+    }
+
+    /**
+     * 订单详情
+     * @param Request $request
+     */
+    public function orderDetail(Request $request)
+    {
+        $post = UtilService::getMore([
+            ['order_id', '', 'empty', '参数错误'],
+        ], $request);
+
+        $order = Db::name('store_order')
+            ->where('order_id', $post['order_id'])
+            ->where('uid', $request->user['uid'])
+            ->find();
+
+        if (!$order) {
+            return app('json')->fail('订单不存在');
+        }
+
+        // 获取订单商品
+        $cartInfo = Db::name('store_order_cart_info')
+            ->where('oid', $order['id'])
+            ->select()
+            ->toArray();
+
+        $order['cart_info'] = $cartInfo;
+
+        return app('json')->success($order);
+    }
+
+    /**
+     * 取消订单
+     * @param Request $request
+     */
+    public function cancelOrder(Request $request)
+    {
+        $post = UtilService::getMore([
+            ['order_id', '', 'empty', '参数错误'],
+        ], $request);
+
+        $order = Db::name('store_order')
+            ->where('order_id', $post['order_id'])
+            ->where('uid', $request->user['uid'])
+            ->where('status', 0)
+            ->find();
+
+        if (!$order) {
+            return app('json')->fail('订单不存在或已取消');
+        }
+
+        Db::name('store_order')->where('id', $order['id'])->update(['status' => -1]);
+
+        return app('json')->success('订单已取消');
+    }
+
+    /**
+     * 确认收货
+     * @param Request $request
+     */
+    public function confirmOrder(Request $request)
+    {
+        $post = UtilService::getMore([
+            ['order_id', '', 'empty', '参数错误'],
+        ], $request);
+
+        $order = Db::name('store_order')
+            ->where('order_id', $post['order_id'])
+            ->where('uid', $request->user['uid'])
+            ->where('status', 2)
+            ->find();
+
+        if (!$order) {
+            return app('json')->fail('订单不存在或状态错误');
+        }
+
+        Db::name('store_order')->where('id', $order['id'])->update([
+            'status' => 3,
+            'confirm_time' => time()
+        ]);
+
+        return app('json')->success('确认收货成功');
+    }
+}

+ 34 - 0
app/api/route/address.php

@@ -0,0 +1,34 @@
+<?php
+// +----------------------------------------------------------------------
+// | [ WE CAN DO IT MORE SIMPLE  ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2018-2020 rights reserved.
+// +----------------------------------------------------------------------
+// | Author: TABLE ME
+// +----------------------------------------------------------------------
+// | Date: 2020-09-05 09:21
+// +----------------------------------------------------------------------
+
+use app\api\middleware\AllowOriginMiddleware;
+use app\api\middleware\SeretKeyMiddleware;
+use app\api\middleware\UserMiddleware;
+use think\facade\Route;
+
+Route::group('address', function () {
+    //地址列表
+    Route::rule('list', 'Address/list');
+    //地址详情
+    Route::rule('detail', 'Address/detail');
+    //添加地址
+    Route::rule('add', 'Address/add');
+    //编辑地址
+    Route::rule('edit', 'Address/edit');
+    //删除地址
+    Route::rule('delete', 'Address/delete');
+    //设置默认
+    Route::rule('setDefault', 'Address/setDefault');
+})->middleware([
+    AllowOriginMiddleware::class,
+    SeretKeyMiddleware::class,
+    UserMiddleware::class,
+]);

+ 32 - 0
app/api/route/cart.php

@@ -0,0 +1,32 @@
+<?php
+// +----------------------------------------------------------------------
+// | [ WE CAN DO IT MORE SIMPLE  ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2018-2020 rights reserved.
+// +----------------------------------------------------------------------
+// | Author: TABLE ME
+// +----------------------------------------------------------------------
+// | Date: 2020-09-05 09:21
+// +----------------------------------------------------------------------
+
+use app\api\middleware\AllowOriginMiddleware;
+use app\api\middleware\SeretKeyMiddleware;
+use app\api\middleware\UserMiddleware;
+use think\facade\Route;
+
+Route::group('cart', function () {
+    //购物车列表
+    Route::rule('list', 'Cart/list');
+    //添加购物车
+    Route::rule('add', 'Cart/add');
+    //修改数量
+    Route::rule('updateNum', 'Cart/updateNum');
+    //删除购物车
+    Route::rule('delete', 'Cart/delete');
+    //购物车数量
+    Route::rule('count', 'Cart/count');
+})->middleware([
+    AllowOriginMiddleware::class,
+    SeretKeyMiddleware::class,
+    UserMiddleware::class,
+]);

+ 32 - 0
app/api/route/order.php

@@ -0,0 +1,32 @@
+<?php
+// +----------------------------------------------------------------------
+// | [ WE CAN DO IT MORE SIMPLE  ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2018-2020 rights reserved.
+// +----------------------------------------------------------------------
+// | Author: TABLE ME
+// +----------------------------------------------------------------------
+// | Date: 2020-09-05 09:21
+// +----------------------------------------------------------------------
+
+use app\api\middleware\AllowOriginMiddleware;
+use app\api\middleware\SeretKeyMiddleware;
+use app\api\middleware\UserMiddleware;
+use think\facade\Route;
+
+Route::group('order', function () {
+    //订单列表
+    Route::rule('list', 'Order/list');
+    //订单详情
+    Route::rule('info', 'Order/info');
+    //取消订单
+    Route::rule('cancel', 'Order/cancel');
+    //确认收货
+    Route::rule('confirm', 'Order/confirm');
+    //积分支付
+    Route::rule('scorePay', 'Order/scorePay');
+})->middleware([
+    AllowOriginMiddleware::class,
+    SeretKeyMiddleware::class,
+    UserMiddleware::class,
+]);

+ 36 - 0
app/api/route/product.php

@@ -0,0 +1,36 @@
+<?php
+// +----------------------------------------------------------------------
+// | [ WE CAN DO IT MORE SIMPLE  ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2018-2020 rights reserved.
+// +----------------------------------------------------------------------
+// | Author: TABLE ME
+// +----------------------------------------------------------------------
+// | Date: 2020-09-05 09:21
+// +----------------------------------------------------------------------
+
+use app\api\middleware\AllowOriginMiddleware;
+use app\api\middleware\SeretKeyMiddleware;
+use app\api\middleware\UserMiddleware;
+use think\facade\Route;
+
+Route::group('product', function () {
+    //分类列表
+    Route::rule('categoryList', 'Product/categoryList');
+    //分类树
+    Route::rule('categoryTree', 'Product/categoryTree');
+    //品牌列表
+    Route::rule('brandList', 'Product/brandList');
+    //商品列表
+    Route::rule('productList', 'Product/productList');
+    //商品详情
+    Route::rule('productDetail', 'Product/productDetail');
+    //评价列表
+    Route::rule('replyList', 'Product/replyList');
+    //添加评价
+    Route::rule('addReply', 'Product/addReply');
+})->middleware([
+    AllowOriginMiddleware::class,
+    SeretKeyMiddleware::class,
+    UserMiddleware::class,
+]);

+ 32 - 0
app/api/route/shop.php

@@ -0,0 +1,32 @@
+<?php
+// +----------------------------------------------------------------------
+// | [ WE CAN DO IT MORE SIMPLE  ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2018-2020 rights reserved.
+// +----------------------------------------------------------------------
+// | Author: TABLE ME
+// +----------------------------------------------------------------------
+// | Date: 2020-09-05 09:21
+// +----------------------------------------------------------------------
+
+use app\api\middleware\AllowOriginMiddleware;
+use app\api\middleware\SeretKeyMiddleware;
+use app\api\middleware\UserMiddleware;
+use think\facade\Route;
+
+Route::group('shop', function () {
+    //创建订单
+    Route::rule('createOrder', 'Shop/createOrder');
+    //订单列表
+    Route::rule('orderList', 'Shop/orderList');
+    //订单详情
+    Route::rule('orderDetail', 'Shop/orderDetail');
+    //取消订单
+    Route::rule('cancelOrder', 'Shop/cancelOrder');
+    //确认收货
+    Route::rule('confirmOrder', 'Shop/confirmOrder');
+})->middleware([
+    AllowOriginMiddleware::class,
+    SeretKeyMiddleware::class,
+    UserMiddleware::class,
+]);

+ 7 - 0
app/lib/OrderLib.php

@@ -20,6 +20,7 @@ use app\model\api\UserShowTemplate;
 use app\model\api\OrderInfo;
 use app\model\api\User as UserModel;
 use app\model\api\UserDetail as UserDetailModel;
+use app\model\api\UserScoreDetail;
 use app\model\api\Sys as SysModel;
 
 use think\facade\Db;
@@ -76,6 +77,12 @@ class OrderLib
                 PayTrade::commitTrans();
                 return true;
             }
+            //商城积分支付订单
+            if($payTradeData["type"]=="shop_score"){
+                (new Order)->where("id",$payTradeData['o_id'])->update(['status' => 1, 'pay_time' => time()]);
+                PayTrade::commitTrans();
+                return true;
+            }
             PayTrade::commitTrans();
         } catch (DbException $dbException) {
             PayTrade::rollbackTrans();

+ 38 - 0
app/model/api/ShippingTemplates.php

@@ -0,0 +1,38 @@
+<?php
+declare (strict_types = 1);
+
+namespace app\model\api;
+
+use think\Model;
+
+/**
+ * @mixin \think\Model
+ */
+class ShippingTemplates extends Model
+{
+    protected $name = 'shipping_templates';
+
+    /**
+     * 获取运费模板列表
+     * @param array $where
+     * @param int $page
+     * @param int $pageSize
+     * @return array
+     */
+    public function getList($where = [], $page = 1, $pageSize = 20)
+    {
+        $query = $this->where($where);
+        $totalCount = $query->count();
+        $list = $query
+            ->order('id', 'desc')
+            ->page($page, $pageSize)
+            ->select()
+            ->toArray();
+        return [
+            'list' => $list,
+            'totalCount' => $totalCount,
+            'pageSize' => $pageSize,
+            'page' => $page
+        ];
+    }
+}

+ 39 - 0
app/model/api/StoreBrand.php

@@ -0,0 +1,39 @@
+<?php
+declare (strict_types = 1);
+
+namespace app\model\api;
+
+use think\Model;
+
+/**
+ * @mixin \think\Model
+ */
+class StoreBrand extends Model
+{
+    protected $name = 'store_brand';
+
+    /**
+     * 获取品牌列表
+     * @param array $where
+     * @param int $page
+     * @param int $pageSize
+     * @return array
+     */
+    public function getList($where = [], $page = 1, $pageSize = 20)
+    {
+        $query = $this->where($where);
+        $totalCount = $query->count();
+        $list = $query
+            ->order('sort', 'desc')
+            ->order('id', 'desc')
+            ->page($page, $pageSize)
+            ->select()
+            ->toArray();
+        return [
+            'list' => $list,
+            'totalCount' => $totalCount,
+            'pageSize' => $pageSize,
+            'page' => $page
+        ];
+    }
+}

+ 74 - 0
app/model/api/StoreCart.php

@@ -0,0 +1,74 @@
+<?php
+declare (strict_types = 1);
+
+namespace app\model\api;
+
+use think\Model;
+
+/**
+ * @mixin \think\Model
+ */
+class StoreCart extends Model
+{
+    protected $name = 'store_cart';
+
+    /**
+     * 获取购物车列表
+     * @param int $uid
+     * @return array
+     */
+    public function getCartList($uid)
+    {
+        $list = $this->alias('c')
+            ->field('c.*,p.title,p.image,p.price as product_price')
+            ->leftJoin('store_product p', 'p.id = c.product_id')
+            ->where('c.uid', $uid)
+            ->select()
+            ->toArray();
+        return $list;
+    }
+
+    /**
+     * 添加购物车
+     * @param array $data
+     * @return bool
+     */
+    public function addToCart($data)
+    {
+        // 检查是否已存在
+        $exist = $this->where('uid', $data['uid'])
+            ->where('product_id', $data['product_id'])
+            ->where('cart_num', $data['cart_num'])
+            ->find();
+        if ($exist) {
+            // 更新数量
+            return $this->where('id', $exist['id'])->inc('cart_num', $data['cart_num'])->update();
+        } else {
+            // 新增
+            return $this->insert($data);
+        }
+    }
+
+    /**
+     * 修改购物车数量
+     * @param int $id
+     * @param int $cartNum
+     * @param int $uid
+     * @return bool
+     */
+    public function updateCartNum($id, $cartNum, $uid)
+    {
+        return $this->where('id', $id)->where('uid', $uid)->update(['cart_num' => $cartNum]);
+    }
+
+    /**
+     * 删除购物车
+     * @param array $ids
+     * @param int $uid
+     * @return bool
+     */
+    public function deleteCart($ids, $uid)
+    {
+        return $this->where('uid', $uid)->whereIn('id', $ids)->delete();
+    }
+}

+ 56 - 0
app/model/api/StoreCategory.php

@@ -0,0 +1,56 @@
+<?php
+declare (strict_types = 1);
+
+namespace app\model\api;
+
+use think\Model;
+
+/**
+ * @mixin \think\Model
+ */
+class StoreCategory extends Model
+{
+    protected $name = 'store_category';
+
+    /**
+     * 获取分类列表
+     * @param array $where
+     * @param int $page
+     * @param int $pageSize
+     * @return array
+     */
+    public function getList($where = [], $page = 1, $pageSize = 20)
+    {
+        $query = $this->where($where);
+        $totalCount = $query->count();
+        $list = $query
+            ->order('sort', 'desc')
+            ->order('id', 'desc')
+            ->page($page, $pageSize)
+            ->select()
+            ->toArray();
+        return [
+            'list' => $list,
+            'totalCount' => $totalCount,
+            'pageSize' => $pageSize,
+            'page' => $page
+        ];
+    }
+
+    /**
+     * 获取树形分类
+     * @param int $pid
+     * @return array
+     */
+    public function getTree($pid = 0)
+    {
+        $list = $this->where('pid', $pid)->order('sort', 'desc')->select()->toArray();
+        foreach ($list as &$item) {
+            $children = $this->getTree($item['id']);
+            if (!empty($children)) {
+                $item['children'] = $children;
+            }
+        }
+        return $list;
+    }
+}

+ 56 - 0
app/model/api/StoreOrder.php

@@ -0,0 +1,56 @@
+<?php
+declare (strict_types = 1);
+
+namespace app\model\api;
+
+use think\Model;
+
+/**
+ * @mixin \think\Model
+ */
+class StoreOrder extends Model
+{
+    protected $name = 'store_order';
+
+    /**
+     * 获取订单列表
+     * @param array $where
+     * @param int $page
+     * @param int $pageSize
+     * @return array
+     */
+    public function getList($where = [], $page = 1, $pageSize = 20)
+    {
+        $query = $this->where($where);
+        $totalCount = $query->count();
+        $list = $query
+            ->order('id', 'desc')
+            ->page($page, $pageSize)
+            ->select()
+            ->toArray();
+        return [
+            'list' => $list,
+            'totalCount' => $totalCount,
+            'pageSize' => $pageSize,
+            'page' => $page
+        ];
+    }
+
+    /**
+     * 获取订单详情
+     * @param int $id
+     * @return array|null
+     */
+    public function getOrderDetail($id)
+    {
+        $order = $this->where('id', $id)->find();
+        if (!$order) {
+            return null;
+        }
+        $data = $order->toArray();
+        // 获取订单商品
+        $cartInfo = (new StoreOrderCartInfo())->where('oid', $id)->select()->toArray();
+        $data['cart_info'] = $cartInfo;
+        return $data;
+    }
+}

+ 14 - 0
app/model/api/StoreOrderCartInfo.php

@@ -0,0 +1,14 @@
+<?php
+declare (strict_types = 1);
+
+namespace app\model\api;
+
+use think\Model;
+
+/**
+ * @mixin \think\Model
+ */
+class StoreOrderCartInfo extends Model
+{
+    protected $name = 'store_order_cart_info';
+}

+ 38 - 0
app/model/api/StoreOrderRefund.php

@@ -0,0 +1,38 @@
+<?php
+declare (strict_types = 1);
+
+namespace app\model\api;
+
+use think\Model;
+
+/**
+ * @mixin \think\Model
+ */
+class StoreOrderRefund extends Model
+{
+    protected $name = 'store_order_refund';
+
+    /**
+     * 获取退款列表
+     * @param array $where
+     * @param int $page
+     * @param int $pageSize
+     * @return array
+     */
+    public function getList($where = [], $page = 1, $pageSize = 20)
+    {
+        $query = $this->where($where);
+        $totalCount = $query->count();
+        $list = $query
+            ->order('id', 'desc')
+            ->page($page, $pageSize)
+            ->select()
+            ->toArray();
+        return [
+            'list' => $list,
+            'totalCount' => $totalCount,
+            'pageSize' => $pageSize,
+            'page' => $page
+        ];
+    }
+}

+ 57 - 0
app/model/api/StoreProduct.php

@@ -0,0 +1,57 @@
+<?php
+declare (strict_types = 1);
+
+namespace app\model\api;
+
+use think\Model;
+
+/**
+ * @mixin \think\Model
+ */
+class StoreProduct extends Model
+{
+    protected $name = 'store_product';
+
+    /**
+     * 获取商品列表
+     * @param array $where
+     * @param int $page
+     * @param int $pageSize
+     * @return array
+     */
+    public function getList($where = [], $page = 1, $pageSize = 20)
+    {
+        $query = $this->where($where);
+        $totalCount = $query->count();
+        $list = $query
+            ->order('sort', 'desc')
+            ->order('id', 'desc')
+            ->page($page, $pageSize)
+            ->select()
+            ->toArray();
+        return [
+            'list' => $list,
+            'totalCount' => $totalCount,
+            'pageSize' => $pageSize,
+            'page' => $page
+        ];
+    }
+
+    /**
+     * 获取商品详情
+     * @param int $id
+     * @return array|null
+     */
+    public function getDetail($id)
+    {
+        $product = $this->where('id', $id)->find();
+        if (!$product) {
+            return null;
+        }
+        $data = $product->toArray();
+        // 获取SKU列表
+        $skuList = (new StoreProductAttrValue())->where('product_id', $id)->select()->toArray();
+        $data['sku_list'] = $skuList;
+        return $data;
+    }
+}

+ 27 - 0
app/model/api/StoreProductAttrValue.php

@@ -0,0 +1,27 @@
+<?php
+declare (strict_types = 1);
+
+namespace app\model\api;
+
+use think\Model;
+
+/**
+ * @mixin \think\Model
+ */
+class StoreProductAttrValue extends Model
+{
+    protected $name = 'store_product_attr_value';
+
+    /**
+     * 根据规格获取SKU
+     * @param int $productId
+     * @param string $suk
+     * @return array|null
+     */
+    public function getSkuBySuk($productId, $suk)
+    {
+        return $this->where('product_id', $productId)
+            ->where('suk', $suk)
+            ->find();
+    }
+}

+ 41 - 0
app/model/api/StoreProductReply.php

@@ -0,0 +1,41 @@
+<?php
+declare (strict_types = 1);
+
+namespace app\model\api;
+
+use think\Model;
+
+/**
+ * @mixin \think\Model
+ */
+class StoreProductReply extends Model
+{
+    protected $name = 'store_product_reply';
+
+    /**
+     * 获取评论列表
+     * @param array $where
+     * @param int $page
+     * @param int $pageSize
+     * @return array
+     */
+    public function getList($where = [], $page = 1, $pageSize = 20)
+    {
+        $query = $this->alias('r')
+            ->field('r.*,u.nickname,u.avatar')
+            ->leftJoin('user u', 'u.uid = r.uid')
+            ->where($where);
+        $totalCount = $query->count();
+        $list = $query
+            ->order('r.id', 'desc')
+            ->page($page, $pageSize)
+            ->select()
+            ->toArray();
+        return [
+            'list' => $list,
+            'totalCount' => $totalCount,
+            'pageSize' => $pageSize,
+            'page' => $page
+        ];
+    }
+}

+ 45 - 1
app/model/api/UserAddress.php

@@ -10,5 +10,49 @@ use think\Model;
  */
 class UserAddress extends Model
 {
-    //
+    /**
+     * 获取地址列表
+     * @param int $uid
+     * @return array
+     */
+    public function getAddressList($uid)
+    {
+        return $this->where('uid', $uid)
+            ->order('is_default', 'desc')
+            ->order('id', 'desc')
+            ->select()
+            ->toArray();
+    }
+
+    /**
+     * 获取默认地址
+     * @param int $uid
+     * @return array|null
+     */
+    public function getDefaultAddress($uid)
+    {
+        $address = $this->where('uid', $uid)
+            ->where('is_default', 1)
+            ->find();
+        if (!$address) {
+            // 如果没有默认地址,返回第一个
+            $address = $this->where('uid', $uid)->order('id', 'desc')->find();
+        }
+        return $address ? $address->toArray() : null;
+    }
+
+    /**
+     * 设置默认地址
+     * @param int $id
+     * @param int $uid
+     * @return bool
+     */
+    public function setDefault($id, $uid)
+    {
+        // 先取消所有默认
+        $this->where('uid', $uid)->update(['is_default' => 0]);
+        // 设置当前为默认
+        return $this->where('id', $id)->where('uid', $uid)->update(['is_default' => 1]);
+    }
 }
+

+ 325 - 0
app/system/controller/Product.php

@@ -0,0 +1,325 @@
+<?php
+declare (strict_types = 1);
+
+namespace app\system\controller;
+
+use app\BaseController;
+use app\model\api\StoreCategory;
+use app\model\api\StoreBrand;
+use app\model\api\StoreProduct;
+use app\model\api\StoreProductAttrValue;
+use app\Request;
+use library\services\UtilService;
+use think\facade\Db;
+
+class Product extends BaseController
+{
+    /**
+     * 商品分类列表
+     * @param Request $request
+     */
+    public function categoryList(Request $request)
+    {
+        $pageSize = 20;
+        $post = UtilService::getMore([
+            ['page', 1],
+            ['pageSize', 20],
+            ['pid', 0],
+            ['keyword', ''],
+        ], $request);
+
+        $where = [];
+        if ($post['pid'] > 0) {
+            $where[] = ['pid', '=', $post['pid']];
+        }
+        if (!empty($post['keyword'])) {
+            $where[] = ['name', 'like', '%' . $post['keyword'] . '%'];
+        }
+
+        $result = (new StoreCategory())->getList($where, $post['page'], $post['pageSize']);
+
+        return app('json')->success($result);
+    }
+
+    /**
+     * 保存商品分类
+     * @param Request $request
+     */
+    public function categorySave(Request $request)
+    {
+        $post = UtilService::getMore([
+            ['id', 0],
+            ['name', '', 'empty', '请输入分类名称'],
+            ['pid', 0],
+            ['sort', 0],
+            ['status', 1],
+        ], $request);
+
+        $data = [
+            'name' => $post['name'],
+            'pid' => $post['pid'],
+            'sort' => $post['sort'],
+            'status' => $post['status'] == 1 ? 1 : 0,
+        ];
+
+        if ($post['id'] > 0) {
+            $result = Db::name('store_category')->where('id', $post['id'])->update($data);
+        } else {
+            $result = Db::name('store_category')->insertGetId($data);
+        }
+
+        if ($result) {
+            return app('json')->success('保存成功');
+        } else {
+            return app('json')->fail('保存失败');
+        }
+    }
+
+    /**
+     * 删除商品分类
+     * @param Request $request
+     */
+    public function categoryDelete(Request $request)
+    {
+        $post = UtilService::getMore([
+            ['id', '', 'empty', '参数错误'],
+        ], $request);
+
+        // 检查是否有子分类
+        $hasChild = Db::name('store_category')->where('pid', $post['id'])->count();
+        if ($hasChild > 0) {
+            return app('json')->fail('该分类下有子分类,无法删除');
+        }
+
+        // 检查是否有商品
+        $hasProduct = Db::name('store_product')->where('category_id', $post['id'])->count();
+        if ($hasProduct > 0) {
+            return app('json')->fail('该分类下有商品,无法删除');
+        }
+
+        $result = Db::name('store_category')->where('id', $post['id'])->delete();
+
+        if ($result) {
+            return app('json')->success('删除成功');
+        } else {
+            return app('json')->fail('删除失败');
+        }
+    }
+
+    /**
+     * 品牌列表
+     * @param Request $request
+     */
+    public function brandList(Request $request)
+    {
+        $pageSize = 20;
+        $post = UtilService::getMore([
+            ['page', 1],
+            ['pageSize', 20],
+            ['keyword', ''],
+        ], $request);
+
+        $where = [];
+        if (!empty($post['keyword'])) {
+            $where[] = ['name', 'like', '%' . $post['keyword'] . '%'];
+        }
+
+        $result = (new StoreBrand())->getList($where, $post['page'], $post['pageSize']);
+
+        return app('json')->success($result);
+    }
+
+    /**
+     * 保存品牌
+     * @param Request $request
+     */
+    public function brandSave(Request $request)
+    {
+        $post = UtilService::getMore([
+            ['id', 0],
+            ['name', '', 'empty', '请输入品牌名称'],
+            ['image', ''],
+            ['sort', 0],
+            ['status', 1],
+        ], $request);
+
+        $data = [
+            'name' => $post['name'],
+            'image' => $post['image'],
+            'sort' => $post['sort'],
+            'status' => $post['status'] == 1 ? 1 : 0,
+        ];
+
+        if ($post['id'] > 0) {
+            $result = Db::name('store_brand')->where('id', $post['id'])->update($data);
+        } else {
+            $result = Db::name('store_brand')->insertGetId($data);
+        }
+
+        if ($result) {
+            return app('json')->success('保存成功');
+        } else {
+            return app('json')->fail('保存失败');
+        }
+    }
+
+    /**
+     * 删除品牌
+     * @param Request $request
+     */
+    public function brandDelete(Request $request)
+    {
+        $post = UtilService::getMore([
+            ['id', '', 'empty', '参数错误'],
+        ], $request);
+
+        $result = Db::name('store_brand')->where('id', $post['id'])->delete();
+
+        if ($result) {
+            return app('json')->success('删除成功');
+        } else {
+            return app('json')->fail('删除失败');
+        }
+    }
+
+    /**
+     * 商品列表
+     * @param Request $request
+     */
+    public function productList(Request $request)
+    {
+        $pageSize = 20;
+        $post = UtilService::getMore([
+            ['page', 1],
+            ['pageSize', 20],
+            ['category_id', ''],
+            ['brand_id', ''],
+            ['keyword', ''],
+            ['status', ''],
+        ], $request);
+
+        $where = [];
+        if (!empty($post['category_id'])) {
+            $where[] = ['category_id', '=', $post['category_id']];
+        }
+        if (!empty($post['brand_id'])) {
+            $where[] = ['brand_id', '=', $post['brand_id']];
+        }
+        if (!empty($post['keyword'])) {
+            $where[] = ['title', 'like', '%' . $post['keyword'] . '%'];
+        }
+        if ($post['status'] !== '' && in_array((string)$post['status'], ["0", "1"])) {
+            $where[] = ['is_show', '=', (int)$post['status']];
+        }
+
+        $result = (new StoreProduct())->getList($where, $post['page'], $post['pageSize']);
+
+        return app('json')->success($result);
+    }
+
+    /**
+     * 保存商品
+     * @param Request $request
+     */
+    public function productSave(Request $request)
+    {
+        $post = UtilService::getMore([
+            ['id', 0],
+            ['category_id', '', 'empty', '请选择分类'],
+            ['brand_id', 0],
+            ['title', '', 'empty', '请输入商品标题'],
+            ['image', '', 'empty', '请上传商品图片'],
+            ['images', ''],
+            ['price', 0],
+            ['cost_price', 0],
+            ['ot_price', 0],
+            ['stock', 0],
+            ['sales', 0],
+            ['unit_name', '件'],
+            ['description', ''],
+            ['sort', 0],
+            ['status', 1],
+            ['sku_list', '[]'],
+        ], $request);
+
+        $data = [
+            'category_id' => $post['category_id'],
+            'brand_id' => $post['brand_id'],
+            'title' => $post['title'],
+            'image' => $post['image'],
+            'images' => $post['images'],
+            'price' => $post['price'],
+            'cost_price' => $post['cost_price'],
+            'ot_price' => $post['ot_price'],
+            'stock' => $post['stock'],
+            'sales' => $post['sales'],
+            'unit_name' => $post['unit_name'],
+            'description' => $post['description'],
+            'sort' => $post['sort'],
+            'is_show' => $post['status'] == 1 ? 1 : 0,
+        ];
+
+        Db::startTrans();
+        try {
+            if ($post['id'] > 0) {
+                // 更新商品
+                Db::name('store_product')->where('id', $post['id'])->update($data);
+                $productId = $post['id'];
+
+                // 删除原有SKU
+                Db::name('store_product_attr_value')->where('product_id', $productId)->delete();
+            } else {
+                // 新增商品
+                $data['time'] = time();
+                $productId = Db::name('store_product')->insertGetId($data);
+            }
+
+            // 保存SKU
+            $skuList = json_decode($post['sku_list'], true);
+            if (!empty($skuList)) {
+                foreach ($skuList as $sku) {
+                    $skuData = [
+                        'product_id' => $productId,
+                        'suk' => $sku['suk'] ?? '',
+                        'price' => $sku['price'] ?? $post['price'],
+                        'cost_price' => $sku['cost_price'] ?? $post['cost_price'],
+                        'stock' => $sku['stock'] ?? 0,
+                        'bar_code' => $sku['bar_code'] ?? '',
+                    ];
+                    Db::name('store_product_attr_value')->insert($skuData);
+                }
+            }
+
+            Db::commit();
+            return app('json')->success('保存成功');
+        } catch (\Exception $e) {
+            Db::rollback();
+            return app('json')->fail('保存失败');
+        }
+    }
+
+    /**
+     * 删除商品
+     * @param Request $request
+     */
+    public function productDelete(Request $request)
+    {
+        $post = UtilService::getMore([
+            ['id', '', 'empty', '参数错误'],
+        ], $request);
+
+        Db::startTrans();
+        try {
+            // 删除商品
+            Db::name('store_product')->where('id', $post['id'])->delete();
+            // 删除SKU
+            Db::name('store_product_attr_value')->where('product_id', $post['id'])->delete();
+
+            Db::commit();
+            return app('json')->success('删除成功');
+        } catch (\Exception $e) {
+            Db::rollback();
+            return app('json')->fail('删除失败');
+        }
+    }
+}

+ 253 - 0
app/system/controller/Shop.php

@@ -0,0 +1,253 @@
+<?php
+declare (strict_types = 1);
+
+namespace app\system\controller;
+
+use app\BaseController;
+use app\model\api\StoreOrder;
+use app\model\api\StoreOrderCartInfo;
+use app\Request;
+use library\services\UtilService;
+use think\facade\Db;
+
+class Shop extends BaseController
+{
+    /**
+     * 商城订单统计
+     * @param Request $request
+     */
+    public function total(Request $request)
+    {
+        $post = UtilService::getMore([
+            ['status', ''],
+        ], $request);
+
+        $order = Db::name('store_order');
+        $totalWhere = [];
+
+        if ($post['status'] !== '' && in_array((string)$post['status'], ["0", "1", "2", "3", "-1"])) {
+            $totalWhere[] = ['status', '=', (int)$post['status']];
+        }
+
+        //全部
+        $orderCount = $order->where($totalWhere)->count();
+        //待支付
+        $waitPayWhere = $totalWhere;
+        $waitPayWhere[] = ['status', '=', 0];
+        $waitPayCount = $order->where($waitPayWhere)->count();
+        //待发货
+        $waitSendWhere = $totalWhere;
+        $waitSendWhere[] = ['status', '=', 1];
+        $waitSendCount = $order->where($waitSendWhere)->count();
+        //待收货
+        $waitAcceptWhere = $totalWhere;
+        $waitAcceptWhere[] = ['status', '=', 2];
+        $waitAcceptCount = $order->where($waitAcceptWhere)->count();
+        //已完成
+        $okWhere = $totalWhere;
+        $okWhere[] = ['status', '=', 3];
+        $okCount = $order->where($okWhere)->count();
+        //已取消
+        $closeWhere = $totalWhere;
+        $closeWhere[] = ['status', '=', -1];
+        $closeCount = $order->where($closeWhere)->count();
+
+        return app('json')->success([
+            'orderCount' => $orderCount,
+            'waitPayCount' => $waitPayCount,
+            'waitSendCount' => $waitSendCount,
+            'waitAcceptCount' => $waitAcceptCount,
+            'okCount' => $okCount,
+            'closeCount' => $closeCount,
+        ]);
+    }
+
+    /**
+     * 商城订单列表
+     * @param Request $request
+     */
+    public function list(Request $request)
+    {
+        $pageSize = 50;
+        $post = UtilService::getMore([
+            ['page', 1],
+            ['uid', 0],
+            ['mobile', ''],
+            ['order_id', ''],
+            ['status', ''],
+            ['time', []],
+        ], $request);
+
+        $where = [];
+        if (!empty($post['uid'])) {
+            $where[] = ['o.uid', '=', $post['uid']];
+        } else if (!empty($post['mobile'])) {
+            $m = Db::name('user')->where('mobile', $post['mobile'])->find();
+            if (!empty($m)) {
+                $where[] = ['o.uid', '=', $m['uid']];
+            }
+        }
+        if (!empty($post['order_id'])) {
+            $where[] = ['o.order_id', '=', $post['order_id']];
+        }
+        if ($post['status'] !== '' && in_array((string)$post['status'], ["0", "1", "2", "3", "-1"])) {
+            $where[] = ['o.status', '=', (int)$post['status']];
+        }
+
+        //创建时间
+        $startTime = '';
+        $endTime = '';
+        if (!empty($post['time'][0]) && !empty($post['time'][1])) {
+            $startTime = strtotime($post['time'][0]);
+            $endTime = strtotime($post['time'][1]);
+            $where[] = ['o.time', 'between', "{$startTime},{$endTime}"];
+        }
+
+        $order = Db::name('store_order');
+        $data = $order
+            ->alias('o')
+            ->field('o.*,u.mobile,u.nickname')
+            ->leftJoin('user u', 'u.uid = o.uid')
+            ->where($where)
+            ->page((int)$post['page'], $pageSize)
+            ->order('o.id', 'desc')
+            ->select()
+            ->toArray();
+
+        $pageCount = $order->where($where)->count();
+
+        $result = UtilService::getParam([
+            'id',
+            'order_id',
+            'uid',
+            'mobile',
+            'nickname',
+            'real_name',
+            'phone',
+            'province',
+            'city',
+            'district',
+            'detail',
+            'total_price',
+            'pay_price',
+            'total_postage',
+            'pay_postage',
+            'paid',
+            'status',
+            ['time', 'time', 'date("Y-m-d H:i:s",$1)'],
+            ['pay_time', 'pay_time', function ($item) {
+                return empty($item) ? "-" : date('Y-m-d H:i:s', $item);
+            }],
+            ['confirm_time', 'confirm_time', function ($item) {
+                return empty($item) ? "-" : date('Y-m-d H:i:s', $item);
+            }],
+        ], $data);
+
+        return app('json')->success([
+            'list' => $result,
+            'pageCount' => $pageCount,
+            'pageSize' => $pageSize,
+            'page' => $post['page'],
+        ]);
+    }
+
+    /**
+     * 商城订单详情
+     * @param Request $request
+     */
+    public function info(Request $request)
+    {
+        $post = UtilService::getMore([
+            ['id', '', 'empty', '参数错误'],
+        ], $request);
+
+        $order = Db::name('store_order')
+            ->alias('o')
+            ->field('o.*,u.mobile,u.nickname')
+            ->leftJoin('user u', 'u.uid = o.uid')
+            ->where('o.id', $post['id'])
+            ->find();
+
+        if (empty($order)) {
+            return app('json')->fail('订单不存在');
+        }
+
+        $data = $order->toArray();
+        //获取订单商品
+        $cartInfo = Db::name('store_order_cart_info')
+            ->where('oid', $data['id'])
+            ->select()
+            ->toArray();
+        $data['cart_info'] = $cartInfo;
+
+        return app('json')->success($data);
+    }
+
+    /**
+     * 发货
+     * @param Request $request
+     */
+    public function fahuo(Request $request)
+    {
+        $post = UtilService::getMore([
+            ['id', '', 'empty', '参数错误'],
+            ['express_type', ''],
+            ['express_code', ''],
+            ['express_num', ''],
+        ], $request);
+
+        $order = Db::name('store_order')
+            ->where('id', $post['id'])
+            ->where('status', 1)
+            ->find();
+
+        if (empty($order)) {
+            return app('json')->fail('当前订单不可发货');
+        }
+
+        if (empty($post['express_num'])) {
+            return app('json')->fail('请输入物流单号');
+        }
+
+        $result = Db::name('store_order')->where('id', $post['id'])->update([
+            'status' => 2,
+            'express_type' => $post['express_type'],
+            'express_code' => $post['express_code'],
+            'express_num' => $post['express_num'],
+            'delivery_time' => time(),
+        ]);
+
+        if ($result) {
+            return app('json')->success('操作成功');
+        } else {
+            return app('json')->fail('操作失败');
+        }
+    }
+
+    /**
+     * 订单备注
+     * @param Request $request
+     */
+    public function mono(Request $request)
+    {
+        $post = UtilService::getMore([
+            ['id', '', 'empty', '参数错误'],
+            ['remark', '', 'empty', '请输入备注内容'],
+        ], $request);
+
+        $order = Db::name('store_order')->where('id', $post['id'])->find();
+        if (empty($order)) {
+            return app('json')->fail('订单不存在');
+        }
+
+        $result = Db::name('store_order')->where('id', $post['id'])->update([
+            'remark' => $post['remark'],
+        ]);
+
+        if ($result) {
+            return app('json')->success('操作成功');
+        } else {
+            return app('json')->fail('操作失败');
+        }
+    }
+}

+ 12 - 8
app/system/route/member.php

@@ -15,13 +15,17 @@ use think\facade\Route;
 Route::group('member', function () {
 
     //@列表
-    Route::rule('list', 'Member/list'); 
+    Route::rule('list', 'Member/list');
     //添加编辑
-    Route::rule('save', 'Member/save'); 
+    Route::rule('save', 'Member/save');
     //余额明细
-    Route::rule('moneyDetail', 'Member/moneyDetail'); 
+    Route::rule('moneyDetail', 'Member/moneyDetail');
     //余额补扣
-    Route::rule('moneyDetailSave', 'Member/moneyDetailSave'); 
+    Route::rule('moneyDetailSave', 'Member/moneyDetailSave');
+    //积分明细
+    Route::rule('scoreDetail', 'Member/scoreDetail');
+    //积分增减
+    Route::rule('scoreDetailSave', 'Member/scoreDetailSave');
     //用户详情
     Route::rule('item', 'Member/getItem');
     //交易列表
@@ -29,7 +33,7 @@ Route::group('member', function () {
     //支付查询
     Route::rule('searchPayTrade', 'Member/searchPayTrade');
     //@用户模板列表
-    Route::rule('showTemplateList', 'Member/showTemplateList'); 
+    Route::rule('showTemplateList', 'Member/showTemplateList');
     //@从业人员列表
     Route::rule('getWorkerList', 'Member/getWorkerList');
     Route::rule('setAuthShow','Member/setAuthShow');
@@ -45,9 +49,9 @@ Route::group('member', function () {
     Route::rule('updateArticle', 'ArticleController/updateArticle');
     //删除文章
     Route::rule('deleteArticle', 'ArticleController/deleteArticle');
-    
-    
-    
+
+
+
 })->middleware([
     \app\system\middleware\AllowOriginMiddleware::class,
     \app\system\middleware\AdminAuthTokenMiddleware::class,

+ 12 - 0
app/system/route/order.php

@@ -12,6 +12,18 @@ use think\facade\Route;
 
 //@订单管理
 Route::group('order', function () {
+    //商城订单统计
+    Route::rule('total', "Order/total");
+    //商城订单列表
+    Route::rule('list', 'Order/list');
+    //商城订单详情
+    Route::rule('info', 'Order/info');
+    //商城订单备注
+    Route::rule('log', 'Order/log');
+    //商城订单发货
+    Route::rule('fahuo', 'Order/fahuo');
+    //商城订单备注提交
+    Route::rule('mono', 'Order/mono');
     //@模板订单统计
     Route::rule('showTemplateTotal',"Order/showTemplateTotal");
     //@模板订单列表

+ 37 - 0
app/system/route/product.php

@@ -0,0 +1,37 @@
+<?php
+// +----------------------------------------------------------------------
+// | [ WE CAN DO IT MORE SIMPLE  ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2018-2020 rights reserved.
+// +----------------------------------------------------------------------
+// |
+// +----------------------------------------------------------------------
+// | Date: 2020-09-06 21:52
+// +----------------------------------------------------------------------
+use think\facade\Route;
+
+//@商品管理
+Route::group('product', function () {
+    //分类列表
+    Route::rule('categoryList', 'Product/categoryList');
+    //保存分类
+    Route::rule('categorySave', 'Product/categorySave');
+    //删除分类
+    Route::rule('categoryDelete', 'Product/categoryDelete');
+    //品牌列表
+    Route::rule('brandList', 'Product/brandList');
+    //保存品牌
+    Route::rule('brandSave', 'Product/brandSave');
+    //删除品牌
+    Route::rule('brandDelete', 'Product/brandDelete');
+    //商品列表
+    Route::rule('productList', 'Product/productList');
+    //保存商品
+    Route::rule('productSave', 'Product/productSave');
+    //删除商品
+    Route::rule('productDelete', 'Product/productDelete');
+})->middleware([
+    \app\system\middleware\AllowOriginMiddleware::class,
+    \app\system\middleware\AdminAuthTokenMiddleware::class,
+    \app\system\middleware\AdminCkeckRoleMiddleware::class
+]);

+ 29 - 0
app/system/route/shop.php

@@ -0,0 +1,29 @@
+<?php
+// +----------------------------------------------------------------------
+// | [ WE CAN DO IT MORE SIMPLE  ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2018-2020 rights reserved.
+// +----------------------------------------------------------------------
+// |
+// +----------------------------------------------------------------------
+// | Date: 2020-09-06 21:52
+// +----------------------------------------------------------------------
+use think\facade\Route;
+
+//@商城管理
+Route::group('shop', function () {
+    //订单统计
+    Route::rule('total', 'Shop/total');
+    //订单列表
+    Route::rule('list', 'Shop/list');
+    //订单详情
+    Route::rule('info', 'Shop/info');
+    //发货
+    Route::rule('fahuo', 'Shop/fahuo');
+    //订单备注
+    Route::rule('mono', 'Shop/mono');
+})->middleware([
+    \app\system\middleware\AllowOriginMiddleware::class,
+    \app\system\middleware\AdminAuthTokenMiddleware::class,
+    \app\system\middleware\AdminCkeckRoleMiddleware::class
+]);