当前位置: 首页 > news >正文

低代码平台ToolJet实战总结

这是一个不是低代码的低代码平台,这是自己试用的感觉。

一.安装企业版
tooljet下载安装文档可以参考:https://docs.tooljet.ai/docs/setup/docker
1.下载docker-compose.yaml
curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/docker/docker-compose-db.yaml
mv docker-compose-db.yaml docker-compose.yaml
mkdir postgres_data

2.下载.env文件
curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/docker/.env.internal.example
curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/docker/internal.sh && chmod +x internal.sh
mv .env.internal.example .env && ./internal.sh

3.启动
docker-compose up -d

二.安装开源版
装好企业版后,发现free plan有很多限制,只能建一个App, 而且是没有多级菜单的,如果自己设计菜单页面,那就是只能通过APP的方式分开不同的功能。
删除前面的安装。
按前面安装企业版的方法重来一遍。
只是下载docker-compose.yaml 完成后,将里面的tooljet的镜像修改成开源版的:
image:tooljet/tooljet-ce:latest
保存后启动
docker-compose up -d
此时登录就是开源版了,没有APP数量限制了。

三.创建APP的数据库
设定一个业务实例:设备的点检,不同的点检方案有不同的检查点和标准。消防设备和会议室设备要点检,标准为:
消防设备每月点检一次,会议室设备点检每周点检一次。
消防设备点检标准:
    a.检测方案:目测     有效期是否过期
b.检测方案:目测     保险是否已经被打开
c.etc.

会议室设备点检标准
    a.检测方案:目测     投影仪是否清晰
b.检测方案:目测     会议室桌椅是否摆放整齐
c.etc.

1.数据库准备,需要创建三张表:点检标准表,点检项目表,设备点检表
2.把数据表记录的添加,删除,更新的存储过程写完
3.tooljet的data source设置连接到你的数据库,创建一个checkdb的数据源。

四.使用它tooljet实现APP页面
1.创建Sql Query
创建查看的Query
SELECT * FROM CHECK_STANDARD
注意点:
a.表中需要手工添加一条记录,否则你绑在table上,页面加载后table里字段值不显示出来。
b.query建好后,setting中要把页面加载时运行勾上,否则你打开页面时是一片空白。如果你使用js调用actions.runQuery('yourqueryname')显示数据,那是没有影响的;

2.执行存储过程的Query.
EXEC CHECK_STANDARD_DELETE @ID={{componets.standardid.value}} 直接把组件值写在里面运行是最简单的,但是这个query就不能被复用。希望通过传参方式,但这个地方的传参是最坑人的。似乎创建的parameter永远不被赋值,但是你直接在参数的value里面赋值又时可以的,最后搞得自己没有办法,使用variables来传值。
EXEC CHECK_STANDARD_DELETE @ID={{variables.standardid}}
另外这里还有一个会容易误导的sql parameter,通常用于自己测试。

3.创建JS Query
因为不能传参到sql query,所以自己就需要再包一个js来实现sql query的调用。js query传值就很顺利,按钮配置传入啥,js query就能接住啥,然后俺就把接到的值传个variables,然后再执行sql query,真是官大一级压死人,不搞个全局变量都搞不定这个query.
actions.setVariable('standardid', parameters.standardid);
actions.runQuery('CHECKSTANDARD_DELETE');
有点绕,但有效,弊端也很明显,query创建数量就翻倍了。

4.创建APP的页面
a.界面组件:从组件库里面拖拽到页面上,改改描述,改改名,这是低代码的体现,但是相比之下,效率也是低下的。
搞笑的是,组件可以设置必填,但是你用的时候,如果鼠标光标不在组件里面,是不会触发验证的。
取值时要注意组件的层级,比如你的文本输入框如果在Form里面,取值的时候{{components.loginform.data.usernameInput.value}}
b.一般数据绑定:然后就是绑定数据显示。一般用到globals.,variables.,components.,querys.,parameters.等。
日期设置当天的默认值:  {{variables.selectedRow?.plan_date || new Date().toString()}}
比如下拉选项框中的列表:
{{queries.typename_get.data}},注意你查询中的字段要对应label ,value
比如选中行,编辑modal中文本字段的显示值:
{{components.checkstandard.selectedRow?.STANDARDNAME||''}}
c.特殊值绑定:上面这些是比较简单的绑定,一般不会遇到问题,如果遇到不显示通常都是语法问题。
比较麻烦的是日期控件的显示,编辑页面下拉框默认选中显示原值。
下拉框的原值显示,主要利用default这个参数,实现默认显示。
{{queries.equipment_type_get.data.map(option => ({
label: option.label,
value: option.value,
disable: false,
visible: true,
default: option.value === variables.selectedrow.typeid 
}))}}
数据库中取出的日期控件值很麻烦,我直接在数据库查询中format(checkdate,'MM/dd/yyyy') 格式化。
d.图片和pdf:点检过程要拍照,所以用了imagepicker,pdfPicker,然后将上传的图片保存到数据库的var(max)字段中。
上传图片,保存数据库的值
{{components.imagePicker.file[0].base64Data}}
上传pdf,保存数据库的值
{{components.pdfPicker.file[0].base64Data}}
显示这些图片和pdf文件的时候,绑定查询值时用,url修改成如下:
{{'data:image;base64,' + queries.getFiles.data[0].image}}
{{'data:pdf;base64,' + queries.getFiles.data[0].pdf}}
e.table的批量添加行:通常我们都需要自己创建一个modal用来添加数据,但是使用table中的添加行也是可以的,相当于在表格中直接填写数据,虽然不能调整大小和宽度,但是一般的输入也是可以接受,比modal中一条条添加要好。
然后在保存事件中:
// 获取所有新添加的行数据
const newRows = components.checkstandard.newRows;
// 验证是否有新数据
if (!newRows || newRows.length === 0) {
alert("没有要保存的新数据!", "warning");
return;
}
//全局变量传sql query
for (let i = 0;i < newRows.length; i++) {
const row = newRows[i];
actions.setVariable('cp_stdname', row.STANDARDNAME);
actions.setVariable('cp_purpose', row.purpose);
await actions.runQuery('CHECKSTANDARD_ADD');
}
// 保存成功后操作
showAlert(`成功保存 ${newRows.length} 条记录!`);
// 清空新行
components.your_table_name.clearNewRows(); 
// 刷新表格数据
actions.runQuery('CHECKSTANDARD_GET');

折腾了好一阵终于把Tooljet路走通,回头一看这不是我要的低代码工具,这代码量不少,效率也不高,那些星是怎么来的呀,也可能自己刚刚上手还没有摸透它的脾气,但是开源版没有像其他平台那样限制用户数,限制数据量,这个是真的。

http://www.lryc.cn/news/593537.html

相关文章:

  • 网络大提速,RDMA,IB,iWrap
  • windows docker-03-如何一步步学习 docker
  • 游戏开发日志
  • SurfaceView、TextureView、SurfaceTexture 和 GLSurfaceView
  • eNSP综合实验(DNCP、NAT、TELET、HTTP、DNS)
  • 西门子 S7-1500 PLC 电源选型指南:系统电源与负载电源的核心区别
  • 【Linux服务器】-zabbix通过proxy进行分级监控
  • 【初识数据结构】CS61B中的基本图算法:DFS, BFS, Dijkstra, A* 算法及其来历用法
  • JavaSE-接口
  • 枚举类高级用法
  • 嵌入式学习-PyTorch(8)-day24
  • Ubuntu20.04 samba配置
  • 读书笔记:最好使用C++转型操作符
  • UE5制作小地图
  • CSS篇——第二章 六十五项关键技能(下篇)
  • Django3 - Web前端开发基础 HTML、CSS和JavaScript
  • 【C语言进阶】题目练习(3)
  • 【RK3576】【Android14】摄像头MIPI开发调试
  • Android Auto 即将推出新功能
  • 7月19日日记
  • NJU 凸优化导论(9) 对偶(II)KKT条件+变形重构
  • react+antd+表格拖拽排序以及上移、下移、移到顶部、移到底部
  • Git仓库使用
  • 网络原理——TCP
  • string【下】- 内功修炼(搓底层)
  • 零基础 “入坑” Java--- 十二、抽象类和接口
  • LibreTv在线观影项目部署开箱即用
  • QT窗口(5)-对话框
  • MySQL基础教程
  • 变频器实习Day10