菜谱项目

FeaturesController.php 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  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 Illuminate\Http\Request;
  15. use Solr;
  16. use DB;
  17. class FeaturesController extends BaseController
  18. {
  19. //获取类目表
  20. public function getCategoryList(Request $request)
  21. {
  22. $type = $request->get('type');
  23. if ($type != 1 && $type != 0) {
  24. return $this->response->array(self::returnValue(['data' => 'Invalid type'], 1005));
  25. }
  26. $categoryList = Category::selectCategoryList($type);
  27. if (empty($categoryList)) {
  28. return $this->response->array(self::returnValue(['data' => 'Database error'], 9999));
  29. } else {
  30. return $this->response->array(self::returnValue(['data' => $categoryList], 200));
  31. }
  32. }
  33. //获取标签列表
  34. public function getTagList(Request $request)
  35. {
  36. $categoryId = $request->get('category_id');
  37. if (!is_numeric($categoryId)) {
  38. return $this->response->array(self::returnValue(['data' => 'Invalid category id'], 1002));
  39. }
  40. $tagList = Tag::selectTagList($categoryId);
  41. if (empty($tagList)) {
  42. return $this->response->array(self::returnValue(['data' => 'Invalid category id'], 1002));
  43. }
  44. return $this->response->array(self::returnValue(['data' => $tagList], 200));
  45. }
  46. //获取菜单具体信息
  47. public function getMenu(Request $request)
  48. {
  49. $menuId = $request->get('menu_id');
  50. if (!is_numeric($menuId)) {
  51. return $this->response->array(self::returnValue(['data' => 'Invalid menu id'], 1003));
  52. }
  53. $menu = Menu::selectMenu($menuId);
  54. if (empty($menu)) {
  55. return $this->response->array(self::returnValue(['data' => 'Invalid menu id'], 1003));
  56. }
  57. Record::insertViews($menuId);
  58. $init = abs(ceil(crc32($menuId) / 1000000));
  59. $record = Record::selectRecord($menuId);
  60. $menu->collections = $record['collection']+floor($init/50);
  61. $menu->views = $record['view']+$init;
  62. $menu->share = 'http://182.92.118.1:3320/api/features/getMenu';
  63. return $this->response->array(self::returnValue(['data' => $menu], 200));
  64. }
  65. public function addCollection(Request $request)
  66. {
  67. $menuId = $request->get('menu_id');
  68. if (!is_numeric($menuId)) {
  69. return $this->response->array(self::returnValue(['data' => 'Invalid menu id'], 1003));
  70. }
  71. Record::insertCollection($menuId);
  72. return $this->response->array(self::returnValue(['data' => []], 200));
  73. }
  74. //获取精品好菜
  75. public function getRecommend(Request $request)
  76. {
  77. $time = $request->get('page');
  78. if (!is_numeric($time)) {
  79. return $this->response->array(self::returnValue(['data' => 'Invalid page'], 1004));
  80. }
  81. $menuList = Menu::selectRecommend(0, $time);
  82. return $this->response->array(self::returnValue(['data' => $menuList], 200));
  83. }
  84. //获取banner推荐菜品
  85. public function getBannerRecommend(Request $request)
  86. {
  87. $menuList = Menu::selectRecommend(1);
  88. return $this->response->array(self::returnValue(['data' => $menuList], 200));
  89. }
  90. //获取推荐标签
  91. public function getRecommendTag(Request $request)
  92. {
  93. $tagList = RecommendTag::selectRecommendTag();
  94. return $this->response->array(self::returnValue(['data' => $tagList], 200));
  95. }
  96. //solr 查询
  97. protected function select($solrData, Request $request)
  98. {
  99. $time = $request->get('page');
  100. $menuListNum = config('view.menuListNum');
  101. if (!is_numeric($time)) {
  102. return $this->response->array(self::returnValue(['data' => 'Invalid page'], 1004));
  103. }
  104. $solrData = array_merge($solrData, array("fl" => "id,title,url,ingredients", "start" => $time * $menuListNum, "rows" => $menuListNum));
  105. $solr = new Solr();
  106. $menuDataList = $solr->select($solrData);
  107. $menuDataList = $menuDataList['data']['response']['docs'];
  108. foreach ($menuDataList as $v) {
  109. $menuListId[] = $v['id'];
  110. }
  111. $record = Record::selectListRecord($menuListId);
  112. foreach ($menuDataList as &$v) {
  113. $init = abs(ceil(crc32($v['id']) / 1000000));
  114. if (isset($record['collection'][$v['id']])) {
  115. $v['collections'] = $record['collection'][$v['id']] + floor($init / 50);
  116. } else {
  117. $v['collections'] = floor($init / 50);
  118. }
  119. if (isset($record['view'][$v['id']])) {
  120. $v['views'] = $record['view'][$v['id']] + $init;
  121. } else {
  122. $v['views'] = $init;
  123. }
  124. }
  125. unset($v);
  126. return $menuDataList;
  127. }
  128. //搜索食材
  129. public function selectIngredients(Request $request)
  130. {
  131. //ingredients
  132. $value = $request->get('value');
  133. if (empty($value)) {
  134. return $this->response->array(self::returnValue(['data' => 'Invalid value'], 1006));
  135. }
  136. $this->addSearchValue($value, 2);
  137. $solrData = array("q" => 'ingredients:' . $value . '');
  138. $menuDataList = $this->select($solrData, $request);
  139. return $this->response->array(self::returnValue(['data' => $menuDataList], 200));
  140. }
  141. //搜索标签
  142. public function selectTag(Request $request)
  143. {
  144. $value = $request->get('value');
  145. if (empty($value)) {
  146. return $this->response->array(self::returnValue(['data' => 'Invalid value'], 1006));
  147. }
  148. $this->addSearchValue($value, 1);
  149. $solrData = array("q" => 'tags:' . $value . '');
  150. $menuDataList = $this->select($solrData, $request);
  151. return $this->response->array(self::returnValue(['data' => $menuDataList], 200));
  152. }
  153. //全搜索
  154. public function selectAll(Request $request)
  155. {
  156. $value = $request->get('value');
  157. if (empty($value)) {
  158. return $this->response->array(self::returnValue(['data' => 'Invalid value'], 1006));
  159. }
  160. $this->addSearchValue($value);
  161. $solrData = array("q" => "title:$value tags:$value ingredients $value", "q.op" => "or");
  162. $menuDataList = $this->select($solrData, $request);
  163. return $this->response->array(self::returnValue(['data' => $menuDataList], 200));
  164. }
  165. public function feedBack(Request $request)
  166. {
  167. $message = $request->get('message');
  168. if (empty($message)) {
  169. return $this->response->array(self::returnValue(['data' => 'Invalid message'], 1009));
  170. }
  171. UserMessage::addFeedBack($request);
  172. return $this->response->array(self::returnValue(['data' => []], 200));
  173. }
  174. public function getHotSearch()
  175. {
  176. $data = SearchStatistics::selectHotSearch();
  177. if (!$data) {
  178. return $this->response->array(self::returnValue(['data' => 'Database error'], 9999));
  179. }
  180. return $this->response->array(self::returnValue(['data' => $data], 200));
  181. }
  182. protected function addSearchValue($value, $type = 0)
  183. {
  184. SearchRecord::insertSearchValue($value, $type);
  185. }
  186. public function startsWith($str, $prefix)
  187. {
  188. for ($i = 0; $i < strlen($prefix); ++$i) {
  189. if ($prefix[$i] !== $str[$i]) {
  190. return false;
  191. }
  192. }
  193. return true;
  194. }
  195. //早中晚专题
  196. public function earlyMiddleAndLateTheme(Request $request){
  197. $data=Special::whereIn('title',['上午','中午','下午'])->get();
  198. if (!$data) {
  199. return $this->response->array(self::returnValue(['data' => 'Database error'], 9999));
  200. }
  201. $data=json_decode(json_encode($data),true);
  202. foreach($data as $key=>$value){
  203. $data[$key]['url']=config('constants.HOST_URL').$value['url'];
  204. }
  205. return $this->response->array(self::returnValue(['data' => $data], 200));
  206. }
  207. //其他专题
  208. /**
  209. * @param Request $request
  210. * @return mixed
  211. */
  212. public function otherTheme(Request $request){
  213. $today=strtotime(date('Y-m-d'));
  214. $data=Special::whereNotIn('title',['上午','中午','下午'])->where('status',1)->where('releaseTime','<',$today)->get();
  215. $data=json_decode(json_encode($data),true);
  216. foreach($data as $key=>$value){
  217. $data[$key]['url']=config('constants.HOST_URL').$value['url'];
  218. }
  219. $json_menu_idarr=Special::whereNotIn('title',['上午','中午','下午'])->where('status',1)->pluck('contain_recipes');
  220. $json_menu_idarr=json_decode(json_encode($json_menu_idarr),true);
  221. $initArr=array();
  222. foreach($json_menu_idarr as $item){
  223. if($item){
  224. $initArr=array_merge($initArr,explode(',',$item));
  225. }
  226. }
  227. $initArr=array_unique($initArr);
  228. $menuAll=DB::table('menu')->whereIn('id',$initArr)->where('status',1)->get();
  229. $menuAll=json_decode(json_encode($menuAll),true);
  230. foreach($menuAll as $key=>$value){
  231. if(!$this->startsWith($value['url'],'http') && $value['url'] !='None' && $value['url']!=''){
  232. $menuAll[$key]['url']=config('constants.HOST_URL').$value['url'];
  233. }
  234. }
  235. $middleArr=array();
  236. foreach($menuAll as $item){
  237. $middleArr["".$item['id']]=$item;
  238. }
  239. foreach($data as $key=>$item){
  240. if($item['contain_recipes']){
  241. foreach(explode(',',$item['contain_recipes']) as $inneritem){
  242. $data[$key]['menuList'][]=$middleArr[$inneritem];
  243. }
  244. }
  245. }
  246. return $this->response->array(self::returnValue(['data' => $data], 200));
  247. }
  248. public function theLastRecipes(Request $request){
  249. $data=Menu::where('status',1)->orderBy('created_at','desc')->limit(50)->get();
  250. if (!$data) {
  251. return $this->response->array(self::returnValue(['data' => 'Database error'], 9999));
  252. }
  253. $data=json_decode(json_encode($data),true);
  254. foreach($data as $key=>$value){
  255. if(!$this->startsWith($value['url'],'http') && $value['url'] !='None' && $value['url']!=''){
  256. $data[$key]['url']=config('constants.HOST_URL').$value['url'];
  257. }
  258. }
  259. return $this->response->array(self::returnValue(['data' => $data], 200));
  260. }
  261. public function menuList(Request $request){
  262. $id=$request->input('id');
  263. $special=Special::where('id',$id)->first();
  264. if($special['title']=='上午' || $special['title']=='中午' || $special['title']=='下午'){
  265. $contain_recipes_time=json_decode($special['contain_recipes_time'],true);
  266. arsort($contain_recipes_time);
  267. $idArr=array();
  268. $today=date('Y-m-d');
  269. foreach($contain_recipes_time as $key=>$value){
  270. if($value < $today){
  271. $idArr[]=$key;
  272. }
  273. }
  274. $lastarr=explode(',',$special['contain_recipes']);
  275. $idArr=array_intersect($idArr,$lastarr);
  276. }else{
  277. $idArr=explode(',',$special['contain_recipes']);
  278. }
  279. $menuList=Menu::whereIn('id',$idArr)->get();
  280. $menuList=json_decode(json_encode($menuList),true);
  281. foreach($menuList as $key=>$value){
  282. if(!$this->startsWith($value['url'],'http') && $value['url'] !='None' && $value['url']!=''){
  283. $menuList[$key]['url']=config('constants.HOST_URL').$value['url'];
  284. }
  285. }
  286. return $this->response->array(self::returnValue(['data' => $menuList], 200));
  287. }
  288. public function menuDetail(Request $request){
  289. $id=$request->input('id');
  290. $menu=Menu::where('id',$id)->first();
  291. if(!$this->startsWith($menu['url'],'http') && $menu['url'] !='None' && $menu['url']!=''){
  292. $menu['url']=config('constants.HOST_URL').$menu['url'];
  293. }
  294. $init=array();
  295. $list=explode(';',$menu['ingredients']);
  296. foreach($list as $item){
  297. $origin=explode(',',$item);
  298. $init[$origin[0]]=$origin[1];
  299. }
  300. $menu['ingredients']=$init;
  301. $menuDetail=DB::table('menu_step')->where('menu_id',$id)->get();
  302. $menuDetail=json_decode(json_encode($menuDetail),true);
  303. foreach($menuDetail as $key=>$value){
  304. if(!$this->startsWith($value['url'],'http') && $value['url'] !='None' && $value['url']!=''){
  305. $menuDetail[$key]['url']=config('constants.HOST_URL').$value['url'];
  306. }
  307. }
  308. return $this->response->array(self::returnValue(['data' => $menu,'detailData'=>$menuDetail], 200));
  309. }
  310. public function articleList(Request $request){
  311. $page=$request->has('page')?$request->input('page'):1;
  312. $start=intval((intval($page)-1)*intval(20));
  313. $type=NewsCategory::pluck('name','abbreviation');
  314. $data=News::where('status',1)->select('id','imgurl','title','createTime','category','readNum')->orderBy('createTime','desc')->offset($start)->limit(20)->get();
  315. $data=json_decode(json_encode($data),true);
  316. foreach($data as $key=>$item){
  317. $data[$key]['category']=$type[$item['category']];
  318. if(!$this->startsWith($item['imgurl'],'http') && $item['imgurl'] !='None' && $item['imgurl']!=''){
  319. $data[$key]['imgurl']=config('constants.HOST_URL').$item['imgurl'];
  320. }
  321. }
  322. return $this->response->array(self::returnValue(['data' => $data], 200));
  323. }
  324. public function articleDetail(Request $request){
  325. $id=$request->input('id');
  326. $articleDetail=News::where('id',$id)->first();
  327. $articleDetail=json_decode(json_encode($articleDetail),true);
  328. if(!$this->startsWith($articleDetail['imgurl'],'http') && $articleDetail['imgurl'] !='None' && $articleDetail['imgurl']!=''){
  329. $articleDetail['imgurl']=config('constants.HOST_URL').$articleDetail['imgurl'];
  330. }
  331. $type=NewsCategory::pluck('name','abbreviation');
  332. $articleDetail['category']=$type[$articleDetail['category']];
  333. $articleDetail['content'] = str_replace(array("\r\n", "\r", "\n"), "", $articleDetail['content']);
  334. $articleDetail['content'] = str_replace(array("/ueditor/php/upload/"), config('constants.HOST_URL')."/ueditor/php/upload/", $articleDetail['content']);
  335. return $this->response->array(self::returnValue(['data' => $articleDetail], 200));
  336. }
  337. }