IndexController.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. <?php
  2. namespace App\Web\Controllers;
  3. use App\Exceptions\ApiException;
  4. use App\Http\Controllers\BaseController;
  5. use App\Web\Services\BlogService;
  6. use App\Web\Services\WebService;
  7. use App\Web\Services\WebUtmService;
  8. use Illuminate\Http\Request;
  9. use Illuminate\Support\Facades\Blade;
  10. use Illuminate\Support\Facades\View;
  11. class IndexController extends BaseController
  12. {
  13. protected $webService = null;
  14. protected $blogService = null;
  15. protected $webUtmService;
  16. /**
  17. * 构造函数
  18. * UserController constructor.
  19. * @param WebService $webService
  20. * @param BlogService $blogService
  21. */
  22. public function __construct(WebService $webService, BlogService $blogService, WebUtmService $webUtmService)
  23. {
  24. $this->webUtmService = $webUtmService;
  25. $this->webService=$webService;
  26. $this->blogService=$blogService;
  27. }
  28. /**
  29. * 路由公共入口
  30. */
  31. public function index(Request $request)
  32. {
  33. $urla = $request->route("module", "home"); //模块
  34. $urla = urldecode($urla);
  35. //是否开启广告统计功能
  36. if(config('app.is_utm')) {
  37. $utmParams = $request->only(['campaign_id', 'campaign_name', 'campaign_source', 'campaign_term', 'campaign_medium', 'campaign_content']);
  38. $clientIp = $request->getClientIp();
  39. $clientHost = $request->getHttpHost();
  40. $clientPath = $request->path();
  41. $this->webUtmService->statisticAnalysis($utmParams, $clientIp, $clientHost, $clientPath);
  42. }
  43. if ($urla == 'sitemap.xml') {
  44. $xmlStr = $this->webService->getSiteMap();
  45. return response($xmlStr)->withHeaders([
  46. 'Content-Type' => 'text/xml; charset=UTF-8'
  47. ]);
  48. }
  49. if ($urla == 'robots.txt') {
  50. $str = "User-agent: *" . "\r\n" . "Allow: /";
  51. $filename = "robots.txt";
  52. header("Content-Type: application/octet-stream");
  53. header('Content-Disposition: attachment; filename="' . $filename . '"');
  54. echo $str;
  55. die;
  56. }
  57. $pageRenderData = $this->webService->getWebPageRenderData($urla);
  58. // print_r($pageRenderData);die;
  59. $requestParams=$request->all();
  60. if(!empty($pageRenderData['route_path'])){
  61. $view=$pageRenderData['route_path'];
  62. } else {
  63. $view=$urla.'.index';
  64. $pageRenderData = [];
  65. }
  66. if (!View::exists($view)) {
  67. //视图不存在,跳转到404页面
  68. $errorPage= $this->webService->getStaticPageInfo(['route_path'=>'404.index']);
  69. if(!empty($errorPage['urla'])){
  70. $redirectUrl='/'.$errorPage['urla'];
  71. }else{
  72. $redirectUrl='/404';
  73. }
  74. return redirect($redirectUrl);
  75. }
  76. $pageRenderData['global_seo_data']=$this->webService->getGlobalSeo();
  77. $pageRenderData['menu_data']=$this->webService->getWebMenu();
  78. $pageRenderData['product_type_menu']=$this->webService->getProductTypeMenu();
  79. $pageRenderData['product_tag_list']=$this->webService->getProductTagRenderData();
  80. $pageRenderData['plate_type_menu'] = $this->webService->getPlateTypeMenu();
  81. $pageRenderData['meeting_type_menu'] = $this->webService->getMeetingTypeMenu();
  82. $pageRenderData['urla']=$urla;
  83. $hostUrl= config('app.url');
  84. $pageRenderData['location_url']=$hostUrl.'/'.$urla;
  85. $pageRenderData['canonical_url']=config('app.web_url').'/'.$urla;
  86. if(!empty($requestParams)) {
  87. $pageRenderData = array_merge($pageRenderData, $requestParams);
  88. }
  89. $request_scheme = empty($_SERVER['REQUEST_SCHEME']) ? 'http' : $_SERVER['REQUEST_SCHEME'];
  90. $pageRenderData['request_scheme']=$request_scheme;
  91. //获取文章列表页面数据
  92. $pageRenderData['page'] = $request->input('page', 1);
  93. if (empty($pageRenderData['head_menu'])) {
  94. $pageRenderData['head_menu'] = [];
  95. }
  96. if (empty($pageRenderData['page_content'])) {
  97. $pageRenderData['page_content'] = [];
  98. }
  99. // dd($pageRenderData);
  100. return view($view, $pageRenderData);
  101. }
  102. /**
  103. * @param string blade 组件名称
  104. * @param string view_file 视图文件
  105. * @return mixed
  106. * @throws \App\Base\Exceptions\ApiException
  107. * @throws \Illuminate\Validation\ValidationException
  108. * @api get /blade 获取渲染后的组件html内容
  109. * @group 客户端 公共接口
  110. * @successExample
  111. * {"ret":0,"msg":"success","data":'html'}
  112. */
  113. public function blade(Request $request)
  114. {
  115. $this->validate($request, [
  116. 'blade' => 'required',
  117. 'view_file' => 'required',
  118. 'page' => 'integer',
  119. 'page_size' => 'integer'
  120. ], [
  121. 'blade.required' => 'blade不能为空',
  122. 'view_file.required' => 'view_file不能为空',
  123. 'page.integer' => 'page只能为数字',
  124. 'page_size.integer' =>'page_size只能为数字',
  125. ]);
  126. $blade = $request->input("blade");
  127. $viewFile = $request->input("view_file");
  128. $components = Blade::getClassComponentAliases();
  129. $class = $components[$blade] ?? '';
  130. if (empty($class)) {
  131. throw new ApiException(1004,['msg'=> $blade]);
  132. }
  133. $params = $request->all();
  134. $c = new $class($viewFile, $params);
  135. return $c->render();
  136. }
  137. }