* @since 2021-08-01 */ namespace App\Http\Controllers\Admin\Stencil; use App\Http\Controllers\Controller; use App\Http\Models\Site; use App\Http\Services\TemplateLibraryApiService; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Contracts\View\Factory; use Illuminate\View\View; use Illuminate\Http\JsonResponse; class IndexController extends Controller { private $templateLibraryApiService; /** * 模版库服务类 * IndexController constructor. * @param TemplateLibraryApiService $templateLibraryApiService */ public function __construct(TemplateLibraryApiService $templateLibraryApiService) { $this->templateLibraryApiService = $templateLibraryApiService; } /** * 页面管理 * @param $siteId * @return Factory|View */ public function index($siteId) { try { $site = DB::connection($this->templateLibraryApiService->connection($siteId))->table('content_template')->first(); $trees = list_to_tree($this->templateLibraryApiService->getWebSitePage($siteId), 'id', 'parent_id', 'children'); $templateList = DB::connection($this->templateLibraryApiService->connection($siteId))->table('content_template') ->where('level', 2) ->orderBy('rank', 'ASC') ->orderBy('id', 'ASC')->get() ?? []; return view('admin.stencil.index', [ 'trees' => $trees, 'siteId' => $siteId, 'templateList' => $templateList, 'site' => $site, ]); } catch (\Throwable $exception) { echo $exception->getMessage(); } } /** * 内容列表以及选中 * @param Request $request * @param $siteId * @return JsonResponse */ public function getResourceList(Request $request, $siteId) { $result = $request->all(); $connection = DB::connection($this->templateLibraryApiService->connection($siteId)); $contentModel = $connection->table('content'); if (!empty($result['content'])) { $contentModel = $contentModel->where('title', 'like', '%' . $result['content'] . '%'); } $list = $contentModel->where('is_enabled', 1)->paginate($request->input('pageSize') ?? 6); $defaultList = $connection->table('content_var')->where('content_id', $result['contentId'] ?? 0)->get() ?? []; $defaultResultList = []; foreach ($defaultList as $value) { $result = unserialize($value->value); foreach ($result as $vv) { $defaultResultList[] = $vv; } } foreach ($list as $value) { $value->default = 0; $value->sort = 0; foreach ($defaultResultList as $vv) { if ($value->id == $vv['id']) { $value->default = 1; $value->sort = 1; } } } return response()->json(['message' => '操作成功', 'list' => $list]); } /** * 添加页面管理顶级菜单 * @param Request $request * @param $siteId * @return JsonResponse */ public function addParentMenu(Request $request, $siteId) { $result = $request->all(); $connection = DB::connection($this->templateLibraryApiService->connection($siteId)); $list = $this->templateLibraryApiService->getIndexFieldList(0, $result['name'] ?? ''); $connection->table('content')->insert($list); return response()->json(['message' => '操作成功']); } /** * 复制模版库列表节点 * @param Request $request * @param $siteId * @return JsonResponse */ public function indexCopyNode(Request $request, $siteId) { $result = $request->all(); $connection = DB::connection($this->templateLibraryApiService->connection($siteId)); $array = \GuzzleHttp\json_decode($connection->table('content')->get()->toJson(), true) ?? []; $parentList = get_object_vars($connection->table('content')->where('id', $result['id'])->first()) ?? []; $childList = $this->getIndexList($array, $result['id']); $childList[] = $parentList; $list = $this->arraySort($childList, 'id'); $list = array_merge($list); $ids = []; foreach ($list as $key => $item) { if ($item['parent_id'] == 0 && $key == 0) { $update = $this->templateLibraryApiService->getFieldList2($item, $ids); } elseif ($item['parent_id'] != 0 && $key == 0) { $ids[$item['parent_id']] = $item['parent_id']; $update = $this->templateLibraryApiService->getFieldList2($item, $ids); } else { $update = $this->templateLibraryApiService->getFieldList2($item, $ids); } $id = $connection->table('content')->insertGetId($update); $ids[$item['id']] = $id; } return response()->json(['message' => '添加成功']); } /** * 递归父级目录 * @param $array * @param int $pid * @return array */ public function getIndexList($array, $pid = 0) { static $data = []; foreach ($array as $key => $item) { if ($item['parent_id'] == $pid) { $data[] = $this->templateLibraryApiService->getFieldList($item); unset($array[$key]); $this->getIndexList($array, $item['id']); } } return $data; } /** * 添加页面管理子菜单 * @param Request $request * @param $siteId * @return JsonResponse */ public function indexAddNode(Request $request, $siteId) { $result = $request->all(); $connection = DB::connection($this->templateLibraryApiService->connection($siteId)); $filed = $this->templateLibraryApiService->getIndexFieldList($result['pid'], $result['node']); $connection->table('content')->insert($filed); return response()->json(['message' => '操作成功']); } /** * 拖动子节点 * @param Request $request * @param $siteId * @return JsonResponse */ public function indexMoveNode(Request $request, $siteId) { $result = $request->all(); $connection = DB::connection($this->templateLibraryApiService->connection($siteId)); $parent = $connection->table('content')->where('id', $result['pid'])->first(); $child = $connection->table('content') ->select('id', 'title', 'rank') ->where('id', '=', $result['id']) ->first(); if ($result['type'] == 'next') { $contentList = $connection->table('content') ->select('id', 'title', 'rank') ->where('id', '!=', $result['id']) ->where('parent_id', $parent->parent_id) ->orderBy('rank', 'asc') ->get()->toArray(); $list = []; foreach ($contentList as $value) { if ($value->id == $result['pid']) { $list[] = $value; $list[] = $child; } else { $list[] = $value; } } $num = 0; foreach ($list as $item) { $connection->table('content') ->where('id', $item->id) ->update(['parent_id' => $parent->parent_id ?? 0, 'rank' => ++$num]); } } if ($result['type'] == 'prev') { $connection->table('content') ->where('id', $result['id']) ->update(['parent_id' => $parent->id ?? 0, 'rank' => 1]); } if ($result['type'] == 'inner') { $contentList = $connection->table('content') ->select('id', 'title', 'rank') ->where('id', '!=', $result['id']) ->where('parent_id', $parent->id) ->orderBy('rank', 'asc') ->get()->toArray(); if (!empty($contentList)) { $contentList[] = $child; $num = 0; foreach ($contentList as $item) { $connection->table('content') ->where('id', $item->id) ->update(['parent_id' => $parent->id ?? 0, 'rank' => ++$num]); } } else { $connection->table('content') ->where('id', $result['id']) ->update(['parent_id' => $parent->id ?? 0, 'rank' => 1]); } } return response()->json(['message' => '操作成功']); } /** * 删除页面管理子菜单 * @param Request $request * @param $siteId * @return JsonResponse */ public function indexDelNode(Request $request, $siteId) { $result = $request->all(); if (empty($result['id']) || $result['id'] == 1) { return response()->json(['message' => '操作失败'], 400); } $connection = DB::connection($this->templateLibraryApiService->connection($siteId)); $contentInfo = $connection->table('content')->where('id', $result['id'])->first(); if (!empty($contentInfo)) { if ($contentInfo->status == 2 && $result['type'] == 2) { $result['type'] = 99;//如果已经被删掉了,再次删除就隐藏 } $array[] = $contentInfo; $array = $this->templateLibraryApiService->recursion($array, $siteId); $ids = array_column($array, 'id'); $connection->table('content') ->whereIn('id', $ids) ->update(['status' => $result['type']]); } return response()->json(['message' => '操作成功']); } /** * 图片上传页面 * @param Request $request * @param $siteId * @param $type * @return Factory|JsonResponse|View */ public function images(Request $request, $siteId, $type) { if (!$request->ajax()) { return view('admin.stencil.image', [ 'siteId' => $siteId, 'type' => $type ]); } $result = $request->all(); $connection = DB::connection($this->templateLibraryApiService->connection($siteId))->table('image'); if (!empty($result['title'])) { $connection->where('name', 'like', '%' . $result['title'] . '%'); } $items = $connection->orderByDesc('id')->paginate(12); return response()->json([ 'rows' => $items->items(), 'total' => $items->total(), ]); } /** * 批量上传图片 * @param Request $request * @param $siteId * @return JsonResponse */ public function uploadImages(Request $request, $siteId) { $images = []; if ($request->hasFile('files')) { foreach ($request->file('files') as $file) { [$name, $alt] = $this->fileRename($file); $fileData['file_url'] = $file->storeAs($siteId, $name, 'download'); $fileData['file_url'] = asset('download/' . $fileData['file_url']); $fileData['original_name'] = $name; $fileData['time'] = time(); $images[] = [ 'ref' =>'', 'sign' => md5($fileData['file_url']), 'name' => $alt, 'src' => $fileData['file_url'], 'size' => $file->getSize(),//bytes 'format' => '', 'site_id' => $siteId, 'create_time' => time(), ]; } } DB::connection($this->templateLibraryApiService->connection($siteId))->table('image')->insert($images); return response()->json(['message' => '上传成功', 'data' => $images]); } /** * 保存页面信息 * @param Request $request * @param $siteId * @return JsonResponse */ public function indexSave(Request $request, $siteId) { $request = $request->all(); $connection = DB::connection($this->templateLibraryApiService->connection($siteId)); if (empty($request['title'])) { return response()->json(['message' => '请填写标题'], 400); } if (empty($request['tpl_id'])) { return response()->json(['message' => '请选择模版'], 400); } if (!empty($request['new_pid']) && empty($request['index_id'])) { $filed = $this->templateLibraryApiService->getIndexFieldList($request['new_pid'], $request['title']); $insertGetId = $connection->table('content')->insertGetId($filed); $request['index_id'] = $insertGetId; $request['parent_id'] = $request['new_pid']; } if (empty($request['index_id'])) { return response()->json(['message' => '请选择页面'], 400); } $publishTime = time(); if (!empty($request['publish_time'])) { $publishTime = strtotime($request['publish_time']); } $expiredTime = time(); if (!empty($request['expired_time'])) { $expiredTime = strtotime($request['expired_time']); } $alias = strtolower(str_replace(' ', '-', $request['title'])) ?? ''; $template = $connection->table('content_template') ->where('id', $request['tpl_id']) ->value('name'); if ($template == 'basic' || $template == 'product_faq') { $request['deny_spider'] = 1; $request['is_hidemenu'] = 1; $request['is_enabled'] = 1; } //没有绑定绑定uri就自动生成uri if (empty($request['is_freeze_url'])) { $urlLevel = $connection->table('content_template') ->where('id', $request['tpl_id']) ->value('url_level') ?? 0; $parentId = $connection->table('content') ->where('id', $request['index_id']) ->value('parent_id') ?? 0; if (empty($urlLevel)) { $uri = $alias; if ($template == 'basic') { $uri = $request['index_id'] . '-' . $alias; } } elseif ($parentId == 0) { $uri = $alias; if ($template == 'basic') { $uri = $request['index_id'] . '-' . $alias; } } else { $uri = $this->getUriLevel($siteId, $parentId); $uri = array_reverse($uri); $uri = array_splice($uri, 0, $urlLevel - 1); if ($template == 'basic') { $uri = implode('/', $uri) . '/' . $request['index_id'] . '-' . $alias; } else { $uri = implode('/', $uri) . '/' . $alias; } } } else { //绑定的以手写的为主 $uri = $request['uri'] ?? ''; } //查询生成的uri是否是重复的 $uriResult = $connection->table('content') ->where('status', 1) ->where('id', '!=', $request['index_id']) ->where('uri', $uri) ->first(); if (!empty($uriResult)) { if (!empty($insertGetId)) { $connection->table('content')->where('id', $insertGetId)->delete(); } return response()->json(['message' => 'uri重复'], 400); } $data = [ 'parent_id' => $request['parent_id'] ?? 0, //父级id 'tpl_id' => $request['tpl_id'] ?? 0, //模版id 'title' => $request['title'] ?? '', //标题 'subtitle' => $request['subtitle'] ?? '', //副标题 'summary' => $request['summary'] ?? '', //内容摘要 'thumb' => $request['thumb'] ?? '', //缩略图 'content' => $request['content'] ?? '', //内容 'menu_text' => $request['menu_text'] ?? '', //导航标题 'alias' => $request['index_id'] . '-' . $alias, //URL别名 'uri' => $uri, 'seo_title' => $request['seo_title'] ?? '{$title} - {$setting.sitename}', 'seo_keywords' => $request['seo_keywords'] ?? '', 'seo_description' => $request['seo_description'] ?? '{$summary}', 'path_ids' => $request['path_ids'] ?? '', 'lang' => $request['lang'] ?? '', 'rank' => $request['rank'] ?? 0, 'level' => $request['level'] ?? 0, 'redirect' => $request['redirect'] ?? '', 'content_type' => $request['content_type'] ?? 'html', 'childs_num' => $request['childs_num'] ?? 0, 'views_num' => $request['views_num'] ?? 0, 'is_enabled' => $request['is_enabled'] ?? 0, 'is_hidemenu' => $request['is_hidemenu'] ?? 0, 'is_translated' => $request['is_translated'] ?? 0, 'is_freeze_url' => $request['is_freeze_url'] ?? 0, 'is_301' => $request['is_301'] ?? 0, 'deny_spider' => $request['deny_spider'] ?? 0, 'trans_src_id' => $request['trans_src_id'] ?? 0, 'create_time' => time(), 'update_time' => time(), 'publish_time' => $publishTime, 'expired_time' => $expiredTime, 'tmp_xcode' => $request['tmp_xcode'] ?? '', 'css_id' => $request['css_id'] ?? '', ]; $connection->table('content')->where('id', $request['index_id'])->update($data); $templateVarList = $connection->table('content_template_var')->get(); $variable = []; foreach ($templateVarList as $item) { $variable[] = [ 'type' => $item->input_type, 'key' => $item->name, 'value' => $request[$item->name] ?? '', 'content_id' => $request['index_id'], 'lang' => 'en', 'allow_translate' => 0, ]; } foreach ($variable as $key => $item) { if ($item['type'] == 'resource' || $item['type'] == 'checkbox' || $item['type'] == 'file' || $item['type'] == 'image') { $variable[$key]['value'] = serialize($item['value'] ?? ''); } } //事务 DB::transaction(function () use ($connection, $variable, $request) { $connection->table('content_var')->where('content_id', $request['index_id'])->delete(); $connection->table('content_var')->insert($variable); }); return response()->json(['message' => '保存成功']); } /** * 添加内容 * @param Request $request * @param $siteId * @param $type * @return Factory|JsonResponse|View */ public function resources(Request $request, $siteId, $type) { $connection = DB::connection($this->templateLibraryApiService->connection($siteId)); if (!$request->ajax()) { $templateList = $connection->table('content_template') ->where('level', 2) ->pluck('name', 'id') ?? []; return view('admin.stencil.resources', [ 'templateList' => $templateList, 'siteId' => $siteId, 'type' => $type ]); } $resources = $connection->table('content'); $title = $request->input('title'); if (!empty($title)) { $resources = $resources->where('title', 'like', '%' . $title . '%'); } $ref = $request->input('ref'); if ($ref == 'now') { $resources = $resources->where('tpl_id', 193); } $tplId = $request->input('tplId'); if (!empty($tplId)) { $resources = $resources->where('tpl_id', $tplId); } $resources = $resources->whereIn('status', [1, 2])->orderByDesc('id')->paginate(12); return response()->json([ 'rows' => $resources->items(), 'total' => $resources->total(), ]); } /** * 批量上传保留上传文件名 * @param Request $request * @return JsonResponse */ public function bulkUpload(Request $request) { $files = []; $siteId = $request->input('siteId') ?? 0; if ($request->hasFile('files')) { foreach ($request->file('files') as $file) { [$name, $alt] = $this->fileRename($file); $fileUrl = $file->storeAs($siteId, $name, 'download'); $fileData['file_url'] = asset('download/' . $fileUrl); $fileData['file_size'] = $file->getSize(); $fileData['original_name'] = $file->getClientOriginalName(); $fileData['time'] = date('Y-m-d H:i:s'); $files[] = $fileData; } } return response()->json(['message' => '上传成功', 'data' => $files]); } /** * 文件重命名 * @param $file object * @return array */ protected function fileRename($file) { $name = strtolower(str_replace(' ', '-', $file->getClientOriginalName())); $array = explode('.', $name); $alt = str_replace('-', ' ', $array[0] ?? ''); $rename = $array[0] . '-' . rand(1000000, 9999999) . '.' . $array[1]; return [$rename, $alt]; } /** * 富文本多图上传接口 * @param Request $request * @param $siteId * @return JsonResponse */ public function editorUpload(Request $request, $siteId) { $imageFileList = []; $file = $request->file('editorFile'); if ($file) { $imageFileList[] = $file; } $editorFile1 = $request->file('editorFile1'); if ($editorFile1) { $imageFileList[] = $editorFile1; } $editorFile2 = $request->file('editorFile2'); if ($editorFile2) { $imageFileList[] = $editorFile2; } $editorFile3 = $request->file('editorFile3'); if ($editorFile3) { $imageFileList[] = $editorFile3; } $editorFile4 = $request->file('editorFile4'); if ($editorFile4) { $imageFileList[] = $editorFile4; } $editorFile5 = $request->file('editorFile5'); if ($editorFile5) { $imageFileList[] = $editorFile5; } $data = []; foreach ($imageFileList as $item) { [$name, $alt] = $this->fileRename($item); $fileUrl = $item->storeAs($siteId, $name, 'download'); $data[] = [ 'url' => asset('download/' . $fileUrl), 'alt' => $alt, 'href' => asset('download/' . $fileUrl), ]; } $result = [ 'errno' => 0, 'data' => $data ]; return response()->json($result); } /** * 获取模版下面的css列表 * @param Request $request * @return JsonResponse */ public function getCssList(Request $request) { $request = $request->all(); $cssList = DB::connection($this->templateLibraryApiService->connection($request['siteId'])) ->table('content_template') ->select('name', 'id') ->where('level', 3)//css ->where('parent_id', $request['tpl_id']) ->get() ?? []; return response()->json(['data' => $cssList]); } /** *根据模版ip 获取关联变量列表 * @param Request $request * @return JsonResponse */ public function getTemplateVariableByTplId(Request $request) { $request = $request->all(); $connection = DB::connection($this->templateLibraryApiService->connection($request['siteId'])); $variableIds = $connection ->table('content_template_relate') ->where('tid', $request['tpl_id']) ->pluck('vid'); $variableList = $connection ->table('content_template_var') ->whereIn('id', $variableIds) ->get() ?? []; $variable = []; if (!empty($request['content_id'])) { $variable = $connection->table('content_var') ->where('content_id', $request['content_id']) ->pluck('value', 'key') ?? []; } foreach ($variableList as $item) { $item->input_opts = explode("\r\n", $item->input_opts) ?? []; $item->value = $item->input_value ?? ''; if ($item->input_type == 'checkbox' || $item->input_type == 'resource' || $item->input_type == 'file' || $item->input_type == 'image') { $item->value = []; } if ($item->input_type == 'date') { $item->value = date('Y-m-d'); } if (count($variable) > 0) { $item->value = $variable[$item->name] ?? ''; if ($item->input_type == 'checkbox' || $item->input_type == 'resource' || $item->input_type == 'file' || $item->input_type == 'image') { $item->value = unserialize($item->value) ?? ''; } if ($item->input_type == 'date') { $item->value = date('Y-m-d', strtotime($item->value)); } } } return response()->json(['data' => $variableList]); } /** * 递归uri层级 * @param $siteId * @param $parentId * @return array */ public function getUriLevel($siteId, $parentId) { static $array = []; $connection = DB::connection($this->templateLibraryApiService->connection($siteId)); $indexInfo = $connection->table('content')->where('id', $parentId)->first(); if (!empty($indexInfo)) { $array[] = strtolower(str_replace(' ', '-', $indexInfo->title)) ?? ''; $this->getUriLevel($siteId, $indexInfo->parent_id); } return $array; } public function ftp() { try { $siteId = 360; $connection = DB::connection($this->templateLibraryApiService->connection($siteId)); //同步所有页面的内容正文富文本图片 $imagesList = $connection->table('content')->get(); $images = []; foreach ($imagesList as $item) { preg_match_all('//is', $item->content, $matches);//图片的url if (!empty($matches[2])) { foreach ($matches[2] as $match) { $images[] = urldecode($match); } } } $imagesPathList = []; if (!empty($images)) { foreach ($images as $image) { $imagePathArray = explode('storage', $image); if (!empty($imagePathArray[1])) { $imagesPathList[] = $imagePathArray[1]; } } $imagesPathList = array_unique($imagesPathList); } pre_dump($imagesPathList); //同步图片图里面的所有图片 $images2 = []; $imagesList = $connection->table('image')->get(); foreach ($imagesList as $item) { $imagePathArray = explode('storage', $item->src); if (!empty($imagePathArray)) { $images2[] = $imagePathArray[1]; } } $images2 = array_unique($images2); pre_dump($images2); //同步所有页面上面的file变量文件 $file = []; $imagesList = $connection->table('content_var') ->where('type', 'file')->get(); foreach ($imagesList as $item) { $fileList = unserialize($item->value); if (is_array($fileList)) { foreach ($fileList as $value) { $imagePathArray = explode('storage', $value['file']); if (!empty($imagePathArray[1])) { $file[] = $imagePathArray[1]; } } } } $file = array_unique($file); pre_dump($file); //同步所有页面上面的file变量文件 $richText = []; $imagesList = $connection->table('content_var') ->where('type', 'richtext')->get(); foreach ($imagesList as $item) { preg_match_all('//is', $item->value, $matches);//图片的url if (!empty($matches[2])) { foreach ($matches[2] as $match) { $richText[] = urldecode($match); } } } $richTextImages = []; if (!empty($richText)) { foreach ($richText as $image) { $imagePathArray = explode('storage', $image); if (!empty($imagePathArray[1])) { $imagesPathList[] = $imagePathArray[1]; } } $richTextImages = array_unique($imagesPathList); } pre_dump($richTextImages); $result = array_merge($imagesPathList, $images2, $file, $richTextImages); $result = array_unique($result); pre_dump($result); $ssh_host = '121.199.40.85'; $ssh2 = ssh2_connect($ssh_host, 22); $user = 'root'; $password = 'JGJHD84@8&a'; ssh2_auth_password($ssh2, $user, $password); $domain = Site::query() ->where('id', $siteId) ->value('domain'); //远程目录 $targetDirectory = '/www/wwwroot/' . $domain . '/sepSsr/uploads'; //递归创建目录 $sftp = ssh2_sftp($ssh2); ssh2_sftp_mkdir($sftp, $targetDirectory, 0755, true); foreach ($result as $item) { $fileName = explode('/', $item); $file = array_pop($fileName); //本地目录 $sourceDirectory = base_path() . '/storage/app/public' . $item; $stream = ssh2_scp_send($ssh2, $sourceDirectory, $targetDirectory . '/' . $file, 0644); pre_dump($stream); } } catch (\Exception $exception) { echo $exception->getMessage(); } } /*public function automatedDeployment() { $db_config = [ 'connection_name' => 'new_db', 'host' => $site->server->server_ip, 'port' => '3306', 'database' => 'sdb_sucocms', 'username' => $site->server->mysql_user_name, 'password' => $site->server->mysql_passwd ]; $new_db = config_connection($db_config); DB::connection($new_db)->statement('create database ' . $dbName); Ssh::exec("mysqldump sdb_sucocms -u root -p" . $site->server->mysql_passwd . " --add-drop-table | mysql " . $dbName . " -u root -p" . $site->server->mysql_passwd); }*/ }