
本文来自明道云资深研发经理孙伟,在明道云2022年秋季伙伴大会活动演讲,经校对编辑后整理为演讲精华。
很多客户选择我们的一个重要原因,是明道云所能提供的产品开放能力。开放其实是没有选择的,坦白来讲,我也不希望开放,我希望客户所有的业务系统都用明道云管理,这样对我们是更有利的。但是,现实中因为企业业务的多样性与复杂性,没有任何一家平台可以做到一站式解决所有问题。为了方便客户,我们就必须开放自己,让客户用得更好。
1.一个典型的业务场景需要多少个系统?
我们先来看一个典型的业务场景。一个客户从网站上下了一个订单,经销商收到订单之后去向企业订货。企业订货之后如果自身不进行生产,就需要向供应商采购。供应商生产好之后,需要去找物流公司发货。发货完成,客户最后进行收货。这样一个企业日常经常涉及到的环节,会需要用到哪些系统?

从下单开始,可能需要有一个电商平台,比如京东、天猫;也有一些客户是自营的,会使用一些小程序,会涉及到支付系统。还会涉及到业务管理,使用CRM、ERP等管理系统。如果他是分销商体系,还要有分销系统。如果是工厂还会涉及到MES系统、物流管理系统等。这么多系统,让一家企业来完成是不太现实的,并且如果中间任何一个环节不能与其他系统友好互通,客户可能就不会选择你了。
2.明道云为什么需要开放?
如果不考虑交互能力,理论上来说明道云是可以搭建任何一套业务系统的。但是,我们的客户有很多个性化需求,让我们必须选择开放。
这些场景用明道本身来做就不太合适,我们不能友好实现这些客户需求,所以我们只能选择开放自己,交给别的产品来完成。

大家一起看一下,明道云为了平台开放性做了哪些工作。
1.开放平台
它其实是明道老的协作模块的产物。因为明道云是一个企业协作的平台,支持用户或者是第三方开发者进入明道云的开放平台,去设计开发一些扩展应用,然后上架到明道云的应用市场,进行推广并获得额外的收入。当然,这里的扩展应用不是指我们现在用明道云搭建的应用。
最典型的是第三方的SaaS与明道云的结合,它是基于Auth2.0授权机制,通过账号密码登录后拿到token,再去获取一些数据。这里主要就是老协作模块,比如动态、任务、日程、群组;另外还有组织与账户。比如,我拿到账户信息以及用户加入的网络信息后,对网络下的用户做消息的推送集成功能。
当然,现在明道云的产品路线图里也有集成中心、开发者中心,并且将来可能会融合在一起,打造一个全新的明道云开放平台。

2.企业授权开放接口
我们前面讲的开放平台是基于个人授权,所有数据都是用户自己的;而企业的授权开放接口是独立于明道云个人的授权API。未来,这两套体系会共存。
这套授权体系完全服务于企业相关的数据接口,有较高的权限级别,现在这套密钥只有网络管理员在后台才可以看到,主要内容包括三大块:
审批。明道云现有的审批可以通过这一套体系在线创建审批,获取审批列表,为每个审批配置一个Webhook通知节点。当明道云的审批有任何的变化,它可以把变化通知到外部的系统。
组织架构。又分为四项:用户、部门、职位、汇报关系。我们通过这些接口,与外部第三方平台做账号集成,主要用于数据的增删查改,包括与第三方已有的类似数据的关联处理。
应用管理。应用指明道云中搭建的应用。我们可以在线创建应用,并获取应用下面的授权信息。

3.应用OpenAPI
每创建一个应用,明道云都会自动为它生成一套API示范模板。应用管理员可以看到应用的API开发文档,里面涵盖了白名单、授权管理、授权密钥。它也是非个人的,只要是应用下的数据,全部可以获取到,但是权限分为了全部权限和只读权限。只读权限就是指可以开放给第三方来调数据,但是不允许他进行编辑删除。
除了授权之外,核心的功能还有什么?第一,组织架构,我们可以通过应用的授权信息获取应用的组织结构,包括菜单项、工作表,获取工作表的结构信息,包括一些控件列表。其次就是应用数据,我们可以对于应用数据做增删查改。还有一个大块是应用权限体系,我们可以通过这一套API,去对应用下的角色做一些处理。

4.工作流Webhook
前面讲的这些,开放平台也好,API也好,都需要第三方系统。但是有的时候,我们并不需要挂第三方系统,而想要用无代码的方式与外部系统做比较好的结合。那么,明道云工作流就支持用Webhook与外部互通,它主要分两种方式:Webhook节点和API请求节点。
Webhook节点会自动生成一个URL链接,被动地接收外部消息的请求。我们知道,数据同步一般分两种,一种是这种传统的集成,定时地批量同步;还有一种消息集成模块,遵循IFTTT模式进行实时同步。比如我在另一个平台里面做了一个实时的操作,假设这个平台也是支持消息推送的,它就可以往Webhook节点推一条消息通知。明道云拿到之后就可以去实时获取信息,不需要每过一段时间再去拉取它。
API请求节点以前也叫Webhook节点,后面因为我们做了集成中心,所以才改成了API请求节点。明道云内部的一些事件触发或者是定时任务,就可以去请求外部地址。这个请求可以是获取数据,也可以是把明道云的数据推送给外面。

5.工作流代码块
工作流Webhook是基于HTTP的,但是现实中有一些传统的系统,或者一些比较特殊的系统,它的授权模式比较复杂,所以我们针对有开发能力的这部分客户做了一些比较深入的能力,就是工作流中的代码块节点。
它主要有两种开语言:Javascript和Python。Node.js和Python有些版本会引用一些包,比如有一些复杂的授权模式,通过API的方式不能够直接对接,那我们就可以通过代码块,自行引用。
我们去做一些请求的时候经常需要前置处理请求参数,比如拿到参数之后需要对返回的数据做一些预处理。如果我们通过现有的工作流节点去处理它,就会比较麻烦。但有了代码块,我们就可以在请求前先对请求参数做优化,拿到请求结果之后再做格式化处理返回给前端,这样就会相对友好一些。

6.集成中心
现在的集成中心可以封装一组授权认证,包括一个API的接口组,很方便地供企业内部甚至外部用户去调用,我们现在已经预置了天眼查、小鹅通、易签宝等等这些接口。前面我们提到的客户有在线签单的要求,明道云本身做不到,但是如果我们和e签宝合作,就可以通过明道云的一个节点,快速完成这些操作。

7.工作表/自定义页面
API查询控件。前面我们提到的Webhook和集成中心,他们的流程都是有滞后性的,以前没有API查询控件的时候是怎么处理的?处理流程一般是这样的:记录创建或者更新之后,自动触发一个工作流,工作流再去做一些逻辑,最后将结果更新到工作表中。这种做法结果不是实时反馈的,所以我们推出了工作表控件API查询,它允许在界面上直接地调用第三方的接口,在界面上实时反馈,它也是一个按钮,点击查询之后把数据实时地呈现到页面上来。
嵌入控件。工作表和自定义页面都有嵌入控件,明道云现有的控件可能不能满足一些客户的需求,那客户就可以自己开发一些控件,通过嵌入控件嵌在明道云中,做好单点登录、账号集成,这样就可以实现自定义控件的能力。
自由连接控件。这个控件可能用的人不是很多,它主要是连接明道云的老协作模块,包括动态、任务等。比如一条工作表记录跟一个日程或者任务有关,我们就可以把它关联过来。
文本识别。自带的能力主要是身份证跟一些发票的识别。因为有了我们API能力,其实我们可以自己去扩展更多的OCR识别能力。

8.公开表单、外部门户和分享
公开表单
现实中我们有很多的需求是不需要有状态的,只是需要收集一些外部数据。比如政府单位做民意调查,或者我们明道云的伙伴大会要收集报名信息,这种情况我们不希望用户注册,只需要拿到这些数据就行了。
明道云提供了公开表单的能力,允许用户将现有的工作表生成并发布一个公开链接或者二维码,让外部用户直接填写。填写完之后,我们也可以生成一个公开查询的链接,用户通过自己刚才填写的关键性的信息,就可以把之前填报的详细数据再查出来。
外部门户
公开信息是无状态的,它不会去记录填写人的一些标识性的身份信息,因为它没有账号或者权限体系,可能在某些场景下就不太适用。比如我前面讲到那个场景,一个经销商跟一个工厂的协作,经销商去采购的时候,我不希望他去注册明道云账号,但是我又希望他有一定的权限,能够看到自己历史的数据;并且能够对这个经销商做身份认证,比如通过手机号、微信号等进行认证。
这种场景下,我们为每一个应用提供了外部门户的能力。用户可以配置自己企业微信号、公众号,集成消息通知功能,用户通过第三方平台就能无感知地进入应用,完成操作。
分享
分享用在什么场景呢?分享的内容不需要有状态,也不需要有外部数据,只需要核对能力。举个例子,我妻子的公司是做谷歌推广的,他们每个季度都需要跟供应商做账单核算。之前我看她很辛苦地拿Excel做汇总,再为每个供应商生成一个单独的Excel,发给客户去确认。
我说你完全不需要这样做。我花了几分钟时间,搭建了两张表。数据导进来后,为每个供应商自动生成了一条对外分享的二维码。再把这二维码分享给他,他扫码就能看到历史账单记录,这样供应商的体验也很好,工作效率也大大提升。
我们在接下来的版本会强化分享能力,能够支持更多视图种类的分享,支持分享出去的记录可以配置哪些数据是可以填写的,支持生成类似分享密码、密钥的身份验证工具。

9.前端开源
我们针对高端玩家提供了一个前端开源能力,零门槛获取并扩展APaaS能力,充分实现前端界面的个性化。通过前端开源,用户可以对界面做排版、交互上的优化,再结合我们的刚才讲到的这些自定义的界面,就可以去实现更多的交互可能。

10.第三方平台集成
我们进入明道云的后台账号里面,会看到有一个集成中心,它现在集成了企业微信、钉钉、微信公众号、飞书、Welink,包括其他LDAP方式的授权。通过这些集成,可以做到消息推送、账号体系同步。再根据刚才说的企业级的授权接口,就可以以现有的第三方平台做账号集成和消息推送。

讲了这么多我们明道云开放的能力,我们再回过头来看明道云可以怎么做?
还是刚才开头提到的场景,从客户下单到完整的结算。假设我们没有用第三方系统,该怎么做?首先,客户下单平台有特殊的交互,可以通过前端开源加上外部门户,用微信号、手机号登录,实现这种小程序的能力。将其嵌入到公众号中,用户可以直接在线下单,查看自己的订单记录,使用微信的支付系统。
到业务流转环节,经销商的订货、企业接单、供应商生产制造,他们之间的信息融合就可以通过应用的API、工作流的Webhook。再结合一些外部门户的能力,在这些不同的角色之间做数据的协作流转。如果是物流发货或者一些对实时性要求高的场景,就可以集成第三方平台或者使用API查询控件、工作流代码块。员工在明道云界面上就可以实时获取物流信息。

除此之外,我们还需要哪些能力?我大概总结一下我们要做的4大块的内容。
第一是开放平台。我最早讲的开放平台是老的协作模块的产物,它对我们目前应用下面的API支持还不够友好,所以后面计划开放平台会加入更多的应用级别的接口。或者我们现在应用API是应用级别的,后面我们也会支持用户生成个人的授权token,它的接口只可以获取自己的数据,这样再去做应用第三方集成的时候会方便很多。
第二就是SDK。现在应用对接系统的时候,它是要根据我们的示例代码,它的别名比较复杂,控件类型比较多,筛选类型比较多。后面我们会针对不同的开发语言提供针对性的SDK,用户再去对接OpenAPI的时候就会更方便。
第三是用户期望已久的数据集成能力。增加直连数据库能力,数据在第三方,我不希望同步过来,但是又希望拿到类似我们现在API查询里的结果。比如企查查,其实工商信息是存在那边的,但是我可以通过接口的方式拿过来,通过直连数据库直接获取到这部分数据。然后就是外部数据源的同步,要支持外部的数据源给写到明道云,或者是明道云的数据写到外部的数据库,当然也可能是明道云不同网络下的应用,把一个工作表的数据同步到另外的一个应用的工作表中。
第四个就是插件能力。有的伙伴是有AI能力的,那么可以开发一个自定义控件,放到应用市场,大家下载之后就天然有了AI的能力。我们的插件中心主要包含了自定义控件、工作流自定义节点、自定义的视图、自定义的函数,有了这些能力后,我们对这些有深度开发能力的客户提供了一种可能,我们把自己的产品能力直接放到应用市场或者开发者中心,上传过去就可以供客户方便地使用它。

假设我们有一个字符串str。如果str仅包含一个字符,例如str="1",则str[-1..1]返回1.但是如果str的size(length)比一个长,比如str="anythingelse",然后str[-1..1]返回""(空字符串)。为什么Ruby会这样解释字符串切片? 最佳答案 这种行为正是字符范围的工作方式。范围开始是-1,这是字符串中的最后一个字符。范围结束为1,即从开始算起的第二个位置。所以对于单字符字符串,这相当于0..1,也就是那个单个字符。对于双字符字符串,这是1..1,即第二个字符。对于三个字符的字符串,这是
在MichaelHartl的RailsTutorial中,许多示例使用expect()方法。这是cucumber步骤定义中的一个这样的例子:Then/^sheshouldseeherprofilepage$/doexpect(page).tohave_title(@user.name)end同样的例子可以写成同样的效果:Then/^sheshouldseeherprofilepage$/dopage.shouldhave_title(@user.name)end为什么要使用expect()?它增加了什么值(value)? 最佳答案
我正在阅读“Rails3Way”,在第39页,它显示了匹配:to=>重定向方法的代码示例。在该方法中存在以下代码。虽然我知道模对数字有什么作用,但我不确定下面的%是做什么的,因为路径和参数显然都不是数字。如果有人能帮助我理解%在这种情况下的用法,我将不胜感激。proc{|params|path%params} 最佳答案 这可能是String#%与其他语言中的sprintf非常相似的方法:'%05d'%10#=>"00010"它可以接受单个参数或数组:'%.3f%s'%[10.341412,'samples']#=>"10.341sa
如何使用Capistrano将Rails应用程序部署到无法访问外部网络或存储库的生产或暂存服务器?我已经设法完成部署的一半,并意识到Capistrano没有在我的本地机器上下载gitrepo,但它首先连接到远程服务器并尝试在那里下载Git存储库。我希望有一个类似Javaee的构建系统,其中创建可交付成果并将该可交付成果发送到服务器。就像您构建.ear文件并将其部署到您想要的任何服务器上一样。显然在RoR中,你被迫(据我所知)在该服务器上构建应用程序,在那里创建一个gem存储库,在那里克隆最新的分支等等。有什么方法可以将准备运行的包发送到远程服务器吗? 最佳答
我一直在使用zeroMQ,我希望能够通过Internet安全连接。我在ruby中,可以使用SSL和/或某种shh连接,但找不到有关如何执行此操作的任何示例。我找到了这个旧的stackoverflow链接,HowdoeszeromqworktogetherwithSSL?说他们正在研究某种安全性,但那是一年前的事了,我找不到任何新的引用资料。即使这不是内置在zeroMQ中,我也假设会有一些方法可以使用OpenSSL或类似的东西来设置它。注意:如果您想要安全传输,zeroMQ网站提到使用VPN或其他东西。我不想使用VPN。一定有更好的方法。 最佳答案
我遇到了sinatracondition方法,但对它的工作原理感到困惑。我有一段代码:defauthuserconditiondoredirect'/login'unlessuser_logged_in?endend它检查用户是否登录了某些路由,示例路由:get'/',:auth=>:userdoerb:indexenduser_logged_in?方法定义在项目lib目录下的帮助文件中:defuser_logged_in?ifsession[:user]@user=session[:user]return@userendreturnnilend所以,问题是:conditionbloc
如果有人能提供一些关于在没有互联网连接的计算机上安装rubyonrails3.x框架的见解,我将不胜感激。所有教程或解释似乎都假设始终存在互联网连接。有没有简单的方法来下载包含所有依赖项的包并简单地安装包。提前致谢 最佳答案 最后。您需要手动下载的Gem的完整列表,以便在离线模式下安装Rails(或在阻止您的“gem”命令工作的代理之后)。此列表假定您已经拥有以下内容(Windows7):Ruby1.9.2RubyGems1.8.24DevKit列表。转到rubygems.org并使用搜索功能下载以下每个Gem。您不需要键入
我认为这可能有效"abcdefghijk".each{|c|putcc;sleep0.25}我希望看到“abcdefj”一次打印一个字符,每个字符之间间隔0.25秒。但是整个字符串是一次打印出来的。 最佳答案 两件事:您需要使用.each_char来遍历字符。在Ruby1.8中,String.each将逐行进行。在Ruby1.9中,String.each已弃用。如果您希望字符立即出现,您应该手动刷新$stdout。否则,它们往往会被缓冲,以便字符在最后一次出现。.#!/usr/bin/envruby"abcddefghijk".ea
互联网这头“猪”真的掉下来了流量红利已经一去不复返了!3年前业界其实已经发出各种密集信号,在当时无论是BAT还是一些经济学家在3年前都已经预测过,互联网的流量模式已经衰竭,并且它将一去不复返。曾经处于互联网大潮的我们这一代人有喜有有悲也有感慨。还在4-5年前不少程序员会发觉在一个地方工作一年再跳一家公司,工资翻倍是至少的。其实这不是能力的表现这只不过是因此我们赶上了互联网流利红利、风投资本红利的“风口”而己。“赶上风口就连老母猪都能上树"用于形容当时的情形一点不为过。可是这个“风”这次是真的过去了,因此这头“猪”掉了下来,而且这次摔了还挺狠,直接给摔成了肉饼。业务模式、生态、环境的变革是时代的
高科技摄像头特别是海康萤石摄像头,已经不再只局限于简单的视频功能,特别是智能AI的普及,摄像头也华丽变身成了一个个独立的智能个体,可以实现人脸抓拍,人形检测,客流统计等店铺值守场景,也可以实现安全帽识别,车辆识别,非法入侵识别等智慧工地场景。但用户也许会问,摄像头又不会说话,他得知的这些信息怎么告诉我们,还是说需要配一个主机去处理,这成本又有点太高了。这点正是萤石云要为大家解决的,下面来介绍下如何让设备更简便智能的说话。API(应用程序编程接口)提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力。形象一点API可以理解为一个管道,通过该管道,可以传入约定好的命令,来获得摄像头的反馈,