1.springboot+Vue+Activiti7新增流程节点控制表单编辑/隐藏属性
2.Designable 应用和源码浅析
3.可能是表单表单你见过最专业的表单方案---解密Formily2.0
4.activitiå¨çº¿è®¾è®¡-Activiti6.0ä¸å¦ä½è®¾è®¡åå
³è表åï¼
5.XRender - 开源之路
springboot+Vue+Activiti7新增流程节点控制表单编辑/隐藏属性
1. 改进拖拽表单设计,现在可以绑定自定义数据表和字段,设计设计替代了之前的源码源码自动创建机制。这一变化允许用户在新增节点后,表单表单关联现有的设计设计数据表进行操作。
2. 在流程设计中,源码源码泛域名网站源码新增了对审批节点表单属性的表单表单控制功能。例如,设计设计审批节点A可以编辑标题项并隐藏内容项,源码源码从而实现了对流程节点表单属性的表单表单精细化管理。
3. 流程属性之间的设计设计关联控制也得到了增强。举例来说,源码源码当下拉选项选择A时,表单表单标题项会展示;选择B时,设计设计标题项则隐藏。源码源码这种机制实现了下拉框和单选框对其他属性控制的功能。
Activiti7的工作流低代码平台非常适合多种工作场景,如学习、项目研发或个人项目开发。它使得大多数场景下的流程审批功能得以实现,而无需编码。用户只需通过拖拽表单和流程设计,就能大大减少研发工作量。
升级文档及源码地址:
/qingfengaibiancheng/chq3gg/bmub3z
Designable 应用和源码浅析
本文基于 Designable 1.0.0-beta. 进行演示和分析,网络棋牌源码论坛旨在提供对设计组件和源码的浅析。Designable 提供了丰富的功能和组件,以满足复杂应用需求。以下将对其中的几个关键特性进行详细介绍。
首先,使用说明页面示例展示了集成代码组件的灵活性和便利性。在设计页面中,可以直观地嵌套和组合基础组件,实现高效且直观的界面构建。
复杂组件如 FormCollapse 的实现是 Designable 的亮点之一。FormCollapse 支持添加 CollapsePanel,并允许用户通过拖拽功能将子组件添加到指定区域。这种动态布局和交互方式极大地提高了组件的适应性和灵活性。
对于 JSON Schema 和 TreeNode 的互转,Designable 提供了高效的转换机制。这一功能使得数据结构的管理与操作更为便捷,适用于各种需要动态数据交换的应用场景。
深入探讨 Designable 的项目结构时,发现其基于 Lerna 的 monorepo 架构,包含多个独立但紧密关联的项目。主要包包括核心逻辑、React 组件、示例应用和设置表单等。战队头像psd源码这种结构确保了代码的可维护性和可扩展性。
核心逻辑中,Designable 大量运用了 reactive 库,以实现组件间的响应式交互。在 models 中定义的类通过 define 命令实现响应式数据管理,确保数据变动时视图自动更新。React 组件通过 @formily/reactive-react observer 方法,将组件转变为响应式实体,确保每次视图渲染时,自动收集依赖并在依赖更新时重新渲染。
SettingForm 作为设置表单的核心,通过订阅发布类 Subscribable 来管理事件处理。它记录事件处理函数,当发布事件时,会循环调用所有事件处理函数,传入事件对象供处理函数决策是否匹配,实现事件的高效响应与处理。
Engine 类和相关图如 DragDropDriver 和 effect 初始化流程图展示了 Designable 在组件动态管理和交互优化上的设计思路。通过 driver 初始化流程,实现组件的拖拽功能,以及 effect 的初始化,确保应用的流畅性和交互性。
在 Designable 中,阅读源码的作用修改组件属性的机制允许用户在运行时直接调整组件的配置,无需重新加载页面或进行复杂的编码操作,提高了开发效率和应用的动态适应性。
可能是你见过最专业的表单方案---解密Formily2.0
Formily2.0官网:v2.formilyjs.org/,源码地址:github.com/alibaba/formilyjs。项目由笔者发起,特别感谢阿里数字供应链事业部对Formily项目的重视与支持,以及宋思辰为Formily2.0贡献了高性能的@formily/vue组件,潇泽贡献了智能网格布局组件FormGrid。
如果你是初次接触Formily,可以阅读介绍以了解其如何解决表单问题。对于已有使用经验的用户,你会发现Formily2.0的定位从复杂场景扩展到了企业级表单的专业解决方案,专业性体现在以下几个方面:
Formily2.0自信地表示它足够专业,并且在性能优化、依赖关系管理、包设计、答疑成本控制等方面进行了深入改进。
关于性能优化,解决性能问题的关键在于减少初次渲染的阻塞式计算,通过引入Reactive模式并采用类似Mobx的解决方案,优化了性能,同时减少了props脏检查的linux node 源码安装副作用。此外,引入被动联动模式,借助@formily/reactive,实现了响应式领域模型,大大提高了性能。
依赖关系问题上,移除了styled-components、immerjs和rxjs的依赖,改用组件库自身的样式体系,如antd,或替代方案,如less和scss。这不仅减少了体积,还提高了可控性和稳定性。
在包设计方面,统一组件包到@formily/antd,抽离了@formily/json-schema包,移除了@formily/react-shared-components,确保每个包的职责明确。
答疑成本问题得到缓解,通过定义新Schema Type Void、引入x-decorator/x-decorator-props描述包装器、维护dataSource状态、定义x-reactions响应器概念,以及废弃自动删值的默认行为,使答疑更加清晰。
自定义组件扩展机制采用工厂式注册,使用@formily/reactive实现更优雅的开发方式,引入readPretty模式,使自定义组件更加灵活。
文档体系的完善使得查找文档变得容易,便于维护和使用者查找。
发量问题得到了解决,通过解决所有之前的问题,确保了系统更加高效稳定。
Formily2.0的亮点包括独立的响应式解决方案@formily/reactive,更优雅的开发方式,支持Vue2/Vue3,以及Effects局部状态、智能网格布局、响应式并发渲染等特性。
总结来说,Formily2.0在多个方面进行了全面改进,旨在提供专业级的企业级表单解决方案,通过引入Reactive响应式编程模式,解决了性能、依赖、包设计、答疑成本等核心问题,为开发者提供了一个高效、灵活且易于维护的表单框架。
activitiå¨çº¿è®¾è®¡-Activiti6.0ä¸å¦ä½è®¾è®¡åå ³è表åï¼
activiti6çæµç¨ç¼è¾å¨æä¹æ´åè¿èªå·±ç项ç®ä¸
å»ºè®®ä½ å¯ä»¥çä¸ä¸åå¡å çç¸å ³ææ¯åæ:
ç½é¡µé¾æ¥
,
activiti6åactiviti5æ´åæ¹å¼ä¸è´
1.为ä»ä¹è¦æ´å
Activiti5.çæ¬æåæ¬ç¬ç«çActivitiModeler模åæ´åå°äºActivitiExplorerä¸,两è ç¸ç»å使ç¨èµ·æ¥å¾æ¹ä¾¿,éè¿Modeler设计çæµç¨æ¨¡åå¯ä»¥ç´æ¥é¨ç½²å°å¼æ,ä¹å¯ä»¥æå·²ç»é¨ç½²çæµç¨è½¬æ¢ä¸ºModelä»èå¨Modelerä¸ç¼è¾ã
å¨å®é åºç¨ä¸ä¹æè¿æ ·çéæ±,æModeleræ´åå°ä¸å¡ç³»ç»ä¸å¯ä»¥ä¾ç®¡çå使ç¨,æè ä½ä¸ºBPMå¹³å°çä¸é¨ååå¨,å¾éæ¾å®æ¹æ²¡æç»åºå¦ä½æ´åModelerçææ¡£ã
2.æ´åå·¥ä½
2.1ä¸è½½æºç
é¦å éè¦ä»Githubä¸è½½æºç :
2.2å¤å¶æ件
å¤å¶çæææ件åå¨activiti-webapp-explorer2ç®å½ä¸ã
src/main/resourcesä¸çããå°é¡¹ç®æºç çæºç æ ¹ç®å½,ä¿è¯ç¼è¯ä¹åå¨classesæ ¹ç®å½
src/main/webappä¸çapiãeditorãexplorerãlibså°é¡¹ç®çwebappç®å½(ä¸WEB-INFç®å½å级)
2.3æ·»å ä¾èµ
<dependency>__<groupid></groupid>__<artifactid>activiti-explorer</artifactid>__<version>5.</version>__<exclusions>____<exclusion>______<artifactid>vaadin</artifactid>______<groupid></groupid>____</exclusion>____<exclusion>______<artifactid>dcharts-widget</artifactid>______<groupid></groupid>____</exclusion>____<exclusion>______<artifactid>activiti-simple-workflow</artifactid>______<groupid></groupid>____</exclusion>__</exclusions></dependency><dependency>__<groupid></groupid>__<artifactid>activiti-modeler</artifactid>__<version>5.</version></dependency>
2.4æ·»å Javaç±»
æ·»å ä¸ä¸ªç±»ä¿åå°é¡¹ç®ä¸,注åäºä¸äºRESTè·¯ç±ã
package;
import;import;import;import;import;import;
publicclassExplorerRestApplicationextendsActivitiRestApplication{
publicExplorerRestApplication(){ __super();_}_/**_*CreatesarootRestletthatwillreceiveallincomingcalls._*/_@Override_publicsynchronizedRestletcreateInboundRoot(){ __Routerrouter=newRouter(getContext());__();__(router);__(router);__JsonpFilterjsonpFilter=newJsonpFilter(getContext());__(router);__returnjsonpFilter;_}
}
2.5é ç½®
å¨æ件ä¸æ·»å å¦ä¸é ç½®:
<!--Restletadapter,usedtoexposemodelerfunctionalitythroughREST--><servlet>__<servlet-name>RestletServlet</servlet-name>__<servlet-class></servlet-class>__<init-param>____<!--Applicationclassname-->____<param-name></param-name>____<param-value></param-value>__</init-param></servlet>
<!--Catchallservicerequests--><servlet-mapping>__<servlet-name>RestletServlet</servlet-name>__<url-pattern>/service/*</url-pattern></servlet-mapping>
2.6æ§å¶å¨
使ç¨SpringMVCåäºä¸ä¸ªç®åçå°è£ ,ä¹å¯ä»¥ä½¿ç¨å ¶ä»çMVCå®ç°ã
package;
import;import;
import;import;
import;import;import;import;import;import;import;import;import;import;import;import;import;import;import;import;import;import;import;import;import;
/***æµç¨æ¨¡åæ§å¶å¨**@authorhenryyan*/@Controller@RequestMapping(value="/workflow/model")publicclassModelController{
protectedLoggerlogger=(getClass());
@Autowired_RepositoryServicerepositoryService;
/**_*模åå表_*/_@RequestMapping(value="list")_publicModelAndViewmodelList(){ __ModelAndViewmav=newModelAndView("workflow/model-list");__List<model>list=().list();__("list",list);__returnmav;_}
/**_*å建模å_*/_@RequestMapping(value="create")_publicvoidcreate(@RequestParam("name")Stringname,@RequestParam("key")Stringkey,@RequestParam("description")Stringdescription,_____HttpServletRequestrequest,HttpServletResponseresponse){ __try{ ___ObjectMapperobjectMapper=newObjectMapper();___ObjectNodeeditorNode=();___("id","canvas");___("resourceId","canvas");___ObjectNodestencilSetNode=();___("namespace","#");___("stencilset",stencilSetNode);___ModelmodelData=();
ObjectNodemodelObjectNode=();___(_NAME,name);___(_REVISION,1);___description=(description);___(_DESCRIPTION,description);___(());___(name);___((key));
(modelData);___((),().getBytes("utf-8"));
(()+"/service/editor?id="+());__}catch(Exceptione){ ___("å建模å失败:",e);__}_}
/**_*æ ¹æ®Modelé¨ç½²æµç¨_*/_@RequestMapping(value="deploy/{ modelId}")_publicStringdeploy(@PathVariable("modelId")StringmodelId,RedirectAttributesredirectAttributes){ __try{ ___ModelmodelData=(modelId);___ObjectNodemodelNode=(ObjectNode)newObjectMapper().readTree((()));___byte[]bpmnBytes=null;
BpmnModelmodel=newBpmnJsonConverter().convertToBpmnModel(modelNode);___bpmnBytes=newBpmnXMLConverter().convertToXML(model);
StringprocessName=()+".";___Deploymentdeployment=().name(()).addString(processName,newString(bpmnBytes)).deploy();___("message","é¨ç½²æå,é¨ç½²ID="+());__}catch(Exceptione){ ___("æ ¹æ®æ¨¡åé¨ç½²æµç¨å¤±è´¥:modelId={ }",modelId,e);__}__return"redirect:/workflow/model/list";_}
/**_*导åºmodelçxmlæ件_*/_@RequestMapping(value="export/{ modelId}")_publicvoidexport(@PathVariable("modelId")StringmodelId,HttpServletResponseresponse){ __try{ ___ModelmodelData=(modelId);___BpmnJsonConverterjsonConverter=newBpmnJsonConverter();___JsonNodeeditorNode=newObjectMapper().readTree((()));___BpmnModelbpmnModel=(editorNode);___BpmnXMLConverterxmlConverter=newBpmnXMLConverter();___byte[]bpmnBytes=(bpmnModel);
ByteArrayInputStreamin=newByteArrayInputStream(bpmnBytes);___(in,());___Stringfilename=().getId()+".";___("Content-Disposition","attachment;filename="+filename);___();__}catch(Exceptione){ ___("导åºmodelçxmlæ件失败:modelId={ }",modelId,e);__}_}
}</pre>
###2.7注æäºé¡¹
å¦æ使ç¨Spring代çå¼æ,并ä¸å¨é¡¹ç®ä¸åæ¶ææ件(ä¸ç®¡å¨main/resourcesè¿æ¯test/resourcesç®å½),å¨éé¢çå¼æä¸æ·»å ä¸é¢çé ç½®åæ°,å¦åä¼å¯¼è´æå¼Modelerçç¼è¾é¡µé¢æ¶è¯»åæ°æ®è¿å****ç¶æç ã
<preclass="brush:xml"><propertyname="processEngineName"value="test"></property></pre>
å¼æé»è®¤å称为default,()æ¥è¯¢æ¶ä¼å æ£ç´¢main/resources,ç¶ååæ£ç´¢test/resourcesçåæ件,æ以å½main/resourcesçæµä¸å°æå®æ件æ¶å°±ä¼å¯¼è´è¯¥å¼æ被å½åwebåºç¨çå¼æ对象,è¿æ ·ä¼å¯¼è´æ两个å¼æ,æ以æå¼æçå称æ¹ä¸ºéé»è®¤çâdefaultâã
##3.ä¸æä¹±ç é®é¢è§£å³åæ³
å¨JVMåæ°ä¸æ·»å åæ°:
>-=UTF-8-=UTF-8
**åè**:[å¨ActivitiModelerä¸è®¾è®¡çæµç¨å å«å¥æ°ä¸ªä¸ææ¶ä¸è½é¨ç½²é®é¢](
##4.æææªå¾
å¨ææ°çkft-activiti-demoçæ¬(1.7.0)ä¸å·²ç»éæäºActivitiModeler,å¯ä»¥å¨çº¿è®¿é®,ä¹å¯ä»¥ä¸è½½æºç å¦ä¹ å¦ä½é ç½®ã
ç»å½[
![kft-activiti-demoä¸çæææªå¾](/files///)![kft-activiti-demoä¸çæææªå¾](/files///)</model>
Activiti6.0ä¸å¦ä½è®¾è®¡åå ³è表åï¼æ°å¢äºç¯èç¨æ·ä»»å¡,è¿æ¶ç´§è·çæ°å¢ä¸ä¸ªè¡¨åå³å¯,以åèæ¬ãæ ·å¼ãWebAPI;å é¤äºç¯èç¨æ·ä»»å¡,è¿æ¶å¯ä»¥ä¸ç¨ç®¡,为顾åæ§çæ¬çæµç¨å®ä¹,å ¶å¯¹åºç表åè¿éè¦ä¿ç,并ä¸è½å é¤;ä¿®æ¹äºç¯èç¨æ·ä»»å¡,æ¯å¦å¨Aç¯èæ°å¢äºä¸¤ä¸ªå段,åæ¶å¨Bç¯èåå°äºä¸¤ä¸ªå段,è¿æ¶å°±è¦ä¸ºAãB两个ç¯èåèªéæ°å建表åãéæ°å建èæ¬ãæ ·å¼ã以åéæ°å建WebAPI,å 为表ååäº,é£ä¹ä¸å¡ä¹å°±åäº,SQL(表)ä¹é½è·çåäºã
ãActivitiå®æãepubä¸è½½å¨çº¿é è¯»å ¨æï¼æ±ç¾åº¦ç½çäºèµæºãActivitiå®æã(é«æ´ªç£)çµå书ç½çä¸è½½å è´¹å¨çº¿é 读
é¾æ¥:
æåç :xdni
书å:Activitiå®æ
è±ç£è¯å:7.2
ä½è :é«æ´ªç£
åºç社:_åã²å éå«
åºçå¹´:-1-1
页æ°:
å 容ç®ä»:
ãActivitiå®æãç«è¶³äºå®è·µ,ä¸ä» 让读è ç¥å ¶ç¶,å ¨é¢ææ¡Activitiæ¶æãåè½ãç¨æ³ãæå·§åæä½³å®è·µ,广度足å¤;èä¸è®©è¯»è ç¥å ¶æ以ç¶,æ·±å ¥ç解Activitiçæºä»£ç å®ç°ã设计模å¼åPVM,深度ä¹è¶³å¤ã
ãActivitiå®æãä¸å ±å个é¨å:åå¤ç¯(1~2ç« )ä»ç»äºActivitiçæ¦å¿µãç¹ç¹ãåºç¨ãä½ç³»ç»æ,以åå¼åç¯å¢çæ建åé ç½®;åºç¡ç¯(3~4ç« )é¦å 讲解äºActivitiModelerãActivitiDesigner两ç§æµç¨è®¾è®¡å·¥å ·ç详ç»ä½¿ç¨,ç¶å详ç»è®²è§£äºBPMN2.0è§è;å®æç¯(5~ç« )ç³»ç»è®²è§£äºActivitiçç¨æ³ãæå·§åæä½³å®è·µ,å å«æµç¨å®ä¹ãæµç¨å®ä¾ãä»»å¡ãåæµç¨ãå¤å®ä¾ãäºä»¶ä»¥åçå¬å¨ç;é«çº§ç¯(~)éè¿éæWebServiceãè§åå¼æãJPAãESBçåç§æå¡åä¸é´ä»¶æ¥éè¿°äºActivitiä¸ä» ä» æ¯å¼æ,å®é ä¸æ¯ä¸ä¸ªBPMå¹³å°,æåè¿éè¿æºä»£ç 对å®ç设计模å¼åPVMè¿è¡äºåæã
ä½è ç®ä»:
é«æ´ªç£(åå¡å )èµæ·±è½¯ä»¶å¼åå·¥ç¨å¸åæ¶æå¸,为Activitiè´¡ç®äºå¤§é代ç ,为Activitiå¨ä¸å½çæ¨å¹¿ä¸æ®ååäºå¤§éçå·¥ä½,å¨ç¤¾ç¾¤ä¸æå¾é«çå¨æåç¥å度,被称为ä¸å½Activitié¢åç第ä¸äººãå¤å¹´æ¥ä¸ç´ä»äºOAãERPçç³»ç»çå¼åä¸æ¶æ设计工ä½,æç»å ³æ³¨å¹¶æ·±å ¥ç 究工ä½æµå¼æ,ç®åå°±èäºå°é©¬è´è½¦,æ ä»»æ¶æå¸ä¸è,并è´è´£å ¬å¸å é¨å·¥ä½æµå¹³å°ç建设工ä½ã
XRender - 开源之路
XRender,阿里飞猪孵化的开源产品,目前在GitHub上获得4.2k star。本文旨在分享XRender在过去一年内的发展和变革,以及它如何成为更多前端开发者的朋友。
一、前言
1. 什么是 XRender?XRender 是一套基于React.js框架的轻量、易用、易上手的中后台「表单 / 表格 / 图表」解决方案,已经在阿里飞猪内部服务三年,未来将持续为用户提供服务。
2. 为什么需要 XRender?对于中后台业务而言,表单+表格能覆盖%的业务场景,且大部分场景重复度高。开发人员无需浪费时间在切图上,XRender这类工具能有效提升开发效率。
二、XRender 的自我革新
三年前,FormRender作为表单解决方案在GitHub上开源,成为XRender家族的首成员。面对复杂业务场景,FormRender的旧技术方案面临挑战,内部决定升级FormRender,并增加更多Render方案,以提升内部前端开发者的效率。
现在的XRender包括FormRender、FRGenetator、TableRender和ChartRender四个组件,统称为XRender。
1.「FormRender」:协议驱动的表单解决方案。代码示例展示其核心功能不变,遵循「协议驱动渲染」原则。
代码重构,面向未来:FormRender 1.x 对内核进行彻底重构,全面拥抱React Hooks和Antd Design 4.x,增加Typescript类型定义,简化编写方式。新增beforeFinish、onFinish钩子,用于表单提交前的校验和数据提交,以及onMount方法,类似于React的componentDidMount。引入userForm方法,方便操作表单和schema,提供动态修改功能。新增watch变量,用于数据监听,增加组件丰富度,如rate、treeSelect等内置支持,以及通过JSON Schema的format属性自定义组件。
2.「表单设计器」:中后台表单可视化搭建工具,提供可拖拽、可搭建能力,并支持导出schema。
3.「TableRender」:表格解决方案,内置搜索、重置、分页功能,简化开发流程。
4.「ChartRender」:基于@ant-design/charts的图表解决方案,提供快速生成图表的能力。
三、适合场景
XRender广泛应用于阿里飞猪的中后台业务,同时被阿里云、高德、淘宝、蚂蚁等BU的开发者使用。对于面向运营的搭建平台,推荐使用XRender。
四、未来规划
1. 内置组件支持自定义:开放List、Array类型的嵌套组件样式定制化,满足不同业务需求。
2. XRender 2.0开发:计划于年中旬完成,支持移动端渲染引擎Rax和Ant Design Mobile v5。
五、结尾
感谢XRender的开发者,特别制作视频以致敬社区。如果你希望在项目中使用XRender,可访问文档站点快速上手。若对源代码感兴趣或有建议,欢迎访问GitHub仓库。如XRender对你有帮助,请在GitHub上给予支持。