Vue全家桶+Socket.io+Express/Koa2打造網(wǎng)頁(yè)版手機(jī)QQ

vue-qq

Vue全家桶+Socket.io+Express/Koa2打造一款網(wǎng)頁(yè)版手機(jī)QQ


寫(xiě)在前面

這個(gè)項(xiàng)目是利用學(xué)習(xí)之余寫(xiě)的一個(gè)高仿騰訊QQ app的單頁(yè)SPA應(yīng)用,整個(gè)項(xiàng)目包含20多個(gè)頁(yè)面元旬,涉及實(shí)時(shí)群聊算凿,實(shí)時(shí)私聊噪服,特別關(guān)心克握,屏蔽對(duì)方聊天霜医,添加好友事镣,個(gè)性名片等等,后續(xù)頁(yè)面還是開(kāi)發(fā)中古劲。寫(xiě)這個(gè)項(xiàng)目主要目的是練習(xí)和熟悉vue全家桶斥赋,利用socket.io實(shí)現(xiàn)實(shí)時(shí)聊天。


預(yù)覽

在線預(yù)覽地址:http://lenshen.com:8080/? ? ?(為了體驗(yàn)到最佳的效果产艾,提供了3個(gè)測(cè)試賬號(hào)疤剑,需要賬號(hào)才能登陸哦,具體賬號(hào)和密碼下面有講)


技術(shù)棧

Vue2.0:實(shí)現(xiàn)前端頁(yè)面構(gòu)建

Vuex:實(shí)現(xiàn)不同組件間的狀態(tài)共享

Vue-router:頁(yè)面路由切換,實(shí)現(xiàn)單頁(yè)的核心

vueg:頁(yè)面復(fù)雜場(chǎng)景切換效果

Socket.io:實(shí)現(xiàn)實(shí)時(shí)消息推送

axios:一個(gè)基于Promise的 HTTP 庫(kù)闷堡,向后端發(fā)起請(qǐng)求

Express隘膘、Koa2:開(kāi)發(fā)環(huán)境使用Express,生產(chǎn)環(huán)境使用Koa2

ES6杠览、ES7弯菊、ES8:服務(wù)端和客戶端均使用ES6語(yǔ)法,promise/async/await 處理異步

localStorage:本地保存用戶信息

Webpack:模塊打包踱阿,前端項(xiàng)目構(gòu)建工具首選

SASS(SCSS):CSS預(yù)處理語(yǔ)言

Flex:flex彈性布局管钳,簡(jiǎn)單適配手機(jī)、PC端

CSS3:CSS3過(guò)渡動(dòng)畫(huà)及樣式

IScroll:模擬原生app的列表滾動(dòng)效果(ListView)

MySQL:MySQL關(guān)系型數(shù)據(jù)庫(kù)持久化數(shù)據(jù)(考慮到表與表之間關(guān)系復(fù)雜软舌,需要多表查詢蹋嵌,最復(fù)雜的時(shí)候是六張表聯(lián)查,用MySQL會(huì)比Mongodb好得多)

jsonp:跨域請(qǐng)求數(shù)據(jù)

pm2:服務(wù)端使用pm2部署葫隙,常駐進(jìn)程,比f(wàn)orever好用得多(https://github.com/Unitech/pm2)


使用方式

clone源碼后躏仇,先將根目錄下的qq.sql導(dǎo)入到你的MySQL數(shù)據(jù)庫(kù)里(可以使用Navicat導(dǎo)入)恋脚,用戶名為root,登錄密碼為空焰手。啟動(dòng)MySQL服務(wù)糟描。然后使用cnpm install 安裝所有依賴,最后運(yùn)行npm run dev书妻。服務(wù)器部署只需要運(yùn)行npm run pm2(前提是得先全局安裝pm2)船响。

盡量使用Chrome瀏覽器體驗(yàn)最佳效果。另外提供了三個(gè)測(cè)試賬號(hào),默認(rèn)用戶的密碼都是6個(gè)1:

qq:986992484 密碼:111111

qq:986992483 密碼:111111

qq:986992482 密碼:111111

目前已經(jīng)實(shí)現(xiàn)了QQ的核心功能见间,如消息列表聊闯、好友列表、新朋友米诉、好友申請(qǐng)菱蔬、實(shí)時(shí)群聊、實(shí)時(shí)私聊史侣、聊天設(shè)置拴泌、屏蔽對(duì)方聊天、特別關(guān)心惊橱、會(huì)員等級(jí)蚪腐、個(gè)性名片、添加好友税朴、刪除好友回季、好友分組、查找用戶掉房、登錄茧跋、注銷(xiāo)、切換用戶卓囚、右滑顯示滑動(dòng)側(cè)欄等等瘾杭。后期會(huì)考慮增加更多功能。如果你想體驗(yàn)實(shí)時(shí)聊天的酷炫效果哪亿,那么你可以打開(kāi)兩個(gè)瀏覽器粥烁,用上面不同的賬號(hào)登錄即可。


截圖

消息頁(yè)面


聯(lián)系人頁(yè)面


群聊


私聊



分析

服務(wù)端使用ES6語(yǔ)法

不需要使用babel轉(zhuǎn)碼以及一系列的配置蝇棉,只需要將node升級(jí)到V8版本讨阻,V8已經(jīng)很好地支持了ES6/ES7/ES8等最新特性,這是目前最好的辦法篡殷。升級(jí)到V8版本钝吮,可以直接到nodejs中文網(wǎng)(http://nodejs.cn/download/) 下載即可,也可以使用NVM切換node版本板辽。

升級(jí)到V8后奇瘦,還不支持通過(guò)import/export關(guān)鍵字來(lái)導(dǎo)入導(dǎo)出模塊(因?yàn)榉?wù)端已經(jīng)有了CommonJS規(guī)范,如果再使用import/export的話就有點(diǎn)沖突了)劲弦,如果一定要使用import/export關(guān)鍵字耳标,這時(shí)可以在服務(wù)端的入口文件首行添加以下代碼:

require("babel-core/register")({

? ? ?presets: ['es2015', 'stage-0']

})

require("babel-polyfill")

上面的代碼不可以使用import來(lái)導(dǎo)入,必須使用require邑跪,同時(shí)需要通過(guò)npm安裝babel-core次坡、babel-preset-es2015呼猪、babel-preset-stage-0、babel-polyfill等依賴砸琅。這樣就可以愉快地使用import/export了。

Socket.io

服務(wù)端(結(jié)合Express/Koa):

// Server

import express from 'express'

import http from 'http'

import socketio from 'socket.io'

const app = express()

const server = http.createServer(app)

const io = socketio(server)

server.listen(3000)

io.on('connection', (socket)=>{

?socket.emit('news', { hello: 'world' })

socket.on('my other event', function (data) {

console.log(data)

})

})

客戶端:

// Client

const socket = io.connect('http://localhost:3000')

socket.on('news', (data)=>{

? ? ? socket.emit('my other event', { my: 'data' })

})

socket.io最核心的兩個(gè)api就是`emit` 和 `on`了 明棍,服務(wù)端和客戶端都有這兩個(gè)api。通過(guò) `emit` 和 `on`可以實(shí)現(xiàn)服務(wù)器與客戶端之間的雙向通信沸版。

`emit` :發(fā)射一個(gè)事件,第一個(gè)參數(shù)為事件名兴蒸,第二個(gè)參數(shù)為要發(fā)送的數(shù)據(jù)视粮,第三個(gè)參數(shù)為回調(diào)函數(shù)(如需對(duì)方接受到信息后立即得到確認(rèn)時(shí),則需要用到回調(diào)函數(shù))橙凳。

`on` :監(jiān)聽(tīng)一個(gè) emit 發(fā)射的事件,第一個(gè)參數(shù)為要監(jiān)聽(tīng)的事件名岛啸,第二個(gè)參數(shù)為回調(diào)函數(shù)钓觉,用來(lái)接收對(duì)方發(fā)來(lái)的數(shù)據(jù),該函數(shù)的第一個(gè)參數(shù)為接收的數(shù)據(jù)坚踩。

服務(wù)端常用API:

`socket.emit()`:向建立該連接的客戶端發(fā)送消息

`socket.on()`:監(jiān)聽(tīng)客戶端發(fā)送信息

`io.to(socketid).emit()`:向指定客戶端發(fā)送消息

`io.sockets.socket(socketid).emit()`:向指定客戶端發(fā)送消息荡灾,新版本用`io.sockets.socket[socketid].emit()` 瞬铸,數(shù)組訪問(wèn)`

socket.broadcast.emit()`:向除去建立該連接的客戶端的所有客戶端廣播

`io.sockets.emit()`:向所有客戶端廣播

客戶端常用API:

`socket.emit()`:向服務(wù)端發(fā)送消息

`socket.on()`:監(jiān)聽(tīng)服務(wù)端發(fā)來(lái)的信息

最后

源碼地址:https://github.com/lensh/vue-qq

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嗓节,一起剝皮案震驚了整個(gè)濱河市荧缘,隨后出現(xiàn)的幾起案子拦宣,更是在濱河造成了極大的恐慌,老刑警劉巖鸵隧,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掰派,死亡現(xiàn)場(chǎng)離奇詭異左痢,居然都是意外死亡系洛,警方通過(guò)查閱死者的電腦和手機(jī)略步,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)趟薄,“玉大人,你說(shuō)我怎么就攤上這事恩够∠鄄” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵也切,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我疆股,道長(zhǎng)倒槐,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任导犹,我火速辦了婚禮,結(jié)果婚禮上谎痢,老公的妹妹穿的比我還像新娘。我一直安慰自己节猿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布峰鄙。 她就那樣靜靜地躺著太雨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪囊扳。 梳的紋絲不亂的頭發(fā)上兜看,一...
    開(kāi)封第一講書(shū)人閱讀 49,046評(píng)論 1 285
  • 那天狭瞎,我揣著相機(jī)與錄音,去河邊找鬼弧轧。 笑死碗殷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的亿扁。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼襟己,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼牍陌!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起毒涧,我...
    開(kāi)封第一講書(shū)人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤契讲,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后捡偏,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡你虹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年彤避,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片董饰。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖尖阔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤块茁,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布数焊,位于F島的核電站,受9級(jí)特大地震影響佩耳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜干厚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一蛮瞄、第九天 我趴在偏房一處隱蔽的房頂上張望所坯。 院中可真熱鬧挂捅,春花似錦、人聲如沸状土。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)退盯。三九已至,卻和暖如春渊迁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背毒租。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惕医,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓抬伺,卻偏偏與公主長(zhǎng)得像灾梦,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子能岩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容