需求
在一些場景中,我們需要用到pdf文件作為表單模板,移動端可以獲取到這個pdf文件的表單,在移動端填寫完表單后,填充表單數據并生成新的pdf文件作為附件可做預覽。
需求分析
理解完上面的需求,我們大致有幾個工作要做
- 管理pdf模板,但是同一個pdf可以有多個版本,版本之間可切換
- 存儲pdf模板的表單字段可供查詢
- 存儲提交上來的表單數據到每個版本的數據表
- 填充pdf模板數據并生成附件文件
數據庫設計
在設計數據庫之前,我們先來考慮幾個問題
-
pdf可能會有多頁,該如何處理
有些pdf模板是不止一頁的,而且某些頁數也是根據表單字段填寫的長度來進行續(xù)頁,比如一個字段有2000字,而我第二頁都是這個字段,但是放不下2000個字,那么就要采用續(xù)頁的形式繼續(xù)填寫,這時候總頁數就會變。所以如果是多頁的情況,我們需要對這個模板進行拆分,所以我們需要把每一頁當成一個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='模板字段詳情'; -
各個模板數據表
這個在進行模板創(chuàng)建的時候,由程序構造建表語句,執(zhí)行sql語句創(chuàng)建數據表。我們表名的格式就定為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; -
字段分類和模板分類表
字段分類以及模板歸類,這里只是簡單實現了,把字段加在了表里,后續(xù)考慮分類表獨立
結語
有些字段還未說明是怎么用的,我們后續(xù)文章繼續(xù)講解,有寫的不對的歡迎指正。
下篇
數據庫設計好了,下面我們開始定義接口