高度可定制化业务系统架构探索

广告位招租
扫码页面底部二维码联系

ToB类产品有非常丰富的需求变更,而大多【转载请注明来源】【本文受版权保护】数多样化的需求背后,反应到系统层面都是业【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net务核心实体的变更,因此,一套可定制化的业本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。务系统对于这类场景而言非常有帮助,不仅可本文版权归作者所有,未经授权不得转载。【转载请注明来源】以大大缩短研发过程,同时更有利于整个系统转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】的扩展。本文将探索此类可定制化业务系统的本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】架构,试图找到一些共性,提供一种架构思路【原创内容,转载请注明出处】原创内容,盗版必究。

【本文受版权保护】未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net

背景【转载请注明来源】

【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】

我在长期的工作中,需要不断的面对业务的变本文版权归作者所有,未经授权不得转载。【本文受版权保护】更所带来的各种细碎的需求。其中很多需求只【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。是改动一些细节,但是,从研发层面,却要经【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】历需求评审->开发->测试-【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】>发布等一系列过程,而在我看来,这【本文受版权保护】【关注微信公众号:wwwtangshuangnet】些处理费时费力,非常浪费。有没有一种可能原创内容,盗版必究。【原创不易,请尊重版权】,类似这样的变更,不需要更改代码,只需要【转载请注明来源】【关注微信公众号:wwwtangshuangnet】通过在线的配置变更,就可以完成细节功能的【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。变更呢?

未经授权,禁止复制转载。原创内容,盗版必究。【未经授权禁止转载】转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net

其实,这一想法也正是需求方在想的,他们也著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】希望系统能够根据需求主动进行配置,而无需原创内容,盗版必究。【原创不易,请尊重版权】每次都需要进行漫长的研发流程。对于需求方转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】来说,迭代发版太漫长了,有时候根本等不到未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。发版周期就想要上某一个更改。同时,有时候【本文首发于唐霜的博客】【原创不易,请尊重版权】,研发同学实现的需求还不一定准确,如果能转载请注明出处:www.tangshuang.net【转载请注明来源】将一些可定制的能力交给需求方自己去定制,【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net那么实现的也更准确。

【版权所有】唐霜 www.tangshuang.net【作者:唐霜】原创内容,盗版必究。【本文首发于唐霜的博客】

于是,我们开始了业务系统可定制化的探索。

原创内容,盗版必究。本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。

可定制化业务系统与低代码平台的区别本文版权归作者所有,未经授权不得转载。

未经授权,禁止复制转载。【未经授权禁止转载】本文作者:唐霜,转载请注明出处。

看上去,上面所表述的可定制化与低代码平台【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。的效果非常像,都是可以让非开发人员可以主【未经授权禁止转载】原创内容,盗版必究。动参与到产品的创建过程中。然而,它们存在转载请注明出处:www.tangshuang.net【未经授权禁止转载】着本质的区别。

【作者:唐霜】转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net【转载请注明来源】
  • 产物不同:低代码平台的产物是具体的界面,转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。同时包含了用于存储数据的数据结构;可定制【本文受版权保护】原创内容,盗版必究。化的产物是具体的元数据,对于应用来说,是【作者:唐霜】【关注微信公众号:wwwtangshuangnet】用这些元数据去实现效果
  • 【版权所有,侵权必究】【本文首发于唐霜的博客】【本文受版权保护】
  • 素材不同:低代码平台的素材是有平台提供的著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。组件,而可定制化围绕业务,需要的组件得根【原创不易,请尊重版权】【原创不易,请尊重版权】据业务需求进行定制
  • 【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net
  • 资源不同:低代码平台的用户不需要自己设计【作者:唐霜】【本文受版权保护】数据库,只把平台产品当作设计工具使用;可本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】定制化是在原有数据库的基础上进行扩展定制著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。,其数据库结构虽有改动,但大部分还是继承本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。业务本身的特性
  • 【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。
  • 侵入程度不同:低代码平台要求你把整个功能转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。托管在平台上,从底层到应用都是由平台提供【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】;可定制化则在原来的系统基础上改造,或者转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】作为系统的一部分参与完成整个业务
  • 【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】【未经授权禁止转载】本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】

总而言之,低代码平台是相对而言独立的完整【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。的设计工具,而可定制化是在原有系统上提供著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net可扩展的灵活的元数据编辑能力。

【原创不易,请尊重版权】【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。

可定制化业务系统的设计【未经授权禁止转载】

【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。原创内容,盗版必究。

我们需要去思考,一个业务系统中,在什么情【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.net况下,我们使用可定制化的方案比传统固定死【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。的方案更能带来价值和效益。我个人认为,主【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net要有以下这些情况:

【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net
  • 字段的格式化、多语言等展示信息本文作者:唐霜,转载请注明出处。
  • 【本文受版权保护】转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net
  • 字段的计算规则/公式未经授权,禁止复制转载。
  • 著作权归作者所有,禁止商业用途转载。【转载请注明来源】【未经授权禁止转载】原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。
  • 表单中字段的各种逻辑,例如必填、隐藏、校【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net验逻辑等等
  • 【未经授权禁止转载】【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net
  • 业务的流程,每一个节点的逻辑著作权归作者所有,禁止商业用途转载。
  • 未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。
  • 详情页的展示顺序【版权所有】唐霜 www.tangshuang.net
  • 著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net原创内容,盗版必究。
  • 列表页根据配置展示需要的字段、顺序、筛选本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。功能等
  • 【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】

基于上面这些思考,我认为定制化的内容主要本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。包括四方面:字段可定制化、流程可定制化、本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】表单可定制化、界面可定制化。

本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。

字段可定制化【访问 www.tangshuang.net 获取更多精彩内容】

【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】

字段可定制是实现灵活化的第一步,看上去挺【转载请注明来源】本文版权归作者所有,未经授权不得转载。简单的,不就是可以去配置嘛。但是,当我们本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。真正去分析的时候,发现,并没有想象的那么【本文受版权保护】本文作者:唐霜,转载请注明出处。简单。

【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net

分析未经授权,禁止复制转载。

转载请注明出处:www.tangshuang.net【本文受版权保护】【本文首发于唐霜的博客】

我们需要去思考,什么样的字段是可以定制化【原创内容,转载请注明出处】【原创不易,请尊重版权】的。在业务系统中,有些字段具有特殊逻辑,本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net在业务中,是不可更改的,而有些字段则仅仅【转载请注明来源】未经授权,禁止复制转载。是为了记录一个数据,可随意更改。因此,我【转载请注明来源】转载请注明出处:www.tangshuang.net们可以把字段分为3类:

【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。【原创不易,请尊重版权】【本文首发于唐霜的博客】

来自知乎专栏著作权归作者所有,禁止商业用途转载。

【作者:唐霜】【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net

固定字段,预设字段,自定义字段【原创不易,请尊重版权】

著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。

字段管理界面【关注微信公众号:wwwtangshuangnet】

原创内容,盗版必究。未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net

字段可定制的本质,实质上是让我们可以主动【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。去定制业务对象(上图中的“维度”)。业务【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】对象及当前业务事件发生的主体,及其参与者【转载请注明来源】【未经授权禁止转载】。和低代码那种从零开始自己搭建不同,我们【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】定制业务对象,一般可以通过脚本把一些基础【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net的固定的内容先倒入到数据库中,即初始化阶【作者:唐霜】本文作者:唐霜,转载请注明出处。段。只有到后期需要进行细节变更的时候,管【未经授权禁止转载】转载请注明出处:www.tangshuang.net理员可到后台主动变更字段属性。

【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。【原创内容,转载请注明出处】

这种强烈的业务属性还会带来另外一种情况,【未经授权禁止转载】【原创内容,转载请注明出处】即如果一个业务中存在一个字段,那么必然存【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】在另外一个字段。这两个字段可能是一因一果本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net,也可能是合因一果中的因子,总之,当一个【作者:唐霜】【未经授权禁止转载】字段出现的时候,意味着另外一个字段必须在本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。当前这个业务对象中。

【版权所有,侵权必究】未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】

添加自定义字段本文版权归作者所有,未经授权不得转载。

未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。

编辑字段(展开全部状态下)【版权所有,侵权必究】

本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】

无论是添加,还是编辑字段,都是对字段属性【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。的编辑。字段属性是用以描述这个字段的元数本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。据,可以和字段值剖离,也可以和字段值相互著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net影响(例如通过元数据决定字段的值如何计算转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】得到)。因此,实际上,字段的定制化的核心【转载请注明来源】原创内容,盗版必究。,是提供可覆盖业务需求的字段属性的定制化【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。。怎么才能覆盖业务需求呢?我们慢慢分析。

【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。

首先,和字段一样,属性也分3种:固定属性原创内容,盗版必究。【本文受版权保护】、预设属性、自定义属性。它们在行为上和字转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。段的种类的行为相似。

【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。

固定属性、预设属性、自定义属性【原创不易,请尊重版权】

本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。

固定属性必须被设定值。预设属性可以留空不【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。设置值,并且在默认状态下收缩起来,点击上【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】图中的“显示所有选项”时在展示出来用于设【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】置。自定义属性默认情况下(第一次创建时)【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。不存在,需要手动添加属性用于设置。

未经授权,禁止复制转载。未经授权,禁止复制转载。【原创内容,转载请注明出处】

在一些场景下,某些属性是被绑定在一起的。

本文作者:唐霜,转载请注明出处。【作者:唐霜】【本文首发于唐霜的博客】

【版权所有】唐霜 www.tangshuang.net【作者:唐霜】【作者:唐霜】

上图中,当“数据类型”被选中为数字时,“本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net格式”属性被立马展示出来,它们本质上是两【原创不易,请尊重版权】【转载请注明来源】个属性,类型是一个属性,格式是一个属性,著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。只是它们强关联而已。并且不同的数据类型,【未经授权禁止转载】【原创不易,请尊重版权】其格式的配置完全不同。例如日期需要配置日【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。期/时间格式等。

【原创不易,请尊重版权】【本文受版权保护】【未经授权禁止转载】【原创不易,请尊重版权】【本文受版权保护】

属性可以分为3个大类:本文版权归作者所有,未经授权不得转载。

【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net
分类【转载请注明来源】 定义【转载请注明来源】 举例【本文受版权保护】
业务性质【原创不易,请尊重版权】 描述和业务本身的定义,业务逻辑相关的属性 字段类型、校验器【关注微信公众号:wwwtangshuangnet】
交互性质本文作者:唐霜,转载请注明出处。 描述在界面上用于控制该字段的展示逻辑或交原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】互逻辑的属性 字段在表单中是否需要展示(在什么情况下需【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net要展示)
技术性质原创内容,盗版必究。 描述在数据提交时(前后端交互时)数据应该本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】以什么方式提交到后端接口 名为gp_name的字段实际上对应后端接【原创不易,请尊重版权】原创内容,盗版必究。口的gp.gp_name,其中gp是一个【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net对象

属性可以分为9个子类:【未经授权禁止转载】

【原创内容,转载请注明出处】【本文受版权保护】著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。
属性子类【原创不易,请尊重版权】 定义未经授权,禁止复制转载。 举例转载请注明出处:www.tangshuang.net
值相关未经授权,禁止复制转载。 该属性在前端运行时,使用该属性作为状态【关注微信公众号:wwwtangshuangnet】 value, compute, gett【转载请注明来源】未经授权,禁止复制转载。er
校验器相关【访问 www.tangshuang.net 获取更多精彩内容】 在验证该字段值时使用原创内容,盗版必究。 required, validators
类型相关未经授权,禁止复制转载。 控制该字段的数据类型时使用原创内容,盗版必究。 type【作者:唐霜】
存储相关【关注微信公众号:wwwtangshuangnet】 导出数据时,该字段以什么形式进行转化【关注微信公众号:wwwtangshuangnet】 save, create【作者:唐霜】
提交相关原创内容,盗版必究。 提交数据到后端接口时,该字段要怎么处理原创内容,盗版必究。 map, flat【未经授权禁止转载】
逻辑相关原创内容,盗版必究。 当前字段在当前环境下是否形成了某种状态【本文受版权保护】 required, readonly, 【原创不易,请尊重版权】【未经授权禁止转载】hidden
监听相关【本文首发于唐霜的博客】 当前字段的值发生变化时被调用原创内容,盗版必究。 watch, catch【原创内容,转载请注明出处】
衍生资源相关【版权所有】唐霜 www.tangshuang.net 当前字段依赖另外一个字段,那么在对象中就【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。必须同时存在这两个字段,否则就会出错 deps转载请注明出处:www.tangshuang.net
自定义【作者:唐霜】 其他自己自定义的属性【转载请注明来源】

这些类型在具体设计时不一定都会用得到,即【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。使在同一系统中,不同字段可能也各不相同。

【作者:唐霜】【关注微信公众号:wwwtangshuangnet】【本文受版权保护】【本文受版权保护】

相同的属性,在被不同字段使用时,也有权限原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。的区别,例如在字段A中readonly这【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net个字段是可以被定制化的,但是在字段B中r【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。eadonly这个属性是规定死的。这需要转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。我们在设计时,让我们的系统可以灵活的保持原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net这种权限关系。

本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】

属性值必须是支持动态计算的,例如requ【未经授权禁止转载】【版权所有,侵权必究】ired属性可能由对象的另外一个字段的值【原创内容,转载请注明出处】【原创内容,转载请注明出处】来决定,此时的required在进行定制著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。时,一定时一个表达式,而非固定死的值。在【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】很多定制场景下,甚至设计者不会想到还有这【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】个设计,因为他们没有接触过同一字段的同一本文版权归作者所有,未经授权不得转载。【转载请注明来源】属性在不同情况下内容不同。

【本文受版权保护】【转载请注明来源】【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】

属性值需要在不同的条件下动态的给出结果。

本文作者:唐霜,转载请注明出处。【本文受版权保护】本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net

【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。【转载请注明来源】

上图中,“提示语”这个属性需要去“报价单转载请注明出处:www.tangshuang.net【本文受版权保护】”这个维度中找,查找的条件可以自己配置,【转载请注明来源】著作权归作者所有,禁止商业用途转载。找到的是多个报价单对象,取值只取其中一个本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】,且取的是报简单的“报价时间”这个字段的【作者:唐霜】【原创内容,转载请注明出处】值,取值条件是取(筛选结果中的)“最大值【本文受版权保护】转载请注明出处:www.tangshuang.net”。

本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】

动态取属性值的设计意味着你不能在设计时把著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】属性值直接当作一个固定值对待而设计死,你【版权所有,侵权必究】原创内容,盗版必究。需要创建一套表达式规则,通过表达式来动态未经授权,禁止复制转载。【作者:唐霜】读取需要的值。

【本文受版权保护】未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】

提到这里,字段的值也可以是动态的,我们称【原创内容,转载请注明出处】【作者:唐霜】为“关联类型”。例如,“订单”的“商品”本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。字段实际上是关联“商品”对象的ID,而且【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。它们之间的关系是1:n(一对多)关系。这【本文首发于唐霜的博客】未经授权,禁止复制转载。个设计需要在数据类型这个固定属性处实现。

【版权所有,侵权必究】【版权所有,侵权必究】【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】

最后一种情况是,在我们的产品中,同一个属原创内容,盗版必究。【版权所有,侵权必究】性,可能在不同情况下,需要采用不同的值。【作者:唐霜】【关注微信公众号:wwwtangshuangnet】例如,“消费额”这个字段的“格式”属性,本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】在个人详情页需要使用“$10,000,0【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】00.00”这种格式,而在记录页面为了省原创内容,盗版必究。【原创不易,请尊重版权】空间又需要使用“$10mn”这种缩略形式【本文首发于唐霜的博客】【未经授权禁止转载】。这也就意味着,同一个字段,其属性有多套本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。方案。这该怎么设计呢?

【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。

多方案属性设计【本文首发于唐霜的博客】

【版权所有,侵权必究】原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】

也就说,同一个字段的同一属性,在不同情况本文作者:唐霜,转载请注明出处。【未经授权禁止转载】下还有的选择。不过,是否启用方案应该是可【原创不易,请尊重版权】【原创内容,转载请注明出处】选的,如果某些属性没必要启用方案,那么就【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。没必要勉强去设定多套方案。

转载请注明出处:www.tangshuang.net【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net【本文受版权保护】【本文首发于唐霜的博客】

表设计【版权所有,侵权必究】

著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net

为了支撑上面的分析中提到的这些点,我们必未经授权,禁止复制转载。【未经授权禁止转载】须在设计时尽可能的让表可以灵活扩展。

本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】【关注微信公众号:wwwtangshuangnet】

字段定制化表结构设计【访问 www.tangshuang.net 获取更多精彩内容】

【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】

这些表与实际的业务表分开,与业务表没有本【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。质上的关联,如果不使用字段定制化的能力,【未经授权禁止转载】【转载请注明来源】这些表可以从业务系统中删除而不影响原有业【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net务数据。

【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】【原创内容,转载请注明出处】

dimensions表即维度表,它的作用转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】是让我们方便的快速找到一个维度都有哪些字【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。段,通过维度表fields字段可以从fi本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。elds表中读取出这些字段。不过需要强调本文版权归作者所有,未经授权不得转载。【本文受版权保护】的是,dimensions维度表中的一个【作者:唐霜】原创内容,盗版必究。维度并不等于一个数据库表的引用,一个维度【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。实际上可以囊括多张表中的多个字段。fie【版权所有,侵权必究】转载请注明出处:www.tangshuang.netlds中的key建议使用table.co【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。lumn的方式命名,这也就意味着,维度中【本文首发于唐霜的博客】【原创内容,转载请注明出处】引用的字段table部分可以不同。

【访问 www.tangshuang.net 获取更多精彩内容】【转载请注明来源】【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。

fields是字段表,它指明了字段可定制【未经授权禁止转载】【未经授权禁止转载】化系统中的字段(key)和原始业务表字段【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net(table+column)之间的关系。【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。fields这个表里面的key是原始业务【版权所有】唐霜 www.tangshuang.net【转载请注明来源】表字段的别称,在字段可定制化系统中使用。【本文首发于唐霜的博客】【本文首发于唐霜的博客】name是字段的展示名。type是字段的【转载请注明来源】【版权所有,侵权必究】数据类型,用以控制原始字段数据类型和实际【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.net需要的数据类型不一致时的调度。polic【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。y用以表示当前这个字段是固定、预设、自定【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】义字段。deps则是前文提到的,一个字段【未经授权禁止转载】原创内容,盗版必究。可能必须依赖其他字段,如果定制化系统中d转载请注明出处:www.tangshuang.net【版权所有,侵权必究】eps里有值,意味着这套字段是绑定在一起【版权所有,侵权必究】【原创内容,转载请注明出处】的。

【转载请注明来源】【原创内容,转载请注明出处】【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。

attributes是整个字段可定制化的【本文受版权保护】【原创不易,请尊重版权】核心表,虽然它的字段比较少。一个字段有哪原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】些属性被设置了值,全部在attribut【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。es表中(不包含方案部分),一条attr【转载请注明来源】转载请注明出处:www.tangshuang.netibute就是其中一个属性。从上文的图中【作者:唐霜】未经授权,禁止复制转载。,你可以看到,不同的属性,在进行配置的时【本文受版权保护】未经授权,禁止复制转载。候,交互非常不同,可以说是千差万别。

转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】原创内容,盗版必究。

这时,我们看attribute_conf原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。igs表,这个表是用于打开属性编辑弹窗时转载请注明出处:www.tangshuang.net【本文受版权保护】,展示出来可配置的属性的列表,然后从at【作者:唐霜】【原创内容,转载请注明出处】tributes表和schemes表中拉转载请注明出处:www.tangshuang.net【作者:唐霜】取数据进行填充。

【作者:唐霜】著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。

当我们打开属性弹窗时,首先从attrib未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。ute_configs中读取所有备选属性本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。,其中根据policy进行分类,0:固定【转载请注明来源】【转载请注明来源】属性立即展示在界面上,预设属性1:立即展【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。示在界面上,2:可以通过“更多”展开,3本文作者:唐霜,转载请注明出处。【未经授权禁止转载】:自定义属性不会出现(在添加自定义属性时本文作者:唐霜,转载请注明出处。【未经授权禁止转载】,可通过下拉复用)。type属性决定了当【本文首发于唐霜的博客】【版权所有,侵权必究】前这个属性的基础交互类型,比如字符串、数【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。字、下拉列表等等,这个type是决定属性原创内容,盗版必究。【原创不易,请尊重版权】的交互类型,而非字段的类型,这里需要避免未经授权,禁止复制转载。【转载请注明来源】混淆。required代表这个属性必须填原创内容,盗版必究。【转载请注明来源】写,不能留空(固定属不能留空,因此,可以【未经授权禁止转载】【未经授权禁止转载】认为required只针对预设属性)。n【本文首发于唐霜的博客】【本文受版权保护】eeds表示当前这个属性依赖其他属性,如【转载请注明来源】未经授权,禁止复制转载。果被依赖的属性不存在,会造成错误。com本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。ponent这个字段是交互的关键,它是一【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。个复杂的结构,里面包含了这个属性在界面上【作者:唐霜】【访问 www.tangshuang.net 获取更多精彩内容】的配置,也就是说,当前这个属性在配置界面【版权所有,侵权必究】未经授权,禁止复制转载。上怎么交互完全由component决定。【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。同时,component中的内容决定(t【本文受版权保护】【版权所有,侵权必究】ype字段也有影响,因为基础type可能著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net不需要component)了attrib原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。utes表中value字段的值,attr【转载请注明来源】未经授权,禁止复制转载。ibutes.value这个字段和sch著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.netemes.value字段也是一个复杂结构【未经授权禁止转载】【未经授权禁止转载】(这两个字段结构相同)。为什么是复杂结构【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】呢?因为每一个component输出的结原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。果不同,比如有的输出的是固定的数值,有的【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。输出的是动态表达式,有的输出的是字符串,原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。甚至输出JSON数组,所以,value必【未经授权禁止转载】原创内容,盗版必究。须是一个字符串类型,实质上是一个JSON【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。在数据库中的表达形式。它的结构可以设计为【本文首发于唐霜的博客】【转载请注明来源】复合json-schema【原创不易,请尊重版权】的结构。【关注微信公众号:wwwtangshuangnet】

未经授权,禁止复制转载。【版权所有,侵权必究】【本文首发于唐霜的博客】

scheme_configs归档了有哪些【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。方案可以使用。其中一个需要理解的地方在于【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】attributes字段,它代表当前这个【作者:唐霜】【作者:唐霜】方案仅支持这些属性。在交互上,仅当处于a原创内容,盗版必究。【原创内容,转载请注明出处】ttributes中的属性被选中时,右侧未经授权,禁止复制转载。【原创内容,转载请注明出处】的方案列表中才会出现这个方案。

【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。【转载请注明来源】【原创不易,请尊重版权】

schemes这个表实际上和attrib原创内容,盗版必究。【原创内容,转载请注明出处】utes这个表是平行的,或者你可以认为它原创内容,盗版必究。【本文首发于唐霜的博客】是attributes表的补充。如果没有【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。“方案”这个东西,那么不需要它,如果需要【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】“方案”,那么在读取属性值时,需要考虑从本文作者:唐霜,转载请注明出处。原创内容,盗版必究。对应的方案中读取,如果没有对应方案,就退【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。回到attributes中的值。为了查询【原创不易,请尊重版权】【本文受版权保护】方便,schemes中冗余了name字段【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net,这样在查的时候就不需要去读scheme【本文首发于唐霜的博客】未经授权,禁止复制转载。_configs表。

【版权所有,侵权必究】【作者:唐霜】本文作者:唐霜,转载请注明出处。

让我们回到具体的某个业务场景下。现在,我著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net们需要展示公司详情,展示时,需要根据字段【版权所有,侵权必究】【原创内容,转载请注明出处】定制的结果展示这些信息。此时,我们后端在本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。处理时大致流程如下:

转载请注明出处:www.tangshuang.net【转载请注明来源】转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net

【访问 www.tangshuang.net 获取更多精彩内容】【转载请注明来源】未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。

基于这一设计,我们可以在完全不该动原有业【作者:唐霜】未经授权,禁止复制转载。务,在原有业务之外再建立一套系统实现可定【本文首发于唐霜的博客】【关注微信公众号:wwwtangshuangnet】制化的能力。

【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】【作者:唐霜】

架构设计【本文受版权保护】

本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】【原创不易,请尊重版权】

要支撑上述设计,我们需要一个可以独立于原【转载请注明来源】本文版权归作者所有,未经授权不得转载。有业务的系统,同时又有一定扩展性的功能。【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。我们采用微服务架构将字段的定制化设计为独【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】立于原有业务的服务,再改造原有业务中关于【原创内容,转载请注明出处】【作者:唐霜】数据读取的逻辑来配合微服务获取最终的结果本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。

【原创不易,请尊重版权】原创内容,盗版必究。转载请注明出处:www.tangshuang.net

【作者:唐霜】【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.net原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】

字段定制服务作为基础服务中的一项,保持自【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。己的数据,通过接口形式与业务服务交互。一【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】个业务服务只针对一个业务提供服务,它会同【本文首发于唐霜的博客】【作者:唐霜】时调度多个基础服务,完成必要的各种功能,转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net其中包含字段定制服务。在请求中,按照上述原创内容,盗版必究。【转载请注明来源】请求逻辑获取数据,并返回给请求方。

【本文受版权保护】【原创不易,请尊重版权】【作者:唐霜】【转载请注明来源】【关注微信公众号:wwwtangshuangnet】

流程可定制化【作者:唐霜】

【本文受版权保护】本文版权归作者所有,未经授权不得转载。【作者:唐霜】【版权所有,侵权必究】

业务流程是业务系统的重要一部分,甚至是核【转载请注明来源】未经授权,禁止复制转载。心部分。业务流程的本质,是提前规划各种触【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net发事件与事件被触发后的行为方式。流程服务【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】已经有比较成熟的解决方案,因此,我们在做【版权所有】唐霜 www.tangshuang.net【本文受版权保护】流程定制化时,可以把目光集中在定制化这个转载请注明出处:www.tangshuang.net【转载请注明来源】方面,而对于服务,可以直接寻找适合的成熟【版权所有,侵权必究】未经授权,禁止复制转载。方案。本文将会对流程定制化在概念层面进行【转载请注明来源】【关注微信公众号:wwwtangshuangnet】拆分,让你可以更好的理解业务流程的设计方转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net式。

【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。原创内容,盗版必究。【作者:唐霜】本文作者:唐霜,转载请注明出处。

分析原创内容,盗版必究。

【原创内容,转载请注明出处】原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net

业务流程简单讲就是业务事件的限定触发与业本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】务对象的变更。流程系统本质上就是一个状态未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。机,只不过由于需要和业务结合,并且需要考【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。虑到融入整套系统中,在设计上会更加复杂。【作者:唐霜】转载请注明出处:www.tangshuang.net既然是状态机,那么理解和设计起来就更容易转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】了。

【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net

一条业务流程分为两个部分:转载请注明出处:www.tangshuang.net

著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】
  • 流程图转载请注明出处:www.tangshuang.net
  • 【版权所有,侵权必究】原创内容,盗版必究。【作者:唐霜】
  • 流程运行时本文作者:唐霜,转载请注明出处。
  • 转载请注明出处:www.tangshuang.net【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。

你可以把流程图理解为模型,本质上也就是状转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。态机。运行时则是在将状态机放在具体的环境本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。中,用一个变量记录当前状态;同时,与程序著作权归作者所有,禁止商业用途转载。【作者:唐霜】绑定,从而当发生状态变更时,可以执行对应【本文首发于唐霜的博客】【转载请注明来源】的程序,变更对应的业务对象,从而实现业务【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。推进。

本文作者:唐霜,转载请注明出处。【作者:唐霜】【未经授权禁止转载】原创内容,盗版必究。【版权所有,侵权必究】

目前市面上有BPMN标准,该标准目前最新著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】版是2.0版本,BPMN的描述语言是xm【原创不易,请尊重版权】【本文受版权保护】l。基于BPMN标准实现的运行时环境有很著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net多,我们称这类运行时为BPM。其中比较知【原创内容,转载请注明出处】【作者:唐霜】名的还有flowable,我们将会采用f著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】lowable作为我们的运行时,因为它还原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net提供了微服务的API,有利于我们后微服务原创内容,盗版必究。原创内容,盗版必究。化。

【转载请注明来源】本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。

流程图由节点、连接组成。节点类型繁多,链未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。接也有很多种。

未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net

原创内容,盗版必究。【版权所有,侵权必究】原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net

流程可定制化中的定制,主要包含定制流程图【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】、定制节点/连接及其上的参数。简单讲,就【版权所有,侵权必究】【本文首发于唐霜的博客】是让我们做到流程不是用代码实现的,而是由【访问 www.tangshuang.net 获取更多精彩内容】【转载请注明来源】引擎实现的,改变流程不需要我们改代码,只【本文受版权保护】本文作者:唐霜,转载请注明出处。需要我们通过界面操作改流程图即可。这些界【本文受版权保护】本文作者:唐霜,转载请注明出处。面定制化的内容,我们需要把它放到我们可定未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。制化系统中去整合。索性flowable提【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net供了非常丰富的接口和素材,我们可以在自己著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。的系统中编辑流程图和展示流程图。

本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。

从状态机的视角,每一个状态发生变更时,本转载请注明出处:www.tangshuang.net【未经授权禁止转载】质上通过触发事件,事件带来行为产生副作用【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。。现在,我想的是,在什么地方去执行副作用【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。呢?我想的是,将我们的节点任务以云函数的本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】形式与节点进行绑定,流程图有多少节点,就【本文受版权保护】转载请注明出处:www.tangshuang.net实现多少云函数来执行其副作用。这样设计的【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】好处是,首先,流程服务与业务解耦,我们不本文版权归作者所有,未经授权不得转载。【本文受版权保护】需要把业务逻辑侵入流程服务;其次,云函数【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net和流程实现可插拔,我们在没有变更流程的情未经授权,禁止复制转载。【未经授权禁止转载】况下如果需要变更业务逻辑,则只需要修改对【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】应节点的云函数,如果我们不需要修改业务逻转载请注明出处:www.tangshuang.net原创内容,盗版必究。辑,只需要通过拖拽流程图即可,这样带来的【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】重新部署的成本非常小;最后,这样可以不受【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。技术栈的束缚,虽然同一语言有利于管理,但本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】在某些场景下,我们可以使用更高效的语言来未经授权,禁止复制转载。【转载请注明来源】开发某个节点的业务。

未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】【原创不易,请尊重版权】

架构设计【转载请注明来源】

【作者:唐霜】【原创不易,请尊重版权】【未经授权禁止转载】【转载请注明来源】本文版权归作者所有,未经授权不得转载。

基于上述分析,我们现在大概可以把业务流程本文作者:唐霜,转载请注明出处。【作者:唐霜】拆分为以下几大块:

【本文受版权保护】著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。
  • 流程图管理界面、流程图展示界面组件【未经授权禁止转载】
  • 本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。
  • flowable流程引擎服务【原创不易,请尊重版权】
  • 【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。【作者:唐霜】
  • 云函数未经授权,禁止复制转载。
  • 【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。
  • 业务服务部分本文作者:唐霜,转载请注明出处。
  • 未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。

我们用一个图来表示业务服务、流程服务、云【未经授权禁止转载】原创内容,盗版必究。函数的关系:

【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】转载请注明出处:www.tangshuang.net

【本文首发于唐霜的博客】【未经授权禁止转载】转载请注明出处:www.tangshuang.net

由于流程服务每一条流程起来以后保管自己的原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。当前状态,因此,对于业务服务而言,只需要【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。在每次发生变更的时候,向流程服务请求状态本文版权归作者所有,未经授权不得转载。【作者:唐霜】变更即可,流程服务会根据当前状态,调用底【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。层的无状态服务进行计算,如果不需要状态流【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】转,就不需要调用云函数,而是直接返回业务【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net服务null,业务服务就知道当前这个变更【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。不会触发流程变更。

【关注微信公众号:wwwtangshuangnet】【本文受版权保护】【版权所有】唐霜 www.tangshuang.net

【转载请注明来源】本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】【转载请注明来源】

我们将上面的流程引擎服务和流程图服务打包著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】成流程服务提供给系统使用,这样可以提供统【版权所有,侵权必究】转载请注明出处:www.tangshuang.net一的进出口API,而云函数本质上和其他服转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。务解耦,但会操作共同的底层数据。

【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】

本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。【本文受版权保护】

虽然我将云函数放在业务服务的范畴,但实际著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net上它们不会被上层的应用层调用,而是被流程【版权所有,侵权必究】【原创不易,请尊重版权】服务调用,听上去并不合理,但是由于云函数转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net本质上还是业务逻辑处理,因此,我把它放在【本文受版权保护】本文作者:唐霜,转载请注明出处。了业务服务的范畴内。

著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】【作者:唐霜】【关注微信公众号:wwwtangshuangnet】

表单可定制化【本文受版权保护】

原创内容,盗版必究。本文作者:唐霜,转载请注明出处。【转载请注明来源】

表单在业务系统中扮演着极其重要的角色,是【关注微信公众号:wwwtangshuangnet】【转载请注明来源】必要的部分,你很难想象一个业务系统中没有【关注微信公众号:wwwtangshuangnet】【作者:唐霜】表单。表单是业务数据生产的地方,在业务对【原创内容,转载请注明出处】【未经授权禁止转载】象的创建、编辑过程中,在业务流程的推进过转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】程中,都需要表单来输入数据。但无论在什么【本文首发于唐霜的博客】原创内容,盗版必究。场景下,表单的结构体系,都可以被标准化。本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。关于表单,我在之前的文章《动态表单引擎,未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】向低代码迈出最关键的一步》和《Robus【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。t 第 014 期:三角金字塔 web 著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。表单开发新范式》中已经较为详细的阐述过,【本文首发于唐霜的博客】【转载请注明来源】有兴趣可以去看一看。由于此前的文章对动态【本文首发于唐霜的博客】【转载请注明来源】表单的底层逻辑和设计都梳理的比较清晰了,【转载请注明来源】原创内容,盗版必究。所以,本文主要将从架构层面,结合可定制化【关注微信公众号:wwwtangshuangnet】【转载请注明来源】体系,给出比较合理的架构体系。

【作者:唐霜】【本文受版权保护】本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。

分析原创内容,盗版必究。

原创内容,盗版必究。原创内容,盗版必究。【版权所有,侵权必究】【未经授权禁止转载】【原创内容,转载请注明出处】

被定制化表单有两部分配置来源,一部分是来【未经授权禁止转载】【原创内容,转载请注明出处】自自定定制的元数据,另一部分是来自表单配【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。置的界面安排。

【原创不易,请尊重版权】【访问 www.tangshuang.net 获取更多精彩内容】【转载请注明来源】

著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。

和网上常见的表单定制工具不同,主要有两点原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】

【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】未经授权,禁止复制转载。【本文首发于唐霜的博客】
  • 其他方案在表单之前没有真正的字段概念,但原创内容,盗版必究。未经授权,禁止复制转载。在业务系统中,先有字段,才有表单
  • 转载请注明出处:www.tangshuang.net原创内容,盗版必究。【本文受版权保护】本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。
  • 其他方案表单中一行就是一个字段,但实际上【本文受版权保护】转载请注明出处:www.tangshuang.net,业务系统中往往字段有强关联性,一行可能【作者:唐霜】【未经授权禁止转载】需要填多个字段
  • 未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】【本文首发于唐霜的博客】

同时,在原有字段的定制信息中,还要考虑到本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。,不同表单同一字段可能存在不同逻辑。这一【原创不易,请尊重版权】未经授权,禁止复制转载。点虽然我们可以通过方案来解决,但是我们还原创内容,盗版必究。【作者:唐霜】是需要在表单中合并特殊逻辑。因此,表单本本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】身是基于字段的独立实体,会用字段元数据作著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。为基础数据,在用自己的配置数据与元数据进【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】行合并。

【原创内容,转载请注明出处】【本文首发于唐霜的博客】【原创内容,转载请注明出处】

表设计【作者:唐霜】

【关注微信公众号:wwwtangshuangnet】【原创不易,请尊重版权】【未经授权禁止转载】本文作者:唐霜,转载请注明出处。

实际上表单的表没有什么特别需要设计的,因本文作者:唐霜,转载请注明出处。【作者:唐霜】为表单的描述是一个静态的配置。

未经授权,禁止复制转载。未经授权,禁止复制转载。【未经授权禁止转载】

转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】

就只有一个表,所以没有什么表层面的复杂度【本文受版权保护】原创内容,盗版必究。,其中的fields用于作为生成conf【访问 www.tangshuang.net 获取更多精彩内容】【关注微信公众号:wwwtangshuangnet】ig之前的基础信息,由于我们可以在管理平【原创内容,转载请注明出处】原创内容,盗版必究。台上修改字段的配置信息,所以,字段的基础【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】元数据,需要通过fields动态拉取。表原创内容,盗版必究。转载请注明出处:www.tangshuang.net单和字段并非一对一的关系,表单中提交的数本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。据,可能写入到维度业务对象,也可能写入到转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net流程信息,或者写入到文档服务,总之,本质本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。上,表单本身是独立的,只不过当需要fie本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。lds时,需要依赖字段定制服务。

【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】【转载请注明来源】【版权所有】唐霜 www.tangshuang.net

架构设计未经授权,禁止复制转载。

【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。

表单在业务系统中会存在很多很多实例,而且原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】每一个都不同。表单最终提交到哪个接口,可【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。以由表单配置本身决定,也可以由调用表单服本文版权归作者所有,未经授权不得转载。【本文受版权保护】务的业务自己决定。如果想要通过选取的方式原创内容,盗版必究。【本文首发于唐霜的博客】决定提交的目标,那么还需要依赖一个分发服【本文首发于唐霜的博客】【未经授权禁止转载】务,用于分发请求。我们这里暂时不考虑这一转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】功能。

【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。【转载请注明来源】

对于表单业务而言,它的数据流大致如下:未经授权,禁止复制转载。

未经授权,禁止复制转载。【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】

原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】未经授权,禁止复制转载。【转载请注明来源】

表单引擎不仅可以在业务服务中使用,在流程著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net节点上,也可以用来作为审批等节点操作的表【本文受版权保护】本文版权归作者所有,未经授权不得转载。单。但是,这里需要注意,流程引擎本身是业转载请注明出处:www.tangshuang.net【转载请注明来源】务无关的,具体的业务服务去集成流程和表单【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。,对于表单本身而言,它的数据流和上图是一转载请注明出处:www.tangshuang.net原创内容,盗版必究。致的,只不过提交的表单数据,是用以推进流未经授权,禁止复制转载。【作者:唐霜】程的。

本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。【本文受版权保护】

转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】

另外,flowable也有自己的表单引擎【作者:唐霜】未经授权,禁止复制转载。,但是你需要按照它的设计来使用,不是很符【版权所有,侵权必究】【转载请注明来源】合我们现代前端的开发方式。表单引擎是为业【本文首发于唐霜的博客】【原创不易,请尊重版权】务服务的。表单的配置页面和填写页面,都由【作者:唐霜】【转载请注明来源】对应的react组件来承载。

【转载请注明来源】未经授权,禁止复制转载。原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net

界面可定制化转载请注明出处:www.tangshuang.net

本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。

我们这里讲的界面可定制化,主要包含两个方转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。面:1.数据的展示定制;2.布局的展示定本文版权归作者所有,未经授权不得转载。【转载请注明来源】制。其中,布局的展示定制比较像部分低代码本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。的实现,但由于我们的业务系统往往比较单调【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。,因此,难度上会小很多。数据的展示定制就【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】相对复杂一些,需要前后端有较强的协议来约【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。束接口(前后端耦合)。

【本文受版权保护】【原创不易,请尊重版权】【原创内容,转载请注明出处】

分析未经授权,禁止复制转载。

【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】

数据的展示又分为:1.列表的展示;2.筛【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】选器的展示;3.对象详情信息的展示。常用原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net的定制点包含:1.要展示哪些信息/字段;本文作者:唐霜,转载请注明出处。原创内容,盗版必究。2.它们的顺序是什么;3.要使用那个字段转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】属性方案。更复杂的展示逻辑没有必要让前端本文作者:唐霜,转载请注明出处。【作者:唐霜】来实现,与其通过配置给前端进行解析,不如原创内容,盗版必究。【作者:唐霜】直接ssr更直接。因此,我认为只需要解决【原创内容,转载请注明出处】【转载请注明来源】上述这些可定制点就行了,没必要把整个业务【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。系统用一个JSON写完。

本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net

先来看下列表,列表实际上由表头和数据行组【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。成,表头和字段的元数据相关,通过表头信息【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】,我们可以知道一列的数据具体代表了什么意转载请注明出处:www.tangshuang.net【作者:唐霜】义,要使用什么格式来展示等等。每一行的展【转载请注明来源】著作权归作者所有,禁止商业用途转载。示内容,则是根据各列的这些信息,再加上当【未经授权禁止转载】原创内容,盗版必究。前行的数据,最终生成。

【作者:唐霜】本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】

【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】【作者:唐霜】

但是,列的顺序是散列的,因此,我们需要有原创内容,盗版必究。【原创内容,转载请注明出处】一个配置来记录列的顺序、是否可以过滤、是未经授权,禁止复制转载。未经授权,禁止复制转载。否支持排序等等。因此,我们用以保存列表配著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。置的信息里,一方面要记录这个列表所需要哪原创内容,盗版必究。【作者:唐霜】些字段、字段的排序、字段支持的能力这些信【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】息。因此,如果我们要在一个接口中返回列表转载请注明出处:www.tangshuang.net【转载请注明来源】数据,至少需要包含三部分信息:列表配置、【原创不易,请尊重版权】【原创内容,转载请注明出处】字段元数据(含方案)、列表原始数据。

【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net
GET /api/productions
{
  "config": {
    "columns": [
      {
        "key": "field1", // 字段key
        "filterable": 1, // 支持过滤
        "sortable": 1 // 支持排序
      }
    ],
    "scheme": "some"
  },
  "fields": {
     "field1": {
       "formatter": "1.1f",
       "title": "字段名"
     }
  },
  "rows": [
    {
      "field1": 10000
    }
  ]
}

当然,如果还有其他配置的可能,还可以在c【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】onfig中添加,其中,columns是【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】该列表的列配置,数组就可以表达它们的顺序本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net

转载请注明出处:www.tangshuang.net【转载请注明来源】【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。

【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。

不同的用户,甚至可以定制自己的视图。此时【转载请注明来源】【原创不易,请尊重版权】,存储的配置信息要根据用户来保管。不过上本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。图中没有给出是否支持过滤、排序,以及选择【作者:唐霜】著作权归作者所有,禁止商业用途转载。哪个方案的配置,这些你可以脑补出来。

原创内容,盗版必究。【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net

筛选器配置本质上和字段配置差不多,也是要【本文受版权保护】【原创不易,请尊重版权】与不要,以及顺序问题。

本文作者:唐霜,转载请注明出处。【转载请注明来源】【未经授权禁止转载】

详情页的定制则更偏重布局的配置,不过具体未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net的某个区域内的配置,也和字段的配置是一样【转载请注明来源】【转载请注明来源】的。当然,我们可以和前端通过协议来决定一转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。些界面的布局,比如界面上一些区块的排列顺【作者:唐霜】【版权所有】唐霜 www.tangshuang.net序。

【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。

架构设计【未经授权禁止转载】

【作者:唐霜】未经授权,禁止复制转载。原创内容,盗版必究。本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】

界面的定制化其实是最简单的一个部分,它不【原创不易,请尊重版权】【原创内容,转载请注明出处】需要过度设计,只需要在布局协议上前后端沟【版权所有,侵权必究】未经授权,禁止复制转载。通好就可以了。

未经授权,禁止复制转载。【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。

本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。【作者:唐霜】

结语原创内容,盗版必究。

【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net

本文详细阐述了业务系统可定制化中的字段定本文作者:唐霜,转载请注明出处。【转载请注明来源】制化、流程定制化、表单定制化、界面定制化【转载请注明来源】转载请注明出处:www.tangshuang.net的设计思路和方法。业务系统与那些通用的系著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net统之间有着明确的区别,即业务系统有非常明【本文受版权保护】本文版权归作者所有,未经授权不得转载。确的领域边界,业务内某些逻辑是固定的,这【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。些固定的,或领域特有的,就没有必要做成通原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net用化的东西,而应该提炼成独立的领域组件,【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。这样才能避免无止尽的自定义搭建,同时也可【本文首发于唐霜的博客】【关注微信公众号:wwwtangshuangnet】以避免通用自定义搭建系统无法实现某些具体【作者:唐霜】【关注微信公众号:wwwtangshuangnet】逻辑的问题。

【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。【本文受版权保护】

虽然本文展示了自己的架构设计,但是,这个本文作者:唐霜,转载请注明出处。原创内容,盗版必究。设计是建立在整套系统通盘考虑都基于微服务转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net搭建,但在真实场景中,我们的业务系统往往【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。是从最初的单体应用发展而来的,原有的设计转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。不一定可以服务化,而如果推翻重来,风险也【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net很大。因此,我们上面的这套设计,还可以兼未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。容已有的系统,或者说,现有的这套正在运行【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】的单体,对于定制化体系,是可有可无的,如未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net果想花功夫接入定制化系统,那么可以在原来【原创内容,转载请注明出处】原创内容,盗版必究。的系统上做好粘合,就可以逐渐迁移,避免高转载请注明出处:www.tangshuang.net【作者:唐霜】成本的一次性重构带来的风险。

本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。

2021-10-21 9840

为价值买单,打赏一杯咖啡

本文价值98.4RMB