提升效率:后台自动代码生成器

1.WHY

经常在项目开发中,都会涉及前端、后端、后台。前端调用后端(PHP、Python、JAVA等)来获取数据,进行前后端分离。然后公司管理人员在后台进行审核和相关的操作(增加、删除、编辑等),往往大部分时间都在做重复的工作,so,为了提升开发效率和更多的时间花在”重要但不紧迫“的事情上,故偷懒写此代码生成器,mark下。此代码生成器每个公司业务不一样,不能照搬,可根据公司业务自行开发。

2.HOW

一、模板文件:

<div id="content" class="content">
    <div class="row">
        <div class="col-md-12">
            {:get_alert()}
            <div class="panel panel-success" data-sortable-id="table-basic-7">
                <div class="panel-heading">
                    <div class="panel-heading-btn">
                        <a href="javascript:show_modal(0)" class="btn btn-add btn-xs"><i class="fa fa-plus"></i>新增|table_name|</a>
                    </div>
                    <h4 class="panel-title">|table_name|列表</h4>
                </div>
                <div class="panel-body">
                    <div class="table-responsive">
                        <table class="table">
                            <thead>
                            <tr>
                                |titles|
                            </tr>
                            </thead>
                            <tbody>
                            <foreach name="result" item="val" >
                                <tr>
                                    |foreach_fields|
                                </tr>
                            </foreach>
                            </tbody>
                        </table>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<script type="text/html" id="tpl_module_action">
    <div  class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
                <h4 class="modal-title"><%if(info){%>编辑<%}else{%>新增<%}%>|table_name|</h4>
            </div>
            <form class="form-horizontal" name="curForm" id="curForm" method="post" action="|action_url|">
                <div class="modal-body">
                    |action_fields|
                </div>
                <div class="modal-footer">
                    <button type="submit" class="btn btn-sm btn-success">提交</button>
                    <input type="hidden" name="id" value="<%if(info){ %><%=info.|pri_key|%><%}%>">
                </div>
            </form>
        </div>
    </div>
</script>

<div class="modal" id="page_modal">
</div>

<script type="text/javascript">

    //弹出二次窗口
    function show_modal(id) {
        var type = id ? 'edit' : 'add';
        //添加
        if(id <= 0){
           $('#page_modal').html(template('tpl_module_action')).modal({backdrop:'static'});
       }else{
           $.ajax({
               url : "|action_url|?id=" + id + '&type=' + type,
               type : 'GET',
               dataType : 'json',
               success : function(json){
                   if(json && json.code == 0){
                       $('#page_modal').html(template('tpl_module_action', {"info": json.data})).modal({backdrop:'static'});
                   }else{
                       alert('出错了,请联系技术。');
                   }
               }
           });
       }
   }
</script>
<script src="__ROOT__/Public/js/common.js?v=3534543"></script>
<script src="__ROOT__/Public/js/template-native.js?v=3454354"></script>
<script src="__ROOT__/Public/plugins/datePicker97/WdatePicker.js?v=3454354"></script>
<script>
    var position = 'bbs';
</script>
<include file="Common:webUpload" />

二、操作入口:

<?php
/**
 * Created by PhpStorm.
 * User: Alvin Tang
 * Date: 2017/2/16
 * Time: 14:31
 * Author: 442353346@qq.com
 */

namespace app\background\controller;

use think\Db;

class Index
{
    function __construct(){
    }
    /***
     * @return array 返回前端跳转类型 必须与前端对应
     */

    private function frontEndRedirectTypes(){
        return array(
            'news' => '新闻详情',
            'game' => '游戏详情',
            'forum' => '论坛帖子详情',
            'game_hot_type' => '热门游戏分类',
            'external' => '外部地址',
            'topic' => '圈子',
        );
    }

    /***
     * 访问入口,可访问该入口生成模板页面
     */

    public function index(){
        //操作地址,请自行修改这里
        $actionUrl = '{:U(\'Community/bannersAction\')}';
        //表名。请自行修改这里
        $tableName = 'b_banners';
        //获取表注释
        $queryTableCommentSql = 'Select table_name,TABLE_COMMENT from INFORMATION_SCHEMA.TABLES where table_name = \''. $tableName .'\';';
        //查询表注释结果
        $queryTableCommentResult = Db::query($queryTableCommentSql);

        if(empty($queryTableCommentResult)){
            $this->output('该表不存在');
        }
        $queryTableCommentResult = $queryTableCommentResult[0];
        //表注释
        $tableCommentStr = empty($queryTableCommentResult['TABLE_COMMENT']) ? '游戏中心' : $queryTableCommentResult['TABLE_COMMENT'];

        //获取表字段语句
        $sqlGetTableCols = 'SHOW FULL COLUMNS FROM ' . $tableName;

        $resultGetTableCols = Db::query($sqlGetTableCols);

        if(empty($resultGetTableCols)){
            $this->output('该表不存在字段');
        }
        //读取列表的模板文件
        $templateContent = file_get_contents(APP_PATH . 'background/static/template/list.html');#模板文件地址

        if(empty($templateContent)){
            $this->output('列表文件模板为空。');
        }
        //字段数组
        $colsCommentArr = array();
        //循环键值数组
        $foreachArr = array();
        //操作的字段(添加或者编辑)
        $actionArr = array();
        //主键字段
        $priField = 'id';
        //不需要显示的时间类型
        $hideTimeFields = array('inserttime', 'updatetime');
        //是否是图片
        $imgFields = array('img', 'img_rectangle', 'img_square');
        //图片索引
        $imgIndex = 0;
        //是否是跳转类型
        $linkUrlFields = array('jump_type');
        //列表的名称
        foreach ($resultGetTableCols as $value){
            //是否为时间类型
            $isTime = preg_match('/time/i', $value['Field']);
            //注释
            $tempTitleName = empty($value['Comment']) ? $value['Field'] : $value['Comment'];
            //主键,用于编辑、删除等
            if($value['Key'] == 'PRI'){
                $priField = $value['Field'];
                //复选框
                array_push($colsCommentArr, "<th width=\"30\"></th>");

                array_push($foreachArr, "<td><input type=\"checkbox\" name=\"check\" value=\"{\$val.{$priField}}\" class=\"checkbox\" /></td>");
            }else if(in_array($value['Field'], $imgFields)){//图片字段,需要显示上传控件

                $imgIndex++;

                array_push($actionArr, "<div class=\"form-group\">
                        <label class=\"col-md-4 control-label\"><font color=\"red\">* </font>{$tempTitleName}</label>
                        <div class=\"col-md-4\">
                            <img id=\"pic_show_{$imgIndex}\" src=\"<%if(info){%><%=info.{$value['Field']}%><%}else{%>http://xxx/Public/img/uploadicon.png<%}%>\" style=\"width:50px;height:50px;border-radius:5px;\"/>
                            <input type=\"hidden\" name=\"{$value['Field']}\" id=\"image_{$imgIndex}\" value=\"<%if(info){%><%=info.{$value['Field']}%><%}%>\"/>
                        </div>
                        <div class=\"col-md-2\">
                            <input class=\"btn btn-sm btn-success\" type=\"button\" onclick=\"show_img_modal({$imgIndex})\" value=\"上传\">
                        </div>
                    </div>"
);

            }else if(in_array($value['Field'], $linkUrlFields)){//跳转类型
                $optionArr = array();
                $locationTypes = $this->frontEndRedirectTypes();
                $optionArr[] = '<option value="">-请选择-</option>';
                foreach ($locationTypes as $keyLocation => $valueLocation){
                    $optionArr[] = "<option value=\"{$keyLocation}\" <%if(info && info.{$value['Field']} == \"{$keyLocation}\"){ %>selected<%}%> >{$valueLocation}</option>";
                }

                $optionStr = implode("\r\n", $optionArr);

                array_push($actionArr, "<div class=\"form-group\">
                        <label class=\"col-md-4 control-label\"><font color=\"red\">* </font>{$tempTitleName}</label>
                        <div class=\"col-md-5\">
                            <select name=\"{$value['Field']}\" class=\"form-control\">
                               {$optionStr}
                            </select>
                        </div>
                    </div>"
);
            }else{//其他默认为输入框字段

                $hideStr = in_array($value['Field'], $hideTimeFields) ? ' hide' : '';//隐藏字段
                $required = in_array($value['Field'], $hideTimeFields) ? '' : " required=\"required\"";//是否必填

                array_push($actionArr, "<div class=\"form-group{$hideStr}\">
                        <label class=\"col-md-4 control-label\"><font color=\"red\">* </font>{$tempTitleName}</label>
                        <div class=\"col-md-5\">
                            <input type=\"text\" class=\"form-control\" "
. ($isTime ? "onfocus=\"WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss'})\"" : '') ." name=\"{$value['Field']}\"{$required} value=\"<%if(info){%><%=info.{$value['Field']}%><%}%>\">
                        </div>
                    </div>"
);
            }

            array_push($colsCommentArr, "<th>{$tempTitleName}</th>");

            if($isTime){
                array_push($foreachArr, "<td>{\$val.{$value['Field']}|date='Y-m-d H:i:s',###}</td>");
            }else if(in_array($value['Field'], $imgFields)){
                array_push($foreachArr, "<td><img src='{\$val.{$value['Field']}}' style='width:50px;height:50px;border-radius:5px;'/> </td>");
            }else{
                array_push($foreachArr, "<td>{\$val.{$value['Field']}}</td>");
            }

            //排序字段
            if($value['Field'] == 'sort'){
                array_push($colsCommentArr, "<th>排序</th>");
                array_push($foreachArr, "<td><a href=\"{$actionUrl}?id={\$val.{$priField}}&type=sort&action=up\">上移</a>&nbsp;&nbsp;<a href=\"{$actionUrl}?id={\$val.{$priField}}&type=sort&action=down\">下移</a></td>");
            }
        }
        //标题的操作项
        array_push($colsCommentArr, "<th>操作</th>");
        //操作项
        array_push($foreachArr, "<td>
    <a href=\"javascript:show_modal({\$val.{$priField}})\" class=\"btn btn-xs btn-white m-r-5\" title=\"编辑\"><i class=\"fa fa-edit\"></i></a>
    <a href=\"{$actionUrl}?id={\$val.{$priField}}&type=del\" class=\"btn btn-xs btn-white\" title=\"删除\" onclick=\"if(confirm('确定删除吗?')==false){ return false;}\"><i class=\"fa fa-times\"></i></a>
    </td>"
);
        //替换变量
        $replaceArr = array(
            '|table_name|' => $tableCommentStr,
            '|titles|' => implode("\r\n", $colsCommentArr),
            '|foreach_fields|' => implode("\r\n", $foreachArr),
            '|pri_key|' => $priField,
            '|action_fields|' => implode("\r\n", $actionArr),
            '|action_url|' => $actionUrl,
        );
        //替换变量
        foreach ($replaceArr as $key => $value){
            $templateContent = str_replace($key, $value, $templateContent);
        }

        exit("<textarea rows='50' cols='100'>{$templateContent}</textarea>");
    }

    /***
     * 输出
     * @param $str
     */

    private function output($str){
        echo '<h1>'. $str .'</h1>';
        exit();
    }
}

三、后台列表:

    /***
     * 社区首页轮播图
     */

    public function bannersList(){
        $tempMod = $this->myBannersMod;
        $result = $tempMod->order('sort')->select();
        $this->assign('result', $result);
        $this->display( 'home_banners' );
    }

四、后台操作:

/***
     * 轮播图操作
     */

    public function bannersAction(){
        $id = intval(I('id', 0));
        $tempMod = $this->myBannersMod;
        $listUrl = 'Community/bannersList?';
        //提交数据
        if($_POST){
            unset($_POST['id']);
            if($id > 0){//编辑
                if(isset($_POST['updatetime'])){
                    $_POST['updatetime'] = time();
                }
                $result = $tempMod->where(array('id' => $id))->save($_POST);
            }else{
                if(isset($_POST['inserttime'])){
                    $_POST['inserttime'] = time();
                }
                $result = $tempMod->add($_POST);
            }
            empty($result) ? $this->mySetAlert('danger', '', '操作成功.') : $this->mySetAlert();
            redirect(U($listUrl . http_build_query($_GET)));
        }else{
            $type = I('type', 'add');
            if($id > 0){
                if($type == 'edit'){
                    $result = $tempMod->where(array('id' => $id))->find();
                    $this->outputJson(empty($result) ? 1 : 0, '', '', $result);
                }else if($type == 'del'){
                    $result = $tempMod->where(array('id' => $id))->delete();
                    empty($result) ? $this->mySetAlert('danger', '', '操作失败.') : $this->mySetAlert();
                    redirect(U($listUrl . http_build_query($_GET)));
                }else if($type == 'sort'){
                    $action = I('action', 'up');
                    $result = ($action == 'up' ? $tempMod->where(array('id' => $id))->setDec('sort') : $tempMod->where(array('id' => $id))->setInc('sort'));
                    empty($result) ? $this->mySetAlert('danger', '', '操作失败.') : $this->mySetAlert();
                    redirect(U($listUrl . http_build_query($_GET)));
                }
            }
        }
    }

3.WHAT

 

 

Leave a Comment