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

拒絕重復(fù)代碼,封裝一個(gè)多級(jí)菜單、多級(jí)評(píng)論、多級(jí)部門(mén)的統(tǒng)一工具類(lèi)!

開(kāi)發(fā) 開(kāi)發(fā)工具
為了簡(jiǎn)化開(kāi)發(fā)過(guò)程并提高代碼的可維護(hù)性,我們可以創(chuàng)建一個(gè)統(tǒng)一的工具類(lèi)來(lái)處理這些需求。在本文中,我將介紹如何使用SpringBoot創(chuàng)建一個(gè)返回多級(jí)菜單、多級(jí)評(píng)論、多級(jí)部門(mén)、多級(jí)分類(lèi)的統(tǒng)一工具類(lèi)。

一、介紹

你能看到很多人都在介紹如何實(shí)現(xiàn)多級(jí)菜單的效果,但是都有一個(gè)共同的缺點(diǎn),那就是沒(méi)有解決代碼會(huì)重復(fù)開(kāi)發(fā)的問(wèn)題。如果我需要實(shí)現(xiàn)多級(jí)評(píng)論呢,是否又需要自己再寫(xiě)一遍?

為了簡(jiǎn)化開(kāi)發(fā)過(guò)程并提高代碼的可維護(hù)性,我們可以創(chuàng)建一個(gè)統(tǒng)一的工具類(lèi)來(lái)處理這些需求。在本文中,我將介紹如何使用SpringBoot創(chuàng)建一個(gè)返回多級(jí)菜單、多級(jí)評(píng)論、多級(jí)部門(mén)、多級(jí)分類(lèi)的統(tǒng)一工具類(lèi)。

介紹數(shù)據(jù)庫(kù)字段設(shè)計(jì)

數(shù)據(jù)庫(kù)設(shè)計(jì)

「主要是介紹是否需要tree_path字段。」

多級(jí)節(jié)點(diǎn)的數(shù)據(jù)庫(kù)大家都知道,一般會(huì)有id,parentId字段,但是對(duì)于tree_path字段,這個(gè)需要根據(jù)設(shè)計(jì)者來(lái)定。

優(yōu)點(diǎn):

  • 如果你對(duì)數(shù)據(jù)的讀取操作比較頻繁,而且需要快速查詢(xún)某個(gè)節(jié)點(diǎn)的所有子節(jié)點(diǎn)或父節(jié)點(diǎn),那么使用tree_path 字段可以提高查詢(xún)效率。
  • tree_path 字段可以使用路徑字符串表示節(jié)點(diǎn)的層級(jí)關(guān)系,例如使用逗號(hào)分隔的節(jié)點(diǎn)ID列表。這樣,可以通過(guò)模糊匹配tree_path 字段來(lái)查詢(xún)某個(gè)節(jié)點(diǎn)的所有子節(jié)點(diǎn)或父節(jié)點(diǎn),而無(wú)需進(jìn)行遞歸查詢(xún)。
  • 你可以使用模糊匹配的方式,找到所有以該節(jié)點(diǎn)的 tree_path 開(kāi)頭的子節(jié)點(diǎn),并將它們刪除。而無(wú)需進(jìn)行遞歸刪除。

缺點(diǎn):

  • 每次插入時(shí),需要更新tree_path 字段,這可能會(huì)導(dǎo)致性能下降。
  • tree_path 字段的長(zhǎng)度可能會(huì)隨著樹(shù)的深度增加而增加,可能會(huì)占用更多的存儲(chǔ)空間。

因此,在設(shè)計(jì)數(shù)據(jù)庫(kù)評(píng)論字段時(shí),需要權(quán)衡使用treepath字段和父評(píng)論ID字段的優(yōu)缺點(diǎn),并根據(jù)具體的應(yīng)用場(chǎng)景和需求做出選擇。如果你更關(guān)注讀取操作的效率和查詢(xún)、刪除的靈活性,可以考慮使用tree_path 字段。如果你更關(guān)注寫(xiě)入操作的效率和數(shù)據(jù)一致性,并且樹(shù)的深度不會(huì)很大,那么使用父評(píng)論ID字段來(lái)實(shí)現(xiàn)多級(jí)評(píng)論可能更簡(jiǎn)單和高效。

二、統(tǒng)一工具類(lèi)具體實(shí)現(xiàn)

1. 定義接口,統(tǒng)一規(guī)范

對(duì)于有 lombok 的小伙伴,實(shí)現(xiàn)這個(gè)方法很簡(jiǎn)單,只需要加上@Data即可

/**
 * @Description: 固定屬性結(jié)構(gòu)屬性
 * @Author: yiFei
 */
publicinterface ITreeNode<T> {
    /**
     * @return 獲取當(dāng)前元素Id
     */
    Object getId();

    /**
     * @return 獲取父元素Id
     */
    Object getParentId();

    /**
     * @return 獲取當(dāng)前元素的 children 屬性
     */
    List<T> getChildren();

    /**
     * ( 如果數(shù)據(jù)庫(kù)設(shè)計(jì)有tree_path字段可覆蓋此方法來(lái)生成tree_path路徑 )
     *
     * @return 獲取樹(shù)路徑
     */
    default Object getTreePath() { return""; }
}

2. 編寫(xiě)工具類(lèi)TreeNodeUtil

其中我們需要實(shí)現(xiàn)能將一個(gè)List元素構(gòu)建成熟悉結(jié)構(gòu)

我們需要實(shí)現(xiàn)生成tree_path字段

我們需要優(yōu)雅的實(shí)現(xiàn)該方法

/**
 * @Description: 樹(shù)形結(jié)構(gòu)工具類(lèi)
 * @Author: yiFei
 */
publicclass TreeNodeUtil {

    privatestaticfinal Logger log = LoggerFactory.getLogger(TreeNodeUtil.class);

    publicstaticfinal String PARENT_NAME = "parent";

    publicstaticfinal String CHILDREN_NAME = "children";

    publicstaticfinal List<Object> IDS = Collections.singletonList(0L);

    publicstatic <T extends ITreeNode> List<T> buildTree(List<T> dataList) {
        return buildTree(dataList, IDS, (data) -> data, (item) -> true);
    }

    publicstatic <T extends ITreeNode> List<T> buildTree(List<T> dataList, Function<T, T> map) {
        return buildTree(dataList, IDS, map, (item) -> true);
    }
    
    publicstatic <T extends ITreeNode> List<T> buildTree(List<T> dataList, Function<T, T> map, Predicate<T> filter) {
        return buildTree(dataList, IDS, map, filter);
    }

    publicstatic <T extends ITreeNode> List<T> buildTree(List<T> dataList, List<Object> ids) {
        return buildTree(dataList, ids, (data) -> data, (item) -> true);
    }

    publicstatic <T extends ITreeNode> List<T> buildTree(List<T> dataList, List<Object> ids, Function<T, T> map) {
        return buildTree(dataList, ids, map, (item) -> true);
    }

    /**
     * 數(shù)據(jù)集合構(gòu)建成樹(shù)形結(jié)構(gòu) ( 注: 如果最開(kāi)始的 ids 不在 dataList 中,不會(huì)進(jìn)行任何處理 )
     *
     * @param dataList 數(shù)據(jù)集合
     * @param ids      父元素的 Id 集合
     * @param map      調(diào)用者提供 Function<T, T> 由調(diào)用著決定數(shù)據(jù)最終呈現(xiàn)形勢(shì)
     * @param filter   調(diào)用者提供 Predicate<T> false 表示過(guò)濾 ( 注: 如果將父元素過(guò)濾掉等于剪枝 )
     * @param <T>      extends ITreeNode
     * @return
     */
    publicstatic <T extends ITreeNode> List<T> buildTree(List<T> dataList, List<Object> ids, Function<T, T> map, Predicate<T> filter) {
        if (CollectionUtils.isEmpty(ids)) {
            return Collections.emptyList();
        }
        // 1. 將數(shù)據(jù)分為 父子結(jié)構(gòu)
        Map<String, List<T>> nodeMap = dataList.stream()
                .filter(filter)
                .collect(Collectors.groupingBy(item -> ids.contains(item.getParentId()) ? PARENT_NAME : CHILDREN_NAME));
    
        List<T> parent = nodeMap.getOrDefault(PARENT_NAME, Collections.emptyList());
        List<T> children = nodeMap.getOrDefault(CHILDREN_NAME, Collections.emptyList());
        // 1.1 如果未分出或過(guò)濾了父元素則將子元素返回
        if (parent.size() == 0) {
            return children;
        }
        // 2. 使用有序集合存儲(chǔ)下一次變量的 ids
        List<Object> nextIds = new ArrayList<>(dataList.size());
        // 3. 遍歷父元素 以及修改父元素內(nèi)容
        List<T> collectParent = parent.stream().map(map).collect(Collectors.toList());
        for (T parentItem : collectParent) {
            // 3.1 如果子元素已經(jīng)加完,直接進(jìn)入下一輪循環(huán)
            if (nextIds.size() == children.size()) {
                break;
            }
            // 3.2 過(guò)濾出 parent.id == children.parentId 的元素
            children.stream()
                    .filter(childrenItem -> parentItem.getId().equals(childrenItem.getParentId()))
                    .forEach(childrenItem -> {
                        // 3.3 這次的子元素為下一次的父元素
                        nextIds.add(childrenItem.getParentId());
                        // 3.4 添加子元素到 parentItem.children 中
                        try {
                            parentItem.getChildren().add(childrenItem);
                        } catch (Exception e) {
                            log.warn("TreeNodeUtil 發(fā)生錯(cuò)誤, 傳入?yún)?shù)中 children 不能為 null,解決方法: \n" +
                                    "方法一、在map(推薦)或filter中初始化 \n" +
                                    "方法二、List<T> children = new ArrayList<>() \n" +
                                    "方法三、初始化塊對(duì)屬性賦初值\n" +
                                    "方法四、構(gòu)造時(shí)對(duì)屬性賦初值");
                        }
                    });
        }
        buildTree(children, nextIds, map, filter);
        return parent;
    }


    /**
     * 生成路徑 treePath 路徑
     *
     * @param currentId 當(dāng)前元素的 id
     * @param getById   用戶(hù)返回一個(gè) T
     * @param <T>
     * @return
     */
    publicstatic <T extends ITreeNode> String generateTreePath(Serializable currentId, Function<Serializable, T> getById) {
        StringBuffer treePath = new StringBuffer();
        if (SystemConstants.ROOT_NODE_ID.equals(currentId)) {
            // 1. 如果當(dāng)前節(jié)點(diǎn)是父節(jié)點(diǎn)直接返回
            treePath.append(currentId);
        } else {
            // 2. 調(diào)用者將當(dāng)前元素的父元素查出來(lái),方便后續(xù)拼接
            T byId = getById.apply(currentId);
            // 3. 父元素的 treePath + "," + 父元素的id
            if (!ObjectUtils.isEmpty(byId)) {
                treePath.append(byId.getTreePath()).append(",").append(byId.getId());
            }
        }
        return treePath.toString();
    }

}

這樣我們就完成了 TreeNodeUtil 統(tǒng)一工具類(lèi),首先我們將元素分為父子兩類(lèi),讓其構(gòu)建出一個(gè)小型樹(shù),然后我們將構(gòu)建的子元素和下次遍歷的父節(jié)點(diǎn)傳入,遞歸的不斷進(jìn)行,這樣就構(gòu)建出了我們最終的想要實(shí)現(xiàn)的效果。

三、測(cè)試

定義一個(gè)類(lèi)實(shí)現(xiàn) ITreeNode

/**
 * @Description: 測(cè)試子元素工具類(lèi)
 * @Author: yiFei
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@AllArgsConstructor
publicclass TestChildren implements ITreeNode<TestChildren> {

    private Long id;

    private String name;

    private String treePath;

    private Long parentId;

    public TestChildren(Long id, String name, String treePath, Long parentId) {
        this.id = id;
        this.name = name;
        this.treePath = treePath;
        this.parentId = parentId;
    }

    @TableField(exist = false)
    private List<TestChildren> children = new ArrayList<>();
}

測(cè)試基本功能

測(cè)試基本功能代碼:

public static void main(String[] args) {
    List<TestChildren> testChildren = new ArrayList<>();
    testChildren.add(new TestChildren(1L, "父元素", "", 0L));
    testChildren.add(new TestChildren(2L, "子元素1", "1", 1L));
    testChildren.add(new TestChildren(3L, "子元素2", "1", 1L));
    testChildren.add(new TestChildren(4L, "子元素2的孫子元素", "1,3", 3L));

    testChildren = TreeNodeUtil.buildTree(testChildren);

    System.out.println(JSONUtil.toJsonStr(Result.success(testChildren)));
}

返回結(jié)果:

{
 "code": "00000",
"msg": "操作成功",
"data": [{
"id": 1,
"name": "父元素",
"treePath": "",
"parentId": 0,
"children": [{
   "id": 2,
   "name": "子元素1",
   "treePath": "1",
   "parentId": 1,
   "children": []
  }, {
   "id": 3,
   "name": "子元素2",
   "treePath": "1",
   "parentId": 1,
   "children": [{
    "id": 4,
    "name": "子元素2的孫子元素",
    "treePath": "1,3",
    "parentId": 3,
    "children": []
   }]
  }]
 }]
}

測(cè)試過(guò)濾以及重構(gòu)數(shù)據(jù)

測(cè)試代碼:

public static void main(String[] args) {
    List<TestChildren> testChildren = new ArrayList<>();
    testChildren.add(new TestChildren(1L, "父元素", "", 0L));
    testChildren.add(new TestChildren(2L, "子元素1", "1", 1L));
    testChildren.add(new TestChildren(3L, "子元素2", "1", 1L));
    testChildren.add(new TestChildren(4L, "子元素2的孫子元素", "1,3", 3L));

    testChildren = TreeNodeUtil.buildTree(testChildren);

    System.out.println(JSONUtil.toJsonStr(Result.success(testChildren)));
}

返回結(jié)果 :

{
 "code": "00000",
"msg": "操作成功",
"data": [{
"id": 1,
"name": "父元素",
"treePath": "",
"parentId": 0,
"children": [{
   "id": 2,
   "name": "子元素1",
   "treePath": "1",
   "parentId": 1,
   "children": []
  }, {
   "id": 3,
   "name": "子元素2",
   "treePath": "1",
   "parentId": 1,
   "children": [{
    "id": 4,
    "name": "子元素2的孫子元素",
    "treePath": "1,3",
    "parentId": 3,
    "children": []
   }]
  }]
 }]
}

測(cè)試過(guò)濾以及重構(gòu)數(shù)據(jù)

測(cè)試代碼:

// 對(duì) 3L 進(jìn)行剪枝,對(duì) 1L 進(jìn)行修改
testChildren = TreeNodeUtil.buildTree(testChildren, (item) -> {
    if (item.getId().equals(1L)) {
        item.setName("更改了 Id 為 1L 的數(shù)據(jù)名稱(chēng)");
    }
    return item;
}, (item) -> item.getId().equals(3L));

返回結(jié)果:

{
 "code": "00000",
"msg": "操作成功",
"data": [{
"id": 1,
"name": "更改了 Id 為 1L 的數(shù)據(jù)名稱(chēng)",
"treePath": "",
"parentId": 0,
"children": [{
   "id": 2,
   "name": "子元素1",
   "treePath": "1",
   "parentId": 1,
   "children": []
  }]
 }]
}

接下來(lái)的測(cè)試結(jié)果以口述的方式講解

測(cè)試傳入錯(cuò)誤的 ids

  • 返回傳入的 testChildren

測(cè)試傳入具有父子結(jié)構(gòu),但是 ids 傳錯(cuò)的情況 (可以根據(jù)實(shí)際需求更改是否自動(dòng)識(shí)別父元素)

  • 返回傳入的 testChildren

測(cè)試  testChildren 中 children元素為 null

  • 給出提示,不構(gòu)建樹(shù)

測(cè)試 generateTreePath 生成路徑

  • 返回路徑
責(zé)任編輯:武曉燕 來(lái)源: 碼猿技術(shù)專(zhuān)欄
相關(guān)推薦

2019-08-01 08:36:51

緩存系統(tǒng)并發(fā)

2022-06-13 10:23:34

Helios緩存服務(wù)端

2024-11-27 16:07:45

2022-06-28 14:19:38

Vue路由監(jiān)控

2025-09-09 07:35:00

NginxVue前端

2009-06-30 10:46:05

多級(jí)指針

2010-05-17 14:08:18

MySQL 多級(jí)同步

2012-05-02 10:41:31

ASP.NET

2025-09-26 09:31:16

2009-08-30 15:14:13

SCOUNIX多級(jí)域名

2010-05-17 11:26:49

MySQL 多級(jí)同步

2025-08-11 01:55:00

2024-02-20 14:10:55

系統(tǒng)緩存冗余

2023-05-05 18:38:33

多級(jí)緩存Caffeine開(kāi)發(fā)

2025-03-27 04:10:00

2023-09-12 07:31:32

內(nèi)存LyMemoryWIN10

2015-08-17 10:50:51

美團(tuán)多級(jí)下拉菜單簡(jiǎn)潔

2009-11-27 16:35:01

php函數(shù)mkdir

2025-08-08 07:09:58

2018-08-19 13:27:21

數(shù)據(jù)庫(kù)緩存數(shù)據(jù)庫(kù)減負(fù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

亚洲人体大胆视频| 欧美暴力调教| 91在线观看下载| 日本成人黄色片| 在线观看天堂av| av动漫精品一区二区| 色综合久久久久| 永久域名在线精品| 天天爽夜夜爽夜夜爽| 日韩国产欧美在线视频| 久久91精品国产91久久久| 女同性恋一区二区三区| 国产精品高潮久久| 精品国产乱码久久久久酒店| 亚洲一区二区在线观| 黄色aaa大片| 毛片一区二区三区| 4388成人网| 三级影片在线看| 少妇精品久久久| 欧美xxxx老人做受| 国产原创精品在线| 国产伦精品一区二区三区视频金莲| 亚洲色欲色欲www| 欧美日韩精品免费看| 国产视频在线观看视频| 日日骚欧美日韩| 午夜免费日韩视频| 劲爆欧美第一页| 日韩一级毛片| 亚洲天堂av网| 亚洲色偷偷色噜噜狠狠99网| 国产精品欧美一区二区三区不卡 | 成人免费av网站| 国产在线播放不卡| 超碰在线免费97| 午夜在线视频观看日韩17c| 欧美大片欧美激情性色a∨久久| 永久免费av无码网站性色av| 国产精品久av福利在线观看| 日韩欧美在线综合网| 尤物网站在线看| 亚洲我射av| 911精品产国品一二三产区| 日韩一级理论片| 亚洲伦理影院| 91国模大尺度私拍在线视频| 久久无码高潮喷水| 小h片在线观看| 欧美日韩国产精品专区 | 亚洲色婷婷一区二区三区| 日韩在线欧美| 精品激情国产视频| 91精品少妇一区二区三区蜜桃臀| 欧美电影三区| x99av成人免费| 激情五月激情综合| 天天综合久久| 久久中文字幕国产| 欧美成人精品激情在线视频| 欧美精品网站| 久久免费精品日本久久中文字幕| 美女的奶胸大爽爽大片| 国产精品v亚洲精品v日韩精品| 蜜臀久久99精品久久久无需会员 | 久久精品蜜桃| 99re6这里只有精品视频在线观看| 国产亚洲情侣一区二区无| 午夜成人鲁丝片午夜精品| 91小视频免费看| 欧美日韩免费观看一区| av电影在线观看| 中文字幕亚洲成人| 东北少妇不带套对白| 欧美亚洲日本精品| 欧美性感一类影片在线播放| 国产3p在线播放| 成人av资源网址| 日韩久久精品电影| 亚洲激情图片网| 欧美日韩精品| 欧美在线一区二区视频| 中文字幕高清在线免费播放| 美女mm1313爽爽久久久蜜臀| 91中文在线视频| 午夜小视频在线播放| 欧美激情在线观看视频免费| 欧美 国产 精品| 国产传媒在线观看| 欧美三级蜜桃2在线观看| 曰本三级日本三级日本三级| 久久国产精品免费精品3p| 国产一区二区三区免费视频| 亚洲欧美小视频| 99视频精品| 成人黄色生活片| 成人黄色免费视频| 国产午夜精品久久久久久免费视| 亚洲一卡二卡区| 爱啪啪综合导航| 欧美人牲a欧美精品| yy1111111| 久久网站免费观看| 97香蕉超级碰碰久久免费的优势| 中文区中文字幕免费看| 成人免费黄色大片| 在线丝袜欧美日韩制服| 国产在线精彩视频| 4438亚洲最大| 小早川怜子久久精品中文字幕| 真实国产乱子伦精品一区二区三区| 欧美亚洲国产成人精品| 国产免费av观看| 国产亚洲精品资源在线26u| 日韩在线观看a| 日韩av黄色| 亚洲人成网站免费播放| 久视频在线观看| 久久国产精品99久久久久久老狼 | 免费观看在线午夜影视| 亚洲成人动漫av| 99999精品| 日韩一区二区在线| 国产成人综合精品| 天堂在线视频免费观看| 一区二区三区在线视频观看| 五月天亚洲视频| 亚洲另类av| 韩国日本不卡在线| 亚洲成熟女性毛茸茸| 最新欧美精品一区二区三区| 久久婷婷国产91天堂综合精品| 欧美三级自拍| 久久久久成人网| 成人av无码一区二区三区| 亚洲视频在线一区| 国内国产精品天干天干| 秋霞欧美视频| 国产精品小说在线| 国产爆初菊在线观看免费视频网站 | 久久av一区二区三区| 国产一区视频观看| 欧美v亚洲v| 欧美成人a视频| 久草视频免费在线播放| 国产成人精品免费在线| 路边理发店露脸熟妇泻火| 国产日韩欧美中文在线| 久久精品精品电影网| 国产又粗又猛又爽又黄视频 | 国产午夜精品久久久| 国产一级做a爱免费视频| 国产成+人+日韩+欧美+亚洲| 五月天激情图片| 这里视频有精品| 国自产精品手机在线观看视频| 亚洲国产精品无码久久| 亚洲国产一区二区视频| 日本69式三人交| 亚洲免费网址| 色噜噜狠狠一区二区三区| 国产精品字幕| www.亚洲人.com| 成人av免费播放| 亚洲r级在线视频| 亚洲专区区免费| 日韩国产精品大片| 中文字幕不卡每日更新1区2区| 91丨精品丨国产| 欧美国产精品人人做人人爱| 天堂成人在线观看| 欧美午夜在线观看| 男人的天堂久久久| 99精品在线免费| 污污的网站18| 精品福利电影| 欧洲亚洲一区二区| 国产精品久久久久久久久久辛辛 | 偷拍亚洲精品| 国产精品丝袜白浆摸在线| a天堂中文在线官网在线| 欧美zozo另类异族| 中文字幕高清在线免费播放| 1000部国产精品成人观看| 色诱av手机版| 视频一区中文字幕| 伊人久久在线观看| 亚洲a视频在线观看| 亚洲码欧美码一区二区三区| 午夜免费在线观看精品视频| 成人动漫在线播放| 日韩免费观看高清完整版| 西西44rtwww国产精品| 国产精品你懂的| 国产xxxx视频| 久久99精品久久久久久动态图 | 国模精品一区二区三区| 高清在线一区| 韩日欧美一区二区| 美女av在线播放| 日韩风俗一区 二区| 国产精品探花视频| 欧美性色xo影院| 免看一级a毛片一片成人不卡| 国产无人区一区二区三区| 国产男女无遮挡猛进猛出| 老司机一区二区三区| 亚洲色婷婷久久精品av蜜桃| 国产亚洲一区| 国产一区二区免费在线观看| 成人97精品毛片免费看| 日本亚洲欧美成人| 成年男女免费视频网站不卡| 久久精视频免费在线久久完整在线看| 四虎影院在线播放| 日韩欧美视频在线| 夜夜躁狠狠躁日日躁av| 色成年激情久久综合| 日韩av女优在线观看| 亚洲女与黑人做爰| 中文字幕黄色网址| 久久一区二区三区四区| 免费不卡的av| 国产伦理精品不卡| 91小视频在线播放| 免费美女久久99| 黑森林福利视频导航| 在线日韩欧美| 欧美高清中文字幕| 综合日韩在线| 国产av不卡一区二区| 久久精品播放| 天天综合色天天综合色hd| 免费av一区| 欧美在线播放一区| 蜜臀av免费一区二区三区| 久久偷窥视频| 色狠狠久久av综合| 九九久久99| 亚洲免费观看高清完整版在线观| 国产精品一区在线观看| 澳门精品久久国产| 国产乱码精品一区二区三区不卡| 欧美午夜网站| ts人妖另类在线| av成人男女| 国产一区二区中文字幕免费看| 91麻豆精品激情在线观看最新| 岛国视频一区| 精品国产一区二区三区成人影院 | 国产高清美女一级毛片久久| 亚洲三级 欧美三级| 精品亚洲综合| 影音先锋欧美精品| 色的视频在线免费看| 日韩在线免费av| 成人短视频在线观看| 欧美成人亚洲成人| 国产精品69xx| 2019最新中文字幕| 人人鲁人人莫人人爱精品| 国产精品视频区| 国产高清视频一区二区| julia一区二区中文久久94| 日本三级久久| 日韩欧美亚洲区| 天天精品视频| 丰满少妇大力进入| 久久美女性网| 中文字幕 欧美日韩| 国产大陆a不卡| 少妇饥渴放荡91麻豆| 国产免费久久精品| 538任你躁在线精品视频网站| 亚洲大片在线观看| 潘金莲一级淫片aaaaaa播放| 欧美日韩和欧美的一区二区| www.黄色一片| 精品亚洲国产成av人片传媒 | 鲁一鲁一鲁一鲁一av| 国产精品综合久久| 玖草视频在线观看| 国产精品久久二区二区| 久久久久久久久99| 色婷婷久久久亚洲一区二区三区 | 天天操天天干视频| 欧美色视频一区| 好吊视频一二三区| 一级做a爰片久久毛片美女图片| 黄色网址免费在线观看| 97色在线播放视频| 日韩三级一区| 精品久久久久亚洲| 希岛爱理av一区二区三区| 日本一道本久久| 激情综合五月天| 91视频啊啊啊| 亚洲欧洲精品一区二区三区| 天堂中文字幕在线观看| 欧美一激情一区二区三区| 偷拍25位美女撒尿视频在线观看| 精品国产一区二区三区久久狼5月 精品国产一区二区三区久久久狼 精品国产一区二区三区久久久 | 91精品蜜臀在线一区尤物| 亚洲人午夜射精精品日韩| 久久av.com| 91精品国产66| 精品久久久久久一区| 中文字幕一区二区三区欧美日韩| 国产真人无码作爱视频免费| 成人一区二区三区中文字幕| 欧美成人短视频| 岛国视频午夜一区免费在线观看| 国产区精品在线| 最近中文字幕2019免费| xxxxx性欧美特大| 国产精品污www一区二区三区| 国产精品久久久久9999赢消| 六月丁香婷婷在线| caoporn国产一区二区| 亚洲欧美一区二区三区四区五区| 在线看不卡av| 国产青青草在线| 91成人在线观看国产| 哺乳一区二区三区中文视频 | 欧美一区二区三区成人| 国产小视频在线观看| 91av视频在线观看| 国产丝袜一区| 夜夜添无码一区二区三区| 国产精品综合av一区二区国产馆| 少妇太紧太爽又黄又硬又爽小说| 一本一道综合狠狠老| 三级在线视频| 欧美在线视频在线播放完整版免费观看| **爰片久久毛片| 久艹在线免费观看| 国产精品一卡二| 91插插插插插插| 日韩一区二区在线观看视频播放| 亚洲搞黄视频| 国产伦精品免费视频| 日韩欧美高清在线播放| 手机视频在线观看| 国产精品人成在线观看免费| 中文字幕av网站| 中文字幕亚洲激情| 亚洲欧美综合久久久久久v动漫| 亚洲午夜高清视频| 久久99最新地址| 国产精品国产精品88| 欧美一级在线观看| 午夜伦理大片视频在线观看| 91日韩久久| 精品91在线| 日韩片在线观看| 色av综合在线| 亚洲成人三级| 91香蕉亚洲精品| 亚洲天堂黄色| 9.1成人看片免费版| 日本电影亚洲天堂一区| 国产一区二区三区不卡在线| 国产美女久久久| 一区二区蜜桃| 亚洲欧美日韩色| 色嗨嗨av一区二区三区| 日本免费在线观看| 国产精品美女诱惑| 久久久久.com| 精品国产大片大片大片| 欧美mv日韩mv国产| 亚洲插插视频| 亚洲图色在线| k8久久久一区二区三区 | 欧产日产国产v| 日韩精品中文字幕在线| 久久精品97| 日本一本中文字幕| 久久精品在线观看| 国产欧美一级片| 97色伦亚洲国产| 欧美mv日韩| 日本一卡二卡在线| 欧美色男人天堂| 久草在线资源站资源站| 欧美黑人xxxxx| 韩日av一区二区| 羞羞影院体验区| 久热99视频在线观看| 色先锋久久影院av| 99久久99精品| 欧美天天综合色影久久精品| 国产精品久久久久久福利| 精品乱码一区二区三区| 美女脱光内衣内裤视频久久网站| 国产亚洲欧美久久久久| 在线性视频日韩欧美| 欧美激情久久久久久久久久久| 亚洲综合欧美在线| 精品久久久久久国产91|