Flowable開(kāi)發(fā)--Modeler集成(六)

一、Flowable-Modeler功能

https://gitee.com/lwj/flow-modeler-sduty/tree/master/src/main

提供可視化編輯器,編輯BPMN流程,編輯CASE模型,編輯Form表單苏携,編輯App應(yīng)用,編輯決策表
提供可視化參數(shù)配置:每個(gè)流程可以配置詳細(xì)的參數(shù)設(shè)置,按照流程對(duì)應(yīng)的規(guī)范來(lái)設(shè)計(jì)惧蛹。
提供導(dǎo)入導(dǎo)出功能:方便將流程結(jié)果導(dǎo)入到其他應(yīng)用程序
在我們實(shí)際項(xiàng)目中,我們的流程配置和表單都是在一個(gè)系統(tǒng)中操作的,不可能在flowable的war包上做流程配置香嗓。
所以集成modeler是flowable使用的開(kāi)端爵政。

二、源碼下載與編譯

  1. 源碼下載
    下載地址:
    https://github.com/flowable/flowable-engine

    源碼

  2. 導(dǎo)入idea編譯


    導(dǎo)入idea

    編譯

    編譯

編譯結(jié)果:

[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for Flowable 6.5.0-SNAPSHOT:
[INFO] 
[INFO] Flowable ........................................... SUCCESS [  0.326 s]
[INFO] Flowable - BPMN Model .............................. SUCCESS [  0.767 s]
[INFO] Flowable - Process Validation ...................... SUCCESS [  0.070 s]
[INFO] Flowable - BPMN Layout ............................. SUCCESS [  0.106 s]
[INFO] Flowable - Image Generator ......................... SUCCESS [  0.102 s]
[INFO] Flowable - Engine Common API ....................... SUCCESS [  0.059 s]
[INFO] Flowable - Variable Service API .................... SUCCESS [  0.036 s]
[INFO] Flowable - Engine Common ........................... SUCCESS [  0.455 s]
[INFO] Flowable - BPMN Converter .......................... SUCCESS [  0.143 s]
[INFO] Flowable - Entity Link Service API ................. SUCCESS [  0.021 s]
[INFO] Flowable - Entity Link Service ..................... SUCCESS [  0.163 s]
[INFO] Flowable - Variable Service ........................ SUCCESS [  0.198 s]
[INFO] Flowable - Identity Link Service API ............... SUCCESS [  0.028 s]
[INFO] Flowable - Identity Link Service ................... SUCCESS [  0.118 s]
[INFO] Flowable - Event Subscription Service API .......... SUCCESS [  0.028 s]
[INFO] Flowable - Event Subscription Service .............. SUCCESS [  0.127 s]
[INFO] Flowable - Task Service API ........................ SUCCESS [  0.030 s]
[INFO] Flowable - IDM API ................................. SUCCESS [  0.023 s]
[INFO] Flowable - Task Service ............................ SUCCESS [  0.169 s]
[INFO] Flowable - Job Service API ......................... SUCCESS [  0.023 s]
[INFO] Flowable - Job Service ............................. SUCCESS [  0.179 s]
[INFO] Flowable Job Spring Service ........................ SUCCESS [  0.141 s]
[INFO] Flowable - Batch Service API ....................... SUCCESS [  0.017 s]
[INFO] Flowable - Batch Service ........................... SUCCESS [  0.124 s]
[INFO] Flowable - IDM Engine .............................. SUCCESS [  0.229 s]
[INFO] flowable-idm-engine-configurator ................... SUCCESS [  0.108 s]
[INFO] Flowable - Form API ................................ SUCCESS [  0.023 s]
[INFO] Flowable - Form Model .............................. SUCCESS [  0.024 s]
[INFO] flowable-form-json-converter ....................... SUCCESS [  0.037 s]
[INFO] Flowable - Form Engine ............................. SUCCESS [  0.211 s]
[INFO] Flowable - CMMN Model .............................. SUCCESS [  0.062 s]
[INFO] Flowable - DMN Model ............................... SUCCESS [  0.024 s]
[INFO] Flowable - DMN API ................................. SUCCESS [  0.058 s]
[INFO] Flowable - CMMN API ................................ SUCCESS [  0.118 s]
[INFO] Flowable - Content API ............................. SUCCESS [  0.041 s]
[INFO] Flowable - Engine .................................. SUCCESS [  1.188 s]
[INFO] Flowable - Form Engine Configurator ................ SUCCESS [  0.384 s]
[INFO] Flowable - CMMN Converter .......................... SUCCESS [  0.060 s]
[INFO] Flowable - CMMN Image Generator .................... SUCCESS [  0.041 s]
[INFO] Flowable - CMMN Engine ............................. SUCCESS [  0.415 s]
[INFO] Flowable - CMMN Engine Configurator ................ SUCCESS [  0.477 s]
[INFO] Flowable - App Engine API .......................... SUCCESS [  0.020 s]
[INFO] Flowable - App Engine .............................. SUCCESS [  0.168 s]
[INFO] flowable-spring-security ........................... SUCCESS [  0.045 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  9.645 s
[INFO] Finished at: 2019-10-20T23:21:14+08:00
[INFO] ------------------------------------------------------------------------

三陶缺、Modeler集成

1. 拷貝全都靜態(tài)資源到項(xiàng)目中resources

源碼文件

2. Maven依賴

由于flowable-modeler的流程設(shè)計(jì)器頁(yè)面很多操作會(huì)訪問(wèn)后臺(tái)接口钾挟,所以在這里導(dǎo)入依賴文件。

<!--web依賴-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!--Springboot-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!--log4j-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!--健康檢查-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--數(shù)據(jù)庫(kù)操作依賴-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
</dependency>
<!--mybatis-plus 插件-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.1.2</version>
</dependency>
<!--工作流-->
<dependency>
    <groupId>org.flowable</groupId>
    <artifactId>flowable-ui-common</artifactId>
    <version>6.4.2</version>
</dependency>
<dependency>
    <groupId>org.flowable</groupId>
    <artifactId>flowable-ui-modeler-conf</artifactId>
    <version>6.4.2</version>
</dependency>
<dependency>
    <groupId>org.flowable</groupId>
    <artifactId>flowable-ui-modeler-rest</artifactId>
    <version>6.4.2</version>
</dependency>
<dependency>
    <groupId>org.flowable</groupId>
    <artifactId>flowable-ui-modeler-logic</artifactId>
    <version>6.4.2</version>
</dependency>
<!--單元測(cè)試-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <groupId>org.junit.vintage</groupId>
            <artifactId>junit-vintage-engine</artifactId>
        </exclusion>
    </exclusions>
</dependency>

3. 配置文件

配置文件:application.properties

server.port=8002
server.servlet.context-path=/flowable-modeler
management.endpoints.jmx.unique-names=true
# 這是強(qiáng)制使用JDK代理而不是使用CGLIB所必需的饱岸。
spring.aop.proxy-target-class=false
spring.aop.auto=false
spring.application.name=flowable-ui-modeler

# 安全配置
spring.security.filter.dispatcher-types=REQUEST,FORWARD,ASYNC
spring.liquibase.enabled=false
# 必須指定用于生成對(duì)象名的默認(rèn)域掺出。否則,當(dāng)多個(gè)spring引導(dǎo)應(yīng)用程序在同一個(gè)servlet容器中啟動(dòng)時(shí)
# 所有這些都將使用相同的名稱創(chuàng)建(例如com.zaxxer.hikari:name=datasource苫费,type=hikaridatasource)
spring.jmx.default-domain=${spring.application.name}

# 健康檢查
# 將所有執(zhí)行器端點(diǎn)暴露在Web上它們是公開(kāi)的汤锨,但只有經(jīng)過(guò)身份驗(yàn)證的用戶才能看到/info和/health
# abd具有access admin的用戶才能看到其他用戶
management.endpoints.web.exposure.include=*
# 只有在授權(quán)用戶時(shí)才應(yīng)顯示完整的運(yùn)行狀況詳細(xì)信息
management.endpoint.health.show-details=when_authorized
# 只有具有角色access admin的用戶才能訪問(wèn)完整的運(yùn)行狀況詳細(xì)信息
management.endpoint.health.roles=access-admin

# 數(shù)據(jù)庫(kù) 默認(rèn)H2數(shù)據(jù)庫(kù)
spring.datasource.username=flowable
spring.datasource.password=flowable

# 數(shù)據(jù)庫(kù)連接池
spring.datasource.hikari.maxLifetime=600000
# 5 minutes
spring.datasource.hikari.idleTimeout=300000
spring.datasource.hikari.minimumIdle=5
spring.datasource.hikari.maximumPoolSize=50

# 大文件上傳限制。設(shè)置為-1可設(shè)置為“無(wú)限制”百框。以字節(jié)表示
spring.servlet.multipart.max-file-size=10MB

配置文件:flowable-default.properties


# spring在角色前面加上role闲礼。然而,flowable還沒(méi)有這個(gè)概念铐维,所以我們需要用空字符串覆蓋它柬泽。
flowable.common.app.role-prefix=

flowable.common.app.idm-url=http://localhost:8002/flowable-idm
flowable.common.app.idm-admin.user=admin
flowable.common.app.idm-admin.password=test

flowable.modeler.app.deployment-api-url=http://localhost:8002/flowable-task/app-api

# Rest API
flowable.modeler.app.rest-enabled=true
flowable.rest.app.authentication-mode=verify-privilege

配置文件:version.properties

type=modeler
version.major=6
version.minor=4
version.revision=2
version.edition=Flowable

4. 創(chuàng)建流程模型包

創(chuàng)建包:org.flowable.ui
在java中創(chuàng)建包名:org.flowable.ui

創(chuàng)建包

5. 去除認(rèn)證

1)創(chuàng)建org.flowable.ui.common.rest.idm.remote包,添加類:

import org.flowable.ui.common.model.UserRepresentation;
import org.flowable.ui.common.security.DefaultPrivileges;
import org.flowable.ui.common.service.exception.NotFoundException;
import org.flowable.ui.common.service.idm.RemoteIdmService;
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;

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

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

    @Autowired
    private RemoteIdmService remoteIdmService;

    /**
     * GET /rest/account -> get the current user.
     */
    @RequestMapping(value = "/rest/account", method = RequestMethod.GET, produces = "application/json")
    public UserRepresentation getAccount() {
//        UserRepresentation userRepresentation = null;
//        String currentUserId = SecurityUtils.getCurrentUserId();
//        if (currentUserId != null) {
//            RemoteUser remoteUser = remoteIdmService.getUser(currentUserId);
//            if (remoteUser != null) {
//                userRepresentation = new UserRepresentation(remoteUser);
//
//                if (remoteUser.getGroups() != null && remoteUser.getGroups().size() > 0) {
//                    List<GroupRepresentation> groups = new ArrayList<>();
//                    for (RemoteGroup remoteGroup : remoteUser.getGroups()) {
//                        groups.add(new GroupRepresentation(remoteGroup));
//                    }
//                    userRepresentation.setGroups(groups);
//                }
//
//                if (remoteUser.getPrivileges() != null && remoteUser.getPrivileges().size() > 0) {
//                    userRepresentation.setPrivileges(remoteUser.getPrivileges());
//                }
//
//            }
//        }
        UserRepresentation userRepresentation = new UserRepresentation();
        userRepresentation.setFirstName("admin");
        userRepresentation.setLastName("admin");
        userRepresentation.setFullName("admin");
        userRepresentation.setId("admin");
        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);
        userRepresentation.setPrivileges(pris);

        if (userRepresentation != null) {
            return userRepresentation;
        } else {
            throw new NotFoundException();
        }
    }
}

2)創(chuàng)建包:org.flowable.ui.common.security 包添加以下類:

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;

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() {
        if (assumeUser != null) {
            return assumeUser;
        }

//        User user = null;
//        FlowableAppUser appUser = getCurrentFlowableAppUser();
//        if (appUser != null) {
//            user = appUser.getUserObject();
//        }

        RemoteUser user = new RemoteUser();
//        FlowableAppUser appUser = getCurrentFlowableAppUser();
//        if (appUser != null) {
//            user = appUser.getUserObject();
//        }
        user.setId("admin");
        user.setDisplayName("admin");
        user.setFirstName("admin");
        user.setLastName("admin");
        user.setEmail("admin@admin.com");
        user.setPassword("test");
        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;
    }

    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)創(chuàng)建包:org.flowable.ui.modeler.conf 添加安全配置類:


import org.flowable.ui.common.properties.FlowableRestAppProperties;
import org.flowable.ui.common.security.ActuatorRequestMatcher;
import org.flowable.ui.common.security.ClearFlowableCookieLogoutHandler;
import org.flowable.ui.common.security.DefaultPrivileges;
import org.flowable.ui.modeler.properties.FlowableModelerAppProperties;
import org.flowable.ui.modeler.security.AjaxLogoutSuccessHandler;
import org.flowable.ui.modeler.security.RemoteIdmAuthenticationProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.autoconfigure.security.servlet.EndpointRequest;
import org.springframework.boot.actuate.health.HealthEndpoint;
import org.springframework.boot.actuate.info.InfoEndpoint;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.web.header.writers.XXssProtectionHeaderWriter;

/**
 */
@Configuration
@EnableWebSecurity
public class SecurityConfiguration {

    private static final Logger LOGGER = LoggerFactory.getLogger(org.flowable.ui.modeler.conf.SecurityConfiguration.class);

    public static final String REST_ENDPOINTS_PREFIX = "/app/rest";

    @Autowired
    protected RemoteIdmAuthenticationProvider authenticationProvider;

//    @Bean
//    public FlowableCookieFilterRegistrationBean flowableCookieFilterRegistrationBean(RemoteIdmService remoteIdmService, FlowableCommonAppProperties properties) {
//        FlowableCookieFilterRegistrationBean filter = new FlowableCookieFilterRegistrationBean(remoteIdmService, properties);
//        filter.addUrlPatterns("/app/*");
//        filter.setRequiredPrivileges(Collections.singletonList(DefaultPrivileges.ACCESS_MODELER));
//        return filter;
//    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) {

        // Default auth (database backed)
        try {
            auth.authenticationProvider(authenticationProvider);
        } catch (Exception e) {
            LOGGER.error("Could not configure authentication mechanism:", e);
        }
    }

    @Configuration
    @Order(10)
    public static class FormLoginWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {

//        @Autowired
//        protected FlowableCookieFilterRegistrationBean flowableCookieFilterRegistrationBean;

        @Autowired
        protected AjaxLogoutSuccessHandler ajaxLogoutSuccessHandler;

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                    .sessionManagement()
                    .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                    .and()
//                    .addFilterBefore(flowableCookieFilterRegistrationBean.getFilter(), UsernamePasswordAuthenticationFilter.class)
                    .logout()
                    .logoutUrl("/app/logout")
                    .logoutSuccessHandler(ajaxLogoutSuccessHandler)
                    .addLogoutHandler(new ClearFlowableCookieLogoutHandler())
                    .and()
                    .csrf()
                    .disable() // Disabled, cause enabling it will cause sessions
                    .headers()
                    .frameOptions()
                    .sameOrigin()
                    .addHeaderWriter(new XXssProtectionHeaderWriter())
                    .and()
                    .authorizeRequests()
//                    .antMatchers(REST_ENDPOINTS_PREFIX + "/**").hasAuthority(DefaultPrivileges.ACCESS_MODELER);
                    .antMatchers(REST_ENDPOINTS_PREFIX + "/**").permitAll();
        }
    }

    //
    // BASIC AUTH
    //

    @Configuration
    @Order(1)
    public static class ApiWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {

        protected final FlowableRestAppProperties restAppProperties;
        protected final FlowableModelerAppProperties modelerAppProperties;

        public ApiWebSecurityConfigurationAdapter(FlowableRestAppProperties restAppProperties,
                                                  FlowableModelerAppProperties modelerAppProperties) {
            this.restAppProperties = restAppProperties;
            this.modelerAppProperties = modelerAppProperties;
        }

        protected void configure(HttpSecurity http) throws Exception {

            http
                    .sessionManagement()
                    .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                    .and()
                    .csrf()
                    .disable();

            http.antMatcher("/api/**").authorizeRequests().antMatchers("/api/**").permitAll();

//            if (modelerAppProperties.isRestEnabled()) {
//
//                if (restAppProperties.isVerifyRestApiPrivilege()) {
//                    http.antMatcher("/api/**").authorizeRequests().antMatchers("/api/**").hasAuthority(DefaultPrivileges.ACCESS_REST_API).and().httpBasic();
//                } else {
//                    http.antMatcher("/api/**").authorizeRequests().antMatchers("/api/**").authenticated().and().httpBasic();
//
//                }
//
//            } else {
//                http.antMatcher("/api/**").authorizeRequests().antMatchers("/api/**").denyAll();
//
//            }

        }
    }

    //
    // Actuator
    //

    @ConditionalOnClass(EndpointRequest.class)
    @Configuration
    @Order(5) // Actuator configuration should kick in before the Form Login there should always be http basic for the endpoints
    public static class ActuatorWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {

        protected void configure(HttpSecurity http) throws Exception {

            http
                    .sessionManagement()
                    .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                    .and()
                    .csrf()
                    .disable();

            http
                    .requestMatcher(new ActuatorRequestMatcher())
                    .authorizeRequests()
                    .requestMatchers(EndpointRequest.to(InfoEndpoint.class, HealthEndpoint.class)).authenticated()
                    .requestMatchers(EndpointRequest.toAnyEndpoint()).hasAnyAuthority(DefaultPrivileges.ACCESS_ADMIN)
                    .and().httpBasic();
        }
    }
}

6. 啟動(dòng)類配置

修改原有啟動(dòng)類:包名com.xtsz.modeler

package com.xtsz.modeler;

import org.flowable.ui.modeler.conf.ApplicationConfiguration;
import org.flowable.ui.modeler.servlet.AppDispatcherServletConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Import;

/**
 * 導(dǎo)入配置
 */
@Import({
        ApplicationConfiguration.class,
        AppDispatcherServletConfiguration.class
})
@SpringBootApplication
public class ModelerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ModelerApplication.class, args);
    }

}

7. 流程模型漢化

拷貝文件到resources目錄:


源漢化文件
目標(biāo)漢化文件

四嫁蛇、啟動(dòng)測(cè)試

  1. 請(qǐng)求地址:http://localhost:8002/flowable-modeler/

    模型流程

  2. 創(chuàng)建流程


    創(chuàng)建流程

    創(chuàng)建流程

    設(shè)計(jì)流程

五锨并、常見(jiàn)問(wèn)題

  1. Cannot convert value '2019-10-22 08:09:24.000000' from column 6 to TIMESTAMP
    原因:MySql數(shù)據(jù)庫(kù)必須使用8.0.0+。
    依賴:
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

數(shù)據(jù)庫(kù)配置:

# 數(shù)據(jù)庫(kù)
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/workflow_flowable?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=GMT%2b8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true

spring.datasource.username=root
spring.datasource.password=1234
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末睬棚,一起剝皮案震驚了整個(gè)濱河市第煮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌抑党,老刑警劉巖包警,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異底靠,居然都是意外死亡害晦,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門苛骨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)篱瞎,“玉大人,你說(shuō)我怎么就攤上這事痒芝±睿” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵严衬,是天一觀的道長(zhǎng)澄者。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么粱挡? 我笑而不...
    開(kāi)封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任赠幕,我火速辦了婚禮,結(jié)果婚禮上询筏,老公的妹妹穿的比我還像新娘榕堰。我一直安慰自己,他們只是感情好嫌套,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布逆屡。 她就那樣靜靜地躺著,像睡著了一般踱讨。 火紅的嫁衣襯著肌膚如雪魏蔗。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天痹筛,我揣著相機(jī)與錄音莺治,去河邊找鬼。 笑死帚稠,一個(gè)胖子當(dāng)著我的面吹牛谣旁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播翁锡,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蔓挖,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了馆衔?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤怨绣,失蹤者是張志新(化名)和其女友劉穎角溃,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體篮撑,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡减细,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了赢笨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片未蝌。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖茧妒,靈堂內(nèi)的尸體忽然破棺而出萧吠,到底是詐尸還是另有隱情,我是刑警寧澤桐筏,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布纸型,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏狰腌。R本人自食惡果不足惜除破,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望琼腔。 院中可真熱鬧瑰枫,春花似錦、人聲如沸丹莲。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)圾笨。三九已至教馆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間擂达,已是汗流浹背土铺。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留板鬓,地道東北人悲敷。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像俭令,于是被迫代替她去往敵國(guó)和親后德。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容