本文就不对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. # \u670D\u52A1\u7AEF\u53E3
  2. server:
  3. port: ${SERVER_PORT:8082}
  4. #\u6570\u636E\u5E93\u94FE\u63A5\u914D\u7F6E
  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-administrator\WEB-INF\applicationContext.xml中,并加入JDBC驱动包。

activiti-cycle

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

activiti-explorer

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

activiti-kickstart

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

activiti-modeler

在线编辑和维护流程定义的工具,最后以文件夹方式部署,需要配置activiti-modeler\WEB-INF\classes\configuration.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

springboot2.04与activiti 6.0集成的更多相关文章

  1. SpringBoot2.0集成FastDFS

    SpringBoot2.0集成FastDFS 前两篇整体上介绍了通过 Nginx 和 FastDFS 的整合来实现文件服务器.但是,在实际开发中对图片或文件的操作都是通过应用程序来完成的,因此,本篇将 ...

  2. (补漏)Springboot2.0 集成shiro权限管理

    原文Springboot2.0 集成shiro权限管理 一.关于停止使用外键. 原本集成shiro建立用户.角色.权限表的时候使用了外键,系统自动创建其中两个关联表,用@JoinTable.看起来省事 ...

  3. SpringBoot2.0集成Shiro

    1.shiro的三个核心概念: 1)Subject:代表当前正在执行操作的用户,但Subject代表的可以是人,也可以是任何第三方系统帐号.当然每个subject实例都会被绑定到SercurityMa ...

  4. springboot2.04+mybatis-plus+swagger2+CodeGenerator

    @author zhangyh SpringBoot技术栈搭建个人博客[项目准备]  RESTful API就是一套协议来规范多种形式的前端和同一个后台的交互方式 原型设计 事实上,我是直接先去找的原 ...

  5. Activiti学习——Activiti与Spring集成

    转: Activiti学习——Activiti与Spring集成 与Spring集成 基础准备 目录结构 相关jar包 Activiti的相关jar包 Activiti依赖的相关jar包 Spring ...

  6. 2017.2.21 activiti实战--第七章--Activiti与spring集成(一)配置文件

    学习资料:<Activiti实战> 第七章 Activiti与容器集成 本章讲解activiti-spring可以做的事情,如何与现有系统集成,包含bean的注入.统一事务管理等. 7.1 ...

  7. ubantu16.04+mxnet +opencv+cuda8.0 环境搭建

    ubantu16.04+mxnet +opencv+cuda8.0 环境搭建 建议:环境搭建完成之后,不要更新系统(内核) 转载请注明出处: 微微苏荷 一 我的安装环境 系统:ubuntu16.04 ...

  8. 在Ubuntu Server14.04上编译Android6.0源码

    此前编译过Android4.4的源码,但是现在Android都到了7.0的版本,不禁让我感叹Google的步伐真心难跟上,趁这周周末时间比较充裕,于是在过去的24小时里,毅然花了9个小时编译了一把An ...

  9. ubuntu 10.04 安装qt 5.0.2

    转自ubuntu 10.04 安装qt 5.0.2 从qt project网站下载下来最新的qt5.0.2套件,发现是个.run文件,添加x属性,然后直接sudo ./****.run, 提示  /l ...

随机推荐

  1. golang之字符串

    字符串中的每一个元素叫做“字符”.在遍历或者单个获取字符串元素时可以获得字符.严格来说,这并不是 Go语言的一个类型,字符只是整数的特殊用例. (1)最后要注意,字符串值是不可变的.也就是说,我们一旦 ...

  2. 从0开始学习 GitHub 系列之「05.Git 进阶」

    关于 Git 相信大家看了之前一系列的文章已经初步会使用了, 但是关于Git还有很多知识与技巧是你不知道的,今天就来给大家介绍下一些 Git 进阶的知识. 1. 用户名和邮箱 我们知道我们进行的每一次 ...

  3. python正则表达式应用 去掉标点符号

  4. php框架tp3.2.3和js写的微信分享功能心得,分享的标题内容图片自定义

    https://blog.csdn.net/weixin_42231483/article/details/81585322 最近用PHP的tp3.2.3框架和js写的微信分享功能心得,分享的标题内容 ...

  5. R语言实现分层抽样(Stratified Sampling)以iris数据集为例

    R语言实现分层抽样(Stratified Sampling)以iris数据集为例 1.观察数据集 head(iris) Sampling)以iris数据集为例">  选取数据集中前6个 ...

  6. ansible Ansible Galaxy ansible-playbook 安装 使用 命令 笔记 生成密钥 管控机 被管控机 wget epel源

    笔记 ansible 安装 与salt对比 相同 都是为了同时在多台机器上执行相同的命令 都是python开发 不同 agent(saltstack需要安装.ansible不需要) 配置(salt配置 ...

  7. 【Django入坑之路】Django后台上传图片,以及前端的显示

    #setting配置: MEDIA_URL = "/media/" MEDIA_ROOT = os.path.join(BASE_DIR, "media") # ...

  8. jQuery第3天

    复习 如何区别 JS DOM对象和 JQ 包装对象? JQ对象其实是经过包装的DOM对象,包装后可调用 JQ 的方法. JS 对象基本上都是属性为主,JQ基本上都方法为主. 可通过 console.d ...

  9. mysql的执行计划概念说明

    explain中的列的说明 1. id列 id列的编号是 select 的序列号,有几个 select 就有几个id,并且id的顺序是按 select 出现的 顺序增长的. id列越大执行优先级越高, ...

  10. ios开发――解决UICollectionView的cell间距与设置不符问题

    在用UICollectionView展示数据时,有时我们希望将cell的间距调成一个我们想要的值,然后查API可以看到有这么一个属性: - (CGFloat)minimumInteritemSpaci ...