Activiti 7 新特性尝鲜

API结构

image-20210305140527448.png

新特性ProcessRuntime

  • Java代码实现

     private static final Logger LOGGER = LoggerFactory.getLogger(Part8_ProcessRuntime.class);
        @Resource
        private ProcessRuntime processRuntime;
    
        @Resource
        private SecurityUtil securityUtil;
    
        /*
          获取流程实例
         */
        @Test
        public void getProcessInstance() {
            securityUtil.logInAs("bajie");
            Page<ProcessInstance> processInstancePage = processRuntime.processInstances(Pageable.of(0, 100));
            int totalItems = processInstancePage.getTotalItems();
            LOGGER.info("启动流程实例 = {}", totalItems);
            List<ProcessInstance> content = processInstancePage.getContent();
            for (ProcessInstance processInstance : content) {
                LOGGER.info("------------------------");
                LOGGER.info("id = {}", processInstance.getId());
                LOGGER.info("Name = {}", processInstance.getName());
                LOGGER.info("StartDate = {}", processInstance.getStartDate());
                LOGGER.info("Status = {}", processInstance.getStatus());
                LOGGER.info("ProcessDefinitionId = {}", processInstance.getProcessDefinitionId());
                LOGGER.info("ProcessDefinitionKey = {}", processInstance.getProcessDefinitionKey());
            }
        }
    
        /*
          启动流程实例
         */
        @Test
        public void startProcessInstance() {
            securityUtil.logInAs("bajie");
            ProcessInstance processInstance = processRuntime.start(
                    ProcessPayloadBuilder.start()
                            .withProcessDefinitionKey("defkey")
                            .withName("第一个流程实例名称")
                            .withBusinessKey("自定义key")
                            .build()
            );
        }
    复制代码
  • 运行结果

taskList.size()= 1
task.getId()= ae4bae6c-7a36-11eb-8698-80a589c981f4
task.getName()= 八戒的pRuntime任务
task.getAssignee()= bajie
复制代码
/*
删除流程实例
 */
@Test
public void delProcessInstance() {
    processRuntime.delete(
            ProcessPayloadBuilder
                    .delete()
                    .withProcessInstanceId("ae3f7967-7a36-11eb-8698-80a589c981f4")
                    .build()
    );
}
复制代码
/*
 挂起流程实例
 */
@Test
public void suspendProcessInstance() {
    securityUtil.logInAs("baijie");
    processRuntime.suspend(
            ProcessPayloadBuilder
                    .suspend()
                    .withProcessInstanceId("ae3f7967-7a36-11eb-8698-80a589c981f4")
                    .build()
    );
}

/*
  重启流程实例
 */
@Test
public void resumeProcessInstance() {
    securityUtil.logInAs("bajie");
    processRuntime
            .resume(ProcessPayloadBuilder
                    .resume()
                    .withProcessInstanceId("ae3f7967-7a36-11eb-8698-80a589c981f4")
                    .build()
            );
}

/*
流程实例参数
 */
@Test
public void getVariables() {
    securityUtil.logInAs("bajie");
    List<VariableInstance> variables = processRuntime.variables(ProcessPayloadBuilder
            .variables()
            .withProcessInstanceId("ae3f7967-7a36-11eb-8698-80a589c981f4")
            .build()
    );
    for (VariableInstance variable : variables) {
        LOGGER.info("---------------");
        LOGGER.info("getName = {}",variable.getName());
        LOGGER.info("getTaskId = {}",variable.getTaskId());
        LOGGER.info("getProcessInstanceId = {}",variable.getProcessInstanceId());
    }
}
复制代码

新特性TaskRuntime

  • java代码

     private static final Logger LOGGER = LoggerFactory.getLogger(Part9_TaskRuntime.class);
        @Resource
        private TaskRuntime taskRuntime;
    
        @Resource
        private SecurityUtil securityUtil;
    
        @Test
        public void getTask() {
            securityUtil.logInAs("bajie");
            Page<Task> tasks = taskRuntime.tasks(Pageable.of(0, 100));
            int totalItems = tasks.getTotalItems();
            LOGGER.info("总的数据为 = {}", totalItems);
            List<Task> content = tasks.getContent();
            for (Task task : content) {
                LOGGER.info("task.id = {}", task.getId());
                LOGGER.info("task.getName() = {}", task.getName());
                LOGGER.info("task.getStatus() = {}", task.getStatus());
                LOGGER.info("task.getCreatedDate() = {}", task.getCreatedDate());
            }
        }
    
        @Test
        public void completeTask() {
            securityUtil.logInAs("bajie");
            Task task = taskRuntime.task("");
            if (task.getAssignee() == null) {
                LOGGER.info("Assignee: 待拾取任务");
                taskRuntime.claim(TaskPayloadBuilder
                        .claim()
                        .withTaskId(task.getId())
                        .build());
            } else {
                taskRuntime.complete(TaskPayloadBuilder
                        .complete()
                        .withTaskId(task.getId())
                        .build());
                LOGGER.info("Assignee: = {}", task.getAssignee());
            }
        }
    复制代码

SpringSecurity用户登录

功能

  • 认证
  • 鉴权/授权

用户的三种来源

  • application.properties 配置用户
  • 代码中配置内存用户
  • 从数据库中加载用户

本课程知识点

  • 内存登录改为数据库数据登录

  • SpringSecurity 配置文件详解

  • 登录响应处理方案

内存登录改为数据库数据登录

模拟数据库校验

    @Override
    public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException {
        String passwrod = passwordEncoder().encode("111");
        return new User(
                userName
                , passwrod
                , AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_ACTIVITI_USER")
        );
    }
复制代码

前端登录校验

    @Override
    public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException {
        String passwrod = passwordEncoder().encode("111");
        UserInfoBean userInfoBean = userInfoBeanMapper.selectByUsername(userName);
        if (StringUtils.isEmpty(userInfoBean)) {
            throw new UsernameNotFoundException("请先注册在登陆");

        }
        return userInfoBean;
   /*     return new User(
                userName
                , passwrod
                , AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_ACTIVITI_USER")
        );*/
    }
复制代码
  • 数据库用户对应的实体类

    @Component
    public class UserInfoBean implements UserDetails {
        private Integer id;
        private String address;
        private String name;
        private String username;
        private String roles;
        private String password;
    
        /*
        对角色进行赋值
         */
        @Override
        public Collection<? extends GrantedAuthority> getAuthorities() {
            return Arrays.stream(roles.split(",")).map(
                    s -> new SimpleGrantedAuthority(s))
                    .collect(Collectors.toList()
                    );
        }
    
        public String getAddress() {
            return address;
        }
    
        @Override
        public String getPassword() {
            return password;
        }
    
        @Override
        public String getUsername() {
            return username;
        }
    
        @Override
        public boolean isAccountNonExpired() {
            return true;
        }
    
        @Override
        public boolean isAccountNonLocked() {
            return true;
        }
    
        @Override
        public boolean isCredentialsNonExpired() {
            return true;
        }
    
        @Override
        public boolean isEnabled() {
            return true;
        }
    }
    复制代码

SpringSecurity配置

  • 内存登录改为从数据库取值登录
  • SpringSecurity配置详解
  • 登录响应处理方案

SpringSecurity配置登录接口/拦截器编写

@Configuration
public class ActivitiSecurityConfig extends WebSecurityConfigurerAdapter {

    @Resource
    private LoginSuccessHandler loginSuccessHandler;

    @Resource
    private LoginFailureHandler loginFailureHandler;

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity.formLogin()
                // 登陆方法
                .loginPage("/login")
                .loginProcessingUrl("/login")
                .successHandler(loginSuccessHandler)
                .failureHandler(loginFailureHandler)
                .and()
                .authorizeRequests()
                .anyRequest().permitAll()
                .and()
                .logout().permitAll()
                .and()
                .csrf().disable()
                .headers().frameOptions().disable();
    }
}
复制代码

SpringSecurity登录成功后定制返回信息

@Component("loginSuccessHandler")
public class LoginSuccessHandler implements AuthenticationSuccessHandler {
    @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authentication) throws IOException, ServletException {

    }

    @Override
    public void onAuthenticationSuccess(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Authentication authentication) throws IOException, ServletException {
        httpServletResponse.setContentType("applicationn/json;charset=UTF-8");
        httpServletResponse.getWriter().write("登陆成功!"+authentication.getPrincipal());
    }
}
复制代码

SpringSecurity登录响应

登录失败提示

public class ActivitiSecurityController {

    @RequestMapping("/login")
    @ResponseStatus(code = HttpStatus.UNAUTHORIZED)
    public String requireAuthentication(HttpServletRequest httpServletRequest
            , HttpServletResponse httpServletResponse) {
        return "请先登录,请使用login.html或发起POST登陆请求";
    }
}
复制代码
  • 控制层的编写
public class ActivitiSecurityController {

    @RequestMapping("/login")
    @ResponseStatus(code = HttpStatus.UNAUTHORIZED)
    public String requireAuthentication(HttpServletRequest httpServletRequest
            , HttpServletResponse httpServletResponse) {
        return "请先登录,请使用login.html或发起POST登陆请求";
    }
}
复制代码

BPMN-JS整合

  • BPMN-JS下载地址: github.com/bpmn-io/bpm…
  • 项目的根目录下的 :bpmnjs初始化.zip 文件加入resource/resource中

目录结构如下

image-20210302070617350.png

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享