Skip to content

2.13 脚本数据源

2.13.1 概念介绍

在上面的案例中,我们数据表的数据源类型都是默认的,但在一些复杂的场景中,我们需要数据表的数据是来自与一个脚本或者sql的,这时我们就可以在创建数据表的时候对数据源类型进行选择,目前平台支持默认、来自其他应用的数据表、来自数据库视图、通过脚本获取四种方式。

  • 默认:系统默认设置,数据将会存储在数据库中
  • 来自其他应用的数据表:数据表的数据来自于其他应用的数据表
  • 来自数据库视图:数据源来自于一个sql查询语句
  • 通过脚本获取:数据源来自于一段脚本片段

使用说明:

  • 如果需要修改数据表的数据源类型,需要在创建数据表模块的时候就要进行选择,在数据表创建后将无法修改数据表的数据源类型
  • 如果一个数据表的数据源类型不是默认,那么在完成该数据表创建后需要在高级设置中完成配置,否则在应用发布时会报错
  • 当数据源类型为来自数据库视图通过脚本获取时,也需要配置数据表的表单字段

2.13.2 配置说明

1、首先我们需要创建一个数据源类型为通过脚本获取的数据表,并且创建我们需要最终希望在该数据表中展示的字段

2、其次我们需要创建一个脚本,并且在上一步骤中创建的数据表的高级设置中选中该脚本

3、根据自己实际的业务场景编写脚本,在脚本中需要使用固定提供的函数完成通过id查询记录详情、查询记录列表和查询记录数量。

image-20231129213057889

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;
}

效果展示:

image-20231129211453727image-20231129211417070

例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);
}

效果展示:

image-20231129211453727image-20231129211417070

例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;
}

展示效果:

image-20231129212152210