• springboot2.04与activiti 6.0集成


    本文就不对activiti做解释,下面直接看项目集成

    以下顺序方面根据我的理解来,可以先从第二章看,再看第一张与第三章

    增加activiti表的API,备注用。

    目录

    一、springboot2.X集成activiti

    1.1. 引入jar包

    1.2. 创建启动类(componentScan是自己项目持久化模板,可以直接删掉)

    1.3. 配置application.yml

    1.4. 启动可能出现的错误

    二、编写测试流程

    三、编写bpmn

    1.1 设置编码

    1.2 创建bpmn

    1.3 编写逻辑

    四、activiti数据库表概览

      1.1 说明

    1.2 概览

    1.2.1   Activiti数据表清单:



    一、springboot2.X集成activiti

    1.1. 引入jar包

    1. <project xmlns="http://maven.apache.org/POM/4.0.0"
    2.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3.     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    4.     <modelVersion>4.0.0</modelVersion>
    5.     <artifactId>enn-activiti</artifactId>
    6.     <groupId>enn.activiti</groupId>
    7.     <version>1.1.1-SNAPSHOT</version>
    8.     <packaging>jar</packaging>
    9.     <parent>
    10.         <groupId>org.springframework.boot</groupId>
    11.         <artifactId>spring-boot-starter-parent</artifactId>
    12.         <version>2.0.4.RELEASE</version>
    13.     </parent>
    14.     <dependencies>
    15.         <dependency>
    16.             <groupId>org.springframework.boot</groupId>
    17.             <artifactId>spring-boot-starter-web</artifactId>
    18.             <exclusions>
    19.                 <exclusion>
    20.                     <groupId>org.hibernate.validator</groupId>
    21.                     <artifactId>hibernate-validator</artifactId>
    22.                 </exclusion>
    23.                 <exclusion>
    24.                     <groupId>org.apache.logging.log4j</groupId>
    25.                     <artifactId>log4j-to-slf4j</artifactId>
    26.                 </exclusion>
    27.                 <exclusion>
    28.                     <groupId>org.slf4j</groupId>
    29.                     <artifactId>jul-to-slf4j</artifactId>
    30.                 </exclusion>
    31.                 <exclusion>
    32.                     <groupId>org.springframework.boot</groupId>
    33.                     <artifactId>spring-boot-starter-tomcat</artifactId>
    34.                 </exclusion>
    35.             </exclusions>
    36.         </dependency>
    37.     
    38.         <dependency>
    39.             <groupId>org.activiti</groupId>
    40.             <artifactId>activiti-spring-boot-starter-basic</artifactId>
    41.             <version>6.0.0</version>
    42.             <exclusions>
    43.                 <exclusion>
    44.                     <groupId>javax.persistence</groupId>
    45.                     <artifactId>persistence-api</artifactId>
    46.                 </exclusion>
    47.             </exclusions>
    48.         </dependency>
    49.         <dependency>
    50.             <groupId>org.springframework.boot</groupId>
    51.             <artifactId>spring-boot-starter-data-jpa</artifactId>
    52.         </dependency>
    53.         <dependency>
    54.             <groupId>org.springframework.boot</groupId>
    55.             <artifactId>spring-boot-starter-thymeleaf</artifactId>
    56.         </dependency>
    57.         <dependency>
    58.             <groupId>org.springframework.boot</groupId>
    59.             <artifactId>spring-boot-starter-test</artifactId>
    60.             <scope>test</scope>
    61.         </dependency>
    62.     
    63.         
    64.     </dependencies>
    65.     <profiles>
    66.         <profile>
    67.             <id>local</id>
    68.             <properties>
    69.                 <spring.profiles.active>local</spring.profiles.active>
    70.             </properties>
    71.             <activation>
    72.                 <activeByDefault>true</activeByDefault>
    73.             </activation>
    74.         </profile>
    75.         <profile>
    76.             <id>dev</id>
    77.             <properties>
    78.                 <spring.profiles.active>dev</spring.profiles.active>
    79.             </properties>
    80.         </profile>
    81.         
    82.     </profiles>
    83.     <build>
    84.         <finalName>enn-activiti</finalName>
    85.         <plugins>
    86.             <plugin>
    87.                 <groupId>org.apache.maven.plugins</groupId>
    88.                 <artifactId>maven-compiler-plugin</artifactId>
    89.                 <configuration>
    90.                     <source>${java.version}</source>
    91.                     <target>${java.version}</target>
    92.                 </configuration>
    93.             </plugin>
    94.             <plugin>
    95.                 <groupId>org.springframework.boot</groupId>
    96.                 <artifactId>spring-boot-maven-plugin</artifactId>
    97.             </plugin>
    98.             <plugin>
    99.                 <groupId>org.apache.maven.plugins</groupId>
    100.                 <artifactId>maven-surefire-plugin</artifactId>
    101.                 <configuration>
    102.                     <skip>true</skip>
    103.                     <testFailureIgnore>true</testFailureIgnore>
    104.                 </configuration>
    105.             </plugin>
    106.         </plugins>
    107.     </build>
    108. </project>

    1.2. 创建启动类(componentScan是自己项目持久化模板,可以直接删掉)

    1. @SpringBootApplication(exclude = SecurityAutoConfiguration.class)
    2. @ComponentScan(basePackages = {"enn.activiti","enn.base.redis.cluster",
    3. "enn.base.utils","enn.base.mysql.ordinary","enn.base.mysql.dao"})
    4. @EnableAsync
    5. public class Application {
    6. static ConfigurableApplicationContext applicationContext;
    7. public static void main(String[] args) {
    8. applicationContext = SpringApplication.run(Application.class, args);
    9. }

    }

    1.3. 配置application.yml

    1. # u670Du52A1u7AEFu53E3
    2. server:
    3. port: ${SERVER_PORT:8082}
    4. #u6570u636Eu5E93u94FEu63A5u914Du7F6E
    5. spring:
    6. datasource:
    7. name: ecityposition
    8. type: com.alibaba.druid.pool.DruidDataSource
    9. filters: stat
    10. url: jdbc:mysql://localhost:3306/activiti?useUnicode=true&characterEncoding=utf-8
    11. driver-class-name: com.mysql.jdbc.Driver
    12. username: root
    13. password: root
    14. #配置初始化大小/最小/最大
    15. initial-size: 1
    16. min-idle: 1
    17. max-active: 20
    18. #获取连接等待超时时间
    19. max-wait: 60000
    20. #间隔多久进行一次检测,检测需要关闭的空闲连接
    21. time-between-eviction-runs-millis: 60000
    22. #一个连接在池中最小生存的时间
    23. min-evictable-idle-time-millis: 300000
    24. validation-query: SELECT 'x'
    25. test-while-idle: true
    26. test-on-borrow: false
    27. test-on-return: false
    28. #打开PSCache,并指定每个连接上PSCache的大小。oracle设为true,mysql设为false。分库分表较多推荐设置为false
    29. pool-prepared-statements: false
    30. max-pool-prepared-statement-per-connection-size: 20
    31. jpa:
    32. properties:
    33. hibernate:
    34. hbm2ddl:
    35. auto: update
    36. jackson:
    37. date-format: yyyy-MM-dd HH:mm:ss
    38. time-zone: GMT+8
    39. activiti:
    40. check-process-definitions: false
    41. database-schema-update: true

    1.4. 启动可能出现的错误

    上述已经解决,直接启动没有问题

      1.4.1 如果项目使用myibatis,则需要再依赖中排除persistence-api,否则会以下的错误:

        Consider defining a bean of type 'javax.persistence.EntityManagerFactory' in your configuration.

      1.4.2  在配置文件中设置不扫描processes文件包

        如果还没有建bpmn模型,则会出现如下错误:

        java.io.FileNotFoundException: class path resource [processes/] cannot be resolved to URL because it does not exist

        另外,database-schema-update属性,可选值为: false,true,create-drop,drop-create,默认为true。

         为true表示activiti会对数据库中的表进行更新操作,如果不存在,则进行创建。

      1.4.3 在启动类上排除SecurityAutoConfiguration类,否则报:

        java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy

    因为GlobalAuthenticationConfigurerAdapter  是spring-boot-starter-security 依赖中的属于安全配置类,  而 引入的activiti-spring-boot-starter-basic 依赖中存在了一个自动安全配置类,  两个安全配置,  所以排除掉 activiti-spring-boot-starter-basic中的安全配置类  SecurityAutoConfiguration

    二、编写测试流程

     写的较为简单,但可通过如下进行测试,理解bpmn

    1. import enn.activiti.entity.vo.dbDict.DbDictTreeVo;
    2. import enn.activiti.entity.vo.dbDict.DbDictVo;
    3. import enn.activiti.service.ActivityConsumerService;
    4. import enn.activiti.utils.DictUtils;
    5. import enn.activiti.utils.common.ResultTreeBean;
    6. import enn.base.utils.web.ActionResult;
    7. import io.swagger.annotations.Api;
    8. import io.swagger.annotations.ApiOperation;
    9. import org.activiti.engine.ProcessEngine;
    10. import org.activiti.engine.ProcessEngines;
    11. import org.activiti.engine.task.Task;
    12. import org.slf4j.Logger;
    13. import org.slf4j.LoggerFactory;
    14. import org.springframework.web.bind.annotation.*;
    15. import javax.annotation.Resource;
    16. import java.util.ArrayList;
    17. import java.util.HashMap;
    18. import java.util.List;
    19. import java.util.Map;
    20. /**
    21. * @auther: liuxianling
    22. * @date: 2018/12/2 21:38
    23. * @description:
    24. */
    25. @RestController
    26. @RequestMapping("/api/activiti")
    27. @Api(value = "/ActivityConsumerController", description = "ActivityConsumerController")
    28. public class ActivityConsumerController {
    29. private static final Logger logger = LoggerFactory.getLogger(DbDictController.class);
    30. @Resource
    31. ActivityConsumerService activityConsumerService;
    32. /**
    33. * 1:启动流程实例
    34. */
    35. @ApiOperation(value = "启动流程实例", notes = "启动流程实例")
    36. @GetMapping("/testStartProcessInstance")
    37. public void testStartProcessInstance(@RequestParam("procdefId") String procdefId){
    38. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    39. processEngine.getRuntimeService()
    40. .startProcessInstanceById(procdefId); //这个是查看数据库中act_re_procdef表
    41. }
    42. /**
    43. * 2.完成请假申请
    44. */
    45. @ApiOperation(value = "完成请假申请", notes = "完成请假申请")
    46. @GetMapping("/testQingjia")
    47. public void testQingjia(String taskId){
    48. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    49. processEngine.getTaskService()
    50. .complete(taskId); //查看act_ru_task表
    51. }
    52. /**
    53. * 3.班主任查询当前任务
    54. */
    55. @ApiOperation(value = "班主任查询当前任务", notes = "班主任查询当前任务")
    56. @GetMapping("/taskAssignee")
    57. public void testQueryTask(String taskAssignee){
    58. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    59. List<Task> tasks = processEngine.getTaskService()
    60. .createTaskQuery()
    61. .taskAssignee(taskAssignee)
    62. .list();
    63. for (Task task : tasks) {
    64. System.out.println(task.getName());
    65. }
    66. }
    67. /**
    68. * 4.班主任完成任务
    69. */
    70. @ApiOperation(value = "班主任完成任务", notes = "班主任完成任务")
    71. @GetMapping("/testFinishTask_manager")
    72. public void testFinishTask_manager(String taskId){
    73. ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
    74. engine.getTaskService()
    75. .complete(taskId); //查看act_ru_task数据表
    76. }
    77. /**
    78. * 5.教务处主任完成任务
    79. */
    80. @ApiOperation(value = "教务处主任完成任务", notes = "教务处主任完成任务")
    81. @GetMapping("/testFinishTask_Boss")
    82. public void testFinishTask_Boss(String taskId){
    83. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    84. processEngine.getTaskService()
    85. .complete(taskId); //查看act_ru_task数据表
    86. }
    87. }

    三、编写bpmn

    1.1 设置编码

    1. 预防activiti乱码,还需要修改启动idea配置,增加如下

    1.2 创建bpmn

    1.3 编写逻辑

    1. StartEvent-->点击空白处,定义流程名称-->UserTask(请假流程,定义请假人)-->UserTask(班主任审批,定义班主任)-->userTask(教导处审批,定义教导处)-->EndEvent结束流程,如图所示:

    四、activiti数据库表概览

      1.1 说明

        Activiti工作流总共包含23张数据表,所有的表名默认以“ACT_”开头。

    并且表名的第二部分用两个字母表明表的用例,而这个用例也基本上跟Service API匹配。

    u  ACT_GE_* : “GE”代表“General”(通用),用在各种情况下;

    u  ACT_HI_* : “HI”代表“History”(历史),这些表中保存的都是历史数据,比如执行过的流程实例、变量、任务,等等。Activit默认提供了4种历史级别:

    Ø  none: 不保存任何历史记录,可以提高系统性能;

    Ø  activity:保存所有的流程实例、任务、活动信息;

    Ø  audit:也是Activiti的默认级别,保存所有的流程实例、任务、活动、表单属性;

    Ø  full:最完整的历史记录,除了包含audit级别的信息之外还能保存详细,例如:流程变量。

    对于几种级别根据对功能的要求选择,如果需要日后跟踪详细可以开启full

    Acitiviti数据库中表的命名都是以ACT_开头的。第二部分是一个两个字符用例表的标识。此用例大体与服务API是匹配的。

    l  ACT_RE_*:’RE’表示repository。带此前缀的表包含的是静态信息,如,流程定义,流程的资源(图片,规则等)。

    l  ACT_RU_*:’RU’表示runtime。这是运行时的表存储着流程变量,用户任务,变量,职责(job)等运行时的数据。Activiti只存储实例执行期间的运行时数据,当流程实例结束时,将删除这些记录。这就保证了这些运行时的表小且快。

    l  ACT_ID_*:’ID’表示identity。这些表包含标识的信息,如用户,用户组,等等。

    l  ACT_HI_*:’HI’表示history。就是这些表包含着历史的相关数据,如结束的流程实例,变量,任务,等等。

    l  ACT_GE_*:普通数据,各种情况都使用的数据。

    1.2 概览

    1.2.1   Activiti数据表清单:

    表分类

    表名

    解释

    一般数据

    ACT_GE_BYTEARRAY

    通用的流程定义和流程资源,用来保存部署文件的大文本数据

    ACT_GE_PROPERTY

    系统相关属性,存储这个流程引擎级别的数据

    流程历史记录

    		<p>&nbsp;</p>
    		</td>
    		<td style="vertical-align:top;">
    		<p><a name="headLOCAL_1-ACT_HI_ACTINST" target="_blank"></a><a target="_blank">ACT_HI_ACTINST</a></p>
    		</td>
    		<td style="vertical-align:top;">
    		<p>历史的流程实例</p>
    		</td>
    	</tr><tr><td style="vertical-align:top;">
    		<p><a name="headLOCAL_1-ACT_HI_ATTACHMENT" target="_blank"></a><a target="_blank">ACT_HI_ATTACHMENT</a></p>
    		</td>
    		<td style="vertical-align:top;">
    		<p>历史的流程附件</p>
    		</td>
    	</tr><tr><td style="vertical-align:top;">
    		<p><a name="headLOCAL_1-ACT_HI_COMMENT" target="_blank"></a><a target="_blank">ACT_HI_COMMENT</a></p>
    		</td>
    		<td style="vertical-align:top;">
    		<p>历史的说明性信息</p>
    		</td>
    	</tr><tr><td style="vertical-align:top;">
    		<p><a name="headLOCAL_1-ACT_HI_DETAIL" target="_blank"></a><a target="_blank">ACT_HI_DETAIL</a></p>
    		</td>
    		<td style="vertical-align:top;">
    		<p>历史的流程运行中的细节信息</p>
    		</td>
    	</tr><tr><td style="vertical-align:top;">
    		<p><a name="headLOCAL_1-ACT_HI_IDENTITYLINK" target="_blank"></a><a target="_blank">ACT_HI_IDENTITYLINK</a></p>
    		</td>
    		<td style="vertical-align:top;">
    		<p>历史的流程运行过程中用户关系</p>
    		</td>
    	</tr><tr><td style="vertical-align:top;">
    		<p><a name="headLOCAL_1-ACT_HI_PROCINST" target="_blank"></a><a target="_blank">ACT_HI_PROCINST</a></p>
    		</td>
    		<td style="vertical-align:top;">
    		<p>历史的流程实例</p>
    		</td>
    	</tr><tr><td style="vertical-align:top;">
    		<p><a name="headLOCAL_1-ACT_HI_TASKINST" target="_blank"></a><a target="_blank">ACT_HI_TASKINST</a></p>
    		</td>
    		<td style="vertical-align:top;">
    		<p>历史的任务实例</p>
    		</td>
    	</tr><tr><td style="vertical-align:top;">
    		<p><a name="headLOCAL_1-ACT_HI_VARINST" target="_blank"></a><a target="_blank">ACT_HI_VARINST</a></p>
    		</td>
    		<td style="vertical-align:top;">
    		<p>历史的流程运行中的变量信息</p>
    		</td>
    	</tr><tr><td rowspan="4">
    		<p><a name="OLE_LINK62" target="_blank"></a><a name="OLE_LINK61" target="_blank">用户用户组表</a></p>
    		</td>
    		<td style="vertical-align:top;">
    		<p><a name="headLOCAL_1-ACT_ID_GROUP" target="_blank"></a><a target="_blank">ACT_ID_GROUP</a></p>
    		</td>
    		<td style="vertical-align:top;">
    		<p>身份信息-组信息</p>
    		</td>
    	</tr><tr><td style="vertical-align:top;">
    		<p><a name="headLOCAL_1-ACT_ID_INFO" target="_blank"></a><a target="_blank">ACT_ID_INFO</a></p>
    		</td>
    		<td style="vertical-align:top;">
    		<p>身份信息-组信息</p>
    		</td>
    	</tr><tr><td style="vertical-align:top;">
    		<p><a name="headLOCAL_1-ACT_ID_MEMBERSHIP" target="_blank"></a><a target="_blank">ACT_ID_MEMBERSHIP</a></p>
    		</td>
    		<td style="vertical-align:top;">
    		<p>身份信息-用户和组关系的中间表</p>
    		</td>
    	</tr><tr><td style="vertical-align:top;">
    		<p><a name="headLOCAL_1-ACT_ID_USER" target="_blank"></a><a target="_blank">ACT_ID_USER</a></p>
    		</td>
    		<td style="vertical-align:top;">
    		<p>身份信息-用户信息</p>
    		</td>
    	</tr><tr><td rowspan="3">
    		<p><a name="OLE_LINK25" target="_blank"></a><a name="OLE_LINK24" target="_blank">流程定义表</a></p>
    		</td>
    		<td style="vertical-align:top;">
    		<p><a name="headLOCAL_1-ACT_RE_DEPLOYMENT" target="_blank"></a><a target="_blank">ACT_RE_DEPLOYMENT</a></p>
    		</td>
    		<td style="vertical-align:top;">
    		<p>部署单元信息,用来存储部署时需要持久化保存下来的信息</p>
    		</td>
    	</tr><tr><td style="vertical-align:top;">
    		<p><a name="headLOCAL_1-ACT_RE_MODEL" target="_blank"></a><a target="_blank">ACT_RE_MODEL</a></p>
    		</td>
    		<td style="vertical-align:top;">
    		<p>模型信息</p>
    		</td>
    	</tr><tr><td style="vertical-align:top;">
    		<p><a name="headLOCAL_1-ACT_RE_PROCDEF" target="_blank"></a><a target="_blank">ACT_RE_PROCDEF</a></p>
    		</td>
    		<td style="vertical-align:top;">
    		<p>已部署的流程定义,业务流程定义数据表</p>
    
    		<p>此表和ACT_RE_DEPLOYMENT是多对一的关系,即,</p>
    
    		<p>一个部署的bar包里可能包含多个流程定义文件,</p>
    
    		<p>每个流程定义文件都会有一条记录在ACT_REPROCDEF表内,</p>
    
    		<p>每个流程定义的数据,都会对于ACT_GE_BYTEARRAY表内</p>
    
    		<p>的一个资源文件和PNG图片文件。和ACT_GE_BYTEARRAY</p>
    
    		<p>的关联是通过程序用ACT_GE_BYTEARRAY.NAME与</p>
    
    		<p>ACT_RE_PROCDEF.NAME_完成的,在数据库表结构中没有体现</p>
    		</td>
    	</tr><tr><td rowspan="6">
    		<p><a name="OLE_LINK13" target="_blank"></a><a name="OLE_LINK12" target="_blank">运行实例表</a></p>
    		</td>
    		<td style="vertical-align:top;">
    		<p><a name="headLOCAL_1-ACT_RU_EVENT_SUBSCR" target="_blank"></a><a target="_blank">ACT_RU_EVENT_SUBSCR</a></p>
    		</td>
    		<td style="vertical-align:top;">
    		<p>运行时事件</p>
    		</td>
    	</tr><tr><td style="vertical-align:top;">
    		<p><a name="headLOCAL_1-ACT_RU_EXECUTION" target="_blank"></a><a target="_blank">ACT_RU_EXECUTION</a></p>
    		</td>
    		<td style="vertical-align:top;">
    		<p>运行时流程执行实例</p>
    		</td>
    	</tr><tr><td style="vertical-align:top;">
    		<p><a name="headLOCAL_1-ACT_RU_IDENTITYLINK" target="_blank"></a><a target="_blank">ACT_RU_IDENTITYLINK</a></p>
    		</td>
    		<td style="vertical-align:top;">
    		<p>运行时用户关系信息,主要存储当前节点参与者的信息。</p>
    		</td>
    	</tr><tr><td style="vertical-align:top;">
    		<p><a name="headLOCAL_1-ACT_RU_JOB" target="_blank"></a><a target="_blank">ACT_RU_JOB</a></p>
    		</td>
    		<td style="vertical-align:top;">
    		<p>运行时作业,运行时定时任务数据表</p>
    		</td>
    	</tr><tr><td style="vertical-align:top;">
    		<p><a name="headLOCAL_1-ACT_RU_TASK" target="_blank"></a><a target="_blank">ACT_RU_TASK</a></p>
    		</td>
    		<td style="vertical-align:top;">
    		<p>运行时任务</p>
    		</td>
    	</tr><tr><td style="vertical-align:top;">
    		<p><a name="headLOCAL_1-ACT_RU_VARIABLE" target="_blank"></a><a target="_blank">ACT_RU_VARIABLE</a></p>
    		</td>
    		<td style="vertical-align:top;">
    		<p>运行时变量表</p>
    		</td>
    	</tr></tbody></table></div><p>注:</p>
    

    l  流程文件部署主要涉及到3个表,分别是:ACT_GE_BYTEARRAY、ACT_RE_DEPLOYMENT、ACT_RE_PROCDEF。主要完成“部署包”-->“流程定义文件”-->“所有包内文件”的解析部署关系。从表结构中可以看出,流程定义的元素需要每次从数据库加载并解析,因为流程定义的元素没有转化成数据库表来完成,当然流程元素解析后是放在缓存中的,具体的还需要后面详细研究。

    l  流程定义中的java类文件不保存在数据库里 。

    l  组织机构的管理相对较弱,如果要纳入单点登录体系内还需要改造完成,具体改造方法有待研究。

    l  运行时对象的执行与数据库记录之间的关系需要继续研究

    l  历史数据的保存及作用需要继续研究。

    activiti-administrator

    自带的用户管理系统,维护用户和组,需要配置数据连接参数,在activiti-administratorWEB-INFapplicationContext.xml中,并加入JDBC驱动包。

    activiti-cycle

    PVM活动检测的,由activiti-rest提供服务,不需配置。

    activiti-explorer

    可以查看用户任务和启动流程,由activiti-rest提供服务,不需配置。

    activiti-kickstart

    简单的点对点流程定义维护工具,需要配置数据连接,把activiti.cfg.xml文件放在classes下,并加入驱动包。

    activiti-modeler

    在线编辑和维护流程定义的工具,最后以文件夹方式部署,需要配置activiti-modelerWEB-INFclassesconfiguration.properties文件。

    activiti-probe

    PVM的观测服务,由activiti-rest提供服务,不需配置,可以查看deployment、processdefinition、processinstance、database。

    activiti-rest

    其他几个应用的服务提供者,需要配置数据连接,把activiti.cfg.xml文件放在classes下,并加入驱动包。

    五,表结构变化

    参考:https://blog.csdn.net/cs_hnu_scw/article/details/79059965

    六. 具体表解析

    https://blog.csdn.net/hj7jay/article/details/51302829

    原文地址:https://blog.csdn.net/wudaoshihun/article/details/84655633#1.1%20%E8%AE%BE%E7%BD%AE%E7%BC%96%E7%A0%81
  • 相关阅读:
    (Lineup the Dominoes筛子)三维状压
    Halloween Costumes 玄学题
    jQuery之动画
    javascript之位置
    javascript之事件
    jQuery之DOM
    jQuery之选择器
    jQuery简介
    javascript之Bom简介
    javascript之DOM操作
  • 原文地址:https://www.cnblogs.com/jpfss/p/11095074.html
  • Copyright © 2020-2023  润新知