锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

Flowable入门

时间:2022-08-20 20:00:01 47frc连接器

Flowable入门

1) flowable整合springboot
2) 移除flowable权限验证,加入微服务项目本身的权限验证
3) 常用的API接口(查看流程图、部署流程、待办、已办、完成任务、审批历史等。

1. pom文件引入Flowable相关架包

这里介绍的是6.4.0版本的flowable

 <dependency>       <groupId>org.flowable</groupId>       <artifactId>flowable-spring-boot-starter</artifactId>       <version>${flowable.version}</version>       <exclusions>           <exclusion>               <groupId>org.springframework.boot</groupId>               <artifactId>spring-boot-starter-log4j2</artifactId>           </exclusion>           <exclusion>               <groupId>org.springframework.boot</groupId>               <artifactId>spring-boot-starter-logging</artifactId>           </exclusion>       </exclusions>   </dependency>   <!-- 配置文件处理器 -->   <dependency>       <groupId>org.springframework.boot</groupId>       <artifactId>spring-boot-configuration-processor</artifactId>   </dependency>   <!-- app 依赖 包含 rest,logic,conf -->   <!-- flowable 集成依赖 rest,logic,conf -->   <dependency>       <groupId>org.flowable</groupId>       <artifactId>flowable-ui-modeler-rest</artifactId>       <version>${flowable.version}</version>   </dependency>   <dependency>       <groupId>org.flowable</groupId>
      <artifactId>flowable-ui-modeler-logic</artifactId>
      <version>${flowable.version}</version>
      <exclusions>
          <exclusion>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-log4j2</artifactId>
          </exclusion>
          <exclusion>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-logging</artifactId>
          </exclusion>
      </exclusions>
  </dependency>
  <dependency>
      <groupId>org.flowable</groupId>
      <artifactId>flowable-ui-modeler-conf</artifactId>
      <version>${flowable.version}</version>
  </dependency>
  <dependency>
      <groupId>org.flowable</groupId>
      <artifactId>flowable-ldap-configurator</artifactId>
      <version>${flowable.version}</version>
  </dependency>
  <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.1.10</version>
  </dependency>

2.用户角色权限整合

2.1 AppDispatcherServletConfiguration


import org.flowable.ui.modeler.rest.app.EditorGroupsResource;
import org.flowable.ui.modeler.rest.app.EditorUsersResource;
import org.flowable.ui.modeler.rest.app.StencilSetResource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.web.servlet.WebMvcRegistrations;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;

@Configuration
@ComponentScan(value = { 
         "org.flowable.ui.modeler.rest.app",
        // 不加载 rest,因为 getAccount 接口需要我们自己实现
// "org.flowable.ui.common.rest"
    },excludeFilters = { 
        
        // 移除 EditorUsersResource 与 EditorGroupsResource,因为不使用 IDM 部分
        @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = EditorUsersResource.class),
        @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = EditorGroupsResource.class),
        // 配置文件用自己的
        @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = StencilSetResource.class),
    }
)
@EnableAsync
public class AppDispatcherServletConfiguration implements WebMvcRegistrations { 
        

    private static final Logger LOGGER = LoggerFactory.getLogger(AppDispatcherServletConfiguration.class);

    @Bean
    public SessionLocaleResolver localeResolver() { 
        
        return new SessionLocaleResolver();
    }

    @Bean
    public LocaleChangeInterceptor localeChangeInterceptor() { 
        
        LOGGER.debug("Configuring localeChangeInterceptor");
        LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
        localeChangeInterceptor.setParamName("language");
        return localeChangeInterceptor;
    }

    @Override
    public RequestMappingHandlerMapping getRequestMappingHandlerMapping() { 
        
        LOGGER.debug("Creating requestMappingHandlerMapping");
        RequestMappingHandlerMapping requestMappingHandlerMapping = new RequestMappingHandlerMapping();
        requestMappingHandlerMapping.setUseSuffixPatternMatch(false);
        requestMappingHandlerMapping.setRemoveSemicolonContent(false);
        Object[] interceptors = { 
         localeChangeInterceptor() };
        requestMappingHandlerMapping.setInterceptors(interceptors);
        return requestMappingHandlerMapping;
    }
}

2.2 ApplicationConfiguration


import org.flowable.ui.common.service.idm.RemoteIdmService;
import org.flowable.ui.modeler.properties.FlowableModelerAppProperties;
import org.flowable.ui.modeler.servlet.ApiDispatcherServletConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

@Configuration
@EnableConfigurationProperties(FlowableModelerAppProperties.class)
@ComponentScan(basePackages = { 
        
// "org.flowable.ui.modeler.conf",
        "org.flowable.ui.modeler.repository",
        "org.flowable.ui.modeler.service",
// "org.flowable.ui.modeler.security", //授权方面的都不需要
// "org.flowable.ui.common.conf", // flowable 开发环境内置的数据库连接
// "org.flowable.ui.common.filter", // IDM 方面的过滤器
        "org.flowable.ui.common.service",
        "org.flowable.ui.common.repository",
        //
// "org.flowable.ui.common.security",//授权方面的都不需要
        "org.flowable.ui.common.tenant" },excludeFilters = { 
        
        // 移除 RemoteIdmService
        @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = RemoteIdmService.class),
    }
)
public class ApplicationConfiguration { 
        

    @Bean
    public ServletRegistrationBean modelerApiServlet(ApplicationContext applicationContext) { 
        
        AnnotationConfigWebApplicationContext dispatcherServletConfiguration = new AnnotationConfigWebApplicationContext();
        dispatcherServletConfiguration.setParent(applicationContext);
        dispatcherServletConfiguration.register(ApiDispatcherServletConfiguration.class);
        DispatcherServlet servlet = new DispatcherServlet(dispatcherServletConfiguration);
        ServletRegistrationBean registrationBean = new ServletRegistrationBean(servlet, "/api/*");
        registrationBean.setName("Flowable Modeler App API Servlet");
        registrationBean.setLoadOnStartup(1);
        registrationBean.setAsyncSupported(true);
        return registrationBean;
    }
}

2.3 FlowableBeanConfig

@Configuration
public class FlowableBeanConfig { 
        

	protected static final String LIQUIBASE_CHANGELOG_PREFIX = "ACT_DE_";


	@Bean
	public Liquibase liquibase(DataSource dataSource) { 
        

		try { 
        
			DatabaseConnection connection = new JdbcConnection(dataSource.getConnection());
			Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(connection);
			database.setDatabaseChangeLogTableName(LIQUIBASE_CHANGELOG_PREFIX + database.getDatabaseChangeLogTableName());
			database.setDatabaseChangeLogLockTableName(LIQUIBASE_CHANGELOG_PREFIX + database.getDatabaseChangeLogLockTableName());

			Liquibase 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 RuntimeException("Error creating liquibase database", e);
		}
	}
}

2.4 SecurityUtils


import com.bho.model.LoginUser;
import com.bho.utils.SysUserUtils;
import org.flowable.idm.api.User;
import org.flowable.ui.common.model.RemoteUser;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;

import java.util.ArrayList;
import java.util.List;

/** * Utility class for Spring Security. */
public class SecurityUtils { 
        

    private static User assumeUser;

    private SecurityUtils() { 
        
    }

    /** * Get the login of the current user. */
    public static String getCurrentUserId() { 
        
        User user = getCurrentUserObject();
        if (user != null) { 
        
            return user.getId();
        }
        return null;
    }

    /** * @return the {@link User} object associated with the current logged in user. */
    public static User getCurrentUserObject() { 
        
        LoginUser currentLoginUser = SysUserUtils.getCurrentLoginUser();
        RemoteUser user = new RemoteUser();
        user.setId(String.valueOf(currentLoginUser.getId()));
        user.setFirstName(currentLoginUser.getAccount());
        List<String> pris = new ArrayList<>();
        pris.add(DefaultPrivileges.ACCESS_MODELER);
        pris.add(DefaultPrivileges.ACCESS_IDM);
        pris.add(DefaultPrivileges.ACCESS_ADMIN);
        pris.add(DefaultPrivileges.ACCESS_TASK);
        pris.add(DefaultPrivileges.ACCESS_REST_API);
        user.setPrivileges(pris);
        return user;
// if (assumeUser != null) { 
        
// return assumeUser;
// }
//
// RemoteUser user = new RemoteUser();
// user.setId("admin");
// user.setDisplayName("Administrator");
// user.setFirstName("Administrator");
// user.setLastName("Administrator");
// user.setEmail("admin@flowable.com");
// user.setPassword("123456");
// List pris = new ArrayList<>();
// pris.add(DefaultPrivileges.ACCESS_MODELER);
// pris.add(DefaultPrivileges.ACCESS_IDM);
// pris.add(DefaultPrivileges.ACCESS_ADMIN);
// pris.add(DefaultPrivileges.ACCESS_TASK);
// pris.add(DefaultPrivileges.ACCESS_REST_API);
// user.setPrivileges(pris);
// return user;
    }

    public static FlowableAppUser getCurrentFlowableAppUser() { 
        
        FlowableAppUser user = null;
        SecurityContext securityContext = SecurityContextHolder.getContext();
        if (securityContext != null && securityContext.getAuthentication() != null) { 
        
            Object principal = securityContext.getAuthentication().getPrincipal();
            if (principal instanceof FlowableAppUser) { 
        
                user = (FlowableAppUser) principal;
            }
        }
        return user;
    }

    public static boolean currentUserHasCapability(String capability) { 
        
        FlowableAppUser user = getCurrentFlowableAppUser();
        for (GrantedAuthority grantedAuthority : user.getAuthorities()) { 
        
            if (capability.equals(grantedAuthority.getAuthority())) { 
        
                return true;
            }
        }
        return false;
    }

    public static void assumeUser(User user) { 
        
        assumeUser = user;
    }

    public static void clearAssumeUser() { 
        
        assumeUser = null;
    }

}

3.modeler编辑器汉化

3.1 引入汉化文件

在这里插入图片描述

3.2 重写相关接口


import com.bho.model.BaseException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/app")
public class FlowableStencilSetResourceController { 
        

    private static final Logger LOGGER = LoggerFactory.getLogger(FlowableStencilSetResourceController.class);

    @Autowired
    protected ObjectMapper objectMapper;

    @RequestMapping(value = "/rest/stencil-sets/editor", method = RequestMethod.GET, produces = "application/json")
    public JsonNode getStencilSetForEditor() { 
        
        try { 
        
            JsonNode stencilNode = objectMapper.readTree(this.getClass().getClassLoader().getResourceAsStream("stencilset/stencilset_bpmn.json"));
            return stencilNode;
        } catch (Exception e) { 
        
            LOGGER.error("Error reading bpmn stencil set json", e);
            throw 元器件数据手册IC替代型号,打造电子元器件IC百科大全!
          

相关文章