午夜视频免费看_日韩三级电影网站_国产精品久久一级_亚洲一级在线播放_人妻体内射精一区二区三区_91夜夜揉人人捏人人添红杏_91福利在线导航_国产又粗又猛又黄又爽无遮挡_欧美日韩一区在线播放_中文字幕一区二区三区四区不卡 _日日夜夜精品视频免费观看_欧美韩日一区二区三区

主頁 > 知識庫 > golang使用json格式實現增刪查改的實現示例

golang使用json格式實現增刪查改的實現示例

熱門標簽:廣東語音外呼系統供應商 澳門防封電銷卡 地圖標注測試 長沙ai機器人電銷 福州鐵通自動外呼系統 智能電銷機器人營銷 濮陽自動外呼系統代理 賺地圖標注的錢犯法嗎 烏魯木齊人工電銷機器人系統

需求和思路

在一般的小項目或者一個小軟件,例如客戶端之類的小程序中,可能會需要數據的持久化.但是使用一般的數據庫(Mysql)之類的不合適.使用sqlite3這種嵌入式的是個較好的方法,但是Go語言中sqlite3的庫是C語言的,Cgo不支持跨平臺編譯.正是由于這種需求,才想到使用json格式將數據直接保存在文件中.
具體的思路是怎么樣呢? 在Go語言中如果要將數據轉化成json格式的話,有兩種格式 struct 和 map. 如果同時需要增刪查改功能的話,將map作為中間格式是比較合適的.接下來我們就來實現它.

查詢操作

這種操作的實現比較簡單,直接將文件中的數據讀取出來,使用json庫反序列化就可以了. 代碼如下 :

type Product struct {
  Name string `json:"name"`
  Num int  `json:"num"`
}

func findAll() {
  ps := make([]Product, 0)

  data, err := ioutil.ReadFile("./index.json")
  if err != nil {
    log.Fatal(err)
  }

  // 這里參數要指定為變量的地址
  err = json.Unmarshal(data, ps)
  if err != nil {
    log.Fatal(err)
  }

  fmt.Println(ps)
}

添加操作

添加的實現實在查詢的基礎上的,我們需要先查詢文件中的數據庫,并轉化為map格式,再將struct也轉化為map格式(這里要使用反射),合并map,json序列化,最后保存在文件中.代碼如下:

func create() {
  fields := make([]map[string]interface{}, 0)
  
  p1 := Product{
    Name: "Blog",
    Num: 2,
  }
  
  _, _ = json.Marshal(p1)
  // 讀取文件中的數據,保存為map格式
  data, _ := ioutil.ReadFile("./index.json")
  err := json.Unmarshal(data, fields)
  if err != nil {
    log.Fatal(err)
  }
  
  // 使用反射將struct轉化為map
  tp := reflect.TypeOf(p1).Elem()
  vp := reflect.ValueOf(p1).Elem()
  field := make(map[string]interface{}, 0)
  for i := 0; i  tp.NumField(); i++ {
    field1 := tp.Field(i)
    field2 := vp.Field(i)
    key := field1.Tag.Get("json")
    field[key] = field2.Interface()
  }
  // 合并map
  fields = append(fields, field)
  
  // 寫入文件
  out, _ := json.Marshal(fields)
  _ = ioutil.WriteFile("./index.json", out, 0755)
}

條件查詢

思路: 將struct轉化為map,根據輸入的條件查詢.查詢的結果轉化為struct.代碼如下:

func FindOne() {
  product := Product{}

  p1 := Product{
    Name: "John",
    Num: 23,
  }

  // 使用反射將struct轉化為map
  tp := reflect.TypeOf(p1).Elem()
  vp := reflect.ValueOf(p1).Elem()
  field := make(map[string]interface{}, 0)
  for i := 0; i  tp.NumField(); i++ {
    field1 := tp.Field(i)
    field2 := vp.Field(i)
    key := field1.Tag.Get("json")
    switch field2.Kind() {
    case reflect.Int:
      field[key] = float64(field2.Interface().(int))
    case reflect.Int8:
      field[key] = float64(field2.Interface().(int8))
    case reflect.Int16:
      field[key] = float64(field2.Interface().(int16))
    case reflect.Int32:
      field[key] = float64(field2.Interface().(int32))
    case reflect.Int64:
      field[key] = float64(field2.Interface().(int64))
    case reflect.Uint:
      field[key] = float64(field2.Interface().(uint))
    case reflect.Uint8:
      field[key] = float64(field2.Interface().(uint8))
    case reflect.Uint16:
      field[key] = float64(field2.Interface().(uint16))
    case reflect.Uint32:
      field[key] = float64(field2.Interface().(uint32))
    case reflect.Uint64:
      field[key] = float64(field2.Interface().(uint64))
    case reflect.Float32:
      field[key] = float64(field2.Interface().(float32))
    case reflect.Float64:
      field[key] = field2.Interface()
    default:
      field[key] = field2.Interface()
    }
  }

  _, _ = json.Marshal(p1)
  // 讀取文件中的數據,保存為map格式
  // 數據轉化為map時,數值類型的統一變成float64
  data, _ := ioutil.ReadFile("./index.json")
  fields := make([]map[string]interface{}, 0)
  err := json.Unmarshal(data, fields)
  if err != nil {
    log.Fatal(err)
  }

  // 查詢的條件
  columns := []string{"name", "num"}
  length := len(columns)
  for _, item := range fields {
    for i := 0; i  length; i++ {
      // 這里的比較需要改進
      if item[columns[i]] != field[columns[i]] {
        break
      }
      if i == length-1 {
        field = item
        goto OVER
      }
    }
  }
OVER:
  fmt.Println(field)

  out, _ := json.Marshal(field)
  _ = json.Unmarshal(out, product)

  fmt.Println(product)
}

修改操作

修改操作在查詢操作的基礎上實現, 修改操作需要有一個id值,能確定元素的唯一性.代碼如下:

func Update() {
  p1 := Product{
    Id:  "2bbec87025968879c3c9682abe3bf730",
    Name: "John_e",
    Num: 100,
  }

  // 使用反射將struct轉化為map
  tp := reflect.TypeOf(p1).Elem()
  vp := reflect.ValueOf(p1).Elem()
  field := make(map[string]interface{}, 0)
  for i := 0; i  tp.NumField(); i++ {
    field1 := tp.Field(i)
    field2 := vp.Field(i)
    key := field1.Tag.Get("json")
    switch field2.Kind() {
    case reflect.Int:
      field[key] = float64(field2.Interface().(int))
    case reflect.Int8:
      field[key] = float64(field2.Interface().(int8))
    case reflect.Int16:
      field[key] = float64(field2.Interface().(int16))
    case reflect.Int32:
      field[key] = float64(field2.Interface().(int32))
    case reflect.Int64:
      field[key] = float64(field2.Interface().(int64))
    case reflect.Uint:
      field[key] = float64(field2.Interface().(uint))
    case reflect.Uint8:
      field[key] = float64(field2.Interface().(uint8))
    case reflect.Uint16:
      field[key] = float64(field2.Interface().(uint16))
    case reflect.Uint32:
      field[key] = float64(field2.Interface().(uint32))
    case reflect.Uint64:
      field[key] = float64(field2.Interface().(uint64))
    case reflect.Float32:
      field[key] = float64(field2.Interface().(float32))
    case reflect.Float64:
      field[key] = field2.Interface()
    default:
      field[key] = field2.Interface()
    }
  }

  _, _ = json.Marshal(p1)
  // 讀取文件中的數據,保存為map格式
  // 數據轉化為map時,數值類型的統一變成float64
  data, _ := ioutil.ReadFile("./index.json")
  fields := make([]map[string]interface{}, 0)
  err := json.Unmarshal(data, fields)
  if err != nil {
    log.Fatal(err)
  }

  // 修改的條件
  columns := []string{"name", "num"}
  for _, v := range fields {
    if v["_id"] == field["_id"] {
      for _, col := range columns {
        v[col] = field[col]
      }
      field = v
    }
  }

  out, _ := json.MarshalIndent(fields, "", " ")
  _ = ioutil.WriteFile("./index.json", out, 0755)
}

刪除操作

最后就是刪除操作了,這個比較思路簡單,輸入唯一的id值,刪除對應的字段,再保存到文件就可以了.代碼如下:

func Delete() {
  p1 := Product{
    Id:  "db43fa2d4f69cddce7494941cb36032b",
    Name: "John_e",
    Num: 100,
  }

  _, _ = json.Marshal(p1)
  // 讀取文件中的數據,保存為map格式
  // 數據轉化為map時,數值類型的統一變成float64
  data, _ := ioutil.ReadFile("./index.json")
  fields := make([]map[string]interface{}, 0)
  err := json.Unmarshal(data, fields)
  if err != nil {
    log.Fatal(err)
  }

  length := len(fields)
  for index, field := range fields {
    if field["_id"] == p1.Id {
      if index == length - 1 {
        fields = fields[0:index]
      } else {
        fields = append(fields[0:index], fields[index+1:]...)
      }
    }
  }

  out, _ := json.MarshalIndent(fields, "", " ")
  _ = ioutil.WriteFile("./index.json", out, 0755)
}

完整版

最后在附上完整版代碼:

package store

import (
  "bytes"
  "crypto/md5"
  "encoding/json"
  "errors"
  "fmt"
  "io/ioutil"
  "os"
  "path/filepath"
  "reflect"
  "strings"
  "time"
)

type Store struct {
  Dir string
}

func NewStore(dir string) (*Store, error) {

  // .開頭的為相對路徑,補全為全路徑
  if strings.HasPrefix(dir, ".") {
    pwd, _ := os.Getwd()
    dir = filepath.Join(pwd, dir)
  }
  store := Store{Dir: dir}

  st, err := os.Stat(dir)
  if err != nil {
    err = os.Mkdir(dir, 0755)
    if err != nil {
      return nil, err
    }
  } else if st != nil  !st.IsDir() {
    return nil, errors.New("file already exists")
  }

  return store, nil
}

// 創建與結構體對應的json文件
func (s *Store) Sync(values ...interface{}) error {
  for _, v := range values {
    tb := parseTn(v)
    if tb == "" {
      return errors.New("does not find store")
    }
    _path := filepath.Join(s.Dir, tb)
    _, err := os.Stat(_path)
    if err != nil {
      _ = ioutil.WriteFile(_path, []byte("[]"), 0755)
    }
  }
  return nil
}

// 刪除所有
func (s *Store) Destroy() error {
  return os.RemoveAll(s.Dir)
}

func (s *Store) FindAll(v interface{}) error {

  _path, err := s.before(v)
  if err != nil {
    return err
  }

  out, err := s.readAll(_path)
  if err != nil {
    return err
  }
  err = json.Unmarshal(out, v)
  return err
}

func (s *Store) FindOne(v interface{}, columns ...string) (interface{}, error) {

  _path, err := s.before(v)
  if err != nil {
    return nil, err
  }

  data, err := s.readAll(_path)
  if err != nil {
    return nil, err
  }

  fields := make([]map[string]interface{}, 0)
  err = json.Unmarshal(data, fields)
  if err != nil {
    return nil, err
  }

  m := structToMap(v)
  length := len(columns)
  for _, item := range fields {
    for i := 0; i  length; i++ {
      // TODO 這里的比較需要改進
      if item[columns[i]] != m[columns[i]] {
        break
      }
      if i == length-1 {
        m = item
        goto OVER
      }
    }
  }
OVER:

  err = mapToStruct(m, v)
  if err != nil {
    return nil, err
  }

  return v, nil
}

func (s *Store) Create(v interface{}) error {

  _path, err := s.before(v)
  if err != nil {
    return err
  }

  data, err := s.readAll(_path)
  if err != nil {
    return err
  }

  fields := make([]map[string]interface{}, 0)
  err = json.Unmarshal(data, fields)
  if err != nil {
    return err
  }

  m := structToMap(v)
  m["_id"] = randId()

  fields = append(fields, m)

  err = s.writeAll(_path, fields)
  if err != nil {
    return err
  }

  err = mapToStruct(m, v)
  if err != nil {
    return err
  }

  return nil
}

func (s *Store) Update(v interface{}, columns ...string) error {

  _path, err := s.before(v)
  if err != nil {
    return err
  }

  data, err := s.readAll(_path)
  if err != nil {
    return err
  }

  fields := make([]map[string]interface{}, 0)
  err = json.Unmarshal(data, fields)
  if err != nil {
    return err
  }

  m := structToMap(v)
  for _, v := range fields {
    if v["_id"] == m["_id"] {
      for _, col := range columns {
        v[col] = m[col]
      }
      m = v
    }
  }

  err = s.writeAll(_path, fields)
  if err != nil {
    return err
  }

  return nil
}

func (s *Store) Delete(v interface{}) error {

  _path, err := s.before(v)
  if err != nil {
    return err
  }

  data, err := s.readAll(_path)
  if err != nil {
    return err
  }

  fields := make([]map[string]interface{}, 0)
  err = json.Unmarshal(data, fields)
  if err != nil {
    return err
  }

  m := structToMap(v)
  length := len(fields)
  for index, field := range fields {
    if field["_id"] == m["_id"] {
      if index == length-1 {
        fields = fields[0:index]
      } else {
        fields = append(fields[0:index], fields[index+1:]...)
      }
    }
  }

  err = s.writeAll(_path, fields)
  if err != nil {
    return err
  }

  return nil
}

func (s *Store) Clean(v interface{}) error {
  _path, err := s.before(v)
  if err != nil {
    return err
  }

  return os.Remove(_path)
}

func (s *Store) readAll(file string) ([]byte, error) {
  out, err := ioutil.ReadFile(file)
  if err != nil {
    return nil, err
  }
  return out, nil
}

func (s *Store) writeAll(file string, v interface{}) error {
  out, err := json.MarshalIndent(v, "", " ")
  if err != nil {
    return err
  }

  err = ioutil.WriteFile(file, out, 0755)
  if err != nil {
    return err
  }

  return nil
}

func (s *Store) before(v interface{}) (string, error) {
  tb := parseTn(v)
  if tb == "" {
    return "", errors.New("invalid table name")
  }

  _path := filepath.Join(s.Dir, tb)
  _, err := os.Stat(_path)
  if err != nil {
    return "", err
  }

  return _path, nil
}

func structToMap(v interface{}) map[string]interface{} {
  tp := reflect.TypeOf(v).Elem()
  vp := reflect.ValueOf(v).Elem()
  field := make(map[string]interface{}, 0)
  for i := 0; i  tp.NumField(); i++ {
    field1 := tp.Field(i)
    field2 := vp.Field(i)
    key := field1.Tag.Get("json")
    field[key] = field2.Interface()
    switch field2.Kind() {
    case reflect.Int:
      field[key] = float64(field2.Interface().(int))
    case reflect.Int8:
      field[key] = float64(field2.Interface().(int8))
    case reflect.Int16:
      field[key] = float64(field2.Interface().(int16))
    case reflect.Int32:
      field[key] = float64(field2.Interface().(int32))
    case reflect.Int64:
      field[key] = float64(field2.Interface().(int64))
    case reflect.Uint:
      field[key] = float64(field2.Interface().(uint))
    case reflect.Uint8:
      field[key] = float64(field2.Interface().(uint8))
    case reflect.Uint16:
      field[key] = float64(field2.Interface().(uint16))
    case reflect.Uint32:
      field[key] = float64(field2.Interface().(uint32))
    case reflect.Uint64:
      field[key] = float64(field2.Interface().(uint64))
    case reflect.Float32:
      field[key] = float64(field2.Interface().(float32))
    case reflect.Float64:
      field[key] = field2.Interface()
    default:
      field[key] = field2.Interface()
    }
  }

  return field
}

func mapToStruct(m map[string]interface{}, v interface{}) error {
  out, err := json.Marshal(m)
  if err != nil {
    return err
  }
  return json.Unmarshal(out, v)
}

func toSnake(s string) string {
  out := bytes.Buffer{}

  bName := []byte(s)

  point := 0
  for index, b := range bName {
    // 非大寫,不需要轉化
    if b  65 || b > 90 || index-point  2 {
      out.WriteByte(b)
      continue
    }
    // 首字符大寫,直接轉化為小寫
    if index == 0 {
      out.WriteByte(b + 32)
      point = index
    }
    // 連續三個大寫,觸發轉化
    if index-point >= 2 {
      out.WriteByte(95)
      out.WriteByte(b + 32)
      point = index
    }
  }

  return out.String()
}

func parseTn(v interface{}) string {
  var name string

  tp := reflect.TypeOf(v).Elem()
  switch tp.Kind() {
  case reflect.Ptr:
    sp := strings.Split(tp.String(), ".")
    name = sp[len(sp)-1]
  case reflect.Slice:
    sp := strings.Split(tp.String(), ".")
    name = sp[len(sp)-1]
  case reflect.Struct:
    name = tp.Name()
  }
  name = toSnake(name)
  return name + ".json"
}

func randId() string {
  return fmt.Sprintf("%x", md5.Sum([]byte(time.Now().String())))
}

到此這篇關于golang使用json格式實現增刪查改的實現示例的文章就介紹到這了,更多相關golang json增刪查改內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • golang:json 反序列化的[]和nil操作
  • 解決Golang json序列化字符串時多了\的情況
  • 解決golang json解析出現值為空的問題
  • golang xorm及time.Time自定義解決json日期格式的問題
  • golang 實現struct、json、map互相轉化
  • Golang 如何解析和生成json
  • golang中json的omitempty使用操作

標簽:廣西 慶陽 阿克蘇 西雙版納 德州 調研邀請 太原 貴陽

巨人網絡通訊聲明:本文標題《golang使用json格式實現增刪查改的實現示例》,本文關鍵詞  golang,使用,json,格式,實現,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《golang使用json格式實現增刪查改的實現示例》相關的同類信息!
  • 本頁收集關于golang使用json格式實現增刪查改的實現示例的相關信息資訊供網民參考!
  • 推薦文章
    成人做爰69片免费| 日韩av中文在线| 久久精品一区二区三区不卡 | 欧美成人精品激情在线视频| 日韩免费av网站| 美女视频黄久久| 天堂av在线一区| 国产精品久久久久久99| 黄色一级视频免费观看| 久久久久久视频| 波多野结衣与黑人| 国产91精品久久久久| 国产在线拍揄自揄视频不卡99 | 成人网在线免费观看| 亚洲国产精品字幕| www激情久久| 亚洲精品视频网| 国产视频在线观看视频| 天天操天天舔天天干| 国产成人午夜电影网| 国产综合色在线视频区| 国产高潮久久久| 国产精品视频在| 夫妇交换中文字幕| 国产极品粉嫩福利姬萌白酱| 国产精品中文久久久久久久| 婷婷四房综合激情五月| 亚洲一区精彩视频| 日本女人高潮视频| 日本手机在线视频| 欧美亚洲视频在线看网址| 中文字幕在线观看日韩| 性色av一区二区三区免费| 久久精品日韩| 国产精品免费在线视频| 美腿丝袜亚洲三区| 疯狂蹂躏欧美一区二区精品| 欧美一级日韩一级| 曰本色欧美视频在线| 亚洲精品国产精品国自产在线 | 韩国三级在线看| 熟女视频一区二区三区| av网站大全免费| 一级片一级片一级片| 国产三级短视频| 免费观看特级毛片| 在线观看中文字幕av| 久草精品在线播放| 成年人在线观看av| 无码人妻精品一区二区50| 久久久成人网| 亚洲欧美在线视频观看| 亚洲成人免费视| 亚洲欧美国产77777| 国产精品入口麻豆九色| 亚洲乱码中文字幕| 国产欧美一区二区三区沐欲| 不卡在线视频中文字幕| 亚洲国产精品美女| 68精品久久久久久欧美| 久久人人97超碰精品888| 欧美最猛性xxxxx免费| 国产精品扒开腿爽爽爽视频| 欧美在线观看网站| 欧美日韩免费观看一区| 日本乱子伦xxxx| 日韩高清不卡一区二区三区| 国产精品视频一二| 欧美日韩国产大片| 欧美成va人片在线观看| 欧美黄色小视频| 国产乱码精品一区二区三区卡| 91亚洲人电影| 国产精品一区二区久久国产| 人妻巨大乳一二三区| 亚洲精品国产一区二| 国产乱子伦精品无码码专区| 国产一区二区三区蝌蚪| 亚洲人成精品久久久久| 91免费视频网| 宅男66日本亚洲欧美视频| 亚洲看片网站| 国产成人av免费在线观看| 中文字幕69页| 久久在线观看免费| 欧美二区乱c少妇| 超碰97人人做人人爱少妇| 国产成人精品一区二区在线| 鲁大师私人影院在线观看| 国产一区二区中文字幕| 欧美大成色www永久网站婷| 国产精品久久国产| 天堂资源在线中文精品| 91传媒视频在线播放| 日韩高清欧美高清| 国产精品美女网站| 天天操天天爱天天爽| 日韩精品国产一区二区| 真实新婚偷拍xxxxx| 波多野结衣一二区| 亚洲国产综合91精品麻豆| 国产在线精品成人一区二区三区| 欧美亚洲国产视频小说| 久青草视频在线播放| 国产一级一片免费播放| 欧美一区二区三区粗大| 国产剧情av麻豆香蕉精品| 4438成人网| 日韩福利视频| 午夜久久久久久久久久| 精品久久久久久综合日本欧美| 一区二区在线不卡| 99精品全国免费观看| 久久久久久久久久成人| 岛国av在线一区| 欧美精品高清视频| 97精品在线视频| 日本一区二区三区四区高清视频| 久久久免费看片| 亚洲国产日韩综合久久精品| 久久人人爽人人爽人人片av高清| 国产美女在线一区| 国产一区二区视频免费| 99热这里只有精品在线| 色狠狠一区二区| 亚洲综合av一区| 久久综合导航| …久久精品99久久香蕉国产| 久久久久成人精品无码| 欧美性猛交一区二区三区精品| 在线观看成人免费| 一区二区三区精| 一区二区成人在线| 97成人精品区在线播放| 免费成人午夜视频| 国产精品一区二区免费视频 | 国产精品一区二区三区在线播放| 超级碰在线观看| 国产成人精品亚洲777人妖| 欧美噜噜久久久xxx| 日韩精品在线中文字幕| 久操视频在线免费观看| 欧美视频在线不卡| 欧美精品一区二区三区蜜臀 | 色婷婷久久久综合中文字幕| av免费观看大全| 亚洲人成人一区二区在线观看| 内射国产内射夫妻免费频道| 久久久久国产精品免费免费搜索| 亚洲国产欧美不卡在线观看| 午夜毛片在线观看| 午夜视频在线观看一区| 国产成人免费91av在线| 女~淫辱の触手3d动漫| 国产亚洲午夜高清国产拍精品| 久久av资源网站| 日本公妇乱淫免费视频一区三区| 亚洲免费在线视频观看| 亚洲日韩欧美视频| 日本55丰满熟妇厨房伦| 亚洲av无码乱码国产麻豆| 亚洲精品一区在线观看| 欧美一区二区三区精美影视| www.国产视频.com| 国产真实乱偷精品视频免| 国产免费成人av| 久久先锋影音| 日韩成人午夜影院| 精品国产精品自拍| 精品国产av色一区二区深夜久久| 亚洲精品v欧美精品v日韩精品| 无码人妻精品一区二区中文| 一区二区三区不卡视频| 日韩免费观看高清| 麻豆成人在线视频| 91精品一区二区三区在线观看| 无码熟妇人妻av在线电影| www.色日本| 色综合久久综合中文综合网| 亚洲狠狠婷婷综合久久久| 黄色福利在线观看| 欧美日韩在线影院| 色爱av美腿丝袜综合粉嫩av| 99热这里只有精品2| 亚洲成人免费视| 免费网站在线观看黄| 色综合天天做天天爱| 少妇光屁股影院| 亚洲人成电影网站色| 亚洲毛片亚洲毛片亚洲毛片| 国产精品网站一区| 亚洲一区二区免费| 日本免费观看视| 欧美性猛交xxxx黑人交| 热久久精品免费视频| 日本午夜精品一区二区三区电影| 在线亚洲欧美视频| 波多野结衣午夜| 国产69精品久久久久99| 国产女人高潮毛片| 神马影院午夜我不卡影院| 五月婷婷久久丁香| 青青青在线免费观看| 国产精品久久久久av免费| 亚洲影院在线播放| 亚洲嫩模很污视频| 波多野结衣办公室33分钟| 亚洲美女免费视频| 浮妇高潮喷白浆视频| 91网址在线看| 91免费国产精品| 99久久er热在这里只有精品15| 97在线视频国产| 玖玖爱免费视频| 91色在线porny| 亚洲欧美日韩在线综合| 久久嫩草精品久久久精品| 日本精品一区二区| 在线观看一区不卡| 波多野结衣影片| 欧美日韩中文字幕在线播放| 亚洲新声在线观看| 网站黄在线观看| 日本黄色三级大片| 欧美日韩在线精品一区二区三区激情| 日韩av片免费观看| 首页亚洲欧美制服丝腿| 日韩高清国产一区在线观看| 久久se这里有精品| 9l视频自拍9l视频自拍| 亚洲另类在线视频| 国产精品综合久久久久久| 亚洲欧美综合一区二区| 5566日本婷婷色中文字幕97| 91视频国产资源| 亚洲黄色小说在线观看| 亚洲精品视频在线| 午夜诱惑痒痒网| 欧美一级国产精品| 女女互磨互喷水高潮les呻吟| 国产女主播视频一区二区| 男人搞女人网站| 在线电影一区二区三区| 黄色污污在线观看| 久久66热偷产精品| 国产精品视频久| 一级片免费观看视频| 欧美成人免费观看| 久一视频在线观看| 亚洲国产私拍精品国模在线观看| 国产自偷自偷免费一区 | 亚洲欧洲xxxx| 91香蕉视频污在线观看| 日韩一区二区免费电影| 不用播放器的免费av| 午夜天堂影视香蕉久久| 中文字幕一区二区三区有限公司| 国产成人aaa| 国产成人av一区二区三区| 蜜桃视频第一区免费观看| 国产日韩欧美综合| 高潮毛片7777777毛片| 国产成人精品视频在线| 激情黄色小视频| 一区二区不卡在线视频 午夜欧美不卡在| a级片一区二区| 亚洲美女视频在线观看| 国产一区亚洲二区三区| 一区二区免费看| 色一情一乱一乱一区91| 欧美激情一区二区在线| 97超碰在线人人| 亚洲福利一二三区| 日本一区二区免费视频| 欧美午夜精品一区| 偷拍夫妻性生活| 日韩三级在线观看| av激情在线观看| 45www国产精品网站| 中文字幕国产一区| 中文字幕影音先锋| 国产精品久久久久影院日本| 国产福利免费视频| 2019最新中文字幕| 男人的天堂久久精品| 日韩精品最新在线观看| 亚洲另类在线观看| 国产日韩在线一区| 毛片av一区二区| 中文字幕剧情在线观看一区| 亚洲欧美另类图片小说| 九一国产在线观看| 欧美一区二区三区四区在线| 国产模特av私拍大尺度| 国产精品久久久亚洲| 国产尤物一区二区| 人妻少妇精品无码专区二区 | 国产偷国产偷亚洲清高网站| 亚洲成人福利视频| 国产视频久久久| 一级全黄裸体免费视频| 精品无码久久久久久久动漫| 欧美国产亚洲另类动漫| 在线成人免费av| 最近2019年手机中文字幕| 午夜精品一区二区三| 亚洲综合视频一区| 色综合久久久久综合体| 欧美亚洲日本在线| 成人国产精品一区| 国产精品九色蝌蚪自拍| 精品少妇一区二区三区免费观| 中文字幕一区日韩电影| 奇米色777欧美一区二区| 虎白女粉嫩尤物福利视频| 亚洲欧美另类自拍| 久久久久99| 一区二区三区 欧美| 中文字幕视频在线免费欧美日韩综合在线看| 手机看片国产1024| 嫩草av久久伊人妇女超级a| 亚洲二区中文字幕| 国产在成人精品线拍偷自揄拍| 在线视频不卡一区二区| 欧美日韩另类在线| 中文字幕第315页| 日韩欧美手机在线| 正在播放亚洲一区| 色丁香婷婷综合久久| 成人午夜视频免费在线观看| 欧美精品1区2区| 无码国精品一区二区免费蜜桃| av网站在线观看不卡| 美女少妇精品视频| 日本一区二区综合亚洲| 日韩精品一区二区三区在线视频| 亚洲最大福利网| 欧美在线小视频| 亚洲天堂免费av| 午夜免费一区二区| 午夜美女久久久久爽久久| 亚洲人成7777| 黄色网址中文字幕| 草草久久久无码国产专区| 欧美日韩国产二区| 99久久精品费精品国产一区二区| 91免费在线看片| 在线免费观看成人| 久久国产精品免费视频 | 欧美视频www| 欧美大学生性色视频| 久久久久国产精品厨房| 国产一级在线免费观看| 国产成人永久免费视频| 欧美老少配视频| 亚洲超碰精品一区二区| 国产口爆吞精一区二区| 北条麻妃在线视频观看| 国自产精品手机在线观看视频| 一区二区三区精品视频| 99久久久国产精品无码网爆| 国产大片一区二区三区| 国产剧情日韩欧美| 久久久精品人体av艺术| www.日本精品| 污色网站在线观看| 九九九九九精品| 中文字幕日韩av| 天天影视网天天综合色在线播放| 日韩在线视频第一页| 日本一级免费视频| 国产 欧美 日韩 一区| 欧美在线免费视频| 精品视频在线免费| 成人av在线播放网站| 日本亚洲欧美在线| 91精品国产高清91久久久久久| 日韩国产伦理| 国产成人精品视频| 亚洲人成电影在线播放| 亚洲一区av在线| 六月丁香婷婷久久| 国产无遮挡aaa片爽爽| 亚洲激情在线看| 在线看视频不卡| 91福利视频网| 亚洲色图18p| 一本大道久久精品懂色aⅴ| 久久久电影一区二区三区| 亚洲精品97久久中文字幕无码| 三级黄色片在线观看| 中文字幕国产传媒| 一本色道久久综合亚洲精品婷婷| 国产精品最新在线观看| 永久免费看mv网站入口亚洲| 色就色 综合激情| 国产日韩精品一区二区三区在线| 日本黄视频在线观看| 波多野结衣二区三区| 亚洲最大免费视频| 天天干天天玩天天操| 欧美一区三区二区在线观看| 日本一本a高清免费不卡| 日韩欧美一区中文| 天天做天天摸天天爽国产一区| 国产成人精品一区二区三区网站观看| 午夜精品久久久久久久第一页按摩 | 高清欧美一区二区三区| 国产一区二区三区在线看| 欧美精品一区二区不卡|