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

項目簡介

主要是經過作一個多人在線多房間羣聊的小項目、來練手全棧技術的結合運用。前端

項目源碼:chat-vue-nodevue

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

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

編譯運行: github

1.開啓MongoDB服務,新建命令行窗口1:vue-router

mongod

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

cd server
node index.js

3.啓動前端vue頁面vuex

cd client
cnpm install
npm run dev

而後在瀏覽器多個窗口打開 localhost:8080,註冊不一樣帳號並登陸、便可進行多用戶多房間在線聊天。vue-cli

主要效果預覽:數據庫

代碼目錄概覽

|--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 ,裏面保留着開發摸索時的不少註釋。

相關文章
相關標籤/搜索