菜谱项目

FeaturesController.php 20KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472
  1. <?php
  2. namespace App\Api\V1\Controllers;
  3. use App\Models\Category;
  4. use App\Models\Menu;
  5. use App\Models\RecommendTag;
  6. use App\Models\Record;
  7. use App\Models\SearchRecord;
  8. use App\Models\SearchStatistics;
  9. use App\Models\Tag;
  10. use App\Models\UserMessage;
  11. use App\Models\Special;
  12. use App\Models\News;
  13. use App\Models\NewsCategory;
  14. use App\Models\CollectReceipt;
  15. use Illuminate\Http\Request;
  16. use Solr;
  17. use DB;
  18. class FeaturesController extends BaseController
  19. {
  20. //获取类目表
  21. public function getCategoryList(Request $request)
  22. {
  23. $type = $request->get('type');
  24. if ($type != 1 && $type != 0) {
  25. return $this->response->array(self::returnValue(['data' => 'Invalid type'], 1005));
  26. }
  27. $categoryList = Category::selectCategoryList($type);
  28. if (empty($categoryList)) {
  29. return $this->response->array(self::returnValue(['data' => 'Database error'], 9999));
  30. } else {
  31. return $this->response->array(self::returnValue(['data' => $categoryList], 200));
  32. }
  33. }
  34. //获取标签列表
  35. public function getTagList(Request $request)
  36. {
  37. $categoryId = $request->get('category_id');
  38. if (!is_numeric($categoryId)) {
  39. return $this->response->array(self::returnValue(['data' => 'Invalid category id'], 1002));
  40. }
  41. $tagList = Tag::selectTagList($categoryId);
  42. if (empty($tagList)) {
  43. return $this->response->array(self::returnValue(['data' => 'Invalid category id'], 1002));
  44. }
  45. return $this->response->array(self::returnValue(['data' => $tagList], 200));
  46. }
  47. //获取菜单具体信息
  48. public function getMenu(Request $request)
  49. {
  50. $menuId = $request->get('menu_id');
  51. if (!is_numeric($menuId)) {
  52. return $this->response->array(self::returnValue(['data' => 'Invalid menu id'], 1003));
  53. }
  54. $menu = Menu::selectMenu($menuId);
  55. if (empty($menu)) {
  56. return $this->response->array(self::returnValue(['data' => 'Invalid menu id'], 1003));
  57. }
  58. Record::insertViews($menuId);
  59. $init = abs(ceil(crc32($menuId) / 1000000));
  60. $record = Record::selectRecord($menuId);
  61. $menu->collections = $record['collection']+floor($init/50);
  62. $menu->views = $record['view']+$init;
  63. $menu->share = 'http://182.92.118.1:3320/api/features/getMenu';
  64. return $this->response->array(self::returnValue(['data' => $menu], 200));
  65. }
  66. public function addCollection(Request $request)
  67. {
  68. $menuId = $request->get('menu_id');
  69. if (!is_numeric($menuId)) {
  70. return $this->response->array(self::returnValue(['data' => 'Invalid menu id'], 1003));
  71. }
  72. Record::insertCollection($menuId);
  73. return $this->response->array(self::returnValue(['data' => []], 200));
  74. }
  75. //获取精品好菜
  76. public function getRecommend(Request $request)
  77. {
  78. $time = $request->get('page');
  79. if (!is_numeric($time)) {
  80. return $this->response->array(self::returnValue(['data' => 'Invalid page'], 1004));
  81. }
  82. $menuList = Menu::selectRecommend(0, $time);
  83. return $this->response->array(self::returnValue(['data' => $menuList], 200));
  84. }
  85. //获取banner推荐菜品
  86. public function getBannerRecommend(Request $request)
  87. {
  88. $menuList = Menu::selectRecommend(1);
  89. return $this->response->array(self::returnValue(['data' => $menuList], 200));
  90. }
  91. //获取推荐标签
  92. public function getRecommendTag(Request $request)
  93. {
  94. $tagList = RecommendTag::selectRecommendTag();
  95. return $this->response->array(self::returnValue(['data' => $tagList], 200));
  96. }
  97. //solr 查询
  98. protected function select($solrData, Request $request)
  99. {
  100. $time = $request->get('page');
  101. $menuListNum = config('view.menuListNum');
  102. if (!is_numeric($time)) {
  103. return $this->response->array(self::returnValue(['data' => 'Invalid page'], 1004));
  104. }
  105. $solrData = array_merge($solrData, array("fl" => "id,title,url,ingredients", "start" => $time * $menuListNum, "rows" => $menuListNum));
  106. $solr = new Solr();
  107. $menuDataList = $solr->select($solrData);
  108. $menuDataList = $menuDataList['data']['response']['docs'];
  109. foreach ($menuDataList as $v) {
  110. $menuListId[] = $v['id'];
  111. }
  112. $record = Record::selectListRecord($menuListId);
  113. foreach ($menuDataList as &$v) {
  114. $init = abs(ceil(crc32($v['id']) / 1000000));
  115. if (isset($record['collection'][$v['id']])) {
  116. $v['collections'] = $record['collection'][$v['id']] + floor($init / 50);
  117. } else {
  118. $v['collections'] = floor($init / 50);
  119. }
  120. if (isset($record['view'][$v['id']])) {
  121. $v['views'] = $record['view'][$v['id']] + $init;
  122. } else {
  123. $v['views'] = $init;
  124. }
  125. }
  126. unset($v);
  127. return $menuDataList;
  128. }
  129. //搜索食材
  130. public function selectIngredients(Request $request)
  131. {
  132. //ingredients
  133. $value = $request->get('value');
  134. if (empty($value)) {
  135. return $this->response->array(self::returnValue(['data' => 'Invalid value'], 1006));
  136. }
  137. $this->addSearchValue($value, 2);
  138. $solrData = array("q" => 'ingredients:' . $value . '');
  139. $menuDataList = $this->select($solrData, $request);
  140. return $this->response->array(self::returnValue(['data' => $menuDataList], 200));
  141. }
  142. //搜索标签
  143. public function selectTag(Request $request)
  144. {
  145. $value = $request->get('value');
  146. if (empty($value)) {
  147. return $this->response->array(self::returnValue(['data' => 'Invalid value'], 1006));
  148. }
  149. $this->addSearchValue($value, 1);
  150. $solrData = array("q" => 'tags:' . $value . '');
  151. $menuDataList = $this->select($solrData, $request);
  152. return $this->response->array(self::returnValue(['data' => $menuDataList], 200));
  153. }
  154. //全搜索
  155. public function selectAll(Request $request)
  156. {
  157. $value = $request->get('value');
  158. if (empty($value)) {
  159. return $this->response->array(self::returnValue(['data' => 'Invalid value'], 1006));
  160. }
  161. $this->addSearchValue($value);
  162. $solrData = array("q" => "title:$value tags:$value ingredients $value", "q.op" => "or");
  163. $menuDataList = $this->select($solrData, $request);
  164. return $this->response->array(self::returnValue(['data' => $menuDataList], 200));
  165. }
  166. public function feedBack(Request $request)
  167. {
  168. $message = $request->get('message');
  169. if (empty($message)) {
  170. return $this->response->array(self::returnValue(['data' => 'Invalid message'], 1009));
  171. }
  172. UserMessage::addFeedBack($request);
  173. return $this->response->array(self::returnValue(['data' => []], 200));
  174. }
  175. public function getHotSearch()
  176. {
  177. $data = SearchStatistics::selectHotSearch();
  178. if (!$data) {
  179. return $this->response->array(self::returnValue(['data' => 'Database error'], 9999));
  180. }
  181. return $this->response->array(self::returnValue(['data' => $data], 200));
  182. }
  183. protected function addSearchValue($value, $type = 0)
  184. {
  185. SearchRecord::insertSearchValue($value, $type);
  186. }
  187. public function startsWith($str, $prefix)
  188. {
  189. for ($i = 0; $i < strlen($prefix); ++$i) {
  190. if ($prefix[$i] !== $str[$i]) {
  191. return false;
  192. }
  193. }
  194. return true;
  195. }
  196. //早中晚专题
  197. public function earlyMiddleAndLateTheme(Request $request){
  198. $data=Special::whereIn('title',['上午','中午','下午'])->get();
  199. if (!$data) {
  200. return $this->response->array(self::returnValue(['data' => 'Database error'], 9999));
  201. }
  202. $data=json_decode(json_encode($data),true);
  203. foreach($data as $key=>$value){
  204. $data[$key]['url']=config('constants.HOST_URL').$value['url'];
  205. }
  206. return $this->response->array(self::returnValue(['data' => $data], 200));
  207. }
  208. //其他专题
  209. /**
  210. * @param Request $request
  211. * @return mixed
  212. */
  213. public function otherTheme(Request $request){
  214. $today=strtotime(date('Y-m-d'));
  215. $data=Special::whereNotIn('title',['上午','中午','下午'])->where('status',1)->where('releaseTime','<',$today)->get();
  216. $data=json_decode(json_encode($data),true);
  217. foreach($data as $key=>$value){
  218. $data[$key]['url']=config('constants.HOST_URL').$value['url'];
  219. }
  220. $json_menu_idarr=Special::whereNotIn('title',['上午','中午','下午'])->where('status',1)->where('releaseTime','<',$today)->pluck('contain_recipes');
  221. $json_menu_idarr=json_decode(json_encode($json_menu_idarr),true);
  222. $initArr=array();
  223. foreach($json_menu_idarr as $item){
  224. if($item){
  225. $initArr=array_merge($initArr,explode(',',$item));
  226. }
  227. }
  228. $initArr=array_unique($initArr);
  229. $menuAll=DB::table('menu')->whereIn('id',$initArr)->where('status',1)->get();
  230. $readArr=Menu::getReadNum($initArr);
  231. $discountArr=Menu::getCollectNum($initArr);
  232. $menuAll=json_decode(json_encode($menuAll),true);
  233. foreach($menuAll as $key=>$value){
  234. if(!$this->startsWith($value['url'],'http') && $value['url'] !='None' && $value['url']!=''){
  235. $menuAll[$key]['url']=config('constants.HOST_URL').$value['url'];
  236. }
  237. if(array_key_exists($value['id'],$readArr)){
  238. $menuAll[$key]['readingVolume']=intval(abs(crc32($value['id'])/1000000))+$readArr[$value['id']];
  239. }else{
  240. $menuAll[$key]['readingVolume']=intval(abs(crc32($value['id'])/1000000));
  241. }
  242. if(array_key_exists($value['id'],$discountArr)){
  243. $menuAll[$key]['collectVolume']=intval(abs(crc32($value['id'])/100000000))+$discountArr[$value['id']];
  244. }else{
  245. $menuAll[$key]['collectVolume']=intval(abs(crc32($value['id'])/100000000));
  246. }
  247. }
  248. $middleArr=array();
  249. foreach($menuAll as $item){
  250. $middleArr["".$item['id']]=$item;
  251. }
  252. foreach($data as $key=>$item){
  253. if($item['contain_recipes']){
  254. foreach(explode(',',$item['contain_recipes']) as $inneritem){
  255. $data[$key]['menuList'][]=$middleArr[$inneritem];
  256. }
  257. }
  258. }
  259. return $this->response->array(self::returnValue(['data' => $data], 200));
  260. }
  261. public function theLastRecipes(Request $request){
  262. $data=Menu::where('status',1)->orderBy('created_at','desc')->limit(50)->get();
  263. $initArr=Menu::where('status',1)->orderBy('created_at','desc')->limit(50)->pluck('menu_id');
  264. $initArr=json_decode(json_encode($initArr),true);
  265. $readArr=Menu::getReadNum($initArr);
  266. $discountArr=Menu::getCollectNum($initArr);
  267. if (!$data) {
  268. return $this->response->array(self::returnValue(['data' => 'Database error'], 9999));
  269. }
  270. $data=json_decode(json_encode($data),true);
  271. foreach($data as $key=>$value){
  272. if(!$this->startsWith($value['url'],'http') && $value['url'] !='None' && $value['url']!=''){
  273. $data[$key]['url']=config('constants.HOST_URL').$value['url'];
  274. }
  275. if(array_key_exists($value['id'],$readArr)){
  276. $data[$key]['readingVolume']=intval(abs(crc32($value['id'])/1000000))+$readArr[$value['id']];
  277. }else{
  278. $data[$key]['readingVolume']=intval(abs(crc32($value['id'])/1000000));
  279. }
  280. if(array_key_exists($value['id'],$discountArr)){
  281. $data[$key]['collectVolume']=intval(abs(crc32($value['id'])/100000000))+$discountArr[$value['id']];
  282. }else{
  283. $data[$key]['collectVolume']=intval(abs(crc32($value['id'])/100000000));
  284. }
  285. }
  286. return $this->response->array(self::returnValue(['data' => $data], 200));
  287. }
  288. public function menuList(Request $request){
  289. $id=$request->input('id');
  290. $special=Special::where('id',$id)->first();
  291. if($special['title']=='上午' || $special['title']=='中午' || $special['title']=='下午'){
  292. $contain_recipes_time=json_decode($special['contain_recipes_time'],true);
  293. arsort($contain_recipes_time);
  294. $idArr=array();
  295. $today=date('Y-m-d');
  296. foreach($contain_recipes_time as $key=>$value){
  297. if($value < $today){
  298. $idArr[]=$key;
  299. }
  300. }
  301. $lastarr=explode(',',$special['contain_recipes']);
  302. $idArr=array_intersect($idArr,$lastarr);
  303. }else{
  304. $idArr=explode(',',$special['contain_recipes']);
  305. }
  306. $menuList=Menu::whereIn('id',$idArr)->get();
  307. $readArr=Menu::getReadNum($idArr);
  308. $discountArr=Menu::getCollectNum($idArr);
  309. $menuList=json_decode(json_encode($menuList),true);
  310. foreach($menuList as $key=>$value){
  311. if(!$this->startsWith($value['url'],'http') && $value['url'] !='None' && $value['url']!=''){
  312. $menuList[$key]['url']=config('constants.HOST_URL').$value['url'];
  313. }
  314. if(array_key_exists($value['id'],$readArr)){
  315. $menuList[$key]['readingVolume']=intval(abs(crc32($value['id'])/1000000))+$readArr[$value['id']];
  316. }else{
  317. $menuList[$key]['readingVolume']=intval(abs(crc32($value['id'])/1000000));
  318. }
  319. if(array_key_exists($value['id'],$discountArr)){
  320. $menuList[$key]['collectVolume']=intval(abs(crc32($value['id'])/100000000))+$discountArr[$value['id']];
  321. }else{
  322. $menuList[$key]['collectVolume']=intval(abs(crc32($value['id'])/100000000));
  323. }
  324. }
  325. return $this->response->array(self::returnValue(['data' => $menuList], 200));
  326. }
  327. public function menuDetail(Request $request){
  328. $id=$request->input('id');
  329. $menu=Menu::where('id',$id)->first();
  330. if(!$this->startsWith($menu['url'],'http') && $menu['url'] !='None' && $menu['url']!=''){
  331. $menu['url']=config('constants.HOST_URL').$menu['url'];
  332. }
  333. $init=array();
  334. $list=explode(';',$menu['ingredients']);
  335. foreach($list as $item){
  336. $origin=explode(',',$item);
  337. $init[$origin[0]]=$origin[1];
  338. }
  339. $menu['ingredients']=$init;
  340. $token = $request->headers->get('token');
  341. if($token==''){
  342. $menu['is_collect']=0;
  343. }else{
  344. $user = DB::table('users')->where('token', $token)->first();
  345. $tokendata= !empty($user) ? $user : null;
  346. if(empty($tokendata) || ($token!=$tokendata->token && (($tokendata->last_login_time - 30 *86400) > time()))) {
  347. $menu['is_collect']=0;
  348. }else{
  349. $user_id = Menu::getUserId($token);
  350. //查询是否收藏过该商品 收藏过 - 取消收藏 ; 未收藏 - 进行收藏操作
  351. $is_collect = Menu::isCollectTicket($user_id,$id);
  352. if ($is_collect ==1 ){
  353. $menu['is_collect']=1;
  354. }else{
  355. //未收藏该商品,进行收藏
  356. $menu['is_collect']=0;
  357. }
  358. }
  359. }
  360. $menuDetail=DB::table('menu_step')->where('menu_id',$id)->get();
  361. $menuDetail=json_decode(json_encode($menuDetail),true);
  362. foreach($menuDetail as $key=>$value){
  363. if(!$this->startsWith($value['url'],'http') && $value['url'] !='None' && $value['url']!=''){
  364. $menuDetail[$key]['url']=config('constants.HOST_URL').$value['url'];
  365. }
  366. }
  367. return $this->response->array(self::returnValue(['data' => $menu,'detailData'=>$menuDetail], 200));
  368. }
  369. public function articleList(Request $request){
  370. $page=$request->has('page')?$request->input('page'):1;
  371. $start=intval((intval($page)-1)*intval(20));
  372. $type=NewsCategory::pluck('name','abbreviation');
  373. $data=News::where('status',1)->select('id','imgurl','title','createTime','category','readNum')->orderBy('createTime','desc')->offset($start)->limit(20)->get();
  374. $data=json_decode(json_encode($data),true);
  375. foreach($data as $key=>$item){
  376. $data[$key]['category']=$type[$item['category']];
  377. if(!$this->startsWith($item['imgurl'],'http') && $item['imgurl'] !='None' && $item['imgurl']!=''){
  378. $data[$key]['imgurl']=config('constants.HOST_URL').$item['imgurl'];
  379. }
  380. }
  381. return $this->response->array(self::returnValue(['data' => $data], 200));
  382. }
  383. public function articleDetail(Request $request){
  384. $id=$request->input('id');
  385. $articleDetail=News::where('id',$id)->first();
  386. $articleDetail=json_decode(json_encode($articleDetail),true);
  387. if(!$this->startsWith($articleDetail['imgurl'],'http') && $articleDetail['imgurl'] !='None' && $articleDetail['imgurl']!=''){
  388. $articleDetail['imgurl']=config('constants.HOST_URL').$articleDetail['imgurl'];
  389. }
  390. $type=NewsCategory::pluck('name','abbreviation');
  391. $articleDetail['category']=$type[$articleDetail['category']];
  392. $articleDetail['content'] = str_replace(array("\r\n", "\r", "\n"), "", $articleDetail['content']);
  393. $articleDetail['content'] = str_replace(array("/ueditor/php/upload/"), config('constants.HOST_URL')."/ueditor/php/upload/", $articleDetail['content']);
  394. return $this->response->array(self::returnValue(['data' => $articleDetail], 200));
  395. }
  396. public function collectRecipes(Request $request){
  397. $token=$request->header('token');
  398. $user=DB::table('user')->where('token',$token)->first();
  399. if(count($user)){
  400. $data['user_id']=$user('user_id');
  401. }else{
  402. return $this->response->array(self::returnValue(['data' => 'user is not found'], 400));
  403. }
  404. $data['menu_id']=$request->input('menu_id');
  405. $data['create_time']=date("Y-m-d H:i:s",time());
  406. $data=DB::table('collect_recipes')->where('user_id',$data['user_id'])->where('menu_id',$data['menu_id'])->first();
  407. if($data){
  408. if($data['status']==1){
  409. $status=0;
  410. }else{
  411. $status=1;
  412. }
  413. $res=DB::table('collect_recipes')->where('user_id',$data['user_id'])->where('menu_id',$data['menu_id'])->update(['status'=>$status,'create_time'=>$data['create_time']]);
  414. }else{
  415. DB::table('collect_recipes')->insert($data);
  416. }
  417. return $this->response->array(self::returnValue(['data' => '收藏成功'], 200));
  418. }
  419. public function receiptPersonList(Request $request){
  420. $user_id=$request->input('user_id');
  421. $list=DB::table('collect_recipes')->where('user_id',$user_id)->pluck('menu_id');
  422. $menuList=Menu::whereIn('id',$list)->get();
  423. $readArr=Menu::getReadNum($list);
  424. $discountArr=Menu::getCollectNum($list);
  425. $menuList=json_decode(json_encode($menuList),true);
  426. foreach($menuList as $key=>$value){
  427. if(!$this->startsWith($value['url'],'http') && $value['url'] !='None' && $value['url']!=''){
  428. $menuList[$key]['url']=config('constants.HOST_URL').$value['url'];
  429. }
  430. if(array_key_exists($value['id'],$readArr)){
  431. $menuList[$key]['readingVolume']=intval(abs(crc32($value['id'])/1000000))+$readArr[$value['id']];
  432. }else{
  433. $menuList[$key]['readingVolume']=intval(abs(crc32($value['id'])/1000000));
  434. }
  435. if(array_key_exists($value['id'],$discountArr)){
  436. $menuList[$key]['collectVolume']=intval(abs(crc32($value['id'])/100000000))+$discountArr[$value['id']];
  437. }else{
  438. $menuList[$key]['collectVolume']=intval(abs(crc32($value['id'])/100000000));
  439. }
  440. }
  441. return $this->response->array(self::returnValue(['data' => $menuList], 200));
  442. }
  443. public function menuRead(Request $request){
  444. $menu_id=$request->input('menu_id');
  445. $res=DB::table('menu_read_num')->where('menu_id',$menu_id)->first();
  446. if($res){
  447. $result=DB::table('menu_read_num')->where('menu_id',$menu_id)->increment('num');
  448. }else{
  449. $data['menu_id']=$menu_id;
  450. $result=DB::table('menu_read_num')->insert($data);
  451. }
  452. return $this->response->array(self::returnValue(['data' => '阅读成功'], 200));
  453. }
  454. }