SpringBoot集成flowable-modeler(6.4.1) 实现免登

因公司需求需要将flowable的流程设计器集成到项目中,下面将最近的研究成果记录一下。

在这里插入图片描述
在这里插入图片描述

文章目录

    • 一、下载flowable-modeler源码
    • 二、添加相关maven包
    • 三、调用idm服务重新接口
    • 四、配置类
    • 五、启动类跳过登陆拦截
    • 六、配置文件

一、下载flowable-modeler源码

  • 把flowable-ui-modeler-app\src\main\resources\static下面的代码拷贝至我们自己的工程
    在这里插入图片描述

二、添加相关maven包

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.7.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.gblfy</groupId><artifactId>flowable</artifactId><version>0.0.1-SNAPSHOT</version><name>flowable_modeler</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><!--去除本身的logback,使用log4j,如果想要使用logback需要添加commons-logging--><exclusions><!-- 去除旧log依赖 --><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><exclusions><!--去除本身的logback,使用log4j,如果想要使用logback需要添加commons-logging--><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions><scope>test</scope></dependency><!-- https://mvnrepository.com/artifact/commons-io/commons-io --><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version></dependency><dependency><groupId>org.flowable</groupId><artifactId>flowable-groovy-script-static-engine</artifactId><version>6.4.1</version></dependency><dependency><groupId>org.codehaus.groovy</groupId><artifactId>groovy-all</artifactId><version>2.5.4</version><type>pom</type></dependency><!-- https://mvnrepository.com/artifact/commons-io/commons-io --><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.0.0</version></dependency><!-- https://mvnrepository.com/artifact/org.liquibase/liquibase-core --><dependency><groupId>org.liquibase</groupId><artifactId>liquibase-core</artifactId><version>3.6.2</version></dependency><!-- Logging --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>${slf4j.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>${slf4j.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-test --><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.0.9.RELEASE</version></dependency><!-- https://mvnrepository.com/artifact/org.flowable/flowable-spring-boot-starter-process --><dependency><groupId>org.flowable</groupId><artifactId>flowable-spring-boot-starter-process</artifactId><version>6.4.1</version></dependency><dependency><groupId>org.flowable</groupId><artifactId>flowable-ui-modeler-rest</artifactId><version>6.4.1</version></dependency><!-- dbpool的jar --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.12</version></dependency><!-- mysql驱动包 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.28</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

三、调用idm服务重新接口

  • flowable获取用户是调用idm服务,这里前端修改获取用户信息接口自己实现接口
    在这里插入图片描述
package com.gblfy.flowable.controller;import org.flowable.idm.api.User;
import org.flowable.idm.engine.impl.persistence.entity.UserEntityImpl;
import org.flowable.ui.common.model.UserRepresentation;
import org.flowable.ui.common.security.SecurityUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;import java.util.ArrayList;
import java.util.List;/*** @ClassName GblfyRemoteAccountResource* @Description 內置用户登录* @Author gblfy* @Date 2019/11/17 20:12*/
@RestController
@RequestMapping("/gblfy")
public class GblfyRemoteAccountResource {/*** GET /rest/account -> get the current user.*/@RequestMapping(value = "/rest/account", method = RequestMethod.GET, produces = "application/json")public UserRepresentation getAccount() {User user=new UserEntityImpl();user.setId("gblfy");SecurityUtils.assumeUser(user);UserRepresentation userRepresentation = new UserRepresentation();userRepresentation.setId("gblfy");userRepresentation.setFirstName("gblfy");List<String> privileges=new ArrayList<>();privileges.add("flowable-idm");privileges.add("flowable-modeler");privileges.add("flowable-task");userRepresentation.setPrivileges(privileges);return  userRepresentation;}
}

在这里插入图片描述

四、配置类

package com.gblfy.flowable.config;import liquibase.Liquibase;
import liquibase.database.Database;
import liquibase.database.DatabaseConnection;
import liquibase.database.DatabaseFactory;
import liquibase.database.jvm.JdbcConnection;
import liquibase.exception.DatabaseException;
import liquibase.resource.ClassLoaderResourceAccessor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.flowable.common.engine.api.FlowableException;
import org.flowable.spring.SpringProcessEngineConfiguration;
import org.flowable.ui.common.service.exception.InternalServerErrorException;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ResourceLoader;
import org.springframework.core.io.support.ResourcePatternUtils;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import java.util.Properties;/*** @ClassName ZhuangzProcessEngine* @Description TODO 构造流程引擎配置类* @Author gblfy* @Date 2019/11/17 20:12*/
@Configuration
public class GblfyProcessEngine {private static final Logger LOGGER = LoggerFactory.getLogger(GblfyProcessEngine.class);//TODO 解决创建流程时报act_re_model找不到protected static final String LIQUIBASE_CHANGELOG_PREFIX = "ACT_DE_";@Autowiredprivate DataSource dataSource;@Autowiredprotected ResourceLoader resourceLoader;//事务管理器@Beanpublic DataSourceTransactionManager dataSourceTransactionManager(DataSource dataSource){DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(dataSource);return dataSourceTransactionManager;}@Beanpublic SpringProcessEngineConfiguration springProcessEngineConfiguration(){SpringProcessEngineConfiguration springProcessEngineConfiguration =new SpringProcessEngineConfiguration();springProcessEngineConfiguration.setDataSource(dataSource);springProcessEngineConfiguration.setDatabaseSchemaUpdate("true");springProcessEngineConfiguration.setTransactionManager(dataSourceTransactionManager(dataSource));return springProcessEngineConfiguration;}@Beanpublic SqlSessionFactory sqlSessionFactory(DataSource dataSource) {SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();sqlSessionFactoryBean.setDataSource(dataSource);String databaseType = initDatabaseType(dataSource);if (databaseType == null) {throw new FlowableException("couldn't deduct database type");}try {Properties properties = new Properties();properties.put("prefix", "");properties.put("blobType", "BLOB");properties.put("boolValue", "TRUE");properties.load(this.getClass().getClassLoader().getResourceAsStream("properties/" + databaseType + ".properties"));sqlSessionFactoryBean.setConfigurationProperties(properties);sqlSessionFactoryBean.setMapperLocations(ResourcePatternUtils.getResourcePatternResolver(resourceLoader).getResources("classpath:/META-INF/modeler-mybatis-mappings/*.xml"));sqlSessionFactoryBean.afterPropertiesSet();return sqlSessionFactoryBean.getObject();} catch (Exception e) {throw new FlowableException("Could not create sqlSessionFactory", e);}}protected String initDatabaseType(DataSource dataSource) {String databaseType = null;Connection connection = null;try {connection = dataSource.getConnection();DatabaseMetaData databaseMetaData = connection.getMetaData();String databaseProductName = databaseMetaData.getDatabaseProductName();LOGGER.info("database product name: '{}'", databaseProductName);databaseType = databaseTypeMappings.getProperty(databaseProductName);if (databaseType == null) {throw new FlowableException("couldn't deduct database type from database product name '" + databaseProductName + "'");}LOGGER.info("using database type: {}", databaseType);} catch (SQLException e) {LOGGER.error("Exception while initializing Database connection", e);} finally {try {if (connection != null) {connection.close();}} catch (SQLException e) {LOGGER.error("Exception while closing the Database connection", e);}}return databaseType;}protected static Properties databaseTypeMappings = getDefaultDatabaseTypeMappings();public static final String DATABASE_TYPE_MYSQL = "mysql";public static final String DATABASE_TYPE_ORACLE = "oracle";public static Properties getDefaultDatabaseTypeMappings() {Properties databaseTypeMappings = new Properties();databaseTypeMappings.setProperty("MySQL", DATABASE_TYPE_MYSQL);databaseTypeMappings.setProperty("Oracle", DATABASE_TYPE_ORACLE);return databaseTypeMappings;}@Beanpublic Liquibase liquibase(DataSource dataSource) {LOGGER.info("Configuring Liquibase");Liquibase liquibase = null;try {DatabaseConnection connection = new JdbcConnection(dataSource.getConnection());Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(connection);//TODO 解决创建流程时报act_re_model找不到database.setDatabaseChangeLogTableName(LIQUIBASE_CHANGELOG_PREFIX + database.getDatabaseChangeLogTableName());database.setDatabaseChangeLogLockTableName(LIQUIBASE_CHANGELOG_PREFIX + database.getDatabaseChangeLogLockTableName());liquibase = new Liquibase("META-INF/liquibase/flowable-modeler-app-db-changelog.xml", new ClassLoaderResourceAccessor(), database);liquibase.update("flowable");return liquibase;} catch (Exception e) {throw new InternalServerErrorException("Error creating liquibase database", e);} finally {closeDatabase(liquibase);}}private void closeDatabase(Liquibase liquibase) {if (liquibase != null) {Database database = liquibase.getDatabase();if (database != null) {try {database.close();} catch (DatabaseException e) {LOGGER.warn("Error closing database", e);}}}}
}

五、启动类跳过登陆拦截

package com.gblfy.flowable;import org.flowable.ui.modeler.properties.FlowableModelerAppProperties;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;/*** SpringBoot启动类** @Description跳过登陆拦截* @Author gblfy* @Date 2019/11/17 20:12*/
@SpringBootApplication(exclude = {SecurityAutoConfiguration.class})
@ComponentScan(basePackages = {"com.gblfy.flowable","org.flowable.ui.modeler","org.flowable.ui.common"})
public class FlowableApplication {public static void main(String[] args) {SpringApplication.run(FlowableApplication.class, args);}@Beanpublic FlowableModelerAppProperties flowableModelerAppProperties(){FlowableModelerAppProperties flowableModelerAppProperties = new FlowableModelerAppProperties();return flowableModelerAppProperties;}
}

六、配置文件

server:port: 80
spring:datasource:url: jdbc:mysql://localhost:3306/flowable_boot?zeroDateTimeBehavior=convertToNull&useUnicode=true&useSSL=false&rewriteBatchedStatements=truedriver-class-name: com.mysql.jdbc.Driverusername: rootpassword: roottype: com.alibaba.druid.pool.DruidDataSourceflowable:#关闭定时任务JOBasync-executor-activate: false将databaseSchemaUpdate设置为true。当Flowable发现库与数据库表结构不一致时,会自动将数据库表结构升级至新版本。database-schema-update: truecommon:app:idm-url: http://127.0.0.1://80/flowable-idm

项目源码下载:
https://gitee.com/gb_90/flow-modeler-sduty

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/522733.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

时代在召唤5G

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者| 白告天原创 |边缘计算社区错过房价飞涨的年代&#xff0c;你还要错过5G这班车吗&#xff1f;一 5G是什么&#xff1f;5G&#xff0c;就是第五代移动通信技术。和大哥大变成智能手机&#xff0c;绿皮火车变成和谐号都是一种大幅…

jboss连接池,断开后自动重连功能

最近客户现场的测试环境连的数据库极不稳定&#xff0c;经常会出现需要重新启动数据库的情况&#xff0c; 但是一旦重启数据库 则会出现 提示 ,执行sql错误&#xff0c;原因就是datasource 没有获取新的连接&#xff01; 那么解决办法就是怎样让jboss每次提供连接的时候都给我们…

API信息全掌控,方便你的日志管理——阿里云推出API网关打通日志服务

摘要&#xff1a; 近日&#xff0c;阿里云API网关对接了日志服务&#xff0c;可以输出用户在API网关产生的API调用日志&#xff0c;目前支持将 API 接入 API 网关的用户查看日志明细、概况、报表分析、在线查询等。 访问日志&#xff08;Acccess Log&#xff09;是由应用服务生…

GitHub 被爆开始实名制,以便于执行美国贸易制裁;特斯拉推出超大储能产品Megapack;高通宣布与腾讯游戏达成战略合作……...

关注并标星星CSDN云计算极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go 尼展示圆柱型透明式显示屏&a…

几何级数 函数 matlab,matlab 实验05数据的统计分析

数据的统计分析在日常生活中我们会在很多事件中收集到一些数据(比如&#xff1a;考试分数、窗口排队人数、月用电量、灯泡寿命、测量误差、产品质量、月降雨量等数据)&#xff0c;这些数据的产生一般都是随机的&#xff0e;这些随机数据乍看起来并没有什么规律&#xff0c;但通…

IDEA解决sun.misc.BASE64Encoder找不到jar包的解决方法

sun.misc.BASE64Encoder 不建议使用java.sun自带包中的内容 import sun.misc.BASE64Encoder; import sun.misc.BASE64Decoder;在项目中&#xff0c;设计到64位编码的。有时开发会用到JDK中自带的BASE64工具。但sun公司是建议不这样做的。尤其是更新了JDK版本&#xff0c;项目甚…

MaxCompute印尼开服,成为阿里云第十二个大数据服务节点

摘要&#xff1a; 人口超2.5亿的印度尼西亚&#xff0c;政府、通讯公司和银行等机构拥有繁杂的数据沉淀&#xff0c;他们正在加快应用大数据开发框架。MaxCompute势必加速这一进程&#xff0c;唤醒沉淀数据&#xff0c;最大化挖掘数据价值。 点此查看原文&#xff1a;http://cl…

大数据年代,我们的思想已被算法剥夺

戳蓝字“CSDN云计算”关注我们哦&#xff01;在这个信息爆炸的年代&#xff0c;我们能够获取信息的途径正越来越多。各类信息通过各种文字APP&#xff0c;图片APP&#xff0c;视频APP乃至微信朋友圈传达到你面前。任何一个新闻都可以在发酵后的1天内传遍整个世界。看起来人们正…

SpringBoot整合Editor.md实现Markdown编辑器

Editor.md 是一款开源的、可嵌入的 Markdown 在线编辑器&#xff08;组件&#xff09;&#xff0c;基于 CodeMirror、jQuery 和 Marked 构建。 文章目录一、技术选型及分支部署二、集成手册2.1. 下载项目2.2. 创建数据库2.3. 初始化数据库脚本2.4. 修改数据库用户名/密码 默认r…

【新功能】MaxCompoute禁止Full Scan功能开放

摘要&#xff1a; 2018年1月10日&#xff0c;MaxCompute禁止Full Scan功能开放。对于新创建的project默认情况下执行sql时&#xff0c;针对该project里的分区表不允许全表扫描&#xff0c;必须有分区条件指定需要扫描的分区。 点此查看原文&#xff1a;http://click.aliyun.com…

SpringBoot集成Editor.md 流程详细

接上一篇&#xff1a;SpringBoot整合Editor.md实现Markdown编辑器 https://blog.csdn.net/weixin_40816738/article/details/103160267 Editor.md 是一款开源的、可嵌入的 Markdown 在线编辑器&#xff08;组件&#xff09;,基于 CodeMirror、jQuery 和 Marked 构建。 文章目录…

学阿里中台,80%的人只学到了皮毛!揭秘阿里中台的12个架构思维和原则

戳蓝字“CSDN云计算”关注我们哦&#xff01;来源 | 阿里技术官方公众号&#xff08;ali_tech&#xff09;作者|九摩/阿里技术专家许多企业都忙于学习阿里的中台系统&#xff0c;想通过中台系统&#xff0c;解决企业当前的痛点&#xff0c;如&#xff1a;架构耦合度高、模块复用…

MaxCompute预付费资源监控工具-CU管家使用教程

摘要&#xff1a; MaxCompute管家使用前提 1、用户购买了 MaxCompute 预付费CU资源&#xff0c;60CU以上的用户&#xff08;备注&#xff1a;CU过小无法发挥计算资源及管家的优势&#xff09;。 2、支持区域&#xff0c;MaxCompute 华北2北京、华东2上海、华南1深圳 3个Region的…

SpringBoot2.x 整合websocket 消息推送,单独发送信息,群发信息

根据公司需求在SpringBoot项目中集成站内信&#xff0c;于是&#xff0c;我做了一个SpringBoot2.x 整合websocket 消息推送&#xff0c;给指定用户发送信息和群发信息即点点对方式和广播方式2种模式。 文章目录一、地址部署总览二、实战需求案例三、实战准备3.1. pom依赖3.2. a…

Spark精华问答 | 为什么要学Spark?

戳蓝字“CSDN云计算”关注我们哦&#xff01;为什么要学习Spark&#xff1f;作为一个用来实现快速而通用的集群计算的平台。扩展广泛使用的MapReduce计算模型&#xff0c;而且高效地支持更多的计算模式&#xff0c;包括交互式查询和流处理。Spark的一个重要特点就是能够在内存中…

oracle导入dmp清除之前,oracle导入dmp遇到的有关问题

oracle导入dmp遇到的问题一、 首先要明白&#xff0c;导入导出dmp文件是通过cmd命令执行的&#xff0c;而不是通过SQL plus执行的.此外也可以借助PLSQLDev工具进行导入导出记得“导出可执行文件”选择客户端安装好的bin下的exp.exe工具二、发现在导出的过程有问题&#xff1a;网…

每个人都应该知道的25个大数据术语

摘要&#xff1a; 如果你初来乍到&#xff0c;大数据看起来很吓人!根据你掌握的基本理论&#xff0c;让我们专注于一些关键术语以此给你的约会对象、老板、家人或者任何一个人带来深刻的印象。 让我们开始吧&#xff1a; 1.算法。“算法”如何与大数据相关?即使算法是一个通用…

【个推CTO谈数据智能】之本质及技术体系要求

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者|安森来源|个推技术学院安森&#xff0c;个推CTO毕业于浙江大学&#xff0c;现全面负责个推技术选型、研发创新、运维管理等工作&#xff0c;已带领团队开发出针对移动互联网、金融风控等行业的多项前沿数据智能解决方案。曾任M…

企业打开Redis的正确方式,来自阿里云云数据库团队的解读

摘要&#xff1a; Redis是开源的基于内存且可以持久化的分布式 Key – Value数据库。自2009年发布最初版本以来&#xff0c;Redis的热度只增不减&#xff0c;除了经常位居DB-Engines的最受欢迎Key-Value数据库榜首之外&#xff0c;看阿里云技术总监为您深度解读云数据库Redis。…

2019 年度程序员吸金榜:你排第几?

作为全球知名招聘求职网站Indeed&#xff0c;最近发布了2019年度最佳工作榜单&#xff0c;公布了2019年的行业领域及工作岗位薪酬&#xff0c;在全行业的榜单中&#xff0c;跟程序员相关的岗位有9个&#xff01;对此&#xff0c;大家纷纷留言表示程序员或成最大赢家&#xff01…