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}; + "; + }; + } +}