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

在以太坊上構建去中心化的待辦事項列表應用程序

區塊鏈
我們將涵蓋有趣的主題,例如設置開發環境、編寫 Solidity 智能合約、測試它以及將其部署到 Sepolia 測試網。一起編寫代碼以便更好地理解!

歡迎來到以太坊區塊鏈上令人興奮的去中心化應用程序 (dApp) 世界!在本分步指南中,我們將逐步介紹使用 Hardhat 開發框架創建去中心化待辦事項列表應用程序的過程。

我們將涵蓋有趣的主題,例如設置開發環境、編寫 Solidity 智能合約、測試它以及將其部署到 Sepolia 測試網。一起編寫代碼以便更好地理解!

先決條件

在我們深入研究之前,請確保您擁有以下工具和先決條件:

  • ? Node
  • ? Hardhat:與區塊鏈交互的 JavaScript 框架。
  • ? Metamask:安裝 Metamaks 并獲取您的私鑰。配置 Metamask 以連接到 Sepolia 網絡。
  • ? Alchemy:獲取 Sepolia 測試網的 Alchemy HTTP 端點。這是有關如何設置的指南。[1]
  • ? Test Sepolia ETH:從水龍頭[2]請求一些Sepolia ETH 。

設置我們的環境

現在我們已經收集了我們的工具,是時候設置我們的開發環境了。

這是分步指南:

? 為您的應用程序 todolist 創建一個新的項目目錄。

mkdir todolist
cd todolist
npm init -y
npm install --save-dev hardhat

? 通過運行以下命令來初始化您的 Hardhat 項目:

npx hardhat init
  • 選擇創建 JavaScript 項目的選項,并接受默認選項。Hardhat 將生成一個示例項目并為您安裝必要的依賴項。
  • ? 在您喜歡的代碼編輯器中打開您的項目文件夾。如果您使用 Visual Studio Code,只需運行:
code .

? 為了確保 Metamask 私鑰和 Alchemy RPC URL 等敏感信息的安全,請在項目目錄中創建一個 .env 文件,并按以下格式存儲密鑰:

圖片圖片

? 安裝該dotenv軟件包,這將幫助我們使用環境變量:

npm i dotenv

? 修改 Hardhat 配置文件(通常名為 Hardhat.config.js)以識別文件中的密鑰.env:

require("@nomicfoundation/hardhat-toolbox");
require("dotenv").config();

module.exports = {
  solidity: "0.8.19",

  networks: {
    sepolia: {
      url: process.env.ALCHEMY_API_KEY_URL,
      accounts: [process.env.PRIVATE_KEY],
    },
  },
};

您的環境現在已準備好在以太坊區塊鏈上施展魔法!

建立我們的合同

讓我們通過編寫 Solidity 智能合約來深入研究待辦事項列表應用程序的核心。在合同文件夾中,您將找到默認的“Lock.sol”文件。首先在“contracts”文件夾中找到“Lock.sol”文件,并將其重命名為“TodoList.sol”以與我們的合約名稱保持一致。

下面是“TodoList”合約,以及解釋每個代碼塊的作用的注釋:

// SPDX-License-Identifier: MIT

// Solidity Version
pragma solidity 0.8.19;

contract TodoList {
    // Struct to represent a task
    struct Task {
        uint id; // Unique task identifier
        uint date; // Timestamp of task creation
        string name; // Task name
        string description; // Task description
        bool isCompleted; // Flag indicating task completion status
        address owner; // Address of the task owner
    }

    // Array to store all tasks
    Task[] public tasks;

    // Mapping to associate user addresses with their task IDs
    mapping(address => uint[]) private userTasks;

    // Constructor function
    constructor() {}

    // Event emitted when a task is created
    event TaskCreated(
        uint id,
        uint date,
        string name,
        string description,
        bool isCompleted,
        address owner
    );

    // Event emitted when a task is marked as completed
    event TaskCompleted(uint id, address owner);

    // Event emitted when a task is deleted
    event TaskDeleted(uint id, address owner);

    // Function to create a new task
    function createTask(string memory name, string memory description) public {
        uint taskId = tasks.length; // Calculate the new task ID
        tasks.push(
            Task(taskId, block.timestamp, name, description, false, msg.sender)
        ); // Create and add the new task to the array
        userTasks[msg.sender].push(taskId); // Update the userTasks mapping
        emit TaskCreated(
            taskId,
            block.timestamp,
            name,
            description,
            false,
            msg.sender
        ); // Emit a TaskCreated event
    }

    // Function to retrieve task details by ID
    function getTask(
        uint id
    )
        public
        view
        returns (uint, uint, string memory, string memory, bool, address)
    {
        // Ensure the task ID is valid
        require(id < tasks.length, "Task ID does not exist"); 
        Task storage task = tasks[id]; // Retrieve the task from storage
        return (
            task.id,
            task.date,
            task.name,
            task.description,
            task.isCompleted,
            task.owner
        ); // Return task details
    }

    // Function to mark a task as completed
    function markTaskCompleted(uint id) public {
        // Ensure the task ID is valid
        require(id < tasks.length, "Task ID does not exist"); 
        Task storage task = tasks[id]; // Retrieve the task from storage
        require(
            task.owner == msg.sender,
            "Only the owner can complete the task"
        );
        // Ensure the task is not already completed
        require(!task.isCompleted, "Task is already completed"); 
        task.isCompleted = true; // Mark the task as completed
        emit TaskCompleted(id, msg.sender); // Emit a TaskCompleted event
    }

    // Function to delete a task
    function deleteTask(uint id) public {
        // Ensure the task ID is valid
        require(id < tasks.length, "Task ID does not exist"); 
        Task storage task = tasks[id]; // Retrieve the task from storage
        // Ensure only the owner can delete the task
        require(task.owner == msg.sender, "Only the owner can delete the task"); 
        emit TaskDeleted(id, msg.sender); // Emit a TaskDeleted event

        // Delete the task by replacing it with the last task in the array 
        // and reducing the array size
        uint lastIndex = tasks.length - 1;
        if (id != lastIndex) {
            Task storage lastTask = tasks[lastIndex];
            tasks[id] = lastTask;
            userTasks[msg.sender][id] = lastIndex;
        }
        tasks.pop();
        userTasks[msg.sender].pop();
    }

    // Function to retrieve all task IDs belonging to the caller
    function getUserTasks() public view returns (uint[] memory) {
        // Return the task IDs associated with the caller's address
        return userTasks[msg.sender]; 
    }
}

測試我們的合約

測試我們的合約對于保證其可靠性和功能性以及確保其按預期執行至關重要。在一個容易遭受黑客攻擊和漏洞利用的行業中,編寫測試非常有必要,以確保我們的合約不會容易受到漏洞利用。

用 Mocha 編寫我們的測試

我們將使用 Mocha 進行測試,所以讓我們設置我們的測試。在 test 文件夾中,將 Lock.js 文件重命名為 test.js 并將代碼替換為以下內容:

const { expect } = require("chai");
const { ethers } = require("hardhat");

describe("TodoList contract", function () {
  let TodoList;
  let todolist;
  let owner;

  before(async function () {
    [owner] = await ethers.getSigners();

    // Deploy the TodoList contract
    todolist = await ethers.deployContract("TodoList");
    // await TodoList.waitForDeployment();
  });

  it("should create a new task", async function () {
    const taskName = "Sample Task";
    const taskDescription = "This is a sample task description";

    // Create a new task
    await todolist.createTask(taskName, taskDescription);

    // Retrieve the task details
    const [id, date, name, description, isCompleted, taskOwner] =
      await todolist.getTask(0);

    expect(id).to.equal(0);
    expect(name).to.equal(taskName);
    expect(description).to.equal(taskDescription);
    expect(isCompleted).to.equal(false);
    expect(taskOwner).to.equal(owner.address);
  });

  it("should mark a task as completed", async function () {
    // Mark the task at index 0 as completed
    await todolist.markTaskCompleted(0);

    // Retrieve the task details
    const [, , , , isCompleted] = await todolist.getTask(0);

    expect(isCompleted).to.equal(true);
  });

  it("should delete a task", async function () {
    // Create a new task
    await todolist.createTask(
      "Task to be deleted",
      "This task will be deleted"
    );

    // Delete the task at index 1
    await todolist.deleteTask(1);

    // Attempt to retrieve the deleted task (should throw an error)
    let errorOccurred = false;
    try {
      await todolist.getTask(1);
    } catch (error) {
      errorOccurred = true;
    }

    expect(errorOccurred).to.equal(true);
  });

  it("should retrieve the user's tasks", async function () {
    // Create a new task
    await todolist.createTask("User's Task", "This is the user's task");

    // Retrieve the user's tasks
    const userTasks = await todolist.getUserTasks();

    // Expect that there is at least one task
    expect(userTasks.length).to.be.at.least(1);
  });
});

為了測試我們的合約,我們運行通用的:

npx hardhat test

響應應如下所示:

圖片圖片

部署我們的合約

現在,令人興奮的部分 - 將我們的智能合約部署到 Sepolia 網絡。我們將編寫一個部署腳本來實現這一點。

編寫我們的部署腳本

在腳本文件夾中,您將找到一個包含一些示例代碼的deploy.js 文件。將 JavaScript 代碼替換為以下內容:

// Import the ethers library from the Hardhat framework
const { ethers } = require("hardhat");

// Define an asynchronous main function for contract deployment
async function main() {
  // Deploy the contract
  const TodoList = await ethers.deployContract("TodoList");

  // Log message to show deployment in progress
  console.log("Deploying contract.....");

  // Wait for the deployment of the contract to complete
  await TodoList.waitForDeployment();

  // Log the deployment target (contract address) to the console
  console.log(`TodoList deployed to ${TodoList.target}`);
}

// Execute the main function, and handle any errors that may occur
main().catch((error) => {
  console.error(error);
  process.exitCode = 1;
});

要將我們的合約部署到 Sepolia 網絡,請使用以下命令:

npx hardhat run scripts/deploy.js --network sepolia

注意:如果您打算將智能合約部署到不同的網絡,您可以輕松替換 sepolia 為您選擇的網絡。

當我們部署到測試網時,這應該需要幾秒鐘的時間。您將收到合同部署的確認信息以及合同地址。

圖片圖片

img

現在您可以體驗去中心化待辦事項列表變為現實的興奮!繼續復制您的合約地址并驗證其在Sepolia Testnet Explorer[3]上的存在,就像您在以太坊主網上所做的那樣。超級有趣!

結論

您已成功構建第一個 dApp 并將其部署到以太坊區塊鏈。作為下一步,我強烈推薦以下資源:

Lumos Academy[4]:Lumos Labs 的 Lumos Academy 是一個專門為正在學習 Web3 開發的(有抱負的)Web3 開發人員提供的平臺

以太坊開發教程[5]:這個精選的社區教程列表涵蓋了廣泛的以太坊開發主題

希望您喜歡這篇文章!如果您有任何問題或意見,請隨時在下面留言或在Twitter 上與我聯系![6]

原文:https://tosynthegeek.hashnode.dev/building-a-decentralized-todo-list-application-on-ethereum

引用鏈接

[1] 指南。: https://docs.alchemy.com/docs/how-to-add-alchemy-rpc-endpoint-for-local-development#step-2-add-http-url-to-local-project

[2] 水龍頭: https://sepoliafaucet.com/

[3] Sepolia Testnet Explorer: https://sepolia.etherscan.io/

[4] Lumos Academy: https://academy.lumoslabs.co/

[5] 以太坊開發教程: https://ethereum.org/en/developers/tutorials/[6] Twitter 上與我聯系!: https://twitter.com/tosynthegeek

責任編輯:武曉燕 來源: 李留白
相關推薦

2023-07-14 12:07:19

2019-02-21 09:40:22

開源工具待辦事項

2022-03-10 14:14:12

比特幣以太坊去中心化

2021-05-07 09:06:55

GraphQLAPI 以太坊

2020-03-04 12:55:13

Emacs待辦事項應用

2021-04-26 15:10:41

比特幣DeFi金融

2024-03-27 11:18:02

2011-11-23 10:06:32

Azure微軟移動應用

2022-06-21 11:23:15

API鴻蒙JS開發

2019-12-19 14:17:11

以太坊去中心化加密貨幣

2023-11-06 09:06:05

2015-03-10 09:51:56

云開發云應用程構建PaaS

2015-10-14 10:43:17

PaaSSaaS應用構建

2011-03-14 14:47:50

2020-03-25 13:59:22

前端開發編程

2012-02-20 10:51:21

Clear待辦事項工具

2021-06-17 08:22:45

PythonDeFi編程語言

2011-10-12 11:24:44

AndroidPC

2010-11-09 10:37:21

2016-09-18 16:16:39

Linux云服務應用
點贊
收藏

51CTO技術棧公眾號

2023国产精品| 色天天色综合| 亚洲精品免费在线播放| 91亚洲精品在线| 四虎成人精品永久免费av| 日韩a级大片| 在线观看日韩一区| 特级黄色录像片| 日日躁夜夜躁白天躁晚上躁91| 国产一区二区你懂的| 国产一区二区成人| 在线观看精品国产视频| 国产精品对白刺激| 欧美日韩激情在线观看| 免费国产自久久久久三四区久久| 制服丝袜国产精品| 免费在线观看的av网站| 中文在线观看免费| 久久婷婷成人综合色| 91最新国产视频| 无码人妻黑人中文字幕| 亚洲午夜黄色| 精品精品国产国产自在线| av日韩中文字幕| 日韩三级一区二区| 国产精品mv在线观看| 亚洲午夜未满十八勿入免费观看全集| 中文国产在线观看| 国产 日韩 欧美一区| 亚洲一区二区在线播放相泽| 亚洲精品成人自拍| 亚洲 另类 春色 国产| 亚洲国内精品| 久久久精品999| 干b视频在线观看| 99re6热只有精品免费观看| 欧美中文一区二区三区| 中国日韩欧美久久久久久久久| 亚洲aⅴ日韩av电影在线观看 | 天天综合天天综合| 国产一区二区三区精品欧美日韩一区二区三区 | 欧美天堂一区二区三区| 欧美一区二区播放| 国产a视频免费观看| 国产第一页在线| 亚洲区一区二| 亚洲精品精选| 在线精品视频视频中文字幕| 精品国产人妻一区二区三区| 午夜日韩影院| 日韩一卡二卡三卡四卡| 中文字幕中文在线| 国产91精品在线| 色av成人天堂桃色av| 丰满人妻中伦妇伦精品app| 黄页网站大全在线免费观看| 亚洲精品日韩综合观看成人91| 亚洲在线视频一区二区| 69视频在线观看| 国产精品视频在线看| 日韩视频专区| eeuss影院www在线观看| 国产欧美日韩在线视频| 日韩欧美精品在线不卡 | 亚洲日韩中文字幕| 成年人网站免费在线观看| 亚洲专区视频| 亚洲一级免费视频| 三区四区在线观看| 久久在线视频| 久久99视频免费| 久久精品国产亚洲av高清色欲| 怡红院精品视频在线观看极品| 久久久欧美一区二区| 日韩精品一区二区三区国语自制| 日韩天堂av| 全球成人中文在线| 一区精品在线观看| 久久国产人妖系列| 91传媒在线免费观看| 成人无码一区二区三区| 99riav久久精品riav| 欧美在线一二三区| 欧美黑人激情| 亚洲成人免费视频| 免费裸体美女网站| 亚洲人成777| 亚洲精品一线二线三线无人区| 国产成人无码一区二区在线观看| 欧美精品系列| 欧美精品午夜视频| 亚洲国产成人精品激情在线| 日韩中文字幕区一区有砖一区 | 亚洲亚洲人成综合网络| 欧美亚洲一二三区| 欧洲亚洲精品久久久久| 欧美精品一区二区三区四区| 醉酒壮男gay强迫野外xx| 日韩成人激情| 韩国v欧美v日本v亚洲| 伊人久久久久久久久久久久| 国产一区视频导航| 久草精品电影| 国产黄a三级三级三级av在线看| 亚洲国产sm捆绑调教视频 | 国产在线看一区| 久久99精品久久久久久水蜜桃| 91精彩视频在线播放| 亚洲一区二区影院| 五月婷婷丁香色| 国产无遮挡裸体免费久久| 日韩在线视频播放| 成人免费看片载| 国产影视一区| 久久久久久久久久久91| 青娱乐在线免费视频| 高清视频一区二区| 亚洲午夜久久久影院伊人| 91超碰国产在线| 欧美精品自拍偷拍动漫精品| 色噜噜在线观看| 欧美a级片网站| 国产精品久久久| 亚洲 欧美 自拍偷拍| 亚洲精品视频观看| 亚洲国产高清av| 婷婷综合福利| 久久久久久成人| 国产精品免费无遮挡| 国产网红主播福利一区二区| 奇米影视亚洲色图| 精品视频在线观看免费观看| 在线亚洲国产精品网| 国产在线观看黄色| 成人晚上爱看视频| wwwjizzjizzcom| 亚洲欧美在线人成swag| 亚洲午夜久久久影院| 特级毛片www| 不卡av电影在线播放| 波多野结衣 作品| 国产精品99久久免费| 国产一区二区三区视频| 国产婷婷色一区二区在线观看 | 国产在线精品一区二区三区》| 91亚洲精选| 欧美日韩在线免费视频| 91中文字幕永久在线| 国产精品综合| 久久国产精品99久久久久久丝袜| av资源网在线播放| 亚洲黄在线观看| 欧美熟妇精品黑人巨大一二三区| 欧美精品福利| 不卡一区二区三区四区五区| 亚洲男同gay网站| 欧美一级淫片007| 欧美xxxx黑人xyx性爽| 国产精品一区二区91| 成人高清dvd| 北条麻妃一区二区三区在线观看 | 午夜伦理福利在线| 精品一区二区三区电影| 久久久成人免费视频| 26uuu亚洲| 三年中国国语在线播放免费| 精品欧美久久| 91精品久久久久久久久久| 日本中文字幕伦在线观看| 91精品婷婷国产综合久久| 青娱乐免费在线视频| 成人精品一区二区三区中文字幕| 国产中文字幕二区| 精品国产一区二区三区久久久蜜臀| 韩国视频理论视频久久| 精品无吗乱吗av国产爱色| 欧美日韩一级片在线观看| 在线观看美女av| 国产v综合v亚洲欧| www.玖玖玖| 成人在线视频免费观看| 91麻豆桃色免费看| 亚洲免费伊人电影| 中国丰满熟妇xxxx性| 欧美日韩一区二区三区不卡视频| 欧美在线激情网| 国产综合视频一区二区三区免费| 欧美日韩在线三区| 久久久一二三区| 久久综合色天天久久综合图片| www.xxx亚洲| 亚洲国产一区二区在线观看| 国产精品制服诱惑| 丝袜美腿一区| 久久精品视频在线观看| 亚洲国产精品二区| 在线观看91视频| 麻豆亚洲av熟女国产一区二| 久久久噜噜噜久久中文字幕色伊伊| www.超碰97.com| 日韩一区二区免费看| 天天综合色天天综合色hd| 欧美影院视频| 国产精品99久久99久久久二8| av毛片在线看| 国产一区二区三区欧美| 黄色av网站免费在线观看| 欧美在线观看一二区| 精品无码m3u8在线观看| 中文一区二区在线观看| 成熟妇人a片免费看网站| 秋霞电影网一区二区| 日韩伦理在线免费观看| 久久中文字幕av| 欧美日韩综合久久| 国偷自产av一区二区三区| 国产精品自在线| 少妇淫片在线影院| 欧美黄色片免费观看| 婷婷成人激情| 亚洲免费人成在线视频观看| 亚洲第九十九页| 欧美乱妇23p| 国产情侣呻吟对白高潮| 精品久久久久久亚洲精品| 全网免费在线播放视频入口| 日本一区二区动态图| 美女又爽又黄视频毛茸茸| 国产成人亚洲综合a∨婷婷图片| 天天视频天天爽| 老司机午夜精品视频| 国产精品成人久久电影| 欧美.www| 可以免费看的黄色网址| 久久激情电影| 亚洲国产精品123| 奇米亚洲欧美| 欧美aaaaa喷水| 开心激情综合| 国产伦精品一区二区三区照片 | 欧美日韩亚洲一区二| 久热精品在线观看| 亚洲黄一区二区三区| 麻豆天美蜜桃91| 1024亚洲合集| 无码人妻精品中文字幕| 国产精品久久夜| 情侣偷拍对白清晰饥渴难耐| 国产精品嫩草影院av蜜臀| 中文字幕第24页| 国产精品久久久久久久久免费相片| 国产传媒国产传媒| 国产欧美久久久精品影院| 国产熟女一区二区| 中文字幕va一区二区三区| 99在线视频免费| 好看不卡的中文字幕| 欧美aaa在线观看| 亚洲精品一区二区妖精| 在线观看免费黄色片| 亚洲一区二区三区| 成人国产在线看| 国产精品sm| 欧美视频在线观看网站| 国产亚洲网站| av免费网站观看| 开心九九激情九九欧美日韩精美视频电影 | 免费亚洲一区| 男人女人黄一级| 精品一区二区国语对白| 亚洲成人av免费观看| 国产91精品免费| 一女三黑人理论片在线| 国产午夜精品久久久久久久| 9.1片黄在线观看| 亚洲男女毛片无遮挡| 韩国av免费观看| 青青草免费av| av电影天堂一区二区在线| 国产中文字幕一区二区| 久久久综合视频| 手机免费观看av| 亚洲另类中文字| 一级免费在线观看| 在线看不卡av| 99久久免费国产精精品| 亚洲电影免费观看高清完整版在线 | 久久久久久久有限公司| 欧美日韩第一| 久久亚洲a v| 久久久天天操| 一本之道在线视频| 91丝袜美腿高跟国产极品老师| 成年人在线免费看片| 亚洲精品国久久99热| 日韩中文字幕在线观看视频| 91精品国产综合久久久久久| 性高潮久久久久久久久久| 色婷婷**av毛片一区| 成人黄色动漫| 国产中文日韩欧美| 天堂一区二区三区四区| 国产大尺度在线观看| 亚洲综合二区| 免费高清视频在线观看| 久久精品视频一区二区| 精品少妇久久久久久888优播| 欧美综合久久久| 日本黄色免费视频| 精品国产欧美一区二区三区成人 | 日韩欧美精品网站| 国产成年妇视频| 一本一本久久a久久精品综合小说 一本一本久久a久久精品牛牛影视 | 色yeye免费人成网站在线观看| 国产精品久久久久久久9999| 成人午夜大片| 欧美日韩视频免费在线观看| 久久久久.com| 亚洲av成人片无码| 亚洲人成网站精品片在线观看| 人人妻人人爽人人澡人人精品| 亚洲精品一线二线三线无人区| 国产原创精品视频| 国产精品视频久久久| 欧美**vk| 男人和女人啪啪网站| 风间由美性色一区二区三区| av最新在线观看| 欧美伊人精品成人久久综合97| 午夜福利一区二区三区| 欧美激情一级欧美精品| 中文成人在线| 中文字幕一区二区三区四区五区六区 | 午夜精品一区二区三区av| 欧美电影在线观看一区| 五月天av影院| 国内成人免费视频| 91av手机在线| 欧美日韩国产首页在线观看| 国产三级在线观看| 青草成人免费视频| 色爱综合av| 青青草原成人网| 91美女视频网站| 久久99精品波多结衣一区| 亚洲精品wwwww| 麻豆理论在线观看| 精品视频一区在线| 欧美一级专区| 91精彩刺激对白露脸偷拍| 欧美午夜久久久| 黄色片在线播放| 国产精品日韩在线| 日本一区二区在线看| mm131亚洲精品| 日韩一区有码在线| 精品国自产在线观看| 欧美激情欧美激情| 久久99精品国产自在现线| 欧美 丝袜 自拍 制服 另类 | 国产高清视频免费在线观看| 欧美日韩亚洲丝袜制服| 免费av不卡| 波多野结衣一区二区三区在线观看| 伊人久久成人| 97人妻精品一区二区免费| 欧美综合久久久| bt在线麻豆视频| 国产在线一区二| 久久久久久网| 成年人网站在线观看视频| 日韩一区二区中文字幕| free性护士videos欧美| 欧美男人的天堂| 久久国产综合精品| 日本亚洲色大成网站www久久| 精品亚洲男同gayvideo网站| 日韩高清中文字幕一区二区| 亚洲永久一区二区三区在线| 国产成人日日夜夜| 亚洲天堂av片| 久久精品亚洲一区| 精品资源在线| 色综合天天色综合| 亚洲一二三专区| 成人高清网站| 成人国产1314www色视频| 新67194成人永久网站| 小早川怜子一区二区的演员表| 日韩欧美在线影院| 韩国美女久久| 亚洲乱码中文字幕| 六月婷婷七月丁香| 欧美日韩精品三区| 国产美女情趣调教h一区二区| 麻豆精品传媒视频| 精品一区二区三区av| 国产成人一区二区三区影院在线| 在线精品91av| 卡通动漫国产精品|