国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

vue+socket.io+express+mongodb 實現簡易多房間在線群聊

android_c / 2578人閱讀

摘要:項目簡介主要是通過做一個多人在線多房間群聊的小項目來練手全棧技術的結合運用。編譯運行開啟服務,新建命令行窗口啟動服務端,新建命令行窗口啟動前端頁面然后在瀏覽器多個窗口打開,注冊不同賬號并登錄即可進行多用戶多房間在線聊天。

項目簡介

主要是通過做一個多人在線多房間群聊的小項目、來練手全棧技術的結合運用。

項目源碼:chat-vue-node

主要技術: vue2全家桶 + socket.io + node(express) + mongodb(mongoose)

環境配置: 需安裝配置好 node,mongodb環境(參考:[http://gjincai.github.io/categories/mongodb/); 建議安裝 Robomogo 客戶端來管理mongodb數據。

編譯運行:

1.開啟MongoDB服務,新建命令行窗口1:

mongod

2.啟動服務端node,新建命令行窗口2:

cd server
node index.js

3.啟動前端vue頁面

cd client
cnpm install
npm run dev

然后在瀏覽器多個窗口打開 localhost:8080,注冊不同賬號并登錄、即可進行多用戶多房間在線聊天。

主要效果預覽:

代碼目錄概覽
|--chat-vue-node
    |--client               // 前端客戶端:基于 vue-cli 搭建的所有聊天頁面
    |--server               // 后臺服務端
        |--api.js             // express 通過 mongoose 操作 mongodb 數據庫的所有接口
        |--db.js              // 數據庫初始化、Schema數據模型
        |--index.js           // 后臺服務啟動入口
        |--package.json
    .gitignore
    README.md
soeket.io 基礎

soeket.io 在該項目中用到的基本功能如下(詳情請看GitHub中的chatGroup.vue、server/index.js這兩文件代碼):

// 客戶端連接
var socket = io.connect("http://localhost:8081")
// 服務端監聽到連接
io.on("connection", function(socket){
  // ......
}

// 客戶端發送進入房間請求
socket.emit("joinToRoom", data)
// 服務端監聽
socket.on("joinToRoom", function (data) {
  // ......
  // 服務端處理進入房間、離開房間
  socket.join(roomGroupId)
  // 有人進入房間,向該群其它的成員發送更新在線成員
  io.sockets.in(roomGroupId).emit("joinToRoom", chat)
  io.sockets.in(roomGroupId).emit("updateGroupNumber", roomNum[roomGroupId])
}

// 客戶端發送聊天消息
socket.emit("emitChat", chat)
// 服務端監聽并向群內其它人群發該消息
socket.on("emitChat", function (data) {
  let roomGroupId = chat.chatToGroup
  // 向特定的群成員轉發消息
  socket.in(roomGroupId).emit("broadChat", chat)
})
數據結構設計

主要有三個數據結構模型:

// 用戶信息的數據結構模型
const accountSchema = new Schema({
  account: {type: Number},    // 用戶賬號
  nickName: {type: String},   // 用戶昵稱
  pass: {type: Number},       // 密碼
  regTime: {type: Number}     // 注冊時間
})
// 聊天群的數據結構模型:聊天群包含的成員
const relationSchema = new Schema({
  groupAccount: Number,       // 群賬號
  groupNickName: String,      // 群昵稱
  groupNumber: []             // 群成員
})
// 單個聊天群的聊天消息記錄
const groupSchema = new Schema({
  account: Number,            // 聊天者的賬號
  nickName: String,           // 聊天者的昵稱
  chatTime: Number,           // 發消息的時間戳
  chatMes: String,            // 聊天的消息內容
  chatToGroup: Number,        // 聊天的所在群賬號
  chatType: String            // 消息類型:進入群、離開群、發消息
})
vue-router 路由設計

頁面路由的跳轉全部由前端的 vue-router 處理,頁面功能少而全、僅3個:注冊登錄頁、個人中心頁、群聊頁

routes: [
  // {path: "/", name: "Hello", component: Hello},
  {path: "/", redirect: "/login", name: "Hello", component: Hello},
  {path: "/login", name: "Login", component: Login},
  {path: "/center", name: "Center", component: Center},
  {path: "/chatGroup", name: "ChatGroup", component: ChatGroup}
]
// 未登錄時,通過編程式跳去登錄頁:
router.push({ path: "login" })
vuex 全局狀態

主要是通過vuex來全局管理個人賬號的登錄狀態、當前所在群聊房間的信息:

export default new Vuex.Store({
  state: {
    chatState: {
      account: null,
      nickName: null
    },
    groupState: null   //  點擊進群的時候更新
  },
  mutations: {
    updateChatState (state, obj) {
      state.chatState = obj
    },
    updateGroupState (state, obj) {
      state.groupState = obj
    }
  },
  actions: {
    updateChatState ({commit}, obj) {
      commit("updateChatState", obj)
    },
    updateGroupState ({commit}, obj) {
      commit("updateGroupState", obj)
    }
  },
  getters: {
    getChatState (state) {
      return state.chatState
    },
    getGroupState (state) {
      return state.groupState
    }
  }
})

在全局中更新state、獲取state:

// 更新
this.$store.dispatch("updateChatState", {account: null, nickName: null})
// 獲取
this.$store.getters.getChatState
數據庫接口api
module.exports = function (app) {
  app.all("*", function(req, res, next) {
    next()
  })
  // api login 登錄
  app.get("/api/user/login", function (req, res) { // ... })
  // api register 注冊
  app.get("/api/user/register", function (req, res) { // ... })
  // getAccountGroup 獲取可進入的房間
  app.get("/api/user/getAccountGroup", function (req, res) { // ... })
  // getGroupNumber 獲取當前房間的群成員
  app.get("/api/user/getGroupNumber", function (req, res) { // ... })
  // api getChatLog 獲取當前房間的聊天記錄
  app.get("/api/getChatLog", function (req, res) { // ... })
  app.get("*", function(req, res){
    res.end("404")
  })
}

更多詳細的實現,請看 源碼 chat-vue-node ,里面保留著開發摸索時的很多注釋。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/19120.html

相關文章

  • 前言 項目開始是因為工作需要一個聊天室功能,但是因為某些原因最終選用的是基于xmpp協議的Strophe.js寫的。于是就想用node自己寫一套,本來只是想簡單的寫個聊天頁面,但是寫完了又不滿意,所以不斷的重構(似乎可以理解產品經理為什么老是改需求了?乛?乛?)。很多東西,比如mongodb,我也是第一次用,以前只接觸過mysql。所以都是一邊學一邊寫,利用工作之余的時間,斷斷續續的寫了幾個月(...

    PAMPANG 評論0 收藏0
  • 前言 項目開始是因為工作需要一個聊天室功能,但是因為某些原因最終選用的是基于xmpp協議的Strophe.js寫的。于是就想用node自己寫一套,本來只是想簡單的寫個聊天頁面,但是寫完了又不滿意,所以不斷的重構(似乎可以理解產品經理為什么老是改需求了?乛?乛?)。很多東西,比如mongodb,我也是第一次用,以前只接觸過mysql。所以都是一邊學一邊寫,利用工作之余的時間,斷斷續續的寫了幾個月(...

    fireflow 評論0 收藏0
  • React系列——websocket群聊系統在react的實現

    摘要:前奏這篇文章僅對不熟悉在中使用的人以及入門者有幫助。基本介紹想要實現一種實時的雙向通信聊天系統,你可能會想到輪詢長或短,但你最想要的還是的實現。客戶端的實現端的實現,才是我們應該關注的重點。 前奏 這篇文章僅對不熟悉在react中使用socket.io的人、以及websocket入門者有幫助。 下面這個動態圖展示的聊天系統是用react+express+websocket搭建的,很模糊...

    Acceml 評論0 收藏0
  • vue2.0開發聊天程序(八) 初步完成

    摘要:主要表現在復雜的語句事務支持等。僅支持,在等瀏覽器中,會出現樣式布局混亂的情況。將群群對應的聊天記錄保存在數據庫。用戶進入群聊,則將其加入到對應的中。文件大小不能超過通過模塊操作登錄注冊將用戶名作為唯一值。登錄支持自動登錄,將密碼保存在中。 showImg(https://segmentfault.com/img/bV4jYr?w=402&h=710);showImg(https://...

    wmui 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<