一:activiti 入门

作者:fenng 商丘

工作流(Workflow)

就是业务过程的部分或整体在计算机应用环境下的自动化
主要解决的是“使在多个参与者之间按照某种定义的规则传递文档,信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现”

工作流管理系统(WFMS)

是一个软件系统,它完成工作量的定义和管理,并按照在系统中预先定义好的工作流规则进行工作流实例的执行。工作流管理系统不是企业的业务系统,而是为企业的业务系统的运行提供了一个软件的支撑环境

工作流管理系统的目标

管理工作的流程以确保工作在正确的时间被期望的人员所执行——在自动化进行的业务过程中插入人工的执行和干预

Activiti 介绍

Activiti5 是由 Alfresco 软件在 2010 年 5 月 17 日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。Activiti 基于 Apache 许可的开源 BPM 平台,创始人 Tom Baeyens 是 JBoss jBPM 的项目架构师,它特色是提供了 eclipse 插件,开发人员可以通过插件直接绘画出业务

工作流引擎

ProcessEngine 对象,这是 Activiti 工作的核心。负责生成流程运行时的各种实例及数据、监控和管理流程的运行。

BPMN

业务流程建模与标注(Business Process Model and Notation,BPMN) ,描述流程的基本符号,包括这些图元如何组合成一个业务流程图(Business Process Diagram)

核心配置文件

```{bash}

activiti.cfg.xml

  1 xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"
2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
4 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
5 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
6

看到这里不得不感叹一下 spring 的强大,整合了 java 半壁江山

数据库

初始化数据库
方法一:

  1 //创建工作流需要的数据库
2 @Test
3 public void createTable(){
4 ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
5 configuration.setJdbcDriver("com.mysql.jdbc.Driver");
6 configuration.setJdbcUrl("jdbc:mysql://localhost:3306/activiti");
7 configuration.setJdbcUsername("root");
8 configuration.setJdbcPassword("12345678");
9
10 /**
11 public static final String DB_SCHEMA_UPDATE_FALSE = "false";不能自动创建表,需要表存在
12 public static final String DB_SCHEMA_UPDATE_CREATE_DROP = "create-drop";先删除表再创建表
13 public static final String DB_SCHEMA_UPDATE_TRUE = "true";如果表不存在,自动创建表
14 */
15 configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
16 //工作流的核心对象,ProcessEnginee对象
17 ProcessEngine processEngine = configuration.buildProcessEngine();
18 System.out.println("processEngine:"+processEngine);
19 }

方法二: 由于方法一要有代码比较麻烦,所以有配置文件替代:
activiti.cfg.xml

  1 xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
4 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
5 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
6
7
8
9
  1 /**使用配置文件创建工作流需要的23张表*/
2 @Test
3 public void createTable_2(){
4 // ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
5 // //工作流的核心对象,ProcessEnginee对象
6 // ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine();
7
8 ProcessEngine processEngine = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml") //
9 .buildProcessEngine();
10 System.out.println("processEngine:"+processEngine);
11 }

Activiti 用来存放流程数据一共使用了 23 张表 都是以 Act_ 开头的 底层操作使用的 mybatis 操作

工作流 Activiti 的表是用来存储流程数据的 而业务数据都需要用户自己创建和维护 一定要让业务去关联流程 才能关联工作流系统

API

流程引擎 ProcessEngine 对象
在 Activiti 中最核心的类,其他的类都是由他而来。
由流程引擎 ProcessEngine 对象创建各个 Service, 这些 Service 是调用工作流 23 张表的服务

RepositoryService 管理流程定义
RuntimeService 执行管理,包括启动,推进,删除流程实例等操作
TaskService 任务管理

HistoryService 历史管理(执行完的数据的管理)
IdentityService 组织机构管理
FormService 一个可选服务,任务表单管理
ManagerService

流程的执行过程
  1 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
2 /**部署流程定义*/
3 @Test
4 public void deploymentProcessDefinition(){
5
6 Deployment deployment = processEngine.getRepositoryService()//与流程定义和部署对象相关的Service
7 .createDeployment()//创建一个部署对象
8 .name("helloworld入门程序")//添加部署的名称
9 .addClasspathResource("diagrams/helloworld.bpmn")//从classpath的资源中加载,一次只能加载一个文件
10 .addClasspathResource("diagrams/helloworld.png")//从classpath的资源中加载,一次只能加载一个文件
11 .deploy();//完成部署
12 System.out.println("部署ID:"+deployment.getId());//1
13 System.out.println("部署名称:"+deployment.getName());//helloworld入门程序
14 }
15 /**启动流程实例*/
16 @Test
17 public void startProcessInstance(){
18 //流程定义的key
19 String processDefinitionKey = "helloword";
20 ProcessInstance pi = processEngine.getRuntimeService()//与正在执行的流程实例和执行对象相关的Service
21 .startProcessInstanceByKey(processDefinitionKey);//使用流程定义的key启动流程实例,key对应helloworld.bpmn文件中id的属性值,使用key值启动,默认是按照最新版本的流程定义启动
22 System.out.println("流程实例ID:"+pi.getId());//流程实例ID 101
23 System.out.println("流程定义ID:"+pi.getProcessDefinitionId());//流程定义ID helloworld:1:4
24 }
25
26 /**查询当前人的个人任务*/
27 @Test
28 public void findMyPersonalTask(){
29 String assignee = "张三";
30 List list = processEngine.getTaskService()//与正在执行的任务管理相关的Service
31 .createTaskQuery()//创建任务查询对象
32 .taskAssignee(assignee)//指定个人任务查询,指定办理人
33 .list();
34 if(list!=null && list.size()>0){
35 for(Task task:list){
36 System.out.println("任务ID:"+task.getId());
37 System.out.println("任务名称:"+task.getName());
38 System.out.println("任务的创建时间:"+task.getCreateTime());
39 System.out.println("任务的办理人:"+task.getAssignee());
40 System.out.println("流程实例ID:"+task.getProcessInstanceId());
41 System.out.println("执行对象ID:"+task.getExecutionId());
42 System.out.println("流程定义ID:"+task.getProcessDefinitionId());
43 System.out.println("########################################################");
44 }
45 }
46 }
47
48 /**完成我的任务*/
49 @Test
50 public void completeMyPersonalTask(){
51 //任务ID
52 String taskId = "204";
53 processEngine.getTaskService()//与正在执行的任务管理相关的Service
54 .complete(taskId);
55 System.out.println("完成任务:任务ID:"+taskId);
56 }

二:Activiti 数据库表结构

1:简单概述:

  1 /*
2 Execution 执行对象
3 按流程定义的规则执行一次的过程.
4 对应的表:
5 act_ru_execution: 正在执行的信息
6 act_hi_procinst:已经执行完的历史流程实例信息
7 act_hi_actinst:存放历史所有完成的活动
8 ProcessInstance 流程实例
9 特指流程从开始到结束的那个最大的执行分支,一个执行的流程中,流程实例只有 1 个。
10 注意
11 (1)如果是单例流程,执行对象 ID 就是流程实例 ID
12 (2)如果一个流程有分支和聚合,那么执行对象 ID 和流程实例 ID 就不相同
13 (3)一个流程中,流程实例只有 1 个,执行对象可以存在多个。
14 Task 任务
15 执行到某任务环节时生成的任务信息。
16 对应的表:
17 act_ru_task:正在执行的任务信息
18 act_hi_taskinst:已经执行完的历史任务信息
19
20 */

2:activiti5.13 框架 数据库设计说明书

作者:liangjunjie

1、结构设计

1.1、    逻辑结构设计

Activiti 使用到的表都是 ACT_ 开头的。

ACTRE:

’RE’表示 repository(存储),RepositoryService 接口所操作的表。带此前缀的表包含的是静态信息,如,流程定义,流程的资源(图片,规则等)。


ACTRU
:

‘RU’表示 runtime,运行时表 -RuntimeService。这是运行时的表存储着流程变量,用户任务,变量,职责(job)等运行时的数据。Activiti 只存储实例执行期间的运行时数据,当流程实例结束时,将删除这些记录。这就保证了这些运行时的表小且快。

ACTID:

’ID’表示 identity (组织机构),IdentityService 接口所操作的表。用户记录,流程中使用到的用户和组。这些表包含标识的信息,如用户,用户组,等等。


ACTHI
:

’HI’表示 history,历史数据表,HistoryService。就是这些表包含着流程执行的历史相关数据,如结束的流程实例,变量,任务,等等

ACTGE:

全局通用数据及设置 (general),各种情况都使用的数据。


1.2、    所有表的含义


序号 表名 说明
1 act_ge_bytearray 二进制数据表
2 act_ge_property 属性数据表存储整个流程引擎级别的数据,
初始化表结构时,会默认插入三条记录,
3 act_hi_actinst 历史节点表
4 act_hi_attachment 历史附件表
5 act_hi_comment 历史意见表
6 act_hi_identitylink 历史流程人员表
7 act_hi_detail 历史详情表,提供历史变量的查询
8 act_hi_procinst 历史流程实例表
9 act_hi_taskinst 历史任务实例表
10 act_hi_varinst 历史变量表
11 act_id_group 用户组信息表
12 act_id_info 用户扩展信息表
13 act_id_membership 用户与用户组对应信息表
14 act_id_user 用户信息表
15 act_re_deployment 部署信息表
16  act_re_model 流程设计模型部署表
17 act_re_procdef 流程定义数据表
18 act_ru_event_subscr throwEvent、catchEvent 时间监听信息表
19 act_ru_execution 运行时流程执行实例表
20 act_ru_identitylink 运行时流程人员表,主要存储任务节点与参与者的相关信息
21 act_ru_job 运行时定时任务数据表
22 act_ru_task 运行时任务节点表
23 act_ru_variable 运行时流程变量数据表


2、   表以及索引信息

   2.1 二进制数据表(act_gebytearray

     2.1.1  简要描述

保存流程定义图片和 xml、Serializable(序列化)的变量, 即保存所有二进制数据,特别注意类路径部署时候,不要把 svn 等隐藏文件或者其他与流程无关的文件也一起部署到该表中,会造成一些错误(可能导致流程定义无法删除)。

    2.1.2  表结构说明

字段名称 字段描述 数据类型 主键 为空 取值说明
ID ID nvarchar(64)   主键 ID
REV 乐观锁 int   Version(版本)
NAME_ 名称 nvarchar(255)   部署的文件名称,如:mail.bpmn、mail.png
、mail.bpmn20.xml
DEPLOYMENTID 部署 ID nvarchar(64)   部署表 ID
BYTES 字节 varbinary(max)   部署文件
GENERATED 是否是引擎生成 tinyint   0 为用户生成 1 为 Activiti 生成

2.1.3  索引说明

索引名称 组成字段名称 索引类型 索引说明
PRIMARY ID_ Unique 主键唯一索引
ACT_FK_BYTEARR_DEPL DEPLOYMENTID    

2.2 属性数据表( act_geproperty )

2.2.1  简要描述

属性数据表。存储整个流程引擎级别的数据。

2.2.2  表结构说明

字段名称 字段描述 数据类型 主键 为空 取值说明
NAME 名称 nvarchar(64)   schema.version
        schema.history
        next.dbid
VALUE_ nvarchar(300)   5
        create(5.*)
REV 乐观锁 int   version

2.2.3  索引说明

索引名称 组成字段名称 索引类型 索引说明
PRIMARY NAME Unique 主键唯一索引
       

2.3 历史节点表(act_hi_actinst

2.3.1  简要描述

  历史活动信息。这里记录流程流转过的所有节点,与 HITASKINST 不同的是,taskinst 只记录 usertask 内容

2.3.2  表结构说明

字段名称 字段描述 数据类型 主键 为空 取值说明
ID ID_ nvarchar(64)    
PROC_DEFID 流程定义 ID nvarchar(64)      
PROC_INSTID 流程实例 ID nvarchar(64)      
EXECUTIONID 执行实例 ID nvarchar(64)      
ACTID 节点 ID nvarchar(225)     节点定义 ID
TASKID 任务实例 ID nvarchar(64)   任务实例 ID 其他节点类型实例 ID 在这里为空
CALL_PROC_INSTID 调用外部的流程实例 ID nvarchar(64)   调用外部流程的流程实例 ID'
ACTNAME 节点名称 nvarchar(225)   节点定义名称
ACTTYPE 节点类型 nvarchar(225)     如 startEvent、userTask
ASSIGNEE_ 签收人 nvarchar(64)   节点签收人
STARTTIME 开始时间 datetime     2013/9/15 11:30
ENDTIME 结束时间 datetime   2013/9/15 11:30
DURATION 耗时 numeric(19,0)   毫秒值

2.3.3  索引说明

索引名称 组成字段名称 索引类型 索引说明
PRIMARY ID Unique 主键唯一索引
ACT_IDX_HI_ACT_INST_START STARTTIME    
ACT_IDX_HI_ACT_INST_END ENDTIME    
ACT_IDX_HI_ACT_INST_PROCINST PROC_INSTID 、
ACTID
   
ACT_IDX_HI_ACT_INST_EXEC EXECUTIONID 、
ACTID
   

2.4 历史附件表( act_hiattachment )

2.4.1  简要描述

  历史附件表。

2.4.2  表结构说明

字段名称 字段描述 数据类型 主键 为空 取值说明
ID ID nvarchar(64)   主键 ID
REV 乐观锁 integer   Version
USERID 用户 ID nvarchar(255)   用户 ID
NAME 名称 nvarchar(255)   附件名称
DESCRIPTION 描述 nvarchar(4000)   描述
TYPE_ 类型 nvarchar(255)   附件类型
TASKID 任务实例 ID nvarchar(64)   节点实例 ID
PROC_INSTID 流程实例 ID nvarchar(64)   流程实例 ID
URL URL nvarchar(4000)   附件地址
CONTENTID 字节表的 ID nvarchar(64)   ACT_GEBYTEARRAY
的 ID

2.4.3  索引说明

索引名称 组成字段名称 索引类型 索引说明
PRIMARY ID Unique 主键唯一索引

2.5 历史意见表( act_hicomment )

2.5.1  简要描述

  历史意见表。

2.5.2  表结构说明

字段名称 字段描述 数据类型 主键 为空 取值说明
ID ID nvarchar(64)   主键 ID
TYPE 类型 nvarchar(255)   类型:event(事件)
        comment(意见)
TIME_ 时间 datetime     填写时间 '
USERID 用户 ID nvarchar(64)   填写人
TASKID 节点任务 ID nvarchar(64)   节点实例 ID
PROC_INSTID 流程实例 ID nvarchar(255)   流程实例 ID
ACTION 行为类型 nvarchar(64)   见备注 1
MESSAGE 基本内容 nvarchar(4000)   用于存放流程产生的信息,比如审批意见
FULLMSG 全部内容 varbinary(max)   附件地址

2.5.3  索引说明

索引名称 组成字段名称 索引类型 索引说明
PRIMARY ID_ Unique 主键唯一索引

2.6 历史详情表( act_hidetail )

2.6.1  简要描述

  历史详情表:流程中产生的变量详细,包括控制流程流转的变量,业务表单中填写的流程需要用到的变量等。

2.6.2  表结构说明

字段名称 字段描述 数据类型 主键 为空 取值说明
ID ID nvarchar(64)   主键
TYPE 类型 nvarchar(255)     见备注 2
PROC_INSTID 流程实例 ID nvarchar(64)   流程实例 ID
EXECUTIONID 执行实例 ID nvarchar(64)   执行实例 ID
TASKID 任务实例 ID nvarchar(64)   任务实例 ID
ACT_INSTID 节点实例 ID nvarchar(64)   ACT_HIACTINST
表的 ID
NAME 名称 nvarchar(255)     名称
VARTYPE 参数类型 nvarchar(255)   见备注 3
REV 乐观锁 int   Version
TIME 时间戳 datetime     创建时间
BYTEARRAYID 字节表 ID nvarchar   ACT_GEBYTEARRAY
表的 ID
DOUBLE DOUBLE double precision   存储变量类型为 Double
LONG LONG numeric   存储变量类型为 long
TEXT TEXT nvarchar   存储变量值类型为 String
TEXT2 TEXT2 nvarchar   此处存储的是 JPA 持久化对象时,才会有值。此值为对象 ID

2.6.3  索引说明

索引名称 组成字段名称 索引类型 索引说明
组成字段名称 索引类型 索引说明
PRIMARY ID Unique 主键唯一索引
ACT_IDX_HI_ACT_INST_START STARTTIME    
ACT_IDX_HI_ACT_INST_END ENDTIME    
ACT_IDX_HI_ACT_INST_PROCINST PROC_INSTID 、
ACTID
   
ACT_IDX_HI_ACT_INST_EXEC EXECUTIONID 、
ACTID
   

2.7 历史流程人员表( act_ruidentitylink )

2.7.1  简要描述

  任务参与者数据表。主要存储历史节点参与者的信息。

2.7.2  表结构说明

字段名称 字段描述 数据类型 主键 为空 取值说明
ID ID nvarchar(64)   ID
GROUPID 组 ID nvarchar(255)   组 ID
TYPE_ 类型 nvarchar(255)   备注 4
USERID 用户 ID nvarchar(255)   用户 ID
TASKID 节点实例 ID nvarchar(64)   节点实例 ID
PROC_INSTID 流程实例 ID nvarchar(64)   流程实例 ID

2.7.3  索引说明

索引名称 组成字段名称 索引类型 索引说明
PRIMARY ID_ Unique 主键唯一索引
ACT_IDX_HI_IDENT_LNK_USER USERID Unique  
ACT_IDX_HI_IDENT_LNK_TASK TASKID    
ACT_IDX_HI_IDENT_LNK_PROCINST PROC_INSTID    

2.8 历史流程实例表(act_hiprocinst

2.8.1  简要描述

  历史流程实例表。

2.8.2  表结构说明

字段名称 字段描述 数据类型 主键 为空 取值说明
ID ID_ nvarchar(64)   主键 ID
PROC_INSTID 流程实例 ID nvarchar(64)     流程实例 ID
BUSINESSKEY 业务主键 nvarchar(255)   业务主键,业务表单的 ID
PROC_DEFID 流程定义 ID nvarchar(64)     流程定义 ID
STARTTIME 开始时间 datetime     开始时间
ENDTIME 结束时间 datetime   结束时间
DURATION_ 耗时 Numeric(19)   耗时
START_USERID 起草人 nvarchar(255)   起草人
START_ACTID 开始节点 ID nvarchar(255)   起草环节 ID
END_ACTID 结束节点 ID nvarchar(255)   结束环节 ID
SUPER_PROCESS_INSTANCEID 父流程实例 ID nvarchar(64)   父流程实例 ID
DELETEREASON 删除原因 nvarchar(4000)   删除原因

2.8.3  索引说明

索引名称 组成字段名称 索引类型 索引说明
PRIMARY ID_ Unique 主键唯一索引
PROC_INSTID PROC_INSTID Unique 外键
ACT_UNIQ_HI_BUS_KEY PROC_DEFID,BUSINESSKEY Unique  
ACT_IDX_HI_PRO_INST_END ENDTIME    
ACT_IDX_HI_PRO_I_BUSKEY BUSINESSKEY    

2.9 历史任务实例表( act_hitaskinst )

2.9.1  简要描述

   历史任务实例表。

2.9.2  表结构说明

activiti 基础的更多相关文章

  1. 推荐csdn里的几篇activiti基础入门及提高的博客

    昨天有个网友加qq询问我有没有非maven搭建的activiti项目的demo,因为我博客中写了一个用maven,我当时没有,于是晚上回家尝试了一下,结果比较容易就实现了. 之后和那个网友聊了一下,他 ...

  2. activiti基础操作

    package activitiTest; import java.io.InputStream; import java.util.List; import java.util.zip.ZipInp ...

  3. activiti基础环境搭建创建数据库表及策略

    博主使用为activiti5.22的版本. 1.创建maven工程. 2.在pom文件中引入所需要的包,如:activiti包.数据库包. 这是我引用的包: <dependencies> ...

  4. activiti 基础搭建

    首先在eclipse内添加activiti的插件,https://blog.csdn.net/qq_22701869/article/details/79537971 1.创建一个maven的java ...

  5. activiti基础--3-----------------------------流程实例

    一.流程实例用到的表: select * from act_ru_execution #正在执行的任务表 select * from act_hi_procinst #流程实例的历史表 select ...

  6. activiti基础--0------------------------------生成23张表

    1.工作流activiti.cfg.xml配置文件 <beans xmlns="http://www.springframework.org/schema/beans" xm ...

  7. activiti基础--1------------------------生成.bpmn和.png以及部署流程定义

    helloworld.dbmn <?xml version="1.0" encoding="UTF-8"?> <definitions xml ...

  8. activiti基础--2----------------------(流程定义)

    Deployment 部署对象 1.一次部署的多个文件信息,对于不需要的流程可以删除和修改 2.对应的表 act_re_deployment #部署对象表 act_re_procdef #流程定义表 ...

  9. Activiti 学习(一)—— Activiti 基础

    工作流概述 在一个公司中,每一项业务的开始和结束,都可以理解为一个工作流,例如,公司的费用报销的基本流程如下: 如图所示的工作流:员工先提出费用报销申请,提交该申请给部门领导,部门领导审批后,再提交给 ...

随机推荐

  1. HTML中的相对路径与绝对路径(转)

    原文地址:http://www.cnblogs.com/heyonggang/archive/2013/03/01/2938984.html 在HTML里只要涉及文件的地方(如超级链接.图片等)就会涉 ...

  2. 解决编译安装php时报错:Please reinstall the iconv library

    编译安装php7时报错“Please reinstall the iconv library”,也就是让重新安装iconv库.但yum安装又提示“No package libiconv availab ...

  3. iptables 代理转发配置

    增加命令 [root@pre /]# iptables -t nat -A PREROUTING -s 39.15.15.15/32 -d 221.11.8.200/32 -p tcp -m tcp ...

  4. SpringBoot使用redis缓存List<Object>

    一.概述 最近在做性能优化,之前有一个业务是这样实现的: 1.温度报警后第三方通讯管理机直接把报警信息保存到数据库 2.我们在数据库中添加触发器,(BEFORE INSERT)根据这条报警信息处理业务 ...

  5. 学习windows编程 day4 之 自定义映射

    LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRU ...

  6. 虚拟机下安装ubuntu后root密码登录失败的问题

    问题描述: 在虚拟机下安装了ubuntu中要输入用户名,一般情况下大家都会输入一个自己的网名或绰号之类的,密码也在这时设置过了. 但是当安装成功之后,使用命令#su root,然后输入刚才设置的密码, ...

  7. 20155302 2016-2017-2 《Java程序设计》第九周学习总结

    20155302 2016-2017-2 <Java程序设计>第九周学习总结 教材学习内容总结 基本数据库操作相关的JDBC接口或类是位于java.sql包中.在程序中要取得数据库联机,我 ...

  8. OpenCV中MAT中数据类型的设置(转)

    前言 opencv中很多数据结构为了达到內存使用的最优化,通常都会用它最小上限的空间来分配变量,有的数据结构也会因为图像文件格式的关系而给予适当的变量,因此需要知道它们声明的空间大小来配置适当的变量. ...

  9. 进度条QProgressBar

    import sys from PyQt5.QtCore import Qt, QTimer from PyQt5.QtWidgets import QApplication, QWidget, QP ...

  10. JavaScript之创建动态脚本

    //option= {type,src,text,isCreateScriptBySrc} function createDynamicScript(option){ var script = doc ...