* @since 2021-08-01 */ namespace App\Http\Controllers\Admin\Stencil; use App\Http\Controllers\Controller; use App\Http\Models\Site; use App\Http\Models\TemplateLibrary; use App\Http\Models\TemplateLibraryRelation; use App\Http\Models\TemplateLibraryVar; 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 TemplateLibraryController extends Controller { private $templateLibraryApiService; private $siteId; /** * 模版站服务类 * TplController constructor. * @param TemplateLibraryApiService $templateLibraryApiService */ public function __construct(TemplateLibraryApiService $templateLibraryApiService) { $this->templateLibraryApiService = $templateLibraryApiService; $this->siteId = 360; } /** * 模版库管理 * @return Factory|View */ public function templateLibrary() { $variable = []; $trees = TemplateLibrary::query()->with(['templateLibraryRelation']) ->orderBy('sort', 'asc') ->whereNull('deleted_at')->get()->toArray(); foreach ($trees as $key => $tree) { $trees[$key]['name'] = "{$tree['name']}#{$tree['id']}"; $trees[$key]['title'] = $tree['name']; $trees[$key]['images'] = json_decode($tree['images'], true); } $trees = list_to_tree($trees, 'id', 'pid', 'children'); return view('admin.stencil.template_library', [ 'trees' => $trees, 'variable' => $variable, 'siteList' => Site::query()->where('is_stencil', 1)->get(), 'templateLibraryVar' => TemplateLibraryVar::query()->whereNull('deleted_at')->get(), ]); } /** * 添加模版库列表节点 * @param Request $request * @return JsonResponse */ public function templateLibraryAddNode(Request $request) { $result = $request->all(); $update = [ 'name' => $result['node'] ?? '', 'pid' => $result['pid'] ?? 0, ]; TemplateLibrary::query()->insert($update); return response()->json(['message' => '添加成功']); } /** * 修改模版库列表节点 * @param Request $request * @return JsonResponse */ public function templateLibraryUpdateNode(Request $request) { $result = $request->all(); $update = [ 'name' => $result['node'] ?? '', 'pid' => $result['pid'] ?? 0, ]; TemplateLibrary::query()->where('id', $result['id'])->update($update); return response()->json(['message' => '添加成功']); } /** * 删除模版库列表节点 * @param Request $request * @return JsonResponse */ public function templateLibraryDelNode(Request $request) { $result = $request->all(); $update = [ 'deleted_at' => date('Y-m-d H:i:s'), ]; TemplateLibrary::query()->where('id', $result['id'])->update($update); return response()->json(['message' => '添加成功']); } /** * 复制模版库列表节点 * @param Request $request * @return JsonResponse */ public function templateLibraryCopyNode(Request $request) { $result = $request->all(); $array = TemplateLibrary::query() ->whereNull('deleted_at')->get()->toArray(); $parentList = TemplateLibrary::query()->where('id', $result['id']) ->whereNull('deleted_at')->first()->toArray(); $childList = $this->getTemplateLibraryList($array, $result['id']); $childList[] = $parentList; $list = $this->arraySort($childList, 'id'); $list = array_merge($list); $ids = []; foreach ($list as $key => $item) { if ($item['pid'] == 0 && $key == 0) { $update = [ 'name' => $item['name'], 'alias' => $item['alias'], 'memo' => $item['memo'], 'sort' => $item['sort'], 'pid' => 0, 'css' => $item['css'], 'images' => $item['images'], 'created_at' => date('Y-m-d H:i:s'), ]; } elseif ($item['pid'] != 0 && $key == 0) { $ids[$item['pid']] = $item['pid']; $update = [ 'name' => $item['name'], 'alias' => $item['alias'], 'memo' => $item['memo'], 'sort' => $item['sort'], 'pid' => $ids[$item['pid']] ?? 0, 'css' => $item['css'], 'images' => $item['images'], 'created_at' => date('Y-m-d H:i:s'), ]; } else { $update = [ 'name' => $item['name'], 'alias' => $item['alias'], 'memo' => $item['memo'], 'sort' => $item['sort'], 'pid' => $ids[$item['pid']], 'css' => $item['css'], 'images' => $item['images'], 'created_at' => date('Y-m-d H:i:s'), ]; } $id = TemplateLibrary::query()->insertGetId($update); $ids[$item['id']] = $id; } return response()->json(['message' => '添加成功']); } /** * 递归父级目录 * @param $array * @param int $pid * @return array */ public function getTemplateLibraryList($array, $pid = 0) { static $data = []; foreach ($array as $key => $item) { if ($item['pid'] == $pid) { $data[] = [ 'id' => $item['id'], 'name' => "{$item['name']}", 'alias' => $item['alias'] ?? '', 'memo' => $item['memo'] ?? '', 'sort' => $item['sort'] ?? 0, 'pid' => $item['pid'] ?? 0, 'css' => $item['css'] ?? '', 'images' => $item['images'] ?? json_encode([]), ]; unset($array[$key]); $this->getTemplateLibraryList($array, $item['id']); } } return $data; } /** * 添加顶级菜单 * @param Request $request * @return JsonResponse */ public function addParentMenu(Request $request) { $result = $request->all(); $update = [ 'name' => $result['name'], 'pid' => 0, ]; TemplateLibrary::query()->insert($update); return response()->json(['message' => '添加成功']); } /** * 保存模版信息 * @param Request $request * @return JsonResponse */ public function saveTemplateLibrary(Request $request) { $result = $request->all(); $update = [ 'name' => $result['name'] ?? '', 'alias' => $result['alias'] ?? '', 'memo' => $result['memo'] ?? '', 'sort' => $result['sort'] ?? 0, 'pid' => $result['pid'] ?? '', 'css' => $result['css'] ?? '', 'images' => json_encode($result['images'] ?? []), ]; try { //事务 DB::transaction(function () use ($result, $update) { TemplateLibrary::query()->where('id', $result['template_id'])->update($update); if (!empty($result['variableIds'])) { $variableList = []; foreach ($result['variableIds'] as $item) { $variableList[] = [ 'template_library_id' => $result['template_id'], 'variable_id' => $item, ]; } TemplateLibraryRelation::query()->where('template_library_id', $result['template_id'])->delete(); TemplateLibraryRelation::query()->insert($variableList); } }); } catch (\Throwable $exception) { return response()->json(['message' => $exception->getMessage()], 400); } if (!empty($result['siteId'] && !empty($result['nodeIds']))) { $ids = []; $level = []; foreach ($result['nodeIds'] as $key => $id) { $res = explode(':', $id); $ids[] = $res[0]; $level[$res[0]] = $res[1]; } $templateLibraryList = TemplateLibrary::query()->whereIn('id', $ids)->get()->toArray(); if (!empty($templateLibraryList)) { $templateLibraryResult = []; foreach ($templateLibraryList as $item) { $templateLibraryResult[] = [ 'id' => $item['id'] ?? 0, 'name' => $item['name'] ?? '', 'alias' => $item['alias'] ?? '', 'description' => $item['memo'] ?? '', 'rank' => $item['rank'] ?? 0, 'html' => '', 'allow_write_file' => 0, 'allow_clear_cache' => 0, 'create_time' => time(), 'parent_id' => $item['pid'], 'level' => $level[$item['id']], 'images' => $item['images'] ?? json_encode([]), ]; } //清空表 DB::connection($this->templateLibraryApiService->connection($this->siteId)) ->table('content_template')->truncate(); //插入到项目数据库形成新的父子关系 $this->loop($templateLibraryResult); $variableList = TemplateLibraryVar::query()->get()->toArray(); if (!empty($variableList)) { $variableListResult = []; foreach ($variableList as $item) { $variableListResult[] = [ 'name' => $item['variable'] ?? '', 'caption' => $item['tag'] ?? '', 'description' => $item['memo'] ?? '', 'input_type' => $item['input_type'] ?? '', 'input_value' => $item['input_value'] ?? '', 'input_opts' => $item['input_opts'] ?? '', 'input_length' => $item['input_length'] ?? 0, 'allow_blank' => $item['allow_blank'] ?? 0, 'regex_match' => $item['regex_match'] ?? '', 'regex_error' => $item['regex_error'] ?? '', 'rank' => $item['rank'] ?? 0, 'create_time' => $item['create_time'] ?? time(), 'width' => $item['width'] ?? 0, 'height' => $item['height'] ?? 0, 'size' => $item['size'] ?? 0, ]; } DB::connection($this->templateLibraryApiService->connection($request['siteId']))->table('content_template_var')->truncate(); DB::connection($this->templateLibraryApiService->connection($request['siteId'])) ->table('content_template_var')->insert($variableListResult); } } } return response()->json(['message' => '保存成功']); } /** * 插入数据库形成新的父子关系 * @param $array */ public function loop($array) { $ids = []; foreach ($array as $key => $item) { if ($item['parent_id'] == 0 && $key == 0) { $update = [ 'id' => $item['id'], 'name' => $item['name'], 'alias' => $item['alias'] ?? '', 'description' => $item['description'] ?? '', 'rank' => $item['rank'] ?? 0, 'html' => $item['html'] ?? 0, 'allow_write_file' => $item['allow_write_file'] ?? '', 'allow_clear_cache' => $item['allow_clear_cache'] ?? '', 'create_time' => $item['create_time'], 'parent_id' => 0, 'level' => $item['level'], 'images' => $item['images'], ]; } elseif ($item['parent_id'] != 0 && $key == 0) { $ids[$item['parent_id']] = $item['parent_id']; $update = [ 'id' => $item['id'], 'name' => $item['name'], 'alias' => $item['alias'] ?? '', 'description' => $item['description'] ?? '', 'rank' => $item['rank'] ?? 0, 'html' => $item['html'] ?? 0, 'allow_write_file' => $item['allow_write_file'] ?? '', 'allow_clear_cache' => $item['allow_clear_cache'] ?? '', 'create_time' => $item['create_time'], 'parent_id' => $ids[$item['parent_id']] ?? 0, 'level' => $item['level'], 'images' => $item['images'], ]; } else { $update = [ 'id' => $item['id'], 'name' => $item['name'], 'alias' => $item['alias'] ?? '', 'description' => $item['description'] ?? '', 'rank' => $item['rank'] ?? 0, 'html' => $item['html'] ?? 0, 'allow_write_file' => $item['allow_write_file'] ?? '', 'allow_clear_cache' => $item['allow_clear_cache'] ?? '', 'create_time' => $item['create_time'], 'parent_id' => $ids[$item['parent_id']], 'level' => $item['level'], 'images' => $item['images'], ]; } $id = DB::connection($this->templateLibraryApiService->connection($this->siteId)) ->table('content_template')->insertGetId($update); $ids[$item['id']] = $id; } } /** * 添加模版变量 * @param Request $request * @param $id * @return Factory|JsonResponse|View */ public function addVariable(Request $request, $id) { if (!$request->ajax()) { $info = TemplateLibraryVar::query()->where('id', $id)->first(); return view('admin.stencil.add_variable', [ 'id' => $id, 'info' => $info, ]); } $result = $request->all(); $update = [ 'variable' => $result['variable'] ?? '', 'tag' => $result['tag'] ?? '', 'sort' => $result['sort'] ?? 0, 'memo' => $result['memo'] ?? '', 'input_type' => $result['input_type'] ?? '', 'input_opts' => $result['input_opts'] ?? '', 'input_length' => $result['input_length'] ?? '', 'width' => $result['width'] ?? '', 'height' => $result['height'] ?? '', 'size' => $result['size'] ?? '', 'input_value' => $result['input_value'] ?? '', 'regex_match' => $result['regex_match'] ?? '', 'regex_error' => $result['regex_error'] ?? '', ]; if (!empty($id)) { TemplateLibraryVar::query()->where('id', $id)->update($update); } else { TemplateLibraryVar::query()->insert($update); } return response()->json(['message' => '保存成功']); } /** * 删除模版变量 * @param $id * @return JsonResponse */ public function delDelVariable($id) { $update = [ 'deleted_at' => date('Y-m-d H:i:s') ]; TemplateLibraryVar::query()->where('id', $id)->update($update); return response()->json(['message' => '保存成功']); } }