找回密码
 立即注册

QQ登录

只需一步,快速开始

Ellia.Duan SpreadJS 开发认证
超级版主   /  发表于:2024-4-19 11:51  /   查看:1351  /  回复:0
本帖最后由 Ellia.Duan 于 2024-11-28 14:39 编辑

继上文讲到报表插件(ReportSheet)实现员工在线考勤表,通过接口url设置数据源,除此之外,还有什么方式可以添加数据源呢?
本文将介绍三种设置数据源方式:远程数据源、本地数据源、本地json文件。其中远程数据源,SpreadJS支持 REST API、OData 和 GraphQL。本文以REST API为例,进行介绍。


一、远程数据源
远程数据源也是使用最广泛的一种方式。支持基础的CRUD操作,比如read,update,create,delete属性,分别用来描述读取,修改,新增,删除的接口定义。
由于本文的主题是设置数据源,所以仅介绍read属性,其他属性将在下文报表插件(ReportSheet) 实现数据填报功能来描述。
我们来看下read的定义:
image.png907006225.png
从上图中,我们看到read支持两种方式,一种是IRemoteReadRequestOption,另一种是GC.Data.RemoteReadHandler。我们分开介绍
1、IRemoteReadRequestOption
image.png138614195.png
如上图所示,IRemoteReadRequestOption包括adapter,body,method,url等属性。
比如现在有一个RESTful API,如果不设置body ,我们可以直接UI上进行操作。
1)首先复制此链接,然后打开Designer,如下图所示,依次点击”数据“---->”数据源“---->”添加表“,在读取input框中,粘贴复制的链接。
   image.png935677795.png
2)修改tableName ,我们将此修改为”GDP
3)点击”“,发现获取了此接口的字段”description“,”length“,”data“  ,不是我们要的数据。
image.png504758300.png
4)返回”“,可以设置数据路径,输入data
image.png229100341.png
5)再次点击”“ ,已经有了我们想要的字段信息
image.png438291015.png

至此,dataManager已经新增了GDP表。我们可以根据此表,添加集算表或者报表,如下动图所示
gdp.gif
通过上述UI方式,通过设置api接口实现了添加数据源。
接下来,我们介绍下如何通过代码的方式添加url数据源
  1.    spread.dataManager().addTable('GDP', {
  2.             remote: {read: {url: 'https://cdn.grapecity.com.cn/spreadjs/json-sample-data/cityGDPData.json'}},
  3.             schema: {dataPath: 'data'}
  4.         });
复制代码
上述代码主要是通过addTable创建数据源table 。
第一个参数是tableName ,第二个参数是IDataSourceOption ,包括autoSync、batch、data、remoteschema
我们观察上面的代码,主要是设置了remote中read(读操作的选项)的url ,schema中dataPath。

除此之外,我们如何添加body呢?
  1.    dataManager.addTable("student", {
  2.             remote: {
  3.                 read: {
  4.                     url: 'http://localhost:3000/studentListByClassId',
  5.                     body: {classId: 1},
  6.                     method: 'post'
  7.                 },
  8.             }
  9.         });
复制代码
上面的代码,我们在read属性中定义了url ,body,method等属性,完成一个查询classId为1的post请求。
当然,有时候,后端传回来的接口数据需要进一步调整,我们要如何处理呢?readc除了接收url等属性,还可以传值Promise
2、RemoteReadHandler
用来自定义处理数据,比如后端传给前端的接口数据,需要进一步调整,或者添加token
比如下面的代码
  1. dataManager.addTable("student", {
  2.                 batch: true,
  3.                 remote: {
  4.                     read: function () {
  5.                         let data = [
  6.                             {id: 1, name: "学生", age: 4, sex: '男', classId: 2},
  7.                             {id: 2, name: "李四", age: 8, sex: '女', classId: 2},
  8.                             {id: 3, name: "小王", age: 7, sex: '男', classId: 2},
  9.                             {id: 4, name: "小韩", age: 8, sex: '女', classId: 2},
  10.                             {id: 5, name: "小明", age: 7, sex: '男', classId: 2},
  11.                         ]
  12.                         return Promise.resolve(data);
  13.                     }
  14.                 },
  15.             });
复制代码
在上面的代码中,我们定义了一个静态变量data , 然后通过Promise.resolve(data)进行返回
或者下面的代码:
  1. var dataManager = spread.dataManager();
  2.         dataManager.addTable("student", {
  3.             remote: {
  4.                 read: function () {
  5.                     return getStudentList(1)
  6.                 }
  7.             }
  8.         });
复制代码
我们发现,上面的代码中,read返回了一个Promise函数。Promise函数定义如下:
  1. function getStudentList(token) {
  2.         return new Promise((resolve, reject) => {
  3.             fetch("http://127.0.0.1:3000/studentByToken", {
  4.                 method: "get",
  5.                 headers: {
  6.                     "Authorization": token,
  7.                 },
  8.             }).then((response) => response.json())
  9.                 .then((data) => resolve(data));
  10.         });
  11.     }
复制代码

数据获取-url.html (3.28 KB, 下载次数: 228)
image.png147949828.png

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部