boot-admin整合flowable官方editor-app源码进行BPMN2-0建模(续)
书接上回
项目源码仓库github
项目源码仓库gitee
boot-admin 是一款采用前后端分离模式、基于SpringCloud微服务架构的SaaS后台管理框架。系统内置基础管理、权限管理、运行管理、定义管理、代码生成器和办公管理6个功能模块,集成分布式事务Seata、工作流引擎Flowable、业务规则引擎Drools、后台作业调度框架Quartz等,技术栈包括Mybatis-plus、Redis、Nacos、Seata、Flowable、Drools、Quartz、SpringCloud、Springboot Admin Gateway、Liquibase、jwt、Openfeign、I18n等。
在上一篇博文中,已经介绍了 boot-admin 对 editor-app 前端代码的集成改造,接下来我们看看后端代码。
提供汉化资源json数据
- /**
- * 获取汉化资源
- * @return
- */
- @RequestMapping(value = "/editor/stencilset", method = RequestMethod.GET, produces = "application/json;charset=utf-8")
- public String getStencilset() {
- InputStream stencilsetStream = this.getClass().getClassLoader().getResourceAsStream("stencilset.json");
- try {
- return IOUtils.toString(stencilsetStream, "utf-8");
- } catch (Exception e) {
- throw new FlowableException("Error while loading stencil set", e);
- }
- }
复制代码 资源包stencilset.json需放在resources文夹下,这里提供下载:点击下载汉化包
分页获取模型列表
controller:- @RequestMapping("/api/workflow/auth/activiti")
- @RestController
- @Slf4j
- public class ModelController extends BaseController {
- @Resource
- private FormValidator formValidator;
- @Autowired
- private MyModelService modelService;
- @PostMapping("/model/page")
- @ApiOperation("分页获取项目数据表列表")
- public ResultDTO getTablePage(@Valid @RequestBody ModelQueryVO queryVO, BindingResult bindingResult) throws Exception {
- if (bindingResult.hasErrors()) {
- return formValidator.generateMessage(bindingResult);
- }
- return modelService.getPage(queryVO);
- }
- }
复制代码 service:- @Override
- public ResultDTO getPage(ModelQueryVO queryVO) throws Exception {
- int offset = (queryVO.getCurrentPage() - 1) * queryVO.getPageSize() + 0;
- List<Model> list = repositoryService.createModelQuery().listPage(offset
- , queryVO.getPageSize());
- int total = (int) repositoryService.createModelQuery().count();
- Page<Model> page = new Page<>();
- page.setRecords(list);
- page.setTotal(total);
- return ResultDTO.success(page);
- }
复制代码 读取模型数据
controller:- @RequestMapping("/api/workflow/auth/activiti")
- @RestController
- @Slf4j
- public class ModelController extends BaseController {
- @Autowired
- private RepositoryService repositoryService;
- @Autowired
- private ObjectMapper objectMapper;
- /**
- * 获取用于编辑的模型JSON数据
- * @param modelId 模型ID
- * @return
- */
- @GetMapping(value = "/model/json")
- public ObjectNode getEditorJson(@RequestParam("modelId") String modelId) {
- ObjectNode modelNode = null;
- Model model = repositoryService.getModel(modelId);
- if (model != null) {
- try {
- if (StringUtils.isNotEmpty(model.getMetaInfo())) {
- modelNode = (ObjectNode) objectMapper.readTree(model.getMetaInfo());
- } else {
- modelNode = objectMapper.createObjectNode();
- modelNode.put(MODEL_NAME, model.getName());
- }
- modelNode.put(MODEL_ID, model.getId());
- ObjectNode editorJsonNode = (ObjectNode) objectMapper.readTree(
- new String(repositoryService.getModelEditorSource(model.getId()), "utf-8"));
- modelNode.put("model", editorJsonNode);
- } catch (Exception e) {
- log.error("Error creating model JSON", e);
- throw new FlowableException("Error creating model JSON", e);
- }
- }
- return modelNode;
- }
- }
复制代码 增加新模型
controller:- @RequestMapping("/api/workflow/auth/activiti")
- @RestController
- @Slf4j
- public class ModelController extends BaseController {
- @Resource
- private FormValidator formValidator;
- @Autowired
- private MyModelService modelService;
-
- @PostMapping("/model/add")
- @ApiOperation("保存数据")
- public ResultDTO save(@Valid @RequestBody ModelDataVO dataVO, BindingResult bindingResult) throws Exception {
- if (bindingResult.hasErrors()) {
- return formValidator.generateMessage(bindingResult);
- }
- BaseUser baseUser = UserTool.getBaseUser();
- return modelService.addNewModel(dataVO, baseUser);
- }
- }
复制代码 service:- @Override
- public ResultDTO addNewModel(ModelDataVO dataVO, BaseUser baseUser) throws Exception {
- //初始化一个空模型
- Model model = repositoryService.newModel();
- //设置一些默认信息
- String name = dataVO.getName();
- String description = dataVO.getDescription();
- int revision = 1;
- String key = dataVO.getKey();
- ObjectNode modelNode = objectMapper.createObjectNode();
- modelNode.put(MODEL_NAME, name);
- modelNode.put(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();
- //完善ModelEditorSource
- 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);
- repositoryService.addModelEditorSource(id, editorNode.toString().getBytes("utf-8"));
- return ResultDTO.success(id);
- }
复制代码 保存模型数据
- /**
- * 保存模型数据
- * @param modelId
- * @param name
- * @param description
- * @param json_xml
- * @param svg_xml
- */
- @RequestMapping(value = "/model/save", method = RequestMethod.PUT)
- @ResponseStatus(value = HttpStatus.OK)
- public void saveModel(@RequestParam("modelId") String modelId
- , String name, String description
- , String json_xml, String svg_xml) {
- try {
- Model model = repositoryService.getModel(modelId);
- ObjectNode modelJson = (ObjectNode) objectMapper.readTree(model.getMetaInfo());
- modelJson.put(MODEL_NAME, name);
- modelJson.put(MODEL_DESCRIPTION, description);
- model.setMetaInfo(modelJson.toString());
- model.setName(name);
- repositoryService.saveModel(model);
- repositoryService.addModelEditorSource(model.getId(), json_xml.getBytes("utf-8"));
- InputStream svgStream = new ByteArrayInputStream(svg_xml.getBytes("utf-8"));
- TranscoderInput input = new TranscoderInput(svgStream);
- PNGTranscoder transcoder = new PNGTranscoder();
- // Setup output
- ByteArrayOutputStream outStream = new ByteArrayOutputStream();
- TranscoderOutput output = new TranscoderOutput(outStream);
- // Do the transformation
- transcoder.transcode(input, output);
- final byte[] result = outStream.toByteArray();
- repositoryService.addModelEditorSourceExtra(model.getId(), result);
- outStream.close();
- } catch (Exception e) {
- log.error("Error saving model", e);
- throw new FlowableException("Error saving model", e);
- }
- }
复制代码 删除模型
controller:- @RequestMapping("/api/workflow/auth/activiti")
- @RestController
- @Slf4j
- public class ModelController extends BaseController {
- @Resource
- private FormValidator formValidator;
- @Autowired
- private MyModelService modelService;
-
- @PostMapping("/model/del")
- @ApiOperation("删除数据")
- public ResultDTO del(@Valid @RequestBody GuidContainerVO guidContainerVO, BindingResult bindingResult) throws Exception {
- if (bindingResult.hasErrors()) {
- return formValidator.generateMessage(bindingResult);
- }
- return modelService.delete(guidContainerVO.getGuid());
- }
- }
复制代码 service:- @Override
- public ResultDTO delete(String guid) throws Exception {
- repositoryService.deleteModel(guid);
- return ResultDTO.success();
- }
复制代码 发布(部署)模型
- @RequestMapping("/api/workflow/auth/activiti")
- @RestController
- @Slf4j
- public class ModelController extends BaseController {
- @Resource
- private FormValidator formValidator;
- @Autowired
- private MyModelService modelService;
-
- @PostMapping("/model/deploy")
- public ResultDTO deploy(@Valid @RequestBody GuidContainerVO guidContainerVO, BindingResult bindingResult) throws Exception {
- if (bindingResult.hasErrors()) {
- return formValidator.generateMessage(bindingResult);
- }
- return modelService.deploy(guidContainerVO.getGuid());
- }
- }
复制代码 service:- @Override
- public ResultDTO deploy(String guid) throws Exception {
- /**获取模型 **/
- Model modelData = repositoryService.getModel(guid);
- byte[] bytes = repositoryService.getModelEditorSource(modelData.getId());
- if (bytes == null) {
- return ResultDTO.failureCustom("模型数据为空,请先设计流程并成功保存,再进行发布。");
- }
- JsonNode modelNode = new ObjectMapper().readTree(bytes);
- BpmnModel model = new BpmnJsonConverter().convertToBpmnModel(modelNode);
- if (model.getProcesses().size() == 0) {
- return ResultDTO.failureCustom("数据模型不符要求,请至少设计一条主线流程。");
- }
- /** 设置名称 **/
- if(StringUtils.isNotBlank(modelData.getCategory())) {
- model.setTargetNamespace(modelData.getCategory());
- }
- byte[] bpmnBytes = new BpmnXMLConverter().convertToXML(model);
- /** 发布流程 .bpmn20.xml必需加 **/
- String processName = modelData.getName() + ".bpmn20.xml";
- Deployment deployment = repositoryService.createDeployment()
- .name(modelData.getName())
- .category(modelData.getCategory())
- .key(modelData.getKey())
- .addString(processName, new String(bpmnBytes, "UTF-8"))
- .deploy();
- modelData.setDeploymentId(deployment.getId());
- repositoryService.saveModel(modelData);
- return ResultDTO.success();
- }
复制代码 总结:经过集成改造,boot-admin与flowable editor-app模型设计器实现紧密整合,不但实现了BPMN流程编辑、修改、发布等功能,还实现前端 携带jwt按权限访问后端资源。
boot-admin 集成 flowable editor-app 运行效果如下图所示:

项目源码仓库github
项目源码仓库gitee
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |