| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 | <?php/** * Created by PhpStorm. * User: 中闽 < 1464674022@qq.com > * Date: 2019/12/5 * Time: 17:44 */namespace app\admin\controller;use app\admin\controller\base\Permissions;use file\FileHelper;use think\Db;class CodeGeneration extends Permissions{    /**     * @return mixed     */    public function index()    {        $dbName = \think\Env::get("db_name", "");        $prefix = \think\Env::get("db_prefix", "");        //排除核心表        $coreTables = ['admin', 'admin_cate', 'admin_log', 'admin_menu', 'urlconfig', 'webconfig', 'smsconfig', 'emailconfig', 'config', 'config_option', 'config_tab', 'catalog', 'cate_catalog'];        $filters = [];        foreach ($coreTables as $table) {            $filters[] = "'{$prefix}{$table}'";        }        $filter = implode(',', $filters);        $tables = Db::query("SELECT TABLE_NAME,TABLE_COMMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=? AND TABLE_NAME NOT IN ($filter)", [$dbName]);        $this->assign('tables', $tables);        return $this->fetch();    }    /**     * 获取字段信息     * @return array     */    public function getFieldsInfo()    {        if ($this->request->isAjax()) {            $post = $this->request->param();            $validate = new \think\Validate([                ['table', 'require|max:50', '请选择数据库表'],            ]);            if (!$validate->check($post)) {                $this->error('提交失败:' . $validate->getError());            }            $nameAndComment = explode('|', $post['table']);            $tableName = $nameAndComment[0]??'';            $data = $this->getFieldsInfoByTableName($tableName);            return array('code' => 0, 'count' => count($data), 'data' => $data);        }    }    /**     * 生成     */    public function generation()    {        $post = $this->request->post();        if ($this->request->isPost()) {            $validate = new \think\Validate([                ['table', 'require|max:50', '请选择数据库表'],            ]);            if (!$validate->check($post)) {                $this->error('提交失败:' . $validate->getError());            }        }        $nameAndComment = explode('|', $post['table']);        $tableName = $nameAndComment[0]??'';        $menuName = $nameAndComment[1] ?: $tableName;        $humpName = $this->getHumpName($tableName);        $underLineName = $this->getUnderLineName($tableName);        $fieldsInfo = $this->getFieldsInfoByTableName($tableName);        foreach ($fieldsInfo as $k => $item) {            $field = $item['Field'];            $fieldsInfo[$k]["ShowList"] = $post[$field . "_ShowList"]??'';            $fieldsInfo[$k]["ShowSearch"] = $post[$field . "_ShowSearch"]??'';            $fieldsInfo[$k]["ShowEdit"] = $post[$field . "_ShowEdit"]??'';            $fieldsInfo[$k]["Component"] = $post[$field . "_Component"];        }        $tpData = [            'fieldsInfo' => $fieldsInfo,            'humpName' => $humpName,            'underLineName' => $underLineName,            'menuName' => $menuName,            'tableName' => $tableName,            'crud' => $post['crud']??[],        ];        //模板文件目录        $tpdir = APP_PATH . 'admin' . DS . 'view' . DS . 'code_generation' . DS . 'tpl' . DS;        //生成文件路径        $ControllerPath = APP_PATH . 'admin' . DS . 'controller' . DS . $humpName . '.php';        $ModelPath = APP_PATH . 'common' . DS . 'model' . DS . $humpName . '.php';        $IndexPath = APP_PATH . 'admin' . DS . 'view' . DS . $underLineName . DS . 'index.html';        $PublishPaht = APP_PATH . 'admin' . DS . 'view' . DS . $underLineName . DS . 'publish.html';        if (!$this->request->has('cover')) {            //检查文件是否已存在            $checkMsg = "";            if (file_exists($ControllerPath)) {                $checkMsg .= str_replace(APP_PATH, '', $ControllerPath) . " 已存在" . '</br>';            }            if (file_exists($ModelPath)) {                $checkMsg .= str_replace(APP_PATH, '', $ModelPath) . " 已存在" . '</br>';            }            if (file_exists($IndexPath)) {                $checkMsg .= str_replace(APP_PATH, '', $IndexPath) . " 已存在" . '</br>';            }            if (array_key_exists('update', $tpData['crud']) or array_key_exists('create', $tpData['crud'])) {                if (file_exists($PublishPaht)) {                    $checkMsg .= str_replace(APP_PATH, '', $PublishPaht) . " 已存在" . '</br>';                }            }            if (!empty($checkMsg)) {                $checkMsg .= "<span style='color:red;'>确认生成并覆盖?</span>";                $this->error($checkMsg);            }        }        //生成controller        $content = $this->fetch($tpdir . 'AdminController.php.tp', $tpData);        FileHelper::save($ControllerPath, "<?php" . PHP_EOL . $content);        //生成model        $content = $this->fetch($tpdir . 'Model.php.tp', $tpData);        FileHelper::save($ModelPath, "<?php" . PHP_EOL . $content);        //生成index.html        $content = $this->fetch($tpdir . 'index.html.tp', $tpData);        FileHelper::save($IndexPath, $content);        //生成publish.html        if (array_key_exists('update', $tpData['crud']) or array_key_exists('create', $tpData['crud'])) {            $content = $this->fetch($tpdir . 'publish.html.tp', $tpData);            FileHelper::save($PublishPaht, $content);        }        $this->success("success");    }    /**     * 表名 转 驼峰命名     * @param $tableName     * @return string     */    protected function getHumpName($tableName)    {        $db_prefix = \think\Env::get("db_prefix", "");        //去除表前缀        $tableName = str_replace($db_prefix, '', $tableName);        //拆分,首字母大写        $trems = explode('_', $tableName);        $controllerName = "";        foreach ($trems as $trem) {            $controllerName .= ucfirst($trem);        }        return $controllerName ?: 'DefaultController';    }    /**     * 表名 转 下划线命名     * @param $tableName     * @return mixed     */    protected function getUnderLineName($tableName)    {        //去除表前缀即可        $db_prefix = \think\Env::get("db_prefix", "");        return str_replace($db_prefix, '', $tableName);    }    /**     * 获取字段信息     * @param $tableName     * @return array     */    protected function getFieldsInfoByTableName($tableName)    {        $dbName = \think\Env::get("db_name", "");        //读取字段信息        $infos = Db::query("desc " . $tableName);        //读取字段注释        $comments = Db::query("SELECT COLUMN_NAME,column_comment FROM INFORMATION_SCHEMA.Columns WHERE TABLE_NAME=? AND table_schema=?", [$tableName, $dbName]);        $data = [];        foreach ($infos as $k => $info) {            $data[$info['Field']] = $info;            $data[$info['Field']]['Comment'] = $comments[$k]['column_comment'];//这里不能保证两个数组顺序一致,后期有问题再修改        }        return $data;    }}
 |