李昌恒 há 6 anos atrás
pai
commit
53019e77d1
100 ficheiros alterados com 321 adições e 0 exclusões
  1. 287 0
      service/src/src/App.vue
  2. 34 0
      service/src/src/api/ports.js
  3. BIN
      service/src/src/assets/img/0.gif
  4. BIN
      service/src/src/assets/img/1.gif
  5. BIN
      service/src/src/assets/img/10.gif
  6. BIN
      service/src/src/assets/img/11.gif
  7. BIN
      service/src/src/assets/img/12.gif
  8. BIN
      service/src/src/assets/img/13.gif
  9. BIN
      service/src/src/assets/img/14.gif
  10. BIN
      service/src/src/assets/img/15.gif
  11. BIN
      service/src/src/assets/img/16.gif
  12. BIN
      service/src/src/assets/img/17.gif
  13. BIN
      service/src/src/assets/img/18.gif
  14. BIN
      service/src/src/assets/img/19.gif
  15. BIN
      service/src/src/assets/img/2.gif
  16. BIN
      service/src/src/assets/img/20.gif
  17. BIN
      service/src/src/assets/img/21.gif
  18. BIN
      service/src/src/assets/img/22.gif
  19. BIN
      service/src/src/assets/img/23.gif
  20. BIN
      service/src/src/assets/img/24.gif
  21. BIN
      service/src/src/assets/img/25.gif
  22. BIN
      service/src/src/assets/img/26.gif
  23. BIN
      service/src/src/assets/img/27.gif
  24. BIN
      service/src/src/assets/img/28.gif
  25. BIN
      service/src/src/assets/img/29.gif
  26. BIN
      service/src/src/assets/img/3.gif
  27. BIN
      service/src/src/assets/img/30.gif
  28. BIN
      service/src/src/assets/img/31.gif
  29. BIN
      service/src/src/assets/img/32.gif
  30. BIN
      service/src/src/assets/img/33.gif
  31. BIN
      service/src/src/assets/img/34.gif
  32. BIN
      service/src/src/assets/img/35.gif
  33. BIN
      service/src/src/assets/img/36.gif
  34. BIN
      service/src/src/assets/img/37.gif
  35. BIN
      service/src/src/assets/img/38.gif
  36. BIN
      service/src/src/assets/img/39.gif
  37. BIN
      service/src/src/assets/img/4.gif
  38. BIN
      service/src/src/assets/img/40.gif
  39. BIN
      service/src/src/assets/img/41.gif
  40. BIN
      service/src/src/assets/img/42.gif
  41. BIN
      service/src/src/assets/img/43.gif
  42. BIN
      service/src/src/assets/img/44.gif
  43. BIN
      service/src/src/assets/img/45.gif
  44. BIN
      service/src/src/assets/img/46.gif
  45. BIN
      service/src/src/assets/img/47.gif
  46. BIN
      service/src/src/assets/img/48.gif
  47. BIN
      service/src/src/assets/img/49.gif
  48. BIN
      service/src/src/assets/img/5.gif
  49. BIN
      service/src/src/assets/img/50.gif
  50. BIN
      service/src/src/assets/img/51.gif
  51. BIN
      service/src/src/assets/img/52.gif
  52. BIN
      service/src/src/assets/img/53.gif
  53. BIN
      service/src/src/assets/img/54.gif
  54. BIN
      service/src/src/assets/img/55.gif
  55. BIN
      service/src/src/assets/img/56.gif
  56. BIN
      service/src/src/assets/img/57.gif
  57. BIN
      service/src/src/assets/img/58.gif
  58. BIN
      service/src/src/assets/img/59.gif
  59. BIN
      service/src/src/assets/img/6.gif
  60. BIN
      service/src/src/assets/img/60.gif
  61. BIN
      service/src/src/assets/img/61.gif
  62. BIN
      service/src/src/assets/img/62.gif
  63. BIN
      service/src/src/assets/img/63.gif
  64. BIN
      service/src/src/assets/img/64.gif
  65. BIN
      service/src/src/assets/img/65.gif
  66. BIN
      service/src/src/assets/img/66.gif
  67. BIN
      service/src/src/assets/img/67.gif
  68. BIN
      service/src/src/assets/img/68.gif
  69. BIN
      service/src/src/assets/img/69.gif
  70. BIN
      service/src/src/assets/img/7.gif
  71. BIN
      service/src/src/assets/img/70.gif
  72. BIN
      service/src/src/assets/img/71.gif
  73. BIN
      service/src/src/assets/img/8.gif
  74. BIN
      service/src/src/assets/img/9.gif
  75. BIN
      service/src/src/assets/img/Multitap.png
  76. BIN
      service/src/src/assets/img/account.png
  77. BIN
      service/src/src/assets/img/bottom.png
  78. BIN
      service/src/src/assets/img/del.png
  79. BIN
      service/src/src/assets/img/end.png
  80. BIN
      service/src/src/assets/img/frce.png
  81. BIN
      service/src/src/assets/img/frcea.png
  82. BIN
      service/src/src/assets/img/hader1.png
  83. BIN
      service/src/src/assets/img/hader1a.png
  84. BIN
      service/src/src/assets/img/hader2.png
  85. BIN
      service/src/src/assets/img/hader3.png
  86. BIN
      service/src/src/assets/img/hader3a.png
  87. BIN
      service/src/src/assets/img/hader4.png
  88. BIN
      service/src/src/assets/img/headerPortrait.png
  89. BIN
      service/src/src/assets/img/img.png
  90. BIN
      service/src/src/assets/img/left1.png
  91. BIN
      service/src/src/assets/img/left1a.png
  92. BIN
      service/src/src/assets/img/left2.png
  93. BIN
      service/src/src/assets/img/left2a.png
  94. BIN
      service/src/src/assets/img/left3.png
  95. BIN
      service/src/src/assets/img/left3a.png
  96. BIN
      service/src/src/assets/img/left4.png
  97. BIN
      service/src/src/assets/img/left4a.png
  98. BIN
      service/src/src/assets/img/left5.png
  99. BIN
      service/src/src/assets/img/left5a.png
  100. BIN
      service/src/src/assets/img/loginBG.png

+ 287 - 0
service/src/src/App.vue

@@ -0,0 +1,287 @@
+<template>
+  <div id="app">
+    <transition name='fade' mode="out-in">
+      <router-view/>
+    </transition>
+  </div>
+</template>
+
+<script>
+import Vue from 'vue';
+export default {
+  name: 'App',
+  // apiToken:'',//WebSocket链接凭证
+  // time:'',
+  data(){
+    return{
+      reconnectData:null,
+      lockReconnect:false,    //避免重复连接,因为onerror之后会立即触发 onclose
+      timeout:10000,          //10s一次心跳检测
+      timeoutObj:null,
+      serverTimeoutObj:null,
+      apiToken:'',
+      linkfailure:true,
+
+    }
+  },
+  methods:{
+    /**************************************/
+    //初始化weosocket
+    initWebSocket(apiToken) {
+      // 书写接口信息
+      const wsuri = "ws://103.108.43.176:9101?apiToken=" + apiToken;//www.service.com 线上
+      //const wsuri = "ws://192.168.2.186:9101?apiToken=" + apiToken;//www.service.com //192.168.2.186 本地
+      // 创建websocket实例
+      Vue.prototype.$websocket = new WebSocket(wsuri);
+      this.$websocket.onopen = this.websocketonopen; //连接成功
+      this.$websocket.onmessage = this.websocketonmessage; //接收消息
+      this.$websocket.onerror = this.websocketonerror;//链接错误提示
+      this.$websocket.onclose = this.socket_close;//链接断开提示
+    },
+
+    
+    /**************************************/
+    //连接成功
+    websocketonopen() {
+      console.log('已经链接');
+      Vue.prototype.$socket_open = true;
+      this.heatBeat();
+    },
+
+    /*******************************************/  
+    //连接关闭触发
+    socket_close(e){  
+      console.log('断开连接',e);
+      //this.init()
+      this.reconnect();
+    },
+
+    /******************************************/
+    //数据接收
+    websocketonmessage(e){
+      this.heatBeat();//收到消息会刷新心跳检测,如果一直收到消息,就推迟心跳发送
+      const redata = JSON.parse(e.data);//接收数据源
+      if(redata.type != "pong"){
+        console.log(redata);
+      }
+      let  getters = this.$store.getters;
+      //获取vuex数据
+      let session = getters.get_session;//会话列表
+      let offline  = getters.get_offline;//离线列表
+      let sessionType  = getters.get_type;//选择状态(会话/离线)
+      let dataIndex  = getters.get_num;//列表下标
+      let current_session  = getters.get_current;//当前会话
+      let session_name  = getters.get_session_name;//当前用户名
+      
+      if(e.data.type == "pong" ) return
+      this.$store.dispatch("SET_SESSION_MESSAGE",JSON.parse(e.data));
+
+      	// 用户接入数据
+				if(redata.message_type == "connect"){
+					let _this  = this;
+					let arr =[
+						redata.data,
+						offline,
+						session,
+						sessionType,
+						dataIndex,
+						current_session,
+						session_name
+					]
+					_this.$public.visitorsConnect(arr,function(data){
+						//离线匹配列表访客链接回调
+            _this.$store.dispatch("SET_OFFLINE",data);
+            
+					},function(data,session,offline,type,num,dataList,name){
+						//将用户添加到会话列表中
+						session.push(data.user_info);
+						//获取接入的用户信息
+						//_this.get_user_info(list);
+						//获取接入的用户信息写入vuex
+						_this.$store.dispatch("SET_SESSION",session);//会话列表
+						_this.$store.dispatch("SET_OFFLINE",offline);//离线列表
+						_this.$store.dispatch("SET_TYPE",type);//选择类型(会话/离线)
+						_this.$store.dispatch("SET_NUM",num);//列表下标
+						_this.$store.dispatch("SET_CURRENT",dataList);//当前会话数据
+						_this.$store.dispatch("SET_SESSION_NAME",name);//当前会话对象名
+						
+					})
+				}
+				
+
+				//用户离线后会话窗口切换
+				if(redata.message_type == "userClose"){
+					let _this =this;
+					let	arr= [
+						redata.data,
+						session,
+            offline,
+						sessionType,
+						dataIndex,
+						session_name,
+						current_session,
+					]
+					_this.$public.userOffline(arr,function(session,offline,type,index,name,list,userInfo){
+            _this.$store.dispatch("SET_CURRENT",list);//当前会话数据
+						_this.$store.dispatch("SET_SESSION_NAME",name);//当前会话对象名
+						_this.$store.dispatch("SET_NUM",index);
+						_this.$store.dispatch("SET_TYPE",type);
+						_this.$store.dispatch("SET_SESSION",session);
+						_this.$store.dispatch("SET_OFFLINE",offline);
+						// _this.get_user_info(userInfo);
+					})
+				}
+
+
+				//用户会话结束窗口切换
+				if(redata.message_type == "delUser"){
+					let _this =this;
+					let	arr= [
+						redata.data,
+						session,
+            offline,
+						sessionType,
+						dataIndex,
+						session_name,
+						current_session,
+					]
+					_this.$public.sessionEnd(arr,function(session,offline,type,index,name,list,userInfo){
+            _this.$store.dispatch("SET_CURRENT",list);//当前会话数据
+						_this.$store.dispatch("SET_SESSION_NAME",name);//当前会话对象名
+						_this.$store.dispatch("SET_NUM",index);
+						_this.$store.dispatch("SET_TYPE",type);
+						_this.$store.dispatch("SET_SESSION",session);
+						_this.$store.dispatch("SET_OFFLINE",offline);
+					//	_this.get_user_info(userInfo);
+					})
+				}
+
+				//接收用户消息数据
+				if(redata.message_type == "chatMessage"){
+					let _this =this;
+					this.$public.receivesMessage(redata.data,session,this.$frce,function(data,chatList,index){
+						//判断是否是当前对话信息
+						if(dataIndex == index){
+						    // _this.data =[];
+                // _this.data = chatList.data;
+                _this.$store.dispatch("SET_CURRENT",chatList.data);//当前会话数据
+						}else{
+						    let num = Number.isInteger(chatList.num) ? chatList.num : 0;
+                // _this.$set(chatList,'num',num+1)
+                session[index].num = num+1
+						}
+						//更新会话时间
+            // _this.$set(chatList,'intime',data.time);
+            session[index].intime =data.time
+				
+						//更新会话列表中最新回复消息
+						if(data.content.text){
+              // _this.$set(chatList,'text',data.content.text)
+              session[index].text =data.content.text
+            }
+             _this.$store.dispatch("SET_SESSION",session);
+					})
+				}
+      
+        //reLoginErr
+        if(redata.message_type == "reLoginErr"){
+          console.log('haha');
+          this.init()
+        }
+
+    },   
+
+    /**************************************/
+    //连接断开,失败
+    websocketonerror(e) {
+      console.log('失败',e);
+      if(this.linkfailure){
+        this.init()
+      }
+    },
+
+    /******************************************/
+    //断开链接数据初始化
+    init(){
+      this.$store.dispatch("SET_STATEVALUE",'隐身');
+      this.$store.dispatch("SET_SESSION",[]);
+      this.$store.dispatch("SET_OFFLINE",[]);
+      this.$store.dispatch("SET_SESSION",[]);//会话列表
+			this.$store.dispatch("SET_OFFLINE",[]);//离线列表
+		  this.$store.dispatch("SET_TYPE",1);//选择类型(会话/离线)
+			this.$store.dispatch("SET_NUM",0);//列表下标
+			this.$store.dispatch("SET_CURRENT",[]);//当前会话数据
+      this.$store.dispatch("SET_SESSION_NAME",'');//当前会话对象名
+      this.$store.dispatch("SET_SESSION_MESSAGE",{});
+      this.$store.dispatch("SET_IS_INIT",false);
+      this.$token = '';
+      this.$router.push('/login')
+      this.linkfailure = true;
+      //this.reconnect();
+    },
+
+    /***************************************/
+    //socket重连
+    reconnect(){
+      if(this.lockReconnect){   //这里很关键,因为连接失败之后之后会相继触发 连接关闭,不然会连接上两个 WebSocket
+          return
+      }
+      this.lockReconnect = true;
+      this.reconnectData && clearTimeout(this.reconnectData);
+      this.reconnectData = setTimeout(()=>{
+          this.initWebSocket(this.apiToken);
+          this.lockReconnect = false;
+      },3000)
+    },  
+
+    /*************************************/
+    //心跳检测
+    heatBeat(){
+      this.timeoutObj && clearTimeout(this.timeoutObj);
+      this.serverTimeoutObj && clearTimeout(this.serverTimeoutObj);
+      this.timeoutObj = setTimeout(()=>{
+        // console.log('发送',{type:'ping'});
+        this.$websocket.send(JSON.stringify({type:'ping'}))   //根据后台要求发送
+        this.serverTimeoutObj = setTimeout(()=> {
+            this.$websocket.close(); //如果  5秒之后我们没有收到 后台返回的心跳检测数据 断开socket,断开后会启动重连机制
+        }, 5000);
+      }, this.timeout)
+    }, 
+    
+    /******************************/
+    
+  },
+  mounted() {
+    // 获取系统时间
+    let t = new Date().getTime();
+    // this.get('api'+this.$ports.TIME+'?t='+t).then(res => {
+    this.get('http://kfadmin.bocai186.com'+this.$ports.TIME+'?t='+t).then(res => {
+      if (res.data.code == 1) {
+        let time = res.data.data.time.split(' ');
+        time[0] =(new Date( time[0].replace(/-/g,'/')).getTime()) /1000;
+        sessionStorage.setItem("time",JSON.stringify(time));
+        sessionStorage.setItem("logo",res.data.data.logo);
+        this.apiToken = this.$md5('customer-service'+time[0]+window.location.origin)
+        this.initWebSocket(this.apiToken);
+      }
+    });
+  },
+  destroyed() {
+    this.lockReconnect = true;
+    this.websock.close()                   //离开路由之后断开websocket连接
+    clearTimeout(this.reconnectData);      //离开清除 timeout
+    clearTimeout(this.timeoutObj);         //离开清除 timeout
+    clearTimeout(this.serverTimeoutObj);   //离开清除 timeout
+  }
+}
+</script>
+
+<style>
+  .fade-enter-active, .fade-leave-active {
+      transition: opacity .5s;
+  }
+     
+  .fade-enter, .fade-leave-to {
+    opacity: 0;
+  }
+</style>

+ 34 - 0
service/src/src/api/ports.js

@@ -0,0 +1,34 @@
+export default {
+  login: '/service/Login/doLogin',
+  // 获取时间
+  TIME:'/index/index/systime',
+  // 快捷回复
+  FastReply:{
+    userWords:'/service/index/userWords',//获取快捷回复列表
+    addWords:'/service/words/addWords',//新增快捷回复
+    deleteWords:'/service/words/deleteWords',//删除快捷回复/service/words/deleteWords
+    updateWords:'/service/words/updateWords',//修改快捷语
+
+    
+  },
+  // 历史会话
+  SessionHistory:{
+    historyList:'/service/history/historyList',//历史会话列表
+  },
+
+  //图片上传
+  uploadImg:'index/upload/uploadImg',
+
+  //获取配置信息
+  minRound:'/index/evaluate/minRound',
+
+  //获取敏感词
+  sensitiveWords:'/index/index/sensitiveWords',
+
+  //用户信息 
+  userInfo:{
+    updateinfo:'/service/Services/updateinfo',
+    updatepwd:'/service/Services/updatepwd'
+  }
+  
+}

BIN
service/src/src/assets/img/0.gif


BIN
service/src/src/assets/img/1.gif


BIN
service/src/src/assets/img/10.gif


BIN
service/src/src/assets/img/11.gif


BIN
service/src/src/assets/img/12.gif


BIN
service/src/src/assets/img/13.gif


BIN
service/src/src/assets/img/14.gif


BIN
service/src/src/assets/img/15.gif


BIN
service/src/src/assets/img/16.gif


BIN
service/src/src/assets/img/17.gif


BIN
service/src/src/assets/img/18.gif


BIN
service/src/src/assets/img/19.gif


BIN
service/src/src/assets/img/2.gif


BIN
service/src/src/assets/img/20.gif


BIN
service/src/src/assets/img/21.gif


BIN
service/src/src/assets/img/22.gif


BIN
service/src/src/assets/img/23.gif


BIN
service/src/src/assets/img/24.gif


BIN
service/src/src/assets/img/25.gif


BIN
service/src/src/assets/img/26.gif


BIN
service/src/src/assets/img/27.gif


BIN
service/src/src/assets/img/28.gif


BIN
service/src/src/assets/img/29.gif


BIN
service/src/src/assets/img/3.gif


BIN
service/src/src/assets/img/30.gif


BIN
service/src/src/assets/img/31.gif


BIN
service/src/src/assets/img/32.gif


BIN
service/src/src/assets/img/33.gif


BIN
service/src/src/assets/img/34.gif


BIN
service/src/src/assets/img/35.gif


BIN
service/src/src/assets/img/36.gif


BIN
service/src/src/assets/img/37.gif


BIN
service/src/src/assets/img/38.gif


BIN
service/src/src/assets/img/39.gif


BIN
service/src/src/assets/img/4.gif


BIN
service/src/src/assets/img/40.gif


BIN
service/src/src/assets/img/41.gif


BIN
service/src/src/assets/img/42.gif


BIN
service/src/src/assets/img/43.gif


BIN
service/src/src/assets/img/44.gif


BIN
service/src/src/assets/img/45.gif


BIN
service/src/src/assets/img/46.gif


BIN
service/src/src/assets/img/47.gif


BIN
service/src/src/assets/img/48.gif


BIN
service/src/src/assets/img/49.gif


BIN
service/src/src/assets/img/5.gif


BIN
service/src/src/assets/img/50.gif


BIN
service/src/src/assets/img/51.gif


BIN
service/src/src/assets/img/52.gif


BIN
service/src/src/assets/img/53.gif


BIN
service/src/src/assets/img/54.gif


BIN
service/src/src/assets/img/55.gif


BIN
service/src/src/assets/img/56.gif


BIN
service/src/src/assets/img/57.gif


BIN
service/src/src/assets/img/58.gif


BIN
service/src/src/assets/img/59.gif


BIN
service/src/src/assets/img/6.gif


BIN
service/src/src/assets/img/60.gif


BIN
service/src/src/assets/img/61.gif


BIN
service/src/src/assets/img/62.gif


BIN
service/src/src/assets/img/63.gif


BIN
service/src/src/assets/img/64.gif


BIN
service/src/src/assets/img/65.gif


BIN
service/src/src/assets/img/66.gif


BIN
service/src/src/assets/img/67.gif


BIN
service/src/src/assets/img/68.gif


BIN
service/src/src/assets/img/69.gif


BIN
service/src/src/assets/img/7.gif


BIN
service/src/src/assets/img/70.gif


BIN
service/src/src/assets/img/71.gif


BIN
service/src/src/assets/img/8.gif


BIN
service/src/src/assets/img/9.gif


BIN
service/src/src/assets/img/Multitap.png


BIN
service/src/src/assets/img/account.png


BIN
service/src/src/assets/img/bottom.png


BIN
service/src/src/assets/img/del.png


BIN
service/src/src/assets/img/end.png


BIN
service/src/src/assets/img/frce.png


BIN
service/src/src/assets/img/frcea.png


BIN
service/src/src/assets/img/hader1.png


BIN
service/src/src/assets/img/hader1a.png


BIN
service/src/src/assets/img/hader2.png


BIN
service/src/src/assets/img/hader3.png


BIN
service/src/src/assets/img/hader3a.png


BIN
service/src/src/assets/img/hader4.png


BIN
service/src/src/assets/img/headerPortrait.png


BIN
service/src/src/assets/img/img.png


BIN
service/src/src/assets/img/left1.png


BIN
service/src/src/assets/img/left1a.png


BIN
service/src/src/assets/img/left2.png


BIN
service/src/src/assets/img/left2a.png


BIN
service/src/src/assets/img/left3.png


BIN
service/src/src/assets/img/left3a.png


BIN
service/src/src/assets/img/left4.png


BIN
service/src/src/assets/img/left4a.png


BIN
service/src/src/assets/img/left5.png


BIN
service/src/src/assets/img/left5a.png


BIN
service/src/src/assets/img/loginBG.png


Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff