999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于“Primefaces+Hibernate”框架的企業(yè)倉儲貨位管理系統(tǒng)的技術實現(xiàn)

2021-05-07 10:44:40常學偉
數(shù)字技術與應用 2021年3期
關鍵詞:數(shù)據(jù)庫

常學偉

(陽煤豐喜肥業(yè)(集團)有限責任公司聞喜復肥分公司,山西運城 044402)

0 引言

陽煤豐喜肥業(yè)(集團)有限責任公司聞喜復肥分公司擁有兩條15萬噸高塔復合肥生產線、一條15萬噸轉鼓造粒生產線,一條5萬噸的轉鼓造粒生產線,另設有液體肥、水溶肥新型品種肥料生產線,年生產能力達到50萬噸,是華北地區(qū)最大的復合肥生產企業(yè)之一,產品適用于全國不同地域、各種作物的用肥需求。產品年產量大、品類多及倉儲區(qū)域大等實際情況給公司的倉儲管理帶來一定難度。

目前,我公司信息化管理方面,在采購、銷售、倉儲及財務等環(huán)節(jié)均采用浪潮公司ERP軟件,大大減輕了各部門的工作量,并實現(xiàn)與上級集團公司業(yè)務的無縫對接。但在實際應用中發(fā)現(xiàn),ERP系統(tǒng)對倉儲現(xiàn)場的貨位管理不完善,且ERP是桌面軟件已投入使用多年,不具備移動端在線查詢功能,另貨物出入庫頻繁,產品型號多,造成保管找不到貨的情況時有發(fā)生,針對這種情況,本文主要采用Java Web框架的primefaces開源類庫和hibernate框架開發(fā)一個方便在線查詢貨位、庫存數(shù)等記錄,以此來簡化倉儲現(xiàn)場貨位管理,提高工作效率。

圖1 復合肥倉儲貨位前臺查詢界面Fig.1 The front desk query interface of compound fertilizer storage space

1 系統(tǒng)設計

本倉儲貨位管理系統(tǒng)通過“Primefaces+Hibernate”java 框架編程技術,結合Mysql數(shù)據(jù)庫實現(xiàn)。程序運行在阿里云服務器,服務器軟件為Tcomat,服務器版本為7.2,數(shù)據(jù)庫為Mysql,數(shù)據(jù)庫版本為5.0。該系統(tǒng)分為前臺查詢,后臺管理及數(shù)據(jù)庫三部分組成。

1.1 前臺查詢界面設計

前臺界面為倉儲管理人員提供一個能夠查詢產品貨位的功能,方便通過移動端設備隨時查詢,主要功能為登錄界面、當前庫存明細、按配方匯總明細等三個功能。如圖1所示。

1.2 后臺管理界面設計

后臺管理由管理員操作,功能為期初庫存、當期產品入庫、當期產品出庫、當前庫存、結賬及用戶管理等功能。如圖2所示。

1.3 數(shù)據(jù)庫表設計

底層數(shù)據(jù)庫采用Mysql來存儲數(shù)據(jù),分別設計:期初庫存表openingStockTable,入庫表storageVolumeTable和出庫表deliveryVolumnTable、用戶表user_manager四個表格。這四個數(shù)據(jù)表結構如表1-表4。

2 系統(tǒng)業(yè)務邏輯分析

圖2 復合肥倉儲貨位后臺管理界面Fig.2 The back-end management interface of compound fertilizer storage space

表1 期初庫存表OpeningStockTableTab.1 OpeningStockTable

表2 入庫表StorageVolumeTableTab.2 StorageVolumeTable storageVolumeTable

2.1 前臺、后臺登錄

登錄窗口設置用戶名輸入框、密碼輸入框、信息提示、登錄按鈕等primefaces組件。單擊登錄按鈕后,出現(xiàn)如下幾種情況:

(1)當用戶名或秘密為空時,信息提示“內容為空,請重新輸入”。

(2) 當輸入用戶名在user_manager數(shù)據(jù)表中不存在,信息提示“用戶不存在,請重新輸入”。

(3)當輸入的用戶名存在,但輸入的密碼與數(shù)據(jù)表中密碼不一致,信息提示“密碼錯誤,請重新輸入”。

(4)當輸入用戶名和密碼均正確,但用戶名所對應的用戶類型不符合登錄類型時,信息提示“輸入用戶沒有登錄權限,請聯(lián)系管理員!”。用戶類型設置“前臺用戶”和“管理員”兩種,“前臺用戶”只允許登錄前臺查詢界面,“管理員”只允許登錄后臺管理界面。

(5)當輸入用戶名、密碼、用戶類型和數(shù)據(jù)表信息相符時,從登錄界面跳轉值前臺主頁面或者后臺管理頁面。

2.2 后臺管理中,期初庫存錄入、出入庫錄入

(1)單筆出入庫記錄明細錄入,項目分別是:配方類別、配方名稱、倉庫名稱、貨位號、包裝袋樣式和型號、數(shù)量、貨物狀況等項目手動收入,記錄人、記錄時間由系統(tǒng)自動錄入。

(2)期初產品信息錄入,需判斷入庫產品在是否已經(jīng)存在,如果存在提示“期初庫存已存在記錄要輸入的記錄,無需再進行輸入操作!”,如果不存在,則直接插入記錄即可。

(3)當期產品入庫時,應先判斷期初產品庫存中是否有相同記錄(數(shù)量信息除外),如果沒有,先在期初表中插入信息,然后再到當期入庫表中插入。

(4)期初表中的當期入庫總數(shù)、當期出庫總數(shù)和當前庫存數(shù)根據(jù)當期入庫表和當期出表中數(shù)據(jù)結合Hibernate HQL查詢中的sum函數(shù)和查詢條件,在插入或出庫完成并在頁面導向成功后更新。

(5)產品出庫時,應當判斷期初表中的當前庫存總數(shù)和要出庫數(shù)大小,如果當前庫存總數(shù)≥要出庫數(shù),則在出庫表中插入記錄,頁面導向成功并自動更新期初表中出庫總數(shù)和當前庫存數(shù)等。如果要出庫的產品不存在,則提示信息“產品不存在”,如果出庫數(shù)大于當前庫存數(shù),則提示信息“要出庫數(shù),超庫存數(shù)”。

2.3 查詢功能

(1)分別將期初表、入庫表、出庫表中的數(shù)據(jù)明細以表格形式顯示在頁面上。

(2)當前庫存明細以表格形式顯示在頁面上。

(3)當前庫存按照配方分類匯總,以條形圖表的形式顯示在頁面上。

2.4 結賬

(1)把期初庫存表openingStockTable中的當前庫存數(shù)currentStock字段賦值給期初庫存openingStock字段;

(2)將期初庫存表openingStockTable中的當期入庫總數(shù)storageVolumeSum、當期出庫總數(shù)deliveryVolumeSum、當前庫存數(shù)currentStock等三個字段數(shù)值清0;

(3)入庫表storageVolumeTable和出庫表storageVolume Table中的數(shù)據(jù)清0。

3 技術實現(xiàn)

3.1 開發(fā)環(huán)境

(1)java軟件開發(fā)包版本為:JDK7;

(2)開發(fā)軟件為NetBeans IDE 7.2軟件;

表3 出庫表StorageVolumeTableTab.3 Outbound table StorageVolumeTable

表4 用戶表user_managerTab.4 User table user_manager

(3)數(shù)據(jù)庫使用Mysql5.0;

(4)主要jar包。

1)Primefaces jar包:primefaces3.4.2.jar;

2)JSF jar包:jsf-api.jar、jsf-impl.jar、standard.jar、jstl.jar;

3)Hibernate jar包:hibernate3.jar;

4)MySQL JDBC 驅動程序:mysql-connector-java-5.0.4-bin.jar.

3.2 通過Hibernate創(chuàng)建對象/關系數(shù)據(jù)映射

因創(chuàng)建多個數(shù)據(jù)表,操作方法類似,所以下面以創(chuàng)建期初表為例,進行闡述。

(1)根據(jù)1.3數(shù)據(jù)庫表的設計,創(chuàng)建持久化 JavaBean類文件,名稱為openingStockTable,并根據(jù)字段名及類型聲明相應的屬性,最后設置get和set方法,實例如下:

public class openingStockTable {

public openingStockTable() {

}

private Long id; //編號

private String formulaStyle; //配方類別 尿基、硝基、轉鼓等

private String formulaName; //配方名稱

......

......

......

public Long getId() {

return id; }

public void setId(Long id) {

this.id = id; }

public String getFormulaStyle() {

return formulaStyle; }

public void setFormulaStyle(String formulaStyle) {

this.formulaStyle = formulaStyle; }

public String getFormulaName() {

return formulaName; }

public void setFormulaName(String formulaName) {

this.formulaName = formulaName;}

......

......

......

//因篇幅有限,上述省略號省略剩余

屬性的set和get方法創(chuàng)建。

}

(2)映射配置文件創(chuàng)建。

通過NetBeansIDE開發(fā)工具創(chuàng)建映射配置文件,文件名稱為openingStockTable.hbm.xml,映射配置文件中將上述Bean文件中的屬性與要創(chuàng)建的數(shù)據(jù)表中的字段建立起映射關系。文件位置放置在WEB-INF/class文件夾下,映射內容如下:

"openingStockTable">

......

......

......

說明:⑴通過class、id和property標簽將4.2.1中的JavaBean類與數(shù)據(jù)庫表,類屬性與數(shù)據(jù)庫表字段建立起映射關系。⑵上述表中,如果類屬性為float類型的,則property標簽中的type值應為“float”;類屬性為Date日期類型的,則property標簽中的type值應為“date”;類屬性為String類型的,則property標簽中的type值應為“string”。

(3)連接數(shù)據(jù)庫。

通過NetBeansIDE開發(fā)工具創(chuàng)建hibernate.cfg.xml文件,文件位置放置在WEB-INF/class文件夾下,內容如下:

org.hibernate.dialect.MySQLDialect

com.mysql.jdbc.Driver

jdbc:

mysql://localhost:3306/xyfilems?useUnicode=true&characterEncoding=UTF-8

root

123456

說明:通過property標簽建立數(shù)據(jù)庫連接,并將前面創(chuàng)建的四個數(shù)據(jù)庫表的映射文件進行配置。

(4)創(chuàng)建數(shù)據(jù)庫,并通過java程序自動創(chuàng)建數(shù)據(jù)表。

使用Hibernate框架,可以讓我們以面向對象的思想操作數(shù)據(jù)庫,無需直接操作數(shù)據(jù)。通過Hibernate框架提供的SchemaExport類,可以在創(chuàng)建好數(shù)據(jù)庫后直接根據(jù)上述持久化類、映射文件配置信息直接創(chuàng)建表格。創(chuàng)建一個名稱為createDataBaseTable的java主類文件,內容如下:

import org.hibernate.cfg.Configuration;

import org.hibernate.tool.hbm2ddl.SchemaExport;

public class createDataBaseTable {

public static void main(String[]args) {

// TODO code application logic here

try {

Configuration cfg = new Configuration().configure();

SchemaExport exporg = new SchemaExport(cfg);

exporg.create(true, true);

} catch (Exception ex) {

} finally {

}}}

說明:運行上述文件后,前面配置的4個數(shù)據(jù)庫表自動創(chuàng)建成功。

3.3 創(chuàng)建HibernateUtil.java工具類

對于在項目業(yè)務邏輯層需要與數(shù)據(jù)庫建立連接、終止的部分,這里通過建立一個工具類,方便在后續(xù)在項目中調用,內如如下:

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.cfg.Configuration;

public class HibernateUtil {

private static final SessionFactory sessionFactory;

static {

try {

Configuration config = new Configuration().configure();

sessionFactory = config.buildSessionFactory();

} catch (Throwable ex) {

// Log the exception.

System.err.println("Initial SessionFactory creation failed." + ex);

throw new ExceptionInInitializerError(ex);

}

}

public static SessionFactory getSessionFactory() {

return sessionFactory;

}

public static Session getSession() {

return sessionFactory.openSession();

}

public static void closeSession(Session session) {

if (session != null) {

if (session.isOpen()) {

session.close();

}

}

}

}

3.4 配置項目基礎配置文件web.xml

使用NetBeansIDE開發(fā)工具創(chuàng)建項目后,在WEB-INF文件夾下會自動創(chuàng)建wen.xml配置文件,配置內容如下:

javax.faces.PROJECT_STAGE

Development

Faces Servlet

javax.faces.webapp.FacesServlet

1

Faces Servlet

/faces/*

30

faces/index.xhtml

說明:該配置文件指定了primefaces的核心控制器javax.faces.webapp.FacesServlet和項目的默認主頁訪問路徑等信息。

3.5 faces-config.xml文件配置

使用NetBeansIDE開發(fā)工具創(chuàng)建faces-config.xml文件,創(chuàng)建后初始文件如下:

xmlns="http://java.sun.com/xml/ns/javaee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/webfacesconfig_2_1.xsd">

該配置文件用于注冊Primefaces 受管Bean文件,通過“managed-bean”標簽實現(xiàn)注冊,另外,Primefaces組件頁面之間的導向配置,通過“navigation-rule”標簽實現(xiàn)。

3.6 web層的實現(xiàn)

Web層的頁面設計通過Primefaces提供的組件完成,因篇幅有限,這里主要將項目中應用較多的組件介紹,其他組件的使用可以參考primefaces參考手冊了解。

3.6.1 組件實現(xiàn)聯(lián)動功能

在項目開發(fā)中,有時需要通過選擇一個下拉列表項,另外一個下拉列表自動顯示子選項,這功能可以通過下拉列表組件的rendered屬性、p:ajax組件和valueChange Listener事件來實現(xiàn)。功能實現(xiàn)方法如下:

(1)創(chuàng)建Bean文件,并在faces-config.xml文件中注冊。

1)faces-config.xml文件中注冊Bean

openingStock_insert warehouse System.productInfoInput.openingStock_insert

request

2)Bean文件代碼,下述省略部分為聲明的屬性設置set和get方法。

package warehouseSystem.productInfoInput;

import java.util.HashMap;

import javax.faces.event.ValueChangeEvent;

import org.primefaces.component.outputlabel.OutputLabel;

import org.primefaces.component.selectonemenu.SelectOneMenu;

public class openingStock_insert {

public openingStock_insert() {

formulaStyleMap.put("尿基", "尿基");

formulaStyleMap.put("硝基", "硝基");

niaojiformulaMap.put("28-6-6", "28-6-6");

niaojiformulaMap.put("24-14-7", "24-14-7");

niaojiformulaMap.put("25-10-5", "25-10-5");

niaojiformulaMap.put("27-14-10", "27-14-10");

xiaojiformulaMap.put("硝15-15-15","硝15-15-15");

xiaojiformulaMap.put("硝15-7-21","硝15-7-21");

xiaojiformulaMap.put("硝16-6-21","硝16-6-21");

}

//配方類型

public String formulaStyleValue;

public String getFormulaStyleValue() {......}

public void setFormulaStyleValue(String formulaStyleValue) {......}

HashMap formulaStyleMap = new HashMap();

public HashMap getFormulaStyleMap() {......}

public void setFormulaStyleMap(HashMap formulaStyleMap) {......}

//配方選項賦值

HashMap niaojiformulaMap = new HashMap();

public HashMap getNiaojiformulaMap(){......}

public void setNiaojiformulaMap(HashMap niaojiformulaMap) {......}

//配方選項賦值

HashMap xiaojiformulaMap = new HashMap();

public HashMap getXiaojiformulaMap() {......}

public void setXiaojiformulaMap(HashMap xiaojiformulaMap) {......}

OutputLabel oplFormulaName = new OutputLabel();

public OutputLabel getOplFormulaName(){......}

public void setOplFormulaName(OutputLabel oplFormulaName) {......}

SelectOneMenu somNiaoji = new SelectOneMenu();

public SelectOneMenu getSomNiaoji() {......}

public void setSomNiaoji(SelectOneMenu somNiaoji){......}

SelectOneMenu somxiaoji = new SelectOneMenu();

public SelectOneMenu getSomxiaoji() {......}

public void setSomxiaoji(SelectOneMenu somxiaoji){......}

//當觸發(fā)ValueChange事件時,會根據(jù)選項值執(zhí)行相應的動作。

public void changeFormulaNameEvent(ValueChange Event e) {

//獲取下拉選項的值

Object countryName = e.getNewValue();

//this.setCities(this.getChinaMapCity());

if (countryName.equals("尿基")) {

oplFormulaName.setRendered(true);

somNiaoji.setRendered(true);

somxiaoji.setRendered(false);

} else if (countryName.equals("硝基")) {

oplFormulaName.setRendered(true);

somNiaoji.setRendered(false);

somxiaoji.setRendered(true);

}

}

}

(2)使用NetBeansIDE開發(fā)工具創(chuàng)建xhtml網(wǎng)頁文件,代碼如下:

xmlns:h="http://java.sun.com/jsf/html"

xmlns:p="http://primefaces.org/ui"

xmlns:c="http://java.sun.com/jsp/jstl/core"

xmlns:f="http://java.sun.com/jsf/core">

說明:上述功能為選擇id屬性為“formulaStyleId”的p:selectOneMenu組件的值,觸發(fā)valueChangeListener事件,p:ajax組件的ajax屬性刷新form范圍,另外兩個組件會根據(jù)選擇的值,判斷是否顯示和顯示子選項。

3.6.2 p:dataTable表格組件

(1)組件屬性(表5)。

(2)從數(shù)據(jù)庫中調用數(shù)據(jù),并見數(shù)據(jù)通過p:dataTable表格組件顯示出來,可以通過hibernate將數(shù)據(jù)復制給List對象,然后再將List對象值賦值給ListDataModel數(shù)據(jù)模型,最后在數(shù)據(jù)表格中即可顯示。

1)在受控Bean文件中,聲明ListDataModel數(shù)據(jù)模型。

public ListDataModel allWarehouseDataModel = new ListDataModel();

public ListDataModel getAllWarehouseDataModel() {

return allWarehouseDataModel;

}

public void setAllWarehouseDataModel(ListDataModel allWarehouseDataModel) {

this.allWarehouseDataModel = allWarehouseData Model;

}

2)在受控Bean文件中,通過hibernate調用數(shù)據(jù)庫數(shù)據(jù),并將數(shù)據(jù)賦值給ListDataModel對象。

Session session = null;

try {

session = HibernateUtil.getSession();

session.beginTransaction();

Query query = session.createQuery(" from openingStockTable order by formulaStyle");

List names = query.list();

allWarehouseDataModel.setWrappedData(names);

} catch (Exception ex) {

} finally {

HibernateUtil.closeSession(session);

}

3)在xhtml網(wǎng)頁文件中,通過p:dataTable表格組件顯示數(shù)據(jù)。

rows="8" paginatorPosition="bottom" paginator AlwaysVisible="false" emptyMessage="無內容"paginatorTemplate="{CurrentPageReport} {FirstPage Link} {PreviousPageLink} {PageLinks} {NextPageLink}{LastPageLink}">

根據(jù)需要顯示的數(shù)據(jù),在p:dataTable組件中,增加p:column組件,即可增加數(shù)據(jù)表的列數(shù)。p:dataTable組件的value值綁定的就是前面已經(jīng)創(chuàng)建好的ListDataModel對象。

3.6.3 p:barChart條形圖表

PrimeFaces框架共提供了有100多個支持AJAX的JSF組件。其中,圖表組件就提供了餅圖、折線圖、條形圖、圈圖、氣泡圖等多個圖表組件供開發(fā)者直接使用,功能豐富,大大提高了開發(fā)效率。這里介紹項目中使用的條形圖表的應用。

要將數(shù)據(jù)在p:barChart條形圖表組件中顯示,需要調用primefaces類庫中的CartesianChartModel圖表模型和ChartSeries類對象。首先,通過hibernate從數(shù)據(jù)庫中調取數(shù)據(jù),并將數(shù)據(jù)賦值給Object[]數(shù)組,然后再將對象數(shù)組值賦值給ChartSeries對象,最后再將ChartSeries對象值賦值給CartesianChartModel圖表模型。具體實現(xiàn)代碼如下:

(1)在受控Bean文件中,聲明CartesianChartModel數(shù)據(jù)模型和ChartSeries對象。

CartesianChartModel openingStockChartModelNiaoji= new CartesianChartModel();

public CartesianChartModel getOpeningStockChart ModelNiaoji() {

return openingStockChartModelNiaoji;

}

public void setOpeningStockChartModelNiaoji(CartesianChartModel openingStockChartModelNiaoji) {

this.openingStockChartModelNiaoji = openingStock ChartModelNiaoji;

}

ChartSeries openingStockCSNiaoji = new ChartSeries();

表5 p:dataTable組件屬性值Tab.5 p:dataTable component attribute values

public ChartSeries getOpeningStockCSNiaoji() {

return openingStockCSNiaoji;

}

public void setOpeningStockCSNiaoji(ChartSeries openingStockCSNiaoji) {

this.openingStockCSNiaoji = openingStockCSNiaoji;

}

(2)在受控Bean文件中的無參構造函數(shù)中,通過hibernate調用數(shù)據(jù)庫數(shù)據(jù),并將數(shù)據(jù)賦值給ChartSeries對象,然后再將ChartSeries對象值賦值給CartesianChartModel數(shù)據(jù)模型。

Session session = null;

try {

session = HibernateUtil.getSession();

session.beginTransaction();

Query query = session.createQuery("select formulaName,sum(currentStock) from openingStockTable where formulaStyle= :fs group by formulaName");

query.setString("fs", "尿基");

List li = query.list();

Iterator ite = li.iterator();

while (ite.hasNext()) {

Object[]obj = (Object[]) ite.next();

openingStockCSNiaoji.set(obj[0],Float.valueOf(obj[1].toString()));

}

openingStockChartModelNiaoji.addSeries(opening StockCSNiaoji);

} catch (Exception ex) {

//session.getTransaction().rollback();

} finally {

HibernateUtil.closeSession(session);

}

(3)在xhtml網(wǎng)頁文件中,通過p:barChart組件將數(shù)據(jù)以條形圖的形式顯示出來。

p:barChart組件條形圖表組件的value值為前面創(chuàng)建的CartesianChartModel對象。

4 結語

本文主要介紹了采用“Primefaces+Hibernate”框架實現(xiàn)企業(yè)倉儲管理貨位管理項目的技術實現(xiàn)。通過Prime faces提供的豐富組件和采用Hibernate面向對象的數(shù)據(jù)操作,使得項目開發(fā)效率大大提高。

猜你喜歡
數(shù)據(jù)庫
數(shù)據(jù)庫
財經(jīng)(2017年15期)2017-07-03 22:40:49
數(shù)據(jù)庫
財經(jīng)(2017年2期)2017-03-10 14:35:35
兩種新的非確定數(shù)據(jù)庫上的Top-K查詢
數(shù)據(jù)庫
財經(jīng)(2016年15期)2016-06-03 07:38:02
數(shù)據(jù)庫
財經(jīng)(2016年3期)2016-03-07 07:44:46
數(shù)據(jù)庫
財經(jīng)(2016年6期)2016-02-24 07:41:51
數(shù)據(jù)庫
財經(jīng)(2015年3期)2015-06-09 17:41:31
數(shù)據(jù)庫
財經(jīng)(2014年21期)2014-08-18 01:50:18
數(shù)據(jù)庫
財經(jīng)(2014年6期)2014-03-12 08:28:19
數(shù)據(jù)庫
財經(jīng)(2013年6期)2013-04-29 17:59:30
主站蜘蛛池模板: 人妖无码第一页| 伊人无码视屏| 亚洲美女AV免费一区| 色天堂无毒不卡| 中文无码精品A∨在线观看不卡| 黄色网站不卡无码| 欧美成人影院亚洲综合图| 91亚洲精选| 国产十八禁在线观看免费| 国产成人无码综合亚洲日韩不卡| 久久久久亚洲Av片无码观看| 成年人国产视频| 一区二区日韩国产精久久| 漂亮人妻被中出中文字幕久久| 亚洲AV无码乱码在线观看裸奔| 日本成人不卡视频| 五月婷婷综合网| 亚洲日本韩在线观看| 欧美v在线| 婷婷伊人五月| 97超级碰碰碰碰精品| 亚洲欧美另类日本| 国产丝袜91| 日本国产精品一区久久久| 国产va在线| 免费AV在线播放观看18禁强制| 老司国产精品视频91| 精品伊人久久久久7777人| 中文字幕不卡免费高清视频| 成人无码区免费视频网站蜜臀| 8090成人午夜精品| 青草国产在线视频| 麻豆精品视频在线原创| 2022国产无码在线| 亚洲第一页在线观看| 亚洲欧美在线看片AI| 国产精品女在线观看| 国产96在线 | 91高清在线视频| 欧美综合一区二区三区| 尤物成AV人片在线观看| 久久性妇女精品免费| 99re经典视频在线| 亚洲永久视频| 欧美伦理一区| 亚洲欧美日韩中文字幕一区二区三区 | 精品夜恋影院亚洲欧洲| 在线精品亚洲国产| 亚洲综合狠狠| 毛片在线区| 中文字幕在线一区二区在线| 精品视频在线观看你懂的一区| 日韩在线播放中文字幕| 强乱中文字幕在线播放不卡| 91午夜福利在线观看| 亚洲色欲色欲www在线观看| 这里只有精品免费视频| 国产精品熟女亚洲AV麻豆| 国产在线精品人成导航| 国产呦精品一区二区三区下载| 国产黄色免费看| 精品国产网| 在线人成精品免费视频| 国产激情无码一区二区APP| 成人在线欧美| 中文字幕伦视频| 热久久这里是精品6免费观看| 伊人婷婷色香五月综合缴缴情| 久久国产亚洲欧美日韩精品| 国产精品亚欧美一区二区三区| 国产在线小视频| 亚洲天堂免费在线视频| 国产爽歪歪免费视频在线观看| 亚洲成a人片在线观看88| www.99精品视频在线播放| 亚洲开心婷婷中文字幕| 国产99久久亚洲综合精品西瓜tv| 特级做a爰片毛片免费69| 亚洲第一区在线| 台湾AV国片精品女同性| 福利视频久久| 91精品久久久无码中文字幕vr|