* @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);
}*/
}