| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496 | <?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") $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 ="更新时间";            $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:                        $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);        }    }}
 |