项目集成Activiti
集成新版(5.17+)Activiti Modeler与Rest服务
转自:http://www.kafeitu.me/blog.html
这又是一片迟来的博客,上一篇博文还是2014年4月24日写的,因为很多内容都在书(《Activiti实战》)里了已经有详细的解释了,不过由于书里面使用的是5.16.4版本,从5.17.0版本后Activiti Modeler的整合方式有些变化,所以写此博问作为补充内容。
声明:
- 此教程适合Activiti 5.17+版本。
- 本博客所涉及的内容均可在kft-activiti-demo中找到。
- 在线demo可以访问 http://demo.kafeitu.me:8080/kft-activiti-demo 菜单路径:管理模块 -> 流程管理 -> 模型工作区,可以『创建』或者『编辑』模型
1. 简介
上一篇介绍整合Activiti Modeler《整合Activiti Modeler到业务系统(或BPM平台)》已经有2年多时间了,自从Activiti 5.17版本发布以后该教程已经不适用了,很多网友也反馈不知道怎么把Activiti Modeler整合到自己的项目中去,为此抽时间为适配5.17+版本的集成方法整理成这篇博文,希望对有需求的网友有帮助。
最新版本的kft-activiti-demo已经使用了5.17+版本的Activiti,并且集成了最新的Activiti Modeler组件,可以下载最新源码:https://github.com/henryyan/kft-activiti-demo。
1.1 新版Activiti Modeler特性
先来欣赏一下新版的界面,相比上一版漂亮了许多,调性高了~~~
界面布局:上(工具区)、左(组件类目)、右(工作区)、右下(属性区)
Activiti Modeler内部的实现上还是以oryx为图形组件为内核,用angular.js作为界面基本元素的基础组件以及调度oryx的API。
2. 官方Activiti Explorer的集成方式
先从Github下载官方Activiti源码,地址:https://github.com/Activiti/Activiti。
2.1 Activiti Exploer的内部结构-Java
源码目录(如果是zip下载请先解压缩)中找到modules/activiti-webapp-explorer2/src/main子目录,结构如下:
├── assembly
├── java
│ └── org
│ └── activiti
├── resources
│ └── org
│ └── activiti
└── webapp├── META-INF├── VAADIN│ ├── themes│ └── widgetsets├── WEB-INF├── diagram-viewer│ ├── images│ └── js└── editor-app├── configuration├── css├── editor├── fonts├── i18n├── images├── libs├── partials├── popups└── stencilsets
我们需要关注的目录是webapp/editor-app,以及java/org/activiti,目录结构:
新版本的Activiti Explorer放弃了XML方式的配置方式,采用Bean Configuration的方式代替,上图中org/activiti/explorer/conf包中就是各种配置,在org/activiti/explorer/servlet/WebConfigurer类用Servlet 3.0方式配置Servlet映射关系,映射的路径为/service/*。
2.2 Activiti Exploer的内部结构-Web
新版本Activiti Modeler的Web资源不再像旧版那么散乱,新版本只需要关注:
- src/main/webapp/editor-app:目录中包含设计器里面所有的资源:angular.js、oryx.js以及配套的插件及css
- src/main/webapp/modeler.html:设计器的主页面,用来引入各种web资源
- src/main/resources/stencilset.json: bpmn标准里面各种组件的json定义,editor以import使用。
3. 整合到自己的项目中
了解过网友的需求不知道如何整合新版Activiti Modeler的原因有两个:
- 不知道怎么把注解的方式转换为XML方式
- editor-app目录的结构位置
- 和自己应用的整合参数配置
3.1 Activiti Rest接口与Spring MVC配置
3.1.1 Maven依赖
Activiti Modeler对后台服务的调用通过Spring MVC方式实现,所有的Rest资源统一使用注解RestController标注,所以在整合到自己项目的时候需要依赖Spring MVC,Modeler模块使用的后台服务都存放在activiti-modeler模块中,在自己的项目中添加依赖:
<dependency><groupId>org.activiti</groupId><artifactId>activiti-modeler</artifactId><version>5.19.0</version>
</dependency>
<dependency><groupId>org.activiti</groupId><artifactId>activiti-diagram-rest</artifactId><version>5.19.0</version>
</dependency>
模块作用:
- activiti-modeler模块提供模型先关的操作:创建、保存、转换json与xml格式等
- activiti-diagram-rest模块用来处理流程图有关的功能:流程图布局(layout)、节点高亮等
3.1.2 准备基础服务类
复制文件(https://github.com/henryyan/kft-activiti-demo/tree/master/src/main/java/org/activiti/explorer) 里面的java文件到自己项目中。
3.1.3 Activiti Spring配置
创建文件src/main/resources/beans/beans-activiti.xml定义Activiti引擎的beans:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd"><context:component-scanbase-package="org.activiti.conf,org.activiti.rest.editor"><context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/></context:component-scan><!-- 单例json对象 --><bean id="objectMapper" class="com.fasterxml.jackson.databind.ObjectMapper"/><!-- 引擎内部提供的UUID生成器,依赖fastxml的java-uuid-generator模块 --><bean id="uuidGenerator" class="org.activiti.engine.impl.persistence.StrongUuidGenerator" /><!-- Activiti begin --><bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration"><property name="dataSource" ref="dataSource"/><property name="transactionManager" ref="transactionManager"/><property name="databaseSchemaUpdate" value="true"/><property name="jobExecutorActivate" value="true"/></bean><bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean"><property name="processEngineConfiguration" ref="processEngineConfiguration"/></bean><!-- 7大接口 --><bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService"/><bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService"/><bean id="formService" factory-bean="processEngine" factory-method="getFormService"/><bean id="identityService" factory-bean="processEngine" factory-method="getIdentityService"/><bean id="taskService" factory-bean="processEngine" factory-method="getTaskService"/><bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService"/><bean id="managementService" factory-bean="processEngine" factory-method="getManagementService"/></beans>
在spring初始化的时候引入即可,例如在web.xml中使用通配符方式:
<context-param><param-name>contextConfigLocation</param-name><param-value>classpath*:/beans/beans-*.xml</param-value>
</context-param>
3.1.4 Spring MVC配置
创建文件WEB-INF/spring-mvc-modeler.xml,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd"><!-- 自动扫描且只扫描@Controller --><context:component-scan base-package="org.activiti.rest.editor,org.activiti.rest.diagram"><context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /></context:component-scan><mvc:annotation-driven />
</beans>
上面XML中告知spring mvc扫描路径为**
3.1.5 web.xml中配置Servlet服务
在web.xml中配置下面的Servlet:
<servlet><servlet-name>ModelRestServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/spring-mvc-modeler.xml</param-value></init-param><load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping><servlet-name>ModelRestServlet</servlet-name><url-pattern>/service/*</url-pattern>
</servlet-mapping>
3.1.6 模型设计器的Web资源
-
直接从Activiti Explorer中复制文件modeler.html文件到src/main/webapp目录即可,该文件会引入定义基本的布局(div)、引入css以及js文件。
-
修改editor-app/app-cfg.js文件的contextRoot属性为自己的应用名称,例如/kft-activiti-demo/service
3.1.7 模型控制器
在《整合Activiti Modeler到业务系统(或BPM平台)》中已经介绍过ModelController类的作用了,这里需要在基础上稍微做一点调整:
- create方法中在创建完Model后跳转页面由service/editor?id=改为modeler.html?modelId=
- 当从模型列表编辑某一个模型时也需要把路径修改为modeler.html?modelId=
4. 整合Activiti Rest
有了Activiti Modeler的基础只需要依葫芦画瓢即可。
4.1 Maven依赖
<dependency><groupId>org.activiti</groupId><artifactId>activiti-rest</artifactId><version>5.19.0</version>
</dependency>
4.3 Activiti组件包扫描
文件src/main/resources/beans/beans-activiti.xmlcontext:component-scan标签的base-package属性中添加org.activiti.rest.service包,包里面包含了所有Rest API的接口Rest Controller。
4.4 添加Rest安全认证组件
package org.activiti.conf;import org.activiti.rest.security.BasicAuthenticationProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationProvider;
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.annotation.web.servlet.configuration.EnableWebMvcSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;@Configuration
@EnableWebSecurity
@EnableWebMvcSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {@Beanpublic AuthenticationProvider authenticationProvider() {return new BasicAuthenticationProvider();}@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authenticationProvider(authenticationProvider()).sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and().csrf().disable().authorizeRequests().anyRequest().authenticated().and().httpBasic();}
}
4.5 spring mvc配置文件
创建文件WEB-INF/spring-mvc-rest.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd"><!-- 自动扫描且只扫描@Controller --><context:component-scan base-package="org.activiti.rest"><context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /></context:component-scan><mvc:annotation-driven />
</beans>
4.6 配置Servlet映射
<servlet><servlet-name>RestServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/spring-mvc-rest.xml</param-value></init-param><load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping><servlet-name>RestServlet</servlet-name><url-pattern>/rest/*</url-pattern>
</servlet-mapping>
4.7 访问Rest接口
现在启动应用可以访问 http://localhost:8080/your-app/rest/management/properties 以Rest方式查看引擎的属性列表,如果在网页中访问会提示输入用户名密码;也可以访问在线demo测试http://demo.kafeitu.me:8080/kft-activiti-demo/rest/management/properties (用户名:kafeitu,密码:000000)
5. 结束语
以上步骤如果在实施过程中有问题可以参考kft-activiti-demo中的配置,有其他问题可以在本博客中留言或者到QQ群问询。
最后再广告一下我的书《Activiti实战》,Tijs强力推荐的哦;同时也感谢一直支持和活跃在Activiti社区的你。
集成Diagram Viewer跟踪流程
首先这是一篇迟来的教程,因为从5.12版本(目前最新版本为5.15.1)开始就已经提供了Diagram Viewer这个流程图跟踪组件,不管如何总归有人需要用到,所以我觉得还是要和大家分享一下。
1. 前言
目前被大家所采用的流程图跟踪有两种方式:
- 一种是由引擎后台提供图片,可以把当前节点标记用红色
- 一种是比较灵活的方式,先用引擎接口获取流程图(原图),然后再通过解析引擎的Activity对象逐个解析(主要是判断哪个是当前节点),最后把这些对象组成一个集合转换成JSON格式的数据输出给前端,用Javascript和Css技术实现流程的跟踪
这两种方式在kft-activiti-demo中都有演示,这里就不介绍了,参考流程跟踪部门代码即可。
2. Diagram Viewer简介
Diagram Viewer是官方在5.12版本中添加的新组件,以Raphaël为基础库,用REST(参考:《如何使用Activiti Rest模块》)方式获取JSON数据生成流程图并把流程的处理过程用不同的颜色加以标注,最终的效果如下图所示。
在应用中使用时也很方便,把这个组件的源码复制到项目中再配置一个REST拦截器,最后拼接一个URL即可;举个例子:
http://demo.kafeitu.me/kft-activiti-demo/diagram-viewer/index.html?processDefinitionId=leave-jpa:1:22&processInstanceId=27
这个URL中有两个参数:
- processDefinitionId: 流程定义ID
- processInstanceId: 流程实例ID
3. 集成Diagram Viewer
3.1 创建REST路由类
REST路由类源码在官方的Activiti Explorer里面有提供,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | package org.activiti.explorer.rest; import org.activiti.rest.common.api.DefaultResource; import org.activiti.rest.common.application.ActivitiRestApplication; import org.activiti.rest.common.filter.JsonpFilter; import org.activiti.rest.diagram.application.DiagramServicesInit; import org.activiti.rest.editor.application.ModelerServicesInit; import org.restlet.Restlet; import org.restlet.routing.Router; public class ExplorerRestApplication extends ActivitiRestApplication { public ExplorerRestApplication() { super (); } /** * Creates a root Restlet that will receive all incoming calls. */ @Override public synchronized Restlet createInboundRoot() { Router router = new Router(getContext()); router.attachDefault(DefaultResource. class ); ModelerServicesInit.attachResources(router); DiagramServicesInit.attachResources(router); JsonpFilter jsonpFilter = new JsonpFilter(getContext()); jsonpFilter.setNext(router); return jsonpFilter; } } |
把这个路由配置到web.xml中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | < servlet > < servlet-name >ExplorerRestletServlet</ servlet-name > < servlet-class >org.restlet.ext.servlet.ServerServlet</ servlet-class > < init-param > <!-- Application class name --> < param-name >org.restlet.application</ param-name > < param-value >org.activiti.explorer.rest.ExplorerRestApplication</ param-value > </ init-param > </ servlet > < servlet-mapping > < servlet-name >ExplorerRestletServlet</ servlet-name > < url-pattern >/service/*</ url-pattern > </ servlet-mapping > |
3.2 复制Diagram Viewer组件
在官方提供的Zip文件(可以从www.activiti.org/download.html下载)中有一个wars目录,用压缩工具解压activiti-explorer.war文件,目录结构如下图:
把diagram-viewer复制到项目的webapp目录(或者是WebRoot目录)下,在项目中需要跟踪的地方拼接访问diagram-viewer/index.html的URL即可,别忘记了刚刚介绍的两个重要参数。
http://demo.kafeitu.me/kft-activiti-demo/diagram-viewer/index.html?processDefinitionId=leave-jpa:1:22&processInstanceId=27
URL中有两个参数:
- processDefinitionId: 流程定义ID
- processInstanceId: 流程实例ID
这是一个独立的页面,你可以直接打开它或者把它嵌入在一个对话框里面(kft-activiti-demo就是用的嵌入方式)。
在Activiti中集成JPA(解决动态表单生成的大量数据)
1. 为何集成JPA
在《比较Activiti中三种不同的表单及其应用》一文中介绍了不同表单的特点以及表现形式,相信这是每个初学者都会面临表单类型的选择。
如果选择了使用动态表单那么将面临一个比较“严峻”的问题——大数据量,我们知道动态表单的内容都保存在一张表中(ACT_HI_DETAIL),我们也清楚动态表单中每一个Field都会在该表中插入一条记录,假如一个流程共有20个字段,这个数据量大家可以计算一下,每天多少个流程实例,每个月、每年多少?
日积月累的大数据会影响系统的性能,尤其涉及到关联查询时影响更深,除了性能之外动态表单还有一个弊端那就是数据是以行的形式存储没有任何数据结构可言,流程运行中生成的数据很难被用于分析、查询,如何破解嘞?
2. 如何集成JPA
Activiti除了核心的Engine之外对企业现有的技术、平台、架构都有所支持,对于业务实体的持久化当然也会有所支持,那就是EJB的标准之一)——JPA,引擎把JPA的API引入到了内部,使用JPA功能的时候只需要把entityManagerFactory配置到引擎配置对象(参考:谈谈Activiti的引擎与引擎配置对象)即可。
参考用户手册的JPA章节,介绍了引擎配置对象中的几个jpa有关的属性,如下:
- jpaPersistenceUnitName: 使用持久化单元的名称(要确保该持久化单元在类路径下是可用的)。根据该规范,默认的路径是/META-INF/persistence.xml)。要么使用 jpaEntityManagerFactory 或者jpaPersistenceUnitName。
- jpaEntityManagerFactory: 一个实现了javax.persistence.EntityManagerFactory的bean的引用。它将被用来加载实体并且刷新更新。要么使用jpaEntityManagerFactory 或者jpaPersistenceUnitName。
- jpaHandleTransaction: 在被使用的EntityManager 实例上,该标记表示流程引擎是否需要开始和提交/回滚事物。当使用Java事物API(JTA)时,设置为false。
- jpaCloseEntityManager: 该标记表示流程引擎是否应该关闭从 EntityManagerFactory获取的 EntityManager的实例。当EntityManager 是由容器管理的时候需要设置为false(例如 当使用并不是单一事物作用域的扩展持久化上下文的时候)。
2.1 配置持久化单元或者EntityManagerFactory
要在引擎中使用JPA需要提供EntityManagerFactory或者提供持久化单元名称(引擎会自动查找最终获取到EntityManagerFactory对象),在使用的时候可以根据自己的实际情况进行选择,在kft-activiti-demo中使用了jpaEntityManagerFactory属性注入EntityManagerFactory对象的方式。
2.2 Standalone模式的JPA配置
1 2 3 4 | < property name = "jpaPersistenceUnitName" value = "kft-jpa-pu" > < property name = "jpaHandleTransaction" value = "true" ></ property > < property name = "jpaCloseEntityManager" value = "true" ></ property > </ property > |
2.3 Spring(托管)模式的JPA配置
1 2 3 4 | < property name = "jpaEntityManagerFactory" ref = "entityManagerFactory" > < property name = "jpaHandleTransaction" value = "false" ></ property > < property name = "jpaCloseEntityManager" value = "false" ></ property > </ property > |
3. 实例分析
在最新版本(1.10)的kft-activiti-demo中添加了JPA演示,大家可以从Github上下载源码查看源码。
3.1 相关说明
- 流程定义文件:leave-jpa.bpmn
- 实体文件:me.kafeitu.demo.activiti.entity.oa.LeaveJpaEntity
- 实体管理器:me.kafeitu.demo.activiti.service.oa.leave.LeaveEntityManager
3.2 创建实体
在流程定义文件中定义了一个流程的start类型监听器:
1 2 3 | < extensionelements > < activiti:executionlistener event = "start" expression = "${execution.setVariable('leave', leaveEntityManager.newLeave(execution))}" ></ activiti:executionlistener > </ extensionelements > |
这个监听器的触发的时候会执行一个表达式,调用名称为leaveEntityManager的Spring Bean对象的newLeave方法,并且把引擎的Execution对象传递过去,得到一个LeaveJpaEntity对象后设置到引擎的变量中(名称为leave)。
下面是LeaveEntityManager.java的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | @Entity (name = "LEAVE_JPA" ) public class LeaveJpaEntity implements Serializable { private Long id; private String processInstanceId; private String userId; private Date startTime; private Date endTime; private Date realityStartTime; private Date realityEndTime; private Date reportBackDate; private Date applyTime; private String leaveType; private String reason; /** * 部门领导是否同意 */ private String deptLeaderApproved; /** * HR是否同意 */ private String hrApproved; ... } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | @Service public class LeaveEntityManager { @PersistenceContext private EntityManager entityManager; /* 把流程变量的值赋值给JPA实体对象并保存到数据库 */ @Transactional public LeaveJpaEntity newLeave(DelegateExecution execution) { LeaveJpaEntity leave = new LeaveJpaEntity(); leave.setProcessInstanceId(execution.getProcessInstanceId()); leave.setUserId(execution.getVariable( "applyUserId" ).toString()); leave.setStartTime((Date) execution.getVariable( "startTime" )); leave.setEndTime((Date) execution.getVariable( "endTime" )); leave.setLeaveType(execution.getVariable( "leaveType" ).toString()); leave.setReason(execution.getVariable( "reason" ).toString()); leave.setApplyTime( new Date()); entityManager.persist(leave); return leave; } public LeaveJpaEntity getLeave(Long id) { return entityManager.find(LeaveJpaEntity. class , id); } } |
当启动流程后查看表LEAVE_JPA中的数据与表单填写的一致。
3.3 在流程中更改实体的值
当部门领导或者人事审批节点完成时需要把审批结果更新到LeaveJpaEntity属性中(即更新表LEAVE_JPA),所以在这两个任务上添加一个complete类型的监听器,如下所示:
1 2 3 4 5 6 7 8 9 10 11 | < usertask id = "deptLeaderAudit" name = "部门领导审批" activiti:candidategroups = "deptLeader" > < extensionelements > < activiti:tasklistener event = "complete" expression = "${leave.setDeptLeaderApproved(deptLeaderApproved)}" ></ activiti:tasklistener > </ extensionelements > </ usertask > < usertask id = "hrAudit" name = "人事审批" activiti:candidategroups = "hr" > < extensionelements > < activiti:tasklistener event = "complete" expression = "${leave.setHrApproved(hrApproved)}" ></ activiti:tasklistener > </ extensionelements > </ usertask > |
3.4 流程结束后删除表单数据
熟悉Activiti表的应该知道表单数据会保存在表ACT_HI_DETAIL中,特性是字段TYPE_字段的值为FormProperty,我们只要根据流程实例ID过滤删除记录就可以清理掉已经结束流程的表单数据。
在最新版本的Demo中(1.10版本)添加了一个类用来执行SQL:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | @Component public class ActivitiDao { @PersistenceContext private EntityManager entityManager; /** * 流程完成后清理detail表中的表单类型数据 * @param processInstanceId * @return */ public int deleteFormPropertyByProcessInstanceId(String processInstanceId) { int i = entityManager.createNativeQuery( "delete from act_hi_detail where proc_inst_id_ = ? and type_ = 'FormProperty' " ) .setParameter( 1 , processInstanceId).executeUpdate(); return i; } } |
流程中定义了一个流程级别的结束监听器me.kafeitu.demo.activiti.service.oa.leave.LeaveProcessEndListener
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | @Service @Transactional public class LeaveProcessEndListener implements ExecutionListener { protected Logger logger = LoggerFactory.getLogger(getClass()); @Autowired ActivitiDao activitiDao; @Override public void notify(DelegateExecution execution) throws Exception { String processInstanceId = execution.getProcessInstanceId(); int i = activitiDao.deleteFormPropertyByProcessInstanceId(processInstanceId); logger.debug( "清理了 {} 条历史表单数据" , i); } } |
3.5 已知问题(未解决)
图中的三条数据因为是在销假任务完成后设置的,不知道是不是引擎的Bug导致插入这三个表单属性比调用流程结束监听器还晚(从引擎的日志中可以分析出来)导致这三条记录不能被删除,因为在删除的时候这三条数据还没有插入到数据库。
这个问题后面会继续跟踪,解决了会在这里更新!!!
剖析Activiti的Activity
1. 窥视Activity内部
在设计流程时每一个组件在Activiti中都可以称之为——Activity,部署流程时引擎把XML文件保存到数据库,当启动流程、完成任务时会从数据库读取XML并转换为Java对象,很多人想在处理任务时获取任务的一些配置,例如某个任务配置了哪些监听器或者条件Flow配置了什么条件表达式。
2. 代码
下面的代码做了简单的演示,根据不同的Activity类型输出属性,读者可以继续探索其他不同类型Activity的属性,最终可以获取到所有Activity的属性。
3. 输出结果示例
{taskDefinition=org.activiti.engine.impl.task.TaskDefinition@19c6e4d1, default=null, name=部门领导审批, documentation=null, type=userTask} {conditionText=${!deptLeaderPass}, condition=org.activiti.engine.impl.el.UelExpressionCondition@50d8628f, name=不同意, documentation=null} {conditionText=${deptLeaderPass}, condition=org.activiti.engine.impl.el.UelExpressionCondition@2e2ec3c0, name=同意, documentation=null} {taskDefinition=org.activiti.engine.impl.task.TaskDefinition@3589f0, default=null, name=调整申请, documentation=null, type=userTask} {taskDefinition=org.activiti.engine.impl.task.TaskDefinition@3af2ebab, default=null, name=人事审批, documentation=null, type=userTask} {conditionText=${hrPass}, condition=org.activiti.engine.impl.el.UelExpressionCondition@224e45c9, name=同意, documentation=null} {conditionText=${!hrPass}, condition=org.activiti.engine.impl.el.UelExpressionCondition@40c7a0b7, name=不同意, documentation=null} {taskDefinition=org.activiti.engine.impl.task.TaskDefinition@72086f9a, default=null, name=销假, documentation=null, type=userTask} {conditionText=${reApply}, condition=org.activiti.engine.impl.el.UelExpressionCondition@7d721f3, name=重新申请, documentation=null} {conditionText=${!reApply}, condition=org.activiti.engine.impl.el.UelExpressionCondition@3cf5dc8a, name=结束流程, documentation=null} {name=Start, documentation=null, type=startEvent} {name=End, documentation=null, type=endEvent}
更多博客
集成activiti-modeler 到 自己的业务系统(集成流程跟踪-完美支持IE)
- 转自:http://jhaij.iteye.com/blog/1871635
- activiti modeler 集成 spring modeler(升级到5.13)
本文目的: 将activit 5.12.1 的 modeler 流程设计器 集成到自己的工程中去
解决问题:
1. 复制相关资源文件到自己的工程中
2. 解决modeler的路径访问问题,迁移到非系统根目录
3. 跟自己系统的spring无缝集成
首先请下载官方最新 5.12.1 发布包
下载地址: https://github.com/Activiti/Activiti/archive/activiti-5.12.1.zip
解压后如下图
步骤:
1. 复制相关文件
1.1首先复制类路径资源文件
复制 \modules\activiti-webapp-explorer2\src\main\resources\下
db.properties 没有选中
选中文件到你的classpath 根目录下,(src 或者resource 类路径下)
1.2 复制ui文件到你的webroot文件夹中
在 WebRoot目录中建立一个文件夹 取名 modeler
复制 modules\activiti-webapp-explorer2\src\main\webapp 下
选中文件夹 到modeler目录下.
1.3 修改web.xml文件. 添加modeler的servlet
添加如下代码:
- <!-- Restlet adapter, used to expose modeler functionality through REST -->
- <servlet>
- <servlet-name>RestletServlet</servlet-name>
- <servlet-class>org.restlet.ext.servlet.ServerServlet</servlet-class>
- <init-param>
- <!-- Application class name -->
- <param-name>org.restlet.application</param-name>
- <param-value>org.activiti.explorer.rest.application.ExplorerRestApplication</param-value>
- </init-param>
- </servlet>
- <!-- Catch all service requests -->
- <servlet-mapping>
- <servlet-name>RestletServlet</servlet-name>
- <url-pattern>/modeler/service/*</url-pattern>
- </servlet-mapping>
首先确认. 你的工程引入了spring的监听. 也就代表你工程有spring . 因为activit-modeler严重依赖spring.
如果你工程没有spring环境, 建议下面就别看了. (先把自己的ssh , ssi , ssm 等框架搭建起来).
如果你使用的是spring mvc 建议你在你的mvc控制文件中加入
- <mvc:resources location="/modeler/" mapping="/modeler/**" />
因为很有可能你根我一样过滤的是所有路径
1.4 复制modules\activiti-webapp-explorer2\src\main\java\org\activiti\explorer\rest\application下的
ExplorerRestApplication.java文件到你的classpath路径下(会提示报错. 必须的. 因为还没有引入相关jar依赖)
1.5 在你的pom.xml文件中引入如下代码
仓库:
- <repository>
- <id>buzzmedia</id>
- <url>http://maven.thebuzzmedia.com</url> <!-- ImageScalr -->
- </repository>
- <repository>
- <id>activiti</id>
- <name>Activiti</name>
- <url>https://maven.alfresco.com/nexus/content/repositories/activiti/</url>
- </repository>
- <repository>
- <id>Alfresco thirdparty</id>
- <url>https://maven.alfresco.com/nexus/content/repositories/thirdparty/</url>
- </repository>
- <repository>
- <id>activiti-third-party</id>
- <name>Activiti third party</name>
- <url>https://maven.alfresco.com/nexus/content/repositories/activiti-thirdparty/</url>
- </repository>
- <repository>
- <id>maven-restlet</id>
- <name>Public online Restlet repository</name>
- <url>http://maven.restlet.org</url>
- </repository>
jar依赖
- <dependency>
- <groupId>org.activiti</groupId>
- <artifactId>activiti-modeler</artifactId>
- <version>${activiti.version}</version>
- </dependency>
- <dependency>
- <groupId>org.activiti</groupId>
- <artifactId>activiti-explorer</artifactId>
- <version>${activiti.version}</version>
- <exclusions>
- <exclusion>
- <groupid>com.vaadin</groupid>
- <artifactid>vaadin</artifactid>
- </exclusion>
- <exclusion>
- <groupid>org.vaadin.addons</groupid>
- <artifactid>dcharts-widget</artifactid>
- </exclusion>
- <exclusion>
- <artifactid>activiti-simple-workflow</artifactid>
- <groupid>org.activiti</groupid>
- </exclusion>
- </exclusions>
- </dependency>
- <!-- 查看流程详细定义 -->
- <dependency>
- <groupId>org.activiti</groupId>
- <artifactId>activiti-diagram-rest</artifactId>
- <version>${activiti.version}</version>
- </dependency>
修改 diagram-viewer\index.html
文件.
如果你打算使用他的流程跟踪的话(建议修改,5.13版本跟踪页面已经支持IE了.不集成还费劲自己搞跟踪图提示呢?)
只需要使用5.13的
jstools.js
ProcessDiagramCanvas.js
在 \modules\activiti-webapp-explorer2\src\main\webapp\diagram-viewer\js 下
这两个js 替换 5.12.1的同名js即可
OK编译,clean 下载jar. ....
里面的spring版本替换成你自己的版本
OK了. 至此,集成到项目中也就完成了.
是否要测试下?
启动
访问:
http://localhost:8080/YouPRJ/modeler/service/editor?id=2050
2050 替换成自己的流程部署文件id
OK可以直接编辑. 保存.
=======================================================================
以上是嵌入部署.
下面是独立部署. 你也可以直接使用官方的activiti-explorer (呵呵.有点大.多余功能用不上)
这个是我从explorer里面分离出来的 单独modeler模块. (maven-eclipse工程)
https://github.com/izerui/activiti-modeler
可以打包war包.跟你的项目放同一个web容器中.即可使用
http://localhost:8080/activiti-modeler/modeler/service/editor?id=2050
直接设计保存到数据库.
哦忘了. 前提你要修改数据库连接.哈哈
OK 了. 至此 activiti-modeler 嵌入式部署. 和独立式部署 都完成了.
建议:
使用独立部署方式. 只是在你的web容器中多了一个activiti-modeler.war而已.
效果你可以使用iframe.因为在同域下. 其实跟嵌入式都一样的.
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 集成新版(5.17+)Activiti Modeler与Rest服务
声明: 此教程适合Activiti 5.17版本。本博客所涉及的内容均可在kft-activiti-demo中找到。在线demo可以访问 http://demo.kafeitu.me:8080/kft-activiti-demo 菜单路径:管理模块 -> 流程管理 -> 模型工作区,可以『创建』或者『编辑』模…...
2024/5/7 16:14:17 - springmvc4.1整合activity流程
Springmvc整合activity的步骤和遇到的问题总结 1、引入相关的maven依赖包 1.1Jackson 主要作用的使用ObjectMapper组装和返回json格式的数据 <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations&…...
2024/5/8 0:35:40 - 西安整形医院哪家做双眼皮好
...
2024/4/21 13:21:44 - ArcGIS API for JavaScript 4.2学习笔记[5] 官方API大章节概述与内容转译
内容如上,截图自ESRI官网,连接:ArcGIS API for JavaScript 4.2(可能会跳转到4.3或者更高最新版本,如果有需要,到CSDN可以下载到4.2的离线文档) 【Get Started】 类似于绪论一样的东西࿰…...
2024/4/21 13:21:42 - 设置编辑区域和控制台字体(附:翻译)
File>Settings>Font(字体)>Editor Font Primary font:DialogInput (对话框输入,字体改为这个比较整齐)。 点击Console Font,可修改控制台字体。 页面翻译: Editor Font>编辑器字体 Show only monospaced fonts>只显示等间距字体 Re…...
2024/5/7 21:49:02 - JavaScript学习总结(二)——延迟对象、跨域、模板引擎、弹出层、AJAX示例
一、AJAX示例 AJAX全称为“Asynchronous JavaScript And XML”(异步JavaScript和XML) 是指一种创建交互式网页应用的开发技术、改善用户体验,实现无刷新效果。 1.1、优点 不需要插件支持 优秀的用户体验 提高Web程序的性能 减轻服务器和带宽的…...
2024/4/21 13:21:41 - 前端桌面应用程序_前端应用程序的性能指标
前端桌面应用程序The web has become an integral part of our daily lives. According to CreditLoan, an average user would spend 7.6 hours online and spend around 20% of their time surfing the web. You can only imagine the extent of the numbers right now, when…...
2024/5/8 1:06:17 - JavaScript学习笔记(一)——延迟对象、跨域、模板引擎、弹出层、AJAX示例
一、AJAX示例 AJAX全称为“Asynchronous JavaScript And XML”(异步JavaScript和XML) 是指一种创建交互式网页应用的开发技术、改善用户体验,实现无刷新效果。 1.1、优点 不需要插件支持 优秀的用户体验 提高Web程序的性能 减轻服务器和带宽的…...
2024/4/21 13:21:38 - typescript项目_如何设置TypeScript项目
typescript项目by David Piepgrass由David Piepgrass 如何设置TypeScript项目 (How to set up a TypeScript project) 适用于使用React制作Web应用程序的初学者的全面指南 (A thorough guide for beginners making web apps with React) In all my years as a developer, I’v…...
2024/4/21 13:21:37 - 眼皮松弛适合做哪种双眼皮呢
...
2024/4/22 14:58:01 - 眼皮松弛可以全切双眼皮吗
...
2024/4/21 13:21:35 - 双眼皮手术插完线什么样
...
2024/4/26 19:49:08 - 割双眼皮有几种方法0
...
2024/5/7 0:42:10 - 抚顺美神双眼皮怎么样
...
2024/5/7 1:48:29 - 夺命雷公狗—angularjs—24—extend继承对象
我们的angularjs中也是给我们留下了方法来做继承的,那么他就是传授中的extend。。。 不过要如下所示,第二个参数是继承到第一个对象里面的。。。 <!DOCTYPE html> <html lang"en" ng-app"myapp"> <head><meta …...
2024/5/7 7:04:38 - 正规做双眼皮流程
...
2024/5/6 22:04:18 - 割双眼皮现在有几种方法
...
2024/4/20 1:17:16 - angular2的ngfor和ngif指令嵌套
ng2 结构指令不能直接嵌套使用,可使用标签来包裹指令 示例如下 <ul> <ng-container *ngFor"let item of lists"> <div class"thumb p-date" *ngIf"item.picurl"> <a href"# "><img src"{{item.picu…...
2024/4/20 15:59:34 - Angular 的 ngIf 和 NgIf 有何区别
在Angular官方文档里,可以看到ngIf和NgIf这两种拼写混杂使用。 NgIf 指的是指令类; ngIf 指的是指令的属性名称。 指令类以 UpperCamelCase (NgIf) 拼写。 指令的属性名称以lowerCamelCase (ngIf) 拼写。 官方文档在讨论其属性和指令的作用时引用了指…...
2024/5/7 8:50:33 - 三点粘合双眼皮眼综合术后吃什么
...
2024/4/21 13:21:30
最新文章
- C语言栈的含义与栈数据操作代码详解!
引言:在本篇博客中,我们将学到数据结构——栈,讲到栈的含义与关于栈的数据操作代码。栈可以在顺序表、双向链表以及单链表的基础上实现,而于本篇博客中,我们选择在顺序表的基础上实现栈。 更多有关C语言和数据结构知识…...
2024/5/8 2:28:45 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/5/7 10:36:02 - C语言 获取系统时间
获取系统时间的函数 #define _TIMEBUFLEN (40) // 获取日志缓冲需要的大小 void GetSysTime(char* pTimeBuf, u32 dwSize) {if (pTimeBuf NULL){return;} #if defined(_MSC_VER)SYSTEMTIME sys { 0 };GetLocalTime(&sys);sprintf_s(pTimeBuf, dwSize, "%4d-%02d-%0…...
2024/5/7 16:09:01 - 解决npm install安装node-sass包容易失败的问题
具体问题如下: npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resolving: XXX3.4.0 npm ERR! Found: webpack5.31.2 npm ERR! node_modules/webpack npm ERR! peer webpack”^4.0.0 || ^5.0.0″ from html-…...
2024/5/6 13:31:08 - 字符串匹配算法之BF与KMP算法
目录 BF算法(暴力匹配算法) KMP算法 核心思想: next数组 next数组的优化 BF算法(暴力匹配算法) #include <assert.h> int BF(const char* str, const char* sub) {assert(str ! NULL && sub ! NULL);if (str NULL || sub NULL){return -1;}int…...
2024/5/4 9:41:01 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/5/7 5:50:09 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/5/7 9:45:25 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/5/4 23:54:56 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/5/7 14:25:14 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/5/4 23:54:56 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/5/4 23:55:05 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/5/4 23:54:56 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/5/7 11:36:39 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/5/4 23:54:56 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/5/6 1:40:42 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/5/4 23:54:56 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/5/4 23:55:17 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/5/7 9:26:26 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/5/4 23:54:56 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/5/4 23:55:06 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/5/5 8:13:33 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/5/4 23:55:16 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/5/4 23:54:58 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/5/6 21:42:42 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/5/4 23:54:56 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57