需求
在一些场景中,我们需要用到pdf文件作为表单模板,移动端可以获取到这个pdf文件的表单,在移动端填写完表单后,填充表单数据并生成新的pdf文件作为附件可做预览。
需求分析
理解完上面的需求,我们大致有几个工作要做
- 管理pdf模板,但是同一个pdf可以有多个版本,版本之间可切换
- 存储pdf模板的表单字段可供查询
- 存储提交上来的表单数据到每个版本的数据表
- 填充pdf模板数据并生成附件文件
数据库设计
在设计数据库之前,我们先来考虑几个问题
-
pdf可能会有多页,该如何处理
有些pdf模板是不止一页的,而且某些页数也是根据表单字段填写的长度来进行续页,比如一个字段有2000字,而我第二页都是这个字段,但是放不下2000个字,那么就要采用续页的形式继续填写,这时候总页数就会变。所以如果是多页的情况,我们需要对这个模板进行拆分,所以我们需要把每一页当成一个pdf模板的一个子表数据,并且需要有判断这一页是否多页的条件。
-
每一页的字段需要有很多属性
比如说这个字段最大输入长度是多少,因为在模板上我们设置文本域的时候,它是一个框,如果文字超过了框的长度,我们就需要换行显示或者截断这个文本框的内容。所以把每一页的字段当成每一页的子表数据。
我们大致可以设计这几张表
-
模板管理表base_template
主要pdf模板文件的版本和数据表表名(这个作为同一个pdf模板的唯一标识)
CREATE TABLE `base_template` (
`id` varchar(50) NOT NULL,
`name` varchar(200) DEFAULT NULL COMMENT '名称',
`version` varchar(20) DEFAULT NULL COMMENT '版本号',
`table_name` varchar(200) DEFAULT NULL COMMENT '表名',
`is_default` tinyint(1) DEFAULT NULL COMMENT '是否默认版本',
`create_user` varchar(50) DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
`update_user` varchar(50) DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='模板管理表';
-
模板详情表base_template_item
存储pdf模板每一页的数据,存储文件信息以及是否多页的条件判断存储
CREATE TABLE `base_template_item` ( `id` varchar(50) NOT NULL, `is_multi` tinyint(1) DEFAULT NULL COMMENT '是否多页1是0否', `condition_field` varchar(100) DEFAULT NULL COMMENT '多页的判断字段', `multi_condition` varchar(500) DEFAULT NULL COMMENT 'spring表达式判断条件', `display_num` tinyint(2) DEFAULT NULL COMMENT '排序号', `fields` varchar(3000) DEFAULT NULL, `file_name` varchar(500) DEFAULT NULL COMMENT '文件名', `file_size` int(11) DEFAULT NULL COMMENT '文件大小', `file_path` varchar(200) DEFAULT NULL COMMENT '文件路径', `parent_id` varchar(50) DEFAULT NULL COMMENT '模板id', `create_user` varchar(50) DEFAULT NULL, `create_time` datetime DEFAULT NULL, `update_user` varchar(50) DEFAULT NULL, `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_parentId` (`parent_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='模板详情';
-
模板字段详情表base_template_item_info
存储字段的详细信息
CREATE TABLE `base_template_item_info` ( `id` varchar(50) NOT NULL, `name` varchar(200) DEFAULT NULL COMMENT '字段名', `field_size` int(11) DEFAULT NULL COMMENT '字段最大长度', `is_required` tinyint(1) DEFAULT NULL COMMENT '是否必输', `field_type` tinyint(2) DEFAULT NULL COMMENT '字段类型', `multi_line_field` varchar(100) DEFAULT NULL COMMENT '多行取值的字段名', `parent_id` varchar(50) DEFAULT NULL COMMENT 'pdf模板文件', `condition` varchar(500) DEFAULT NULL COMMENT '多行的截取字段的表达式', `field_remark` varchar(500) DEFAULT NULL COMMENT '字段备注,例如是下拉框的时候,备注写的是下拉框的值列表', `is_default_take` tinyint(1) DEFAULT NULL COMMENT '是否默认取值,移动端使用', `default_take_name` varchar(50) DEFAULT NULL COMMENT '默认取值的字段名,请用驼峰', `pre_name` varchar(200) DEFAULT NULL COMMENT '字段名,移动端左侧显示的名称', `hint_name` varchar(200) DEFAULT NULL COMMENT '字段输入提示语', `classify_name` varchar(200) DEFAULT NULL COMMENT '分类名称', `classify_display_num` int(2) DEFAULT NULL, `display_num` int(2) DEFAULT NULL, `create_user` varchar(50) DEFAULT NULL, `create_time` datetime DEFAULT NULL, `update_user` varchar(50) DEFAULT NULL, `update_time` datetime DEFAULT NULL, `fields_info` varchar(5000) DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_parentId` (`parent_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='模板字段详情';
-
各个模板数据表
这个在进行模板创建的时候,由程序构造建表语句,执行sql语句创建数据表。我们表名的格式就定为base_template的table_name+version
-
数据中间表
存储数据表和模板表的中间数据,每一条数据都有一条
CREATE TABLE `base_template_data_info` ( `id` varchar(50) NOT NULL, `template_name` varchar(64) DEFAULT NULL COMMENT '模板名称', `version` varchar(50) DEFAULT NULL COMMENT '模板版本', `table_name` varchar(50) DEFAULT NULL COMMENT '表名前缀', `data_id` varchar(36) DEFAULT NULL COMMENT '数据表的id', `file_path` varchar(200) DEFAULT NULL COMMENT '存储的文件路径', `create_user` varchar(50) DEFAULT NULL, `create_time` datetime DEFAULT NULL, `update_user` varchar(50) DEFAULT NULL, `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-
字段分类和模板分类表
字段分类以及模板归类,这里只是简单实现了,把字段加在了表里,后续考虑分类表独立
结语
有些字段还未说明是怎么用的,我们后续文章继续讲解,有写的不对的欢迎指正。
下篇
数据库设计好了,下面我们开始定义接口
网友评论