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

Node.js后端框架設(shè)計(jì)構(gòu)想

開發(fā) 前端
我打算把我的后端的框架定位為建站框架,本文是我的一些思路與初步實(shí)踐。如果園子里有做過后端框架的高手(不限語言),也請指教一下。以下是大概的流程。

后端的核心文件mass.js包含批量創(chuàng)建與刪除文件夾,MD5加密,類型識(shí)別與模塊加載等功能?,F(xiàn)在網(wǎng)站名與網(wǎng)站的路徑也還是混淆在里面,以后會(huì)獨(dú)立到一個(gè)配置文件中。只要運(yùn)行node mass.js這命令就立即從模板文件中構(gòu)建一個(gè)樣板網(wǎng)站出來。下面就是它建站的最主要代碼:

  1. //--------開始創(chuàng)建網(wǎng)站---------  
  2.  //你想建立的網(wǎng)站的名字(請修正這里)  
  3.  mass.appname = "jslouvre";  
  4.  //在哪個(gè)目錄下建立網(wǎng)站(請修正這里)  
  5.  mass.approot = process.cwd();  
  6.  //用于修正路徑的方法,可以傳N個(gè)參數(shù)  
  7.  mass.adjustPath = function(){  
  8.      [].unshift.call(arguments,mass.approot, mass.appname);  
  9.      return require("path").join.apply(null,arguments)  
  10.  }  
  11.  var dir = mass.adjustPath("")  
  12.  //  mass.rmdirSync(dir);//......  
  13.  mass.require("http,fs,path,scaffold,intercepters",function(http,fs,path,scaffold,intercepters){  
  14.      mass.log("<code style="color:blue;">=========================</code>",true)  
  15.      if(path.existsSync(dir)){  
  16.          mass.log("<code style="color:red">此網(wǎng)站已存在</code>",true);  
  17.      }else{  
  18.          fs.mkdir(dir,0755)  
  19.          mass.log("<code style="color:green">開始利用內(nèi)部模板建立您的網(wǎng)站……</code>",true);  
  20.      }  
  21.      global.mapper = scaffold(dir);//取得路由系統(tǒng)  
  22.      http.createServer(function(req, res) {  
  23.          var arr = intercepters.concat();  
  24.          //有關(guān)HTTP狀態(tài)的解釋 http://www.cnblogs.com/rubylouvre/archive/2011/05/18/2049989.html  
  25.          req.on("err500",function(err){  
  26.              res.writeHead(500, {  
  27.                  "Content-Type": "text/html"  
  28.              });  
  29.              var html = fs.readFileSync(mass.adjustPath("public/500.html"))  
  30.              var arr = []  
  31.              for(var i in err){  
  32.                  arr.push("<li>"+i+"  :   "+err[i]+" </li>")  
  33.              }  
  34.              res.write((html+"").replace("{{url}}",arr.join("")));  
  35.              res.end();  
  36.          });  
  37.          req.on("next_intercepter",function(){  
  38.              try{  
  39.                  var next = arr.shift();  
  40.                  next && next.apply(null,arguments)  
  41.              }catch(err){  
  42.                  req.emit("err500",err);  
  43.              }  
  44.          });  
  45.          req.emit("next_intercepter",req, res);  
  46.      }).listen(8888);  
  47.     console.log("start server in 8888 port")  
  48.  }); 

只要運(yùn)行mass.js,它會(huì)根據(jù)appname與approot判定目標(biāo)路徑是否存在此網(wǎng)站,沒有就創(chuàng)建相應(yīng)文件夾 fs.mkdir(dir,0755)。但更多的文件夾與文件是由scaffold.js完成的。scaffold里面?zhèn)€文件夾列表,用于讓程序從templates把相應(yīng)的文件夾拷貝到網(wǎng)站的路徑下,并建立505.html, 404.html, favicon.ico, routes.js等文件。其中最重頭的是routes,它是用來定義路由規(guī)則。

  1. //routes.js  
  2. //最重要的部分,根據(jù)它生成controller, action, model, views  
  3.    
  4. mass.define("routes",function(){  
  5.     return function(map){  
  6.         //方法路由  
  7.         //        map.get('/','site#index');  
  8.         //        map.get('/get_comments/:post_id','site#get_comments');  
  9.         //        map.post('/add_comment','site#add_comment');  
  10.         //        //資源路由  
  11.         //        map.resources('posts');  
  12.         //        map.resources('users');  
  13.         //        map.get('/view/:post_name','site#view_post');  
  14.         //        map.get('/rss','site#rss');  
  15.    
  16.         // map.resources('posts', {path: 'articles', as: 'stories'});  
  17.         //嵌套路由  
  18.         //        map.resources('posts', function (post) {  
  19.         //            post.resources('users');  
  20.         //        });  
  21.         //命名空間路由  
  22.         map.namespace("tests",function(tests){  
  23.             tests.resources('comments');  
  24.         })  
  25.     //        map.resources('users', {  
  26.     //            only: ['index', 'show']  
  27.     //        });  
  28.     //  
  29.     //        map.resources('users', {  
  30.     //            except: ['create', 'destroy']  
  31.     //        });  
  32.     //        map.resources('users', function (user) {  
  33.     //            user.get('avatar', 'users#avatar');  
  34.     //        });  
  35.     //        map.root("home#index")  
  36.     }  
  37. }); 

上面就是routes.js的所有內(nèi)容。允許建立五種路由:根路由,資源路由,方法路由(get,delete,put,post),命名空間路由,嵌套路由。其實(shí)它們統(tǒng)統(tǒng)都會(huì)歸化為資源路由,每個(gè)URL都對應(yīng)一個(gè)控制器與其下的action。它會(huì)調(diào)用router.js,讓里面的Router實(shí)例mapper調(diào)用router.js里面的內(nèi)容,然后返回mapper。

  1. //scaffold.js  
  2.         var routes_url = mass.adjustPath('config/routes.js'),  
  3.         action_url = "app/controllers/",  
  4.         view_url = "app/views/",  
  5.         mapper = new Router  
  6.    
  7.         mass.require("routes("+routes_url+")",function(fn){//讀取routes.js配置文件  
  8.             fn(mapper)  
  9.         });  
  10.  //這里省掉,一會(huì)兒解說  
  11.    
  12.         return mapper; 

Router實(shí)例mapper在routes運(yùn)行完畢后,那么它的幾個(gè)屬性就會(huì)添加了N多成員與元素,我們再利用它來進(jìn)一步構(gòu)建我們的控制器,視圖與模型。

  1. //如 this.controllers = {};現(xiàn)在變?yōu)? 
  2. { comments:  
  3.    { actions: [ 'index', 'create', 'new', 'edit', 'destroy', 'update', 'show' ],  
  4.    
  5.      views: [ 'index', 'new', 'edit', 'show' ],  
  6.      namespace: 'tests' } }  
  7.    
  8. //   this.GET = [];現(xiàn)在變?yōu)? 
  9. [ { controller: 'comments',  
  10.     action: 'index',  
  11.     method: 'GET',  
  12.     namespace: '/tests/',  
  13.     url: '/tests/comments.:format?',  
  14.     helper: 'tests_comments',  
  15.     matcher: /^\/tests\/comments$/i },  
  16.   { controller: 'comments',  
  17.     action: 'new',  
  18.     method: 'GET',  
  19.     namespace: '/tests/',  
  20.     url: '/tests/comments/new.:format?',  
  21.     helper: 'new_tests_comments',  
  22.     matcher: /^\/tests\/comments\/new$/i },  
  23.   { controller: 'comments',  
  24.     action: 'edit',  
  25.     method: 'GET',  
  26.     namespace: '/tests/',  
  27.     url: '/tests/comments/:id/edit.:format?',  
  28.     helper: 'edit_tests_comment',  
  29.     matcher: /^\/tests\/comments\/\d+\/edit$/i },  
  30.   { controller: 'comments',  
  31.     action: 'show',  
  32.     method: 'GET',  
  33.     namespace: '/tests/',  
  34.     url: '/tests/comments/:id.:format?',  
  35.     helper: 'tests_comment',  
  36.     matcher: /^\/tests\/comments\/\d+$/i } ] 

mapper有四個(gè)數(shù)組屬性,GET,POST,DELETE,PUT,我稱之為匹配棧,這些數(shù)組的元素都是一個(gè)個(gè)對象,對象都有一個(gè)matcher的正則屬性,就是用來匹配請求過來的URL的pathname屬性,當(dāng)然首先我們先取得其method,讓相應(yīng)的匹配棧去處理它。

現(xiàn)在手腳架scaffold.js還很簡鄙,以后它會(huì)結(jié)合熱部署功能,當(dāng)用戶修改routes.js或其他配置文件時(shí),它將會(huì)自動(dòng)生成更多的視圖與控制器等等。

然后我們就啟動(dòng)服務(wù)器了,由于req是EventEmitter的實(shí)例,因此我們可以隨意在上面綁定自定義事件,這里有兩個(gè)事件next_intercepter與err500。err500就不用說了,next_intercepter是用來啟動(dòng)攔截器群集。這里我們只需要啟動(dòng)***個(gè)。它在回調(diào)中會(huì)自動(dòng)啟動(dòng)下一個(gè)。這些攔截器是由intercepters.js 統(tǒng)一加載的。

  1. //intercepters.js  
  2. mass.intercepter = function(fn){//攔截器的外殼  
  3.     return function(req, res, err){  
  4.         if(err ){  
  5.             req.emit("next_intercepter", req, res, err);  
  6.         }else if(fn(req,res) === true){  
  7.             req.emit("next_intercepter", req, res)  
  8.         }  
  9.     }  
  10. }  
  11. var deps = ["mime","postData","query","methodOverride","json","favicon","matcher","handle404"];//"more",  
  12. mass.define("intercepters", deps.map(function(str){  
  13.     return "intercepters/"+str  
  14. }).join(","), function(){  
  15.     console.log("取得一系列欄截器");  
  16.     return [].slice.call(arguments,0)  
  17. }); 

每個(gè)攔截器都會(huì)對原始數(shù)據(jù)進(jìn)行處理,并決定是繼續(xù)啟用下一個(gè)攔截器。比如mime攔截器:

  1. mass.define("intercepters/mime",function(){  
  2.     console.log("本模塊用于取得MIME,并作為request.mime而存在");  
  3.     return mass.intercepter(function(req, res){  
  4.         console.log("進(jìn)入MIME回調(diào)");  
  5.         var str = req.headers['content-type'] || '';  
  6.         req.mime = str.split(';')[0];  
  7.         return true;  
  8.     })  
  9. }) 

#p#

postData攔截器

  1. mass.define("intercepters/postData","querystring",function(qs){  
  2.     console.log("本模塊用于取得POST請求過來的數(shù)據(jù),并作為request.body而存在");  
  3.     return mass.intercepter(function(req,res){  
  4.         console.log("進(jìn)入postData回調(diào)");  
  5.         reqreq.body = req.body || {};  
  6.         if ( req._body ||  /GET|HEAD/.test(req.method) || 'application/x-www-form-urlencoded' !== req.mime ){  
  7.             return true;  
  8.         }  
  9.         var buf = '';  
  10.         req.setEncoding('utf8');  
  11.         function buildBuffer(chunk){  
  12.             buf += chunk  
  13.         }  
  14.         req.on('data', buildBuffer);  
  15.         req.once('end',function(){  
  16.             try {  
  17.                 if(buf != ""){  
  18.                     req.body = qs.parse(buf);  
  19.                     req._body = true;  
  20.                 }  
  21.                 req.emit("next_intercepter",req,res)  
  22.             } catch (err){  
  23.                 req.emit("next_intercepter",req,res,err)  
  24.             }finally{  
  25.                 req.removeListener("data",buildBuffer)  
  26.             }  
  27.         })  
  28.     });  
  29. }); 

query攔截器

  1. mass.define("intercepters/query","querystring,url",function(qs,URL){  
  2.     console.log("本模塊用于取得URL的參數(shù)并轉(zhuǎn)為一個(gè)對象,作為request.query而存在");  
  3.     return mass.intercepter(function(req, res){  
  4.         req.query = ~req.url.indexOf('?')  
  5.         ? qs.parse(URL.parse(req.url).query)  
  6.         : {};  
  7.         return true;  
  8.     })  
  9. }) 

methodOverride攔截器

  1. mass.define("intercepters/methodOverride",function(){  
  2.     console.log("本模塊用于校正method屬性");  
  3.     var methods = {  
  4.         "PUT":"PUT",  
  5.         "DELETE":"DELETE"  
  6.     },  
  7.     method = mass.configs.method || "_method";  
  8.     return mass.intercepter(function(req, res){  
  9.         reqreq.originalMethod = req.method;  
  10.         var defaultMethod = req.method === "HEAD" ? "GET" : req.method;  
  11.         var _method = req.body ? req.body[method] : req.headers['x-http-method-override']  
  12.         _method = (_method || "").toUpperCase();  
  13.         req.method = methods[_method] || defaultMethod;  
  14.         if(req.body){  
  15.             delete req.body[method];  
  16.         }  
  17.         return true;  
  18.     })  
  19. }) 

json攔截器

  1. mass.define("intercepters/json",function(){  
  2.     console.log("本模塊處理前端發(fā)過來的JSON數(shù)據(jù)");  
  3.     return mass.intercepter(function(req, res, err){  
  4.         reqreq.body = req.body || {};  
  5.         if (req._body  || 'GET' == req.method || !~req.mime.indexOf("json")){  
  6.             console.log("進(jìn)入json回調(diào)")  
  7.             return true;  
  8.         }else{  
  9.             var buf = '';  
  10.             req.setEncoding('utf8');  
  11.             function buildBuffer(chunk){  
  12.                 buf += chunk;  
  13.             }  
  14.             req.on('data', buildBuffer);  
  15.             req.once('end', function(){  
  16.                 try {  
  17.                     req.body = JSON.parse(buf);  
  18.                     req._body = true;  
  19.                     req.emit("next_intercepter",req,res);  
  20.                 } catch (err){  
  21.                     err.status = 400;  
  22.                     req.emit("next_intercepter",req,res,err);  
  23.                 }finally{  
  24.                     req.removeListener("data",buildBuffer);  
  25.                 }  
  26.             });  
  27.         }  
  28.     })  
  29. }) 

而在這么多攔截器中,最重要的是matcher攔截器,它進(jìn)入框架MVC系統(tǒng)的入口。把原始請求的pathname取出來,然后通過正則匹配它,只要一個(gè)符合就停下來,然后加載對應(yīng)的控制器文件,調(diào)用相應(yīng)的action處理請求!

  1. mass.define("intercepters/matcher","url",function(URL){  
  2.     console.log("用于匹配請求過來的回調(diào)")  
  3.     return mass.intercepter(function(req,res){  
  4.         console.log("進(jìn)入matcher回調(diào)");  
  5.         var pathname = URL.parse(req.url).pathname, is404 = true,method = req.method, arr = mapper[method];  
  6.         for(var i =0, obj; obj = arr[i++];){  
  7.             if(obj.matcher.test(pathname)){  
  8.                 is404 = false 
  9.                 var url = mass.adjustPath("app/controllers/",obj.namespace, obj.controller+"_controller.js")  
  10.                 mass.require(obj.controller+"_controller("+url +")",function(object){  
  11.                     object[obj.action](req,res);//進(jìn)入控制器的action!!!  
  12.                     console.log(obj.action)  
  13.                 },function(){  
  14.                     var err = new Error;  
  15.                     err.statusCode = 404 
  16.                     req.emit("next_intercepter",req,res,err);  
  17.                 })  
  18.                 break;  
  19.             }  
  20.         }  
  21.         if(is404){  
  22.             var err = new Error;  
  23.             err.statusCode = 404 
  24.             req.emit("next_intercepter",req,res,err);  
  25.         }  
  26.     })  
  27. }) 

***殿后的是handle404攔截器:

  1. mass.define("intercepters/handle404","fs,path",function(fs){  
  2.     console.log("本模塊用于處理404錯(cuò)誤");  
  3.     return function(req, res, err){  
  4.         console.log("進(jìn)入handle404回調(diào)");  
  5.         var accept = req.headers.accept || '';  
  6.         if (~accept.indexOf('html')) {  
  7.             res.writeHead(404, {  
  8.                 "Content-Type": "text/html"  
  9.             });  
  10.             var html = fs.readFileSync(mass.adjustPath("public/404.html"))  
  11.             res.write((html+"").replace("{{url}}",req.url));  
  12.             res.end();  
  13.         } else if (~accept.indexOf('json')) {//json  
  14.             var error = {  
  15.                 message: err.message,   
  16.                 stack: err.stack  
  17.             };  
  18.             for (var prop in err) error[prop] = err[prop];  
  19.             var json = JSON.stringify({  
  20.                 error: error  
  21.             });  
  22.             res.setHeader('Content-Type', 'application/json');  
  23.             res.end(json);  
  24.         // plain text  
  25.         } else {  
  26.             res.writeHead(res.statusCode, {  
  27.                 'Content-Type': 'text/plain'  
  28.             });  
  29.             res.end(err.stack);  
  30.         }  
  31.     }  
  32. }) 

再回過頭來看控制器部分,從模板中生成的controller非常簡單:

  1. mass.define("comments_controller",function(){  
  2.     return {  
  3.         "index":function(){},  
  4.         "create":function(){},  
  5.         "new":function(){},  
  6.         "edit":function(){},  
  7.         "destroy":function(){},  
  8.         "update":function(){},  
  9.         "show":function(){}  
  10.     }  
  11.  }); 

因此你需要?jiǎng)邮指牡狡淇捎?,?/p>

  1. "show":function(req,res){  
  2.     
  3.     res.writeHead(200, {  
  4.         "Content-Type": "text/html"  
  5.     });  
  6.     var html = fs.readFileSync(mass.adjustPath("app/views/tests/show.html"))  
  7.     res.write(html);  
  8.     res.end();  
  9.                

以后會(huì)判定action的結(jié)果自動(dòng)調(diào)用視圖。

當(dāng)然現(xiàn)在框架還很簡單,只用了半天時(shí)間而已。它必須支持ORM與靜態(tài)文件緩存才行。此外還有cookie,session等支持,這些做成一個(gè)攔截器就行了。

總結(jié)如下:

◆ 判定網(wǎng)站是否存在,沒有通過手腳架構(gòu)建一個(gè)

◆ 讀取routes等配置文件,生成MVC系統(tǒng)所需要的控制器,視圖與模型。

◆ 通過熱部署功能,監(jiān)視用戶對配置文件的修改,進(jìn)一步智能生成需要控制器,視圖與模型。

◆ 通過一系列攔截器處理請來,直到matcher攔截器里面進(jìn)入MVC系統(tǒng),這時(shí)通過模型操作數(shù)據(jù)庫,渲染頁面。攔截器群集的應(yīng)用大大提高應(yīng)用的伸縮性?,F(xiàn)在還沒有來得及得node.js的多線程,可能這里面能發(fā)掘出許多好東西呢。

原文:http://www.cnblogs.com/rubylouvre/archive/2011/12/13/2286280.html

【編輯推薦】

  1. 用Web socket和Node.js實(shí)現(xiàn)HTML 5畫布的實(shí)時(shí)繪圖
  2. 走近Node.js的異步代碼設(shè)計(jì)
  3. 使用Node.js開發(fā)多人玩的HTML 5游戲
  4. Node.js提速指南
  5. Node.js初體驗(yàn)
責(zé)任編輯:陳貽新 來源: 司徒正美的博客
相關(guān)推薦

2020-04-20 16:00:05

Node.js框架JavaScript

2020-05-29 15:33:28

Node.js框架JavaScript

2019-08-29 10:58:02

Web 開發(fā)框架

2024-03-15 09:26:59

2020-12-28 19:13:11

Node.js后端框架

2012-03-07 14:32:41

Node.js

2014-10-30 10:28:55

Node.js

2013-11-01 09:34:56

Node.js技術(shù)

2015-03-10 10:59:18

Node.js開發(fā)指南基礎(chǔ)介紹

2011-12-23 13:58:57

node.js

2020-07-15 08:06:04

Node.js框架開發(fā)

2022-10-18 18:43:40

Node.js低代碼

2011-11-01 10:30:36

Node.js

2011-09-08 13:46:14

node.js

2011-09-02 14:47:48

Node

2011-09-09 14:23:13

Node.js

2022-07-14 08:16:24

Node.js后端自動(dòng)化測試

2012-10-24 14:56:30

IBMdw

2011-11-10 08:55:00

Node.js

2021-01-11 09:00:00

開發(fā)Node.js后端
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

国产日本精品视频| 无码一区二区三区在线| 黄色影院在线看| 成人涩涩免费视频| 欧洲一区二区视频| 亚洲国产精品一区二区久久hs| 国产一区二区三区免费观看在线| 亚洲国产精品一区二区久久| 欧美乱偷一区二区三区在线| 国产乱人乱偷精品视频a人人澡| 在线欧美亚洲| 在线成人中文字幕| 国产综合内射日韩久| 欧美free嫩15| 午夜天堂影视香蕉久久| 在线视频欧美一区| 青青青手机在线视频观看| 国产一区在线观看视频| 热99精品里视频精品| 欧美日韩午夜视频| 国产成人1区| 亚洲黄色av女优在线观看| 免费一区二区三区在线观看| 国产h片在线观看| 亚洲欧美另类久久久精品| 久久天堂国产精品| 性生活视频软件| 九一九一国产精品| 国产精品pans私拍| 日韩精品久久久久久久| 亚洲激情中文| 日韩视频在线免费观看| 免费人成又黄又爽又色| 蜜桃一区av| 日韩一区二区电影网| 日韩在线不卡一区| 亚洲天堂一区二区| 欧美日韩国产综合视频在线观看中文| 成人在线免费观看网址| a黄色在线观看| 久久精品亚洲乱码伦伦中文| 国产亚洲一区在线播放 | 欧美老女人第四色| 天天爽天天爽夜夜爽| 伊人色综合一区二区三区影院视频| 亚洲激情图片qvod| 欧美aaa在线观看| 免费av在线| 中文字幕第一区综合| 日本高清不卡三区| 黄色av免费在线观看| 91麻豆成人久久精品二区三区| 国外成人在线视频网站| 亚洲第一成人av| 国产成人精品三级| 国产精品久久久久久免费观看| 国产高清免费av| 国产宾馆实践打屁股91| 国产精品日韩二区| 日韩性xxxx| caoporm超碰国产精品| 国产91视觉| 天天操天天操天天操| 97久久精品人人做人人爽50路| 国产女主播一区二区| 天堂在线视频免费观看| www久久精品| 日韩在线国产| gogogo高清在线观看免费完整版| 中文一区二区完整视频在线观看| 亚洲欧美日韩另类精品一区二区三区| 秋霞午夜理伦电影在线观看| 亚洲免费大片在线观看| 97碰在线视频| 亚洲最大网站| 欧美日本一区二区在线观看| 欧美国产日韩在线视频| 国内精品偷拍| 亚洲四色影视在线观看| 香蕉久久久久久久| 午夜日韩视频| 欧美亚洲成人精品| 伊人网中文字幕| 国产精品一二三在| 裸模一区二区三区免费| 1769视频在线播放免费观看| 亚洲另类春色国产| 国产极品粉嫩福利姬萌白酱 | 午夜精品福利一区二区蜜股av| 国产一区二区在线视频播放| 国产麻豆一区| 亚洲高清一二三区| 国产三级黄色片| 亚洲视频福利| 国产精品丝袜高跟| 黄色小视频免费观看| 国产喂奶挤奶一区二区三区| 久久久久久久久影视| 99色在线观看| 欧美乱妇一区二区三区不卡视频| 91精品啪在线观看国产| 欧美一区二区三| 欧美华人在线视频| 中文字幕第三页| a在线播放不卡| 手机成人av在线| 涩涩涩在线视频| 日韩视频一区二区三区在线播放| 波多野结衣a v在线| 亚洲电影影音先锋| 国产黑人绿帽在线第一区| 午夜老司机福利| 中文字幕国产一区| 国产xxxxx在线观看| 91成人精品在线| 色系列之999| 欧美性猛交bbbbb精品| 国产精品一区二区久久不卡| 青青草原成人| 3344国产永久在线观看视频| 91精品国产综合久久久久久| 三级网站在线免费观看| 亚洲国产日本| 91免费观看| 日本在线免费网| 色综合激情久久| 性久久久久久久久久久| 影视一区二区| 91在线免费网站| 免费黄色网址在线观看| 91极品美女在线| 丰满少妇在线观看资源站| 欧美视频官网| 亚洲伊人成综合成人网| 青青青青在线| 欧美日韩综合一区| 国产精品国产三级国产专业不| 一本色道久久| 国产一区在线观| 波多野结衣在线观看| 日韩精品中文字幕在线不卡尤物| 久久爱一区二区| 国模一区二区三区白浆| 中文视频一区视频二区视频三区 | 日本乱人伦一区| 天天插天天射天天干| 最新日韩欧美| 久久99精品久久久久久久久久| av日韩中文| 亚洲国产欧美一区二区丝袜黑人 | 国内精品伊人久久久久av影院 | 久久99精品久久久久久野外| 欧美日韩另类一区| 国产人与禽zoz0性伦| 美女看a上一区| 在线国产精品网| **日韩最新| 久久的精品视频| 亚洲av综合色区无码一二三区| 一区二区免费在线| 国产一线在线观看| 亚洲精选91| 日本一区美女| 亚洲伦理一区二区| 欧美日本亚洲视频| 同心难改在线观看| 黄色精品在线看| 久久久视频6r| 久久99精品久久久| 国产乱子伦精品无码专区| 粉嫩av一区二区| 2019中文字幕免费视频| 国内av一区二区三区| 欧美日韩免费在线视频| 日本少妇高清视频| 99久久伊人精品| 男女无套免费视频网站动漫| 天天综合网91| 国产女人水真多18毛片18精品| 欧美亚洲韩国| 久久天天躁夜夜躁狠狠躁2022| 亚洲成人77777| 欧美性猛交xxxx免费看久久久| 青青草自拍偷拍| 国产成人免费在线| 日本一本二本在线观看| 久久久久久美女精品 | 日韩精品系列| 欧美麻豆精品久久久久久| 国产真实夫妇交换视频| 国产欧美日本一区视频| 日本wwww色| 青青草国产精品亚洲专区无| 成年丰满熟妇午夜免费视频| 视频福利一区| 亚洲综合日韩中文字幕v在线| 久草免费在线视频| 日韩视频永久免费观看| 五月婷婷久久久| 91精品欧美一区二区三区综合在| 永久免费看片在线播放| 中文字幕中文字幕一区| 精品国产av色一区二区深夜久久 | av在线免费观看网| 亚洲精品在线三区| 夜夜狠狠擅视频| 狠狠躁天天躁日日躁欧美| 手机在线免费看毛片| 国产午夜亚洲精品羞羞网站| 国产又粗又猛又爽又黄| 日本va欧美va精品发布| 少妇无码av无码专区在线观看| 99re6这里只有精品| 免费精品视频一区二区三区| 亚洲精品午夜| 成人h视频在线| 澳门av一区二区三区| 91国产精品视频在线| 国产精品刘玥久久一区| 国产亚洲欧美一区| 五月天婷婷视频| 欧美va亚洲va香蕉在线| 91九色蝌蚪91por成人| 色老综合老女人久久久| 好吊操这里只有精品| 亚洲曰韩产成在线| 翔田千里88av中文字幕| 最好看的中文字幕久久| 一级黄色片网址| 久久精品夜夜夜夜久久| 麻豆国产精品一区| 波多野洁衣一区| 好吊操视频这里只有精品| 国产乱码精品一区二区三区五月婷| 中文字幕第21页| 日韩成人dvd| 亚洲人成无码www久久久| 亚洲综合三区| 自慰无码一区二区三区| 日韩一级在线| 国产男女免费视频| 99成人精品| 国产免费黄视频| 国产精品亚洲产品| 久久久999视频| 久久久久久久高潮| 国产成人久久777777| 午夜在线视频观看日韩17c| 国模无码视频一区二区三区| 亚洲在线观看| 超碰影院在线观看| 青草国产精品久久久久久| 亚洲老女人av| 精品亚洲成av人在线观看| 在线a免费观看| 国产成人精品一区二区三区四区 | 国产欧美熟妇另类久久久| 91精品久久久久久久久99蜜臂| 国产精品嫩草影院桃色| 91精品国产91久久久久久最新毛片| 国产乱码久久久| 欧美va亚洲va| 色资源在线观看| 中文字幕av一区二区三区谷原希美 | 亚洲国产欧美日本视频| 国产91色在线| av日韩一区| 国产精品日韩欧美一区二区| 亚洲三级网页| 中文字幕日韩精品一区二区| 欧美a级片一区| 亚洲中文字幕无码中文字| 日韩高清不卡一区二区三区| 天天综合天天添夜夜添狠狠添| 国产成人亚洲精品狼色在线| 800av在线播放| 欧美极品xxx| 99精品久久久久| 精品日本美女福利在线观看| 国产在线一级片| 日韩欧美电影一二三| 青青草免费在线视频| 日韩在线观看免费全| 大香伊人久久| 国产精品免费视频xxxx| 中文字幕一区日韩精品| 欧美三日本三级少妇三99| 久久久久久久久久久妇女 | 亚洲人成午夜免电影费观看| 国产日韩中文字幕| 欧美日韩大片免费观看| 一区二区在线高清视频| 极品尤物久久久av免费看| 男女男精品视频站| 岛国精品在线播放| 国产一区二区三区四区在线| 亚洲va欧美va人人爽午夜| 伊人久久亚洲综合| 亚洲精品一区中文| 在线āv视频| 国产精品嫩草视频| 美日韩黄色大片| 99久热在线精品视频| 日韩va欧美va亚洲va久久| 国产成人精品一区二区三区在线观看| 国产肉丝袜一区二区| 精品无码久久久久久久久| 欧美日韩亚洲另类| 欧洲综合视频| 高清一区二区三区日本久| 9999精品免费视频| 日韩一区二区三区高清| 亚洲制服av| www.啪啪.com| 亚洲在线观看免费| av无码精品一区二区三区宅噜噜| 国产午夜精品一区二区三区| 国产一二三在线| av资源站久久亚洲| 亚洲国产日韩欧美在线| 日日干夜夜操s8| 国产欧美精品一区二区三区四区 | 日韩精品一区二区三区老鸭窝| 97超碰人人在线| 国产精品扒开腿爽爽爽视频| 鲁大师精品99久久久| 9色porny| 国产成人免费av在线| 无码黑人精品一区二区| 欧美日韩一区二区三区四区| 邻居大乳一区二区三区| 4444欧美成人kkkk| 日韩av网址大全| www.av毛片| av男人天堂一区| 久草精品视频在线观看| 精品免费日韩av| 久久不射影院| 国产精品区一区二区三含羞草| 国产一区视频在线观看免费| 黑人巨大猛交丰满少妇| 伊人色综合久久天天| 国产白浆在线观看| 九九热视频这里只有精品| 麻豆一区在线| 亚洲精品久久久久久久蜜桃臀| 国产成人在线免费| 久久高清无码视频| 337p日本欧洲亚洲大胆色噜噜| 久久青青色综合| 国产一区二区自拍| 亚洲综合国产| 在线观看国产精品一区| 欧美日韩的一区二区| 精品孕妇一区二区三区| 亚洲一区二区中文| 亚洲一级二级| 3d动漫精品啪啪一区二区下载 | 中文字幕在线观看第三页| 中文字幕的久久| a在线观看视频| 久久久久久国产精品三级玉女聊斋| 9l亚洲国产成人精品一区二三| 日韩五码在线观看| 久久综合九色综合97_久久久| 无码人妻精品一区二区蜜桃色欲 | 日韩欧美一二三区| 99热99re6国产在线播放| 久久精品国产99精品国产亚洲性色| 久久av在线| 艳妇荡乳欲伦69影片| 欧美刺激脚交jootjob| 国产美女精品写真福利视频| 日本一区网站| 国产成人鲁色资源国产91色综| 自拍偷拍欧美亚洲| 中文字幕国内精品| 成人性生交大片免费看96| 偷偷要91色婷婷| 亚洲成人黄色av| 欧美一区二区三区视频在线 | 清纯唯美亚洲激情| 久久国产成人精品| 美女扒开腿免费视频| 色婷婷激情一区二区三区| 成人在线网址| 欧美精品二区三区四区免费看视频| 另类中文字幕网| 日韩乱码一区二区| 日韩在线观看高清| 欧美美女在线直播| 污视频在线观看免费网站| 富二代精品短视频| 最新超碰在线| 日韩av电影免费在线观看| 国产成人自拍网| 国产又粗又猛又爽又| 欧美激情视频一区| 日韩精品2区| 久久久亚洲av波多野结衣|