Alpaca-Laravel 框架(三) --- 编写代码生成工具,自动生成代码

阅读:334 2019-03-19 14:43:56 来源:新网

代码自动生成工具(alpaca-builder)目的用来快速的编写代码,减少一些重复的工作。使用alpaca-laravel框架开发项目时,可以利用代码生成工具,快速的生成代码,减少工作时间,提高工作效率。

alpaca-spa-laravel是前后端分离开发的一个后台管理系统的demo。laravel用来实现后端功能,alpaca-spa用来实现前端功能,前后端之间通过json交换数据。

详情请阅读《alpaca-laravel框架(一)---概述,前后分离的后台管理系统》。

alpaca-builder使用灵活的模版格式来配置代码生成文件,如果现有的代码模版不能满足需求,只需要修改代码模版,或者新增代码模版即可。

主要功能是根据输入的数据库表名声生成一下内容:

1生成后端实体类2生成后端控制器3生成后端路由4生成前端js控制器5生成前端编辑页面6生成前端列表页面7生成配置接口url8选择是否复制到对应页面

访问方式,浏览器中输入地址:你的域名builder

(注意:只有当配置文件中app_env=local时,才容许访问)

你当然直接使用laravel的视图模板,在这里,我们编写一个简单的视图模版引擎,

主要的功能能,读取指定模版文件,将数据渲染到模版指定位置。

代码如下:

template=__dir__.'/template/'.$template.".php";//数据$newtpl->data=$data;//layout$newtpl->layout=static::layouttpl();//返回return$newtpl;}/***创建layout视图*@authorchengcheng*@paramstring$template视图模板名字*@paramarray$data视图数据*@date2016年11月5日14:47:40*@returnstatic*/publicstaticfunctionlayouttpl($template='layout',$data=null){//实例化新的对象$newtpl=newstatic;//设置视图$newtpl->template=__dir__.'/template/'.$template.".php";//数据$newtpl->data=$data;//返回return$newtpl;}/***创建视图*@authorchengcheng*@paramnull$data*@returnnull|string*@throwsexception*/publicfunctionhtml($data=null){//加载自己的模板if(!empty($this->data)){foreach($this->dataas$key=>$value){$this->$key=$value;}}//参数中的数据if(!empty($data)){foreach($dataas$key=>$value){$this->$key=$value;}}//读取模板中的信息$html=null;try{ob_start();require$this->template;$html=ob_get_clean();}catch(exception$ex){ob_end_clean();throw$ex;}//加载layout的模板if($this->layout){$html=$this->layout->html(['content'=>$html]);}//返回信息return$html;}}交互页面

编写一个交互页面,用来接受用户输入的数据库表名,生成的内容等。

alpaca-builder返回alpaca-builder首页设置配置

数据表名称
  • 表名前缀
  • 中文名称
  • 二级模块
  • 后端模块
  • 前端模块
  • 后端
    • 生成model
    • 生成controller
    • 配置router
    前端
    • list页面
    • edit页面
    • 前端controller
    • 配置接口url
    自动复制到对应目录
    • 复制到对应目录
    取消提交解析表结构

    根据输入的表名称,查询数据库,获取表结构,解析字段内容,然后格式化字段内容。

    publicfunctionbuilder(){$table_name=request()->input('table_name');$table_prefix=request()->input('table_prefix','');$table_name_cn=request()->input('table_name_cn');$sub_module_name=request()->input('sub_module_name');$b_module_name=request()->input('b_module_name','manage');$f_module_name=request()->input('f_module_name','admin');$is_init_model=request()->input('is_init_model');$is_init_b_controller=request()->input('is_init_b_controller');$is_init_b_router=request()->input('is_init_b_router');$is_init_list=request()->input('is_init_list');$is_init_edit=request()->input('is_init_edit');$is_init_f_controller=request()->input('is_init_f_controller');$is_init_inter=request()->input('is_init_inter');$is_auto_copy=request()->input('is_auto_copy',false);if(empty($table_name)){die('tablenameisnull!');}if(empty($table_name_cn)){$table_name_cn=$table_name;}$orgname=$table_name;$table=str_replace('','',$orgname);$classname=ucwords(str_replace(array('.','-','_'),'',$table));$modulename=explode(',',$classname)[0];if(!empty($sub_module_name)){$modulename=$sub_module_name;}$b_module_name=ucwords($b_module_name);$f_module_name=ucwords($f_module_name);$b_module_name_lc=lcfirst($b_module_name);$f_module_name_lc=lcfirst($f_module_name);$classname=str_replace('','',$classname);$classnamelc=lcfirst($classname);$modulenamelc=lcfirst($modulename);$result=db::select("showfullcolumnsfrom".$table_prefix.$table);$fields=[];foreach($resultas$r){if(in_array($r->field,$this->ignorefield)){continue;}$field=[];$field['db_type']=$r->type;$field['field']=$r->field;$field['comment']=$r->comment;$field['in_type']='string';$field['in_name']=$r->comment;$comment=str_replace(',',',',$r->comment);$comment=preg_replace("##",'',$comment);$array=explode(',',$comment);$field['in_common']=$array[0];if(!empty($array[1])){$typecontent=explode('|',$array[1]);switch($typecontent[0]){case'枚举':$field['in_type']='enum';$in_value=[];foreach($typecontentas$index=>$typecontentvalue){if($index==0){continue;}$key=explode('-',$typecontentvalue);$value=[];$value['value']=$key[0];$value['label']=(isset($key[1])?$key[1]:$key[0]);$value['key']=$field['field']."_".(isset($key[2])?$key[2]:(isset($key[1])?$key[1]:$key[0]));$value['common']='//'.$field['in_common'].":".(isset($key[1])?$key[1]:$key[0]);$value['const']='const'.strtoupper($value['key']).'='.$key[0].';'.$value['common'];array_push($in_value,$value);}$field['in_value']=$in_value;break;case'开关':$field['in_type']='switch';$in_value=[];foreach($typecontentas$index=>$typecontentvalue){if($index==0){continue;}$key=explode('-',$typecontentvalue);$value=[];$value['value']=$key[0];$value['label']=(isset($key[1])?$key[1]:$key[0]);$value['key']=$field['field']."_".(isset($key[2])?$key[2]:(isset($key[1])?$key[1]:$key[0]));$value['common']='//'.$field['in_common'].":".(isset($key[1])?$key[1]:$key[0]);$value['const']='const'.strtoupper($value['key']).'='.$key[0].';'.$value['common'];array_push($in_value,$value);}$field['in_value']=$in_value;break;case'富文本':$field['in_type']='rtext';break;default:{$field['in_type']='string';break;}}}array_push($fields,$field);}}生成代码

    读取相应的代码模版,填充数据字段内容,生成代码文件

    $viewresult=[];//创建目录$filepath=base_path()."\bootstrap\builder\output\{$table}\";if(!is_dir($filepath)){mkdir($filepath,0777,true);}$data=[];$data['tablename']="tb_".$table;$data['fields']=$fields;$data['classname']=$classname;$data['modulename']=$modulename;$data['classnamelc']=$classnamelc;$data['modulenamelc']=$modulenamelc;$data['b_module_name']=$b_module_name;$data['f_module_name']=$f_module_name;$data['b_module_name_lc']=$b_module_name_lc;$data['f_module_name_lc']=$f_module_name_lc;$data['orgname']=$orgname;//创建-modelif(!empty($is_init_model)){$view=view::tbl('model',$data);$view->layout=false;$html=$view->html();$filename=$filepath.$classname.'_m';$resultitem=[];$resultitem['title']='model-后端';$resultitem['filename']=$filename;array_push($viewresult,$resultitem);file_put_contents($filename,$html,lock_ex);/*拷贝到指定目录*//*后端模型,目录*/if($is_auto_copy){$models_dir=base_path()."\app\models\";$models_file_name=$classname;if(!file_exists($models_dir.$models_file_name.'.php')){copy($filename,$models_dir.$models_file_name.'.php');}else{copy($filename,$models_dir.$models_file_name.'');}}}//创建-controllerif(!empty($is_init_b_controller)){$view=view::tbl('controller',$data);$view->layout=false;$html=$view->html();$filename=$filepath.$classname.'_controller';$resultitem=[];$resultitem['title']='controller-后端';$resultitem['filename']=$filename;array_push($viewresult,$resultitem);file_put_contents($filename,$html,lock_ex);/*拷贝到指定目录*//*后端controller,目录*/if($is_auto_copy){$controller_dir=base_path()."\app\modules\{$b_module_name}\controllers\";$controller_file_name=$classname.'controller';if(!file_exists($controller_dir.$controller_file_name.'.php')){copy($filename,$controller_dir.$controller_file_name.'.php');}else{copy($filename,$controller_dir.$controller_file_name.'');}}}//创建-listif(!empty($is_init_list)){//创建-list_view$view=view::tbl('list_view',$data);$view->layout=false;$html=$view->html();$filename=$filepath.$classname.'_listview';$resultitem=[];$resultitem['title']='list页面-前端';$resultitem['filename']=$filename;array_push($viewresult,$resultitem);file_put_contents($filename,$html,lock_ex);/*拷贝到指定目录*//*前端controller,目录*/if($is_auto_copy){$display_dir=base_path()."\public\{$f_module_name_lc}\main\view\".$classnamelc."\";if(!is_dir($display_dir)){mkdir($display_dir,0777,true);}$display_file_name=$classnamelc.'listview';if(!file_exists($display_dir.$display_file_name.'.html')){copy($filename,$display_dir.$display_file_name.'.html');}else{copy($filename,$display_dir.$display_file_name.'');}}//创建-list_display$view=view::tbl('list_display',$data);$view->layout=false;$html=$view->html();$filename=$filepath.$classname.'_listdisplay';$resultitem=[];$resultitem['title']='list-table页面-前端';$resultitem['filename']=$filename;array_push($viewresult,$resultitem);file_put_contents($filename,$html,lock_ex);/*拷贝到指定目录*//*前端controller,目录*/if($is_auto_copy){$display_dir=base_path()."\public\{$f_module_name_lc}\main\view\".$classnamelc."\";if(!is_dir($display_dir)){mkdir($display_dir,0777,true);}$display_file_name=$classnamelc.'listdisplay';if(!file_exists($display_dir.$display_file_name.'.html')){copy($filename,$display_dir.$display_file_name.'.html');}else{copy($filename,$display_dir.$display_file_name.'');}}}//创建-edit-htmlif(!empty($is_init_edit)){$view=view::tbl('edit_html',$data);$view->layout=false;$html=$view->html();$filename=$filepath.$classname.'_editview';$resultitem=[];$resultitem['title']='edit-编辑页面-前端';$resultitem['filename']=$filename;array_push($viewresult,$resultitem);file_put_contents($filename,$html,lock_ex);/*拷贝到指定目录*//*前端controller,目录*/if($is_auto_copy){$edit_dir=base_path()."\public\{$f_module_name_lc}\main\view\".$classnamelc."\";if(!is_dir($edit_dir)){mkdir($edit_dir,0777,true);}$edit_file_name=$classnamelc.'editview';if(!file_exists($edit_dir.$edit_file_name.'.html')){copy($filename,$edit_dir.$edit_file_name.'.html');}else{copy($filename,$edit_dir.$edit_file_name.'');}}}//创建-controller-jsif(!empty($is_init_f_controller)){$view=view::tbl('controller_js',$data);$view->layout=false;$html=$view->html();$filename=$filepath.$classname.'_controller_js';$resultitem=[];$resultitem['title']='controller_js-前端';$resultitem['filename']=$filename;array_push($viewresult,$resultitem);file_put_contents($filename,$html,lock_ex);/*拷贝到指定目录*//*前端controller,目录*/if($is_auto_copy){$controller_js_dir=base_path()."\public\{$f_module_name_lc}\main\controller\";$controller_js_file_name=$classnamelc.'';if(!file_exists($controller_js_dir.$controller_js_file_name.'.js')){copy($filename,$controller_js_dir.$controller_js_file_name.'.js');}else{copy($filename,$controller_js_dir.$controller_js_file_name.'');}}}//创建-后台路由if(!empty($is_init_b_router)){//创建-router$view=view::tbl('router',$data);$view->layout=false;$html=$view->html();$filename=$filepath.$classname.'_router';$resultitem=[];$resultitem['title']='router_路由-后端';$resultitem['filename']=$filename;array_push($viewresult,$resultitem);file_put_contents($filename,$html,lock_ex);/*拷贝到指定目录*//*前端controller,目录*/if($is_auto_copy){$router_name=base_path()."\app\modules\{$b_module_name}\router.php";;if(!file_exists($router_name)){}else{file_put_contents($router_name,$html,file_append|lock_ex);}}}//创建-config_jsif(!empty($is_init_inter)){$view=view::tbl('config_js',$data);$view->layout=false;$html=$view->html();$filename=$filepath.$classname.'_config_js';$resultitem=[];$resultitem['title']='config_接口配置文件-前端';$resultitem['filename']=$filename;array_push($viewresult,$resultitem);file_put_contents($filename,$html,lock_ex);}//设置菜单$result['result']=$viewresult;$view=view::tbl('result',$result);$view->layout=false;echo$view->html();die();详细内容请参考源代码

    主页(alpaca-spa):http://www.tkc8.com

    后台(alpaca-spa-laravel):http://full.tkc8.com

    手机端sui(alpaca-spa-sui):http://full.tkc8.com/app

    代码(oschina):http://git.oschina.net/cc-sponge/alpaca-spa-laravel

    代码(github):https://github.com/big-sponge/alpaca-spa-laravel

    下一篇: Django【进阶篇 】
    相关文章
    {{ v.title }}
    {{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
    你可能感兴趣
    推荐阅读 更多>
    推荐商标

    {{ v.name }}

    {{ v.cls }}类

    立即购买 联系客服