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

如何使用SpringAI、React和Docker構建AI聊天機器人

譯文 精選
人工智能
在本教程中,我們將使用SpringBoot、React、Docker以及OpenAI來構建一個聊天機器人的應用程序。此應用程序能夠讓用戶與由AI驅動的聊天機器人進行交互,可以向其提出問題,并實時獲取回復。

譯者 | 劉濤

審校 | 重樓

嘿,Java開發人員們,有個重大好消息要告訴你們:Spring如今已正式支持通過SpringAI模塊來構建AI應用程序。

在本教程中,我們將使用SpringBoot、React、Docker以及OpenAI來構建一個聊天機器人的應用程序。此應用程序能夠讓用戶與由AI驅動的聊天機器人進行交互,可以向其提出問題,并實時獲取回復。

文中提到的全部源代碼已在GitHub存儲庫中予以提供。歡迎給它加星標,然后搬運該源代碼庫進行嘗試體驗。

為了讓你對所要構建的內容有個概念,最終AI應用程序的樣子如下:

你感興趣么?讓我們從頭開始吧!

目錄

前提條件

獲取OpenAI密鑰

使用Spring Boot構建REST API

使用Reactjs構建Chat UI

如何將AI應用程序Docker化

運行AI應用程序

前提條件

在我們深入研究構建聊天機器人之前,你需要熟悉以下幾點:

  • 需具備Java和Spring Boot的基本知識。
  • 需要對React和CSS有基本的了解。
  • 需要把JDK、NodePackageManager和Docker安裝到本地計算機中。

獲取OpenAI密鑰

首先,如果你沒有Open AI賬戶,那么需要先注冊一個,在登錄之后,你會來到它的主頁。

在右上角,單擊“Dashboard”(控制面板)菜單。在側邊欄上,單擊“API Keys”(應用程序編程接口密鑰),然后單擊“Create new secretkey”(創建新密鑰)按鈕以生成你自己的密鑰:

復制密鑰并將其妥善保存于安全之處,因為后續你需要憑借此密鑰將你的應用程序與OpenAI API相連接。

你可以查閱OpenAI API參考指南,以獲取更多關于如何調用API、它所接受的請求類型以及它給出的響應內容等方面的信息。

使用SpringBoot構建REST API

讓我們前往Spring Initializer(用于快速創建Spring Boot項目的基礎結構的一個網絡工具)來生成樣板文件代碼:

你可以自行選擇group(反向域名)、artifact(項目唯一標識符)、name(項目名稱)、description(項目描述)和package(Java包名)。我們使用Maven(Java項目的依賴管理和構建工具)作為構建工具,SpringBoot版本為3.3.3,打包選項為Jar(JavaArchive的縮寫,是Java應用程序的標準打包格式),Java版本為17。(注:Dependency Management:依賴管理)

點擊生成按鈕,將會下載一個zip文件。解壓該文件,然后將其作為Maven項目導入到你喜歡的IDE中(我用的是Intellij)。

在Spring中配置你的OpenAI密鑰

你可以使用現有的application.properties文件,或者創建一個application.yaml文件。我喜歡使用Yaml,所以創建了一個application.yaml文件,我可以在其中放置所有的SpringBoot配置。

接下來在你的application.yaml文件中添加OpenAIKey、Model和Temperature:

spring:
ai:
openai:
chat:
options:
model:"gpt-3.5-turbo"
temperature:"0.7"
key:"PUTYOUROPEN_API_KEYHERE"

application.properties中的類似配置可能如下所示:

spring.ai.openai.chat.options.model=gpt-3.5-turbo
spring.ai.openai.chat.options.temperature=0.7
spring.ai.openai.key="PUTYOUROPEN_API_KEYHERE"

構建ChatController

讓我們創建一個URL為/ai/chat/string的GET API和一個處理邏輯的方法:

@RestController
publicclass ChatController{

@Autowired
private final OpenAiChatModel chatModel;

@GetMapping("/ai/chat/string")
public Flux<String>generateString(@RequestParam(value="message",defaultValue="Tellmeajoke")Stringmessage){
return chatModel.stream(message);
}
}
  • 首先,我們添加@RestController注解將ChatController類標記為我們的Spring控制器。
  • 然后,我們注入dependency項(inject the dependency:一種設計模式,在 Spring 框架中廣泛使用。它允許我們在不直接創建對象的情況下,讓 Spring 容器為我們管理和提供所需的對象)來獲取OpenAiChatModel類的實例。這個類是由我們之前添加的 Spring AI dependency庫提供的。
  • OpenAiChatModel帶有一個stream(message)方法,它接受一個String類型的提示并返回一個String響應(技術上來說,它是一個String的Flux,因為我們使用了該方法的響應式版本)。
  • 在內部,OpenAiChatModel.stream(message)將調用OpenAI API并從那里獲取響應。OpenAI調用將使用你在application.yaml文件中提到的配置,所以請確保使用有效的OpenAI密鑰。
  • 我們創建了一個方法來處理GET API調用,該方法接受消息并返回Flux<String>作為響應。

構建、運行和測試 REST API

./mvnw clean install spring-boot:run

理想情況下,它會在8080端口上運行,除非你自定義了端口。請確保該端口空閑,以成功運行應用程序。

你可以使用Postman 或Curl命令來測試你的 REST API:

curl --location 'http://localhost:8080/ai/chat/string?message=How%20are%20you%3F'

使用Reactjs構建Chat UI

我們使用useState來管理狀態:

const [messages, setMessages] = useState([]);
const [input, setInput] = useState('');
const [loading, setLoading] = useState(false);
  • messages:它將存儲聊天中的所有消息。每條消息都有text(文本內容)和sender(發送者,可能是'user'或'ai')這兩個屬性。
  • input:用于保存用戶在文本框中輸入的內容。
  • loading:當聊天機器人等待 AI 響應時,此狀態被設置為“true”;在收到響應時,則設置為“false”。

接下來,讓我們創建一個handleSend 函數,并在用戶通過點擊按鈕或按下回車鍵發送消息時進行調用:

const handleSend = async () => {
    if (input.trim() === '') return;

const newMessage = { text: input, sender: 'user' };
    setMessages([...messages, newMessage]);
    setInput('');
    setLoading(true);

try {
        const response = await axios.get('http://localhost:8080/ai/chat/string?message=' + input);
        const aiMessage = { text: response.data, sender: 'ai' };
        setMessages([...messages, newMessage, aiMessage]);
    } catch (error) {
        console.error("Error fetching AI response", error);
    } finally {
        setLoading(false);
    }
};

以下是逐步發生的過程:

  • 檢查空輸入:倘若輸入字段為空,函數將提前返回(不會發送任何內容)。
  • 用戶新消息:一條新消息被添加到 messages 數組中。這條消息包含 text(用戶輸入的內容)屬性,并標記為由'user'發送。
  • 重置輸入:消息發送完畢后,輸入字段被清空。
  • 開始加載:等待 AI 響應時,loading 設置為 true 以顯示加載指示器。
  • 發起 API 請求:代碼使用 axios 向 AI 聊天機器人 API 發送請求,傳遞用戶的消息。在收到響應后,AI 的新消息被添加到聊天中。
  • 錯誤處理:如果獲取 AI 響應時出現問題,錯誤會被記錄至控制臺。
  • 停止加載:最終加載狀態被關閉。

讓我們編寫一個函數,當用戶在輸入字段中輸入內容,對input狀態進行更新:

const handleInputChange = (e) => {
    setInput(e.target.value);
};

然后,我們創建一個函數來檢查用戶是否按下了 Enter 鍵。如果出現這種情形,它會調用 handleSend()函數來發送消息:

const handleKeyPress = (e) => {
    if (e.key === 'Enter') {
        handleSend();
    }
};

現在讓我們創建 UI 元素來呈現聊天消息:

{messages.map((message, index) => (
    <div key={index} className={`message-container ${message.sender}`}>
        <img
            src={message.sender === 'user' ? 'user-icon.png' : 'ai-assistant.png'}
            alt={`${message.sender} avatar`}
            className="avatar"
        />
        <div className={`message ${message.sender}`}>
            {message.text}
        </div>
    </div>
))}

這個代碼塊呈現聊天中的所有消息:

  • 遍歷消息:使用 .map() 函數將每條消息顯示為一個div。
  • 消息樣式:消息的類名根據發送者(user或ai)而變化,清楚地表明誰發送了消息。
  • 頭像圖片:每條消息顯示一個小頭像,用戶和 AI 使用不同的圖片。

讓我們創建一些基于某個標志來顯示加載器的邏輯:

{loading && (
    <div className="message-container ai">
        <img src="ai-assistant.png" alt="AI avatar" className="avatar" />
        <div className="message ai">...</div>
    </div>
)}

當 AI 處于思考狀態(即 loading 為 true 時),我們顯示一條加載消息(...),以便讓用戶知道響應即將到來。

最后,創建一個用于點擊發送消息的按鈕:

<button onClick={handleSend}>
    <FaPaperPlane />
</button>

當此按鈕被點擊時,將會觸發 handleSend() 函數。這里所采用的圖標為一個紙飛機,這是“發送”按鈕的常見圖標。

完整的 Chatbot.js 如下所示:

import React, { useState } from 'react';
import axios from 'axios';
import { FaPaperPlane } from 'react-icons/fa';
import './Chatbot.css';

const Chatbot = () => {
    const [messages, setMessages] = useState([]);
    const [input, setInput] = useState('');
    const [loading, setLoading] = useState(false);

const handleSend = async () => {
        if (input.trim() === '') return;

const newMessage = { text: input, sender: 'user' };
        setMessages([...messages, newMessage]);
        setInput('');
        setLoading(true);

try {
            const response = await axios.get('http://localhost:8080/ai/chat/string?message=' + input);
            const aiMessage = { text: response.data, sender: 'ai' };
            setMessages([...messages, newMessage, aiMessage]);
        } catch (error) {
            console.error("Error fetching AI response", error);
        } finally {
            setLoading(false);
        }
    };
const handleInputChange = (e) => {
        setInput(e.target.value);
    };
const handleKeyPress = (e) => {
        if (e.key === 'Enter') {
            handleSend();
        }
    };
return (
        <div className="chatbot-container">
            <div className="chat-header">
                <img src="ChatBot.png" alt="Chatbot Logo" className="chat-logo" />
                <div className="breadcrumb">Home > Chat</div>
            </div>
            <div className="chatbox">
                {messages.map((message, index) => (
                    <div key={index} className={`message-container ${message.sender}`}>
                        <img
                            src={message.sender === 'user' ? 'user-icon.png' : 'ai-assistant.png'}
                            alt={`${message.sender} avatar`}
                            className="avatar"
                        />
                        <div className={`message ${message.sender}`}>
                            {message.text}
                        </div>
                    </div>
                ))}
                {loading && (
                    <div className="message-container ai">
                        <img src="ai-assistant.png" alt="AI avatar" className="avatar" />
                        <div className="message ai">...</div>
                    </div>
                )}
            </div>
            <div className="input-container">
                <input
                    type="text"
                    value={input}
                    onChange={handleInputChange}
                    onKeyPress={handleKeyPress}
                    placeholder="Type your message..."
                />
                <button onClick={handleSend}>
                    <FaPaperPlane />
                </button>
            </div>
        </div>
    );
};
export default Chatbot;

在 App.js 中使用 <Chatbot/>來加載聊天機器人 UI:

function App() {
  return (
    <div className="App">
            <Chatbot />
        </div>
  );
}

除此之外,我們還使用 CSS 來使我們的聊天機器人更加美觀。你可以參考 App.css 和 Chatbot.css 文件來了解具體樣式。

運行前端

使用npm命令運行應用程序:

npm start

程序會在URL http://localhost:3000上運行前端。此時應用程序已能夠進行測試。

然而,分別運行后端和前端稍顯繁瑣。因此,讓我們借助Docker來使整個構建流程更加簡單。

如何將AI應用程序Docker化

讓我們將整個應用程序Docker化,以便輕松打包和部署到任何地方。你可以從Docker的官方網站安裝并配置Docker。

Docker化后端

聊天機器人的后端是用Spring Boot構建的,因此我們將創建一個Dockerfile,它將Spring Boot應用程序構建為可執行JAR文件并在容器中運行。

讓我們為其編寫Dockerfile:

# Start with an official image that has Java installed
FROM openjdk:17-jdk-alpine

# Set the working directory inside the container
WORKDIR /app

# Copy the Maven/Gradle build file and source code into the container
COPY target/chatbot-backend.jar /app/chatbot-backend.jar

# Expose the application’s port
EXPOSE 8080

# Command to run the Spring Boot app
CMD ["java", "-jar", "chatbot-backend.jar"]
  • FROM openjdk:17-jdk-alpine:這條語句指定了Docker基于包含JDK 17的輕量級Alpine Linux鏡像,JDK 17是運行Spring Boot所必備的。
  • WORKDIR /app:這條語句設置了Docker內部的工作目錄為/app,這是我們應用程序文件將要存放的位置。
  • COPY target/chatbot-backend.jar /app/chatbot-backend.jar:這條語句將本地機器上(通常在使用Maven或Gradle構建項目后,位于target文件夾中)構建的JAR文件復制到容器中。
  • EXPOSE 8080:這條語句告訴Docker,應用程序將在端口8080上監聽請求。
  • CMD ["java", "-jar", "chatbot-backend.jar"]:這條語句指定了容器啟動時將要執行的命令。它運行JAR文件以啟動Spring Boot應用程序。

Docker化前端

聊天機器人的前端用React構建而成,通過創建一個Dockerfile來對其進行Docker化處理,該Dockerfile會安裝必要的依賴項( dependencies)、構建應用程序,并借助像NGINX這類輕量級的Web服務器來提供服務。

讓我們為React前端編寫Dockerfile:

# Use a Node image to build the React app
FROM node:16-alpine AS build

# Set the working directory inside the container
WORKDIR /app

# Copy the package.json and install the dependencies
COPY package.json package-lock.json ./
RUN npm install

# Copy the rest of the application code and build it
COPY . .
RUN npm run build

# Use a lightweight NGINX server to serve the built app
FROM nginx:alpine
COPY --from=build /app/build /usr/share/nginx/html

# Expose port 80 for the web traffic
EXPOSE 80

# Start NGINX
CMD ["nginx", "-g", "daemon off;"]
  • FROM node:16-alpine AS build: 使用輕量級的Node.js鏡像來構建React應用。我們在這個容器內部安裝所有依賴項并構建應用。
  • WORKDIR /app: 設置容器內部的工作目錄為/app。
  • COPY package.json package-lock.json ./: 復制package.js和package-lock.json文件以便安裝依賴項。
  • RUN npm install: 安裝package.json中列出的所有依賴項。
  • COPY . .: 將當前目錄下的所有前端源代碼文件復制到容器中。
  • RUN npm run build: 將構建完React后的文件置入一個名為build的文件夾中。
  • FROM nginx:alpine: 在構建完應用后,基于nginx Web服務器鏡像啟動了一個新的容器。
  • COPY --from=build /app/build /usr/share/nginx/html: 將第一個容器(即構建React應用的容器)中的build文件夾復制到nginx容器中,這是nginx默認用于提供文件的目錄。
  • EXPOSE 80: 開放端口80,nginx將使用此端口來提供Web流量。
  • CMD ["nginx", "-g", "daemon off;"]: 以前臺模式啟動nginx服務器,以提供你的React應用。

使用Docker Compose同時運行前后端

現在我們已經為前端和后端分別創建了Dockerfile,我們將使用 docker-compose來協調同時運行這兩個容器。

讓我們在項目的根目錄下編寫docker-compose.yml 文件:

version: '3'
services:
  backend:
    build: ./backend
    ports:
      - "8080:8080"
    networks:
      - chatbot-network
frontend:
    build: ./frontend
    ports:
      - "3000:80"
    depends_on:
      - backend
    networks:
      - chatbot-network
networks:
  chatbot-network:
    driver: bridge
  • version: ’3’:這定義了所使用的 Docker Compose 的版本。
  • services:這定義了我們想要運行的服務。
  1. backend: 此服務使用位于./backend 目錄中的 Dockerfile 構建后端,并暴露 8080 端口。
  2. frontend: 此服務使用位于./frontend 目錄中的 Dockerfile 構建前端。它將主機上的 3000 端口映射到容器內的 80 端口。
  • depends_on: 這確保前端在啟動之前等待后端準備就緒。
  • networks: 此部分定義了一個共享網絡,以便后端和前端能夠相互通信。

運行AI應用程序

要運行整個應用程序(前端和后端),你可以使用以下命令:

docker-compose up --build

這個命令將會實現:

  • 構建前端和后端的鏡像。
  • 啟動兩個容器(后端在 8080 端口,前端在 3000 端口)。
  • 設置網絡,使兩個服務可以相互通信。

現在,你可以訪問 http://localhost:3000 加載聊天機器人 UI,并開始向 AI 提問。

你已經成功使用 Spring Boot、React、Docker 和 OpenAI 構建了一個全棧聊天機器人應用。

項目中展示的源代碼可在 Github 上獲取,如果你覺得它有幫助,請加星標,并隨意搬運該源代碼庫進行嘗試體驗。

譯者介紹

劉濤,51CTO社區編輯,某大型央企系統上線檢測管控負責人。

原文標題:How to Build an AI Chatbot with Spring AI, React, and Docker,作者:Vikas Rajput

責任編輯:姜華 來源: 51CTO內容精選
相關推薦

2019-01-25 16:30:34

機器人機器學習人工智能

2019-03-22 09:00:00

AI人工智能聊天機器人

2025-11-04 07:00:00

AI聊天工具影子AI安全

2023-09-18 09:00:00

聊天機器人DeepInfraLangChain

2025-06-04 08:21:28

2025-07-21 09:23:13

2020-08-14 16:18:30

人工智能

2022-07-03 10:23:06

機器人場景個性化

2022-07-05 06:42:01

聊天機器人人工智能

2019-07-03 10:02:47

聊天機器人平臺機器人

2017-08-21 13:31:44

AI聊天機器人facebook

2017-03-28 12:21:21

機器人定義

2024-08-16 07:09:22

2021-05-24 15:29:24

人工智能機器人聊天

2023-02-28 07:59:19

OpenAI聊天機器人

2023-05-18 10:06:00

聊天機器人醫療保健

2024-11-01 14:52:24

2020-12-02 13:00:17

Recast.AI聊天機器人人工智能

2023-09-28 20:57:23

Meta人工智能聊天機器人
點贊
收藏

51CTO技術棧公眾號

中文字幕免费不卡| 国产免费成人| 精品久久久久久久久久久院品网| www.欧美黄色| 天堂av在线7| 日本午夜一区二区| 欧美精品午夜视频| 中文字幕一区二区人妻在线不卡| 精品亚洲美女网站| 亚洲欧美二区三区| 欧美日韩综合久久| 天堂网成人在线| wwwwxxxx在线观看| 日本一区二区不卡视频| 国产精品麻豆免费版| 亚洲国产av一区二区三区| 亚洲第一偷拍| 亚洲人成在线免费观看| 美女流白浆视频| 福利精品在线| 天涯成人国产亚洲精品一区av| 日韩欧美在线一区二区| 欧美 日韩 国产 精品| 日韩电影在线观看一区| 性欧美xxxx视频在线观看| 亚洲图片另类小说| 超碰成人在线观看| 欧美久久高跟鞋激| 日韩中文字幕免费在线| 国产黄色大片在线观看| 国产精品色呦呦| 好吊色欧美一区二区三区视频| 国产精品久久久久精| 久久三级视频| 91精品国产沙发| 欧美激情精品久久| 五月天久久777| 在线日韩日本国产亚洲| 无码国产69精品久久久久同性| 97se亚洲| 欧美成人一区二区三区在线观看 | 欧美性色aⅴ视频一区日韩精品| 国产一线二线三线女| a视频在线免费看| 国产精品久久久久桃色tv| 免费观看成人在线| 亚洲色欧美另类| av中文字幕亚洲| 999精品视频一区二区三区| 亚洲天堂视频在线| 免播放器亚洲一区| 国产精品十八以下禁看| 亚洲性猛交富婆| 日本欧美大码aⅴ在线播放| 国产成人久久久精品一区| 最近免费中文字幕大全免费版视频| 9久re热视频在线精品| 国内精品小视频| 日韩欧美亚洲一区二区三区| 亚洲视频高清| 午夜精品久久久久久久久久久久久| 免费一级肉体全黄毛片| 亚洲视频免费| 欧洲日韩成人av| 男人的天堂av网站| 日本色综合中文字幕| 国产精品视频精品视频| 伊人免费在线观看| 国产一本一道久久香蕉| 久久成人综合视频| 神马午夜精品91| 你懂的国产精品永久在线| 九九热精品视频国产| 免费在线一区二区三区| av成人天堂| 国产精品96久久久久久又黄又硬| 正在播放木下凛凛xv99| 激情图区综合网| 国产 高清 精品 在线 a | 亚洲男人天天操| 日本一道本视频| 香蕉综合视频| 国内精品伊人久久| 99re国产在线| 国产一区欧美日韩| 韩国成人一区| 超碰免费97在线观看| 亚洲私人影院在线观看| 被灌满精子的波多野结衣| 中文字幕成在线观看| 欧美亚洲国产bt| 日本泡妞xxxx免费视频软件| 欧美电影免费网站| 色琪琪综合男人的天堂aⅴ视频| 日韩高清dvd碟片| 亚洲永久字幕| 国产精品亚发布| 亚洲国产精品久久人人爱潘金莲| 2024国产精品| 一二三在线视频| 中文字幕这里只有精品| 91精品国产一区二区| 国产精品久久不卡| 亚洲色图网站| 国产成人综合精品在线| 亚洲国产精品久久久久爰性色| 久久久亚洲精品石原莉奈| 欧美性受xxxx黑人猛交88| 在线观看网站免费入口在线观看国内| 欧美日韩亚洲高清一区二区| 少妇被狂c下部羞羞漫画| 成人一区不卡| 91高清在线免费观看| 国产精品国产一区二区三区四区| 99久久精品99国产精品| 永久免费网站视频在线观看| 日韩免费小视频| 亚洲国产精久久久久久久| 黄色片网站在线播放| 99亚洲一区二区| 成人性生交大片免费看视频直播| 欧洲综合视频| 亚洲一区二区三区美女| 欧美国产日韩另类| 国产欧美日韩| 欧美一级大片在线观看| www.com在线观看| 国产精品对白交换视频| 欧美 日韩 国产在线观看| 国产视频一区二| 中文字幕亚洲综合久久筱田步美| 毛片在线免费视频| 成人av免费在线| 国产亚洲精品久久久久久久| 亚洲伊人伊成久久人综合网| 国产亚洲欧美另类中文| 亚洲天堂一区在线| 99久久精品免费观看| 免费一级特黄毛片| swag国产精品一区二区| 欧美www在线| 国产喷水福利在线视频| 国产精品伦理在线| 尤蜜粉嫩av国产一区二区三区| 香蕉国产成人午夜av影院| 性日韩欧美在线视频| 亚洲欧美另类日韩| 亚洲午夜精品网| 精品1卡二卡三卡四卡老狼| 欧美激情自拍| 成人av资源| 福利成人导航| 亚洲成**性毛茸茸| 国产成人无码一区二区三区在线| 成人免费视频一区二区| 国产69精品久久久久999小说| 福利电影一区| 欧美性视频精品| 三级av在线播放| 91福利在线导航| www.涩涩爱| 精品一区二区三区在线观看| 国产又爽又黄ai换脸| 麻豆精品国产| 欧美激情亚洲一区| 四虎免费在线观看| 日韩欧美a级成人黄色| 亚洲 小说 欧美 激情 另类| 日韩电影在线看| 一区视频二区视频| 精品国产三级| 久久全国免费视频| 视频一区二区三区在线看免费看 | 精品视频免费在线播放| 日本国产精品| 国产精品旅馆在线| 成a人片在线观看| 亚洲成人xxx| 免费黄色小视频在线观看| 国产精品免费丝袜| av在线天堂网| 久久亚洲不卡| 最新精品视频| 麻豆一区一区三区四区| 欧洲精品在线视频| 毛片在线播放a| 欧美成va人片在线观看| youjizz在线视频| 国产精品国产馆在线真实露脸 | 国产专区第一页| 国产精品毛片高清在线完整版| 特黄特黄一级片| 国产精品美女久久久浪潮软件| 三区精品视频观看| 在线播放一区二区精品视频| 日韩美女在线看| 亚洲综合图区| 亚洲香蕉在线观看| 国产91免费看| 欧美日韩色一区| 日本免费在线播放| 国产精品天干天干在线综合| 美国黄色一级视频| 蜜乳av一区二区三区| r级无码视频在线观看| 日韩综合一区| 精品国产一区二区三区四区vr| 国产精品美女午夜爽爽| 国内精品久久影院| h网站久久久| 亚洲视频网站在线观看| 亚洲国产综合一区| 欧美日韩久久久一区| 中文字幕亚洲精品一区| 亚洲精品综合在线| 天天摸日日摸狠狠添| 91亚洲午夜精品久久久久久| 999久久久精品视频| 视频一区二区三区在线| 性欧美大战久久久久久久| 一区二区三区四区日韩| 日本在线高清视频一区| 美国一区二区| 国产高清一区视频| 国产乱码精品一区二区三区亚洲人| 国产成人午夜视频网址| 黄色在线免费观看网站| 久精品免费视频| 毛片在线看网站| 色黄久久久久久| 欧洲成人av| 亚洲精品456在线播放狼人| 国产内射老熟女aaaa∵| 欧美色综合天天久久综合精品| 黄色免费av网站| 午夜婷婷国产麻豆精品| 老女人性淫交视频| 亚洲日本va在线观看| 国产又粗又黄又猛| 国产女人水真多18毛片18精品视频| 捆绑凌虐一区二区三区| eeuss影院一区二区三区| 99热这里只有精品2| 精品一区在线看| www.五月天色| 韩国一区二区视频| 国产精欧美一区二区三区白种人| 另类小说综合欧美亚洲| 国产一级做a爰片久久| 日韩精彩视频在线观看| 人妻熟女一二三区夜夜爱| 麻豆久久精品| 日本一极黄色片| 日韩福利电影在线观看| 国产三级三级三级看三级| 久久久久久久尹人综合网亚洲| 欧洲黄色一级视频| 久久精品一区二区三区中文字幕| 欧美黄网站在线观看| 久久国产日韩| 免费一级特黄录像| 奇米一区二区三区av| 91看片在线免费观看| 久久精品二区亚洲w码| 韩国一区二区在线播放| 国产精品99久| www.男人天堂| 久久麻豆一区二区| www.xx日本| 亚洲精品日日夜夜| 日韩精品成人一区| 色婷婷久久久综合中文字幕| 中日韩av在线| 日韩精品一区二区三区蜜臀| 天堂网在线播放| 亚洲欧洲美洲在线综合| 中文字幕在线观看日本| 久久99精品久久久久久琪琪| 男女在线观看视频| 国产精品7m视频| www.久久草.com| 国产日韩在线一区二区三区| 色哟哟精品丝袜一区二区| 亚洲精品中文综合第一页| 欧美福利一区| 国产成人无码a区在线观看视频| 玖玖玖国产精品| 欧洲美女亚洲激情| 99精品久久免费看蜜臀剧情介绍| 国产精品国产三级国产专业不| 亚洲欧美色图小说| 亚洲免费黄色网址| 欧美精选午夜久久久乱码6080| 亚洲欧美激情国产综合久久久| 亚洲男人天天操| 91极品在线| 国产福利成人在线| 亚洲国产精品免费视频| 欧美精品一区三区在线观看| 亚洲色图二区| 国产无套粉嫩白浆内谢的出处| 国产精品中文字幕欧美| 中文字幕一二三四区| 亚洲码国产岛国毛片在线| 中文字幕高清在线免费播放| 日韩视频免费直播| 岛国在线视频| 69av在线视频| 国产亚洲字幕| 日韩精彩视频| 日韩视频一区| 日本wwww色| 中文乱码免费一区二区| 日本三级片在线观看| 91精品综合久久久久久| 国产在线一二三区| 97国产在线观看| 欧一区二区三区| 亚洲 国产 日韩 综合一区| 99精品99| 秘密基地免费观看完整版中文| 中文字幕制服丝袜一区二区三区 | 丰满大乳奶做爰ⅹxx视频| 亚洲久本草在线中文字幕| 伊人免费在线观看高清版| 亚洲日韩第一页| 黄毛片在线观看| 国产精品亚洲综合| 欧美日韩国产在线一区| 999在线精品视频| 国产精品久久久久久久久果冻传媒 | 亚洲精品无吗| 久久视频这里有精品| 国产成人免费高清| 午夜爱爱毛片xxxx视频免费看| 欧美综合久久久| 国产1区2区3区在线| 日韩免费av在线| 日韩精品社区| 成人免费毛片网| 久久伊人蜜桃av一区二区| 97超碰人人干| 日韩精品中文字幕视频在线| 精品极品在线| 久久精品二区| 久久xxxx| 久久久久久久毛片| 91国产成人在线| 岛国在线大片| 国产精品视频色| 97精品中文字幕| 亚洲图片小说在线| 全部av―极品视觉盛宴亚洲| 国产熟女一区二区| 欧美三级在线看| 五月婷婷在线视频| 成人激情春色网| 欧美在线免费| 日本黄色大片在线观看| 亚洲福利视频一区二区| 五月婷婷六月色| 日本国产精品视频| 日韩成人a**站| 91免费视频污| 亚洲第一成年网| 青青青手机在线视频观看| 国产999精品久久久| 欧美aaaa视频| 深夜视频在线观看| 精品成人久久av| h视频在线免费| 91在线免费网站| 亚洲美女毛片| 极品人妻videosss人妻| 4438x亚洲最大成人网| 污污的视频在线观看| 精品久久精品久久| 日本不卡在线视频| 欧美成人一二三区| 亚洲美女av在线| 亚洲精品三区| 久在线观看视频| 国产精品成人在线观看| 精品免费久久久| 青青青国产精品一区二区| 93在线视频精品免费观看| 99久久久无码国产精品性波多| 色婷婷av一区二区三区大白胸| 麻豆传媒视频在线观看免费| 成人综合电影| 青草国产精品久久久久久| 免费看一级一片| 在线播放日韩av| aaa国产精品视频| 91av在线免费播放| 一区二区三区日韩精品| 国产在线视频你懂得| av一区二区三区四区电影| av网站大全在线| 日韩精品在线第一页|