跳到主要内容

新建外部数据源列表

功能说明

平台可自定义搭建外部数据源,并作为数据源供关联控件选择使用。 外部数据源可为数据库或者是接口

操作步骤

一. 外部数据源为 数据库

1.连接数据库

a. 后台>>数据源管理>>数据库连接>>添加

b. 编辑数据库连接

填写编码

显示名称

数据库类型:选择 Mysql

填写服务器名称:与数据库地址相同

数据库名称:填写需要连接的数据库

用户名:填写数据库登录名

输入密码

数据库描述

c. 填写完成后点击确认即可

2.设置业务方法

a. 后台>>业务集成>>添加业务服务

适配器:选择Data Table Adapter 服务编码/显示名称:可自定义 业务数据库:选择第一步所连接的数据库 TableName:选择需要操作的数据库 数据表必须包含字段:ObjectID

平台会自动生成增、删、改、查的相关sql语句,根据需求选择其中的一项,其余可以删除

b. 设置完成后点击保存即可

3.创建表单

a. 进入功能模块,新建一个功能,功能类型选择"外部数据源列表"

b. 添加字段配置列表

外部数据源列表可以创建用户字段,用于列表设置,但前台列表不支持表单查看

外部数据源不存在系统字段

4.绑定业务方法

外部数据源列表需要通过业务服务获取数据,无法主动添加

业务服务需要设置输出参数的映射关系,将业务服务获取的对应数据映射到列表的对应字段

a. 添加一个业务方法,绑定上一步在后台创建的业务服务

b. 设置好入参和出参

注:

在绑定输出参数时,在后台数据源里边编辑的sql语句可能只是查询数据库表中的某几个字段,但是在这个输出参数列表中,会将数据库中的所有字段显示出来,只需根据需求找到对应的字段并绑定即可

在设置输入参数,选择的映射方式为Const 时,如果常量为空,则前台表单中将不会显示数据,原因是:映射方式为const时 相当于 将控制区过滤了

5.效果图

二. 外部数据源为 接口(不支持分页)

1.创建外部数据源的业务集成

业务集成基本信息设置:

2.输出参数设置:

例如http:192.168.0.184:5001/api/Test/GetExDataSourceList代码:

plaintext
[HttpGet()]
[RedirectReturn]
public List<UserInfoResponse> GetExDataSourceList(string a, string b, string c)
{
List<UserInfoResponse> list = new List<UserInfoResponse>();
for (int i = 0; i < 50; i++)
{
list.Add(new UserInfoResponse()
{
ObjectID = Guid.NewGuid().ToString(),
Name = $"user{i + 1}",
Email = $"user{i + 1}@qq.com",
SortKey = i + 1
});
}
return list;
}

接口返回的json

plaintext
[{
"ObjectId": "xxxx",
"Name": "user1",
"Email": "user1@qq.com",
"SortKey": 1
}, {
"ObjectId": "xxxx",
"Name": "user2",
"Email": "user2@qq.com",
"SortKey": 1
}]

对应的输出参数设置如下:其中根节点sub为子表类型,参数名称必须为datas,子表类型子参数为接口返回的各字段。

2.创建外部数据源列表

1.添加外部数据源功能及创建表单字段操作步骤与(1)一致

2.业务服务绑定

外部数据源列表需要通过业务服务获取数据,无法主动添加

业务服务需要设置输出参数的映射关系,将业务服务获取的对应数据映射到列表的对应字段

三. 外部数据源为 接口(支持分页、排序)

平台版本需为V8.7.8及以上

1.创建外部数据源的业务集成

1.业务集成基本信息设置:

HttpMethod选择HttpPost

分页查询开启

2.入参出参设置:

分页查询开启后会默认生成入参及出参:

入参:默认的入参请勿修改(pageIndex,pageSize,condition,orderBy,columns)。平台将以此结构像第三方接口发数据请求。

1.pageIndex:当前页码(从1开始计数)

2.pageSize:每页多少条数据

3.condition:查询条件,结构如下[{"field":"字段","oper":"操作符","value":"值"}],集合间是And条件

4.orderBy:排序方式,结构如下[{"field":"字段","direction":"Ascending/Descending"}],字段升序/降序

5.columns:请求的列,结构如下 ["UserName","Address"]

出参:接口返回的数据结构需与出参一致;在datas参数添加子表参数,子表参数需与接口返回的业务数据结构一致

入参:

出参:

3.创建外部数据源列表

添加外部数据源功能操作步骤与(1)一致

4.添加字段配置列表

外部数据源列表可以创建用户字段,用于列表及表单展示。

注意字段名称需与业务方法输出参数的数据列保存一致

列表设置中设置排序方式、显示列、搜索字段等

5.业务服务绑定

外部数据源列表需要通过业务服务获取数据,无法主动添加(若添加多个,以第一个业务方法为主)

入参无需设置

需要设置出参的映射关系,将业务服务获取的对应数据映射到列表的对应字段

6.外部数据源第三方接口示例

例如

http://localhost:5000/api/Test/GetExtDataList

代码:

plaintext
[HttpPost()]
[AllowAnonymous]
[RedirectReturn]
public ResponseResult GetExtDataList([FromBody] RequestBody requestBody)
{
ResponseResult result = new ResponseResult() { errcode = 0, datas = new List<response>() };
#region 模拟100条数据 string idPre = "00000000-0000-0000-0000-0000000000";
var value = new List<response>() { };
for (var i = 1; i < 100; i++)
{
string idPost = i.ToString("00");
value.Add(new response() { ObjectID = idPre + i.ToString("00"), UserName = "张三" + idPost, Address = "地址" + idPost, Sex = 0 });
}
result.pagingInfo = new Entity.List.ExPagingInfo() { pageIndex = requestBody.pageIndex, pageSize = requestBody.pageSize };
result.pagingInfo.dataCount = 99;
result.pagingInfo.pageCount = 99 / requestBody.pageSize;
if (requestBody.pageSize > result.pagingInfo.dataCount)
{
result.pagingInfo.pageIndex = 1;
}
#endregion #region 处理排序 if (requestBody.orderBy != null)
{
List<ExOrderBy> orderByParams = JsonConvert.DeserializeObject<List<ExOrderBy>>(requestBody.orderBy);
if (orderByParams?.Count > 0)
{
string orderKey = orderByParams.FirstOrDefault().field;
string orderType = orderByParams.FirstOrDefault().direction;
if (orderType == "Descending")
{
if (orderKey == "Address")
{
value = value.OrderByDescending(o => o.Address).ToList();
}
else if (orderKey == "UserName")
{
value = value.OrderByDescending(o => o.UserName).ToList();
}
else if (orderKey == "Sex")
{
value = value.OrderByDescending(o => o.Sex).ToList();
}
}
else
{
if (orderKey == "Address")
{
value = value.OrderBy(o => o.Address).ToList();
}
else if (orderKey == "UserName")
{
value = value.OrderBy(o => o.UserName).ToList();
}
else if (orderKey == "Sex")
{
value = value.OrderBy(o => o.Sex).ToList();
}
}
}
}
#endregion #region 处理查询 if (requestBody.condition != null)
{
List<ExConditionItem> conditions = JsonConvert.DeserializeObject<List<ExConditionItem>>(requestBody.condition);
if (conditions != null)
{
foreach (var item in conditions)
{
if (item.field.ToLower() == "objectid")
{
//根据数据id查数据,打开表单需要 value = value.Where(o => o.ObjectID == item.value?.ToString()).ToList();
}
else
{
//其他字段的搜索 switch (item.field.ToLower())
{
case "username":
value = value.Where(o => o.UserName.Contains(item.value?.ToString())).ToList();
break;
case "address":
value = value.Where(o => o.Address.Contains(item.value?.ToString())).ToList();
break;
case "sex":
value = value.Where(o => o.Sex.ToString() == item.value.ToString()).ToList();
break;
}
}
}
}

}
#endregion #region 处理分页 if (requestBody.pageIndex == -1 && requestBody.pageSize == -1)
{
result.datas = value;
}
else
{
result.datas = value.Skip((result.pagingInfo.pageIndex - 1) * requestBody.pageSize).Take(requestBody.pageSize).ToList();
}
#endregion return result;
}

接口入参:

1、pageIndex:当前页码(从1开始计数)

2、pageSize:每页多少条数据

3、condition:查询条件,结构如下[{"field":"字段","oper":"操作符","value":"值"}],集合间是And条件

比较类型操作符枚举 ComparisonOperatorType

为方便数据源列表表单正常查看,接口端需要单独处理按数据id的查询 ,如

[{"field":"ObjectID","oper":"Equal","value":"10076958\-2ddb\-4e19\-be26\-1e7915e62ae6"}]

4、orderBy-排序方式,如

[{"field":"UserName","direction":"Descending"}]

5、columns:请求的列,结构如下

["UserName","Address"]

参数为空时表示请求所有数据

接口返回值示例:

plaintext
{
"datas": [{
"ObjectId": "xxxx",
"Name": "张三01",
"Address": "地址01",
"Sex": 0
}, {
"ObjectId": "xxxx",
"Name": "张三02",
"Address": "地址02",
"Sex": 0
}],
"pagingInfo": {
"pageIndex": 1, /*页码*/ "pageSize": 20, /*每页数据*/ "dataCount": 99, /*数据总数*/ "pageCount": 5 /*页数*/

},
"errcode": 0, /*errcode为1,失败;为0,成功*/ "errmsg": "" /*errcode为1,添加错误信息*/
}