接口分析
移动端大致需要几个接口
- 获取模板列表接口
- 根据模板表名获取模板字段接口
- 填写完数据需要保存模板数据接口(修改是同一个接口)
- 获取文件预览路径和模板填充的数据内容
- 获取已创建的文件列表
接口实现
- 获取模板列表接口 GET /mobile/templateList
请求参数:无
响应内容:
{
"success": true,
"message": null,
"code": 200,
"timestamp": 1590649811153,
"data": [
{
"items": [
{
// 部分字段
"fileName": "doc_order_correction.pdf",
"id": "2",
"isDefault": "1",
// 模板名称
"name": "XXX",
// 表名 下一步用到
"tableName": "doc_order_correction",
// 版本号
"version": "1.0.0"
}
],
// 分类名称
"classifyName": "XXX"
}
],
"i18n": null
}
- 根据表名获取模板表单字段信息 GET /mobile/tableFields/{tableName}
请求参数:
字段 | 类型 | 是否必传 | 描述 |
---|---|---|---|
tableName | String | Yes | 模板表名 |
响应内容:
{
"success": true,
"message": null,
"code": 200,
"timestamp": 1590649811153,
"data": {
// 模板名称
"name": "XXX",
// 模板版本号
"version": "1.0.2",
// 模板内容,按照字段分类进行归类
"content": [
{
// 分类的表单字段
"fields": [
{
// 是否必输1必输
"isRequired": "1",
// 字段名称
"fieldName": "title_dept_name",
// 字段备注,如果是下拉框这里会有下拉框的json对象值
"fieldRemark": "",
// 客户端没用
"remark": "",
// 客户端没用
"multiLineField": "",
// 客户端没用
"version": "1.0.2",
// 模板表名
"tableName": "doc_live_transcript",
"itemId": "cfcbc7d2-b5cf-482c-a956-089100976e91",
// 字段长度
"fieldSize": "20",
// 默认取值字段名 与下面的是否默认取值搭配使用
"defaultTakeName": "deptName",
// 提示输入
"hintName": "请输入/选择XXXX",
// 是否默认取值,1默认取值,和上面的默认取值字段配合使用
"isDefaultTake": "1",
// 模板名称
"name": "XXX",
// 字段前置的字段名称 就是label值
"preName": "XXX管理局",
"id": "80afc285-3577-4b25-b1e3-49807af36949",
// 字段类型
"fieldType": "1",
// 字段归属分类
"classifyName": "XXX"
}
],
// 字段归属分类
"classifyName": "XXX"
}
]
},
"i18n": null
}
来解释下这个表单字段的一些字段的用处
- isRequired是否必输和fieldSize字段长度
这两个字段,主要是给移动端做校验用,后端也会使用这两个字段进行验证。我们数据表是根据pdf表单的设置的限制字符来设计字段长度的对吧,如果这里不对这个字段进行限制的话,就经常可能超过了数据库的字段长度限制,而且pdf的字段太长了,也会被截断或者换行显示,这样视觉效果也不好,所以需要对每个字段长度的必输和长度进行校验。
- isDefaultTake是否默认取值和defaultTakeName默认取值字段名
我们在填写pdf表单的时候,会有这样一个需求:有几个字段是我想默认填写的,比如说部门名称,这个是需要根据填写人的部门自动填充进去。所以这两个字段就是这个用处,如果这个字段是默认取值的,移动端就可以直接取到默认取值的key,从本地的一下缓存对象(或者其他对象)里面取到值填充进去。
-
fieldType字段类型
既然是表单,他就会不同的字段类型,比如说文本域,下拉框。所以这个字段主要是用来做这个标识的作用,当然,还不止这些作用,我还进行了一些扩展,以满足需求。
根据移动端的需求,目前设计的几种字段类型:
1: EditText 编辑框
2: TimePick 时间选择框 年月日时分
3: DatePick 日期选择框 年月日
4: SpinnerPick 下拉选择框5: inputText 文本域
6: Signature 签名域
7: ItemDynamic 动态列表8: AskAnswer 问答
-
编辑框/时间选择框/日期选择框/文本域 就不用讲了
-
下拉选择框需要搭配fieldRemark字段使用,这个字段存储了下拉框的key/value的json值,移动端直接解析这个字段构造下拉框
-
签名域
既然的pdf表单,那么可能有些字段是手写需要签名的字段,和移动端约定好,签名字段的值采用Base64编码,后端解析Base64编码值进行图片填充
-
动态列表
先来看下这个pdf表单:
image-20200529144934892.png
这个pdf表单,需要填写的是动态行,移动端可以增加一行并且填写每一行的数据,这个类型就是针对这种类型的表单。
-
问答
这个主要是针对特殊情况,在问答模式下,问和答需要切割,问结束之后,答要另起一行,后面是针对这种类型进行特殊处理。
-
- 保存表单 POST /mobile/saveOrUpdate
请求参数:
字段 | 类型 | 是否必传 | 描述 |
---|---|---|---|
tableName | String | Yes | 模板表名 |
data | Object | Yes | 表单数据 |
响应内容:
{
"success": true,
"message": null,
"code": 200,
"timestamp": 1590649811153,
"data": {
// 生成的pdf文件id,后续根据这个id获取文件以及文件数据内容
"id":"XXX"
}
"i18n": null
}
- 获取pdf文件预览路径 GET /getDocPreview/{id}
请求参数:
字段 | 类型 | 是否必传 | 描述 |
---|---|---|---|
id | String | Yes | 上面接口返回的文件id |
响应内容:
{
"success": true,
"message": null,
"code": 200,
"timestamp": 1590649811153,
"data": "文件服务器的文件地址XXX"
"i18n": null
}
- 获取pdf表单内容 GET /mobile/detail/{id}
应移动端要求,接口和第二个接口返回数据一样,只是hintName字段设置为表单内容值
请求参数:
字段 | 类型 | 是否必传 | 描述 |
---|---|---|---|
id | String | Yes | 上面接口返回的文件id |
响应内容:
见第二个接口
- 获取已创建的文件列表
这个就读取中间表数据,不阐述。
结语
移动端和后端接口差不多就这些,有些实现细节没有写,后续补充,有写的不对的欢迎指正。
下篇
代码实现细节
网友评论