logic = $logic; } //客户界面的流程 public function customer() { $site = $this->hasUserOneSite(); if (!$site) { return view('admin/errors/tips'); } $processes = Process::query()->orderByDesc('order')->get(); $siteProcessList = SiteProcess::query()->where(['site_id' => $site->id])->get()->keyBy('process_id')->toArray(); return view('admin/process/customer', [ 'processes' => $processes, 'siteId' => $site->id, 'processIdMapSiteProcessList' => $siteProcessList, 'site' => Site::query()->select(['id', 'domain'])->where(['id' => $site->id])->first() ]); } /** * 项目详情中的流程 * @param $siteId * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ public function siteProcess($siteId) { $processes = Process::query()->orderByDesc('order')->get(); $siteProcessList = SiteProcess::query()->where(['site_id' => $siteId])->get()->keyBy('process_id')->toArray(); return view('admin/process/site_process', [ 'processes' => $processes, 'siteId' => $siteId, 'processIdMapSiteProcessList' => $siteProcessList, 'site' => Site::query()->select(['id', 'domain'])->where(['id' => $siteId])->first() ]); } /** * 确认 * @param $id * @return \Illuminate\Http\JsonResponse */ public function confirm($id) { $siteProcess = SiteProcess::query()->where(['id' => $id])->first(); if (!$siteProcess) return response()->json(['message' => '具体流程信息不存在'], 400); if ($siteProcess->active != 2) { return response()->json(['message' => '此流程已完成请刷新页面查看最新数据'], 400); } //判断是否全部完成检查项 if (in_array($siteProcess->process_id, Process::HAS_CHECK_ITEM_IDS)) { $process = Process::query()->where(['id' => $siteProcess->process_id])->first(); if (!$process) { return response()->json(['message' => '主流程信息不存在'], 400); } if (array_diff(array_column($process->check_item_scopes, 'inx'), $siteProcess->check_items ?? [])) { return response()->json(['message' => '请先完成全部检查项'], 400); } } $siteProcess->active = 1; $siteProcess->save(); $logic = new ProcessLogic; $logic->changeStatus($siteProcess); $logic->nextProcess($siteProcess); return response()->json(['message' => '操作成功']); } /** * 流程检查项 * @param Request $request * @param $siteProcessId * @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\JsonResponse|\Illuminate\View\View */ public function checkItem(Request $request, $siteProcessId) { $siteProcess = SiteProcess::query()->with('process')->where(['id' => $siteProcessId])->first(); if (!$siteProcess) return response()->json(['message' => '流程信息不存在'], 400); if (!$request->ajax()) { return view('admin/process/check_item', [ 'siteProcess' => $siteProcess ]); } $checkItems = $request->input('checkItems'); if (!is_array($checkItems)) return response()->json(['message' => '检查项参数错误'], 400); $siteProcess->check_items = $checkItems; $siteProcess->save(); return response()->json(['message' => '操作成功']); } /** * 续签表单 * @param RenewFormRequest $request * @param $siteProcessId * @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\JsonResponse|\Illuminate\View\View */ public function renewForm(RenewFormRequest $request, $siteProcessId) { $siteProcess = SiteProcess::query()->where(['id' => $siteProcessId])->first(); if (!$siteProcess) return response()->json(['message' => '续签流程信息不存在'], 400); if (!$request->ajax()) { return view('admin/process/renew_form', [ 'siteProcessId' => $siteProcessId ]); } $site = Site::query()->where(['id' => $siteProcess->site_id])->first(); if (!$site) return response()->json(['message' => '站点信息不存在'], 400); $validated = $request->validated(); $validated['site_id'] = $siteProcess->site_id; $recordBak = [ 'keyword_goal' => $site->keyword_goal, 'link_goal' => $site->link_goal, 'article_goal' => $site->article_goal, 'other_demand' => $site->other_demand ]; $validated['remark'] = json_encode($recordBak); SiteRenewHistory::query()->create($validated); $site->update([ 'keyword_goal' => $validated['keyword_goal'], 'link_goal' => $validated['link_goal'], 'article_goal' => $validated['article_goal'], 'other_demand' => $validated['other_demand'] ]); return response()->json(['message' => '操作成功']); } //初始化项目流程 public function initProcess($siteId) { if (SiteProcess::query()->where(['site_id' => $siteId])->exists()) { return response()->json(['message' => '流程已经存在不需要初始化'], 400); } $this->logic->initProcess($siteId); return response()->json(['message' => '操作成功']); } //续费历史记录 public function renewHistory($siteId) { $historyList = SiteRenewHistory::query()->where(['site_id' => $siteId])->orderByDesc('id')->get(); return view('admin/process/renew_history', [ 'historyList' => $historyList ]); } //打分和反馈 public function scoreFeedback(Request $request, $id) { $siteProcess = SiteProcess::query()->where(['id' => $id])->first(); if (!$siteProcess) return response()->json(['message' => '流程信息不存在'], 400); if (!$request->ajax()) { return view('admin/process/score_feedback', [ 'siteProcess' => $siteProcess ]); } $inputs = $request->input(); if (empty($inputs['score']) || empty($inputs['feedback'])) { return response()->json(['message' => '请填写表单内容'], 422); } if ($siteProcess->active != 2) { return response()->json(['message' => '此流程已完成请刷新页面查看最新数据'], 400); } $siteProcess->active = 1; $siteProcess->save(); $logic = new ProcessLogic; $logic->changeStatus($siteProcess); $logic->nextProcess($siteProcess); $siteProcess->evaluate = [ 'score' => $inputs['score'], 'feedback' => $inputs['feedback'] ]; $siteProcess->save(); return response()->json(['message' => '操作成功']); } //回复 public function reply(Request $request, $siteProcessId) { $siteProcess = SiteProcess::query()->where(['id' => $siteProcessId])->first(); if (!$siteProcess) return response()->json(['message' => '流程信息不存在'], 400); if (!$request->ajax()) { return view('admin/process/reply', [ 'siteProcess' => $siteProcess ]); } $reply = $request->input('reply'); if (!$reply) { return response()->json(['message' => '回访记录不能为空'], 422); } $siteProcess->reply = $reply; $siteProcess->save(); return response()->json(['message' => '操作成功']); } /** * 流程激活 * @param Request $request * @return \Illuminate\Http\JsonResponse */ public function active(Request $request) { $siteProcess = SiteProcess::query()->where(['id' => $request->input('siteProcessId')])->first(); if (!$siteProcess) { return response()->json(['message' => '流程信息不存在'], 400); } $siteProcess->active = 1; $siteProcess->save(); return response()->json(['message' => '操作成功']); } /** * 文件上传 * @param Request $request * @param $siteProcessId * @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\JsonResponse|\Illuminate\View\View */ public function fileUpload(Request $request, $siteProcessId) { $siteProcess = SiteProcess::query()->where(['id' => $siteProcessId])->first(); if (!$request->ajax()) { return view('admin/process/file_upload', [ 'siteProcess' => $siteProcess ]); } if (!$siteProcess) return response()->json(['message' => '流程信息不存在'], 400); $siteProcessFileList = $siteProcess->file_list ?? []; $fileList = $request->input('file_list'); if ($fileList) { $mergeFileList = array_merge($fileList, $siteProcessFileList); $siteProcess->file_list = $mergeFileList; $siteProcess->save(); } return response()->json(['message' => '操作成功']); } /** * 项目部署 * @param $siteId * @return \Illuminate\Http\JsonResponse */ public function deploy($siteId) { /* $siteProcess = SiteProcess::query()->where(['id' => $siteProcessId])->first(); if (!$siteProcess) return response()->json(['message' => '部署流程信息不存在'], 400);*/ $site = Site::query()->with('server')->where(['id' => $siteId])->first(); if (empty($site->server)) return response()->json(['message' => '站点服务器信息不存在'], 400); if (empty($site->domain)) return response()->json(['message' => '域名信息不存在'], 400); if ($site->database || $site->code_dir) { return response()->json(['message' => '项目数据库信息与代码目录都存在,推测该站点之前已经部署'], 400); } if (!empty($site->database)) { return response()->json(['message' => '项目已部署'], 400); } //if ($siteProcess->deploy) return response()->json(['message' => '项目已部署'], 400); $ph = pathinfo($site->domain); // pathinfo() 函数以数组的形式返回文件路径的信息 $dbName = 'sdb_' . str_replace(array('-', '.'), '', $ph['filename']); $srcPath = '/repo/_sitetpl/'; $tarPath = '/repo/' . $site->domain; try { Ssh::factory($site->server->server_ip, $site->server->server_user_name, $site->server->server_passwd); } catch (\Throwable $throwable) { return response()->json(['message' => $throwable->getMessage()], 400); } Log::info(Ssh::exec('cp -rf ' . $srcPath . ' ' . $tarPath)); //新建数据库 $db_config = array( '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); try { DB::connection($new_db)->statement('create database ' . $dbName); } catch (\Throwable $throwable) { Log::error(var_export($throwable->getMessage(), 1)); return response()->json(['message' => $throwable->getMessage()], 400); } Log::info(Ssh::exec("mysqldump sdb_sucocms -u root -p" . $site->server->mysql_passwd . " --add-drop-table | mysql " . $dbName . " -u root -p" . $site->server->mysql_passwd)); //数据库配置文件 $db_config_data = file_get_contents(public_path() . '/remote/db.conf.php'); $db_config_data = str_replace('{$dbname}', $dbName, $db_config_data); $db_config_data = str_replace('{$mysql_user_name}', $site->server->mysql_user_name, $db_config_data); $db_config_data = str_replace('{$mysql_passwd}', $site->server->mysql_passwd, $db_config_data); file_put_contents(public_path() . '/remote/temp.db.conf.php', $db_config_data); Ssh::send(public_path() . '/remote/temp.db.conf.php', $tarPath . '/appdata/conf/db.conf.php'); //vhost配置文件 $vhost_config_data = file_get_contents(public_path() . '/remote/vhost.conf'); $vhost_config_data = str_replace('$server_name', $ph['filename'] . '.' . $site->server->server_alias, $vhost_config_data); $vhost_config_data = str_replace('$server_alias', $ph['filename'] . '.' . $site->server->server_alias, $vhost_config_data); $vhost_config_data = str_replace('$domain', $tarPath, $vhost_config_data); file_put_contents(public_path() . '/remote/temp.vhost.conf', $vhost_config_data); Ssh::send(public_path() . '/remote/temp.vhost.conf', '/etc/httpd/conf/vhosts/' . $site->domain . '.conf'); //setting配置文件 $setting_config_data = file_get_contents(public_path() . '/remote/setting.conf.php'); $setting_config_data = str_replace('{$sitename}', $site->en_title, $setting_config_data); $setting_config_data = str_replace('{$domain}', $site->domain, $setting_config_data); file_put_contents(public_path() . '/remote/temp.setting.conf.php', $setting_config_data); Ssh::send(public_path() . '/remote/temp.setting.conf.php', $tarPath . '/appdata/conf/setting.conf.php'); //设置权限 Ssh::exec('chmod -R 777 ' . $tarPath . '/appdata'); Ssh::exec('chmod -R 777 ' . $tarPath . '/wwwroot/uploads'); Ssh::exec('chmod -R 777 ' . $tarPath . '/wwwroot/sitemap.php'); Ssh::exec('chmod -R 777 ' . $tarPath . '/wwwroot/.htaccess'); Ssh::exec('chmod -R 777 ' . $tarPath . '/wwwroot/tmp.xls'); Ssh::exec('chmod -R 777 ' . $tarPath . '/wwwroot/tag_tpl.xlsx'); Ssh::exec('chmod -R 777 ' . $tarPath . '/wwwroot/robots.txt'); //重启服务 if ($site->server->server_ip == '47.89.219.88') { Log::info(Ssh::exec('/usr/bin/sudo /etc/init.d/httpd reload')); } else { Log::info(Ssh::exec('lnmp restart')); } $site->database = $dbName; $site->code_dir = $tarPath; $site->save(); $deploy=[ 'db' => $dbName, 'dir' => $tarPath, 'domain' => sprintf('%s.yinqingli.net', $ph['filename'] . '.' . $site->server->server_alias) ]; $data = [ 'process_id' => 7, 'active' => 2, 'site_id'=>$siteId, 'deploy'=>\GuzzleHttp\json_encode($deploy) ]; SiteProcess::query()->insert($data); return response()->json(['message' => '部署完成']); } }