目录
目前低代码概念已经无人不知,随着新冠病毒的爆发,远程办公、视频会议、直播等数字化应用迅速发展起来,也让低代码平台迎来了特别关注。那么问题来了,什么是低代码开发?低代码平台对未来的数字化、智能化生态会产生什么影响?
低代码开发是通过页面拖拉拽的形式实现在线构建应用程序,旨在简化开发过程,缩短开发周期,提高开发效率,节省开发成本。 通过低代码开发平台(有的也叫无代码开发平台),零代码基础也可以快速构建应用。
微软2019年首次发布了它的低代码平台-Power Platform,今年腾讯将tmagic-editor页面可视化编辑器对外开源,阿里也发布了低代码引擎LowCodeEngine,感兴趣的朋友可以阅读相关资料了解一下。国内大部分厂商真正集中投入低代码平台发展也不过数年,这些厂商紧随着云原生和数字化浪潮不断迭代演进,相比很多前沿风口行业来说,低代码在国内的发展算得上是脚踏实地接地气了。下图是2021年谷歌中低代码概念的搜索趋势。

百度公司的低代码平台产品叫爱速搭,amis 是爱速搭团队开源的前端低代码框架,爱速搭应用中的页面都是基于 amis 渲染的,同时爱速搭平台自身的绝大部分页面也是基于 amis 开发,注意是大部分不是全部哦,也就是项目还是离不开专业开发的。amis 的定位是前端 UI 框架,通过JSON配置生成各种后台页面,甚至可以不需要了解前端,类似于 Element、Ant Design,可以基于它快速开发前端页面,但需要自己整合到自己内部系统中,并且实现路由功能。
因为我现在做的项目集成了百度的amis框架,所以本文仅对amis的使用做个简单介绍,并附上具体实例供大家参考。
官网api地址: https://aisuda.bce.baidu.com/amis/zh-CN/components/index
在经历了十几年的发展后,前端开发变得越来越复杂,门槛也越来越高,要使用当下流行的 UI 组件库,你必须懂 npm、webpack、react/vue,必须熟悉 ES6 语法,最好还了解状态管理,比如 Redux,如果没接触过函数式编程,光入门都很费劲,而入门之后会发现它还有巨大的生态,相关的库有 2347 个,很多功能相似,挑选成本高。
然而前端技术的发展不会停滞,等学完这些后可能会发现大家都用 Hooks 了、某个打包工具取代 Webpack 了……
而有时候其实只想做个普通的增删改查界面,用于信息管理,,类似下面这种:

这个界面虽然用 Bootstrap 及各种前端 UI 库也能做出个大概,但仔细观察会发现它有大量细节功能,比如:
全部实现这些需要大量的代码。用 amis 只需要 157 行 JSON 配置(其中 47 行只有一个括号),你不需要了解 React/Vue、Webpack,甚至不需要很了解 JavaScript,即便没学过 amis 也能猜到大部分配置的作用,只需要简单配置就能完成所有页面开发。
这正是建立 amis 的初衷,我们认为:对于大部分常用页面,应该使用最简单的方法来实现,甚至不需要学习前端框架和工具。
为了实现用最简单方式来生成大部分页面,amis 的解决方案是基于 JSON 来配置,因为大多数开发人员无论前端还是后端都会接触到JSON这个简单易用的数据格式,但使用 JSON 有优点但也有明显缺点,在以下场合并不适合 amis:
感觉官网说的还有些含蓄,大概意思就是一些简单的功能可以用amis进行配置开发,一些定制化程度高的需求不适合。某些大厂说的80%的项目可以用低代码平台开发也是这个意思,剩下的20%才是开发人员需要重点攻克的,实际做项目还是要结合两种方式,实现低代码开发和代码开发两条腿走路。
amis 有两种使用方法:
SDK 版本适合对前端或 React 不了解的开发者,它不依赖 npm 及 webpack,可以像 Vue/jQuery 那样外链代码就能使用。我是采用这种安装方式在前端vue项目种安装了amis组件,因篇幅有限具体安装方式大家参考官网吧,本文重点是通过实例讲解amis编辑器的用法。如果还没有具体需求,也可以跳过安装的部分,通过官网的在线编辑器进行学习。
去amis官方文档页面了解更多。
一个最简单的 amis 配置看起来是这样的:
{
"type": "page",
"body": "Hello World!"
}
请观察上面的代码,这是一段 JSON,它的含义是:
type 是 amis 节点中最重要的字段,它告诉 amis 当前节点需要渲染的是Page组件。
而 body 字段会作为 Page 组件的属性,Page 组件根据这个值来渲染页面内容。
这个简单代码在amis编辑器种就会渲染出一个简单页面,可以实时预览,相信用过Echarts图表的人可能体会过这种便利性,我们只要修改七种的各个属性值就会看到页面发生神奇的变化。复杂点的页面也是通过这样一个个简单的组件搭建起来的,比如列表组件、按钮组件、表单组件及表单中的input/select/radio/switch开关等,这些组件的不能功能是通过不同的属性来控制的。

在编辑器左侧组件选项卡中选择CRUD组件拖入主界面,找不到的话可以搜一下,通过中英文名字都可以。组件拖过来之后会出现一个弹窗配置页面,接口地址是相对地址(除掉IP、端口和项目根路径),选择列表中需要实现的按钮,这里我选了查询、查看详情和编辑功能。这些配置也可以先不管,在组件初始化后都可以再修改,配置是实时保存编译的。
列表最主要的是查询功能,一般低代码平台会选择在数据建模的基础上实现接口(建模是通过配置字段、表名等生成数据库表模型),我也是刚入门自己探索了一下,在没有建模的基础上实现的这个例子,也就是说接口都是基本的查询数据库。

右面有个面板可以修改当前组件的各种属性,我在“常规”选项卡中改了启动查询条件,在“接口”选项卡中改了接口查询方式为POST(代码中对应initApi属性),从左面的代码面板中可以查看生成的JSON代码,红框中就是列表的的其中一个字段,name属性是数据库返回的字段名,label是页面显示的列名,type是数据类型,可以根据需求增加需要展示的字段列。

查询功能需要注意:


组件勾选了后自带了查看详情功能,点击详情按钮会弹出一个dialog组件,默认子组件会继承父页面的数据,包括列表中没有展示的字段,所以不用加接口,在列表查询的时候尽量把字段都查出来就行。我这里没用自带的,而是配置了一个新的页面,代码如上图所示,通过在dialog组件中加入service组件实现的,url是另一个amis表单的地址(这里页面是有有个解析接口,每个页面配置后都会生成一个url地址),data属性不用传值,来自列表中某一行数据。弹窗详情页面如下图所示:

在增删改查列表设计页面,查看详情按钮后面拖入一个提交按钮,点击提交按钮查看相应代码如下:
{
"type": "button",
"label": "提交",
"actionType": "dialog",
"dialog": {
"title": "XX表单提交",
"size": "xl",
"body": [
{
"type": "service",
"schemaApi": {
"method": "post",
"url": "/AmisTemplate/getTemplateByCode?AMIS_MODEL_CODE=SUBMITFORM",
"data": {
"id": "${ID}",
"number": "${NUMBER}",
"assetName": "${ASSETNAME}",
"price": "${PRICE}",
"model": "${MODEL}",
"producer": "${PRODUCER}",
"brand": "${BRAND}",
"city": "${CITY}"
}
},
"messages": {
}
}
],
"actions": [
]
}
}
解释:跟查看详情的实现方式差不多,也是在dialog弹窗组件中引入了另一个配置页面,不同的是对新页面做了数据映射,上图中右侧大写的数据是列表数据字段,左侧小写的是提交表单中用到的数据。
下图是提交按钮对应的Json代码,点击按钮会发送一个ajax请求。
{
"type": "button",
"label": "提交",
"actionType": "ajax",
"visibleOn": "this.STATUS!=='1'",
"api": {
"method": "post",
"url": "/flow/amis/startWorkFlow",
"data": {
"&": "$$",
"processDefinitionKey": "flow_asset",
"businessKey": "",
"processName": "XX管理流程",
"modelCode": "ASSET"
},
"dataType": "json"
}
}
其中data中的参数需要注意:
当数据域里的变量值为$$时, 表示将所有接口返回的data字段值整体赋值到对应的 key 中
至此,第一个实例做完了,目前博主也正在学习amis框架的用法,后续会继续输出更多实例,有喜欢amis的朋友可以一起交流啊!

如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg
我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案
我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru
我正在处理旧代码的一部分。beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)endRubocop错误如下:Avoidstubbingusing'allow_any_instance_of'我读到了RuboCop::RSpec:AnyInstance我试着像下面那样改变它。由此beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)end对此:let(:sport_
我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur