日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

聊聊毕业设计系列 --- 系统实现

發(fā)布時間:2023/12/19 windows 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 聊聊毕业设计系列 --- 系统实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

效果展示

github

moment-server github地址

moment github地址

moment-manage github地址

articles

聊聊畢業(yè)設(shè)計系列 --- 項目介紹

聊聊畢業(yè)設(shè)計系列 --- 系統(tǒng)實現(xiàn)

前言

在上一篇文章中,主要是對項目做了介紹,并且對系統(tǒng)分析和系統(tǒng)設(shè)計做了大概的介紹。那么接下來這篇文章會對系統(tǒng)的實現(xiàn)做介紹,主要是選擇一些比較主要的模塊或者說可拿出來與大家分享的模塊。好了,接入正題吧~~

MongoDB

服務(wù)端這邊使用的是Express框架,數(shù)據(jù)庫使用的是MongoDB,通過Mongoose模塊來操作數(shù)據(jù)庫。這邊主要是想下對MongoDB做個介紹,當(dāng)然看官了解的話直接往下劃~~

在項目開始前要確保電腦是否安裝mongoDB,下載點我,圖像化工具Robo 3T 點我,下載好具體怎么配置還請問度娘或Google吧,本文不做介紹了哈。注意:安裝完mongoDB的時候進(jìn)行項目時要把lib目錄下的mongod服務(wù)器打開哈~~

MongoDB 是一個基于分布式文件存儲的數(shù)據(jù)庫,是一個介于關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫之間的開源產(chǎn)品,它是功能最為豐富的非關(guān)系型數(shù)據(jù)庫,也是最像關(guān)系型數(shù)據(jù)庫的。但是和關(guān)系型數(shù)據(jù)庫不同,MongoDB沒有表和行的概念,而是一個面向集合、文檔的數(shù)據(jù)庫。其中的文檔是一個鍵值對,采用BSON(Binary Serialized Document Format),BSON是一種類似于JSON的二進(jìn)制形式的存儲格式,并且BSON具有表示數(shù)據(jù)類型的擴(kuò)展,因此支持的數(shù)據(jù)非常豐富。MongoDB有兩個很重要的數(shù)據(jù)類型就是內(nèi)嵌文檔和數(shù)組,而且在數(shù)組內(nèi)可以嵌入其他文檔,這樣一條記錄就能表示非常復(fù)雜的關(guān)系。

Mongoose是在node.js異步環(huán)境下對MongoDB進(jìn)行簡便操作的對象模型工具,能從數(shù)據(jù)庫提取任何信息,可以用面向?qū)ο蟮姆椒▉碜x寫數(shù)據(jù),從而使操作MongoDB數(shù)據(jù)庫非常便捷。Mongoose中有三個非常重要的概念,便是Schema(模式),Model(模型),Entity(實體)。

  • Schema: 一種以文件形式存儲的數(shù)據(jù)庫模型骨架,不具備數(shù)據(jù)庫的操作能力,創(chuàng)建它的過程如同關(guān)系型數(shù)據(jù)庫建表的過程,如下:
  • //Schema const mongoose = require('mongoose'); const Schema = mongoose.Schema;const UserSchema = new Schema({token: String,is_banned: {type: Boolean, default: false}, //是否禁言enable: { type: Boolean, default: true }, //用戶是否有效is_actived: {type: Boolean, default: false}, //郵件激活username: String,password: String,email: String, //email唯一性code: String,email_time: {type: Date},phone: {type: String},description: { type: String, default: "這個人很懶,什么都沒有留下..." },avatar: { type: String, default: "http://p89inamdb.bkt.clouddn.com/default_avatar.png" },bg_url: { type: String, default: "http://p89inamdb.bkt.clouddn.com/FkagpurBWZjB98lDrpSrCL8zeaTU"},ip: String,ip_location: { type: Object },agent: { type: String }, // 用戶ualast_login_time: { type: Date },..... });
  • Model: 由Schema發(fā)布生成的模型,具有抽象屬性和行為的數(shù)據(jù)庫操作對象
  • //生成一個具體User的model并導(dǎo)出 const User = mongoose.model("User", UserSchema); //第一個參數(shù)是集合名,在數(shù)據(jù)庫中會把Model名字字母全部變小寫和在后面加復(fù)數(shù)s//執(zhí)行到這個時候你的數(shù)據(jù)庫中就有了 users 這個集合module.exports = User;
  • Entity: 由Model創(chuàng)建的實體,他的操作也會影響數(shù)據(jù)庫,但是它操作數(shù)據(jù)庫的能力比Model弱
  • const newUser = new UserModel({ //UserModel 為導(dǎo)出來的 Useremail: req.body.email,code: getCode(),email_time: Date.now()});

    Mongoose中有一個東西個人感覺非常主要,那便是populate,通過populate他可以很方便的與另一個集合建立關(guān)系。如下,user集合可以與article集合、user集合本身進(jìn)行關(guān)聯(lián),根據(jù)其內(nèi)嵌文檔的特性,這樣子他便可以內(nèi)嵌子文檔,子文檔中有可以內(nèi)嵌子文檔,這樣子它返回的數(shù)據(jù)就會異常的豐富。

    const user = await UserModel.findOne({_id: req.query._id, is_actived: true}, {password: 0}).populate({path: 'image_article',model: 'ImageArticle',populate: {path: 'author',model: 'User'}}).populate({path: 'collection_film_article',model: 'FilmArticle',}).populate({path: 'following_user',model: 'User',}).populate({path: 'follower_user',model: 'User',}).exec();

    服務(wù)端主要是操作數(shù)據(jù)庫,對數(shù)據(jù)庫進(jìn)行增刪改查(CRUD)等操作。項目中的接口,Mongoose的各種方法這邊就不對其做詳細(xì)介紹,大家可以查看Mongoose文檔。

    用戶身份認(rèn)證實現(xiàn)

    介紹

    本系統(tǒng)的用戶身份認(rèn)證機(jī)制采用的是JSON Web Token(JWT),它是一種輕量的認(rèn)證規(guī)范,也用于接口的認(rèn)證。我們知道,HTTP協(xié)議是一種無狀態(tài)的協(xié)議,這便意味著每個請求都是獨立的,當(dāng)用戶提供了用戶名和密碼來對我們的應(yīng)用進(jìn)行用戶認(rèn)證,那么在下一次請求的時候,用戶需要再進(jìn)行一次用戶的認(rèn)證才可以,因為根據(jù)HTTP協(xié)議,我們并不能知道是哪個用戶發(fā)出的請求,本系統(tǒng)采用了token的鑒權(quán)機(jī)制。這個token必須要在每次請求時傳遞給服務(wù)端,它應(yīng)該保存在請求頭里,另外,服務(wù)端要支持CORS(跨來源資源共享)策略,一般我們在服務(wù)端這么做就可以了Access-Control-Allow-Origin: *。

    在用戶身份認(rèn)證這一塊有很多方法,最常見的像cookie ,session。那么他們?nèi)g又有什么區(qū)別,這里有兩篇文章介紹的挺全面。

    • 正確理解HTTP短連接中的Cookie、Session和Token
    • 小白必讀:閑話HTTP短連接中的Session和Token

    token 與 session的區(qū)別在于,它不同于傳統(tǒng)的session認(rèn)證機(jī)制,它不需要在服務(wù)端去保留用戶的認(rèn)證信息或其會話的信息。系統(tǒng)一旦比較大,都會采用機(jī)器集群來做負(fù)載均衡,這需要多臺機(jī)器,由于session是保存在服務(wù)端,那么就要 去考慮用戶到底是在哪一臺服務(wù)器上進(jìn)行登錄的,這便是一個很大的負(fù)擔(dān)。

    那么就有人想問了,你這個系統(tǒng)這么小,為什么不使用傳統(tǒng)的session機(jī)制呢?哈~因為之前自己的項目一般都是使用session做登錄,沒使用過token,想嘗試嘗試入入坑~~哈哈哈~

    實現(xiàn)思路

    JWT主要的實現(xiàn)思路如下:

  • 在用戶登錄成功的時候創(chuàng)建token保存于數(shù)據(jù)庫中,并返回給客戶端。
  • 客戶端之后的每一次請求都要帶上token,在請求頭里加入Authorization,并加上token.
  • 在服務(wù)端進(jìn)行驗證token的有效性,在有效期內(nèi)返回200狀態(tài)碼,token過期則返回401狀態(tài)碼
  • 如下圖所示:


    <center>JWT請求圖</center>

    在node中主要用了jsonwebtoken這個模塊來創(chuàng)建JWT,jsonwebtoken的使用請查看jsonwebtoken文檔。項目中創(chuàng)建token的中間件createToken如下

    /*** createToken.js*/ const jwt = require('jsonwebtoken'); // 引入jsonwebtoken模塊 const secret = '我是密鑰'//登錄時:核對用戶名和密碼成功后,應(yīng)用將用戶的id(user_id)作為JWT Payload的一個屬性 module.exports = function(user_id){const token = jwt.sign({user_id: user_id}, secret, { //密鑰expiresIn: '24h' //過期時間設(shè)置為24h。那么decode這個token的時候得到的過期時間為:創(chuàng)建token的時間+設(shè)置的值});return token; };

    return 出來的 token 類似eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiYWRtaW4iLCJpYXQiOjE1MzQ2ODQwNzAsImV4cCI6MTUzNDc3MDQ3MH0.Y3kaglqW9Fpe1YxF_uF7zwTV224W4W97MArU0aI0JgM。我們仔細(xì)看這字符串,分為三段,分別被 "." 隔開。現(xiàn)在我們分別對前兩段進(jìn)行base64解碼如下:

    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 ===> {"alg":"HS256","typ":"JWT"} 其中 alg是加密算法名字,typ是類型eyJ1c2VyX2lkIjoiYWRtaW4iLCJpYXQiOjE1MzQ2ODQwNzAsImV4cCI6MTUzNDc3MDQ3MH0 ===> {"user_id":"admin","iat":1534684070,"exp":1534770470} 其中 name是我們儲存的內(nèi)容,iat創(chuàng)建的時間戳,exp到期時間戳。Y3kaglqW9Fpe1YxF_uF7zwTV224W4W97MArU0aI0JgM ===> 最后一段是由前面兩段字符串,HS256加密后得到。所以前面的任何一個字段修改,都會導(dǎo)致加密后的字符串不匹配。

    當(dāng)我們根據(jù)用戶的id創(chuàng)建獲取到token之后,我們需要把token返回到客戶端,客戶端對其在本地(localStorage)保存, 客戶端之后的每一次請求都要帶上token,在請求頭里加入Authorization,并加上token,服務(wù)端進(jìn)行驗證token的有效性。那么我們?nèi)绾悟炞Ctoken的有效性呢? 所以我們需要checkToken這個中間件來檢測token的有效性。

    /*** checkToken*/ const jwt = require('jsonwebtoken'); const secret = '我是密鑰'module.exports = async ( req, res, next ) => {const authorization = req.get('Authorization');if (!authorization) {res.status(401).end(); //接口需要認(rèn)證但是有沒帶上token,返回401未授權(quán)狀態(tài)碼return}const token = authorization.split(' ')[1];try {let tokenContent = await jwt.verify(token, secret); //如果token過期或驗證失敗,將拋出錯誤next(); //執(zhí)行下一個中間件} catch (err) {console.log(err)res.status(401).end(); //token過期或者驗證失敗返回401狀態(tài)碼} }

    那么現(xiàn)在咱們只要在需要用戶認(rèn)證的接口上,在操作數(shù)據(jù)之前,加上checkToken中間件即可,如下調(diào)用:

    //更新用戶信息 router.post('/updateUserInfo', checkToken, User.updateUserInfo) //如果checkToken檢測不成功,它便返回401狀態(tài)碼,不會對User.updateUserInfo做任何操作, 只有檢測token成功,才能處理User.updateUserInfo

    我們?nèi)绾伪WC每次請求都能在請求頭里加入Authorization,并加上token,這就要用到Axios的請求攔截,并且也用到了它的響應(yīng)攔截,因為在服務(wù)端返回401狀態(tài)碼之后應(yīng)要執(zhí)行登出操作,清楚本地token的存儲,具體代碼如下:

    //request攔截器 instance.interceptors.request.use(config => {//每次發(fā)送請求之前檢測本地是否存有token,都要放在請求頭發(fā)送給服務(wù)器if(localStorage.getItem('token')){if (config.url.indexOf('upload-z0.qiniup.com/putb64') > -1){config.headers.Authorization = config.headers['UpToken']; //加上七牛云上傳token}else {config.headers.Authorization = `token ${localStorage.getItem('token')}`.replace(/(^\")|(\"$)/g, ''); //加上系統(tǒng)接口token}}console.log('config',config)return config;},err => {console.log('err',err)return Promise.reject(err);} );//response攔截器 instance.interceptors.response.use(response => {return response;},error => { //默認(rèn)除了2XX之外的都是錯誤的,就會走這里if(error.response){switch(error.response.status){case 401:console.log(error.response)store.dispatch('ADMIN_LOGINOUT'); //可能是token過期,清除它router.replace({ //跳轉(zhuǎn)到登錄頁面path: '/login',query: { redirect: '/dashboard' } // 將跳轉(zhuǎn)的路由path作為參數(shù),登錄成功后跳轉(zhuǎn)到該路由});}}return Promise.reject(error.response);} );

    其中的if else 是因為本系統(tǒng)的圖片,音視頻是放在七牛云,上傳需要七牛云上傳base64圖片的時候token是放在請求頭的,正常的圖片上傳不是放在請求頭,所以這邊對token做了區(qū)分,如何接入七牛云也會在下面模塊介紹到。

    七牛云接入

    本系統(tǒng)的圖片,音視頻是放在七牛云,所以需要接入七牛云。七牛云分了兩種情況,正常圖片和音視頻的上傳和base64圖片的上傳,因為七牛云在對他們兩者上傳的Content-Type和domain(域)有所不同,正常圖片和音視頻的Content-Type是headers: {'Content-Type':'multipart/form-data'}domain是domain='https://upload-z0.qiniup.com',而base64圖片的上傳則是headers:{'Content-Type':'application/octet-stream'}domain是domain='https://upload-z0.qiniup.com/putb64/-1',所以他們請求的時候token放的地方不同,base64就像上面所說的放在請求頭Authorization中,而正常的放在form-data中。在服務(wù)端通過接口請求來獲取七牛云上傳token,客戶端獲取到七牛云token,通過不同方案將token帶上。

  • base64的上傳: headers:{'Content-Type':'application/octet-stream'} 和 domain='https://upload-z0.qiniup.com/putb64/-1',token放在請求頭Authorization中。
  • 正常圖片和音視頻的上傳: headers: {'Content-Type':'multipart/form-data'}和domain='https://upload-z0.qiniup.com',token 放在 form-data中。
  • 服務(wù)端通過qiniu這個模塊進(jìn)行創(chuàng)建token,服務(wù)端代碼如下:

    /*** 構(gòu)建一個七牛云上傳憑證類* @class QN*/ const qiniu = require('qiniu') //導(dǎo)入qiniu模塊 const config = require('../config') class QN {/*** Creates an instance of qn.* @param {string} accessKey -七牛云AK* @param {string} secretKey -七牛云SK* @param {string} bucket -七牛云空間名稱* @param {string} origin -七牛云默認(rèn)外鏈域名,(可選參數(shù))*/constructor (accessKey, secretKey, bucket, origin) {this.ak = accessKeythis.sk = secretKeythis.bucket = bucketthis.origin = origin}/*** 獲取七牛云文件上傳憑證* @param {number} time - 七牛云憑證過期時間,以秒為單位,如果為空,默認(rèn)為7200,有效時間為2小時*/upToken (time) {const mac = new qiniu.auth.digest.Mac(this.ak, this.sk)const options = {scope: this.bucket,expires: time || 7200}const putPolicy = new qiniu.rs.PutPolicy(options)const uploadToken = putPolicy.uploadToken(mac)return uploadToken} }exports.QN = QN;exports.upToken = () => {return new QN(config.qiniu.accessKey, config.qiniu.secretKey, config.qiniu.bucket, config.qiniu.origin).upToken() //每次調(diào)用都創(chuàng)建一個token } //獲取七牛云token接口 const {upToken} = require('../utils/qiniu')app.get('/api/uploadToken', (req, res, next) => {const token = upToken()res.send({status: 1,message: '上傳憑證獲取成功',upToken: token,})})

    由于正常圖片和音視頻的上傳和base64圖片的上傳,因為七牛云在對他們兩者上傳的Content-Type和domain(域)有所不同,所以的token請求存放的位置有所不同,因此要區(qū)分,客戶端調(diào)用上傳代碼如下:

    //根據(jù)獲取到的上傳憑證uploadToken上傳文件到指定域//正常圖片和音視頻的上傳uploadFile(formdata, domain='https://upload-z0.qiniup.com',config={headers:{'Content-Type':'multipart/form-data'}}){console.log(domain)console.log(formdata)return instance.post(domain, formdata, config)},//base64圖片的上傳//根據(jù)獲取到的上傳憑證uploadToken上傳base64到指定域uploadBase64File(base64, token, domain = 'https://upload-z0.qiniup.com/putb64/-1', config = {headers: {'Content-Type': 'application/octet-stream',},}){const pic = base64.split(',')[1];config.headers['UpToken'] = `UpToken ${token}`return instance.post(domain, pic, config)}, function upload(Vue, data, callbackSuccess, callbackFail) {//獲取上傳token之后處理Vue.prototype.axios.getUploadToken().then(res => {if (typeof data === 'string'){ //如果是base64const token = res.data.upTokenVue.prototype.axios.uploadBase64File(data, token).then(res => {if (res.status === 200){callbackSuccess && callbackSuccess({data: res.data,result_url: `http://p89inamdb.bkt.clouddn.com/${res.data.key}`})}}).catch((error) => {callbackFail && callbackFail({error})})}else if (data instanceof FormData){ //如果是FormDatadata.append('token', res.data.upToken)data.append('key', `moment${Date.now()}${Math.floor(Math.random() * 100)}`)Vue.prototype.axios.uploadFile(data).then(res => {if (res.status === 200){callbackSuccess && callbackSuccess({data: res.data,result_url: `http://p89inamdb.bkt.clouddn.com/${res.data.key}`})}}).catch((error) => {callbackFail && callbackFail({error})})}else {const formdata = new FormData() //如果不是formData 就創(chuàng)建formDataformdata.append('token', res.data.upToken)formdata.append('file', data.file || data)formdata.append('key', `moment${Date.now()}${Math.floor(Math.random() * 100)}.${data.file.type.split('/')[1]}`)// 獲取到憑證之后再將文件上傳到七牛云空間console.log('formdata',formdata)Vue.prototype.axios.uploadFile(formdata).then(res => {console.log('res',res)if (res.status === 200){callbackSuccess && callbackSuccess({data: res.data,result_url: `http://p89inamdb.bkt.clouddn.com/${res.data.key}` //返回的圖片鏈接})}}).catch((error) => {console.log(error)callbackFail && callbackFail({error})})}}) }export default upload

    路由權(quán)限模塊

    系統(tǒng)的后臺管理面向的是合作作者和管理員,涉及到兩種角色,故此要做權(quán)限管理。不同的權(quán)限對應(yīng)著不同的路由,同時側(cè)邊欄的菜單也需根據(jù)不同的權(quán)限,異步生成,不同于以往的服務(wù)端直接返回路由表,由前端動態(tài)生成,接下來介紹下登錄和權(quán)限驗證的思路:

  • 登錄:當(dāng)用戶填寫完賬號和密碼后向服務(wù)端驗證是否正確,驗證通過之后,服務(wù)端會返回一個token,拿到token之后前端會根據(jù)token再去拉取一個getAdminInfo的接口來獲取用戶的詳細(xì)信息(如用戶權(quán)限,用戶名等等信息)。
  • 權(quán)限驗證:通過token獲取用戶對應(yīng)的role,動態(tài)根據(jù)用戶的role算出其對應(yīng)有權(quán)限的路由,通過vue-router的beforeEach進(jìn)行全局前置守衛(wèi)再通過router.addRoutes動態(tài)掛載這些路由。
  • 代碼有點多,這邊就直接放流程圖哈~~


    <center>權(quán)限路由流程圖</center>

    最近正好也在公司做中后臺項目,公司的中后臺項目的這邊是由服務(wù)端生成路由表,前端進(jìn)行直接渲染,畢竟公司的一整套業(yè)務(wù)比較成熟。但是我們會在想能不能由前端維護(hù)路由表,這樣不用到時候項目迭代,前端每增加頁面都要讓服務(wù)端兄弟配一下路由和權(quán)限,當(dāng)然前提可能是項目比較小的時候。

    賬號模塊

    賬號模塊是業(yè)務(wù)中最為基礎(chǔ)的模塊,承擔(dān)著整個系統(tǒng)所有的賬號相關(guān)的功能。系統(tǒng)實現(xiàn)了用戶注冊、用戶登錄、密碼修改、找回密碼功能。

    系統(tǒng)的賬號模塊使用了郵件服務(wù),針對普通用戶的注冊采用了郵件服務(wù)來發(fā)送驗證碼,以及密碼的修改等操作都采用了郵件服務(wù)。在node.js中主要采用了Nodemailer,Nodemailer是一個簡單易用的Node.js郵件發(fā)送組件,它的使用可以摸我摸我摸我,通過此模塊進(jìn)行郵件的發(fā)送。你們可能會問,為什么不用短信服務(wù)呢?哈~因為短信服務(wù)要錢,哈哈哈

    /* * email 郵件模塊 */const nodemailer = require('nodemailer'); const smtpTransport = require('nodemailer-smtp-transport'); const config = require('../config')const transporter = nodemailer.createTransport(smtpTransport({host: 'smtp.qq.com',secure: true,port: 465, // SMTP 端口auth: {user: config.email.account,pass: config.email.password //這里密碼不是qq密碼,是你設(shè)置的smtp授權(quán)碼} }));let clientIsValid = false; const verifyClient = () => {transporter.verify((error, success) => {if (error) {clientIsValid = false;console.warn('郵件客戶端初始化連接失敗,將在一小時后重試');setTimeout(verifyClient, 1000 * 60 * 60);} else {clientIsValid = true;console.log('郵件客戶端初始化連接成功,隨時可發(fā)送郵件');}}); }; verifyClient();const sendMail = mailOptions => {if (!clientIsValid) {console.warn('由于未初始化成功,郵件客戶端發(fā)送被拒絕');return false;}mailOptions.from = '"ShineTomorrow" <admin@momentin.cn>'transporter.sendMail(mailOptions, (error, info) => {if (error) return console.warn('郵件發(fā)送失敗', error);console.log('郵件發(fā)送成功', info.messageId, info.response);}); };exports.sendMail = sendMail;

    賬號的注冊先是填寫email,填寫好郵箱之后會通過Nodemailer發(fā)送一封含有有效期的驗證碼郵件,之后填寫驗證碼、昵稱和密碼即可完成注冊,并且為了安全考慮,對密碼采用了安全哈希算法(Secure Hash Algorithm)進(jìn)行加密。賬號的登錄以賬號或者郵箱號加上密碼進(jìn)行登錄,并且采用上文所說的JSON Web Token(JWT)身份認(rèn)證機(jī)制,從而實現(xiàn)用戶和用戶登錄狀態(tài)數(shù)據(jù)的對應(yīng)。


    <center>我的郵件長這樣?(可自己寫郵件模板)</center>

    實時消息推送

    當(dāng)用戶被人關(guān)注、評論被他人回復(fù)和點贊等一些社交性的操作的時候,在數(shù)據(jù)存儲完成后,服務(wù)端應(yīng)需要及時向用戶推送消息來提醒用戶。消息推送模塊采用了Socket.io來實現(xiàn),socket.io封裝了websocket,不支持websocket的情況還提供了降級AJAX輪詢,功能完備,設(shè)計優(yōu)雅,是開發(fā)實時雙向通訊的不二手段。

    通過 socket.io,用戶每打開一個頁面,這個頁面都會和服務(wù)端建立一個連接。在服務(wù)端可以通過連接的socket的id屬性來匹配到一個建立連接的頁面。所以用戶的ID和socket的id,是一對多的關(guān)系,即一個用戶可能在登錄后打開多個頁面。而socket.io沒有提供從服務(wù)端向某個用戶單獨發(fā)送消息的功能,更沒有提供向某個用戶打開的所有頁面推送消息的功能。但是socket.io提供了room的概念,即群組。在建立websocket時,客戶端可以選擇加入某個room,如果這個room沒有存在則自動新建一個,否則直接加入,服務(wù)端可以向某個room中的所有客戶端推送消息。

    根據(jù)這個特性,設(shè)計將用戶的ID作為room的名字,當(dāng)某個用戶打開頁面建立連接時,會選擇加入以自己用戶ID為名字的room。這樣,在用戶ID為名字的 room中,加入的都是用戶自己打開的頁面建立的連接。從而向某個用戶推送消息,可以直接通過向以此用戶的ID為名字的room發(fā)送消息,這樣就會推送到用戶打開的所有頁面。

    有了想法后我們就開始魯吧~,在服務(wù)端中socket.io在客戶端中使用vue-socket.io, 服務(wù)端代碼如下:

    /* * app.js中 */ const server = require('http').createServer(app); const io = require('socket.io')(server); global.io = io; //全局設(shè)上io值, 因為在其他模塊要用到 io.on('connection', function (socket) {// setTimeout(()=>{// socket.emit('nodeEvent', { hello: 'world' });// }, 5000)socket.on('login_success', (data) => { //接受客戶端觸發(fā)的login_success事件//使用user_id作為房間號socket.join(data.user_id);console.log('login_success',data);}); }); io.on('disconnect', function (socket) {socket.emit('user disconnected'); });server.listen(config.port, () => {console.log(`The server is running at http://localhost:${config.port}`); }); /* * 某業(yè)務(wù)模塊 */ //例如某文章增加評論 io.in(newMusicArticle.author.user_id._id).emit('receive_message', newMessage); //實時通知客戶端receive_message事件 sendMail({ //發(fā)送郵件to: newMusicArticle.author.user_id.email,subject: `Moment | 你有未讀消息哦~`,text: `啦啦啦,我是賣報的小行家~~ ?`,html: emailTemplate.comment(sender, newMusicArticle, content, !!req.body.reply_to_id) })

    客服端代碼:

    <script>export default {name: 'App',data () {return {}},sockets:{connect(){},receive_message(val){ //接受服務(wù)端觸發(fā)的事件,進(jìn)行客戶端實時更新數(shù)據(jù)if (val){console.log('服務(wù)端實時通信', val)this.$notify(val.content)console.log('this method was fired by the socket server. eg: io.emit("customEmit", data)')}}},mixins: [mixin],mounted(){if (!!JSON.parse(window.localStorage.getItem('user_info'))){this.$socket.emit('login_success', { //通知服務(wù)端login_success 事件, 傳入iduser_id: JSON.parse(window.localStorage.getItem('user_info'))._id})}},} </script>

    評論模塊

    評論模塊是為了移動端WebApp下的文章下為用戶提供關(guān)于評論的一些操作。系統(tǒng)實現(xiàn)了對文章的評論,評論的點贊功能,熱門評論置頂以及評論的回復(fù)功能。在評論方面存在著各種各樣的安全性問題,比如XSS攻擊(Cross Site Scripting,跨站腳本攻擊)以及敏感詞等問題。預(yù)防XSS攻擊使用了xss模塊, 敏感詞過濾使用text-censor模塊。

    一些思考

  • 接口數(shù)據(jù)問題
  • 在開發(fā)的時候經(jīng)常會遇到這個問題,接口數(shù)據(jù)問題。有時候服務(wù)端返回的數(shù)據(jù)并不是我們想要的數(shù)據(jù),前端要對數(shù)據(jù)進(jìn)行再一步的處理。

    例如服務(wù)端返回的某個字段為null或者服務(wù)端返回的數(shù)據(jù)結(jié)構(gòu)太深,前端需要不斷去判斷數(shù)據(jù)結(jié)構(gòu)是否真的返回了正確的東西,而不是個null 或者undefined~

    我們前端都要這么去處理過濾:

    <div class="author">文 / {{(musicArticleInfo.author && musicArticleInfo.author.user_id) ? musicArticleInfo.author.user_id.username : '我叫這個名字'}} </div>

    這就引出了一個思考:

    對數(shù)據(jù)的進(jìn)一步封裝處理,必然渲染性能方面會存在問題,而且我們要時刻擔(dān)心數(shù)據(jù)返回的問題。如果應(yīng)用到公司的業(yè)務(wù),我們應(yīng)該如何處理呢 ?

  • 頁面性能優(yōu)化和SEO問題
  • 首屏渲染問題一直是單頁應(yīng)用的痛點,那么除了常用的性能優(yōu)化,我們還有什么方法優(yōu)化的嗎 ? 這個項目雖然面向的是移動端用戶,可能不存在SEO問題,如果做成pc端的話,像文章這類的應(yīng)用,SEO都是必須品。



    對于上面提出的問題,node的出現(xiàn)讓我們看到了解決方案,那就常說的Node中間層,當(dāng)然本項目中是不存在Node中間層,而是直接作為后端語言處理數(shù)據(jù)庫。

    由于大部分的公司后端要么是php要么是java,一般不把node直接作為后端語言,如果有使用到node,一般是作為一個中間層的形式存在。

    對于第一個問題的解決:我們可以在中間層做接口轉(zhuǎn)發(fā),在轉(zhuǎn)發(fā)的過程中做數(shù)據(jù)處理。而不用擔(dān)心數(shù)據(jù)返回的問題。

    對于第二個問題的解決:有了Node中間層的話,那么我們可以把首屏渲染的任務(wù)交給nodejs去做,次屏的渲染依然走之前的瀏覽器渲染。



    有Node中間層的話,新的架構(gòu)如下:

    前后端的職能:

    總結(jié)

    已經(jīng)畢業(yè)一段時間了,寫文章是為了回顧。本人水平一般,見諒見諒。這個產(chǎn)品的實現(xiàn),一個人扛,在其中充當(dāng)了各種角色,要有一點點產(chǎn)品思維,要有一點點設(shè)計的想法,要會數(shù)據(jù)庫設(shè)計,要會后端開發(fā),挺繁瑣的。最難的點個人感覺還是數(shù)據(jù)庫設(shè)計,數(shù)據(jù)庫要一開始就要設(shè)計的很完整,不然到后面的添添補補,就會很亂很亂,當(dāng)然這個基礎(chǔ)是產(chǎn)品要非常清晰,剛開始自己心中對產(chǎn)品可能是個模糊的定義,想想差不多是那樣,于是乎就開始搞~~導(dǎo)致于后面數(shù)據(jù)庫設(shè)計的不是很滿意。由于時間關(guān)系,現(xiàn)在的產(chǎn)品中有些小模塊還沒完成,但是大部分的功能結(jié)構(gòu)已經(jīng)完成,算是個成型的產(chǎn)品,當(dāng)然是一個沒有經(jīng)過測試的產(chǎn)品哈哈哈哈,要是有測試的話,那就哈哈哈哈你懂得。

    前路漫漫,吾將上下而求索~

    謝謝~~

    總結(jié)

    以上是生活随笔為你收集整理的聊聊毕业设计系列 --- 系统实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    日韩毛片在线免费观看 | 欧美一级电影片 | 一区二区欧美激情 | 久久色在线观看 | 国产精品18久久久久久首页狼 | 精品日韩在线一区 | 91麻豆精品一区二区三区 | 综合色中文 | 99精品福利视频 | 日韩在线观看视频网站 | 欧美粗又大 | 在线观看自拍 | 亚洲国内精品在线 | 91av在线免费观看 | 日韩av电影免费观看 | 日韩免费在线 | 色婷婷成人网 | 国产精品久久久久久久久费观看 | 91中文字幕网 | 亚洲欧美久久 | 特级黄录像视频 | 国产精品一区二区久久精品爱涩 | 亚洲欧美日本一区二区三区 | 免费在线一区二区 | 500部大龄熟乱视频使用方法 | 国产99中文字幕 | 精品综合久久久 | 丁香婷婷综合色啪 | 亚洲人成在线电影 | 成人午夜黄色 | 久久视频免费在线观看 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 亚洲理论视频 | 蜜臀av免费一区二区三区 | 少妇精品久久久一区二区免费 | а天堂中文最新一区二区三区 | 91精品国产乱码 | 亚洲最新毛片 | 久久人人射 | 日本少妇高清做爰视频 | 国产一区欧美一区 | 五月婷影院| 蜜桃视频精品 | 91精品视频一区 | 亚洲免费在线视频 | 黄色三级视频片 | 国内精品视频在线播放 | av一区在线播放 | 97超碰资源| 岛国精品一区二区 | 色姑娘综合天天 | 欧美在线观看视频一区二区 | 日三级在线 | 国内精品久久久久影院一蜜桃 | 国产日韩欧美在线一区 | 亚洲a资源 | 国产精品嫩草影院9 | 在线视频 91 | av中文字幕第一页 | 黄色免费电影网站 | av福利超碰网站 | 免费看的黄色小视频 | 综合在线观看色 | 中文字幕在线看视频 | 日韩一区二区免费播放 | 美女黄频在线观看 | 手机在线日韩视频 | 中文字幕在线播放av | 免费99| 国产高清久久久 | 特级西西人体444是什么意思 | 九九免费在线观看视频 | 91豆麻精品91久久久久久 | 亚洲精品小视频 | 国产日产av| 黄色在线观看免费网站 | 狠狠色伊人亚洲综合网站色 | 丝袜+亚洲+另类+欧美+变态 | 婷婷久久亚洲 | 日日躁夜夜躁aaaaxxxx | 亚洲精品久久久久www | 99爱精品在线 | 亚洲欧美婷婷六月色综合 | 成年人黄色大片在线 | 五月开心色 | 午夜三级在线 | 国产精品第7页 | 六月丁香六月婷婷 | 国产成人精品一区二区在线 | 国产精品美女 | 91成人精品一区在线播放69 | 91手机视频| 久久久久久蜜桃一区二区 | 日韩精品一区二区三区视频播放 | 亚洲专区中文字幕 | 久久女同性恋中文字幕 | 黄色a在线观看 | 色 免费观看 | 国产日产精品一区二区三区四区 | 在线观看91| 久久综合免费视频影院 | 久久精品人人做人人综合老师 | 2020天天干天天操 | 久久人人添人人爽添人人88v | 日韩xxxx视频| 国产手机av在线 | 美女性爽视频国产免费app | 国产午夜小视频 | 欧美日一级片 | 麻豆精品传媒视频 | 成人午夜黄色 | 色综合久久五月 | 伊人超碰在线 | 久久精品国产v日韩v亚洲 | 91国内在线 | 久久免费视频在线观看30 | 波多野结衣一区二区 | 中文字幕在线精品 | 亚洲黄色大片 | 国产亚洲在线观看 | 精品一区二区久久久久久久网站 | av三级在线免费观看 | 黄色三级免费看 | 久草精品视频在线播放 | 日韩精品免费专区 | 伊人狠狠 | 国产一区视频免费在线观看 | 久久热首页 | 欧美视频一区二 | 国产精品99久久免费黑人 | 视频一区二区在线观看 | 中文字幕丝袜一区二区 | 久草在线中文888 | 免费精品在线 | 欧美一级看片 | 黄色a一级视频 | 成片免费观看视频大全 | 久久男女视频 | 亚洲特级片 | 国产午夜一区 | 精品亚洲一区二区三区 | 91视频 - 114av | 欧美精品黑人性xxxx | 亚洲精品字幕 | 国产精品久久久久永久免费观看 | 婷婷午夜 | 九九精品无码 | www.天天综合| 天天综合网天天 | 国内毛片毛片 | 免费十分钟 | 激情综合网色播五月 | 伊人久久精品久久亚洲一区 | 2024国产精品视频 | 人人爱人人添 | 精品国偷自产国产一区 | 亚洲精品久久久久久中文传媒 | 中文字幕高清视频 | 91精品国产网站 | a√天堂中文在线 | 亚洲午夜激情网 | 日本中文字幕网址 | 国产一级做a爱片久久毛片a | 久久免费大片 | 亚洲天堂网站 | 菠萝菠萝蜜在线播放 | 中文字幕一区二区在线播放 | 中文字幕成人在线观看 | 婷婷精品国产欧美精品亚洲人人爽 | 黄色毛片观看 | 99精品视频在线 | 91在线视频免费播放 | 国产精品一区免费看8c0m | 国产97超碰 | 日日天天av | 免费在线观看黄色网 | 久久久精品一区二区三区 | 久久久久久久福利 | 蜜臀av夜夜澡人人爽人人桃色 | 999ZYZ玖玖资源站永久 | 成人午夜剧场在线观看 | 成人综合婷婷国产精品久久免费 | 中文不卡视频 | 97精品伊人 | 一区二区三区在线免费观看 | 91福利影院在线观看 | 国产护士hd高朝护士1 | 久久精品99视频 | 麻豆免费视频网站 | 精品视频123区在线观看 | 超碰人人做 | 国产97在线播放 | 天天爽夜夜爽人人爽曰av | 欧美精品在线观看免费 | 又色又爽又激情的59视频 | 亚洲aaa毛片 | 最新av网址在线 | 日韩videos| 中文字幕乱偷在线 | 在线看的av网站 | 国产在线观看中文字幕 | 久久久www | 免费黄色av. | 夜夜爽88888免费视频4848 | 人人澡视频 | 亚洲一区二区精品 | 天天躁天天操 | 曰本免费av | 91网免费观看 | 国产精品免费久久 | 91看片成人| 国产精品观看视频 | 91探花系列在线播放 | 91一区啪爱嗯打偷拍欧美 | 久草在线视频网 | 久精品视频 | 波多野结衣一区二区三区中文字幕 | www夜夜| 操操操人人 | 国产精品电影在线 | 97在线视频观看 | 久久国产精品久久久 | 一区二区三区四区精品视频 | 天堂中文在线视频 | 欧美日韩国产一区二 | 不卡电影一区二区三区 | 91在线超碰| 免费在线观看av网站 | 欧美日韩视频一区二区三区 | 亚洲伊人婷婷 | 97在线观看免费视频 | 国产精品久久久免费看 | 97国产大学生情侣白嫩酒店 | 免费网站看v片在线a | 久久久国产精品电影 | 中文字幕在线观看一区 | .国产精品成人自产拍在线观看6 | 亚洲精品国产精品国自产观看 | 国产四虎在线 | 97人人模人人爽人人喊网 | 国产色 在线 | www.福利| 国产精品久久久久婷婷二区次 | 97国产精品久久 | 国产精品一二三 | 人人爱夜夜操 | 九九视频免费 | 亚洲成人第一区 | 国产美女网站在线观看 | 在线中文字幕视频 | 国产高清在线免费 | 国产在线视频一区二区三区 | 久久精品国产一区二区 | 天天干天天色2020 | 亚洲黄色成人网 | 免费久久99精品国产婷婷六月 | 国产网红在线观看 | 激情网在线观看 | 国内精品小视频 | 亚洲一区二区视频在线 | 久久精品亚洲精品国产欧美 | 天天拍天天操 | 久久精品一区二区三区国产主播 | 久久伊人五月天 | 久久久精品久久日韩一区综合 | 色狠狠综合天天综合综合 | 久久久久久美女 | 免费一级毛毛片 | 69国产精品视频 | 日韩在线观看第一页 | 亚洲国产三级在线 | 日韩在线高清免费视频 | 免费人成网 | 日日干影院 | 视色网站 | 欧美精选一区二区三区 | 国产精品成人在线 | 久久er99热精品一区二区 | 亚洲午夜电影网 | 婷婷色五| 亚洲 欧美 日韩 综合 | 97自拍超碰 | 中文字幕在线播放视频 | 99热九九这里只有精品10 | 亚洲国产合集 | 久草在线官网 | 亚洲黄色一级电影 | 黄色亚洲在线 | 天天射狠狠干 | 超级av在线 | 久久久精品亚洲 | 91入口在线观看 | 亚洲精品免费在线观看视频 | 免费在线黄色av | 精品一区二区影视 | 日韩免费观看视频 | 波多野结衣网址 | 久久久亚洲麻豆日韩精品一区三区 | 国产精品久久久久9999 | 日韩久久一区二区 | 久久精品久久99 | 天天在线免费视频 | 亚洲精品视频在线观看免费视频 | 成人在线免费视频观看 | 丁香婷婷网 | 国产99久久久国产 | 91中文字幕在线观看 | 97人人澡人人添人人爽超碰 | 国产精品一区二区三区久久久 | 国产91精品一区二区麻豆网站 | 91看片麻豆 | 久久久久亚洲天堂 | av电影不卡在线 | 成人黄在线| 欧美精品免费视频 | 国产黄免费在线观看 | 福利视频一区二区 | 免费在线观看黄网站 | 久久精品中文字幕少妇 | 午夜精品福利一区二区 | 国产亚洲欧美日韩高清 | 久久免费看视频 | 国产小视频免费在线观看 | 国产精品国产三级国产不产一地 | 国产免码va在线观看免费 | 久久久久国产精品www | www.亚洲精品视频 | 中文字幕一区二区三区乱码不卡 | 日韩日韩日韩日韩 | 91久久国产自产拍夜夜嗨 | 在线免费91 | www.国产在线观看 | 五月婷丁香网 | 香蕉成人在线视频 | 午夜丁香视频在线观看 | 在线看小早川怜子av | 99热这里只有精品久久 | 日韩三级.com | 日本中文字幕在线一区 | 国产精品久久久久久av | 九九九九免费视频 | 国内精品久久久久影院男同志 | 狠狠狠狠狠色综合 | 日韩高清国产精品 | 欧美精品乱码久久久久久按摩 | 亚洲免费精品视频 | 欧美日韩一区二区在线 | 91视频久久 | 国产香蕉久久 | 日韩啪啪小视频 | 精品网站999www | 婷婷丁香六月天 | av资源免费看 | 福利片免费看 | av在线播放亚洲 | 免费在线观看av的网站 | 国产精品一区二区美女视频免费看 | 国产一区黄色 | 一区二区 不卡 | 国产精品久久久久婷婷二区次 | 亚洲精品视频网 | 日本中文字幕电影在线免费观看 | 亚洲精品国偷拍自产在线观看蜜桃 | 国产成人a亚洲精品 | 精品久久久影院 | 在线观看视频国产 | 99精品久久精品一区二区 | 亚洲综合成人在线 | 国内精品久久久精品电影院 | 日韩专区在线观看 | 18女毛片| 999亚洲国产996395 | 一区二区三区电影在线播 | 丁香激情网| 国产精品自产拍在线观看中文 | 免费在线看成人av | 日本公妇在线观看高清 | 久久久久久久99精品免费观看 | 在线观看免费日韩 | 亚洲综合国产精品 | 欧美做受xxx | 久久免费国产电影 | 亚洲精品视频免费在线 | 欧美精品色 | 久久这里只有精品视频首页 | 久久综合狠狠综合久久狠狠色综合 | 麻花豆传媒一二三产区 | 久久精品在线免费观看 | 久久九九国产精品 | 99久久影视| 欧美一级专区免费大片 | 91亚洲精品久久久蜜桃 | a午夜在线| 久久视频一区 | 天天插天天干 | 激情五月婷婷综合网 | 国产成人精品av在线 | 在线观看成人 | 激情深爱五月 | 麻豆国产露脸在线观看 | 成人av电影免费 | 久久久久久久久久久久影院 | 韩国av三级 | 国产精品午夜免费福利视频 | 国产日韩精品在线 | 99久久精品国产系列 | 成人97视频 | 免费aa大片 | 久久电影国产免费久久电影 | 成人动态视频 | 国际精品久久久久 | 午夜骚影 | 丁香花五月| 国产精品成人一区二区三区吃奶 | av在线直接看 | 亚洲另类人人澡 | 激情五月色播五月 | 人人干97| 在线导航福利 | 色片网站在线观看 | 亚洲激情精品 | 免费一级片在线观看 | 亚洲视频精品在线 | 久久理伦片 | 久久久免费观看视频 | 亚洲精品2区 | 久久avav| 四虎www com | 免费在线激情视频 | 91精品免费在线 | 视频在线亚洲 | 夜色在线资源 | 四虎国产视频 | 在线看片中文字幕 | 国产精品videossex国产高清 | 久久99精品久久久久久秒播蜜臀 | 女人18片毛片90分钟 | 免费97视频 | 日韩免费视频线观看 | 91视频专区| 免费视频一区二区 | 天天插天天狠 | 日韩天天干 | 久久人人97超碰精品888 | 91夜夜夜| 欧美a级片网站 | 国内成人av | 天堂av网站 | 国产99re| 天天鲁一鲁摸一摸爽一爽 | 在线国产福利 | 免费中文字幕视频 | 国产精品热 | 久久久久久国产精品美女 | av中文电影 | 九九在线播放 | 国产一区免费看 | 国产又粗又硬又爽的视频 | 香蕉久草 | 在线观看中文字幕网站 | 91.麻豆视频 | 久久久五月婷婷 | 精品亚洲二区 | av在观看| 色婷婷国产精品一区在线观看 | 久久免费视频在线 | 久久国色夜色精品国产 | 亚洲h在线播放在线观看h | 亚洲1区在线 | 精品美女国产在线 | 久一在线 | 精品爱爱 | 成人国产电影在线观看 | 99精品视频99| 人人澡人人澡人人 | 啪啪激情网| 婷婷电影在线观看 | 午夜精品一区二区三区视频免费看 | 日本公妇在线观看高清 | 国产一二区精品 | 久久与婷婷| 五月天久久激情 | 成人av资源在线 | 国产精品色婷婷视频 | 丝袜一区在线 | 免费观看黄色av | 成人禁用看黄a在线 | 午夜在线资源 | 国产精品毛片一区二区在线 | av日韩不卡| 国产精品亚洲人在线观看 | 亚洲精品乱码久久久久久久久久 | 天天干天天操天天操 | 成人羞羞免费 | 成人九九视频 | 在线视频福利 | 四虎在线视频 | av在线最新 | 一区二区在线不卡 | 久久婷婷丁香 | 2019天天干夜夜操 | 亚洲日韩中文字幕在线播放 | www.色午夜,com | 成人国产精品久久久 | 国产一级精品绿帽视频 | www.天天操.com | 国产一区二区三区久久久 | 国产精品嫩草影视久久久 | 深夜国产在线 | 国产亚洲综合精品 | 久久五月激情 | 日韩资源在线播放 | 99视频在线观看视频 | 99精品视频在线免费观看 | 久草在线免费电影 | 日韩av午夜在线观看 | 色在线最新 | 国产精品第2页 | 日韩免费观看视频 | 久色小说 | 狠狠狠狠狠狠操 | 二区三区在线观看 | 网站免费黄色 | 亚州国产视频 | 国产露脸91国语对白 | 日韩在线色视频 | 久久情网 | 免费看污在线观看 | 亚州精品一二三区 | 一区二区三区在线观看免费视频 | 69绿帽绿奴3pvideos | 亚洲欧美视屏 | 免费看黄色毛片 | 亚洲国产理论片 | 成人网444ppp | 五月开心六月婷婷 | 日韩欧美视频 | 亚洲精品乱码 | 一二三久久久 | 美州a亚洲一视本频v色道 | 99在线观看精品 | 麻豆国产精品永久免费视频 | 婷婷综合影院 | 综合网天天色 | 黄色网址中文字幕 | 亚洲专区一二三 | 色综合天天视频在线观看 | 国产裸体视频bbbbb | 国产精品一区二区 91 | 日韩电影在线观看一区二区三区 | av一级片网站 | 一级黄色在线免费观看 | 五月婷婷免费 | 69av网| 在线精品在线 | 免费污片 | 日韩免费 | 日韩高清一二区 | 久久亚洲热 | 日本久久电影网 | 亚洲 欧洲av | 欧美精品亚洲精品日韩精品 | 免费黄色小网站 | 一级黄视频 | 91在线porny国产在线看 | 中文字幕一区二区三区四区在线视频 | 永久免费av在线播放 | av丝袜美腿 | 亚洲丁香日韩 | 亚洲精选视频在线 | 91成人在线看 | 一区二区三区免费在线观看视频 | 91人人射 | 欧美成人a在线 | 青青看片 | 国产成人精品av久久 | 午夜久久久久久久久久影院 | 粉嫩av一区二区三区四区在线观看 | 日韩国产高清在线 | 日韩美女一级片 | 久久99热精品 | 国产精品一区二区 91 | 九九热视频在线播放 | 中文字幕色婷婷在线视频 | 久久亚洲免费 | 日韩免费在线视频 | 国产伦精品一区二区三区高清 | 日韩高清免费观看 | 欧美日韩一区二区三区在线观看视频 | 国产精品精品国产色婷婷 | 国产成人一级电影 | 亚洲免费一级 | 日韩中文字幕电影 | 欧美日韩伦理在线 | 黄色aaaaa| 黄色av影视 | 中文av资源站 | 91精品国产福利 | 国产精品一区免费在线观看 | 午夜精品久久久久久中宇69 | 久久久伊人网 | 亚洲精品网页 | 午夜黄色 | 国产成人精品一区一区一区 | 免费看wwwwwwwwwww的视频 久久久久久99精品 91中文字幕视频 | 99自拍视频在线观看 | 人人澡人人爽欧一区 | 国产人成免费视频 | 97在线看| 日韩免费电影一区二区三区 | 国产精品久久久久久久久免费看 | 中文字幕日韩在线播放 | 亚洲午夜久久久影院 | 日韩理论片在线 | 成人黄色毛片视频 | 99久久精品电影 | 久久久久久久免费观看 | 91亚瑟视频 | 久色免费视频 | 亚洲精品美女免费 | 中文av字幕在线观看 | 又黄又爽的免费高潮视频 | 日韩欧美精品在线观看 | 激情五月播播久久久精品 | 一区二区视频欧美 | 黄色福利| 黄色片免费看 | 五月婷婷在线观看 | www.婷婷色| 91xav| 五月婷婷六月丁香在线观看 | 久久黄色片| 视频国产精品 | 在线看日韩 | 久热精品国产 | 成人a视频在线观看 | 午夜精品一区二区三区免费 | 精品视频国产 | 黄色三级在线 | 日韩网站中文字幕 | 欧美福利片在线观看 | www.久久久久 | 三级黄色免费片 | 日韩高清国产精品 | 在线观看岛国片 | 久草在线高清视频 | 999精品网| 日日精品 | 人人澡人人爽欧一区 | 国产不卡毛片 | 国产91免费观看 | 成人作爱视频 | 欧美日韩电影在线播放 | 黄色www在线观看 | 91福利视频免费观看 | 亚洲美女视频在线观看 | 久久超碰网 | 伊人久久av| 日韩影视在线 | 97视频在线 | 亚洲成人第一区 | www.黄色| 91成人破解版| 手机版av在线 | 亚洲视频分类 | 4hu视频 | 国产在线观看不卡 | 中文在线字幕免费观看 | 一级免费片 | 有码一区二区三区 | 成人影片在线播放 | 天天射天天射天天射 | 99色在线| 亚洲欧洲精品视频 | 国产成年免费视频 | 在线免费色 | 天天色综合1| 国产日产av | 久久精品视频网站 | 午夜精品福利影院 | 玖玖999| 91刺激视频| 毛片基地黄久久久久久天堂 | 日韩av成人免费看 | 91av99| 成人9ⅰ免费影视网站 | 天天干天天碰 | 成人精品久久久 | 国内精品久久久久久久久久久 | 久久精品视频在线免费观看 | 天天综合狠狠精品 | 国产91精品高清一区二区三区 | 免费观看全黄做爰大片国产 | 色婷婷激情电影 | 91视频国产免费 | 在线视频成人 | 91av免费看 | 成人免费在线电影 | av免费片 | 超碰免费在线公开 | 五月婷网站 | 精品一区二区免费在线观看 | 91麻豆精品国产91久久久无需广告 | 日韩在线精品 | 国产亚洲婷婷免费 | 日韩中文久久 | 国产无遮挡又黄又爽馒头漫画 | av电影在线观看 | www.在线看片.com | 国产露脸91国语对白 | 涩涩网站在线播放 | 亚洲一区网站 | 黄色成品视频 | 美女黄网站视频免费 | 亚洲 欧美 综合 在线 精品 | 伊人电影在线观看 | 69国产盗摄一区二区三区五区 | 久久国产精品久久精品国产演员表 | 久草在线视频中文 | 日韩女同一区二区三区在线观看 | 最近中文字幕完整高清 | 91探花在线视频 | 91香蕉视频黄| 在线观看免费视频你懂的 | 在线色网站| 日韩av不卡在线播放 | 国产成人精品一区二三区 | 99热99| 久草观看视频 | 国内精品久久影院 | 91在线免费观看网站 | 免费观看全黄做爰大片国产 | 成人精品国产 | 欧美a级在线播放 | 少妇按摩av | 亚洲 精品在线视频 | 亚洲国产视频直播 | 911香蕉 | 国内久久看 | 天天干,夜夜操 | av超碰在线 | 四虎影视精品永久在线观看 | 久久国产片 | 日韩中文字幕免费视频 | 五月天免费网站 | 欧美日本日韩aⅴ在线视频 插插插色综合 | 久久免费在线 | 91综合色 | 午夜精品久久久久久 | 久久蜜桃av | 精品视频国产 | 激情综合啪啪 | 丁香婷婷色综合亚洲电影 | 国产亚洲精品久 | 国产午夜激情视频 | 亚洲综合色激情五月 | 日本亚洲国产 | 欧美a级在线免费观看 | 国产精品日韩在线观看 | 777视频在线观看 | 亚洲天堂在线观看完整版 | 国产91精品看黄网站 | 久久久免费电影 | 久久99精品国产91久久来源 | 久草精品资源 | 亚洲精品国偷拍自产在线观看蜜桃 | 99人久久精品视频最新地址 | 国产在线欧美日韩 | 中文字幕.av.在线 | 久久久激情视频 | 日日爽夜夜操 | 九九在线高清精品视频 | 伊人黄 | www激情网 | 免费国产亚洲视频 | 99精品免费久久久久久久久 | 免费视频一级片 | 免费韩国av | 久久女教师 | 国产精品成人一区二区三区吃奶 | 午夜精品99久久免费 | 国产精品久久久久永久免费观看 | 伊人久操| www.黄色小说.com | 国产五月| 91高清视频在线 | 免费成人看片 | 免费看的视频 | 天天爽天天爽天天爽 | 国产一区二区久久久久 | 麻豆94tv免费版 | 日韩中文在线播放 | 狠狠综合 | 久久视频在线免费观看 | 午夜精品成人一区二区三区 | 美女网站视频免费黄 | 久久另类小说 | 黄色在线看网站 | 国产91精品一区二区麻豆网站 | 国内精品久久久久影院优 | 综合久久婷婷 | 成人影音av| 日韩视频中文字幕在线观看 | 91热在线| 99精品视频一区二区 | 狠狠躁天天躁综合网 | 国产精品美女免费视频 | 亚洲韩国一区二区三区 | 久久精品国产99国产 | 国产伦精品一区二区三区… | 久久在线播放 | 色综合久久88色综合天天免费 | 国产精品人成电影在线观看 | 欧美视频一区二 | 91精品亚洲影视在线观看 | 久久精品999| 欧美成人a在线 | 免费观看国产视频 | 亚洲精品玖玖玖av在线看 | 国产婷婷色 | 久久影视中文字幕 | 亚洲激情综合 | 国产成人久久 | 久久国产成人午夜av影院宅 | 三级黄色网址 | 国产黄大片 | 精品一区二区久久久久久久网站 | 91在线观| 国产精品久久久久久久久久三级 | 免费久草视频 | 天天干天天摸 | 在线观看黄污 | 91九色国产蝌蚪 | 狠狠操综合网 | 日本三级在线观看中文字 | 日日干 天天干 | 欧美一级性 | 久久久久久久影视 | 国产麻豆视频免费观看 | 亚洲精品av中文字幕在线在线 | 亚洲欧洲一区二区在线观看 | 久久伦理电影网 | 91在线视频观看免费 | 国产美女网站视频 | 久久久午夜影院 | 三级黄色网络 | 成人sm另类专区 | 欧美一级爽 | 最新中文字幕视频 | 久久久久久99精品 | 天天干夜夜夜操天 | 国产麻豆视频在线观看 | 草在线 | 玖玖在线播放 | 国产高清不卡 | 色婷婷综合视频在线观看 | 在线精品观看国产 | av播放在线 | 免费91在线观看 | 中文字幕在线免费观看 | 国产一级91 | 国产专区视频在线观看 | 日韩欧美精品在线观看视频 | 精品国产乱码久久久久久浪潮 | 九色视频网址 | 在线看毛片网站 | 91精品国产综合久久福利 | 日韩久久在线 | 日韩欧美精品在线 | 亚洲综合干| 久久精品成人欧美大片古装 | 国产夫妻av在线 | 亚洲欧美偷拍另类 | 欧美狠狠操 | 天天综合久久 | 国产一区二区中文字幕 | 日本少妇高清做爰视频 | 99精品免费久久久久久久久 | 激情丁香 | 日韩欧美在线中文字幕 | 国产流白浆高潮在线观看 | 国产专区视频在线 | 久久久免费看视频 | 久久国产成人午夜av影院潦草 | 97品白浆高清久久久久久 | 毛片网站免费在线观看 | 美女在线国产 | 色在线视频 | 在线黄色av电影 | 久久久黄色av| 国产精品久久毛片 | 国产一区国产精品 | 狠狠干我 | 69精品人人人人 | 亚洲无吗av | 人人舔人人舔 | 国产精品视频不卡 | 欧美日韩午夜 | 免费毛片一区二区三区久久久 | 久久综合婷婷国产二区高清 | www.国产在线 | 日韩午夜高清 | wwxxxx日本| 成人性生交大片免费看中文网站 | 国产精品久久久久久爽爽爽 | 91福利视频免费观看 | 精品超碰 | 国产精品久久久久久高潮 | 国产精品美女久久久免费 | 久久免费的精品国产v∧ | 亚洲成a人片在线观看网站口工 | 精品久久久久久亚洲综合网站 | 中文字幕 成人 | 免费日韩一级片 | 久久艹精品 | 中字幕视频在线永久在线观看免费 | 2023av在线 | 久久99精品久久久久蜜臀 | 久久1区| 在线av资源| 精品视频9999| 在线观看片 | 五月天丁香视频 | 中文字幕日韩精品有码视频 | www99久久| 久久精品欧美 | 色婷婷免费视频 | 亚洲经典视频在线观看 | 国产在线免费观看 | 成年人看片网站 | 国产一区在线看 | 国产视频 亚洲视频 | 美女网站视频免费黄 | 成年人电影免费在线观看 | 亚洲精品天天 | a级国产片 | 夜夜爽天天爽 | 国产精品久久99综合免费观看尤物 | 99草在线视频 | 一级黄色片在线免费看 | 国产丝袜制服在线 | 久久99国产精品二区护士 | 国产精品毛片一区二区在线看 | 成人三级视频 | 午夜精品一区二区三区在线观看 | 亚洲黄色软件 | 一区二区精品国产 | 日韩成人免费电影 | 四虎在线观看网址 | 亚洲精品视频 | 国产91在线看 | 国产精品久久久久婷婷 | 国产精品一区二区免费在线观看 | 美女视频永久黄网站免费观看国产 | 人人操日日干 | 中文免费在线观看 | 国产在线黄 | 免费精品久久久 | 久久精品视频日本 | 国产精品99久久久精品免费观看 | 天堂av在线免费观看 | 日韩精品中文字幕在线观看 | 免费高清在线观看成人 | 中文字幕一区二区三区久久蜜桃 | 天天操天天摸天天干 | 又黄又爽的视频在线观看网站 | 国产成人久久久77777 | 久久久99精品免费观看乱色 | 最近免费观看的电影完整版 | 日批在线看 | 97色噜噜 | 国产精品久久9 | 久久久久久久影视 | 337p西西人体大胆瓣开下部 | 最新av网站在线观看 | 久久新视频 | 久久免费视频3 | 免费精品视频在线观看 | 久久久久久国产精品美女 | 91新人在线观看 | 色综合中文综合网 | 久久91网| 亚洲最大av | 国产成本人视频在线观看 | 国产精品 亚洲精品 | 国产精品99页 | 999一区二区三区 | 激情视频免费在线 | 亚洲va韩国va欧美va精四季 | av视屏在线播放 | 一区二区视频免费在线观看 | 菠萝菠萝蜜在线播放 | 国产成人精品综合 | 国产+日韩欧美 | 国产主播99| 国产最新福利 | 三级黄色免费 | 久久一区精品 |