publicMethods.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428
  1. export default {
  2. //获取图片
  3. imgPreview(file, callback) {
  4. let self = this;
  5. let name = file.name.split('.')[0]
  6. //判断支不支持FileReader
  7. if (!file || !window.FileReader) return;
  8. if (/^image/.test(file.type)) {
  9. //创建一个reader
  10. let reader = new FileReader();
  11. //将图片转成base64格式
  12. reader.readAsDataURL(file);
  13. //读取成功后的回调
  14. reader.onloadend = function() {
  15. let result = this.result;
  16. let img = new Image();
  17. let formData = new FormData();
  18. img.src = result;
  19. img.onload = function() {
  20. let data = self.compress(img,name);
  21. let blob = self.dataURItoBlob(data);
  22. formData.append("file", blob,name+'.jpeg');
  23. //图片预览,配置文件,formData数据;
  24. callback && callback(data,formData);
  25. };
  26. };
  27. }
  28. },
  29. // 压缩图片
  30. compress(img) {
  31. let canvas = document.createElement("canvas");
  32. let ctx = canvas.getContext("2d");
  33. // let initSize = img.src.length;
  34. let width = img.width;
  35. let height = img.height;
  36. canvas.width = width;
  37. canvas.height = height;
  38. // 铺底色
  39. ctx.fillStyle = "#fff";
  40. ctx.fillRect(0, 0, canvas.width, canvas.height);
  41. ctx.drawImage(img, 0, 0, width, height);
  42. //进行压缩
  43. let ndata = canvas.toDataURL("image/jpeg", 0.4);
  44. // console.log("*******压缩后的图片大小*******");
  45. // console.log(ndata)
  46. return ndata;
  47. },
  48. // base64转成bolb对象
  49. dataURItoBlob(base64Data) {
  50. var byteString;
  51. if (base64Data.split(",")[0].indexOf("base64") >= 0)
  52. byteString = atob(base64Data.split(",")[1]);
  53. else byteString = unescape(base64Data.split(",")[1]);
  54. var mimeString = base64Data
  55. .split(",")[0]
  56. .split(":")[1]
  57. .split(";")[0];
  58. var ia = new Uint8Array(byteString.length);
  59. for (var i = 0; i < byteString.length; i++) {
  60. ia[i] = byteString.charCodeAt(i);
  61. }
  62. return new Blob([ia], { type: mimeString});
  63. },
  64. //
  65. setApiToken(name, controller, time, modules) {
  66. let str = name + 'customer-service' + controller + time + modules
  67. return str.toLocaleLowerCase()
  68. },
  69. /**
  70. * 时间戳转日期自定义时间格式
  71. * timeStamp:时间戳
  72. * custom:转换日期时定义年月日用是什么符号隔开
  73. * isDtae:0=月份、1=日期、3=时间
  74. */
  75. customFormatDateTime(timeStamp,custom,isDtae) {
  76. var date = new Date();
  77. date.setTime(timeStamp * 1000);
  78. var y = date.getFullYear();
  79. var m = date.getMonth() + 1;
  80. m = m < 10 ? ('0' + m) : m;
  81. var d = date.getDate();
  82. d = d < 10 ? ('0' + d) : d;
  83. var h = date.getHours();
  84. h = h < 10 ? ('0' + h) : h;
  85. var minute = date.getMinutes();
  86. var second = date.getSeconds();
  87. minute = minute < 10 ? ('0' + minute) : minute;
  88. second = second < 10 ? ('0' + second) : second;
  89. if (isDtae == 0){
  90. return y + custom + m //+'student';
  91. }else if (isDtae ==1){
  92. return y + custom + m + custom + d;
  93. }else{
  94. return y + '-' + m + '-' + d + ' ' + h + ':' + minute //+ ':' + second;
  95. }
  96. },
  97. /*****************屏蔽关键字******************/
  98. /**
  99. *
  100. * @param {*} data
  101. * @param {*} sensitive
  102. * @param {*}
  103. */
  104. shieldingKeyword(data,sensitive) {
  105. //将敏感词组用|转换字符串
  106. let snstive = sensitive.join('|');
  107. let num = 0,text='';
  108. //匹配出会话中的敏感词
  109. data.replace(eval('/' + snstive + '/g'), (res) => {
  110. // var str = '';
  111. console.log(res)
  112. text +=','+res;
  113. // for (var i = 0; i < res.length; i++) {
  114. // str += '*';
  115. // }
  116. num ++;
  117. // return str;
  118. })
  119. return {
  120. text,
  121. num
  122. }
  123. },
  124. /*****************用户屏蔽关键字******************/
  125. /**
  126. *
  127. * @param {*} data
  128. * @param {*} sensitive
  129. * @param {*}
  130. */
  131. userShieldingKeyword(data,sensitive) {
  132. //将敏感词组用|转换字符串
  133. let snstive = sensitive.join('|');
  134. let num = 0,text='';
  135. //匹配出会话中的敏感词
  136. return data.replace(eval('/' + snstive + '/g'), (res) => {
  137. var str = '';
  138. for (var i = 0; i < res.length; i++) {
  139. str += '*';
  140. }
  141. return str;
  142. })
  143. },
  144. /******************访客接入*********************/
  145. /**
  146. *
  147. * @param {object} redata 接收消息源
  148. * @param {Array} offlineList 访客离线列表
  149. * @param {Array} sessionList 访客会话列表
  150. * @param {int} sessionType 选择列表状态默认未1(1是会话中,2是离线)
  151. * @param {int} dataIndex 定位当前会话,默认是0
  152. * @param {Array} dataList 当前会话信息列表
  153. * @param {string} user_name 当前会话访客名
  154. * @param {function} callback 访客匹配离线列表处理后链接回调方法
  155. * @param {function} callback1 访客正常链接回调方法
  156. */
  157. visitorsConnect([redata,offlineList,sessionList,sessionType,dataIndex,dataList,user_name],callback,callback1){
  158. //将会话工单写入访客信息
  159. redata.user_info.conversationId = redata.conversationId;
  160. //默认离线列表没有访客信息
  161. let isTrue = true;
  162. //匹配是否是离线用户上线
  163. if(offlineList.length > 0){
  164. for(let i = 0; i < offlineList.length; i++){
  165. //匹配离线列表是否有这个用户
  166. if(offlineList[i].id == redata.user_info.id ){
  167. //查询离线列表是否有此用户会话工单未结束
  168. if(offlineList[i].conversationId == redata.conversationId){
  169. //工单号未结束的数据获取历史聊天消息和对象名字
  170. if(sessionType == 2 && i == dataIndex){//客服选中离线重新链接访客
  171. dataList = [];
  172. dataList = offlineList[i].data;
  173. user_name = offlineList[i].name;
  174. sessionType = 1;
  175. dataIndex = sessionList.length == 0 ? 0 : sessionList.length-1;
  176. }else if(sessionType == 2 && i < dataIndex){//客服选中离线列表重新链接访客后面的访客
  177. if(i > 0){
  178. dataList = offlineList[i].data;
  179. user_name = offlineList[i].name;
  180. }
  181. }
  182. //将掉线前聊天消息写入到用户对象里面
  183. redata.user_info.data = offlineList[i].data;
  184. }else{
  185. //工单号已结束数据处理
  186. if(dataIndex == 0 && sessionList.length == 0){
  187. user_name = redata.user_info.name;
  188. dataList = [];
  189. }
  190. redata.user_info.data = [];
  191. }
  192. //将离线状态用户删除
  193. offlineList.splice(i,1);
  194. //回调
  195. callback && callback(offlineList);
  196. isTrue = false;
  197. break;
  198. }
  199. }
  200. }
  201. //新访客链接
  202. if(isTrue){
  203. if(sessionList.length == 0){
  204. //判断是否选离线用户列表
  205. if(offlineList.length > 0 && sessionType ==2){
  206. //不做处理
  207. }else{
  208. dataIndex = 0
  209. sessionType = 1
  210. user_name = redata.user_info.name;
  211. dataList = [];
  212. }
  213. }else{
  214. for(let i = 0; i < sessionList.length; i++){
  215. //匹配离线列表是否有这个用户
  216. if(sessionList[i].id == redata.user_info.id ){
  217. sessionList.splice(i,1);
  218. break;
  219. }
  220. }
  221. }
  222. redata.user_info.data = [];
  223. }
  224. //回调
  225. callback1 && callback1(redata,sessionList,offlineList,sessionType,dataIndex,dataList,user_name);
  226. },
  227. /*****************用户会话离线及相关数据*********************/
  228. /**
  229. * @param {object} redata 接收消息源
  230. * @param {Array} sessionList 访客会话列表
  231. * @param {Array} offlineList 访客离线列表
  232. * @param {int} sessionType 选择列表状态默认未1(1是会话中,2是离线)
  233. * @param {int} dataIndex 定位当前会话,默认是0
  234. * @param {string} user_name 当前会话访客名
  235. * @param {Array} dataList 当前会话信息列表
  236. * @param {*} callback 回调函数
  237. */
  238. userOffline([redata,sessionList,offlineList,sessionType,dataIndex,user_name,dataList],callback){
  239. let userInfo = [];
  240. for(let i = 0 ; i < sessionList.length; i++){
  241. //匹配会话中离线用户
  242. if(sessionList[i].id == redata.id ){
  243. //把数据添加到离线列表
  244. offlineList.push(sessionList[i]);
  245. //用户选中状态会话中处理
  246. if(sessionType == 1){
  247. //判断会话中列表长度
  248. if(sessionList.length > 1){
  249. //判断是否离线用户是当前选中状态
  250. if( dataIndex == i){
  251. dataIndex = 0;
  252. user_name = sessionList[0].name;
  253. dataList = sessionList[0].data;
  254. userInfo = sessionList;
  255. }
  256. //删除会话列表离线用户
  257. sessionList.splice(i,1);
  258. }else{
  259. sessionType = 2;
  260. dataIndex = 0;
  261. user_name =offlineList[0].name;
  262. dataList = offlineList[0].data;
  263. userInfo = offlineList ;
  264. sessionList.splice(i,1);
  265. }
  266. }
  267. callback && callback(sessionList,offlineList,sessionType,dataIndex,user_name,dataList,userInfo);
  268. break;
  269. }
  270. }
  271. },
  272. /**************删除会话中离线用户及相关数据**************/
  273. /**
  274. * @param {object} redata 接收消息源
  275. * @param {Array} sessionList 访客会话列表
  276. * @param {Array} offlineList 访客离线列表
  277. * @param {int} sessionType 选择列表状态默认未1(1是会话中,2是离线)
  278. * @param {int} dataIndex 定位当前会话,默认是0
  279. * @param {string} user_name 当前会话访客名
  280. * @param {Array} dataList 当前会话信息列表
  281. * @param {*} callback 回调函数
  282. */
  283. sessionEnd([redata,sessionList,offlineList,sessionType,dataIndex,user_name,dataList],callback){
  284. let isTrue = true;
  285. let userInfo = [];
  286. //会话中列表匹配
  287. if(sessionList.length > 0){
  288. for(let i = 0 ; i < sessionList.length; i++){
  289. //检测会话列表中是否有结束的会话对象
  290. if(sessionList[i].id == redata.id){
  291. //删除会话列表中结束的会话对象用户信息
  292. sessionList.splice(i,1);
  293. // this.$store.dispatch("SET_SESSION",sessionList);
  294. if(sessionType == 1){
  295. if(sessionList.length >1){
  296. //处理会话显现状态
  297. if(dataIndex == i){
  298. user_name = sessionList[0].name;
  299. dataList = sessionList[0].data;
  300. userInfo = sessionList;
  301. }
  302. }else{
  303. if(offlineList.length > 0 ){
  304. sessionType = 2;
  305. dataIndex = 0;
  306. userInfo = offlineList;
  307. }else{
  308. user_name = '';
  309. dataList = [];
  310. userInfo = '';
  311. }
  312. }
  313. }
  314. isTrue = false;
  315. break;
  316. }
  317. }
  318. }
  319. //离线列表查询
  320. if(isTrue){
  321. for(let i = 0 ; i < offlineList.length; i++){
  322. //判断离线列表是否结束会话
  323. if(offlineList[i].id == redata.id){
  324. //删除离线列表中结束会话的用户信息
  325. offlineList.splice(i,1);
  326. // this.$store.dispatch("SET_OFFLINE",offlineList);
  327. if(sessionType == 2){
  328. if(dataIndex == i){
  329. if(offlineList.length > 1){
  330. if(sessionList.length >0){
  331. dataList = sessionList[0].data;
  332. user_name = sessionList[0].name;
  333. userInfo = sessionList;
  334. }else{
  335. dataList = offlineList[0].data;
  336. user_name = offlineList[0].name;
  337. userInfo = offlineList;
  338. }
  339. }else{
  340. if(sessionList.length >0){
  341. dataList = sessionList[0].data;
  342. user_name = sessionList[0].name;
  343. userInfo = sessionList;
  344. }else{
  345. dataList = [];
  346. user_name = '';
  347. userInfo = '';
  348. }
  349. }
  350. }
  351. }
  352. break;
  353. }
  354. }
  355. }
  356. //回调
  357. callback && callback(sessionList,offlineList,sessionType,dataIndex,user_name,dataList,userInfo);
  358. },
  359. /*****************接收用户会话消息***************/
  360. /**
  361. *
  362. * @param {*} redata 数据源
  363. * @param {*} sessionList 会话列表
  364. * @param {*} frce 表情数据源
  365. * @param {*} callback 回调
  366. */
  367. receivesMessage(redata,sessionList,frce,callback){
  368. let dataIndex = 0;
  369. //匹配是那个用户回的消息
  370. for(let i = 0 ; i < sessionList.length ; i++){
  371. if(sessionList[i].id == redata.id ){
  372. dataIndex = i;
  373. break;
  374. }
  375. }
  376. //获取当前回复消息对象
  377. let chatList = sessionList[dataIndex]
  378. redata.type = 'user';
  379. redata.content = JSON.parse(redata.content);
  380. //这个地方转
  381. redata.content.text = this.turnFace(redata.content.text,frce);
  382. //将消息添加对应的会话列表中
  383. chatList.data.push(redata);
  384. callback && callback(redata,chatList,dataIndex);
  385. },
  386. /******************文字信息转表情******************/
  387. /**
  388. * @param {*} data
  389. * @param {*} frce
  390. */
  391. turnFace(data,frce){
  392. let str = data.match(/\#\[.*?\]\//g);
  393. let arr =Array.from(new Set(str));
  394. arr.forEach(e=>{
  395. let imgsrc = '';
  396. for(let i = 0 ; i < frce.length ; i++){
  397. let expText = e.slice(1,e.length-1);
  398. if(expText == frce[i]){
  399. imgsrc = '<img class="hover" src="'+require(`@/assets/img/${i}.gif`)+'"/>'
  400. break;
  401. }
  402. }
  403. data = data.replace(new RegExp(`\\#\\[${e.substring(2,e.length-2)}\\]\\/`,'g'),imgsrc);
  404. })
  405. return data;
  406. },
  407. }