摘要:主要表現在復雜的語句事務支持等。僅支持,在等瀏覽器中,會出現樣式布局混亂的情況。將群群對應的聊天記錄保存在數據庫。用戶進入群聊,則將其加入到對應的中。文件大小不能超過通過模塊操作登錄注冊將用戶名作為唯一值。登錄支持自動登錄,將密碼保存在中。
項目地址
服務器源碼地址:https://github.com/ermu592275254/chat-socket 網頁源碼地址:https://github.com/ermu592275254/chat-socket項目設計概述 相關技術 nodejs
使用nodejs搭建后臺,因為是一個單頁應用,并且前后端通信使用了webSocket,所有只用http模塊搭建一個簡單的服務器,未使用koa、express等web框架。
webSocket使用socket.io實現webSocket,前端通過import socket.io 的方式會出現不斷重連的情況,于是使用script方式實現。
const io = require("socket.io-client"); // or with import syntax import io from "socket.io-client"; // or scriptmongodb
使用mongoose操作mongodb。mongodb這類非關系型數據庫,功能較關系型數據庫閹割了許多。主要表現在復雜的sql語句、事務支持等。
vue使用vue以及vue的衍生產品,同時用到bootstarp作為樣式框架。簡單兼容了PC和移動。(PC僅支持chrome,在firefox、ie等瀏覽器中,會出現樣式、布局混亂的情況)。
功能點實現 私聊通過用戶名和socketId進行匹配。保存用戶每次登錄的socketId,當對方在線時,將此信息通過socketId發送給對方。不在線僅保存到數據庫,用戶上線即可在私聊中查看。目前不支持消息通知,也不支持未讀消息
...// 每次登錄都將socketId替換為當前登錄的socketId userModel.update({username: data.username}, {socketId: socket.id}).then(res => { socket.emit("login", user); }).catch(err => { console.log(err); socket.emit("err", "update user socketId was failed"); }); ...
chatModel.findOne({sendTime: time}).populate("sender receiver").then(newChat=>{ let receiverData = { receiver: data.sender, data: newChat }; // 如果對方在線就發送給對方 if (io.sockets.connected[user.socketId]) { io.sockets.connected[user.socketId].emit("newMessage", receiverData); } let senderData = { receiver: data.receiver, data: newChat }; // 同時也發送給自己(也可直接在前端添加,后端不發送) io.sockets.connected[socket.id].emit("newMessage", senderData); }).catch(err=>{ io.sockets.connected[socket.id].emit("err", "can`t find the newMessage") })群聊
通過broadcast實現組發送。將群、群對應的聊天記錄保存在數據庫。用戶進入群聊,則將其加入到對應的broadcast中。
socket.on("joinRoom", function(data) { if (!common.checkData(data)) { io.sockets.connected[socket.id].emit("err", "request params Can`t be empty"); return; } // 加入對應的群聊 socket.join(data.groupName, function() { let roomName = Object.keys(socket.rooms); io.to(data.groupName, `${data.username} has joined the room`); socket.broadcast.in("data.groupName").emit("newUserJoin", { groupName: data.groupName, username: data.username }) }); })
groupChatModel.findOne({"sendTime": time}).populate("sender").then(res=>{ if(res){ // 發送給自己 io.sockets.connected[socket.id].emit("newMsgOfGroup", res); // 將消息發送給群里的所有人除了自己 socket.broadcast.in(data.groupName).emit("newMsgOfGroup", res); } else { io.sockets.connected[socket.id].emit("err", "the message data is null"); }頭像上傳
同樣使用webSocket,將頭像ID保存在用戶信息表中,將圖片文件保存在服務器static文件夾中。
uploadIcon(){ let file = this.$refs.uploadEl.files[0]; console.log(file); if(file.size > 100000){ this.Toast("文件大小不能超過1M"); this.$refs.uploadEl.value = ""; return; } let data = { username: this.user.username, file: file, type: file.type.split("/")[1] }; socket.emit("uploadUserIcon", data); this.$refs.uploadEl.value = ""; }
socket.on("uploadUserIcon", function(data) { let time = new Date().getTime(); let savePath = `/static/userIcon/${time}.${data.type}`; let hostPath = "http://" + host + ":" + port; // 通過fs模塊操作 fs.writeFile("."+ savePath, data.file, function(err) { if (err) { console.log(err); io.sockets.connected[socket.id].emit("err", "save userIcon failed"); } else { userModel.update({username: data.username}, {$set: {userIcon: hostPath + savePath}}).then(res => { userModel.findOne({username: data.username}).then(user=>{ io.sockets.connected[socket.id].emit("uploadUserIcon", { user: user, message: "upload userIcon success" }); }).catch(err =>{ io.sockets.connected[socket.id].emit("err", "find userInfo failed"); }); }).catch(err => { io.sockets.connected[socket.id].emit("err", "save userIcon path failed"); }) } }) });登錄注冊
將用戶名作為唯一值。注冊時不能注冊已存在的用戶名。登錄支持自動登錄,將密碼保存在localStorage中。
待處理bug以及優化 打包后靜態資源路徑有問題(有沒有大神能幫幫我QAQ) 需要未讀消息小紅點 增加表情、圖片發送最后: 這是本菜雞陸陸續續做了一年的項目,多次放棄又重新拾起。代碼寫得不堪入目,沒有精力和激情再去做優化了。暫時先這樣吧......
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/92941.html
摘要:先看看兼容性創建連接構造函數接收兩個參數這里的不能是或者而是對應的或者和是定義的兩種方案,類似于類似于協議名稱,是可選的。服務端和客戶端的協議名稱必須一致。協議有三種注冊協議,開放協議,自定義協議。限制以內就是在構造函數中選傳的參數。 愿天下所有的情侶,都是失散多年的兄妹 ——好妹妹webScoket是html5提出的一個協議,咱們用的http是無狀態...
摘要:在離開過渡被觸發時生效,在完成之后移除。可以鏈式的多次使用和用法相同,但是的元素會始終渲染并保存在中,只是改變值。用法如下對應前面的數據 在我一生的黃金時代,我有好多奢望。我想愛,想吃,還想在一瞬間變成天上半明半暗的云。 ——王小波上一章研究了vue中組件的通信,算是對vue的組件通信有了大致的了解。綜合上三章對搭建項...
摘要:用法如下注冊全局的指令注冊一個全局自定義指令當綁定元素插入到中。具體代碼如下當組件中需要用到其他的組件時,需要使用屬性去創建一個哈希表。具體用法如下包含組件引入組件在中添加組件的哈希表收尾除了上面這些屬性,還有一些雜項詳情請看官網 后來我才知道,生活就是個緩慢受錘的過程,人一天天老下去,奢望也一天天消失,最后變得像挨了錘的牛一樣。 ...
摘要:為安裝文件,無需再配置環境變量。連接操作有以下包作者并未查到除此之外的包,但不代表沒有。等于是每個默認配置的主鍵屬性,屬性名為可自己定義一個來覆蓋此屬性。需要注意的是,在新版本的文檔中,為。通過創建限于篇幅,本小節暫時寫到這里。 我的琴聲嗚咽,我的淚水全無。我把遠方的遠歸還草原。 - 海子《九月》 mongodb安裝 什么是Mongodb?就是一個基...
閱讀 725·2021-11-22 13:52
閱讀 1536·2021-09-27 13:36
閱讀 2839·2021-09-24 09:47
閱讀 2197·2021-09-22 15:48
閱讀 3611·2021-09-22 15:39
閱讀 1477·2019-08-30 12:43
閱讀 2929·2019-08-29 18:39
閱讀 3199·2019-08-29 12:51