技术标签: spring java activiti mysql 大数据
点击关注公众号,利用碎片时间学习
工作流(Workflow),就是通过计算机对业务流程自动化执行管理。它主要解决的是“使在多个参与者之间按照某种预定义的规则自动进行传递文档、信息或任务的过程,从而实现某个预期的业务目标,或者促使此目标的实现”。
具有工作流程功能的软件系统。用于更好的管理业务流程。
比如,消费品行业,制造业,电信服务业,银证险等金融服务业,物流服务业,物业服务业,物业管理,大中型进出口贸易公司,政府事业机构,研究院所及教育服务业等,特别是大的跨国企业和集团公司。
具体场景,凡是涉及到业务流程的所有场景
关键业务流程:订单、报价处理、合同审核、客户电话处理、供应链管理等
行政管理类:出差申请、加班申请、请假申请、用车申请、各种办公用品申请、购买申请、日报周报等凡是原来手工流转处理的行政表单。
人事管理类:员工培训安排、绩效考评、职位变动处理、员工档案信息管理等。
财务相关类:付款请求、应收款处理、日常报销处理、出差报销、预算和计划申请等。
客户服务类:客户信息管理、客户投诉、请求处理、售后服务管理等。
目前常见的工作流程有两种方式:
通过状态字段实现流程控制。原始,适合简单流程控制。
工作流引擎实现流程控制。适用场景更广泛,扩展性更好。
Activiti牛批之处在于,它在不改变代码的前提下实现各种业务流程的管理,适用性,扩展性很优秀。
activiti通过创建流程实例引擎,可以实现不同流程的流转,通过不断读取创建的流程节点实现流程流转。
Activiti 是一个工作流引擎, activiti 可以将业务系统中复杂的业务流程抽取出来,使用专门的建模语言(BPMN2.0)进行定义,业务系统按照预先定义的流程进行执行,实现了业务系统的业务流程由 activiti 进行管理,减少业务系统由于流程变更进行系统升级改造的工作量,从而提高系统的健壮性,同时也减少了系统开发维护成本。
当然这里还有一些小故事,Alfresco 软件在 2010 年 5 月 17 日宣布 Activiti 业务流程管理(BPM)开源项目的正式启动, 其首席架构师由业务流程管理 BPM 的专家 Tom Baeyens 担任, Tom Baeyens 就是原来 jbpm 的架构师,而 jbpm 是一个非常有名的工作流引擎,当然 activiti 也是一个工作流引擎。
官方网站:https://www.activiti.org/
下边介绍三个名词概念,就不长篇大论了,简单总结下。
BPM:BPM(Business Process Management),即业务流程管理。
BPM系统:那就是业务流程管理的系统。
BPMN,这个比较噢重要,多说两句,具体往下看。
BPMN(Business Process Model And Notation) - 业务流程模型和符号 是由 BPMI(BusinessProcess Management Initiative)开发的一套标准的业务流程建模符号,使用 BPMN 提供的符号可以创建业务流程。
总结来说就是用来建模业务流程的标准规则,一个个符号!
一般情况下都是通过创建BPMN进行业务流程建模,两种方式,idea插件或者eclipse插件,通过符号创建流程。
在 IDEA 的 File 菜单中找到子菜单”Settings”,后面我们再选择左侧的“plugins”菜单,如下图所示
CREATE DATABASE activiti DEFAULT CHARACTER SET utf8;
创建Maven工程
加入依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.activiti.demo</groupId>
<artifactId>activiti_demo</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 定义统一版本 -->
<properties>
<slf4j.version>1.6.6</slf4j.version>
<log4j.version>1.2.12</log4j.version>
</properties>
<dependencies>
<!-- 引入依赖activiti -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>7.0.0.Beta1</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>7.0.0.Beta1</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-model</artifactId>
<version>7.0.0.Beta1</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-converter</artifactId>
<version>7.0.0.Beta1</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-json-converter</artifactId>
<version>7.0.0.Beta1</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-layout</artifactId>
<version>7.0.0.Beta1</version>
</dependency>
<dependency>
<groupId>org.activiti.cloud</groupId>
<artifactId>activiti-cloud-services-api</artifactId>
<version>7.0.0.Beta1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!-- log start -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- log end -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>alfresco</id>
<name>Activiti Releases</name>
<url>https://artifacts.alfresco.com/nexus/content/repositories/activiti-releases/</url>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
</project>
配置日志
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE
# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:/axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
配置activity.cfg.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:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/contex http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--数据源配置dbcp-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/activiti"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<!--activiti单独运行的ProcessEngine配置对象(processEngineConfiguration),使用单独启动方式
默认情况下:bean的id=processEngineConfiguration
-->
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<!--代表数据源-->
<property name="dataSource" ref="dataSource"></property>
<!--
关于 processEngineConfiguration 中的 databaseSchemaUpdate 参数, 通过此参数设计 activiti
数据表的处理策略,参数如下:
false(默认):检查数据库表的版本和依赖库的版本, 如果版本不匹配就抛出异常。
true: 构建流程引擎时,执行检查,如果需要就执行更新。 如果表不存在,就创建。
create-drop: 构建流程引擎时创建数据库表, 关闭流程引擎时删除这些表。
drop-create:先删除表再创建表。
create: 构建流程引擎时创建数据库表, 关闭流程引擎时不删除这些表。
-->
<!--代表是否生成表结构-->
<property name="databaseSchemaUpdate" value="true"/>
</bean>
</beans>
编写代码
/**
* Activiti初始化25张表
* 执行的是activiti-engine-7.0.0.Beta1.jar包下对应不同内置好的sql语句
* org\activiti\db\drop\activiti.db2.drop.engine.sql
*
* @author zrj
* @date 2020/12/29
* @since V1.0
**/
public class ActivitiInit {
/**
* 方式一
*/
@Test
public void GenActivitiTables() {
// 1.创建ProcessEngineConfiguration对象。第一个参数:配置文件名称;第二个参数:processEngineConfiguration的bean的id
ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource( "activiti.cfg.xml", "processEngineConfiguration" );
// 2.创建ProcessEngine对象
ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine();
// 3.输出processEngine对象
System.out.println( processEngine );
}
/**
* 方式二
*/
@Test
public void GenActivitiTables2() {
//条件:1.activiti配置文件名称:activiti.cfg.xml 2.bean的id="processEngineConfiguration"
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
System.out.println( processEngine );
}
}
执行上边的代码。
Activiti 的表都以 ACT_开头。第二部分是表示表的用途的两个字母标识。用途也和服务的 API 对应。
ACT_RE_*
: 'RE'表示 repository
。这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。
ACT_RU_*
: 'RU'表示 runtime
。这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。Activiti 只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。这样运行时表可以一直很小速度很快。
ACT_HI_*
: 'HI'表示 history
。这些表包含历史数据,比如历史流程实例, 变量,任务等等。
ACT_GE_*
: 'GE'表示 general
。通用数据, 用于不同场景下
activiti 的引擎配置文件,包括:ProcessEngineConfiguration
的定义、数据源定义、事务管理器等,此文件其实就是一个 spring 配置文件,下面是一个基本的配置只配置了 ProcessEngineConfiguration
和数据源。
流程引擎的配置类,通过 ProcessEngineConfiguration
可以创建工作流引擎 ProceccEngine
,常用的两种方法。
工作流引擎,相当于一个门面接口,通过 ProcessEngineConfiguration
创建 processEngine
,通过ProcessEngine
创建各个 service 接口。
通过 ProcessEngine
创建 Service, Service 是工作流引擎提供用于进行工作流部署、执行、管理的服务接口。
流程定义是线下按照 bpmn2.0 标准去描述 业务流程,通常使用 activiti-explorer
(web 控制台)或 activiti-eclipse-designer
插件对业务流程进行建模,这两种方式都遵循 bpmn2.0 标准。本教程使用activiti-eclipse-designer
插件完成流程建模。使用 designer 设计器绘制流程,会生成两个文件:.bpmn
和.png
Palette(画板)
在 eclipse 或 idea 中安装 activiti-designer
插件即可使用,画板中包括以下结点:
Connection—连接
Event---事件
Task---任务
Gateway---网关
Container—容器
Boundary event—边界事件
Intermediate event- -中间事件
流程图设计完毕保存生成.bpmn 文件
idea创建bpmn
第一步:将 holiday.bpmn 文件改为扩展名 xml 的文件名称:holiday.xml
第二步:在 holiday.xml 文件上面,点右键并选择 Diagrams 菜单,再选择 Show BPMN2.0 Designe
第三步:打开后的效果图如下:
打开如下窗口,注意填写文件名及扩展名,选择好保存图片的位置:
第五步:中文乱码的解决
打开 IDEA 安装路径,找到如下的安装目录
根据自己所安装的版本来决定,我使用的是 64 位的 idea,所以在 idea64.exe.vmoptions
文件的最后一行追加一条命令:-Dfile.encoding=UTF-8
如下所示
一定注意,不要有空格,否则重启 IDEA 时会打不开,然后 重启 IDEA,把原来的 png 图片删掉,再重新生成,即可解决乱码问题
将线下定义的流程部署到 activiti 数据库中,这就是流程定义部署,通过调用 activiti 的 api 将流程定义的 bpmn 和 png 两个文件一个一个添加部署到 activiti 中,也可以将两个文件打成 zip 包进行部署。
分别将 bpmn 文件和 png 图片文件部署
/**
* 流程定义的部署
* activiti表有哪些?
* act_re_deployment 部署信息
* act_re_procdef 流程定义的一些信息
* act_ge_bytearray 流程定义的bpmn文件及png文件
*
* @author zrj
* @date 2020/12/29
* @since V1.0
**/
public class ActivitiDeployment {
/**
* 方式一
* 分别将 bpmn 文件和 png 图片文件部署
*/
@Test
public void activitiDeploymentTest() {
//1.创建ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2.得到RepositoryService实例
RepositoryService repositoryService = processEngine.getRepositoryService();
//3.进行部署
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource( "diagram/holiday.bpmn" )
.addClasspathResource( "diagram/holiday.png" )
.name( "请假申请单流程" )
.deploy();
//4.输出部署的一些信息
System.out.println( deployment.getName() );
System.out.println( deployment.getId() );
}
/**
* 方式二
* 将 holiday.bpmn 和 holiday.png 压缩成 zip 包
*/
@Test
public void activitiDeploymentTest2() {
//1.创建ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2.得到RepositoryService实例
RepositoryService repositoryService = processEngine.getRepositoryService();
//3.转化出ZipInputStream流对象
InputStream is = ActivitiDeployment.class.getClassLoader().getResourceAsStream( "diagram/holidayBPMN.zip" );
//将 inputstream流转化为ZipInputStream流
ZipInputStream zipInputStream = new ZipInputStream( is );
//3.进行部署
Deployment deployment = repositoryService.createDeployment()
.addZipInputStream( zipInputStream )
.name( "请假申请单流程" )
.deploy();
//4.输出部署的一些信息
System.out.println( deployment.getName() );
System.out.println( deployment.getId() );
}
}
操作数据表
-- activiti表有哪些?
-- 部署信息
select * from act_re_deployment ;
-- 流程定义的一些信息
select * from act_re_procdef;
-- 流程定义的bpmn文件及png文件
select * from act_ge_bytearray;
/**
* 启动流程实例:
* 前提是先已经完成流程定义的部署工作
* 背后影响的表:
* act_hi_actinst 已完成的活动信息
* act_hi_identitylink 参与者信息
* act_hi_procinst 流程实例
* act_hi_taskinst 任务实例
* act_ru_execution 执行表
* act_ru_identitylink 参与者信息
* act_ru_task 任务
*
* @author zrj
* @date 2020/12/29
* @since V1.0
**/
public class ActivitiStartInstance {
public static void main(String[] args) {
//1.得到ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2.得到RunService对象
RuntimeService runtimeService = processEngine.getRuntimeService();
//3.创建流程实例 流程定义的key需要知道 holiday
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey( "holiday" );
//4.输出实例的相关信息
System.out.println( "流程部署ID" + processInstance.getDeploymentId() );
System.out.println( "流程定义ID" + processInstance.getProcessDefinitionId() );
System.out.println( "流程实例ID" + processInstance.getId() );
System.out.println( "活动ID" + processInstance.getActivityId() );
}
}
/**
* 流程定义查询
*
* @author zrj
* @date 2020/12/29
* @since V1.0
**/
public class QueryProceccDefinition {
@Test
public void queryProceccDefinition() {
// 流程定义key
String processDefinitionKey = "holiday";
//1.得到ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取repositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
// 查询流程定义
ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
//遍历查询结果
List<ProcessDefinition> list = processDefinitionQuery
.processDefinitionKey( processDefinitionKey )
.orderByProcessDefinitionVersion().desc().list();
for (ProcessDefinition processDefinition : list) {
System.out.println( "------------------------" );
System.out.println( " 流 程 部 署 id : " + processDefinition.getDeploymentId() );
System.out.println( "流程定义id: " + processDefinition.getId() );
System.out.println( "流程定义名称: " + processDefinition.getName() );
System.out.println( "流程定义key: " + processDefinition.getKey() );
System.out.println( "流程定义版本: " + processDefinition.getVersion() );
}
}
}
/**
* 删除指定流程id的流程
*/
public void deleteDeployment() {
// 流程部署id
String deploymentId = "8801";
//1.得到ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 通过流程引擎获取repositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
//删除流程定义, 如果该流程定义已有流程实例启动则删除时出错
repositoryService.deleteDeployment( deploymentId );
//设置true 级联删除流程定义,即使该流程有流程实例启动也可以删除,设
//置为false非级别删除方式,如果流程
repositoryService.deleteDeployment( deploymentId, true );
}
/**
* 获取资源
*/
@Test
public void getProcessResources() throws IOException {
// 流程定义id
String processDefinitionId = "";
//1.得到ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取repositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
// 流程定义对象
ProcessDefinition processDefinition = repositoryService
.createProcessDefinitionQuery()
.processDefinitionId( processDefinitionId ).singleResult();
//获取bpmn
String resource_bpmn = processDefinition.getResourceName();
//获取png
String resource_png = processDefinition.getDiagramResourceName();
// 资源信息
System.out.println( "bpmn: " + resource_bpmn );
System.out.println( "png: " + resource_png );
File file_png = new File( "d:/purchasingflow01.png" );
File file_bpmn = new File( "d:/purchasingflow01.bpmn" );
// 输出bpmn
InputStream resourceAsStream = null;
resourceAsStream = repositoryService.getResourceAsStream( processDefinition.getDeploymentId(), resource_bpmn );
FileOutputStream fileOutputStream = new FileOutputStream( file_bpmn );
byte[] b = new byte[1024];
int len = -1;
while ((len = resourceAsStream.read( b, 0, 1024 )) != -1) {
fileOutputStream.write( b, 0, len );
}
// 输出图片
resourceAsStream = repositoryService.getResourceAsStream( processDefinition.getDeploymentId(), resource_png );
fileOutputStream = new FileOutputStream( file_png );
// byte[] b = new byte[1024];
// int len = -1;
while ((len = resourceAsStream.read( b, 0, 1024 )) != -1) {
fileOutputStream.write( b, 0, len );
}
}
推荐:
最全的java面试题库
PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。点“在看”支持我们吧!
文章浏览阅读9次。1网页简介:此作品为学生个人主页网页设计题材,学生个人单页面网页作业 学生网页设计成品 静态HTML网页单页制作 dreamweaver网页设计与制作代码 web前端期末大作业2.网页编辑等任意html编辑软件进行运行及修改编辑等操作)。3.知识应用:技术方面主要应用了网页知识中的: Div+CSS、鼠标滑过特效、Table、导航栏效果、Banner、表单、二级三级页面等,视频、 音频元素 、Flash,同时设计了Logo(源文件)所需的知识点。一套合格的网页应该包含(具体可根据个人要求而定)...
文章浏览阅读4.2k次,点赞4次,收藏34次。纵横CW大鹏无人机地面站航线规划方法_纵横地面站
文章浏览阅读1k次。`chgrp` 是一个 Linux 命令,用于更改文件或目录的群组所有权。该命令的名称来源于 "change group" 的缩写。_chgrp
文章浏览阅读1.3k次,点赞2次,收藏8次。数据集链接:http://m6z.cn/5AsmXB本数据集共有 1224 张图像来自四个公共图像数据集:COCO、VOC07、ImageNet 和 SUN。Amazon Mechanic Turk 工作人员将每个图像标记为包含 0、1、2、3 或 4 个以上的显着对象。可以在imgIdx.mat中找到此标签信息以及边界框注释,一个存储图像信息的matlab结构数组。MSO 数据集是 SOS 数据集测试集的子集。波士顿大学的团队删除了一些显着对象严重重叠或者对于标记指定数量的显着对象不明确的图像。因此,在来_开源目标检测数据集
文章浏览阅读1.9k次。王爽《汇编语言》实验17——编写包含多个功能子程序的中断例程安装一个新的 int 7ch 中断例程,用逻辑扇区号对软盘进行读写_汇编语言实验17
文章浏览阅读4.1k次。文章目录交易理念 :游资、私募的超短线投资理念1、操作理念2、操作背景2、操作方式交易理念 :游资、私募的超短线投资理念1、操作理念一、强者恒强个股的强势必然通过强劲的走势得以体现,因此敢于在次日买入前一日率先涨停的个股二、持股时间越短,风险越小因此从风险的角度看,降低风险的有效方法就是最大程度减小持股时间三、把所有注意力集中在强势超短线上注意力集中才能获得最好的操作效果,因此只关注自身炒作领域里面所买卖股票的涨跌即可2、操作背景一、市场短期内将要走强,或者某些重要事件和消息对相_私募能做超短吗
文章浏览阅读9.1k次,点赞4次,收藏11次。错误样式:'utf8' codec can't decode byte 0xc0 in position 0: invalid start byte错误原因:报这个错误提示的意思我理解的是存在中文无法解读,因为我没有输入中文,所有推测可能是当前用户的user文件夹为中文用户所拥有,在访问一些文件时存在中文的路径无法访问,很多的应用都是这样,不支持访问中文路径,这个算是一个比较常见的一个报错..._utf-8' codec can't decode byte 0xc0 in position 0: invalid start byte
文章浏览阅读3.3k次,点赞3次,收藏23次。大家好,今天给大家分享一下明哥整理的一篇 Python 参数的内容,内容非常的干,全文通过案例的形式来理解知识点,自认为比网上 80% 的文章讲的都要明白,如果你是入门不久的 python 新手,相信本篇文章应该对你会有不小的帮助。接下来是正文。_**表示可变参数,通常使用**kw
文章浏览阅读4.3k次,点赞6次,收藏6次。 他妈的,真是服了,这个破问题竟然困了我好几个小时。一直在网上找没有相关的教程,又不想花太多时间翻墙,只好自己摸索这样子。 一个一个问题的排除,查看日志,都没有找到问题所在。 我都怀疑是不是软件问题,或者其他什么的了。 哎,也怪自己上课不认真吧,自己给自己挖了一个坑。 在此记录一下。 (但是说实话这里还是比较容易出错的,尤其对于那些自己为很聪明的人来说,哈哈哈)。 我..._idea中点击apply没有反应
文章浏览阅读60次。1、前端如何选择图片的格式?2、解释一下 浏览器的标准模式和怪异模式 (混杂模式)3、简述从输入网址到页面显示的整个过程
文章浏览阅读1.4k次。// EC_Class.h: interface for the EC_Class class.////////////////////////////////////////////////////////////////////////#if !defined(AFX_EC_CLASS_H__360A35F7_DB6B_4390_810E_FFEF59954245__INC_ec class
寄存器r0 - r12是ARM处理器中用于存储临时数据、函数参数和返回值的通用寄存器,都是32位的。r13-r15则分别用于存储栈指针(SP)、链接寄存器(LR)和程序计数器(PC)。