H5自定义表单整体系统分析
时间:2019.05-2020.01
关键名词解释
云平台 :总部阿里云服务器,负责H5地址分发,接口中转,来往数据备份,大数据分析,个性化方案出口
客户数据库:客户安装I8的服务器连接的数据库
云平台数据库:阿里云服务器连接的数据库
思维导图

用户使用场景
-
用户在手机端通过相机、浏览器等App扫描二维码,打开H5页面
-
打开H5页面时无需登录,无需身份验证
-
在多个H5页面中导航时、或者中途退出H5页面然后再次打开时,页面会自动载入数据缓存
-
点击提交按钮,组合H5页面中的数据并调用指定的后台API,完成保存动作
生成二维码时序图

H5发布时序图

用户扫码新增H5表单时序图

用户扫码修改/查看H5表单时序图

用户保存H5表单时序图

业务流程驱动开发细节
FastDP注册-业务插件
- 如果生成
H5
表单的业务类型已经有系统表单的业务单据,则H5的保存更新操作,去反射调用业务单据的保存更新接口。这个保存更新接口定义在Enterprise3.WebApi.ApiControllerBase
中,业务单据需要继承这个接口,并实现里面的Save
方法- 如果系统单据在
H5
表单中增加了新的明细表,则保存的时候,首先调用业务组的保存方法,保存已存在的业务表的数据,然后调用H5
表单的保存方法去保存新增的明细表
- 如果系统单据在
H5
表单没有对应业务单据的时候,保存更新方法,直接调用后台生成的自定义保存方法H5
表单的查询接口,全部调用表单发布时生成的后台取数接口,但是有个注意项- 如果是查询系统单据表,系统单据表必须要在列注册的地方去勾选明细表的外键
FastDP列注册
- 开放外键勾选框,并且限制每个表只能勾选一个外键
- 列注册增加必填项,代表这个字段拖到表单设计器之后,必须选择一个默认值,表单才能发布
H5表单设计器
- H5表单设计器除了以前APP自定义表单的功能外,要增加分页设计的功能,并添加
H5
相关控件(音频,视频等) - H5表单初始化的时候,遍历工具栏,查看工具栏里面的必填项,并直接带出到设计器的内容中,不用用户再拖拉。
H5表单代码生成
-
除了完成类似于(但不完全相同)APP自定义表单的代码转换外,还要实现:
-
支持多页转换,即转换出来的页面有分页功能
-
支持必填项控件设置初始值
-
支持读取Url参数值,判断当前二维码是否失效,失效就中断用户操作
-
支持存储用户已输入的值,即当前用户首次打开,输入值之后,不管因何种原因退出了页面,再次扫码打开当前页面的时候,还原已输入的值
-
支持生成初始值,无须用户输入,直接显示
-
支持生成
H5
相关控件(视频,音频) -
支持后台保存逻辑分支判断,系统表单和自定义表单走不同的保存接口,取数接口一致
-
支持后台功能注入
-
发布自定义表单成功的时候:
-
从数据库中拉取云平台地址
-
调用云平台的接口,将表单地址和数据库相关信息传给云平台,成功之后,云平台返回一个主键
-
将 业务类型+H5+方案号,云平台返回的主键,云平台地址 作为参数存到
fg_appformmenu
表中示例:EFORM900000123H5-001
-
-
难点:模板发布路径布置:如何做到每个模板有单一入口,但是公共文件有相同依赖
H5方案列表界面
-
支持一个业务类型同时启用多个方案
-
增加生成二维码按钮,选中某个方案,一键生成二维码到指定路径,服务器上也存一份,然后生成成功后,界面上谈一个框出来,展示刚才生成的二维码,二维码路径为服务器上保留的那张二维码。
二维码生成细节:
- 点击二维码按钮后,弹出框的设计:左边是二维码显示框,右边或者下边是固定值选择框,可以选择;类似于组织,部门等信息,选好之后,点击确定,或者其他展示方式,产品经理决定。然后把这些信息,混合云平台地址和二维码主键生成到二维码中。
- 上面中的组织,部门等信息是从列注册中的必填项拉取出来的
云平台功能点
-
提供类似于nginx的反向代理功能
-
提供一个保存H5模板地址的接口
-
web攻击防护(CC攻击,dos攻击)
-
判断当前二维码是否是失效的,如果已失效,则弹出提示框,并关闭页面,强制退出
-
调用客户服务器接口注意点
- 调用客户服务器的数据处理接口(涉及数据库操作),都应该有一个包含了能连接一个明确数据库所需的参数的JSON串,客户服务器有对应的底层controller拦截器,接受并处理连接参数,为后期数据库操作做准备。(如果没有这些登录信息,默认以H5表单发布的那个服务器的发布帐套信息来连接)
- 身份验证安全问题:客户服务器要知道是云平台调用的,才去正确处理请求。(这个另外讨论,因为如果使用token,也要讨论token的生成规则)
二维码
-
二维码生成需要哪些数据,这些数据存在哪
-
云平台地址(这个地址最好是存到客户数据库中,可配置)
-
二维码自身主键(时效性用)
-
列注册的必填项
-
二维码配置数据主键(根据主键找到该码对应的数据库连接所需要的信息,这些信息存储到云平台数据库中)
该主键能找到的信息
-
客户i8接口调用所需要的数据库连接参数(帐套号,操作员,组织?)
-
客户i8服务器,H5模版地址
-
H5模版展示的选填信息(类似于,模板名,填报日期)
(这些选填信息一定是文本格式,且字数不会太长!)
-
-
-
扫描二维码打开H5页面
-
云平台接收到请求,通过请求中的配置数据主键,找到H5模版地址(这应该是一个静态页面地址),重定向到改地址
-
H5静态页面打开,监听到页面documentLoaded事件的时候,解析document.location.search(展示参数),给H5模板中的选填数据赋值。
-
H5页面
- 数据缓存功能(即用户输入数据之后,不管何种原因退出表单,重新进入时,可以恢复数据)
- 通过用户输入之后的完成事件,把控件的id作为key,控件的值作为value,存到localStorage中
- 传给云平台的时候要有token验证身份。
接口规范
扫码打开H5表单接口规范
参数名 | 值(示例) | 备注 |
---|---|---|
业务单据主表数据主键 (phid) | phid=6217550001101 | 修改/查看取数 |
H5表单操作类型 (otype) | otype=add | 当前页面是新增还是修改/查看 |
配置数据主键 (qrcode_id) | qrcode_id=5001102001 | 凭此从云数据库取出H5相关配置数据 |
完整url示例: ng.clound.cn/website/ope…
H5表单保存接口规范
参数名 | 值(示例) | 备注 |
---|---|---|
i8保存接口地址(url) | http://10.0.10.2/i8/SUP/CustomH5/Save | |
保存参数(params) | { formdata : {} , griddata : {} ,buscode : '', BillNoStatus : ''} |
完整保存接口示例:
$.ajax{
url:'http://ng.clound.cn/website/save',
type:'POST',
data:{
url:'http://10.0.10.2/i8/SUP/CustomH5/Save',
params:'{ formdata : {} , griddata : {} ,buscode : '', BillNoStatus : ''}'
}
}
数据字典
二维码发布调用云平台接口
参数名 | 值示例 | 备注 |
---|---|---|
data | {"address":"http://32.11.7.19/i8/H5/index.html","buscode":"EFORM900001666","default_options":"{"orgname":"新中大总部","username":"月树","year":2020,"month":7,"title":"校园招聘"}"} |
完整接口示例:
using ng.clound.service
JObject ret=JsonConvert.DeserializeObject( NgCloundService.Publish(data) );
if ( ret["success"]=="True" )
{
}
else
{
throw new Exception( ret["error"] )
}
云平台H5配置表数据字典
fg_h5_config
字段名 | 字段类型 | 示例 |
---|---|---|
主键 (phid) | Int64 | 400123997711 |
i8H5表单地址 (address) | varchar(50) | http://32.11.7.19/i8/H5/index.html |
业务类型 (buscode) | varchar(20) | EFORM900001666 |
H5默认显示项 (default_options) | varchar(1000) | {"orgname":"新中大总部","username":"月树","year":2020,"month":7,"title":"校园招聘"} |
云平台请求 i8 H5表单示例:
$.ajax{
url:'http://32.11.7.19/i8/H5/index.html',
type:'POST',
data:{
phid:6217550001101,
otype:'edit',
default_options:'{"orgname":"新中大总部","username":"月 树","year":2020,"month":7,"title":"校园招聘"}'
}
}