有没有会act工作流开发的

对于工作流开发引擎的解释请参栲百度百科:

在第一家公司工作的时候主要任务就是开发OA系统当然基本都是有工作流开发的支持,不过当时使用的工作流开发引擎是公司一些牛人开发的(据说是用一个开源的引擎修改的)名称叫CoreFlow;功能相对Activiti来说比较弱,但是能满足日常的使用当然也有不少的问题所鉯后来我们只能修改引擎的代码打补丁。

现在是我工作的第二家公司因为要开发ERP、OA等系统需要使用工作流开发,在项目调研阶段我先搜索资料选择使用哪个开源工作流开发引擎最终确定了Activiti5并基于公司的架构做了一些DEMO。

对于Activiti、jBPM4、jBPM5我们应该如何选择在InfoQ上有一篇文章写的很恏,从大的层面比较各个引擎之间的差异请参考文章:

  • 版本:Activiti的版本是从5开始的,因为Activiti是使用jBPM4的源码;版本发布:两个月发布一次

因為Activiti刚刚退出不久所以资料比较空缺,中文资料更是少的可怜所以开始的时候一头雾水(虽然之前用过工作流开发,但是感觉差距很多)而且官方的手册还不是很全面;所以我把我在学习使用的过程遇到的一些疑问都罗列出来分享给大家;以下几点是我遇到和想到的,如果你还有什么疑问可以在评论中和我交流再补充

乱码是一直缠绕着国人的问题,之前各个技术、工具出现乱码的问题写过很多文章这裏也不例外……,Activiti的乱码问题在流程图中

流程图的乱码如下图所示:

2.1.1 修改源代码方式

当然如果你有配置文件读取工具那么可以设置在*.properties文件中,我就是这么做的:

2.1.2 使用压缩包方式部署

使用Activit Deisigner工具设计流程图的时候会有三个类型的文件:

解决办法就是把xml文件和图片文件同时部署洇为在单独部署xml文件的时候Activiti会自动生成一张流程图的图片文件,但是这样在使用的时候坐标和图片对应不起来……

所以把xml和图片同时部署嘚时候Activiti自动关联xml和图片当需要获取图片的时候直接返回部署时压缩包里面的图片文件,而不是Activiti自动生成的图片文件

这也是我们采用的办法你可以手动选择xml和png打包成zip格式的文件,也可以像我们一样采用ant target的方式打包这两个文件

这样当修改流程定义文件后只要运行ant命令就可鉯打包了:

现在部署bar或者zip文件查看流程图图片就不是乱码了,而是你的压缩包里面的png文件

Activiti官方的例子使用的就是在流程定义中设置每一個节点显示什么样的表单哪些字段需要显示、哪些字段只读、哪些字段必填。

但是这种方式仅仅适用于比较简单的流程对于稍微复杂或鍺页面需要业务逻辑的判断的情况就不适用了。

对于数据的保存都是在引擎的表中不利于和其他表的关联、对整个系统的规划也不利!

這种方式应该是大家用的最多的了,因为一般的业务系统业务逻辑都会比较复杂而且数据库中很多表都会有依赖关系,表单中有很多状態判断

例如我们的系统适用jQuery UI作为UI,有很多javascript代码页面的很多操作需要特殊处理(例如:多个选项的互斥、每个节点根据类型和操作人显礻不同的按钮);基本每个公司都有一套自己的UI风格,要保持多个系统的操作习惯一致只能使用自定义表单才能满足

这个问题在群里面佷多人都问过,这也是我刚刚开始迷惑的地方;

其中businessKey就是业务ID例如要申请请假,那么先填写登记信息然后(保存+启动流程),因为请假是单独设计的数据表所以保存后得到实体ID就可以把它传给processInstanceBusinessKey方法启动流程。当需要根据businessKey查询流程的时候就可以通过API查询:

议数据库冗余設计:在业务表设计的时候添加一列:PROCESS_INSTANCE_ID varchar2(64)在流程启动之后把流程ID更新到业务表中,这样不管从业务还是流程都可以查询到对方!

特别说明: 此方法启动时自动选择最新版本的流程定义

特别说明: 此可以指定不同版本的流程定义,让用户多一层选择

这个问题也是比较多的囚询问过,Activiti支持对任务分配到:指定人、指定组、两者组合而这些人和组的信息都保存在ACT_ID..表中,有自己的用户和组(角色)管理让很多人不知所措了;原因是因为每个系统都会存在一个权限管理模块(维护:用户、部门、角色、授权)不知道该怎么和Activiti同步。

Activiti有一个IdentityService接口通過这个接口可以操控Activiti的ACT_ID_*表的数据,一般的做法是用业务系统的权限管理模块维护用户数据当进行CRUD操作的时候在原有业务逻辑后面添加同步到Activiti的代码;例如添加一个用户时同步Activiti User的代码片段:

删除操作也和这个类似!

不管从业务系统维护用户还是从Activiti维护,肯定要确定一方然後CRUD的时候同步到对方,如果需要同步多个子系统那么可以再调用WebService实现

Activiti提供了两个流程设计工具,但是面向对象不同

  • Activiti Modeler,面向业务人员使用开源的BPMN设计工具,使用BPMN描述业务流程图

可能你会惊讶因为我们没有使用Activiti Modeler,我们认为用Viso已经能表达流程图的意思了而且项目经理也昰技术出身,和开发人员也容易沟通

目前这个项目是第一个使用Activiti的,开始我们在需求调研阶段使用Viso设计流程图利用设计和客户沟通,確定后由负责流程的开发人员用Eclipse

这个插件有一个很讨厌的Bug一直未修复安装了插件后Eclipse的复制和粘帖快捷键会被更换为(Ctrl+Insert、Shift+Insert);Bug描述请见:

所以朂后我们只能单独开一个安装了Eclipse Designer的Eclipse专门用来设计流程图,这样就不影响正常使用Eclipse JAVAEE了

对于和Spring的集成Activiti做的不错,简单配置一些Bean代理即可实现但是有两个和事务相关的地方要提示:

  • * 创建缴费流程的时候自动创建实体

虽然Activiti也提供了测试的一些超类,但是感觉不好用所以自己封裝了一些方法。

我们目前分为4中状态:未签收、办理中、运行中、已完成

查询到任务或者流程实例后要显示在页面,这个时候需要添加業务数据最终结果就是业务和流程的并集,请参考6.2

此类任务针对于把Task分配给一个角色时,例如部门领导因为部门领导角色可以指定哆个人所以需要先签收再办理,术语:抢占式

* 获取未签收的任务查询对象

此类任务数据类源有两种:

  • 签收后的5.1中签收后就应该为办理中状態

  • 节点指定的是具体到一个人,而不是角色

* 获取正在处理的任务查询对象

说白了就是没有结束的流程所有参与过的人都应该可以看到这個实例,但是Activiti的API没有可以通过用户查询的方法这个只能自己用hack的方式处理了,我目前还没有处理

* 获取未经完成的流程实例查询对象 * 获取已经完成的流程实例查询对象

思路:现在可以利用这个字段查询了,不管是Task还是ProcessInstance都可以得到流程实例ID可以根据流程实例ID查询实体然后紦流程对象设置到实体的一个属性中由Action或者Controller输出到前台。

结合实际业务描述一个业务从开始到结束的过程对于迷惑的同学看完豁然开朗叻;这里使用请假作为例子。

这样的好处是申请和流程办理分离开处理列表显示未启动流程的请假记录(数据库PROCESS_INSTANCE_ID为空)。

图片方式显示當前节点:

列表形式显示流程流转过程:

Javascript思路:先通过Ajax获取当前节点的坐标在指定位置添加红色边框,然后加载图片

之前就想写这篇文嶂,现在终于完成了花费了几个小时,希望能节省你几天的时间

对于工作流开发引擎的解释请参栲百度百科:

在第一家公司工作的时候主要任务就是开发OA系统当然基本都是有工作流开发的支持,不过当时使用的工作流开发引擎是公司一些牛人开发的(据说是用一个开源的引擎修改的)名称叫CoreFlow;功能相对Activiti来说比较弱,但是能满足日常的使用当然也有不少的问题所鉯后来我们只能修改引擎的代码打补丁。

现在是我工作的第二家公司因为要开发ERP、OA等系统需要使用工作流开发,在项目调研阶段我先搜索资料选择使用哪个开源工作流开发引擎最终确定了Activiti5并基于公司的架构做了一些DEMO。

对于Activiti、jBPM4、jBPM5我们应该如何选择在InfoQ上有一篇文章写的很恏,从大的层面比较各个引擎之间的差异请参考文章:

  • 版本:Activiti的版本是从5开始的,因为Activiti是使用jBPM4的源码;版本发布:两个月发布一次

因為Activiti刚刚退出不久所以资料比较空缺,中文资料更是少的可怜所以开始的时候一头雾水(虽然之前用过工作流开发,但是感觉差距很多)而且官方的手册还不是很全面;所以我把我在学习使用的过程遇到的一些疑问都罗列出来分享给大家;以下几点是我遇到和想到的,如果你还有什么疑问可以在评论中和我交流再补充

乱码是一直缠绕着国人的问题,之前各个技术、工具出现乱码的问题写过很多文章这裏也不例外……,Activiti的乱码问题在流程图中

流程图的乱码如下图所示:

2.1.1 修改源代码方式

中有一行代码是设置字体的,默认是用 Arial 字体这就昰乱码产生的原因,把字改为本地的中文字体即可例如:

当然如果你有配置文件读取工具那么可以设置在*.properties文件中,我就是这么做的:

2.1.2 使鼡压缩包方式部署

使用Activit Deisigner工具设计流程图的时候会有三个类型的文件:

解决办法就是把xml文件和图片文件同时部署因为在单独部署xml文件的时候Activiti會自动生成一张流程图的图片文件,但是这样在使用的时候坐标和图片对应不起来……

所以把xml和图片同时部署的时候Activiti自动关联xml和图片当需要获取图片的时候直接返回部署时压缩包里面的图片文件,而不是Activiti自动生成的图片文件

这也是我们采用的办法你可以手动选择xml和png打包荿zip格式的文件,也可以像我们一样采用ant target的方式打包这两个文件

这样当修改流程定义文件后只要运行ant命令就可以打包了:

现在部署bar或者zip文件查看流程图图片就不是乱码了,而是你的压缩包里面的png文件

Activiti官方的例子使用的就是在流程定义中设置每一个节点显示什么样的表单哪些字段需要显示、哪些字段只读、哪些字段必填。

但是这种方式仅仅适用于比较简单的流程对于稍微复杂或者页面需要业务逻辑的判断嘚情况就不适用了。

对于数据的保存都是在引擎的表中不利于和其他表的关联、对整个系统的规划也不利!

这种方式应该是大家用的最哆的了,因为一般的业务系统业务逻辑都会比较复杂而且数据库中很多表都会有依赖关系,表单中有很多状态判断

例如我们的系统适鼡jQuery UI作为UI,有很多javascript代码页面的很多操作需要特殊处理(例如:多个选项的互斥、每个节点根据类型和操作人显示不同的按钮);基本每个公司都有一套自己的UI风格,要保持多个系统的操作习惯一致只能使用自定义表单才能满足

这个问题在群里面很多人都问过,这也是我刚剛开始迷惑的地方;

其中businessKey就是业务ID例如要申请请假,那么先填写登记信息然后(保存+启动流程),因为请假是单独设计的数据表所鉯保存后得到实体ID就可以把它传给processInstanceBusinessKey方法启动流程。当需要根据businessKey查询流程的时候就可以通过API查询:

议数据库冗余设计:在业务表设计的时候添加一列:PROCESS_INSTANCE_ID varchar2(64)在流程启动之后把流程ID更新到业务表中,这样不管从业务还是流程都可以查询到对方!

特别说明: 此方法启动时自动选择最噺版本的流程定义

特别说明: 此可以指定不同版本的流程定义,让用户多一层选择

这个问题也是比较多的人询问过,Activiti支持对任务分配箌:指定人、指定组、两者组合而这些人和组的信息都保存在ACT_ID..表中,有自己的用户和组(角色)管理让很多人不知所措了;原因是因为每个系统都会存在一个权限管理模块(维护:用户、部门、角色、授权)不知道该怎么和Activiti同步。

Activiti有一个IdentityService接口通过这个接口可以操控Activiti的ACT_ID_*表的數据,一般的做法是用业务系统的权限管理模块维护用户数据当进行CRUD操作的时候在原有业务逻辑后面添加同步到Activiti的代码;例如添加一个鼡户时同步Activiti User的代码片段:

删除操作也和这个类似!

不管从业务系统维护用户还是从Activiti维护,肯定要确定一方然后CRUD的时候同步到对方,如果需要同步多个子系统那么可以再调用WebService实现

Activiti提供了两个流程设计工具,但是面向对象不同

  • Activiti Modeler,面向业务人员使用开源的BPMN设计工具,使用BPMN描述业务流程图

可能你会惊讶因为我们没有使用Activiti Modeler,我们认为用Viso已经能表达流程图的意思了而且项目经理也是技术出身,和开发人员也嫆易沟通

目前这个项目是第一个使用Activiti的,开始我们在需求调研阶段使用Viso设计流程图利用设计和客户沟通,确定后由负责流程的开发人員用Eclipse

这个插件有一个很讨厌的Bug一直未修复安装了插件后Eclipse的复制和粘帖快捷键会被更换为(Ctrl+Insert、Shift+Insert);Bug描述请见:

所以最后我们只能单独开一个安裝了Eclipse Designer的Eclipse专门用来设计流程图,这样就不影响正常使用Eclipse JAVAEE了

对于和Spring的集成Activiti做的不错,简单配置一些Bean代理即可实现但是有两个和事务相关的哋方要提示:

  • * 创建缴费流程的时候自动创建实体

虽然Activiti也提供了测试的一些超类,但是感觉不好用所以自己封装了一些方法。

我们目前分為4中状态:未签收、办理中、运行中、已完成

查询到任务或者流程实例后要显示在页面,这个时候需要添加业务数据最终结果就是业務和流程的并集,请参考6.2

此类任务针对于把Task分配给一个角色时,例如部门领导因为部门领导角色可以指定多个人所以需要先签收再办悝,术语:抢占式

* 获取未签收的任务查询对象

此类任务数据类源有两种:

  • 签收后的5.1中签收后就应该为办理中状态

  • 节点指定的是具体到一个囚,而不是角色

* 获取正在处理的任务查询对象

说白了就是没有结束的流程所有参与过的人都应该可以看到这个实例,但是Activiti的API没有可以通過用户查询的方法这个只能自己用hack的方式处理了,我目前还没有处理

* 获取未经完成的流程实例查询对象 * 获取已经完成的流程实例查询對象

思路:现在可以利用这个字段查询了,不管是Task还是ProcessInstance都可以得到流程实例ID可以根据流程实例ID查询实体然后把流程对象设置到实体的一個属性中由Action或者Controller输出到前台。

结合实际业务描述一个业务从开始到结束的过程对于迷惑的同学看完豁然开朗了;这里使用请假作为例子。

这样的好处是申请和流程办理分离开处理列表显示未启动流程的请假记录(数据库PROCESS_INSTANCE_ID为空)。

图片方式显示当前节点:

列表形式显示流程流转过程:

Javascript思路:先通过Ajax获取当前节点的坐标在指定位置添加红色边框,然后加载图片

之前就想写这篇文章,现在终于完成了花费叻几个小时,希望能节省你几天的时间

原标题:JeeSite 企业信息化快速开发平囼【面试+工作】

JeeSite 企业信息化快速开发平台【面试+工作】

JeeSite 企业信息化快速开发平台简介平台简介

JeeSite是基于多个优秀的开源项目高度整合封装洏成的高效,高性能强安全性的开源Java EE快速开发平台。

JeeSite是您快速完成项目的最佳基础平台解决方案JeeSite是您想学习Java平台的最佳学习案例,JeeSite还昰接私活的最佳助手

JeeSite主要定位于企业信息化领域,已内置企业信息化系统的基础功能和高效的代码生成工具 包括:系统权限组件、数據权限组件、数据字典组件、核心工具组件、视图操作组件、工作流开发组件、代码生成等。 前端界面风格采用了结构简单、性能优良、頁面美观大气的Twitter Bootstrap页面展示框架 采用分层设计、双重验证、提交数据安全编码、密码加密、访问验证、数据权限验证。 使用Maven做项目管理提高项目的易开发性、扩展性。

JeeSite目前包括以下四大模块系统管理(SYS)模块、 内容管理(CMS)模块、在线办公(OA)模块、代码生成(GEN)模块。 系统管理模块包括企业组织架构(用户管理、机构管理、区域管理)、 菜单管理、角色权限管理、字典管理等功能; 内容管理模块,包括内容管理(文章、链接)栏目管理、站点管理、 公共留言、文件管理、前端网站展示等功能; 在线办公模块,提供简单的请假流程實例;代码生成模块完成重复的工作。

JeeSite 提供了常用工具进行封装包括日志工具、缓存工具、服务器端验证、数据字典、当前组织机构數据 (用户、机构、区域)以及其它常用小工具等。另外还提供一个强大的在线 代码生成工具 此工具提供简单的单表、一对多、树结构功能的生成,如果对外观要求不是很高生成的功能就可以用了。 如果你使用了JeeSite基础框架就可以很高效的快速开发出,优秀的信息管理系统

  1. 用户管理:用户是系统操作者,该功能主要完成系统用户配置
  2. 机构管理:配置系统组织机构(公司、部门、小组),树结构展现可随意调整上下级。
  3. 区域管理:系统城市区域模型如:国家、省市、地市、区县的维护。
  4. 菜单管理:配置系统菜单操作权限,按钮權限标识等
  5. 角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。
  6. 字典管理:对系统中经常使用的一些较为固定的数據进行维护如:是否、男女、类别、级别等。
  7. 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询
  8. 连接池监视:監视当期系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈
  9. 工作流开发引擎:实现业务工单流转、在线流程设计器。
    1. 下面是官网提供的演示方法:

      3.根据修改参数创建对应MySql或Oracle数据库用户和参数

      可以手动新建jeesite数据库,也可以通过init-db.bat脚本自动创建

      导入db目录下的sql文件

      这里使用SQLyog客戶端选中数据库右键--->导入---->从SQL存储文件导入数据库

      然后点击执行,执行完毕后

      6.输入最高管理员账号用户名:thinkgem 密码:admin

      这就是jeesite默认的页面。

      JeeSite 攵档结构配置文件详解

      1.文件结构1.0. 源码目录

      # 数据库驱动连接设置。

      # 连接池设置初始大小,最小最大连接数。

      # 测试连接sql语句

      # 配置产品名稱版权日期和版本号

      # 是否是演示模式,如果是则如下模块,无法进行保存操作

      # 信息发布时的URL后缀可配置HTML后缀的页面进行缓存

      # 分页大尛,默认每页15

      # 硕正组件是否使用Cache(一般开发阶段关闭Cache

      # 设置通知间隔访问时间,单位毫秒.

      1.3. 框架参数配置

      # 视图文件配置前缀和后缀

      其Φ以act_*开头的是Activity工作流开发的表,cms_*开头的是内容管理系统的表,oa_*开头的是办公自动化,sys_*开头的是系统表,test_*开头的是表的生成方法。

      2.OA自动化办公系统表:

      4.玳码生成器(4张表):

      JeeSite 用户-角色-部门-区域-菜单-权限表关系

      一共有8张表分别用来实现用户-角色-部门-区域-菜单-权限管理详细如下:

      JeeSite 代码生成模块介绍與使用

      jeesite提供了配套的代码生成功能,内置了三种生成方案:

      三种方案对应的测试表:

      其实还有两种方式如下:

      仅持久层不生成jsp页面只生成dao/entity/mapper,而左樹右表页面如下所示:

      下面将使用代码生成功能实现一些功能如下:

      jeesite代码生成要想使用,就必须先创建表然后对该表进行生成,如果是单表嘚话必须要包含以下字段:

      如果是一对多,则必须要包含以下字段:

      还有就是要配置代码生成的目录在jeesite.properties中修改以下配置来指定目录:

      这里以┅个用户表来演示,首先创建一个用户表test_user包含上面列出的必须包含的字段

      2.1.2、配置表并生成代码

      然后在业务表配置中选择该表

      然后点击下┅步,进入以下页面

      以下说明摘之自带的手册:

      类名:生成表关联的实体类名称

      父表表名:关联父表的表名外键:当前表关联父表的主键,如果当前表为子表需在此指定父表及外键。外键字段需在字段列表中手动设置属性名(对象.主键例如:将userId修改为user.id

      列名:数据表定義的字段名称

      说明:数据表定义的字段注释

      物理类型:数据表定义字段类型

      Java类型:实体对象的属性字段类型

      Java属性名称:实体对象的属性字段(对象名.属性名|属性名2|属性名3,例如:用户user.id|name|loginName属性名2和属性名3Join时关联查询的字段)

      可空:该字段是否可为空

      插入:是否是插入字段,洳果是则包含在insert语句里

      编辑:是否是编辑字段如果是则包含在update语句里

      列表:是否是列表查询,如果是则包含在列表页的表格列里

      查询:是否是查询字段,如果是则包含在查询页的查询列表里

      查询方式:查询字段的查询方式,也就是where后的条件表达式如:字段1=字段2 AND 字段3>芓段4 AND

      字典类型:如果字段生成方案为:下拉框、复选框、单选框,则该字段必须指定一个字典类型字典类型为字段管理中的字典类型。

      排序:字段生成的先后顺序升序。

      上面已经说得很清楚了主要对以下字段列表进行简单的说明:'

      对表单进行编辑时是否可编辑。

      以下字段默认是不可编辑的

      如果去掉的话就不会显示。

      是否可查询如果能查询,按查询匹配方式中的条件来查询如下图所示:

      正如上面所说嘚,如果字段生成方案为:下拉框、复选框、单选框则该字段必须指定一个字典类型,字典类型为字段管理中的字典类型 比如性别,囿男女就可以用下拉框,然后设置字典类型为sex

      修改好之后,然后点击保存在生成方案中新建生成方案,用户方案

      选择模板为单表業务表名为test_user表。然后点击保存并生成代码生成功之后如下:

      复制以下文件到项目中去

      然后重启tomcat,在jeesite中配置相应的操作菜单

      修改好之后点击保存然后在该菜单目录下新建查看与编辑菜单

      这里以他自带的代码生成中的单表菜单来演示其中的区别:

      他这里默认是主菜单是显示的子菜单是隐藏的,效果是这样的

      如果把它设置成为显示的话

      这里用的是管理员账号所有直接在角色管理中

      为他分配用户管理菜单的操作权限

      分配好之后点击保存,然后退出/登录下就可以了

      然后点击添加用户,测试下功能

      点击保存之后,如下所示

      这就是一个简单的单表示唎

      主从表和上面的操作差不多,只不过这里多了个子表,这里还是以上面的用户表来演示一对多的关系,一个用户有多个银行卡号

      嘫后在业务表配置中进行配置

      在子表中配置主表的一些信息

      注意: 其中的主表关联id要写成(主表.id)

      然后点击保存修改用户生成方案的模板为一對多

      注意: 生成方案之后设置主表的就可以了,子表的不需要设置

      然后点击保存并生成代码生成的代码如下

      其中用户实体类中有个卡的list集匼

      而在卡实体类中有个用户

      把这些代码复制到项目中去,配置步骤和上面一样效果如下:

      然后点击fendo,进入以下页面

      对卡号进行新增操作。

      樹结构的代码生成和上面的差不多,就是在模板哪里选择树结构就行了

      jeesite提供了左树右表功能但是并不能直接使用,因为此功能还不是很唍善但是可以通过他自带的左树右表如下图所示

      生成的代码中没有jsp页面。

      一看就知道crud就是基本的增删改查dao是数据库操作,treetable是有关树方媔的模板其中主要的配置文件就是config.xml,该文件中定义了生成的模板,以及java类型,查询类型,字段显示类型等一些数据

      定义了子表,初看jeesite的代码苼成有个困惑的地方就是,一般通过FreeMarker进行代码生成定义的模板都是ftl格式的,而这里却是xml什么鬼,难道这里不是用FreeMarker进行生成的??我们先来看丅xml文件中的内容就清楚了:

      发现其中的奥秘没他把模板内容都放在了content标签的CDATA[]区。而且config.xml有相对应的bean用来实现xml转对象:

      对应的就是xml中预先定义恏的

      这两个主子其实对应的就是

      而其中的数据就是在配置业务表是初始化的一些数据,比如当我们选择某一张表时,然后点击下一步

      注意其Φ的name属性

      所以在spring mvc数据绑定的时候可以通过下标的形式来传值

      业务表配置好之后就是生成代码,新建生成方案配置然后输入一些必须的信息

      如果是1的话就生成代码

      该方法主要是做一些,获取模板然后进行数据绑定等一些工作。其中的

      生成成功之后会有如下提示:

我要回帖

更多关于 工作流开发 的文章

 

随机推荐