where(['id' => $productId])->cache(10)->find(); if (!$data) { $this->error(__('Goods not exist')); } if ($data['switch'] == productModel::SWITCH_OFF) { $this->error(__('Goods are off the shelves')); } // 真实浏览量加一 $data->real_look++; $data->look++; $data->save(); //服务 $server = explode(',', $data->server); $configServer = json_decode(Config::getByName('server')['value'],true); $serverValue = []; foreach ($server as $k => $v) { if (isset($configServer[$v])) { $serverValue[] = $configServer[$v]; } } $data->server = count($serverValue) ? implode(' · ', $serverValue) : ''; // 默认没有收藏 $data->favorite = false; // 评价 $data['evaluate_data'] = (new Evaluate)->where(['product_id' => $productId]) ->field('COUNT(*) as count, IFNULL(CEIL(AVG(rate)/5*100),0) as avg') ->cache(10)->find(); //优惠券 $data->coupon = (new Coupon)->where('endtime', '>', time()) ->where(['switch' => Coupon::SWITCH_ON])->cache(10)->order('weigh DESC')->select(); // 是否已收藏 if ($this->auth->id) { $data->favorite = (new Favorite)->where(['user_id' => $this->auth->id, 'product_id' => $productId])->count(); } // 购物车数量 $data->cart_num = (new \addons\unishop\model\Cart)->where(['user_id' => $this->auth->id])->count(); // 评价信息 $evaluate = (new Evaluate)->alias('e') ->join('user u', 'e.user_id = u.id') ->where(['e.product_id' => $productId, 'toptime' => ['>', Evaluate::TOP_OFF]]) ->field('u.username,u.avatar,e.*') ->order(['toptime' => 'desc', 'createtime' => 'desc'])->select(); if ($evaluate) { $data->evaluate_list = collection($evaluate)->append(['createtime_text'])->toArray(); } $data = $data->append(['images_text','videothumb', 'spec_list', 'spec_table_list'])->toArray(); unset($data['switch']); } catch (Exception $e) { $this->error($e->getMessage()); } $this->success('', $data); } /** * @ApiTitle (产品列表) * @ApiSummary (产品列表) * @ApiMethod (GET) * @ApiHeaders (name=cookie, type=string, required=false, description="用户会话的cookie") * @ApiParams (name="sid", type="integer", required=false, description="二级分类id") * @ApiParams (name="fid", type="integer", required=true, description="一级分类id") * @ApiParams (name="page", type="integer", required=true, description="页面") * @ApiParams (name="pagesize", type="integer", required=true, description="每页数量") * @ApiParams (name="by", type="string", required=true, description="排序字段") * @ApiParams (name="desc", type="string", required=true, description="排序desc,asc") * @ApiReturn ({"code":1,"msg":"","data":[]}) * @ApiReturnParams (name="title", type="string", description="商品名称") * @ApiReturnParams (name="image", type="string", description="商品图片") * @ApiReturnParams (name="sales", type="integer", description="销量") * @ApiReturnParams (name="sales_price", type="string", description="销售价钱") * @ApiReturnParams (name="product_id", type="string", description="商品id") */ public function lists() { $page = input('page', 1); $pagesize = input('pagesize', 20); $by = input('by', 'weigh'); $desc = input('desc', 'desc'); // $sid = input('sid'); // 二级分类Id $fid = input('fid'); // 一级分类Id $keyword = input('keyword','');//搜索 //图片搜索 $image = input('image',''); if(!empty($image)){ $keyword = $this->search_by_image($image); //dump($keyword); if(empty($keyword)){ $this->success('', []); } } $productModel = new productModel(); /* if ($fid && !$sid) { $categoryModel = new \addons\unishop\model\Category(); $sArr = $categoryModel->where('pid', $fid)->field('id')->select(); $sArr = array_column($sArr, 'id'); array_push($sArr, $fid); $productModel->where('category_id', 'in', $sArr); } else { $sid && $productModel->where(['category_id' => $sid]); }*/ $fid && $productModel->where(['category_id' => $fid]); if(!empty($keyword)){ $productModel->where('title', 'LIKE', '%'.$keyword.'%'); } $result = $productModel ->where(['switch' => productModel::SWITCH_ON]) ->page($page, $pagesize) ->order($by, $desc) ->field('id,title,info,image,sales_price,sales,real_sales') ->select(); if ($result) { $result = collection($result)->toArray(); } else { $result = []; } $this->success('', $result); } //腾讯云拍照识别商品 //{"Response":{"Products":[{"Name":"按摩椅","Parents":"家用电器-个护健康","Confidence":99,"XMin":107,"YMin":59,"XMax":447,"YMax":366}],"RequestId":"187745fc-0497-441e-88f5-f3f17d854016"}} private function search_by_image($image){ $image = $image.'?imageMogr2/thumbnail/800x800'; $tencent_yun = config('tencent_yun'); $secret_id = $tencent_yun['secret_id']; $secret_key = $tencent_yun['secret_key']; $token = ""; $service = "tiia"; $host = "tiia.tencentcloudapi.com"; $req_region = "ap-beijing"; $version = "2019-05-29"; $action = "DetectProduct"; $payload = json_encode(['ImageUrl' => localpath_to_netpath($image)]); $endpoint = "https://tiia.tencentcloudapi.com"; $algorithm = "TC3-HMAC-SHA256"; $timestamp = time(); $date = gmdate("Y-m-d", $timestamp); // ************* 步骤 1:拼接规范请求串 ************* $http_request_method = "POST"; $canonical_uri = "/"; $canonical_querystring = ""; $ct = "application/json; charset=utf-8"; $canonical_headers = "content-type:".$ct."\nhost:".$host."\nx-tc-action:".strtolower($action)."\n"; $signed_headers = "content-type;host;x-tc-action"; $hashed_request_payload = hash("sha256", $payload); $canonical_request = "$http_request_method\n$canonical_uri\n$canonical_querystring\n$canonical_headers\n$signed_headers\n$hashed_request_payload"; // ************* 步骤 2:拼接待签名字符串 ************* $credential_scope = "$date/$service/tc3_request"; $hashed_canonical_request = hash("sha256", $canonical_request); $string_to_sign = "$algorithm\n$timestamp\n$credential_scope\n$hashed_canonical_request"; // ************* 步骤 3:计算签名 ************* $secret_date = hash_hmac("sha256", $date, "TC3".$secret_key, true); $secret_service = hash_hmac("sha256", $service, $secret_date, true); $secret_signing = hash_hmac("sha256", "tc3_request", $secret_service, true); $signature = hash_hmac("sha256", $string_to_sign, $secret_signing); // ************* 步骤 4:拼接 Authorization ************* $authorization = "$algorithm Credential=$secret_id/$credential_scope, SignedHeaders=$signed_headers, Signature=$signature"; // ************* 步骤 5:构造并发起请求 ************* $headers = [ "Authorization" => $authorization, "Content-Type" => "application/json; charset=utf-8", "Host" => $host, "X-TC-Action" => $action, "X-TC-Timestamp" => $timestamp, "X-TC-Version" => $version ]; if ($req_region) { $headers["X-TC-Region"] = $req_region; } if ($token) { $headers["X-TC-Token"] = $token; } $headers = array_map(function ($k, $v) { return "$k: $v"; }, array_keys($headers), $headers); try { $timeOut = 3; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $endpoint); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_TIMEOUT, $timeOut); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $payload); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $response = curl_exec($ch); curl_close($ch); //return $response; $response = json_decode($response,true); if(is_array($response) && isset($response['Response']['Products'][0]['Name'])){ $searchname = $response['Response']['Products'][0]['Name']; if(!empty($searchname)){ return $searchname; } } return ''; } catch (Exception $err) { //echo $err->getMessage(); return ''; } } /** * @ApiTitle (收藏/取消) * @ApiSummary (收藏/取消) * @ApiMethod (GET) * @ApiHeaders (name=cookie, type=string, required=false, description="用户会话的cookie") * @ApiHeaders (name=token, type=string, required=true, description="用户登录的Token", sample="a2e3cc70-d2d1-41e6-9c14-f1d774ee5e1e") * @ApiParams (name="id", type="string", required=true, description="商品id") * @ApiReturn ({"code":1,"msg":"","data":true}) */ public function favorite() { $id = input('id', 0); $id = \addons\unishop\extend\Hashids::decodeHex($id); $user_id = $this->auth->id; $favoriteModel = Favorite::get(function ($query) use ($id, $user_id) { $query->where(['user_id' => $user_id, 'product_id' => $id]); }); if ($favoriteModel) { Favorite::destroy($favoriteModel->id); } else { $product = productModel::withTrashed()->where(['id' => $id, 'switch' => productModel::SWITCH_ON])->find(); if (!$product) { $this->error('参数错误'); } $favoriteModel = new Favorite(); $favoriteModel->user_id = $user_id; $favoriteModel->product_id = $id; $product = $product->getData(); $data['image'] = $product['image']; $data['market_price'] = $product['market_price']; $data['product_id'] = Hashids::encodeHex($product['id']); $data['sales_price'] = $product['sales_price']; $data['title'] = $product['title']; $favoriteModel->snapshot = json_encode($data); $favoriteModel->save(); } $this->success('', true); } /** * @ApiTitle (收藏列表) * @ApiSummary (收藏列表) * @ApiMethod (GET) * @ApiHeaders (name=token, type=string, required=true, description="用户登录的Token", sample="a2e3cc70-d2d1-41e6-9c14-f1d774ee5e1e") * @ApiHeaders (name=cookie, type=string, required=false, description="用户会话的cookie") * @ApiParams (name="page", type="integer", required=true, description="页面") * @ApiParams (name="pagesize", type="integer", required=true, description="每页数量") * @ApiReturn ({"code":1,"msg":"","data":[]}) * * @ApiReturnParams (name="id", type="integer", description="收藏id") * @ApiReturnParams (name="user_id", type="integer", description="用户id") * @ApiReturnParams (name="product.image", type="string", description="商品图片") * @ApiReturnParams (name="product.title", type="string", description="商品名称") * @ApiReturnParams (name="product.sales_price", type="string", description="商品销售价钱") * @ApiReturnParams (name="product.market_price", type="string", description="商品市场价钱") * @ApiReturnParams (name="product.product_id", type="string", description="商品id") * @ApiReturnParams (name="status", type="integer", description="是否还有效") * */ public function favoriteList() { $page = input('page', 1); $pageSize = input('pagesize', 20); $list = (new Favorite)->where(['user_id' => $this->auth->id])->with(['product'])->page($page, $pageSize)->select(); $list = collection($list)->toArray(); foreach ($list as &$item) { if (!empty($item['product'])) { $item['status'] = 1; } else { $item['status'] = 0; $item['product'] = json_decode($item['snapshot'],true); $image = $item['product']['image']; $item['product']['image'] = Config::getImagesFullUrl($image); } unset($item['snapshot']); } $this->success('', $list); } /** * @ApiTitle (商品评论) * @ApiSummary (商品评论) * @ApiMethod (GET) * @ApiHeaders (name=cookie, type=string, required=false, description="用户会话的cookie") * @ApiParams (name="product_id", type="string", required=true, description="商品id") * @ApiParams (name="page", type="integer", required=true, description="页面") * @ApiParams (name="pagesize", type="integer", required=true, description="每页数量") * @ApiReturn ({"code":1,"msg":"","data":[]}) * * @ApiReturnParams (name="id", type="integer", description="评论id") * @ApiReturnParams (name="username", type="string", description="评论人名称") * @ApiReturnParams (name="avatar", type="string", description="评论人头像") * @ApiReturnParams (name="product_id", type="string", description="商品id") * @ApiReturnParams (name="comment", type="string", description="评论内容") * @ApiReturnParams (name="rate", type="integer", description="星星") * @ApiReturnParams (name="order_id", type="string", description="订单id") * @ApiReturnParams (name="spec", type="string", description="评论的规格") * @ApiReturnParams (name="anonymous", type="integer", description="是否匿名") * @ApiReturnParams (name="toptime", type="integer", description="是否置顶") * @ApiReturnParams (name="createtime_text", type="string", description="评论时间") * */ public function evaluate() { $page = input('page', 1); $pageSize = input('pagesize', 20); $productId = input('product_id'); $productId = \addons\unishop\extend\Hashids::decodeHex($productId); // 评价信息 $evaluate = (new Evaluate)->alias('e') ->join('user u', 'e.user_id = u.id') ->where(['e.product_id' => $productId]) ->field('u.username,u.avatar,e.*') ->order(['toptime' => 'desc', 'createtime' => 'desc']) ->page($page, $pageSize) ->select(); if ($evaluate) { $evaluate = collection($evaluate)->append(['createtime_text'])->toArray(); } $this->success('', $evaluate); } }