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

二奢倉店的靜默打印代理實現

開發 前端
所謂倉店,即是作為一個店鋪,提供商品和收銀臺等常規線下店鋪的購物功能,用戶可以正常進店購物。同時作為倉庫,管理進出庫,陳列有大量貨物,一方面用于存儲,另一方面也方便用戶挑選。

1 二奢倉店面臨的問題

1.1 什么是二奢倉店

1.2 有什么問題

2 調用打印機的限制

2.1 js的局限

2.2 想要靜默打印

3 做一個定制化的打印代理

3.1 java調起windows打印機

3.2 我該怎么生成打印數據

3.3 多場景的自助代理打印

3.4 可執行文件的獨立部署

4 打印偏移的通用解決方案

5 總結

1.二奢倉店面臨的問題

1.1 什么是二奢倉店

二奢倉店是轉轉新開業的一家線下實體店,主營二手奢侈品和其他品類,以倉店的形式營業。

所謂倉店,即是作為一個店鋪,提供商品和收銀臺等常規線下店鋪的購物功能,用戶可以正常進店購物。同時作為倉庫,管理進出庫,陳列有大量貨物,一方面用于存儲,另一方面也方便用戶挑選。

1.2 有什么問題

作為一個同時有店鋪屬性和倉庫屬性的實體店,同時面對著門店的商品管理和收銀問題,也存在倉庫的貨物管理和收發貨問題。在這種場景下,很多環節都會需要靠打印各種標記來區分和管理實物。同時由于可能存在一臺電腦會參與多個場景,對打印管理也有一定要求。主要是如下的幾個條件:

  1. 需要打印的內容為以下幾類:收銀小票、商品吊牌、不干膠吊牌、配件簽,再根據商品的分類和貨源區分
  2. 現場操作人員統一使用windows系統進行操作,用到的操作后臺都是網頁,調起打印機進行打印的觸發也是通過網頁上的按鈕
  3. 為了減少操作人員的不必要操作,打印過程盡可能的簡單
  4. 一臺電腦可能連接著多個打印機,需要根據打印場景自動選擇使用哪個打印機

2.調用打印機的限制

2.1 js的局限

由于操作后臺都是網頁,這里首先想到的是通過網頁js來調用windows打印機進行打印。一般是通過js調用window.print()來打印,而window.print()打印的是整個網頁的內容,實際需要打印的內容僅僅是條碼或收銀數據,所以可以創建一個臨時的iframe,在iframe內創建打印內容,再調用window.print()來打印。

但不論是否創建iframe來打印,這種做法都會有一個問題,就是會觸發一個windows的打印預覽彈窗,而在倉店的實際操作中這個彈窗是沒有必要的,所以這屬于需要解決的問題,即需要實現靜默打印。

2.2 想要靜默打印

網上對于js實現靜默打印的辦法一般有兩種:

第一種是在chrome下可以通過修改chrome://flags下的參數來實現,但是操作復雜,而且不同版本的支持情況可能也不同,屬于不穩定的解決方法,不適合放在線下由店員來操作。

第二種辦法是使用一個代理程序,將js調起打印的操作轉化為js通知代理程序,代理程序調用打印機,這樣即可繞過瀏覽器和windows的一般流程,實現不彈預覽窗口的靜默打印。

這個打印代理程序在網上能搜到一些,但是對于轉轉二奢倉店也存在一些特例場景不一定能滿足的情況,而且這個代理程序實現起來也不難,所以還是自己做一個方便定制化。

3.做一個定制化的打印代理

3.1 java調起windows打印機

在java中調起Windows打印機,可以通過java的打印服務API實現。首先需要引入javax.print包,然后通過PrintServiceLookup查找可用的打印服務。對于Windows系統,可以根據名稱選擇特定的打印機。

以windows10為例,“打印機和掃描儀”里的打印機名稱就是java程序能識別到的服務名稱以windows10為例,“打印機和掃描儀”里的打印機名稱就是java程序能識別到的服務名稱

以windows10為例,“打印機和掃描儀”里的打印機名稱就是java程序能識別到的服務名稱

示例代碼如下:

private PrintService findPrintService(String name) {
    // 查找全部的打印服務
    PrintService targetPrintService = null;
    PrintService[] allPrintServices = PrintServiceLookup.lookupPrintServices(null, null);
    if (null != allPrintServices) {
        for (PrintService printService : allPrintServices) {
            if (printService.getName().equals(name)) {
                targetPrintService = printService;
                break;
            }
        }
    }

    if (null == targetPrintService) {
        if (null != allPrintServices && allPrintServices.length > 0) {
            List<String> allPrintServiceNameList = Arrays.stream(allPrintServices)
                    // 過濾掉window自帶的打印服務
                    .filter(s -> !s.getName().contains("OneNote") && !s.getName().contains("Microsoft"))
                    .map(PrintService::getName)
                    .collect(Collectors.toList());
            log.info("沒有找到目標打印機, 目標打印機:{}, 全部打印機:{}", name, GsonUtil.toJson(allPrintServiceNameList));
        } else {
            log.info("沒有找到目標打印機, 目標打印機:{}", name);
        }
        returnnull;
    }

    return targetPrintService;
}

通過這種方式,可以靈活控制當前需要使用的打印機,如果同時連接了多個同一型號的打印機,可以靠修改windows中的打印機名稱來做區分。同樣的,如果更換了其他型號的打印機但是打印內容沒有變化,可以靠修改打印機名稱來匹配原有邏輯進行打印。

3.2 我該怎么生成打印數據

倉店打印的場景中,存在多種需要打印的內容,例如收銀小票、商品吊牌、配件簽等等。對于不同的打印內容,需要考慮對應的打印數據獲取方式和打印方式。 一般而言可以分為幾種方式: 一種是使用模板文件,提前將模板畫好,在實際打印時傳入需要打印的數據。這種做法適合長期不變的和比較復雜的內容,例如快遞面單等。

以JasperSoft為例,創建的打印模板以JasperSoft為例,創建的打印模板

另一種是利用java的java.awt.print.Book類來控制打印文字和坐標,交由打印機進行打印。這種做法適合樣式簡單文字量大的內容,例如收銀小票等。

Book book = new Book();
book.append((graphics, pageFormat, pageIndex) -> {
    try {
        // 繪制一段字符串
        graphics.setFont(new Font("Default", Font.BOLD, 12));
        graphics.drawString("十二號字測試行", 0, 30);
        graphics.setFont(new Font("Default", Font.BOLD, 14));
        graphics.drawString("十四號字測試行", 0, 60);
        graphics.setFont(new Font("Default", Font.BOLD, 10));
        graphics.drawString("十號字測試行", 0, 90);
        graphics.setFont(new Font("Default", Font.BOLD, 8));
        graphics.drawString("八號字測試行", 0, 120);
        graphics.setFont(new Font("Default", Font.BOLD, 6));
        graphics.drawString("六號字測試行", 0, 150);
        // 繪制一個條線條
        graphics.drawLine(20, 155, 185, 155);

    } catch (Exception e) {
        log.error("繪制打印內容異常", e);
    }
    return PAGE_EXISTS;
}, pf);

還有一種做法是把需要打印的內容生成圖片,調打印機的時候直接打印圖片。這種做法相對靈活,但是對打印機的打印精度有要求,精度太低的在打印復雜圖片的時候可能會丟失細節導致打印內容不清晰,尤其是涉及到文字相關的時候。

public PageFormat getPageFormat(int imageHeight, int imageWidth) {
        // 傳入圖片的長寬比
        double aspectRatio = getAspectRatio(imageHeight, imageWidth);

        Paper paper = new Paper();
        // 打印紙的頁面大小
        paper.setSize(130.4D, 225.4D);
        // 可打印區域大小
        int areaWidth = 91 - 6;
        // 設置打印坐標,固定寬度,根據長寬比計算打印長度
        paper.setImageableArea(17D + 7, 168D + 2, areaWidth, areaWidth * aspectRatio);

        PageFormat pageFormat = new PageFormat();
        pageFormat.setPaper(paper);
        pageFormat.setOrientation(PageFormat.PORTRAIT);
        return pageFormat;
    }

倉店打印最后選擇的傳入圖片打印的方式。之所以選擇傳圖打印,主要有以下幾點考慮:

第一是打印內容多以條碼為主,這種情況下傳圖比較方便。

第二是更改需要打印的內容時不需要更新打印程序,只需要調整傳入的圖片即可。這樣來說對于倉店打印這種通過網頁操作的場景,可以在不需要實際操作人員介入的情況下完成更新,免去更新打印程序的步驟,更靈活,也減少實際操作人員的工作。

3.3 多場景的自助代理打印

為了能夠簡單的和操作后臺對接,這個打印代理程序使用web的形式實現,即在倉店操作人員的電腦上啟動一個web服務器,由操作后臺的頁面js調用http接口的形式來傳入打印圖片觸發打印。

所以,首先需要創建web程序。java創建web程序很簡單,這里選用spring boot創建一個僅有單個接口的web程序,這個接口用來接收傳入的打印圖片和場景

@RequestMapping("/print")
@ResponseBody
public WebResponse<Void> print(@RequestParam("type") String type, @RequestParam("file") MultipartFile file)

不同的打印場景對應不同的打印參數配置

// 注入不同的打印服務類,key為接口入參的type
@Resource
private Map<String, IPrintService> printServiceMap;

打印服務類實現IPrintService接口,各自處理對應場景的打印參數打印服務類實現IPrintService接口,各自處理對應場景的打印參數

觸發打印的流程放到AbstractPrintService里統一處理

@Override
public boolean print(InputStream inputStream) {

    PrintService targetPrintService = findPrintService(getName());
    if (null == targetPrintService) {
        returnfalse;
    }

    BufferedImage image = null;
    try {
        ImageIO.setUseCache(false);
        // 轉換為圖片類
        image = ImageIO.read(inputStream);
        if (null == image) {
            log.error("打印錯誤,無法獲取需要打印的內容,打印機={}", getName());
            returnfalse;
        }

        // 圖片尺寸
        int oriHeight = image.getHeight();
        int oriWidth = image.getWidth();
        log.debug("name={} oriHeight={} oriWidth={}", getName(), oriHeight, oriWidth);

        // 創建打印任務
        PrinterJob job = PrinterJob.getPrinterJob();
        job.setPrintService(targetPrintService);

        // 設置打印頁面配置
        PageFormat pageFormat = getPageFormat(oriHeight, oriWidth);
        // 縮放比例
        double scale = getScale(pageFormat, oriHeight, oriWidth);

        // 設置打印內容
        job.setPrintable(new ImagePrintable(image, scale), pageFormat);

        PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet();
        // 打印1份
        attributes.add(new Copies(1));
        // 發送打印任務
        job.print(attributes);

        log.info("打印任務已發送, 打印機={}", getName());

    } catch (Exception e) {
        log.error("打印過程異常, 打印機={}", getName(), e);
        returnfalse;
    } finally {
        if (null != image) {
            image.flush();
        }
        System.gc();
    }

    returntrue;
}

3.4 可執行文件的獨立部署

為了便于在倉店的Windows電腦上運行打印代理程序,我們選擇將java程序打包為一個獨立的可執行文件,來簡化倉店操作人員的操作。

將java代碼打包成exe文件有多種方式,倉店選擇的是Launch4jLaunch4j可以在代碼編譯時生成exe文件,免去額外操作的步驟。

首先這個打印程序畢竟是個基于java的程序,運行時需要依賴很多依賴包,為了簡化部署的復雜度,需要添加assembly的編譯插件,用來將所有的依賴包打成一個肥包,來保證單文件可運行:

<!-- 編譯時把依賴的jar全都打包到一個jar文件內的插件,用來保證編譯出的exe文件可以獨立運行 -->
<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <executions>
        <execution>
            <id>assembly</id>
            <phase>package</phase>
            <goals><goal>single</goal></goals>
            <configuration>
                <descriptors>
                    <descriptor>src/main/assembly/assembly.xml</descriptor>
                </descriptors>
            </configuration>
        </execution>
    </executions>
</plugin>

然后添加launch4j的編譯插件,給編譯生成的肥包加exe的外殼:

<!-- Launch4j插件,用來生成exe文件 -->
<plugin>
    <groupId>com.akathist.maven.plugins.launch4j</groupId>
    <artifactId>launch4j-maven-plugin</artifactId>
    <version>${launch4j-maven-plugin.version}</version>
    <executions>
        <execution>
            <id>l4j-clui</id>
            <phase>package</phase>
            <goals>
                <goal>launch4j</goal>
            </goals>
            <configuration>
                <!-- 控制生成的exe文件是命令行顯示還是GUI界面顯示,GUI的話需要自己做一個界面 -->
                <headerType>console</headerType>
                <!-- 生成的exe需要包含的jar -->
                <jar>
                    ${project.build.directory}/${project.build.finalName}.${project.packaging}
                </jar>
                <!-- 生成的exe的輸出位置 -->
                <outfile>${project.build.directory}/printWebserver_1.0.exe</outfile>
                <!-- exe程序的圖標,會顯示在例如窗口、任務管理器等地方 -->
                <icon>src/main/resources/image/zzPrinter.ico</icon>
                <!-- 控制程序以單實例的方式運行 -->
                <singleInstance>
                    <mutexName>warestorePrintWebserver</mutexName>
                </singleInstance>
                <!-- 啟動的入口類 -->
                <classPath>
                    <mainClass>org.springframework.boot.loader.JarLauncher</mainClass>
                    <addDependencies>true</addDependencies>
                    <jarLocation>lib/</jarLocation>
                </classPath>
                <!-- 執行環境的一些控制參數 -->
                <jre>
                    <minVersion>1.8.0</minVersion>
                    <initialHeapSize>1024</initialHeapSize>
                    <maxHeapSize>2048</maxHeapSize>
                </jre>
                <!-- exe文件信息的一些控制參數,在windows右鍵-屬性-詳細信息里顯示 -->
                <versionInfo>
                    <fileVersion>1.0.0.0</fileVersion>
                    <txtFileVersion>1.0.0.0</txtFileVersion>
                    <fileDescription>zhuanzhuan warestore universal printing program</fileDescription>
                    <copyright>zz_warestore</copyright>
                    <productVersion>1.0.0.0</productVersion>
                    <txtProductVersion>1.0.0.0</txtProductVersion>
                    <productName>printWebserver</productName>
                    <internalName>printWebserver</internalName>
                    <originalFilename>printWebserver.exe</originalFilename>
                </versionInfo>
            </configuration>
        </execution>
    </executions>
</plugin>

配置正常的話,編譯完成之后,在target目錄下會有一個生成的exe文件

編譯生成的exe文件編譯生成的exe文件

運行配置文件,程序啟動后會開啟web服務,通過js調用本地的web服務端口即可實現靜默打印

代理打印程序運行畫面代理打印程序運行畫面

4 打印偏移的通用解決方案

一般而言收銀小票、紙質吊牌、標簽紙這種打印紙都是以卷狀銷售的,對應的打印機也是按照裝入打印紙卷設計的。在實際應用的場景中,難免會因為各種各樣的原因導致出現與預期不一致的情況,例如:

  • 紙質吊牌是定制的,出廠有預印刷的圖案在上面,而這個圖案因為公差等等原因在不同批次上會有一定的偏差,導致按照既定打印參數打印出來的內容位置和預期不一致
  • 一卷紙打完了換另外一卷,但是因為公差、裝入的錯誤、更換了供貨品牌等等原因導致存在尺寸差異,會導致打印出來的內容位置偏移

這種情況輕度可能僅僅是看起來觀感差一點,嚴重的可能會影響實際效果。例如倉店吊牌打印的是條碼,如果歪了可能導致條碼與預留的打印區域邊框過緊,無法正常的掃描等等。

正常打印的效果,條碼清晰,與邊距有一定距離便于識別正常打印的效果,條碼清晰,與邊距有一定距離便于識別

打印偏移的效果,示例圖,打印內容與邊緣貼近無法識別打印偏移的效果,示例圖,打印內容與邊緣貼近無法識別

針對這種情況,一般功能比較完善的打印機驅動會提供微調的功能

打印驅動支持微調打印驅動支持微調

但是不是所有的打印驅動都有這個功能,而且不同品牌的打印機因為驅動不同,修改偏移量的位置也可能不同。為了避免實操人員需要記住各種不同品牌的打印機的調整方法,同時能夠讓微調簡單且通用,倉店用了一個簡易的辦法來實現這個功能:

首先在電腦的固定位置創建一個固定名稱的txt文件,里面填入橫縱坐標的偏移量,作為偏移文件

偏移文件,簡單直觀的控制偏移量偏移文件,簡單直觀的控制偏移量

代碼增加一個工具類,在程序啟動時從偏移文件中讀取橫縱的偏移量,將偏移量加到創建打印區域時的參數上,從而實現可以簡單直觀的控制打印位置的功能

@Getter
privatestatic LocalOffsetEntity localOffsetEntity = new LocalOffsetEntity(0.0, 0.0);

// 啟動時加載偏移文件的內容
static {
    try {
        // 獲取桌面路徑
        String desktopPath = System.getProperty("user.home") + "/Desktop";
        // 對于Windows系統需要轉義反斜杠
        if (System.getProperty("os.name").toLowerCase().contains("win")) {
            desktopPath = System.getProperty("user.home") + "\\Desktop";
        }

        File filePath = new File(desktopPath, "\\打印機偏移參數.txt");

        // 讀取文件內容
        final String content = FileUtils.readFileToString(filePath, StandardCharsets.UTF_8);
        log.info("本地偏移文件內容:" + content);
        final String[] offsetArr = content.split(",");
        if (offsetArr.length > 1) {
            Double xOffset = Double.valueOf(offsetArr[0]);
            Double yOffset = Double.valueOf(offsetArr[1]);

            localOffsetEntity.setxOffset(xOffset);
            localOffsetEntity.setyOffset(yOffset);
        }
    } catch (IOException e) {
        System.err.println("讀取文件失敗:");
    }
}
// 在生成打印區域的時候把偏移量加進去,來實現調整打印位置的效果
final CacheUtil.LocalOffsetEntity localOffsetEntity = CacheUtil.getLocalOffsetEntity();
paper.setImageableArea(14.2D + localOffsetEntity.getxOffset(), 121.9D + localOffsetEntity.getyOffset(), areaWidth, areaWidth * aspectRatio);

5.總結

這個代理打印程序的實現整體功能不復雜,在設計過程主要需要考慮易用性和穩定性。

  • 倉店場景因為操作人員使用的后臺都是網頁形式,所以使用web服務來實現代理,簡化和前端交互的邏輯。
  • 操作人員需要長時間面對各種操作場景,需要盡量減少的操作步驟和預期外問題
  • 應對不可控的場景盡量提供簡單易操作的解決方案

程序員中普遍流傳著一句話,“脫離了業務的程序都是耍流氓”,從實際場景出發,盡可能的符合需求,是程序設計的首要目標。

關于作者:項贏,轉轉java開發工程師

責任編輯:武曉燕 來源: 轉轉技術
相關推薦

2011-11-25 14:14:58

噴墨打印機用戶體驗

2015-12-02 15:29:32

HTTP網絡協議代理原理

2013-04-09 14:36:33

3D打印

2015-09-28 15:59:00

Java動態代理機制

2011-10-18 21:59:20

2021-11-17 10:14:24

3D打印AI 人工智能

2011-05-07 14:31:03

噴墨打印機廢墨倉

2024-04-26 09:04:13

2017-05-11 21:30:01

Android動態代理ServiceHook

2011-11-21 12:56:10

Java代理模式設計模式

2021-11-24 08:55:38

代理網關Netty

2012-01-06 20:16:57

2010-03-30 16:26:09

Oracle

2009-08-26 09:54:45

C#打印預覽C#打印

2023-11-23 16:59:37

數據倉庫建模

2011-06-13 13:05:53

愛普生打印機

2009-08-26 13:41:58

C#打印源碼

2015-12-02 14:10:56

HTTP網絡協議代理原理

2009-08-19 14:29:33

C#代理
點贊
收藏

51CTO技術棧公眾號

欧洲一级在线观看| 国产一级片网址| 免费一区二区三区四区| 日韩一区在线免费观看| 成人自拍网站| 手机av免费观看| 欧美精品91| 亚洲性生活视频在线观看| 久久久久久久久久毛片| 日韩av一卡| 亚洲欧美一区二区三区孕妇| 精品视频导航| 国产丝袜视频在线观看| 免费永久网站黄欧美| 久久av红桃一区二区小说| av网站免费在线播放| 日韩精品成人| 欧美精选午夜久久久乱码6080| 国产免费观看高清视频| 草莓福利社区在线| 国产女主播一区| 久久人人九九| www日本高清视频| 久久国产精品色| 日韩美女免费线视频| 久久久久久免费观看| 国产精品久久久久蜜臀| 国产丝袜一区二区三区免费视频| 久久黄色一级视频| 欧美日韩免费电影| 在线影视一区二区三区| 日本日本19xxxⅹhd乱影响| 宅男网站在线免费观看| 国产精品私人自拍| 日韩国产精品一区二区| 亚洲欧美日韩精品永久在线| 国产精品一区二区视频| 成人在线精品视频| 中文字幕 国产| 日韩av一区二区在线影视| 2019精品视频| 91九色丨porny丨肉丝| 狠狠干成人综合网| 欧美日韩国产999| 国产极品国产极品| 亚洲欧美在线专区| 久久综合国产精品台湾中文娱乐网| 秋霞网一区二区三区| 久久综合色占| 亚洲欧美自拍一区| 中文字幕丰满乱子伦无码专区| 理论片一区二区在线| 亚洲国产成人在线播放| 国产精品久久久久久亚洲av| 一区二区亚洲视频| 欧美成人乱码一区二区三区| 自拍视频第一页| 99re8这里有精品热视频8在线| 欧美一级久久久久久久大片| 欧美性猛交xx| 国产日韩三级| 精品视频一区在线视频| 公侵犯人妻一区二区三区| 欧美男gay| 在线观看中文字幕亚洲| 午夜三级在线观看| 欧美日韩三级| 性欧美亚洲xxxx乳在线观看| www.国产色| 日本伊人色综合网| 国产精品旅馆在线| 国产老女人乱淫免费| 国产精品亚洲第一| 国产中文一区二区| 久久这里精品| 中文字幕制服丝袜一区二区三区| 五月天综合婷婷| 久久大胆人体| 日韩欧美高清视频| 国产3p在线播放| 9l视频自拍蝌蚪9l视频成人| 亚洲精品视频网上网址在线观看| 波多野吉衣中文字幕| 日韩精品欧美激情一区二区| 欧美床上激情在线观看| 亚洲 欧美 日韩 综合| 日韩精品国产欧美| www.成人av.com| 美国成人毛片| 亚洲精品免费电影| 免费看的黄色大片| 亚洲人成777| 亚洲国产另类久久精品| 国产午夜福利一区| 影音先锋在线一区| 国产欧美在线看| 粉嫩av一区二区夜夜嗨| 国产三级精品三级在线专区| 欧洲精品视频在线| 日本成人三级电影| 日韩精品一区二区三区视频| 精品人妻一区二区三区蜜桃视频| 亚洲女同一区| 国产高清视频一区三区| 亚洲国产精品18久久久久久| 国产视频在线观看一区二区三区| 91精品国产毛片武则天| 浪潮色综合久久天堂| 精品国产一区二区三区久久久蜜月 | 亚洲iv一区二区三区| 午夜视频www| 一区二区三区免费看视频| 不卡影院一区二区| 黄色免费大全亚洲| 大胆欧美人体视频| 国内av在线播放| 99久久伊人网影院| 国产精品无码免费专区午夜| 国产亚洲精彩久久| 亚洲男人的天堂在线播放| a级黄色片免费看| 美洲天堂一区二卡三卡四卡视频| 久久av一区二区三区漫画| av在线导航| 91麻豆精品国产91久久久更新时间| 一级做a爰片毛片| 激情六月综合| 97人人干人人| 成人在线直播| 欧美日韩国产bt| 美女脱光内衣内裤| 国产毛片一区| 久久精品99久久| sm久久捆绑调教精品一区| 欧美一区二区精品| 91香蕉视频在线播放| 青草国产精品久久久久久| 欧美日韩一区在线播放| 一个人www视频在线免费观看| 亚洲成人xxx| 日本系列第一页| 国产传媒日韩欧美成人| 潘金莲一级淫片aaaaaa播放1| 日韩精品一级毛片在线播放| 日韩在线小视频| 在线观看免费视频一区| 国产免费观看久久| 污网站免费在线| 日韩欧美视频专区| 国产在线播放91| 黄网站视频在线观看| 欧美一区二区三区四区五区 | 亚洲无线一线二线三线区别av| 亚洲自拍偷拍区| 欧洲黄色一区| 亚洲精品动漫100p| 好吊色在线视频| 欧美国产禁国产网站cc| 亚洲天堂网一区| 国产精品99久久久久久动医院| 国产日韩在线观看av| www.久久久久.com| 精品日本一线二线三线不卡| 久久久久99精品| 97精品电影院| 无码人妻精品一区二区三区66| 精品99在线| 国产在线久久久| 日本在线观看大片免费视频| 亚洲电影免费观看| 天码人妻一区二区三区在线看| 亚洲国产经典视频| 午夜福利123| 亚洲激情专区| 五月天丁香综合久久国产| 国产精品视频一区视频二区| 久久人人爽国产| 国产福利片在线| 欧美一区二区三区四区在线观看| 日本一区二区三区免费视频| 国产亚洲欧洲一区高清在线观看| 99九九99九九九99九他书对| 一区二区三区国产在线| 视频在线观看成人| ccyy激情综合| 国产精品91在线观看| av网站大全在线| 亚洲欧美国产精品va在线观看| 中文字幕无码乱码人妻日韩精品| 一区二区三区日本| 日本性高潮视频| 国产91丝袜在线播放| 免费看污黄网站| 极品中文字幕一区| 椎名由奈jux491在线播放| 久9re热视频这里只有精品| 国产色视频一区| 新版的欧美在线视频| 另类少妇人与禽zozz0性伦| 深夜福利视频一区| 欧美成人官网二区| 伊人22222| 欧美午夜女人视频在线| 国产精品成人免费观看| 欧美激情在线免费观看| 污片免费在线观看| 国产一区二区不卡| 无码人妻精品一区二区三区66| 亚洲国产高清一区二区三区| 在线电影看在线一区二区三区| 欧美自拍一区| 97视频中文字幕| 亚洲资源在线| 国产精品久久久久7777婷婷| 久久男人av资源站| 欧美黑人xxxⅹ高潮交| 欧美一区二区三区在线观看免费| 日韩精品视频在线播放| 亚洲精品久久久蜜桃动漫 | 黑人与亚洲人色ⅹvideos| 精品国产一区二区在线观看| 92久久精品一区二区| 在线影院国内精品| 亚洲欧美偷拍一区| 欧美日韩免费一区| 日本中文字幕免费| 亚洲一区二区三区自拍| avtt天堂在线| 亚洲三级小视频| 香蕉成人在线视频| 中文字幕av一区二区三区免费看 | 夜夜亚洲天天久久| 天天天天天天天天操| 中文字幕亚洲一区二区av在线| 欧美人妻一区二区三区| 久久亚洲综合av| 五级黄高潮片90分钟视频| 99精品视频在线观看免费| 国产女人18毛片水真多18| 国产成a人亚洲精| 又黄又色的网站| 福利电影一区二区| youjizz.com日本| 从欧美一区二区三区| 日本一区二区在线观看视频| 成人动漫一区二区| 中国极品少妇videossexhd| 成人动漫视频在线| 欧美图片一区二区| 久久久久久久综合日本| 欧美大波大乳巨大乳| 日本一区二区三区在线观看| 手机毛片在线观看| 国产精品丝袜一区| 国产大片免费看| 亚洲一区二区视频在线| 日韩av在线播| 日本高清视频一区二区| 最近中文在线观看| 666欧美在线视频| 亚洲精品久久久久久久久久久久久久 | 国产精品久久一区二区三区不卡| 永久免费毛片在线播放不卡| 乱人伦中文视频在线| 欧美成人免费全部| 超碰激情在线| 国产精品成人观看视频国产奇米| 国产极品一区| 粉嫩精品一区二区三区在线观看 | 国产精品一区二区免费不卡| 国产综合内射日韩久| 久久先锋影音av| 成人三级视频在线观看| 一区二区三区资源| 久久久久99精品成人片三人毛片| 欧美亚洲动漫精品| 国产三级自拍视频| 日韩av在线不卡| 777电影在线观看| 欧美激情精品久久久久久变态| 伊人久久av| 成人激情视频网| 欧美日韩破处| 一个色的综合| 亚洲人体大胆视频| 在线黄色免费看| 成人av先锋影音| 亚洲毛片亚洲毛片亚洲毛片| 一区二区在线观看免费| 青青视频在线免费观看| 欧美一区二区三区四区在线观看| 亚洲 欧美 自拍偷拍| 北条麻妃一区二区三区中文字幕 | 国产精品热视频| 亚洲一区二区三区四区电影| 手机看片福利永久国产日韩| 狠狠色丁香久久综合频道| 色悠悠久久综合网| 成人激情免费网站| 日本二区三区视频| 一本色道**综合亚洲精品蜜桃冫| 精品久久国产视频| 国产一区二区三区在线播放免费观看| 精品精品导航| 国产主播欧美精品| 自拍偷拍精品| 999一区二区三区| 精品综合免费视频观看| 国产真实乱人偷精品人妻| 亚洲国产婷婷综合在线精品| 国产精品免费无遮挡| 亚洲男人天堂手机在线| 视频在线这里都是精品| 国产主播在线一区| 欧美系列电影免费观看| 波多野结衣家庭教师在线播放| 国产精品系列在线播放| 欧美xxxx精品| 色婷婷久久综合| 五月天激情开心网| 午夜精品福利电影| 一本一道久久a久久| 中文字幕超清在线免费观看| 日韩av一区二区在线影视| 欧美深性狂猛ⅹxxx深喉| 亚洲妇熟xx妇色黄| 亚洲老妇色熟女老太| 久久亚洲成人精品| 亚洲欧美在线综合| 制服国产精品| 九九久久精品视频| 蜜桃av.com| 欧美高清一级片在线| 91caoporm在线视频| 国产精品精品久久久久久| 欧美男男gaytwinkfreevideos| 欧美 日韩 国产一区| 91丨九色丨蝌蚪富婆spa| 91精品国产乱码久久久张津瑜| 精品国产区一区| 黑人精品视频| 国产亚洲一区在线播放| 1024日韩| 久久人人爽人人爽人人片 | 亚洲专区第一页| 日韩中文在线中文网三级| 日韩在线激情| 中文字幕一区二区三区四区五区六区 | 久久国产亚洲| 亚洲第一成肉网| 亚洲精品久久7777| 欧美少妇bbw| 欧美亚洲国产精品| 精品国产一区二区三区小蝌蚪| 黄色av免费在线播放| 国产精品麻豆99久久久久久| 亚洲一区二区色| 久久69精品久久久久久国产越南| 日韩在线观看中文字幕| 91视频 -- 69xx| 亚洲国产高清不卡| 国产免费高清视频| 韩国三级电影久久久久久| 日韩av中文字幕一区| 国产第一页视频| 中文字幕日韩一区| 午夜美女福利视频| 欧美在线观看网站| 日韩精品水蜜桃| 亚洲av人人澡人人爽人人夜夜| 五月天激情综合| av大片在线看| 成人动漫视频在线观看免费| 国产人成精品一区二区三| 亚洲毛片亚洲毛片亚洲毛片| 欧美大片在线观看| 成人教育av| 青青草免费在线视频观看| 99re热视频精品| 91久久久久久久久久久久| 欧美精品videosex牲欧美| 国产欧美日韩在线观看视频| 爱情岛论坛亚洲自拍| 欧美色道久久88综合亚洲精品| 91社区在线观看播放| 成人影片在线播放| 天堂一区二区在线| 中文字幕手机在线观看| 精品呦交小u女在线| 国产高清亚洲| 国产男女无遮挡| 亚洲乱码国产乱码精品精可以看 | 日韩成人动漫在线观看| caoporm在线视频| 韩曰欧美视频免费观看| 久草免费在线观看| 欧美激情第六页| 国产91在线看| 国产又粗又大又黄| 日本一区二区在线免费播放|