通用代码生成器“光船”发布了尝鲜版,并配套提供介绍视频。这个版本的重点不只是展示生成结果,而是继续打磨生成过程中的细节:统一使用 EasyUI 的 FileBox 作为代码生成物的上传控件,优化图片功能、哑数据模式和警告处理,同时加入更多测试并修复已发现的问题。
视频演示采用 xlsx 格式的 SGS2 模板,以“蛋糕船”示例展示从模板、数据到源码生成的完整过程。对于正在维护后台系统、表单页面或数据管理模块的开发者来说,这类工具的价值在于把重复的页面结构和代码组织方式固化下来,让新增业务更多变成配置和模板调整。
这次尝鲜版关注了什么
统一上传控件
生成器统一使用 EasyUI 的 FileBox 处理代码生成物上传。统一控件的意义在于减少不同页面之间的交互差异,也便于集中处理文件选择、上传参数、回调和错误提示。
可以这样实践一个最小的 EasyUI 上传控件。运行前请将 upload.php 替换为项目实际的上传接口,并确认接口能够处理 file 字段:
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="jquery-easyui/themes/default/easyui.css">
<link rel="stylesheet" href="jquery-easyui/themes/icon.css">
<script src="jquery-easyui/jquery.min.js"></script>
<script src="jquery-easyui/jquery.easyui.min.js"></script>
</head>
<body>
<input id="generatedFile" name="file" class="easyui-filebox"
data-options="
buttonText:'选择生成物',
prompt:'请选择文件',
accept:'.zip,.xlsx,.json',
onChange:function(newValue){
if (newValue) {
$('#uploadForm').submit();
}
}">
<form id="uploadForm" action="upload.php" method="post"
enctype="multipart/form-data" style="display:none">
<input name="file" type="file">
</form>
<script>
// 实际项目中建议在提交前检查扩展名、大小和登录状态。
$('#uploadForm').on('submit', function () {
return $('#generatedFile').filebox('getValue') !== '';
});
</script>
</body>
</html>
上面的代码只是可改造的最小示例。生产环境还需要在服务端重新校验文件类型和大小,不能只依赖浏览器的 accept 属性。对于生成器而言,上传控件还应明确区分模板文件、图片资源和最终生成包,避免用户误传文件后才在生成阶段发现问题。
图片、哑数据与警告
代码生成器经常遇到三类容易被忽略的细节:
- 图片字段是否能够正确映射到生成后的表单和数据结构。
- 没有接入真实数据库时,是否可以使用哑数据完成页面预览和流程测试。
- 模板中存在可接受的缺省值或未使用字段时,工具是否会输出大量难以判断的警告。
摘要中提到的优化,说明尝鲜版不仅关注“能不能生成”,也在关注生成结果是否便于继续开发。哑数据模式尤其适合早期验证:开发者可以先确认列表、详情、编辑和图片展示的结构,再接入真实数据源。
xlsx 模板为什么值得关注
视频演示使用 xlsx 格式的 SGS2 模板。把模板放在表格文件中,通常更适合描述字段、页面区域、数据类型和生成规则,因为业务人员、产品人员和开发者都能直接查看和修改表格内容。
不过,表格模板也带来几个工程约束:
- 工作表名称和列名需要稳定,否则生成器难以可靠识别规则。
- 空行、合并单元格和隐藏列可能改变解析结果,模板应尽量保持结构清晰。
- 模板需要版本管理,不能只依赖本地文件名判断兼容性。
- 生成器应在解析阶段报告具体的工作表、行号和字段名,而不是只显示“模板错误”。
如果要为模板增加一个简单的版本检查,可以在生成前约定元数据区域。例如,假设 SGS2 工作表的 A1 存放模板版本,下面的 Python 代码可以在生成前完成检查:
from pathlib import Path
from openpyxl import load_workbook
def check_sgs2_template(filename: str, expected_version: str = "SGS2") -> None:
path = Path(filename)
if not path.is_file():
raise FileNotFoundError(f"模板不存在: {path}")
if path.suffix.lower() != ".xlsx":
raise ValueError("模板必须是 .xlsx 文件")
workbook = load_workbook(path, read_only=True, data_only=True)
if "SGS2" not in workbook.sheetnames:
raise ValueError("模板缺少 SGS2 工作表")
sheet = workbook["SGS2"]
actual_version = sheet["A1"].value
if actual_version != expected_version:
raise ValueError(
f"模板版本不匹配: expected={expected_version}, actual={actual_version!r}"
)
if __name__ == "__main__":
# 将 cake-boat.xlsx 替换为实际模板路径。
check_sgs2_template("cake-boat.xlsx")
print("SGS2 模板检查通过,可以进入代码生成阶段")
运行前安装依赖:
python -m pip install openpyxl
python check_template.py
这段代码不代表“光船”内部的实现方式,而是一个可以放在生成流水线前面的模板校验示例。它把错误尽量提前到输入阶段,避免生成半成品后才定位问题。
用“蛋糕船”示例验证生成链路
“蛋糕船”示例的价值在于,它把抽象的代码生成过程变成了一个可以观察的样例。实际验证时,可以把流程拆成四个检查点:
- 模板检查:确认文件格式、工作表和关键字段存在。
- 数据检查:确认字段类型、图片字段和哑数据能够被解析。
- 生成检查:确认输出目录、文件名和目录结构符合预期。
- 运行检查:启动生成后的项目,检查上传、图片展示和基础页面交互。
可以使用一个简单的命令约定来固定生成流程。下面的命令是示意写法,请根据实际生成器的命令行参数调整:
set -e
TEMPLATE="cake-boat.xlsx"
OUTPUT="build/cake-boat"
python check_template.py "$TEMPLATE"
mkdir -p "$OUTPUT"
# 示例参数:实际工具可能使用不同的命令和选项。
lightship generate \
--template "$TEMPLATE" \
--mode dummy \
--output "$OUTPUT" \
--images ./assets/images
find "$OUTPUT" -maxdepth 2 -type f | sort
这里的 dummy 模式适合生成器的早期验收,但不应被当作真实业务数据测试的替代品。接入数据库、权限系统和文件存储后,还需要补充接口鉴权、异常上传、重复文件名、图片删除和大文件处理等测试。
采用前的检查清单
尝鲜版适合用来验证生成器的方向和模板设计。落地到团队项目时,可以保留一份小型回归样例,每次修改模板或生成规则都重新生成并比较结果。
建议至少检查以下内容:
- 是否统一了上传控件和上传接口的字段命名。
- 图片字段在列表、详情和编辑页面中的表现是否一致。
- 哑数据能否覆盖空列表、单条数据和多图片等边界情况。
- 警告是否包含文件、工作表、行号和字段名。
xlsx模板是否纳入版本控制,并有明确的兼容范围。- 生成结果是否可以通过自动化测试启动和访问。
- 真实环境中是否重新校验上传文件,而不是信任前端扩展名。
代码生成器最适合处理稳定、重复且规则明确的部分。对于高度定制的业务流程,生成结果仍需要人工审查。以 SGS2 模板和蛋糕船示例建立一条可重复的生成、运行、测试链路,通常比一次性追求复杂模板更容易维护,也更容易发现模板演进带来的回归问题。