| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646 |
- <?php
- // +----------------------------------------------------------------------
- // | RXThinkCMF框架 [ RXThinkCMF ]
- // +----------------------------------------------------------------------
- // | 版权所有 2017~2021 南京RXThinkCMF研发中心
- // +----------------------------------------------------------------------
- // | 官方网站: http://www.rxthink.cn
- // +----------------------------------------------------------------------
- // | Author: 牧羊人 <1175401194@qq.com>
- // +----------------------------------------------------------------------
- namespace App\Services;
- use App\Models\MenuModel;
- use Illuminate\Support\Facades\DB;
- /**
- * 代码生成器-服务类
- * @author 牧羊人
- * @since 2020/11/12
- * Class GenerateService
- * @package App\Services
- */
- class GenerateService extends BaseService
- {
- /**
- * 获取数据表
- * @return array
- * @since 2020/11/12
- * @author 牧羊人
- */
- public function getList()
- {
- $list = DB::select('SHOW TABLE STATUS');
- $list = json_decode(json_encode($list), true);
- $list = array_map('array_change_key_case', $list);
- return $message = array(
- "msg" => '操作成功',
- "code" => 0,
- "data" => $list,
- "count" => 100,
- );
- }
- /**
- * 一键生成模块文件
- * @return array
- * @since 2020/11/12
- * @author 牧羊人
- */
- public function generate()
- {
- // 参数
- $param = request()->all();
- // 数据表名
- $name = getter($param, "name");
- if (!$name) {
- return message("数据表名称不能为空", false);
- }
- // if ($name != DB_PREFIX . 'demo') {
- // return message("演示环境禁止操作", false);
- // }
- // 数据表名称
- $tableName = str_replace(DB_PREFIX, null, $name);
- // 模型名称
- $moduleName = str_replace(' ', null, ucwords(strtolower(str_replace('_', ' ', $tableName))));
- // 控制器名称
- $controllerName = ucfirst(strtolower(str_replace('_', '', $tableName)));
- // 数据表描述
- $comment = getter($param, "comment");
- if (!$comment) {
- return message("数据表名称不能为空", false);
- }
- // 去除表描述中的`表`
- if (strpos($comment, "表") !== false) {
- $comment = str_replace("表", null, $comment);
- $menuName = $comment;
- }
- // 去除表描述中的`管理`
- if (strpos($comment, "管理") !== false) {
- $comment = str_replace("管理", null, $comment);
- }
- // 作者花名
- $author = "牧羊人";
- // 生成模型
- $this->generateModel($author, $moduleName, $comment, $tableName);
- // 生成服务类
- $this->generateService($author, $moduleName, $comment, $tableName);
- // 生成控制器
- $this->generateController($author, $controllerName, $comment, $tableName);
- // 生成列表文件
- $this->generateVueIndex($comment, $moduleName, $tableName);
- // 生成菜单
- $this->generateMenu(strtolower(str_replace('_', '', $tableName)), $menuName);
- return message("模块生成成功");
- }
- /**
- * 生成模型
- * @param $author 作者
- * @param $moduleName 模块名
- * @param $moduleTitle 模块标题
- * @param $tableName 数据表名
- * @author 牧羊人
- * @since 2020/11/12
- */
- public function generateModel($author, $moduleName, $moduleTitle, $tableName)
- {
- // 判断是否有图片
- $moduleImage = false;
- // 获取数据列表
- $columnList = $this->getColumnList(DB_PREFIX . "{$tableName}");
- if ($columnList) {
- foreach ($columnList as &$val) {
- // 图片字段处理
- if (strpos($val['columnName'], "cover") !== false ||
- strpos($val['columnName'], "avatar") !== false ||
- strpos($val['columnName'], "image") !== false ||
- strpos($val['columnName'], "logo") !== false ||
- strpos($val['columnName'], "pic") !== false) {
- $val['columnImage'] = true;
- $moduleImage = true;
- }
- }
- }
- // 参数
- $param = [
- 'author' => $author,
- 'since' => date('Y/m/d', time()),
- 'moduleName' => $moduleName,
- 'moduleTitle' => $moduleTitle,
- 'tableName' => $tableName,
- 'columnList' => $columnList,
- 'moduleImage' => $moduleImage,
- ];
- // 存储目录
- $FILE_PATH = app_path() . '/Models';
- if (!is_dir($FILE_PATH)) {
- // 创建目录并赋予权限
- mkdir($FILE_PATH, 0777, true);
- }
- // 文件名
- $filename = $FILE_PATH . "/{$moduleName}Model.php";
- // 拆解参数
- extract($param);
- // 开启缓冲区
- ob_start();
- // 引入模板文件
- require(resource_path() . '/views/templates/model.blade.php');
- // 获取缓冲区内容
- $out = ob_get_clean();
- // 打开文件
- $f = fopen($filename, 'w');
- // 写入内容
- fwrite($f, "<?php " . $out);
- // 关闭
- fclose($f);
- }
- /**
- * 生成服务类
- * @param $author 作者
- * @param $moduleName 模块名
- * @param $moduleTitle 模块标题
- * @param $tableName 数据表
- * @author 牧羊人
- * @since 2020/11/12
- */
- public function generateService($author, $moduleName, $moduleTitle, $tableName)
- {
- // 判断是否有图片
- $moduleImage = false;
- // 查询条件
- $queryList = [];
- // 获取数据列表
- $columnList = $this->getColumnList(DB_PREFIX . "{$tableName}");
- if ($columnList) {
- foreach ($columnList as &$val) {
- // 图片字段处理
- if (strpos($val['columnName'], "cover") !== false ||
- strpos($val['columnName'], "avatar") !== false ||
- strpos($val['columnName'], "image") !== false ||
- strpos($val['columnName'], "logo") !== false ||
- strpos($val['columnName'], "pic") !== false) {
- $val['columnImage'] = true;
- $moduleImage = true;
- }
- // 下拉筛选
- if (isset($val['columnValue'])) {
- $queryList[] = $val;
- }
- // 名称
- if ($val['columnName'] == "name") {
- $queryList[] = $val;
- }
- // 标题
- if ($val['columnName'] == "title") {
- $queryList[] = $val;
- }
- }
- }
- // 参数
- $param = [
- 'author' => $author,
- 'since' => date('Y/m/d', time()),
- 'moduleName' => $moduleName,
- 'moduleTitle' => $moduleTitle,
- 'columnList' => $columnList,
- 'moduleImage' => $moduleImage,
- 'queryList' => $queryList,
- ];
- // 存储目录
- $FILE_PATH = app_path() . '/Services/';
- if (!is_dir($FILE_PATH)) {
- // 创建目录并赋予权限
- mkdir($FILE_PATH, 0777, true);
- }
- // 文件名
- $filename = $FILE_PATH . "/{$moduleName}Service.php";
- // 拆解参数
- extract($param);
- // 开启缓冲区
- ob_start();
- // 引入模板文件
- require(resource_path() . '/views/templates/service.blade.php');
- // 获取缓冲区内容
- $out = ob_get_clean();
- // 打开文件
- $f = fopen($filename, 'w');
- // 写入内容
- fwrite($f, "<?php " . $out);
- // 关闭
- fclose($f);
- }
- /**
- * 生成控制器
- * @param $author 作者
- * @param $moduleName 模块名
- * @param $moduleTitle 模块标题
- * @param $tableName 数据表名
- * @author 牧羊人
- * @since 2020/11/12
- */
- public function generateController($author, $moduleName, $moduleTitle, $tableName)
- {
- // 获取数据列表
- $columnList = $this->getColumnList(DB_PREFIX . "{$tableName}");
- // 参数
- $param = [
- 'author' => $author,
- 'since' => date('Y/m/d', time()),
- 'moduleName' => $moduleName,
- 'moduleTitle' => $moduleTitle,
- 'columnList' => $columnList,
- ];
- // 存储目录
- $FILE_PATH = app_path() . '\Http\Controllers';
- if (!is_dir($FILE_PATH)) {
- // 创建目录并赋予权限
- mkdir($FILE_PATH, 0777, true);
- }
- // 文件名
- $filename = $FILE_PATH . "/{$param['moduleName']}Controller.php";
- // 拆解参数
- extract($param);
- // 开启缓冲区
- ob_start();
- // 引入模板文件
- require(resource_path() . '/views/templates/controller.blade.php');
- // 获取缓冲区内容
- $out = ob_get_clean();
- // 打开文件
- $f = fopen($filename, 'w');
- // 写入内容
- fwrite($f, "<?php " . $out);
- // 关闭
- fclose($f);
- }
- /**
- * 生成列表文件
- * @param $moduleTitle 模块标题
- * @param $tableName 数据表名
- * @author 牧羊人
- * @since 2020/7/15
- */
- public function generateVueIndex($moduleTitle, $moduleName, $tableName)
- {
- // 获取数据列表
- $columnList = $this->getColumnList(DB_PREFIX . "{$tableName}");
- $queryList = [];
- if ($columnList) {
- foreach ($columnList as $val) {
- // 下拉筛选
- if (isset($val['columnValue'])) {
- $queryList[] = $val;
- }
- // 名称
- if ($val['columnName'] == "name") {
- $queryList[] = $val;
- }
- // 标题
- if ($val['columnName'] == "title") {
- $queryList[] = $val;
- }
- }
- }
- // 获取编辑表单数据源
- // 剔除非表单呈现字段
- $arrayList = [];
- $tempList = [];
- $rowList = [];
- $columnSplit = false;
- if ($columnList) {
- foreach ($columnList as $val) {
- // 记录ID
- if ($val['columnName'] == "id") {
- continue;
- }
- // 创建人
- if ($val['columnName'] == "create_user") {
- continue;
- }
- // 创建时间
- if ($val['columnName'] == "create_time") {
- continue;
- }
- // 更新人
- if ($val['columnName'] == "update_user") {
- continue;
- }
- // 更新时间
- if ($val['columnName'] == "update_time") {
- continue;
- }
- // 有效标识
- if ($val['columnName'] == "mark") {
- continue;
- }
- // 图片字段处理
- if (strpos($val['columnName'], "cover") !== false ||
- strpos($val['columnName'], "avatar") !== false ||
- strpos($val['columnName'], "image") !== false ||
- strpos($val['columnName'], "logo") !== false ||
- strpos($val['columnName'], "pic") !== false) {
- $val['columnUpload'] = true;
- $tempList[] = $val;
- continue;
- }
- // 多行文本输入框
- if (strpos($val['columnName'], "note") !== false ||
- strpos($val['columnName'], "content") !== false ||
- strpos($val['columnName'], "description") !== false ||
- strpos($val['columnName'], "intro") !== false) {
- $val['columnRow'] = true;
- $rowList[] = $val;
- continue;
- }
- // 由于目前时间字段采用int类型,所以这里根据字段描述模糊确定是否是时间选择
- if (strpos($val['columnComment'], "时间") !== false) {
- $val['dataType'] = 'datetime';
- } elseif (strpos($val['columnComment'], "日期") !== false) {
- $val['dataType'] = 'date';
- }
- // 图片字段处理
- if (strpos($val['columnName'], "cover") !== false ||
- strpos($val['columnName'], "avatar") !== false ||
- strpos($val['columnName'], "image") !== false ||
- strpos($val['columnName'], "logo") !== false ||
- strpos($val['columnName'], "pic") !== false) {
- $val['columnImage'] = true;
- }
- $arrayList[] = $val;
- }
- }
- if (count($arrayList) + count($tempList) + count($rowList) > 105) {
- $dataList = [];
- // 分两个一组
- $dataList = array_chunk($arrayList, 2);
- // 图片
- if (count($tempList) > 0) {
- array_unshift($dataList, $tempList);
- }
- // 多行文本
- if (count($rowList) > 0) {
- foreach ($rowList as $val) {
- $dataList[][] = $val;
- }
- }
- $columnList = $dataList;
- $columnSplit = true;
- } else {
- $dataList = $arrayList;
- // // 图片
- // if (count($tempList) > 0) {
- // array_unshift($dataList, $tempList);
- // }
- // 多行文本
- if (count($rowList) > 0) {
- foreach ($rowList as $val) {
- $dataList[][] = $val;
- }
- }
- $columnList = $dataList;
- $columnSplit = false;
- }
- // 参数
- $param = [
- 'moduleName' => $moduleName,
- 'moduleName2' => strtolower($moduleName),
- 'moduleTitle' => $moduleTitle,
- 'queryList' => $queryList,
- 'columnList' => $columnList,
- ];
- // 存储目录
- if (strpos($tableName, "_") !== false) {
- $tableName = str_replace('_', null, $tableName);
- }
- $FILE_PATH = ROOT_PATH . '/evui/src/views/system/' . strtolower($tableName);
- if (!is_dir($FILE_PATH)) {
- // 创建目录并赋予权限
- mkdir($FILE_PATH, 0777, true);
- }
- // 文件名
- $filename = $FILE_PATH . "/index.vue";
- // 拆解参数
- extract($param);
- // 开启缓冲区
- ob_start();
- // 引入模板文件
- require(resource_path() . '/views/templates/index.blade.php');
- // 获取缓冲区内容
- $out = ob_get_clean();
- // 打开文件
- $f = fopen($filename, 'w');
- // 写入内容
- fwrite($f, $out);
- // 关闭
- fclose($f);
- }
- /**
- * 生成字段列表
- * @param $tableName 数据表名
- * @return array
- * @author 牧羊人
- * @since 2020/11/12
- */
- public function getColumnList($tableName)
- {
- // 获取表列字段信息
- $columnList = DB::select("SELECT COLUMN_NAME,COLUMN_DEFAULT,DATA_TYPE,COLUMN_TYPE,COLUMN_COMMENT FROM information_schema.`COLUMNS` where TABLE_NAME like '{$tableName}'");
- $columnList = json_decode(json_encode($columnList), true);
- $fields = [];
- if ($columnList) {
- foreach ($columnList as $val) {
- $column = [];
- // 列名称
- $column['columnName'] = $val['COLUMN_NAME'];
- // 列默认值
- $column['columnDefault'] = $val['COLUMN_DEFAULT'];
- // 数据类型
- $column['dataType'] = $val['DATA_TYPE'];
- // 列描述
- if (strpos($val['COLUMN_COMMENT'], ':') !== false) {
- $item = explode(":", $val['COLUMN_COMMENT']);
- $column['columnComment'] = $item[0];
- // 拆解字段描述
- $param = explode(" ", $item[1]);
- $columnValue = [];
- $columnValueList = [];
- foreach ($param as $vo) {
- // 键值
- $key = preg_replace('/[^0-9]/', '', $vo);
- // 键值内容
- $value = str_replace($key, null, $vo);
- $columnValue[] = "{$key}={$value}";
- $columnValueList[] = $value;
- }
- $column['columnValue'] = implode(',', $columnValue);
- if ($val['COLUMN_NAME'] == "status" || substr($val['COLUMN_NAME'], 0, 3) == "is_") {
- $column['columnSwitch'] = true;
- $column['columnSwitchValue'] = implode('|', $columnValueList);
- if ($val['COLUMN_NAME'] == "status") {
- $column['columnSwitchName'] = "status";
- } else {
- $column['columnSwitchName'] = 'set' . str_replace(' ', null, ucwords(strtolower(str_replace('_', ' ', $val['COLUMN_NAME']))));
- }
- } else {
- $column['columnSwitch'] = false;
- }
- } else {
- $column['columnComment'] = $val['COLUMN_COMMENT'];
- }
- $fields[] = $column;
- }
- }
- return $fields;
- }
- /**
- * 生成模块菜单
- * @param $moduleName 模块名称
- * @param $moduleTitle 模块标题
- * @author 牧羊人
- * @since 2020/11/12
- */
- public function generateMenu($moduleName, $moduleTitle)
- {
- // 查询已存在的菜单
- $menuModel = new MenuModel();
- $info = $menuModel->getOne([
- ['permission', '=', "sys:{$moduleName}:view"],
- ]);
- $data = [
- 'id' => isset($info['id']) ? intval($info['id']) : 0,
- 'title' => $moduleTitle,
- 'icon' => 'el-icon-house',
- 'path' => "/system/{$moduleName}",
- 'component' => "/system/{$moduleName}",
- 'pid' => 154,
- 'type' => 0,
- 'permission' => "sys:{$moduleName}:view",
- ];
- $result = $menuModel->edit($data);
- if ($result) {
- // 去除表描述中的`管理`
- if (strpos($moduleTitle, "管理") !== false) {
- $moduleTitle = str_replace("管理", null, $moduleTitle);
- }
- // 创建节点
- $funcList = [1, 5, 10, 15, 25, 30];
- foreach ($funcList as $val) {
- $item = [];
- if ($val == 1) {
- // 查询列表
- $menuModel = new MenuModel();
- $info = $menuModel->getOne([
- ['pid', '=', $result],
- ['title', '=', "查询" . $moduleTitle]
- ]);
- $item = [
- 'id' => isset($info['id']) ? intval($info['id']) : 0,
- 'title' => "查询" . $moduleTitle,
- 'permission' => "sys:{$moduleName}:index",
- 'pid' => $result,
- 'type' => 1,
- 'status' => 1,
- 'sort' => $val,
- ];
- } else if ($val == 5) {
- // 添加
- $menuModel = new MenuModel();
- $info = $menuModel->getOne([
- ['pid', '=', $result],
- ['title', '=', "添加" . $moduleTitle]
- ]);
- $item = [
- 'id' => isset($info['id']) ? intval($info['id']) : 0,
- 'title' => "添加" . $moduleTitle,
- 'permission' => "sys:{$moduleName}:add",
- 'pid' => $result,
- 'type' => 1,
- 'status' => 1,
- 'sort' => $val,
- ];
- } else if ($val == 10) {
- // 修改
- $menuModel = new MenuModel();
- $info = $menuModel->getOne([
- ['pid', '=', $result],
- ['title', '=', "修改" . $moduleTitle]
- ]);
- $item = [
- 'id' => isset($info['id']) ? intval($info['id']) : 0,
- 'title' => "修改" . $moduleTitle,
- 'permission' => "sys:{$moduleName}:edit",
- 'pid' => $result,
- 'type' => 1,
- 'status' => 1,
- 'sort' => $val,
- ];
- } else if ($val == 15) {
- // 删除
- $menuModel = new MenuModel();
- $info = $menuModel->getOne([
- ['pid', '=', $result],
- ['title', '=', "删除" . $moduleTitle]
- ]);
- $item = [
- 'id' => isset($info['id']) ? intval($info['id']) : 0,
- 'title' => "删除" . $moduleTitle,
- 'permission' => "sys:{$moduleName}:delete",
- 'pid' => $result,
- 'type' => 1,
- 'status' => 1,
- 'sort' => $val,
- ];
- } else if ($val == 20) {
- // 状态
- $menuModel = new MenuModel();
- $info = $menuModel->getOne([
- ['pid', '=', $result],
- ['title', '=', "设置状态"]
- ]);
- $item = [
- 'id' => isset($info['id']) ? intval($info['id']) : 0,
- 'title' => "设置状态",
- 'permission' => "sys:{$moduleName}:status",
- 'pid' => $result,
- 'type' => 1,
- 'status' => 1,
- 'sort' => $val,
- ];
- } else if ($val == 25) {
- // 批量删除
- $info = $menuModel->getOne([
- ['pid', '=', $result],
- ['title', '=', "批量删除"]
- ]);
- $item = [
- 'id' => isset($info['id']) ? intval($info['id']) : 0,
- 'title' => "批量删除",
- 'permission' => "sys:{$moduleName}:dall",
- 'pid' => $result,
- 'type' => 1,
- 'status' => 1,
- 'sort' => $val,
- ];
- }
- $menuModel = new MenuModel();
- $menuModel->edit($item);
- }
- }
- }
- }
|