You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
278 lines
9.1 KiB
JavaScript
278 lines
9.1 KiB
JavaScript
(function () {
|
|
Vue.filter('ago', function (value) {
|
|
// 返回处理后的值
|
|
return Time(value,"%h:%m")
|
|
})
|
|
var obj=null;
|
|
var socket=null;
|
|
var audio=document.getElementById('audio');
|
|
var room="chartRoom";
|
|
var store={
|
|
state:{
|
|
"chartRoom":[]
|
|
}
|
|
}
|
|
var onlineItem = Vue.extend({
|
|
template:"#onlineItem",
|
|
props:['user','room','title','time'],
|
|
methods:{
|
|
changeRoom:function (user) {
|
|
this.$parent.room=user.id;
|
|
this.$parent.roomTitle=user.nickName;
|
|
},
|
|
lateMsg:function (user) {
|
|
if(store.state[user.id]&&(store.state[user.id].length>0)){
|
|
var len=store.state[user.id].length;
|
|
var lateMsg=store.state[user.id][len-1];
|
|
return lateMsg.content.msg;
|
|
}else {
|
|
return "";
|
|
}
|
|
}
|
|
}
|
|
});
|
|
var msgItem=Vue.extend({
|
|
template:"#msgTpl",
|
|
props:['msg']
|
|
});
|
|
var login=Vue.extend({
|
|
template:"#loginTpl",
|
|
data:function () {
|
|
return{
|
|
user:{
|
|
nickName:"",
|
|
pic:"content/headPic/1.jpg"
|
|
},
|
|
picList:['content/headPic/1.jpg',
|
|
'content/headPic/2.jpg',
|
|
'content/headPic/3.jpg',
|
|
'content/headPic/4.jpg',
|
|
'content/headPic/5.jpg',
|
|
'content/headPic/6.jpg',
|
|
'content/headPic/7.jpg',
|
|
'content/headPic/8.jpg',
|
|
'content/headPic/9.jpg',
|
|
'content/headPic/10.jpg']
|
|
}
|
|
},
|
|
props:['show'],
|
|
created:function () {
|
|
},
|
|
methods:{
|
|
hideLogin:function () {
|
|
this.$parent.isShow=false;
|
|
},
|
|
selectUserPic:function (item) {
|
|
this.user.pic=item;
|
|
},
|
|
login:function () {
|
|
if(this.user.nickName.Trim()==""){
|
|
document.querySelector(".error-msg-box").innerHTML="请输入正确昵称";
|
|
document.querySelector(".error-msg-box").style.display="inline";
|
|
}else {
|
|
document.querySelector(".error-msg-box").style.display="none";
|
|
if(!socket) {
|
|
socket = io.connect();
|
|
initSocket();
|
|
}
|
|
this.$parent.curUser=this.user;
|
|
socket.emit('login', this.user);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
var app = new Vue({
|
|
data:function () {
|
|
return{
|
|
isShow:false,
|
|
curUser:{
|
|
nickName:"似水流年",
|
|
pic:"./images/img.jpg"
|
|
},
|
|
txt:"",
|
|
keywords:'',
|
|
room:room,
|
|
userStatus:0,
|
|
time:new Date().getTime(),
|
|
onlineList:[],
|
|
msgList:[],
|
|
roomTitle:'群聊中'
|
|
}
|
|
},
|
|
mounted:function () {
|
|
var self=this;
|
|
obj=new Face({
|
|
el:document.querySelector('.web_wechat_face'),
|
|
callBack:function (face) {
|
|
self.txt+="【"+face.title+"】";
|
|
}
|
|
})
|
|
this.msgList=store.state[this.room];
|
|
$('body').on('click','.tool-menu',function (e) {
|
|
e.preventDefault()
|
|
e.stopPropagation();
|
|
$('.drop-box').toggle()
|
|
})
|
|
document.addEventListener("click",function (e) {
|
|
$('.drop-box').hide()
|
|
})
|
|
},
|
|
el: '#content',
|
|
components: {
|
|
'online-item': onlineItem,
|
|
'msg-item': msgItem,
|
|
'login': login
|
|
},
|
|
methods:{
|
|
sendMsg:function () {
|
|
if(this.txt.Trim()!=""){
|
|
var msgItem={
|
|
type:'send',
|
|
content:{
|
|
user:this.curUser,
|
|
msg:obj.replaceFace(this.txt)
|
|
},
|
|
time:new Date().getTime()
|
|
}
|
|
if(!store.state[this.room]){
|
|
store.state[this.room]=[]
|
|
}
|
|
store.state[this.room].push(msgItem)
|
|
this.postMsg(this.txt)
|
|
this.txt="";
|
|
}else {
|
|
this.msg="";
|
|
}
|
|
this.time=new Date().getTime();
|
|
this.$nextTick(function () {
|
|
this.scrollFooter()
|
|
})
|
|
},
|
|
postMsg:function (msg) {
|
|
if(socket){
|
|
if(this.room!='chartRoom'){
|
|
socket.emit('privateMsg',this.room, msg);
|
|
}else {
|
|
socket.emit('postMsg', msg);
|
|
}
|
|
}
|
|
},
|
|
filterName:function () {
|
|
var arr=[];
|
|
var self=this
|
|
this.onlineList.forEach(function (item ){
|
|
if(item.nickName.indexOf(self.keywords)!=-1){
|
|
arr.push(item)
|
|
}
|
|
})
|
|
return arr;
|
|
},
|
|
changeRoom:function () {
|
|
this.roomTitle='群聊中';
|
|
this.room="chartRoom";
|
|
this.msgList=store.state[this.room]
|
|
},
|
|
scrollFooter:function () {
|
|
document.querySelector(".msg-content").scrollTop = document.querySelector(".msg-content").scrollHeight;
|
|
}
|
|
},
|
|
watch:{
|
|
'room':function (curVal,oldVal) {
|
|
if(curVal!=oldVal){
|
|
if(!store.state[curVal]){
|
|
store.state[curVal]=[]
|
|
}
|
|
this.msgList=store.state[curVal];
|
|
}
|
|
}
|
|
}
|
|
});
|
|
function initSocket() {
|
|
socket.on('connect', function () {});
|
|
socket.on('nickExisted', function () {
|
|
document.querySelector(".error-msg-box").innerHTML="该昵称已存在";
|
|
document.querySelector(".error-msg-box").style.display="inline";
|
|
});
|
|
socket.on('loginSuccess', function (user,users) {
|
|
app.curUser=user;
|
|
document.title = 'Chat聊天室 | '+app.curUser.nickName;
|
|
app.isShow=false;
|
|
app.isPower=true;
|
|
app.userStatus=1;
|
|
users.forEach(function (item,index) {
|
|
if(item.nickName==app.curUser.nickName){
|
|
users.splice(index,1)
|
|
}
|
|
})
|
|
app.onlineList=users;
|
|
});
|
|
socket.on('error', function (err) {
|
|
console.log(err);
|
|
});
|
|
socket.on('system', function (user, users, type) {
|
|
var type=(type == 'login' ? ' 加入' : ' 离开');
|
|
var msg='系统消息:'+user.nickName+type+'了聊天室';
|
|
if(type != 'login'){
|
|
if(app.room==user.id){
|
|
app.room="chartRoom";
|
|
app.roomTitle="群聊中"
|
|
}
|
|
}
|
|
var msgItem={
|
|
type:"sys",
|
|
content:{
|
|
msg:msg
|
|
},
|
|
time:new Date().getTime()
|
|
}
|
|
store.state['chartRoom'].push(msgItem);
|
|
users.forEach(function (item,index) {
|
|
if(item.nickName==app.curUser.nickName){
|
|
users.splice(index,1)
|
|
}
|
|
})
|
|
app.onlineList=users;
|
|
});
|
|
socket.on('newMsg', function (user, msg) {
|
|
var msgItem={
|
|
type:"user",
|
|
content:{
|
|
user:user,
|
|
msg:obj.replaceFace(msg)
|
|
},
|
|
time:new Date().getTime()
|
|
}
|
|
store.state['chartRoom'].push(msgItem);
|
|
app.time=new Date().getTime();
|
|
if(app.room=='chartRoom'){
|
|
app.$nextTick(function () {
|
|
app.scrollFooter()
|
|
})
|
|
}
|
|
});
|
|
socket.on('personMsg',function (user,msg) {
|
|
var msgItem={
|
|
type:"user",
|
|
content:{
|
|
user:user,
|
|
msg:obj.replaceFace(msg)
|
|
},
|
|
time:new Date().getTime()
|
|
}
|
|
if(!store.state[user.id]){
|
|
store.state[user.id]=[]
|
|
}
|
|
store.state[user.id].push(msgItem)
|
|
app.time=new Date().getTime();
|
|
if(app.room==user.id){
|
|
app.$nextTick(function () {
|
|
app.scrollFooter()
|
|
})
|
|
}
|
|
audio.play();
|
|
})
|
|
}
|
|
})()
|
|
function init(res) {
|
|
document.querySelector('.bg-blur').style.backgroundImage="url("+res.images[0].url+")";
|
|
} |