如何搭建表单生成器
表单生成器让用户自行设计表单:选择字段、设置规则、发布链接,然后收集提交的内容。其底层包含三部分:以数据形式存储的表单定义、将定义转换为可用表单的渲染器,以及带有通知和导出功能的提交数据存储。在动手搭建之前,请先确认你是否真的需要它:如果你只需要一个联系表单或申请表,直接搭建该表单即可,无需构建生成器。
你真的需要生成器吗?
| 你的情况 | 应该搭建 |
|---|---|
| 一两个很少变动的表单 | 表单本身。参见如何添加联系表单。 |
| 由团队中的非开发人员创建的大量表单 | 内部表单生成器 |
| 表单是你产品的一部分(由客户创建表单) | 带账户、限额和嵌入功能的表单生成器 |
| 你主要想要调查结果和图表 | 调查应用 |
生成器是比单个表单大得多的项目,因为每种字段类型都必须在编辑器、公开表单、验证、存储、通知和导出中正常工作。
表单生成器需要什么
表单定义
将每个表单保存为字段列表,并以结构化数据存储(在Postgres的一列中保存JSON效果很好)。一个字段可能包含:
- id:稳定的ID,即使标签改变也永不变化
- type:文本、邮箱、数字、长文本、下拉选择、复选框、日期、文件
- label(标签)和帮助文字
- required(是否必填)、min / max(最小/最大值)、允许的文件类型
- 下拉字段的选项
- order(顺序),以及可选的条件(“仅当字段X为Y时显示”)
编辑器编辑这个列表,公开表单读取它。这就是整个核心思路:每个新表单都无需额外编写代码。
提交记录
- 提交:表单、表单版本、提交时间、以字段ID为键的答案、状态(新建、已读、已归档)。
- 文件:上传的文件应存放在文件存储中,提交记录中只保存引用,而不是把文件存在数据库行里。
页面
- 表单列表,显示提交数量。
- 编辑器:添加、排序和配置字段,旁边配有实时预览。
- 设置:确认消息或跳转、通知邮件、开放/关闭日期、提交数量上限。
- 公开表单,拥有独立链接,并提供可嵌入其他网站的版本。
- 提交表格,支持搜索、状态筛选、详情查看和CSV导出。
决策与取舍
版本控制。 总会有人在收到200份提交后把“电话”改成“手机号码”。如果答案以字段ID存储,并且每条提交都记录了表单版本,旧提交仍能正确显示。否则你的数据会悄悄错位。
验证要做两次。 在浏览器中检查字段,以便快速反馈;同时在服务器端再次检查,因为任何人都可以直接向你的端点发送数据。真正起作用的是服务器端的检查。
文件上传。 它会带来存储成本、大小限制、文件类型检查,以及隐私问题(简历、证件、医疗表格)。应限制文件类型和大小,并默认将上传的文件设为私有,只有表单所有者可以读取。参见如何为应用添加文件上传。
通知。 “有人提交时给我发邮件”是用户的基本期望。这需要邮件服务商和API密钥,参见如何从应用发送邮件。
垃圾提交。 公开表单一定会被机器人发现。请使用蜜罐字段(对人隐藏、机器人会填写)、按IP限流、服务器端验证,必要时加上验证码服务。
嵌入方式。 iframe嵌入是把表单放到他人网站上最简单、最安全的方式。脚本嵌入看起来更原生,但更难搭建,也更难保证安全。
条件逻辑。 “仅当……时显示此字段”很受欢迎,但会成倍增加测试工作量。应在基础功能稳定之后再添加。
一个有效的首次提示词
为我的团队搭建一个表单生成器网页应用。登录用户在带实时预览的编辑器中创建表单。字段类型:短文本、长文本、邮箱、数字、日期、单选下拉、复选框和文件上传。每个字段都有稳定的ID、标签、帮助文字、必填标记,以及特定类型的规则(最小/最大值、选项、允许的文件类型,以及10 MB的大小限制)。将表单定义以JSON存储,并带有每次发布递增的版本号。每个表单都有一个公开链接和一段iframe嵌入代码。服务器端根据已发布版本验证提交内容,以字段ID为键保存答案并记录表单版本,上传的文件放入私有文件存储。添加一个隐藏的蜜罐字段和按IP的限流。表单所有者可以看到提交表格,包含状态(新建、已读、已归档)、详情视图和CSV导出。所有数据存储在数据库中。条件逻辑和邮件通知留待以后再做。
搭建步骤
- 编辑器和定义。 构建一个包含所有字段类型的表单,并让代理查看保存的JSON。它是否干净、稳定?
- 公开表单。 在手机上填写一遍,检查验证提示和确认页面。
- 服务器端验证。 让代理绕过页面,直接向服务器发送一条违反规则的提交。它应该被拒绝。
- 版本控制。 在收到几条提交后,重命名和重新排序字段。旧提交仍应显示正确的答案。
- 上传。 尝试一个过大的文件和一个类型错误的文件。确认陌生人无法通过猜测链接打开已上传的文件。
- 提交表格和导出。 检查答案中包含逗号、换行和带重音字符时,CSV导出是否正确。
- 通知、嵌入、逻辑。 一次添加一项。
常见错误
- 按标签存储答案。 标签会变化。请使用稳定的字段ID。
- 只做浏览器端验证。 它只是便利功能,不能起到保护作用。
- 公开的上传文件。 表单经常收集人们不希望公开的文档。
- 没有垃圾提交防护。 公开表单可能在几天内就充满垃圾信息。
- 为一个表单搭建生成器。 直接做这个表单即可。
- 公开产品中提交不设上限。 如果客户可以创建表单,请按套餐设置限额,否则一个热门表单就可能让你的托管费用激增。
何时现成产品更合适
托管表单工具非常出色,对大多数需求来说价格也不高。它们已经解决了嵌入、垃圾提交、支付、集成以及数十种字段类型的无障碍访问等问题。如果你的团队只需要表单,请直接使用其中一款,参见Typeform替代方案和Google表单替代方案。
当提交数据需要与你自己的数据放在一起(例如为你运营的CRM或客户门户提供数据)、当你需要工具无法完成的提交后工作流、当数据存放位置或所有权是硬性要求,或者当表单是你所销售产品的一项功能时,建议自己搭建。
用Mythex搭建
在Mythex中,你可以在聊天中描述生成器,并在实时预览中并排测试编辑器和公开表单。Mythex会为表单定义和提交数据添加专用的数据库;当应用需要上传功能时,还会自动启用文件存储(免费套餐上限为1 GB)。通知邮件通过你使用自己密钥接入的服务商发送。将应用发布到mythex.ai链接(Pro套餐可使用自己的域名),公开表单链接即可从该地址正常工作。
常见问题
表单生成器如何存储表单?
通常以表单定义的形式保存:一个字段列表,每个字段包含类型、标签、验证规则和顺序,并以JSON等结构化数据存储。同一份定义同时驱动编辑器和公开表单,因此新增字段无需编写新代码。
表单提交应该如何存储?
保存每条提交时对应的表单版本,并以字段ID为键保存答案。这样之后重命名或调整字段顺序,都不会破坏旧的提交记录。
如何阻止公开表单上的垃圾提交?
结合使用隐藏的蜜罐字段、按IP地址限流、服务器端验证,如果垃圾提交仍然存在,再加上验证码服务。切勿只依赖浏览器端的检查。
我需要完整的表单生成器,还是只需要一个表单?
如果你只需要一两个固定表单,直接搭建这些表单即可,简单得多。只有当非技术人员需要自己创建和修改大量表单、而无需找开发人员时,表单生成器才值得投入。