国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

Go 每日一庫之 bubbletea

共 15596字,需瀏覽 32分鐘

 ·

2021-07-27 06:51

簡介

bubbletea是一個簡單、小巧、可以非常方便地用來編寫 TUI(terminal User Interface,控制臺界面程序)程序的框架。內(nèi)置簡單的事件處理機制,可以對外部事件做出響應(yīng),如鍵盤按鍵。一起來看下吧。先看看bubbletea能做出什么效果:

感謝kiyonlin推薦。

快速使用

本文代碼使用 Go Modules。

創(chuàng)建目錄并初始化:

$ mkdir bubbletea && cd bubbletea
$ go mod init github.com/darjun/go-daily-lib/bubbletea

安裝bubbletea庫:

$ go get -u github.com/charmbracelet/bubbletea

bubbletea程序都需要有一個實現(xiàn)bubbletea.Model接口的類型:

type Model interface {
  Init() Cmd
  Update(Msg) (Model, Cmd)
  View() string
}
  • Init()方法在程序啟動時會立刻調(diào)用,它會做一些初始化工作,并返回一個Cmd告訴bubbletea要執(zhí)行什么命令;
  • Update()方法用來響應(yīng)外部事件,返回一個修改后的模型,和想要bubbletea執(zhí)行的命令;
  • View()方法用于返回在控制臺上顯示的文本字符串。

下面我們來實現(xiàn)一個 Todo List。首先定義模型:

type model struct {
  todos    []string
  cursor   int
  selected map[int]struct{}
}
  • todos:所有待完成事項;
  • cursor:界面上光標(biāo)位置;
  • selected:已完成標(biāo)識。

不需要任何初始化工作,實現(xiàn)一個空的Init()方法,并返回nil

import (
  tea "github.com/charmbracelet/bubbletea"
)
func (m model) Init() tea.Cmd {
  return nil
}

我們需要響應(yīng)按鍵事件,實現(xiàn)Update()方法。按鍵事件發(fā)生時會以相應(yīng)的tea.Msg為參數(shù)調(diào)用Update()方法。通過對參數(shù)tea.Msg進行類型斷言,我們可以對不同的事件進行對應(yīng)的處理:

func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
  switch msg := msg.(type) {
  case tea.KeyMsg:
    switch msg.String() {
    case "ctrl+c""q":
      return m, tea.Quit

    case "up""k":
      if m.cursor > 0 {
        m.cursor--
      }

    case "down""j":
      if m.cursor < len(m.todos)-1 {
        m.cursor++
      }

    case "enter"" ":
      _, ok := m.selected[m.cursor]
      if ok {
        delete(m.selected, m.cursor)
      } else {
        m.selected[m.cursor] = struct{}{}
      }
    }
  }

  return m, nil
}

約定:

  • ctrl+cq:退出程序;
  • upk:向上移動光標(biāo);
  • downj:向下移動光標(biāo);
  • enter:切換光標(biāo)處事項的完成狀態(tài)。

處理ctrl+cq按鍵時,返回一個特殊的tea.Quit,通知bubbletea需要退出程序。

最后實現(xiàn)View()方法,這個方法返回的字符串就是最終顯示在控制臺上的文本。我們可以按照自己想要的形式,根據(jù)模型數(shù)據(jù)拼裝:

func (m model) View() string {
  s := "todo list:\n\n"

  for i, choice := range m.todos {
    cursor := " "
    if m.cursor == i {
      cursor = ">"
    }

    checked := " "
    if _, ok := m.selected[i]; ok {
      checked = "x"
    }

    s += fmt.Sprintf("%s [%s] %s\n", cursor, checked, choice)
  }

  s += "\nPress q to quit.\n"
  return s
}

光標(biāo)所在位置用>標(biāo)識,已完成的事項增加x標(biāo)識。

模型類型定義好了之后,需要創(chuàng)建一個該模型的對象;

var initModel = model{
  todos:    []string{"cleanning""wash clothes""write a blog"},
  selected: make(map[int]struct{}),
}

為了讓程序工作,我們還要創(chuàng)建一個bubbletea的應(yīng)用對象,通過bubbletea.NewProgram()完成,然后調(diào)用這個對象的Start()方法開始執(zhí)行:

func main() {
  cmd := tea.NewProgram(initModel)
  if err := cmd.Start(); err != nil {
    fmt.Println("start failed:", err)
    os.Exit(1)
  }
}

運行:

GitHub Trending

一個簡單的 Todo 應(yīng)用看起來好像沒什么意思。接下來,我們一起編寫一個拉取 GitHub Trending 倉庫并顯示在控制臺的程序。

Github Trending 的界面如下:

可以選擇語言(Spoken Language,本地語言)、語言(Language,編程語言)和時間范圍(Today,This week,This month)。由于 GitHub 沒有提供 trending 的官方 API,我們只能爬取網(wǎng)頁自己來分析。好在 Go 有一個強大的分析工具goquery,提供了堪比 jQuery 的強大功能。我之前也寫過一篇文章介紹它——Go 每日一庫之 goquery。

打開 Chrome 控制臺,點擊 Elements 頁簽,查看每個條目的結(jié)構(gòu):

基礎(chǔ)版本

定義模型:

type model struct {
  repos []*Repo
  err   error
}

其中repos字段表示拉取到的 Trending 倉庫列表,結(jié)構(gòu)體Repo如下,字段含義都有注釋,很清晰了:

type Repo struct {
  Name    string   // 倉庫名
  Author  string   // 作者名
  Link    string   // 鏈接
  Desc    string   // 描述
  Lang    string   // 語言
  Stars   int      // 星數(shù)
  Forks   int      // fork 數(shù)
  Add     int      // 周期內(nèi)新增
  BuiltBy []string // 貢獻值 avatar img 鏈接
}

err字段表示拉取失敗設(shè)置的錯誤值。為了讓程序啟動時,就去執(zhí)行網(wǎng)絡(luò)請求拉取 Trending 的列表,我們讓模型的Init()方法返回一個tea.Cmd類型的值:

func (m model) Init() tea.Cmd {
  return fetchTrending
}

func fetchTrending() tea.Msg {
  repos, err := getTrending("""daily")
  if err != nil {
    return errMsg{err}
  }

  return repos
}

tea.Cmd類型為:

// src/github.com/charmbracelet/bubbletea/tea.go
type Cmd func() Msg

tea.Cmd底層是一個函數(shù)類型,函數(shù)無參數(shù),并且返回一個tea.Msg對象。

fetchTrending()函數(shù)拉取 GitHub 的今日 Trending 列表,如果遇到錯誤,則返回error值。這里我們暫時忽略getTrending()函數(shù)的實現(xiàn),這個與我們要說的重點關(guān)系不大,感興趣的童鞋可以去我的 GitHub 倉庫查看詳細代碼。

程序啟動時如果需要做一些操作,通常就會在Init()方法中返回一個tea.Cmdtea后臺會執(zhí)行這個函數(shù),最終將返回的tea.Msg傳給模型的Update()方法。

func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
  switch msg := msg.(type) {
  case tea.KeyMsg:
    switch msg.String() {
    case "q""ctrl+c""esc":
      return m, tea.Quit
    default:
      return m, nil
    }

  case errMsg:
    m.err = msg
    return m, nil

  case []*Repo:
    m.repos = msg
    return m, nil

  default:
    return m, nil
  }
}

Update()方法也比較簡單,首先還是需要監(jiān)聽按鍵事件,我們約定按下 q 或 ctrl+c 或 esc 退出程序。具體按鍵對應(yīng)的字符串表示可以查看文檔或源碼bubbletea/key.go文件。接收到errMsg類型的消息,表示網(wǎng)絡(luò)請求失敗了,記錄錯誤值。接收到[]*Repo類型的消息,表示正確返回的 Trending 倉庫列表,記錄下來。在View()函數(shù)中,我們顯示正在拉取,拉取失敗和正確拉取等信息:

func (m model) View() string {
  var s string
  if m.err != nil {
    s = fmt.Sprintf("Fetch trending failed: %v", m.err)
  } else if len(m.repos) > 0 {
    for _, repo := range m.repos {
      s += repoText(repo)
    }
    s += "--------------------------------------"
  } else {
    s = " Fetching GitHub trending ..."
  }
  s += "\n\n"
  s += "Press q or ctrl + c or esc to exit..."
  return s + "\n"
}

邏輯很清晰,如果err字段不為nil表示失敗,否則有倉庫數(shù)據(jù),顯示倉庫信息。否則正在拉取中。最后顯示一條提示信息,告訴客戶怎么退出程序。

每個倉庫項的顯示邏輯如下,分為 3 列,基礎(chǔ)信息、描述和鏈接:

func repoText(repo *Repo) string {
  s := "--------------------------------------\n"
  s += fmt.Sprintf(`Repo:  %s | Language:  %s | Stars:  %d | Forks:  %d | Stars today:  %d
`
, repo.Name, repo.Lang, repo.Stars, repo.Forks, repo.Add)
  s += fmt.Sprintf("Desc:  %s\n", repo.Desc)
  s += fmt.Sprintf("Link:  %s\n", repo.Link)
  return s
}

運行(多文件運行不能用go run main.go):

獲取失?。▏鴥?nèi) GitHub 不穩(wěn)定,多試幾次總會遇到??):

獲取成功:

讓界面更美觀

黑白色我們已經(jīng)看了太多太多了,能不能讓字體呈現(xiàn)不同的顏色呢?當(dāng)然可以。bubbletea可以利用lipgloss庫給文本添加各種顏色,我們定義了 4 種顏色,顏色的 RBG 值是我在http://tool.chinaz.com/tools/pagecolor.aspx挑的:

var (
  cyan  = lipgloss.NewStyle().Foreground(lipgloss.Color("#00FFFF"))
  green = lipgloss.NewStyle().Foreground(lipgloss.Color("#32CD32"))
  gray  = lipgloss.NewStyle().Foreground(lipgloss.Color("#696969"))
  gold  = lipgloss.NewStyle().Foreground(lipgloss.Color("#B8860B"))
)

想要將文本變?yōu)槭裁搭伾恍枰{(diào)用對應(yīng)顏色對象的Render()方法將文本傳入即可。例如我們想讓提示變?yōu)榘祷疑?,中間文字使用暗黃色,修改View()方法:

func (m model) View() string {
  var s string
  if m.err != nil {
    s = gold.Render(fmt.Sprintf("fetch trending failed: %v", m.err))
  } else if len(m.repos) > 0 {
    for _, repo := range m.repos {
      s += repoText(repo)
    }
    s += cyan.Render("--------------------------------------")
  } else {
    s = gold.Render(" Fetching GitHub trending ...")
  }
  s += "\n\n"
  s += gray.Render("Press q or ctrl + c or esc to exit...")
  return s + "\n"
}

然后倉庫的基本信息我們用青色(cyan),描述用綠色,鏈接用暗灰色:

func repoText(repo *Repo) string {
  s := cyan.Render("--------------------------------------") + "\n"
  s += fmt.Sprintf(`Repo:  %s | Language:  %s | Stars:  %s | Forks:  %s | Stars today:  %s
`
, cyan.Render(repo.Name), cyan.Render(repo.Lang), cyan.Render(strconv.Itoa(repo.Stars)),
    cyan.Render(strconv.Itoa(repo.Forks)), cyan.Render(strconv.Itoa(repo.Add)))
  s += fmt.Sprintf("Desc:  %s\n", green.Render(repo.Desc))
  s += fmt.Sprintf("Link:  %s\n", gray.Render(repo.Link))
  return s
}

再次運行:

成功:

嗯,現(xiàn)在好看多了。

我沒有偷懶

有時候網(wǎng)絡(luò)很慢,加上一個請求正在處理的提示能讓我們更放心(程序還在跑,沒偷懶)。bubbletea的兄弟倉庫bubbles提供了一個叫做spinner的組件,它只是顯示一些字符,一直在變化,給我們造成一種任務(wù)正在處理中的感覺。spinnergithub.com/charmbracelet/bubbles/spinner包中,需要先引入。然后在模型中增加spinner.Model字段:

type model struct {
  repos   []*Repo
  err     error
  spinner spinner.Model
}

創(chuàng)建模型時,同時需要初始化spinner.Model對象,我們指定spinner的文本顏色為紫色:

var purple = lipgloss.NewStyle().Foreground(lipgloss.Color("#800080"))

func newModel() model {
  sp := spinner.NewModel()
  sp.Style = purple

  return model{
    spinner: sp,
  }
}

spinner通過Tick來觸發(fā)其改變狀態(tài),所以需要在Init()方法中返回觸發(fā)TickCmd。但是又需要返回fetchTrending。bubbletea提供了Batch可以將兩個Cmd合并在一起返回:

func (m model) Init() tea.Cmd {
  return tea.Batch(
    spinner.Tick,
    fetchTrending,
  )
}

然后Update()方法中我們需要更新spinner。Init()方法返回的spinner.Tick會產(chǎn)生spinner.TickMsg,我們對其做處理:

case spinner.TickMsg:
  var cmd tea.Cmd
  m.spinner, cmd = m.spinner.Update(msg)
  return m, cmd

spinner.Update(msg)返回一個tea.Cmd對象驅(qū)動下一次Tick。

最后在View()方法中,我們將spinner顯示出來。調(diào)用其View()方法返回當(dāng)前狀態(tài)的字符串,拼在我們想要顯示的位置:

func (m model) View() string {
  var s string
  if m.err != nil {
    s = gold.Render(fmt.Sprintf("fetch trending failed: %v", m.err))
  } else if len(m.repos) > 0 {
    for _, repo := range m.repos {
      s += repoText(repo)
    }
    s += cyan.Render("--------------------------------------")
  } else {
    // 這里
    s = m.spinner.View() + gold.Render(" Fetching GitHub trending ...")
  }
  s += "\n\n"
  s += gray.Render("Press q or ctrl + c or esc to exit...")
  return s + "\n"
}

運行:

分頁

由于一次返回了很多 GitHub 倉庫,我們想對其進行分頁顯示,每頁顯示 5 條,可以按pageuppagedown翻頁。首先在模型中增加兩個字段,當(dāng)前頁和總頁數(shù):

const (
  CountPerPage = 5
)

type model struct {
  // ...
  curPage   int
  totalPage int
}

拉取到倉庫時,計算總頁數(shù):

case []*Repo:
  m.repos = msg
  m.totalPage = (len(msg) + CountPerPage - 1) / CountPerPage
  return m, nil

另外需要監(jiān)聽翻頁按鍵:

case "pgdown":
  if m.curPage < m.totalPage-1 {
    m.curPage++
  }
  return m, nil
case "pgup":
  if m.curPage > 0 {
    m.curPage--
  }
  return m, nil

View()方法中,我們根據(jù)當(dāng)前頁計算需要顯示哪些倉庫:

start, end := m.curPage*CountPerPage, (m.curPage+1)*CountPerPage
if end > len(m.repos) {
  end = len(m.repos)
}

for _, repo := range m.repos[start:end] {
  s += repoText(repo)
}
s += cyan.Render("--------------------------------------")

最后,如果總頁數(shù)大于 1,給出翻頁按鍵的提示:

if m.totalPage > 1 {
  s += gray.Render("Pagedown to next page, pageup to prev page.")
  s += "\n"
}

運行:

很棒,我們只顯示了 5 頁。試試翻頁吧:

總結(jié)

bubbletea提供了一個 TUI 程序運行的基本框架。我們要顯示什么,顯示的樣式,要對哪些事件進行處理都由我們自己指定。bubbletea倉庫的examples文件夾中有多個示例程序,對編寫 TUI 程序感興趣的童鞋千萬不能錯過。另外它的兄弟倉庫bubbles中也提供了不少組件。

大家如果發(fā)現(xiàn)好玩、好用的 Go 語言庫,歡迎到 Go 每日一庫 GitHub 上提交 issue??

參考

  1. bubbletea GitHub:https://github.com/charmbracelet/bubbletea
  2. bubble GitHub:https://github.com/charmbracelet/bubbles
  3. Go 每日一庫 GitHub:https://github.com/darjun/go-daily-lib
  4. issue:https://github.com/darjun/go-daily-lib/issues/22


推薦閱讀


福利

我為大家整理了一份從入門到進階的Go學(xué)習(xí)資料禮包,包含學(xué)習(xí)建議:入門看什么,進階看什么。關(guān)注公眾號 「polarisxu」,回復(fù) ebook 獲取;還可以回復(fù)「進群」,和數(shù)萬 Gopher 交流學(xué)習(xí)。

瀏覽 52
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報
評論
圖片
表情
推薦
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 欧美性爱视频在线观看| 亚洲午夜无码精品专区| 樱桃码一区二区三区| 日韩毛片网站| 三级成人无码| 亚洲av免费在线| 人人草人人摸人人看| 日韩激情av| 日本熟妇无码一区二区| 18性XXXXX性猛交| 伊人综合成人网| 国产成人片色情AAAA片| 欧洲尤物不卡播放六区| 青青草原在线视频| 色婷婷视频在线观看| 91传媒在线观看| 嫩草亚洲小泬久久夂| 小黄片免费| www.6969成人片亚洲| 老妇槡BBBB槡BBBB槡| 只有精品| 狠狠干网站| 亚洲国产欧美日韩在线| 亚洲激色| 国产91探花精品一区二区| 少妇人妻一区二区三区| 久久久WWW成人免费无遮挡大片| 综合激情av| 翔田千里在线一区二区三区| 国产精品一品二区三区的使用体验 | 免费中文资源在线观看| 日日夜夜老司机| 一级黄色毛片| 91精品在线播放| 亚洲日本中文字幕| 在线一区二区三区| 中文字幕在线看| AA片在线观看视频在线播放| 香蕉成人网| 国产成人一区二区| 国产午夜视频| 人人妻人人澡| 亚洲视频在线免费观看| 性爱一区| 国产日本欧美韩国久久久久| 天天干天天干| 特黄特黄免费看| 东京热久久综合色五月老师| 天天射天天干| 亚洲成人精品少妇| 色色网欧美| 长泽梓黑人初解禁BDD07| 老师机性爱视频在线播放| 无码三级在线免费观看| 91性爱嫩逼视频| 最新精品视频| 免费看欧美成人A片| 国产欧美视频在线| 亚洲色视频在线| 日韩欧美国产成人| 在线播放毛片| 另类老妇奶性生BBwBBw偷拍| 婷婷网五月天| 日本在线网站| 国产精品无码免费| 三级网址在线| 一级A色情大片| 无码AV免费观看| 水果派中文解说AⅤ| 久久久成人片| 午夜成人视频在线观看| 天天骑夜夜操| 无码精品人妻一区二区三区漫画| 亚洲中文字幕免费观看| 九色91视频| 91久色| 国产又爽又黄免费网站在| 色哥网在线一区| 成人三级片在线观看| av久操| 一区二区三区免费| 在线观看av网站中文字幕| 欧洲黑人成人A版免费视频| 色婷婷激情五月天| 国产精品久久久91| 中文字幕亚洲视频| 操逼欧美| 99国产精品| 欧美亚洲天堂| 亚洲天堂在线播放| aa人人操夜夜操人人| 白浆av| 中文字幕AV在线观看| 亚洲久久视频| 久久一区二区三区四区| 强波多野结衣黑人| 亚洲AAA电影| 四虎午夜福利| 亚洲免费观看高清完| 欧美熟妇搡BBBB搡BBBBB| 黄色免费一级片| 超碰免费人妻| 天天日天天射天天操| 黄色网在线| 精品福利在线| 浪潮在线观看完整版| 久久午夜福利视频| 黄片WWW| 玖玖色视频| 羞羞午夜| 欧美成人A片AAA片在线播放| 91视频在线观看免费大全| 韩国无码视频在线观看| 日韩成人黄色视频| 激情五月天亚洲| 国产激情无码免费| 欧美精品性爱视频| 久久久久久亚洲AV黄床| 亚洲天堂无码av| 日本中文字幕网| 强伦轩一区二区三区在线观看| 亚州无码免费| 京熱大亂交无碼大亂交| 亚洲欧美日韩电影| 成人在线精品| 大香伊人| 麻豆av人人乐| 久久人人网| 大逼影院| 免费人成在线观看视频播放| 日本一区二区视频在线| 免费黄色一级电影| 黄色AV免费在线观看| 天堂在线中文字幕| 无码AV在线播放| 大香蕉伊人在线视频| 日韩中文性受视频| 69av视频在线观看| 国产欧美综合三级伦| 日韩视频91| 九九热视频在线观看| 神马影院午夜福利| 国产精品无码AV| 美女一区| 日韩精品在线视频| 欧美久久一区二区三区四区视频 | 欧美福利导航| 88av在线| 天天射天天干| 一区无码视频| 亚洲一二三四区| 色欲大香蕉| 狠狠色色| 91狠狠色丁香婷婷综合久久| www.高清无码| 天天干天天日天天操| 手机看片福利一区二区| 国产搡BBB爽爽爽视频| 成年人免费看视频| 欧美激情一级| 久久久精品午夜人成欧洲亚洲韩国| 学生妹一级片| 东京热这里只有精品| 日韩欧美亚洲| 亚洲日本一区二区三区| 欧美国产精品一区二区三区| 欧美浮力影院| 中文字幕精品亚洲熟女| 中文字幕亚洲有码| 欧美成人精品a| 影音先锋av网| 亚洲AV无码成人精品区在线欢看| 超碰天天操| 午夜一区| 色色99| 成人性爱自拍| 三级成人视频| 婷婷久久网| 一级A爱爱| 中文字幕在线看| 国产一级电影网站| 97人人爽人人爽人人爽人人爽 | 国产欧美岛国| 99福利视频| 91蝌蚪| 黄色无無| 高清毛片AAAAAAAAA郊外 | 一级二级三级毛片| 中文字幕福利视频| 狠狠狠狠操| 2015中文字幕黄色视频| 日韩欧美中文字幕在线观看| 成人在线免费观看视频| 国内一级黄片| 国产精品国产精品国产专区不52 | 韩国三级HD中文字幕的背景音乐 | 亚洲va综合va国产va中文| 欧美激情一区二区A片成人牛牛| 青青草大香蕉伊人| 91精品大屁股白浆自慰久久久| 亚洲高清无码中文字幕| 欧美视频在线观看| 日本精品在线观看视频| 日韩免费不卡| 亚洲AV无码免费| 蜜桃一区二区视频在线观看| 人人人妻人人人操| 99精品国自产在线| 国产精品色8| 三级片无码| 3D动漫精品啪啪一区二区| 精品日韩AV| 久久99网站| 在线操逼| 午夜精品久久久久久不卡8050| 亚洲熟妇在线观看| 波多野42部无码喷潮更新时间| 国产欧美在线综合| 福利视频网亚洲| 黄片免费大全| 大鸡吧大香蕉| a片一级片| 肏屄视频在线| 久久91久久久久麻豆精品| 成人国产无码| 天天插天天日| 欧美黄色一级视频| 欧美激情四射老司机| 中文字幕在线观看网| 日韩中文字幕无码中字字幕| 久视频在线| 麻豆一区视频| 国产精品无码免费| 日老女人逼| 日本久久久久久久久视频在线观看| 成人AV一AV二| 西西444WWW无码精品| 亚洲A√| 久久久www成人免费毛片| 黄色a级毛片| 激情小说激情视频| 亚洲精品一区二区三区蜜桃| 中文字幕一级片| 亚洲码无| 不卡在线视频| 日韩欧美黄色片| 免费看黄色的视频| 天堂中文在线视频| JIZZJIZZ国产精品喷水| 免费成人视频| 99综合网| 手机看片福利视频| 无码成人精品| 成人网视频| 亚洲精品乱码在线| 玖玖资源站中文字幕| 91成人亚洲| 亚洲综合成人在线| 99久久99久久久精品棕色圆| 一区二区不卡视频| 午夜资源站| ww久久| 操逼精品| 中文字幕一级A片高清免| 欧美亚洲中文字幕| 午夜亚洲国产一区视频网站| 美女A级毛片| 大香伊人中文字幕精品| 丁香六月操| 久久香蕉网站| 学生妹一级J人片内射视频| 操逼网站在线| 中国老女人性爱视频| 狠狠色婷婷7777| 91插插网| 最新色站| 韩国高清无码60.70.80| 53岁露大奶熟女偷情贴吧| 91精品国产偷窥一区二区| 西西人体大胆ww4444| 亚洲天媒在线播放| 成人视频A片| 国产免费一区| 五月天av在线观看| 高清无码免费观看视频| 免费看黄片,在线观看| 欧美不卡视频| 香蕉中文在线| 影音先锋在线视频| 女人特级毛片18| 国产亲子乱婬一级A片借种| 亚洲精品无码电影| 韩日不卡视频| 久草不卡| 亚洲视频一区二区| 无码人妻丰满熟妇精品区| 中文字幕日韩亚洲| 国产又爽又黄免费网站校园里 | 国产小精品| 亚洲无码一二三区| 在线观看国产免费视频| 96精品久久久久久久久久| 哪里能看毛片| www.zaixianshipin| 久久夜夜操| 免费一级电影| 91免费观看网站| www.A片| 日韩AV无码免费| 一级片学生妹| 蜜臀av在线| 狠狠热视频| 国产女人18毛片18精品| 人人摸人人操人人爱| 爆操人妻| 91蝌蚪视频在线| 久久久91精品国产一区苍井空| 大草AV| 久操av在线| 爽好紧别夹喷水欧美| 影音先锋无码专区| 91视频一区二区三区| 中文字幕性爱电影| 精品人妻一区二区免费蜜桃视频| 日韩成人无码影片| 亚洲你懂的| 国产青娱乐在线视频| caopeng97| 免费在线观看中文字幕| 97国产高清| 人妻少妇av中文字幕乱码牛牛| 91黄色视频在线播放| 夜夜嗨老熟女AV一区二区三区 | HEZ-502搭讪绝品人妻系列 | 激情综合网五月| 伊人大香蕉网| 黄色视频免费在线观看网站| 插进去综合网| 晚上碰视频| 欧美三区| 亚洲第一成人网址| 天天看天天操| 免费自拍视频| 天天操天天干天天日| 久久久69| 欧美一区二区无码视频| 中文字幕视频免费| 国产色情性黄片Av网站| 国产精品久久毛片| 国产三级网站| 亚洲午夜久久久久久久久| 五月天婷婷影院| 91嫩操| 特级丰满少妇一级AAAA爱毛片| 摸BBB搡BBB搡BBBB| 日韩无码毛片| 黄在线| A∨无码免费| 六月丁香婷| 色婷婷黄色| 99在线国产| 91av天堂| 日本成人久久| 中字幕视频在线永久在线观看免费| 激情小视频| 97超碰网| 中文在线字幕电视剧免费平台| 色婷婷综合视频| 成人做爰黄A片免费看陈冠| 免费黄色a片| 亚州成熟少妇视频在线观看| 中文字幕成人网站| 综合婷婷| 三级片无码麻豆视频| 日本乱伦电影中文字幕| 黄色av免费观看| 97中文在线| 四川少扫搡BBBBB搡B| 人妻日日| 黄色A级毛片| 国产精品美女在线观看| 久久一级片| 亚洲色射| 最新久欠一区二区免费看| 国产麻豆三级片| 伊人久久大香蕉视频| 日韩欧美操逼| 色婷久久| 亚洲成人自拍| 亚洲乱伦电影| 精品人妻一区二区乱码一区二区 | 免费国产乱伦| 91九色蝌蚪| 国产av网站大全| 黄色电影免费网站| 黄色一及片| 黄色av网| 91久久99久久91熟女精品| 中文字幕五码| 人人妻人人澡人人爽久久con| 国产3区| 伊人久久大香线蕉| 神马午夜久久| 这里只有精品视频在线| 国产成人性| 久草视频首页| 婷婷五月天成人社区| 欧美狠狠操| 中文无码观看| 色婷婷黄色| 欧美性受| 久久一级A片| wwwA片| 欧美搡BBBB搡BBB| 91在线看18| 午夜综合| 黄片视频在线播放| 2014亚洲天堂| 日韩爱爱网| 91国内产香蕉| 大香蕉欧美| 一级国产欧美成人A片| 日本成人不卡| 一级免费视频| 黄色高清无码视频| 加勒比无码综合| 91丨九色丨东北熟女| 操操片| 久久日av| 亚洲成人日韩| 99re在线观看观看这里只有精品| 日韩人妻精品无码久久边| 国产亲子乱XXXXinin| 欧美69成人| 国产色婷婷| 99人妻| 五月天久久综合| 久色视频| 国产精品成人在线| 亚洲精品在线观看免费| 69AV在线| 天天操夜操| 嫩BBB搡BBB搡BBB四川| 狠狠久久| 久久99久久99精品免视看婷婷| 人妻无码中文字幕蜜桃| 成年人在线观看视频| 久久久久久高清毛片一级| 猛男大粗猛爽h男人味| 精品九九九| 国精产品一品二品国精| a色视频| 日本成人黄色视频| 亚洲社区在线观看| 国产精品系列视频| 日韩激情在线| 天堂俺去俺来也www久久婷婷| 91操操操| 中国熟妇| www.一区| 国产一区二区视频在线| 一级艹逼| 黄片网站免费看| 蜜桃传媒av| 国产性受XXXXXYX性爽| 99久久久成人国产精品| 国产精品久久久精品cos| 日韩1234区| 国产高清秘成人久久| 亚洲精品一区二区三| 一区二区在线免费观看| 91蝌蚪视频在线| 国产精品9| 色婷婷一区二区三区久久午夜| 久久久久一区二区三区| 强伦轩人妻一区二区三区最新版本更新内容| 91禁樱桃在线| 狠狠躁日日躁夜夜躁A片男男视频 精品无码一区二区三区蜜桃李宗瑞 | 亚洲成人综合网站| 欧美日韩人妻高清中文| 中文字幕在线免费观看| 在线观看视频91| 粉嫩99精品99久久久久| 人妻体体内射精一区二区| 嫩草视频在线观看| 91调教视频| 国产AV无码专区| 国产精品无码一区二区三| 超碰在线观看97| 苍井空一区二区三区| 操熟女视频| 午夜黄色影视| 色情五月| 91网站免费看| 高清无码不卡在线观看| av影音先锋| 欧美三级在线播放| 北条麻妃网站| NP玩烂了公用爽灌满视频播放| 西西888WWW大胆视频| 91内射| 正在播放国产精品| 最新中文字幕在线观看视频| www.操逼网| 蜜桃av秘一区二区三区| 少妇特黄A一区二区三区| 天天射天天射| 国产aaaaaaaaaa| 中文字幕天堂网| 日韩天堂| 婷婷午夜精品久久久久久性色AV | 人人操干| 国产熟妇| HEZ-502搭讪绝品人妻系列| 无码区一区二区| 人妻久操| 国产精品18进进出出17c| 九九成人网站| 中文字幕在线网址| 精品无码一区二区三区蜜桃李宗瑞 | 婷婷丁香综合| 亚洲免费观看高清完整版在va线观看 | 在线无码免费| 日韩毛片网| 欧美日韩成人在线观看| 狼色AV| 波多野结衣无码NET,AV| 东京热免费视频| www.污| 69久久久| 日本久久综合网| 久久久久久亚洲AV黄床| 99视频精品视频| 99香蕉视频| 天天插天天射| 天堂资源中文在线| 熟女少妇一区二区| 欧美一级日韩三级| 亚洲人气无码AV| 超碰日韩| 水密桃网站| 玖玖资源网站| 蜜桃传媒一区二区亚洲A| 超碰91人人操| 久草新| 亚洲av影院| 国产精品网站在线观看| 艳妇乳肉豪妇荡乳AV无码福利| 青青草逼视频| 91亚洲精华国产精华精华液| 亚洲无吗在线视频| 欧美精产国品一二三产品动漫| H片在线免费观看| 一级国产欧美成人A片| 大香蕉在8线| 国产精品久免费的黄网站| 亚洲视频欧洲视频| 综合色国产精品欧美在线| 成人欧美一区二区三区黑人免费 | 中文字幕在线有码| 久久99人妻无码精品一区| 国产乱伦毛片| 人妻少妇综合| 艹逼中文字幕| 无码伦理电影| 大香蕉婷婷| 亚洲一级黄| 国产三级电影在线观看| 91久久久久国产一区二区| AV天堂电影网| 特级西西西88大胆无码| www.色中色| 中文日韩| 日韩无码人妻一区二区三区| 东京热视频在线观看| 免费日逼视频| 操逼视频在线看| 九九激情| 黄色成人网址| 肏逼综合网| 美女高潮在线| 亚洲国产免费视频| 爱视频福利网| 日本AI高清无码在线观看网址| 538在线视频| 一起操在线| 狠狠撸狠狠操| 中文字幕永久在线观看| 不卡的一区二区| 中文字幕内射| 在线国产激情| 走光无码一区二区三区| 亚洲AV片一区二区三区| 男人的天堂av网站| 欧美成人一区免费视频| 少妇在线观看| 久久久在线| 久久爆乳一区二区三区| 成人午夜无码福利视频| av资源站| 毛片在线观看视频| AV小说在线观看| 亚洲人成人无码一区二区三区| 在线视频一区二区| 香蕉视频啪啪啪| 狼友免费视频| AAA一区二区三区| 黑人中文字幕| 高清无码不卡AV| 三级AV在线免费观看| 亚洲成人精品| 91综合在线| 国产成人一区二区| 女人毛片| 久草综合视频| a免费视频| 美女综合网| 播五月婷婷| 一本一道AV| 91热在线| 成人网站毛片| 亚洲电影无码| 黄色在线视频网站| 国产又爽又黄免费网站在线| 久久另类TS人妖一区二区| 天天夜夜操| 自拍偷拍| 97国产在线观看| 四虎日韩| 西西人体视频| 亚洲免费黄| 天天舔天天干| 99爱免费视频| 91搞| 午夜视频免费| 国产草莓视频| 天天成人| 亚洲成人777| 夜夜骚av.一区二区三区四区| 欧美日韩国产成人综合| 伊人成人免费视频| 日韩在线二区| 色色网站在线观看| 一区二区三区无码精品| 久久精品人人| 懂色av蜜臀av粉嫩av分 | 欧美伊人大香蕉| 国内精品久久久久久久| 免费AV毛片| 超碰久操| 日韩中文一区| 日本二区三区| 91精品大屁股白浆自慰久久久| 欧美成人手机在线| 国产免费一区| 蜜桃av在线播放| av日韩无码| 操逼视频免费在线观看| 97人妻人人澡人人爽人人精品 | 午夜高清无码| 永久黄网站| 99婷婷| 91人妻成人精品一区二区| 精品无码一区二区三区爱与| 国产黄片视频| 91在线免费视频| 丝袜美女足交| 国产又大又粗又爽| 伊人综合久久| 日韩v欧美v日本v亚洲v国产v| 国产搡BBB爽爽爽视频| 欧美日韩V| 在线观看免费a片| 成人精品一区日本无码网站suv/ | 亚洲国产精品久久久久婷婷老年| av三级片在线播放| 毛片入口| 天堂成人av| 三级片AV在线| 亚洲热视频在线观看| 欧美草逼网| 日本一级婬片免费放| 无码成人精品| www尤物| 99黄色| 人人澡人人爱| 亚洲无码网| 中文字幕在线观看av| 爱搞视频在线观看| 成人国产精品秘在线看| 国产精品怡红院有限公司| 成人电影三区| 亚洲日韩AV电影| 波多野吉衣中文字幕| 亚洲中文偷拍| 天天中文字幕| 日韩欧美精品18| 国产精品va| 日韩中文字幕久久| www.sese| 麻豆成人91精品二区三区| 成人大战香蕉最新视频| 国产精品视频在线看| 国产美女做爱| 麻豆999| 日韩一级性爱视频| 色欲网址| 69久久久| 欧美日韩网站| 五月婷婷av| 中文字幕无码在线| 日韩精品一区二区三区四在线播放| 亚洲成人在线视频观看| 免费aaa| 玖玖爱这里只有精品| 成人无码国产| 亚洲欧美网站| 一曲二曲三曲在线观看中文字| 久久美女视频| 午夜免费福利| 91双飞会所双飞在线| 免费无码婬片A片AA片| 亚洲AV无码成人精品区h麻豆| 苍井空无码在线观看| 免费一级大片| 婷婷精品在线| 亚洲精品免费观看| 黄片免费大全| 青吴乐大香蕉| 精品国产一级A片黄毛网站 | 婷婷五月综合激情| 欧美生活片18| 亚洲欧美成人在线观看| 内射一区| 少妇搡BBBB搡BBB搡澳门| 大香蕉啪啪啪| 亚洲国产视频在线观看| www日韩欧美| 91网站在线播放| 欧美成人黄色小说| 亚洲AV激情无码专区在线播放| 国产亚洲久一区二区^_^| 就去se超碰| 男女啪啪啪| 中国美女一级黄片| 天天爽夜夜| 国产精品主播| 欧美大香蕉在线| 国产精品久久久久久久久久| 91av电影网| 国产精品女人777777| 亚洲午夜电影| 色超碰| 五月天最新网址| 男人色天堂| 在线观看一区二区视频| 日本豆花视频| 东京热无码一区| 青青自拍视频| 亚洲无码高清在线观看| 九九视屏| 成人H视频| 丁香激情五月少妇| 91网站免费在线观看| 国产艹逼| 97人妻精品黄网站| 午夜无码久久| 操逼视频网站免费观看| 国模一区二区| 国产AV无码成人精品毛片| 国内操B电影| 二区三区无码| 竹菊传媒一区二区三区| 久操视频在线观看免费| 国产在线a| 中文字幕亚洲精品| 肉色超薄丝袜脚交一区二区| 午夜8050| 亚洲一区二区在线视频| www亚洲无码A片贴吧| 亚洲婷婷三级成人网| 手机在线一区| 最近最经典中文MV字幕| 强开小嫩苞一区二区电影| 99色视频| 九九视屏| 在线观看操逼| 午夜福利成人网站| 欧美性猛交XXXX乱大交3| 日韩一级片| 亚洲欧美日本在线| 亚洲三级片无码| 麻豆国产精品一区| 无码少妇| 一道本激情视频| 国产乱伦毛片| 另类小说五月天| 欧美日韩三级| 黄色视频免费在线看| 国产精品秘ThePorn| 久操人妻| 国产精品无码一区二区三区免费| 亚洲成人福利电影| 欧美亚洲成人在线观看| 精品在线第一页| 69精品视频| 巨乳一区二区三区| 亚洲青青| 欧美一区二区三曲的| 无码高清在线观看| 国产一级乱伦| 超碰成人AV| 91在线播放视频| 国精品无码人妻一区二区三区免费| 人人摸人人看人人| 国产三级片在线观看视频| 免费A视频| 午夜免费播放观看在线视频| 翔田千里一区二区三区精品播放| 三级片网站在线播放| 欧美、日韩、中文、制服、人妻 | 熟女少妇视频| 良妇露脸15P| 麻豆传媒猫爪| 亚洲色图88| A片视频免费观看| 国产综合久久| 国产91页| 亚洲国产无码在线观看| 国产精品成人午夜福利| 小H片在线观看| 人妻黑人一区二区三区| 色老板亚洲| 亚洲激情在线| 强奸五月天| 成人黄色AV| A无码| 久久色在线视频| 国产精品秘久久久久久一两个一起| 免费看黃色AAAAAA片| 精品无码久久久久久久久app| 日韩一区二区三区免费视频| 国产一级a毛一级a做免费图片 | 日韩视频免费在线| 欧美人妻日韩精品| A片一级片| 3D精品啪啪一区二区免费| 人人超碰人人| 亚洲AV高清无码| 久久水密桃| 亚洲青青| 亚洲欧美另类在线| 韩国午夜福利视频| 国产青草视频| 日韩在线不卡视频| 综合五月婷婷| 无码成人在线| 高清视频一区二区| 日本三级AAA三级AAAA97| 学生妹内射| 亚洲天堂2015| 亚洲无码1| 黄色一级片免费观看| 天堂中文字幕在线| 婷婷成人五月天| 12—13女人毛片毛片| 中文字幕欧美在线| 国产免看一级a一片成人aⅴ| 亚洲片在线观看| 啪啪免费网站| 97精品人人A片免费看| 日韩无码字幕| 欧美一级在线| 亚洲色a| a4yy午夜福利| 欧美日韩中国操逼打炮| 日韩少妇无码| 91免费视频观看| 91成人毛片| 日本做爱视频| 人人干人人爽| 影音先锋91视频| 一级一A片一a免费看| 亚欧无码| 丁香综合网| 亚洲无码视频一区| 尤物综合网| 日韩中文字幕在线免费观看| 国产精品久久久久永久免费看| 国产—级a毛—a毛免费视频| 密臀AV在线| 亚洲欧洲在线观看| 国产成人视频免费在线观看| 操逼操逼操逼操逼| 91人兽| 视频一区二区三| 影音先锋久久| 国产又粗又大又长| 日韩黄色小视频| 青青草99热|