_dealData($data); \DB::beginTransaction(); if (!$this->_addMenu()) { dd(1); $this->setMsg("添加菜单失败"); \DB::rollback(); return false; } if (!$this->_addModel()) { dd(2); $this->setMsg("添加模型失败"); \DB::rollback(); return false; } if (!$this->_addService()) { dd(3); $this->setMsg("添加Service失败"); \DB::rollback(); return false; } if (!$this->_addCriteriaMultiWhere()) { dd(4); $this->setMsg("添加Service失败"); \DB::rollback(); return false; } if (!$this->_addControl()) { dd(5); $this->setMsg("添加控制器失败"); \DB::rollback(); return false; } \DB::commit(); return true; } public function _dealData($data) { $data['modelPath'] = app_path() . "/Models/" . $data['model'] . ".php"; $data['modelUse'] = 'App\Models\\' . $data['model']; $data['modelName'] = $data['model']; $data['repositoriesPath'] = app_path() . "/Repositories/" . $data['repositories'] . ".php"; $data['repositoriesUse'] = 'App\Repositories\\' . str_replace('/', '\\', $data['repositories']); $data['CriteriaMultiWherePath'] = app_path() . "/Repositories/" . substr($data['repositories'], 0, strrpos($data['repositories'], "Repository")) . "/Criteria/MultiWhere" . ".php";; $data['CriteriaMultiWhereUse'] = 'App\Repositories\\' .str_replace('/', '\\', substr($data['repositories'], 0, strrpos($data['repositories'], "Repository"))) . "\\Criteria\\MultiWhere"; $data['repositoriesName'] = substr(strrchr($data['repositories'], '/'), 1); $data['controlPath'] = app_path() . "/Http/Controllers/Admin/" . $data['control'] . ".php"; $data['controlUse'] = 'App\Repositories\\' . str_replace('/', '\\', $data['control']); $data['controlName'] = substr(strrchr($data['control'], '/'), 1); $data['viewBaseSort'] = 'admin/' . strtolower(substr($data['control'], 0, -10)); $data['viewPath'] = base_path() . "/resources/views/" . $data['viewBaseSort']; $data['viewSortPath'] = str_replace('/', '.', $data['viewBaseSort']); $this->_modelTpl = __DIR__ . "/tpl/model.tpl"; $this->_repositoriesTpl = __DIR__ . "/tpl/repositories.tpl"; $this->_CriteriaMultiWhereTpl = __DIR__ . "/tpl/creteriaMultiWhere.tpl"; $this->_controlTpl = __DIR__ . "/tpl/controller.tpl"; $this->_viewTpl = __DIR__ . "/tpl/view/"; $this->_data = $data; $this->_date = date("Y-m-d H:i:s"); $this->_fieldData = $resultRow = \DB::select("SELECT COLUMN_NAME,COLUMN_KEY,DATA_TYPE,COLUMN_COMMENT FROM information_schema.COLUMNS WHERE TABLE_SCHEMA= ? AND TABLE_NAME= ? ", [env('DB_DATABASE'), $this->_data['table']]); foreach ($this->_fieldData as $data) { if ($data->COLUMN_KEY == "PRI") { $this->_fieldPrimary = $data->COLUMN_NAME; break; } } } /** * * 添加菜单 * */ public function _addMenu() { $obj = new AdminMenusModel(); $addData['pid'] = $this->_data['menu_pid']; $addData['display'] = 1; $addData['name'] = $this->_data['desc']; $addData['path'] = $this->_data['path'] . "/index"; $baseObj = $obj->create($addData); if (!$baseObj) { return false; } //添加 $addData['display'] = 0; $addData['path'] = $this->_data['path'] . "/create"; $addData['pid'] = $baseObj->id; $addData['name'] = "添加"; $ok = $obj->create($addData); if (!$ok) { return false; } //修改 $addData['display'] = 0; $addData['path'] = $this->_data['path'] . "/update"; $addData['pid'] = $baseObj->id; $addData['name'] = "修改"; $ok = $obj->create($addData); if (!$ok) { return false; } //删除 $addData['display'] = 0; $addData['path'] = $this->_data['path'] . "/destroy"; $addData['pid'] = $baseObj->id; $addData['name'] = "删除"; $ok = $obj->create($addData); if (!$ok) { return false; } //查看 $addData['display'] = 0; $addData['path'] = $this->_data['path'] . "/view"; $addData['pid'] = $baseObj->id; $addData['name'] = "查看"; $ok = $obj->create($addData); if (!$ok) { return false; } if (!$ok) { return false; } if (dict($this->_data['table'], 'status')) { //check $addData['display'] = 0; $addData['path'] = $this->_data['path'] . "/status"; $addData['pid'] = $baseObj->id; $addData['name'] = "状态变更"; if (!$ok) { return false; } } return true; } /** * 添加模型 */ public function _addModel() { $filePath = $this->_data['modelPath']; if (file_exists($filePath) && $this->_coverage === false) { return true; } $notFillable = $this->notFillable; $date = $this->_date; $tpl = file_get_contents($this->_modelTpl); $table_primary = ''; $fillable = ""; foreach ($this->_fieldData as $data) { if ($data->COLUMN_KEY == "PRI") { $table_primary = $data->COLUMN_NAME; } elseif (!in_array($data->COLUMN_NAME, $notFillable)) { $fillable .= "\r\n '{$data->COLUMN_NAME}',"; } } $fillable = $fillable ? '[' . substr($fillable, 0, -1) . "\r\n ]" : $fillable; $str = str_replace("{{table_comment}}", $this->_data['desc'], $tpl); $str = str_replace("{{table_name}}", $this->_data['table'], $str); $str = str_replace("{{table_primary}}", $table_primary, $str); $str = str_replace("{{fillable}}", $fillable, $str); $str = str_replace("{{class_name}}", $this->_data['model'], $str); $str = str_replace("{{date}}", $this->_date, $str); $ok = file_put_contents($filePath, $str); if (!$ok) { return true; } return true; } /** * 添加Service */ public function _addService() { if (file_exists($this->_data['repositoriesPath']) && $this->_coverage === false) { return true; } $tpl = file_get_contents($this->_repositoriesTpl); $queryKeyord = ""; foreach ($this->_fieldData as $data) { $queryKeyord = " if(isset(\$this->search['{$data->COLUMN_NAME}']) && \$this->search['{$data->COLUMN_NAME}']) { \$model = \$model->where('{$data->COLUMN_NAME}',\$this->search['{$data->COLUMN_NAME}']); }\r\n"; } $this->customMkdir(substr($this->_data['repositoriesPath'], 0, strrpos($this->_data['repositoriesPath'], "/")), $mode = 0777, $recursive = true); $str = str_replace("{{desc}}", $this->_data['desc'], $tpl); $str = str_replace("{{modelUse}}", $this->_data['modelUse'], $str); $str = str_replace("{{sortPath}}", str_replace('/', '\\', substr($this->_data['repositories'], 0, strrpos($this->_data['repositories'], "/"))), $str); $str = str_replace("{{repositoriesName}}", $this->_data['repositoriesName'], $str); $str = str_replace("{{modelName}}", $this->_data['modelName'], $str); $str = str_replace("{{primaryKey}}", $this->_fieldPrimary, $str); $str = str_replace("{{queryKeyord}}", $queryKeyord, $str); $str = str_replace("{{date}}", $this->_date, $str); $ok = file_put_contents($this->_data['repositoriesPath'], $str); return true; } /** * 添加Service */ public function _addCriteriaMultiWhere() { if (file_exists($this->_data['CriteriaMultiWherePath']) && $this->_coverage === false) { return true; } $tpl = file_get_contents($this->_CriteriaMultiWhereTpl); $queryKeyord = ""; foreach ($this->_fieldData as $k =>$data) { if($data->DATA_TYPE != 'timestamp'){ if($k == 0){ $queryKeyord .= " if(isset(\$this->search['keyword']) && \$this->search['keyword']) { \$model = \$model->where('{$data->COLUMN_NAME}','like','%'.\$this->search['keyword'].'%')\r\n"; }else{ $queryKeyord .= " ->orWhere('{$data->COLUMN_NAME}','like','%'.\$this->search['keyword'].'%')\r\n"; } } } $queryKeyord .=";}"; $this->customMkdir(substr($this->_data['CriteriaMultiWherePath'], 0, strrpos($this->_data['CriteriaMultiWherePath'], "/")), $mode = 0777, $recursive = true); $str = str_replace("{{desc}}", $this->_data['desc'], $tpl); $str = str_replace("{{sortPath}}", str_replace('/', '\\', substr($this->_data['repositories'], 0, strrpos($this->_data['repositories'], "Repository"))), $str); $str = str_replace("{{queryKeyord}}", $queryKeyord, $str); $ok = file_put_contents($this->_data['CriteriaMultiWherePath'], $str); return true; } public function _addControl() { if (file_exists($this->_data['controlPath']) && $this->_coverage === false) { return true; } $this->customMkdir(substr($this->_data['controlPath'], 0, strrpos($this->_data['controlPath'], "/")), $mode = 0777, $recursive = true); $str = file_get_contents($this->_controlTpl); $str = str_replace("{{desc}}", $this->_data['desc'], $str); $str = str_replace("{{path}}", $this->_data['path'], $str); $str = str_replace("{{repositoriesUse}}", $this->_data['repositoriesUse'], $str); $str = str_replace("{{sortPath}}", str_replace('/', '\\', substr($this->_data['control'], 0, strrpos($this->_data['control'], "/"))), $str); $str = str_replace("{{repositoriesName}}", $this->_data['repositoriesName'], $str); $str = str_replace("{{CriteriaMultiWhereUse}}", $this->_data['CriteriaMultiWhereUse'], $str); $str = str_replace("{{controlName}}", $this->_data['controlName'], $str); $str = str_replace("{{viewSortPath}}", $this->_data['viewSortPath'], $str); $str = str_replace("{{date}}", $this->_date, $str); $ok = file_put_contents($this->_data['controlPath'], $str); $this->_addView(); return true; } public function _addView() { if (file_exists($this->_data['viewPath']) && $this->_coverage === false) { return true; } $this->customMkdir($this->_data['viewPath'], $mode = 0777, $recursive = true); ###index $str = file_get_contents($this->_viewTpl . "/index.blade.php"); $listThStr = ""; $listTdStr = ""; $i = 0; foreach ($this->_fieldData as $key => $data) { if (!in_array($data->COLUMN_NAME, ["deleted_at"]) && $data->DATA_TYPE != 'text') { if ($data->COLUMN_NAME == "id") $this->_fieldData[$key]->COLUMN_COMMENT = "ID"; if ($data->COLUMN_NAME == "created_at") $this->_fieldData[$key]->COLUMN_COMMENT = "创建时间"; if ($data->COLUMN_NAME == "updated_at") $this->_fieldData[$key]->COLUMN_COMMENT = "更新时间"; $i++; if ($i > 7) break; $listThStr .= "\r\n COLUMN_NAME}\"> {$data->COLUMN_COMMENT} "; switch ($data->DATA_TYPE) { case "tinyint": if (dict()->get($this->_data['table'], $data->COLUMN_NAME)) { $listTdStr .= "\r\n {{ dict()->get('{$this->_data['table']}','{$data->COLUMN_NAME}',\$item->{$data->COLUMN_NAME}) }}"; } elseif (dict()->get('global', $data->COLUMN_NAME)) { $listTdStr .= "\r\n {{ dict()->get('global','{$data->COLUMN_NAME}',\$item->{$data->COLUMN_NAME}) }}"; } else { $listTdStr .= "\r\n {{ \$item->{$data->COLUMN_NAME} }}"; } break; default: if ($data->COLUMN_NAME == 'image' || $data->COLUMN_NAME == 'pic' || $data->COLUMN_NAME == 'picture' || $data->COLUMN_NAME == 'photo' || $data->COLUMN_NAME == 'avatar' || $data->COLUMN_NAME == 'img'){ $listTdStr .= "\r\n "; }else{ $listTdStr .= "\r\n {{ \$item->{$data->COLUMN_NAME} }}"; } break; } } } $str = str_replace("{{desc}}", $this->_data['desc'], $str); $str = str_replace("{{path}}", $this->_data['path'], $str); $str = str_replace("{{primaryKey}}", $this->_fieldPrimary, $str); $str = str_replace("{{listThStr}}", $listThStr, $str); $str = str_replace("{{listTdStr}}", $listTdStr, $str); $ok = file_put_contents($this->_data['viewPath'] . "/index.blade.php", $str); #view $str = file_get_contents($this->_viewTpl . "/view.blade.php"); $str = str_replace("{{desc}}", $this->_data['desc'], $str); $str = str_replace("{{path}}", $this->_data['path'], $str); $str = str_replace("{{primaryKey}}", $this->_fieldPrimary, $str); $viewTdStr = ""; foreach ($this->_fieldData as $key => $data) { if ($data->COLUMN_NAME == 'id') continue; if ($data->COLUMN_NAME == 'created_at') continue; if ($data->COLUMN_NAME == 'updated_at') continue; if ($data->COLUMN_NAME == 'deleted_at') continue; $viewTdStr .= " \r\n
\r\n

{$data->COLUMN_COMMENT}

\r\n

"; switch ($data->DATA_TYPE) { case "tinyint": if (dict()->get($this->_data['table'], $data->COLUMN_NAME)) { $viewTdStr .= "{{ dict()->get('{$this->_data['table']}','{$data->COLUMN_NAME}',\$data['{$data->COLUMN_NAME}']) }}"; } elseif (dict()->get('global', $data->COLUMN_NAME)) { $viewTdStr .= "{{ dict()->get('global','{$data->COLUMN_NAME}',\$data['{$data->COLUMN_NAME}']) }}"; } else { $viewTdStr .= " {{ \$data['{$data->COLUMN_NAME}'] or ''}}"; } break; case "text": $viewTdStr .= " {!! \$data['{$data->COLUMN_NAME}'] or '' !!}"; break; default: if ($data->COLUMN_NAME == 'image' || $data->COLUMN_NAME == 'pic' || $data->COLUMN_NAME == 'picture' || $data->COLUMN_NAME == 'photo' || $data->COLUMN_NAME == 'avatar' || $data->COLUMN_NAME == 'img'){ $viewTdStr .= "COLUMN_NAME}'] }}\" style='height: 80px'>"; }else{ $viewTdStr .= " {{ \$data['{$data->COLUMN_NAME}'] or ''}}"; } break; } $viewTdStr .= "

\r\n
"; } $str = str_replace("{{viewTdStr}}", $viewTdStr, $str); $ok = file_put_contents($this->_data['viewPath'] . "/view.blade.php", $str); #edit $str = file_get_contents($this->_viewTpl . "/edit.blade.php"); $str = str_replace("{{desc}}", $this->_data['desc'], $str); $str = str_replace("{{path}}", $this->_data['path'], $str); $str = str_replace("{{primaryKey}}", $this->_fieldPrimary, $str); $editTdStr = ""; foreach ($this->_fieldData as $data) { if (!in_array($data->COLUMN_NAME, [$this->_fieldPrimary, 'created_at', 'updated_at', "deleted_at"])) { $editTdStr .= " \r\n
\r\n \r\n
"; switch ($data->DATA_TYPE) { case "tinyint": if (dict()->get($this->_data['table'], $data->COLUMN_NAME)) { $editTdStr .= " @foreach(dict()->get('{$this->_data['table']}','{$data->COLUMN_NAME}') as \$key=>\$val) @endforeach"; } elseif (dict()->get('global', $data->COLUMN_NAME)) { $editTdStr .= " @foreach(dict()->get('global','{$data->COLUMN_NAME}') as \$key=>\$val) @endforeach"; } else { $editTdStr .= "\r\n COLUMN_NAME}\" name=\"data[{$data->COLUMN_NAME}]\" class=\"form-control\" value=\"{{ \$data['{$data->COLUMN_NAME}'] or ''}}\" required=\"\" aria-required=\"true\" placeholder=\"\">"; } break; case "text": $editTdStr .= "\r\n {!! editor('') !!} \r\n "; break; case "datetime": $editTdStr .= "\r\n COLUMN_NAME}]\" class=\"form-control laydate-icon help-block m-b-none\" style=\"width:200px; height:34px;\" value=\"{{ \$data['{$data->COLUMN_NAME}'] or ''}}\" placeholder=\"{$data->COLUMN_COMMENT}\" onclick=\"laydate({istime: true, format: 'YYYY-MM-DD hh:mm:ss'})\" aria-invalid=\"false\">"; break; default: if ($data->COLUMN_NAME == 'image' || $data->COLUMN_NAME == 'pic' || $data->COLUMN_NAME == 'picture' || $data->COLUMN_NAME == 'photo' || $data->COLUMN_NAME == 'avatar' || $data->COLUMN_NAME == 'img') { $editTdStr .= "\r\n {!! widget('Tools.ImgUpload')->single('{$data->COLUMN_NAME}','data[{$data->COLUMN_NAME}]', isset(\$data['{$data->COLUMN_NAME}'])? \$data['{$data->COLUMN_NAME}'] : '') !!} "; } else { $editTdStr .= "\r\n COLUMN_NAME}\" name=\"data[{$data->COLUMN_NAME}]\" class=\"form-control\" value=\"{{ \$data['{$data->COLUMN_NAME}'] or ''}}\" required=\"\" aria-required=\"true\" placeholder=\"\">"; } break; } $editTdStr .= " \r\n
\r\n
"; } } $str = str_replace("{{editTdStr}}", $editTdStr, $str); $ok = file_put_contents($this->_data['viewPath'] . "/edit.blade.php", $str); return true; } public function customMkdir($dir) { if (!file_exists($dir)) { \File::makeDirectory($dir, $mode = 0755, $recursive = true); } } }