123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418 |
- <?php
- /**
- * Created by PhpStorm.
- * User: Administrator
- * Date: 2019/4/16 0016
- * Time: 9:51
- */
- namespace App\Http\Controllers\Admin;
- use App\Http\Controllers\Controller;
- use App\Http\Logics\Admin\ProcessLogic;
- use App\Http\Models\Process;
- use App\Http\Models\Site;
- use App\Http\Models\SiteProcess;
- use App\Http\Models\SiteRenewHistory;
- use App\Http\Requests\Process\RenewFormRequest;
- use App\Http\Traits\HasSites;
- use App\Libs\Ssh;
- use Illuminate\Http\Request;
- use Illuminate\Support\Facades\DB;
- use Illuminate\Support\Facades\Log;
- /**
- *项目流程
- * Class ProcessController
- * @package App\Http\Controllers\Admin
- */
- class ProcessController extends Controller
- {
- use HasSites;
- protected $logic;
- public function __construct(ProcessLogic $logic)
- {
- $this->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' => '部署完成']);
- }
- }
|