diff --git a/app.js b/app.js index b2a5037..18a08c0 100644 --- a/app.js +++ b/app.js @@ -7,6 +7,7 @@ var bodyParser = require('body-parser'); var index = require('./routes/index'); var users = require('./routes/users'); +var message = require('./routes/message'); var app = express(); @@ -24,6 +25,7 @@ app.use(express.static(path.join(__dirname, 'public'))); app.use('/', index); app.use('/users', users); +app.use('/message', message); // catch 404 and forward to error handler app.use(function(req, res, next) { diff --git a/io/io.js b/io/io.js index 9f2b2e7..3d6a9c2 100644 --- a/io/io.js +++ b/io/io.js @@ -8,6 +8,7 @@ var msgType = require('./messageTpye'); var ioSvc = require('./ioHelper').ioSvc; var AppConfig = require('../config'); var Common = require('../utils/common'); +var msgModel = require('../model/message'); //服务端连接 function ioServer(io) { @@ -192,6 +193,11 @@ function ioServer(io) { //监听客户端发送的信息,实现消息转发到各个其他客户端 socket.on('message',function(msg){ + msgModel.add(msg.from_uid,msg.uid,msg.content,function (err) { + if(err){ + console.error(err); + } + }); if(msg.type == msgType.messageType.public){ var mg = { "uid" : msg.from_uid , diff --git a/model/message.js b/model/message.js new file mode 100644 index 0000000..3f99fc0 --- /dev/null +++ b/model/message.js @@ -0,0 +1,40 @@ +var mongoose = require('../utils/mongoose').mongoose; + +var Schema = mongoose.Schema; + +var MessageSchema = new Schema({ + from_uid : { type:String ,index: true}, + to_uid : { type:String ,index: true}, + content : { type:String }, + time : { type:Date, default:Date.now } +}); + +var MessageModel = mongoose.model("message", MessageSchema); + +function add(from_uid,to_uid,content,callback) { + var info = { + "from_uid" : from_uid, + "to_uid" : to_uid, + "content" : content + }; + var msgModel = new MessageModel(info); + msgModel.save(function(err, res){ + return callback(err,res); + }); +} + +function query(page,size,uid,callback) { + var query = MessageModel.find({}); + var condition = []; + if(uid){ + condition.push({"from_uid":uid}); + condition.push({"to_uid":uid}); + } + + var skip = (page - 1) * size; + query.or(condition).skip(skip).limit(size).sort({"time":-1}).exec(callback); +} + + +exports.add = add; +exports.query = query; \ No newline at end of file diff --git a/model/users.js b/model/users.js new file mode 100644 index 0000000..bbd45e3 --- /dev/null +++ b/model/users.js @@ -0,0 +1,47 @@ +var mongoose = require('../mongoose').mongoose; +var crypto = require('crypto'); + +var Schema = mongoose.Schema; + +var UsersSchema = new Schema({ + username : { type:String }, + password : { type:String }, + time : { type:Date, default:Date.now } +}); + +var UsersModel = mongoose.model("users", UsersSchema); + +function login(username,password,callback) { + var md5 = crypto.createHash('md5'); + password = md5.update(password).digest('hex'); + var condition = {'username' : username,'password':password}; + + UsersModel.findOne(condition, function(err, res){ + var _err = null; + if (err) { + _err = err; + } + if(!res){ + _err = '用户名密码不正确'; + } + return callback(_err,res); + }) +} + +function reset_psw(username,psw_old,psw_new,callback) { + psw_old = crypto.createHash('md5').update(psw_old).digest('hex'); + UsersModel.find({username:username,password:psw_old},function (err,info) { + if (err) { + return callback(err,null); + } + + if(!info || info.length == 0){ + return callback('原密码不正确',null); + } + psw_new = crypto.createHash('md5').update(psw_new).digest('hex'); + UsersModel.findOneAndUpdate({username:username,password:psw_old}, {password:psw_new}, callback); + }); +} + +exports.login = login; +exports.reset_psw = reset_psw; \ No newline at end of file diff --git a/package.json b/package.json index 5c88f7e..66d62d6 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "serve-favicon": "~2.4.2", "socket.io":"~2.0.4", "socket.io-client":"^2.0.4", - "redis":"^2.8.0" + "redis":"^2.8.0", + "mongoose":"^4.12.5" } } diff --git a/public/js/client/client.js b/public/js/client/client.js index dafb2c1..0242cda 100644 --- a/public/js/client/client.js +++ b/public/js/client/client.js @@ -1,9 +1,15 @@ $(function(){ //Socket.IO 连接 - var socket = io.connect('http://'+document.domain+':9010'); + var socket = io.connect('http://'+document.domain+':9010',{ + "transports":['websocket', 'polling'] + }); var uuid = ''; - function insert_client_html(time,content){ + function insert_client_html(content,datetime){ + var time = dateFormat(); + if(datetime){ + time = dateFormat("yyyy-MM-dd hh:mm:ss",new Date(datetime)); + } var tpl = '
'+ '
'+ '
' + time + '
'+ @@ -17,7 +23,11 @@ $(function(){ $(".msg-container").append(tpl); } - function insert_agent_html(time,content){ + function insert_agent_html(content,datetime){ + var time = dateFormat(); + if(datetime){ + time = dateFormat("yyyy-MM-dd hh:mm:ss",new Date(datetime)); + } var tpl = '
'+ '
'+ '
'+ @@ -40,9 +50,25 @@ $(function(){ div.scrollTop = div.scrollHeight; } + //获取最新的五条数据 + function get_message(uid) { + $.get('/message?uid='+uid,function (data) { + if(data.code == 200){ + data.data.reverse().forEach(function (msg) { + if(msg.from_uid == uid){ + insert_client_html(msg.content,msg.time); + }else{ + insert_agent_html(msg.content,msg.time); + } + + scrollToBottom(); + }); + } + }); + } + $("#btnSend").click(function(){ - var date = dateFormat(); var msg = $("#textarea").val(); if(msg){ var msg_sender = { @@ -52,7 +78,7 @@ $(function(){ "from_uid":uuid }; socket.emit('message', msg_sender); - insert_client_html(date,msg); + insert_client_html(msg); scrollToBottom(); $("#textarea").val(''); } @@ -71,7 +97,7 @@ $(function(){ "ip" : ip }; socket.emit('login', msg); - + get_message(uuid); }); // /* 后端推送来消息时 @@ -80,8 +106,7 @@ $(function(){ // content 消息 // */ socket.on('message', function(msg){ - insert_agent_html(dateFormat(),msg.content); + insert_agent_html(msg.content); scrollToBottom(); }); - }); \ No newline at end of file diff --git a/public/js/server/index.js b/public/js/server/index.js index a316b40..56435ed 100644 --- a/public/js/server/index.js +++ b/public/js/server/index.js @@ -6,7 +6,9 @@ layui.use(['layer', 'form', 'jquery'], function () { var currentUUID = ''; var uuid = ''; - var socket = io.connect('http://'+document.domain+':9010'); + var socket = io.connect('http://'+document.domain+':9010',{ + "transports":['websocket', 'polling'] + }); var uuids = []; var online_num = 0; @@ -33,28 +35,35 @@ layui.use(['layer', 'form', 'jquery'], function () { function insert_section(uid) { var html = ''; $(".message-container").append(html); + get_message(uid); } - function insert_agent_html(content){ - var date = dateFormat(); + function insert_agent_html(uid,content,datetime){ + var time = dateFormat(); + if(datetime){ + time = dateFormat("yyyy-MM-dd hh:mm:ss",new Date(datetime)); + } var html = '
\n' + '
\n' + - ' ' + date + '\n' + + ' ' + time + '\n' + ' \n' + '
\n' + '
\n' + '
' + content + '
\n' + '
\n' + '
'; - $('#section-'+currentUUID).append(html); + $('#section-'+uid).append(html); } - function insert_client_html(uid,content){ - var date = dateFormat(); + function insert_client_html(uid,content,datetime){ + var time = dateFormat(); + if(datetime){ + time = dateFormat("yyyy-MM-dd hh:mm:ss",new Date(datetime)); + } var html = '
\n' + '
\n' + - ' ' + date + '\n' + + ' ' + time + '\n' + ' 客户\n' + '
\n' + '
\n' + @@ -104,7 +113,8 @@ layui.use(['layer', 'form', 'jquery'], function () { $(".friend-head-right").html( online_num + ' / ' + num + ' 人' ); } - function getUsers() { + //获取在线用户 + function get_users() { $.get('/users',function (data) { if(data.code == 200){ $('.chat-user').html(''); @@ -131,6 +141,23 @@ layui.use(['layer', 'form', 'jquery'], function () { }); } + //获取最新的五条数据 + function get_message(uid) { + $.get('/message?uid='+uid,function (data) { + if(data.code == 200){ + data.data.reverse().forEach(function (msg) { + if(msg.from_uid == uid){ + insert_client_html(msg.from_uid,msg.content,msg.time); + }else{ + insert_agent_html(msg.to_uid,msg.content,msg.time); + } + + scrollToBottom(); + }); + } + }); + } + $(".btnMsgSend").click(function(){ var msg = $("#msg-send-textarea").val(); if(msg){ @@ -141,7 +168,7 @@ layui.use(['layer', 'form', 'jquery'], function () { "from_uid":uuid }; socket.emit('message', msg_sender); - insert_agent_html(msg); + insert_agent_html(currentUUID,msg); scrollToBottom(); $("#msg-send-textarea").val(''); } @@ -221,5 +248,5 @@ layui.use(['layer', 'form', 'jquery'], function () { }); init(); - getUsers(); + get_users(); }); \ No newline at end of file diff --git a/routes/message.js b/routes/message.js new file mode 100644 index 0000000..c62a114 --- /dev/null +++ b/routes/message.js @@ -0,0 +1,23 @@ +var express = require('express'); +var router = express.Router(); +var msgModel = require('../model/message'); + +router.get('/', function(req, res, next) { + var page = req.query.page || 1; + var size = req.query.size || 10; + var uid = req.query.uid; + + if(!uid){ + return res.send({code:500,msg:"参数不全"}); + } + + msgModel.query(page,size,uid,function (err,data) { + if(err){ + console.error(err); + return res.send({code:400,msg:"系统错误"}); + } + return res.send({code:200,msg:"获取成功",data:data}); + }); +}); + +module.exports = router; \ No newline at end of file diff --git a/utils/mongoose.js b/utils/mongoose.js new file mode 100644 index 0000000..3f1b1cd --- /dev/null +++ b/utils/mongoose.js @@ -0,0 +1,26 @@ +var mongoose = require("mongoose"); +const DB_URL = 'mongodb://127.0.0.1:27017/kefu'; +mongoose.connect(DB_URL); + +/** + * 连接成功 + */ +mongoose.connection.on('connected', function () { + console.log('Mongoose connection open to ' + DB_URL); +}); + +/** + * 连接异常 + */ +mongoose.connection.on('error',function (err) { + console.log('Mongoose connection error: ' + err); +}); + +/** + * 连接断开 + */ +mongoose.connection.on('disconnected', function () { + console.log('Mongoose connection disconnected'); +}); + +exports.mongoose = mongoose; \ No newline at end of file