1模板数据结构
1.1 类型定义
类型 |
表示 |
描述 |
对应Java类型 |
默认定义 |
字符串 |
STR、STRING |
代表字符串类型。 |
java.lang.String |
1、非空:“NOEMPTY” 2、允许空:“null” 3、允许串为null:“nullstr” 4、其他字符串即为默认值 |
短整数 |
INT、INTEGER |
代表32位整形。 |
java.lang.Integer |
1、非空:“NOEMPTY” 2、其他字符串即为默认值 |
长整数 |
LONG |
代表64位整形。 |
java.lang.Long |
1、非空:“NOEMPTY” 2、其他字符串即为默认值 |
浮点 |
FLOAT、DOUBLE |
代表双精度、64 位、符合 IEEE 754 标准的浮点数。 |
java.lang.Double |
1、非空:“NOEMPTY” 2、其他字符串即为默认值 |
布尔 |
BOOL、BOOLEAN |
代表布尔类型,值为true 或 false,转换时非0且非false即为true(忽略大小写)。 |
java.lang.Boolean |
1、非空:“NOEMPTY” 2、其他字符串即为默认值 |
日期 |
DATE:FORMAT |
代表日期,定义时需紧跟格式化,并以英文冒号分隔,例如"DATE:yyyy-MM-dd HH:mm:ss",格式化遵循JAVA SimpleDateFormat。 |
java.text.SimpleDateFormat |
1、非空:“NOEMPTY” 2、"NOW"表示当前时间戳 3、其他字符串即为默认值 |
键值对集合 |
{} |
由多个键值对组成,以英文逗号分隔,英文花括号包裹的字符串,其中值只能为字符串,键可以为支持的任意类型。 |
org.json.JSONObject |
仅支持模板声明,不支持模板使用 |
数组 |
[] |
代表多个由同一类型组成的数组。 |
org.json.JSONArray |
仅支持模板声明,不支持模板使用 |
1.2 模板定义
1.2.1 模板结构
模板是一个键值对集合,由以下键值对组成。
键名 |
描述 |
ApiTemplate |
网络接口模板 |
DatabaseTemplate |
数据库模板 |
1.2.2 网络接口结构(网络接口模板)
网络接口结构是一个键值对集合,由以下键值对组成。
键名 |
描述 |
Api |
网络请求模板 |
ApiConfig |
网络配置模板 |
1.2.2.3 网络请求结构(网络请求模板)
网络请求结构是一个数组,子类型是Api为键值对集合,数组长度固定为7,且个子类型应顺序放置,结构如下。
索引 |
描述 |
0 |
请求登录Api |
1 |
获取社区信息Api |
2 |
获取试管采样记录Api |
3 |
获取用户身份信息Api |
4 |
提交采样记录Api |
5 |
删除采样记录Api |
6 |
采样历史查询Api |
1.2.2.3.1 网络接口(Api)结构
网络接口是一个键值对集合,由以下键值对组成。
键名 |
描述 |
类型 |
type |
接口类型,对应网络结构索引 |
短整数 |
uri |
请求地址 |
字符串 |
interval |
两次请求间隔时间(毫秒) |
字符串 |
request |
定义请求方式,请求类型,请求参数,请求头等 |
ApiRequet |
response |
定义应答成功,应答解析,应答成员等 |
ApiResponse |
1.2.2.3.2 ApiParam结构
ApiParam是一个数组,子类型为字符串,长度至少为4个,定义如下:
索引 |
描述 |
0 |
表示参数的键,或请求头的键,或应答参数的键,或数据库中的字段名 |
1 |
表示类型,仅支持类型定义中除键值对集合及数组之外的类型 |
2 |
表示描述 |
3 |
表示默认值 |
4 |
转义定义 |
5+ |
查询优先级 |
1.2.2.3.2.1 转义定义是一个由字符串组成的键值对集合,定义如下:
键名 |
描述 |
示例 |
String.format |
格式化 |
“{“String.format”:“第%d页”}”,当值为1时,展示内容为:第1页 |
其他 |
自定义的其他转义 |
“{“1”:“男”,“0”:“女”}”,当值为1时,展示内容为:男 |
1.2.2.3.2.2 查询优先级是一个字符串,定义如下:
名称 |
描述 |
示例 |
datablock@字段名 |
本地数据,默认值 |
datablock@idCard 从本地数据中查找字段为idCard的值 |
Api[请求类型][字段名] |
网络数据 |
Api[6][“id”] 请求查找采样历史,并从该返回数据中查找字段为id的值 |
1.2.2.3.3 Algorithm结构
Algorithm是一个数组,子类型为字符串,长度为3或5,定义如下:
索引 |
描述 |
0 |
算法类型:“ENCRYPT”、“DECRYPT”、“SIGN” |
1 |
加解密签名密钥,非必须可为空 |
2 |
加解密签名类型,如:“AES/ECB/PKCS7Padding” |
3 |
测试待转换字段 |
4 |
期望已转换字段 |
ENCRYPT,支持的加密算法:AES、DES、URL、BASE64
DECRYPT,支持的解密算法:AES、DES、URL、BASE64
SIGN ,支持的签名算法:HMAC、MD5、SHA
1.2.2.3.4 ApiRequet结构
ApiRequet是一个键值对集合,由以下键值对组成。
键名 |
描述 |
类型 |
type |
请求方式,支持GET、POST、DELETE、PUT |
字符串 |
uploading |
上传方式,支持JSON、PARAM两种方式,GET不支持JSON |
字符串 |
params |
请求参数,是一个数组,子类型是ApiParam |
数组 |
converts |
需要加密、解密、签名的字段 |
数组 |
algorithms |
加密解密签名相关配置 |
Algorithm |
headers |
请求头,是一个数组,子类型是ApiParam |
数组 |
fillAuthorization |
若头部没有Bearer,是否自动补全鉴权字段 |
布尔 |
authorization |
指定鉴权字段 |
字符串 |
1.2.2.3.5 ApiResponse结构
ApiResponse是一个键值对集合,由以下键值对组成。
键名 |
描述 |
类型 |
assert |
定义多个body判定,用于判断返回结果是否正确,如:[“R[\“code\”]==0”, “R[\“data\”]!=null”, “R[\“data”]!=\”\“”] ,其中R代表整个返回结果,将会判断"code"的值是否为0且"data"的值非空 |
数组 |
entity |
用于定位返回实体,示例:“R[\“data\”]”,其中R代表整个返回结果,将会把"data"的值判为返回实体。 |
字符串 |
fields |
请求实体字段列表 |
数组,子类型为ApiParam |
converts |
需要加密、解密、签名的字段 |
数组 |
algorithms |
加密解密签名相关配置 |
Algorithm |
1.2.2.4 网络配置结构(网络配置模板)
网络配置模板是一个键值对集合,由以下键值对组成。
键名 |
描述 |
类型 |
locate |
本地网络配置 |
键值对集合 |
test |
测试账号密码 |
键值对集合 |
permission |
接口权限 |
键值对集合 |
1.2.2.4.1 本地网络配置结构
** 本地网络配置是一个键值对集合**,由以下键值对组成。
键名 |
描述 |
类型 |
authorization |
鉴权字段指定,仅能取Api[0] |
键值对集合 |
community_info |
社区信息保留展示,可以取自Api[0]或Api[1] |
键值对集合 |
scan |
扫描字段指定 |
键值对集合 |
card |
身份号字段支持 |
键值对集合 |
id |
平台唯一字段指定 |
字符串数组 |
1.2.2.4.1.1 鉴权字段指定(authorization)
键名 |
描述 |
类型 |
token |
鉴权令牌指定登录接口返回字段,如:“Api[0][\“token\”]” |
字符串 |
expired |
鉴权令牌过期时间指定登录接口返回字段,如:"Api[0][\“expireAt\”] |
字符串 |
1.2.2.4.1.2 扫描字段指定(scan)
键名 |
描述 |
类型 |
barcode |
用于指定哪些字段是条码字段 |
字符串数组 |
id card |
用于指定哪些字段是身份号字段 |
字符串数组 |
1.2.2.4.1.3 身份号字段支持(card)
键名 |
描述 |
类型 |
normal |
常规卡片支持类型:ID Card(身份证)、Passport Card(护照)、Officer Card(军官证)、HM Card(港澳通行证)、TW Card(台湾通行证)。按照数据顺序进行匹配。 |
字符串数组 |
other |
用于匹配自定义字段,可为空,优先级低于normal。每一个键值对,包含两个键"name"(配置名,类型为字符串例如:户口簿号),“regex”(匹配正则表达式,类型为字符串)。 |
键值对集合数组 |
1.2.2.4.1.3 平台唯一字段指定(id)
平台唯一字段指定(id)是一个字符串数据,每一个字符串只能是Api[3]中的返回值。
1.2.2.4.2 测试(test)
键名 |
描述 |
类型 |
account |
测试账号 |
字符串 |
password |
测试密码 |
字符串 |
1.2.2.4.3 网络权限结构
键名 |
描述 |
类型 |
allow remember password |
是否允许用户记住密码 |
布尔 |
allow auto login |
是否允许用户自动登录 |
布尔 |
allow auto refresh token |
是否允许用户自动刷新令牌 |
布尔 |
1.2.3 数据库模板
数据库模板是一个键值对集合,由以下键值对组成。
键名 |
描述 |
类型 |
DB |
数据库类型模板列表 |
键值对集合数组 |
DBSetting |
模板配置信息 |
键值对 |
1.2.3.1 数据库类型模板列表
数据库类型模板是一个数组,子类型是键值对集合,且长度为3,定义如下:
索引 |
描述 |
0 |
基础导入数据库 |
1 |
采样上传数据库 |
2 |
核酸检测分组 |
1.2.3.2 数据库类型模板
数据库类型模板是一个键值对集合,由以下键值对组成。
键名 |
描述 |
类型 |
type |
数据库类型,见数据库类型模板列表 |
短整数 |
password |
数据库创建密码 |
字符串 |
fields |
数据库字段 |
ApiParam数组 |
usage |
字段使用 |
键值对集合 |
updates |
模板更新记录 |
键值对集合数组 |
1.2.3.2.1 字段使用(usage)
字段使用是一个键值对集合,由以下键值对组成。
键名 |
描述 |
类型 |
setter |
接口返回字段设置配置 |
键值对集合 |
getter |
接口请求字段获取配置 |
键值对集合 |
1.2.3.2.2 模板更新记录(updates)
数据库类型模板是一个数组,子类型是键值对集合,每条记录对应该模板升级时对应的字段,在配置好该字段后,一定要进行测试,执行顺序:删除–>添加–>改动–>移动,子项结构如下:
键名 |
描述 |
类型 |
格式 |
示例 |
version |
更新的版本号 |
长整数 |
|
0 |
add |
添加字段 |
ApiParam数组 |
[[ApiParam0],[ApiParam1]…] |
[[“idCard” , “STRING” , “身份证” , “NOEMPTY”]] |
del |
删除字段 |
字符串数组 |
[“要删除的字段名”] |
[“idCard”] |
alter |
改动字段 |
键值对集合数组 |
{“要改动的字段名”:ApiParam } |
{“idCard”:[“idCard” , “STRING” , “身份证” , “NOEMPTY”]} |
move |
移动字段 |
键值对集合 |
“要移动的字段名”:要移动的索引 |
{“idCard”:0} |
usage |
字段使用(增加字段时需要填写) |
见1.2.3.2.1 字段使用(usage) |
|
|
1.2.3.3 模板配置信息
模板配置信息是一个键值对集合,由以下键值对组成。
此部分信息将部分展示在【关于】页面
键名 |
描述 |
类型 |
group member num |
核酸分组采样最大人数 |
短整数 |
region name |
区域名,例如适配青岛市,填写青岛市 |
字符串 |
region code |
区域码,区域名对应的区域码,例如370200 |
字符串 |
password |
模板使用口令 |
字符串 |
net api provider |
模板适配提供方,填写所在企业的机构名 |
字符串 |
unify social credit codes |
模板适配企业的统一社会信用代码 |
字符串 |
net api version |
模板版本号 |
长整数 |
net api introduce |
模板提供方介绍 |
字符串数组 |
2 模板示例&快速适配
{
"ApiTemplate": {
"Api": [
{
"type": 0,
"url": "https://hsjc.example.com/api/login",
"interval": "1000",
"request": {
"type": "POST",
"uploading": "PARAM",
"params": [
["username", "STRING" , "登录账号", "NOEMPTY"],
["password", "STRING" , "登录密码", "NOEMPTY"]
],
"converts": ["password","username"],
"algorithms": [
[
["ENCRYPT","SecretKeyOfData","AES/ECB/PKCS7Padding","TEST","+tbjC1wVysGsPjtIWAsW+A=="],
["ENCRYPT","" ,"URL"]
],
[
["ENCRYPT","SecretKeyOfData","AES/ECB/PKCS7Padding"],
["ENCRYPT","" ,"URL"]
]
]
},
"response": {
"assert": ["R[\"code\"]==0", "R[\"data\"]!=null"],
"entity": "R[\"data\"]",
"fields": [
["token" , "STRING" , "令牌" , ""],
["expireAt" , "DATE:yyyy-MM-dd HH:mm:ss", "到期时间" , ""],
["username" , "STRING" , "登录用户名" , ""],
["isAdmin" , "BOOL" , "管理权限" , ""],
["memberName" , "STRING" , "管理员姓名" , ""],
["mobile" , "STRING" , "管理员手机号", ""],
["regionCode" , "STRING" , "市区号" , ""],
["regionName" , "STRING" , "市区" , ""],
["gridId" , "STRING" , "乡镇号" , ""],
["gridName" , "STRING" , "乡镇" , ""],
["samplingCode" , "STRING" , "采样点ID" , ""],
["samplingName" , "STRING" , "采样点" , ""],
["samplingId" , "STRING" , "测试点ID" , ""]
]
}
},
{
"type": 1,
"url": "https://hsjc.example.com/api/getCommunityInfo",
"interval": "1000",
"request": {
"type": "POST",
"uploading": "JSON",
"params": [],
"headers": [
["Authorization", "STRING", "接口访问令牌", ""]
],
"fillAuthorization": true,
"authorization": "Authorization"
},
"response": {
"assert": ["R[\"code\"]==0", "R[\"data\"]!=null"],
"entity": "R[\"data\"]",
"fields": [
["username" , "STRING", "登录用户名" , ""],
["mobile" , "STRING", "管理员手机号", ""],
["regionCode" , "STRING", "市区号" , ""],
["regionName" , "STRING", "市区" , ""],
["gridId" , "STRING", "乡镇号" , ""],
["samplingCode" , "STRING", "采样点ID" , ""],
["samplingName" , "STRING", "采样点" , ""]
]
}
},
{
"type": 2,
"url": "https://hsjc.example.com/api/getSamplingRecord",
"interval": "1000",
"request": {
"type": "POST",
"uploading": "JSON",
"params": [
["tubeNo", "STRING", "采样管ID", "NOEMPTY", "" , "INPUT"]
],
"headers": []
},
"response": {
"assert": ["R[\"code\"]==0", "R[\"data\"]!=null"],
"entity"