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

(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+")";
}