WebService.php 62 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: ywl
  5. * Date: 2017/4/14
  6. * Time: 11:38
  7. */
  8. namespace App\Web\Services;
  9. use App\Ad\Facades\SysAdFacade;
  10. use App\Common\Facades\UserCenterFacade;
  11. use App\Common\Library\DES;
  12. use App\Common\Models\ExportExcel;
  13. use App\ExcelData\Services\ImportHeadingExcel;
  14. use App\Exceptions\ApiException;
  15. use App\Services\CommonUserBaseService;
  16. use App\Web\Facades\BlogFacade;
  17. use App\Web\Facades\BlogRenderFacade;
  18. use App\Web\Facades\DictFacade;
  19. use App\Web\Facades\HelpFacade;
  20. use App\Web\Facades\MeetingFacade;
  21. use App\Web\Facades\ProductFacade;
  22. use App\Web\Facades\SuccessCaseFacade;
  23. use App\Web\Facades\SysGlobalConfigFacade;
  24. use App\Web\Facades\WebFacade;
  25. use App\Web\Models\BlogModel;
  26. use App\Web\Models\BlogPlateModel;
  27. use App\Web\Models\HelpModel;
  28. use App\Web\Models\ProductModel;
  29. use App\Web\Models\SuccessCaseModel;
  30. use App\Web\Models\WebSeoModel;
  31. use App\Web\Models\WebStaticPageModel;
  32. use Illuminate\Database\Eloquent\Model;
  33. use Illuminate\Support\Facades\Cache;
  34. use Illuminate\Support\Facades\DB;
  35. use Illuminate\Support\Facades\Log;
  36. use Illuminate\Support\Facades\View;
  37. use Maatwebsite\Excel\Events\AfterSheet;
  38. use Maatwebsite\Excel\Facades\Excel;
  39. use PhpOffice\PhpSpreadsheet\Style\Fill;
  40. class WebService extends CommonUserBaseService
  41. {
  42. const RELATION_TABLE_BLOG = 'blog';
  43. const RELATION_TABLE_SUCCESS_CASE = 'success_case';
  44. const RELATION_TABLE_HELP = 'help';
  45. const RELATION_TABLE_WEB_PAGE = 'web_static_page';
  46. const RELATION_TABLE_BLOG_PLATE = 'blog_plate';
  47. const RELATION_TABLE_BLOG_TYPE = 'blog_type';
  48. const RELATION_TABLE_BLOG_TAG = 'blog_tag';
  49. const RELATION_TABLE_HELP_TYPE = 'help_type';
  50. const RELATION_TABLE_HELP_TAG = 'help_tag';
  51. const RELATION_TABLE_PRODUCT = 'product';
  52. const RELATION_TABLE_PRODUCT_TYPE = 'product_type';
  53. const RELATION_TABLE_PRODUCT_TAG = 'product_tag';
  54. const RELATION_TABLE_MEETING = 'meeting';
  55. const RELATION_TABLE_MEETING_TYPE = 'meeting_type';
  56. const RELATION_TABLE_MEETING_TAG = 'meeting_tag';
  57. const BLOG_ROUTE_PATH = 'blog-details.index';
  58. const BLOG_JOB_ROUTE_PATH = 'join-us-details.index';
  59. const BLOG_TYPE_LIST_ROUTE_PATH = 'blog-list.index';
  60. const BLOG_TYPE_SOLUTIONS_ROUTE_PATH = 'solution-list.index';
  61. const BLOG_TYPE_VIDEO_ROUTE_PATH = 'video-list.index';
  62. const CASE_List_ROUTE_PATH = 'case-list.index'; // 成功案例列表页
  63. const CASE_ROUTE_PATH = 'case-details.index'; // 成功案例详情页
  64. const HELP_ROUTE_PATH = 'help-details.index';
  65. const SOLUTION_DETAILS_ROUTE_PATH = 'solution-details.index';
  66. const MEDIA_ROUTE_PATH = 'media-details.index';
  67. const HELP_TYPE_LIST_ROUTE_PATH = 'support-details.index';
  68. const TOURISM_DETAILS_ROUTE_PATH = 'tourism-details.index';
  69. const KNOWLEDGE_DETAILS_PATH = 'knowledge-details.index';
  70. const PRODUCT_LIST_ROUTE_PATH = 'product-list.index';
  71. const PRODUCT_ROUTE_PATH = 'product-details.index';
  72. const MEETING_LIST_ROUTE_PATH = 'events.index';
  73. const MEETING_ROUTE_PATH = 'event-details.index';
  74. const MEETING_SPEAKER_ROUTE_PATH = 'guest-speaker.index'; //会议嘉宾页
  75. const LAYOUTS_ROUTE = 'layouts.index';
  76. const LAYOUT_HEADER_MENU_ROUTE = 'layout_menu.index';
  77. const HOME_ROUTE = 'home.index';
  78. protected $cache = true;
  79. protected $cacheBucket = 'Web:';
  80. protected $webSeoModel;
  81. /**
  82. * WebService construct
  83. * @param WebStaticPageModel $model
  84. * @param WebSeoModel $webSeoModel
  85. * */
  86. public function __construct(WebStaticPageModel $model, WebSeoModel $webSeoModel)
  87. {
  88. $this->model = $model;
  89. $this->webSeoModel = $webSeoModel;
  90. }
  91. /**
  92. * 保存静态页面数据
  93. * */
  94. public function saveStaticPageData($params)
  95. {
  96. $saveData = [];
  97. $userId = $this->getAuthUserId();
  98. $nowTime = nowTime();
  99. $seoData = empty($params['seo_data']) ? [] : $params['seo_data'];
  100. $urlaId = empty($params['seo_id']) ? 0 : $params['seo_id'];
  101. if (!empty($seoData)) {
  102. if (empty($seoData['urla']) && !empty($params['route_path'])) {
  103. $seoData['urla'] = $params['route_path'];
  104. }
  105. $urlaUnique = $this->checkUrlaUnique($seoData['urla'], $urlaId);
  106. if (!$urlaUnique) {
  107. throw new ApiException(10019, ['name' => $seoData['urla']]);
  108. }
  109. }
  110. $saveData['update_time'] = $nowTime;
  111. if (!empty($params['id'])) {
  112. $saveData['id'] = $params['id'];
  113. if (isset($params['page_name'])) {
  114. $pageNameUnique = $this->model->checkPageNameUnique($params['page_name'], $params['id']);
  115. if (!$pageNameUnique) {
  116. throw new ApiException(10018, ['name' => $params['page_name']]);
  117. }
  118. $saveData['page_name'] = $params['page_name'];
  119. }
  120. /*if (isset($params['route_path'])) {
  121. $routePathUnique = $this->model->checkPageNameUnique($params['route_path'], $params['id']);
  122. if (!$routePathUnique) {
  123. throw new ApiException(10018, ['name' => $params['route_path']]);
  124. }
  125. $saveData['route_path'] = $params['route_path'];
  126. }*/
  127. if (isset($params['sort'])) {
  128. $saveData['sort'] = empty($params['sort']) ? 0 : $params['sort'];
  129. }
  130. if (isset($params['status'])) {
  131. $saveData['status'] = $params['status'];
  132. }
  133. if (isset($params['type'])) {
  134. $saveData['type'] = empty($params['type']) ? 0 : $params['type'];
  135. }
  136. if (isset($params['page_content'])) {
  137. $saveData['page_content'] = empty($params['page_content']) ? '' : json_encode($params['page_content']);
  138. }
  139. } else {
  140. $pageNameUnique = $this->model->checkPageNameUnique($params['page_name']);
  141. if (!$pageNameUnique) {
  142. throw new ApiException(10018, ['name' => $params['page_name']]);
  143. }
  144. /*$routePathUnique = $this->model->checkRoutePathUnique($params['route_path']);
  145. if (!$routePathUnique) {
  146. throw new ApiException(10018, ['name' => $params['route_path']]);
  147. }*/
  148. $saveData['type'] = empty($params['type']) ? 0 : $params['type'];
  149. $saveData['user_id'] = $userId;
  150. $saveData['page_name'] = $params['page_name'];
  151. $saveData['route_path'] = $params['route_path'];
  152. $saveData['sort'] = empty($params['sort']) ? 0 : $params['sort'];
  153. $saveData['page_content'] = empty($params['page_content']) ? '' : json_encode($params['page_content']);
  154. $saveData['create_time'] = $nowTime;
  155. }
  156. $id = $this->model->saveStaticPageData($saveData);
  157. if (!empty($id)) {
  158. if (!empty($params['seo_data'])) {
  159. if (empty($seoData['urla']) && !empty($params['route_path'])) {
  160. $seoData['urla'] = $params['route_path'];
  161. }
  162. $seoParams = [];
  163. $seoParams['relation_table'] = self::RELATION_TABLE_WEB_PAGE;
  164. $seoParams['relation_id'] = $id;
  165. $seoParams['urla'] = $seoData['urla'];
  166. $seoParams['seo_title'] = $seoData['seo_title'];
  167. $seoParams['seo_keyword'] = $seoData['seo_keyword'];
  168. $seoParams['seo_describe'] = $seoData['seo_describe'];
  169. $seoParams['track_code_head'] = empty($seoData['track_code_head']) ? '' : $seoData['track_code_head'];
  170. $seoParams['track_code_body'] = empty($seoData['track_code_body']) ? '' : $seoData['track_code_body'];
  171. if (empty($urlaId)) {
  172. $seoParams['user_id'] = $userId;
  173. $urlaId = $this->saveSeoData($seoParams);
  174. $this->model->newInstance()->where('id', '=', $id)->update(['seo_id' => $urlaId]);
  175. } else {
  176. $seoParams['id'] = $urlaId;
  177. $urlaId = $this->saveSeoData($seoParams);
  178. }
  179. }
  180. if (!empty($saveData['status']) && $saveData['status'] == 2) {
  181. //移除对应seo
  182. $delSeoParams = [];
  183. $delSeoParams['relation_table'] = WebService::RELATION_TABLE_WEB_PAGE;
  184. $delSeoParams['relation_id'] = $id;
  185. $ret = $this->delSeoByRelation($delSeoParams);
  186. }
  187. }
  188. //编辑静态页面后清除静态页面缓存
  189. $this->clearPageCache('urla');
  190. return $id;
  191. }
  192. /**
  193. * 检查优化连接时候唯一
  194. * */
  195. public function checkUrlaUnique($urla, $id = 0)
  196. {
  197. return $this->webSeoModel->checkUrlaUnique($urla, $id);
  198. }
  199. /**
  200. * 保存seo数据
  201. * */
  202. public function saveSeoData($params)
  203. {
  204. $saveData = [];
  205. $nowTime = nowTime();
  206. $saveData['update_time'] = $nowTime;
  207. if (!empty($params['id'])) {
  208. $info = $this->webSeoModel->selectRaw('urla')->where('id', '=', $params['id'])->first();
  209. $saveData['id'] = $params['id'];
  210. if (isset($params['seo_title'])) {
  211. $saveData['seo_title'] = empty($params['seo_title']) ? '' : $params['seo_title'];
  212. }
  213. if (isset($params['seo_keyword'])) {
  214. $saveData['seo_keyword'] = empty($params['seo_keyword']) ? '' : $params['seo_keyword'];
  215. }
  216. if (isset($params['seo_describe'])) {
  217. $saveData['seo_describe'] = empty($params['seo_describe']) ? '' : $params['seo_describe'];
  218. }
  219. if (isset($params['track_code_head'])) {
  220. $saveData['track_code_head'] = empty($params['track_code_head']) ? '' : $params['track_code_head'];
  221. }
  222. if (isset($params['track_code_body'])) {
  223. $saveData['track_code_body'] = empty($params['track_code_body']) ? '' : $params['track_code_body'];
  224. }
  225. if (isset($params['relation_table'])) {
  226. $saveData['relation_table'] = empty($params['relation_table']) ? '' : $params['relation_table'];
  227. }
  228. if (isset($params['urla'])) {
  229. $saveData['urla'] = empty($params['urla']) ? '' : $params['urla'];
  230. }
  231. } else {
  232. $saveData['urla'] = $params['urla'];
  233. $saveData['user_id'] = empty($params['user_id']) ? 0 : $params['user_id'];
  234. $saveData['relation_table'] = empty($params['relation_table']) ? '' : $params['relation_table'];
  235. $saveData['relation_id'] = empty($params['relation_id']) ? 0 : $params['relation_id'];
  236. $saveData['seo_title'] = empty($params['seo_title']) ? '' : $params['seo_title'];
  237. $saveData['seo_keyword'] = empty($params['seo_keyword']) ? '' : $params['seo_keyword'];
  238. $saveData['seo_describe'] = empty($params['seo_describe']) ? '' : $params['seo_describe'];
  239. $saveData['track_code_head'] = empty($params['track_code_head']) ? '' : $params['track_code_head'];
  240. $saveData['track_code_body'] = empty($params['track_code_body']) ? '' : $params['track_code_body'];
  241. $saveData['create_time'] = $nowTime;
  242. }
  243. $ret = $this->webSeoModel->saveSeoData($saveData);
  244. return $ret;
  245. }
  246. /**
  247. * 根据关联关系删除Seo
  248. * */
  249. public function delSeoByRelation($params)
  250. {
  251. $ret = $this->webSeoModel->delSeoByRelation($params);
  252. return $ret;
  253. }
  254. /**
  255. * 清除详情详情页面缓存
  256. * */
  257. public function clearPageCache($clearKey = '')
  258. {
  259. if (!empty($clearKey)) {
  260. $this->removeByKey($clearKey);
  261. }
  262. }
  263. /**
  264. * 获取静态页面列表
  265. * */
  266. public function getStaticPageList($params)
  267. {
  268. $pageList = $this->model->getStaticPageList($params);
  269. $pageListData = empty($pageList['data']) ? [] : $pageList['data'];
  270. $pageList['data'] = $pageListData;
  271. return $pageList;
  272. }
  273. /**
  274. * 根据seoids 获取seo列表
  275. * */
  276. public function getSeoListByIds($ids)
  277. {
  278. if (!empty($ids)) {
  279. $seoList = $this->webSeoModel->getSeoListByIds($ids);
  280. } else {
  281. $seoList = [];
  282. }
  283. return $seoList;
  284. }
  285. /**
  286. * 获取静态页面详情
  287. * */
  288. public function getStaticPageInfo($params)
  289. {
  290. $pageInfo = $this->model->getStaticPageInfo($params);
  291. if (!empty($pageInfo['seo_id'])) {
  292. $pageInfo['seo_data'] = $this->getSeoInfo(['id' => $pageInfo['seo_id']]);
  293. } else {
  294. $pageInfo['seo_data'] = [];
  295. }
  296. /*if (!empty($pageInfo['page_content']) && is_array($pageInfo['page_content'])) {
  297. $pageInfo['page_content'] = array_values($pageInfo['page_content']);
  298. } else {
  299. $pageInfo['page_content'] = [];
  300. }*/
  301. return $pageInfo;
  302. }
  303. /**
  304. * 获取seo详情
  305. * */
  306. public function getSeoInfo($params)
  307. {
  308. return $this->webSeoModel->getSeoInfo($params);
  309. }
  310. /**
  311. * 获取网页菜单
  312. * */
  313. public function getPageMenuInfo($params)
  314. {
  315. /*if (!empty($pageInfo['page_content']) && is_array($pageInfo['page_content'])) {
  316. $pageInfo['page_content'] = array_values($pageInfo['page_content']);
  317. } else {
  318. $pageInfo['page_content'] = [];
  319. }*/
  320. return $this->model->getPageMenuInfo($params);
  321. }
  322. /**
  323. * 获取获取页面渲染数据
  324. * */
  325. public function getWebPageRenderData($urla = '')
  326. {
  327. //$pageRenderData = $this->getCachePageData($urla);
  328. if (config('app.app_debug')) {
  329. $pageRenderData = [];
  330. }
  331. $pageRenderData = [];
  332. if (empty($pageRenderData)) {
  333. if (empty($urla) || $urla == 'home') {
  334. //首页
  335. $pageRenderData = $this->model->getStaticPageInfo(['route_path' => self::HOME_ROUTE]);
  336. $layoutContent = $this->model->getStaticPageInfo(['route_path' => self::LAYOUTS_ROUTE]);
  337. if (!empty($layoutContent['page_content'])) {
  338. foreach ($layoutContent['page_content'] as $key => $content_item) {
  339. if (empty($pageRenderData['page_content'][$key])) {
  340. $pageRenderData['page_content'][$key] = $content_item;
  341. }
  342. }
  343. }
  344. } else {
  345. $seoParams = [];
  346. $seoParams['urla'] = $urla;
  347. $seoInfo = $this->webSeoModel->getSeoInfo($seoParams);
  348. if (!empty($seoInfo)) {
  349. $pageRenderData = [];
  350. $pageRenderData['urla'] = $seoInfo['urla'];
  351. $pageRenderData['seo_title'] = $seoInfo['seo_title'];
  352. $pageRenderData['seo_keyword'] = $seoInfo['seo_keyword'];
  353. $pageRenderData['seo_describe'] = $seoInfo['seo_describe'];
  354. $pageRenderData['track_code_head'] = $seoInfo['track_code_head'];
  355. $pageRenderData['track_code_body'] = $seoInfo['track_code_body'];
  356. $pageRenderData['relation_table'] = $seoInfo['relation_table'] ?? '';
  357. $pageRenderData['relation_id'] = $seoInfo['relation_id'] ?? 0;
  358. // dd($urla);
  359. /* if ($urla === 'gahumi-custom-advertising-flag70d-6') {
  360. dd($pageRenderData);
  361. }*/
  362. if ($pageRenderData['relation_table']) {
  363. switch ($pageRenderData['relation_table']) {
  364. case self::RELATION_TABLE_BLOG_TYPE:
  365. //新闻分类列表
  366. $pageRenderData['blog_type_info'] = BlogRenderFacade::getBlogTypeInfo($seoInfo['relation_id']);
  367. if (!empty($pageRenderData['blog_type_info']['plate_id'])) {
  368. if ($pageRenderData['blog_type_info']['plate_id'] === BlogPlateModel::SOLUTION) {
  369. $pageRenderData['route_path'] = self::BLOG_TYPE_SOLUTIONS_ROUTE_PATH;
  370. $pageRenderData['solution_tag_list'] = BlogRenderFacade::getPublishedTagList(BlogPlateModel::SOLUTION);
  371. }if ($pageRenderData['blog_type_info']['plate_id'] === BlogPlateModel::SUCCESSCASES) {
  372. $pageRenderData['route_path'] = self::CASE_List_ROUTE_PATH;
  373. $pageRenderData['tag_list'] = BlogRenderFacade::getPublishedTagList(BlogPlateModel::SUCCESSCASES);
  374. } else {
  375. $pageRenderData['route_path'] = self::BLOG_TYPE_LIST_ROUTE_PATH;
  376. }
  377. } else {
  378. $pageRenderData['route_path'] = self::BLOG_TYPE_LIST_ROUTE_PATH;
  379. }
  380. break;
  381. case self::RELATION_TABLE_BLOG_TAG:
  382. //新闻标签列表
  383. $pageRenderData['blog_tag_info'] = BlogRenderFacade::getBlogTagInfo($seoInfo['relation_id']);
  384. $pageRenderData['route_path'] = self::BLOG_TYPE_LIST_ROUTE_PATH;
  385. break;
  386. case self::RELATION_TABLE_BLOG:
  387. //博客详情
  388. $blogData = BlogFacade::getBlogRenderData(['id' => $seoInfo['relation_id']]);
  389. $blogData['plate_info'] = BlogRenderFacade::getPlateInfo($blogData['plate_id']);
  390. $blogData['expand_content'] = mapByKey($blogData['expand_content'], 'key');
  391. if ($blogData['plate_id'] === BlogPlateModel::JOB) {
  392. $pageRenderData['route_path'] = self::BLOG_JOB_ROUTE_PATH;
  393. } else if ($blogData['plate_id'] === BlogPlateModel::KNOWLEDGECENTRE) {
  394. $pageRenderData['route_path'] = self::KNOWLEDGE_DETAILS_PATH;
  395. } else if ($blogData['plate_id'] === BlogPlateModel::SOLUTION) {
  396. $pageRenderData['route_path'] = self::SOLUTION_DETAILS_ROUTE_PATH;
  397. $pageRenderData['solution_tag_list'] = BlogRenderFacade::getPublishedTagList(BlogPlateModel::SOLUTION);
  398. } else if ($blogData['plate_id'] === BlogPlateModel::Media) {
  399. $pageRenderData['route_path'] = self::MEDIA_ROUTE_PATH;
  400. } else if ($blogData['plate_id'] === BlogPlateModel::SUCCESSCASES) {
  401. $pageRenderData['route_path'] = self::CASE_ROUTE_PATH;
  402. } else if ($blogData['plate_id'] === BlogPlateModel::Q_AND_A) {
  403. $pageRenderData['route_path'] = self::HELP_ROUTE_PATH;
  404. } else if ($blogData['plate_id'] === BlogPlateModel::TOURISM) {
  405. $pageRenderData['route_path'] = self::TOURISM_DETAILS_ROUTE_PATH;
  406. } else {
  407. $pageRenderData['route_path'] = self::BLOG_ROUTE_PATH;
  408. }
  409. $blogData['pre_news_info'] = BlogRenderFacade::getPreBlog($blogData['plate_id'], $blogData['id']);
  410. $blogData['next_news_info'] = BlogRenderFacade::getNextBlog($blogData['plate_id'], $blogData['id']);
  411. $pageRenderData['blog_details'] = $blogData;
  412. break;
  413. case self::RELATION_TABLE_PRODUCT_TYPE:
  414. //产品分类列表
  415. $pageRenderData['product_type_info'] = ProductFacade::getProductTypeRenderInfo(['id' => $seoInfo['relation_id']]);
  416. $pageRenderData['product_type_info']['id'] = $seoInfo['relation_id'];
  417. if (!empty($pageRenderData['product_type_info']['expand_content'])) {
  418. $pageRenderData['product_type_info']['expand_content'] = mapByKey(json_decode($pageRenderData['product_type_info']['expand_content'], true), 'key');
  419. }
  420. $pageRenderData['route_path'] = self::PRODUCT_LIST_ROUTE_PATH;
  421. break;
  422. case self::RELATION_TABLE_PRODUCT_TAG:
  423. //产品标签列表
  424. $pageRenderData['product_tag_info'] = ProductFacade::getProductTagRenderInfo(['tag_id' => $seoInfo['relation_id']]);
  425. $pageRenderData['product_tag_info']['id'] = $seoInfo['relation_id'];
  426. if (!empty($pageRenderData['product_tag_info']['expand_content'])) {
  427. $pageRenderData['product_tag_info']['expand_content'] = mapByKey(json_decode($pageRenderData['product_tag_info']['expand_content'], true), 'key');
  428. }
  429. if (!empty($pageRenderData['product_tag_info']['route_path'])) {
  430. $pageRenderData['route_path'] = $pageRenderData['product_tag_info']['route_path'];
  431. } else {
  432. $pageRenderData['route_path'] = self::PRODUCT_LIST_ROUTE_PATH;
  433. }
  434. break;
  435. case self::RELATION_TABLE_PRODUCT:
  436. //产品详情
  437. $pageRenderData['route_path'] = self::PRODUCT_ROUTE_PATH;
  438. $productData = ProductFacade::getProductRenderData(['id' => $seoInfo['relation_id']]);
  439. $pageRenderData['product_detail'] = $productData;
  440. $typeIds = [];
  441. if (!empty($productData['type_items'])) {
  442. foreach ($productData['type_items'] as $typeItem) {
  443. $typeIds[] = $typeItem['type_id'];
  444. }
  445. }
  446. $relevanceList = ProductFacade::getRelevanceList(['relevance_page_size' => 4, 'type_ids' => $typeIds]);
  447. $pageRenderData['relevance_product_list'] = $relevanceList;
  448. break;
  449. case self::RELATION_TABLE_MEETING:
  450. //会议详情
  451. $meetingInfo = MeetingFacade::getMeetingRenderData(['id' => $seoInfo['relation_id']]);
  452. $meetingInfo['relation_table'] = self::RELATION_TABLE_MEETING;
  453. $routePath = self::MEETING_ROUTE_PATH;
  454. if(!empty($meetingInfo['tag_items'])) {
  455. $tagIds = array_column($meetingInfo['tag_items'], 'tag_id');
  456. if(View::exists('exhibition-detail.index') && in_array(1, $tagIds)) {
  457. //todo 临时定义tag,标签为1的为全球展会
  458. $routePath = 'exhibition-detail.index';
  459. }
  460. }
  461. if (!empty($meetingInfo['expand_content'])) {
  462. $meetingInfo['expand_content'] = mapByKey($meetingInfo['expand_content'], 'key');
  463. }
  464. if (!empty($meetingInfo['page_route'])) {
  465. $pageRenderData['route_path'] = $meetingInfo['page_route'];
  466. } else {
  467. $pageRenderData['route_path'] = $routePath;
  468. }
  469. $meetingInfo['pre_meeting_info'] = MeetingFacade::getPrevMeetingItem($meetingInfo['id']);
  470. $meetingInfo['next_meeting_info'] = MeetingFacade::getNextMeetingItem($meetingInfo['id']);
  471. $pageRenderData['event_detail'] = $meetingInfo;
  472. break;
  473. case self::RELATION_TABLE_MEETING_TYPE:
  474. //会议分类
  475. $pageRenderData['route_path'] = self::MEETING_LIST_ROUTE_PATH;
  476. $pageRenderData['event_type_info'] = MeetingFacade::getMeetingTypeRenderInfo(['id' => $seoInfo['relation_id']]);
  477. $productRecentlyData = MeetingFacade::getMeetingRecentlyData();
  478. if (!empty($productRecentlyData['country'])) {
  479. $pageRenderData['country_list'] = $productRecentlyData['country'];
  480. }
  481. break;
  482. }
  483. }
  484. $layoutContent = $this->model->getStaticPageInfo(['route_path' => self::LAYOUTS_ROUTE]);
  485. //动态页面获取page_content
  486. if (!empty($pageRenderData['route_path'])) {
  487. $pageData = $this->model->getStaticPageInfo(['route_path' => $pageRenderData['route_path']]);
  488. if (empty($pageData['page_content'])) {
  489. $pageData['page_content'] = [];
  490. }
  491. //合并公共数据进页面数据
  492. if (!empty($layoutContent['page_content'])) {
  493. foreach ($layoutContent['page_content'] as $key => $content_item) {
  494. if (empty($pageData['page_content'][$key])) {
  495. $pageData['page_content'][$key] = $content_item;
  496. }
  497. }
  498. }
  499. if (!empty($pageData['page_content'])) {
  500. $pageRenderData['page_content'] = $pageData['page_content'];
  501. }
  502. } else {
  503. $pageData = $this->model->getStaticPageInfo(['id' => $pageRenderData['relation_id']]);
  504. if ($pageData['route_path'] === self::MEETING_SPEAKER_ROUTE_PATH && isset($_GET['id'])) {
  505. //嘉宾页获取会议详情
  506. $meetingInfo = MeetingFacade::getMeetingRenderData(['id' => $_GET['id']]);
  507. if (!empty($meetingInfo['expand_content'])) {
  508. $meetingInfo['expand_content'] = mapByKey($meetingInfo['expand_content'], 'key');
  509. }
  510. if (!empty($meetingInfo['speech_schedule'])) {
  511. foreach ($meetingInfo['speech_schedule'] as $speech_schedule_key => $speech_schedule_item) {
  512. if (!empty($speech_schedule_item['expand_content'])) {
  513. $meetingInfo['speech_schedule'][$speech_schedule_key]['expand_content'] = mapByKey($speech_schedule_item['expand_content'], 'key');
  514. } else {
  515. $meetingInfo['speech_schedule'][$speech_schedule_key]['expand_content'] = [];
  516. }
  517. }
  518. }
  519. $pageRenderData['event_detail'] = $meetingInfo;
  520. }
  521. if (!empty($layoutContent['page_content'])) {
  522. foreach ($layoutContent['page_content'] as $key => $content_item) {
  523. if (empty($pageData['page_content'][$key])) {
  524. $pageData['page_content'][$key] = $content_item;
  525. }
  526. }
  527. }
  528. $pageRenderData['route_path'] = $pageData['route_path'];
  529. $pageRenderData['page_content'] = $pageData['page_content'];
  530. if ($pageData['route_path'] === self::MEETING_LIST_ROUTE_PATH) {
  531. $productRecentlyData = MeetingFacade::getMeetingRecentlyData();
  532. if (!empty($productRecentlyData['country'])) {
  533. $pageRenderData['country_list'] = $productRecentlyData['country'];
  534. }
  535. }
  536. }
  537. } else {
  538. $pageRenderData = $this->model->getStaticPageInfo(['route_path' => '404.index']);
  539. $layoutContent = $this->model->getStaticPageInfo(['route_path' => self::LAYOUTS_ROUTE]);
  540. if (!empty($layoutContent['page_content'])) {
  541. foreach ($layoutContent['page_content'] as $key => $content_item) {
  542. if (empty($pageRenderData['page_content'][$key])) {
  543. $pageRenderData['page_content'][$key] = $content_item;
  544. }
  545. }
  546. }
  547. }
  548. //dd($pageRenderData);
  549. }
  550. /*if (!empty($pageRenderData)) {
  551. if (!empty($pageRenderData['route_path'])) {
  552. switch ($pageRenderData['route_path']) {
  553. case 'blog-recently.index':
  554. $blogRecently = BlogFacade::getBlogRecentlyData();
  555. $pageRenderData = array_merge($pageRenderData, $blogRecently);
  556. break;
  557. case 'help.index':
  558. $helpListRet = HelpFacade::getHelpList(['page_size' => 999, 'status' => 0]);
  559. if (!empty($helpListRet['data'])) {
  560. $pageRenderData['help_items'] = $helpListRet['data'];
  561. }
  562. break;
  563. case 'support.index':
  564. $helpTypeRet = HelpFacade::getHelpTypeList(['page_size' => 999, 'status' => 0]);
  565. if (!empty($helpTypeRet['data'])) {
  566. $pageRenderData['help_type_items'] = $helpTypeRet['data'];
  567. }
  568. break;
  569. case 'case-list.index':
  570. $isHandpickRet = SuccessCaseFacade::getSuccessCaseList(['page_size' => 4, 'status' => 0, 'is_handpick' => 1]);
  571. $funcRet = DictFacade::getDictFunctionList(['page_size' => 999, 'status' => 0]);
  572. $industryRet = DictFacade::getDictIndustryList(['page_size' => 999, 'status' => 0]);
  573. if (!empty($isHandpickRet)) {
  574. $pageRenderData['handpick_data'] = $isHandpickRet;
  575. }
  576. $caseRet = SuccessCaseFacade::getSuccessCaseList(['page_size' => 12, 'status' => 0]);
  577. if (!empty($caseRet)) {
  578. $pageRenderData['case_data'] = $caseRet;
  579. }
  580. if (!empty($funcRet['data'])) {
  581. $pageRenderData['func_items'] = $funcRet['data'];
  582. }
  583. if (!empty($industryRet['data'])) {
  584. $pageRenderData['industry_items'] = $industryRet['data'];
  585. }
  586. break;
  587. case 'product.index':
  588. $staticPageData = $this->model->getStaticPageInfo(['route_path' => 'product.index', 'type' => 1]);
  589. $productRecentlyData = ProductFacade::getProductRecentlyData();
  590. $pageRenderData = array_merge($pageRenderData, $staticPageData);
  591. $pageRenderData = array_merge($pageRenderData, $productRecentlyData);
  592. //print_r($pageRenderData);die;
  593. break;
  594. case 'expo.index':
  595. $staticPageData = $this->model->getStaticPageInfo(['route_path' => 'expo.index', 'type' => 1]);
  596. $productRecentlyData = MeetingFacade::getMeetingRecentlyData();
  597. $pageRenderData = array_merge($pageRenderData, $staticPageData);
  598. $pageRenderData = array_merge($pageRenderData, $productRecentlyData);
  599. //print_r($pageRenderData);die;
  600. break;
  601. default:
  602. break;
  603. }
  604. $adData = SysAdFacade::getPageAdData($pageRenderData['route_path']);
  605. if (!empty($adData)) {
  606. $adData = mapByKey($adData, 'number');
  607. $pageRenderData['ad_items'] = $adData;
  608. }
  609. }
  610. $this->setCachePageCache($urla, $pageRenderData);
  611. }*/
  612. }
  613. //dd($pageRenderData);
  614. if (!empty($pageRenderData['route_path'])) {
  615. $adData = SysAdFacade::getPageAdData($pageRenderData['route_path']);
  616. $adRes = [];
  617. foreach ($adData as $adItem) {
  618. if (empty($adRes[$adItem['number']])) {
  619. $adRes[$adItem['number']] = [];
  620. }
  621. array_push($adRes[$adItem['number']], $adItem);
  622. }
  623. $pageRenderData['ad_items'] = [];
  624. foreach ($adRes as $key => $adItem) {
  625. $pageRenderData['ad_items'][$key] = mapByKey($adItem, 'ad_key');
  626. }
  627. }
  628. $menuData = $this->model->getPageMenuInfo(['route_path' => self::LAYOUT_HEADER_MENU_ROUTE]);
  629. if ($menuData && $menuData['page_content']) {
  630. $pageRenderData['head_menu'] = json_decode($menuData['page_content'], true);
  631. } else {
  632. $pageRenderData['head_menu'] = [];
  633. }
  634. // dd($pageRenderData);
  635. return $pageRenderData;
  636. }
  637. /**
  638. * 获取页面详情
  639. * @return array
  640. */
  641. public function getCachePageData($urla = '')
  642. {
  643. $key = $this->getCachePageKey($urla);
  644. return Cache::get($key);
  645. }
  646. /**
  647. * 获取page缓存key
  648. * @param $urla
  649. * @return string
  650. */
  651. private function getCachePageKey($urla = '')
  652. {
  653. $pageParamsStr = 'urla:' . md5('urla-' . $urla);
  654. return $this->cacheBucket . $pageParamsStr;
  655. }
  656. /**
  657. * 获取手机的验证码
  658. * */
  659. public function getPhoneCode($phone, $countryCode)
  660. {
  661. UserCenterFacade::getSmsCode($phone, $countryCode);
  662. return true;
  663. }
  664. /**
  665. * 清除页面缓存
  666. */
  667. public function clearPageCacheByUrla($urla)
  668. {
  669. if (empty($urla)) {
  670. return;
  671. }
  672. $this->clearPageCache($this->getCachePageKey($urla));
  673. return true;
  674. }
  675. public function getWebMenu()
  676. {
  677. $webMenuData = $this->model->getWebMenu();
  678. $menu = [];
  679. $domain = config('app.web_url') . '/';
  680. foreach ($webMenuData as $item) {
  681. $menu[$item['route_path']] = $item['urla'];
  682. }
  683. return $menu;
  684. }
  685. public function getSiteMap()
  686. {
  687. $domain = config('app.web_url') . '/';
  688. $request_scheme = 'https';
  689. $rootUrl = $domain;
  690. $xmlns = $request_scheme . '://www.sitemaps.org/schemas/sitemap/0.9';
  691. $xmlnsXsi = $request_scheme . '://www.w3.org/2001/XMLSchema-instance';
  692. $xmlnsImage = $request_scheme . '//www.google.com/schemas/sitemap-image/1.1';
  693. $schemaLocation = $request_scheme . '://www.sitemaps.org/schemas/sitemap/0.9 '
  694. . $request_scheme . '://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd '
  695. . $request_scheme . '://www.google.com/schemas/sitemap-image/1.1 '
  696. . $request_scheme . '://www.google.com/schemas/sitemap-image/1.1/sitemap-image.xsd';
  697. $xmlStr = '<?xml version="1.0" encoding="UTF-8"?>' . "\r\n";
  698. $xmlStr .= '<urlset xmlns="' . $xmlns . '" xmlns:xsi="' . $xmlnsXsi . '" xmlns:image="' . $xmlnsImage . '" xsi:schemaLocation="' . $schemaLocation . '">' . "\r\n";
  699. $xmlStr .= '<url>' . "\r\n";
  700. $xmlStr .= '<loc>' . $rootUrl . '</loc>' . "\r\n";
  701. $xmlStr .= '<lastmod>' . gmdate('c') . '</lastmod>' . "\r\n";
  702. //$xmlStr .= '<changefreq>daily</changefreq>';
  703. $xmlStr .= '</url>' . "\r\n";
  704. $xmlUrl = '';
  705. $resultData = $this->webSeoModel->getSeoList(['status' => 0, 'page_size' => 9999], 'a.urla');
  706. if (!empty($resultData['data'])) {
  707. $list = $resultData['data'];
  708. foreach ($list as $val) {
  709. $urla = empty($val['urla']) ? '' : $val['urla'];
  710. if (!empty($urla)) {
  711. $href = $urla;
  712. $xmlUrl .= '<url>' . "\r\n";
  713. $xmlUrl .= '<loc>' . $rootUrl . $href . '</loc>' . "\r\n";
  714. $xmlUrl .= '<lastmod>' . gmdate('c') . '</lastmod>' . "\r\n";
  715. $xmlUrl .= '</url>' . "\r\n";
  716. }
  717. }
  718. }
  719. $xmlStr .= $xmlUrl;
  720. $xmlStr .= '</urlset>' . "\r\n";
  721. $xmlStr .= '<!-- XML Sitemap generated by Matchpages SEO -->';
  722. return $xmlStr;
  723. }
  724. /**
  725. * 全站搜索
  726. * */
  727. public function queryAllWebsite($params)
  728. {
  729. $keyWord = !empty($params['keyword']) ? $params['keyword'] : '';
  730. $pageSize = !empty($params['page_size']) ? $params['page_size'] : 10; //页面大小,不传默认一页10条记录
  731. $pageNo = !empty($params['page']) ? $params['page'] : 1; //页码,不传默认第1页
  732. $skip = ($pageNo - 1) * $pageSize; //页面记录的开始位置,即偏移量
  733. //产品
  734. $productModel = new ProductModel();
  735. $productQuery = $productModel->newInstance()->alias('a')
  736. ->leftJoin('web_seo as b', 'a.seo_id', '=', 'b.id')
  737. ->where('a.status', '=', 0)
  738. ->where('b.status', '=', 0)
  739. ->where('b.urla', '!=', '')
  740. ->where(function ($query) use ($keyWord) {
  741. if (!empty($keyWord)) {
  742. $query->where('a.title', 'like', '%' . $keyWord . '%')
  743. ->orWhere('a.description', 'like', '%' . $keyWord . '%')
  744. ->orWhere('b.seo_title', 'like', '%' . $keyWord . '%')
  745. ->orWhere('b.seo_keyword', 'like', '%' . $keyWord . '%')
  746. ->orWhere('b.seo_describe', 'like', '%' . $keyWord . '%');
  747. }
  748. })->selectRaw("a.id,a.image_url,a.image_alt,b.urla,b.seo_describe,b.seo_title as title");
  749. //文章
  750. $blogModel = new BlogModel();
  751. $blogQuery = $blogModel->newInstance()->alias('a')
  752. ->leftJoin('web_seo as b', 'a.seo_id', '=', 'b.id')
  753. ->where('a.status', '=', 0)
  754. ->where('b.status', '=', 0)
  755. ->where('b.urla', '!=', '')
  756. ->where(function ($query) use ($keyWord) {
  757. if (!empty($keyWord)) {
  758. $query->where('a.title', 'like', '%' . $keyWord . '%')
  759. ->orWhere('a.description', 'like', '%' . $keyWord . '%')
  760. ->orWhere('b.seo_title', 'like', '%' . $keyWord . '%')
  761. ->orWhere('b.seo_keyword', 'like', '%' . $keyWord . '%')
  762. ->orWhere('b.seo_describe', 'like', '%' . $keyWord . '%');
  763. }
  764. })
  765. ->selectRaw("a.id,a.image_url,a.image_alt,b.urla,b.seo_describe,b.seo_title as title");
  766. //帮助
  767. $helpModel = new HelpModel();
  768. $helpQuery = $helpModel->newInstance()->alias('a')
  769. ->leftJoin('web_seo as b', 'a.seo_id', '=', 'b.id')
  770. ->where('a.status', '=', 0)
  771. ->where('b.status', '=', 0)
  772. ->where('b.urla', '!=', '')
  773. ->where(function ($query) use ($keyWord) {
  774. if (!empty($keyWord)) {
  775. $query->where('a.title', 'like', '%' . $keyWord . '%')
  776. ->orWhere('a.description', 'like', '%' . $keyWord . '%')
  777. ->orWhere('b.seo_title', 'like', '%' . $keyWord . '%')
  778. ->orWhere('b.seo_keyword', 'like', '%' . $keyWord . '%')
  779. ->orWhere('b.seo_describe', 'like', '%' . $keyWord . '%');
  780. }
  781. })
  782. ->selectRaw("a.id,a.image_url,a.image_alt,b.urla,b.seo_describe,b.seo_title as title");
  783. //成功案例
  784. $successCaseModel = new SuccessCaseModel();
  785. $successCaseQuery = $successCaseModel->newInstance()->alias('a')
  786. ->leftJoin('web_seo as b', 'a.seo_id', '=', 'b.id')
  787. ->where('a.status', '=', 0)
  788. ->where('b.status', '=', 0)
  789. ->where('b.urla', '!=', '')
  790. ->where(function ($query) use ($keyWord) {
  791. if (!empty($keyWord)) {
  792. $query->where('a.title', 'like', '%' . $keyWord . '%')
  793. ->orWhere('a.description', 'like', '%' . $keyWord . '%')
  794. ->orWhere('b.seo_title', 'like', '%' . $keyWord . '%')
  795. ->orWhere('b.seo_keyword', 'like', '%' . $keyWord . '%')
  796. ->orWhere('b.seo_describe', 'like', '%' . $keyWord . '%');
  797. }
  798. })
  799. ->selectRaw("a.id,a.image_url,a.image_alt,b.urla,b.seo_describe,b.seo_title as title");
  800. $staticPageQuery = $this->model->newInstance()->alias('a')
  801. ->leftJoin('web_seo as b', 'a.seo_id', '=', 'b.id')
  802. ->where('a.status', '=', 0)
  803. ->where('b.status', '=', 0)
  804. ->where('b.urla', '!=', '')
  805. ->where(function ($query) use ($keyWord) {
  806. if (!empty($keyWord)) {
  807. $query->where('a.page_name', 'like', '%' . $keyWord . '%')
  808. ->orWhere('b.seo_title', 'like', '%' . $keyWord . '%')
  809. ->orWhere('b.seo_keyword', 'like', '%' . $keyWord . '%')
  810. ->orWhere('b.seo_describe', 'like', '%' . $keyWord . '%');
  811. }
  812. })
  813. ->selectRaw("a.id,Null AS image_url,Null AS image_alt,b.urla,b.seo_describe,b.seo_title as title");
  814. $allData = array();
  815. $totalCount = 0;
  816. $queryStr = null;
  817. $productCount = $productQuery->count();
  818. $totalCount = $totalCount + $productCount;
  819. $queryStr = $productQuery;
  820. $blogCount = $blogQuery->count();
  821. $totalCount = $totalCount + $blogCount;
  822. $queryStr = $queryStr->unionAll($blogQuery);;
  823. $helpCount = $helpQuery->count();
  824. $totalCount = $totalCount + $helpCount;
  825. $queryStr = $queryStr->unionAll($helpQuery);
  826. $successCaseCount = $successCaseQuery->count();
  827. $totalCount = $totalCount + $successCaseCount;
  828. $queryStr = $queryStr->unionAll($successCaseQuery);
  829. $staticPageCount = $staticPageQuery->count();
  830. $totalCount = $totalCount + $staticPageCount;
  831. $queryStr = $queryStr->unionAll($staticPageQuery);
  832. $allData = $queryStr
  833. ->skip($skip)
  834. ->limit($pageSize)
  835. ->get();
  836. if (!empty($allData)) {
  837. $resultData = $allData->toArray();
  838. }
  839. $result = buildPage($resultData, $skip, $pageNo, $pageSize, $totalCount);
  840. return $result;
  841. }
  842. /**
  843. * 获取产品类型菜单
  844. * */
  845. public function getProductTypeMenu()
  846. {
  847. $typeParams = [];
  848. $typeParams['status'] = 0;
  849. $typeParams['page_size'] = 9999;
  850. $productTypeMenuData = ProductFacade::getTreeProductList($typeParams);
  851. return $productTypeMenuData;
  852. }
  853. public function getProductTagRenderData()
  854. {
  855. $data = ProductFacade::getProductTagData();
  856. return $data;
  857. }
  858. /**
  859. * @return array
  860. */
  861. public function getPlateTypeMenu()
  862. {
  863. $plateNewsType = BlogRenderFacade::getPublishedTypeList(BlogPlateModel::NEWS, 0, 9999);
  864. foreach ($plateNewsType as &$plateNewsTypeItem) {
  865. $plateNewsTypeItem['expand_content'] = empty($plateNewsTypeItem['expand_content']) ? [] : json_decode($plateNewsTypeItem['expand_content'], true);
  866. $plateNewsTypeItem['expand_array'] = $this->transformArrayToKeyValue($plateNewsTypeItem['expand_content']);
  867. }
  868. $plateSolutionType = BlogRenderFacade::getPublishedTypeList(BlogPlateModel::SOLUTION, 0, 9999);
  869. foreach ($plateSolutionType as &$plateSolutionTypeItem) {
  870. $plateSolutionTypeItem['expand_content'] = empty($plateSolutionTypeItem['expand_content']) ? [] : json_decode($plateSolutionTypeItem['expand_content'], true);
  871. $plateSolutionTypeItem['expand_array'] = $this->transformArrayToKeyValue($plateSolutionTypeItem['expand_content']);
  872. }
  873. $plateVideoType = BlogRenderFacade::getPublishedTypeList(BlogPlateModel::VIDEO, 0, 9999);
  874. foreach ($plateVideoType as &$plateVideoTypeItem) {
  875. $plateVideoTypeItem['expand_content'] = empty($plateVideoTypeItem['expand_content']) ? [] : json_decode($plateVideoTypeItem['expand_content'], true);
  876. $plateVideoTypeItem['expand_array'] = $this->transformArrayToKeyValue($plateVideoTypeItem['expand_content']);
  877. }
  878. $event_tag_list = MeetingFacade::getMeetingTagList([]);
  879. if (!empty($event_tag_list['data'])) {
  880. $event_tag_list = $event_tag_list['data'];
  881. }
  882. $plateNewsTag = BlogRenderFacade::getPublishedTagList(BlogPlateModel::NEWS);
  883. $platCommentsType = BlogRenderFacade::getPublishedTypeList(BlogPlateModel::FUNGI_COMMENT, 0, 9999);
  884. return ['event_tag_list'=> $event_tag_list ,'news_type' => $plateNewsType, 'solution_type' => $plateSolutionType, 'video_type' => $plateVideoType, 'news_tags' => $plateNewsTag, 'comment_type' => $platCommentsType];
  885. }
  886. public function transformArrayToKeyValue($array)
  887. {
  888. $result = [];
  889. foreach ($array as $item) {
  890. if (isset($item['key']) && isset($item['value'])) {
  891. $result[$item['key']] = $item['value'];
  892. }
  893. }
  894. return $result;
  895. }
  896. /**
  897. * 获取会议类型菜单
  898. * */
  899. public function getMeetingTypeMenu()
  900. {
  901. $typeParams = [];
  902. $typeParams['status'] = 0;
  903. $typeParams['page_size'] = 9999;
  904. $meetingTypeMenuData = MeetingFacade::getMeetingTypeList($typeParams);
  905. return $meetingTypeMenuData;
  906. }
  907. public function getGlobalSeo()
  908. {
  909. $globalParams = [];
  910. $globalData = SysGlobalConfigFacade::getGlobalConfig($globalParams);
  911. if (!empty($globalData)) {
  912. $globalData = mapByKey($globalData, 'global_key');
  913. }
  914. $globalSeoData = [
  915. "seo_title" => "",
  916. "seo_keyword" => "",
  917. "seo_describe" => "",
  918. "track_code_head" => "",
  919. "track_code_body" => ""
  920. ];
  921. if (!empty($globalData['WEB_GLOBAL_SEO']['value'])) {
  922. $globalSeoData['seo_title'] = empty($globalData['WEB_GLOBAL_SEO']['value']['seo_title']) ? '' : $globalData['WEB_GLOBAL_SEO']['value']['seo_title'];
  923. $globalSeoData['seo_keyword'] = empty($globalData['WEB_GLOBAL_SEO']['value']['seo_keyword']) ? '' : $globalData['WEB_GLOBAL_SEO']['value']['seo_keyword'];
  924. $globalSeoData['seo_describe'] = empty($globalData['WEB_GLOBAL_SEO']['value']['seo_describe']) ? '' : $globalData['WEB_GLOBAL_SEO']['value']['seo_describe'];
  925. $globalSeoData['track_code_head'] = empty($globalData['WEB_GLOBAL_SEO']['value']['track_code_head']) ? '' : $globalData['WEB_GLOBAL_SEO']['value']['track_code_head'];
  926. $globalSeoData['track_code_body'] = empty($globalData['WEB_GLOBAL_SEO']['value']['track_code_body']) ? '' : $globalData['WEB_GLOBAL_SEO']['value']['track_code_body'];
  927. }
  928. return $globalSeoData;
  929. }
  930. /**
  931. * 缓存页面数据
  932. * @param string $urla
  933. * @param array $PageData
  934. */
  935. private function setCachePageCache($urla = '', $PageData)
  936. {
  937. Cache::put($this->getCachePageKey($urla), $PageData, config('cache.page_time'));
  938. }
  939. public function downloadPageSEOExcel($pageSize = 10000)
  940. {
  941. $params = [
  942. 'page_size' => $pageSize
  943. ];
  944. // $pageData = $this->getStaticPageList($params);
  945. $pageData = $this->model->downloadPageSEOQuery();
  946. $mapData = [];
  947. if (!empty($pageData)) {
  948. $index = 1;
  949. $langPath = '';
  950. if(config('app.is_utm') && config('app.language_path') === 'en') {
  951. $langPath = 'en/';
  952. }
  953. foreach ($pageData as $pd) {
  954. $pd = (array)$pd;
  955. if ($pd['page_name'] != 'layout_menu') {
  956. $tmp = [];
  957. $tmp['index'] = $index++;
  958. $tmp['relation_table'] = $pd['relation_table'];
  959. $tmp['page_name'] = $pd['page_name'];
  960. $tmp['page_url'] = config('app.web_url').'/'.$langPath.$pd['urla'] ?? '';
  961. $tmp['urla'] = $pd['urla'] ?? '';
  962. $tmp['seo_title'] = $pd['seo_title'] ?? '';
  963. $tmp['seo_keyword'] = $pd['seo_keyword'] ?? '';
  964. $tmp['seo_describe'] = $pd['seo_describe'] ?? '';
  965. $tmp['new_seo_title'] = '';
  966. $tmp['new_seo_keyword'] = '';
  967. $tmp['new_describe'] = '';
  968. $mapData[] = $tmp;
  969. }
  970. }
  971. }
  972. $headerMap = [
  973. 'index' => '序号',
  974. 'relation_table' => '页面类型',
  975. 'page_name' => '页面名称',
  976. 'page_url' => '原页面地址',
  977. 'new_page_url' => '优化页面地址',
  978. 'urla' => '原路径',
  979. 'urla_update' => '优化路径',
  980. 'seo_title' => '原SEO标题',
  981. 'new_seo_title' => '优化SEO标题',
  982. 'seo_keyword' => '原SEO关键词',
  983. 'new_seo_keyword' => '优化SEO关键词',
  984. 'seo_describe' => '原SEO描述',
  985. 'new_describe' => '优化SEO描述',
  986. ];
  987. $afterSheetStyle = [
  988. AfterSheet::class => function (AfterSheet $event) use (&$mapData) {
  989. //表头字体
  990. $event->sheet->getDelegate()->getColumnDimension('A')->setWidth(10);
  991. $event->sheet->getDelegate()->getColumnDimension('B')->setWidth(30);
  992. $event->sheet->getDelegate()->getColumnDimension('C')->setWidth(30);
  993. $event->sheet->getDelegate()->getColumnDimension('D')->setWidth(40);
  994. $event->sheet->getDelegate()->getColumnDimension('E')->setWidth(40);
  995. $event->sheet->getDelegate()->getColumnDimension('F')->setWidth(40);
  996. $event->sheet->getDelegate()->getColumnDimension('G')->setWidth(40);
  997. $event->sheet->getDelegate()->getColumnDimension('H')->setWidth(40);
  998. $event->sheet->getDelegate()->getColumnDimension('I')->setWidth(40);
  999. $event->sheet->getDelegate()->getColumnDimension('J')->setWidth(40);
  1000. $event->sheet->getDelegate()->getColumnDimension('K')->setWidth(40);
  1001. $event->sheet->getDelegate()->getColumnDimension('L')->setWidth(40);
  1002. $event->sheet->getDelegate()->getColumnDimension('M')->setWidth(40);
  1003. // 获取最高列字母
  1004. $highestColumn = $event->sheet->getHighestColumn();
  1005. // 设置表头背景色
  1006. $styleArray = [
  1007. 'fill' => [
  1008. 'fillType' => Fill::FILL_SOLID,
  1009. 'startColor' => [
  1010. 'rgb' => '1890ff', // 蓝色背景
  1011. ],
  1012. ],
  1013. 'font' => [
  1014. 'color' => [
  1015. 'rgb' => 'ffffff', // 白色字体
  1016. ],
  1017. ]
  1018. ];
  1019. $event->sheet->getStyle('E1')->applyFromArray($styleArray);
  1020. $event->sheet->getStyle('G1')->applyFromArray($styleArray);
  1021. $event->sheet->getStyle('I1')->applyFromArray($styleArray);
  1022. $event->sheet->getStyle('K1')->applyFromArray($styleArray);
  1023. $event->sheet->getStyle('M1')->applyFromArray($styleArray);
  1024. $worksheet = $event->sheet->getDelegate();
  1025. // 获取最大列和最大行
  1026. $lastColumn = $worksheet->getHighestColumn();
  1027. $lastRow = $worksheet->getHighestRow();
  1028. // 设置动态范围的样式
  1029. $worksheet->getStyle("A1:{$lastColumn}{$lastRow}")
  1030. ->getAlignment()
  1031. ->setWrapText(true);
  1032. }
  1033. ];
  1034. $columnFormats = [];
  1035. return Excel::download(
  1036. new ExportExcel(
  1037. $headerMap,
  1038. $mapData,
  1039. $afterSheetStyle,
  1040. $columnFormats
  1041. ),
  1042. '页面seo_list_'.date('YmdHis') . ".xlsx"
  1043. );
  1044. }
  1045. public function uploadPageSEOExcel($filePath, $isRecover = true)
  1046. {
  1047. $loadCount = 0;
  1048. try {
  1049. $headRow = [
  1050. '序号' => 'index',
  1051. '页面类型' => 'relation_table',
  1052. '页面名称' => 'page_name',
  1053. '原页面地址' => 'page_url',
  1054. '原路径' => 'urla',
  1055. 'SEO标题' => 'seo_title',
  1056. 'SEO关键词' => 'seo_keyword',
  1057. 'SEO描述' => 'seo_describe',
  1058. '优化页面地址' => 'new_page_url',
  1059. '优化路径' => 'urla_update',
  1060. '优化SEO标题' => 'new_seo_title',
  1061. '优化SEO关键词' => 'new_seo_keyword',
  1062. '优化SEO描述' => 'new_describe'
  1063. ];
  1064. $columns = [
  1065. 'index',
  1066. 'relation_table',
  1067. 'page_name',
  1068. 'page_url',
  1069. 'urla',
  1070. 'seo_title',
  1071. 'seo_keyword',
  1072. 'seo_describe',
  1073. 'new_page_url',
  1074. 'urla_update',
  1075. 'new_seo_title',
  1076. 'new_seo_keyword',
  1077. 'new_describe',
  1078. ];
  1079. $data = [];
  1080. $duplicateUrla = [];
  1081. //更新的条数,重复的条数
  1082. $updateNumber = 0;
  1083. $duplicateNumber = 0;
  1084. Excel::import(new ImportHeadingExcel(function ($rows) use (&$data, &$duplicateUrla, &$loadCount, $isRecover, $headRow, $columns) {
  1085. // 解析字段在excel中对应的索引
  1086. $header = $rows[0];
  1087. $headKey = [];
  1088. foreach ($header as $hk => $val) {
  1089. $val = trim($val);
  1090. if (!isset($headRow[$val])) {
  1091. continue;
  1092. }
  1093. $headKey[$headRow[$val]] = $hk;
  1094. }
  1095. $urla = [];
  1096. foreach ($rows as $key => &$row) {
  1097. if ($key === 0) {
  1098. continue;
  1099. }
  1100. if ($loadCount++ >= 10000) {
  1101. break;
  1102. }
  1103. if (empty($row) || empty($headKey['urla'])) {
  1104. continue;
  1105. }
  1106. $tmp = [];
  1107. // 整理字段
  1108. if (empty($row[$headKey['urla']])
  1109. && empty($row[$headKey['page_url']])
  1110. && empty(pathinfo($row[$headKey['page_url']], PATHINFO_BASENAME))
  1111. ) {
  1112. continue;
  1113. }
  1114. if (empty($row[$headKey['urla']])) {
  1115. $row[$headKey['urla']] = pathinfo($row[$headKey['page_url']], PATHINFO_BASENAME);
  1116. }
  1117. if (empty($row[$headKey['urla_update']])
  1118. && !empty($row[$headKey['new_page_url']])
  1119. && !empty(pathinfo($row[$headKey['new_page_url']], PATHINFO_BASENAME))) {
  1120. $row[$headKey['urla_update']] = pathinfo($row[$headKey['new_page_url']], PATHINFO_BASENAME);
  1121. }
  1122. foreach ($columns as $column) {
  1123. if (isset($headKey[$column])) {
  1124. $tmp[$column] = $row[$headKey[$column]] ?? '';
  1125. }
  1126. //导入的urla_update有重复项
  1127. if ($column === 'urla_update' && !empty($tmp[$column])) {
  1128. if (!empty($urla) && in_array($tmp[$column], $urla)) {
  1129. $oldUrla = $tmp[$column];
  1130. $tmp[$column] .= '-' . strtolower(uniqid());
  1131. //page_name
  1132. $tmpDuplicate = [];
  1133. $tmpDuplicate['urla'] = $row[$headKey['urla']] ?? '';
  1134. $tmpDuplicate['page_name'] = $row[$headKey['page_name']] ?? '';
  1135. $tmpDuplicate['seo_title'] = $row[$headKey['new_seo_title']] ?? '';
  1136. $tmpDuplicate['seo_keyword'] =$row[$headKey['new_seo_keyword']] ?? '';
  1137. $tmpDuplicate['seo_describe'] = $row[$headKey['new_describe']] ?? '';
  1138. $tmpDuplicate['old_urla_update'] = $oldUrla;
  1139. $tmpDuplicate['new_urla_update'] = $tmp[$column];
  1140. $duplicateUrla[] = $tmpDuplicate;
  1141. }
  1142. $urla[] = $tmp[$column];
  1143. }
  1144. }
  1145. $tmp['seo_title'] = $tmp['new_seo_title'];
  1146. $tmp['seo_keyword'] = $tmp['new_seo_keyword'];
  1147. $tmp['seo_describe'] = $tmp['new_describe'];
  1148. $data[] = $tmp;
  1149. }
  1150. }), $filePath);
  1151. if (!empty($data)) {
  1152. $checkUrla = array_column($data, 'urla_update');
  1153. $mapUrlaUpdate = mapByKey($data, 'urla_update');
  1154. //在数据库中查到重复项
  1155. $check = $this->webSeoModel->checkUrlaIsExits($checkUrla);
  1156. if (!empty($check)) {
  1157. foreach ($check as $ck) {
  1158. $tmpDuplicate = [];
  1159. $tmpDuplicate['urla'] = $mapUrlaUpdate[$ck['urla']]['urla'] ?? '';
  1160. $tmpDuplicate['seo_title'] = $mapUrlaUpdate[$ck['urla']]['seo_title'] ?? '';
  1161. $tmpDuplicate['seo_keyword'] = $mapUrlaUpdate[$ck['urla']]['seo_keyword'] ?? '';
  1162. $tmpDuplicate['seo_describe'] = $mapUrlaUpdate[$ck['urla']]['seo_describe'] ?? '';
  1163. $tmpDuplicate['page_name'] = $mapUrlaUpdate[$ck['urla']]['page_name'] ?? '';
  1164. $tmpDuplicate['old_urla_update'] = $ck['urla'];
  1165. $tmpDuplicate['new_urla_update'] = $ck['urla'] . '-' . strtolower(uniqid());
  1166. $duplicateUrla[] = $tmpDuplicate;
  1167. foreach ($data as &$da) {
  1168. if($da['urla'] === $tmpDuplicate['urla']
  1169. && $da['urla_update'] === $tmpDuplicate['old_urla_update']) {
  1170. $da['urla_update'] = $tmpDuplicate['new_urla_update'];
  1171. break;
  1172. }
  1173. }
  1174. }
  1175. }
  1176. foreach ($data as $d) {
  1177. if (!empty($d['urla'])) {
  1178. $dup = false;
  1179. $urlaUpdate = '';
  1180. if(!empty($d['urla_update'])) {
  1181. $urlaUpdate = $d['urla_update'];
  1182. if(!empty($duplicateUrla)) {
  1183. foreach ($duplicateUrla as $dp) {
  1184. if($dp['urla'] === $d['urla']
  1185. && $dp['new_urla_update'] === $d['urla_update']) {
  1186. $duplicateNumber++;
  1187. $dup = true;
  1188. break;
  1189. }
  1190. }
  1191. }
  1192. }
  1193. if($dup) {
  1194. //如果url重复,不能更新
  1195. $urlaUpdate = '';
  1196. }
  1197. if($urlaUpdate || $d['seo_title'] || $d['seo_keyword'] || $d['seo_describe']) {
  1198. $updateNumber++;
  1199. $this->webSeoModel->updateSeoInfo($d['urla'], $urlaUpdate, $d['seo_title'], $d['seo_keyword'], $d['seo_describe']);
  1200. }
  1201. }
  1202. }
  1203. }
  1204. return [
  1205. 'update_number' => $updateNumber,
  1206. 'duplicate_number' => $duplicateNumber,
  1207. 'duplicate_data' => $duplicateUrla
  1208. ];
  1209. } finally {
  1210. //fclose($f);
  1211. }
  1212. }
  1213. public function uploadPageSEOByData($duplicateUrla)
  1214. {
  1215. if(!empty($duplicateUrla)) {
  1216. foreach ($duplicateUrla as $dp) {
  1217. $check = $this->webSeoModel->checkUrlaUnique($dp['new_urla_update']);
  1218. if($check) {
  1219. $this->webSeoModel->updateSeoInfo($dp['urla'], $dp['new_urla_update'], $dp['seo_title'], $dp['seo_keyword'], $dp['seo_describe']);
  1220. }
  1221. }
  1222. }
  1223. return 1;
  1224. }
  1225. public function updateTransStatus($id,$transStatus) {
  1226. return $this->webSeoModel->updateTransStatus($id,$transStatus);
  1227. }
  1228. }