Commit 82649518 authored by looker's avatar looker

add tag

parent 3faa4225
...@@ -2,5 +2,7 @@ var merge = require('webpack-merge') ...@@ -2,5 +2,7 @@ var merge = require('webpack-merge')
var prodEnv = require('./prod.env') var prodEnv = require('./prod.env')
module.exports = merge(prodEnv, { module.exports = merge(prodEnv, {
NODE_ENV: '"development"' NODE_ENV: '"development"',
WX_ADDRESS: '"http://imdev.chenzhen.shop:9093/"',
IMG_ADDRESS:'"http://chat-x.oss-cn-beijing.aliyuncs.com/"'
}) })
...@@ -23,7 +23,7 @@ module.exports = { ...@@ -23,7 +23,7 @@ module.exports = {
}, },
dev: { dev: {
env: require('./dev.env'), env: require('./dev.env'),
port: 8080, port: 8078,
autoOpenBrowser: true, autoOpenBrowser: true,
assetsSubDirectory: 'static', assetsSubDirectory: 'static',
assetsPublicPath: '/', assetsPublicPath: '/',
...@@ -34,7 +34,8 @@ module.exports = { ...@@ -34,7 +34,8 @@ module.exports = {
// } // }
'/api': { '/api': {
pathRewrite: { '^/api': '' }, pathRewrite: { '^/api': '' },
target: 'http://imweb.chenzhen.shop', // target: 'http://imweb.chenzhen.shop',
target: 'http://imdev.chenzhen.shop/',
changeOrigin: true, //是否跨域 changeOrigin: true, //是否跨域
} }
}, },
......
module.exports = { module.exports = {
NODE_ENV: '"production"' NODE_ENV: '"production"',
WX_ADDRESS: "http://imweb.chenzhen.shop:9093",
IMG_ADDRESS:'"http://chat-x.oss-cn-beijing.aliyuncs.com/"'
} }
...@@ -5635,6 +5635,12 @@ ...@@ -5635,6 +5635,12 @@
"minimist": "0.0.8" "minimist": "0.0.8"
} }
}, },
"moment": {
"version": "2.24.0",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz",
"integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==",
"dev": true
},
"move-concurrently": { "move-concurrently": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
......
<!-- 聊天列表 --> <!-- 聊天列表 -->
<template> <template>
<div class="msglist"> <div class="msglist">
<ul> <ul v-if="user.whichPane==panelStatus.CHART">
<li v-for="item in searchedChatlist" class="sessionlist" :class="{ active: item.id === selectId }" @click="selectSession(item.id)"> <li v-for="item in chatlist" class="sessionlist" :class="{ active: item.id === user.selectId }" @click="selectSession(item)">
<div class="list-left"> <div class="list-left">
<img class="avatar" width="42" height="42" :alt="item.user.name" :src="item.user.img"> <img class="avatar" width="42" height="42" :alt="item.user.name" :src="item.user.img">
</div> </div>
<div class="list-right"> <div class="list-right">
<p class="name">{{item.user.name}}</p> <p class="name">{{item.user.name}}</p>
<span class="time">{{item.messages[item.messages.length-1].date | time}}</span> <span class="time">{{item.queryData | time}}</span>
<p class="lastmsg">{{item.messages[item.messages.length-1].content}}</p> <p class="lastmsg">{{item.messages[item.messages.length-1]?'':item.messages[item.messages.length-1].content}}</p>
</div>
</li>
</ul>
<ul v-if="user.whichPane==panelStatus.SEARCH">
<li v-for="item in searchChatlist" class="sessionlist" :class="{ active: item.id === user.selectId }" @click="selectSession(item)">
<div class="list-left">
<img class="avatar" width="42" height="42" :alt="item.user.name" :src="item.user.img">
</div>
<div class="list-right">
<p class="name">{{item.user.name}}</p>
<span class="time">{{item.queryData | time}}</span>
<p class="lastmsg">{{item.messages[item.messages.length-1]?'':item.messages[item.messages.length-1].content}}</p>
</div> </div>
</li> </li>
</ul> </ul>
...@@ -18,14 +30,18 @@ ...@@ -18,14 +30,18 @@
<script> <script>
import { mapState, mapActions ,mapGetters } from 'vuex' import { mapState, mapActions ,mapGetters } from 'vuex'
import { panelStatus } from '@/utils/common'
export default { export default {
computed: { computed: {
panelStatus(){
return panelStatus
},
...mapState([ ...mapState([
'selectId', 'user',
'searchText'
]), ]),
...mapGetters([ ...mapGetters([
'searchedChatlist' 'searchChatlist',
'chatlist'
]) ])
}, },
methods: { methods: {
...@@ -33,18 +49,23 @@ export default { ...@@ -33,18 +49,23 @@ export default {
'selectSession', 'selectSession',
]) ])
}, },
mounted() {
let obj = this.searchedChatlist[0]
this.selectSession(obj)
},
filters: { filters: {
// 将日期过滤为 hour:minutes time (date) {
time (date) { if(date){
if (typeof date === 'string') { date = new Date(parseInt(date) * 1000);
date = new Date(date);
}
if(date.getMinutes()<10){ if(date.getMinutes()<10){
return date.getHours() + ':0' +date.getMinutes(); return date.getHours() + ':0' +date.getMinutes();
}else{ }else{
return date.getHours() + ':' + date.getMinutes(); return date.getHours() + ':' + date.getMinutes();
} }
}else{
return ""
} }
}
}, },
} }
</script> </script>
......
<!-- 消息框 -->
<template> <template>
<div class="message"> <div>
<header class="header"> <div class="message" v-if="user.whichPane==panelStatus.CHART">
<div class="friendname">{{selectedChat.user.name}}</div> <header class="header">
</header> <div class="friendname">{{selectedChat&&selectedChat.user.name}}</div>
<div class="message-wrapper" ref="list"> </header>
<ul v-if="selectedChat"> <div class="message-wrapper" ref="list">
<li v-for="item in selectedChat.messages" class="message-item"> <ul v-if="selectedChat">
<div class="time"><span>{{item.date | time}}</span></div> <li v-for="item in messages" class="message-item">
<div class="main" :class="{ self: item.self }"> <div v-if="item.type==1" class="main" :class="{ self: item.isSend }">
<img class="avatar" width="36" height="36" :src="item.self ? user.img : selectedChat.user.img" /> <img class="avatar" width="36" height="36" :src="item.isSend ? user.img : selectedChat.user.img" />
<div class="content"> <div class="time"><span>{{item.createTime | time}}</span></div>
<div class="text" v-html="replaceFace(item.content)"></div> <div class="content">
<div class="text" v-html="replaceFace(item.content)"></div>
</div>
</div>
<div v-if="item.type==3" class="main" :class="{ self: item.isSend }">
<img class="avatar" width="36" height="36" :src="item.isSend ? user.img : selectedChat.user.img" />
<div class="time"><span>{{item.createTime | time}}</span></div>
<div class="content">
<div class="img"><img style="width:300px;
height:300px;" :src="imgUrl+item.imageUrl" alt=""></div>
</div>
</div>
</li>
</ul>
</div>
</div>
<div class="message" v-if="user.whichPane==panelStatus.SEARCH">
<header class="header">
<div class="friendname">{{selectedSearchChat&&selectedSearchChat.user.name}}</div>
</header>
<div class="message-wrapper" ref="list">
<ul v-if="selectedSearchChat">
<li v-for="item in messages" class="message-item">
<div v-if="item.type==1" class="main" :class="{ self: item.isSend }">
<img class="avatar" width="36" height="36" :src="item.isSend ? user.img : selectedSearchChat.user.img" />
<div class="time"><span>{{item.createTime | time}}</span></div>
<div class="content">
<div class="text" v-html="replaceFace(item.content)"></div>
</div>
</div>
<div v-if="item.type==3" class="main" :class="{ self: item.isSend }">
<img class="avatar" width="36" height="36" :src="item.isSend ? user.img : selectedSearchChat.user.img" />
<div class="time"><span>{{item.createTime | time}}</span></div>
<div class="content">
<div class="img"><img style="width:300px;
height:300px;" :src="imgUrl+item.imageUrl" alt=""></div>
</div>
</div> </div>
</div> </li>
</li> </ul>
</ul> </div>
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import moment from 'moment'
import { panelStatus } from '@/utils/common'
import { mapGetters, mapState } from 'vuex' import { mapGetters, mapState } from 'vuex'
export default { export default {
data(){
return {
imgUrl:process.env.IMG_ADDRESS
}
},
computed: { computed: {
panelStatus(){
return panelStatus
},
...mapGetters([ ...mapGetters([
'selectedChat', 'selectedChat',
'selectedSearchChat',
'messages' 'messages'
]), ]),
...mapState([ ...mapState([
...@@ -33,12 +81,12 @@ export default { ...@@ -33,12 +81,12 @@ export default {
]) ])
}, },
mounted() { mounted() {
// 在页面加载时让信息滚动到最下面 // console.log(this.$refs)
setTimeout(() => this.$refs.list.scrollTop = this.$refs.list.scrollHeight, 0) // setTimeout(() => this.$refs.list.scrollTop = this.$refs.list.scrollHeight, 0)
}, },
watch: { watch: {
// 发送信息后,让信息滚动到最下面
messages() { messages() {
console.log(44444444)
setTimeout(() => this.$refs.list.scrollTop = this.$refs.list.scrollHeight, 0) setTimeout(() => this.$refs.list.scrollTop = this.$refs.list.scrollHeight, 0)
} }
}, },
...@@ -46,7 +94,7 @@ export default { ...@@ -46,7 +94,7 @@ export default {
// 在发送信息之后,将输入的内容中属于表情的部分替换成emoji图片标签 // 在发送信息之后,将输入的内容中属于表情的部分替换成emoji图片标签
// 再经过v-html 渲染成真正的图片 // 再经过v-html 渲染成真正的图片
replaceFace (con) { replaceFace (con) {
if(con.includes('/:')) { if(con&&con.includes('/:')) {
var emojis=this.user.emojis; var emojis=this.user.emojis;
for(var i=0;i<emojis.length;i++){ for(var i=0;i<emojis.length;i++){
con = con.replace(emojis[i].reg, '<img src="static/emoji/' + emojis[i].file +'" alt="" style="vertical-align: middle; width: 24px; height: 24px" />'); con = con.replace(emojis[i].reg, '<img src="static/emoji/' + emojis[i].file +'" alt="" style="vertical-align: middle; width: 24px; height: 24px" />');
...@@ -59,14 +107,14 @@ export default { ...@@ -59,14 +107,14 @@ export default {
filters: { filters: {
// 将日期过滤为 hour:minutes // 将日期过滤为 hour:minutes
time (date) { time (date) {
if (typeof date === 'string') {
date = new Date(date); date = new Date(parseInt(date+'') * 1000);
} return moment(date).format('YYYY-MM-DD HH:mm:ss')
if(date.getMinutes()<10){ // if(date.getMinutes()<10){
return date.getHours() + ':0' +date.getMinutes(); // return date.getHours() + ':0' +date.getMinutes();
}else{ // }else{
return date.getHours() + ':' + date.getMinutes(); // return date.getHours() + ':' + date.getMinutes();
} // }
} }
} }
} }
...@@ -96,13 +144,11 @@ export default { ...@@ -96,13 +144,11 @@ export default {
width: 100% width: 100%
font-size: 12px font-size: 12px
margin: 7px auto margin: 7px auto
text-align: center
span span
display: inline-block display: inline-block
padding: 4px 6px padding: 4px 6px
color: #fff color: #797979
border-radius: 3px border-radius: 3px
background-color: #dcdcdc
.main .main
.avatar .avatar
float: left float: left
...@@ -141,4 +187,5 @@ export default { ...@@ -141,4 +187,5 @@ export default {
vertical-align: middle vertical-align: middle
border-right-color: transparent border-right-color: transparent
border-left-color: #b2e281 border-left-color: #b2e281
</style> </style>
...@@ -25,7 +25,7 @@ import { mapState } from 'vuex' ...@@ -25,7 +25,7 @@ import { mapState } from 'vuex'
export default { export default {
data(){ data(){
return { return {
accountFlag:true accountFlag:false
} }
}, },
computed: { computed: {
......
...@@ -13,7 +13,14 @@ ...@@ -13,7 +13,14 @@
export default { export default {
methods: { methods: {
change () { change () {
this.$store.dispatch('search', this.search) const text = this.search
if(text.replace(/^\s\s*/, '').replace(/\s\s*$/, '')==''){
console.log(66666666666666666)
this.$store.dispatch('changeChartPanel')
}else{
this.$store.dispatch('searchSession', this.search)
}
}, },
del () { del () {
this.search= '' this.search= ''
......
...@@ -24,12 +24,12 @@ ...@@ -24,12 +24,12 @@
<div class="warn" v-show="warn"> <div class="warn" v-show="warn">
<div class="description">不能发送空白信息</div> <div class="description">不能发送空白信息</div>
</div> </div>
</transition> </transition>
<el-dialog <el-dialog
title="选择转接对象" title="选择转接对象"
:visible.sync="dialogVisible" :visible.sync="dialogVisible"
width="30%" width="30%"
:before-close="handleClose"> >
<div> <div>
<el-select style="width: 100%;" v-model="value7" placeholder="请选择"> <el-select style="width: 100%;" v-model="value7" placeholder="请选择">
<el-option-group <el-option-group
...@@ -61,6 +61,8 @@ export default { ...@@ -61,6 +61,8 @@ export default {
content: '', content: '',
reply: '未找到', reply: '未找到',
frequency: 0, frequency: 0,
sendType:1,
imageUrl:'',
warn: false, warn: false,
showEmoji: false, showEmoji: false,
dialogVisible:false, dialogVisible:false,
...@@ -95,7 +97,7 @@ export default { ...@@ -95,7 +97,7 @@ export default {
computed: { computed: {
...mapState([ ...mapState([
'selectId', 'selectId',
'emojis' 'user'
]), ]),
...mapGetters([ ...mapGetters([
'selectedChat', 'selectedChat',
...@@ -169,26 +171,14 @@ export default { ...@@ -169,26 +171,14 @@ export default {
this.warn = false; this.warn = false;
}, 1000) }, 1000)
}else{ }else{
if(this.selectedChat.user.name === '机器人'){ var msg = {
this.$http.get(`https://zhaoplus.com/api/AI?search=${this.content}`).then(res => { id:this.user.selectId,
this.reply = res.data.result.text type:this.sendType,
if(this.content.includes('/:')){ content: this.content,
this.reply = '嘻嘻' imageUrl:this.imageUrl
}
var msg = {
content: this.content,
reply: this.reply
}
this.$store.dispatch('sendMessage', msg)
this.content = ''
})
}else{
var msg = {
content: this.content,
}
this.$store.dispatch('sendMessage', msg)
this.content = ''
} }
this.$store.dispatch('sendMessage', msg)
this.content = ''
} }
} }
}, },
......
...@@ -8,6 +8,7 @@ import ElementUI from 'element-ui' ...@@ -8,6 +8,7 @@ import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css' import 'element-ui/lib/theme-chalk/index.css'
Vue.config.productionTip = false Vue.config.productionTip = false
Vue.config.devtools = true
Vue.use(ElementUI) Vue.use(ElementUI)
/* eslint-disable no-new */ /* eslint-disable no-new */
const vm = new Vue({ const vm = new Vue({
......
const url={} const url={}
url.login = '/api/y/customer/passport/sign' url.login = '/api/y/customer/passport/sign'
url.wsUrl = "http://imweb.chenzhen.shop:9093" url.wsUrl = "http://imdev.chenzhen.shop:9093/"
// url.wsUrl = process.env.WX_ADDRESS
export default url export default url
\ No newline at end of file
import { panelStatus } from '@/utils/common'
const getters = { const getters = {
searchedChatlist (state) { chatlist (state) {
let sessions = state.user.chatlist.filter(sessions => sessions.user.name.includes(state.user.searchText)); return state.user.chatlist
return sessions
}, },
// 筛选出含有搜索值的好友列表 searchChatlist (state) {
searchedFriendlist (state) { return state.user.searchChatlist
let friends = state.user.friendlist.filter(friends => friends.remark.includes(state.user.searchText));
return friends
}, },
// 通过当前选择是哪个对话匹配相应的对话 // searchedFriendlist (state) {
// let friends = state.user.friendlist.filter(friends => friends.remark.includes(state.user.searchText));
// return friends
// },
selectedChat (state) { selectedChat (state) {
let session = state.user.chatlist.find(session => session.id === state.user.selectId); let temp = state.user.chatlist.find(session => session.id === state.user.selectId);
return session return temp
},
selectedSearchChat(state){
let temp = state.user.searchChatlist.find(session => session.id === state.user.selectId);
return temp
}, },
// 通过当前选择是哪个好友匹配相应的好友
selectedFriend (state) { selectedFriend (state) {
let friend = state.user.friendlist.find(friend => friend.id === state.user.selectFriendId); let friend = state.user.friendlist.find(friend => friend.id === state.user.selectFriendId);
return friend return friend
}, },
messages (state) { messages (state) {
let session = state.user.chatlist.find(session => session.id === state.user.selectId); let session = state.user.chatlist.find(session => session.id === state.user.selectId);
console.log(session) return session&&session.messages
return session.messages
} }
} }
export default getters export default getters
\ No newline at end of file
import * as service from '@/service' import * as service from '@/service'
import io from 'socket.io-client'; import io from 'socket.io-client';
import apiUrl from '@/service/api.js' import apiUrl from '@/service/api.js'
import { setToken, getToken } from '@/utils/auth' import { compare } from '@/utils/tools'
import { setToken, getToken, emojis } from '@/utils/auth'
import { panelStatus } from '@/utils/common'
import Vue from 'vue' import Vue from 'vue'
const now = new Date(); const now = new Date();
const user = { const user = {
...@@ -10,212 +12,29 @@ const user = { ...@@ -10,212 +12,29 @@ const user = {
userInfo:{}, userInfo:{},
wsObject:null, wsObject:null,
img: 'static/images/UserAvatar.jpg', img: 'static/images/UserAvatar.jpg',
chatlist: [ whichPane:panelStatus.CHART,
{ messagesPage:1,
id: 1, messagesPer:30,
user: { messagesObject:{},
name: '妈咪', chatlist: [],
img: 'static/images/mother.jpg' searchChatlist:[],
}, tempSearchChatlist:[],
messages: [ tempChatlist:[],
{
content: '么么哒,妈咪爱你', //聊天内容
date: now //时间
},
{
content: '按回车可以发送信息,还可以给我发送表情哟',
date: now
}
],
index: 1 // 当前在聊天列表中的位置,从1开始
},
{
id: 2,
user: {
name: 'father',
img: 'static/images/father.jpg'
},
messages: [
{
content: 'Are you kidding me?',
date: now
}
],
index: 2
},
{
id: 3,
user: {
name: '机器人',
img: 'static/images/vue.jpg'
},
messages: [
{
content: '我会跟你聊聊天的哟',
date: now
}
],
index: 3
}
],
// 好友列表
friendlist: [ friendlist: [
{ // {
id: 0, // id: 0,
wxid: "", //微信号 // wxid: "", //微信号
initial: '新的朋友', //姓名首字母 // initial: '新的朋友', //姓名首字母
img: 'static/images/newfriend.jpg', //头像 // img: 'static/images/newfriend.jpg', //头像
signature: "", //个性签名 // signature: "", //个性签名
nickname: "新的朋友", //昵称 // nickname: "新的朋友", //昵称
sex: 0, //性别 1为男,0为女 // sex: 0, //性别 1为男,0为女
remark: "新的朋友", //备注 // remark: "新的朋友", //备注
area: "", //地区 // area: "", //地区
}, // }
{
id: 1,
wxid: "AmorAres-", //微信号
initial: 'A', //姓名首字母
img: 'static/images/小姨妈.jpg', //头像
signature: "每天我就萌萌哒", //个性签名
nickname: "Amor", //昵称
sex: 0, //性别 1为男,0为女
remark: "Amor", //备注
area: "浙江 宁波", //地区
},
{
id: 2,
wxid: "Big-fly",
initial: 'B',
img: 'static/images/大飞哥.jpg',
signature: "你不知道的js",
nickname: "fly",
sex: 1,
remark: "大飞哥",
area: "奥地利 布尔根兰",
},
{
id: 3,
wxid: "microzz",
initial: 'D',
img: 'static/images/microzz.jpg',
signature: "学习让我快乐让我成长",
nickname: "microzz",
sex: 1,
remark: "大佬",
area: "江西 赣州",
},
{
id: 4,
wxid: "hwn0366",
initial: 'F',
img: 'static/images/father.jpg',
signature: "学习让我快乐让我成长",
nickname: "丢",
sex: 1,
remark: "father",
area: "江西 抚州",
},
{
id: 5,
wxid: "orange66",
initial: 'J',
img: 'static/images/orange.jpg',
signature: "你可以笑的很阳光!",
nickname: "orange",
sex: 1,
remark: "橘子",
area: "江西 赣州",
},
{
id: 6,
wxid: "Seto_L",
img: 'static/images/加菲猫.jpg',
signature: "自强不息",
nickname: "21",
sex: 1,
remark: "加菲",
area: "北京 海淀",
},
{
id: 7,
wxid: "wxid_itjz73t1ajt722",
initial: 'M',
img: 'static/images/mother.jpg',
signature: "开开心心就好",
nickname: "娄娄",
sex: 0,
remark: "妈咪",
area: "江西 抚州",
},
{
id: 8,
wxid: "hj960503",
img: 'static/images/萌萌俊.jpg',
signature: "原谅我有点蠢。。",
nickname: "。。。。。",
sex: 1,
remark: "萌萌均",
area: "江西 萍乡",
}
], ],
//emoji表情 emojis,
emojis: [
{ file: '100.gif', code: '/::)', title: '微笑',reg:/\/::\)/g },
{ file: '101.gif', code: '/::~', title: '伤心',reg:/\/::~/g },
{ file: '102.gif', code: '/::B', title: '美女',reg:/\/::B/g },
{ file: '103.gif', code: '/::|', title: '发呆',reg:/\/::\|/g },
{ file: '104.gif', code: '/:8-)', title: '墨镜',reg:/\/:8-\)/g },
{ file: '105.gif', code: '/::<', title: '哭',reg:/\/::</g },
{ file: '106.gif', code: '/::$', title: '羞',reg:/\/::\$/g },
{ file: '107.gif', code: '/::X', title: '哑',reg:/\/::X/g },
{ file: '108.gif', code: '/::Z', title: '睡',reg:/\/::Z/g },
{ file: '109.gif', code: '/::\'(', title: '哭',reg:/\/::'\(/g },
{ file: '110.gif', code: '/::-|', title: '囧',reg:/\/::-\|/g },
{ file: '111.gif', code: '/::@', title: '怒',reg:/\/::@/g },
{ file: '112.gif', code: '/::P', title: '调皮',reg:/\/::P/g },
{ file: '113.gif', code: '/::D', title: '笑',reg:/\/::D/g },
{ file: '114.gif', code: '/::O', title: '惊讶',reg:/\/::O/g },
{ file: '115.gif', code: '/::(', title: '难过',reg:/\/::\(/g },
{ file: '116.gif', code: '/::+', title: '酷',reg:/\/::\+/g },
{ file: '117.gif', code: '/:--b', title: '汗',reg:/\/:--b/g },
{ file: '118.gif', code: '/::Q', title: '抓狂',reg:/\/::Q/g },
{ file: '119.gif', code: '/::T', title: '吐',reg:/\/::T/g },
{ file: '120.gif', code: '/:,@P', title: '笑',reg:/\/:,@P/g },
{ file: '121.gif', code: '/:,@-D', title: '快乐',reg:/\/:,@-D/g },
{ file: '122.gif', code: '/::d', title: '奇',reg:/\/::d/g },
{ file: '123.gif', code: '/:,@o', title: '傲' ,reg:/\/:,@o/g},
{ file: '124.gif', code: '/::g', title: '饿',reg:/\/::g/g },
{ file: '125.gif', code: '/:|-)', title: '累' ,reg:/\/:\|-\)/g},
{ file: '126.gif', code: '/::!', title: '吓',reg:/\/::!/g },
{ file: '127.gif', code: '/::L', title: '汗',reg:/\/::L/g },
{ file: '128.gif', code: '/::>', title: '高兴',reg:/\/::>/g },
{ file: '129.gif', code: '/::,@', title: '闲',reg:/\/::,@/g },
{ file: '130.gif', code: '/:,@f', title: '努力',reg:/\/:,@f/g },
{ file: '131.gif', code: '/::-S', title: '骂',reg:/\/::-S/g },
{ file: '133.gif', code: '/:,@x', title: '秘密',reg:/\/:,@x/g },
{ file: '134.gif', code: '/:,@@', title: '乱',reg:/\/:,@@/g },
{ file: '135.gif', code: '/::8', title: '疯',reg:/\/::8/g },
{ file: '136.gif', code: '/:,@!', title: '哀',reg:/\/:,@!/g },
{ file: '137.gif', code: '/:!!!', title: '鬼',reg:/\/:!!!/g },
{ file: '138.gif', code: '/:xx', title: '打击',reg:/\/:xx/g },
{ file: '139.gif', code: '/:bye', title: 'bye',reg:/\/:bye/g },
{ file: '142.gif', code: '/:handclap', title: '鼓掌',reg:/\/:handclap/g },
{ file: '145.gif', code: '/:<@', title: '什么',reg:/\/:<@/g },
{ file: '147.gif', code: '/::-O', title: '累',reg:/\/::-O/g },
{ file: '153.gif', code: '/:@x', title: '吓',reg:/\/:@x/g },
{ file: '155.gif', code: '/:pd', title: '刀',reg:/\/:pd/g },
{ file: '156.gif', code: '/:<W>', title: '水果',reg:/\/:<W>/g },
{ file: '157.gif', code: '/:beer', title: '酒',reg:/\/:beer/g },
{ file: '158.gif', code: '/:basketb', title: '篮球',reg:/\/:basketb/g },
{ file: '159.gif', code: '/:oo', title: '乒乓',reg:/\/:oo/g },
{ file: '195.gif', code: '/:circle', title: '跳舞',reg:/\/:circle/g },
{ file: '160.gif', code: '/:coffee', title: '咖啡',reg:/\/:coffee/g }
],
// 得知当前选择的是哪个对话
selectId: 1, selectId: 1,
// 得知当前选择的是哪个好友
selectFriendId: 0 selectFriendId: 0
}, },
...@@ -224,76 +43,115 @@ const user = { ...@@ -224,76 +43,115 @@ const user = {
setToken(value.token) setToken(value.token)
state.userInfo = value state.userInfo = value
}, },
CHANGE_CONVERSATIONPANEL(state, value){
if(panelStatus.CHART==value){
state.whichPane = panelStatus.CHART
state.searchChatlist = []
state.tempSearchChatlist = []
}else{
state.whichPane = panelStatus.SEARCH
state.whichPane = value
}
},
SET_WXOBJECT(state, value){ SET_WXOBJECT(state, value){
state.wsObject = value state.wsObject = value
}, },
SELECT_SEESION (state, value) {
state.messagesObject = value
state.selectId = value.id
},
SET_SEARCHCHART_LIST(state, value){
state.tempSearchChatlist = value
let tempList = []
for(let i in value){
let temp = [{
content: value[i].lastMessage&&value[i].lastMessage.content,
date: value[i].lastMessage&&value[i].lastMessage.createTime
}]
tempList.push({
id: value[i].id,
user: {
name: value[i].userBo.nickname,
img: value[i].userBo.avatar
},
messages: temp,
queryData:value[i].lastUpdateTime,
index: i
})
}
state.searchChatlist = tempList.sort(compare('queryData'))
},
SET_CHART_LIST(state, value){
state.tempChatlist = value
let tempList = []
for(let i in value){
let temp = [{
content: value[i].lastMessage&&value[i].lastMessage.content,
date: value[i].lastMessage&&value[i].lastMessage.createTime
}]
tempList.push({
id: value[i].id,
user: {
name: value[i].userBo.nickname,
img: value[i].userBo.avatar
},
messages: temp,
queryData:value[i].lastUpdateTime,
index: i
})
}
state.chatlist = tempList.sort(compare('queryData'))
},
SELECT_MESSAGE(state, value){
let { chatlist, selectId } = state
for(let c in chatlist){
if(chatlist[c].id==selectId){
chatlist[c].messages = value==null?[]:value.sort(compare('createTime'))
}
}
},
initData (state) { initData (state) {
let data = localStorage.getItem('vue-chat'); let data = localStorage.getItem('vue-chat');
if (data) { if (data) {
state.chatlist = JSON.parse(data); state.chatlist = JSON.parse(data);
} }
}, },
// 获取搜索值
search (state, value) { search (state, value) {
state.searchText = value state.searchText = value
}, },
// 得知用户当前选择的是哪个对话。便于匹配对应的对话框
selectSession (state, value) {
state.selectId = value
},
// 得知用户当前选择的是哪个好友。
selectFriend (state, value) { selectFriend (state, value) {
state.selectFriendId = value state.selectFriendId = value
}, },
// 发送信息
sendMessage (state, msg){
let result = state.chatlist.find(session => session.id === state.selectId);
result.messages.push({
content: msg.content,
date: new Date(),
self: true
});
if(result.user.name === '机器人'){
setTimeout(() => {
result.messages.push({
content: msg.reply,
date: new Date(),
self: false
});
},500)
}
},
// 选择好友后,点击发送信息。判断在聊天列表中是否有该好友,有的话跳到该好友对话。没有的话 // send (state) {
// 添加该好友的对话 并置顶 // let result = state.friendlist.find(friend => friend.id === state.selectFriendId)
send (state) { // let msg = state.chatlist.find(msg => msg.user.name === result.remark)
let result = state.friendlist.find(friend => friend.id === state.selectFriendId) // if( !msg ){
let msg = state.chatlist.find(msg => msg.user.name === result.remark) // state.selectId = 1
if( !msg ){ // for(let i = 0; i < state.chatlist.length; i++ ){
state.selectId = 1 // state.chatlist[i].id++;
for(let i = 0; i < state.chatlist.length; i++ ){ // state.chatlist[i].index++;
state.chatlist[i].id++; // }
state.chatlist[i].index++; // state.chatlist.unshift({
} // id: 1,
state.chatlist.unshift({ // user: {
id: 1, // name: result.remark,
user: { // img: result.img
name: result.remark, // },
img: result.img // messages: [
}, // {
messages: [ // content: '已经置顶聊天,可以给我发信息啦!',
{ // date: new Date()
content: '已经置顶聊天,可以给我发信息啦!', // }
date: new Date() // ],
} // index: 1
], // })
index: 1 // }else {
}) // state.selectId = msg.index
}else { // router.push({ path: '/chat'})
state.selectId = msg.index // }
router.push({ path: '/chat'}) // }
}
}
}, },
actions: { actions: {
...@@ -311,19 +169,25 @@ const user = { ...@@ -311,19 +169,25 @@ const user = {
}) })
}) })
}, },
init ({ commit, state }) {
state.wsObject.emit('appevent', {
eventType: 'conversations/index'
})
},
connect({ dispatch, commit, state }) { connect({ dispatch, commit, state }) {
const wsClient = io(apiUrl.wsUrl, { autoConnect: false, transports: ['websocket'] }) const wsClient = io(apiUrl.wsUrl, { autoConnect: false, transports: ['websocket'] })
commit('SET_WXOBJECT', wsClient) commit('SET_WXOBJECT', wsClient)
if (wsClient.disconnected) { if (wsClient.disconnected) {
// commit('init', account) // commit('init', account)
wsClient.io.opts.query = { wsClient.io.opts.query = {
token: getToken() token: getToken(),
version: 2.0
} }
wsClient.on('connect', () => { wsClient.on('connect', () => {
// Common.wsClient = wsClient // Common.wsClient = wsClient
console.log("connect") console.log("connect")
// commit('login') // commit('login')
// dispatch('connected') dispatch('connected')
// storage.set('account', state) // storage.set('account', state)
}).on('connect_error', () => { }).on('connect_error', () => {
console.log("connect_error") console.log("connect_error")
...@@ -335,11 +199,13 @@ const user = { ...@@ -335,11 +199,13 @@ const user = {
}) })
wsClient.open() wsClient.open()
} }
dispatch("init")
}, },
connected({ state, dispatch }) { connected({ state, commit }) {
state.userInfo state.wsObject
.on('messages/message', (data) => { .on('messages/message', (data, callback) => {
console.log(data) console.log(data)
callback()
if (data.eventType == "conversations/create" && data.message) { if (data.eventType == "conversations/create" && data.message) {
// dispatch('conversation/newConversation', data, { root: true }) // dispatch('conversation/newConversation', data, { root: true })
} else { } else {
...@@ -347,15 +213,15 @@ const user = { ...@@ -347,15 +213,15 @@ const user = {
// dispatch('conversation/newMessage', data, { root: true }) // dispatch('conversation/newMessage', data, { root: true })
} }
}) })
.on('conversations/index', (data) => { .on('conversations/index', (data, callback) => {
console.log(data) console.log(data)
commit('SET_CHART_LIST', data)
// console.log('conversations/index') // console.log('conversations/index')
// console.log(data)
// _.each(data, (conversation) => { // _.each(data, (conversation) => {
// dispatch('conversation/addConversation', {...conversation, from: 'index'}, { root: true }) // dispatch('conversation/addConversation', {...conversation, from: 'index'}, { root: true })
// }) // })
}) })
.on('conversations/friend', (data) => { .on('conversations/friend', (data, callback) => {
console.log(data) console.log(data)
// console.log('conversations/friend') // console.log('conversations/friend')
// console.log(data) // console.log(data)
...@@ -363,8 +229,9 @@ const user = { ...@@ -363,8 +229,9 @@ const user = {
// dispatch('conversation/addFriendConversation', {...conversation, from: 'index'}, { root: true }) // dispatch('conversation/addFriendConversation', {...conversation, from: 'index'}, { root: true })
// }) // })
}) })
.on('messages/index', (data) => { .on('messages/index', (data, callback) => {
console.log(data) callback(true)
commit('SELECT_MESSAGE', data)
// console.log('messages/index') // console.log('messages/index')
// if (_.isEmpty(data)) return // if (_.isEmpty(data)) return
// _.each(data, (message) => { // _.each(data, (message) => {
...@@ -373,13 +240,23 @@ const user = { ...@@ -373,13 +240,23 @@ const user = {
// }) // })
// dispatch('conversation/isMessagesDone', data, { root: true }) // dispatch('conversation/isMessagesDone', data, { root: true })
}) })
.on('conversations/show', (data) => { .on('conversations/show', (data, callback) => {
console.log(data) const tempChatlist = state.tempChatlist
for(let j in tempChatlist){
if(tempChatlist[j].id==data.id){
let tempMessages = [...tempChatlist[j].messages]
tempChatlist[j] = data
tempChatlist[j].messages= tempMessages
}
}
commit('SET_CHART_LIST', tempChatlist)
// console.log('conversations/show') // console.log('conversations/show')
// dispatch('conversation/addConversation', data, { root: true }) // dispatch('conversation/addConversation', data, { root: true })
}) })
.on('conversions/search', (data) => { .on('conversions/search', (data, callback) => {
console.log(data) console.log(data)
callback()
commit('SET_SEARCHCHART_LIST', data)
// _.each(data, (conversation) => { // _.each(data, (conversation) => {
// dispatch('conversation/addConversation', conversation, { root: true }) // dispatch('conversation/addConversation', conversation, { root: true })
// }) // })
...@@ -398,14 +275,60 @@ const user = { ...@@ -398,14 +275,60 @@ const user = {
// }, // },
// }) // })
}, },
selectSession({ commit, state }, conversation) {
console.log(5555555555555555555555)
commit('SELECT_SEESION', conversation)
state.wsObject.emit('appevent', {
eventType: 'messages/index',
message: {
conversationId:conversation.id,
page: state.messagesPage,
rows: state.messagesPer
}
})
},
changeChartPanel({ commit, state }){
commit('CHANGE_CONVERSATIONPANEL', panelStatus.CHART)
},
searchSession({ commit, state }, keyword) {
console.log(44444)
commit('CHANGE_CONVERSATIONPANEL', panelStatus.SEARCH)
state.wsObject.emit('appevent', {
eventType: 'conversions/search',
message: { keyword }
})
},
sendMessage({ commit, state }, conversation){
state.wsObject.emit('appevent', {
eventType: 'messages/create',
message: {
conversationId: conversation.id,
type: conversation.type,
content: conversation.content,
imageUrl: conversation.imageUrl
},
},(data) => {
console.log(data);
console.log('这个socket发送成功了!');
})
let temp = state.messagesObject.messages
temp.push({
conversationId:conversation.id,
type: conversation.type,
isSend:1,
content: conversation.content,
createTime: Date.parse(new Date())
})
commit('SELECT_MESSAGE', temp)
},
search: ({ commit }, value) => { search: ({ commit }, value) => {
setTimeout(() => { setTimeout(() => {
commit('search', value) commit('search', value)
}, 100) }, 100)
}, },
selectSession: ({ commit }, value) => commit('selectSession', value), // selectSession: ({ commit }, value) => commit('selectSession', value),
selectFriend: ({ commit }, value) => commit('selectFriend', value), selectFriend: ({ commit }, value) => commit('selectFriend', value),
sendMessage: ({ commit }, msg) => commit('sendMessage', msg), // sendMessage: ({ commit }, msg) => commit('sendMessage', msg),
send: ({ commit }) => commit('send'), send: ({ commit }) => commit('send'),
initData: ({ commit }) => commit('initData') initData: ({ commit }) => commit('initData')
} }
......
...@@ -29,4 +29,56 @@ export function getCommercialId() { ...@@ -29,4 +29,56 @@ export function getCommercialId() {
export function setCommercialId(token) { export function setCommercialId(token) {
return Cookies.set(commercialIdKey, token) return Cookies.set(commercialIdKey, token)
} }
\ No newline at end of file export const emojis = [
{ file: '100.gif', code: '/::)', title: '微笑',reg:/\/::\)/g },
{ file: '101.gif', code: '/::~', title: '伤心',reg:/\/::~/g },
{ file: '102.gif', code: '/::B', title: '美女',reg:/\/::B/g },
{ file: '103.gif', code: '/::|', title: '发呆',reg:/\/::\|/g },
{ file: '104.gif', code: '/:8-)', title: '墨镜',reg:/\/:8-\)/g },
{ file: '105.gif', code: '/::<', title: '哭',reg:/\/::</g },
{ file: '106.gif', code: '/::$', title: '羞',reg:/\/::\$/g },
{ file: '107.gif', code: '/::X', title: '哑',reg:/\/::X/g },
{ file: '108.gif', code: '/::Z', title: '睡',reg:/\/::Z/g },
{ file: '109.gif', code: '/::\'(', title: '哭',reg:/\/::'\(/g },
{ file: '110.gif', code: '/::-|', title: '囧',reg:/\/::-\|/g },
{ file: '111.gif', code: '/::@', title: '怒',reg:/\/::@/g },
{ file: '112.gif', code: '/::P', title: '调皮',reg:/\/::P/g },
{ file: '113.gif', code: '/::D', title: '笑',reg:/\/::D/g },
{ file: '114.gif', code: '/::O', title: '惊讶',reg:/\/::O/g },
{ file: '115.gif', code: '/::(', title: '难过',reg:/\/::\(/g },
{ file: '116.gif', code: '/::+', title: '酷',reg:/\/::\+/g },
{ file: '117.gif', code: '/:--b', title: '汗',reg:/\/:--b/g },
{ file: '118.gif', code: '/::Q', title: '抓狂',reg:/\/::Q/g },
{ file: '119.gif', code: '/::T', title: '吐',reg:/\/::T/g },
{ file: '120.gif', code: '/:,@P', title: '笑',reg:/\/:,@P/g },
{ file: '121.gif', code: '/:,@-D', title: '快乐',reg:/\/:,@-D/g },
{ file: '122.gif', code: '/::d', title: '奇',reg:/\/::d/g },
{ file: '123.gif', code: '/:,@o', title: '傲' ,reg:/\/:,@o/g},
{ file: '124.gif', code: '/::g', title: '饿',reg:/\/::g/g },
{ file: '125.gif', code: '/:|-)', title: '累' ,reg:/\/:\|-\)/g},
{ file: '126.gif', code: '/::!', title: '吓',reg:/\/::!/g },
{ file: '127.gif', code: '/::L', title: '汗',reg:/\/::L/g },
{ file: '128.gif', code: '/::>', title: '高兴',reg:/\/::>/g },
{ file: '129.gif', code: '/::,@', title: '闲',reg:/\/::,@/g },
{ file: '130.gif', code: '/:,@f', title: '努力',reg:/\/:,@f/g },
{ file: '131.gif', code: '/::-S', title: '骂',reg:/\/::-S/g },
{ file: '133.gif', code: '/:,@x', title: '秘密',reg:/\/:,@x/g },
{ file: '134.gif', code: '/:,@@', title: '乱',reg:/\/:,@@/g },
{ file: '135.gif', code: '/::8', title: '疯',reg:/\/::8/g },
{ file: '136.gif', code: '/:,@!', title: '哀',reg:/\/:,@!/g },
{ file: '137.gif', code: '/:!!!', title: '鬼',reg:/\/:!!!/g },
{ file: '138.gif', code: '/:xx', title: '打击',reg:/\/:xx/g },
{ file: '139.gif', code: '/:bye', title: 'bye',reg:/\/:bye/g },
{ file: '142.gif', code: '/:handclap', title: '鼓掌',reg:/\/:handclap/g },
{ file: '145.gif', code: '/:<@', title: '什么',reg:/\/:<@/g },
{ file: '147.gif', code: '/::-O', title: '累',reg:/\/::-O/g },
{ file: '153.gif', code: '/:@x', title: '吓',reg:/\/:@x/g },
{ file: '155.gif', code: '/:pd', title: '刀',reg:/\/:pd/g },
{ file: '156.gif', code: '/:<W>', title: '水果',reg:/\/:<W>/g },
{ file: '157.gif', code: '/:beer', title: '酒',reg:/\/:beer/g },
{ file: '158.gif', code: '/:basketb', title: '篮球',reg:/\/:basketb/g },
{ file: '159.gif', code: '/:oo', title: '乒乓',reg:/\/:oo/g },
{ file: '195.gif', code: '/:circle', title: '跳舞',reg:/\/:circle/g },
{ file: '160.gif', code: '/:coffee', title: '咖啡',reg:/\/:coffee/g }
]
import axios from "axios" export const panelStatus = {
import aliOss from "ali-oss" SEARCH:'SEARCH',//SEARCH搜索列表
CHART:'CHART'//CHART回话列表
let Authorization = null }
\ No newline at end of file
let Common = {}
window.common = Common
// const ajaxUrl = "http://172.16.22.234:19891";
const ajaxUrl = "/api"
// const ajaxUrl = "http://localhost";
Common.ajax = axios.create({
baseURL: ajaxUrl,
timeout: 120000,
headers: {
"Cache-Control": "no-cache,no-store,must-revalidate,max-age=-1,private"
}
})
// Common.wsUrl = "http://172.16.22.234:9093";
Common.wsUrl = "http://imweb.chenzhen.shop"
Common.bag = {
host: "https://baozheng.cc"
// host: "http://172.16.22.3:19893"
// host: "http://172.16.22.234:9093"
}
Common.bag.ajax = axios.create({
baseURL: Common.bag.host,
timeout: 120000,
headers: {
"Cache-Control": "no-cache,no-store,must-revalidate,max-age=-1,private"
}
// withCredentials: true
})
Common.bag.ajax.interceptors.response.use((response) => {
// console.log(response)
return response
}, (error) => {
if (error.response && error.response.status == 401) {
window.vm.bagLogin()
}
return Promise.reject(error)
})
Common.chenzhen = {}
Common.chenzhen.ajax = axios.create({
// baseURL: "http://172.16.22.234:19893",
// baseURL: "http://127.0.0.1:4396",
baseURL: "http://imweb.chenzhen.shop",
timeout: 30000,
headers: {
"Cache-Control": "no-cache,no-store,must-revalidate,max-age=-1,private"
}
})
Common.chenzhen.ajax.interceptors.request.use((body) => {
body.headers.Authorization = localStorage.getItem("chenzhen-token")
return body
}, (error) => {
return Promise.reject(error)
})
Common.chenzhen.ajax.interceptors.response.use((response) => {
if (response.data.code === 800) {
localStorage.clear()
window.vm.chenzhenLogin()
}
return response
}, (error) => {
return Promise.reject(error)
})
Common.chat = {
host: "http://imweb.chenzhen.shop"
}
Common.chat.ajax = axios.create({
baseURL: Common.chat.host,
timeout: 120000,
headers: {
"Cache-Control": "no-cache,no-store,must-revalidate,max-age=-1,private"
}
})
Common.six_day = 6 * 24 * 60 * 60 * 1000
Common.wsClient = null
Common.sendMessage = (message) => {
return new Promise((resolve, reject) => {
if (Common.wsClient == null || Common.wsClient.disconnected) {
reject("No socket connection.")
} else {
// console.log(message)
let options = {
eventType: "messages/create",
message: message
}
Common.wsClient.emit("appevent", options)
resolve()
}
})
}
Common.ossClient = new aliOss({
region: "oss-cn-beijing",
accessKeyId: "LTAImsrYiikk7t3f",
accessKeySecret: "XtgwITVY6Apb7H1hOO3LRZNxE0Onpb",
bucket: "chat-x"
})
Common.ossUrl = "http://chat-x.oss-cn-beijing.aliyuncs.com/"
export default Common
export const compare =(po)=>{
return function(a,b){
let temp1 = a[po];
let temp2 = b[po];
return temp1-temp2
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment