| 1 |
- {"remainingRequest":"C:\\Users\\Administrator\\Desktop\\crmeb5.0\\template\\admin\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!C:\\Users\\Administrator\\Desktop\\crmeb5.0\\template\\admin\\src\\pages\\kefu\\appChat\\index.vue?vue&type=script&lang=js","dependencies":[{"path":"C:\\Users\\Administrator\\Desktop\\crmeb5.0\\template\\admin\\src\\pages\\kefu\\appChat\\index.vue","mtime":1761185180094},{"path":"C:\\Users\\Administrator\\Desktop\\crmeb5.0\\template\\admin\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"C:\\Users\\Administrator\\Desktop\\crmeb5.0\\template\\admin\\node_modules\\babel-loader\\lib\\index.js","mtime":456789000000},{"path":"C:\\Users\\Administrator\\Desktop\\crmeb5.0\\template\\admin\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"C:\\Users\\Administrator\\Desktop\\crmeb5.0\\template\\admin\\node_modules\\vue-loader\\lib\\index.js","mtime":499162500000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:DQppbXBvcnQgJ2Vtb2ppLWF3ZXNvbWUvZGlzdC9jc3MvZ29vZ2xlLm1pbi5jc3MnOw0KaW1wb3J0IGVtb2ppTGlzdCBmcm9tICdAL3V0aWxzL2Vtb2ppJzsNCmltcG9ydCB7IFNvY2tldCB9IGZyb20gJ0AvbGlicy9zb2NrZXQnOw0KaW1wb3J0IFNldHRpbmcgZnJvbSAnQC9zZXR0aW5nJzsNCmltcG9ydCBDb29raWVzIGZyb20gJ2pzLWNvb2tpZSc7DQppbXBvcnQgeyBjaGF0TGlzdEFwaSwgc2VydmljZUxpc3RBcGksIGdldEFkdkFwaSwgc2VydmljZUxpc3QsIGdldE9yZGVyQXBpLCBwcm9kdWN0QXBpIH0gZnJvbSAnQC9hcGkva2VmdSc7DQppbXBvcnQgZmVlZEJhY2sgZnJvbSAnLi9mZWVkYmFjayc7DQppbXBvcnQgeyBpc1BpY1VwbG9hZCB9IGZyb20gJ0AvdXRpbHMnOw0KaW1wb3J0IHsgU2Vzc2lvbiB9IGZyb20gJ0AvdXRpbHMvc3RvcmFnZS5qcyc7DQoNCmNvbnN0IGNodW5rID0gZnVuY3Rpb24gKGFyciwgbnVtKSB7DQogIG51bSA9IG51bSAqIDEgfHwgMTsNCiAgdmFyIHJldCA9IFtdOw0KICBhcnIuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSwgaSkgew0KICAgIGlmIChpICUgbnVtID09PSAwKSB7DQogICAgICByZXQucHVzaChbXSk7DQogICAgfQ0KICAgIHJldFtyZXQubGVuZ3RoIC0gMV0ucHVzaChpdGVtKTsNCiAgfSk7DQogIHJldHVybiByZXQ7DQp9Ow0KZXhwb3J0IGRlZmF1bHQgew0KICBuYW1lOiAnQ2hhdFJvb20nLA0KICBhdXRoOiBmYWxzZSwNCiAgY29tcG9uZW50czogew0KICAgIGZlZWRCYWNrLA0KICB9LA0KICBwcm9wczogew0KICAgIGNoYXRPcHRpb25zOiB7DQogICAgICB0eXBlOiBPYmplY3QsDQogICAgICBkZWZhdWx0OiBmdW5jdGlvbiAoKSB7DQogICAgICAgIHJldHVybiB7DQogICAgICAgICAgc2hvdzogZmFsc2UsDQogICAgICAgIH07DQogICAgICB9LA0KICAgIH0sDQogIH0sDQogIGRpcmVjdGl2ZXM6IHsNCiAgICBkcmFnOiB7DQogICAgICBpbnNlcnRlZDogZnVuY3Rpb24gKGVsKSB7DQogICAgICAgIGxldCB4ID0gMDsNCiAgICAgICAgbGV0IHkgPSAwOw0KICAgICAgICBsZXQgbCA9IDA7DQogICAgICAgIGxldCB0ID0gMDsNCiAgICAgICAgbGV0IGlzRG93biA9IGZhbHNlOw0KICAgICAgICBlbC5vbm1vdXNlZG93biA9IGZ1bmN0aW9uIChlKSB7DQogICAgICAgICAgeCA9IGUuY2xpZW50WDsNCiAgICAgICAgICB5ID0gZS5jbGllbnRZOw0KICAgICAgICAgIGwgPSBlbC5wYXJlbnROb2RlLm9mZnNldExlZnQ7DQogICAgICAgICAgdCA9IGVsLnBhcmVudE5vZGUub2Zmc2V0VG9wOw0KICAgICAgICAgIGlzRG93biA9IHRydWU7DQogICAgICAgICAgZWwuc3R5bGUuY3Vyc29yID0gJ21vdmUnOw0KICAgICAgICAgIHdpbmRvdy5vbm1vdXNlbW92ZSA9IGZ1bmN0aW9uIChlKSB7DQogICAgICAgICAgICBpZiAoaXNEb3duID09IGZhbHNlKSB7DQogICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGxldCBueCA9IGUuY2xpZW50WDsNCiAgICAgICAgICAgIGxldCBueSA9IGUuY2xpZW50WTsNCiAgICAgICAgICAgIGxldCBubCA9IG54IC0gKHggLSBsKTsNCiAgICAgICAgICAgIGxldCBudCA9IG55IC0gKHkgLSB0KTsNCiAgICAgICAgICAgIGVsLnBhcmVudE5vZGUuc3R5bGUubGVmdCA9IG5sICsgJ3B4JzsNCiAgICAgICAgICAgIGVsLnBhcmVudE5vZGUuc3R5bGUudG9wID0gbnQgKyAncHgnOw0KICAgICAgICAgIH07DQogICAgICAgICAgd2luZG93Lm9ubW91c2V1cCA9IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIGlzRG93biA9IGZhbHNlOw0KICAgICAgICAgICAgZWwuc3R5bGUuY3Vyc29yID0gJ2RlZmF1bHQnOw0KICAgICAgICAgICAgd2luZG93Lm9ubW91c2Vtb3ZlID0gbnVsbDsNCiAgICAgICAgICAgIHdpbmRvdy5vbm1vdXNldXAgPSBudWxsOw0KICAgICAgICAgIH07DQogICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9Ow0KICAgICAgfSwNCiAgICB9LA0KICB9LA0KICBkYXRhKCkgew0KICAgIHJldHVybiB7DQogICAgICBsb2NhdGlvbnM6IGAke2xvY2F0aW9uLm9yaWdpbn1gLA0KICAgICAgY2hhbmdlOiBmYWxzZSwNCiAgICAgIGVtb2ppR3JvdXA6IGNodW5rKGVtb2ppTGlzdCwgMjApLCAvLyDooajmg4XliJfooagNCiAgICAgIGVtb2ppTGlzdDogZW1vamlMaXN0LA0KICAgICAgZW1vamlTaG93OiBmYWxzZSwNCiAgICAgIHJlY29yZExpc3Q6IFtdLA0KICAgICAgbGltaXQ6IDIwLA0KICAgICAgbG9hZGluZzogZmFsc2UsDQogICAgICBmaW5pc2hlZDogZmFsc2UsDQogICAgICBjaGF0Q29udDogJycsDQogICAgICBzZXJ2aWNlOiBudWxsLA0KICAgICAgc2VydmljZURhdGE6IHt9LA0KICAgICAgdXBsb2FkQWN0aW9uOiAnJywNCiAgICAgIG5vdGljZTogJycsDQogICAgICBhdWRpbzogbnVsbCwNCiAgICAgIG11dGVkOiBmYWxzZSwNCiAgICAgIGF1ZGlvU3JjOiAnJywNCiAgICAgIHVwcGVySWQ6IDAsDQogICAgICB1cGxvYWREYXRhOiB7fSwNCiAgICAgIGlzX3RvdXJpc3Q6IDEsIC8vIDDnmbvlvZXnirbmgIHvvIwx5pyq55m75b2V54q25oCB5ri45a6iDQogICAgICB0ZXh0OiAnJywNCiAgICAgIGlzTG9hZDogZmFsc2UsDQogICAgICBwYWdlOiAxLA0KICAgICAgdG91cmlzdF9hdmF0YXI6ICcnLCAvL+a4uOWuouWktOWDjw0KICAgICAgdG91cmlzdF91aWQ6ICcnLCAvL+a4uOWuomlkDQogICAgICB0b1VpZDogJycsIC8v5a6i5pyNaWQNCiAgICAgIGt1ZnVUb2tlbjogJycsIC8vIHRva2VuDQogICAgICBjb3B5cmlnaHQ6IFNlc3Npb24uZ2V0KCdjb3B5cmlnaHQnKSB8fCAnJywNCiAgICB9Ow0KICB9LA0KICB3YXRjaDogew0KICAgIG11dGVkKHZhbHVlKSB7DQogICAgICB0aGlzLmF1ZGlvLm11dGVkID0gdmFsdWU7DQogICAgfSwNCiAgfSwNCiAgY29tcHV0ZWQ6IHsNCiAgICByZWNvcmRzKCkgew0KICAgICAgcmV0dXJuIHRoaXMucmVjb3JkTGlzdC5tYXAoKGl0ZW0sIGluZGV4KSA9PiB7DQogICAgICAgIGlmIChpbmRleCkgew0KICAgICAgICAgIGlmIChuZXcgRGF0ZShpdGVtLmFkZF90aW1lKSAtIG5ldyBEYXRlKHRoaXMucmVjb3JkTGlzdFtpbmRleCAtIDFdLmFkZF90aW1lKSA+PSAzMDAwMDApIHsNCiAgICAgICAgICAgIGl0ZW0uc2hvdyA9IHRydWU7DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGl0ZW0uc2hvdyA9IGZhbHNlOw0KICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICBpdGVtLnNob3cgPSBmYWxzZTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gaXRlbTsNCiAgICAgIH0pOw0KICAgIH0sDQogIH0sDQogIGNyZWF0ZWQoKSB7DQogICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZigna2VmdScpICE9IC0xKQ0KICAgICAgdGhpcy51cGxvYWRBY3Rpb24gPSBTZXR0aW5nLmFwaUJhc2VVUkwucmVwbGFjZSgvYWRtaW5hcGkvLCAna2VmdWFwaScpICsgJy90b3VyaXN0L3VwbG9hZCc7DQogICAgbGV0IHRva2VuID0gQ29va2llcy5nZXQoJ2F1dGguX3Rva2VuLmxvY2FsMScpOw0KICAgIHRoaXMua3VmdVRva2VuID0gdG9rZW4gPyB0b2tlbi5zcGxpdCgnQmVhcmVyICcpWzFdIDogJyc7DQogIH0sDQogIG1vdW50ZWQoKSB7DQogICAgbGV0IHRoYXQgPSB0aGlzOw0KICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsNCiAgICAgIHRoYXQuZW1vamlTaG93ID0gZmFsc2U7DQogICAgfSk7DQogICAgaWYgKHRoaXMuJHdlY2hhdC5faXNNb2JpbGUoKSkgdGhpcy4kcm91dGVyLnJlcGxhY2UoJy9rZWZ1L21vYmlsZV91c2VyX2NoYXQnKTsNCiAgICB0aGlzLmdldE5vdGljZSgpOw0KICAgIFNvY2tldC50aGVuKCh3cykgPT4gew0KICAgICAgaWYgKHRoaXMua3VmdVRva2VuKSB7DQogICAgICAgIHdzLnNlbmQoew0KICAgICAgICAgIHR5cGU6ICdsb2dpbicsDQogICAgICAgICAgZGF0YTogdGhpcy5rdWZ1VG9rZW4sDQogICAgICAgIH0pOw0KICAgICAgfQ0KICAgICAgdGhpcy5nZXRTZXJ2aWNlKCk7DQogICAgICB3cy4kb24oWydyZXBseScsICdjaGF0J10sIChkYXRhKSA9PiB7DQogICAgICAgIGlmIChkYXRhLm1zbl90eXBlID09IDEpIHsNCiAgICAgICAgICBkYXRhLm1zbiA9IHRoaXMucmVwbGFjZV9lbShkYXRhLm1zbik7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5yZWNvcmRMaXN0LnB1c2goZGF0YSk7DQogICAgICAgIHNldFRpbWVvdXQoKHJlcykgPT4gew0KICAgICAgICAgIHRoaXMuJG5leHRUaWNrKGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHRoaXMuJHJlZnMucmVjb3JkLnNjcm9sbFRvcCA9IHRoaXMuJHJlZnMucmVjb3JkLnNjcm9sbEhlaWdodCAtIHRoaXMuJHJlZnMucmVjb3JkLmNsaWVudEhlaWdodDsNCiAgICAgICAgICB9KTsNCiAgICAgICAgfSwgMzAwKTsNCiAgICAgIH0pOw0KICAgICAgLy8g55uR5ZCs5a6i5pyN6L2s5o6lDQogICAgICB3cy4kb24oJ3RvX3RyYW5zZmVyJywgKGRhdGEpID0+IHsNCiAgICAgICAgdGhpcy50b1VpZCA9IGRhdGEudG9VaWQ7DQogICAgICAgIHdzLnNlbmQoew0KICAgICAgICAgIGRhdGE6IHsNCiAgICAgICAgICAgIGlkOiB0aGlzLnRvVWlkLA0KICAgICAgICAgIH0sDQogICAgICAgICAgdHlwZTogJ3RvX2NoYXQnLA0KICAgICAgICB9KTsNCiAgICAgIH0pOw0KICAgICAgd3MuJG9uKCdzb2NrZXRfZXJyb3InLCAoKSA9PiB7DQogICAgICAgIHRoaXMuJG1lc3NhZ2UuZXJyb3IoJ+i/nuaOpeWksei0pScpOw0KICAgICAgfSk7DQogICAgICB3cy4kb24oJ2Vycl90aXAnLCAoZGF0YSkgPT4gew0KICAgICAgICB0aGlzLiRtZXNzYWdlLmVycm9yKGRhdGEubXNnKTsNCiAgICAgIH0pOw0KICAgICAgd3MuJG9uKCdzdWNjZXNzJywgKGRhdGEpID0+IHsNCiAgICAgICAgdGhpcy5pc190b3VyaXN0ID0gMDsNCiAgICAgIH0pOw0KICAgIH0pOw0KICAgIHRoaXMudGV4dCA9IHRoaXMucmVwbGFjZV9lbSgnW2VtLXNtaWxpbmdfaW1wXScpOw0KICB9LA0KICBiZWZvcmVEZXN0cm95KCkgew0KICAgIHRoaXMuc29ja2V0LmNsb3NlKCk7DQogIH0sDQogIG1ldGhvZHM6IHsNCiAgICBvbkxvb2soaWQpIHsNCiAgICAgIHdpbmRvdy5vcGVuKGAke2xvY2F0aW9uLm9yaWdpbn0vaG9tZS9nb29kc19kZXRhaWwvJHtpZH1gKTsNCiAgICB9LA0KICAgIC8vIOWFs+mXrQ0KICAgIGNsb3NlQ2hhbmdlKG1zZykgew0KICAgICAgdGhpcy5jaGFuZ2UgPSBtc2c7DQogICAgfSwNCiAgICAvLyDnu5/kuIDlj5HpgIHlpITnkIYNCiAgICBzZW5kTXNnKG1zbiwgdHlwZSkgew0KICAgICAgbGV0IG9iaiA9IHsNCiAgICAgICAgdHlwZTogJ2NoYXQnLA0KICAgICAgICBkYXRhOiB7DQogICAgICAgICAgbXNuLA0KICAgICAgICAgIHR5cGUsDQogICAgICAgICAgaXNfdG91cmlzdDogdGhpcy5pc190b3VyaXN0LA0KICAgICAgICAgIHRvX3VpZDogdGhpcy50b1VpZCwNCiAgICAgICAgICB0b3VyaXN0X3VpZDogdGhpcy50b3VyaXN0X3VpZCwNCiAgICAgICAgICB0b3VyaXN0X2F2YXRhcjogdGhpcy50b3VyaXN0X2F2YXRhciwNCiAgICAgICAgICBmb3JtX3R5cGU6IHRoaXMuJHdlY2hhdC5pc1dlaXhpbigpID8gMSA6IDMsDQogICAgICAgIH0sDQogICAgICB9Ow0KICAgICAgU29ja2V0LnRoZW4oKHdzKSA9PiB7DQogICAgICAgIHdzLnNlbmQob2JqKTsNCiAgICAgIH0pOw0KICAgIH0sDQogICAgLy8g6ZqP5py65a6i5pyNDQogICAgZ2V0U2VydmljZSgpIHsNCiAgICAgIHNlcnZpY2VMaXN0QXBpKHsgdG9rZW46IHRoaXMua3VmdVRva2VuIHx8ICcnIH0pDQogICAgICAgIC50aGVuKChyZXMpID0+IHsNCiAgICAgICAgICB0aGlzLnNlcnZpY2VEYXRhID0gcmVzLmRhdGE7DQogICAgICAgICAgdGhpcy51cHBlcklkID0gMDsNCiAgICAgICAgICB0aGlzLnRvVWlkID0gcmVzLmRhdGEudWlkOw0KICAgICAgICAgIHRoaXMudG91cmlzdF91aWQgPSByZXMuZGF0YS50b3VyaXN0X3VpZDsNCiAgICAgICAgICB0aGlzLnRvdXJpc3RfYXZhdGFyID0gcmVzLmRhdGEudG91cmlzdF9hdmF0YXI7DQogICAgICAgICAgbGV0IG9iaiA9IHsNCiAgICAgICAgICAgIGRhdGE6IHsNCiAgICAgICAgICAgICAgaWQ6IHJlcy5kYXRhLnVpZCwNCiAgICAgICAgICAgICAgdG91cmlzdF91aWQ6IHRoaXMudG91cmlzdF91aWQsDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgdHlwZTogJ3RvX2NoYXQnLA0KICAgICAgICAgIH07DQogICAgICAgICAgU29ja2V0LnRoZW4oKHdzKSA9PiB7DQogICAgICAgICAgICB3cy5zZW5kKG9iaik7DQogICAgICAgICAgfSk7DQogICAgICAgICAgaWYgKHRoaXMua3VmdVRva2VuKSB7DQogICAgICAgICAgICB0aGlzLmdldFJlY29yZExpc3QoKTsNCiAgICAgICAgICB9DQogICAgICAgIH0pDQogICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7DQogICAgICAgICAgdGhpcy4kbWVzc2FnZS5lcnJvcihlcnIubXNnKTsNCiAgICAgICAgICB0aGlzLmNoYW5nZSA9IHRydWU7DQogICAgICAgIH0pOw0KICAgIH0sDQogICAgcm9vbUNsaWNrKGV2ZW50KSB7DQogICAgICAvLyBpZiAoDQogICAgICAvLyAgICAgIWV2ZW50LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoImVtb2ppLXBhbmVsIikgJiYNCiAgICAgIC8vICAgICAhZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygiZW1vamktYnRuIikgJiYNCiAgICAgIC8vICAgICAhZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygiaWNvbi1iaWFvcWluZyIpICYmDQogICAgICAvLyAgICAgdGhpcy5lbW9qaVNob3cNCiAgICAgIC8vICkgew0KICAgICAgLy8gICAgIHRoaXMuZW1vamlTaG93ID0gZmFsc2U7DQogICAgICAvLyB9DQogICAgfSwNCiAgICAvLyBlbnRlciDlj5HpgIENCiAgICBjdHJsRW50ZXIoZSkgew0KICAgICAgaWYgKGUua2V5Q29kZSA9PSAxMykgew0KICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7DQogICAgICB9DQogICAgICBpZiAodGhpcy5jaGF0Q29udC50cmltKCkpIHsNCiAgICAgICAgdGhpcy5zZW5kTWVzc2FnZSgpOw0KICAgICAgfQ0KICAgIH0sDQogICAgLy8g5YWz6Zet6IGK5aSp56qX5Y+jDQogICAgY2xvc2UoKSB7DQogICAgICB0aGlzLiRlbWl0KCdjaGF0LWNsb3NlJyk7DQogICAgfSwNCiAgICAvLyDpgInmi6nooajmg4UNCiAgICBzZWxlY3RFbW9qaShkYXRhKSB7DQogICAgICBsZXQgdmFsID0gYFske2RhdGF9XWA7DQogICAgICB0aGlzLmNoYXRDb250ICs9IHZhbDsNCiAgICAgIHRoaXMuZW1vamlTaG93ID0gZmFsc2U7DQogICAgfSwNCiAgICAvLyDogYrlpKnooajmg4XovazmjaINCiAgICByZXBsYWNlX2VtKHN0cikgew0KICAgICAgc3RyID0gc3RyLnJlcGxhY2UoL1xbZW0tKFtcc1xTXSopXF0vZywgIjxzcGFuIGNsYXNzPSdlbSBlbS0kMScvPjwvc3Bhbj4iKTsNCiAgICAgIHJldHVybiBzdHI7DQogICAgfSwNCiAgICBvblNjcm9sbChldmVudCkgew0KICAgICAgaWYgKGV2ZW50LnRhcmdldC5zY3JvbGxUb3AgPD0gMzApIHsNCiAgICAgICAgaWYgKHRoaXMua3VmdVRva2VuKSB7DQogICAgICAgICAgdGhpcy5nZXRSZWNvcmRMaXN0KCk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9LA0KICAgIC8vIOiBiuWkqeiusOW9lQ0KICAgIGdldFJlY29yZExpc3QoKSB7DQogICAgICBpZiAodGhpcy5sb2FkaW5nKSB7DQogICAgICAgIHJldHVybjsNCiAgICAgIH0NCiAgICAgIGlmICh0aGlzLmZpbmlzaGVkKSB7DQogICAgICAgIHJldHVybjsNCiAgICAgIH0NCiAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7DQogICAgICBjaGF0TGlzdEFwaSh7DQogICAgICAgIHVpZDogdGhpcy5zZXJ2aWNlRGF0YS51aWQsDQogICAgICAgIGxpbWl0OiB0aGlzLmxpbWl0LA0KICAgICAgICB1cHBlcklkOiB0aGlzLnVwcGVySWQsDQogICAgICAgIHRva2VuOiB0aGlzLmt1ZnVUb2tlbiwNCiAgICAgIH0pDQogICAgICAgIC50aGVuKChyZXMpID0+IHsNCiAgICAgICAgICBpZiAocmVzLmRhdGEubGVuZ3RoID09PSAwKSByZXR1cm4gKHRoaXMubG9hZGluZyA9IGZhbHNlKTsNCiAgICAgICAgICByZXMuZGF0YS5mb3JFYWNoKChlbCkgPT4gew0KICAgICAgICAgICAgaWYgKGVsLm1zbl90eXBlID09IDEpIHsNCiAgICAgICAgICAgICAgZWwubXNuID0gdGhpcy5yZXBsYWNlX2VtKGVsLm1zbik7DQogICAgICAgICAgICB9DQogICAgICAgICAgfSk7DQogICAgICAgICAgbGV0IHNlbGVjdG9yID0gJyc7DQogICAgICAgICAgaWYgKHRoaXMudXBwZXJJZCA9PSAwKSB7DQogICAgICAgICAgICBzZWxlY3RvciA9IGBjaGF0XyR7cmVzLmRhdGFbcmVzLmRhdGEubGVuZ3RoIC0gMV0uaWR9YDsNCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgc2VsZWN0b3IgPSBgY2hhdF8ke3RoaXMucmVjb3JkTGlzdFswXS5pZH1gOw0KICAgICAgICAgIH0NCiAgICAgICAgICB0aGlzLnJlY29yZExpc3QgPSBbLi4ucmVzLmRhdGEsIC4uLnRoaXMucmVjb3JkTGlzdF07DQogICAgICAgICAgdGhpcy51cHBlcklkID0gcmVzLmRhdGEubGVuZ3RoID4gMCA/IHJlcy5kYXRhWzBdLmlkIDogMDsNCiAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTsNCiAgICAgICAgICB0aGlzLmZpbmlzaGVkID0gcmVzLmRhdGEubGVuZ3RoIDwgdGhpcy5saW1pdDsNCiAgICAgICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB0aGlzLnNldFBhZ2VTY3JvbGxUbyhzZWxlY3Rvcik7DQogICAgICAgICAgfSk7DQogICAgICAgIH0pDQogICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7DQogICAgICAgICAgdGhpcy4kbWVzc2FnZS5lcnJvcihlcnIubXNnKTsNCiAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTsNCiAgICAgICAgfSk7DQogICAgfSwNCiAgICAvLyDorr7nva7pobXpnaLmu5rliqjkvY3nva4NCiAgICBzZXRQYWdlU2Nyb2xsVG8oc2VsZWN0b3IpIHsNCiAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHsNCiAgICAgICAgaWYgKHNlbGVjdG9yKSB7DQogICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7DQogICAgICAgICAgICBsZXQgbnVtID0gcGFyc2VGbG9hdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzZWxlY3Rvcikub2Zmc2V0VG9wKSAtIDYwOw0KICAgICAgICAgICAgdGhpcy4kcmVmcy5yZWNvcmQuc2Nyb2xsVG9wID0gbnVtOw0KICAgICAgICAgIH0sIDApOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIHZhciBjb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjY2hhdF9zY3JvbGwnKTsNCiAgICAgICAgICB0aGlzLiRyZWZzLnJlY29yZC5zY3JvbGxUb3AgPSBjb250YWluZXIub2Zmc2V0SGVpZ2h0Ow0KICAgICAgICAgIHNldFRpbWVvdXQoKHJlcykgPT4gew0KICAgICAgICAgICAgaWYgKHRoaXMuJHJlZnMucmVjb3JkLnNjcm9sbFRvcCAhPSB0aGlzLiRyZWZzLnNjcm9sbEJveC5vZmZzZXRIZWlnaHQpIHsNCiAgICAgICAgICAgICAgdGhpcy4kcmVmcy5yZWNvcmQuc2Nyb2xsVG9wID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2NoYXRfc2Nyb2xsJykub2Zmc2V0SGVpZ2h0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0sIDMwMCk7DQogICAgICAgIH0NCiAgICAgIH0pOw0KICAgIH0sDQogICAgLy8g6KGo5oOF5YyF5pi+56S66ZqQ6JePDQogICAgZW1vamlTd2l0Y2goKSB7DQogICAgICB0aGlzLmVtb2ppU2hvdyA9ICF0aGlzLmVtb2ppU2hvdzsNCiAgICB9LA0KICAgIC8vIOWPkemAgea2iOaBrw0KICAgIHNlbmRNZXNzYWdlKCkgew0KICAgICAgdGhpcy5zZW5kTXNnKHRoaXMuY2hhdENvbnQsIDEpOw0KICAgICAgdGhpcy5jaGF0Q29udCA9ICcnOw0KICAgIH0sDQogICAgY2hhdChkYXRhKSB7DQogICAgICBpZiAoZGF0YS51aWQgIT0gdGhpcy4kYXV0aC51c2VyLnVpZCAmJiB0aGlzLmF1ZGlvKSB7DQogICAgICAgIHRoaXMuYXVkaW8ucGxheSgpOw0KICAgICAgfQ0KICAgICAgdGhpcy5yZWNvcmRMaXN0LnB1c2goZGF0YSk7DQogICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7DQogICAgICAgIHRoaXMuJHJlZnMucmVjb3JkLnNjcm9sbFRvcCA9IHRoaXMuJHJlZnMucmVjb3JkLnNjcm9sbEhlaWdodCAtIHRoaXMuJHJlZnMucmVjb3JkLmNsaWVudEhlaWdodDsNCiAgICAgIH0pOw0KICAgIH0sDQogICAgc2VuZEdvb2RzKCkgew0KICAgICAgaWYgKHRoaXMuY2hhdE9wdGlvbnMuZ29vZHNJZCkgew0KICAgICAgICBTb2NrZXQudGhlbigod3MpID0+IHsNCiAgICAgICAgICB3cy5zZW5kKHsNCiAgICAgICAgICAgIGRhdGE6IHsNCiAgICAgICAgICAgICAgbXNuOiB0aGlzLmNoYXRPcHRpb25zLmdvb2RzSWQsDQogICAgICAgICAgICAgIHR5cGU6IDUsDQogICAgICAgICAgICAgIHRvX3VpZDogdGhpcy50b1VpZCwNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICB0eXBlOiAndG9fY2hhdCcsDQogICAgICAgICAgfSk7DQogICAgICAgIH0pOw0KICAgICAgfQ0KICAgIH0sDQogICAgc2VuZE9yZGVyKCkgew0KICAgICAgaWYgKHRoaXMuY2hhdE9wdGlvbnMub3JkZXJJZCkgew0KICAgICAgICBTb2NrZXQudGhlbigod3MpID0+IHsNCiAgICAgICAgICB3cy5zZW5kKHsNCiAgICAgICAgICAgIGRhdGE6IHsNCiAgICAgICAgICAgICAgbXNuOiB0aGlzLmNoYXRPcHRpb25zLm9yZGVySWQsDQogICAgICAgICAgICAgIHR5cGU6IDYsDQogICAgICAgICAgICAgIHRvX3VpZDogdGhpcy50b1VpZCwNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICB0eXBlOiAndG9fY2hhdCcsDQogICAgICAgICAgfSk7DQogICAgICAgIH0pOw0KICAgICAgfQ0KICAgIH0sDQogICAgY2hhdEVuZCgpIHsNCiAgICAgIGlmIChuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ01TSUUnKSA+IDApIHsNCiAgICAgICAgaWYgKG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignTVNJRSA2LjAnKSA+IDApIHsNCiAgICAgICAgICB3aW5kb3cub3BlbmVyID0gbnVsbDsNCiAgICAgICAgICB3aW5kb3cuY2xvc2UoKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICB3aW5kb3cub3BlbignJywgJ190b3AnKTsNCiAgICAgICAgICB3aW5kb3cudG9wLmNsb3NlKCk7DQogICAgICAgIH0NCiAgICAgIH0gZWxzZSBpZiAobmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdGaXJlZm94JykgPiAwKSB7DQogICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJ2Fib3V0OmJsYW5rICc7DQogICAgICB9IGVsc2Ugew0KICAgICAgICB3aW5kb3cub3BlbmVyID0gbnVsbDsNCiAgICAgICAgd2luZG93Lm9wZW4oJycsICdfc2VsZicsICcnKTsNCiAgICAgICAgd2luZG93LmNsb3NlKCk7DQogICAgICB9DQogICAgfSwNCiAgICAvLyDlub/lkYoNCiAgICBnZXROb3RpY2UoKSB7DQogICAgICBnZXRBZHZBcGkoKS50aGVuKChyZXMpID0+IHsNCiAgICAgICAgdGhpcy5ub3RpY2UgPSByZXMuZGF0YS5jb250ZW50Ow0KICAgICAgfSk7DQogICAgfSwNCiAgICBiZWZvcmVVcGxvYWQoZmlsZSkgew0KICAgICAgaWYgKGlzUGljVXBsb2FkKGZpbGUpKSB7DQogICAgICAgIHRoaXMudXBsb2FkRGF0YSA9IHsNCiAgICAgICAgICBmaWxlbmFtZTogZmlsZSwNCiAgICAgICAgICB0b2tlbjogdGhpcy5rdWZ1VG9rZW4sDQogICAgICAgIH07DQogICAgICAgIGxldCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsNCiAgICAgICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICByZXNvbHZlKHRydWUpOw0KICAgICAgICAgIH0pOw0KICAgICAgICB9KTsNCiAgICAgICAgcmV0dXJuIHByb21pc2U7DQogICAgICB9DQogICAgfSwNCiAgICBoYW5kbGVGb3JtYXRFcnJvcihmaWxlKSB7DQogICAgICB0aGlzLiRtZXNzYWdlLmVycm9yKCfkuIrkvKDlm77niYflj6rog73mmK8ganBn44CBanBn44CBanBlZ+OAgWdpZiDmoLzlvI8hJyk7DQogICAgfSwNCiAgICB1cGxvYWRTdWNjZXNzKHJlcykgew0KICAgICAgdGhpcy5zZW5kTXNnKHJlcy5kYXRhLnVybCwgMyk7DQogICAgfSwNCiAgICB1cGxvYWRFcnJvcihlcnJvcikgew0KICAgICAgdGhpcy4kbWVzc2FnZS5lcnJvcihlcnJvcik7DQogICAgfSwNCiAgfSwNCn07DQo="},{"version":3,"sources":["index.vue"],"names":[],"mappings":";AAwJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"index.vue","sourceRoot":"src/pages/kefu/appChat","sourcesContent":["<template>\r\n <div class=\"chat-room\">\r\n <div class=\"room\" :class=\"{ win: !chatOptions.popup }\" v-db-click @click=\"roomClick\">\r\n <div v-drag class=\"head\">\r\n <div class=\"image\">\r\n <img v-lazy=\"serviceData && serviceData.avatar\" />\r\n </div>\r\n <div class=\"name\">{{ serviceData && serviceData.nickname }}</div>\r\n <div\r\n :class=\"['iconfont', muted ? 'icon-shengyinjingyinxianxing' : 'icon-shengyinyinliang']\"\r\n v-db-click\r\n @click.stop=\"muted = !muted\"\r\n ></div>\r\n <div class=\"iconfont icon-guanbi5\" v-db-click @click.stop=\"close\"></div>\r\n </div>\r\n <div class=\"main\">\r\n <div class=\"chat\">\r\n <div class=\"record\" @scroll=\"onScroll\" ref=\"record\">\r\n <div id=\"chat_scroll\" ref=\"scrollBox\" v-loading=\"loading\">\r\n <ul>\r\n <template v-for=\"item in records\">\r\n <li :key=\"item.id\" :class=\"{ right: item.uid === serviceData.tourist_uid }\" :id=\"`chat_${item.id}`\">\r\n <div v-if=\"item.show\" class=\"time-tag\">\r\n {{ item.add_time }}\r\n </div>\r\n <div class=\"avatar\">\r\n <img v-lazy=\"item.avatar\" />\r\n </div>\r\n <div class=\"content\" ref=\"chatContent\">\r\n <div v-if=\"item.msn_type === 1\" class=\"text\" v-html=\"item.msn\"></div>\r\n <div v-if=\"item.msn_type === 2\" class=\"image\">\r\n <div class=\"text\">\r\n <i :class=\"`em ${item.msn}`\"></i>\r\n </div>\r\n </div>\r\n <div v-if=\"item.msn_type === 3\" class=\"image\" v-viewer>\r\n <img v-lazy=\"item.msn\" />\r\n </div>\r\n <div v-if=\"item.msn_type === 5\" class=\"goods\">\r\n <div class=\"thumb\">\r\n <img v-lazy=\"item.productInfo.image\" />\r\n </div>\r\n <div class=\"intro\">\r\n <div class=\"name\">\r\n {{ item.productInfo.store_name }}\r\n </div>\r\n <div class=\"attr\">\r\n <span>库存:{{ item.productInfo.stock }}</span>\r\n <span\r\n >销量:{{\r\n parseInt(item.productInfo.sales) +\r\n parseInt(item.productInfo.ficti ? item.productInfo.ficti : 0)\r\n }}</span\r\n >\r\n </div>\r\n <div class=\"group\">\r\n <div class=\"money\">¥{{ item.productInfo.price }}</div>\r\n <span style=\"cursor: pointer\" v-db-click @click.stop=\"onLook(item.productInfo.id)\"\r\n >查看商品 ></span\r\n >\r\n </div>\r\n </div>\r\n </div>\r\n <template v-if=\"item.msn_type === 6\">\r\n <div v-for=\"itm in item.orderInfo.cartInfo\" :key=\"itm.id\" class=\"order\">\r\n <div class=\"thumb\">\r\n <img :src=\"itm.productInfo.image\" />\r\n </div>\r\n <div class=\"intro\">\r\n <div class=\"name\">订单ID:{{ item.orderInfo.order_id }}</div>\r\n <div class=\"attr\">商品数量:{{ itm.cart_num }}</div>\r\n <div class=\"group\">\r\n <div class=\"money\">¥{{ itm.productInfo.price }}</div>\r\n <nuxt-link\r\n target=\"_blank\"\r\n :to=\"{\r\n path: '/order_detail',\r\n query: { orderId: item.orderInfo.order_id },\r\n }\"\r\n >查看订单 ></nuxt-link\r\n >\r\n </div>\r\n </div>\r\n </div>\r\n </template>\r\n </div>\r\n </li>\r\n </template>\r\n </ul>\r\n </div>\r\n </div>\r\n <div class=\"editor\">\r\n <div class=\"editor-hd\">\r\n <div>\r\n <button class=\"emoji-btn\" title=\"表情\" v-db-click @click.stop=\"emojiSwitch\">\r\n <span class=\"iconfont iconbiaoqing1\"></span>\r\n </button>\r\n <button title=\"图片\" v-if=\"kufuToken\">\r\n <el-upload\r\n :show-file-list=\"false\"\r\n :action=\"uploadAction\"\r\n :before-upload=\"beforeUpload\"\r\n accept=\"image/*\"\r\n :on-format-error=\"handleFormatError\"\r\n :data=\"uploadData\"\r\n :on-success=\"uploadSuccess\"\r\n :on-error=\"uploadError\"\r\n >\r\n <span class=\"iconfont icontupian1\"></span>\r\n </el-upload>\r\n </button>\r\n </div>\r\n <!-- <div>-->\r\n <!-- <button class=\"end\" v-db-click @click=\"chatEnd\">-->\r\n <!-- <i class=\"iconfont icon-guanji\"></i>结束-->\r\n <!-- </button>-->\r\n <!-- </div>-->\r\n <!-- 表情 -->\r\n <div class=\"emoji-panel\" v-if=\"emojiShow\">\r\n <i\r\n class=\"em\"\r\n :class=\"emoji\"\r\n v-db-click\r\n @click.stop=\"selectEmoji(emoji)\"\r\n v-for=\"(emoji, index) in emojiList\"\r\n :key=\"index\"\r\n ></i>\r\n </div>\r\n </div>\r\n <div class=\"editor-bd\">\r\n <textarea v-model=\"chatCont\" placeholder=\"请输入文字内容\" @keydown.enter=\"ctrlEnter\"></textarea>\r\n </div>\r\n <div class=\"editor-ft\">\r\n <button :disabled=\"!chatCont\" v-db-click @click.stop=\"sendMessage\">发送</button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"notice\">\r\n <div v-if=\"notice\" class=\"rich\" v-html=\"notice\"></div>\r\n <div class=\"copy\">\r\n <span v-if=\"copyright\">{{ copyright }}</span>\r\n <a v-else href=\"http://www.crmeb.com/\" target=\"_blank\">CRMEB提供技术支持</a>\r\n </div>\r\n </div>\r\n </div>\r\n <audio ref=\"audio\" :src=\"audioSrc\"></audio>\r\n </div>\r\n <feed-back @closeChange=\"closeChange($event)\" v-if=\"change\" :change=\"change\"></feed-back>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport 'emoji-awesome/dist/css/google.min.css';\r\nimport emojiList from '@/utils/emoji';\r\nimport { Socket } from '@/libs/socket';\r\nimport Setting from '@/setting';\r\nimport Cookies from 'js-cookie';\r\nimport { chatListApi, serviceListApi, getAdvApi, serviceList, getOrderApi, productApi } from '@/api/kefu';\r\nimport feedBack from './feedback';\r\nimport { isPicUpload } from '@/utils';\r\nimport { Session } from '@/utils/storage.js';\r\n\r\nconst chunk = function (arr, num) {\r\n num = num * 1 || 1;\r\n var ret = [];\r\n arr.forEach(function (item, i) {\r\n if (i % num === 0) {\r\n ret.push([]);\r\n }\r\n ret[ret.length - 1].push(item);\r\n });\r\n return ret;\r\n};\r\nexport default {\r\n name: 'ChatRoom',\r\n auth: false,\r\n components: {\r\n feedBack,\r\n },\r\n props: {\r\n chatOptions: {\r\n type: Object,\r\n default: function () {\r\n return {\r\n show: false,\r\n };\r\n },\r\n },\r\n },\r\n directives: {\r\n drag: {\r\n inserted: function (el) {\r\n let x = 0;\r\n let y = 0;\r\n let l = 0;\r\n let t = 0;\r\n let isDown = false;\r\n el.onmousedown = function (e) {\r\n x = e.clientX;\r\n y = e.clientY;\r\n l = el.parentNode.offsetLeft;\r\n t = el.parentNode.offsetTop;\r\n isDown = true;\r\n el.style.cursor = 'move';\r\n window.onmousemove = function (e) {\r\n if (isDown == false) {\r\n return;\r\n }\r\n let nx = e.clientX;\r\n let ny = e.clientY;\r\n let nl = nx - (x - l);\r\n let nt = ny - (y - t);\r\n el.parentNode.style.left = nl + 'px';\r\n el.parentNode.style.top = nt + 'px';\r\n };\r\n window.onmouseup = function () {\r\n isDown = false;\r\n el.style.cursor = 'default';\r\n window.onmousemove = null;\r\n window.onmouseup = null;\r\n };\r\n return false;\r\n };\r\n },\r\n },\r\n },\r\n data() {\r\n return {\r\n locations: `${location.origin}`,\r\n change: false,\r\n emojiGroup: chunk(emojiList, 20), // 表情列表\r\n emojiList: emojiList,\r\n emojiShow: false,\r\n recordList: [],\r\n limit: 20,\r\n loading: false,\r\n finished: false,\r\n chatCont: '',\r\n service: null,\r\n serviceData: {},\r\n uploadAction: '',\r\n notice: '',\r\n audio: null,\r\n muted: false,\r\n audioSrc: '',\r\n upperId: 0,\r\n uploadData: {},\r\n is_tourist: 1, // 0登录状态,1未登录状态游客\r\n text: '',\r\n isLoad: false,\r\n page: 1,\r\n tourist_avatar: '', //游客头像\r\n tourist_uid: '', //游客id\r\n toUid: '', //客服id\r\n kufuToken: '', // token\r\n copyright: Session.get('copyright') || '',\r\n };\r\n },\r\n watch: {\r\n muted(value) {\r\n this.audio.muted = value;\r\n },\r\n },\r\n computed: {\r\n records() {\r\n return this.recordList.map((item, index) => {\r\n if (index) {\r\n if (new Date(item.add_time) - new Date(this.recordList[index - 1].add_time) >= 300000) {\r\n item.show = true;\r\n } else {\r\n item.show = false;\r\n }\r\n } else {\r\n item.show = false;\r\n }\r\n return item;\r\n });\r\n },\r\n },\r\n created() {\r\n if (location.href.indexOf('kefu') != -1)\r\n this.uploadAction = Setting.apiBaseURL.replace(/adminapi/, 'kefuapi') + '/tourist/upload';\r\n let token = Cookies.get('auth._token.local1');\r\n this.kufuToken = token ? token.split('Bearer ')[1] : '';\r\n },\r\n mounted() {\r\n let that = this;\r\n window.addEventListener('click', function () {\r\n that.emojiShow = false;\r\n });\r\n if (this.$wechat._isMobile()) this.$router.replace('/kefu/mobile_user_chat');\r\n this.getNotice();\r\n Socket.then((ws) => {\r\n if (this.kufuToken) {\r\n ws.send({\r\n type: 'login',\r\n data: this.kufuToken,\r\n });\r\n }\r\n this.getService();\r\n ws.$on(['reply', 'chat'], (data) => {\r\n if (data.msn_type == 1) {\r\n data.msn = this.replace_em(data.msn);\r\n }\r\n this.recordList.push(data);\r\n setTimeout((res) => {\r\n this.$nextTick(function () {\r\n this.$refs.record.scrollTop = this.$refs.record.scrollHeight - this.$refs.record.clientHeight;\r\n });\r\n }, 300);\r\n });\r\n // 监听客服转接\r\n ws.$on('to_transfer', (data) => {\r\n this.toUid = data.toUid;\r\n ws.send({\r\n data: {\r\n id: this.toUid,\r\n },\r\n type: 'to_chat',\r\n });\r\n });\r\n ws.$on('socket_error', () => {\r\n this.$message.error('连接失败');\r\n });\r\n ws.$on('err_tip', (data) => {\r\n this.$message.error(data.msg);\r\n });\r\n ws.$on('success', (data) => {\r\n this.is_tourist = 0;\r\n });\r\n });\r\n this.text = this.replace_em('[em-smiling_imp]');\r\n },\r\n beforeDestroy() {\r\n this.socket.close();\r\n },\r\n methods: {\r\n onLook(id) {\r\n window.open(`${location.origin}/home/goods_detail/${id}`);\r\n },\r\n // 关闭\r\n closeChange(msg) {\r\n this.change = msg;\r\n },\r\n // 统一发送处理\r\n sendMsg(msn, type) {\r\n let obj = {\r\n type: 'chat',\r\n data: {\r\n msn,\r\n type,\r\n is_tourist: this.is_tourist,\r\n to_uid: this.toUid,\r\n tourist_uid: this.tourist_uid,\r\n tourist_avatar: this.tourist_avatar,\r\n form_type: this.$wechat.isWeixin() ? 1 : 3,\r\n },\r\n };\r\n Socket.then((ws) => {\r\n ws.send(obj);\r\n });\r\n },\r\n // 随机客服\r\n getService() {\r\n serviceListApi({ token: this.kufuToken || '' })\r\n .then((res) => {\r\n this.serviceData = res.data;\r\n this.upperId = 0;\r\n this.toUid = res.data.uid;\r\n this.tourist_uid = res.data.tourist_uid;\r\n this.tourist_avatar = res.data.tourist_avatar;\r\n let obj = {\r\n data: {\r\n id: res.data.uid,\r\n tourist_uid: this.tourist_uid,\r\n },\r\n type: 'to_chat',\r\n };\r\n Socket.then((ws) => {\r\n ws.send(obj);\r\n });\r\n if (this.kufuToken) {\r\n this.getRecordList();\r\n }\r\n })\r\n .catch((err) => {\r\n this.$message.error(err.msg);\r\n this.change = true;\r\n });\r\n },\r\n roomClick(event) {\r\n // if (\r\n // !event.target.classList.contains(\"emoji-panel\") &&\r\n // !event.target.classList.contains(\"emoji-btn\") &&\r\n // !event.target.classList.contains(\"icon-biaoqing\") &&\r\n // this.emojiShow\r\n // ) {\r\n // this.emojiShow = false;\r\n // }\r\n },\r\n // enter 发送\r\n ctrlEnter(e) {\r\n if (e.keyCode == 13) {\r\n e.preventDefault();\r\n }\r\n if (this.chatCont.trim()) {\r\n this.sendMessage();\r\n }\r\n },\r\n // 关闭聊天窗口\r\n close() {\r\n this.$emit('chat-close');\r\n },\r\n // 选择表情\r\n selectEmoji(data) {\r\n let val = `[${data}]`;\r\n this.chatCont += val;\r\n this.emojiShow = false;\r\n },\r\n // 聊天表情转换\r\n replace_em(str) {\r\n str = str.replace(/\\[em-([\\s\\S]*)\\]/g, \"<span class='em em-$1'/></span>\");\r\n return str;\r\n },\r\n onScroll(event) {\r\n if (event.target.scrollTop <= 30) {\r\n if (this.kufuToken) {\r\n this.getRecordList();\r\n }\r\n }\r\n },\r\n // 聊天记录\r\n getRecordList() {\r\n if (this.loading) {\r\n return;\r\n }\r\n if (this.finished) {\r\n return;\r\n }\r\n this.loading = true;\r\n chatListApi({\r\n uid: this.serviceData.uid,\r\n limit: this.limit,\r\n upperId: this.upperId,\r\n token: this.kufuToken,\r\n })\r\n .then((res) => {\r\n if (res.data.length === 0) return (this.loading = false);\r\n res.data.forEach((el) => {\r\n if (el.msn_type == 1) {\r\n el.msn = this.replace_em(el.msn);\r\n }\r\n });\r\n let selector = '';\r\n if (this.upperId == 0) {\r\n selector = `chat_${res.data[res.data.length - 1].id}`;\r\n } else {\r\n selector = `chat_${this.recordList[0].id}`;\r\n }\r\n this.recordList = [...res.data, ...this.recordList];\r\n this.upperId = res.data.length > 0 ? res.data[0].id : 0;\r\n this.loading = false;\r\n this.finished = res.data.length < this.limit;\r\n this.$nextTick(function () {\r\n this.setPageScrollTo(selector);\r\n });\r\n })\r\n .catch((err) => {\r\n this.$message.error(err.msg);\r\n this.loading = false;\r\n });\r\n },\r\n // 设置页面滚动位置\r\n setPageScrollTo(selector) {\r\n this.$nextTick(() => {\r\n if (selector) {\r\n setTimeout(() => {\r\n let num = parseFloat(document.getElementById(selector).offsetTop) - 60;\r\n this.$refs.record.scrollTop = num;\r\n }, 0);\r\n } else {\r\n var container = document.querySelector('#chat_scroll');\r\n this.$refs.record.scrollTop = container.offsetHeight;\r\n setTimeout((res) => {\r\n if (this.$refs.record.scrollTop != this.$refs.scrollBox.offsetHeight) {\r\n this.$refs.record.scrollTop = document.querySelector('#chat_scroll').offsetHeight;\r\n }\r\n }, 300);\r\n }\r\n });\r\n },\r\n // 表情包显示隐藏\r\n emojiSwitch() {\r\n this.emojiShow = !this.emojiShow;\r\n },\r\n // 发送消息\r\n sendMessage() {\r\n this.sendMsg(this.chatCont, 1);\r\n this.chatCont = '';\r\n },\r\n chat(data) {\r\n if (data.uid != this.$auth.user.uid && this.audio) {\r\n this.audio.play();\r\n }\r\n this.recordList.push(data);\r\n this.$nextTick(() => {\r\n this.$refs.record.scrollTop = this.$refs.record.scrollHeight - this.$refs.record.clientHeight;\r\n });\r\n },\r\n sendGoods() {\r\n if (this.chatOptions.goodsId) {\r\n Socket.then((ws) => {\r\n ws.send({\r\n data: {\r\n msn: this.chatOptions.goodsId,\r\n type: 5,\r\n to_uid: this.toUid,\r\n },\r\n type: 'to_chat',\r\n });\r\n });\r\n }\r\n },\r\n sendOrder() {\r\n if (this.chatOptions.orderId) {\r\n Socket.then((ws) => {\r\n ws.send({\r\n data: {\r\n msn: this.chatOptions.orderId,\r\n type: 6,\r\n to_uid: this.toUid,\r\n },\r\n type: 'to_chat',\r\n });\r\n });\r\n }\r\n },\r\n chatEnd() {\r\n if (navigator.userAgent.indexOf('MSIE') > 0) {\r\n if (navigator.userAgent.indexOf('MSIE 6.0') > 0) {\r\n window.opener = null;\r\n window.close();\r\n } else {\r\n window.open('', '_top');\r\n window.top.close();\r\n }\r\n } else if (navigator.userAgent.indexOf('Firefox') > 0) {\r\n window.location.href = 'about:blank ';\r\n } else {\r\n window.opener = null;\r\n window.open('', '_self', '');\r\n window.close();\r\n }\r\n },\r\n // 广告\r\n getNotice() {\r\n getAdvApi().then((res) => {\r\n this.notice = res.data.content;\r\n });\r\n },\r\n beforeUpload(file) {\r\n if (isPicUpload(file)) {\r\n this.uploadData = {\r\n filename: file,\r\n token: this.kufuToken,\r\n };\r\n let promise = new Promise((resolve) => {\r\n this.$nextTick(function () {\r\n resolve(true);\r\n });\r\n });\r\n return promise;\r\n }\r\n },\r\n handleFormatError(file) {\r\n this.$message.error('上传图片只能是 jpg、jpg、jpeg、gif 格式!');\r\n },\r\n uploadSuccess(res) {\r\n this.sendMsg(res.data.url, 3);\r\n },\r\n uploadError(error) {\r\n this.$message.error(error);\r\n },\r\n },\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@import '../../../styles/emoji-awesome/css/google.min.css';\r\nli {\r\n list-style-type: none;\r\n}\r\n.chat-room {\r\n .room {\r\n border-radius: 10px;\r\n position: fixed;\r\n top: calc(50% - 327px);\r\n left: calc(50% - 365px);\r\n z-index: 999;\r\n display: flex;\r\n flex-direction: column;\r\n width: 730px;\r\n height: 654px;\r\n background-color: #ffffff;\r\n overflow: hidden;\r\n box-shadow: 1px 1px 15px 0 rgba(0, 0, 0, 0.1);\r\n\r\n &.win {\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n }\r\n\r\n .head {\r\n display: flex;\r\n align-items: center;\r\n height: 50px;\r\n padding-right: 15px;\r\n padding-left: 20px;\r\n background: linear-gradient(270deg, var(--prev-color-primary) 0%, #3875ea 100%);\r\n\r\n .image {\r\n width: 36px;\r\n height: 36px;\r\n border-radius: 50%;\r\n overflow: hidden;\r\n\r\n img {\r\n display: block;\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n }\r\n }\r\n\r\n .name {\r\n flex: 1;\r\n min-width: 0;\r\n margin-left: 15px;\r\n font-size: 16px;\r\n color: #ffffff;\r\n }\r\n\r\n .iconfont {\r\n width: 25px;\r\n height: 25px;\r\n font-size: 16px;\r\n line-height: 25px;\r\n text-align: center;\r\n color: #ffffff;\r\n cursor: pointer;\r\n }\r\n }\r\n\r\n .main {\r\n flex: 1;\r\n display: flex;\r\n min-height: 0;\r\n\r\n .chat {\r\n flex: 1;\r\n display: flex;\r\n flex-direction: column;\r\n min-width: 0;\r\n }\r\n\r\n .record {\r\n flex: 1;\r\n min-height: 0;\r\n overflow-x: hidden;\r\n overflow-y: auto;\r\n\r\n &::-webkit-scrollbar {\r\n display: none;\r\n }\r\n\r\n ul {\r\n padding: 20px;\r\n }\r\n\r\n li {\r\n ~ li {\r\n margin-top: 20px;\r\n }\r\n\r\n &::after {\r\n content: '';\r\n display: block;\r\n height: 0;\r\n clear: both;\r\n visibility: hidden;\r\n }\r\n\r\n &.right {\r\n .avatar {\r\n float: right;\r\n }\r\n\r\n .content {\r\n text-align: right;\r\n\r\n > div {\r\n text-align: left;\r\n }\r\n }\r\n }\r\n }\r\n\r\n .time-tag {\r\n padding-top: 10px;\r\n padding-bottom: 30px;\r\n text-align: center;\r\n color: #999999;\r\n }\r\n\r\n .avatar {\r\n float: left;\r\n width: 40px;\r\n height: 40px;\r\n border-radius: 50%;\r\n overflow: hidden;\r\n\r\n &.right {\r\n float: right;\r\n }\r\n\r\n img {\r\n display: block;\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n }\r\n }\r\n\r\n .content {\r\n margin-right: 56px;\r\n margin-left: 56px;\r\n }\r\n\r\n .text {\r\n display: inline-block;\r\n min-height: 41px;\r\n padding: 10px 12px;\r\n border-radius: 10px;\r\n background-color: #f5f5f5;\r\n font-size: 15px;\r\n line-height: 21px;\r\n color: #000000;\r\n }\r\n\r\n .image {\r\n display: inline-block;\r\n max-width: 50%;\r\n border-radius: 10px;\r\n overflow: hidden;\r\n\r\n img {\r\n display: block;\r\n max-width: 100%;\r\n }\r\n }\r\n\r\n .goods,\r\n .order {\r\n display: inline-flex;\r\n align-items: center;\r\n width: 320px;\r\n padding: 10px 13px;\r\n border-radius: 10px;\r\n background-color: #f5f5f5;\r\n }\r\n\r\n .thumb {\r\n width: 60px;\r\n height: 60px;\r\n border-radius: 5px;\r\n overflow: hidden;\r\n\r\n img {\r\n display: block;\r\n width: 100%;\r\n height: 100%;\r\n }\r\n }\r\n\r\n .intro {\r\n flex: 1;\r\n min-width: 0;\r\n margin-left: 10px;\r\n\r\n .name {\r\n overflow: hidden;\r\n white-space: nowrap;\r\n text-overflow: ellipsis;\r\n font-size: 15px;\r\n color: #000000;\r\n }\r\n\r\n .attr {\r\n margin-top: 5px;\r\n font-size: 12px;\r\n color: #999999;\r\n\r\n span {\r\n vertical-align: middle;\r\n\r\n ~ span {\r\n margin-left: 10px;\r\n }\r\n }\r\n }\r\n\r\n .group {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n margin-top: 5px;\r\n\r\n .money {\r\n font-size: 14px;\r\n color: #ff0000;\r\n }\r\n\r\n a {\r\n font-size: 12px;\r\n color: var(--prev-color-primary);\r\n }\r\n }\r\n }\r\n }\r\n\r\n .editor {\r\n display: flex;\r\n flex-direction: column;\r\n height: 162px;\r\n border-top: 1px solid #ececec;\r\n\r\n > div {\r\n &:first-child {\r\n font-size: 0;\r\n }\r\n }\r\n\r\n button {\r\n border: none;\r\n background: none;\r\n outline: none;\r\n\r\n ~ button {\r\n margin-left: 20px;\r\n }\r\n\r\n &.end {\r\n font-size: 15px;\r\n }\r\n\r\n &:hover {\r\n color: var(--prev-color-primary);\r\n\r\n .iconfont {\r\n color: var(--prev-color-primary);\r\n }\r\n }\r\n }\r\n\r\n .editor-hd {\r\n position: relative;\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n height: 50px;\r\n padding-right: 20px;\r\n padding-left: 20px;\r\n\r\n .iconfont {\r\n line-height: 1;\r\n color: #333333;\r\n }\r\n\r\n .emoji-panel {\r\n position: absolute;\r\n bottom: 100%;\r\n left: 5px;\r\n width: 390px;\r\n padding-bottom: 10px;\r\n border: 1px solid #ececec;\r\n margin-bottom: 5px;\r\n background-color: #ffffff;\r\n box-shadow: 1px 0 16px 0 rgba(0, 0, 0, 0.05);\r\n\r\n .em {\r\n width: 28px;\r\n height: 28px;\r\n padding: 4px;\r\n margin-top: 10px;\r\n margin-left: 10px;\r\n box-sizing: border-box;\r\n\r\n &:hover {\r\n background-color: #ececec;\r\n }\r\n }\r\n }\r\n }\r\n\r\n .icon-biaoqing1,\r\n .icon-tupian1 {\r\n font-size: 22px;\r\n }\r\n\r\n .icon-guanji {\r\n margin-right: 5px;\r\n font-size: 15px;\r\n }\r\n\r\n .editor-bd {\r\n flex: 1;\r\n min-height: 0;\r\n\r\n textarea {\r\n display: block;\r\n width: 100%;\r\n height: 100%;\r\n padding-right: 20px;\r\n padding-left: 20px;\r\n border: none;\r\n outline: none;\r\n resize: none;\r\n white-space: pre-wrap;\r\n overflow-wrap: break-word;\r\n\r\n &::-webkit-scrollbar {\r\n display: none;\r\n }\r\n }\r\n }\r\n\r\n .editor-ft {\r\n display: flex;\r\n justify-content: flex-end;\r\n align-items: center;\r\n padding-right: 20px;\r\n padding-bottom: 20px;\r\n\r\n button {\r\n width: 68px;\r\n height: 26px;\r\n border: none;\r\n border-radius: 3px;\r\n background-color: #3875ea;\r\n outline: none;\r\n font-size: 13px;\r\n color: #ffffff;\r\n\r\n &:disabled {\r\n background-color: #cccccc;\r\n }\r\n }\r\n }\r\n }\r\n\r\n .notice {\r\n display: flex;\r\n flex-direction: column;\r\n width: 260px;\r\n border-left: 1px solid #ececec;\r\n\r\n .rich {\r\n flex: 1;\r\n min-height: 0;\r\n padding: 18px 18px 0;\r\n overflow-x: hidden;\r\n overflow-y: auto;\r\n\r\n &::-webkit-scrollbar {\r\n display: none;\r\n }\r\n\r\n ::v-deepimg {\r\n width: 100%;\r\n }\r\n\r\n ::v-deepvideo {\r\n width: 100%;\r\n }\r\n }\r\n\r\n .copy {\r\n padding-top: 15px;\r\n padding-bottom: 15px;\r\n font-size: 12px;\r\n text-align: center;\r\n color: #cccccc !important;\r\n text-decoration: none;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n</style>\r\n"]}]}
|