diff --git a/app/admin/controller/Gen/Gen.php b/app/admin/controller/Gen/Gen.php
new file mode 100644
index 0000000..8a33200
--- /dev/null
+++ b/app/admin/controller/Gen/Gen.php
@@ -0,0 +1,2039 @@
+ 0,
+ 'msg' => '一键删除表成功!'
+ ];
+ } catch (\Throwable $th) {
+ throw $th;
+ }
+ }
+
+ //一键生成表
+ public function createTable()
+ {
+ try {
+ Db::execute("
+ CREATE TABLE `gen_table` (
+ `tableId` int(0) NOT NULL AUTO_INCREMENT COMMENT '编号',
+ `tableName` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '表名称',
+ `tableComment` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '表描述',
+ `className` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '实体类名称',
+ `tplCategory` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT 'crud' COMMENT '使用的模板(crud单表操作 tree树表操作)',
+ `moduleName` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '生成模块名',
+ `businessName` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '生成业务名',
+ `functionName` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '生成功能名',
+ `functionAuthor` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '生成功能作者',
+ `genType` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '生成代码方式(0zip压缩包 1自定义路径)',
+ `genPath` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '/' COMMENT '生成路径(不填默认项目路径)',
+ `options` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '其它生成选项',
+ `remark` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
+ `create_time` datetime(0) NULL DEFAULT NULL,
+ `create_user_guid` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
+ `update_time` datetime(0) NULL DEFAULT NULL,
+ `update_user_guid` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
+ `delete_time` datetime(0) NULL DEFAULT NULL,
+ `delete_user_guid` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
+ PRIMARY KEY (`tableId`) USING BTREE
+ ) ENGINE = InnoDB AUTO_INCREMENT = 79 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '生成表' ROW_FORMAT = DYNAMIC;
+ ");
+
+ Db::execute("
+ CREATE TABLE `gen_table_column` (
+ `columnId` int(0) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '编号',
+ `tableName` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '表名',
+ `tableId` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '归属表编号',
+ `columnName` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '列名称',
+ `columnComment` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '列描述',
+ `columnType` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '列类型',
+ `isPk` tinyint(1) NULL DEFAULT NULL COMMENT '是否主键(1是)',
+ `isIncrement` tinyint(1) NULL DEFAULT NULL COMMENT '是否自增(1是)',
+ `isRequired` tinyint(1) NULL DEFAULT NULL COMMENT '是否必填(1是)',
+ `isInsert` tinyint(1) NULL DEFAULT NULL COMMENT '是否为插入字段(1是)',
+ `isEdit` tinyint(1) NULL DEFAULT NULL COMMENT '是否编辑字段(1是)',
+ `isList` tinyint(1) NULL DEFAULT NULL COMMENT '是否列表字段(1是)',
+ `isQuery` tinyint(0) NULL DEFAULT NULL COMMENT '是否查询字段(1是)',
+ `isSort` tinyint(0) NULL DEFAULT NULL COMMENT '是否排序字段(1是)',
+ `queryType` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'EQ' COMMENT '查询方式(等于、不等于、大于、小于、范围)',
+ `htmlType` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件)',
+ `dictType` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '字典类型',
+ `sort` int(0) NULL DEFAULT NULL COMMENT '排序',
+ `isInit` tinyint(1) NULL DEFAULT 0 COMMENT '是否初始化字段(1是)',
+ `create_time` datetime(0) NULL DEFAULT NULL,
+ `create_user_guid` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
+ `update_time` datetime(0) NULL DEFAULT NULL,
+ `update_user_guid` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
+ `delete_time` datetime(0) NULL DEFAULT NULL,
+ `delete_user_guid` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
+ PRIMARY KEY (`columnId`) USING BTREE
+ ) ENGINE = InnoDB AUTO_INCREMENT = 534 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '生成表字段' ROW_FORMAT = DYNAMIC;
+ ");
+
+ return [
+ 'code' => 0,
+ 'msg' => '一键生成表成功!'
+ ];
+ } catch (\Throwable $th) {
+ throw $th;
+ }
+ }
+
+ // 获取所有表名称
+ public function getTatbleList(Request $request)
+ {
+ $data_base_name_arr = Db::query("select database()");
+ $tableName = $request->param('tableName');
+
+ // $select = Db::getTables();
+ $select = Db::query("show tables");
+ $selecJs = [];
+
+ $data_base_name = $data_base_name_arr[0]['database()'];
+
+ foreach ($select as $key => $value) {
+ array_push($selecJs, ['name' => $value["Tables_in_{$data_base_name}"]]);
+ }
+
+ $arr = [];
+ if ($tableName) {
+ foreach ($selecJs as $key => $value) {
+ if (strstr($value["name"], $tableName)) {
+ // return 1;
+ array_push($arr, $value);
+ }
+ }
+ }
+ if (count($arr) > 0) {
+ $selecJs = $arr;
+ }
+
+ $count = count($selecJs);
+ return [
+ 'code' => 200,
+ 'data' => [
+ 'pageIndex' => 1,
+ 'pageSize' => 10,
+ 'result' => $selecJs,
+ 'totalNum' => $count,
+ 'totalPage' => 1,
+ ],
+ 'msg' => 'SUCCESS'
+ ];
+ }
+
+ // 获取生成表列表
+ public function getGenTableList(Request $request)
+ {
+ $tableName = $request->param('tableName');
+ $search = [];
+ if ($tableName) {
+ $search['tableName'] = $tableName;
+ }
+
+ $select = Db::name('gen_table')
+ ->where($search)
+ ->order('tableId', 'desc');
+
+ $count = $select->count();
+ $select = self::pageWrapper($select)->select();
+
+ return [
+ 'code' => 0,
+ 'data' => $select,
+ 'count' => $count,
+ 'msg' => 'ok'
+ ];
+ }
+
+ // 获取生成表详情
+ public function getGenTableDetail(Request $request)
+ {
+ $tableId = $request->param('tableId');
+
+ $select = Db::name('gen_table')
+ ->where('tableId', $tableId)
+ ->find();
+
+ $columns = Db::name('gen_table_column')
+ ->where('tableId', $tableId)
+ ->select()->toArray();
+
+ $select['options'] = json_decode($select['options']);
+ foreach ($columns as $key => $value) {
+ $columns[$key]['isEdit'] = $this->intToBool($value['isEdit']);
+ $columns[$key]['isPk'] = $this->intToBool($value['isPk']);
+ $columns[$key]['isIncrement'] = $this->intToBool($value['isIncrement']);
+ $columns[$key]['isRequired'] = $this->intToBool($value['isRequired']);
+ $columns[$key]['isInsert'] = $this->intToBool($value['isInsert']);
+ $columns[$key]['isList'] = $this->intToBool($value['isList']);
+ $columns[$key]['isQuery'] = $this->intToBool($value['isQuery']);
+ $columns[$key]['isSort'] = $this->intToBool($value['isSort']);
+ $columns[$key]['isInit'] = $this->intToBool($value['isInit']);
+ }
+
+ return [
+ 'code' => 0,
+ 'data' => $select,
+ 'columns' => $columns,
+ 'msg' => 'ok'
+ ];
+ }
+
+ // 删除生成表
+ public function delTable(Request $request)
+ {
+ $params = $request->param();
+
+ $gen = Db::name('gen_table')->where([
+ 'tableId' => $params['tableId']
+ ]);
+ $id = $gen->find()['tableId'];
+ // return $gen->find()['tableId'];
+ $gen->delete();
+
+ $gen_column = Db::name('gen_table_column')->where('tableId', $id);
+ $gen_column->delete();
+
+ return [
+ 'code' => 200,
+ 'msg' => "删除成功"
+ ];
+ }
+
+ // 导入表
+ public function importTable(Request $request)
+ {
+ $tables = $request->param('tables');
+
+ // 初始化表数据
+ $tableInfo = Db::query("SHOW TABLE STATUS where Name = '$tables[0]'")[0];
+ $tabledata = $this->initTable($tableInfo);
+ // return $tabledata;
+ $id = Db::name('gen_table')->strict()->insertGetId($tabledata);
+
+ // 初始化字段数据
+ $fields = Db::getFields($tables[0]);
+
+ foreach ($fields as $value) {
+ // return $value;
+ $fieldsdata = $this->initFields($tables[0], $id, $value);
+ $fieldid = Db::name('gen_table_column')->strict()->insertGetId($fieldsdata);
+ }
+
+ return [
+ 'code' => 200,
+ 'msg' => '导入成功'
+ ];
+ }
+
+ /**
+ * 编辑生成
+ */
+ public function updateGenTable(Request $request)
+ {
+ $params = $request->param();
+ // return $params['options'];
+
+ $options = [
+ "ParentMenuId" => $params['ParentMenuId'],
+ "SortType" => $params['SortType'],
+ "SortField" => $params['SortField'],
+ "CheckedBtn" => $params['CheckedBtn'],
+ "ColNum" => $params['ColNum'],
+ ];
+
+ $model = Db::name('gen_table')->where([
+ 'tableId' => $params['tableId']
+ ])->update([
+ 'tableName' => $params['tableName'],
+ 'tableComment' => $params['tableComment'],
+ 'className' => $params['className'],
+ 'tplCategory' => $params['tplCategory'],
+ 'moduleName' => $params['moduleName'],
+ 'businessName' => $params['businessName'],
+ 'functionName' => $params['functionName'],
+ 'functionAuthor' => $params['functionAuthor'],
+ 'genType' => $params['genType'],
+ 'genPath' => $params['genPath'],
+ 'options' => json_encode($options),
+ 'remark' => $params['remark'],
+ ]);
+ // if (!$model) {
+ // throwErrorMsg("生成表不存在", 1);
+ // }
+ // $model->save($params);
+
+ $model2 = Db::name('gen_table_column')->where([
+ 'tableId' => $params['tableId']
+ ])->select();
+ if (!$model2) {
+ throwErrorMsg("生成表字段不存在", 1);
+ }
+ // return $model2;
+ foreach ($model2 as $key => $item1) {
+ // return $item1;
+ foreach ($params['columns'] as $key => $item2) {
+ if ($item1['columnId'] == $item2['columnId']) {
+ // return $item2;
+ // return var_dump($item2);
+ $item = Db::name('gen_table_column')->where([
+ 'columnId' => $item2['columnId']
+ ])->update($item2);
+ }
+ }
+ }
+
+ return [
+ 'code' => 200,
+ 'msg' => '编辑成功'
+ ];
+ }
+
+ // 生成代码入口
+ public function genCode(Request $request)
+ {
+ $tableId = $request->param('tableId');
+
+ $table = Db::name('gen_table')
+ ->where('tableId', $tableId)
+ ->find();
+
+ $columns = Db::name('gen_table_column')
+ ->where('tableId', $tableId)
+ ->select()->toArray();
+
+ $table['options'] = json_decode($table['options']);
+ foreach ($columns as $key => $value) {
+ $columns[$key]['isEdit'] = $this->intToBool($value['isEdit']);
+ $columns[$key]['isPk'] = $this->intToBool($value['isPk']);
+ $columns[$key]['isIncrement'] = $this->intToBool($value['isIncrement']);
+ $columns[$key]['isRequired'] = $this->intToBool($value['isRequired']);
+ $columns[$key]['isInsert'] = $this->intToBool($value['isInsert']);
+ $columns[$key]['isList'] = $this->intToBool($value['isList']);
+ $columns[$key]['isQuery'] = $this->intToBool($value['isQuery']);
+ $columns[$key]['isSort'] = $this->intToBool($value['isSort']);
+ $columns[$key]['isInit'] = $this->intToBool($value['isInit']);
+ }
+
+ // return $table;
+
+ try {
+ if ($table['tplCategory'] == "web_static") {
+ $this->createAdminController($columns, $table);
+ $this->createNewModel($columns, $table);
+ $this->createJsWebStaticIndex($columns, $table);
+ $this->createJsApi($columns, $table);
+ } else if ($table['tplCategory'] == "crud") {
+ $this->createAdminController($columns, $table);
+ $this->createNewModel($columns, $table);
+ $this->createJsVue($columns, $table);
+ $this->createJsAdd($columns, $table);
+ $this->createJsEdit($columns, $table);
+ $this->createJsDetail($columns, $table);
+ $this->createJsApi($columns, $table);
+ }
+ } catch (\Throwable $th) {
+ throw $th;
+ }
+
+ return [
+ 'code' => 200,
+ 'msg' => '生成成功'
+ ];
+ }
+
+ // 生成Api代码入口
+ public function codeGeneratorApi(Request $request)
+ {
+ $tableId = $request->param('tableId');
+
+ $table = Db::name('gen_table')
+ ->where('tableId', $tableId)
+ ->find();
+
+ $columns = Db::name('gen_table_column')
+ ->where('tableId', $tableId)
+ ->select()->toArray();
+
+ $table['options'] = json_decode($table['options']);
+ foreach ($columns as $key => $value) {
+ $columns[$key]['isEdit'] = $this->intToBool($value['isEdit']);
+ $columns[$key]['isPk'] = $this->intToBool($value['isPk']);
+ $columns[$key]['isIncrement'] = $this->intToBool($value['isIncrement']);
+ $columns[$key]['isRequired'] = $this->intToBool($value['isRequired']);
+ $columns[$key]['isInsert'] = $this->intToBool($value['isInsert']);
+ $columns[$key]['isList'] = $this->intToBool($value['isList']);
+ $columns[$key]['isQuery'] = $this->intToBool($value['isQuery']);
+ $columns[$key]['isSort'] = $this->intToBool($value['isSort']);
+ $columns[$key]['isInit'] = $this->intToBool($value['isInit']);
+ }
+
+ $this->createApiController($columns, $table, 2);
+
+ return [
+ 'code' => 200,
+ 'msg' => '生成成功'
+ ];
+ }
+
+ // 初始化表数据
+ private function initTable($tableInfo)
+ {
+ $options = [
+ "ParentMenuId" => 0,
+ "SortType" => "desc",
+ "SortField" => $tableInfo['Name'] . "_update_time",
+ "CheckedBtn" => [1, 2, 3, 5],
+ "ColNum" => 0,
+ ];
+
+ $tabledata = [
+ // 'tplCategory' => $tableInfo['tplCategory'],
+ 'tableName' => $tableInfo['Name'],
+ 'tableComment' => $tableInfo['Comment'],
+ 'className' => Tool::camelize($tableInfo['Name']),
+ 'businessName' => $tableInfo['Name'],
+ 'moduleName' => Tool::camelize($tableInfo['Name']),
+ 'functionName' => $tableInfo['Comment'],
+ 'functionAuthor' => 'admin',
+ 'genType' => 1,
+ 'genPath' => $this->address, // 自定义路径
+ 'options' => json_encode($options),
+ 'create_time' => date('Y-m-d H:i:s'),
+ ];
+ return $tabledata;
+ }
+
+ // 初始化字段数据
+ private function initFields($tableName, $id, $value)
+ {
+ // 初始字段
+ $inputDtoNoFieldArr = [
+ $tableName . "_" . "id",
+ $tableName . "_" . "guid",
+ $tableName . "_" . "create_time",
+ $tableName . "_" . "create_user_guid",
+ $tableName . "_" . "update_time",
+ $tableName . "_" . "update_user_guid",
+ $tableName . "_" . "delete_time",
+ $tableName . "_" . "delete_user_guid"
+ ];
+ // 查询字段
+ $ListFieldArr = [
+ $tableName . "_" . "create_time",
+ $tableName . "_" . "create_user_guid",
+ $tableName . "_" . "update_time",
+ $tableName . "_" . "update_user_guid",
+ $tableName . "_" . "delete_time",
+ $tableName . "_" . "delete_user_guid"
+ ];
+ // 图片字段
+ $imageFiledArr = [
+ $tableName . "_" . "icon",
+ $tableName . "_" . "img",
+ $tableName . "_" . "image",
+ $tableName . "_" . "url",
+ $tableName . "_" . "pic",
+ $tableName . "_" . "photo",
+ $tableName . "_" . "avatar"
+ ];
+ // 下拉框字段
+ $selectFiledArr = [
+ $tableName . "_" . "status",
+ $tableName . "_" . "type",
+ $tableName . "_" . "state",
+ $tableName . "_" . "sex",
+ $tableName . "_" . "gender"
+ ];
+ // 类型判断
+ $type = $this->FieldsType($value['type']);
+ $queryType = '';
+
+ if (in_array($value["name"], $inputDtoNoFieldArr)) $isInsert = false;
+ else $isInsert = true;
+
+ if (in_array($value["name"], $inputDtoNoFieldArr)) $isInit = true;
+ else $isInit = false;
+
+ if ($value["primary"] || $value["autoinc"] || in_array($value["name"], $inputDtoNoFieldArr)) $isEdit = false;
+ else $isEdit = true;
+
+ if (in_array($value["name"], $ListFieldArr)) $isList = false;
+ else $isList = true;
+
+ //时间类型初始化between范围查询
+ if ($value['type'] == "datetime") {
+ $queryType = "BETWEEN";
+ }
+
+ $fieldData = [
+ 'tableName' => $tableName,
+ 'tableId' => $id,
+ 'columnName' => $value["name"],
+ 'columnComment' => $value["comment"],
+ 'columnType' => $type,
+ 'isPk' => $value["primary"],
+ 'isIncrement' => $value["autoinc"],
+ 'isRequired' => $value["notnull"],
+ 'isInsert' => $isInsert,
+ 'isEdit' => $isEdit,
+ 'isList' => $isList,
+ 'isQuery' => false,
+ 'htmlType' => $this->FieldsHtmlType($value["name"], $tableName),
+ 'queryType' => $queryType,
+ 'isInit' => $isInit,
+ 'create_time' => date('Y-m-d H:i:s'),
+ ];
+
+ return $fieldData;
+ // return 6;
+ }
+
+ //生成模型
+ private function createNewModel($fields, $table)
+ {
+ $root = base_path(); //根地址
+ $model_path_name = $table['className'];
+
+ //模型路径并创建
+ $is_multiple = false;
+ $multiple_name = '';
+
+ $model_path = str_replace('/', DIRECTORY_SEPARATOR, $root . "common/model/" . $table['moduleName']);
+ if (true !== $res = $this->mkdir($model_path)) {
+ return $res;
+ }
+
+ $temp_path = str_replace('/', DIRECTORY_SEPARATOR, $root . 'resources/view/admin/model.tpl');
+ $gen_path = str_replace('/', DIRECTORY_SEPARATOR, $root . "common/model/" . $table['moduleName'] . '/' . $model_path_name . ".php"); //生成的模型地址\
+
+ $fieldArr = '';
+ foreach ($fields as $value) {
+ $fieldArr .= '
+ ' . '"' . $value['columnName'] . '"' . " => " . '"' . $value['columnType'] . '",' . "
+ ";
+ }
+
+ $checked_btn_arr = $table['options']->CheckedBtn; //其他选项 4:导出 6:导入
+ $init_fields = []; //初始化(业务字段) 例: user_name => 用户名称
+ foreach ($fields as $key => $val) {
+ if (!$val['isInit']) $init_fields[$val['columnName']] = $val['columnComment'];
+ }
+
+ //模型的示例代码
+ $tem_f = fopen($temp_path, "r");
+ $temp_str = fread($tem_f, filesize($temp_path));
+ self::getImportExcelTempStr($fields, $table, $init_fields, 'imp_mod');
+ $temp_str = str_replace(
+ [
+ '{$className}',
+ '{$moduleName}',
+ '{$businessName}',
+ '{$fields}',
+ '{$multiple_name}',
+ '{$exportExcelContent}',
+ '{$importExcelContent}',
+ '{$importExcelInitContent}',
+ '{$importExcelField}'
+ ],
+ [
+ $table['className'],
+ $table['moduleName'],
+ $table['businessName'],
+ $fieldArr,
+ $multiple_name,
+ in_array('4', $checked_btn_arr) ? self::getExportExcelTempStr($fields, $table, $init_fields, 'export_mod') : null,
+ in_array('6', $checked_btn_arr) ? self::getImportExcelTempStr($fields, $table, $init_fields, 'imp_mod') : null,
+ in_array('6', $checked_btn_arr) ? self::getImportExcelTempStr($fields, $table, $init_fields, 'imp_init') : null,
+ in_array('6', $checked_btn_arr) ? self::getImportExcelTempStr($fields, $table, $init_fields, 'imp_fie') : null,
+ ],
+ $temp_str
+ );
+ // return $temp_str;
+ $gen_model = fopen($gen_path, 'w');
+ fwrite($gen_model, $temp_str);
+ return true;
+ }
+
+ //生成后台控制器
+ private function createAdminController($fields, $table)
+ {
+ $root = base_path(); //根地址
+ $module_name = $table['moduleName']; //模块名
+ $class_name = $table['className']; //实体类名
+
+ //控制器模块构建
+ $con_path = str_replace('/', DIRECTORY_SEPARATOR, "{$root}admin/controller/{$module_name}");
+ if (true !== $res = $this->mkdir($con_path)) return $res;
+ //模板路径构建
+
+ if ($table['tplCategory'] == "crud") {
+ $temp_path = str_replace('/', DIRECTORY_SEPARATOR, "{$root}resources/view/admin/controller.tpl");
+ } else if ($table['tplCategory'] == "web_static") {
+ $temp_path = str_replace('/', DIRECTORY_SEPARATOR, "{$root}resources/view/business/webController.tpl");
+ }
+
+ //控制器生成后的路径构建
+ $gen_path = str_replace('/', DIRECTORY_SEPARATOR, "{$root}admin/controller/{$module_name}/{$class_name}.php");
+
+
+ $function_name = $table['functionName']; //功能名
+ $business_name = $table['businessName']; //业务名
+ $checked_btn_arr = $table['options']->CheckedBtn; //其他选项 4:导出 6:导入
+ $query_fields = []; //查询列表可显字段
+ $order_field = "'{$table['options']->SortField}'"; //排序字段
+ $order_mode = "'{$table['options']->SortType}'"; //排序方式
+ $edit_allow_fields = ["{$business_name}_update_user_guid"]; //编辑允许字段
+ $add_allow_fields = ["{$business_name}_guid", "{$business_name}_create_user_guid", "{$business_name}_update_user_guid"]; //新增允许字段
+ $where_content_arr = []; //列表查询条件
+ $init_fields = []; //初始化(业务字段)
+ $is_img_upload = false;
+ $add_require_fields = []; //新增必填字段
+ $edit_require_fields = []; //编辑必填字段
+ foreach ($fields as $key => $val) {
+ $column_name = $val['columnName'];
+ if (!$val['isInit']) $init_fields[$column_name] = $val['columnComment'];
+ if ($val['isList']) $query_fields[] = $column_name;
+
+ if ($val['isEdit'] && !in_array($column_name, $edit_allow_fields)) {
+ $edit_allow_fields[] = $column_name;
+ if ($val['isRequired']) $edit_require_fields[] = $column_name;
+ }
+ if ($val['isInsert'] && !in_array($column_name, $add_allow_fields)) {
+ $add_allow_fields[] = $column_name;
+ if ($val['isRequired']) $add_require_fields[] = $column_name;
+ }
+ if ($val['isQuery']) $where_content_arr[] = [$column_name, $val['queryType']];
+ if ($val['htmlType'] == 'imageUpload') $is_img_upload = true;
+ if ($val['htmlType'] == 'fileUpload') $is_file_upload = true;
+ }
+
+ //打开模板文件资源(只读)
+ $temp_res_r = fopen($temp_path, "r");
+ //获取模板内容
+ $temp_res_str = fread($temp_res_r, filesize($temp_path));
+ //模板内容替换
+ $temp_str = str_replace(
+ [
+ '{$moduleName}',
+ '{$className}',
+ '{$functionName}',
+ '{$businessName}',
+ '{$queryFields}',
+ '{$orderField}',
+ '{$orderMode}',
+ '{$editAllowFields}',
+ '{$addAllowFields}',
+ '{$whereContent}',
+ '{$exportExcelContent}',
+ '{$importExcelContent}',
+ '{$downloadTempContent}',
+ '{$editRequireFields}',
+ '{$addRequireFields}',
+ ],
+ [
+ $module_name,
+ $class_name,
+ $function_name,
+ $business_name,
+ self::toFormTempStr($query_fields, $init_fields),
+ $order_field ?? "'{$business_name}_update_time'",
+ $order_mode ?? "'desc'",
+ self::toFormTempStr($edit_allow_fields, $init_fields),
+ self::toFormTempStr($add_allow_fields, $init_fields),
+ self::toFormTempStr($where_content_arr, $init_fields, 3),
+ in_array('4', $checked_btn_arr) ? self::getExportExcelTempStr($fields, $table, $init_fields, 'export_con') : null,
+ in_array('6', $checked_btn_arr) ? self::getImportExcelTempStr($fields, $table, $init_fields, 'imp_con') : null,
+ in_array('6', $checked_btn_arr) ? self::getExportExcelTempStr($fields, $table, $init_fields, 'temp') : null,
+ self::toFormTempStr($edit_require_fields, $init_fields, 2),
+ self::toFormTempStr($add_require_fields, $init_fields, 2),
+
+ ],
+ $temp_res_str
+ );
+ //渲染(写入)文件
+ $gen_con = fopen($gen_path, 'w');
+ fwrite($gen_con, $temp_str);
+ return true;
+ }
+
+ //生成前台控制器
+ private function createApiController($fields, $table)
+ {
+ $root = base_path(); //根地址
+ $module_name = $table['moduleName']; //模块名
+ $class_name = $table['className']; //实体类名
+ $function_name = $table['functionName']; //功能名
+ $business_name = $table['businessName']; //业务名
+
+ //控制器模块构建
+ $con_path = str_replace('/', DIRECTORY_SEPARATOR, "{$root}api/controller/{$module_name}");
+ if (true !== $res = $this->mkdir($con_path)) return $res;
+ //模板路径构建
+ if ($table['tplCategory'] == "crud") {
+ $temp_path = str_replace('/', DIRECTORY_SEPARATOR, "{$root}resources/view/api/controller.tpl");
+ } else if ($table['tplCategory'] == "web_static") {
+ $temp_path = str_replace('/', DIRECTORY_SEPARATOR, "{$root}resources/view/business/webApiController.tpl");
+ }
+
+ //控制器生成后的路径构建
+ $gen_path = str_replace('/', DIRECTORY_SEPARATOR, "{$root}api/controller/{$module_name}/{$class_name}.php");
+
+ $query_fields = []; //查询列表可显字段
+ $order_field = "'{$table['options']->SortField}'"; //排序字段
+ $order_mode = "'{$table['options']->SortType}'"; //排序方式
+ $edit_allow_fields = ["{$business_name}_update_user_guid"]; //编辑允许字段
+ $add_allow_fields = ["{$business_name}_guid", "{$business_name}_create_user_guid", "{$business_name}_update_user_guid"]; //新增允许字段
+ $where_content_arr = []; //列表查询条件
+ $init_fields = []; //初始化(业务字段)
+ $add_require_fields = []; //新增必填字段
+ $edit_require_fields = []; //编辑必填字段
+ foreach ($fields as $key => $val) {
+ $column_name = $val['columnName'];
+ if (!$val['isInit']) $init_fields[$column_name] = $val['columnComment'];
+ if ($val['isList']) $query_fields[] = $column_name;
+ if ($val['isEdit'] && !in_array($column_name, $edit_allow_fields)) {
+ $edit_allow_fields[] = $column_name;
+ if ($val['isRequired']) $edit_require_fields[] = $column_name;
+ }
+ if ($val['isInsert'] && !in_array($column_name, $add_allow_fields)) {
+ $add_allow_fields[] = $column_name;
+ if ($val['isRequired']) $add_require_fields[] = $column_name;
+ }
+ if ($val['isQuery']) $where_content_arr[] = [$column_name, $val['queryType']];
+ }
+
+ //打开模板文件资源(只读)
+ $temp_res_r = fopen($temp_path, "r");
+ //获取模板内容
+ $temp_res_str = fread($temp_res_r, filesize($temp_path));
+ //模板内容替换
+ $temp_str = str_replace(
+ [
+ '{$moduleName}',
+ '{$className}',
+ '{$functionName}',
+ '{$businessName}',
+ '{$queryFields}',
+ '{$orderField}',
+ '{$orderMode}',
+ '{$editAllowFields}',
+ '{$addAllowFields}',
+ '{$whereContent}',
+ '{$imgUploadContent}',
+ '{$fileUpload}',
+ '{$imgUrlPrefixPadding}',
+ '{$editRequireFields}',
+ '{$addRequireFields}',
+ ],
+ [
+ $module_name,
+ $class_name,
+ $function_name,
+ $business_name,
+ self::toFormTempStr($query_fields, $init_fields),
+ $order_field ?? "'{$business_name}_update_time'",
+ $order_mode ?? "'desc'",
+ self::toFormTempStr($edit_allow_fields, $init_fields),
+ self::toFormTempStr($add_allow_fields, $init_fields),
+ self::toFormTempStr($where_content_arr, $init_fields, 3),
+ self::toFormTempStr($edit_require_fields, $init_fields, 2),
+ self::toFormTempStr($add_require_fields, $init_fields, 2),
+ ],
+ $temp_res_str
+ );
+ //渲染(写入)文件
+ $gen_con = fopen($gen_path, 'w');
+ fwrite($gen_con, $temp_str);
+ return true;
+ }
+
+ // Js版本 1.20
+
+ //生成JsVue页面
+ private function createJsVue($fields, $table)
+ {
+ $root = base_path(); //根地址
+
+ // return $table;
+ $vue_path = $table['genPath'] . DIRECTORY_SEPARATOR . "src" . DIRECTORY_SEPARATOR . "pages\index" . DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR . $table['businessName'];
+ $vue_compoment_path = $vue_path . DIRECTORY_SEPARATOR . "components";
+ if (true !== $res = $this->mkdir($vue_path)) {
+ return $res;
+ }
+ if (true !== $res = $this->mkdir($vue_compoment_path)) {
+ return $res;
+ }
+
+ // return $fields;
+ $columnsArr = "
+ {
+ fixed: true,
+ type: 'selection'
+ },";
+
+ $btn = '';
+ $btnFunName = '';
+ $btnFun = '';
+ $imgTemplate = '';
+ $search = '';
+ $dictFun = '';
+ $dict = '';
+ $dictScope = '';
+ $query = '';
+
+ $btn_arr = $table['options']->CheckedBtn; // 勾选按钮
+ // return $btn_arr;
+ foreach ($btn_arr as $key => $item) {
+ switch ($item) {
+ case 6:
+ $btn .= '
+
+
+ 导入
+
+
+
+ 下载导入模板
+ ';
+
+ $btnFunName .= ', downloadTemplate , importExcel ';
+
+ $btnFun .= '
+ // 导入方法
+ let loadingImoprt = null;
+ const uploadLoading = () => {
+ loadingImoprt = ElLoading.service({
+ lock: true,
+ text: "正在导入中...",
+ background: "rgba(255, 255, 255, 0.7)",
+ });
+ };
+ const closeUploadLoading = () => loadingImoprt.close();
+ const handleExcelSuccess = (value) => {
+ if (value.code == 0) {
+ ElMessageBox.alert(value.msg, "导入信息", {
+ dangerouslyUseHTMLString: true,
+ confirmButtonText: "确定",
+ });
+ } else {
+ ElMessage.error(value.msg);
+ }
+ closeUploadLoading();
+ tableRef.value.reload();
+ };
+
+ ';
+ break;
+ case 4:
+ $btn .= '
+
+ 导出
+ ';
+
+ $btnFunName .= ' , exportExcel';
+ break;
+ }
+ }
+
+ foreach ($fields as $value) {
+ if ($value['isList'] == true) {
+ if ($value['isInit'] == false) {
+ $columnsArr .= '
+ ' . '{
+ prop: "' . $value['columnName'] . '",
+ ' .
+ "label: '" . $value['columnComment'] . "',
+ " .
+ "width: '150'
+ },";
+ }
+ }
+
+ if ($value['isQuery'] == true) {
+ $query .= $value['columnName'] . ': "",
+ ';
+ }
+
+ if ($value['isQuery'] == true) {
+ if ($value['htmlType'] == "input") {
+ $search .= '
+ ' . '
+ ' . "
+ ";
+ }
+ if ($value['htmlType'] == "select") {
+ $search .= '
+ ' . '
+ ' . '
+
+
+ ';
+ }
+ }
+
+ if ($value['dictType'] != null) {
+ $dictFun = ", getDictionary";
+
+ $dictScope .= "
+
+
+
+ ";
+
+ $dict .= "
+ // 字典获取
+ const " . $value['dictType'] . " = ref([]);" . '
+ ' . "async function get_" . $value['dictType'] . "() {
+ await getDictionary({ dictionary_value: '" . $value['dictType'] . "'}).then((res) => {" . '
+ ' . $value['dictType'] . ".value = res
+ })
+ }" . '
+ ' .
+ "get_" . $value['dictType'] . "()";
+ }
+
+ if ($value['htmlType'] == 'imageUpload') {
+ $imgTemplate .= "
+ ' . '
+ ' . '
+ 暂无图片
+ ';
+ }
+ }
+ $columnsArr .= "
+ {
+ label: '操作',
+ prop: 'chaoz',
+ width: '250'
+ }";
+
+ // return $imgTemplate;
+
+ // //模型的示例代码
+ $temp_path = str_replace('/', DIRECTORY_SEPARATOR, $root . 'resources/view/jsVue/index.tpl');
+ $gen_path = $vue_path . DIRECTORY_SEPARATOR . "index.vue"; //生成Js的index.vue的地址
+ $tem_f = fopen($temp_path, "r");
+ $temp_str = fread($tem_f, filesize($temp_path));
+ $temp_str = str_replace(
+ [
+ '${functionName}',
+ '${moduleName}',
+ '${search}',
+ '${className}',
+ '${btn}',
+ '${imgTemplate}',
+ '${dictFun}',
+ '${cloumns}',
+ '${businessName}',
+ '${dict}',
+ '${btnFunName}',
+ '${btnFun}',
+ '${query}',
+ '${dictScope}'
+ ],
+ [
+ $table['functionName'],
+ $table['moduleName'],
+ $search,
+ $table['className'],
+ $btn,
+ $imgTemplate,
+ $dictFun,
+ $columnsArr,
+ $table['businessName'],
+ $dict,
+ $btnFunName,
+ $btnFun,
+ $query,
+ $dictScope
+ ],
+ $temp_str
+ );
+ // return $temp_str;
+ $gen_model = fopen($gen_path, 'w');
+ fwrite($gen_model, $temp_str);
+ return true;
+ }
+
+ //生成JsWebStaticIndex页面
+ private function createJsWebStaticIndex($fields, $table)
+ {
+ $root = base_path(); //根地址
+ $vue_path = $table['genPath'] . DIRECTORY_SEPARATOR . "src" . DIRECTORY_SEPARATOR . "pages\index" . DIRECTORY_SEPARATOR . $table['businessName'];
+ if (true !== $res = $this->mkdir($vue_path)) {
+ return $res;
+ }
+
+ $rulesArr = "";
+ $col = "";
+ $mapParm = '';
+ $mapFun = '';
+ $mapOpen = '';
+ $mapOpenFun = 'getContent()';
+
+ $col = $this->getCol($fields);
+
+ foreach ($fields as $value) {
+ if ($value['isInit'] == false) {
+ if ($value['isRequired'] == true) {
+ if ($value['isInsert'] == true) {
+ $rulesArr .=
+ $value['columnName'] . ": [
+ {
+ required: true,
+ message: '" . $value['columnComment'] . "不能为空'
+ }
+ ],
+ ";
+ }
+ }
+ }
+
+ if ($value['htmlType'] == "map") {
+ $mapParm = "const locationList = ref({})";
+
+ $mapFun = "
+ // 地址处理
+ if (!locationList.value.address) {
+ ElMessage.error('请选择{$value['columnName']}');
+ return
+ }
+ let locationData = locationList.value
+ formData.{$value['columnName']} = locationData.address
+ formData.longitude = locationData.longitude
+ formData.latitude = locationData.latitude
+ ";
+
+ $mapOpen = "
+ if (formData.value.longitude) {
+ locationList.value.address = formData.value.{$value['columnName']};
+ locationList.value.longitude = formData.value.longitude;
+ locationList.value.latitude = formData.value.latitude;
+ }
+ ";
+
+ $mapOpenFun = "
+ let mapCb = function(){
+ getContent()
+ }";
+ }
+ }
+
+ $temp_path = str_replace('/', DIRECTORY_SEPARATOR, $root . 'resources/view/business/webIndex.tpl');
+ $gen_path = $vue_path . DIRECTORY_SEPARATOR . "index.vue"; //生成Js的index.vue的地址
+ $tem_f = fopen($temp_path, "r");
+ $temp_str = fread($tem_f, filesize($temp_path));
+ $temp_str = str_replace(
+ [
+ '${functionName}',
+ '${className}',
+ '${rules}',
+ '${businessName}',
+ '${col}',
+ '${mapParm}',
+ '${mapFun}',
+ '${mapOpen}',
+ '${mapOpenFun}',
+ ],
+ [
+ $table['functionName'],
+ $table['className'],
+ $rulesArr,
+ $table['businessName'],
+ $col,
+ $mapParm,
+ $mapFun,
+ $mapOpen,
+ $mapOpenFun
+ ],
+ $temp_str
+ );
+ $gen_model = fopen($gen_path, 'w');
+ fwrite($gen_model, $temp_str);
+ return true;
+ }
+
+ //生成JsAdd添加页面
+ private function createJsAdd($fields, $table)
+ {
+ $root = base_path(); //根地址
+ $vue_compoment_path = $table['genPath'] . DIRECTORY_SEPARATOR . "src" . DIRECTORY_SEPARATOR . "pages\index" . DIRECTORY_SEPARATOR . $table['businessName'] . DIRECTORY_SEPARATOR . "components";
+
+ $rulesArr = "";
+ $col = "";
+ $dictFunName = '';
+ $dictFunName2 = '';
+ $dictFun = '';
+ $mapParm = '';
+ $mapFun = '';
+
+ $col = $this->getCol($fields);
+
+ foreach ($fields as $value) {
+ if ($value['isInit'] == false) {
+ if ($value['isRequired'] == true) {
+ if ($value['isInsert'] == true) {
+ $rulesArr .=
+ $value['columnName'] . ": [
+ {
+ required: true,
+ message: '" . $value['columnComment'] . "不能为空'
+ }
+ ],
+ ";
+ }
+ }
+ }
+
+ if ($value['dictType'] != null) {
+ $dictFunName = ", getDictionary";
+ $dictFunName2 .= "get_" . $value['dictType'] . "()" . '
+ ';
+
+ $dictFun .= "
+ // 字典获取
+ const " . $value['dictType'] . " = ref([]);" . '
+ ' . "async function get_" . $value['dictType'] . "() {
+ await getDictionary({ dictionary_value: '" . $value['dictType'] . "'}).then((res) => {" . '
+ ' . $value['dictType'] . ".value = res
+ })
+ }";
+ }
+
+ if ($value['htmlType'] == "map") {
+ $mapParm = "const locationList = ref({})";
+
+ $mapFun = "
+ // 地址处理
+ if (!locationList.value.address) {
+ ElMessage.error('请选择{$value['columnName']}');
+ return
+ }
+ let locationData = locationList.value
+ formData.{$value['columnName']} = locationData.address
+ formData.longitude = locationData.longitude
+ formData.latitude = locationData.latitude
+ ";
+ }
+ }
+
+ $temp_path = str_replace('/', DIRECTORY_SEPARATOR, $root . 'resources/view/jsVue/add.tpl');
+ $gen_path = $vue_compoment_path . DIRECTORY_SEPARATOR . "Add" . $table['className'] . 'Dialog' . ".vue"; //生成Js的index.vue的地址
+ $tem_f = fopen($temp_path, "r");
+ $temp_str = fread($tem_f, filesize($temp_path));
+ $temp_str = str_replace(
+ [
+ '${functionName}',
+ '${className}',
+ '${rules}',
+ '${businessName}',
+ '${dictFunName}',
+ '${dictFunName2}',
+ '${dictFun}',
+ '${col}',
+ '${mapParm}',
+ '${mapFun}',
+ ],
+ [
+ $table['functionName'],
+ $table['className'],
+ $rulesArr,
+ $table['businessName'],
+ $dictFunName,
+ $dictFunName2,
+ $dictFun,
+ $col,
+ $mapParm,
+ $mapFun,
+ ],
+ $temp_str
+ );
+ $gen_model = fopen($gen_path, 'w');
+ fwrite($gen_model, $temp_str);
+ return true;
+ }
+
+ //生成JsEdit编辑页面
+ private function createJsEdit($fields, $table)
+ {
+ $root = base_path(); //根地址
+
+ $vue_compoment_path = $table['genPath'] . DIRECTORY_SEPARATOR . "src" . DIRECTORY_SEPARATOR . "pages\index" . DIRECTORY_SEPARATOR . $table['businessName'] . DIRECTORY_SEPARATOR . "components";
+
+ // return $fields;
+ $rulesArr = "";
+ $dictFunName = '';
+ $dictFunName2 = '';
+ $dictFun = '';
+ $col = '';
+ $mapParm = '';
+ $mapFun = '';
+ $mapOpen = '';
+
+ $col = $this->getCol($fields);
+
+ foreach ($fields as $value) {
+ if ($value['isInit'] == false) {
+ if ($value['isRequired'] == true) {
+ if ($value['isEdit'] == true) {
+ $rulesArr .=
+ $value['columnName'] . ": [
+ {
+ required: true,
+ message: '" . $value['columnComment'] . "不能为空'
+ }
+ ],
+ ";
+ }
+ }
+ }
+
+ if ($value['dictType'] != null) {
+ $dictFunName = ", getDictionary";
+ $dictFunName2 .= "get_" . $value['dictType'] . "()" . '
+ ';
+
+ $dictFun .= "
+ // 字典获取
+ const " . $value['dictType'] . " = ref([]);" . '
+ ' . "async function get_" . $value['dictType'] . "() {
+ await getDictionary({ dictionary_value: '" . $value['dictType'] . "'}).then((res) => {" . '
+ ' . $value['dictType'] . ".value = res
+ })
+ }";
+ }
+
+ if ($value['htmlType'] == "map") {
+ $mapParm = "const locationList = ref({})";
+
+ $mapFun = "
+ // 地址处理
+ let locationData = locationList.value
+ formData.value.{$value['columnName']} = locationData.address
+ formData.value.longitude = locationData.longitude
+ formData.value.latitude = locationData.latitude
+ ";
+
+ $mapOpen = "
+ if (formData.value.longitude) {
+ locationList.value.address = formData.value.{$value['columnName']};
+ locationList.value.longitude = formData.value.longitude;
+ locationList.value.latitude = formData.value.latitude;
+ }
+ ";
+ }
+ }
+ // return $rulesArr;
+
+ $temp_path = str_replace('/', DIRECTORY_SEPARATOR, $root . 'resources/view/jsVue/edit.tpl');
+ $gen_path = $vue_compoment_path . DIRECTORY_SEPARATOR . "Edit" . $table['className'] . 'Dialog' . ".vue"; //生成Js的index.vue的地址
+ $tem_f = fopen($temp_path, "r");
+ $temp_str = fread($tem_f, filesize($temp_path));
+ $temp_str = str_replace(
+ [
+ '${functionName}',
+ '${className}',
+ '${rules}',
+ '${businessName}',
+ '${dictFunName}',
+ '${dictFunName2}',
+ '${dictFun}',
+ '${col}',
+ '${mapParm}',
+ '${mapFun}',
+ '${mapOpen}',
+ ],
+ [
+ $table['functionName'],
+ $table['className'],
+ $rulesArr,
+ $table['businessName'],
+ $dictFunName,
+ $dictFunName2,
+ $dictFun,
+ $col,
+ $mapParm,
+ $mapFun,
+ $mapOpen,
+ ],
+ $temp_str
+ );
+ // return $temp_str;
+ $gen_model = fopen($gen_path, 'w');
+ fwrite($gen_model, $temp_str);
+ return true;
+ }
+
+ //生成JsDetail详情页面
+ private function createJsDetail($fields, $table)
+ {
+ $root = base_path(); //根地址
+
+ $vue_compoment_path = $table['genPath'] . DIRECTORY_SEPARATOR . "src" . DIRECTORY_SEPARATOR . "pages\index" . DIRECTORY_SEPARATOR . $table['businessName'] . DIRECTORY_SEPARATOR . "components";
+
+ $dictFunName = '';
+ $dictFunName2 = '';
+ $dictFun = '';
+ $col = '';
+ $mapParm = '';
+ $mapOpen = '';
+
+ $col = $this->getCol($fields);
+
+ foreach ($fields as $key => $value) {
+ if ($value['dictType'] != null) {
+ $dictFunName = "import { getDictionary } from '~/service/{$table['businessName']}';";
+ $dictFunName2 .= "get_" . $value['dictType'] . "()" . '
+ ';
+
+ $dictFun .= "
+ // 字典获取
+ const " . $value['dictType'] . " = ref([]);" . '
+ ' . "async function get_" . $value['dictType'] . "() {
+ await getDictionary({ dictionary_value: '" . $value['dictType'] . "'}).then((res) => {" . '
+ ' . $value['dictType'] . ".value = res
+ })
+ }";
+ }
+ if ($value['htmlType'] == "map") {
+ $mapParm = "const locationList = ref({})";
+
+ $mapOpen = "
+ if (formData.value.longitude) {
+ locationList.value.address = formData.value.{$value['columnName']};
+ locationList.value.longitude = formData.value.longitude;
+ locationList.value.latitude = formData.value.latitude;
+ }
+ ";
+ }
+ }
+
+ $temp_path = str_replace('/', DIRECTORY_SEPARATOR, $root . 'resources/view/jsVue/detail.tpl');
+ $gen_path = $vue_compoment_path . DIRECTORY_SEPARATOR . "Detail" . $table['className'] . 'Dialog' . ".vue"; //生成的index.vue的地址
+ $tem_f = fopen($temp_path, "r");
+ $temp_str = fread($tem_f, filesize($temp_path));
+ $temp_str = str_replace(
+ [
+ '${functionName}',
+ '${className}',
+ '${businessName}',
+ '${dictFunName}',
+ '${dictFunName2}',
+ '${dictFun}',
+ '${col}',
+ '${mapParm}',
+ '${mapOpen}',
+ ],
+ [
+ $table['functionName'],
+ $table['className'],
+ $table['businessName'],
+ $dictFunName,
+ $dictFunName2,
+ $dictFun,
+ $col,
+ $mapParm,
+ $mapOpen,
+ ],
+ $temp_str
+ );
+ // return $temp_str;
+ $gen_model = fopen($gen_path, 'w');
+ fwrite($gen_model, $temp_str);
+ return true;
+ }
+
+ //生成Api页面
+ private function createJsApi($fields, $table)
+ {
+ $root = base_path(); //根地址
+
+ $vue_api_path = $table['genPath'] . DIRECTORY_SEPARATOR . "src" . DIRECTORY_SEPARATOR . "service";
+
+ // return $fields;
+
+ $urlStr = "";
+ $listArr = "";
+ $imageFun = "";
+ $fileFun = "";
+ $dictFun = "";
+
+ $excelFun = "";
+
+ $btn_arr = $table['options']->CheckedBtn; // 勾选按钮
+ // return $btn_arr;
+
+ foreach ($btn_arr as $key => $item) {
+ switch ($item) {
+ case 6:
+ $excelFun .= '
+ /**
+ * 下载' . $table['tableComment'] . '模板
+ * @param {Object} data
+ * @return {Promise} api
+ */
+ export function downloadTemplate(data) {
+ downloadFile(createApiUrl(' . "'" . $table['moduleName'] . "." . $table['className'] . "/downloadTemplate'), data);
+ }" . '
+
+ /**
+ * 导入' . $table['tableComment'] . '
+ * @param {Object} data
+ * @return {Promise} api
+ */
+ export const importExcel = createApiUrl(' . "'" . $table['moduleName'] . "." . $table['className'] . "/importExcel');
+ ";
+ break;
+ case 4:
+ $excelFun .= '
+ /**
+ * 导出' . $table['tableComment'] . '
+ * @param {Object} data
+ * @return {Promise} api
+ */
+ export function exportExcel(data) {
+ downloadFile(createApiUrl(' . "'" . $table['moduleName'] . "." . $table['className'] . "/exportExcel'), data);
+ }
+ ";
+ break;
+ }
+ }
+
+ foreach ($fields as $value) {
+ if ($value['isList'] == true) {
+ if ($value['isInit'] == false) {
+ $listArr .=
+ $value['columnName'] . ":" . self::FieldsJsType($value['columnType']) . ",
+ ";
+
+ if ($value['htmlType'] == 'imageUpload' || $value['htmlType'] == 'fileUpload') {
+ $urlStr = 'url: "",';
+ }
+ }
+
+ if ($value['dictType'] != null) {
+ $dictFun = "
+ /**
+ * 获取字典值
+ * @param {Object} data
+ * @return {Promise} api
+ */
+ export function getDictionary(data) {
+ return api.post('Dictionary.Dictionary/getDictionary', data, {
+ });
+ }
+ ";
+ }
+ // if ($value['htmlType'] == 'imageUpload') {
+ // $imageFun = "
+ // /**
+ // * 上传图片
+ // */
+ // export const upload" . $table['className'] . "Img = createApiUrl('" . $table['className'] . "." . $table['className'] . "/upload" . $table['className'] . "Img');
+ // ";
+ // }
+ // if ($value['htmlType'] == 'fileUpload') {
+ // $fileFun = "
+ // /**
+ // * 上传文件
+ // */
+ // export const upload" . $table['className'] . "File = createApiUrl('" . $table['className'] . "." . $table['className'] . "/upload" . $table['className'] . "File');
+ // ";
+ // }
+ }
+ }
+
+ if ($table['tplCategory'] == "web_static") $temp_path = str_replace('/', DIRECTORY_SEPARATOR, $root . 'resources/view/business/webApi.tpl');
+ else if ($table['tplCategory'] == "crud") $temp_path = str_replace('/', DIRECTORY_SEPARATOR, $root . 'resources/view/jsVue/api.tpl');
+ $gen_path = $vue_api_path . DIRECTORY_SEPARATOR . $table['businessName'] . ".js"; //生成的api的地址
+ $tem_f = fopen($temp_path, "r");
+ $temp_str = fread($tem_f, filesize($temp_path));
+ $temp_str = str_replace(
+ [
+ '${moduleName}',
+ '${functionName}',
+ '${className}',
+ '${businessName}',
+ '${list}',
+ '${imageFun}',
+ '${fileFun}',
+ '${dictFun}',
+ '${excelFun}',
+ '${urlStr}',
+ ],
+ [
+ $table['moduleName'],
+ $table['functionName'],
+ $table['className'],
+ $table['businessName'],
+ $listArr,
+ $imageFun,
+ $fileFun,
+ $dictFun,
+ $excelFun,
+ $urlStr,
+ ],
+ $temp_str
+ );
+ // return $temp_str;
+ $gen_model = fopen($gen_path, 'w');
+ fwrite($gen_model, $temp_str);
+ return true;
+ }
+
+
+
+ //创建文件夹
+ private function mkdir($path)
+ {
+ if (!is_dir($path)) {
+ if (false === @mkdir($path, 0777, true) && !is_dir($path)) {
+ throwErrorMsg('创建文件夹失败:' . $path);
+ }
+ }
+ return true;
+ }
+
+ //判断字段类型
+ private function FieldsType($type)
+ {
+ // return $type;
+ switch ($type) {
+ case strstr($type, 'int'):
+ return "int";
+ break;
+ case strstr($type, 'double'):
+ return "double";
+ break;
+ case strstr($type, 'varchar'):
+ return "string";
+ break;
+ case strstr($type, 'text'):
+ return "string";
+ break;
+ case strstr($type, 'datetime'):
+ return "datetime";
+ break;
+
+ default:
+ $type;
+ }
+ }
+
+ //判断Js字段类型
+ private function FieldsJsType($type)
+ {
+ switch ($type) {
+ case strstr($type, 'int'):
+ return "number";
+ break;
+ case strstr($type, 'decimal'):
+ return "number";
+ break;
+ case strstr($type, 'datetime'):
+ return "Date";
+ break;
+
+ default:
+ $type;
+ }
+ return $type;
+ }
+
+ //判断Js默认值字段类型
+ private function FieldsJsDefaultValue($type)
+ {
+ switch ($type) {
+ case strstr($type, 'string'):
+ return '""';
+ break;
+ case strstr($type, 'int'):
+ return "0";
+ break;
+ case strstr($type, 'decimal'):
+ return "0";
+ break;
+ case strstr($type, 'datetime'):
+ return 'null';
+ break;
+
+ default:
+ $type;
+ }
+ return "";
+ }
+
+ //判断HTML类型
+ private function FieldsHtmlType($name, $tableName)
+ {
+ // 图片字段
+ $imageFiledArr = [
+ $tableName . "_" . "icon",
+ $tableName . "_" . "img",
+ $tableName . "_" . "image",
+ $tableName . "_" . "url",
+ $tableName . "_" . "pic",
+ $tableName . "_" . "photo",
+ $tableName . "_" . "avatar"
+ ];
+ // 下拉框字段
+ $selectFiledArr = [
+ $tableName . "_" . "status",
+ $tableName . "_" . "type",
+ $tableName . "_" . "state",
+ $tableName . "_" . "sex",
+ $tableName . "_" . "gender"
+ ];
+ // 时间字段
+ $timeFiledArr = [
+ $tableName . "_" . "datetime",
+ $tableName . "_" . "time",
+ $tableName . "_" . "date",
+ $tableName . "_" . "timestamp"
+ ];
+
+
+ $htmlType = 'input';
+
+ if (in_array($name, $imageFiledArr)) {
+ $htmlType = "imageUpload";
+ } else if (in_array($name, $timeFiledArr)) {
+ $htmlType = "datetime";
+ } else if (strstr($name, 'content')) {
+ $htmlType = "editor";
+ } else if (in_array($name, $selectFiledArr)) {
+ $htmlType = "select";
+ }
+
+ return $htmlType;
+ }
+
+ public function intToBool($value)
+ {
+ return (bool)$value;
+ }
+
+
+ public function getCol($fields)
+ {
+ $col = '';
+
+ foreach ($fields as $value) {
+ if ($value['isList'] == true) {
+ if ($value['isInit'] == false) {
+ if ($value['htmlType'] == "input") {
+ $col .= '
+
+ ' . '
+ ' . "
+
+ ";
+ }
+ if ($value['htmlType'] == "textarea") {
+ $col .= '
+
+ ' . '
+ ' . "
+
+ ";
+ }
+ if ($value['htmlType'] == "select") {
+ $col .= '
+
+ ' . '
+ ' . '
+
+
+
+ ';
+ }
+ if ($value['htmlType'] == "datetime") {
+ $col .= '
+
+
+
+
+ ';
+ }
+ if ($value['htmlType'] == "imageUpload") {
+
+ $col .= "
+
+
+
+
+
+ ";
+ }
+ if ($value['htmlType'] == "fileUpload") {
+
+ $col .= "
+
+
+
+
+
+ ";
+ }
+ if ($value['htmlType'] == "editor") {
+ $col .= '
+
+ ' . '
+ ' . "
+
+ ";
+ }
+ if ($value['htmlType'] == "inputNumber") {
+ $col .= '
+
+ ' . '
+ ' . "
+
+ ";
+ }
+ if ($value['htmlType'] == "map") {
+ $col .= "
+
+
+
+
+
+ ";
+ }
+ }
+ }
+ }
+
+ return $col;
+ }
+
+
+ /**
+ * 数组转换为模板字符串
+ * @param array $arr 数组
+ * @param array $service_fields 业务字段
+ * @param int $type 模板字符类型 1:一维数组格式 2:验证器格式 3:列表条件查询 4:关联数组格式
+ */
+ private static function toFormTempStr(array $arr, array $service_fields, int $type = 1)
+ {
+ $str = "";
+ switch ($type) {
+ case 1:
+ $str = str_replace('##', "'", "[\n##" . implode("##,\n##", $arr) . "##\n]");
+ break;
+ case 2:
+ foreach ($service_fields as $key => &$val) {
+ foreach ($arr as $key1 => &$val1) {
+ if ($key == $val1) {
+ $val1 .= "|{$val}";
+ }
+ }
+ }
+ $str = str_replace('##', "'", "[\n##" . implode("##=>'require',\n##", $arr) . "##=>##require##\n]");
+ break;
+ case 3:
+ $str .= "\$con = Tool::getOptionalQuery(";
+ foreach ($arr as $key => $val) {
+ if ($val[1]) {
+ $str .= self::getListConditionalQuery($val[0], $val[1]);
+ }
+ };
+ $str .= ");";
+ break;
+ case 4:
+ foreach ($arr as $key => $val) {
+ $str .= "'{$key}' => '{$val}',\n";
+ }
+ $str = "[\n$str],";
+ break;
+ default:
+ break;
+ }
+ return $str;
+ }
+
+ /**
+ * 获取列表条件表达式查询对应模板字符串
+ * @param string $column_name 字段名
+ * @param string $ope 运算符
+ */
+ private static function getListConditionalQuery(string $column_name, string $ope): string
+ {
+ return [
+ 'LIKE' => self::geJsimpleExpTempStr($column_name, 'LIKE'),
+ 'BETWEEN' => self::geJsimpleExpTempStr($column_name, 'BETWEEN'),
+ 'EQ' => self::geJsimpleExpTempStr($column_name, '='),
+ 'LT' => self::geJsimpleExpTempStr($column_name, '<'),
+ 'LTE' => self::geJsimpleExpTempStr($column_name, '<='),
+ 'GTE' => self::geJsimpleExpTempStr($column_name, '>='),
+ 'GT' => self::geJsimpleExpTempStr($column_name, '>'),
+ 'NE' => self::geJsimpleExpTempStr($column_name, '!='),
+ ][$ope];
+ }
+
+ /**
+ * 获取简易表达式对应模板字符串
+ * @param string $column_name 字段名
+ * @param string $ope 运算符
+ */
+ private static function geJsimpleExpTempStr(string $column_name, string $ope): string
+ {
+ return "['{$column_name}','{$ope}'],";
+ }
+
+ /**
+ * 获取导出模板字符串
+ * @param array $fields 字段信息
+ * @param array $table 表信息
+ * @param array $init_fields 业务字段
+ * @param string $type 导出类型: export_con:导出-控制器 | export_mod:导出-模型层 | temp : 下载模板
+ */
+ private static function getExportExcelTempStr(array $fields, array $table, array $init_fields, string $type): string
+ {
+ $module_name = $table['moduleName']; //模块名 例:News
+ $function_name = $table['functionName']; //功能名 例:新闻
+ $business_name = $table['businessName']; //业务名 例:news
+ $class_name = $table['className']; //类名 例:News
+ $init_fields_arr = [];
+ $init_fields_text = [];
+ $data_str = '';
+
+ $img_field = false;
+ foreach ($fields as $key => $val) {
+ if ($val['htmlType'] == 'imageUpload') $img_field = $val['columnName'];
+ }
+
+ foreach ($init_fields as $key => $val) {
+ $init_fields_arr[] = $key;
+ $init_fields_text[] = $val;
+
+ if ($key == $img_field) {
+ $data_str .= "Excel::ExportImgFiled(\$val['$img_field']),\n";
+ } else {
+ $data_str .= "\$val['{$key}'],\n";
+ }
+ }
+ $data_str = "[\n{$data_str}]"; //导出数据模板字段
+ $init_fields_arr_str = self::toFormTempStr($init_fields_arr, $init_fields); //字段名(模板字符串)
+ $init_fields_text_str = self::toFormTempStr($init_fields_text, $init_fields); //字段注释(模板字符串)
+ switch ($type) {
+ case 'export_con':
+ $order_field = "'{$table['options']->SortField}'"; //排序字段
+ $order_mode = "'{$table['options']->SortType}'"; //排序方式
+ $order_field ?? $order_field = "'{$business_name}_update_time'";
+ $order_mode ?? $order_mode = "'desc'";
+ return "/**\n* 导出Excel\n*/
+ public function exportExcel(Request \$request)
+ {
+ \$params = \$request->param();
+ \$select = Model{$class_name}::field({$init_fields_arr_str})
+ ->order({$order_field}, $order_mode )
+ ->select();
+ return Model{$class_name}::exportExcel(\$select);
+ }";
+ case 'export_mod':
+ return "/**\n* 导出Excel\n*/
+ public static function exportExcel(\$select)
+ {
+ \$data = [{$init_fields_text_str}];
+ foreach (\$select as \$key => \$val) {
+ \$data[] = {$data_str};
+ }
+ \$excel = (new Excel())->exporTsheet(\$data);
+ \$excel->save('{$function_name}.xlsx');
+ }";
+ case 'temp':
+ return "/**\n* 下载导入模板\n*/
+ public function downloadTemplate(Request \$request)
+ {
+ \$params = \$request->param();
+ \$data = array_values(Model{$class_name}::EXCELFIELD);
+ \$excel = (new Excel())->exporTsheet(\$data);
+ \$excel->save('{$function_name}导入模板.xlsx');
+ }";
+ default:
+ break;
+ }
+ }
+
+ /**
+ * 获取有关文件上传的模板字符串
+ * @param array $table 表信息
+ * @param string $type 类型 img图片上传 file文件上传
+ * @param string $is_multiple 是否为多应用类型 false => 单应用 true =>多应用
+ */
+ private static function getFileUploadTempStr(array $table, string $type): string
+ {
+ $class_name = $table['className']; //类名 例:News
+
+ return [
+ 'img' =>
+ "/**\n* 上传图片\n*/
+ public function upload{$class_name}Img(Request \$request)
+ {
+ \$upload = new UploadFile('uploads', 'file');
+ \$path = \$upload->putFile('{$table['className']}Img');
+
+ return [
+ 'code' => 0,
+ 'data' => '/uploads/' . \$path,
+ 'msg' => '上传成功!'
+ ];
+ }",
+ 'file' =>
+ "/**\n* 上传文件\n*/
+ public function uploadFile(Request \$request): array
+ {
+ \$upload = new UploadFile('uploads', 'file');
+ \$path = \$upload->putFile('{$table['className']}File');
+ \$FileUrl = Env::get('自行替换.FileUrl');
+ return [
+ 'code' => 0,
+ 'data' => \$path,
+ 'url' => \$FileUrl,
+ 'msg' => '上传成功!'
+ ];
+ }"
+ ][$type];
+ }
+
+ /**
+ * 获取导入模板字符串
+ * @param array $fields 字段信息
+ * @param array $table 表信息
+ * @param array $init_fields 业务字段
+ * @param string $type 导出类型: imp_con:导入-控制器 | imp_mod:导入-模型层 | imp_init : 导入初始化 | imp_fie : 导入/下载模板表头
+ */
+ private static function getImportExcelTempStr(array $fields, array $table, array $init_fields, string $type): string
+ {
+ $module_name = $table['moduleName']; //模块名 例:News
+ $function_name = $table['functionName']; //功能名 例:新闻
+ $business_name = $table['businessName']; //业务名 例:news
+ $class_name = $table['className']; //类名 例:News
+
+ $fields_val_allocation_str = ""; //字段值分配
+ $add_fields_str = ""; //新增允许字段模板字符串
+ foreach ($init_fields as $field => $name) {
+ $fields_val_allocation_str .= "\${$field} = \$value['{$field}'];";
+ $add_fields_str .= "'{$field}' => \${$field},\n";
+ };
+ $add_fields_str = "[\n$add_fields_str]";
+
+ $init_fields_str = self::toFormTempStr($init_fields, $init_fields, 4);
+ $init_fields_str = substr($init_fields_str, 0, strlen($init_fields_str) - 1);
+ switch ($type) {
+ case "imp_con":
+ return "/**\n* 导入excel\n*/
+ public function importExcel(Request \$request)
+ {
+ \$file = new UploadFile('uploads', 'fileExt:xlsx');
+ \$file->putFile('{$business_name}');
+
+ \$msg = Model{$class_name}::importExcel(\$file);
+ return [
+ 'code' => 0,
+ 'msg' => \$msg
+ ];
+ }";
+ case "imp_mod":
+ return "/**\n* 导入excel\n*/
+ public static function importExcel(\$file)
+ {
+ \$msg = [];
+
+ Db::startTrans();
+ try {
+ \$excel = new Excel(\$file);
+ \$data = \$excel->parseExcel(
+ Tool::getExcelRule(self::EXCELFIELD),
+ [
+ 'titleLine' => [1]
+ ]);
+ if (!\$data) throwErrorMsg('excel无数据', 1);
+ \$msg = [];
+ foreach (\$data as \$line => \$value) {
+ try {
+ \$model = self::importExcelInit(\$value);
+ \$msg[] = \"{\$line} 新增成功!
\";
+ } catch (\Throwable \$th) {
+ \$msg[] = \"{\$line} {\$th->getMessage()}
\";
+ }
+ }
+ Db::commit();
+ return implode(', ', \$msg);
+ } catch (\Throwable \$th) {
+ Db::rollback();
+ throw \$th;
+ }
+ }";
+ case "imp_init":
+ return "/**\n* 导入excel初始化\n*/
+ public static function importExcelInit(\$value)
+ {
+ {$fields_val_allocation_str}
+ return self::create({$add_fields_str});
+ }";
+ case "imp_fie":
+ return "
+ // excel导入/下载模板表头
+ public const EXCELFIELD = {$init_fields_str};
+ ";
+ };
+ }
+}