精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Springboot整合Camunda工作流引擎實現審批流程實例

開發 前端
這里我不通過上面的rest api 進行部署,而是通過自定義的接口然后調用camunda的相關api來實現流程部署。

環境:Spingboot2.6.14 +
camunda-spring-boot-starter7.18.0

環境配置

依賴配置

<camunda.version>7.18.0</camunda.version>
<dependency>
  <groupId>org.camunda.bpm.springboot</groupId>
  <artifactId>camunda-bpm-spring-boot-starter-webapp</artifactId>
  <version>${camunda.version}</version>
</dependency>
<dependency>
  <groupId>org.camunda.bpm.springboot</groupId>
  <artifactId>camunda-bpm-spring-boot-starter-rest</artifactId>
  <version>${camunda.version}</version>
</dependency>

應用程序配置

camunda.bpm:
  webapp:
    # 設置管理控制臺的訪問上下文
    application-path: /workflow
  auto-deployment-enabled: true
  admin-user:
    # 配置登錄管理控制臺的用戶
    id: admin
    password: admin
    firstName: admin
  filter:
    create: All tasks
  database:
    #數據庫類型
    type: mysql 
    #是否自動更新表信息
    schema-update: true
logging:
  level:
    #配置日志,這樣在開發過程中就能看到每步執行的SQL語句了
    '[org.camunda.bpm.engine.impl.persistence.entity]': debug
---
spring:
  jersey:
    application-path: /api-flow
    type: servlet
    servlet:
      load-on-startup: 0

通過上面的配置后訪問控制臺:http://localhost:8100/workflow/

圖片

默認是沒有上面的tasks中的內容,這里是我之前測試數據

環境準備好后,接下來就可以設計工作流程。

上面的camunda-bpm-spring-boot-starter-rest依賴中定義了一系列操作camunda的 rest api 這api的實現是通過jersey實現,我們可以通過/api-flow前綴來訪問這些接口,具體有哪些接口,我們可以通過官方提供的camunda-bpm-run-7.18.0.zip

http://localhost:8080/swaggerui/#/

設計流程

這里設計兩個節點的審批流程,經理審批---》人事審批 流程。

圖片

經理審批節點

圖片

人事審批節點

上面配置了2個用戶任務節點,并且為每個任務節點都設置了表達式,指定節點的審批人。

最終生成的流程XML內容如下:

<?xml versinotallow="1.0" encoding="UTF-8"?>
<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" id="sample-diagram" targetNamespace="http://pack.org/bpmn" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
  <bpmn2:process id="Process_1" isExecutable="true">
    <bpmn2:startEvent id="StartEvent_1">
      <bpmn2:outgoing>Flow_18pxcpx</bpmn2:outgoing>
    </bpmn2:startEvent>
    <bpmn2:sequenceFlow id="Flow_18pxcpx" sourceRef="StartEvent_1" targetRef="Activity_0vs8hu4" />
    <bpmn2:userTask id="Activity_0vs8hu4" camunda:assignee="${uid}">
      <bpmn2:incoming>Flow_18pxcpx</bpmn2:incoming>
      <bpmn2:outgoing>Flow_0n014x3</bpmn2:outgoing>
    </bpmn2:userTask>
    <bpmn2:sequenceFlow id="Flow_0n014x3" sourceRef="Activity_0vs8hu4" targetRef="Activity_0bcruuz" />
    <bpmn2:userTask id="Activity_0bcruuz" camunda:assignee="${mid}">
      <bpmn2:incoming>Flow_0n014x3</bpmn2:incoming>
      <bpmn2:outgoing>Flow_0dsfy6s</bpmn2:outgoing>
    </bpmn2:userTask>
    <bpmn2:endEvent id="Event_1xosttx">
      <bpmn2:incoming>Flow_0dsfy6s</bpmn2:incoming>
    </bpmn2:endEvent>
    <bpmn2:sequenceFlow id="Flow_0dsfy6s" sourceRef="Activity_0bcruuz" targetRef="Event_1xosttx" />
  </bpmn2:process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1">
      <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
        <dc:Bounds x="252" y="252" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Activity_1py8b5e_di" bpmnElement="Activity_0vs8hu4">
        <dc:Bounds x="340" y="230" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Activity_0arbs87_di" bpmnElement="Activity_0bcruuz">
        <dc:Bounds x="500" y="230" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Event_1xosttx_di" bpmnElement="Event_1xosttx">
        <dc:Bounds x="662" y="252" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="Flow_18pxcpx_di" bpmnElement="Flow_18pxcpx">
        <di:waypoint x="288" y="270" />
        <di:waypoint x="340" y="270" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_0n014x3_di" bpmnElement="Flow_0n014x3">
        <di:waypoint x="440" y="270" />
        <di:waypoint x="500" y="270" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_0dsfy6s_di" bpmnElement="Flow_0dsfy6s">
        <di:waypoint x="600" y="270" />
        <di:waypoint x="662" y="270" />
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</bpmn2:definitions>

部署流程

這里我不通過上面的rest api 進行部署,而是通過自定義的接口然后調用camunda的相關api來實現流程部署。

上面的流程設計我是通過vue整合的camunda進行設計,并沒有使用官方提供的設計器。設計完成后直接上傳到服務端。

接口

@RestController
@RequestMapping("/camunda")
public class BpmnController {


  // 上傳路徑
  @Value("${gx.camunda.upload}")
  private String path ;
  
  // 通用的工作流操作api服務類
  @Resource
  private ProcessService processService ;
  
  @PostMapping("/bpmn/upload")
  public AjaxResult uploadFile(MultipartFile file, String fileName, String name) throws Exception {
    try {
      // 上傳并返回新文件名稱
      InputStream is = file.getInputStream() ;
      File storageFile = new File(path + File.separator + fileName) ;
      FileOutputStream fos = new FileOutputStream(new File(path + File.separator + fileName)) ;
      byte[] buf = new byte[10 * 1024] ;
      int len = -1 ;
      while((len = is.read(buf)) > -1) {
        fos.write(buf, 0, len) ;
      }
      fos.close() ;
      is.close() ;
      // 創建部署流程
      processService.createDeploy(fileName, name, new FileSystemResource(storageFile)) ;
      return AjaxResult.success();
    } catch (Exception e) {
      return AjaxResult.error(e.getMessage());
    }
  }
}

部署流程Service

// 這個是camunda spring boot starter 自動配置
@Resource
private RepositoryService repositoryService ;


public void createDeploy(String resourceName, String name, org.springframework.core.io.Resource resource) {
  try {
    Deployment deployment = repositoryService.createDeployment()
      .addInputStream(resourceName, resource.getInputStream())
      .name(name)
      .deploy();
    logger.info("流程部署id: {}", deployment.getId());
    logger.info("流程部署名稱: {}", deployment.getName());
  } catch (IOException e) {
    throw new RuntimeException(e) ;
  }
}

執行上面的接口就能將上面設計的流程部署到camunda中(其實就是將流程文件保存到了數據庫中,對應的數據表是:act_ge_bytearray)。

啟動流程

啟動流程還是一樣,通過我們自己的接口來實現。

接口

@RestController
@RequestMapping("/process")
public class ProcessController {


  @Resource
  private ProcessService processService ;
  
  // 根據流程定義id,啟動流程;整個流程需要動態傳2個參數(審批人),如果不傳將會報錯
  @GetMapping("/start/{processDefinitionId}")
  public AjaxResult startProcess(@PathVariable("processDefinitionId") String processDefinitionId) {
    Map<String, Object> variables = new HashMap<>() ;
    variables.put("uid", "1") ;
    variables.put("mid", "1000") ;
    processService.startProcessInstanceAssignVariables(processDefinitionId, "AKF", variables) ;
    return AjaxResult.success("流程啟動成功") ;
  }
}

服務Service接口

@Resource
private RuntimeService runtimeService ;


public ProcessInstance startProcessInstanceAssignVariables(String processDefinitionId, String businessKey, Map<String, Object> variables) {
  ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinitionId, businessKey, variables);
  logger.info("流程定義ID: {}", processInstance.getProcessDefinitionId());
  logger.info("流程實例ID: {}", processInstance.getId());
  logger.info("BussinessKey: {}", processInstance.getBusinessKey()) ;
  return processInstance ;
}

流程啟動后就可以查看當前需要自己審批的所有審批單

圖片


接口實現

@Resource
private TaskService taskService ;
@Resource
private ManagementService managementService ;
// 根據時間段查詢
public List<Task> queryTasksByBusinessAndCreateTime(String assignee, String businessKey, String startTime, String endTime) {
  NativeTaskQuery nativeQuery = taskService.createNativeTaskQuery() ;
  nativeQuery.sql("select distinct RES.* from " + managementService.getTableName(TaskEntity.class) +  " RES "
                  + " left join " + managementService.getTableName(IdentityLinkEntity.class) + " I on I.TASK_ID_ = RES.ID_ "
                  + " WHERE (RES.ASSIGNEE_ = #{assignee} or "
                  + " (RES.ASSIGNEE_ is null and I.TYPE_ = 'candidate' "
                  + " and (I.USER_ID_ = #{assignee} or I.GROUP_ID_ IN ( #{assignee} ) ))) "
                  + " and RES.CREATE_TIME_ between #{startTime} and #{endTime} "
                  + " order by RES.CREATE_TIME_ asc LIMIT #{size} OFFSET 0") ;
  nativeQuery.parameter("assignee", assignee) ;
  nativeQuery.parameter("startTime", startTime) ;
  nativeQuery.parameter("endTime", endTime) ;
  nativeQuery.parameter("size", Integer.MAX_VALUE) ;
  return nativeQuery.list() ;
}

審批流程

流程啟動后,接下來就是各個用戶任務節點配置的用戶進行審批

接口

@GetMapping("/approve/{id}")
public AjaxResult approve(@PathVariable("id") String instanceId) {
  if (StringUtils.isEmpty(instanceId)) {
    return AjaxResult.error("未知審批任務") ;
  }
  // 下面的參數信息應該自行保存管理(與發起審批設置的指派人要一致)
  Map<String, Object> variables = new HashMap<>() ;
  // 第一個節點所要提供的遍歷信息(這里就是依次類推,mid等)
  variables.put("uid", "1") ;
  processService.executionTask(variables, instanceId, task -> {}, null) ;
  return AjaxResult.success() ; 
}

服務Service接口

@Resource
private TaskService taskService ;
@Resource
private RuntimeService runtimeService ;


@Transactional
public void executionTask(Map<String, Object> variables, String instanceId, Consumer<Task> consumer, String type) {
  Task task = taskService.createTaskQuery().processInstanceId(instanceId).singleResult() ;
  if (task == null) {
    logger.error("任務【{}】不存在", instanceId) ;
    throw new RuntimeException("任務【" + instanceId + "】不存在") ;
  }
  taskService.setVariables(task.getId(), variables);
  taskService.complete(task.getId(), variables) ;
  long count = runtimeService.createExecutionQuery().processInstanceId(instanceId).count();
  if (count == 0) {
    consumer.accept(task) ;
  }
}

以上就完成了從整個流程的生命周期:

設計流程 ---》部署流程 ---》啟動流程 ---》審批流程

完畢!!!

責任編輯:武曉燕 來源: 實戰案例錦集
相關推薦

2023-07-05 09:48:44

Activiti部署

2024-03-26 08:08:08

SpringBPMN模型

2021-12-17 08:39:39

SpringbootActiviti網關路由

2013-04-23 10:28:08

IBeamMDAAWF

2021-10-14 11:34:05

技術工作流引擎

2025-07-31 08:58:50

2025-04-27 03:00:00

Spring流程業務

2023-01-04 08:02:16

工作流架構設計

2011-12-14 09:58:58

JavajBPM

2015-07-14 09:26:28

微型工作流引擎設計

2024-10-17 08:39:32

2023-08-02 18:48:23

Flowable工作流引擎

2009-06-11 14:43:34

jbpm工作流引擎jBPM搭建

2009-09-01 18:26:23

C#工作流引擎

2023-03-26 00:53:04

camunda7camunda8流程引擎

2009-03-03 09:13:36

工作流BPM業務流程

2010-11-26 10:59:28

SharePoint

2025-10-17 08:22:32

2009-06-11 14:33:11

jbpm工作流引擎什么是jbpm

2014-07-31 17:03:12

點贊
收藏

51CTO技術棧公眾號

狠狠干视频网站| 国产精品中文字幕在线观看| 国产性猛交96| 乡村艳史在线观看| 国产日韩欧美制服另类| 成人黄色片网站| 日本免费一二三区| 成人系列视频| 精品日韩成人av| 男人天堂成人在线| 宅男网站在线免费观看| 91亚洲男人天堂| 国产精品视频导航| 日本三级片在线观看| 精品国产91久久久久久浪潮蜜月| 欧美日本乱大交xxxxx| 免费人成在线观看视频播放| 福利在线午夜| 99久久综合国产精品| 国产日韩av在线播放| 日本一区二区欧美| 外国成人免费视频| 亚洲香蕉成人av网站在线观看| 欧美日韩免费| 亚洲精品你懂的| 国产一区二区不卡视频在线观看| 成人免费毛片播放| 麻豆影视国产在线观看| 91在线看国产| 91在线精品播放| 波多野结衣家庭主妇| 亚洲天堂偷拍| 欧美成人精品xxx| 男人的天堂官网| 日韩激情啪啪| 亚洲精品一区二区在线观看| www.欧美激情.com| 久久精品资源| 欧美中文字幕一区二区三区亚洲| 我的公把我弄高潮了视频| 国产美女福利在线| 国产精品三级电影| 日本成人看片网址| 外国精品视频在线观看 | 九一免费在线观看| av中文字幕在线| 久久婷婷色综合| 久久国产精品一区二区三区| 狠狠躁日日躁夜夜躁av| 国产精品一区二区在线观看网站| 国产精品亚洲综合天堂夜夜| 免费又黄又爽又猛大片午夜| 久久天堂精品| 日本91av在线播放| 国产一级淫片a视频免费观看| 在线亚洲免费| 91av在线看| 看片网址国产福利av中文字幕| 激情欧美日韩一区| 国内精品久久久久影院优 | 欧美久久影院| 久久综合久久美利坚合众国| 日韩一区二区不卡视频| 亚洲91中文字幕无线码三区| 久久国产精彩视频| 欧美丰满熟妇bbbbbb| 综合精品一区| 欧美日韩成人免费| 国产亚洲小视频| 日韩亚洲国产精品| 青青草精品毛片| 国产精品高清无码| 精品亚洲免费视频| 91中文字精品一区二区| 亚洲第一视频在线播放| 成人av网站在线| 欧美不卡三区| 中国日本在线视频中文字幕| 最新热久久免费视频| 2021国产视频| 国产va在线视频| 日本高清不卡在线观看| 日韩av卡一卡二| 亚洲不卡视频| 亚洲免费高清视频| www成人啪啪18软件| 在线国产一区| 国产91精品不卡视频| 丰满人妻一区二区三区四区| 激情综合色丁香一区二区| 999在线观看免费大全电视剧| 黄色av中文字幕| 国产欧美在线观看一区| 欧美 国产 精品| 日韩av影片| 欧美喷潮久久久xxxxx| 亚洲欧美日韩中文字幕在线观看| 精品成人自拍视频| 尤物yw午夜国产精品视频| 少妇太紧太爽又黄又硬又爽小说 | 久久精品国产亚洲| 欧美一级视频免费观看| 蜜臀av性久久久久蜜臀av麻豆| 97超级碰碰| 岛国视频免费在线观看| 一区二区在线观看视频在线观看| 欧美女人性生活视频| 亚洲国产伊人| 日韩精品中文字幕在线观看 | 午夜国产精品一区| 最新天堂中文在线| 久久精品亚洲成在人线av网址| 色青青草原桃花久久综合| 免费日韩一级片| 激情综合一区二区三区| 欧美韩国日本精品一区二区三区| 在线播放蜜桃麻豆| 欧美天堂亚洲电影院在线播放| 91传媒理伦片在线观看| 国产精品久久久久久| 日本精品视频网站| 成人午夜精品福利免费| 亚洲欧洲日韩在线| 欧美三级午夜理伦三级| 成午夜精品一区二区三区软件| 久久精品色欧美aⅴ一区二区| 欧美亚洲另类小说| 不卡的av中国片| 综合操久久久| 久久久人成影片一区二区三区在哪下载 | 久久在线观看| 搡老女人一区二区三区视频tv| 国产一级精品视频| 丁香桃色午夜亚洲一区二区三区| 一个色的综合| 成人黄色图片网站| 亚洲人成电影网站色| 精品在线播放视频| 成人黄色777网| 男人天堂新网址| 久久gogo国模啪啪裸体| xxav国产精品美女主播| 夜夜嗨aⅴ一区二区三区| 国产亚洲精品资源在线26u| 精品视频在线观看一区| 久久大胆人体视频| 久久久久国产精品一区| wwwxxxx国产| 亚洲精品免费在线| 久久久久无码精品| 影视亚洲一区二区三区| 亚洲bt欧美bt日本bt| 久草中文在线| 日韩视频一区二区在线观看| 天天看片中文字幕| 国产麻豆视频一区二区| 麻豆传媒网站在线观看| 麻豆久久一区| 欧美福利视频在线观看| 亚洲精品国产手机| 亚洲成精国产精品女| 最近中文字幕无免费| 中文一区在线| 日本一区二区三区精品视频| 日韩在线观看不卡| 俺去了亚洲欧美日韩| 国产免费黄色网址| 亚洲制服丝袜av| 男人的天堂影院| 蜜桃av综合| 日本久久91av| 国产51人人成人人人人爽色哟哟| 欧美色视频在线观看| 日韩一区二区不卡视频| 国产91精品露脸国语对白| 性欧美大战久久久久久久| 日韩有码一区| 国产精品网站视频| 日本片在线看| 亚洲精品国产拍免费91在线| www.欧美色| 成人免费在线观看入口| 亚洲最大视频网| 欧美亚洲网站| 正在播放国产精品| 爱爱精品视频| 国产精品久久久久久久久久东京 | 免费电影一区二区三区| 国产啪精品视频网站| 久久香蕉av| 国产亚洲成精品久久| 国产麻豆免费视频| 亚洲va韩国va欧美va精品| 五月天综合视频| 国产高清在线观看免费不卡| 欧美三级午夜理伦三级| 66国产精品| 日本黑人久久| 丁香综合av| 国产精品一区久久| 97超碰免费在线| 色噜噜狠狠色综合网图区| 日本xxxx人| 91精品在线麻豆| 久久久久99精品成人片我成大片| 亚洲欧洲无码一区二区三区| 玖草视频在线观看| 国产在线精品视频| 久久国产成人精品国产成人亚洲| 91成人影院| 亚洲v国产v在线观看| 加勒比视频一区| 亚洲伊人第一页| 精品肉辣文txt下载| 韩日欧美一区二区| 18videosex性欧美麻豆| 亚洲天堂影视av| 色婷婷av一区二区三区之e本道| 欧美日韩电影一区| 日韩精品手机在线| 一区二区三区国产精品| a资源在线观看| 久久综合99re88久久爱| 91精品又粗又猛又爽| 精品亚洲免费视频| 国产wwwxx| 久久一本综合频道| 久久人人爽人人爽人人av| 一本一道久久a久久精品蜜桃| 日本婷婷久久久久久久久一区二区| 国产一区福利| 懂色中文一区二区三区在线视频| 成人黄色免费观看| 国产z一区二区三区| 日本不卡1234视频| 久久久噜噜噜久久久| 91cn在线观看| 欧美xxxx做受欧美.88| 亚洲欧美视频一区二区| 在线观看欧美日韩国产| 国产最新视频在线观看| 日韩电影网在线| 午夜视频免费看| 亚洲国产精彩中文乱码av| 亚洲第一成人av| 精品粉嫩超白一线天av| 精品区在线观看| 日韩欧美色电影| 国产丰满果冻videossex| 欧美一区二区三区日韩| 国产成人麻豆精品午夜在线| 日韩欧美一级在线播放| 超碰人人人人人人| 精品久久久久久综合日本欧美| 午夜精品久久久久久久爽| 亚洲成人免费在线视频| 日本精品一二区| 日韩精品在线电影| 丝袜+亚洲+另类+欧美+变态| 精品亚洲一区二区| 男男激情在线| 色yeye香蕉凹凸一区二区av| 免费av在线网址| 欧美福利小视频| 色综合桃花网| 国产精品久久久久久av下载红粉 | av一本久道久久波多野结衣| 亚洲精品国产九九九| 国产精品麻豆免费版| 任你躁在线精品免费| 色女孩综合网| 91精品啪在线观看国产18| 欧美大黑帍在线播放| 亚洲乱亚洲高清| 日本xxxxxxx免费视频| 久久er精品视频| 韩国av中国字幕| 久久精品亚洲乱码伦伦中文| 影音先锋男人看片资源| 亚洲欧美国产毛片在线| av大片免费在线观看| 精品视频1区2区3区| 精品国产伦一区二区三区| 亚洲国产精彩中文乱码av| 成年午夜在线| 欧美高跟鞋交xxxxxhd| 中文字幕资源网在线观看免费| 国产精品人成电影在线观看| 美国十次综合久久| 欧美成ee人免费视频| 91精品国产麻豆国产在线观看 | 精品电影一区二区| 国产综合在线观看| 欧美巨乳在线观看| 欧美国产大片| 97超碰人人看人人| 精品国产一级毛片| 日本香蕉视频在线观看| 日韩高清不卡一区二区| 免费观看污网站| 欧美激情综合在线| 久久精品欧美一区二区| 欧美伊人久久大香线蕉综合69| 亚洲国产剧情在线观看| 国产亚洲精品久久久优势 | 久久视频在线| 国产精品12345| 精品午夜久久福利影院| 无码人妻aⅴ一区二区三区| 最新国产成人在线观看| 久久久久久少妇| 精品国产伦一区二区三区观看体验 | 成人免费观看av| 天天操天天干天天操天天干| 精品福利免费观看| 国产高中女学生第一次| 国产一区二区三区中文| 超碰中文在线| 91免费版网站在线观看| 日韩三级在线| 日韩一级片播放| jvid福利写真一区二区三区| www欧美com| 欧美日韩一级二级| 青青操视频在线| 668精品在线视频| 视频一区中文字幕精品| 日本特级黄色大片| 蜜臀久久99精品久久久画质超高清| xxxxxx黄色| 亚洲va欧美va天堂v国产综合| wwwav在线播放| 九九热这里只有精品6| 97久久精品一区二区三区的观看方式| 欧美成人综合一区| 一区二区久久| 女同性恋一区二区三区| 一区二区三区日韩欧美| 国产欧美久久久精品免费| 中文字幕久热精品视频在线| 性高爱久久久久久久久| 欧美视频小说| 美女精品在线| 粉嫩av蜜桃av蜜臀av| 精品国产91久久久久久| 午夜福利一区二区三区| 69精品小视频| 日韩成人一级| 亚洲色欲综合一区二区三区| 91麻豆免费观看| 日本三级一区二区| 亚洲精品成人免费| 麻豆视频在线观看免费网站黄| 精品国产免费人成电影在线观... 精品国产免费久久久久久尖叫 | 日韩欧美看国产| 欧美性xxxx69| 奇米在线7777在线精品| 五月天免费网站| 制服丝袜亚洲网站| 50度灰在线| 国产一区二区久久久| 亚洲深夜福利| 亚洲精品视频久久久| 日本韩国欧美在线| 99精品老司机免费视频| 91久久久久久久久久久| 中文字幕一区二区三区乱码图片| 少妇高潮一69aⅹ| 午夜精品福利视频网站| 黄色美女网站在线观看| 国产精品爽爽爽| 欧美日本不卡高清| 国产精品无码一区二区三区免费 | 男人操女人免费| 国产精品久久久久久亚洲伦 | 中文字幕免费高| 成人免费视频视频在线观看免费| 日韩乱码人妻无码中文字幕| 亚洲欧美日韩中文视频| 99综合久久| 成人免费毛片在线观看| 久久免费视频一区| 国产一区二区在线视频聊天| 午夜精品久久久久久久99黑人| 欧美自拍视频| xxww在线观看| 亚洲成人精品影院| 国产福利第一视频在线播放| 亚洲va男人天堂| 久久精品麻豆| 美女的奶胸大爽爽大片| 亚洲人成五月天| 日韩欧美激情电影| 人妻精品无码一区二区三区 | 日韩免费黄色片| 中文字幕欧美视频在线| 999精品视频在这里| 簧片在线免费看| 亚洲妇女屁股眼交7| 午夜视频在线|