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

封裝了一個Excel導(dǎo)入加校驗的工具,同事們用了都說好

開發(fā) 開發(fā)工具
最近在做Excel導(dǎo)入功能,產(chǎn)品要求對導(dǎo)入數(shù)據(jù)先進(jìn)行校驗然后再入庫。于是簡單封裝了一個工具,結(jié)果兄弟們用了都說好,今天就把思路分享出來。

 [[394532]]

最近太忙了,剛剛到家趕緊抽空趕一篇,不知道能不能幫到你。

最近在做Excel導(dǎo)入功能,產(chǎn)品要求對導(dǎo)入數(shù)據(jù)先進(jìn)行校驗然后再入庫。于是簡單封裝了一個工具,結(jié)果兄弟們用了都說好,今天就把思路分享出來。

easyexcel 庫

我們都知道POI是Java操作Excel的基礎(chǔ)庫。為了通用性并沒有做定制,而且還有一些局限性。經(jīng)過一番調(diào)研決定采用二次封裝庫easyexcel來進(jìn)行業(yè)務(wù)開發(fā)。

  1. <dependency> 
  2.     <groupId>com.alibaba</groupId> 
  3.     <artifactId>easyexcel</artifactId> 
  4.     <version>${easyexcel.version}</version> 
  5. </dependency> 

 

easyexcel將讀取Excel的生命周期抽象為了幾個階段,方便我們在各個階段注入你想要實現(xiàn)的邏輯。這幾個階段包含在ReadListener接口中

  1. public interface ReadListener<T> extends Listener { 
  2.     /** 
  3.      * 當(dāng)任何一個偵聽器執(zhí)行錯誤報告時,所有偵聽器都將接收此方法。 如果在此處引發(fā)異常,則整個讀取將終止。 
  4.      * 這里是處理讀取excel異常的 
  5.      * 
  6.      * @param exception 
  7.      * @param context 
  8.      * @throws Exception 
  9.      */ 
  10.     void onException(Exception exception, AnalysisContext context) throws Exception; 
  11.  
  12.     /** 
  13.      * 讀取每行excel表頭時會執(zhí)行此方法 
  14.      * 
  15.      * @param headMap 
  16.      * @param context 
  17.      */ 
  18.     void invokeHead(Map<Integer, CellData> headMap, AnalysisContext context); 
  19.  
  20.     /** 
  21.      * 讀取每行數(shù)據(jù)的時候回執(zhí)行此方法  
  22.      * 
  23.      * @param data 
  24.      *            one row value. Is is same as {@link AnalysisContext#readRowHolder()} 
  25.      * @param context 
  26.      *            analysis context 
  27.      */ 
  28.     void invoke(T data, AnalysisContext context); 
  29.  
  30.     /** 
  31.      * 如果有額外的單元格信息返回就用此方法處理 
  32.      * 
  33.      * @param extra 
  34.      *            extra information 
  35.      * @param context 
  36.      *            analysis context 
  37.      */ 
  38.     void extra(CellExtra extra, AnalysisContext context); 
  39.  
  40.     /** 
  41.      * 在整個excel sheet解析完畢后執(zhí)行的邏輯。 
  42.      * 
  43.      * @param context 
  44.      */ 
  45.     void doAfterAllAnalysed(AnalysisContext context); 
  46.  
  47.     /** 
  48.      * 用來控制是否讀取下一行的策略 
  49.      * 
  50.      * @param context 
  51.      * @return 
  52.      */ 
  53.     boolean hasNext(AnalysisContext context); 

其抽象實現(xiàn)AnalysisEventListener提供更加符合需要的抽象,我會進(jìn)一步實現(xiàn)這個抽象來實現(xiàn)Excel的導(dǎo)入和校驗。

在你了解一個框架的抽象接口后,盡量要去看一下它有沒有能滿足你需要的實現(xiàn)。

另外這里要多說一點,接口中的AnalysisContext包含了很多有用的上下文元信息,比如 當(dāng)前行、當(dāng)前的配置策略、excel整體結(jié)構(gòu)等信息,你可以在需要的時候調(diào)用這些信息。

JSR303校驗

最開始自己寫了一個抽象的校驗工具,最后發(fā)現(xiàn)每一個字段都要編寫其具體的校驗邏輯,如果一個Excel的字段量爆炸,這對開發(fā)來說就可能是噩夢。這使我想到了業(yè)界已經(jīng)有的規(guī)范-JSR303校驗規(guī)范,它將數(shù)據(jù)模型(Model)和校驗(Validation)各自抽象,非常靈活,而且工作量明顯降低。我們只需要找到和esayexcel生命周期結(jié)合的地方就行了。我們只需要引入以下依賴就能在Spring Boot項目中集成JSR303校驗:

  1. <dependency> 
  2.     <groupId>org.springframework.boot</groupId> 
  3.     <artifactId>spring-boot-starter-validation</artifactId> 
  4. </dependency> 

關(guān)于JSR303相關(guān)的教程可以查看我這一篇文章。

實現(xiàn)過程

我們可以在解析每個字段的時候校驗,這對應(yīng)ReadListener的invoke(T data, AnalysisContext context)方法,這種方式可以實現(xiàn)當(dāng)字段校驗觸發(fā)約束時就停止excel解析的策略;另一種可以在Excel解析完畢后執(zhí)行校驗,對應(yīng)doAfterAllAnalysed(AnalysisContext context)。這里以第二種為例我們來實現(xiàn)一下。

我們在編寫代碼時,盡量職責(zé)單一,一個類或者一個方法盡量只干一個事,這樣讓自己的代碼足夠清晰。

編寫校驗處理類

這里我把解析和校驗分開實現(xiàn),先編寫JSR303校驗工具。這里假設(shè)已經(jīng)有了校驗器javax.validation.Validator的實現(xiàn),稍后我會講這個實現(xiàn)從哪里注入。

  1. import cn.felord.validate.Excel; 
  2. import lombok.AllArgsConstructor; 
  3. import org.springframework.util.StringUtils; 
  4.  
  5. import javax.validation.ConstraintViolation; 
  6. import javax.validation.Validator; 
  7. import java.util.*; 
  8. import java.util.stream.Collectors; 
  9.  
  10. /** 
  11.  *  excel 校驗工具 
  12.  * 
  13.  * @param <T> the type parameter 
  14.  * @author felord.cn 
  15.  * @since 2021 /4/14 14:14 
  16.  */ 
  17. @AllArgsConstructor 
  18. public class ExcelValidator<T> { 
  19.  
  20.     private final Validator validator; 
  21.     private final Integer beginIndex; 
  22.  
  23.  
  24.     /** 
  25.      *  集合校驗 
  26.      * 
  27.      * @param data 待校驗的集合 
  28.      * @return list 
  29.      */ 
  30.     public List<String> validate(Collection<T> data) { 
  31.         int index = beginIndex + 1; 
  32.         List<String> messages = new ArrayList<>(); 
  33.         for (T datum : data) { 
  34.             String validated = this.doValidate(index, datum); 
  35.             if (StringUtils.hasText(validated)) { 
  36.                 messages.add(validated); 
  37.             } 
  38.             index++; 
  39.         } 
  40.         return messages; 
  41.     } 
  42.      
  43.     /** 
  44.      * 這里是校驗的根本方法 
  45.      * 
  46.      * @param index 本條數(shù)據(jù)所在的行號 
  47.      * @param data 待校驗的某條數(shù)據(jù) 
  48.      * @return 對數(shù)據(jù)的校驗異常進(jìn)行提示,如果有觸發(fā)校驗規(guī)則的會封裝提示信息。 
  49.      */ 
  50.     private String doValidate(int index, T data) { 
  51.         // 這里使用了JSR303的的校驗器,同時使用了分組校驗,Excel為分組標(biāo)識 
  52.         Set<ConstraintViolation<T>> validate = validator.validate(data, Excel.class); 
  53.         return validate.size()>0 ? "第" + index + 
  54.                 "行,觸發(fā)約束:" + validate.stream() 
  55.                 .map(ConstraintViolation::getMessage) 
  56.                 .collect(Collectors.joining(",")): ""
  57.     } 

上面就是整個校驗的邏輯,如果校驗通過不提示任何信息,如果校驗不通過把校驗的約束信息封裝返回。這里的Validator是從哪里來的呢?當(dāng)Spring Boot集成了JSR303會有一個Validator實現(xiàn)被自動注入Spring IoC,我們可以利用它。

實現(xiàn)AnalysisEventListener

這個完全是easyexcel的功能了,我們只需要實現(xiàn)最開始提到的Excel抽象解析監(jiān)聽器接口AnalysisEventListener,并將解析字段加入集合,等完全解析完畢后再進(jìn)行校驗。這里如果校驗不通過就會拋出攜帶校驗信息的異常,異常經(jīng)過處理返回前端提示。

切記:AnalysisEventListener的實現(xiàn)不能注入Spring IoC。

  1. import cn.hutool.json.JSONUtil; 
  2. import com.alibaba.excel.context.AnalysisContext; 
  3. import com.alibaba.excel.event.AnalysisEventListener; 
  4. import cn.felord.exception.ServiceException; 
  5. import org.springframework.util.CollectionUtils; 
  6.  
  7. import java.util.ArrayList; 
  8. import java.util.Collection; 
  9. import java.util.List; 
  10. import java.util.function.Consumer; 
  11.  
  12. /** 
  13.  * 該類不可被Spring托管 
  14.  * 
  15.  * @param <T> the type parameter 
  16.  * @author felord.cn 
  17.  * @since 2021 /4/14 14:19 
  18.  */ 
  19. public class JdbcEventListener<T> extends AnalysisEventListener<T> { 
  20.     /** 
  21.      * Excel總條數(shù)閾值 
  22.      */ 
  23.     private static final Integer MAX_SIZE = 10000; 
  24.     /** 
  25.      * 校驗工具 
  26.      */ 
  27.     private final ExcelValidator<T> excelValidator; 
  28.     /** 
  29.      * 如果校驗通過消費解析得到的excel數(shù)據(jù) 
  30.      */ 
  31.     private final Consumer<Collection<T>> batchConsumer; 
  32.     /** 
  33.      * 解析數(shù)據(jù)的臨時存儲容器 
  34.      */ 
  35.     private final List<T> list = new ArrayList<>(); 
  36.  
  37.     /** 
  38.      * Instantiates a new Jdbc event listener. 
  39.      * 
  40.      * @param excelValidator Excel校驗工具 
  41.      * @param batchConsumer  Excel解析結(jié)果批量消費工具,可實現(xiàn)為寫入數(shù)據(jù)庫等消費操作 
  42.      */ 
  43.     public JdbcEventListener(ExcelValidator<T> excelValidator, Consumer<Collection<T>> batchConsumer) { 
  44.         this.excelValidator = excelValidator; 
  45.         this.batchConsumer = batchConsumer; 
  46.     } 
  47.  
  48.     @Override 
  49.     public void onException(Exception exception, AnalysisContext context) throws Exception { 
  50.         list.clear(); 
  51.         throw exception; 
  52.     } 
  53.  
  54.     @Override 
  55.     public void invoke(T data, AnalysisContext context) { 
  56.         // 如果沒有超過閾值就把解析的excel字段加入集合 
  57.         if (list.size() >= MAX_SIZE) { 
  58.             throw new ServiceException("單次上傳條數(shù)不得超過:" + MAX_SIZE); 
  59.         } 
  60.         list.add(data); 
  61.     } 
  62.  
  63.     @Override 
  64.     public void doAfterAllAnalysed(AnalysisContext context) { 
  65.         //全部解析完畢后 對集合進(jìn)行校驗并消費 
  66.         if (!CollectionUtils.isEmpty(this.list)) { 
  67.             List<String> validated = this.excelValidator.validate(this.list); 
  68.             if (CollectionUtils.isEmpty(validated)) { 
  69.                 this.batchConsumer.accept(this.list); 
  70.             } else { 
  71.                 throw new ServiceException(JSONUtil.toJsonStr(validated)); 
  72.             } 
  73.         } 
  74.     } 

封裝最終的工具

這里參考esayexcel的文檔封裝成一個通用的Excel讀取工具

  1. import com.alibaba.excel.EasyExcel; 
  2. import lombok.AllArgsConstructor; 
  3. import lombok.Data; 
  4.  
  5. import javax.validation.Validator; 
  6. import java.io.InputStream; 
  7. import java.util.Collection; 
  8. import java.util.function.Consumer; 
  9.  
  10. /** 
  11.  * excel讀取工具 
  12.  * 
  13.  * @author felord.cn 
  14.  * @since 2021 /4/14 15:10 
  15.  */ 
  16. @AllArgsConstructor 
  17. public class ExcelReader { 
  18.     private final Validator validator; 
  19.  
  20.     /** 
  21.      * Read Excel. 
  22.      * 
  23.      * @param <T>  the type parameter 
  24.      * @param meta the meta 
  25.      */ 
  26.     public <T> void read(Meta<T> meta) { 
  27.         ExcelValidator<T> excelValidator = new ExcelValidator<>(validator, meta.headRowNumber); 
  28.         JdbcEventListener<T> readListener = new JdbcEventListener<>(excelValidator, meta.consumer); 
  29.         EasyExcel.read(meta.excelStream, meta.domain, readListener) 
  30.                 .headRowNumber(meta.headRowNumber) 
  31.                 .sheet() 
  32.                 .doRead(); 
  33.     } 
  34.  
  35.  
  36.     /** 
  37.      * 解析需要的元數(shù)據(jù) 
  38.      * 
  39.      * @param <T> the type parameter 
  40.      */ 
  41.     @Data 
  42.     public static class Meta<T> { 
  43.         /** 
  44.          * excel 文件流 
  45.          */ 
  46.         private InputStream excelStream; 
  47.         /** 
  48.          * excel頭的行號,參考easyexcel的api和你的實際情況 
  49.          */ 
  50.         private Integer headRowNumber; 
  51.         /** 
  52.          * 對應(yīng)excel封裝的數(shù)據(jù)類,需要參考easyexcel教程 
  53.          */ 
  54.         private Class<T> domain; 
  55.         /** 
  56.          * 解析結(jié)果的消費函數(shù) 
  57.          */ 
  58.         private Consumer<Collection<T>> consumer; 
  59.     } 
  60.  

我們把這個工具注入Spring IoC,方便我們使用。

  1. /** 
  2.  * Excel 讀取工具 
  3.  * 
  4.  * @param validator the validator 
  5.  * @return the excel reader 
  6.  */ 
  7. @Bean 
  8. public ExcelReader excelReader(Validator validator) { 
  9.     return new ExcelReader(validator); 

編寫接口

這里Excel的數(shù)據(jù)類ExcelData就不贅述了,過于簡單!去看esayexcel的文檔即可。編寫一個Spring MVC接口示例,沒錯就是這么簡單。

  1. @Autowired 
  2. private  ExcelReader excelReader; 
  3. @Autowired 
  4. private  DataService dataService; 
  5.  
  6. @PostMapping("/excel/import"
  7. public Rest<?> importManufacturerInfo(@RequestPart MultipartFile file) throws IOException { 
  8.     InputStream inputStream = file.getInputStream(); 
  9.     ExcelReader.Meta<ExcelData> excelDataMeta = new ExcelReader.Meta<>(); 
  10.     excelDataMeta.setExcelStream(inputStream); 
  11.     excelDataMeta.setDomain(ExcelData.class); 
  12.     excelDataMeta.setHeadRowNumber(2); 
  13.     // 批量寫入數(shù)據(jù)庫的邏輯 
  14.     excelDataMeta.setConsumer(dataService::saveBatch); 
  15.     this.excelReader.read(excelDataMeta); 
  16.     return RestBody.ok(); 

總結(jié)

今天演示了如何將easyexcel和JSR303結(jié)合起來,其實原理很簡單,你只需要找到兩個技術(shù)的結(jié)合點,并把它們組合起來即可,你學(xué)到了嗎?

本文轉(zhuǎn)載自微信公眾號「碼農(nóng)小胖哥」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系碼農(nóng)小胖哥公眾號。

 

責(zé)任編輯:武曉燕 來源: 碼農(nóng)小胖哥
相關(guān)推薦

2022-03-23 08:01:04

Python語言代碼

2024-12-12 12:00:00

代碼C++

2023-04-26 01:29:05

OkHttp3工具方式

2011-05-06 14:19:29

ExcelSQL Server

2023-09-26 11:59:48

ChatGPT人工智能

2023-04-26 08:19:48

Nacos高可用開發(fā)

2025-10-31 07:42:31

SpringExcel工具

2022-11-13 08:06:05

ArthasEverythingMaven help

2020-11-09 14:10:38

Bug安全代碼

2015-07-27 10:34:55

大數(shù)據(jù)大忽悠

2021-06-30 09:56:24

MySQL數(shù)據(jù)庫索引

2024-08-30 09:05:45

2022-05-07 07:33:55

TypeScript條件類型

2025-03-26 00:35:00

Javaweb開發(fā)

2022-04-29 06:54:48

TS 映射類型User 類型

2020-03-02 19:08:21

JVMJDKJRE

2015-07-03 11:16:14

編程一個手鐲

2020-11-23 11:30:00

IDEA技巧開發(fā)

2021-07-19 09:42:45

Spring Boot@ValueJava

2022-03-15 07:58:31

SQL風(fēng)險字符串
點贊
收藏

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

天天操天天爱天天干| www.黄色在线| 极品在线视频| 国产三级精品三级在线专区| 国产精品一区二区三区久久| 欧美日韩一级在线观看| 国产一区二区三区不卡视频网站| 欧美日本韩国一区二区三区视频| h无码动漫在线观看| 国产露出视频在线观看| 福利一区二区在线| 国产91精品青草社区| 亚洲高潮女人毛茸茸| 国产精品久久久久久久久久白浆| 欧美在线制服丝袜| 久久久性生活视频| 日本在线观看| 久久嫩草精品久久久精品| 亚洲www在线| 波多野结衣mp4| 亚洲日本成人| 国产成人a视频高清在线观看| 26uuu精品一区二区三区四区在线| 91精品久久久久久久久不口人| 日本三级免费看| 性欧美欧美巨大69| 亚洲女人被黑人巨大进入al| 久久久久久久久久久久国产精品| 国产精品videossex撒尿| 婷婷综合五月天| 国产精品igao激情视频| 一区二区三区视频网站| 久久亚洲捆绑美女| 国产一区精品视频| www.国产麻豆| 国产一区欧美二区| 国产日韩在线视频| 中文有码在线播放| 日韩一区精品视频| 国产精品白丝jk喷水视频一区| 精品欧美一区二区三区免费观看 | 91精品国产一区二区三区蜜臀| www.欧美日本| 天天综合网天天| 欧美性xxxxx| 色综合久久久久无码专区| 黄色美女视频在线观看| 亚洲精品国产成人久久av盗摄 | 香蕉视频黄色在线观看| 菁菁伊人国产精品| 欧美精品一区男女天堂| 亚洲一区二区三区四区av| 视频二区欧美毛片免费观看| 欧美一区二区福利在线| 日本女人黄色片| 日韩av综合| 欧美mv和日韩mv的网站| 亚洲成年人av| 秋霞影视一区二区三区| 日韩精品视频免费在线观看| 粉嫩av懂色av蜜臀av分享| 秋霞综合在线视频| 国产性色一区二区| 欧美日韩国产不卡| 91看片在线免费观看| 国产一区二区主播在线| 在线播放中文一区| 一级全黄裸体片| 国产精品流白浆在线观看| 亚洲精品97久久| 亚洲av无码国产精品久久| 自拍视频一区| 日韩有码片在线观看| 欧美日韩三级在线观看 | 国产超级av在线| 欧美日韩视频免费观看| 欧美日韩精品综合在线| 无码人妻久久一区二区三区蜜桃 | 亚洲精品福利资源站| 成人免费看aa片| 热久久天天拍国产| 美女视频久久黄| 久久国产视频播放| 蜜桃视频一区二区三区 | 久久久久久久久久久久久久国产| 成人国产综合| 日韩美女视频在线| 免费观看av网站| 888久久久| 2019中文字幕在线观看| 日本久久精品视频| 成人免费视频国产免费| 国产美女精品人人做人人爽| 精品一区国产| 黄网站在线免费| 精品国产乱码久久久久久虫虫漫画| aaaaaa亚洲| 精品成人18| 亚洲欧美日韩精品久久亚洲区| 一区二区国产精品精华液| 最新成人av网站| 国产精品网红福利| 午夜在线视频免费| 1024成人网| 女人另类性混交zo| 亚洲乱码一区| 中文字幕亚洲图片| 日韩av电影网| 国产老肥熟一区二区三区| 麻豆亚洲一区| 日本片在线看| 7777女厕盗摄久久久| 西西444www无码大胆| 国产一区亚洲| 亚洲精品在线三区| 久久免费精品视频| 日韩三级视频在线| 国产一区二区三区免费看| 欧美午夜精品久久久久免费视| 中中文字幕av在线| 欧美日韩中文精品| 爱爱免费小视频| 亚洲天堂久久| 亚洲已满18点击进入在线看片 | 色噜噜久久综合伊人一本| 国产在线视频你懂的| 紧缚奴在线一区二区三区| 欧美久久久久久一卡四| heyzo在线播放| 91精品国产综合久久久久久久久久| 一区二区三区四区免费| 尤物精品在线| 国产精品视频福利| 黄色污污视频在线观看| 欧美大黄免费观看| 东方av正在进入| 国产一区二区三区在线观看精品 | 精品国产日本| 国产精品一区hongkong| 日韩午夜在线影院| caoporn91| 国产老妇另类xxxxx| 中文字幕一区二区三区四区五区人 | 亚洲一级二级三级| 精品国产乱码久久久久久1区二区| jiujiure精品视频播放| 国产第一区电影| 国产一级在线| 欧美在线影院一区二区| 亚洲av熟女国产一区二区性色| 久久久久91| 视频一区二区三区在线观看| 国产另类xxxxhd高清| 亚洲午夜性刺激影院| 丰满人妻老熟妇伦人精品| 91小视频免费看| 妺妺窝人体色www在线小说| 女同久久另类99精品国产| 91精品国产乱码久久久久久蜜臀 | 在线观看成人黄色| 中文字幕 自拍偷拍| 欧美国产日韩精品免费观看| 无限资源日本好片| 亚洲精品在线观看91| av成人观看| 天堂网在线最新版www中文网| 日韩精品中文字幕视频在线| 精品一区二区无码| 亚洲欧洲色图综合| 国产免费一区二区三区最新6| 国产精品永久| 一区二区高清视频| 精品熟妇无码av免费久久| 91视频成人| 欧美高清视频在线观看| 婷婷丁香一区二区三区| 91黄色免费看| 国产极品国产极品| 99久久精品国产网站| 日本a√在线观看| 亚洲乱码精品| 久久综合毛片| 亚洲色图图片| 91精品国产色综合久久不卡98口| 韩日视频在线| 日韩欧美一级二级三级| 国产成人在线免费视频| 国产精品成人免费在线| 亚洲精品乱码久久久久久蜜桃图片| 免费在线日韩av| 日本一级淫片演员| 女人av一区| 国产精华一区| 欧美激情三区| 91精品国产沙发| 国产在线观看免费麻豆| 日韩精品久久久久久福利| 亚洲天堂网视频| 亚洲a一区二区| 中国美女黄色一级片| 成人午夜激情在线| 在线观看国产一区二区| 特级西西www444人体聚色| 国产在线视频一区二区三区| 97av视频在线观看| 好看不卡的中文字幕| 日韩欧美在线电影| 林ゆな中文字幕一区二区| 91精品久久久久久久久青青| 英国三级经典在线观看| 欧美日韩福利视频| 欧洲日本在线| 国产小视频国产精品| 日本黄色大片视频| 91精品国产欧美一区二区18| 午夜一区二区三区四区| 精品福利视频导航| 免费视频一二三区| 中文字幕一区二区三区视频| 97超碰在线免费观看| 99久久精品免费看国产免费软件| 爽爽爽在线观看| 免费成人美女在线观看.| 国模吧无码一区二区三区| 国产一区欧美| 欧美国产视频一区| 中文无码久久精品| 中文字幕日韩一区二区三区| 国产伦精品一区二区三区千人斩 | 亚洲成人av一区二区三区| 大地资源高清在线视频观看| 国产拍揄自揄精品视频麻豆| 日韩在线免费观看av| av不卡在线播放| www.四虎在线| 成人国产在线观看| 国产精九九网站漫画| 国产成人精品免费看| 欧美高清精品一区二区| 国产麻豆精品一区二区| 欧美国产在线一区| 国产一区二区三区精品欧美日韩一区二区三区| 亚洲天堂网一区| 蜜桃视频一区二区三区在线观看 | 成人精品一区二区三区四区| 国模大尺度视频| 国产成人鲁色资源国产91色综| 热久久久久久久久| 国产精品一区二区三区av麻| 亚洲已满18点击进入久久| 人妻丰满熟妇aⅴ无码| 99久久精品国产导航| 国产偷人妻精品一区| 久久女同性恋中文字幕| 黄免费在线观看| 国产精品日日摸夜夜摸av| 又嫩又硬又黄又爽的视频| 国产精品第四页| xxxx日本少妇| 亚洲福利一区二区三区| 久久久久久久久久免费视频 | 一区二区传媒有限公司| 国产精品入口66mio| 日韩中文字幕二区| 久久精品理论片| 人妻体体内射精一区二区| av网站免费线看精品| 亚洲一级中文字幕| 国产精品久久99| 好吊色视频在线观看| 精品久久中文字幕| 成人午夜精品视频| 91精品国产全国免费观看| 欧美一区二区黄片| 国产亚洲欧洲在线| 中文字幕有码在线观看| 国语自产精品视频在线看抢先版图片 | 国产精品天天摸av网| 欧美日韩精品在线观看视频| 亚洲sss视频在线视频| 国产成人av免费| 日韩欧美一区电影| 欧美一区二区少妇| 久久人人爽人人爽爽久久| 国产伦子伦对白在线播放观看| 国产精品国产三级国产专播精品人| 91麻豆精品| 久久久久久久久久久久久久一区 | 精品福利一区| 亚洲天堂电影网| 亚洲欧洲日本mm| 奇米影音第四色| 成人黄色大片在线观看 | 男生和女生一起差差差视频| 99精品视频中文字幕| 欧美88888| 欧美日韩美女在线| 99热这里只有精品99| 亚洲精品天天看| 毛片在线不卡| 欧美一级免费视频| 国产成人久久精品一区二区三区| 精品国产综合久久| 国产精品久久久乱弄| 青青视频在线播放| 国产精品一级二级三级| 亚洲精品视频久久久| 亚洲午夜免费电影| 97人妻精品一区二区三区视频| 亚洲精品国产成人| av色综合久久天堂av色综合在| 国产精品久久久久久久久粉嫩av| heyzo欧美激情| 国产精品h视频| 水蜜桃久久夜色精品一区的特点 | 日本午夜精品| 国产精品自拍合集| 九一久久久久久| 人妻精品久久久久中文| 欧美视频在线观看免费| a级片在线观看| 天堂资源在线亚洲| 视频一区视频二区视频三区视频四区国产| 欧美一区成人| 亚洲精品免费一区亚洲精品免费精品一区| 26uuu亚洲综合色| 欧美bbbbbbbbbbbb精品| 欧美v国产在线一区二区三区| 天堂中文а√在线| 国产精品一区二区三区成人| 国产精品免费99久久久| 日韩精品一区二区三区久久| 成年人国产精品| 麻豆亚洲av熟女国产一区二 | 亚洲成a人v欧美综合天堂| 国产色在线视频| 免费91在线视频| 视频精品一区二区三区| av不卡在线免费观看| 国内久久婷婷综合| 免费在线黄色网| 日韩免费性生活视频播放| sm国产在线调教视频| 91欧美视频网站| 伊人久久大香线| 中文字幕无码毛片免费看| 一个色综合网站| 人妻精品一区二区三区| 97婷婷涩涩精品一区| 亚洲国产精品嫩草影院久久av| 欧美色图另类小说| 国产亚洲精品7777| 中文字幕日韩国产| 久久精品影视伊人网| 秋霞影院一区| 精品成人在线观看| 北岛玲一区二区三区| 国产精品私拍pans大尺度在线| 99成人在线视频| 男人操女人下面视频| 亚洲一区电影777| 深夜福利在线看| 国产精品第1页| 欧美顶级大胆免费视频| 一个人看的视频www| 天天影视网天天综合色在线播放| 亚洲三级黄色片| 国产精品第二页| 伊人久久大香线蕉综合四虎小说 | 国产欧美精品在线观看| 一区二区三区免费在线视频| 久久国产精品久久久久| 九色丨蝌蚪丨成人| 国产免费视频传媒| 亚洲欧美另类综合偷拍| 亚洲 美腿 欧美 偷拍| 国产精品美女主播| 在线一区免费| 中文人妻一区二区三区| 欧美日韩mp4| 91白丝在线| 一区二区三区我不卡| 成人激情视频网站| 国产无遮挡又黄又爽又色视频| 久久精品电影一区二区| 国产欧美啪啪| 天堂在线中文在线| 懂色av一区二区三区| 精品51国产黑色丝袜高跟鞋| 国产麻豆乱码精品一区二区三区| 日韩在线观看一区二区| 国产在线观看99| 日韩亚洲欧美中文在线| 欧美freesex8一10精品| 国产无遮挡猛进猛出免费软件 | 中文字幕乱码在线观看| 久久久久日韩精品久久久男男| 欧美日韩激情| 日韩精品人妻中文字幕有码| 欧美裸体bbwbbwbbw|