123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502 |
- <?php
- /**
- * User: Mike
- * Email: m@9026.com
- * Date: 2016/7/28
- * Time: 15:09
- */
- namespace App\Services\CRUD;
- use App\Models\AdminMenusModel;
- use App\Models\ModuleTagModel;
- use App\Services\Base\BaseProcess;
- class CRUD extends BaseProcess
- {
- private $_data;
- private $_date;
- private $_modelTpl;
- private $_repositoriesTpl;
- private $_CriteriaMultiWhereTpl;
- private $_controlTpl;
- private $_viewTpl;
- private $_fieldData;
- private $_fieldContentData;
- private $_fieldPrimary;
- public $notFillable = ['created_at','updated_at',"deleted_at"];
- private $_coverage = true; //强制覆盖
- /**
- * 创建CRUD
- * @param $data
- *
- */
- public function create($data) {
- $this->_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'], "/")) . "/Criteria/MultiWhere" . ".php"; ;
- $data['CriteriaMultiWhereUse'] = substr($data['repositoriesUse'],0,strrpos ($data['repositoriesUse'], "\\")) . "\\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;
- }
- //check
- $addData['display'] = 0;
- $addData['path'] = $this->_data['path'] . "/check";
- $addData['pid'] = $baseObj->id;
- $addData['name'] = "选择数据";
- $ok = $obj->create($addData);
- 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 $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['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'], "/"))), $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 <th class=\"sorting\" data-sort=\"{$data->COLUMN_NAME}\"> {$data->COLUMN_COMMENT} </th>";
- switch($data->DATA_TYPE) {
- case "tinyint":
- if(dict()->get($this->_data['table'],$data->COLUMN_NAME)) {
- $listTdStr .= "\r\n <td>{{ dict()->get('{$this->_data['table']}','{$data->COLUMN_NAME}',\$item->{$data->COLUMN_NAME}) }}</td>";
- }elseif(dict()->get('global',$data->COLUMN_NAME)) {
- $listTdStr .= "\r\n <td>{{ dict()->get('global','{$data->COLUMN_NAME}',\$item->{$data->COLUMN_NAME}) }}</td>";
- }else{
- $listTdStr .= "\r\n <td>{{ \$item->{$data->COLUMN_NAME} }}</td>";
- }
- break;
- default:
- $listTdStr .= "\r\n <td>{{ \$item->{$data->COLUMN_NAME} }}</td>";
- 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);
- ###check
- $str = file_get_contents($this->_viewTpl . "/check.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);
- $str = str_replace("{{listThStr}}", $listThStr, $str);
- $str = str_replace("{{listTdStr}}", $listTdStr, $str);
- $ok = file_put_contents($this->_data['viewPath'] . "/check.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 <div class=\"list-group-item\">
- \r\n <h3 class=\"list-group-item-heading\">{$data->COLUMN_COMMENT}</h3>
- \r\n <p class=\"list-group-item-text\">";
- 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;
- default:
- $viewTdStr .= " {{ \$data['{$data->COLUMN_NAME}'] or ''}}";
- break;
- }
- $viewTdStr .= "</p>
- \r\n </div>";
- }
- $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 <div class=\"form-group\">
- \r\n <label class=\"control-label col-sm-3\">{$data->COLUMN_COMMENT}</label>
- \r\n <div class=\"col-sm-9\">";
- 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)
- <label class=\"radio-inline\">
- <input type=\"radio\" name=\"data[{$data->COLUMN_NAME}]\" value=\"\$key\" @if(isset(\$data['{$data->COLUMN_NAME}']) && \$data['{$data->COLUMN_NAME}'] == \$key)checked=\"checked\" @endif/>{{\$val}}
- </label>
- @endforeach";
- }elseif(dict()->get('global',$data->COLUMN_NAME)) {
- $editTdStr .= " @foreach(dict()->get('global','{$data->COLUMN_NAME}') as \$key=>\$val)
- <label class=\"radio-inline\">
- <input type=\"radio\" name=\"data[{$data->COLUMN_NAME}]\" value=\"\{{\$key}}\" @if(isset(\$data['{$data->COLUMN_NAME}']) && \$data['{$data->COLUMN_NAME}'] == \$key)checked=\"checked\" @endif/>{{\$val}}
- </label>
- @endforeach";
- }else{
- $editTdStr .= "\r\n <input id=\"data_{$data->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 <script id=\"container\" name=\"data[{$data->COLUMN_NAME}]\" type=\"text/plain\">{!! \$data['{$data->COLUMN_NAME}'] or '' !!}</script>
- ";
- break;
- case "datetime":
- $editTdStr .= "\r\n <input name=\"data[{$data->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'){
- $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 <input id=\"data_{$data->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 </div>
- \r\n </div>";
- }
- }
- $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);
- }
- }
- }
|