Appearance
2.13 脚本数据源
2.13.1 概念介绍
在上面的案例中,我们数据表的数据源类型都是默认的,但在一些复杂的场景中,我们需要数据表的数据是来自与一个脚本或者sql的,这时我们就可以在创建数据表的时候对数据源类型进行选择,目前平台支持默认、来自其他应用的数据表、来自数据库视图、通过脚本获取四种方式。
- 默认:系统默认设置,数据将会存储在数据库中
- 来自其他应用的数据表:数据表的数据来自于其他应用的数据表
- 来自数据库视图:数据源来自于一个sql查询语句
- 通过脚本获取:数据源来自于一段脚本片段
使用说明:
- 如果需要修改数据表的数据源类型,需要在创建数据表模块的时候就要进行选择,在数据表创建后将无法修改数据表的数据源类型
- 如果一个数据表的数据源类型不是默认,那么在完成该数据表创建后需要在高级设置中完成配置,否则在应用发布时会报错
- 当数据源类型为来自数据库视图和通过脚本获取时,也需要配置数据表的表单字段
2.13.2 配置说明
1、首先我们需要创建一个数据源类型为通过脚本获取的数据表,并且创建我们需要最终希望在该数据表中展示的字段
2、其次我们需要创建一个脚本,并且在上一步骤中创建的数据表的高级设置中选中该脚本
3、根据自己实际的业务场景编写脚本,在脚本中需要使用固定提供的函数完成通过id查询记录详情、查询记录列表和查询记录数量。
2.13.3 脚本编写说明
在编写该脚本时,需要导出以下函数:
javascript
/**
* 通过id查询记录详情,返回值为对象
* 参数:上下文对象
* 返回值:json对象,对象结构需要和数据表的结构相同
*/
export function executeQueryById(ctx){
return obj;
}
输入:
/**
* 通过条件查询记录列表,返回值为数组
* 参数:上下文对象
* 返回值:数组,数组中的对象的结构需要和数据表的结构相同,且对象中必须包含id
*/
export function executeQueryList(ctx){
return list;
}
/**
* 通过条件查询记录数量,返回值为整数。如果返回值小于0,则页面不会使用分页模式渲染数据
* 参数:上下文对象
* 返回值:整数,范围当前分页大小
*/
export function executeQueryListCount(ctx){
return size;
}
上述中的ctx的定义如下:
javascript
{
appId:String,//应用ID
tableId:String,//数据表标识符
id:String,//记录ID,executeQueryById方法会使用
query:{
id:String,//记录ID
pageIndex:Integer,//整数 起始页码,第一页从1开始
pageSize:Integer,//整数,分页大小
includeFields:Array<String>,//查询字段列表
orderByList:Array<OrderBy>,//排序列表
childrenFieldId:String,//属性结构字段的标识符,可以为空
childrenShowParent:Boolean,//树形结构的查询结果中是否包含父亲节点
childrenRootRecordId:String,//树形结构的查询中根节点的ID
filter:Filter,//过滤条件,
filterId:String,//组合筛选过滤器ID
pathFilterId:String,//地址栏筛选过滤器id
pathFilterQuery:Object,//地址栏筛选过滤器条件
}
}
关于OrderBy
Filter
的定义请参见informat.table
例8:JDBC查询脚本
我们有一个【依赖数据】模块,里面有一些成员的基础信息,此处在脚本中对于数据源中的手机号
字段进行了脱敏处理,将手机号中间的4位改成了“*“,脚本使用JDBC的方法获取数据。
JDBC查询脚本案例:
js
/**
* 处理行数据,收好脱敏
* @param row
*/
function handleData(row) {
if (row.mobileNo && row.mobileNo.length >= 11) {
row.mobileNo = row.mobileNo.substring(0, 3) + '****' + row.mobileNo.substring(7);
}
return row;
}
/**
* 通过id查询记录详情,返回值为对象
*/
export function executeQueryById(ctx) {
const connection = informat.jdbc.tableConnection();
const list = [];
connection.select(`select * from script_and_view_source_dep_data where id = ? limit 1;`, (resultSet) => {
list.push(handleData({
id: resultSet.getString('id'),
name: resultSet.getString('name'),
sex: resultSet.getString('sex'),
post: resultSet.getString('post'),
score: resultSet.getDouble('score'),
mobileNo: resultSet.getString('mobile_no'),
createTime: resultSet.getString('create_time')
}));
}, ctx.id);
if (list.length === 0) {
informat.app.abort('数据不存在或已被删除');
return;
}
return list[0];
}
/**
* 通过条件查询记录列表,返回值为数组
*
*/
export function executeQueryList(ctx) {
const {
pageIndex,
pageSize
} = ctx.query;
const connection = informat.jdbc.tableConnection();
const list = [];
let pageStart = (pageIndex - 1) * pageSize;
if (Number.isNaN(pageStart) || pageStart < 0) {
pageStart = 0;
}
connection.select(`select * from script_and_view_source_dep_data limit ? offset ?;`, (resultSet) => {
list.push(handleData({
id: resultSet.getString('id'),
name: resultSet.getString('name'),
sex: resultSet.getString('sex'),
post: resultSet.getString('post'),
score: resultSet.getDouble('score'),
mobileNo: resultSet.getString('mobile_no'),
createTime: resultSet.getString('create_time')
}));
}, pageSize, pageStart);
return list;
}
/**
* 通过条件查询记录数量,返回值为整数。如果返回值小于0,则页面不会使用分页模式渲染数据
*/
export function executeQueryListCount(ctx) {
const connection = informat.jdbc.tableConnection();
let count = 0;
connection.select(`select count(1) as counts from script_and_view_source_dep_data;`, (resultSet) => {
count = resultSet.getLong('counts');
});
return count;
}
效果展示:
例9:数据表Api查询脚本
我们有一个【依赖数据】模块,里面有一些成员的基础信息,此处在脚本中对于数据源中的手机号
字段进行了脱敏处理,将手机号中间的4位改成了“*“,脚本使用数据表Api的方法获取数据。
数据表Api查询脚本案例:
js
/**
* 处理行数据,收好脱敏
* @param row
*/
function handleData(row) {
if (row.mobileNo && row.mobileNo.length >= 11) {
row.mobileNo = row.mobileNo.substring(0, 3) + '****' + row.mobileNo.substring(7);
}
return row;
}
/**
* 通过id查询记录详情,返回值为对象
*/
export function executeQueryById(ctx) {
const record = informat.table.queryById('scriptAndViewSourceDepData', ctx.id);
if (record == null) {
informat.app.abort('数据不存在或已被删除');
return;
}
handleData(record);
return record;
}
/**
* 通过条件查询记录列表,返回值为数组
*
*/
export function executeQueryList(ctx) {
const list = informat.table.queryList('scriptAndViewSourceDepData', ctx.query);
list.forEach(row => {
handleData(row);
});
return list;
}
/**
* 通过条件查询记录数量,返回值为整数。如果返回值小于0,则页面不会使用分页模式渲染数据
*/
export function executeQueryListCount(ctx) {
return informat.table.queryListCount('scriptAndViewSourceDepData', ctx.query);
}
效果展示:
例10:接口查询脚本
调用接口获取某个平台热度分析数据,并且展示在数据表中。
调用接口获取数据脚本:
js
/**
* 通过id查询记录详情,返回值为对象
*/
export function executeQueryById(ctx) {
}
/**
* 通过条件查询记录列表,返回值为数组
*
*/
export function executeQueryList(ctx) {
const response = informat.http.request({
url: 'https://tenapi.cn/v2/baiduhot'
});
try {
const result = JSON.parse(response.body());
if (result.code !== 200) {
informat.app.abort(result.message);
return;
}
return (result.data || []).map((item, index) => {
return {
...item,
id: item.id || `baiduhot-${index}`
};
});
} catch (e) {
informat.app.abort(e.message);
}
return [];
}
/**
* 通过条件查询记录数量,返回值为整数。如果返回值小于0,则页面不会使用分页模式渲染数据
*/
export function executeQueryListCount(ctx) {
return 0;
}
展示效果: