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

前端大數的運算及相關知識總結

開發 前端
前段時間我在公司的項目中負責的是權限管理這一塊的需求。需求的大概內容就是系統的管理員可以在用戶管理界面對用戶和用戶扮演的角色進行增刪改查的操作,然后當用戶進入主應用時,前端會請求到一個表示用戶權限的數組usr_permission。

 背景

前段時間我在公司的項目中負責的是權限管理這一塊的需求。需求的大概內容就是系統的管理員可以在用戶管理界面對用戶和用戶扮演的角色進行增刪改查的操作,然后當用戶進入主應用時,前端會請求到一個表示用戶權限的數組usr_permission,前端通過usr_permission來判斷用戶是否擁有某項權限。

這個usr_permission是一個長度為16的大數字符串數組,如下所示:

  1. const usr_permission = [ 
  2.   "17310727576501632001"
  3.     "1081919648897631175"
  4.     "4607248419625398332"
  5.     "18158795172266376960"
  6.     "18428747250223005711"
  7.     "17294384420617192448"
  8.     "216384094707056832"
  9.     "13902625308286185532"
  10.     "275821367043"
  11.     "0"
  12.     "0"
  13.     "0"
  14.     "0"
  15.     "0"
  16.     "0"
  17.     "0"

數組中的每一個元素可以轉成64位的二進制數,二進制數中的每一位通過0和1表示一種權限,這樣每一個元素可以表示64種權限,整個usr_permission就可以表示16*64=1024種權限。后端之所以要對usr_permission進行壓縮,是因為后端采用的是微服務架構,各個模塊在通信的過程中通過在請求頭中加入usr_permission來做權限的認證。

數組usr_permission的第0個元素表示第[0, 63]號的權限,第1個元素表示第[64, 127]號的權限,以此類推。比如現在我們要查找第220號權限:

  1. const permission = 220 // 查看銷售出庫 
  2. const usr_permission = [ 
  3.   "17310727576501632001"
  4.     "1081919648897631175"
  5.     "4607248419625398332"
  6.     "18158795172266376960"
  7.     "18428747250223005711"
  8.     "17294384420617192448"
  9.     "216384094707056832"
  10.     "13902625308286185532"
  11.     "275821367043"
  12.     "0"
  13.     "0"
  14.     "0"
  15.     "0"
  16.     "0"
  17.     "0"
  18.     "0"
  19.  
  20. // "18158795172266376960" 表示第193號~第256號權限 
  21. // 1111 1100 0000 0000 1111 1111 1111 1111 1111 0000 0000 0011 1111 1111 0000 0000 
  22. // 220 % 64 = 28 
  23. // 0000 0000 0000 0000 0000 0000 0000 1111 1100 0000 0000 1111 1111 1111 1111 1111 
  24. // 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 
  25. // ------------------------------------------------------------------------------- 
  26. // 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 
  • 從usr_permission中我們得知第220號權限由第3個元素"18158795172266376960"表示。
  • 我們將"18158795172266376960"轉成二進制得到1111 1100 0000 0000 1111 1111 1111 1111 1111 0000 0000 0011 1111 1111 0000 0000。
  • 將220除以64得到余數28,也就是說二進制數1111 1100 0000 0000 1111 1111 1111 1111 1111 0000 0000 0011 1111 1111 0000 0000從右數的第28位表示第220號權限。
  • 我們可以將二進制數1111 1100 0000 0000 1111 1111 1111 1111 1111 0000 0000 0011 1111 1111 0000 0000右移28位,將表示第220號權限的位數推到最低位。
  • 然后將二進制數與1進行按位與操作,如果當前用戶擁有第220號權限,則最后得到的結果為1,反之為0。

以上就是前端查找權限的大致過程,那么這個代碼要怎么寫呢?在編寫代碼之前,我們先來復習一下JavaScript大數相關的知識,了解編寫代碼的過程中會遇到什么問題。

IEEE 754標準

在計算機組成原理這門課里我們學過,在以IEEE 754為標準的浮點運算中,有兩種浮點數值表示方式,一種是單精度(32位),還有一種是雙精度(64位)。

在IEEE 754標準中,一個數字被表示成 +1.0001x2^3 這種形式。比如說在單精度(32位)表示法中,有1位用來表示數字的正負(符號位),8位用來表示2的冪次方(指數偏移值E,需要減去一個固定的數字得到指數e),23位表示1后面的小數位(尾數)。

比如0 1000 0010 0001 0000 0000 0000 0000 000,第1位0表示它是正數,第[2, 9]位1000 0010轉換成十進制就是130,我們需要減去一個常數127得到3,也就是這個數字需要乘以2的三次方,第[10, 32]位則表示1.0001 0000 0000 0000 0000 000,那么這個數字表示的就是二級制中的 +1.0001*2^3 ,轉換成十進制也就是8.5。

同理,雙精度(64位)也是一樣的表現形式,只是在64位中有11位用來表示2的冪次方,52位用來表示小數位。

JavaScript 就是采用IEEE754 標準定義的64 位浮點格式表示數字。在64位浮點格式中,有52位可以表示小數點后面的數字,加上小數點前面的1,就有53位可以用來表示數字,也就是說64位浮點可以表示的最大的數字是 2^53-1 ,超過 2^53-1 的數字就會發生精度丟失。因為2^53用64位浮點格式表示就變成了這樣:

符號位:0 指數:53 尾數:1.000000...000 (小數點后一共52個0)

小數點后面的第53個0已經被丟棄了,那么 2^53+1 的64位浮點格式就會變得和 2^53 一樣。一個浮點格式可以表示多個數字,說明這個數字是不安全的。所以在JavaScript中,最大的安全數是 2^53-1 ,這樣就保證了一個浮點格式對應一個數字。

0.1 + 0.2 !== 0.3

有一道很常見的前端面試題,就是問你為什么JavaScript中0.1+0.2為什么不等于0.3?0.1轉換成二進制是0.0 0011 0011 0011 0011 0011 0011 ... (0011循環),0.2轉換成二進制是0.0011 0011 0011 0011 0011 0011 0011 ... (0011循環),用64位浮點格式表示如下:

  1. // 0.1 
  2. e = -4
  3. m = 1.1001100110011001100110011001100110011001100110011010 (52位) 
  4.  
  5. // 0.2 
  6. e = -3
  7. m = 1.1001100110011001100110011001100110011001100110011010 (52位) 

然后把它們相加:

  1. e = -4; m = 1.1001100110011001100110011001100110011001100110011010 (52位) 
  2. e = -3; m = 1.1001100110011001100110011001100110011001100110011010 (52位) 
  3.  
  4. // 0.1和0.2指數不一致,需要進行對階操作 
  5. // 對階操作,會產生精度丟失 
  6. // 之所以選0.1進行對階操作是因為右移帶來的精度丟失遠遠小于左移帶來的溢出 
  7. e = -3; m = 0.1100110011001100110011001100110011001100110011001101 (52位) 
  8. e = -3; m = 1.1001100110011001100110011001100110011001100110011010 (52位) 
  9.  
  10.  
  11. e = -3; m = 10.0110011001100110011001100110011001100110011001100111 (52位) 
  12.  
  13. // 發生精度丟失 
  14. e = -2; m = 1.00110011001100110011001100110011001100110011001100111 (53位) 

我們看到已經溢出來了(超過了52位),那么這個時候我們就要做四舍五入了,那怎么舍入才能與原來的數最接近呢?比如1.101要保留2位小數,那么結果有可能是 1.10 和 1.11 ,這個時候兩個都是一樣近,我們取哪一個呢?規則是保留偶數的那一個,在這里就是保留 1.10。

回到我們之前的就是取m=1.0011001100110011001100110011001100110011001100110100 (52位)

然后我們得到最終的二進制數:

1.0011001100110011001100110011001100110011001100110100 * 2 ^ -2

=0.010011001100110011001100110011001100110011001100110100

轉換成十進制就是0.30000000000000004,所以,所以0.1 + 0.2 的最終結果是0.30000000000000004。

BigInt

通過前面的講解,我們清晰地認識到在以前,JavaScript是沒有辦法對大于 2^53-1 的數字進行處理的。不過后來,JavaScript提供了內置對象BigInt來處理大數。 BigInt 可以表示任意大的整數。可以用在一個整數字面量后面加 n 的方式定義一個 BigInt ,如: 10n ,或者調用函數 BigInt() 。

  1. const theBiggestInt = 9007199254740991n; 
  2.  
  3. const alsoHuge = BigInt(9007199254740991); 
  4. // ↪ 9007199254740991n 
  5.  
  6. const hugeString = BigInt("9007199254740991"); 
  7. // ↪ 9007199254740991n 
  8.  
  9. typeof 1n === 'bigint'// true 
  10. typeof BigInt('1') === 'bigint'// true 
  11.  
  12. 0n === 0 // ↪ false 
  13.  
  14. 0n == 0 // ↪ true 

用BigInt實現的權限查找代碼如下:

  1. hasPermission(permission: Permission) { 
  2.     const usr_permissions = this.userInfo.usr_permissions 
  3.     const arr_index = Math.floor(permission / 64
  4.     const bit_index = permission % 64 
  5.     if (usr_permissions && usr_permissions.length > arr_index) { 
  6.       if ((BigInt(usr_permissions[arr_index]) >> BigInt(bit_index)) & 1n) { 
  7.         return true 
  8.       } 
  9.     } 
  10.     return false 

兼容分析

但是BigInt存在兼容性問題:

根據我司用戶使用瀏覽器版本數據的分析,得到如下餅狀圖:

不兼容BigInt瀏覽器的比例占到12.4%

解決兼容性的問題,一種方式是如果希望在項目中繼續使用BigInt,那么需要Babel的一些插件進行轉換。這些插件需要調用一些方法去檢測運算符什么時候被用于BigInt,這將導致不可接受的性能損失,而且在很多情況下是行不通的。另外一種方法就是找一些封裝大數運算方法的第三方庫,使用它們的語法做大數運算。

用第三方庫實現

很多第三方庫可以用來做大數運算,大體的思路就是定義一個數據結構來存放大數的正負及數值,分別算出每一位的結果再存儲到數據結構中。

jsbn 解決方案

  1. // yarn add jsbn @types/jsbn 
  2.  
  3. import { BigInteger } from 'jsbn' 
  4.  
  5. hasPermission(permission: Permission) { 
  6.     const usr_permissions = this.userInfo.usr_permissions 
  7.     const arr_index = Math.floor(permission / 64
  8.     const bit_index = permission % 64 
  9.     if (usr_permissions && usr_permissions.length > arr_index) { 
  10.       if ( 
  11.         new BigInteger(usr_permissions[arr_index]) 
  12.           .shiftRight(bit_index) 
  13.           .and(new BigInteger('1')) 
  14.           .toString() !== '0' 
  15.       ) { 
  16.         return true 
  17.       } 
  18.     } 
  19.     return false 
  20.   } 

jsbi 解決方案

  1. // yarn add jsbi 
  2.  
  3. import JSBI from 'jsbi' 
  4.  
  5. hasPermission(permission: Permission) { 
  6.     // 開發環境不受權限限制 
  7.     if (__DEVELOPMENT__) { 
  8.       return true 
  9.     } 
  10.  
  11.     const usr_permissions = this.userInfo.usr_permissions 
  12.     const arr_index = Math.floor(permission / 64
  13.     const bit_index = permission % 64 
  14.     if (usr_permissions && usr_permissions.length > arr_index) { 
  15.       const a = JSBI.BigInt(usr_permissions[arr_index]) 
  16.       const b = JSBI.BigInt(bit_index) 
  17.       const c = JSBI.signedRightShift(a, b) 
  18.       const d = JSBI.BigInt(1
  19.       const e = JSBI.bitwiseAnd(c, d) 
  20.       if (e.toString() !== '0') { 
  21.         return true 
  22.       } 
  23.     } 
  24.     return false 
  25.   } 

權限查找新思路

后來,一位同事提到了一種新的權限查找的解決方案:前端獲取到數組usr_permission以后,將usr_permission的所有元素轉成二進制,并進行字符串拼接,得到一個表示用戶所有權限的字符串permissions。當需要查找權限時,查找permissions對應的位數即可。這樣相當于在用戶進入系統時就將所有的權限都算好,而不是用一次算一次。

在中學時,我們學到的將十進制轉成二進制的方法是輾轉相除法,這里有一種新思路:

  • 比如我們要用5個二進制位表示11這個數
  • 我們需要先定義一個長度為5,由2的倍數組成的數組[16, 8, 4, 2, 1],然后將11與數組中的元素挨個比較
  • 11 < 16, 所以得到[0, x, x, x, x]
  • 11 >= 8,所以得到[0, 1, x, x, x],11 - 8 = 3
  • 3 < 4,所以得到[0, 1, 0, x, x]
  • 3 >= 2,所以得到[0, 1, 0, 1, x],3 - 2 = 1
  • 1>= 1,所以得到[0, 1, 0, 1, 1],1 - 1 = 0,結束
  • 所以用5位二進制數表示11的結果就是01011

根據上面的思路可以得到的代碼如下,這里用big.js這個包去實現:

  1. import Big from 'big.js'     
  2.     import _ from 'lodash' 
  3.  
  4.     permissions = '' // 最后生成的權限字符串 
  5.  
  6.     // 生成長度為64,由2的倍數組成的數組 
  7.     generateBinaryArray(bits: number) { 
  8.       const arr: any[] = [] 
  9.       _.each(_.range(bits), (index) => { 
  10.         arr.unshift(Big(2).pow(index)) 
  11.       }) 
  12.       return arr 
  13.     }   
  14.  
  15.     // 將usr_permission中單個元素轉成二進制 
  16.     translatePermission(binaryArray: any[], permission: string) { 
  17.     let bigPermission = Big(permission) 
  18.     const permissionBinaryArray: number[] = [] 
  19.     _.each(binaryArray, (v, i) => { 
  20.       if (bigPermission.gte(binaryArray[i])) { 
  21.         bigPermission = bigPermission.minus(binaryArray[i]) 
  22.         permissionBinaryArray.unshift(1
  23.       } else { 
  24.         permissionBinaryArray.unshift(0
  25.       } 
  26.     }) 
  27.     return permissionBinaryArray.join(''
  28.   } 
  29.  
  30.     // 將usr_permission中所有元素的二進制形式進行拼接 
  31.   generatePermissionString() { 
  32.     const usr_permissions = this.userInfo.usr_permissions 
  33.     let str = '' 
  34.     const binaryArray = this.generateBinaryArray(64
  35.     _.each(usr_permissions, (permission, index) => { 
  36.       str = `${str}${this.translatePermission(binaryArray, permission)}` 
  37.     }) 
  38.     this.permissions = str 
  39.   } 
  40.  
  41.     // 判斷時候擁有某項權限 
  42.   hasPermission(permission: Permission) { 
  43.     if (!this.permissions) { 
  44.       return false 
  45.     } 
  46.     return this.permissions[permission] === '1' 
  47.   } 

 

 

責任編輯:張燕妮 來源: segmentfault.com
相關推薦

2009-01-11 09:14:45

Javascript開發總結

2015-11-16 10:34:19

Linux動態庫總結

2010-03-18 14:24:31

云計算

2009-08-07 13:30:20

C# Excel導入

2015-07-16 10:15:44

web前端知識體系

2011-07-29 11:32:16

路由PIM

2011-09-02 11:23:54

ADSL網速帶寬測試網速測試

2011-08-23 15:32:43

Oracle rege正則表達式

2022-07-08 10:11:04

探查數據治理數據質量

2025-08-15 07:34:02

2015-12-02 10:21:34

JavaScript浮點數精度調整

2011-08-29 15:04:05

修改GLOBAL_NADBLINK

2014-04-29 09:59:44

2022-08-16 15:17:37

機器學習算法模型

2009-09-14 09:49:07

CCNA認證CCNA

2019-11-13 10:16:14

大數據架構數據科學

2011-07-29 11:29:00

MLSMLS-SEMLS-RP

2010-07-14 16:00:30

Perl

2010-09-28 11:48:36

SQL NULL值

2021-01-11 05:40:18

HTTPHTTP 協議網絡技術
點贊
收藏

51CTO技術棧公眾號

成人影院在线| 国产精品黄色片| 久久综合久久综合久久综合| 国产精品久久久久av| 日本中文在线视频| 白嫩白嫩国产精品| 在线视频国内自拍亚洲视频| 9l视频自拍9l视频自拍| 午夜av免费在线观看| 麻豆精品在线看| 97精品久久久| 国产免费久久久久| 亚州精品视频| 日韩区在线观看| 成人亚洲视频在线观看| 美足av综合网| 国产精品午夜在线| 国产三区精品| 国产乱码精品一区二三区蜜臂| 亚洲毛片av| 久久精品国产视频| 一级片视频免费看| 国产精品宾馆| 5月丁香婷婷综合| 久久久噜噜噜www成人网| 影音先锋在线视频| 中文乱码免费一区二区| 久久综合一区| 后入内射欧美99二区视频| 久久97超碰色| 国产精品一区二区久久国产| 一区二区三区福利视频| 亚洲视频日本| 欧美成人黑人xx视频免费观看| japanese中文字幕| 婷婷五月色综合香五月| 精品国产乱码久久久久久夜甘婷婷| 日本在线播放一区二区| 成人国产一区| 欧美在线一区二区| aa免费在线观看| 国产中文在线播放| 亚洲亚洲精品在线观看| 二级片在线观看| 亚洲麻豆精品| 国产精品成人一区二区三区夜夜夜 | 美脚丝袜一区二区三区在线观看| 性中国xxx极品hd| 狠狠色综合日日| 国产在线精品自拍| 中日精品一色哟哟| 日韩电影在线观看一区| 国产精品成人播放| 亚洲欧美一二三区| 日日骚欧美日韩| 国产精品日日做人人爱| 国产成人av免费| 日韩电影网1区2区| 国产精品美女午夜av| 国产精品第6页| 麻豆极品一区二区三区| 91精品综合久久久久久五月天| 97超碰人人草| 国产乱子轮精品视频| **亚洲第一综合导航网站| www.黄色国产| av一区二区三区在线| 欧美精品在线一区| 国产69精品久久app免费版| 中文字幕国产一区| 国产对白在线播放| 免费在线观看的电影网站| 亚洲狠狠爱一区二区三区| 99爱视频在线| av免费在线一区| 91精品国产综合久久福利| 国产老头和老头xxxx×| 国产精品极品在线观看| 亚洲精选一区二区| 无码人中文字幕| 欧美成人午夜| 57pao国产成人免费| 自拍偷拍第八页| 国产精品白丝jk黑袜喷水| 国产精品一区二区你懂得| 韩日视频在线| 亚洲精品免费一二三区| 5月婷婷6月丁香| 日韩毛片免费看| 亚洲电影免费观看高清完整版在线 | 国产一区二区三区久久精品| 小向美奈子av| 在线欧美日韩| 国产欧美日韩高清| 免费看日韩av| 欧美韩国一区二区| 欧美大黑帍在线播放| 黄色亚洲网站| 日韩欧美国产综合| 国产又黄又粗的视频| 一区久久精品| 国产在线视频2019最新视频| 日韩一级片免费观看| 中文字幕在线不卡| 欧美 日韩精品| 日韩精品三级| 在线性视频日韩欧美| 国产在线视频卡一卡二| 美国三级日本三级久久99| 国产在线播放一区二区| 二区在线播放| 欧美午夜影院一区| 国产精品久久久免费观看| 欧美大人香蕉在线| 人体精品一二三区| www.色视频| 国产精品私人影院| 欧美 国产 综合| 一区二区三区免费在线看| 在线观看不卡av| 久草视频在线观| 成人手机在线视频| 日韩精品一区二区三区电影| 日本成人福利| 日韩成人在线观看| 久久精品美女视频| 国产乱色国产精品免费视频| 亚洲成色www久久网站| 超碰超碰人人人人精品| 亚洲精品91美女久久久久久久| 99久久99久久精品国产| 免费在线成人网| 欧美日本韩国在线| 伊人久久国产| 日韩高清av在线| 91精品国产高潮对白| 国产福利91精品| 干日本少妇视频| 色狠狠一区二区三区| 亚洲欧洲午夜一线一品| 在线观看免费国产视频| 成人毛片在线观看| 成人一级生活片| 亚洲一区二区电影| 欧美激情aaaa| 亚洲第一色网站| 一级日本不卡的影视| 日本女人黄色片| 68国产成人综合久久精品| 国产欧美精品在线| 黄色网址在线免费| 日韩一区二区精品| 免费在线黄色片| 丁香桃色午夜亚洲一区二区三区| 日韩亚洲欧美一区二区| 日韩一区网站| 久久久视频精品| 天天摸天天碰天天爽天天弄| 午夜激情一区二区三区| 中文字幕影片免费在线观看| 国产精品一级| 日本不卡一区| 狠狠久久伊人中文字幕| 插插插亚洲综合网| 亚洲xxx在线| 精品久久久久久久久久久| 午夜久久久久久久| 首页国产欧美久久| 亚洲不卡中文字幕| 欧美成a人片在线观看久| 一区二区三区久久精品| 一二三四区在线| 亚洲精品一二三区| 插我舔内射18免费视频| 日日骚欧美日韩| 欧洲xxxxx| 欧美精品中文| 国产精品亚洲激情| 中文字幕在线播放网址| 亚洲国产精品yw在线观看| 日日摸天天添天天添破| 中文字幕在线一区二区三区| 91精品人妻一区二区三区蜜桃2| 亚洲国产高清一区| 日韩欧美99| 香蕉免费一区二区三区在线观看| 97在线免费观看| av在线播放免费| 欧美成人bangbros| 亚洲第一网站在线观看| 亚洲欧美乱综合| 无码人妻aⅴ一区二区三区 | 欧美性69xxxx肥| 亚洲天堂av中文字幕| 国产成+人+日韩+欧美+亚洲| 无码少妇一区二区三区芒果| 牛夜精品久久久久久久99黑人| 精品一区久久久| 国产在线一区不卡| 日本精品在线视频| 91麻豆国产福利在线观看宅福利| 亚洲精品一二区| 精品人妻一区二区三区麻豆91| 六月婷婷综合| 电影91久久久| 国内精品视频一区| 欧美jizz18性欧美| 日韩成人av一区| 午夜久久久久久噜噜噜噜| 色噜噜狠狠色综合中国| 久久精品视频8| 18涩涩午夜精品.www| 欧美精品黑人猛交高潮| 国产成人在线网站| 一女二男3p波多野结衣| 亚洲欧美日韩国产综合精品二区| 欧美少妇一区二区三区| 欧美综合久久| 免费观看成人高| 97品白浆高清久久久久久| 成人av资源在线播放| 亚洲高清黄色| 欧美在线视频一区二区| 草草影院在线| 欧美激情手机在线视频| 超碰在线最新| 日韩在线视频一区| 成人精品一区| 伊是香蕉大人久久| 黄色片免费在线| 日韩久久精品电影| 嫩草影院一区二区| 精品黑人一区二区三区久久| 国产人妻精品一区二区三| 欧美日韩激情一区| 中文字幕男人天堂| 欧美图片一区二区三区| 无码人妻熟妇av又粗又大| 色综合天天狠狠| 亚洲午夜18毛片在线看| 精品日韩美女的视频高清| 九九九国产视频| 午夜精品久久久久久久蜜桃app| 九九九免费视频| 一区二区三区在线视频观看58| 青花影视在线观看免费高清| 综合在线观看色| 九九热最新地址| 一个色综合网站| 久久久久亚洲av无码专区 | 蜜桃视频成人m3u8| 国产成人涩涩涩视频在线观看| 欧美magnet| 国产精品扒开腿做| 精品欧美日韩精品| 国产精品亚发布| 精品国产亚洲一区二区在线观看| 91在线免费观看网站| 久久综合给合| 国产日韩二区| 亚欧洲精品视频在线观看| 日韩国产高清一区| 日韩激情在线| 日韩精品福利片午夜免费观看| 亚洲国产美女| 成人午夜视频免费在线观看| 欧美a级理论片| 制服丝袜中文字幕第一页| 国产成人免费在线观看不卡| 少妇精品无码一区二区三区| 久久精品夜色噜噜亚洲aⅴ| 日日操免费视频| 一区二区三区四区在线免费观看| 日本一区二区网站| 色综合天天综合给合国产| 一炮成瘾1v1高h| 精品av久久707| 国产青青草在线| 波霸ol色综合久久| 波多一区二区| 国产精品久久久久久婷婷天堂| 中文幕av一区二区三区佐山爱| 91成人免费看| 猛男gaygay欧美视频| 四虎影院一区二区| 1024成人| 五月天婷婷亚洲| av中文字幕在线不卡| 网站永久看片免费| 亚洲丰满少妇videoshd| 日本成人一级片| 精品国产一区二区精华| 福利在线播放| 久久青草福利网站| 伦一区二区三区中文字幕v亚洲| http;//www.99re视频| 激情五月综合网| 国产高清av在线播放| 极品销魂美女一区二区三区| 日本少妇毛茸茸| 亚洲欧美日韩国产另类专区| 日韩电影在线观看一区二区| 欧美成人r级一区二区三区| 国产1区2区3区在线| 久久频这里精品99香蕉| 国产亚洲久久| 亚洲国产一区二区三区在线播| 在线成人www免费观看视频| 国产乱码一区二区三区四区| 久久综合色综合88| 国产极品在线播放| 91精品麻豆日日躁夜夜躁| 国产美女视频一区二区三区 | 亚洲女成人图区| 视频在线观看入口黄最新永久免费国产 | 一区不卡字幕| 久久精品麻豆| 在线精品一区二区三区| 亚洲免费视频中文字幕| 在线观看中文字幕av| 国产一区二区黑人欧美xxxx| free性m.freesex欧美| 亚洲最大的网站| 午夜片欧美伦| 国产高清视频网站| 国产视频视频一区| 国产精品免费精品一区| 亚洲精品98久久久久久中文字幕| 女同一区二区免费aⅴ| 亚洲bt天天射| 亚洲91视频| 九九九九九九九九| 亚洲欧洲精品一区二区精品久久久 | 蘑菇福利视频一区播放| 欧美久久久久久久久久久| 有坂深雪av一区二区精品| 国产精品天天操| 日韩一区二区三区国产| 久久婷婷五月综合色丁香| 天天久久人人| 美女一区二区久久| 黑人と日本人の交わりビデオ| 91国产丝袜在线播放| 国产尤物视频在线| 国产精品久久久久久久久借妻| 国产精品一区二区三区av麻| 无码人妻丰满熟妇区毛片| 国产亚洲精品超碰| 伊人久久久久久久久久久久| 国产午夜精品全部视频播放 | 欧美三级中文字幕在线观看| 国产精品二线| 国产免费一区二区三区在线能观看 | 国产偷国产偷亚洲高清人白洁| 国产成人一级片| 亚洲香蕉成人av网站在线观看 | 久久精品国产精品国产精品污| 亚洲激情在线| 91成人破解版| 欧美日韩dvd在线观看| 黄色av电影在线观看| 亚洲一区二区三区在线免费观看 | 国产真实乱子伦| 日本一区二区免费在线| 91久久久久久久久久久久| 欧美xxxx14xxxxx性爽| av不卡一区| 欧美三级午夜理伦三级| 国产精品污网站| a级片在线免费看| 国内精久久久久久久久久人| 日韩精品免费一区二区三区竹菊 | 中文字幕亚洲无线码在线一区| 精品国产黄a∨片高清在线| 最新av网址在线观看| 波多野结衣中文字幕一区二区三区 | 丰满诱人av在线播放| 久久99精品久久久久久三级| 日韩精品欧美精品| 青娱乐免费在线视频| 亚洲精品国产精品国产自| 国产韩日精品| 国产亚洲黄色片| 国产亚洲婷婷免费| 亚洲第一色网站| 国产成人精品在线播放| 欧美一区不卡| 五月天精品视频| 日韩欧美一区二区三区在线| 成人免费看黄| 狠狠干视频网站| 国产午夜亚洲精品理论片色戒 | 亚洲美女av黄| 日韩精品视频在线看| 日韩久久一级片| 亚洲黄色小视频| 国产粉嫩一区二区三区在线观看 | 黄大色黄女片18第一次| 亚洲国产成人91porn| 性开放的欧美大片|