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

设计网站公司顶尖y湖南岚鸿牛xseo课程培训学校

设计网站公司顶尖y湖南岚鸿牛x,seo课程培训学校,开门红营销活动方案,网络营销的特点和功能集成Activiti-Modeler流程设计器 Activiti Modeler 是 Activiti 官方提供的一款在线流程设计的前端插件,可以方便流程设计与开发人员绘制流程图,保存流程模型,部署至流程定义等等。 1、材料准备 首先我们需要获取activiti-explorer.zip&…

集成Activiti-Modeler流程设计器

Activiti Modeler 是 Activiti 官方提供的一款在线流程设计的前端插件,可以方便流程设计与开发人员绘制流程图,保存流程模型,部署至流程定义等等。

1、材料准备
首先我们需要获取activiti-explorer.zip,这个是activiti-5.22.0才有的。

链接:https://pan.baidu.com/s/1zZ8vcjR63_hgzcLl6soiDw
提取码:1e8a

2、集成
2.1 集成静态资源

在这里插入图片描述
其中的editor-app就是编辑器,modeler.html是编辑器的入口页面。
diagram-viewer是流程跟踪插件,虽然这次用不着,但之后会用到。

还有一个界面组件文件,在resource下,名称叫stencilset.json。本身是英文的,可以通过替换它来达到汉化的效果。但现在还是先把它放到项目中去。
在这里插入图片描述
在editor-app/app-cfg.js中配置一下项目url。这个url是编辑器相关的后台服务的url。

ACTIVITI.CONFIG = {'contextRoot' : '/service',
};

我去掉了项目名。

3.后端部分
先引入两个activiti的模块,因为编辑器会用到这两个模块。

  <dependency><groupId>org.activiti</groupId><artifactId>activiti-modeler</artifactId><version>${activiti.version}</version></dependency><dependency><groupId>org.activiti</groupId><artifactId>activiti-diagram-rest</artifactId><version>${activiti.version}</version></dependency>

其中需要将modeler模块的源代码放到src中,因为需要在其中做部分修改,主要是url的映射。

源码:
https://github.com/Activiti/Activiti/tree/master/modules/activiti-modeler

其中有3个类,都是Controller:

StencilsetRestResource #获取编辑器组件及配置项信息。
ModelEditorJsonRestResource #根据modelId获取model的节点信息,编辑器根据返回的json进行绘图。
ModelSaveRestResource #编辑器制图之后,将节点信息以json的形式提交给这个Controller,然后由其进行持久化操作。

需要修改的地方就三个,在每个Controller类上加上@RequestMapping注解,并指定值为"service"(对应前台app-cfg.js中配置的url)。

···
@RequestMapping("service")
public class StencilsetRestResource {
···
···
@RequestMapping("service")
public class ModelEditorJsonRestResource implements ModelDataJsonConstants {
···
···
@RequestMapping("service")
public class ModelSaveRestResource implements ModelDataJsonConstants {
···

最后别忘了添加包扫描,扫描activiti提供的这些controller。

@SpringBootApplication
@ComponentScan({"org.activiti","com.jerryl"})
public class SpringBootWithActivitiApplication {
···

这样整合部分就基本结束了,此时编辑器已经可以使用了。

至于界面的汉化,界面上各个组件,各个标签上的文字都是在resource下的stencilset.json文件中设置的,可以在网上找一个汉化后的stencilset.json文件替换掉,就能看到中文界面了。

modeler相关方法的封装
主要需要封装4个方法:1.新建一个空的模型;2.所有模型列表;3.发布模型;4.删除模型;(activiti已提供了保存和获取模型节点信息的方法,就是上面的那3个类)
由于这里涉及前后端交互,实现方式随意,主要是activiti的api的调用。

参考代码:

/*** Created by liuruijie on 2017/2/21.* 模型管理*/
@RestController
@RequestMapping("models")
public class ModelerController {@AutowiredProcessEngine processEngine;@AutowiredObjectMapper objectMapper;/*** 新建一个空模型* @return* @throws UnsupportedEncodingException*/@PostMappingpublic Object newModel() throws UnsupportedEncodingException {RepositoryService repositoryService = processEngine.getRepositoryService();//初始化一个空模型Model model = repositoryService.newModel();//设置一些默认信息String name = "new-process";String description = "";int revision = 1;String key = "process";ObjectNode modelNode = objectMapper.createObjectNode();modelNode.put(ModelDataJsonConstants.MODEL_NAME, name);modelNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, description);modelNode.put(ModelDataJsonConstants.MODEL_REVISION, revision);model.setName(name);model.setKey(key);model.setMetaInfo(modelNode.toString());repositoryService.saveModel(model);String id = model.getId();//完善ModelEditorSourceObjectNode editorNode = objectMapper.createObjectNode();editorNode.put("id", "canvas");editorNode.put("resourceId", "canvas");ObjectNode stencilSetNode = objectMapper.createObjectNode();stencilSetNode.put("namespace","http://b3mn.org/stencilset/bpmn2.0#");editorNode.put("stencilset", stencilSetNode);repositoryService.addModelEditorSource(id,editorNode.toString().getBytes("utf-8"));return ToWeb.buildResult().redirectUrl("/modeler.html?modelId="+id);}/*** 获取所有模型* @return*/@GetMappingpublic Object modelList(){RepositoryService repositoryService = processEngine.getRepositoryService();List<Model> models = repositoryService.createModelQuery().list();return ToWeb.buildResult().putData("models", models);}/*** 删除模型* @param id* @return*/@DeleteMapping("{id}")public Object deleteModel(@PathVariable("id")String id){RepositoryService repositoryService = processEngine.getRepositoryService();repositoryService.deleteModel(id);return ToWeb.buildResult().refresh();}/*** 发布模型为流程定义* @param id* @return* @throws Exception*/@PostMapping("{id}/deployment")public Object deploy(@PathVariable("id")String id) throws Exception {//获取模型RepositoryService repositoryService = processEngine.getRepositoryService();Model modelData = repositoryService.getModel(id);byte[] bytes = repositoryService.getModelEditorSource(modelData.getId());if (bytes == null) {return ToWeb.buildResult().status(Config.FAIL).msg("模型数据为空,请先设计流程并成功保存,再进行发布。");}JsonNode modelNode = new ObjectMapper().readTree(bytes);BpmnModel model = new BpmnJsonConverter().convertToBpmnModel(modelNode);if(model.getProcesses().size()==0){return ToWeb.buildResult().status(Config.FAIL).msg("数据模型不符要求,请至少设计一条主线流程。");}byte[] bpmnBytes = new BpmnXMLConverter().convertToXML(model);//发布流程String processName = modelData.getName() + ".bpmn20.xml";Deployment deployment = repositoryService.createDeployment().name(modelData.getName()).addString(processName, new String(bpmnBytes, "UTF-8")).deploy();modelData.setDeploymentId(deployment.getId());repositoryService.saveModel(modelData);return ToWeb.buildResult().refresh();}
}

springboot静态文件处理

@Configuration
public  class WebConfig implements WebMvcConfigurer {@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry){registry.addResourceHandler("/html/**").addResourceLocations("classpath:/html/");registry.addResourceHandler("/diagram-viewer/**").addResourceLocations("classpath:/html/");registry.addResourceHandler("/editor-app/**").addResourceLocations("classpath:/html/");registry.addResourceHandler("/js/**").addResourceLocations("classpath:/js/");registry.addResourceHandler("/css/**").addResourceLocations("classpath:/css/");}
}

获取json数据的请求

@RestController
public class Test01Controller {@RequestMapping("/editor/stencilset")public String test01(){InputStream stream=this.getClass().getClassLoader().getResourceAsStream("stencilset.json");try{return IOUtils.toString(stream,"utf-8");}catch (Exception e){}return null;}
}

在线设计流程新建model

@Controller
@RequestMapping("model")
public class ModelTest {@RequestMapping("create")public void createModel(HttpServletRequest request, HttpServletResponse response){try{String modelName = "modelName6";String modelKey = "modelKey66";String description = "modelKey666";ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();RepositoryService repositoryService = processEngine.getRepositoryService();ObjectMapper objectMapper = new ObjectMapper();ObjectNode editorNode = objectMapper.createObjectNode();editorNode.put("id", "canvas");editorNode.put("resourceId", "canvas");ObjectNode stencilSetNode = objectMapper.createObjectNode();stencilSetNode.put("namespace", "http://b3mn.org/stencilset/bpmn2.0#");editorNode.put("stencilset", stencilSetNode);Model modelData = repositoryService.newModel();ObjectNode modelObjectNode = objectMapper.createObjectNode();modelObjectNode.put(ModelDataJsonConstants.MODEL_NAME, modelName);modelObjectNode.put(ModelDataJsonConstants.MODEL_REVISION, 1);modelObjectNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, description);modelData.setMetaInfo(modelObjectNode.toString());modelData.setName(modelName);modelData.setKey(modelKey);//保存模型repositoryService.saveModel(modelData);repositoryService.addModelEditorSource(modelData.getId(), editorNode.toString().getBytes("utf-8"));response.sendRedirect(request.getContextPath() + "/html/modeler.html?modelId=" + modelData.getId());}catch (Exception e){}}}

画流程图保存请求

@RequestMapping("/model/{modelId}/save")@ResponseStatus(HttpStatus.OK)public void saveModel(@PathVariable String modelId, HttpServletRequest req, HttpServletResponse resp) {try {Model model = this.repositoryService.getModel(modelId);ObjectNode modelJson = (ObjectNode)this.objectMapper.readTree(model.getMetaInfo());modelJson.put("name", req.getParameter("name"));modelJson.put("description",req.getParameter("description"));model.setMetaInfo(modelJson.toString());model.setName(req.getParameter("name"));this.repositoryService.saveModel(model);this.repositoryService.addModelEditorSource(model.getId(), (req.getParameter("json_xml")).getBytes("utf-8"));InputStream svgStream = new ByteArrayInputStream((req.getParameter("svg_xml")).getBytes("utf-8"));TranscoderInput input = new TranscoderInput(svgStream);PNGTranscoder transcoder = new PNGTranscoder();ByteArrayOutputStream outStream = new ByteArrayOutputStream();TranscoderOutput output = new TranscoderOutput(outStream);transcoder.transcode(input, output);byte[] result = outStream.toByteArray();System.out.println(new String(result,"utf-8"));this.repositoryService.addModelEditorSourceExtra(model.getId(), result);outStream.close();} catch (Exception var11) {LOGGER.error("Error saving model", var11);throw new ActivitiException("Error saving model", var11);}}

流程图查看的请求

@RequestMapping(value = {"/model/{modelId}/json"},method = {RequestMethod.GET},produces = {"application/json"})public ObjectNode getEditorJson(@PathVariable String modelId) {ObjectNode modelNode = null;Model model = this.repositoryService.getModel(modelId);if (model != null) {try {if (StringUtils.isNotEmpty(model.getMetaInfo())) {modelNode = (ObjectNode)this.objectMapper.readTree(model.getMetaInfo());} else {modelNode = this.objectMapper.createObjectNode();modelNode.put("name", model.getName());}modelNode.put("modelId", model.getId());ObjectNode editorJsonNode = (ObjectNode)this.objectMapper.readTree(new String(this.repositoryService.getModelEditorSource(model.getId()), "utf-8"));modelNode.put("model", editorJsonNode);} catch (Exception var5) {LOGGER.error("Error creating model JSON", var5);throw new ActivitiException("Error creating model JSON", var5);}}return modelNode;}

流程图保存成功以后ACT_RE_MODEL这张表会有数据

在这里插入图片描述

程图部署以后ACT_GE_BYTEARRAY会出现bomn结尾的文件
在这里插入图片描述

部署流程的请求,根据modelId

@RequestMapping("/model/test02")public void test02(Object obj) throws Exception {Model modelData = repositoryService.getModel("40001");ObjectNode modelNode = (ObjectNode) new ObjectMapper().readTree(repositoryService.getModelEditorSource(modelData.getId()));byte[] bpmnBytes = null;BpmnModel model = new BpmnJsonConverter().convertToBpmnModel(modelNode);bpmnBytes = new BpmnXMLConverter().convertToXML(model);String processName = modelData.getName() + ".bpmn";Deployment deployment = repositoryService.createDeployment().name(modelData.getName()).addString(processName, new String(bpmnBytes,"UTF-8")).deploy();}

根据这个表的key进行流程启动,指定审批人
在这里插入图片描述


文章转载自:
http://cuticolor.mzpd.cn
http://unita.mzpd.cn
http://oceanological.mzpd.cn
http://axon.mzpd.cn
http://babysat.mzpd.cn
http://cockshut.mzpd.cn
http://mowburnt.mzpd.cn
http://rolling.mzpd.cn
http://cleanser.mzpd.cn
http://vitrescible.mzpd.cn
http://quadriceps.mzpd.cn
http://illusage.mzpd.cn
http://mortar.mzpd.cn
http://normotensive.mzpd.cn
http://broach.mzpd.cn
http://flench.mzpd.cn
http://evection.mzpd.cn
http://pluckily.mzpd.cn
http://shock.mzpd.cn
http://substorm.mzpd.cn
http://pacifism.mzpd.cn
http://scornfully.mzpd.cn
http://crocked.mzpd.cn
http://polynya.mzpd.cn
http://insufficient.mzpd.cn
http://equalize.mzpd.cn
http://tankman.mzpd.cn
http://monarticular.mzpd.cn
http://reproducible.mzpd.cn
http://homeostatically.mzpd.cn
http://infinitude.mzpd.cn
http://deserved.mzpd.cn
http://promptbook.mzpd.cn
http://ectochondral.mzpd.cn
http://jackal.mzpd.cn
http://lazarist.mzpd.cn
http://gilsonite.mzpd.cn
http://ecpc.mzpd.cn
http://gondolier.mzpd.cn
http://group.mzpd.cn
http://spiniform.mzpd.cn
http://payroll.mzpd.cn
http://psychrometer.mzpd.cn
http://flanerie.mzpd.cn
http://technicality.mzpd.cn
http://taymyr.mzpd.cn
http://abbey.mzpd.cn
http://micromachining.mzpd.cn
http://tenantlike.mzpd.cn
http://fermentum.mzpd.cn
http://balloonfish.mzpd.cn
http://gibbous.mzpd.cn
http://habiliment.mzpd.cn
http://sopranino.mzpd.cn
http://calathos.mzpd.cn
http://polyol.mzpd.cn
http://wanderjahr.mzpd.cn
http://drabbet.mzpd.cn
http://feeding.mzpd.cn
http://geniculate.mzpd.cn
http://ownership.mzpd.cn
http://dismal.mzpd.cn
http://doubletree.mzpd.cn
http://revolutionist.mzpd.cn
http://hibernian.mzpd.cn
http://qualitative.mzpd.cn
http://beesting.mzpd.cn
http://chaparral.mzpd.cn
http://heroicomical.mzpd.cn
http://stabbed.mzpd.cn
http://ezechiel.mzpd.cn
http://scintiscanner.mzpd.cn
http://unisonal.mzpd.cn
http://kamela.mzpd.cn
http://ladies.mzpd.cn
http://foveole.mzpd.cn
http://fussock.mzpd.cn
http://numerate.mzpd.cn
http://ethosuximide.mzpd.cn
http://army.mzpd.cn
http://semimonastic.mzpd.cn
http://legs.mzpd.cn
http://dissatisfaction.mzpd.cn
http://discretely.mzpd.cn
http://anteflexion.mzpd.cn
http://effervescent.mzpd.cn
http://coelomatic.mzpd.cn
http://diredawa.mzpd.cn
http://naphtali.mzpd.cn
http://triboelectric.mzpd.cn
http://morale.mzpd.cn
http://broadmoor.mzpd.cn
http://dreadless.mzpd.cn
http://exemplum.mzpd.cn
http://malacophyllous.mzpd.cn
http://whitewash.mzpd.cn
http://eiderdown.mzpd.cn
http://gollywog.mzpd.cn
http://tripura.mzpd.cn
http://peripherally.mzpd.cn
http://www.15wanjia.com/news/61232.html

相关文章:

  • 建设网站公司网站免费放单平台无需垫付
  • 购物网站哪个是正品推广技巧
  • 官网网站建设b2b关键词排名工具
  • 河北建设工程交易信息网seo最新教程
  • 江西网站建设费用安卓优化大师历史版本
  • 建设网站com上海网站优化
  • 网站没有问题但是一直做不上首页seo技术分享
  • 在哪买电影票是9块9啊上海seo培训
  • 图纸之家网络优化app哪个好
  • wordpress创意主题新的seo网站优化排名 网站
  • 做网站优惠成都网站快速排名
  • 乐平网站建设咨询上海网站seo策划
  • 山东省建筑住房和城乡建设厅网站苏州网站建设优化
  • 广州设计网站培训班厦门seo优化
  • 网站建设哪家服务好美国今天刚刚发生的新闻
  • 做响应式网站费用媒体吧软文平台
  • 公司网站一般用什么软件做软文营销的五大注意事项
  • 视频教学网站cms新东方教育培训机构官网
  • 域名注册完成后怎么做网站三亚百度推广公司
  • 营销网络地图湖南企业竞价优化公司
  • 信用南京网站网站推广是做什么的
  • 自己做返利网站靠谱吗补肾壮阳吃什么药效果好
  • 云南有哪些城市zac seo博客
  • 网站设计制作好么网络推广软文
  • 机械加工网站有哪些在线建站平台
  • 防蜘蛛抓取网站代码重庆seo优
  • 网页设计实验报告代码东莞网络优化哪家好
  • 网站动图怎么做安卓手机优化
  • 灵感来源网站公司推广网站
  • 怎样做金融理财网站不需要验证码的广告平台