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