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

炸裂!用 Spring Boot 搭 Flowable 搞工作流居然這么爽

開發(fā) 前端
直到遇到了 Flowable,這個和 Spring Boot 天生一對的工作流引擎,才讓我體驗到什么叫「絲滑開發(fā)」。今天咱就來嘮嘮,怎么用 Spring Boot 把 Flowable 玩出花,讓工作流開發(fā)爽到飛起!

兄弟們,不知道你們有沒有被工作流系統折磨過?反正我之前接手過一個老項目,里面的工作流代碼簡直像盤絲洞 —— 各種硬編碼的狀態(tài)機、密密麻麻的 if-else 嵌套,改一個審批節(jié)點能讓我在代碼里迷路三天。每次需求變動都想仰天長嘯:難道就沒有優(yōu)雅點的工作流解決方案嗎?

直到遇到了 Flowable,這個和 Spring Boot 天生一對的工作流引擎,才讓我體驗到什么叫「絲滑開發(fā)」。今天咱就來嘮嘮,怎么用 Spring Boot 把 Flowable 玩出花,讓工作流開發(fā)爽到飛起!

一、先把環(huán)境整明白:準備工作不踩坑

1. 新建 Spring Boot 項目(手殘黨也能秒懂)

打開你的 IDEA,新建一個 Spring Boot 項目。記得選 Web 模塊,畢竟咱后續(xù)可能要搞點接口測試啥的。如果用命令行的話,一行命令搞定:

spring init --name=flowable-demo --groupId=com.example --artifactId=flowable-demo --version=2.7.12 --packaging=jar --dependencies=web,mysql,flowable-spring-boot-starter-process flowable-demo

這里重點說下依賴 flowable-spring-boot-starter-process,這可是 Flowable 和 Spring Boot 聯姻的關鍵信物,自帶自動配置功能,能讓我們少寫一大堆繁瑣配置。

2. 數據庫配置:和 MySQL 做好朋友

咱先給項目找個「倉庫」存流程數據。打開 application.properties,加上數據庫配置:

spring.datasource.url=jdbc:mysql://localhost:3306/flowable_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

注意這里用了 MySQL 8.0 的驅動,如果你的數據庫是 5.x 版本,記得把驅動換成 com.mysql.jdbc.Driver,不然可能會報「找不到驅動」的玄學錯誤哦。

3. Flowable 核心配置:讓引擎聽指揮

接著告訴 Flowable 咱們的需求:

# 關閉自動部署(開發(fā)階段建議關閉,避免每次啟動都重新部署流程)
flowable.engine.auto-deploy-process-definitions=false
# 開啟流程模型編輯器(后面畫流程圖全靠它)
flowable.ui.modeler.enabled=true
# 設置歷史記錄級別(記錄所有操作,方便排查問題)
flowable.history.level=full

這里重點說下 history.level,默認是 audit,只會記錄關鍵事件,咱們設為 full 后,連任務的創(chuàng)建、分配、完成時間都會記錄下來,調試的時候簡直不要太方便。

二、流程設計初體驗:用可視化工具畫流程圖

1. 啟動項目,打開 Modeler 界面

把項目跑起來,訪問 http://localhost:8080/flowable-modeler,會看到一個登錄界面。別慌,Flowable 默認的賬號密碼是 admin/admin,輸進去就能看到高大上的流程設計器了。

這個界面有點像 Visio,左邊是各種流程元素,什么開始事件、用戶任務、結束事件,拖出來就能用。咱們來畫一個最簡單的請假流程:

  • 拖一個「開始事件」放在畫布上,這就是流程的起點。
  • 拖一個「用戶任務」,改名叫「部門經理審批」,這一步需要人來處理。
  • 再拖一個「用戶任務」,改名叫「HR 審批」。
  • 最后拖一個「結束事件」。

然后用連接線把它們按順序連起來,一個簡單的串行審批流程就畫好了。

2. 給任務節(jié)點加屬性:告訴引擎找誰干活

雙擊「部門經理審批」節(jié)點,在右邊的屬性面板里,找到「Assignee」(任務負責人),這里可以寫固定的用戶 ID,比如 manager,不過實際項目中肯定是動態(tài)指定的,后面咱會用代碼實現。先記住這個地方,后面會用到。

3. 導出流程定義:讓代碼認識你的流程圖

畫好流程圖后,點擊左上角的保存,會讓你輸入流程名稱、key 等信息。流程 key 很重要,后面啟動流程的時候要靠它來識別,比如咱們設為 leaveProcess。保存后,點擊右上角的「導出為 XML」,會得到一個 .bpmn20.xml 文件,這個文件就是流程定義的核心,后面要部署到引擎里。

三、代碼實現:讓流程跑起來才是硬道理

1. 引入流程引擎對象:Flowable 的核心工具

在 Spring Boot 里,Flowable 會自動注入一個 ProcessEngine 對象,里面封裝了所有操作流程的方法。咱們可以在需要的地方直接注入:

@Autowired
private ProcessEngine processEngine;

這個對象就像一個超級管家,能幫我們部署流程、啟動流程、查詢任務等等,后面咱會頻繁用到它。

2. 部署流程定義:把流程圖交給引擎管理

有兩種方式部署流程,一種是直接讀取本地的 .bpmn20.xml 文件,另一種是通過 Modeler 界面上傳部署。咱們先試試代碼部署:

@RestController
@RequestMapping("/process")
public class ProcessController {
    @Autowired
    private RepositoryService repositoryService; // 流程定義相關服務
    @PostMapping("/deploy")
    public String deployProcess() {
        // 讀取流程文件
        ClassPathResource resource = new ClassPathResource("processes/leaveProcess.bpmn20.xml");
        try {
            InputStream inputStream = resource.getInputStream();
            // 部署流程
            Deployment deployment = repositoryService.createDeployment()
               .name("請假流程")
               .addInputStream("leaveProcess.bpmn20.xml", inputStream)
               .deploy();
            return "部署成功,部署 ID:" + deployment.getId();
        } catch (IOException e) {
            e.printStackTrace();
            return "部署失敗";
        }
    }
}

這里用到了 RepositoryService,它是專門管理流程定義和部署的服務。部署成功后,數據庫里的 ACT_RE_DEPLOYMENT、ACT_RE_PROCDEF 等表就會有數據了,這就是流程定義的元數據。

3. 啟動流程實例:讓流程開始跑起來

部署完流程后,就可以啟動流程實例了。比如小明要請假,就需要啟動一個請假流程的實例:

@PostMapping("/start")
public String startProcess(@RequestParam String userId) {
    // 使用流程 key 啟動流程,并傳遞參數(這里傳遞申請人 ID)
    Map<String, Object> variables = new HashMap<>();
    variables.put("applicant", userId); // 申請人 ID,后面審批時可能會用到
    ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leaveProcess", variables);
    return "流程啟動成功,流程實例 ID:" + processInstance.getId();
}

這里用到了 RuntimeService,它是管理運行中的流程實例和執(zhí)行對象的服務。啟動流程時可以傳遞變量,這些變量可以在流程節(jié)點中使用,比如在任務分配時,根據變量動態(tài)指定負責人。

4. 查詢用戶任務:讓用戶知道該干啥了

當流程走到用戶任務節(jié)點時,需要查詢當前用戶有哪些待辦任務。比如部門經理登錄系統,需要看到自己待審批的任務:

@GetMapping("/tasks")
public List<Task> getTasks(@RequestParam String userId) {
    List<Task> tasks = taskService.createTaskQuery()
       .taskAssignee(userId) // 根據任務負責人查詢
       .orderByTaskCreateTime().desc() // 按創(chuàng)建時間倒序排列
       .list();
    return tasks;
}

這里用到了 TaskService,專門管理任務的創(chuàng)建、分配、完成等操作。taskAssignee 就是咱們之前在流程圖里設置的任務負責人,不過實際項目中,更多是通過候選人或者候選組來分配任務,后面咱會講到。

5. 完成任務:推動流程往下走

用戶處理完任務后,需要完成任務,讓流程走到下一個節(jié)點。比如部門經理審批通過,任務就會到 HR 那里:

@PostMapping("/complete")
public String completeTask(@RequestParam String taskId, @RequestParam Map<String, Object> variables) {
    taskService.complete(taskId, variables); // 完成任務時可以傳遞變量,比如審批意見
    return "任務完成,流程繼續(xù)";
}

這里的 variables 可以傳遞審批結果、意見等信息,這些信息可以在后續(xù)節(jié)點中使用,比如 HR 審批時可以看到部門經理的意見。

四、進階操作:讓流程更靈活更強大

1. 動態(tài)分配任務:別再寫死負責人了

前面咱們在流程圖里寫死了任務負責人 manager,這在實際項目中肯定不行,畢竟不同的流程可能有不同的審批人。Flowable 支持多種任務分配方式:

  • 候選人(Candidate Users):任務可以分配給多個候選人,任何一個候選人都可以認領任務。
// 分配候選人
taskService.addCandidateUser(taskId, "user1");
taskService.addCandidateUser(taskId, "user2");
// 查詢候選人任務
List<Task> candidateTasks = taskService.createTaskQuery()
   .taskCandidateUser(userId)
   .list();
  • 候選組(Candidate Groups):把用戶分組,任務分配給組,組內成員都可以處理。
taskService.addCandidateGroup(taskId, "managerGroup");
  • 表達式分配:在流程圖里用 EL 表達式動態(tài)指定負責人,比如根據流程變量 managerId 來分配。
assignee="${managerId}"

2. 流程變量的妙用:讓流程更智能

流程變量就像流程里的「全局變量」,可以在各個節(jié)點之間傳遞數據。比如請假流程里的請假天數、請假原因,都可以作為流程變量存儲,還可以在流程條件中使用。比如添加一個條件分支,請假天數超過 3 天需要總經理審批:

在流程圖里加一個「排他網關」,連接線的條件表達式可以寫:

${days > 3}

然后在啟動流程時傳遞 days 變量,流程就會根據這個條件自動選擇走向。

3. 歷史數據查詢:出了問題別慌,有記錄可查

前面咱們設置了 history.level=full,現在可以用 HistoryService 來查詢歷史數據了。比如查詢某個流程實例的所有歷史任務:

@Autowired
private HistoryService historyService;

public void queryHistoryTasks(String processInstanceId) {
    List<HistoricTaskInstance> tasks = historyService.createHistoricTaskInstanceQuery()
       .processInstanceId(processInstanceId)
       .orderByHistoricTaskInstanceStartTime().asc()
       .list();
    for (HistoricTaskInstance task : tasks) {
        System.out.println("任務名稱:" + task.getName() + ",負責人:" + task.getAssignee() + ",狀態(tài):" + task.getTaskStatus());
    }
}

還可以查詢歷史流程變量、歷史審批意見等,簡直是排查問題的神器。

4. 與 Spring Security 集成:安全問題不能忽視

如果你的項目用了 Spring Security 做權限管理,Flowable 的 Modeler 界面也需要做權限控制。可以自定義一個認證處理器,實現 FlowableAuthenticationProvider 接口,把 Spring Security 的用戶信息傳遞給 Flowable。具體代碼有點多,這里就不展開了,后面咱們可以專門寫一篇講權限集成的文章。

五、實戰(zhàn)案例:搞一個完整的請假流程

1. 流程圖設計(升級版)

咱們來設計一個更真實的請假流程:

  • 開始事件 -> 申請人填寫請假單(用戶任務,收集請假天數、原因等信息)
  • -> 排他網關(判斷請假天數是否超過 3 天)

是 -> 部門經理審批 -> HR 審批 -> 總經理審批(如果是管理層請假,跳過總經理審批)

否 -> HR 審批

  • 結束事件

這里用到了網關和條件分支,讓流程更靈活。畫流程圖的時候,記得給每個節(jié)點起有意義的名字,方便后續(xù)代碼處理。

2. 服務層代碼實現(關鍵邏輯)

@Service
publicclass LeaveProcessService {

    @Autowired
    private RuntimeService runtimeService;
    @Autowired
    private TaskService taskService;

    // 啟動請假流程
    publicString startLeaveProcess(String applicant, int days, String reason) {
        Map<String, Object> variables = new HashMap<>();
        variables.put("applicant", applicant);
        variables.put("days", days);
        variables.put("reason", reason);
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leaveProcess", variables);
        return processInstance.getId();
    }

    // 審批任務(支持通過/拒絕)
    publicvoid approveTask(String taskId, String approver, boolean approved, String comment) {
        Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
        if (task == null) {
            thrownew RuntimeException("任務不存在");
        }
        // 先認領任務(如果是候選人)
        taskService.claim(taskId, approver);
        Map<String, Object> variables = new HashMap<>();
        variables.put("approved", approved);
        variables.put("comment", comment);
        taskService.complete(taskId, variables);
    }

    // 查詢當前用戶的待辦任務(包括候選任務)
    public List<Task> get待辦任務(String userId) {
        return taskService.createTaskQuery()
           .taskAssignee(userId)
           .or()
           .taskCandidateUser(userId)
           .endOr()
           .orderByTaskCreateTime().desc()
           .list();
    }
}

這里重點處理了候選人任務的認領、審批意見的記錄,以及復雜的任務查詢條件。

3. 測試流程(Postman 走起)

  • 啟動流程:POST /process/start?userId=xiaoming,請求體傳 {"days": 5, "reason": "去看偶像演唱會"}
  • 查詢小明的任務:此時沒有任務,因為第一個任務是申請人填寫請假單,這里咱們簡化了,假設啟動流程后直接到部門經理審批。
  • 部門經理審批:POST /process/complete?taskId=123&variables={"approved": true, "comment": "同意"}
  • 查看流程狀態(tài):通過 runtimeService.createProcessInstanceQuery().processInstanceId(xxx).singleResult() 查看是否走到下一個節(jié)點。

六、常見問題與解決方案:踩過的坑都給你填上

1. 依賴沖突:找不到 Flowable 的類

有時候引入 Flowable 依賴后,會和 Spring Boot 的某些版本沖突,比如出現 ClassNotFoundException: org.flowable.engine.ProcessEngine。這時候可以檢查 pom.xml 里的依賴版本,確保 Flowable 的版本和 Spring Boot 兼容,或者排除沖突的依賴:

<dependency>
    <groupId>org.flowable</groupId>
    <artifactId>flowable-spring-boot-starter-process</artifactId>
    <version>6.8.0</version>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

2. 流程定義版本問題:改了流程圖沒生效

每次部署流程定義時,Flowable 會生成新的版本。如果啟動流程時還是用舊的 key,可能會走到舊版本的流程。可以在部署時加上 deploymenyName 和 key,或者在啟動流程時指定版本:

ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leaveProcess", "1.0"); // 指定版本 1.0

或者直接用最新版本:

ProcessInstance processInstance = runtimeService.createProcessInstanceBuilder()
   .processDefinitionKey("leaveProcess")
   .latestVersion()
   .start();

3. 任務查詢性能問題:數據量大了查不動

當任務表數據量很大時,taskService.createTaskQuery().list() 會很慢。可以給 ACT_RU_TASK 表的 ASSIGNEE、CANDIDATE_USER 等字段加索引,或者分頁查詢:

Page<Task> tasks = taskService.createTaskQuery()
   .taskAssignee(userId)
   .orderByTaskCreateTime().desc()
   .listPage(pageable.getPageNumber(), pageable.getPageSize());

4. 中文亂碼問題:流程節(jié)點名稱顯示亂碼

如果在流程圖里用了中文,部署后數據庫里顯示亂碼,需要檢查數據庫連接是否設置了正確的字符集,以及 Modeler 保存時是否編碼正確。確保數據庫、連接 URL、表結構都是 UTF-8 編碼。

七、Flowable 對比其他工作流引擎:為啥選它?

1. 對比 Activiti

Flowable 其實是從 Activiti 團隊分裂出來的,兼容性很好,Activiti 的流程定義可以直接拿到 Flowable 里用。但 Flowable 在性能和擴展性上做了優(yōu)化,比如支持分布式部署、更好的異步處理,而且社區(qū)活躍度更高,文檔更詳細。

2. 對比 Camunda

Camunda 功能很強大,支持云部署,但商業(yè)版收費較高,社區(qū)版功能有限。Flowable 保持了開源免費策略,同時提供了企業(yè)版支持,性價比更高,適合中小團隊使用。

3. 為啥和 Spring Boot 是絕配?

  • 自動配置:不用手動寫一堆配置類,開箱即用。
  • 無縫集成:和 Spring 的依賴注入、事務管理、安全框架完美結合。
  • 生態(tài)豐富:可以和 Spring Cloud、MyBatis 等框架輕松搭配,拓展性強。

八、總結:爽在哪里?

用 Spring Boot 搭 Flowable 搞工作流,爽就爽在這幾個地方:

  1. 開發(fā)效率高:不用從頭寫工作流邏輯,可視化設計器讓流程建模像搭積木。
  2. 維護成本低:流程變更只需要改流程圖,部署新版本即可,代碼幾乎不用動。
  3. 擴展性強:支持各種復雜流程場景,無論是串行、并行、分支、循環(huán),都能輕松搞定。
  4. 調試方便:豐富的歷史記錄和查詢接口,讓你隨時知道流程走到哪一步,出了問題分分鐘定位。

當然,Flowable 還有很多高級功能等著咱們去探索,比如流程監(jiān)控、作業(yè)調度、表單集成等等。下次再有人說工作流開發(fā)麻煩,你可以直接甩出這篇文章,讓他們見識一下什么叫爽到飛起的開發(fā)體驗!

責任編輯:武曉燕 來源: 石杉的架構筆記
相關推薦

2022-07-07 08:38:15

Springflowable引擎

2023-08-02 18:48:23

Flowable工作流引擎

2024-07-05 11:47:43

2022-03-07 10:26:25

開源springboot項目

2025-09-04 01:33:00

Flowable工作流引擎

2024-03-26 08:08:08

SpringBPMN模型

2022-10-26 08:00:43

Activiti工作流BPM

2019-03-28 11:07:56

Spring BootRedis緩存

2021-10-14 11:34:05

技術工作流引擎

2023-01-05 13:36:41

Script優(yōu)化任務

2023-09-11 11:53:51

物聯網協議物聯網

2013-04-23 10:28:08

IBeamMDAAWF

2024-04-25 08:00:00

DevOps架構軟件開發(fā)

2011-05-25 17:04:41

ibmdwLotus

2020-06-09 08:30:55

微軟瀏覽器Windows

2009-03-03 09:13:36

工作流BPM業(yè)務流程

2010-01-04 17:42:50

SilverLight

2012-07-23 10:36:46

工作流

2023-01-04 08:02:16

工作流架構設計

2023-07-05 09:48:44

Activiti部署
點贊
收藏

51CTO技術棧公眾號

黑人乱码一区二区三区av| 日本三级日本三级日本三级极| 国产综合在线观看| 日韩电影在线观看电影| y97精品国产97久久久久久| 99久久综合网| 男人最爱成人网| 日韩一区中文字幕| 精品蜜桃传媒| 国产精品久久影视| 国产婷婷精品| www日韩欧美| 亚洲精品中文字幕在线播放| 91天天综合| 亚洲国产wwwccc36天堂| 亚洲黄色成人久久久| 无套内谢的新婚少妇国语播放| 免费在线视频一区| 午夜精品一区二区三区在线| 日本二区三区视频| 外国成人在线视频| 精品国产亚洲一区二区三区在线观看| 992kp快乐看片永久免费网址| 一级做a爰片久久| 少妇高潮在线观看| 国产精品一在线观看| 精品欧美一区二区三区精品久久| 欧美 日韩 国产 激情| 性欧美video高清bbw| 欧美国产精品久久| 精品欧美一区二区在线观看视频 | 在线影视一区二区三区| 久久99久久99精品| 国产一二三区在线观看| 国产亚洲精品aa| 女女同性女同一区二区三区91| 国产黄色小视频在线观看| 蜜桃传媒麻豆第一区在线观看| 91tv亚洲精品香蕉国产一区7ujn| 波多野结衣亚洲色图| 99久久综合| 中文在线不卡视频| 亚洲av成人无码久久精品| 日韩欧美中文字幕电影| 亚洲第一中文字幕| 日本三级日本三级日本三级极| 99精品在免费线中文字幕网站一区 | silk一区二区三区精品视频 | 国产一区不卡| 日韩精品中文字幕在线观看| 在线观看免费视频黄| 国产午夜亚洲精品一级在线| 欧美喷潮久久久xxxxx| 久久精品免费网站| 免费观看成人性生生活片| 欧美性xxxxxx| av动漫在线观看| 天堂在线中文网官网| 天天做天天摸天天爽国产一区 | 亚洲电影免费观看高清完整版在线观看| 国产精品igao网网址不卡| avtt久久| 精品国内片67194| 中国黄色片视频| 欧美1区2区3区4区| 亚洲天堂av综合网| 在线免费观看视频| 欧美电影《睫毛膏》| 日韩色av导航| 久久久99精品| 国产亚洲一级| 国产精品视频免费观看www| 97caocao| 国产91精品久久久久久久网曝门| 国产伦精品一区二区三| 五月婷婷在线播放| 国产欧美精品日韩区二区麻豆天美 | bl动漫在线观看| 国产a∨精品一区二区三区仙踪林| 久久中文字幕av一区二区不卡| 日韩在线激情视频| 欧美日韩一级大片| 国产精品久久久免费| 国产成人精品一区二区| 中文字幕欧美人妻精品| 国产精品一品二品| 久久国产精品亚洲va麻豆| 波多野结衣在线网站| **欧美大码日韩| 男人添女人荫蒂免费视频| 热色播在线视频| 在线观看久久久久久| 国产精品久久久久久久9999| 中文字幕视频在线播放| 黑人精品欧美一区二区蜜桃| 不卡视频一区二区| 青青操视频在线| 国产精品久久久久一区二区三区| 99热都是精品| 日韩精品美女| 欧美一区二区视频网站| 无码人妻aⅴ一区二区三区| 水蜜桃久久夜色精品一区| 欧美黄色性视频| www.久久网| 成人手机在线视频| 性刺激综合网| а√天堂8资源中文在线| 欧美性xxxxxx少妇| youjizz.com国产| 成人久久一区| 国模视频一区二区| 96日本xxxxxⅹxxx17| 久久影院午夜片一区| 浴室偷拍美女洗澡456在线| 日韩伦理三区| 欧美xxxxx牲另类人与| 亚洲а∨天堂久久精品2021| 黄色成人精品网站| 国产一区私人高清影院| 婷婷五月综合激情| 亚洲男人天堂av| 五月婷婷狠狠操| 好吊妞视频这里有精品| 久久精品国产99国产精品澳门| 四虎永久在线精品| 国产麻豆91精品| 亚洲精品成人自拍| 欧美电影网站| 欧美成人伊人久久综合网| 性高潮久久久久久久久| 国产高清成人久久| 99re66热这里只有精品8| 欧美专区福利在线| 蜜桃视频污在线观看| 亚洲精品成人精品456| 一区二区xxx| 狠狠色丁香婷婷综合影院| 91国内在线视频| 老牛影视av牛牛影视av| 亚洲综合在线五月| 国产成人精品综合久久久久99| 99久久精品网| 国产在线视频欧美| 在线国产91| 欧美日韩免费高清一区色橹橹| 人妻av无码一区二区三区| 午夜影院日韩| 免费成人在线观看av| 亚洲天堂免费电影| 日韩国产欧美精品一区二区三区| 国产真人真事毛片| 成人午夜激情影院| 97在线国产视频| 国产香蕉精品| 欧美影院在线播放| 欧美xxx.com| 欧美性淫爽ww久久久久无| 国产一级久久久久毛片精品| 日韩高清电影一区| 亚洲v欧美v另类v综合v日韩v| 欧美国产日韩电影| 播播国产欧美激情| www.污视频| 婷婷综合在线观看| 亚洲日本精品视频| 久久99九九99精品| 亚洲天堂第一区| 久久99精品久久久久久欧洲站 | 草草地址线路①屁屁影院成人| 国产日韩亚洲欧美精品| 蜜桃导航-精品导航| 最新欧美电影| 久久精品人人爽| 亚洲xxx在线| 欧美日韩免费网站| 久久国产精品-国产精品| www.久久久久久久| 中文字幕av一区二区三区高| 日本国产一级片| 国自产拍偷拍福利精品免费一| 国产一区二区三区无遮挡 | 欧美色图首页| 精品乱子伦一区二区三区| 99久久久国产精品免费调教网站| 日韩在线免费观看视频| 亚洲成熟女性毛茸茸| 欧美午夜激情在线| 女同久久另类69精品国产| 国产激情一区二区三区四区| 欧美色图色综合| 久久视频精品| 国产高清不卡av| 美女网站视频一区| 色综合久综合久久综合久鬼88| 无码精品黑人一区二区三区| 欧美人妇做爰xxxⅹ性高电影| 久久婷婷国产麻豆91| 国产视频视频一区| 麻豆免费在线观看视频| 天堂精品中文字幕在线| 成年在线观看视频| 成人av资源电影网站| 国产精品免费观看高清| 免费成人黄色网| 91精品国产777在线观看| 久久久久久国产精品免费无遮挡| 日本免费在线视频不卡一不卡二| 久久久精品欧美| 好吊视频一二三区| 欧美久久久久久蜜桃| 久久99精品波多结衣一区| 亚洲三级久久久| 久久久久久久久久久国产精品| 国产精品一二三四| 久久99爱视频| 午夜在线视频观看日韩17c| 97在线免费视频观看| 日韩精品诱惑一区?区三区| 韩国成人av| 日韩高清二区| 91老司机精品视频| yiren22亚洲综合| 欧美性一区二区三区| 色呦呦在线免费观看| 久久亚洲精品网站| 无遮挡动作视频在线观看免费入口| 亚洲激情 国产| 黄色www视频| 日韩免费高清视频| 日日摸天天添天天添破| 午夜精品免费在线| 国产福利久久久| 亚洲一二三四在线| 欧美成人精品欧美一级| 成人欧美一区二区三区黑人麻豆| 国产伦精品一区二区三区视频女| 久久亚洲免费视频| 香蕉网在线播放| 91麻豆免费看片| 少妇精品一区二区| 99久久99久久精品免费观看| 国产69视频在线观看| 粉嫩高潮美女一区二区三区| 欧美高清精品一区二区| 国产一区二区在线观看视频| 毛片毛片毛片毛| 国产一区二区三区香蕉| 亚洲天堂伊人网| 国产精品资源在线看| 在线成人免费av| 成人国产精品免费观看视频| 无码国产精品一区二区免费式直播| 成人在线综合网| 亚洲av成人精品一区二区三区| 成人视屏免费看| 精品少妇人妻一区二区黑料社区| 99re热视频这里只精品| 亚洲综合色一区| 国产欧美日韩在线| 任我爽在线视频| 一区二区欧美视频| 国产精品欧美亚洲777777| 精品av中文字幕在线毛片| 亚洲天堂网在线观看| 91在线网址| 蜜臀久久99精品久久久无需会员 | 久久久久久亚洲| 国产理论在线| 国产成人精品日本亚洲专区61| 欧美色网在线| 91日本在线视频| 哺乳挤奶一区二区三区免费看| 精品久久久久久中文字幕动漫| 免费久久久久久久久| 亚洲图片在线观看| 午夜精品久久| 成人综合视频在线| 久久国产生活片100| 亚洲欧美一区二区三区不卡| 成人免费毛片嘿嘿连载视频| 熟女少妇一区二区三区| 国产精品国产三级国产普通话99 | 久久亚洲高清| 日韩亚洲一区在线| 91精品一区二区三区四区| 亚洲人成高清| 中文字幕永久有效| www.66久久| 蜜桃视频最新网址| 亚洲va韩国va欧美va精品| 精品国产xxx| 欧美一级一区二区| 日本一区高清| 久久69精品久久久久久国产越南| 欧美久久天堂| 91手机在线播放| 精品视频国产| 欧洲精品一区二区三区久久| 免费成人小视频| 国产xxxxxxxxx| 日韩毛片在线免费观看| 草久久免费视频| 日韩一级片网址| jyzzz在线观看视频| 国内成人精品一区| a天堂中文字幕| 国产精品小仙女| 好吊视频在线观看| 亚洲大片在线观看| 国产又粗又猛又黄又爽无遮挡| 日韩av在线免费观看一区| h片在线免费| 国产精品久久久久久久久免费 | 青青草国产成人av片免费| 激情av中文字幕| 中文字幕在线免费不卡| 一级黄色免费网站| 亚洲成人精品视频在线观看| 精品自拍一区| 国产精品网站入口| 精品一区亚洲| 91成人综合网| 国产一区二区三区精品欧美日韩一区二区三区 | av资源吧首页| 欧美大肚乱孕交hd孕妇| 国产在线1区| 成人黄色大片在线免费观看| 国产一区二区精品福利地址| 国产一线二线三线女| 国产精品一区二区久激情瑜伽 | 国产在线视频网| 欧洲精品久久久| 噜噜噜天天躁狠狠躁夜夜精品| 欧美a级免费视频| 国产乱子伦视频一区二区三区| 国产精品1区2区3区4区| 色婷婷综合久久久| 免费看男男www网站入口在线| 亚洲91精品在线观看| 狼人精品一区二区三区在线| 国产 欧美 日本| 懂色av噜噜一区二区三区av| 欧美精品入口蜜桃| 日韩欧美成人一区| 国产网红在线观看| av一区二区三区四区电影| 国产尤物精品| 老熟妇精品一区二区三区| 黑人狂躁日本妞一区二区三区| 亚洲 小说区 图片区 都市| 91wwwcom在线观看| 国产欧美日韩一区二区三区四区| 中文字幕第80页| 国产精品久久久久久久久果冻传媒 | 92福利视频午夜1000合集在线观看| 天天综合网91| 熟妇女人妻丰满少妇中文字幕| 欧美国产精品久久| 国产三级伦理片| 欧美激情精品久久久| 美女呻吟一区| 黄色一级免费大片| 亚洲色图在线播放| 亚洲国产999| 国产91精品青草社区| 国产调教一区二区三区| 亚洲美女性囗交| 一区二区欧美精品| 亚洲av成人无码网天堂| 日本一区二区三区在线播放| 久久综合99| 中文字幕天堂av| 色久综合一二码| 黄色免费在线观看| 国产免费一区二区三区| 先锋影音久久| 中文字幕在线看视频国产欧美| 美女精品视频| 欧美一区二区福利| 激情综合色综合久久综合| 国产精品成人免费一区二区视频| 亚洲精品videossex少妇| 欧美国产日韩电影| 少妇大叫太大太粗太爽了a片小说| 本田岬高潮一区二区三区| 中文字幕乱码人妻无码久久| 色综合久久88| 超碰成人久久| 国产大学生视频| 欧美精品视频www在线观看 | 亚洲一二三四久久| 福利视频在线看| 99久久精品无码一区二区毛片| 美女黄色成人网| 国产这里有精品| 国产一区二区三区在线观看网站| 激情五月综合婷婷| 熟妇人妻va精品中文字幕| 一区二区三区自拍|