1.引入maven依赖jar( jeecg-boot-module-system\pom.xml)
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter-basic</artifactId>
<version>${activiti.version}</version>
<exclusions>
<exclusion>
<artifactId>mybatis</artifactId>
<groupId>org.mybatis</groupId>
</exclusion>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-rest</artifactId>
<version>${activiti.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-crypto</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-diagram-rest</artifactId>
<version>${activiti.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-crypto</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-modeler</artifactId>
<version>${activiti.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-crypto</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-explorer</artifactId>
<version>${activiti.version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>org.vaadin.addons</groupId>
<artifactId>dcharts-widget</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-json-converter</artifactId>
<version>${activiti.version}</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>${activiti.version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>${activiti.version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</exclusion>
</exclusions>
</dependency>
<properties>
<activiti.version>5.22.0</activiti.version>
</properties>
2.yml修改 application-dev.yml
spring:
activiti:
check-process-definitions: false
#启用作业执行器
async-executor-activate: false
#启用异步执行器
job-executor-activate: false
autoconfigure:
exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,org.activiti.spring.boot.SecurityAutoConfiguration
shiro:
excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/service/**,/act/model/graphHistoryProcessInstance,/act/model/graphProcessDiagram/**
3.修改启动类(JeecgApplication.java)
package org.jeecg;
import lombok.extern.slf4j.Slf4j;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.spring.SpringProcessEngineConfiguration;
import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.scan.StandardJarScanner;
import org.jeecg.common.util.oConvertUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import javax.sql.DataSource;
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
* 单体启动类(采用此类启动项目为单体模式)
*/
@Slf4j
@SpringBootApplication
public class JeecgSystemApplication extends SpringBootServletInitializer {
@Autowired
private DataSource dataSource;
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(JeecgSystemApplication.class);
}
public static void main(String[] args) throws UnknownHostException {
ConfigurableApplicationContext application = SpringApplication.run(JeecgSystemApplication.class, args);
Environment env = application.getEnvironment();
String ip = InetAddress.getLocalHost().getHostAddress();
String port = env.getProperty("server.port");
String path = oConvertUtils.getString(env.getProperty("server.servlet.context-path"));
log.info("\n----------------------------------------------------------\n\t" +
"Application Jeecg-Boot is running! Access URLs:\n\t" +
"Local: \t\thttp://localhost:" + port + path + "/\n\t" +
"External: \thttp://" + ip + ":" + port + path + "/\n\t" +
"Swagger文档: \thttp://" + ip + ":" + port + path + "/doc.html\n" +
"----------------------------------------------------------");
}
/**
* tomcat-embed-jasper引用后提示jar找不到的问题
*/
@Bean
public TomcatServletWebServerFactory tomcatFactory() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory() {
@Override
protected void postProcessContext(Context context) {
((StandardJarScanner) context.getJarScanner()).setScanManifest(false);
}
};
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
connector.setProperty("relaxedPathChars", "\"<>[\\]^`{|}");
connector.setProperty("relaxedQueryChars", "\"<>[\\]^`{|}");
}
});
return factory;
}
/*
@AutoConfigureOrder(Ordered.LOWEST_PRECEDENCE)
*/
@Bean
public SpringProcessEngineConfiguration springProcessEngineConfiguration() {
SpringProcessEngineConfiguration configuration = new SpringProcessEngineConfiguration();
configuration.setDataSource(this.dataSource);
configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
//作业执行器
configuration.setJobExecutorActivate(false);
configuration.setDbIdentityUsed(false);
configuration.setTransactionManager(transactionManager());
configuration.setLabelFontName("宋体");
configuration.setActivityFontName("宋体");
configuration.setAnnotationFontName("宋体");
/* Map<Object, Object> beans = new HashMap<>();
beans.put("sysBaseAPI", sysBaseAPI);
configuration.setBeans(beans);*/
configuration.getCommandExecutor();
return configuration;
}
@Bean
public PlatformTransactionManager transactionManager() {
return new DataSourceTransactionManager(this.dataSource);
}
}
4.启动后端项目后查看工作流表是否生成
act_**(共21个表) 如果启动报错需要在数据库链接的url 拼接&nullCatalogMeansCurrent=true
5.所需库表创建(库表创建sql文件夹下有对应的sql文件)
- act_expression 流程表达式
- act_listener 流程监听
- act_model_xml 流程模块相关
- act_leave 请假demo 相关
- bpmn_model_relation 流程业务关联
- base_check_record 流程审核记录(可自己封装)
- act_id_group (视图)
- act_id_membership(视图)
- act_id_user(视图)
至此 系统的工作流环境已经搭建完成
6.代码迁移–复制源码包中相应的文件至所需要集成的项目中
后端项目( jeecg-boot-module-sysytem)
- org.jeecg.modules.act 包下的所有内容 工作流核心内容
- org.jeecg.modules.base 工作流内容封装
- -org.jeecg.modules.leave 开发工作流 demo
- 添加代码(jeecg-boot-base-common)org.jeecg.common.constant.CommonConstant
public static final String BPM_STATUS_1 = "1";
public static final String BPM_STATUS_2 = "2";
- 添加代码(jeecg-boot-base-common)org.jeecg.common.system.api.ISysBaseAPI
List getRoleByCurrUser();
String getRole();
public List<ComboModel> queryAllUser();
- 添加代码( jeecg-boot-module-sysytem)org.jeecg.modules.system.service.impl.SysBaseApiImpl.java
@Override
public List getRoleByCurrUser() {
LoginUser loginUser = LoginUserUtil.getLoginUser();
return sysUserRoleMapper.getRoleByCurrUser(loginUser.getId());
}
/**
* 获取当前用户角色对应的flag
* <p>
* 具体对应关系 请查看RoleEnum类
*
* @return
*/
@Override
public String getRole() {
LoginUser loginUser = LoginUserUtil.getLoginUser();
List<String> roles = sysUserRoleMapper.getRoleByUserName(loginUser.getUsername());
if (roles == null) {
log.error("当前用户角色未设置");
}
String code = roles.get(0);
return RoleEnum.getFlagByCode(code);
}
//注意这里是覆盖这个方法
@Override
public List<ComboModel> queryAllRole() {
List<ComboModel> list = new ArrayList<ComboModel>();
List<SysRole> roleList = roleMapper.selectList(new QueryWrapper<SysRole>());
for(SysRole role : roleList){
ComboModel model = new ComboModel();
model.setTitle(role.getRoleName());
model.setRoleCode(role.getRoleCode());
model.setId(role.getId());
list.add(model);
}
return list;
}
- 添加代码( jeecg-boot-module-sysytem)org.jeecg.modules.system.mapper.SysUserRoleMapper
@Select("select * from sys_role where id in (select role_id from sys_user_role where user_id = #{id})")
List<SysRole> getRoleByCurrUser(@Param("id") String id);
前端项目(ant-design-vue-jeecg)
- ant-design-vue-jeecg\public\plug-in 下所有内容官方工作流画布(在线设计)
- 画布需要调整glob.js 这是设置全局变量的地方 需要调整为自己的项目路径
- ant-design-vue-jeecg\src\views\leave 工作流开发demo 前端项目内容
- ant-design-vue-jeecg\src\views\act 流程设计器的前端内容
- ant-design-vue-jeecg\src\views\base 封装内容页面
至此所以的代码部分已完成
系统菜单配置sql
INSERT INTO sys_permission(id, parent_id, name, url, component, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_route, is_leaf, keep_alive, hidden, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external) VALUES ('1263284789228634114', '1258947305950683137', '流程表达式', '/act/actExpression', 'act/ActExpressionList', NULL, NULL, 1, NULL, '1', 3.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2020-05-21 09:45:39', 'admin', '2020-06-10 15:20:59', 0, 0, '1', 0);
INSERT INTO sys_permission(id, parent_id, name, url, component, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_route, is_leaf, keep_alive, hidden, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external) VALUES ('1263284529450221570', '1258947305950683137', '流程监听', '/act/actListener', 'act/ActListenerList', NULL, NULL, 1, NULL, '1', 2.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2020-05-21 09:44:37', 'admin', '2020-06-10 15:20:50', 0, 0, '1', 0);
INSERT INTO sys_permission(id, parent_id, name, url, component, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_route, is_leaf, keep_alive, hidden, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external) VALUES ('1258947496657297409', '1258947305950683137', '流程模型', '/act/actEesModel', 'act/ActEesModelList', NULL, NULL, 1, NULL, '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2020-05-09 10:30:48', NULL, NULL, 0, 0, '1', 0);
INSERT INTO sys_permission(id, parent_id, name, url, component, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_route, is_leaf, keep_alive, hidden, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external) VALUES ('1258947305950683137', '', '流程设计', '/act', 'layouts/RouteView', NULL, NULL, 0, NULL, '1', 0.10, 0, 'cluster', 1, 0, 0, 0, NULL, 'admin', '2020-05-09 10:30:02', 'admin', '2020-06-10 15:20:32', 0, 0, '1', 0);
INSERT INTO sys_permission(id, parent_id, name, url, component, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_route, is_leaf, keep_alive, hidden, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external) VALUES ('1251893935704489985', '1251806894186639361', '任务待办', '/leave/actLeave/taskList', 'leave/ActLeaveListTasks', NULL, NULL, 1, NULL, '1', 1.00, 0, NULL, 1, 1, 0, 0, NULL, 'admin', '2020-04-19 23:22:28', 'admin', '2020-04-19 23:27:53', 0, 0, '1', 0);
INSERT INTO sys_permission(id, parent_id, name, url, component, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_route, is_leaf, keep_alive, hidden, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external) VALUES ('1251807473092866049', '1251806894186639361', '请假申请', '/leave/actLeave', 'leave/ActLeaveList', NULL, NULL, 1, NULL, '1', 1.00, 0, '', 1, 1, 0, 0, NULL, 'admin', '2020-04-19 17:38:54', 'admin', '2020-04-19 17:46:12', 0, 1, '1', 0);
INSERT INTO sys_permission(id, parent_id, name, url, component, component_name, redirect, menu_type, perms, perms_type, sort_no, always_show, icon, is_route, is_leaf, keep_alive, hidden, description, create_by, create_time, update_by, update_time, del_flag, rule_flag, status, internal_or_external) VALUES ('1251806894186639361', NULL, '员工请假', '/leave', 'layouts/RouteView', NULL, NULL, 0, NULL, '1', 1.00, 0, 'dashboard', 1, 0, 0, 0, NULL, 'admin', '2020-04-19 17:36:36', NULL, NULL, 0, 0, '1', 0);
INSERT INTO sys_role(id, role_name, role_code, description, create_by, create_time, update_by, update_time) VALUES ('1263727231761461249', '部门领导', 'leader', NULL, 'admin', '2020-05-22 15:03:46', NULL, NULL);
INSERT INTO sys_dict(id, dict_name, dict_code, description, del_flag, create_by, create_time, update_by, update_time, type) VALUES ('1263026704463478785', '监听类型', 'listener_type', '', 0, 'admin', '2020-05-20 16:40:06', NULL, NULL, 0);
INSERT INTO sys_dict_item(id, dict_id, item_text, item_value, description, sort_order, status, create_by, create_time, update_by, update_time) VALUES ('1263026795177885697', '1263026704463478785', '执行监听', '1', '', 1, 1, 'admin', '2020-05-20 16:40:29', NULL, NULL);
INSERT INTO sys_dict_item(id, dict_id, item_text, item_value, description, sort_order, status, create_by, create_time, update_by, update_time) VALUES ('1263026832704323585', '1263026704463478785', '任务监听', '2', '', 1, 1, 'admin', '2020-05-20 16:40:37', NULL, NULL);
INSERT INTO sys_dict(id, dict_name, dict_code, description, del_flag, create_by, create_time, update_by, update_time, type) VALUES ('1263027621074092033', '值类型', 'listener_value_type', '', 0, 'admin', '2020-05-20 16:43:45', NULL, NULL, 0);
INSERT INTO sys_dict_item(id, dict_id, item_text, item_value, description, sort_order, status, create_by, create_time, update_by, update_time) VALUES ('1263027979271847937', '1263027621074092033', 'Java类', '1', '', 1, 1, 'admin', '2020-05-20 16:45:11', NULL, NULL);
INSERT INTO sys_dict_item(id, dict_id, item_text, item_value, description, sort_order, status, create_by, create_time, update_by, update_time) VALUES ('1263028024931041281', '1263027621074092033', '表达式', '2', '', 1, 1, 'admin', '2020-05-20 16:45:22', NULL, NULL);
INSERT INTO sys_dict_item(id, dict_id, item_text, item_value, description, sort_order, status, create_by, create_time, update_by, update_time) VALUES ('1263028077640859649', '1263027621074092033', 'Spring表达式', '3', '', 1, 1, 'admin', '2020-05-20 16:45:34', NULL, NULL);
INSERT INTO sys_dict(id, dict_name, dict_code, description, del_flag, create_by, create_time, update_by, update_time, type) VALUES ('1263027054192934913', 'Event属性', 'listener_event', '', 0, 'admin', '2020-05-20 16:41:30', NULL, NULL, 0);
INSERT INTO sys_dict_item(id, dict_id, item_text, item_value, description, sort_order, status, create_by, create_time, update_by, update_time) VALUES ('1263027127576477697', '1263027054192934913', 'start', 'start', '', 1, 1, 'admin', '2020-05-20 16:41:48', NULL, NULL);
INSERT INTO sys_dict_item(id, dict_id, item_text, item_value, description, sort_order, status, create_by, create_time, update_by, update_time) VALUES ('1263027156718501890', '1263027054192934913', 'end', 'end', '', 1, 1, 'admin', '2020-05-20 16:41:55', NULL, NULL);
INSERT INTO sys_dict_item(id, dict_id, item_text, item_value, description, sort_order, status, create_by, create_time, update_by, update_time) VALUES ('1263027203778592769', '1263027054192934913', 'take', 'take', '', 1, 1, 'admin', '2020-05-20 16:42:06', NULL, NULL);
INSERT INTO sys_dict_item(id, dict_id, item_text, item_value, description, sort_order, status, create_by, create_time, update_by, update_time) VALUES ('1263027256421302274', '1263027054192934913', 'create', 'create', '', 1, 1, 'admin', '2020-05-20 16:42:18', NULL, NULL);
INSERT INTO sys_dict_item(id, dict_id, item_text, item_value, description, sort_order, status, create_by, create_time, update_by, update_time) VALUES ('1263027429314707457', '1263027054192934913', 'assignment', 'assignment', '', 1, 1, 'admin', '2020-05-20 16:43:00', NULL, NULL);
INSERT INTO sys_dict_item(id, dict_id, item_text, item_value, description, sort_order, status, create_by, create_time, update_by, update_time) VALUES ('1263027506066276354', '1263027054192934913', 'complete', 'complete', '', 1, 1, 'admin', '2020-05-20 16:43:18', NULL, NULL);
INSERT INTO onl_cgreport_head ( id , code , name , cgr_sql , return_val_field , return_txt_field , return_type , db_source , content , update_time , update_by , create_time , create_by ) VALUES ('1263724407833047041', 'models', '工作流模块', 'SELECT table_name,table_txt FROM onl_cgform_head', NULL, NULL, '1', '', NULL, '2020-06-19 15:55:34', 'admin', '2020-05-22 14:52:32', 'admin');
INSERT INTO onl_cgreport_item(id, cgrhead_id, field_name, field_txt, field_width, field_type, search_mode, is_order, is_search, dict_code, field_href, is_show, order_num, replace_val, create_by, create_time, update_by, update_time) VALUES ('1263724408176979969', '1263724407833047041', 'table_name', 'table_name', NULL, 'String', NULL, 0, 1, '', '', 1, 1, '', 'admin', '2020-06-19 15:55:34', NULL, NULL);
INSERT INTO onl_cgreport_item(id, cgrhead_id, field_name, field_txt, field_width, field_type, search_mode, is_order, is_search, dict_code, field_href, is_show, order_num, replace_val, create_by, create_time, update_by, update_time) VALUES ('1263724408197951489', '1263724407833047041', 'table_txt', 'table_txt', NULL, 'String', NULL, 0, 1, '', '', 1, 2, '', 'admin', '2020-06-19 15:55:34', NULL, NULL);
INSERT INTO onl_cgform_head(id,table_name,table_type,table_version,table_txt,is_checkbox,is_db_synch,is_page,is_tree,id_sequence,id_type,query_mode,relation_type,sub_table_str,tab_order_num,tree_parent_id_field,tree_id_field,tree_fieldname,form_category,form_template,form_template_mobile,scroll,copy_version,copy_type,physic_id,update_by,update_time,create_by,create_time,theme_template) VALUES ('7f8f9836289d41eb826a39c60b179e56', 'act_leave', 1, 4, '员工请假', 'Y', 'Y', 'Y', 'N', NULL, 'UUID', 'single', NULL, NULL, NULL, NULL, NULL, NULL, 'bdfl_ptbd', '1', NULL, 0, NULL, 0, NULL, 'admin', '2020-04-19 17:58:19', 'admin', '2020-04-17 19:41:47', 'normal');
INSERT INTO sys_dict(id, dict_name, dict_code, description, del_flag, create_by, create_time, update_by, update_time, type) VALUES ('1263763489367830529', '请假类型', 'leave_type', '', 0, 'admin', '2020-05-22 17:27:50', NULL, NULL, 0);
INSERT INTO sys_dict_item(id, dict_id, item_text, item_value, description, sort_order, status, create_by, create_time, update_by, update_time) VALUES ('1263763560083795969', '1263763489367830529', '事假', '3', '3', 3, 1, 'admin', '2020-05-22 17:28:07', 'admin', '2020-06-02 15:28:28');
INSERT INTO sys_dict_item(id, dict_id, item_text, item_value, description, sort_order, status, create_by, create_time, update_by, update_time) VALUES ('1263763589448118273', '1263763489367830529', '婚嫁', '2', '', 2, 1, 'admin', '2020-05-22 17:28:14', 'admin', '2020-06-02 15:28:21');
INSERT INTO sys_dict_item(id, dict_id, item_text, item_value, description, sort_order, status, create_by, create_time, update_by, update_time) VALUES ('1267719362613227521', '1263763489367830529', '病假', '1', '', 1, 1, 'admin', '2020-06-02 15:27:04', 'admin', '2020-06-02 15:28:04');
INSERT INTO sys_dict_item(id, dict_id, item_text, item_value, description, sort_order, status, create_by, create_time, update_by, update_time) VALUES ('1267719763710324737', '1263763489367830529', '产假', '4', '', 4, 1, 'admin', '2020-06-02 15:28:39', NULL, NULL);
启动项目 给相应的角色配置完成 菜单 就可以看到 在线流程设计器了
- 导入流程模型 leavebmn.xml
- 发布&配置流程 然后就可以试试demo流程咯 (另外注意 sql中没有对应的角色 请根据流程图自行添加哦)
至此全部结束
下面介绍一下开发过程中的使用
WorkFlow* 对应开头的是进行了封 要使用此封装请在对应实体继承WorkFlowEntity
使用自定义表达式时请在springboot入口注入使用的springbean 监听这里没有封装(还请自行封装)