当前位置: 首页 > news >正文

信誉好的菏泽网站建设学院二级网站建设方案模板

信誉好的菏泽网站建设,学院二级网站建设方案模板,p2p网贷网站建设哪家好,优秀网站psdFlowable 一、工作流简介 ​ 较早的⼯作流是 jBPM #xff0c; 这是⼀个由 Java 实现的企业级 流程 引擎 #xff0c; 是 JBoss 公司开发的产品之⼀ 。 jBPM 的创建者是 Tom Baeyens #xff0c; 这个⼤佬后来离开了 JBoss #xff0c; 并加⼊到 Alfresco #xff0c; 并…Flowable 一、工作流简介 ​ 较早的⼯作流是 jBPM 这是⼀个由 Java 实现的企业级 流程 引擎 是 JBoss 公司开发的产品之⼀ 。 jBPM 的创建者是 Tom Baeyens 这个⼤佬后来离开了 JBoss 并加⼊到 Alfresco 并推出了基于 jBPM4 的开源⼯作流系统 Activiti ⽽ j BPM 则在 后续的代码中完全放弃了 jBPM4 的代码 。 从这个过程中也能看出来 jBPM 在发展 过程中 由于意⻅相左 后来变成了两个 jBPM 和 Activiti 。 然⽽戏剧的是 Activiti5 没搞多久 从 Activiti 中⼜分出来⼀个 Camunda Activiti 继续发展 ⼜从中分出来⼀个 Flowable 。 ​ 现在市⾯上主流的 流程 引擎就⼀共有三个 Activiti Flowable Camunda 这三个各有特点 1. Activiti ⽬前是侧重云 他⽬前的设计会向 Spring Cloud 、 Docker 这些去靠 拢 。2. Flowable 核⼼思想还是在做⼀个功能丰富的 流程 引擎⼯具 除了最最基础的⼯作 流 他还提供了很多其他的扩展点 我们可以基于 Flowable 实现出许多我们想要的功能 。 3. Camunda 相对于前两个⽽⾔⽐较轻量级 Camunda 有⼀个⽐较有特⾊的功能就是他提 供了⼀个⼩巧的编辑器 基于 [bpmn.io](http://bpmn.io) 来实现的 。 如果 你的项⽬需求是做⼀个轻巧的 、 灵活的 、 定制性强的编辑器 ⼯作流是嵌⼊式的 那么可 以选择 Camunda 。 二、相关概念 以简单的请假流程为例 一个流程图主要包含四个方面 事件连线任务网关 事件 在一个流程图中肯定要有的是开始事件和结束事件就是上图中的圆圈此外还有一些中间事件边界事件等。 连线 连线是将事件任务网关等连在一起的线条一般情况下都是普通连线有的会有一些条件比如上图中从网关出来的连线需要根据请假申请的审批结果确定走那一条连线 任务 接收任务 这个任务并不需要处理额外的事流程到这一步就自动停下来了需要人工点一下推动流程继续向下执行。 发送任务 一般用来吧消息发送给外部参与者 服务任务 一般由系统自动完成我们需要自定义一个类可以在这个自定义的类里面完成自己想要做的事比较灵活 脚本任务 一个自动化活动当流程执行到脚本任务时自动执行相应的脚本 用户任务 用于为那些需要人工参与者完成的工作建模 服务主要分为两大类 用户任务一般表示人工需要介入的事情比如是否同意或者一些表单输入需要让人工完成一般用户任务和表单结合在一起用户任务需要用户向引擎提交一个完成任务的动作否则流程会暂停在这里等待。服务任务服务任务会自动执行调用服务任务的时候可以是一个javabean也可以是一个类的全限定名也可以是一个远程rest服务流程会自动执行服务任务。 网关 互斥网关 也叫排他性网关这种网关只有一个有效出口 相容网关 这种网关有多个出口只要满足条件都会执行 事件网关 事件网关是通过中间事件驱动它在等待的事件发生后才会触发决策基于事件的网关允许基于事件做出决策 并行网关 并行网关一般是成对出现的如果有一些任务可以并行执行那么可以用并行网关 三、SpringBoot集成Flowable工作流 3.1 创建Spring Boot 项目并引入依赖 idea 创建spring boot 项目相信大家都很熟练了就不再赘述了因为flowable需要用到数据库所以需要引入mysql和mybatis依赖 引入flowable依赖 dependencygroupIdorg.flowable/groupIdartifactIdflowable-spring-boot-starter/artifactIdversion6.7.2/version/dependency默认情况下位于resources/processes目录下的历程都会被自动部署 配置数据库连接信息项目启动会自动初始化数据库建表初始化流程信息流程引擎运行时候的数据也会被保存到数据库中。 spring:datasource:driverClassName: com.mysql.jdbc.Driverurl: jdbc:mysql://ip:port/process?useSSLfalseuseUnicodetruecharacterEncodingutf-8username: usernamepassword: pw3.2 画流程图 可以集成flowableUI画也可以使用idea插件 本文使用Flowable BPMN visualizer插件画流程图 在processes目录下新建流程文件 本文新建的为ask_for_leave.bpmn20.xml .bpmn20.xml是固定后缀 在文件上右击选择View BPMN(Flowable) Diagram就可以可视化的绘制流程图了 如果需要新添加一个流程图元素则需要右键根据需要选择即可 我画的流程图如下 首先根据业务流程把各个流程画出并链接起来开始事件–员工的用户任务员工发起请假流程–组长用户任务组长审批是否同意–组长审批网关如果不同意则发送失败提示并结束流程如果同意进入经理审批任务– 经理审批任务经理审批是否同意– 组长审批网关如果不同意则发送失败提示并结束流程如果同意结束流程 员工用户任务配置需要注意的点在于需要配置Assignee办理人属性该属性一般为员工id 组长审批 用户任务 和 经理审批用户任务的配置和员工的类似办理人都需要指定为用户ID 组长审批网关和经理审批网关我们使用互斥网关因为在审批的时候只能是同意或者不同意其他没有特殊配置 组长审批通过连线需要配置条件表达式用来判断什么情况下走这个连线我们配置表达式为 ${var:equals(checkResult,“通过”)}这个地方的表达式是el表达式会自动计算checkResult是在组长审批的用户任务中表单提交的数据 发送失败提示 服务任务服务任务会自动执行所需要指定class 这个类需要自己实现接口 自动生成的流程定义文件 ?xml version1.0 encodingUTF-8? definitions xmlnshttp://www.omg.org/spec/BPMN/20100524/MODEL xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:xsdhttp://www.w3.org/2001/XMLSchema xmlns:flowablehttp://flowable.org/bpmn xmlns:bpmndihttp://www.omg.org/spec/BPMN/20100524/DI xmlns:omgdchttp://www.omg.org/spec/DD/20100524/DC xmlns:omgdihttp://www.omg.org/spec/DD/20100524/DI typeLanguagehttp://www.w3.org/2001/XMLSchema expressionLanguagehttp://www.w3.org/1999/XPath targetNamespacehttp://www.flowable.org/processdefprocess idask_for_leave nameask_for_leave isExecutabletruestartEvent idsid-3cb4e010-243b-401b-9ad3-4a1f8ecf35d7/userTask idsid-c60eebb9-3a5b-48f9-963c-d0b064344fad name请假 flowable:assignee#{leaveTask}documentation员工请假/documentation/userTasksequenceFlow idsid-ff0c2afe-1c1c-4e2f-b2eb-5083c5fadb41 sourceRefsid-3cb4e010-243b-401b-9ad3-4a1f8ecf35d7 targetRefsid-c60eebb9-3a5b-48f9-963c-d0b064344fad/userTask idsid-dafc35fa-fa0f-49af-9f46-7074fa5a60ab name组长审批 flowable:assignee#{zuzhangTask}/sequenceFlow idsid-32a2a643-9ce6-44f3-bb94-f9df3d97c49b sourceRefsid-c60eebb9-3a5b-48f9-963c-d0b064344fad targetRefsid-dafc35fa-fa0f-49af-9f46-7074fa5a60ab/exclusiveGateway idsid-c03f8946-a6cd-4e38-881a-70d450e32748 name组长审批网关/sequenceFlow idsid-bbed6467-cc35-41d2-ad08-2c3b17b8ca83 sourceRefsid-dafc35fa-fa0f-49af-9f46-7074fa5a60ab targetRefsid-c03f8946-a6cd-4e38-881a-70d450e32748/sequenceFlow idsid-afe09a37-7634-4166-8617-68d5f35edef7 sourceRefsid-c03f8946-a6cd-4e38-881a-70d450e32748 targetRefsid-c9544983-0465-43e0-b6fc-1dbd0f1e0687 name组长审批通过conditionExpression xsi:typetFormalExpression${var:equals(checkResult,通过)}/conditionExpression/sequenceFlowsequenceFlow idsid-df2ad71d-6aa1-4d43-a9f9-bbdad8687e3a sourceRefsid-c03f8946-a6cd-4e38-881a-70d450e32748 targetRefsid-e720a425-9f57-4a42-9833-b5f4f0175840 name组长审批拒绝conditionExpression xsi:typetFormalExpression${var:equals(checkResult,拒绝)}/conditionExpression/sequenceFlowuserTask idsid-c9544983-0465-43e0-b6fc-1dbd0f1e0687 name经理审批 flowable:assignee#{manageTask}/exclusiveGateway idsid-970d87f2-84d0-4603-ae25-163a0ae7ca53 name经理审批网关/sequenceFlow idsid-ffa6dd8b-ae8d-47a5-a2ff-45d25e58dcac sourceRefsid-c9544983-0465-43e0-b6fc-1dbd0f1e0687 targetRefsid-970d87f2-84d0-4603-ae25-163a0ae7ca53/serviceTask idsid-e720a425-9f57-4a42-9833-b5f4f0175840 flowable:exclusivetrue name发送失败提示 isForCompensationtrue flowable:classcom.xx.process.service.LeaveFailService/endEvent idsid-f158c31d-d760-4a06-bb4a-6ff8b156d2fb/sequenceFlow idsid-6e2fc1e3-43be-4768-96f5-d9c7861cbce7 sourceRefsid-e720a425-9f57-4a42-9833-b5f4f0175840 targetRefsid-f158c31d-d760-4a06-bb4a-6ff8b156d2fb/sequenceFlow idsid-c90c5e3e-e5c2-40f0-8324-44d548de0ef2 sourceRefsid-970d87f2-84d0-4603-ae25-163a0ae7ca53 targetRefsid-e720a425-9f57-4a42-9833-b5f4f0175840 name经理审批拒绝conditionExpression xsi:typetFormalExpression${var:equals(checkResult,拒绝)}/conditionExpression/sequenceFlowendEvent idsid-ea363fd0-f4ad-4537-9faf-a9349aac16f1/sequenceFlow idsid-5cad8e7b-8ee3-4e34-b94f-920a362f578d sourceRefsid-970d87f2-84d0-4603-ae25-163a0ae7ca53 targetRefsid-ea363fd0-f4ad-4537-9faf-a9349aac16f1 name经理审批通过conditionExpression xsi:typetFormalExpression${var:equals(checkResult,通过)}/conditionExpression/sequenceFlow/processbpmndi:BPMNDiagram idBPMNDiagram_ask_for_leavebpmndi:BPMNPlane bpmnElementask_for_leave idBPMNPlane_ask_for_leavebpmndi:BPMNShape idshape-013aa23c-13e6-466e-942b-6a1a308eeda7 bpmnElementsid-3cb4e010-243b-401b-9ad3-4a1f8ecf35d7omgdc:Bounds x-2235.0 y-1200.0 width30.0 height30.0//bpmndi:BPMNShapebpmndi:BPMNShape idshape-10dbd0c8-a3b1-4a9e-b214-5c506e80fd1d bpmnElementsid-c60eebb9-3a5b-48f9-963c-d0b064344fadomgdc:Bounds x-2145.0 y-1224.9999 width100.0 height80.0//bpmndi:BPMNShapebpmndi:BPMNEdge idedge-97bf72f7-edcb-4813-9e03-73bc597d1492 bpmnElementsid-ff0c2afe-1c1c-4e2f-b2eb-5083c5fadb41omgdi:waypoint x-2205.0 y-1185.0/omgdi:waypoint x-2145.0 y-1184.9999//bpmndi:BPMNEdgebpmndi:BPMNShape idshape-df2f6c22-1d44-4180-94fb-87753f871822 bpmnElementsid-dafc35fa-fa0f-49af-9f46-7074fa5a60abomgdc:Bounds x-1945.0 y-1225.0001 width100.0 height80.0//bpmndi:BPMNShapebpmndi:BPMNEdge idedge-e0d1746e-e6b5-481a-a492-83881d2a9c22 bpmnElementsid-32a2a643-9ce6-44f3-bb94-f9df3d97c49bomgdi:waypoint x-2045.0 y-1184.9999/omgdi:waypoint x-1945.0 y-1185.0001//bpmndi:BPMNEdgebpmndi:BPMNShape idshape-6e0e9d80-5884-4ca5-847d-d3e555005c51 bpmnElementsid-c03f8946-a6cd-4e38-881a-70d450e32748omgdc:Bounds x-1735.0 y-1205.0 width40.0 height40.0//bpmndi:BPMNShapebpmndi:BPMNEdge idedge-9dbfbe2b-c839-44eb-b74b-fceee48631b7 bpmnElementsid-bbed6467-cc35-41d2-ad08-2c3b17b8ca83omgdi:waypoint x-1845.0 y-1185.0001/omgdi:waypoint x-1735.0 y-1185.0//bpmndi:BPMNEdgebpmndi:BPMNShape idshape-1ff96c95-d96d-4241-9d0f-85414bbb3859 bpmnElementsid-c9544983-0465-43e0-b6fc-1dbd0f1e0687omgdc:Bounds x-1570.0 y-1224.9999 width100.0 height80.0//bpmndi:BPMNShapebpmndi:BPMNEdge idedge-f8f6488f-354a-490c-9d22-1f57e9a654d4 bpmnElementsid-afe09a37-7634-4166-8617-68d5f35edef7omgdi:waypoint x-1695.0 y-1185.0/omgdi:waypoint x-1632.5 y-1185.0/omgdi:waypoint x-1570.0 y-1184.9999//bpmndi:BPMNEdgebpmndi:BPMNShape idshape-bb52e23c-ee53-4073-9b74-c5dca8459100 bpmnElementsid-970d87f2-84d0-4603-ae25-163a0ae7ca53omgdc:Bounds x-1395.0 y-1205.0 width40.0 height40.0//bpmndi:BPMNShapebpmndi:BPMNEdge idedge-6e5e32bc-5b44-41f5-97e6-458c1aa7b7f3 bpmnElementsid-ffa6dd8b-ae8d-47a5-a2ff-45d25e58dcacomgdi:waypoint x-1470.0 y-1184.9999/omgdi:waypoint x-1395.0 y-1185.0//bpmndi:BPMNEdgebpmndi:BPMNShape idshape-26269b4b-a620-4e2f-a463-145fdfd8c0b1 bpmnElementsid-e720a425-9f57-4a42-9833-b5f4f0175840omgdc:Bounds x-1764.9999 y-1055.0 width100.0 height80.0//bpmndi:BPMNShapebpmndi:BPMNShape idshape-47431d28-2f8b-4b2c-81e0-19dc832d1880 bpmnElementsid-f158c31d-d760-4a06-bb4a-6ff8b156d2fbomgdc:Bounds x-1910.0 y-1030.0 width30.0 height30.0//bpmndi:BPMNShapebpmndi:BPMNEdge idedge-cfc9460b-eaf6-44ee-9baa-300e89b18f4d bpmnElementsid-6e2fc1e3-43be-4768-96f5-d9c7861cbce7omgdi:waypoint x-1764.9999 y-1015.0/omgdi:waypoint x-1880.0 y-1015.0//bpmndi:BPMNEdgebpmndi:BPMNEdge idedge-46d26639-0c9b-40da-b5ec-10678783920b bpmnElementsid-c90c5e3e-e5c2-40f0-8324-44d548de0ef2omgdi:waypoint x-1375.0 y-1165.0/omgdi:waypoint x-1375.0 y-1015.0/omgdi:waypoint x-1664.9998 y-1015.0//bpmndi:BPMNEdgebpmndi:BPMNShape idshape-cfc8c0f0-f529-4023-83a6-e8635533be1b bpmnElementsid-ea363fd0-f4ad-4537-9faf-a9349aac16f1omgdc:Bounds x-1200.0 y-1200.0 width30.0 height30.0//bpmndi:BPMNShapebpmndi:BPMNEdge idedge-5c22485e-bc92-4af7-b814-6f384c98ba5d bpmnElementsid-5cad8e7b-8ee3-4e34-b94f-920a362f578domgdi:waypoint x-1355.0 y-1185.0/omgdi:waypoint x-1200.0 y-1185.0//bpmndi:BPMNEdgebpmndi:BPMNEdge idedge-eb5ecc69-91e8-4e50-81e2-14123d77ee2d bpmnElementsid-df2ad71d-6aa1-4d43-a9f9-bbdad8687e3aomgdi:waypoint x-1715.0 y-1165.0/omgdi:waypoint x-1714.9999 y-1055.0//bpmndi:BPMNEdge/bpmndi:BPMNPlane/bpmndi:BPMNDiagram /definitions 3.3 服务任务实现类 Slf4j Component public class LeaveFailService implements JavaDelegate {Overridepublic void execute(DelegateExecution delegateExecution) {log.info(审批不通过{}, delegateExecution.getCurrentActivityId());} }需要实现 JavaDelegate接口在执行到服务任务的时候就会自动调用这个方法在这个方法中我们可以做一些自定义的业务逻辑 3.4 流程图查看接口 为了方便查看流程执行到那一步了故增加该接口查看 开启流程的时候会生成一个流程id使用该流程ID可查询流程进行到那一步了 /*** LeaveController** Description:* Author: wangyubiao* 标签属性 a hrefhttps://blog.csdn.net/zhongzk69/article/details/91489038.../a* 网关a hrefhttps://blog.csdn.net/BASK2311/article/details/128073967.../a* Date 2023/5/12 13:26* since 1.0.0*/ RestController public class LeaveController {AutowiredRuntimeService runtimeService;AutowiredRepositoryService repositoryService;AutowiredProcessEngine processEngine;GetMapping(/pic)public void showPic(HttpServletResponse resp, String processId) throws Exception {ProcessInstance pi runtimeService.createProcessInstanceQuery().processInstanceId(processId).singleResult();if (pi null) {return;}ListExecution executions runtimeService.createExecutionQuery().processInstanceId(processId).list();ListString activityIds new ArrayList();ListString flows new ArrayList();for (Execution exe : executions) {ListString ids runtimeService.getActiveActivityIds(exe.getId());activityIds.addAll(ids);}/*** 生成流程图*/BpmnModel bpmnModel repositoryService.getBpmnModel(pi.getProcessDefinitionId());ProcessEngineConfiguration engconf processEngine.getProcessEngineConfiguration();ProcessDiagramGenerator diagramGenerator engconf.getProcessDiagramGenerator();InputStream in diagramGenerator.generateDiagram(bpmnModel, png, activityIds, flows, engconf.getActivityFontName(), engconf.getLabelFontName(), engconf.getAnnotationFontName(), engconf.getClassLoader(), 1.0, false);OutputStream out null;byte[] buf new byte[1024];int legth 0;try {out resp.getOutputStream();while ((legth in.read(buf)) ! -1) {out.write(buf, 0, legth);}} finally {if (in ! null) {in.close();}if (out ! null) {out.close();}}}}查询结果 3.5 单元测试 import lombok.extern.slf4j.Slf4j; import org.flowable.engine.RuntimeService; import org.flowable.engine.TaskService; import org.flowable.engine.runtime.ProcessInstance; import org.flowable.task.api.Task; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles;import java.util.HashMap; import java.util.List; import java.util.Map;SpringBootTest Slf4j ActiveProfiles(dev) class ProcessApplicationTests {AutowiredRuntimeService runtimeService;AutowiredTaskService taskService;// 员工idpublic static final String yuangongId yuangongID_3;// 员工idpublic static final String zuzhangId zuzhangId_3;// 员工idpublic static final String manageId manageId_3;Testvoid contextLoads() {}/*** 开启一个请假流程*/Testvoid askForLeave() {HashMapString, Object map new HashMap();map.put(leaveTask, yuangongId);// 开启流程的key就是流程定义文件里 process 标签的idProcessInstance processInstance runtimeService.startProcessInstanceByKey(ask_for_leave, map);// 设置一些参数runtimeService.setVariable(processInstance.getId(), name, javaboy);runtimeService.setVariable(processInstance.getId(), reason, 休息一下);runtimeService.setVariable(processInstance.getId(), days, 10);log.info(创建请假流程 processId{}, processInstance.getId());}/*** 员工提交请假*/Testvoid submitToZuZhang() {// 员工查找到自己的任务然后提交给组长审批ListTask list taskService.createTaskQuery().taskAssignee(yuangongId).orderByTaskId().desc().list();for (Task task: list) {log.info(任务 ID{}任务处理人{}任务是否挂起{}, task.getId(), task.getAssignee(), task.isSuspended());MapString, Object map new HashMap();//提交给组长的时候需要指定组长的 idmap.put(zuzhangTask, zuzhangId);taskService.complete(task.getId(), map);}}/*** 组长批准请假*/Testvoid zuZhangApprove() {ListTask list taskService.createTaskQuery().taskAssignee(zuzhangId).orderByTaskId().desc().list();for (Task task: list) {if (组长审批.equals(task.getName())) {log.info(任务 ID{}任务处理人{}任务是否挂起{}, task.getId(), task.getAssignee(), task.isSuspended());MapString, Object map new HashMap();//提交给组长的时候需要指定组长的 idmap.put(manageTask, manageId);map.put(checkResult, 通过);map.put(zuzhangTask, zuzhangId);try {taskService.complete(task.getId(), map);} catch (Exception e) {e.printStackTrace();log.error(组长审批失败{} {}, task.getId(), task.getAssignee());}}}}/*** 经理审批通过*/Testvoid managerApprove() {ListTask list taskService.createTaskQuery().taskAssignee(manageId).orderByTaskId().desc().list();for (Task task: list) {log.info(经理 {} 在审批 {} 任务, task.getAssignee(), task.getId());MapString, Object map new HashMap();map.put(checkResult, 通过);taskService.complete(task.getId(), map);}}/*** 经理审批不通过*/Testvoid managerNotApprove() {ListTask list taskService.createTaskQuery().taskAssignee(manageId).orderByTaskId().desc().list();for (Task task: list) {log.info(经理 {} 在审批 {} 任务, task.getAssignee(), task.getId());MapString, Object map new HashMap();map.put(checkResult, 拒绝);taskService.complete(task.getId(), map);}}} 四、遇到的一些问题 4.1 生成的流程图文字显示为”口口口“ 这是因为本地没有默认的字体安装字体或者修改配置解决 import org.flowable.spring.SpringProcessEngineConfiguration; import org.flowable.spring.boot.EngineConfigurationConfigurer; import org.springframework.context.annotation.Configuration;/*** FlowableConfig** Description:* Author: wangyubiao* Date 2023/5/15 15:16* since 1.0.0*/ Configuration public class FlowableConfig implements EngineConfigurationConfigurerSpringProcessEngineConfiguration {Overridepublic void configure(SpringProcessEngineConfiguration springProcessEngineConfiguration) {springProcessEngineConfiguration.setActivityFontName(宋体);springProcessEngineConfiguration.setLabelFontName(宋体);springProcessEngineConfiguration.setAnnotationFontName(宋体);} }4.2 一个流程已经开始了修改了流程定义文件已经开始的流程并没有更新 流程开始后流程配置信息已经持久化了修改流程定义文件只会影响还没开始的流程不会对已经开始的流程造成影响 五、附录 flowable BPMN 用户手册 https://tkjohn.github.io/flowable-userguide/#chDeployment 工作流概念入门https://mp.weixin.qq.com/s?__bizMzI1NDY0MTkzNQmid2247501196idx1snab8f8a50002033e6033ab86e7e92b580scene21#wechat_redirect SpringBoot集成Flowablehttps://blog.csdn.net/pengming97/article/details/127027694 Flowable 79张表都是干嘛的https://wangsong.blog.csdn.net/article/details/126755364
http://www.w-s-a.com/news/920364/

相关文章:

  • 福州网站快速排名在一个网站的各虚拟目录中默认文档的文件名要相同
  • 网站开发 流程图网站开发用哪个linux
  • 怎么用自己电脑做服务器发布网站吗seo门户网价格是多少钱
  • 备案网站可以做影视站网站400
  • 四川住房与城乡建设部网站注册登记
  • 网站建设第三方沈阳工程最新动态
  • 兰州做网站客户上海企业在线登记
  • 新乡公司做网站wordpress被大量注册
  • 小语种服务网站公众号平台建设网站
  • 免费做mc皮肤网站企业网站建设合同模板
  • 做网站可以申请个体户么网站的定位分析
  • jsp做的零食网站下载wordpress侧边栏折叠
  • 帝国网站单页做301南京旅游网站建设公司
  • 网站sem优化怎么做网站建设推广安徽
  • 比较好的室内设计网站潍坊网络科技
  • 南宁网站建设公设计联盟网站
  • 多个图表统计的网站怎么做百度推广费2800元每年都有吗
  • 连江县住房和城乡建设局网站企业类网站模版
  • 临沂seo整站优化厂家网站建设 大公司排名
  • 网站开发有哪些方式百度导航怎么下载
  • 网站认证免费视频直播网站建设方案
  • 瀑布流分享网站源代码下载网站构建的一般流程是什么
  • wordpress 4.9 多站wordpress邮箱解析
  • 微信网站开发企业汽车网站设计模板
  • 如何提升网站转化率遵义市公共资源交易平台
  • 网站目录管理模板企业解决方案部
  • 建设网站上申请劳务资质吗珠海哪个公司建设网站好
  • c2c商城网站建设在微信怎么开发公众号
  • 美的公司网站建设的目的做个网站要钱吗
  • 和县建设局网站孟州网站建设