IndexController.php 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873
  1. <?php
  2. /**
  3. * 页面管理
  4. * @copyright 2021-浙江引擎力营销策划有限公司
  5. * @author Lc<sunshinecc1@163.com>
  6. * @since 2021-08-01
  7. */
  8. namespace App\Http\Controllers\Admin\Stencil;
  9. use App\Http\Controllers\Controller;
  10. use App\Http\Models\Site;
  11. use App\Http\Services\TemplateLibraryApiService;
  12. use Illuminate\Http\Request;
  13. use Illuminate\Support\Facades\DB;
  14. use Illuminate\Contracts\View\Factory;
  15. use Illuminate\View\View;
  16. use Illuminate\Http\JsonResponse;
  17. class IndexController extends Controller
  18. {
  19. private $templateLibraryApiService;
  20. /**
  21. * 模版库服务类
  22. * IndexController constructor.
  23. * @param TemplateLibraryApiService $templateLibraryApiService
  24. */
  25. public function __construct(TemplateLibraryApiService $templateLibraryApiService)
  26. {
  27. $this->templateLibraryApiService = $templateLibraryApiService;
  28. }
  29. /**
  30. * 页面管理
  31. * @param $siteId
  32. * @return Factory|View
  33. */
  34. public function index($siteId)
  35. {
  36. try {
  37. $site = DB::connection($this->templateLibraryApiService->connection($siteId))->table('content_template')->first();
  38. $trees = list_to_tree($this->templateLibraryApiService->getWebSitePage($siteId), 'id', 'parent_id', 'children');
  39. $templateList = DB::connection($this->templateLibraryApiService->connection($siteId))->table('content_template')
  40. ->where('level', 2)
  41. ->orderBy('rank', 'ASC')
  42. ->orderBy('id', 'ASC')->get() ?? [];
  43. return view('admin.stencil.index', [
  44. 'trees' => $trees,
  45. 'siteId' => $siteId,
  46. 'templateList' => $templateList,
  47. 'site' => $site,
  48. ]);
  49. } catch (\Throwable $exception) {
  50. echo $exception->getMessage();
  51. }
  52. }
  53. /**
  54. * 内容列表以及选中
  55. * @param Request $request
  56. * @param $siteId
  57. * @return JsonResponse
  58. */
  59. public function getResourceList(Request $request, $siteId)
  60. {
  61. $result = $request->all();
  62. $connection = DB::connection($this->templateLibraryApiService->connection($siteId));
  63. $contentModel = $connection->table('content');
  64. if (!empty($result['content'])) {
  65. $contentModel = $contentModel->where('title', 'like', '%' . $result['content'] . '%');
  66. }
  67. $list = $contentModel->where('is_enabled', 1)->paginate($request->input('pageSize') ?? 6);
  68. $defaultList = $connection->table('content_var')->where('content_id', $result['contentId'] ?? 0)->get() ?? [];
  69. $defaultResultList = [];
  70. foreach ($defaultList as $value) {
  71. $result = unserialize($value->value);
  72. foreach ($result as $vv) {
  73. $defaultResultList[] = $vv;
  74. }
  75. }
  76. foreach ($list as $value) {
  77. $value->default = 0;
  78. $value->sort = 0;
  79. foreach ($defaultResultList as $vv) {
  80. if ($value->id == $vv['id']) {
  81. $value->default = 1;
  82. $value->sort = 1;
  83. }
  84. }
  85. }
  86. return response()->json(['message' => '操作成功', 'list' => $list]);
  87. }
  88. /**
  89. * 添加页面管理顶级菜单
  90. * @param Request $request
  91. * @param $siteId
  92. * @return JsonResponse
  93. */
  94. public function addParentMenu(Request $request, $siteId)
  95. {
  96. $result = $request->all();
  97. $connection = DB::connection($this->templateLibraryApiService->connection($siteId));
  98. $list = $this->templateLibraryApiService->getIndexFieldList(0, $result['name'] ?? '');
  99. $connection->table('content')->insert($list);
  100. return response()->json(['message' => '操作成功']);
  101. }
  102. /**
  103. * 复制模版库列表节点
  104. * @param Request $request
  105. * @param $siteId
  106. * @return JsonResponse
  107. */
  108. public function indexCopyNode(Request $request, $siteId)
  109. {
  110. $result = $request->all();
  111. $connection = DB::connection($this->templateLibraryApiService->connection($siteId));
  112. $array = \GuzzleHttp\json_decode($connection->table('content')->get()->toJson(), true) ?? [];
  113. $parentList = get_object_vars($connection->table('content')->where('id', $result['id'])->first()) ?? [];
  114. $childList = $this->getIndexList($array, $result['id']);
  115. $childList[] = $parentList;
  116. $list = $this->arraySort($childList, 'id');
  117. $list = array_merge($list);
  118. $ids = [];
  119. foreach ($list as $key => $item) {
  120. if ($item['parent_id'] == 0 && $key == 0) {
  121. $update = $this->templateLibraryApiService->getFieldList2($item, $ids);
  122. } elseif ($item['parent_id'] != 0 && $key == 0) {
  123. $ids[$item['parent_id']] = $item['parent_id'];
  124. $update = $this->templateLibraryApiService->getFieldList2($item, $ids);
  125. } else {
  126. $update = $this->templateLibraryApiService->getFieldList2($item, $ids);
  127. }
  128. $id = $connection->table('content')->insertGetId($update);
  129. $ids[$item['id']] = $id;
  130. }
  131. return response()->json(['message' => '添加成功']);
  132. }
  133. /**
  134. * 递归父级目录
  135. * @param $array
  136. * @param int $pid
  137. * @return array
  138. */
  139. public function getIndexList($array, $pid = 0)
  140. {
  141. static $data = [];
  142. foreach ($array as $key => $item) {
  143. if ($item['parent_id'] == $pid) {
  144. $data[] = $this->templateLibraryApiService->getFieldList($item);
  145. unset($array[$key]);
  146. $this->getIndexList($array, $item['id']);
  147. }
  148. }
  149. return $data;
  150. }
  151. /**
  152. * 添加页面管理子菜单
  153. * @param Request $request
  154. * @param $siteId
  155. * @return JsonResponse
  156. */
  157. public function indexAddNode(Request $request, $siteId)
  158. {
  159. $result = $request->all();
  160. $connection = DB::connection($this->templateLibraryApiService->connection($siteId));
  161. $filed = $this->templateLibraryApiService->getIndexFieldList($result['pid'], $result['node']);
  162. $connection->table('content')->insert($filed);
  163. return response()->json(['message' => '操作成功']);
  164. }
  165. /**
  166. * 拖动子节点
  167. * @param Request $request
  168. * @param $siteId
  169. * @return JsonResponse
  170. */
  171. public function indexMoveNode(Request $request, $siteId)
  172. {
  173. $result = $request->all();
  174. $connection = DB::connection($this->templateLibraryApiService->connection($siteId));
  175. $parent = $connection->table('content')->where('id', $result['pid'])->first();
  176. $child = $connection->table('content')
  177. ->select('id', 'title', 'rank')
  178. ->where('id', '=', $result['id'])
  179. ->first();
  180. if ($result['type'] == 'next') {
  181. $contentList = $connection->table('content')
  182. ->select('id', 'title', 'rank')
  183. ->where('id', '!=', $result['id'])
  184. ->where('parent_id', $parent->parent_id)
  185. ->orderBy('rank', 'asc')
  186. ->get()->toArray();
  187. $list = [];
  188. foreach ($contentList as $value) {
  189. if ($value->id == $result['pid']) {
  190. $list[] = $value;
  191. $list[] = $child;
  192. } else {
  193. $list[] = $value;
  194. }
  195. }
  196. $num = 0;
  197. foreach ($list as $item) {
  198. $connection->table('content')
  199. ->where('id', $item->id)
  200. ->update(['parent_id' => $parent->parent_id ?? 0, 'rank' => ++$num]);
  201. }
  202. }
  203. if ($result['type'] == 'prev') {
  204. $connection->table('content')
  205. ->where('id', $result['id'])
  206. ->update(['parent_id' => $parent->id ?? 0, 'rank' => 1]);
  207. }
  208. if ($result['type'] == 'inner') {
  209. $contentList = $connection->table('content')
  210. ->select('id', 'title', 'rank')
  211. ->where('id', '!=', $result['id'])
  212. ->where('parent_id', $parent->id)
  213. ->orderBy('rank', 'asc')
  214. ->get()->toArray();
  215. if (!empty($contentList)) {
  216. $contentList[] = $child;
  217. $num = 0;
  218. foreach ($contentList as $item) {
  219. $connection->table('content')
  220. ->where('id', $item->id)
  221. ->update(['parent_id' => $parent->id ?? 0, 'rank' => ++$num]);
  222. }
  223. } else {
  224. $connection->table('content')
  225. ->where('id', $result['id'])
  226. ->update(['parent_id' => $parent->id ?? 0, 'rank' => 1]);
  227. }
  228. }
  229. return response()->json(['message' => '操作成功']);
  230. }
  231. /**
  232. * 删除页面管理子菜单
  233. * @param Request $request
  234. * @param $siteId
  235. * @return JsonResponse
  236. */
  237. public function indexDelNode(Request $request, $siteId)
  238. {
  239. $result = $request->all();
  240. if (empty($result['id']) || $result['id'] == 1) {
  241. return response()->json(['message' => '操作失败'], 400);
  242. }
  243. $connection = DB::connection($this->templateLibraryApiService->connection($siteId));
  244. $contentInfo = $connection->table('content')->where('id', $result['id'])->first();
  245. if (!empty($contentInfo)) {
  246. if ($contentInfo->status == 2 && $result['type'] == 2) {
  247. $result['type'] = 99;//如果已经被删掉了,再次删除就隐藏
  248. }
  249. $array[] = $contentInfo;
  250. $array = $this->templateLibraryApiService->recursion($array, $siteId);
  251. $ids = array_column($array, 'id');
  252. $connection->table('content')
  253. ->whereIn('id', $ids)
  254. ->update(['status' => $result['type']]);
  255. }
  256. return response()->json(['message' => '操作成功']);
  257. }
  258. /**
  259. * 图片上传页面
  260. * @param Request $request
  261. * @param $siteId
  262. * @param $type
  263. * @return Factory|JsonResponse|View
  264. */
  265. public function images(Request $request, $siteId, $type)
  266. {
  267. if (!$request->ajax()) {
  268. return view('admin.stencil.image', [
  269. 'siteId' => $siteId,
  270. 'type' => $type
  271. ]);
  272. }
  273. $result = $request->all();
  274. $connection = DB::connection($this->templateLibraryApiService->connection($siteId))->table('image');
  275. if (!empty($result['title'])) {
  276. $connection->where('name', 'like', '%' . $result['title'] . '%');
  277. }
  278. $items = $connection->orderByDesc('id')->paginate(12);
  279. return response()->json([
  280. 'rows' => $items->items(),
  281. 'total' => $items->total(),
  282. ]);
  283. }
  284. /**
  285. * 批量上传图片
  286. * @param Request $request
  287. * @param $siteId
  288. * @return JsonResponse
  289. */
  290. public function uploadImages(Request $request, $siteId)
  291. {
  292. $images = [];
  293. if ($request->hasFile('files')) {
  294. foreach ($request->file('files') as $file) {
  295. [$name, $alt] = $this->fileRename($file);
  296. $fileData['file_url'] = $file->storeAs($siteId, $name, 'download');
  297. $fileData['file_url'] = asset('download/' . $fileData['file_url']);
  298. $fileData['original_name'] = $name;
  299. $fileData['time'] = time();
  300. $images[] = [
  301. 'ref' =>'',
  302. 'sign' => md5($fileData['file_url']),
  303. 'name' => $alt,
  304. 'src' => $fileData['file_url'],
  305. 'size' => $file->getSize(),//bytes
  306. 'format' => '',
  307. 'site_id' => $siteId,
  308. 'create_time' => time(),
  309. ];
  310. }
  311. }
  312. DB::connection($this->templateLibraryApiService->connection($siteId))->table('image')->insert($images);
  313. return response()->json(['message' => '上传成功', 'data' => $images]);
  314. }
  315. /**
  316. * 保存页面信息
  317. * @param Request $request
  318. * @param $siteId
  319. * @return JsonResponse
  320. */
  321. public function indexSave(Request $request, $siteId)
  322. {
  323. $request = $request->all();
  324. $connection = DB::connection($this->templateLibraryApiService->connection($siteId));
  325. if (empty($request['title'])) {
  326. return response()->json(['message' => '请填写标题'], 400);
  327. }
  328. if (empty($request['tpl_id'])) {
  329. return response()->json(['message' => '请选择模版'], 400);
  330. }
  331. if (!empty($request['new_pid']) && empty($request['index_id'])) {
  332. $filed = $this->templateLibraryApiService->getIndexFieldList($request['new_pid'], $request['title']);
  333. $insertGetId = $connection->table('content')->insertGetId($filed);
  334. $request['index_id'] = $insertGetId;
  335. $request['parent_id'] = $request['new_pid'];
  336. }
  337. if (empty($request['index_id'])) {
  338. return response()->json(['message' => '请选择页面'], 400);
  339. }
  340. $publishTime = time();
  341. if (!empty($request['publish_time'])) {
  342. $publishTime = strtotime($request['publish_time']);
  343. }
  344. $expiredTime = time();
  345. if (!empty($request['expired_time'])) {
  346. $expiredTime = strtotime($request['expired_time']);
  347. }
  348. $alias = strtolower(str_replace(' ', '-', $request['title'])) ?? '';
  349. $template = $connection->table('content_template')
  350. ->where('id', $request['tpl_id'])
  351. ->value('name');
  352. if ($template == 'basic' || $template == 'product_faq') {
  353. $request['deny_spider'] = 1;
  354. $request['is_hidemenu'] = 1;
  355. $request['is_enabled'] = 1;
  356. }
  357. //没有绑定绑定uri就自动生成uri
  358. if (empty($request['is_freeze_url'])) {
  359. $urlLevel = $connection->table('content_template')
  360. ->where('id', $request['tpl_id'])
  361. ->value('url_level') ?? 0;
  362. $parentId = $connection->table('content')
  363. ->where('id', $request['index_id'])
  364. ->value('parent_id') ?? 0;
  365. if (empty($urlLevel)) {
  366. $uri = $alias;
  367. if ($template == 'basic') {
  368. $uri = $request['index_id'] . '-' . $alias;
  369. }
  370. } elseif ($parentId == 0) {
  371. $uri = $alias;
  372. if ($template == 'basic') {
  373. $uri = $request['index_id'] . '-' . $alias;
  374. }
  375. } else {
  376. $uri = $this->getUriLevel($siteId, $parentId);
  377. $uri = array_reverse($uri);
  378. $uri = array_splice($uri, 0, $urlLevel - 1);
  379. if ($template == 'basic') {
  380. $uri = implode('/', $uri) . '/' . $request['index_id'] . '-' . $alias;
  381. } else {
  382. $uri = implode('/', $uri) . '/' . $alias;
  383. }
  384. }
  385. } else {
  386. //绑定的以手写的为主
  387. $uri = $request['uri'] ?? '';
  388. }
  389. //查询生成的uri是否是重复的
  390. $uriResult = $connection->table('content')
  391. ->where('status', 1)
  392. ->where('id', '!=', $request['index_id'])
  393. ->where('uri', $uri)
  394. ->first();
  395. if (!empty($uriResult)) {
  396. if (!empty($insertGetId)) {
  397. $connection->table('content')->where('id', $insertGetId)->delete();
  398. }
  399. return response()->json(['message' => 'uri重复'], 400);
  400. }
  401. $data = [
  402. 'parent_id' => $request['parent_id'] ?? 0, //父级id
  403. 'tpl_id' => $request['tpl_id'] ?? 0, //模版id
  404. 'title' => $request['title'] ?? '', //标题
  405. 'subtitle' => $request['subtitle'] ?? '', //副标题
  406. 'summary' => $request['summary'] ?? '', //内容摘要
  407. 'thumb' => $request['thumb'] ?? '', //缩略图
  408. 'content' => $request['content'] ?? '', //内容
  409. 'menu_text' => $request['menu_text'] ?? '', //导航标题
  410. 'alias' => $request['index_id'] . '-' . $alias, //URL别名
  411. 'uri' => $uri,
  412. 'seo_title' => $request['seo_title'] ?? '{$title} - {$setting.sitename}',
  413. 'seo_keywords' => $request['seo_keywords'] ?? '',
  414. 'seo_description' => $request['seo_description'] ?? '{$summary}',
  415. 'path_ids' => $request['path_ids'] ?? '',
  416. 'lang' => $request['lang'] ?? '',
  417. 'rank' => $request['rank'] ?? 0,
  418. 'level' => $request['level'] ?? 0,
  419. 'redirect' => $request['redirect'] ?? '',
  420. 'content_type' => $request['content_type'] ?? 'html',
  421. 'childs_num' => $request['childs_num'] ?? 0,
  422. 'views_num' => $request['views_num'] ?? 0,
  423. 'is_enabled' => $request['is_enabled'] ?? 0,
  424. 'is_hidemenu' => $request['is_hidemenu'] ?? 0,
  425. 'is_translated' => $request['is_translated'] ?? 0,
  426. 'is_freeze_url' => $request['is_freeze_url'] ?? 0,
  427. 'is_301' => $request['is_301'] ?? 0,
  428. 'deny_spider' => $request['deny_spider'] ?? 0,
  429. 'trans_src_id' => $request['trans_src_id'] ?? 0,
  430. 'create_time' => time(),
  431. 'update_time' => time(),
  432. 'publish_time' => $publishTime,
  433. 'expired_time' => $expiredTime,
  434. 'tmp_xcode' => $request['tmp_xcode'] ?? '',
  435. 'css_id' => $request['css_id'] ?? '',
  436. ];
  437. $connection->table('content')->where('id', $request['index_id'])->update($data);
  438. $templateVarList = $connection->table('content_template_var')->get();
  439. $variable = [];
  440. foreach ($templateVarList as $item) {
  441. $variable[] = [
  442. 'type' => $item->input_type,
  443. 'key' => $item->name,
  444. 'value' => $request[$item->name] ?? '',
  445. 'content_id' => $request['index_id'],
  446. 'lang' => 'en',
  447. 'allow_translate' => 0,
  448. ];
  449. }
  450. foreach ($variable as $key => $item) {
  451. if ($item['type'] == 'resource' || $item['type'] == 'checkbox' || $item['type'] == 'file' || $item['type'] == 'image') {
  452. $variable[$key]['value'] = serialize($item['value'] ?? '');
  453. }
  454. }
  455. //事务
  456. DB::transaction(function () use ($connection, $variable, $request) {
  457. $connection->table('content_var')->where('content_id', $request['index_id'])->delete();
  458. $connection->table('content_var')->insert($variable);
  459. });
  460. return response()->json(['message' => '保存成功']);
  461. }
  462. /**
  463. * 添加内容
  464. * @param Request $request
  465. * @param $siteId
  466. * @param $type
  467. * @return Factory|JsonResponse|View
  468. */
  469. public function resources(Request $request, $siteId, $type)
  470. {
  471. $connection = DB::connection($this->templateLibraryApiService->connection($siteId));
  472. if (!$request->ajax()) {
  473. $templateList = $connection->table('content_template')
  474. ->where('level', 2)
  475. ->pluck('name', 'id') ?? [];
  476. return view('admin.stencil.resources', [
  477. 'templateList' => $templateList,
  478. 'siteId' => $siteId,
  479. 'type' => $type
  480. ]);
  481. }
  482. $resources = $connection->table('content');
  483. $title = $request->input('title');
  484. if (!empty($title)) {
  485. $resources = $resources->where('title', 'like', '%' . $title . '%');
  486. }
  487. $ref = $request->input('ref');
  488. if ($ref == 'now') {
  489. $resources = $resources->where('tpl_id', 193);
  490. }
  491. $tplId = $request->input('tplId');
  492. if (!empty($tplId)) {
  493. $resources = $resources->where('tpl_id', $tplId);
  494. }
  495. $resources = $resources->whereIn('status', [1, 2])->orderByDesc('id')->paginate(12);
  496. return response()->json([
  497. 'rows' => $resources->items(),
  498. 'total' => $resources->total(),
  499. ]);
  500. }
  501. /**
  502. * 批量上传保留上传文件名
  503. * @param Request $request
  504. * @return JsonResponse
  505. */
  506. public function bulkUpload(Request $request)
  507. {
  508. $files = [];
  509. $siteId = $request->input('siteId') ?? 0;
  510. if ($request->hasFile('files')) {
  511. foreach ($request->file('files') as $file) {
  512. [$name, $alt] = $this->fileRename($file);
  513. $fileUrl = $file->storeAs($siteId, $name, 'download');
  514. $fileData['file_url'] = asset('download/' . $fileUrl);
  515. $fileData['file_size'] = $file->getSize();
  516. $fileData['original_name'] = $file->getClientOriginalName();
  517. $fileData['time'] = date('Y-m-d H:i:s');
  518. $files[] = $fileData;
  519. }
  520. }
  521. return response()->json(['message' => '上传成功', 'data' => $files]);
  522. }
  523. /**
  524. * 文件重命名
  525. * @param $file object
  526. * @return array
  527. */
  528. protected function fileRename($file)
  529. {
  530. $name = strtolower(str_replace(' ', '-', $file->getClientOriginalName()));
  531. $array = explode('.', $name);
  532. $alt = str_replace('-', ' ', $array[0] ?? '');
  533. $rename = $array[0] . '-' . rand(1000000, 9999999) . '.' . $array[1];
  534. return [$rename, $alt];
  535. }
  536. /**
  537. * 富文本多图上传接口
  538. * @param Request $request
  539. * @param $siteId
  540. * @return JsonResponse
  541. */
  542. public function editorUpload(Request $request, $siteId)
  543. {
  544. $imageFileList = [];
  545. $file = $request->file('editorFile');
  546. if ($file) {
  547. $imageFileList[] = $file;
  548. }
  549. $editorFile1 = $request->file('editorFile1');
  550. if ($editorFile1) {
  551. $imageFileList[] = $editorFile1;
  552. }
  553. $editorFile2 = $request->file('editorFile2');
  554. if ($editorFile2) {
  555. $imageFileList[] = $editorFile2;
  556. }
  557. $editorFile3 = $request->file('editorFile3');
  558. if ($editorFile3) {
  559. $imageFileList[] = $editorFile3;
  560. }
  561. $editorFile4 = $request->file('editorFile4');
  562. if ($editorFile4) {
  563. $imageFileList[] = $editorFile4;
  564. }
  565. $editorFile5 = $request->file('editorFile5');
  566. if ($editorFile5) {
  567. $imageFileList[] = $editorFile5;
  568. }
  569. $data = [];
  570. foreach ($imageFileList as $item) {
  571. [$name, $alt] = $this->fileRename($item);
  572. $fileUrl = $item->storeAs($siteId, $name, 'download');
  573. $data[] = [
  574. 'url' => asset('download/' . $fileUrl),
  575. 'alt' => $alt,
  576. 'href' => asset('download/' . $fileUrl),
  577. ];
  578. }
  579. $result = [
  580. 'errno' => 0,
  581. 'data' => $data
  582. ];
  583. return response()->json($result);
  584. }
  585. /**
  586. * 获取模版下面的css列表
  587. * @param Request $request
  588. * @return JsonResponse
  589. */
  590. public function getCssList(Request $request)
  591. {
  592. $request = $request->all();
  593. $cssList = DB::connection($this->templateLibraryApiService->connection($request['siteId']))
  594. ->table('content_template')
  595. ->select('name', 'id')
  596. ->where('level', 3)//css
  597. ->where('parent_id', $request['tpl_id'])
  598. ->get() ?? [];
  599. return response()->json(['data' => $cssList]);
  600. }
  601. /**
  602. *根据模版ip 获取关联变量列表
  603. * @param Request $request
  604. * @return JsonResponse
  605. */
  606. public function getTemplateVariableByTplId(Request $request)
  607. {
  608. $request = $request->all();
  609. $connection = DB::connection($this->templateLibraryApiService->connection($request['siteId']));
  610. $variableIds = $connection
  611. ->table('content_template_relate')
  612. ->where('tid', $request['tpl_id'])
  613. ->pluck('vid');
  614. $variableList = $connection
  615. ->table('content_template_var')
  616. ->whereIn('id', $variableIds)
  617. ->get() ?? [];
  618. $variable = [];
  619. if (!empty($request['content_id'])) {
  620. $variable = $connection->table('content_var')
  621. ->where('content_id', $request['content_id'])
  622. ->pluck('value', 'key') ?? [];
  623. }
  624. foreach ($variableList as $item) {
  625. $item->input_opts = explode("\r\n", $item->input_opts) ?? [];
  626. $item->value = $item->input_value ?? '';
  627. if ($item->input_type == 'checkbox' || $item->input_type == 'resource' || $item->input_type == 'file' || $item->input_type == 'image') {
  628. $item->value = [];
  629. }
  630. if ($item->input_type == 'date') {
  631. $item->value = date('Y-m-d');
  632. }
  633. if (count($variable) > 0) {
  634. $item->value = $variable[$item->name] ?? '';
  635. if ($item->input_type == 'checkbox' || $item->input_type == 'resource' || $item->input_type == 'file' || $item->input_type == 'image') {
  636. $item->value = unserialize($item->value) ?? '';
  637. }
  638. if ($item->input_type == 'date') {
  639. $item->value = date('Y-m-d', strtotime($item->value));
  640. }
  641. }
  642. }
  643. return response()->json(['data' => $variableList]);
  644. }
  645. /**
  646. * 递归uri层级
  647. * @param $siteId
  648. * @param $parentId
  649. * @return array
  650. */
  651. public function getUriLevel($siteId, $parentId)
  652. {
  653. static $array = [];
  654. $connection = DB::connection($this->templateLibraryApiService->connection($siteId));
  655. $indexInfo = $connection->table('content')->where('id', $parentId)->first();
  656. if (!empty($indexInfo)) {
  657. $array[] = strtolower(str_replace(' ', '-', $indexInfo->title)) ?? '';
  658. $this->getUriLevel($siteId, $indexInfo->parent_id);
  659. }
  660. return $array;
  661. }
  662. public function ftp()
  663. {
  664. try {
  665. $siteId = 360;
  666. $connection = DB::connection($this->templateLibraryApiService->connection($siteId));
  667. //同步所有页面的内容正文富文本图片
  668. $imagesList = $connection->table('content')->get();
  669. $images = [];
  670. foreach ($imagesList as $item) {
  671. preg_match_all('/<img(.*?)src=\"(.*?)\"(.*?)>/is', $item->content, $matches);//图片的url
  672. if (!empty($matches[2])) {
  673. foreach ($matches[2] as $match) {
  674. $images[] = urldecode($match);
  675. }
  676. }
  677. }
  678. $imagesPathList = [];
  679. if (!empty($images)) {
  680. foreach ($images as $image) {
  681. $imagePathArray = explode('storage', $image);
  682. if (!empty($imagePathArray[1])) {
  683. $imagesPathList[] = $imagePathArray[1];
  684. }
  685. }
  686. $imagesPathList = array_unique($imagesPathList);
  687. }
  688. pre_dump($imagesPathList);
  689. //同步图片图里面的所有图片
  690. $images2 = [];
  691. $imagesList = $connection->table('image')->get();
  692. foreach ($imagesList as $item) {
  693. $imagePathArray = explode('storage', $item->src);
  694. if (!empty($imagePathArray)) {
  695. $images2[] = $imagePathArray[1];
  696. }
  697. }
  698. $images2 = array_unique($images2);
  699. pre_dump($images2);
  700. //同步所有页面上面的file变量文件
  701. $file = [];
  702. $imagesList = $connection->table('content_var')
  703. ->where('type', 'file')->get();
  704. foreach ($imagesList as $item) {
  705. $fileList = unserialize($item->value);
  706. if (is_array($fileList)) {
  707. foreach ($fileList as $value) {
  708. $imagePathArray = explode('storage', $value['file']);
  709. if (!empty($imagePathArray[1])) {
  710. $file[] = $imagePathArray[1];
  711. }
  712. }
  713. }
  714. }
  715. $file = array_unique($file);
  716. pre_dump($file);
  717. //同步所有页面上面的file变量文件
  718. $richText = [];
  719. $imagesList = $connection->table('content_var')
  720. ->where('type', 'richtext')->get();
  721. foreach ($imagesList as $item) {
  722. preg_match_all('/<img(.*?)src=\"(.*?)\"(.*?)>/is', $item->value, $matches);//图片的url
  723. if (!empty($matches[2])) {
  724. foreach ($matches[2] as $match) {
  725. $richText[] = urldecode($match);
  726. }
  727. }
  728. }
  729. $richTextImages = [];
  730. if (!empty($richText)) {
  731. foreach ($richText as $image) {
  732. $imagePathArray = explode('storage', $image);
  733. if (!empty($imagePathArray[1])) {
  734. $imagesPathList[] = $imagePathArray[1];
  735. }
  736. }
  737. $richTextImages = array_unique($imagesPathList);
  738. }
  739. pre_dump($richTextImages);
  740. $result = array_merge($imagesPathList, $images2, $file, $richTextImages);
  741. $result = array_unique($result);
  742. pre_dump($result);
  743. $ssh_host = '121.199.40.85';
  744. $ssh2 = ssh2_connect($ssh_host, 22);
  745. $user = 'root';
  746. $password = 'JGJHD84@8&a';
  747. ssh2_auth_password($ssh2, $user, $password);
  748. $domain = Site::query()
  749. ->where('id', $siteId)
  750. ->value('domain');
  751. //远程目录
  752. $targetDirectory = '/www/wwwroot/' . $domain . '/sepSsr/uploads';
  753. //递归创建目录
  754. $sftp = ssh2_sftp($ssh2);
  755. ssh2_sftp_mkdir($sftp, $targetDirectory, 0755, true);
  756. foreach ($result as $item) {
  757. $fileName = explode('/', $item);
  758. $file = array_pop($fileName);
  759. //本地目录
  760. $sourceDirectory = base_path() . '/storage/app/public' . $item;
  761. $stream = ssh2_scp_send($ssh2, $sourceDirectory, $targetDirectory . '/' . $file, 0644);
  762. pre_dump($stream);
  763. }
  764. } catch (\Exception $exception) {
  765. echo $exception->getMessage();
  766. }
  767. }
  768. /*public function automatedDeployment()
  769. {
  770. $db_config = [
  771. 'connection_name' => 'new_db',
  772. 'host' => $site->server->server_ip,
  773. 'port' => '3306',
  774. 'database' => 'sdb_sucocms',
  775. 'username' => $site->server->mysql_user_name,
  776. 'password' => $site->server->mysql_passwd
  777. ];
  778. $new_db = config_connection($db_config);
  779. DB::connection($new_db)->statement('create database ' . $dbName);
  780. Ssh::exec("mysqldump sdb_sucocms -u root -p" . $site->server->mysql_passwd . " --add-drop-table | mysql " . $dbName . " -u root -p" . $site->server->mysql_passwd);
  781. }*/
  782. }