SiteController.php 115 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698
  1. <?php
  2. namespace App\Http\Controllers\Admin;
  3. use App\Exports\BasicExport;
  4. use App\Http\Constant\CacheConstant;
  5. use App\Http\Controllers\Controller;
  6. use App\Http\Logics\Admin\SiteLogic;
  7. use App\Http\Logics\Admin\SiteSyncLogic;
  8. use App\Http\Models\Article;
  9. use App\Http\Models\ArticleNote;
  10. use App\Http\Models\Business;
  11. use App\Http\Models\Contract;
  12. use App\Http\Models\HootsuiteHistory;
  13. use App\Http\Models\HootsuiteUser;
  14. use App\Http\Models\NotFound;
  15. use App\Http\Models\Role;
  16. use App\Http\Models\Server;
  17. use App\Http\Models\Site;
  18. use App\Http\Models\SiteAddition;
  19. use App\Http\Models\SiteEnterprise;
  20. use App\Http\Models\SiteInfo;
  21. use App\Http\Models\SiteMarketer;
  22. use App\Http\Models\SiteOptimizePage;
  23. use App\Http\Models\SitePayment;
  24. use App\Http\Models\ProjectFlowMemo;
  25. use App\Http\Models\SiteSns;
  26. use App\Http\Models\SiteStation;
  27. use App\Http\Models\Social;
  28. use App\Http\Models\SocialPublish;
  29. use App\Http\Models\User;
  30. use App\Http\Requests\Site\PaymentRequest;
  31. use App\Http\Requests\Site\SiteOverviewRequest;
  32. use App\Http\Requests\Site\CustomerRequest;
  33. use App\Http\Requests\Site\SiteSaveRequest;
  34. use App\Http\Requests\Site\SocialPublishRequest;
  35. use App\Http\Requests\Site\SocialQueueRequest;
  36. use App\Http\Requests\Site\SocialSaveRequest;
  37. use App\Imports\OptimizePageImport;
  38. use App\Imports\SocialImport;
  39. use App\Imports\SocialMessageListImport;
  40. use App\Libs\Ssh;
  41. use GuzzleHttp\Client;
  42. use Illuminate\Database\Eloquent\Builder;
  43. use Illuminate\Http\Request;
  44. use Illuminate\Support\Facades\Cache;
  45. use Illuminate\Support\Facades\DB;
  46. use Illuminate\Support\Facades\Log;
  47. use App\Http\Traits\HasSites;
  48. use Maatwebsite\Excel\Facades\Excel;
  49. use Illuminate\Contracts\View;
  50. use Illuminate\Http\JsonResponse;
  51. /**
  52. * 项目 站点 管理
  53. * Class SiteController
  54. * @package App\Http\Controllers\Admin
  55. */
  56. class SiteController extends Controller
  57. {
  58. use HasSites;
  59. protected $logic;
  60. const PC_SPEED_MEASUREMENT = 'http://googlepagespeed.yinqingli.net/?type=1&url=';
  61. const MOBILE_SPEED_MEASUREMENT = 'http://googlepagespeed.yinqingli.net/?type=2&url=';
  62. public function __construct(SiteLogic $logic)
  63. {
  64. $this->logic = $logic;
  65. }
  66. public function keyword_save(Request $request){
  67. $sync_time = strtotime(date('Y-01-01 00:00:00',time()));
  68. $next_sync_time = strtotime(date('Y-01-01 00:00:00',time()));
  69. $id = $request->input('id');
  70. $status = $request->input('status');
  71. if($status=='1'){
  72. /**
  73. *
  74. * UPDATE scn_project_keyword set sync_time='1640966400' where project_id=889;
  75. UPDATE scn_project set sync_time='1640966400' where id=889;
  76. UPDATE scn_project set next_sync_time='1640966400' where id=889;
  77. */
  78. $rankConnection = DB::connection('rank');
  79. $re=$rankConnection->table('project')->where(['id' => $id])->update([
  80. 'sync_time' => $sync_time,
  81. 'next_sync_time' => $next_sync_time,
  82. ]);
  83. $re1=$rankConnection->table('project_keyword')->where(['project_id' => $id])->update([
  84. 'sync_time' => $sync_time,
  85. ]);
  86. return response()->json(['message' => '操作成功','code'=>200]);
  87. }else if($status=='2'){
  88. $ids = $request->input('ids');
  89. $rankConnection = DB::connection('rank');
  90. $re=$rankConnection->table('project')->whereIn('id', $ids)->update([
  91. 'sync_time' => $sync_time,
  92. 'next_sync_time' => $next_sync_time,
  93. ]);
  94. $re1=$rankConnection->table('project_keyword')->whereIn('project_id', $ids)->update([
  95. 'sync_time' => $sync_time,
  96. ]);
  97. return response()->json(['message' => '操作成功','code'=>200]);
  98. }
  99. }
  100. /**
  101. * 关键词列表
  102. * @param Request $request
  103. * @return array|View\Factory|\Illuminate\Foundation\Application|JsonResponse|\Illuminate\View\View|mixed
  104. */
  105. public function keyword_list(Request $request){
  106. $keyword = $request->input('keyword');
  107. $sortName = $request->input('sortName');
  108. $sortOrder = $request->input('sortOrder');
  109. if($sortName=='time'){
  110. $sortName='sync_time';
  111. }
  112. if($sortName=='next_time'){
  113. $sortName='next_sync_time';
  114. }
  115. if($sortName=='number_title'){
  116. $sortName='number';
  117. }
  118. if($keyword){
  119. $condition1[] = ['domain', 'like', '%' . $keyword . '%'];
  120. $condition[] = ['name', 'like', '%' . $keyword . '%'];
  121. }
  122. if (!$request->ajax()) {
  123. return view('admin/site/keyword_list', [
  124. ]);
  125. }
  126. $rankConnection = DB::connection('rank');
  127. $records = $rankConnection->table('project')
  128. ->where('allow_googlerank','=','1')
  129. ->where('webmaster_domain','!=',' ')
  130. ->where($condition ?? [])
  131. ->orWhere($condition1 ?? [])
  132. ->orderBy($sortName,$sortOrder)
  133. ->paginate($request->input('pageSize') ?? TABLE_PAGE_SIZE);
  134. foreach($records as $key => $value){
  135. $site_info = Site::query()->where('old_id','=',$value->id)->first();
  136. if(!empty($site_info->status)){
  137. if($site_info->status=='1'){
  138. $value->project_status_text = '建站期';
  139. }else if($site_info->status=='2'){
  140. $value->project_status_text = '实施期';
  141. }else if($site_info->status=='3'){
  142. $value->project_status_text = '服务期';
  143. }else if($site_info->status=='4'){
  144. $value->project_status_text = '建站期暂停';
  145. }else if($site_info->status=='7'){
  146. $value->project_status_text = '已终止';
  147. }else if($site_info->status=='8'){
  148. $value->project_status_text = '实施期暂停';
  149. }else if($site_info->status=='9'){
  150. $value->project_status_text = '网站续费维护';
  151. }else if($site_info->status=='10'){
  152. $value->project_status_text = '未续费';
  153. }else {
  154. $value->project_status_text = '未知';
  155. }
  156. }else{
  157. $value->project_status_text = '未知';
  158. }
  159. if($value->number=='1'){
  160. $value->number_title = '排名系统【1】';
  161. }else if($value->number=='2'){
  162. $value->number_title = '排名系统【2】';
  163. }else if($value->number=='3'){
  164. $value->number_title = '排名系统【3】';
  165. }else if($value->number=='4'){
  166. $value->number_title = '排名系统【4】';
  167. }else {
  168. $value->number_title = '未知';
  169. }
  170. if($value->next_sync_time!='0' && !empty($value->next_sync_time)){
  171. $value->next_time = date('Y-m-d H:i:s',$value->next_sync_time);
  172. }else{
  173. $value->next_time = '';
  174. }
  175. if($value->sync_time!='0' && !empty($value->sync_time)){
  176. $value->time = date('Y-m-d H:i:s',$value->sync_time);
  177. }else{
  178. $value->time = '';
  179. }
  180. if(!empty($site_info->status)){
  181. $value->site_id=$site_info->id;
  182. }else{
  183. $value->site_id='';
  184. }
  185. }
  186. $items = $records->items();
  187. return response()->json([
  188. 'rows' => $items,
  189. 'total' => $records->total(),
  190. ]);
  191. }
  192. /**
  193. * 关键词
  194. */
  195. public function keyword(Request $request, $id)
  196. {
  197. if (!$request->ajax()) {
  198. return view('admin/site/keyword', [
  199. 'siteId'=>$id
  200. ]);
  201. }
  202. $site_info = Site::query()->where('id','=',$id)->first();
  203. $old_id=$site_info->old_id;
  204. $rankConnection = DB::connection('rank');
  205. $records = $rankConnection->table('project_keyword')->where(['project_id' =>$old_id])
  206. ->where('allow_googlerank','=','1')
  207. ->orderBy('sync_time')
  208. ->paginate($request->input('pageSize') ?? TABLE_PAGE_SIZE);
  209. foreach($records as $key => $value){
  210. $project_info = $rankConnection->table('project')->where(['id' =>$old_id])->first();
  211. $value->project_name = $project_info->name;
  212. if($site_info->status=='1'){
  213. $value->project_status_text = '建站期';
  214. }else if($site_info->status=='2'){
  215. $value->project_status_text = '实施期';
  216. }else if($site_info->status=='3'){
  217. $value->project_status_text = '服务期';
  218. }else if($site_info->status=='4'){
  219. $value->project_status_text = '建站期暂停';
  220. }else if($site_info->status=='7'){
  221. $value->project_status_text = '已终止';
  222. }else if($site_info->status=='8'){
  223. $value->project_status_text = '实施期暂停';
  224. }else if($site_info->status=='9'){
  225. $value->project_status_text = '网站续费维护';
  226. }else if($site_info->status=='10'){
  227. $value->project_status_text = '未续费';
  228. }else {
  229. $value->project_status_text = '未知';
  230. }
  231. //$value->project_status_text = $project_info->status_text;
  232. $value->next_time = date('Y-m-d H:i:s',$project_info->next_sync_time);
  233. $value->time = date('Y-m-d H:i:s',$value->sync_time);
  234. if($project_info->number=='1'){
  235. $value->number_title = '排名系统【1】';
  236. }else if($project_info->number=='2'){
  237. $value->number_title = '排名系统【2】';
  238. }else if($project_info->number=='3'){
  239. $value->number_title = '排名系统【3】';
  240. }else if($project_info->number=='4'){
  241. $value->number_title = '排名系统【4】';
  242. }else {
  243. $value->number_title = '未知';
  244. }
  245. }
  246. $items = $records->items();
  247. return response()->json([
  248. 'rows' => $items,
  249. 'total' => $records->total(),
  250. 'siteId'=>$id
  251. ]);
  252. }
  253. /**********************上线后检查***************************************/
  254. public function overview_inspect(Request $request, $id,$type)
  255. {
  256. $site = Site::query()->where('id', $id)->first();
  257. $url = 'https://' . $site->domain;
  258. $jump_url = 'https://www.' . $site->domain;
  259. if (!$request->ajax()) {
  260. $site = Site::query()->where('id', $id)->first();
  261. if (!$site) {
  262. return view('admin/site/tips', [
  263. 'tips' => '站点信息不存在',
  264. 'siteId' => $id
  265. ]);
  266. } else if ($site->status != '2') {
  267. return view('admin/site/tips', [
  268. 'tips' => '该项目不在实施期',
  269. 'siteId' => $id
  270. ]);
  271. } else if (empty($site->domain)) {
  272. return view('admin/site/tips', [
  273. 'tips' => '未绑定域名',
  274. 'siteId' => $id
  275. ]);
  276. }
  277. }
  278. if ($type == '1') {
  279. return view('admin/site/overview_inspect', [
  280. 'tips' => '在展示信息前请点击下方链接,确认网站能开打,避免因为未翻墙原因造成数据错误。',
  281. 'siteId' => $id,
  282. 'type' => $type,
  283. 'url' => 'https://' . $site->domain,
  284. ]);
  285. }else if($type=='2'){
  286. $view = 'admin/site/overview_inspect';
  287. return view($view, [
  288. 'siteId' => $id,
  289. 'site'=>$site,
  290. 'type' => $type,
  291. 'jump_url'=>$jump_url
  292. ]);
  293. } else if($type=='3'){////获取域名是否做了301跳转
  294. try {
  295. $header_info1 = get_headers($url);
  296. if ($header_info1[0] == 'HTTP/1.1 301 Moved Permanently') {
  297. $jump_status = '跳转成功,做了301跳转';
  298. $jump_status_status = '1';
  299. } else {
  300. $jump_status = '跳转成功,未做301跳转';
  301. $jump_status_status = '2';
  302. }
  303. } catch (\Throwable $throwable) {
  304. $jump_status = '跳转不成功';
  305. $jump_status_status = '3';
  306. }
  307. $data=[
  308. 'jump_status'=>$jump_status,
  309. 'jump_status_status'=>$jump_status_status
  310. ];
  311. return response()->json(['message' => '查询成功','data'=>$data], 200);
  312. }else if($type=='4'){//获取robots.txt内容
  313. try {
  314. $result = file_get_contents('https://www.'.$site->domain.'/robots.txt');
  315. $robots_status = [
  316. 'robots1'=>$this->rotbots_content($result,'Sitemap: https://www.'.$site->domain.'/sitemap.xml'),
  317. 'robots2'=>$this->rotbots_content($result,'User-agent: *'),
  318. 'robots3'=>$this->rotbots_content($result,'Disallow: /basic/*'),
  319. 'robots4'=>$this->rotbots_content($result,'Disallow: /search-result-products.html'),
  320. 'robots5'=>$this->rotbots_content($result,'Disallow: /search-result-others.html'),
  321. 'robots6'=>$this->rotbots_content($result,'Disallow: /404.html'),
  322. 'robots7'=>$this->rotbots_content($result,'Disallow: /submission-successful.html'),
  323. 'robots8'=>$this->rotbots_content($result,'Disallow: /taggg.html')
  324. ];
  325. } catch (\Throwable $throwable) {
  326. $robots_status = [
  327. 'robots1'=>1,
  328. 'robots2'=>1,
  329. 'robots3'=>1,
  330. 'robots4'=>1,
  331. 'robots5'=>1,
  332. 'robots6'=>1,
  333. 'robots7'=>1,
  334. 'robots8'=>1
  335. ];
  336. }
  337. return response()->json(['message' => '查询成功','data'=>$robots_status], 200);
  338. }else if($type=='5'){ //sitemap.xml管理
  339. $url_list = '';
  340. $is_no_https='1';
  341. $is_repeat = '1';
  342. $is_130='1';
  343. $is_basic ='1';
  344. $basic_text='';
  345. try {
  346. $xml = simplexml_load_file('https://www.'.$site->domain.'/sitemap.xml');
  347. foreach ($xml->children() as $child){
  348. //echo $child->loc."<br>";
  349. //把所有链接放到一个逗号分割字符串里,用于判断是否重复
  350. $url_list.=$child->loc.',';
  351. //是否包含HTTP
  352. if(strpos($child->loc,'http://') !== false){
  353. $is_no_https='1';
  354. }else{
  355. $is_no_https='2';
  356. }
  357. if(strlen($child->loc)>130){
  358. $is_130='2';
  359. }
  360. }
  361. //判断是否有重复链接
  362. $url_list_array = explode(',', $url_list);
  363. if (count($url_list_array) != count(array_unique($url_list_array))) {
  364. $is_repeat='2';
  365. }
  366. } catch (\Throwable $throwable) {
  367. }
  368. //sitemap.xml中是否有basic页面
  369. /********************************/
  370. $config = [
  371. 'connection_name' => sprintf('connection_name_%s', $id),
  372. 'host' => $site->server->server_ip,
  373. 'port' => '3306',
  374. 'database' => $site->database,
  375. 'username' => $site->server->mysql_user_name,
  376. 'password' => $site->server->mysql_passwd,
  377. ];
  378. config_connection($config);
  379. $connection = DB::connection($config['connection_name']);
  380. $cacheKey = 'socialPublish_' . $site->id;
  381. try {
  382. if (!Cache::has($cacheKey)) {
  383. $orders = $connection
  384. ->table('content')
  385. ->whereIn('tpl_id', [32, 95])
  386. ->get();
  387. foreach ($orders as $value) {
  388. if ($value->childs_num == 0) {
  389. $value->url = '/' . $value->uri . '.html';
  390. } else {
  391. $value->url = '/' . $value->uri . '/';
  392. }
  393. if (strpos($url_list, $value->url) !== false) {
  394. $is_basic = '2';
  395. $basic_text.='<p>'.$url.$value->url.'</p>';
  396. }
  397. }
  398. }
  399. }catch (\Throwable $throwable) {
  400. }
  401. /********************************/
  402. $data=[
  403. 'is_no_https'=>$is_no_https,
  404. 'is_repeat'=>$is_repeat,
  405. 'is_130'=>$is_130,
  406. 'is_basic'=>$is_basic,
  407. 'basic_text'=>$basic_text
  408. ];
  409. return response()->json(['message' => '查询成功','data'=>$data], 200);
  410. }else if($type=='6'){
  411. //引擎力后台域名,建站后台站点域名是否一致
  412. $server = $site->server;
  413. try {
  414. Ssh::factory($server->server_ip, $server->server_user_name, $server->server_passwd);
  415. } catch (\Throwable $throwable) {
  416. return response()->json(['message' => '用户名密码验证失败'], 400);
  417. }
  418. $targetBaseDir = $site->code_dir ? sprintf('%s/wwwroot/', $site->code_dir)
  419. : sprintf('/repo/%s/wwwroot/', $site->domain);
  420. if (!Ssh::dir_exists($targetBaseDir)) {
  421. return response()->json(['message' => '站点服务器目录不存在'], 400);
  422. }
  423. //查询建站后台域名
  424. $is_domain='1';
  425. $targetBaseDir1 = $site->code_dir ? sprintf('%s/appdata/conf/', $site->code_dir)
  426. : sprintf('/repo/%s/appdata/conf/', $site->domain);
  427. if (!Ssh::dir_exists($targetBaseDir1)) {
  428. return response()->json(['message' => '站点服务器目录不存在'], 400);
  429. }
  430. $dir_msg = 'cat '.$targetBaseDir1.'setting.conf.php';
  431. $domain_content = Ssh::exec($dir_msg);
  432. $domain_content=str_replace(' ','',$domain_content);
  433. //拼接字符串
  434. $domain_url = '\'domain\'=>\''.$site->domain.'\'';
  435. if(strpos($domain_content,$domain_url) !== false){
  436. $is_domain='2';
  437. }else{
  438. $is_domain='1';
  439. }
  440. $data=[
  441. 'is_domain'=>$is_domain,
  442. ];
  443. return response()->json(['message' => '查询成功','data'=>$data], 200);
  444. }else if($type=='7'){
  445. //根目录中是否有最新的google和bing文件
  446. $server = $site->server;
  447. try {
  448. Ssh::factory($server->server_ip, $server->server_user_name, $server->server_passwd);
  449. } catch (\Throwable $throwable) {
  450. return response()->json(['message' => '用户名密码验证失败'], 400);
  451. }
  452. $targetBaseDir = $site->code_dir ? sprintf('%s/wwwroot/', $site->code_dir)
  453. : sprintf('/repo/%s/wwwroot/', $site->domain);
  454. if (!Ssh::dir_exists($targetBaseDir)) {
  455. return response()->json(['message' => '站点服务器目录不存在'], 400);
  456. }
  457. $is_google='1';
  458. $is_bing='1';
  459. $result_host_list = Ssh::exec('ls -l '.$targetBaseDir);
  460. if(strpos($result_host_list,'google') !== false){
  461. $is_google ='2';
  462. }
  463. if(strpos($result_host_list,'BingSiteAuth.xml') !== false){
  464. $is_bing ='2';
  465. }
  466. $data=[
  467. 'is_google'=>$is_google,
  468. 'is_bing'=>$is_bing,
  469. ];
  470. return response()->json(['message' => '查询成功','data'=>$data], 200);
  471. }else if($type=='8'){
  472. //引擎力后台服务器所在地,api地址和webmaster域名是否已填写
  473. $is_webmaster_domain='1';
  474. $is_api_url='1';
  475. $is_server_id='1';
  476. if(!empty($site->webmaster_domain)){
  477. $is_webmaster_domain='2';
  478. }
  479. if(!empty($site->api_url)){
  480. $is_api_url='2';
  481. }
  482. if(!empty($site->server_id)){
  483. $is_server_id='2';
  484. }
  485. $data=[
  486. 'is_webmaster_domain'=>$is_webmaster_domain,
  487. 'is_api_url'=>$is_api_url,
  488. 'is_server_id'=>$is_server_id,
  489. ];
  490. return response()->json(['message' => '查询成功','data'=>$data], 200);
  491. }else if($type=='9'){
  492. $is_keyword ='1';
  493. $rankConnection = DB::connection('rank');
  494. $old = $rankConnection->table('project')->where(['id' => $site->old_id])->select(['allow_googlerank', 'number', 'interval_time'])->first();
  495. $keywordCount = $rankConnection->table('project_keyword')->where(['project_id' => $site->old_id])->count();
  496. if($keywordCount >'0'){
  497. $is_keyword='2';
  498. }
  499. $data=[
  500. 'is_keyword'=>$is_keyword,
  501. ];
  502. return response()->json(['message' => '查询成功','data'=>$data], 200);
  503. }else if($type=='10'){
  504. //"项目概况-重点优化"中是否上传,是否全部已优化
  505. $is_key_optimization='1';
  506. $optimizePageIds = SiteOptimizePage::query()->where(['site_id' => $id])->pluck('id')->count();
  507. $optimizePagelist = SiteOptimizePage::query()->where(['site_id' => $id])->pluck('is_optimize')->toArray();
  508. if($optimizePageIds >'0'){
  509. $is_key_optimization='2';
  510. }
  511. //是否全部优化
  512. $is_optimization='1';
  513. if(isset($optimizePagelist)){
  514. foreach($optimizePagelist as $key=>$value){
  515. if ($value=='0') {
  516. $is_optimization='1';
  517. break;
  518. }else{
  519. $is_optimization='2';
  520. }
  521. }
  522. }
  523. $data=[
  524. 'is_key_optimization'=>$is_key_optimization,
  525. 'is_optimization'=>$is_optimization
  526. ];
  527. return response()->json(['message' => '查询成功','data'=>$data], 200);
  528. }
  529. else if($type=='11'){
  530. //“建站流程-建站流程2.0”是否已填写完成
  531. $optimizePagelist = SiteOptimizePage::query()->where(['site_id' => $id])->pluck('is_optimize')->toArray();
  532. $is_web_status='1';
  533. $is_web_status_list = ProjectFlowMemo::query()->where(['site_id' => $id])->pluck('status')->toArray();
  534. if(isset($is_web_status_list)){
  535. foreach($is_web_status_list as $key=>$value){
  536. if ($value=='0') {
  537. $is_web_status='1';
  538. break;
  539. }else{
  540. $is_web_status='2';
  541. }
  542. }
  543. }
  544. $data=[
  545. 'is_web_status'=>$is_web_status,
  546. ];
  547. return response()->json(['message' => '查询成功','data'=>$data], 200);
  548. }else if($type=='12'){
  549. //--------------------------源代码中是否为<meta property="og:url" content="https://www.当前页面的url" />-----------------------------------------------------------------
  550. //--------------------------源代码中是否每个页面都有 <link rel="canonical" href="https://www.当前页面的url" />-----------------------------------------------------------------
  551. $meta_value = '<meta property="og:url" content="https://www.'.$site->domain.'/" />';
  552. $link_value = '<link rel="canonical" href="https://www.'.$site->domain.'/" />';
  553. $meta_value1 = '<meta property="og:url" content="https://www.'.$site->domain.'" />';
  554. $link_value1 = '<link rel="canonical" href="https://www.'.$site->domain.'" />';
  555. $is_meta_value='1';
  556. $is_link_value='1';
  557. $meta_value_new='<metaproperty="og:url"content="https://{$lang.subdomain}.{$setting.domain}{$url}"/>';
  558. $link_value_new = '<linkrel="canonical"href="https://{$lang.subdomain}.{$setting.domain}{$url}"/>';
  559. /********************************/
  560. $config = [
  561. 'connection_name' => sprintf('connection_name_%s', $id),
  562. 'host' => $site->server->server_ip,
  563. 'port' => '3306',
  564. 'database' => $site->database,
  565. 'username' => $site->server->mysql_user_name,
  566. 'password' => $site->server->mysql_passwd,
  567. ];
  568. config_connection($config);
  569. $connection = DB::connection($config['connection_name']);
  570. $cacheKey = 'socialPublish_' . $site->id;
  571. try {
  572. if (!Cache::has($cacheKey)) {
  573. $header_count = $connection
  574. ->table('content_template_chunk')
  575. ->where('name', 'header')
  576. ->first();
  577. $header_content = str_replace(' ','',$header_count->html);
  578. if(strpos($header_content,$meta_value_new) !== false){
  579. $is_meta_value='2';
  580. }else{
  581. $is_meta_value='1';
  582. }
  583. if(strpos($header_content,$link_value_new) !== false){
  584. $is_link_value='2';
  585. }else{
  586. $is_link_value='1';
  587. }
  588. }
  589. }catch (\Throwable $throwable) {
  590. }
  591. $data=[
  592. 'is_meta_value'=>$is_meta_value,
  593. 'is_link_value'=>$is_link_value,
  594. ];
  595. return response()->json(['message' => '查询成功','data'=>$data], 200);
  596. }else if($type=='13'){
  597. //站内,出站是否有404链接
  598. $is_404='1';
  599. $ids = NotFound::get404List(4);
  600. if(!isset($ids)){
  601. $is_404='2';
  602. }
  603. $data=[
  604. 'is_404'=>$is_404,
  605. ];
  606. return response()->json(['message' => '查询成功','data'=>$data], 200);
  607. }else if($type=='14') {
  608. //--------------------------源代码中是否为<meta property="og:url" content="https://www.当前页面的url" />-----------------------------------------------------------------
  609. //--------------------------源代码中是否每个页面都有 <link rel="canonical" href="https://www.当前页面的url" />-----------------------------------------------------------------
  610. $meta_value = '<meta property="og:url" content="https://www.' . $site->domain . '/" />';
  611. $link_value = '<link rel="canonical" href="https://www.' . $site->domain . '/" />';
  612. $meta_value1 = '<meta property="og:url" content="https://www.' . $site->domain . '" />';
  613. $link_value1 = '<link rel="canonical" href="https://www.' . $site->domain . '" />';
  614. $is_meta_value = '1';
  615. $is_link_value = '1';
  616. $meta_value_new = '<metaproperty="og:url"content="https://{$lang.subdomain}.{$setting.domain}{$url}"/>';
  617. $link_value_new = '<linkrel="canonical"href="https://{$lang.subdomain}.{$setting.domain}{$url}"/>';
  618. /********************************/
  619. $config = [
  620. 'connection_name' => sprintf('connection_name_%s', $id),
  621. 'host' => $site->server->server_ip,
  622. 'port' => '3306',
  623. 'database' => $site->database,
  624. 'username' => $site->server->mysql_user_name,
  625. 'password' => $site->server->mysql_passwd,
  626. ];
  627. config_connection($config);
  628. $connection = DB::connection($config['connection_name']);
  629. $cacheKey = 'socialPublish_' . $site->id;
  630. //try {
  631. if (!Cache::has($cacheKey)) {
  632. $header_count = $connection
  633. ->table('content_template_chunk')
  634. ->where('name', 'header')
  635. ->first();
  636. $header_content = str_replace(' ', '', $header_count->html);
  637. //var_dump($header_content);
  638. if (strpos($header_content, $meta_value_new) !== false) {
  639. $is_meta_value = '2';
  640. } else {
  641. $is_meta_value = '1';
  642. }
  643. if (strpos($header_content, $link_value_new) !== false) {
  644. $is_link_value = '2';
  645. } else {
  646. $is_link_value = '1';
  647. }
  648. }
  649. //} catch (\Throwable $throwable) {
  650. //}
  651. $data = [
  652. 'is_meta_value' => $is_meta_value,
  653. 'is_link_value' => $is_link_value,
  654. ];
  655. return response()->json(['message' => '查询成功', 'data' => $data], 200);
  656. }
  657. }
  658. //查询xml里的数据
  659. function link_xml($url,$xmla){
  660. $xmla = rtrim($xmla, ",");
  661. $hello = explode(',',$xmla);
  662. for($index=0;$index<count($hello);$index++){
  663. $result_info = $this->get_html($hello[$index]);
  664. $link_value = '<link rel="canonical" href="'.$hello[$index].'" />';
  665. if($hello[$index] == 'https://www.'.$url.'/sitemap.html'){
  666. $is_meta_value='2';
  667. }else{
  668. if(strpos($result_info,$link_value) !== false ){
  669. $is_meta_value='2';
  670. }else{
  671. $is_meta_value='1';
  672. //var_dump($hello[$index]);
  673. return $is_meta_value;
  674. }
  675. }
  676. }
  677. return $is_meta_value;
  678. }
  679. function link_xml1($url,$xmla){
  680. $xmla = rtrim($xmla, ",");
  681. $hello = explode(',',$xmla);
  682. for($index=0;$index<count($hello);$index++){
  683. $result_info = $this->get_html($hello[$index]);
  684. $link_value = '<link rel="canonical" href="'.$hello[$index].'" />';
  685. $link_value = '<meta property="og:url" content="'.$hello[$index].'" />';
  686. if($hello[$index] == 'https://www.'.$url.'/sitemap.html'){
  687. $is_meta_value='2';
  688. }else{
  689. if(strpos($result_info,$link_value) !== false ){
  690. $is_meta_value='2';
  691. }else{
  692. $is_meta_value='1';
  693. //var_dump($hello[$index]);
  694. return $is_meta_value;
  695. }
  696. }
  697. }
  698. return $is_meta_value;
  699. }
  700. function get_html($url){
  701. $ch = curl_init();
  702. curl_setopt($ch, CURLOPT_URL, $url);
  703. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  704. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  705. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true );
  706. curl_setopt($ch, CURLOPT_HTTPHEADER,
  707. array(
  708. 'pragma: no-cache',
  709. 'cache-control: no-cache',
  710. 'sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="96", "Google Chrome";v="96"',
  711. 'accept: application/json, text/plain, */*',
  712. 'content-type: application/json',
  713. 'sec-ch-ua-mobile: ?0',
  714. 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36',
  715. 'sec-ch-ua-platform: "Windows"',
  716. 'sec-fetch-site: same-origin',
  717. 'sec-fetch-mode: cors',
  718. 'sec-fetch-dest: empty',
  719. 'accept-language: zh-CN,zh;q=0.9',
  720. ));
  721. // This is what solved the issue (Accepting gzip encoding)
  722. curl_setopt($ch, CURLOPT_ENCODING, "gzip,deflate");
  723. $response = curl_exec($ch);
  724. curl_close($ch);
  725. return $response;
  726. }
  727. function rotbots_content($result,$key){
  728. if(strpos($result,$key) !== false){
  729. return 2;
  730. }else{
  731. return 1;
  732. }
  733. }
  734. function link_list($config,$url,$text){
  735. $ordersa = DB::connection($config['connection_name'])
  736. ->table('content')
  737. ->WhereNotIn('alias', ['home','sitemap','404'])
  738. ->get();
  739. foreach ($ordersa as $value) {
  740. if ($value->childs_num == 0) {
  741. $value->url = 'https://www.'.$url.'/' . $value->uri . '.html';
  742. } else {
  743. $value->url = 'https://www.'.$url.'/' . $value->uri . '/';
  744. }
  745. $meta_value = '<meta property="og:url" content="'.$value->url.'" />';
  746. $result_info = file_get_contents($value->url);
  747. if(strpos($result_info,$meta_value) !== false){
  748. $is_meta_value='2';
  749. }else{
  750. $is_meta_value='1';
  751. //var_dump($value->id);
  752. //var_dump($value->title);
  753. return $is_meta_value;
  754. }
  755. }
  756. return $is_meta_value;
  757. }
  758. function link_list1($config,$url,$text){
  759. $ordersa = DB::connection($config['connection_name'])
  760. ->table('content')
  761. ->WhereNotIn('alias', ['home','sitemap','404'])
  762. ->get();
  763. foreach ($ordersa as $value) {
  764. if ($value->childs_num == 0) {
  765. $value->url = 'https://www.'.$url.'/' . $value->uri . '.html';
  766. } else {
  767. $value->url = 'https://www.'.$url.'/' . $value->uri . '/';
  768. }
  769. $link_value = '<link rel="canonical" href="'.$value->url.'" />';
  770. $result_info = file_get_contents($value->url);
  771. if(strpos($result_info,$link_value) !== false){
  772. $is_meta_value='2';
  773. }else{
  774. $is_meta_value='1';
  775. var_dump($value->id);
  776. var_dump($value->title);
  777. return $is_meta_value;
  778. }
  779. }
  780. return $is_meta_value;
  781. }
  782. /**********************上线后检查***************************************/
  783. //站点渲染页面及列表
  784. public function index(Request $request)
  785. {
  786. $user = auth()->user();
  787. if (!$request->ajax()) {
  788. $userList = User::query()->where(['status' => 1])
  789. ->whereIn('role_id', [14, 27, 34, 32, 29, 15, 7, 6, 25, 26, 2, 1])
  790. ->select(['id', 'nickname', 'role_id'])
  791. ->get();
  792. $businessList = Business::query()->pluck('title', 'id');
  793. $month = date('m');
  794. $lastMonth = date('m', strtotime('last month'));
  795. return view('admin/site/index', [
  796. 'userList' => $userList,
  797. 'businessList' => $businessList,
  798. 'role_id' => $user->role_id,
  799. 'is_propaganda' => 0,//品宣只显示建站期和服务期
  800. 'month' => $month,
  801. 'lastMonth' => $lastMonth
  802. ]);
  803. }
  804. list($sites, $items, $sortName, $sortOrder) = $this->indexBuild($request, $user);
  805. $items = $this->sitePublishList($items);
  806. list($nowListReportMap, $listReportMapResult, $listReportMapResult1) = $this->getInquireList();
  807. list($nowtMonthKeywords, $keywordDropResults, $keywordDropResults1) = $this->getTop10List();
  808. list($nowtMonthFlow, $clicksDropResults, $clicksDropResults1) = $this->getFlowList();
  809. list($pcSpeedMeasurement, $mobileSpeedMeasurement) = $this->getSpeedMeasurementList();
  810. $articleNoteList = ArticleNote::query()
  811. ->selectRaw('site_id,count(*) as count')
  812. ->groupBy('site_id')
  813. ->pluck('count', 'site_id')
  814. ->toArray() ?? [];
  815. array_walk($items, function ($item) use (
  816. &$nowtMonthKeywords,
  817. &$nowListReportMap, &$listReportMapResult, &$listReportMapResult1,
  818. &$keywordDropResults, &$keywordDropResults1, &$clicksDropResults,
  819. &$clicksDropResults1, &$masterDropResult, &$pcSpeedMeasurement,
  820. &$mobileSpeedMeasurement, &$articleNoteList
  821. ) {
  822. $item->identify = base64_encode($item->id);
  823. $item->managers_title = implode('-', $item->users->where('role_id', Role::TYPE_MANAGER)->pluck('nickname')->toArray());
  824. $item->server_title = implode('-', $item->users->where('role_id', Role::TYPE_SERVER)->pluck('nickname')->toArray());
  825. $item->propaganda = implode('-', $item->users->where('role_id', Role::TYPE_SOFT_TEXT_SEARCH)->pluck('nickname')->toArray());
  826. $item->statusTitle = Site::STATUS_MAP[$item->status] ?? '';
  827. $item->top10 = $item->old_id ? ($nowtMonthKeywords[$item->old_id] ?? '-') : '未关联';
  828. $item->traffic = $item->old_id ? ($nowListReportMap[$item->old_id]->traffic ?? '-') : '未关联';
  829. $item->inquire = $item->old_id ? ($nowListReportMap[$item->old_id]->inquire ?? '-') : '未关联';
  830. $item->is_google_bid = in_array(Contract::GOOGLE_BID, $item->contract_ids ?? []) ? 1 : 0;
  831. $item->listReportMapResult = $listReportMapResult[$item->old_id] ?? '';
  832. $item->listReportMapResult1 = $listReportMapResult1[$item->old_id] ?? '';
  833. $item->keywordDropResults = $keywordDropResults[$item->old_id] ?? '';
  834. $item->keywordDropResults1 = $keywordDropResults1[$item->old_id] ?? '';
  835. $item->clicksDropResults = $clicksDropResults[$item->old_id] ?? '';
  836. $item->clicksDropResults1 = $clicksDropResults1[$item->old_id] ?? '';
  837. //$item->masterDropResult = $masterDropResult[$item->id] ?? '';
  838. $item->pcSpeedMeasurement = $pcSpeedMeasurement[$item->old_id] ?? '-';
  839. $item->mobileSpeedMeasurement = $mobileSpeedMeasurement[$item->old_id] ?? '-';
  840. $item->articleNote = $articleNoteList[$item->id] ?? 0;
  841. $item->order_at = substr($item->order_at, 0, 10);
  842. $item->reach_at = substr($item->reach_at, 0, 10);
  843. $item->online_at = substr($item->online_at, 0, 10);
  844. });
  845. $records = collect($items);
  846. if ($sortName == 'monthOfCompletionNum') {
  847. $sortName = 'monthOfCompletionNumTime';
  848. }
  849. if (in_array($sortName, ['traffic', 'inquire', 'top10', 'pcSpeedMeasurement', 'mobileSpeedMeasurement', 'monthOfCompletionNumTime', 'articleNote'])) {
  850. $descending = strtolower($sortOrder) == 'asc' ? false : true;
  851. $records = $records->sortBy(function ($item, $key) use ($sortName, $descending) {
  852. return intval($item[$sortName]);
  853. }, SORT_REGULAR, $descending)->values();
  854. }
  855. return response()->json([
  856. 'rows' => $records,
  857. 'total' => $sites->total()
  858. ]);
  859. }
  860. public function indexBuild($request, $user, $isExport = false)
  861. {
  862. $site = Site::query();
  863. $keyword = $request->input('keyword');
  864. $coreProduct = $request->input('coreProduct');
  865. $isPropaganda = $request->input('is_propaganda');
  866. $projectType = $request->input('projectType');
  867. if ($projectType) {
  868. $site->where('site_type', $projectType);
  869. }
  870. if ($status = $request->input('status')) {
  871. $site->where('status', $status);
  872. } else {
  873. if (in_array($user->role_id, [15, 17]) && !$keyword) {
  874. //查找任务管理[只显示建站期和服务期]==项目列表[品宣只显示建站期和服务期]
  875. $site->whereIn('status', [2, 3]);
  876. }
  877. if ($isPropaganda == 1 && !$keyword) {
  878. //查找任务管理[只显示建站期和服务期]==项目列表[品宣只显示建站期和服务期]
  879. $site->whereIn('status', [2, 3]);
  880. }
  881. if (!in_array($user->role_id, [15, 17]) && !$keyword) {
  882. $site->whereIn('status', [1, 2, 3, 4, 5, 6, 8, 9, 10]);
  883. }
  884. }
  885. if ($request->input('bid_status') == 'on') {
  886. $site->where('bid_status', 1);
  887. }
  888. if ($request->input('feedback_status') == 'on') {
  889. $feedbackSiteList = Article::query()->select('site_id')
  890. ->where('be_applicable', 0)
  891. ->groupBy('site_id')->pluck('site_id')
  892. ->toArray() ?? [];
  893. $site->whereIn('id', $feedbackSiteList);
  894. }
  895. if ($request->input('customer_review') == 'on') {
  896. $feedbackSiteList = SiteInfo::query()->select('site_id')
  897. ->where('article_custom_audit', 1)
  898. ->pluck('site_id');
  899. $site->whereIn('id', $feedbackSiteList);
  900. }
  901. $layoutKeyword = $request->input('layoutKeyword');
  902. if (!empty($layoutKeyword)) {
  903. $sites = SiteOptimizePage::query()->where('keyword', 'like', $layoutKeyword . '%')->pluck('site_id');
  904. $site->whereIn('id', $sites);
  905. }
  906. $businessId = $request->input('businessId');
  907. $builder = $site->withCount(['articles' => function (Builder $query) {
  908. $query->where([
  909. ['publish_at', '>', date('Y-m-01 00:00:00')],
  910. ['publish_at', '<', date('Y-m-d 00:00:00', strtotime('first day of next month'))],
  911. ]);
  912. }, 'articles as articles_sum' => function (Builder $query) {
  913. $query->where('be_applicable', 1);
  914. }, 'articles as pendingUpgrade' => function (Builder $query) {
  915. $query->whereNull('publish_at');
  916. }, 'articles as published' => function (Builder $query) {
  917. $query->whereNotNull('publish_at');
  918. }, 'articles as thisMonthUpgrade' => function (Builder $query) {
  919. $query->whereBetween('publish_at', [date('Y-m-01 00:00:00'), date('Y-m-t 23:59:59')]);
  920. }, 'linkDetails' => function (Builder $query) {
  921. $query->where([
  922. ['enable', '=', 1],
  923. ['status', '=', 5],
  924. ['created_at', '>', date('Y-m-01 00:00:00')],
  925. ['created_at', '<', date('Y-m-d 00:00:00', strtotime('first day of next month'))],
  926. ]);
  927. }])->with(['users'])->scopes(['user'])->where(function (Builder $builder) use ($keyword, $businessId, $coreProduct) {
  928. if ($keyword) {
  929. $builder->whereIn('status', [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
  930. $builder->where('domain', 'like', '%' . $keyword . '%')
  931. ->orWhere('cn_title', 'like', '%' . $keyword . '%');
  932. }
  933. if ($businessId) {
  934. $builder->where('business_id', $businessId);
  935. }
  936. if ($coreProduct) {
  937. $builder->where('core_product', 'like', '%' . $coreProduct . '%');
  938. }
  939. });
  940. $sortName = $request->input('sortName');
  941. $sortOrder = $request->input('sortOrder');
  942. if ($sortName == 'statusTitle') {
  943. $builder->orderBy('status', $sortOrder);
  944. }
  945. if ($sortName == 'order_at') {
  946. $builder->orderBy('order_at', $sortOrder);
  947. }
  948. if ($sortName == 'online_date') {
  949. $builder->orderBy('online_at', $sortOrder);
  950. }
  951. if ($sortName == 'reach_at') {
  952. $builder->orderBy('reach_at', $sortOrder);
  953. }
  954. if ($isExport) {
  955. $sites = '';
  956. $items = $builder->orderByDesc('id')->get();
  957. } else {
  958. $sites = $builder->orderByDesc('id')->paginate($request->input('pageSize') ?? TABLE_PAGE_SIZE);
  959. $items = $sites->items();
  960. }
  961. return [$sites, $items, $sortName, $sortOrder];
  962. }
  963. public function sitePublishList($items)
  964. {
  965. foreach ($items as $key => $item) {
  966. if (!empty($item->enterprise_nature)) {
  967. $list = explode(',', $item->enterprise_nature);
  968. foreach ($list as $value) {
  969. if ($value == 1) {
  970. $items[$key]->the500Strongest = 1;
  971. }
  972. if ($value == 2) {
  973. $items[$key]->listedCompany = 1;
  974. }
  975. if ($value == 3) {
  976. $items[$key]->stateEnterprises = 1;
  977. }
  978. if ($value == 4) {
  979. $items[$key]->leadingEnterprise = 1;
  980. }
  981. }
  982. }
  983. if (empty($item->article_goal)) {
  984. $item->article_goal = 0;
  985. }
  986. $c = false;
  987. if ($item->published > 0) {
  988. /*年月日Y-M-D,假设, 待更新数=A,每月更新数=B,完成月份至显示为y-m
  989. 最新显示发布月:Y-M(如上图最新发布月 Y-M为2021-2)
  990. A>= B时, A/B=C(C只取整数,如2.5取2),则m=M+C,完成月份至显示为 Y-(M+C)
  991. 如果M+C>12,则 显示为 (Y+1)- [(M+C)-12] , 例如 最新发布月:2021-11,M+C=2,则完成月份至 显示为 2022-1*/
  992. $m = Article::query()->where('site_id', $item->id)
  993. ->whereNotNull('publish_at')
  994. ->orderBy('publish_at', 'desc')
  995. ->value('publish_at');
  996. if ($item->pendingUpgrade > $item->articles_updates_per_month) {
  997. if ($item->pendingUpgrade > 0 && $item->articles_updates_per_month > 0) {
  998. $c = floor($item->pendingUpgrade / $item->articles_updates_per_month);
  999. if (!empty($m)) {
  1000. $c = date("Y-m", strtotime("first day of +{$c} month", strtotime($m)));
  1001. }
  1002. }
  1003. }
  1004. // 0<=A<B时, m=M, 完成月份至 显示 Y-M,即和最新发布月显示一致
  1005. if ($item->articles_updates_per_month > $item->pendingUpgrade && $item->articles_updates_per_month >= 0) {
  1006. if (!empty($m)) {
  1007. $c = date('Y-m', strtotime($m));
  1008. } else {
  1009. $c = date('Y-m');
  1010. }
  1011. }
  1012. } else {
  1013. /*年月日Y-M-D,假设, 待更新数=A,每月更新数=B,完成月份至显示为y-m
  1014. A>=B时, A/B=C(C只取整数,如2.5取2),则m=本月份-1+C
  1015. 0<=A<B时,完成月份至 显示 “-”*/
  1016. if ($item->pendingUpgrade > $item->articles_updates_per_month) {
  1017. if ($item->pendingUpgrade > 0 && $item->articles_updates_per_month > 0) {
  1018. $c = date('Y-m', strtotime("last day of -1 month", strtotime(date("Y-m"))));
  1019. $dateNum = floor($item->pendingUpgrade / $item->articles_updates_per_month);
  1020. $c = date("Y-m", strtotime("first day of +{$dateNum} month", strtotime($c)));
  1021. }
  1022. }
  1023. if ($item->articles_updates_per_month > $item->pendingUpgrade && $item->articles_updates_per_month >= 0) {
  1024. $c = false;
  1025. }
  1026. }
  1027. if (!$c) {
  1028. $item->monthOfCompletionNum = '-';
  1029. $item->monthOfCompletionNumTime = '-';
  1030. } else {
  1031. $item->monthOfCompletionNum = $c;
  1032. $item->monthOfCompletionNumTime = strtotime($c);
  1033. }
  1034. $item->articles_updates_per_month = $item->articles_updates_per_month + 1;
  1035. $item->over = $item->article_goal - $item->articles_sum;
  1036. }
  1037. return $items;
  1038. }
  1039. public function getInquireList()
  1040. {
  1041. if (!Cache::has(CacheConstant::NOW_MONTH_INQUIRE_CACHE_KEY)) {
  1042. $nowListReportMap = DB::connection('rank')
  1043. ->table('project_listreport')
  1044. ->where(['ym' => date('Ym', strtotime('first day of -1 month'))])
  1045. ->get()->keyBy('project_id')
  1046. ->toArray();
  1047. Cache::put(CacheConstant::NOW_MONTH_INQUIRE_CACHE_KEY, $nowListReportMap, mt_rand(54000, 57600));
  1048. }
  1049. $nowListReportMap = Cache::get(CacheConstant::NOW_MONTH_INQUIRE_CACHE_KEY) ?? [];
  1050. if (!Cache::has(CacheConstant::LAST_MONTH_INQUIRE_CACHE_KEY)) {
  1051. $lastListReportMap = DB::connection('rank')
  1052. ->table('project_listreport')
  1053. ->where(['ym' => date('Ym', strtotime('first day of -2 month'))])
  1054. ->get()->keyBy('project_id')
  1055. ->toArray();
  1056. Cache::put(CacheConstant::LAST_MONTH_INQUIRE_CACHE_KEY, $lastListReportMap, mt_rand(54000, 57600));
  1057. }
  1058. $lastListReportMap = Cache::get(CacheConstant::LAST_MONTH_INQUIRE_CACHE_KEY) ?? [];
  1059. $listReportMapResult = [];
  1060. $listReportMapResult1 = [];
  1061. foreach ($lastListReportMap as $inx => $val) {
  1062. $lastOne = $nowListReportMap[$inx] ?? null;
  1063. if (empty($lastOne)) {
  1064. continue;
  1065. }
  1066. $lessVal = $val->inquire - $lastOne->inquire;
  1067. if ($lessVal > 0) {
  1068. $listReportMapResult[$inx] = $lessVal;
  1069. } else {
  1070. $listReportMapResult1[$inx] = abs($lessVal);
  1071. }
  1072. }
  1073. return [$nowListReportMap, $listReportMapResult, $listReportMapResult1];
  1074. }
  1075. public function getTop10List()
  1076. {
  1077. if (!Cache::has(CacheConstant::NOW_MONTH_KEY_WORDS_CACHE_KEY)) {
  1078. $maxIdList = DB::connection('rank')
  1079. ->table('project_history')
  1080. ->selectRaw('max(id) as max_id')->where([
  1081. ['create_time', '>', strtotime(date('Y-m-01'))],
  1082. ['create_time', '<', strtotime(date('Y-m-t 23:59:59'))],
  1083. ])->groupBy('project_id')->pluck('max_id')->toArray();
  1084. $nowtMonthKeywords = DB::connection('rank')
  1085. ->table('project_history')
  1086. ->select('top10', 'project_id')->whereIn('id', $maxIdList)
  1087. ->pluck('top10', 'project_id')->toArray();
  1088. Cache::put(CacheConstant::NOW_MONTH_KEY_WORDS_CACHE_KEY, $nowtMonthKeywords, mt_rand(54000, 57600));
  1089. }
  1090. $nowtMonthKeywords = Cache::get(CacheConstant::NOW_MONTH_KEY_WORDS_CACHE_KEY) ?? [];
  1091. if (!Cache::has(CacheConstant::LAST_MONTH_KEY_WORDS_CACHE_KEY)) {
  1092. $maxIdList = DB::connection('rank')
  1093. ->table('project_history')
  1094. ->selectRaw('max(id) as max_id')->where([
  1095. ['create_time', '>', strtotime(date('Y-m-01', strtotime('first day of -1 month')))],
  1096. ['create_time', '<', strtotime(date('Y-m-t 23:59:59', strtotime('first day of -1 month')))],
  1097. ])->groupBy('project_id')->pluck('max_id')->toArray();
  1098. $lastMonthKeywords = DB::connection('rank')
  1099. ->table('project_history')
  1100. ->select('top10', 'project_id')->whereIn('id', $maxIdList)
  1101. ->pluck('top10', 'project_id')->toArray();
  1102. Cache::put(CacheConstant::LAST_MONTH_KEY_WORDS_CACHE_KEY, $lastMonthKeywords, mt_rand(54000, 57600));
  1103. }
  1104. $lastMonthKeywords = Cache::get(CacheConstant::LAST_MONTH_KEY_WORDS_CACHE_KEY) ?? [];
  1105. $keywordDropResults = [];
  1106. $keywordDropResults1 = [];
  1107. foreach ($nowtMonthKeywords as $inx => $val) {
  1108. $nowTop10 = $lastMonthKeywords[$inx] ?? 0;
  1109. if ($nowTop10 > 0) {
  1110. $lessVal = $val - $nowTop10;
  1111. if ($lessVal > 0) {
  1112. $keywordDropResults1[$inx] = $lessVal;
  1113. } else {
  1114. $keywordDropResults[$inx] = abs($lessVal);
  1115. }
  1116. }
  1117. }
  1118. return [$nowtMonthKeywords, $keywordDropResults, $keywordDropResults1];
  1119. }
  1120. public function getFlowList()
  1121. {
  1122. if (!Cache::has(CacheConstant::NOW_MONTH_FLOW_CACHE_KEY)) {
  1123. $nowtMonthFlow = DB::connection('rank')
  1124. ->table('webmaster_effect')
  1125. ->selectRaw('SUM(clicks) as clicks,project_id')
  1126. ->where(['ym' => date('Ym', strtotime('first day of -1 month'))])
  1127. ->groupBy('project_id')
  1128. ->get()->keyBy('project_id')->toArray();
  1129. Cache::put(CacheConstant::NOW_MONTH_FLOW_CACHE_KEY, $nowtMonthFlow, mt_rand(54000, 57600));
  1130. }
  1131. $nowtMonthFlow = Cache::get(CacheConstant::NOW_MONTH_FLOW_CACHE_KEY);
  1132. if (!Cache::has(CacheConstant::LAST_MONTH_FLOW_CACHE_KEY)) {
  1133. $lastMonthFlow = DB::connection('rank')
  1134. ->table('webmaster_effect')
  1135. ->selectRaw('SUM(clicks) as clicks,project_id')
  1136. ->where(['ym' => date('Ym', strtotime('first day of -2 month'))])
  1137. ->groupBy('project_id')
  1138. ->get()->keyBy('project_id')->toArray();
  1139. Cache::put(CacheConstant::LAST_MONTH_FLOW_CACHE_KEY, $lastMonthFlow, mt_rand(54000, 57600));
  1140. }
  1141. $lastMonthFlow = Cache::get(CacheConstant::LAST_MONTH_FLOW_CACHE_KEY);
  1142. $clicksDropResults = [];
  1143. $clicksDropResults1 = [];
  1144. foreach ($lastMonthFlow as $inx => $val) {
  1145. $lastOne = $nowtMonthFlow[$inx] ?? null;
  1146. if (empty($lastOne)) {
  1147. continue;
  1148. }
  1149. $lessVal = $val->clicks - $lastOne->clicks;
  1150. if ($lessVal > 0) {
  1151. $clicksDropResults[$inx] = $lessVal;
  1152. } else {
  1153. $clicksDropResults1[$inx] = abs($lessVal);
  1154. }
  1155. }
  1156. return [$nowtMonthFlow, $clicksDropResults, $clicksDropResults1];
  1157. }
  1158. public function getSpeedMeasurementList()
  1159. {
  1160. $pcSpeedMeasurement = [];
  1161. $mobileSpeedMeasurement = [];
  1162. $speedMeasurementList = DB::table('app_speed_measurement_cache')->get();
  1163. foreach ($speedMeasurementList as $key => $value) {
  1164. $array = json_decode($value->cache, true);
  1165. if (!empty($array)) {
  1166. $pcSpeedMeasurementResult = $array['pc'];
  1167. $mobileSpeedMeasurementResult = $array['mobile'];
  1168. $oldId = str_replace('cache:app/Http/Controllers/SpeedMeasurementController/index:', '', $value->key);
  1169. $pcSpeedMeasurement[$oldId] = $pcSpeedMeasurementResult;
  1170. $mobileSpeedMeasurement[$oldId] = $mobileSpeedMeasurementResult;
  1171. }
  1172. }
  1173. return [$pcSpeedMeasurement, $mobileSpeedMeasurement];
  1174. }
  1175. public function indexExport(Request $request)
  1176. {
  1177. $user = auth()->user();
  1178. list($sites, $items, $sortName, $sortOrder) = $this->indexBuild($request, $user, true);
  1179. $items = $this->sitePublishList($items);
  1180. list($nowListReportMap, $listReportMapResult, $listReportMapResult1) = $this->getInquireList();
  1181. list($nowtMonthKeywords, $keywordDropResults, $keywordDropResults1) = $this->getTop10List();
  1182. list($pcSpeedMeasurement, $mobileSpeedMeasurement) = $this->getSpeedMeasurementList();
  1183. $list = [];
  1184. foreach ($items as $site) {
  1185. $list[] = [
  1186. 'statusTitle' => Site::STATUS_MAP[$site->status] ?? '',
  1187. 'cn_title' => $site->cn_title ?? '',
  1188. 'domain' => $site->domain ?? '',
  1189. 'pcSpeedMeasurement' => $pcSpeedMeasurement[$site->old_id] ?? '',
  1190. 'mobileSpeedMeasurement' => $mobileSpeedMeasurement[$site->old_id] ?? '',
  1191. 'traffic' => $nowListReportMap[$site->old_id]->traffic ?? '',
  1192. 'top10' => $nowtMonthKeywords[$site->old_id] ?? '',
  1193. 'inquire' => $nowListReportMap[$site->old_id]->inquire ?? '',
  1194. 'articles_count' => $site->articles_count ?? '',
  1195. 'link_details_count' => $site->link_details_count ?? '',
  1196. 'order_at' => $site->order_at ?? '',
  1197. 'server_title' => implode('-', $site->users->where('role_id', Role::TYPE_SERVER)->pluck('nickname')->toArray()),
  1198. 'online_date' => $site->online_at ?? '',
  1199. 'reach_at' => $site->reach_at ?? '',
  1200. ];
  1201. }
  1202. array_unshift($list, ['项目状态', '项目过名称', '域名', 'pc端分数', '移动端分数', '月流量', '月排名', '询盘', '月软文', '月外链', '下单时间', '客服人员', '上线时间', '达标时间']);
  1203. return (new BasicExport($list))->download(sprintf('项目汇总%s.xls', date('YmdHis')));
  1204. }
  1205. //站点添加和修改
  1206. public function save(SiteSaveRequest $request, $id)
  1207. {
  1208. if (!$request->ajax()) {
  1209. if ($id > 0) {
  1210. $site = Site::query()->where(['id' => $id])->first();
  1211. $payment = SitePayment::query()->where(['site_id' => $id])->first();
  1212. }
  1213. $businesses = Business::query()->get();
  1214. return view('admin/site/save', [
  1215. 'data' => $site ?? null,
  1216. 'payment' => $payment ?? null,
  1217. 'businesses' => $businesses,
  1218. 'natures' => Site::NATURE_TYPE,
  1219. 'contracts' => Contract::all()
  1220. ]);
  1221. }
  1222. return $this->logic->updateOrCreate($request->validated(), $id);
  1223. }
  1224. //客户完善信息
  1225. public function customer(CustomerRequest $request, $id)
  1226. {
  1227. if (!$request->ajax()) {
  1228. $condition = ['site_id' => $id];
  1229. $view = 'admin/site/customer';
  1230. return view($view, [
  1231. 'siteId' => $id,
  1232. 'additionData' => SiteAddition::query()->where($condition)->first(),
  1233. 'keywordData' => SiteInfo::query()->where($condition)->first(),
  1234. 'stationData' => SiteStation::query()->where($condition)->first(),
  1235. 'enterpriseData' => SiteEnterprise::query()->where($condition)->first(),
  1236. 'marketerData' => SiteMarketer::query()->where($condition)->first(),
  1237. 'snsData' => SiteSns::query()->where($condition)->first(),
  1238. 'businesses' => Business::all(),
  1239. 'natures' => Site::NATURE_TYPE
  1240. ]);
  1241. }
  1242. return $this->logic->customerHandle($request->validated(), $request->input('act'), $request->input('source'), $id);
  1243. }
  1244. //针对客户界面 没有左边侧栏的
  1245. public function customerNoSide(CustomerRequest $request)
  1246. {
  1247. $siteId = $request->input('siteId');
  1248. if (!$siteId) {
  1249. $site = $this->hasUserOneSite();
  1250. if (!$site) {
  1251. return view('admin/errors/tips');
  1252. }
  1253. $siteId = $site->id;
  1254. }
  1255. if (!$request->ajax()) {
  1256. $condition = ['site_id' => $siteId];
  1257. $view = 'admin/site/customer_no_side';
  1258. return view($view, [
  1259. 'siteId' => $siteId,
  1260. 'additionData' => SiteAddition::query()->where($condition)->first(),
  1261. 'keywordData' => SiteInfo::query()->where($condition)->first(),
  1262. 'stationData' => SiteStation::query()->where($condition)->first(),
  1263. 'enterpriseData' => SiteEnterprise::query()->where($condition)->first(),
  1264. 'marketerData' => SiteMarketer::query()->where($condition)->first(),
  1265. 'snsData' => SiteSns::query()->where($condition)->first(),
  1266. 'businesses' => Business::all(),
  1267. 'natures' => Site::NATURE_TYPE
  1268. ]);
  1269. }
  1270. }
  1271. public function customerIdentify(Request $request)
  1272. {
  1273. $siteId = $request->input('siteId');
  1274. $str = $this->encrypt($siteId);
  1275. return response()->json(['data' => $str]);
  1276. }
  1277. //加密
  1278. protected function encrypt($siteId)
  1279. {
  1280. $info = [
  1281. 'site_id' => $siteId,
  1282. 'expire_time' => strtotime('+1 week')
  1283. ];
  1284. $str = encodeStr(json_encode($info));
  1285. return $str . "." . md5($str . "customer_salt");
  1286. }
  1287. //解密
  1288. protected function decrypt($str)
  1289. {
  1290. $arr = explode('.', $str);
  1291. if (count($arr) != 2) {
  1292. return '失效链接';
  1293. }
  1294. if (md5($arr[0] . "customer_salt") != $arr[1]) {
  1295. return '失败链接';
  1296. }
  1297. return json_decode(decodeStr($arr[0]), true);
  1298. }
  1299. //客户信息中的连接
  1300. public function customerAlone(CustomerRequest $request)
  1301. {
  1302. $identify = $request->input('identify');
  1303. $info = $this->decrypt($identify);
  1304. if (!is_array($info)) {
  1305. return view('admin/site/customer_error', [
  1306. 'message' => $info
  1307. ]);
  1308. }
  1309. $siteId = $info['site_id'];
  1310. $expired_time = $info['expire_time'];
  1311. if ($expired_time < time()) {
  1312. return view('admin/site/customer_error', [
  1313. 'message' => '链接失效'
  1314. ]);
  1315. }
  1316. if (!$request->ajax()) {
  1317. $condition = ['site_id' => $siteId];
  1318. $view = 'admin/site/customer_alone';
  1319. return view($view, [
  1320. 'siteId' => $siteId,
  1321. 'additionData' => SiteAddition::query()->where($condition)->first(),
  1322. 'keywordData' => SiteInfo::query()->where($condition)->first(),
  1323. 'stationData' => SiteStation::query()->where($condition)->first(),
  1324. 'enterpriseData' => SiteEnterprise::query()->where($condition)->first(),
  1325. 'marketerData' => SiteMarketer::query()->where($condition)->first(),
  1326. 'snsData' => SiteSns::query()->where($condition)->first(),
  1327. 'businesses' => Business::all(),
  1328. 'natures' => Site::NATURE_TYPE,
  1329. 'identify' => $identify
  1330. ]);
  1331. }
  1332. return $this->logic->customerHandle($request->validated(), $request->input('act'), $request->input('source'), $siteId);
  1333. }
  1334. //导出 SNS 社交资料
  1335. public function snsExport(Request $request)
  1336. {
  1337. $data = SiteSns::query()->where(['site_id' => $request->input('siteId')])->first();
  1338. if ($data) {
  1339. $records = [
  1340. [
  1341. 'youtube',
  1342. '展示url地址',
  1343. $data->youtube_url
  1344. ], [
  1345. 'youtube',
  1346. '用户名(登入邮箱)',
  1347. $data->youtube_account
  1348. ], [
  1349. 'youtube',
  1350. '密码:',
  1351. $data->youtube_password
  1352. ], [
  1353. 'Facebook',
  1354. '个人页面展示url地址:',
  1355. $data->facebook_my_url,
  1356. ], [
  1357. 'Facebook',
  1358. '企业page展示url地址',
  1359. $data->facebook_url,
  1360. ], [
  1361. 'Facebook',
  1362. '用户名(登入邮箱)',
  1363. $data->facebook_account,
  1364. ], [
  1365. 'Facebook',
  1366. '密码:',
  1367. $data->facebook_password,
  1368. ], [
  1369. 'Twitter',
  1370. '展示url地址:',
  1371. $data->twitter_url,
  1372. ], [
  1373. 'Twitter',
  1374. '用户名(登入邮箱)',
  1375. $data->twitter_account,
  1376. ], [
  1377. 'Twitter',
  1378. '密码',
  1379. $data->twitter_password,
  1380. ], [
  1381. 'Linkedin',
  1382. '个人页面展示url地址',
  1383. $data->linkedin_my_url,
  1384. ], [
  1385. 'Linkedin',
  1386. '企业page展示url地址',
  1387. $data->linkedin_url,
  1388. ], [
  1389. 'Linkedin',
  1390. '用户名(登入邮箱)',
  1391. $data->linkedin_account,
  1392. ], [
  1393. 'Linkedin',
  1394. '密码',
  1395. $data->linkedin_password,
  1396. ], [
  1397. 'Pinterst',
  1398. '展示url地址:',
  1399. $data->pinterst_url,
  1400. ], [
  1401. 'Pinterst',
  1402. '用户名(登入邮箱',
  1403. $data->pinterst_account,
  1404. ], [
  1405. 'Pinterst',
  1406. '密码',
  1407. $data->pinterst_password,
  1408. ]
  1409. ];
  1410. } else {
  1411. $records = [];
  1412. }
  1413. array_unshift($records, ['社交类型', '概览', '详细']);
  1414. return (new BasicExport($records))->download(sprintf('sns信息%s.xls', date('YmdHis')));
  1415. }
  1416. //批量删除
  1417. public function batchDestroy(Request $request)
  1418. {
  1419. $ids = $request->input('ids');
  1420. $oldSiteIds = Site::query()->whereIn('id', $ids)->pluck('old_id')->filter()->toArray();
  1421. Site::destroy($ids);
  1422. //同步老rank平台的数据
  1423. $siteSync = new SiteSyncLogic();
  1424. $siteSync->delete($oldSiteIds);
  1425. return response()->json(['message' => '操作成功']);
  1426. }
  1427. //填写款项节点
  1428. public function payment(PaymentRequest $request, $id)
  1429. {
  1430. if (!$request->ajax()) {
  1431. $payment = SitePayment::query()->where(['site_id' => $id])->first();
  1432. return view('admin/site/payment', [
  1433. 'data' => $payment ?? null,
  1434. 'siteId' => $id
  1435. ]);
  1436. }
  1437. SitePayment::query()->updateOrCreate([
  1438. 'site_id' => $id
  1439. ], $request->validated());
  1440. return response()->json(['message' => '操作成功']);
  1441. }
  1442. /**
  1443. * 项目概况--查看套餐
  1444. */
  1445. public function overview_set_meal(SiteOverviewRequest $request, $id)
  1446. {
  1447. $data = Site::query()->where('id',$id)->first();
  1448. if(empty($data->package_type) || $data->package_type=='0'){
  1449. $data->package_type='未选择套餐';
  1450. }else{
  1451. if($data->package_type=='1'){
  1452. $data->package_type='老套餐';
  1453. }else if($data->package_type=='2'){
  1454. $data->package_type='2019标准版';
  1455. }else if($data->package_type=='3'){
  1456. $data->package_type='2019升级版';
  1457. }else if($data->package_type=='4'){
  1458. $data->package_type='2019高级版';
  1459. }else if($data->package_type=='5'){
  1460. $data->package_type='2020标准版';
  1461. }else if($data->package_type=='6'){
  1462. $data->package_type='2020升级版';
  1463. }else if($data->package_type=='7'){
  1464. $data->package_type='2020高级版';
  1465. }else if($data->package_type=='8'){
  1466. $data->package_type='定制版';
  1467. }else{
  1468. $data->package_type='暂无套餐名称';
  1469. }
  1470. }
  1471. var_dump($data->package_type);
  1472. die;
  1473. }
  1474. /**
  1475. * 项目概况--详细信息
  1476. */
  1477. public function overview_view(SiteOverviewRequest $request, $id)
  1478. {
  1479. if (!$request->ajax()) {
  1480. $site = Site::query()->with(['users'])->where('id', $id)->first();
  1481. if (!$site) {
  1482. return view('admin/site/tips', [
  1483. 'tips' => '站点信息不存在',
  1484. 'siteId' => $id
  1485. ]);
  1486. }
  1487. if ($site) {
  1488. $single['hasServerIds'] = $site->users->where('role_id', Role::TYPE_SERVER)->pluck('id')->toArray();
  1489. $single['hasEditorIds'] = $site->users->where('role_id', Role::TYPE_AE)->pluck('id')->toArray();
  1490. $single['hasMangerIds'] = $site->users->where('role_id', Role::TYPE_MANAGER)->pluck('id')->toArray();
  1491. $single['hasBidIds'] = $site->users->whereIn('role_id', [Role::TYPE_BID, Role::TYPE_BIDDING_MANAGER])->pluck('id')->toArray();
  1492. $single['hasSellerIds'] = $site->users->where('role_id', Role::TYPE_SELLER)->pluck('id')->toArray();
  1493. $single['hasMangeHelpIds'] = $site->users->where('role_id', Role::TYPE_MANAGE_HELPER)->pluck('id')->toArray();
  1494. $single['hasOptimizerIds'] = $site->users->where('role_id', Role::TYPE_OPTIMIZER)->pluck('id')->toArray();
  1495. $single['hasWebIds'] = $site->users->where('role_id', Role::TYPE_WEB)->pluck('id')->toArray();
  1496. $single['hasDesignerIds'] = $site->users->where('role_id', Role::TYPE_DESIGNER)->pluck('id')->toArray();
  1497. $single['hasPropagandaIds'] = $site->users->where('role_id', Role::TYPE_SOFT_TEXT_SEARCH)->pluck('id')->toArray();
  1498. /*$single['hasPlannerIds'] = $site->users->where('role_id', Role::TYPE_PLANNER)->pluck('id')->toArray();*/
  1499. $single['hasExternalLinkIds'] = $site->users->where('role_id', Role::TYPE_LINK)->pluck('id')->toArray();
  1500. $single['hasChongqingLinkIds'] = $site->users->where('role_id', Role::TYPE_LINK_PART_CHONGQING)->pluck('id')->toArray();
  1501. $single['hasArticleIds'] = $site->users->where('role_id', Role::TYPE_ARTICLE)->pluck('id')->toArray();
  1502. $single['hasOptimizationEditing'] = $site->users->where('role_id', Role::TYPE_OPTIMIZATION_EDITING)->pluck('id')->toArray();
  1503. }
  1504. return view('admin/site/overview_view', [
  1505. 'roles' => $user = auth()->user(),
  1506. 'siteInfo' => SiteInfo::query()->where(['site_id' => $id])->first(),
  1507. 'siteId' => $id,
  1508. 'data' => $site ?? null,
  1509. 'enterpriseNature' => explode(',', $site->enterprise_nature) ?? [],
  1510. 'case_ids' => explode(',', $site->case_ids) ?? [],
  1511. 'businesses' => Business::query()->orderBy('sort')->get(),
  1512. 'natures' => Site::NATURE_TYPE,
  1513. 'contracts' => Contract::all(),
  1514. 'servers' => Server::all(), //服务器
  1515. 'article' => Role::getUsers(Role::TYPE_ARTICLE), //软文
  1516. 'services' => Role::getUsers(Role::TYPE_SERVER), //服务人员
  1517. 'editors' => Role::getUsers(Role::TYPE_AE),
  1518. 'managers' => Role::getUsers(Role::TYPE_MANAGER),
  1519. 'managerHelpers' => Role::getUsers(Role::TYPE_MANAGE_HELPER),
  1520. 'planner' => Role::getUsers(Role::TYPE_PLANNER),
  1521. 'propaganda' => Role::getUsers(Role::TYPE_SOFT_TEXT_SEARCH),//软文查找人员
  1522. 'optimizers' => Role::getUsers(Role::TYPE_OPTIMIZER),
  1523. 'bidUsers' => User::query()->whereIn('role_id', [Role::TYPE_BIDDING_MANAGER, Role::TYPE_BID])->get(),
  1524. 'sellerUsers' => Role::getUsers(Role::TYPE_SELLER),
  1525. 'webUsers' => Role::getUsers(Role::TYPE_WEB),
  1526. 'designers' => Role::getUsers(Role::TYPE_DESIGNER),
  1527. 'externalLink' => Role::getUsers(Role::TYPE_LINK),
  1528. 'chongqingLink' => Role::getUsers(Role::TYPE_LINK_PART_CHONGQING),//重庆外链兼职
  1529. 'optimizationEditing' => Role::getUsers(Role::TYPE_OPTIMIZATION_EDITING),
  1530. 'payment' => SitePayment::query()->where(['site_id' => $id])->first(),
  1531. 'facebookSocial' => Social::query()->where(['type' => Social::FACEBOOK])->first()
  1532. ] + ($single ?? ['hasServerIds' => [], 'hasEditorIds' => [], 'hasMangerIds' => []]) +
  1533. Social::query()->where(['site_id' => $id])->get()->keyBy('type')->toArray() + // 社交信息
  1534. ['linkedBaseInfo' => Social::query()->where(['site_id' => 0, 'type' => Social::LINKED])->first()] +
  1535. ['optimizePage' => SiteOptimizePage::query()->where(['site_id' => $id])->get()->toArray()]
  1536. );
  1537. }
  1538. return $this->logic->overview($id, $request->validated(), $request->input('type'));
  1539. }
  1540. /**
  1541. * 项目概况--竞价
  1542. */
  1543. public function overview_bidding(SiteOverviewRequest $request, $id)
  1544. {
  1545. if (!$request->ajax()) {
  1546. $site = Site::query()->with(['users'])->where('id', $id)->first();
  1547. if (!$site) {
  1548. return view('admin/site/tips', [
  1549. 'tips' => '站点信息不存在',
  1550. 'siteId' => $id
  1551. ]);
  1552. }
  1553. if ($site) {
  1554. $single['hasServerIds'] = $site->users->where('role_id', Role::TYPE_SERVER)->pluck('id')->toArray();
  1555. $single['hasEditorIds'] = $site->users->where('role_id', Role::TYPE_AE)->pluck('id')->toArray();
  1556. $single['hasMangerIds'] = $site->users->where('role_id', Role::TYPE_MANAGER)->pluck('id')->toArray();
  1557. $single['hasBidIds'] = $site->users->whereIn('role_id', [Role::TYPE_BID, Role::TYPE_BIDDING_MANAGER])->pluck('id')->toArray();
  1558. $single['hasSellerIds'] = $site->users->where('role_id', Role::TYPE_SELLER)->pluck('id')->toArray();
  1559. $single['hasMangeHelpIds'] = $site->users->where('role_id', Role::TYPE_MANAGE_HELPER)->pluck('id')->toArray();
  1560. $single['hasOptimizerIds'] = $site->users->where('role_id', Role::TYPE_OPTIMIZER)->pluck('id')->toArray();
  1561. $single['hasWebIds'] = $site->users->where('role_id', Role::TYPE_WEB)->pluck('id')->toArray();
  1562. $single['hasDesignerIds'] = $site->users->where('role_id', Role::TYPE_DESIGNER)->pluck('id')->toArray();
  1563. $single['hasPropagandaIds'] = $site->users->where('role_id', Role::TYPE_SOFT_TEXT_SEARCH)->pluck('id')->toArray();
  1564. /*$single['hasPlannerIds'] = $site->users->where('role_id', Role::TYPE_PLANNER)->pluck('id')->toArray();*/
  1565. $single['hasExternalLinkIds'] = $site->users->where('role_id', Role::TYPE_LINK)->pluck('id')->toArray();
  1566. $single['hasChongqingLinkIds'] = $site->users->where('role_id', Role::TYPE_LINK_PART_CHONGQING)->pluck('id')->toArray();
  1567. $single['hasArticleIds'] = $site->users->where('role_id', Role::TYPE_ARTICLE)->pluck('id')->toArray();
  1568. $single['hasOptimizationEditing'] = $site->users->where('role_id', Role::TYPE_OPTIMIZATION_EDITING)->pluck('id')->toArray();
  1569. }
  1570. return view('admin/site/overview_bidding', [
  1571. 'roles' => $user = auth()->user(),
  1572. 'siteInfo' => SiteInfo::query()->where(['site_id' => $id])->first(),
  1573. 'siteId' => $id,
  1574. 'data' => $site ?? null,
  1575. 'enterpriseNature' => explode(',', $site->enterprise_nature) ?? [],
  1576. 'case_ids' => explode(',', $site->case_ids) ?? [],
  1577. 'businesses' => Business::query()->orderBy('sort')->get(),
  1578. 'natures' => Site::NATURE_TYPE,
  1579. 'contracts' => Contract::all(),
  1580. 'servers' => Server::all(), //服务器
  1581. 'article' => Role::getUsers(Role::TYPE_ARTICLE), //软文
  1582. 'services' => Role::getUsers(Role::TYPE_SERVER), //服务人员
  1583. 'editors' => Role::getUsers(Role::TYPE_AE),
  1584. 'managers' => Role::getUsers(Role::TYPE_MANAGER),
  1585. 'managerHelpers' => Role::getUsers(Role::TYPE_MANAGE_HELPER),
  1586. 'planner' => Role::getUsers(Role::TYPE_PLANNER),
  1587. 'propaganda' => Role::getUsers(Role::TYPE_SOFT_TEXT_SEARCH),//软文查找人员
  1588. 'optimizers' => Role::getUsers(Role::TYPE_OPTIMIZER),
  1589. 'bidUsers' => User::query()->whereIn('role_id', [Role::TYPE_BIDDING_MANAGER, Role::TYPE_BID])->get(),
  1590. 'sellerUsers' => Role::getUsers(Role::TYPE_SELLER),
  1591. 'webUsers' => Role::getUsers(Role::TYPE_WEB),
  1592. 'designers' => Role::getUsers(Role::TYPE_DESIGNER),
  1593. 'externalLink' => Role::getUsers(Role::TYPE_LINK),
  1594. 'chongqingLink' => Role::getUsers(Role::TYPE_LINK_PART_CHONGQING),//重庆外链兼职
  1595. 'optimizationEditing' => Role::getUsers(Role::TYPE_OPTIMIZATION_EDITING),
  1596. 'payment' => SitePayment::query()->where(['site_id' => $id])->first(),
  1597. 'facebookSocial' => Social::query()->where(['type' => Social::FACEBOOK])->first()
  1598. ] + ($single ?? ['hasServerIds' => [], 'hasEditorIds' => [], 'hasMangerIds' => []]) +
  1599. Social::query()->where(['site_id' => $id])->get()->keyBy('type')->toArray() + // 社交信息
  1600. ['linkedBaseInfo' => Social::query()->where(['site_id' => 0, 'type' => Social::LINKED])->first()] +
  1601. ['optimizePage' => SiteOptimizePage::query()->where(['site_id' => $id])->get()->toArray()]
  1602. );
  1603. }
  1604. return $this->logic->overview($id, $request->validated(), $request->input('type'));
  1605. }
  1606. /**
  1607. * 项目概览
  1608. * @param SiteOverviewRequest $request
  1609. * @param $id
  1610. * @return View\Factory|JsonResponse|\Illuminate\View\View
  1611. */
  1612. public function overview(SiteOverviewRequest $request, $id)
  1613. {
  1614. if (!$request->ajax()) {
  1615. $site = Site::query()->with(['users'])->where('id', $id)->first();
  1616. if (!$site) {
  1617. return view('admin/site/tips', [
  1618. 'tips' => '站点信息不存在',
  1619. 'siteId' => $id
  1620. ]);
  1621. }
  1622. if ($site) {
  1623. $single['hasServerIds'] = $site->users->where('role_id', Role::TYPE_SERVER)->pluck('id')->toArray();
  1624. $single['hasEditorIds'] = $site->users->where('role_id', Role::TYPE_AE)->pluck('id')->toArray();
  1625. $single['hasMangerIds'] = $site->users->where('role_id', Role::TYPE_MANAGER)->pluck('id')->toArray();
  1626. $single['hasBidIds'] = $site->users->whereIn('role_id', [Role::TYPE_BID, Role::TYPE_BIDDING_MANAGER])->pluck('id')->toArray();
  1627. $single['hasSellerIds'] = $site->users->where('role_id', Role::TYPE_SELLER)->pluck('id')->toArray();
  1628. $single['hasMangeHelpIds'] = $site->users->where('role_id', Role::TYPE_MANAGE_HELPER)->pluck('id')->toArray();
  1629. $single['hasOptimizerIds'] = $site->users->where('role_id', Role::TYPE_OPTIMIZER)->pluck('id')->toArray();
  1630. $single['hasWebIds'] = $site->users->where('role_id', Role::TYPE_WEB)->pluck('id')->toArray();
  1631. $single['hasDesignerIds'] = $site->users->where('role_id', Role::TYPE_DESIGNER)->pluck('id')->toArray();
  1632. $single['hasPropagandaIds'] = $site->users->where('role_id', Role::TYPE_SOFT_TEXT_SEARCH)->pluck('id')->toArray();
  1633. /*$single['hasPlannerIds'] = $site->users->where('role_id', Role::TYPE_PLANNER)->pluck('id')->toArray();*/
  1634. $single['hasExternalLinkIds'] = $site->users->where('role_id', Role::TYPE_LINK)->pluck('id')->toArray();
  1635. $single['hasChongqingLinkIds'] = $site->users->where('role_id', Role::TYPE_LINK_PART_CHONGQING)->pluck('id')->toArray();
  1636. $single['hasArticleIds'] = $site->users->where('role_id', Role::TYPE_ARTICLE)->pluck('id')->toArray();
  1637. $single['hasOptimizationEditing'] = $site->users->where('role_id', Role::TYPE_OPTIMIZATION_EDITING)->pluck('id')->toArray();
  1638. }
  1639. return view('admin/site/overview', [
  1640. 'roles' => $user = auth()->user(),
  1641. 'siteInfo' => SiteInfo::query()->where(['site_id' => $id])->first(),
  1642. 'siteId' => $id,
  1643. 'data' => $site ?? null,
  1644. 'enterpriseNature' => explode(',', $site->enterprise_nature) ?? [],
  1645. 'case_ids' => explode(',', $site->case_ids) ?? [],
  1646. 'businesses' => Business::query()->orderBy('sort')->get(),
  1647. 'natures' => Site::NATURE_TYPE,
  1648. 'contracts' => Contract::all(),
  1649. 'servers' => Server::all(), //服务器
  1650. 'article' => Role::getUsers(Role::TYPE_ARTICLE), //软文
  1651. 'services' => Role::getUsers(Role::TYPE_SERVER), //服务人员
  1652. 'editors' => Role::getUsers(Role::TYPE_AE),
  1653. 'managers' => Role::getUsers(Role::TYPE_MANAGER),
  1654. 'managerHelpers' => Role::getUsers(Role::TYPE_MANAGE_HELPER),
  1655. 'planner' => Role::getUsers(Role::TYPE_PLANNER),
  1656. 'propaganda' => Role::getUsers(Role::TYPE_SOFT_TEXT_SEARCH),//软文查找人员
  1657. 'optimizers' => Role::getUsers(Role::TYPE_OPTIMIZER),
  1658. 'bidUsers' => User::query()->whereIn('role_id', [Role::TYPE_BIDDING_MANAGER, Role::TYPE_BID])->get(),
  1659. 'sellerUsers' => Role::getUsers(Role::TYPE_SELLER),
  1660. 'webUsers' => Role::getUsers(Role::TYPE_WEB),
  1661. 'designers' => Role::getUsers(Role::TYPE_DESIGNER),
  1662. 'externalLink' => Role::getUsers(Role::TYPE_LINK),
  1663. 'chongqingLink' => Role::getUsers(Role::TYPE_LINK_PART_CHONGQING),//重庆外链兼职
  1664. 'optimizationEditing' => Role::getUsers(Role::TYPE_OPTIMIZATION_EDITING),
  1665. 'payment' => SitePayment::query()->where(['site_id' => $id])->first(),
  1666. 'facebookSocial' => Social::query()->where(['type' => Social::FACEBOOK])->first()
  1667. ] + ($single ?? ['hasServerIds' => [], 'hasEditorIds' => [], 'hasMangerIds' => []]) +
  1668. Social::query()->where(['site_id' => $id])->get()->keyBy('type')->toArray() + // 社交信息
  1669. ['linkedBaseInfo' => Social::query()->where(['site_id' => 0, 'type' => Social::LINKED])->first()] +
  1670. ['optimizePage' => SiteOptimizePage::query()->where(['site_id' => $id])->get()->toArray()]
  1671. );
  1672. }
  1673. return $this->logic->overview($id, $request->validated(), $request->input('type'));
  1674. }
  1675. //账号保存
  1676. public function accountSave(Request $request, $siteId)
  1677. {
  1678. $adminAccount = $request->input('adminAccount');
  1679. $adminPass = $request->input('adminPass');
  1680. $userAccount = $request->input('userAccount');
  1681. $userPass = $request->input('userPass');
  1682. $appAccount = $request->input('appAccount');
  1683. $appPass = $request->input('appPass');
  1684. if (SiteInfo::query()->where(['site_id' => $siteId])->exists()) {
  1685. SiteInfo::query()->where(['site_id' => $siteId])->update([
  1686. 'admin_account' => $adminAccount,
  1687. 'admin_pass' => $adminPass,
  1688. 'user_account' => $userAccount,
  1689. 'user_pass' => $userPass,
  1690. 'app_account' => $appAccount,
  1691. 'app_pass' => $appPass,
  1692. ]);
  1693. } else {
  1694. SiteInfo::query()->create([
  1695. 'site_id' => $siteId,
  1696. 'admin_account' => $adminAccount,
  1697. 'admin_pass' => $adminPass,
  1698. 'user_account' => $userAccount,
  1699. 'user_pass' => $userPass,
  1700. 'app_account' => $appAccount,
  1701. 'app_pass' => $appPass,
  1702. ]);
  1703. }
  1704. return response()->json(['message' => '操作成功']);
  1705. }
  1706. //优化页保存
  1707. public function optimizePageSave(Request $request, $siteId)
  1708. {
  1709. $groupData = $request->input('groupData');
  1710. if (!is_array($groupData)) {
  1711. $groupData = [];
  1712. }
  1713. $optimizePageIds = SiteOptimizePage::query()->where(['site_id' => $siteId])->pluck('id')->toArray();
  1714. $newIds = array_filter(array_column($groupData, 'id'));
  1715. foreach ($groupData as $item) {
  1716. if (!isset($item['id'])) {
  1717. continue;
  1718. }
  1719. if (!$item['id']) {
  1720. SiteOptimizePage::query()->create([
  1721. 'site_id' => $siteId,
  1722. 'keyword' => $item['keyword'] ?? '',
  1723. 'url' => $item['url'] ?? '',
  1724. 'is_optimize' => !$item['is_optimize'] ? 0 : 1
  1725. ]);
  1726. } else {
  1727. SiteOptimizePage::query()->where(['id' => $item['id']])->update([
  1728. 'keyword' => $item['keyword'] ?? '',
  1729. 'url' => $item['url'] ?? '',
  1730. 'is_optimize' => !$item['is_optimize'] ? 0 : 1
  1731. ]);
  1732. }
  1733. }
  1734. $diffIds = array_diff($optimizePageIds, $newIds);
  1735. if ($diffIds) {
  1736. SiteOptimizePage::query()->whereIn('id', $diffIds)->delete();
  1737. }
  1738. return response()->json(['message' => '操作成功']);
  1739. }
  1740. //导入优化页
  1741. public function importOptimizePage(Request $request)
  1742. {
  1743. set_time_limit(0);
  1744. $siteId = $request->input('siteId');
  1745. if (!$request->input('excel_path') || !$siteId) {
  1746. return response()->json(['message' => '请先上传excel文件'], 422);
  1747. }
  1748. try {
  1749. Excel::import(new OptimizePageImport($siteId), $request->input('excel_path'), 'public');
  1750. } catch (\Throwable $throwable) {
  1751. Log::error(var_export($throwable->getMessage(), 1));
  1752. return response()->json(['message' => '导入失败'], 400);
  1753. }
  1754. return response()->json(['message' => '操作成功']);
  1755. }
  1756. //导出优化页
  1757. public function exportOptimizePage(Request $request)
  1758. {
  1759. $siteId = $request->input('siteId');
  1760. $results = SiteOptimizePage::query()->select(['keyword', 'url', 'is_optimize'])->where(['site_id' => $siteId])->get()->toArray();
  1761. foreach ($results as &$result) {
  1762. if (!empty($result['is_optimize'])) {
  1763. $result['is_optimize'] = '是';
  1764. } else {
  1765. $result['is_optimize'] = '否';
  1766. }
  1767. }
  1768. array_unshift($results, ['关键词', 'url地址', '是否优化']);
  1769. return (new BasicExport($results))->download(sprintf('重点优化%s.xls', date('YmdHis')));
  1770. }
  1771. /**
  1772. * 客户界面项目概览
  1773. * @param SiteOverviewRequest $request
  1774. * @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\JsonResponse|\Illuminate\View\View
  1775. */
  1776. public function customerOverview(SiteOverviewRequest $request)
  1777. {
  1778. $userSite = $this->hasUserOneSite();
  1779. if (!$userSite) {
  1780. return view('admin/errors/tips', [
  1781. 'tips' => '站点信息不存在'
  1782. ]);
  1783. }
  1784. $id = $userSite->id;
  1785. if (!$request->ajax()) {
  1786. $site = Site::query()->with(['users'])->where('id', $id)->first();
  1787. if (!$site) {
  1788. return view('admin/errors/tips', [
  1789. 'tips' => '站点信息不存在'
  1790. ]);
  1791. }
  1792. if ($site) {
  1793. $single['hasServerIds'] = $site->users->where('role_id', Role::TYPE_SERVER)->pluck('id')->toArray();
  1794. $single['hasEditorIds'] = $site->users->where('role_id', Role::TYPE_AE)->pluck('id')->toArray();
  1795. $single['hasMangerIds'] = $site->users->where('role_id', Role::TYPE_MANAGER)->pluck('id')->toArray();
  1796. $single['hasBidIds'] = $site->users->whereIn('role_id', [Role::TYPE_BID, Role::TYPE_BIDDING_MANAGER])->pluck('id')->toArray();
  1797. $single['hasSellerIds'] = $site->users->where('role_id', Role::TYPE_SELLER)->pluck('id')->toArray();
  1798. $single['hasMangeHelpIds'] = $site->users->where('role_id', Role::TYPE_MANAGE_HELPER)->pluck('id')->toArray();
  1799. $single['hasOptimizerIds'] = $site->users->where('role_id', Role::TYPE_OPTIMIZER)->pluck('id')->toArray();
  1800. $single['hasWebIds'] = $site->users->where('role_id', Role::TYPE_WEB)->pluck('id')->toArray();
  1801. $single['hasDesignerIds'] = $site->users->where('role_id', Role::TYPE_DESIGNER)->pluck('id')->toArray();
  1802. $single['hasPropagandaIds'] = $site->users->where('role_id', Role::TYPE_SOFT_TEXT_SEARCH)->pluck('id')->toArray();
  1803. /*$single['hasPlannerIds'] = $site->users->where('role_id', Role::TYPE_PLANNER)->pluck('id')->toArray();*/
  1804. $single['hasExternalLinkIds'] = $site->users->where('role_id', Role::TYPE_LINK)->pluck('id')->toArray();
  1805. $single['hasChongqingLinkIds'] = $site->users->where('role_id', Role::TYPE_LINK_PART_CHONGQING)->pluck('id')->toArray();
  1806. $single['hasArticleIds'] = $site->users->where('role_id', Role::TYPE_ARTICLE)->pluck('id')->toArray();
  1807. $single['hasOptimizationEditing'] = $site->users->where('role_id', Role::TYPE_OPTIMIZATION_EDITING)->pluck('id')->toArray();
  1808. }
  1809. return view('admin/site/customer_overview', [
  1810. 'siteId' => $id,
  1811. 'data' => $site ?? null,
  1812. 'businesses' => Business::all(),
  1813. 'natures' => Site::NATURE_TYPE,
  1814. 'contracts' => Contract::all(),
  1815. 'servers' => Server::all(), //服务器
  1816. 'article' => Role::getUsers(Role::TYPE_ARTICLE), //软文
  1817. 'services' => Role::getUsers(Role::TYPE_SERVER), //服务人员
  1818. 'editors' => Role::getUsers(Role::TYPE_AE),
  1819. 'managers' => Role::getUsers(Role::TYPE_MANAGER),
  1820. 'managerHelpers' => Role::getUsers(Role::TYPE_MANAGE_HELPER),
  1821. 'planner' => Role::getUsers(Role::TYPE_PLANNER),
  1822. 'propaganda' => Role::getUsers(Role::TYPE_SOFT_TEXT_SEARCH),//软文查找人员
  1823. 'optimizers' => Role::getUsers(Role::TYPE_OPTIMIZER),
  1824. 'bidUsers' => User::query()->whereIn('role_id', [Role::TYPE_BIDDING_MANAGER, Role::TYPE_BID])->get(),
  1825. 'sellerUsers' => Role::getUsers(Role::TYPE_SELLER),
  1826. 'webUsers' => Role::getUsers(Role::TYPE_WEB),
  1827. 'designers' => Role::getUsers(Role::TYPE_DESIGNER),
  1828. 'externalLink' => Role::getUsers(Role::TYPE_LINK),
  1829. 'chongqingLink' => Role::getUsers(Role::TYPE_LINK_PART_CHONGQING),//重庆外链兼职
  1830. 'optimizationEditing' => Role::getUsers(Role::TYPE_OPTIMIZATION_EDITING),
  1831. 'payment' => SitePayment::query()->where(['site_id' => $id])->first(),
  1832. 'facebookSocial' => Social::query()->where(['type' => Social::FACEBOOK])->first()
  1833. ] + ($single ?? ['hasServerIds' => [], 'hasEditorIds' => [], 'hasMangerIds' => []]) +
  1834. Social::query()->where(['site_id' => $id])->get()->keyBy('type')->toArray() // 社交信息
  1835. );
  1836. }
  1837. return $this->logic->overview($id, $request->validated(), $request->input('type'));
  1838. }
  1839. //项目概况下的 修改bid状态
  1840. public function changeBidStatus(Request $request, $id)
  1841. {
  1842. $bidStatus = $request->input('bidStatus');
  1843. Site::query()->where(['id' => $id])->update(['bid_status' => $bidStatus]);
  1844. return response()->json(['message' => '操作成功']);
  1845. }
  1846. //项目概况下的 是否特殊软文
  1847. public function changeSpecArticle(Request $request, $siteId)
  1848. {
  1849. $spec_article = $request->input('spec_article');
  1850. Site::query()->where(['id' => $siteId])->update(['spec_article' => $spec_article]);
  1851. return response()->json(['message' => '操作成功']);
  1852. }
  1853. ///项目概况下的 是否cdn
  1854. public function changeCDNStatus(Request $request, $id)
  1855. {
  1856. $status = $request->input('status');
  1857. Site::query()->where(['id' => $id])->update(['is_cdn' => $status]);
  1858. return response()->json(['message' => '操作成功']);
  1859. }
  1860. ///项目概况下的 是否退款
  1861. public function changeRefundStatus(Request $request, $id)
  1862. {
  1863. $status = $request->input('status');
  1864. Site::query()->where(['id' => $id])->update(['is_refund' => $status]);
  1865. return response()->json(['message' => '操作成功']);
  1866. }
  1867. ///项目概况下的 域名是否我们购买
  1868. public function changeDomainStatus(Request $request, $id)
  1869. {
  1870. $status = $request->input('status');
  1871. Site::query()->where(['id' => $id])->update(['domain_us_buy' => $status]);
  1872. return response()->json(['message' => '操作成功']);
  1873. }
  1874. //项目概况下的 是否网站续费
  1875. public function changeRenewStatus(Request $request, $id)
  1876. {
  1877. $status = $request->input('status');
  1878. Site::query()->where(['id' => $id])->update(['is_renew' => $status]);
  1879. return response()->json(['message' => '操作成功']);
  1880. }
  1881. //项目概况下的 当月上线目标
  1882. public function changeOnlineStatus(Request $request, $id)
  1883. {
  1884. $status = $request->input('status');
  1885. Site::query()->where(['id' => $id])->update(['is_current_month_online' => $status, 'current_month_online_date' => date('Y-m-t 23:59:59')]);
  1886. return response()->json(['message' => '操作成功']);
  1887. }
  1888. //项目概况下的 证书是否我们购买
  1889. public function changeCertStatus(Request $request, $id)
  1890. {
  1891. $status = $request->input('status');
  1892. Site::query()->where(['id' => $id])->update(['cert_us_buy' => $status]);
  1893. return response()->json(['message' => '操作成功']);
  1894. }
  1895. //项目概况下的 是否案例
  1896. public function changeCaseStatus(Request $request, $id)
  1897. {
  1898. $status = $request->input('status');
  1899. Site::query()->where(['id' => $id])->update(['is_case' => $status]);
  1900. return response()->json(['message' => '操作成功']);
  1901. }
  1902. //项目概况下的 是否百千
  1903. public function changeBqStatus(Request $request, $id)
  1904. {
  1905. $status = $request->input('status');
  1906. Site::query()->where(['id' => $id])->update(['is_bq' => $status]);
  1907. return response()->json(['message' => '操作成功']);
  1908. }
  1909. //项目概况下的 软文是否暂停
  1910. public function articlePause(Request $request, $id)
  1911. {
  1912. $status = $request->input('status');
  1913. Site::query()->where(['id' => $id])->update(['article_pause' => $status]);
  1914. return response()->json(['message' => '操作成功']);
  1915. }
  1916. //社交授权 没啥用了 hootsuite代替
  1917. public function socialSave(SocialSaveRequest $request, $siteId)
  1918. {
  1919. $type = $request->input('type');
  1920. $validated = $request->validated()[$type];
  1921. switch ($type) {
  1922. case 'facebook':
  1923. Site::query()->where(['id' => $siteId])->update([
  1924. 'facebook_page' => $validated['facebook_page']
  1925. ]);
  1926. break;
  1927. case 'linkedIn':
  1928. case 'pin':
  1929. Social::query()->updateOrCreate(['site_id' => $siteId, 'type' => $type], $validated);
  1930. break;
  1931. }
  1932. return response()->json(['message' => '操作成功']);
  1933. }
  1934. //社交发布
  1935. public function socialPublish(SocialPublishRequest $request, $id)
  1936. {
  1937. $site = Site::query()->with(['server'])->select(['domain', 'id', 'server_id', 'database', 'webmaster_domain'])->where(['id' => $id])->first();
  1938. if (empty($site->database)) {
  1939. if ($request->ajax()) {
  1940. return response()->json(['message' => '站点数据库信息不存在'], 400);
  1941. } else {
  1942. return view('admin/site/tips', [
  1943. 'tips' => '站点数据库信息不存在',
  1944. 'siteId' => $id,
  1945. ]);
  1946. }
  1947. }
  1948. if (empty($site->server)) {
  1949. if ($request->ajax()) {
  1950. return response()->json(['message' => '站点服务器未分配'], 400);
  1951. } else {
  1952. return view('admin/site/tips', [
  1953. 'tips' => '站点服务器未分配',
  1954. 'siteId' => $id,
  1955. ]);
  1956. }
  1957. }
  1958. try {
  1959. $config = [
  1960. 'connection_name' => sprintf('connection_name_%s', $id),
  1961. 'host' => $site->server->server_ip,
  1962. 'port' => '3306',
  1963. 'database' => $site->database,
  1964. 'username' => $site->server->mysql_user_name,
  1965. 'password' => $site->server->mysql_passwd,
  1966. ];
  1967. config_connection($config);
  1968. $connection = DB::connection($config['connection_name']);
  1969. $publishedMaps = HootsuiteHistory::query()->where(['site_id' => $site->id])->pluck('remote_content_id')->toArray();
  1970. if (!$request->ajax()) {
  1971. $cacheKey = 'socialPublish_' . $site->id;
  1972. if (!Cache::has($cacheKey)) {
  1973. $start = 0;
  1974. $count = 100;
  1975. $list = [];
  1976. while (true) {
  1977. $orders = $connection->table('content')->where(['lang' => 'en', 'is_hidemenu' => 0])
  1978. ->selectRaw('id,parent_id,title,thumb,summary,subtitle,uri')
  1979. ->skip($start)->take($count)->get();
  1980. foreach ($orders as $order) {
  1981. $data = [
  1982. 'id' => $order->id,
  1983. 'parent_id' => $order->parent_id,
  1984. 'name' => $order->title,
  1985. 'thumb' => $order->thumb,
  1986. 'summary' => $order->summary,
  1987. 'subtitle' => $order->subtitle,
  1988. 'uri' => $order->uri,
  1989. ];
  1990. $list[] = $data;
  1991. }
  1992. if (count($orders) < $count) break;
  1993. $start += $count;
  1994. }
  1995. Cache::put($cacheKey, $list, 600);
  1996. }
  1997. $records = Cache::get($cacheKey);
  1998. foreach ($records as &$record) {
  1999. if (in_array($record['id'], $publishedMaps)) {
  2000. $record['name'] = '【已发布】' . $record['name'];
  2001. }
  2002. }
  2003. $trees = list_to_tree($records, 'id', 'parent_id', 'children');
  2004. $hootsuiteUser = HootsuiteUser::query()->where(['site_id' => $id])->first();
  2005. if (!$hootsuiteUser) {
  2006. return view('admin/site/tips', [
  2007. 'tips' => '站点hootsuite未指定',
  2008. 'siteId' => $id,
  2009. ]);
  2010. }
  2011. $label = DB::table('social_label')->where('site_id', $id)->pluck('label', 'id');
  2012. //账号切换
  2013. $number_list = HootsuiteUser::all()->where('site_id', $id);
  2014. $hootsuiteUser_count = HootsuiteUser::query()->where(['site_id' => $id])->count();
  2015. if($hootsuiteUser_count>'1'){
  2016. $hootsuiteUser_style = 'inline';
  2017. }else{
  2018. $hootsuiteUser_style = 'none';
  2019. }
  2020. return view('admin/site/social_publish', [
  2021. 'trees' => $trees,
  2022. 'siteId' => $id,
  2023. 'site' => $site,
  2024. 'socialProfiles' => $hootsuiteUser->social_profiles ?? [],
  2025. 'labelList' => $label ?? [],
  2026. 'number_list'=>$number_list,
  2027. 'hootsuiteUser_style'=>$hootsuiteUser_style,
  2028. ]);
  2029. }
  2030. //return $this->logic->socialPublish($request->validated(), $connection, $site);
  2031. return $this->logic->socialPublish($request->validated(), $connection, $site,$request->input('hootsuiteUser_id'));
  2032. } catch (\Throwable $exception) {
  2033. return view('admin/site/tips', [
  2034. 'tips' => '远端的数据库链接或配置有误! http://test.build.yinqingli.net/admin',
  2035. 'siteId' => $id,
  2036. ]);
  2037. }
  2038. }
  2039. public function AjaxSocialProfiles(Request $request)
  2040. {
  2041. $HootsuiteUserId = $request->input('HootsuiteUserId');
  2042. $hootsuiteUser = HootsuiteUser::query()->where(['id' => $HootsuiteUserId])->first();
  2043. //var_dump($hootsuiteUser->social_profiles);
  2044. $data = '';
  2045. if(!empty($hootsuiteUser->social_profiles)){
  2046. foreach ($hootsuiteUser->social_profiles as $value){
  2047. $data.="<option value=\"".$value['id']."\">".$value['type']."--".$value['socialNetworkUsername']."</option>";
  2048. }
  2049. }
  2050. if(empty($data)){
  2051. return response()->json(['message' => '操作失败','status'=>100]);
  2052. }else{
  2053. return response()->json(['message' => '操作成功','data'=>$data,'status'=>200]);
  2054. }
  2055. }
  2056. public function socialUpdate(Request $request, $siteId)
  2057. {
  2058. pre_dump($request);
  2059. pre_dump($siteId);
  2060. die;
  2061. }
  2062. //社交队列 后面被hootsutie 方式代替
  2063. public function socialQueue(Request $request, $siteId)
  2064. {
  2065. if (!$request->ajax()) {
  2066. // $client = new Client();
  2067. // $url = sprintf('%s/admin/hootsuite/social-list', config('app.wall_url'));
  2068. // try {
  2069. //
  2070. // $response = $client->request('GET', $url);
  2071. // $result = json_decode($response->getBody()->getContents(), true);
  2072. // $socialList = $result['data']??[];
  2073. // } catch (\GuzzleHttp\Exception\GuzzleException $exception) {
  2074. // $socialList = [];
  2075. // }
  2076. return view('admin/site/social_queue', [
  2077. 'siteId' => $siteId,
  2078. 'socialList' => $socialList ?? []
  2079. ]);
  2080. }
  2081. $records = SocialPublish::query()->where(['site_id' => $siteId])->orderBy('id', 'desc')->paginate($request->input('pageSize') ?? TABLE_PAGE_SIZE);
  2082. $items = $records->items();
  2083. array_walk($items, function ($item) {
  2084. $item->is_published = $item->social_sync_at ? '已发布' : '未发布';
  2085. $item->content = str_limit($item->content, 20);
  2086. $resultStatus = $item->result_status ?? [];
  2087. $item->published_result = sprintf(
  2088. 'pin:%s twitter:%s facebook:%s',
  2089. (SocialPublish::STATUS_TITLE[($resultStatus['pin'] ?? null)] ?? ''),
  2090. (SocialPublish::STATUS_TITLE[($resultStatus['twitter'] ?? null)] ?? ''),
  2091. (SocialPublish::STATUS_TITLE[($resultStatus['facebook'] ?? null)] ?? '')
  2092. );
  2093. });
  2094. return response()->json([
  2095. 'rows' => $items,
  2096. 'total' => $records->total()
  2097. ]);
  2098. }
  2099. public function socialMetastasis($siteId)
  2100. {
  2101. $list = SocialPublish::query()->where('site_id', $siteId)->get();
  2102. HootsuiteHistory::query()
  2103. ->where('site_id', $siteId)
  2104. ->delete();
  2105. $array = [];
  2106. foreach ($list as $key => $value) {
  2107. $data = [
  2108. 'site_id' => $value->site_id,
  2109. 'remote_content_id' => $value->remote_content_id,
  2110. 'content' => $value->content ?? '',
  2111. 'url' => $value->url ?? '',
  2112. 'media' => $value->media ?? '',
  2113. 'publish_at' => $value->publish_at,
  2114. 'created_at' => $value->created_at,
  2115. ];
  2116. $array[] = $data;
  2117. }
  2118. HootsuiteHistory::query()->insert($array);
  2119. return response()->json(['message' => '操作成功']);
  2120. }
  2121. //自定义
  2122. public function socialQueueSave(SocialQueueRequest $request, $socialQueueId)
  2123. {
  2124. $siteId = $request->input('siteId');
  2125. if (!$request->ajax()) {
  2126. $data = SocialPublish::query()->find($socialQueueId);
  2127. $label = DB::table('social_label')->where('site_id', $siteId)->pluck('label', 'id');
  2128. //$hootSuiteUser = HootsuiteUser::query()->where(['site_id' => $siteId])->first();
  2129. if(!empty($request->input('sid'))){
  2130. $hootSuiteUser = HootsuiteUser::query()->where(['id' => $request->input('sid')])->first();
  2131. }else{
  2132. $hootSuiteUser = HootsuiteUser::query()->where(['site_id' => $siteId])->first();
  2133. }
  2134. if (!$hootSuiteUser) {
  2135. return view('admin/site/tips', [
  2136. 'tips' => '站点hootsuite未指定',
  2137. 'siteId' => $siteId,
  2138. ]);
  2139. }
  2140. return view('admin/site/social_queue_save', [
  2141. 'data' => $data ?? null,
  2142. 'siteId' => $siteId,
  2143. 'boards' => $boardList ?? [],
  2144. 'boardsErr' => $boardsErr ?? null,
  2145. 'labelList' => $label ?? [],
  2146. 'socialProfiles' => $hootSuiteUser->social_profiles ?? [],
  2147. ]);
  2148. }
  2149. $validated = $request->validated();
  2150. $publishAt = date('Y-m-d H:i:s', strtotime('+' . $validated['release_interval'] . ' day', strtotime($validated['publish_at'])));
  2151. if (strtotime($publishAt) < (time() + 60 * 10)) {
  2152. return response()->json(['message' => '发布时间距离当前时间过近或小于当前时间'], 400);
  2153. }
  2154. $url = sprintf('%s/admin/hootsuite/schedule-message', config('app.wall_url'));
  2155. try {
  2156. $client = new Client();
  2157. $response = $client->request('POST', $url, [
  2158. 'form_params' => [
  2159. 'siteId' => $siteId,
  2160. 'socialIds' => $validated['social_ids'],
  2161. 'remoteImg' => $validated['media'],
  2162. 'content' => $validated['content'],
  2163. 'sendAt' => $validated['publish_at'],
  2164. ]
  2165. ]);
  2166. if ($response->getStatusCode() != 200) {
  2167. return response()->json(['message' => "发送失败"], 400);
  2168. }
  2169. $result = json_decode($response->getBody()->getContents(), true);
  2170. if (!empty($result['errors'])) {
  2171. return response()->json(['message' => ($result['errors'][0]['message'] ?? 'schedule error')], 400);
  2172. }
  2173. $updateData = [
  2174. 'site_id' => $siteId,
  2175. 'media' => $validated['media'],
  2176. 'url' => $validated['url'],
  2177. 'content' => $validated['content'],
  2178. 'result' => json_encode($result['data'] ?? []),
  2179. 'publish_at' => $validated['publish_at'],
  2180. 'created_at' => date('Y-m-d H:i:s'),
  2181. ];
  2182. SocialPublish::query()->insert($updateData);
  2183. $hootSuiteUser = HootsuiteUser::query()->where(['id' => $siteId])->first();
  2184. $socialProfiles = $hootSuiteUser->social_profiles ?? [];
  2185. $mapSocialProfiles = array_column($socialProfiles, null, 'id');
  2186. $tempSocialProfiles = [];
  2187. foreach ($mapSocialProfiles as $key => $item) {
  2188. if (in_array($key, $validated['social_ids'])) {
  2189. $tempSocialProfiles[] = $item;
  2190. }
  2191. }
  2192. $queues = [
  2193. 'site_id' => $siteId,
  2194. 'remote_content_id' => 0,
  2195. 'media' => $validated['media'],
  2196. 'url' => $validated['url'],
  2197. 'content' => $validated['content'],
  2198. 'created_at' => date('Y-m-d H:i:s'),
  2199. 'updated_at' => date('Y-m-d H:i:s'),
  2200. 'publish_at' => $validated['publish_at'],
  2201. 'social_ids' => json_encode($validated['social_ids'] ?? []),
  2202. 'social_profiles' => json_encode($tempSocialProfiles ?? []),
  2203. 'result' => json_encode($result['data'] ?? []),
  2204. ];
  2205. HootsuiteHistory::query()->insert($queues);
  2206. return response()->json(['message' => '操作成功']);
  2207. } catch (\GuzzleHttp\Exception\GuzzleException $exception) {
  2208. Log::error(var_export($exception->getMessage(), 1));
  2209. return response()->json(['message' => '发布失败'], 400);
  2210. }
  2211. }
  2212. public function socialQueueDel($socialQueueId)
  2213. {
  2214. SocialPublish::destroy($socialQueueId);
  2215. return response()->json(['message' => '操作成功']);
  2216. }
  2217. //项目管理详情下的 hootsuite记录
  2218. public function hootsuiteHistory(Request $request, $siteId)
  2219. {
  2220. if (!$request->ajax()) {
  2221. return view('admin/site/hootsuite_history', [
  2222. 'siteId' => $siteId,
  2223. 'socialList' => $socialList ?? []
  2224. ]);
  2225. }
  2226. $hUser = HootsuiteUser::query()->where(['site_id' => $siteId])->first();
  2227. $records = HootsuiteHistory::query()->where(['site_id' => $siteId])
  2228. ->orderBy('publish_at', 'desc')
  2229. ->paginate($request->input('pageSize') ?? TABLE_PAGE_SIZE);
  2230. $items = $records->items();
  2231. $socialProfiles = $hUser->social_profiles ?? [];
  2232. foreach ($items as $item) {
  2233. $item->publishStatus = '失败';
  2234. $item->content = str_limit($item->content, 30);
  2235. /**付饶修改新的**/
  2236. $new_hUser = HootsuiteUser::query()->where(['site_id' => $siteId])->select();
  2237. $new_hUser = HootsuiteUser::all()->where('site_id', $siteId);
  2238. $ids_new = $item->social_ids ?? [];
  2239. $type_name = '';
  2240. foreach ($new_hUser as $value){
  2241. foreach ($value->social_profiles as $val) {
  2242. if (in_array($val['id'], $ids_new)) {
  2243. $type_name .= $val['type'] . ' ';
  2244. }
  2245. }
  2246. }
  2247. $item->profileStr =$type_name;
  2248. /**付饶修改新的**/
  2249. // $ids = $item->social_ids ?? [];
  2250. // $profileStr = '';
  2251. // foreach ($socialProfiles as $val) {
  2252. // if (in_array($val['id'], $ids)) {
  2253. // $profileStr .= $val['type'] . ' ';
  2254. // }
  2255. // }
  2256. //$item->profileStr = $profileStr;
  2257. if (!empty($item->result)) {
  2258. $item->publishStatus = '成功';
  2259. }
  2260. }
  2261. return response()->json([
  2262. 'rows' => $items,
  2263. 'total' => $records->total()
  2264. ]);
  2265. }
  2266. public function siteListExport()
  2267. {
  2268. $siteList = Site::query()->whereIn('status', [1, 2, 3])->select('cn_title', 'old_id', 'domain', 'status')->get()->toJson();
  2269. $siteList = \GuzzleHttp\json_decode($siteList, true);
  2270. $top10ListMapCacheKey = 'top10ListMap_cache_key';
  2271. $top10ListMap = Cache::get($top10ListMapCacheKey);
  2272. $listReportMap_cache_key = 'listReportMap_cache_key';
  2273. $listReportMap = Cache::get($listReportMap_cache_key);
  2274. foreach ($siteList as $key => $value) {
  2275. $siteList[$key]['top10'] = '';
  2276. $siteList[$key]['traffic'] = '';
  2277. $siteList[$key]['inquire'] = '';
  2278. foreach ($top10ListMap as $kk => $vv) {
  2279. if (!empty($value['old_id'] && $value['old_id'] == $vv->project_id)) {
  2280. $siteList[$key]['top10'] = $vv->top10;
  2281. }
  2282. }
  2283. foreach ($listReportMap as $kk => $vv) {
  2284. if (!empty($value['old_id'] && $value['old_id'] == $vv->project_id)) {
  2285. $siteList[$key]['traffic'] = $vv->traffic;
  2286. }
  2287. if (!empty($value['old_id'] && $value['old_id'] == $vv->project_id)) {
  2288. $siteList[$key]['inquire'] = $vv->inquire;
  2289. }
  2290. }
  2291. if ($value['status'] == 1) {
  2292. $siteList[$key]['status'] = '建站期';
  2293. }
  2294. if ($value['status'] == 2) {
  2295. $siteList[$key]['status'] = '实施期';
  2296. }
  2297. if ($value['status'] == 3) {
  2298. $siteList[$key]['status'] = '服务期';
  2299. }
  2300. }
  2301. $dataList = [];
  2302. $dataList[] = ['项目名称', '网址', '项目状态', '月排名', '月流量', '询盘'];
  2303. foreach ($siteList as $key => $value) {
  2304. unset($value['old_id']);
  2305. $dataList[] = $value;
  2306. }
  2307. return (new BasicExport($dataList))->download(sprintf('项目流量统计%s.xls', date('YmdHis')));
  2308. }
  2309. public function socialTemplateImport(Request $request, $id)
  2310. {
  2311. set_time_limit(0);
  2312. if (!$request->input('excel_path')) {
  2313. return response()->json(['message' => '请先上传excel文件'], 422);
  2314. }
  2315. $site = Site::query()->where(['id' => $id])->first();
  2316. if (!$site) {
  2317. return response()->json(['message' => '站点信息不存在'], 400);
  2318. }
  2319. if (!$site->old_id) {
  2320. return response()->json(['message' => '请先与rank项目关联'], 400);
  2321. }
  2322. try {
  2323. Excel::import(new SocialImport($site->id), $request->input('excel_path'), 'public');
  2324. } catch (\Throwable $throwable) {
  2325. Log::error(var_export($throwable->getMessage(), 1));
  2326. return response()->json(['message' => '导入失败'], 400);
  2327. }
  2328. return response()->json(['message' => '操作成功']);
  2329. }
  2330. public function socialMessageListImport(Request $request)
  2331. {
  2332. set_time_limit(0);
  2333. if (!$request->input('excel_path')) {
  2334. return response()->json(['message' => '请先上传excel文件'], 422);
  2335. }
  2336. try {
  2337. Excel::import(new SocialMessageListImport(), $request->input('excel_path'), 'public');
  2338. return response()->json(['message' => '操作成功']);
  2339. } catch (\Throwable $throwable) {
  2340. return response()->json(['message' => $throwable->getMessage()], 400);
  2341. }
  2342. }
  2343. //单个项目测速
  2344. public function getSpeedMeasurementCacheResult($siteId)
  2345. {
  2346. try {
  2347. $site = Site::query()->where('id', $siteId)->first();
  2348. $pcResult = $this->apiResult(self::PC_SPEED_MEASUREMENT, $site->webmaster_domain);
  2349. $data['pc'] = '';
  2350. $result = $pcResult['lighthouseResult']['categories']['performance']['score'] ?? '';
  2351. if (!empty($result)) {
  2352. $data['pc'] = intval(round(floatval($result) * 100));
  2353. }
  2354. $data['mobile'] = '';
  2355. $mobileResult = $this->apiResult(self::MOBILE_SPEED_MEASUREMENT, $site->webmaster_domain);
  2356. $result1 = $mobileResult['lighthouseResult']['categories']['performance']['score'] ?? '';
  2357. if (!empty($result1)) {
  2358. $data['mobile'] = intval(round(floatval($result1) * 100));
  2359. }
  2360. $key = 'cache:app/Http/Controllers/SpeedMeasurementController/index:' . $site->old_id;
  2361. if (!empty($data['pc']) || !empty($data['mobile'])) {
  2362. DB::table('app_speed_measurement_cache')->where('key', $key)->delete();
  2363. DB::table('app_speed_measurement_cache')->insert(['cache' => \GuzzleHttp\json_encode($data), 'key' => $key]);
  2364. }
  2365. return response()->json(['code' => 200, 'message' => '操作成功']);
  2366. } catch (\Throwable $exception) {
  2367. return response()->json(['message' => $exception->getMessage()], 400);
  2368. }
  2369. }
  2370. public function apiResult($api, $url)
  2371. {
  2372. $client = new Client();
  2373. $response = $client->request('GET', $api . $url);
  2374. $response = json_decode($response->getBody()->getContents(), true);
  2375. return $response;
  2376. }
  2377. public function isComponent(Request $request, $siteId)
  2378. {
  2379. $type = $request->input('type') ?? 0;
  2380. Site::query()->where('id', $siteId)->update(['is_component' => $type]);
  2381. return response()->json(['message' => '操作成功']);
  2382. }
  2383. public function downloadSiteFile(Request $request)
  2384. {
  2385. $siteId = $request->input('siteId') ?? '';
  2386. $siteInfo = Site::query()->where('id', $siteId)->first();
  2387. if (empty($siteInfo->business_license_business_scope)) {
  2388. die('暂无文件');
  2389. }
  2390. $pathInfo = pathinfo($siteInfo->business_license_business_scope);
  2391. $dirnamePath = explode('storage', $pathInfo['dirname']);
  2392. return response()->download(realpath(base_path('public')) . '/storage' . $dirnamePath[1] . '/' . $pathInfo['basename'], $pathInfo['basename']);
  2393. }
  2394. }