找回密码
 立即注册

QQ登录

只需一步,快速开始

Ellia.Duan SpreadJS 开发认证
超级版主   /  发表于:2024-11-28 13:41  /   查看:16  /  回复:0
本帖最后由 Ellia.Duan 于 2024-11-28 13:45 编辑

其实,在上篇文章中,DataManager之自定义请求之验证Token。我们已经介绍了如何使用DataManager设置token 。但是上文以集算表为例,那么,如何在ReportSheet也实现token呢?
下文将带你实现此功能。
一数据源准备
  1. let studentList = [
  2.     {id: 1, name: "张三", age: 4, sex: 0, classId: 1},
  3.     {id: 2, name: "李四", age: 8, sex: 1, classId: 1},
  4.     {id: 3, name: "小王", age: 7, sex: 0, classId: 2},
  5.     {id: 4, name: "小韩", age: 8, sex: 1, classId: 2},
  6.     {id: 5, name: "小明", age: 7, sex: 0, classId: 3}
  7. ];
复制代码
我们在NodeJS中创建一个Express Web 应用框架,然后创建一个app实例,返回学生数据。
创建package.json

  1. {
  2.   "name": "query",
  3.   "version": "1.0.0",
  4.   "main": "index.js",
  5.   "scripts": {
  6.     "test": "echo "Error: no test specified" && exit 1"
  7.   },
  8.   "keywords": [],
  9.   "author": "",
  10.   "license": "ISC",
  11.   "description": "",
  12.   "dependencies": {
  13.     "body-parser": "^1.20.2",
  14.     "cors": "^2.8.5",
  15.     "express": "^4.18.1",
  16.     "jszip": "^3.10.1"
  17.   }
  18. }
复制代码

创建student.js:
  1. const express = require("express");
  2. var cors = require("cors");
  3. var bodyParser = require('body-parser');
  4. const student = express();
  5. student.use(cors());
  6. student.use(bodyParser.json())


  7. let studentList = [
  8.     {id: 1, name: "张三", age: 4, sex: 0, classId: 1},
  9.     {id: 2, name: "李四", age: 8, sex: 1, classId: 1},
  10.     {id: 3, name: "小王", age: 7, sex: 0, classId: 2},
  11.     {id: 4, name: "小韩", age: 8, sex: 1, classId: 2},
  12.     {id: 5, name: "小明", age: 7, sex: 0, classId: 3}
  13. ];
  14. student.get("/student", (req, res) => {
  15.     res.json(studentList);

  16. });

  17. student.listen("3000", () => {
  18.     console.log("=========服务启动了,在3000端口=========");
  19. });
复制代码
通过上述代码,我们就简单创建了一个nodejs服务,我们运行一下node student.js ,此时在浏览器中访问 http://localhost:3000/student ,将返回学生列表:
image.png211003111.png
接下来,我们创建一个接口,用来处理token。
  1. student.get("/studentByToken", (req, res) => {
  2.     let Authorization = req.headers["authorization"];
  3.     console.log(Authorization)
  4.     let temp = []
  5.     studentList.forEach(item => {
  6.         if (item.id == Authorization) {
  7.             temp.push(item)
  8.         }
  9.     })
  10.     res.json(temp)
  11. });
复制代码
在上述代码中,我们简单得处理了下token  ,根据token返回不同的学生列表。
二、SpreadJS创建数据源
在SpreadJS ,我们来添加一个学生表:

  1.    var dataManager = spread.dataManager();
  2.   dataManager.addTable("student", {
  3.             remote: {
  4.                 read: function () {
  5.                     return XXX
  6.                 }
  7.             }
  8.         });
复制代码

在前面的文章中,报表插件(ReportSheet)设置数据源 ,我们已经介绍了多种方式设置数据源,这里我们直接返回一个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.     }
复制代码
在上面的代码中,我们使用fetch调用了"http://127.0.0.1:3000/studentByToken"接口,然后设置了headers ,然后返回查询后的数据。
接下来,我们设置下read:
  1.      dataManager.addTable("student", {
  2.             remote: {
  3.                 read: function () {
  4.                     return getStudentList(1)
  5.                 }
  6.             }
  7.         });
复制代码
在上面的代码中,我们传递了一个值为1的token 。
当需要更新token时,我们来重设read:
  1. document.getElementById('reset').addEventListener('click', function () {
  2.             let myTable = spread.dataManager().tables["student"];
  3.             let options = myTable.options
  4.             options.remote.read = function () {
  5.                 return getStudentList(2);
  6.             }

  7.             myTable.options = options;
  8.             refreshData(spread)

  9.         })
复制代码
在上面的代码中,我们重写了学生表的options ,传递值为2的token  。
三、创建报表
接下来我们来创建一个报表,实现上面的功能
  1. function initReport(spread) {
  2.         const reportSheet = spread.addSheetTab(0, '报表1', GC.Spread.Sheets.SheetType.reportSheet);
  3.         const templateSheet = reportSheet.getTemplate();
  4.         const columns = ['id', 'name', 'age', 'sex', 'classId'];
  5.         columns.forEach((columnName, i) => {
  6.             let obj = {
  7.                 type: "List",
  8.                 binding: `student[${columnName}]`,
  9.             }
  10.             templateSheet.setValue(0, i, columnName);
  11.             templateSheet.setTemplateCell(1, i, obj)
  12.         })
  13.     }
复制代码
在上面的代码中,新建了一个报表sheet , 然后在模板中设置了字段。

四、结果
初始化:
image.png432460021.png
更新token :
image.png863439941.png


完整代码,参考附件: read_header.html (5.02 KB, 下载次数: 2)

0 个回复

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