<?php
namespace App\Controller\Api;
use App\Controller\Api\ApiController;
use Symfony\Component\Routing\Annotation\Route;
use App\Entity\Product;
use App\Entity\ProductCategory;
use App\Entity\UserProductStar;
/**
* @Route("/api", name="api_")
*
* @IgnoreAnnotation("api")
* @IgnoreAnnotation("apiName")
* @IgnoreAnnotation("apiGroup")
* @IgnoreAnnotation("apiVersion")
* @IgnoreAnnotation("apiParam")
* @IgnoreAnnotation("apiSuccessExample")
* @IgnoreAnnotation("apiErrorExample")
*/
class ProudctController extends ApiController
{
/**
* @Route("/home/category", name="categoryHome", options={"ignore"=true})
*
* @api {post} /api/home/category 金刚区分类
* @apiName 金刚区分类
* @apiGroup product
* @apiVersion 1.0.0
*
*
* @apiSuccessExample {json} Success-Response:
* HTTP/1.1 200 OK
* {
* "code": "0",
* "message": "",
* "result":
[{
id: 分类id
name: 名称
image: 图片
},...]
*
* }
*
* @apiErrorExample {json} Error-Response:
* HTTP/1.1 200
* {
* "code": "1",
* "message": "",
* "result": {}
* }
*/
public function category()
{
$categorys = $this->entityManager->getRepository(ProductCategory::class)->createQueryBuilder('u')
->select('u.id, u.name, u.image')
->andWhere('u.level = 1 and u.isHome = 1')->getQuery()->getResult();
foreach ($categorys as &$category) {
$category['image'] = $this->request->getSchemeAndHttpHost() . $category['image'];
}
return $this->json(['code'=>0, 'message'=>'success', 'result'=> $categorys]);
}
/**
* @Route("/home", name="home", options={"ignore"=true})
*
* @api {post} /api/home 首页商品
* @apiName 首页商品
* @apiGroup product
* @apiVersion 1.0.0
*
* @apiParam {NUmber} [page] 分页 默认1
* @apiParam {NUmber} [rows] 每页条数 默认10个
*
* @apiSuccessExample {json} Success-Response:
* HTTP/1.1 200 OK
* {
* "code": "0",
* "message": "",
* "result":
[{
id: 商品id
oldPrice: 原始价格
price: 当前价格
name: 商品名称
image: http://domain.com/图片
}, ...]
*
* }
*
* @apiErrorExample {json} Error-Response:
* HTTP/1.1 200
* {
* "code": "1",
* "message": "",
* "result": {}
* }
*/
public function home()
{
$page = $this->request->request->get('page', 1);
$rows = $this->request->request->get('rows', 10);
$queryBuilder = $this->entityManager->getRepository(Product::class)->createQueryBuilder('u')
->select('u.id, u.name, u.price, u.oldPrice, u.image')
->andWhere('u.isHome = 1 and u.isEnabled = 1');
$pagination = $this->paginator->paginate($queryBuilder, $page, $rows);
$products = $pagination->getItems();
foreach ($products as &$product) {
$product['image'] = $this->request->getSchemeAndHttpHost() . $product['image'];
}
return $this->json(['code'=>0, 'message'=>'success', 'result'=> $products]);
}
/**
* @Route("/category", name="category", options={"ignore"=true})
*
* @api {post} /api/category 分类
* @apiName 分类
* @apiGroup product
* @apiVersion 1.0.0
*
*
* @apiSuccessExample {json} Success-Response:
* HTTP/1.1 200 OK
{
"code": 0,
"message": "success",
"result": [
{
"id": 1,
"image": "https://laiju.hbpt.xyz/uploads/category/6322cc61907a2.jpg",
"name": "猪肉专区",
"erji": [ //二级
{
"id": 4,
"image": "https://laiju.hbpt.xyz/uploads/category/6322ccd6b5902.jpg",
"name": "猪肉1"
},
{
"id": 5,
"image": "https://laiju.hbpt.xyz/uploads/category/6322cce9c3e79.jpg",
"name": "猪肉2"
}
]
},
{
"id": 2,
"image": "https://laiju.hbpt.xyz/uploads/category/6322cc8b78d64.jpg",
"name": "牛肉专区",
"erji": []
},
{
"id": 3,
"image": "https://laiju.hbpt.xyz/uploads/category/6322cc95b1da3.jpg",
"name": "羊肉专区",
"erji": []
}
]
}
*
* @apiErrorExample {json} Error-Response:
* HTTP/1.1 200
* {
* "code": "1",
* "message": "",
* "result": {}
* }
*/
public function categorys()
{
//
$categorys = $this->entityManager->getRepository(ProductCategory::class)->createQueryBuilder('u')
->select('u.id, u.image, u.name')->andWhere('u.level = 1')
->getQuery()->getResult();
$queryBuilder = $this->entityManager->getRepository(ProductCategory::class)->createQueryBuilder('u')
->select('u.id, u.image, u.name')->andWhere('u.parent = :category');
foreach ($categorys as &$category) {
$category['image'] = $this->request->getSchemeAndHttpHost() . $category['image'];
$erji = $queryBuilder->setParameter('category', $category['id'])->getQuery()->getResult();
foreach ($erji as &$v) {
$v['image'] = $this->request->getSchemeAndHttpHost() . $v['image'];
}
$category['erji'] = $erji;
}
return $this->json(['code'=>0, 'message'=>'success', 'result'=> $categorys]);
}
/**
* @Route("/category/erji", name="categoryerji", options={"ignore"=true})
*
* @api {post} /api/category/erji 二级分类
* @apiName 二级分类
* @apiGroup product
* @apiVersion 1.0.0
*
* @apiParam {String} category_id 一级分类id
*
* @apiSuccessExample {json} Success-Response:
* HTTP/1.1 200 OK
{
"code": 0,
"message": "success",
"result": [
{
"id": 4,
"image": "https://laiju.hbpt.xyz/uploads/category/6322ccd6b5902.jpg",
"name": "猪肉1"
},
{
"id": 5,
"image": "https://laiju.hbpt.xyz/uploads/category/6322cce9c3e79.jpg",
"name": "猪肉2"
}
]
}
*
* @apiErrorExample {json} Error-Response:
* HTTP/1.1 200
* {
* "code": "1",
* "message": "",
* "result": {}
* }
*/
public function categoryErji()
{
$category_id = $this->request->request->get('category_id');
if (!$category_id) return $this->json(['code'=>1, 'message'=>'参数不完整']);
$categorys = $this->entityManager->getRepository(ProductCategory::class)->createQueryBuilder('u')
->select('u.id, u.image, u.name')->andWhere('u.parent = :category')->setParameter('category', $category_id)
->getQuery()->getResult();
foreach ($categorys as &$category) {
$category['image'] = $this->request->getSchemeAndHttpHost() . $category['image'];
}
return $this->json(['code'=>0, 'message'=>'success', 'result'=> $categorys]);
}
/**
* @Route("/category/product", name="categoryProduct", options={"ignore"=true})
*
* @api {post} /api/category/product 分类商品
* @apiName 分类商品
* @apiGroup product
* @apiVersion 1.0.0
*
* @apiParam {String} [category_id] 分类id
* @apiParam {String} [price] 0从价格由低到高 1由高到低
* @apiParam {String} [sales] 销量 升序 0 或倒序 1
* @apiParam {String} [lastest] 最新 0从近到远 1从远到近
* @apiParam {NUmber} [page] 分页 默认1
* @apiParam {NUmber} [rows] 每页条数 默认10个
*
* @apiSuccessExample {json} Success-Response:
* HTTP/1.1 200 OK
{
"code": 0,
"message": "success",
"result": [
{
"id": 3,
"oldPrice": "400.00",
"price": "300.00",
"name": "土猪肉3",
"image": "https://laiju.hbpt.xyz/uploads/product/6322d06d538ca.avif",
"sales": 2999 //销量
"comments": 10 //评论数
},
{
"id": 2,
"oldPrice": "300.00",
"price": "200.00",
"name": "土猪肉2",
"image": "https://laiju.hbpt.xyz/uploads/product/6322cf4ddbe6e.avif",
"sales": 2999 //销量
"comments": 10 //评论数
},
{
"id": 1,
"oldPrice": "200.00",
"price": "100.00",
"name": "土猪肉",
"image": "https://laiju.hbpt.xyz/uploads/product/6322cf18381b1.avif",
"sales": 2999 //销量
"comments": 10 //评论数
}
]
}
* @apiErrorExample {json} Error-Response:
* HTTP/1.1 200
* {
* "code": "1",
* "message": "",
* "result": {}
* }
*/
public function categoryProduct()
{
$page = $this->request->request->get('page', 1);
$rows = $this->request->request->get('rows', 10);
$price = $this->request->request->get('price', '');
$sales = $this->request->request->get('sales', '');
$lastest = $this->request->request->get('lastest', 0); //默认
$category_id = $this->request->request->get('category_id');
$queryBuilder = $this->entityManager->getRepository(Product::class)->createQueryBuilder('u')
->leftJoin('u.category', 'c');
if ($sales !== '') {
$queryBuilder->orderBy('u.sales', $sales == 1 ? 'desc' : 'asc');
}
if ($lastest !== '') {
$queryBuilder->orderBy('u.id', $lastest == 0 ? 'desc' : 'asc');
}
if ($price !== '') {
$queryBuilder->orderBy('u.price', $price == 0 ? 'asc' : 'desc');
}
if (!$category_id) {
$queryBuilder->andWhere('u.isHome = 1');
} else {
$queryBuilder->andWhere('c.id = :category or c.parent = :category')->setParameter('category', $category_id);
}
$total = $queryBuilder->select('count(u.id) as count')->getQuery()->getOneOrNullResult();
$queryBuilder->select('u.id, u.oldPrice, u.price, u.name, u.image, u.sales');
$pagination = $this->paginator->paginate($queryBuilder, $page, $rows);
$products = $pagination->getItems();
$qb = $this->entityManager->getRepository('App\Entity\FinanceTradeProductComment')->createQueryBuilder('u')
->select('count(u.id) as count')->andWhere('u.product = :product');
foreach ($products as &$product) {
$product['image'] = $this->request->getSchemeAndHttpHost() . $product['image'];
//评论数
$comments = $qb->setParameter('product', $product['id'])->getQuery()->getOneOrNullResult();
$product['comments'] = $comments['count'] ?: 0;
}
return $this->json(['code'=>0, 'message'=>'success', 'result'=> $products]);
}
/**
* @Route("/product/detail", name="auth_product_detail", options={"ignore"=true})
*
* @api {post} /api/product/detail 商品详情
* @apiName 商品详情
* @apiGroup product
* @apiVersion 1.0.0
*
* @apiParam {String} id 商品id
*
* @apiSuccessExample {json} Success-Response:
* HTTP/1.1 200 OK
* {
* "code": "0",
* "message": "",
* "result": {
id: 商品id
price: 当前价格
shipping: 运费
name: 商品名称
image: http://domain.com/图片
imageList: [http://domain.com/图片, http://domain.com/图片] 图片数组
stock: 库存
sales: 销量
content: 商品详情
comments: 评论条数
stars: 点赞数
star: 是否点赞 1是 0否
descript: 商品描述
}
*
* }
*
* @apiErrorExample {json} Error-Response:
* HTTP/1.1 200
* {
* "code": "1",
* "message": "",
* "result": {}
* }
*/
public function productDetail()
{
$id = $this->request->request->get('id');
if (!$id) return $this->json(['code'=>1, 'message'=> 'id不能为空']);
$product = $this->entityManager->getRepository(Product::class)->createQueryBuilder('u')
->select('u.id, u.price, u.shipping, u.name, u.image, u.stock, u.sales, u.content, u.imageList, u.descript')
->andWhere('u.id = :id and u.isEnabled = 1 ')
->setParameter('id', $id)
->getQuery()->getOneOrNullResult();
if (!$product) return $this->json(['code'=>1, 'message'=>'商品信息不存在']);
$product['image'] = $this->request->getSchemeAndHttpHost() . $product['image'];
foreach ($product['imageList'] as &$v) {
$v = $this->request->getSchemeAndHttpHost() . $v;
}
$comments = $this->entityManager->getRepository('App\Entity\FinanceTradeProductComment')->createQueryBuilder('u')->select('count(u.id) as count')
->andWhere('u.product = :id')->setParameter('id', $id)->getQuery()->getOneOrNullResult();
$product['comments'] = $comments['count'] ?: 0;
$stars = $this->entityManager->getRepository('App\Entity\UserProductStar')->createQueryBuilder('u')->select('count(u.id) as count')
->andWhere('u.product = :id')->setParameter('id', $id)->getQuery()->getOneOrNullResult();
$product['stars'] = $stars['count'] ?: 0;
$productStar = $this->entityManager->getRepository('App\Entity\UserProductStar')->findOneBy(['user'=>$this->getUser(), 'product'=>$id]);
//var_dump($this->getUser());var_dump($id);
$product['star'] = $productStar ? 1 : 0;
$pattern = "/ style=\".*?\"/";
$replacement = "";
$product['content'] = preg_replace($pattern, $replacement, $product['content']);
$exp= ["/height=.{0,5}\s/i", "/width=.{0,5}\s/i"];
$exp_o= ['', ''];
$product['content'] = preg_replace($exp, $exp_o, $product['content']);
$product['content'] = str_replace('<img ', '<img style="width:100%" ', $product['content']);
return $this->json(['code'=>0, 'message'=>'success', 'result'=> $product]);
}
/**
* @Route("/product/comment", name="product_comment", options={"ignore"=true})
*
* @api {post} /api/product/comment 商品评价列表
* @apiName 商品评价列表
* @apiGroup product
* @apiVersion 1.0.0
*
* @apiParam {String} id 商品id
*
* @apiSuccessExample {json} Success-Response:
* HTTP/1.1 200 OK
* {
* "code": "0",
* "message": "",
* "result": {
count: 1000 总评论数
comments: [{
headimg: 用户头像
nickname: 用户昵称
star: 好评情况 1差评2中评3好评
content: 评论内容
images: 评论图片 数组
}, ...]
}
*
* }
*
* @apiErrorExample {json} Error-Response:
* HTTP/1.1 200
* {
* "code": "1",
* "message": "",
* "result": {}
* }
*/
public function productComment()
{
$id = $this->request->request->get('id');
if (!$id) return $this->json(['code'=>1, 'message'=> 'id不能为空']);
$queryBuilder = $this->entityManager->getRepository('App\Entity\FinanceTradeProductComment')->createQueryBuilder('u')
->leftJoin('u.comment', 'c')->leftJoin('u.user', 'uu')
->andWhere('u.product = :id')
->setParameter('id', $id);
$count = $queryBuilder->select('count(u.id) as count')->getQuery()->getOneOrNullResult();
$comments = $queryBuilder->select('uu.nickname, uu.inviteCode, uu.headimg, c.star, c.content, c.images')
->getQuery()->getResult();
foreach ($comments as &$item) {
foreach ($item['images'] as $k => $image) {
$items[$k] = $this->request->getSchemeAndHttpHost() . $image;
}
}
return $this->json(['code'=>0, 'message'=>'success', 'result'=> [
'count' => $count['count'] ?: 0,
'comments' => $comments,
]]);
}
/**
* @Route("/product/star", name="auth_productstar", options={"ignore"=true})
*
* @api {post} /api/product/star 商品点赞
* @apiName 商品点赞
* @apiGroup product
* @apiVersion 1.0.0
*
* @apiParam {String} id 商品id
* @apiParam {String} star 1是点赞 0是取消
*
* @apiSuccessExample {json} Success-Response:
* HTTP/1.1 200 OK
* {
* "code": "0",
* "message": "",
* "result": {
star: 1 已点赞 0已取消
}
*
* }
*
* @apiErrorExample {json} Error-Response:
* HTTP/1.1 200
* {
* "code": "1",
* "message": "",
* "result": {}
* }
*/
public function star()
{
$id = $this->request->request->get('id');
$star = $this->request->request->get('star', 0);
if (!$id) return $this->json(['code'=>1, 'message'=> 'id不能为空']);
$product = $this->entityManager->getRepository(Product::class)->find($id);
if (!$product) return $this->json(['code'=>1, 'message'=> 'id不能为空']);
$productStar = $this->entityManager->getRepository('App\Entity\UserProductStar')->findOneBy(['user'=>$this->getUser(), 'product'=>$product]);
if ($star == 0 && $productStar) {
$this->entityManager->remove($productStar);
$this->entityManager->flush();
}
if ($star == 1 && !$productStar) {
$productStar = new UserProductStar();
$productStar->setUser($this->getUser());
$productStar->setProduct($product);
$this->entityManager->persist($productStar);
$this->entityManager->flush();
}
return $this->json(['code'=>0, 'message'=>'success', 'result'=>[
'star' => $star
]]);
}
}