BlogService.php 52 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350
  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\Common\Facades\ComSmsFacade;
  10. use App\Common\Facades\UserCenterFacade;
  11. use App\Exceptions\ApiException;
  12. use App\Services\CommonUserBaseService;
  13. use App\User\Facades\UserFacade;
  14. use App\User\Models\UserModel;
  15. use App\Web\Facades\WebFacade;
  16. use App\Web\Models\BlogModel;
  17. use App\Web\Models\BlogPlateModel;
  18. use App\Web\Models\BlogTagModel;
  19. use App\Web\Models\BlogTagRelationModel;
  20. use App\Web\Models\BlogTypeModel;
  21. use App\Web\Models\BlogTypeRelationModel;
  22. use Illuminate\Support\Facades\Cache;
  23. use Illuminate\Http\Request;
  24. use Illuminate\Support\Facades\DB;
  25. use Illuminate\Support\Facades\Log;
  26. use Illuminate\Support\Facades\Mail;
  27. class BlogService extends CommonUserBaseService
  28. {
  29. protected $cache = true;
  30. protected $cacheBucket = 'Blog:';
  31. protected $blogTypeModel;
  32. protected $blogTypeRelationModel;
  33. protected $blogTagModel;
  34. protected $blogTagRelationModel;
  35. protected $plateModel;
  36. /**
  37. * BlogService construct
  38. * @param BlogModel $model
  39. * @param BlogTypeModel $blogTypeModel
  40. * @param BlogTagRelationModel $blogTagRelationModel
  41. * @param BlogTagModel $blogTagModel
  42. * @param BlogTypeRelationModel $blogTypeRelationModel
  43. * @param BlogPlateModel $plateModel
  44. * */
  45. public function __construct(BlogModel $model,
  46. BlogTypeModel $blogTypeModel,
  47. BlogTagRelationModel $blogTagRelationModel,
  48. BlogTagModel $blogTagModel,
  49. BlogTypeRelationModel $blogTypeRelationModel,
  50. BlogPlateModel $plateModel
  51. )
  52. {
  53. $this->model = $model;
  54. $this->blogTypeModel = $blogTypeModel;
  55. $this->blogTypeRelationModel = $blogTypeRelationModel;
  56. $this->blogTagModel = $blogTagModel;
  57. $this->blogTagRelationModel = $blogTagRelationModel;
  58. $this->plateModel = $plateModel;
  59. }
  60. /**
  61. * 获取文章类型列表
  62. * */
  63. public function getBlogTypeList($params)
  64. {
  65. $retData = $this->blogTypeModel->getBlogTypeList($params);
  66. if (!empty($retData['data'])) {
  67. $typeIds = array_column($retData['data'], 'id');
  68. $newsCounts = $this->blogTypeRelationModel->getBlogTypeCount($typeIds);
  69. foreach ($retData['data'] as &$newsItem) {
  70. $newsItem['blog_count'] = $newsCounts[$newsItem['id']] ?? 0;
  71. $newsItem['expand_content'] = empty($newsItem['expand_content']) ? [] : json_decode($newsItem['expand_content'], true);
  72. }
  73. }
  74. return $retData;
  75. }
  76. /**
  77. * 根据类型id 获取文章列表
  78. * */
  79. public function getBlogByTypeIds($params)
  80. {
  81. $retData = $this->blogTypeRelationModel->getBlogByTypeIds($params);
  82. return $retData;
  83. }
  84. /**
  85. * 根据标签id 获取文章列表
  86. * */
  87. public function getBlogByTagIds($params)
  88. {
  89. $retData = $this->blogTagRelationModel->getBlogByTagIds($params);
  90. return $retData;
  91. }
  92. /**
  93. * 文章类型保存
  94. * */
  95. public function saveBlogType($params)
  96. {
  97. $saveData = [];
  98. $nowTime = nowTime();
  99. $saveData['update_time'] = $nowTime;
  100. $userId = $this->getAuthUserId();
  101. if (!empty($params['seo_data'])) {
  102. $urlaUnique = WebFacade::checkUrlaUnique($params['seo_data']['urla'], $params['seo_id']);
  103. if (!$urlaUnique) {
  104. throw new ApiException(10019, ['name' => $params['seo_data']['urla']]);
  105. }
  106. }
  107. if (!empty($params['id'])) {
  108. $saveData['id'] = $params['id'];
  109. if (isset($params['type_name'])) {
  110. $nameUnique = $this->blogTypeModel->checkTypeNameUnique($params['type_name'], $params['id']);
  111. if (!$nameUnique) {
  112. throw new ApiException(10018, ['name' => $params['type_name']]);
  113. }
  114. $saveData['type_name'] = $params['type_name'];
  115. }
  116. if (isset($params['status'])) {
  117. $saveData['status'] = $params['status'];
  118. }
  119. if (isset($params['sort'])) {
  120. $saveData['sort'] = $params['sort'];
  121. }
  122. if (!empty($params['plate_id'])) {
  123. $saveData['plate_id'] = $params['plate_id'];
  124. }
  125. if (isset($params['expand_content'])) {
  126. $saveData['expand_content'] = !empty($params['expand_content']) ? json_encode($params['expand_content']) : '';
  127. }
  128. } else {
  129. $nameUnique = $this->blogTypeModel->checkTypeNameUnique($params['type_name']);
  130. if (!$nameUnique) {
  131. throw new ApiException(10018, ['name' => $params['type_name']]);
  132. }
  133. $saveData['user_id'] = $userId;
  134. if (!empty($params['plate_id'])) {
  135. $saveData['plate_id'] = $params['plate_id'];
  136. }
  137. $saveData['type_name'] = $params['type_name'];
  138. $saveData['expand_content'] = !empty($params['expand_content']) ? json_encode($params['expand_content']) : '';
  139. $saveData['sort'] = empty($params['sort']) ? 0 : $params['sort'];
  140. $saveData['create_time'] = $nowTime;
  141. }
  142. $id = $this->blogTypeModel->saveTypeData($saveData);
  143. if (!empty($id) && isset($params['seo_data'])) {
  144. $seoParams = [
  145. 'relation_table' => WebService::RELATION_TABLE_BLOG_TYPE,
  146. 'relation_id' => $id,
  147. 'urla' => $params['seo_data']['urla'],
  148. 'seo_title' => $params['seo_data']['seo_title'],
  149. 'seo_keyword' => $params['seo_data']['seo_keyword'],
  150. 'seo_describe' => $params['seo_data']['seo_describe']
  151. ];
  152. if (empty($params['seo_id'])) {
  153. $seoParams['user_id'] = $userId;
  154. $urlaId = WebFacade::saveSeoData($seoParams);
  155. $this->blogTypeModel->newInstance()->where('id', '=', $id)->update(['seo_id' => $urlaId]);
  156. } else {
  157. $seoParams['id'] = $params['seo_id'];
  158. $urlaId = WebFacade::saveSeoData($seoParams);
  159. }
  160. if (!empty($saveData['status']) && $saveData['status'] == 2) {
  161. //移除对应seo
  162. $delSeoParams = [];
  163. $delSeoParams['relation_table'] = WebService::RELATION_TABLE_BLOG_TYPE;
  164. $delSeoParams['relation_id'] = $id;
  165. $ret = WebFacade::delSeoByRelation($delSeoParams);
  166. }
  167. }
  168. //更新所有页面缓存
  169. WebFacade::clearPageCache('urla:');
  170. return $id;
  171. }
  172. /**
  173. * 保存文章类型关系
  174. * */
  175. public function typeRelationSave($params)
  176. {
  177. $userId = $this->getAuthUserId();
  178. $ret = $this->blogTypeRelationModel->typeRelationSave($params, $userId);
  179. //更新所有页面缓存
  180. WebFacade::clearPageCache('urla:');
  181. return $ret;
  182. }
  183. /**
  184. * 根据文章类型 保存文章关系
  185. * */
  186. public function addRelationByTypeId($typeId, $blogIds)
  187. {
  188. $userId = $this->getAuthUserId();
  189. $ret = $this->blogTypeRelationModel->addByTypeId($typeId, $blogIds, $userId);
  190. //更新所有页面缓存
  191. WebFacade::clearPageCache('urla:');
  192. return $ret;
  193. }
  194. /**
  195. * 根据类型id及文章id 删除关联关系
  196. * */
  197. public function delTypeRelation($typeId, $blogId)
  198. {
  199. $ret = $this->blogTypeRelationModel->delTypeRelation($typeId, $blogId);
  200. //更新所有页面缓存
  201. WebFacade::clearPageCache('urla:');
  202. return $ret;
  203. }
  204. /**
  205. * 获取文章标签列表
  206. * */
  207. public function getBlogTagList($params)
  208. {
  209. $retData = $this->blogTagModel->getBlogTagList($params);
  210. if (!empty($retData['data'])) {
  211. $tagIds = array_column($retData['data'], 'id');
  212. $newsCounts = $this->blogTagRelationModel->getBlogTagCount($tagIds);
  213. foreach ($retData['data'] as &$newsItem) {
  214. $newsItem['blog_count'] = $newsCounts[$newsItem['id']] ?? 0;
  215. }
  216. }
  217. return $retData;
  218. }
  219. /**
  220. * 文章标签保存
  221. * */
  222. public function saveBlogTag($params)
  223. {
  224. $saveData = [];
  225. $nowTime = nowTime();
  226. $saveData['update_time'] = $nowTime;
  227. $userId = $this->getAuthUserId();
  228. if (!empty($params['seo_data'])) {
  229. $urlaUnique = WebFacade::checkUrlaUnique($params['seo_data']['urla'], $params['seo_id']);
  230. if (!$urlaUnique) {
  231. throw new ApiException(10019, ['name' => $params['seo_data']['urla']]);
  232. }
  233. }
  234. if (!empty($params['id'])) {
  235. $saveData['id'] = $params['id'];
  236. if (isset($params['tag_name'])) {
  237. $nameUnique = $this->blogTagModel->checkTagNameUnique($params['tag_name'], $params['id']);
  238. if (!$nameUnique) {
  239. throw new ApiException(10018, ['name' => $params['tag_name']]);
  240. }
  241. $saveData['tag_name'] = $params['tag_name'];
  242. }
  243. if (isset($params['status'])) {
  244. $saveData['status'] = $params['status'];
  245. }
  246. if (isset($params['sort'])) {
  247. $saveData['sort'] = $params['sort'];
  248. }
  249. if (isset($params['is_hot'])) {
  250. $saveData['is_hot'] = $params['is_hot'];
  251. }
  252. } else {
  253. $nameUnique = $this->blogTagModel->checkTagNameUnique($params['tag_name']);
  254. if (!$nameUnique) {
  255. throw new ApiException(10018, ['name' => $params['tag_name']]);
  256. }
  257. $saveData['user_id'] = $userId;
  258. $saveData['tag_name'] = $params['tag_name'];
  259. $saveData['sort'] = empty($params['sort']) ? 0 : $params['sort'];
  260. $saveData['create_time'] = $nowTime;
  261. }
  262. $id = $this->blogTagModel->saveTagData($saveData);
  263. if (!empty($id) && isset($params['seo_data'])) {
  264. $seoParams = [
  265. 'relation_table' => WebService::RELATION_TABLE_BLOG_TAG,
  266. 'relation_id' => $id,
  267. 'urla' => $params['seo_data']['urla'],
  268. 'seo_title' => $params['seo_data']['seo_title'],
  269. 'seo_keyword' => $params['seo_data']['seo_keyword'],
  270. 'seo_describe' => $params['seo_data']['seo_describe']
  271. ];
  272. if (empty($params['seo_id'])) {
  273. $seoParams['user_id'] = $userId;
  274. $urlaId = WebFacade::saveSeoData($seoParams);
  275. $this->blogTagModel->newInstance()->where('id', '=', $id)->update(['seo_id' => $urlaId]);
  276. } else {
  277. $seoParams['id'] = $params['seo_id'];
  278. $urlaId = WebFacade::saveSeoData($seoParams);
  279. }
  280. if (!empty($saveData['status']) && $saveData['status'] == 2) {
  281. //移除对应seo
  282. $delSeoParams = [];
  283. $delSeoParams['relation_table'] = WebService::RELATION_TABLE_BLOG_TAG;
  284. $delSeoParams['relation_id'] = $id;
  285. $ret = WebFacade::delSeoByRelation($delSeoParams);
  286. }
  287. }
  288. return $id;
  289. }
  290. /**
  291. * 保存文章标签关系
  292. * */
  293. public function tagRelationSave($params)
  294. {
  295. $userId = $this->getAuthUserId();
  296. $ret = $this->blogTagRelationModel->tagRelationSave($params, $userId);
  297. //更新所有页面缓存
  298. WebFacade::clearPageCache('urla:');
  299. return $ret;
  300. }
  301. /**
  302. * 根据文章标签 保存文章关系
  303. * */
  304. public function addRelationByTagId($tagId, $blogIds)
  305. {
  306. $userId = $this->getAuthUserId();
  307. $ret = $this->blogTagRelationModel->addByTagId($tagId, $blogIds, $userId);
  308. //更新所有页面缓存
  309. WebFacade::clearPageCache('urla:');
  310. return $ret;
  311. }
  312. /**
  313. * 根据标签id及文章id 删除关联关系
  314. * */
  315. public function delTagRelation($tagId, $blogId)
  316. {
  317. $ret = $this->blogTagRelationModel->delTagRelation($tagId, $blogId);
  318. //更新所有页面缓存
  319. WebFacade::clearPageCache('urla:');
  320. return $ret;
  321. }
  322. /**
  323. * 获取文章板块列表
  324. * */
  325. public function getBlogPlateList($params)
  326. {
  327. return $this->plateModel->getBlogPlateList($params);
  328. }
  329. /**
  330. * 文章板块保存
  331. * */
  332. public function saveBlogPlate($params)
  333. {
  334. $saveData = [];
  335. $userId = $this->getAuthUserId();
  336. if (!empty($params['seo_data'])) {
  337. $urlaUnique = WebFacade::checkUrlaUnique($params['seo_data']['urla'], $params['seo_id']);
  338. if (!$urlaUnique) {
  339. throw new ApiException(10019, ['name' => $params['seo_data']['urla']]);
  340. }
  341. }
  342. if (!empty($params['id'])) {
  343. $saveData['id'] = $params['id'];
  344. if (isset($params['plate_name'])) {
  345. $nameUnique = $this->plateModel->checkPlateNameUnique($params['plate_name'], $params['id']);
  346. if (!$nameUnique) {
  347. throw new ApiException(10018, ['name' => $params['plate_name']]);
  348. }
  349. $saveData['plate_name'] = $params['plate_name'];
  350. }
  351. if (isset($params['status'])) {
  352. $saveData['status'] = $params['status'];
  353. }
  354. if (isset($params['sort'])) {
  355. $saveData['sort'] = $params['sort'];
  356. }
  357. } else {
  358. $nameUnique = $this->plateModel->checkPlateNameUnique($params['plate_name']);
  359. if (!$nameUnique) {
  360. throw new ApiException(10018, ['name' => $params['plate_name']]);
  361. }
  362. $saveData['user_id'] = $userId;
  363. $saveData['plate_name'] = $params['plate_name'];
  364. $saveData['sort'] = empty($params['sort']) ? 0 : $params['sort'];
  365. }
  366. $id = $this->plateModel->savePlateData($saveData);
  367. if (!empty($id) && isset($params['seo_data'])) {
  368. $seoParams = [
  369. 'relation_table' => WebService::RELATION_TABLE_BLOG_PLATE,
  370. 'relation_id' => $id,
  371. 'urla' => $params['seo_data']['urla'],
  372. 'seo_title' => $params['seo_data']['seo_title'],
  373. 'seo_keyword' => $params['seo_data']['seo_keyword'],
  374. 'seo_describe' => $params['seo_data']['seo_describe']
  375. ];
  376. if (empty($params['seo_id'])) {
  377. $seoParams['user_id'] = $userId;
  378. $urlaId = WebFacade::saveSeoData($seoParams);
  379. $this->plateModel->newInstance()->where('id', '=', $id)->update(['seo_id' => $urlaId]);
  380. } else {
  381. $seoParams['id'] = $params['seo_id'];
  382. $urlaId = WebFacade::saveSeoData($seoParams);
  383. }
  384. if (!empty($saveData['status']) && $saveData['status'] == 2) {
  385. //移除对应seo
  386. $delSeoParams = [];
  387. $delSeoParams['relation_table'] = WebService::RELATION_TABLE_BLOG_PLATE;
  388. $delSeoParams['relation_id'] = $id;
  389. $ret = WebFacade::delSeoByRelation($delSeoParams);
  390. }
  391. }
  392. //更新所有页面缓存
  393. WebFacade::clearPageCache('urla:');
  394. return $id;
  395. }
  396. /**
  397. * 获取文章板块详情
  398. * */
  399. public function getBlogPlateInfo($params)
  400. {
  401. return $this->plateModel->getBlogPlateInfo($params);
  402. }
  403. /**
  404. * 保存文章数据
  405. * */
  406. public function saveBlog($params)
  407. {
  408. $saveData = $this->buildBlogData($params);
  409. $userId = $this->getAuthUserId();
  410. $typeIds = empty($params['type_ids']) ? [] : $params['type_ids'];
  411. $tagIds = empty($params['tag_ids']) ? [] : $params['tag_ids'];
  412. $seoData = empty($params['seo_data']) ? [] : $params['seo_data'];
  413. $urlaId = empty($saveData['seo_id']) ? 0 : $saveData['seo_id'];
  414. if (!empty($seoData)) {
  415. $urlaUnique = WebFacade::checkUrlaUnique($seoData['urla'], $urlaId);
  416. if (!$urlaUnique) {
  417. throw new ApiException(10019, ['name' => $seoData['urla']]);
  418. }
  419. }
  420. $id = $this->model->saveBlogData($saveData);
  421. if (!empty($id)) {
  422. if (isset($params['seo_data'])) {
  423. $seoParams = [];
  424. $seoParams['relation_table'] = WebService::RELATION_TABLE_BLOG;
  425. $seoParams['relation_id'] = $id;
  426. $seoParams['urla'] = $seoData['urla'];
  427. $seoParams['seo_title'] = $seoData['seo_title'];
  428. $seoParams['seo_keyword'] = $seoData['seo_keyword'];
  429. $seoParams['seo_describe'] = $seoData['seo_describe'];
  430. if (empty($urlaId)) {
  431. $seoParams['user_id'] = $userId;
  432. $urlaId = WebFacade::saveSeoData($seoParams);
  433. $this->model->newInstance()->where('id', '=', $id)->update(['seo_id' => $urlaId]);
  434. } else {
  435. $seoParams['id'] = $urlaId;
  436. $urlaId = WebFacade::saveSeoData($seoParams);
  437. }
  438. }
  439. if (isset($params['type_ids'])) {
  440. $blogTypeParams = [];
  441. $blogTypeParams['blog_id'] = $id;
  442. $blogTypeParams['type_ids'] = $typeIds;
  443. $this->blogTypeRelationModel->typeRelationSave($blogTypeParams, $userId);
  444. }
  445. if (isset($params['tag_ids'])) {
  446. $blogTagParams = [];
  447. $blogTagParams['blog_id'] = $id;
  448. $blogTagParams['tag_ids'] = $tagIds;
  449. $this->blogTagRelationModel->tagRelationSave($blogTagParams, $userId);
  450. }
  451. // 获取是否需要修改排序数据
  452. if (isset($saveData['sort'])) {
  453. $getData = $this->model->selectRaw('id')
  454. ->where('sort', '=', $saveData['sort'])
  455. ->where('plate_id', '=', $params['plate_id'])
  456. ->where('id', '<>', $id)->first();
  457. if (!empty($getData['id'])) {
  458. $this->model->where('sort', '>=', $saveData['sort'])
  459. ->where('plate_id', '=', $params['plate_id'])
  460. ->where('id', '<>', $id)
  461. ->update(['sort' => DB::raw('sort + 1')]);
  462. }
  463. }
  464. if (!empty($params['id']) && !empty($params['virtual_view'])) {
  465. $this->updatePv($params['id'], $params['virtual_view']);
  466. }
  467. if (!empty($saveData['status']) && $saveData['status'] == 2) {
  468. //移除对应seo
  469. $delSeoParams = [];
  470. $delSeoParams['relation_table'] = WebService::RELATION_TABLE_BLOG;
  471. $delSeoParams['relation_id'] = $id;
  472. $ret = WebFacade::delSeoByRelation($delSeoParams);
  473. }
  474. }
  475. //更新所有页面缓存
  476. WebFacade::clearPageCache('urla:');
  477. return $id;
  478. }
  479. /**
  480. * 构造虚拟阅读量
  481. * */
  482. public function blogUvFactory()
  483. {
  484. $page = 1;
  485. $total = 0;
  486. do {
  487. $where = [];
  488. $where['page_size'] = 500;
  489. $where['page'] = $page;
  490. $where['status'] = 0;
  491. $where['lt_total_view'] = 1000;
  492. $blogData = $this->model->getBlogList($where, 'a.id,a.virtual_view,a.total_view');
  493. if (!empty($blogData) && !empty($blogData['data'])) {
  494. $total = $blogData['total'];
  495. $data = $blogData['data'];
  496. $updateUvStr = '';
  497. // 规则:小于1千数随记增加 150以内位数
  498. foreach ($data as $item) {
  499. $value = 0;
  500. if ($item['total_view'] < 1000) {
  501. $value = mt_rand(0, 150);
  502. }
  503. /* if($item['total_view']<1000){
  504. $value= mt_rand(0, 150);
  505. }else if($item['total_view']<5000){
  506. $value= mt_rand(0, 99);
  507. }else{
  508. $value= mt_rand(0, 9);
  509. }*/
  510. $this->upBlogPv($item['id'], $value);
  511. }
  512. }
  513. $page++;
  514. } while ($total > ($page * 500));
  515. WebFacade::clearPageCache('urla:');
  516. }
  517. /**
  518. * 文章推荐设置
  519. * */
  520. public function recommendSet($params)
  521. {
  522. $id = empty($params['id']) ? 0 : $params['id'];
  523. $isRecommend = empty($params['is_recommend']) ? 0 : $params['is_recommend'];
  524. $ret = $this->model->where('id', '=', $id)
  525. ->update(['is_recommend' => $isRecommend, 'update_time' => nowTime()]);
  526. //更新所有页面缓存
  527. WebFacade::clearPageCache('urla:');
  528. return $id;
  529. }
  530. /**
  531. * 构建文章保存数据
  532. * */
  533. private function buildBlogData($params)
  534. {
  535. $saveData = [];
  536. $userId = $this->getAuthUserId();
  537. $nowTime = nowTime();
  538. $saveData['update_time'] = $nowTime;
  539. if (!empty($params['id'])) {
  540. $saveData['id'] = $params['id'];
  541. if (isset($params['seo_id'])) {
  542. $saveData['seo_id'] = $params['seo_id'];
  543. }
  544. if (isset($params['pub_date'])) {
  545. $saveData['pub_date'] = empty($params['pub_date']) ? null : $params['pub_date'];;
  546. }
  547. if (isset($params['title'])) {
  548. $nameUnique = $this->model->checkNameUnique($params['title'], $params['id']);
  549. if (!$nameUnique) {
  550. throw new ApiException(10018, ['name' => $params['title']]);
  551. }
  552. $saveData['title'] = empty($params['title']) ? '' : $params['title'];
  553. }
  554. if (isset($params['content'])) {
  555. $saveData['content'] = empty($params['content']) ? '' : $params['content'];
  556. }
  557. if (isset($params['outline_bar'])) {
  558. $saveData['outline_bar'] = empty($params['outline_bar']) ? '' : json_encode($params['outline_bar']);
  559. }
  560. if (isset($params['description'])) {
  561. $saveData['description'] = empty($params['description']) ? '' : $params['description'];
  562. }
  563. if (isset($params['image_url'])) {
  564. $saveData['image_url'] = empty($params['image_url']) ? '' : $params['image_url'];
  565. }
  566. if (isset($params['image_alt'])) {
  567. $saveData['image_alt'] = empty($params['image_alt']) ? '' : $params['image_alt'];
  568. }
  569. if (isset($params['main_image'])) {
  570. $saveData['main_image'] = empty($params['main_image']) ? '' : $params['main_image'];
  571. }
  572. if (isset($params['main_image_alt'])) {
  573. $saveData['main_image_alt'] = empty($params['main_image_alt']) ? '' : $params['main_image_alt'];
  574. }
  575. if (isset($params['download_url'])) {
  576. $saveData['download_url'] = empty($params['download_url']) ? '' : json_encode($params['download_url']);
  577. }
  578. if (isset($params['sort'])) {
  579. $saveData['sort'] = empty($params['sort']) ? 0 : $params['sort'];
  580. }
  581. if (isset($params['is_top'])) {
  582. $saveData['is_top'] = empty($params['is_top']) ? 0 : $params['is_top'];
  583. }
  584. if (!empty($params['plate_id'])) {
  585. $saveData['plate_id'] = $params['plate_id'];
  586. }
  587. if (isset($params['status'])) {
  588. $saveData['status'] = $params['status'];
  589. }
  590. if (isset($params['route_path'])) {
  591. $saveData['route_path'] = $params['route_path'];
  592. }
  593. if (isset($params['author'])) {
  594. $saveData['author'] = $params['author'];
  595. }
  596. if (isset($params['expand_content'])) {
  597. $saveData['expand_content'] = empty($params['expand_content']) ? '' : json_encode($params['expand_content']);
  598. }
  599. } else {
  600. $nameUnique = $this->model->checkNameUnique($params['title']);
  601. if (!$nameUnique) {
  602. throw new ApiException(10018, ['name' => $params['title']]);
  603. }
  604. if (empty($params['plate_id'])) {
  605. throw new ApiException(11001);
  606. }
  607. if (empty($params['title'])) {
  608. throw new ApiException(11002);
  609. }
  610. if (isset($params['status'])) {
  611. $saveData['status'] = $params['status'];
  612. }
  613. $saveData['user_id'] = $userId;
  614. $saveData['plate_id'] = $params['plate_id'];
  615. $saveData['pub_date'] = empty($params['pub_date']) ? null : $params['pub_date'];
  616. $saveData['title'] = empty($params['title']) ? '' : $params['title'];
  617. $saveData['content'] = empty($params['content']) ? '' : $params['content'];
  618. $saveData['outline_bar'] = empty($params['outline_bar']) ? '' : json_encode($params['outline_bar']);
  619. $saveData['description'] = empty($params['description']) ? '' : $params['description'];
  620. $saveData['image_url'] = empty($params['image_url']) ? '' : $params['image_url'];
  621. $saveData['image_alt'] = empty($params['image_alt']) ? '' : $params['image_alt'];
  622. $saveData['main_image'] = empty($params['main_image']) ? '' : $params['main_image'];
  623. $saveData['main_image_alt'] = empty($params['main_image_alt']) ? '' : $params['main_image_alt'];
  624. $saveData['virtual_view'] = empty($params['virtual_view']) ? 0 : $params['virtual_view'];
  625. $saveData['total_view'] = $saveData['virtual_view'];
  626. $saveData['download_url'] = empty($params['download_url']) ? '' : json_encode($params['download_url']);
  627. $saveData['expand_content'] = empty($params['expand_content']) ? '' : json_encode($params['expand_content']);
  628. $saveData['sort'] = empty($params['sort']) ? 0 : $params['sort'];
  629. $saveData['create_time'] = $nowTime;
  630. if (isset($params['author'])) {
  631. $saveData['author'] = $params['author'];
  632. }
  633. }
  634. return $saveData;
  635. }
  636. public function updatePv($id, $newVirtualView)
  637. {
  638. $virtualView = $this->getFieldById('virtual_view', $id);
  639. $value = $newVirtualView - $virtualView;
  640. $ret = $this->model->where('id', '=', $id)->increment('total_view', $value);
  641. $ret = $this->model->where('id', '=', $id)->increment('virtual_view', $value);
  642. WebFacade::clearPageCache('urla:');
  643. return $ret;
  644. }
  645. /**
  646. * 更新文章浏览量
  647. * */
  648. public function upBlogPv($blogId, $value = 1)
  649. {
  650. if ($value > 1) {
  651. $ret = $this->model->where('id', '=', $blogId)->increment('total_view', $value);
  652. $ret = $this->model->where('id', '=', $blogId)->increment('virtual_view', $value);
  653. } else {
  654. $totalView = $this->getFieldById('total_view', $blogId);
  655. $value = (($value * -1) > $totalView) ? ($totalView * -1) : $value;
  656. $ret = $this->model->where('id', '=', $blogId)->increment('total_view', $value);
  657. }
  658. return $ret;
  659. }
  660. /**
  661. * 文章列表
  662. * */
  663. public function getBlogList($params)
  664. {
  665. $ret = $this->model->getBlogList($params);
  666. $pageListData = empty($ret['data']) ? [] : $ret['data'];
  667. if (!empty($pageListData)) {
  668. foreach ($pageListData as &$pageItem) {
  669. $pageItem['expand_content'] = empty($pageItem['expand_content']) ? [] : json_decode($pageItem['expand_content'], true);
  670. }
  671. }
  672. $ret['data'] = $pageListData;
  673. return $ret;
  674. }
  675. /**
  676. * 获取文章详情
  677. * */
  678. public function getBlogInfo($params)
  679. {
  680. $blogInfo = $this->model->getBlogInfo($params);
  681. if (!empty($blogInfo)) {
  682. if (!empty($blogInfo['seo_id'])) {
  683. $blogInfo['seo_data'] = WebFacade::getSeoInfo(['id' => $blogInfo['seo_id']]);
  684. } else {
  685. $blogInfo['seo_data'] = [
  686. 'seo_describe' => '',
  687. 'seo_keyword' => '',
  688. 'seo_title' => '',
  689. 'urla' => ''
  690. ];
  691. }
  692. if (!empty($blogInfo['download_url'])) {
  693. $blogInfo['download_url'] = json_decode($blogInfo['download_url'], true);
  694. } else {
  695. $blogInfo['download_url'] = [];
  696. }
  697. $blogInfo['type_ids'] = $this->blogTypeRelationModel->getTypeIds($blogInfo['id']);
  698. $blogInfo['tag_ids'] = $this->blogTagRelationModel->getTagIds($blogInfo['id']);
  699. $blogInfo['expand_content'] = empty($blogInfo['expand_content']) ? [] : json_decode($blogInfo['expand_content'], true);
  700. if (!empty($blogInfo['outline_bar'])) {
  701. $blogInfo['outline_bar'] = json_decode($blogInfo['outline_bar'], true);
  702. }
  703. }
  704. return $blogInfo;
  705. }
  706. /**
  707. * 获取文章分类未关联的文章
  708. * */
  709. public function getUnrelatedBlogByTypeIds($params)
  710. {
  711. $ret = $this->model->getUnrelatedBlogByTypeIds($params);
  712. return $ret;
  713. }
  714. /**
  715. * 获取文章标签未关联的文章
  716. * */
  717. public function getUnrelatedBlogByTagIds($params)
  718. {
  719. $ret = $this->model->getUnrelatedBlogByTagIds($params);
  720. return $ret;
  721. }
  722. /**
  723. * 获取已发布的连接
  724. * */
  725. public function getPublishBlogList($params, $fields = '')
  726. {
  727. if (empty($fields)) {
  728. $fields = 'a.id,a.plate_id,a.pub_date,a.title,a.description,a.image_url,a.image_alt,a.is_top,a.is_recommend,a.download_url,a.total_view,b.urla';
  729. }
  730. $blogList = $this->model->getPublishBlogList($params, $fields);
  731. $blogIds = array_column($blogList, 'id');
  732. if ($blogIds) {
  733. $newestTypeAndTagData = $this->getTypeAndTagDataByBlogId($blogIds);
  734. foreach ($blogList as &$newestItem) {
  735. if (!empty($newestTypeAndTagData[$newestItem['id']]['type_items'])) {
  736. $newestItem['type_items'] = $newestTypeAndTagData[$newestItem['id']]['type_items'];
  737. } else {
  738. $newestItem['type_items'] = [];
  739. }
  740. if (!empty($newestTypeAndTagData[$newestItem['id']]['tag_items'])) {
  741. $newestItem['tag_items'] = $newestTypeAndTagData[$newestItem['id']]['tag_items'];
  742. } else {
  743. $newestItem['tag_items'] = [];
  744. }
  745. $newestItem['expand_content'] = empty($newestItem['expand_content']) ? [] : json_decode($newestItem['expand_content'], true);
  746. }
  747. }
  748. return $blogList;
  749. }
  750. /**
  751. * 获取文章详情渲染数据
  752. * */
  753. public function getBlogRenderData($params)
  754. {
  755. $blogInfo = $this->model->getBlogInfo($params);
  756. if (!empty($blogInfo)) {
  757. if (!empty($blogInfo['outline_bar'])) {
  758. $blogInfo['outline_bar'] = json_decode($blogInfo['outline_bar'], true);
  759. }
  760. $newestTypeAndTagData = $this->getTypeAndTagDataByBlogId([$blogInfo['id']]);
  761. if (!empty($newestTypeAndTagData[$blogInfo['id']]['type_items'])) {
  762. $blogInfo['type_items'] = $newestTypeAndTagData[$blogInfo['id']]['type_items'];
  763. } else {
  764. $blogInfo['type_items'] = [];
  765. }
  766. if (!empty($newestTypeAndTagData[$blogInfo['id']]['tag_items'])) {
  767. $blogInfo['tag_items'] = $newestTypeAndTagData[$blogInfo['id']]['tag_items'];
  768. } else {
  769. $blogInfo['tag_items'] = [];
  770. }
  771. $blogInfo['seo_data'] = WebFacade::getSeoInfo(['id' => $blogInfo['seo_id']]);
  772. $blogInfo['expand_content'] = empty($blogInfo['expand_content']) ? [] : json_decode($blogInfo['expand_content'], true);
  773. }
  774. return $blogInfo;
  775. }
  776. /**
  777. * 获取文章列表页渲染数据
  778. * */
  779. public function getBlogRecentlyData($params = [])
  780. {
  781. $data = [
  782. 'newest_list' => [],//最新文章列表
  783. 'newest_plate_list' => [],//最新板块文章列表
  784. 'hot_news_list' => [],//热门文章列表
  785. 'recommend_news_list' => [],//推荐文章列表
  786. 'hot_news_tag' => [],//热门文章标签
  787. 'ad_block_list' => [],//广告块
  788. ];
  789. $data['newest_plate_list'] = $this->getNewestPlateList($params);
  790. $data['newest_list'] = $this->getNewestList($params);
  791. $data['hot_news_list'] = $this->getHotList($params);
  792. $data['recommend_news_list'] = $this->getRecommendList($params);
  793. $data['hot_news_tag'] = $this->blogTagModel->getBaseTagList(['is_hot' => 1]);
  794. return $data;
  795. }
  796. /**
  797. * 获取板块文章列表页渲染数据
  798. * */
  799. public function getBlogPlateRenderData($params = [])
  800. {
  801. $data = [
  802. 'plate_info' => [],//最新板块文章列表
  803. 'plate_blog_list' => [],//文章板块列表
  804. 'hot_news_list' => [],//热门文章列表
  805. 'recommend_news_list' => [],//推荐文章列表
  806. 'hot_news_tag' => [],//热门标签
  807. ];
  808. $plateWhere = [];
  809. $plateWhere['status'] = 0;
  810. $plateWhere['id'] = empty($params['plate_id']) ? 0 : $params['plate_id'];
  811. $blogPlateInfo = $this->plateModel->getBlogPlateInfo($plateWhere);
  812. $data['plate_info'] = $blogPlateInfo;
  813. $data['plate_blog_list'] = $this->getBlogPlateTypeData($blogPlateInfo['id']);
  814. //板块热门
  815. $data['hot_news_list'] = $this->getHotList($params);
  816. //板块推荐
  817. $data['recommend_news_list'] = $this->getRecommendList($params);
  818. //板块热门标签
  819. $data['hot_news_tag'] = $this->blogTagModel->getBaseTagList(['is_hot' => 1]);
  820. return $data;
  821. }
  822. /**
  823. * 获取类型文章列表页渲染数据
  824. * */
  825. public function getBlogTypeRenderData($params = [])
  826. {
  827. $data = [
  828. 'type_info' => [],//最新板块文章列表
  829. 'type_blog_list' => [],//文章板块列表
  830. 'hot_news_list' => [],//热门文章列表
  831. 'recommend_news_list' => [],//推荐文章列表
  832. 'hot_news_tag' => [],//热门标签
  833. ];
  834. $typeWhere = [];
  835. $typeWhere['status'] = 0;
  836. $typeWhere['id'] = empty($params['type_id']) ? 0 : $params['type_id'];
  837. $typeInfo = $this->blogTypeModel->getBlogTypeInfo($typeWhere);
  838. $blogTypeListParams = [];
  839. $blogTypeListParams['page_size'] = 6;
  840. $fields = 'a.id,a.plate_id,a.pub_date,a.title,a.description,a.image_url,a.image_alt,a.is_top,a.is_recommend,a.download_url,a.total_view,b.type_id,c.urla';
  841. $blogList = $this->model->getRenderListByTypeIds([$typeInfo['id']], $blogTypeListParams, $fields);
  842. $blogIds = array_column($blogList, 'id');
  843. $typeInfo['blog_list'] = [];
  844. if ($blogIds) {
  845. $blogTypeAndTagData = $this->getTypeAndTagDataByBlogId($blogIds);
  846. foreach ($blogList as $blogItem) {
  847. if (!empty($blogTypeAndTagData[$blogItem['id']]['type_items'])) {
  848. $blogItem['type_items'] = $blogTypeAndTagData[$blogItem['id']]['type_items'];
  849. } else {
  850. $blogItem['type_items'] = [];
  851. }
  852. if (!empty($blogTypeAndTagData[$blogItem['id']]['tag_items'])) {
  853. $blogItem['tag_items'] = $blogTypeAndTagData[$blogItem['id']]['tag_items'];
  854. } else {
  855. $blogItem['tag_items'] = [];
  856. }
  857. $typeInfo['blog_list'][] = $blogItem;
  858. }
  859. }
  860. $data['type_info'] = $typeInfo;
  861. //热门文章列表
  862. $data['hot_news_list'] = $this->getHotList($params);
  863. //推荐文章列表
  864. $data['recommend_news_list'] = $this->getRecommendList($params);
  865. //热门标签
  866. $data['hot_news_tag'] = $this->blogTagModel->getBaseTagList(['is_hot' => 1]);
  867. return $data;
  868. }
  869. /**
  870. * 获取标签文章列表页渲染数据
  871. * */
  872. public function getBlogTagRenderData($params = [])
  873. {
  874. $data = [
  875. 'tag_info' => [],//最新板块文章列表
  876. 'tag_blog_list' => [],//文章板块列表
  877. 'hot_news_list' => [],//热门文章列表
  878. 'recommend_news_list' => [],//推荐文章列表
  879. 'hot_news_tag' => [],//热门标签
  880. ];
  881. $tagWhere = [];
  882. $tagWhere['status'] = 0;
  883. $tagWhere['id'] = empty($params['tag_id']) ? 0 : $params['tag_id'];
  884. $tagInfo = $this->blogTagModel->getBlogTagInfo($tagWhere);
  885. $blogTagListParams = [];
  886. $blogTagListParams['page_size'] = 6;
  887. $fields = 'a.id,a.plate_id,a.pub_date,a.title,a.description,a.image_url,a.image_alt,a.is_top,a.is_recommend,a.download_url,a.total_view,b.tag_id,c.urla';
  888. $blogList = $this->model->getRenderListByTagIds([$tagInfo['id']], $blogTagListParams, $fields);
  889. $blogIds = array_column($blogList, 'id');
  890. $tagInfo['blog_list'] = [];
  891. if ($blogIds) {
  892. $blogTypeAndTagData = $this->getTypeAndTagDataByBlogId($blogIds);
  893. foreach ($blogList as $blogItem) {
  894. if (!empty($blogTypeAndTagData[$blogItem['id']]['type_items'])) {
  895. $blogItem['type_items'] = $blogTypeAndTagData[$blogItem['id']]['type_items'];
  896. } else {
  897. $blogItem['type_items'] = [];
  898. }
  899. if (!empty($blogTypeAndTagData[$blogItem['id']]['tag_items'])) {
  900. $blogItem['tag_items'] = $blogTypeAndTagData[$blogItem['id']]['tag_items'];
  901. } else {
  902. $blogItem['tag_items'] = [];
  903. }
  904. $tagInfo['blog_list'][] = $blogItem;
  905. }
  906. }
  907. $data['tag_info'] = $tagInfo;
  908. //热门文章列表
  909. $data['hot_news_list'] = $this->getHotList($params);
  910. //推荐文章列表
  911. $data['recommend_news_list'] = $this->getRecommendList($params);
  912. //热门标签
  913. $data['hot_news_tag'] = $this->blogTagModel->getBaseTagList(['is_hot' => 1]);
  914. return $data;
  915. }
  916. /**
  917. * 获取文章板块类型对应的默认列表数据
  918. * */
  919. public function getBlogPlateTypeData($plate_id)
  920. {
  921. $blogTypeDataList = $this->blogTypeModel->getBlogTypeList(['status' => 0, 'page_size' => 999]);
  922. $blogTypeData = empty($blogTypeDataList['data']) ? [] : $blogTypeDataList['data'];
  923. $resultData = [];
  924. if (!empty($blogTypeData)) {
  925. $blogTypeData = mapByKey($blogTypeData, 'id');
  926. $typeIds = array_keys($blogTypeData);
  927. }
  928. if (!empty($typeIds)) {
  929. $blogTypeListParams = [];
  930. $blogTypeListParams['page_size'] = 6;
  931. $blogTypeListParams['plate_id'] = $plate_id;
  932. $fields = 'a.id,a.plate_id,a.pub_date,a.title,a.description,a.image_url,a.image_alt,a.is_top,a.is_recommend,a.download_url,a.total_view,b.type_id,c.urla';
  933. $blogList = $this->model->getRenderListByTypeIds($typeIds, $blogTypeListParams, $fields);
  934. $blogIds = array_column($blogList, 'id');
  935. $plateBlogListData = [];
  936. if ($blogIds) {
  937. $blogTypeAndTagData = $this->getTypeAndTagDataByBlogId($blogIds);
  938. foreach ($blogList as $blogItem) {
  939. if (!empty($blogTypeAndTagData[$blogItem['id']]['type_items'])) {
  940. $blogItem['type_items'] = $blogTypeAndTagData[$blogItem['id']]['type_items'];
  941. } else {
  942. $blogItem['type_items'] = [];
  943. }
  944. if (!empty($blogTypeAndTagData[$blogItem['id']]['tag_items'])) {
  945. $blogItem['tag_items'] = $blogTypeAndTagData[$blogItem['id']]['tag_items'];
  946. } else {
  947. $blogItem['tag_items'] = [];
  948. }
  949. $plateBlogListData[$blogItem['type_id']][] = $blogItem;
  950. }
  951. }
  952. $allResultData = [
  953. 'id' => 0,
  954. 'user_id' => 0,
  955. 'type_name' => '全部',
  956. 'sort' => 0,
  957. 'seo_id' => 0,
  958. 'status' => 0,
  959. 'blog_list' => []
  960. ];
  961. $fields = 'a.id,a.plate_id,a.pub_date,a.title,a.description,a.image_url,a.image_alt,a.is_top,a.is_recommend,a.download_url,a.total_view,b.urla';
  962. $blogTypeListParams['sort']['is_top'] = 1;
  963. $blogTypeListParams['sort']['pub_date'] = 1;
  964. $allPlateList = $this->getPublishBlogList($blogTypeListParams, $fields);
  965. if (!empty($allPlateList)) {
  966. $allResultData['blog_list'] = $allPlateList;
  967. }
  968. $resultData[] = $allResultData;
  969. foreach ($blogTypeData as $value) {
  970. if (!empty($plateBlogListData[$value['id']])) {
  971. $value['blog_list'] = $plateBlogListData[$value['id']];
  972. $resultData[] = $value;
  973. }
  974. }
  975. }
  976. return $resultData;
  977. }
  978. /**
  979. * 最新文章列表
  980. * */
  981. public function getNewestList($params)
  982. {
  983. $newestListParams = [];
  984. $newestListParams['page_size'] = empty($params['newest_page_size']) ? 7 : $params['newest_page_size'];
  985. $newestListParams['sort']['is_top'] = 1;
  986. $newestListParams['sort']['pub_date'] = 1;
  987. $newestList = $this->getPublishBlogList($newestListParams);
  988. return $newestList;
  989. }
  990. /**
  991. * 热门文章列表
  992. * */
  993. public function getHotList($params)
  994. {
  995. $hotListParams = [];
  996. $hotListParams['page_size'] = empty($params['hot_news_size']) ? 4 : $params['hot_news_size'];
  997. $hotListParams['sort']['is_hot'] = 1;
  998. $hotListParams['sort']['pub_date'] = 1;
  999. $hotList = $this->getPublishBlogList($hotListParams);
  1000. return $hotList;
  1001. }
  1002. /**
  1003. * 推荐文章列表
  1004. * */
  1005. public function getRecommendList($params)
  1006. {
  1007. $recommendListParams = [];
  1008. $recommendListParams['page_size'] = empty($params['recommend_news_size']) ? 4 : $params['recommend_news_size'];
  1009. $recommendListParams['sort']['is_recommend'] = 1;
  1010. $recommendListParams['sort']['pub_date'] = 1;
  1011. $recommendList = $this->getPublishBlogList($recommendListParams);
  1012. return $recommendList;
  1013. }
  1014. /**
  1015. * 最新板块文章列表
  1016. * */
  1017. public function getNewestPlateList($params)
  1018. {
  1019. $plateIds = [];
  1020. $resultData = [];
  1021. $plateWhere = [];
  1022. $plateWhere['status'] = 0;
  1023. $plateWhere['page_size'] = 999;
  1024. $plateDataList = $this->plateModel->getBlogPlateList($plateWhere, 'a.id,a.plate_name,a.plate_des,b.urla');
  1025. $plateData = empty($plateDataList['data']) ? [] : $plateDataList['data'];
  1026. if (!empty($plateData)) {
  1027. $plateData = mapByKey($plateData, 'id');
  1028. $plateIds = array_keys($plateData);
  1029. }
  1030. if (!empty($plateIds)) {
  1031. $newestPlateParams = [];
  1032. $newestPlateParams['page_size'] = empty($params['newest_plate_page_size']) ? 6 : $params['newest_plate_page_size'];
  1033. $fields = 'a.id,a.plate_id,a.pub_date,a.title,a.description,a.image_url,a.image_alt,a.is_top,a.is_recommend,a.download_url,a.total_view,b.urla';
  1034. $newestPlateList = $this->model->getNewestPlateList($plateIds, $newestPlateParams, $fields);
  1035. $newestBlogId = array_column($newestPlateList, 'id');
  1036. $plateBlogListData = [];
  1037. if ($newestBlogId) {
  1038. $newestTypeAndTagData = $this->getTypeAndTagDataByBlogId($newestBlogId);
  1039. foreach ($newestPlateList as $newestItem) {
  1040. if (!empty($newestTypeAndTagData[$newestItem['id']]['type_items'])) {
  1041. $newestItem['type_items'] = $newestTypeAndTagData[$newestItem['id']]['type_items'];
  1042. } else {
  1043. $newestItem['type_items'] = [];
  1044. }
  1045. if (!empty($newestTypeAndTagData[$newestItem['id']]['tag_items'])) {
  1046. $newestItem['tag_items'] = $newestTypeAndTagData[$newestItem['id']]['tag_items'];
  1047. } else {
  1048. $newestItem['tag_items'] = [];
  1049. }
  1050. $plateBlogListData[$newestItem['plate_id']][] = $newestItem;
  1051. }
  1052. }
  1053. foreach ($plateData as $value) {
  1054. if (!empty($plateBlogListData[$value['id']])) {
  1055. $value['blog_list'] = $plateBlogListData[$value['id']];
  1056. $resultData[] = $value;
  1057. }
  1058. }
  1059. }
  1060. return $resultData;
  1061. }
  1062. /**
  1063. * 根据文章id获取文章类型及文章标签数据
  1064. * */
  1065. public function getTypeAndTagDataByBlogId($newestBlogIds)
  1066. {
  1067. $resultData = [];
  1068. $newestTypeData = $this->blogTypeRelationModel->getTypeListByBlogIds($newestBlogIds);
  1069. foreach ($newestTypeData as $typeItem) {
  1070. $resultData[$typeItem['blog_id']]['type_items'][] = $typeItem;
  1071. }
  1072. $newestTagData = $this->blogTagRelationModel->getTagListByBlogIds($newestBlogIds);
  1073. foreach ($newestTagData as $tagItem) {
  1074. $resultData[$tagItem['blog_id']]['tag_items'][] = $tagItem;
  1075. }
  1076. return $resultData;
  1077. }
  1078. /**
  1079. * 根据类型id获取文章
  1080. * */
  1081. public function getPublishBlogListByTypeId($params)
  1082. {
  1083. $fields = 'a.id,a.plate_id,a.pub_date,a.title,a.description,a.image_url,a.image_alt,a.is_top,a.is_recommend,a.download_url,a.total_view,b.type_id,c.urla';
  1084. $ret = $this->model->getPublishBlogListByTypeId($params, $fields);
  1085. $blogData = empty($ret['data']) ? [] : $ret['data'];
  1086. if (!empty($blogData)) {
  1087. $newestBlogIds = array_column($blogData, 'id');
  1088. $newestTypeAndTagData = $this->getTypeAndTagDataByBlogId($newestBlogIds);
  1089. foreach ($blogData as &$newestItem) {
  1090. if (!empty($newestTypeAndTagData[$newestItem['id']]['type_items'])) {
  1091. $newestItem['type_items'] = $newestTypeAndTagData[$newestItem['id']]['type_items'];
  1092. } else {
  1093. $newestItem['type_items'] = [];
  1094. }
  1095. if (!empty($newestTypeAndTagData[$newestItem['id']]['tag_items'])) {
  1096. $newestItem['tag_items'] = $newestTypeAndTagData[$newestItem['id']]['tag_items'];
  1097. } else {
  1098. $newestItem['tag_items'] = [];
  1099. }
  1100. }
  1101. $ret['data'] = $blogData;
  1102. }
  1103. return $ret;
  1104. }
  1105. /**
  1106. * 根据标签id获取文章
  1107. * */
  1108. public function getPublishBlogListByTagId($params)
  1109. {
  1110. $fields = 'a.id,a.plate_id,a.pub_date,a.title,a.description,a.image_url,a.image_alt,a.is_top,a.is_recommend,a.download_url,a.total_view,b.tag_id,c.urla';
  1111. $ret = $this->model->getPublishBlogListByTagId($params, $fields);
  1112. $blogData = empty($ret['data']) ? [] : $ret['data'];
  1113. if (!empty($blogData)) {
  1114. $newestBlogIds = array_column($blogData, 'id');
  1115. $newestTypeAndTagData = $this->getTypeAndTagDataByBlogId($newestBlogIds);
  1116. foreach ($blogData as &$newestItem) {
  1117. if (!empty($newestTypeAndTagData[$newestItem['id']]['type_items'])) {
  1118. $newestItem['type_items'] = $newestTypeAndTagData[$newestItem['id']]['type_items'];
  1119. } else {
  1120. $newestItem['type_items'] = [];
  1121. }
  1122. if (!empty($newestTypeAndTagData[$newestItem['id']]['tag_items'])) {
  1123. $newestItem['tag_items'] = $newestTypeAndTagData[$newestItem['id']]['tag_items'];
  1124. } else {
  1125. $newestItem['tag_items'] = [];
  1126. }
  1127. }
  1128. $ret['data'] = $blogData;
  1129. }
  1130. return $ret;
  1131. }
  1132. /**
  1133. * 搜索获取已发布的文章
  1134. * */
  1135. public function getSearchBlogList($params)
  1136. {
  1137. if (empty($fields)) {
  1138. $fields = 'a.id,a.title,b.urla';
  1139. }
  1140. $blogList = $this->model->getPublishBlogList($params, $fields);
  1141. return $blogList;
  1142. }
  1143. /**
  1144. * 新闻排序
  1145. */
  1146. public function changeBlogSort($blogId, $sort)
  1147. {
  1148. $data = [];
  1149. $getData = $this->findOneById($blogId, 'id,sort,plate_id');
  1150. if ($sort == 0) { // 置顶
  1151. $sortData = $this->findOneBy([
  1152. 'sort' => $sort,
  1153. 'plate_id' => $getData['plate_id'],
  1154. 'id' => ['<>', $blogId]
  1155. ], 'id');
  1156. if (empty($sortData['id'])) {
  1157. throw new ApiException(1004, ['msg' => '当前已经是最高一行']);
  1158. }
  1159. if ($getData['sort'] == 0) {
  1160. $this->incrementBy([
  1161. 'id' => ['<>', $blogId],
  1162. 'plate_id' => $getData['plate_id'],
  1163. ], 'sort');
  1164. } else {
  1165. $this->incrementBy([
  1166. 'id' => ['<', $blogId],
  1167. 'plate_id' => $getData['plate_id'],
  1168. ], 'sort');
  1169. }
  1170. $upData['sort'] = $sort;
  1171. } elseif ($sort == '-1') { // 上移
  1172. $upSortData = $this->model->where('sort', '<', $getData['sort'])
  1173. ->where('plate_id', '=', $getData['plate_id'])
  1174. ->orderBy('sort', 'desc')->first();
  1175. if (empty($upSortData)) {
  1176. throw new ApiException(1004, ['msg' => '当前已经是最高一行']);
  1177. } else {
  1178. $upData = $upSortData->toArray();
  1179. }
  1180. } elseif ($sort == '+1') { // 下移
  1181. $downSortData = $this->model->where('sort', '>', $getData['sort'])
  1182. ->where('plate_id', '=', $getData['plate_id'])
  1183. ->orderBy('sort', 'asc')->first();
  1184. if (empty($downSortData)) {
  1185. throw new ApiException(1004, ['msg' => '当前已经是最后一行']);
  1186. } else {
  1187. $upData = $downSortData->toArray();
  1188. }
  1189. }
  1190. $data['sort'] = $upData['sort'];
  1191. $this->updateBy([
  1192. 'sort' => $data['sort'],
  1193. 'plate_id' => $getData['plate_id'],
  1194. ], [
  1195. 'sort' => $getData['sort']
  1196. ]);
  1197. $is_top = 0;
  1198. if ($data['sort'] == 0) {
  1199. $is_top = 1;
  1200. }
  1201. $rst = $this->update($blogId, [
  1202. 'sort' => $data['sort'],
  1203. 'is_top' => $is_top
  1204. ]);
  1205. //更新所有页面缓存
  1206. WebFacade::clearPageCache('urla:');
  1207. return $rst;
  1208. }
  1209. /**
  1210. * 批量添加分类
  1211. * @param $params
  1212. * @return int
  1213. */
  1214. public function typePluralEdit($params)
  1215. {
  1216. $userId = $this->getAuthUserId();
  1217. $ret = 1;
  1218. foreach ($params['ids'] as $v) {
  1219. $ret = $this->blogTypeRelationModel->addByBlogId($v, $params['type_ids'], $userId);
  1220. }
  1221. return $ret;
  1222. }
  1223. /**
  1224. * 批量打标签
  1225. * @param $params
  1226. * @return int
  1227. */
  1228. public function tagPluralEdit($params)
  1229. {
  1230. $userId = $this->getAuthUserId();
  1231. $ret = 1;
  1232. foreach ($params['ids'] as $v) {
  1233. $ret = $this->blogTagRelationModel->addByBlogId($v, $params['tag_ids'], $userId);
  1234. }
  1235. return $ret;
  1236. }
  1237. /**
  1238. * 批量删除
  1239. * @param $params
  1240. * @return mixed
  1241. */
  1242. public function batchDelete($params)
  1243. {
  1244. $ids = $params['ids'];
  1245. $userId = $this->getAuthUserId();
  1246. $rst = $this->model->whereIn('id', $ids)->update(['status' => 2]);
  1247. //删除处理
  1248. if ($rst) {
  1249. $this->blogTypeRelationModel->delByBlogId($ids, $userId);
  1250. $this->blogTagRelationModel->delByBlogId($ids, $userId);
  1251. }
  1252. return $rst;
  1253. }
  1254. /**
  1255. * 批量更新状态
  1256. * @param $params
  1257. * @return mixed
  1258. */
  1259. public function batchStatus($params)
  1260. {
  1261. $ids = $params['ids'];
  1262. $status = $params['status'];
  1263. $rst = $this->model->whereIn('id', $ids)->update(['status' => $status]);
  1264. return $rst;
  1265. }
  1266. }