import http from '@/common/request' import browser from '@/common/browser' import store from '../store' import pinyin from '@/common/pinyin.js'; export default { // 获取字典 getdict(dict) { return new Promise((resolve, reject) => { http.request({ url: '/system/dict/data/type/' + dict, success: (res) => { if (res.data.code == 200) { var data = res.data.data var arr = [] for (var i = 0; i < data.length; i++) { arr.push({ label: data[i].dictLabel, value: data[i].dictValue }) } // return arr resolve(arr); } else { reject(res); } }, fail: (res) => { reject(new Error(res.errMsg)); } }); }); }, //文本转json returnParse(txt) { return JSON.parse(txt); }, //字典翻译 findLabel(arr, text) { for (var i = 0; i < arr.length; i++) { if (arr[i].value == text) { return arr[i].label break; } } }, //判断按钮权限 permissions(permissions) { var data = store.state.permissions var have = data.indexOf(permissions) if (have !== -1) { return true } }, //判断单个角色权限 hasRole(Role) { var data = store.state.userRole var have = data.indexOf(Role) if (have !== -1) { return true } }, //判断多个角色权限 hasRoles(Roles) { var data = store.state.userRole function fidrole(Roles) { for (var i = 0; i < Roles.length; i++) { var have = data.indexOf(Roles[i]) if (have !== -1) { return true } } return false } return fidrole(Roles) }, //预览单张图片 previewImagesolo(File) { uni.previewImage({ urls: [File], }); }, //预览一组图片(图片组,图片索引) previewImages(FilePaths, current) { uni.previewImage({ urls: FilePaths, current: current }); }, //根据后缀判断文件类型 getFileType(fileName) { // 后缀获取 let suffix = ''; // 获取类型结果 let result = ''; try { const flieArr = fileName.split('.'); suffix = flieArr[flieArr.length - 1]; } catch (err) { suffix = ''; } // fileName无后缀返回 false if (!suffix) { return false; } suffix = suffix.toLocaleLowerCase(); // 图片格式 const imglist = ['png', 'jpg', 'jpeg', 'bmp', 'gif']; // 进行图片匹配 result = imglist.find(item => item === suffix); if (result) { return 'image'; } // 匹配txt const txtlist = ['txt']; result = txtlist.find(item => item === suffix); if (result) { return 'txt'; } // 匹配 excel const excelist = ['xls', 'xlsx']; result = excelist.find(item => item === suffix); if (result) { return 'excel'; } // 匹配 word const wordlist = ['doc', 'docx']; result = wordlist.find(item => item === suffix); if (result) { return 'word'; } // 匹配 pdf const pdflist = ['pdf']; result = pdflist.find(item => item === suffix); if (result) { return 'pdf'; } // 匹配 ppt const pptlist = ['ppt', 'pptx']; result = pptlist.find(item => item === suffix); if (result) { return 'ppt'; } // 匹配 视频 const videolist = ['mp4', 'm2v', 'mkv', 'rmvb', 'wmv', 'avi', 'flv', 'mov', 'm4v']; result = videolist.find(item => item === suffix); if (result) { return 'video'; } // 匹配 音频 const radiolist = ['mp3', 'wav', 'wmv']; result = radiolist.find(item => item === suffix); if (result) { return 'radio'; } // 其他 文件类型 return 'other'; }, //新开页面打开文档,支持格式:doc, xls, ppt, pdf, docx, xlsx, pptx onOpenDoc(e) { uni.downloadFile({ url: e, success: function(res) { var filePath = res.tempFilePath; uni.openDocument({ filePath: filePath, success: function(res) { console.log('打开文档成功'); } }); } }); }, //模拟浏览器打开第三方链接 openWebView(url) { // #ifndef APP-PLUS uni.showToast({ title: '仅手机端可打开', icon: 'none' }) return // #endif var options = { // 自定义头部参数 } browser.init(options) browser.show(url) }, //获取时间format getNewDate(format, add0, datetime) { //获取当前时间 function addZero(val) { //补零 if (add0) { return val <= 9 ? '0' + val : val; } else { return val } } var date = new Date() if (datetime) { date = Date.parse(new Date(datetime)) } var year = date.getFullYear(), month = addZero(date.getMonth() + 1), strDate = addZero(date.getDate()), hours = addZero(date.getHours()), minutes = addZero(date.getMinutes()), seconds = addZero(date.getSeconds()); switch (format) { case 'y': return year; break; case 'm': return month; break; case 'd': return strDate; break; case 'h': return hours; break; case 'mm': return minutes; break; case 'ss': return seconds; break; case 'ymd': return year + '/' + month + '/' + strDate; break; case 'hmmss': return hours + ':' + minutes + ':' + seconds; break; default: return year + '/' + month + '/' + strDate + ' ' + hours + ':' + minutes + ':' + seconds; break; } }, //获取本地存储object/初始化 getKeyObjectStorage(keyname) { try { var chatData = uni.getStorageSync(keyname); if (chatData) { chatData = JSON.parse(chatData) return chatData } else { chatData = new Object() return chatData uni.setStorageSync(keyname, JSON.stringify(chatData)); } } catch (e) { return new Object() } }, loadMore({ url = 'xxx/list/', queryParams = { refreshing: false, pageNum: 1, status: 'more', //more loading前 loading loading中 noMore 没有更多了 pageSize: 10 }, status = '0' //0无更多数据 1持续加载 2重新加载 3无数据+清空数据 }) { return new Promise((resolve, reject) => { http.request({ url: url + '&pageNum=' + (queryParams.refreshing ? 1 : queryParams.pageNum) + '&pageSize=' + queryParams.pageSize, success: res => { if (res.data.code == 200) { let list = []; let data = res.data.rows; if (queryParams.refreshing && res.data.rows == '' || queryParams .refreshing && res.data.rows.length == 0) { queryParams.status = 'noMore' resolve({ queryParams: queryParams, list: list, status: '3' }) return } if (res.data.rows == '' || res.data.rows.length == 0) { queryParams.status = 'noMore' resolve({ queryParams: queryParams, list: list, status: '0' }) return } for (let i = 0, length = data.length; i < length; i++) { var item = data[i]; list.push(item); } if (queryParams.refreshing) { queryParams.refreshing = false; queryParams.pageNum = 2; queryParams.status = 'more' resolve({ queryParams: queryParams, list: list, status: '2' }) } else { queryParams.pageNum += 1; queryParams.status = 'more' resolve({ queryParams: queryParams, list: list, status: '1' }) } } else { reject(res); } }, fail: (res) => { reject(res); } }); }); }, //接收推送消息 getPush(resbody) { console.log(resbody) var pushType = resbody.pushType //推送类型 if (pushType == 'MSG') { /* if(resbody.msgContent.msgType=='TRTC_VOICE_START'||resbody.msgContent.msgType=='TRTC_VIDEO_START'){ //音视频开始拦截 return } */ var userId = resbody.userId var windowType = 'SINGLE' /* if(resbody.groupInfo.userId){ userId=resbody.groupInfo.userId windowType='GROUP' } */ const _userId = uni.getStorageSync("userId") this.pushInMsg({ type: resbody.msgContent.msgType == 'ALERT' ? 3 : 1, //显示类型 1左侧 2右侧 3中间 msgContent: resbody.msgContent.content, //msg内容 msgType: resbody.msgContent.msgType, //msgType信息类型 windowType: windowType, //聊天室类型 SINGLE GROUP time: resbody.createTime, //时间 fromInfo: resbody.fromInfo, //来源信息 groupInfo: resbody.groupInfo, //群信息 userId: userId, //talktoId personId: resbody.fromInfo.userId, msgId: resbody.msgId, //消息Id disturb: resbody.msgContent.disturb, //是否静默消息 top: resbody.msgContent.top //是否置顶 }) return } if (pushType == 'NOTICE') { //红点通知等 if (resbody.msgContent.topicReply.count) { store.commit('update_topicReply', resbody.msgContent.topicReply) } if (resbody.msgContent.topicRed.portrait) { store.commit('update_topicRed', resbody.msgContent.topicRed) } if (resbody.msgContent.friendApply.count) { store.commit('update_friendApply', resbody.msgContent.friendApply) } } if (pushType == 'BIG') { //大消息 var bigId = resbody.msgContent.content http.request({ url: '/chat/getBigMsg/' + bigId, success: (res) => { if (res.data.code == 200) { var resbody = res.data.data var userId = resbody.fromInfo.userId var windowType = 'SINGLE' if (resbody.groupInfo.userId) { userId = resbody.groupInfo.userId windowType = 'GROUP' } this.pushInMsg({ type: resbody.msgContent.msgType == 'ALERT' ? 3 : 1, //显示类型 1左侧 2右侧 3中间 msgContent: resbody.msgContent.content, //msg内容 msgType: resbody.msgContent.msgType, //msgType信息类型 windowType: windowType, //聊天室类型 SINGLE GROUP time: resbody.createTime, //时间 fromInfo: resbody.fromInfo, //来源信息 groupInfo: resbody.groupInfo, //群信息 userId: userId, //talktoId personId: resbody.fromInfo.userId, msgId: resbody.msgId, //消息Id disturb: resbody.msgContent.disturb, //是否静默消息 top: resbody.msgContent.top //是否置顶 }) } } }); return } }, // 接收到的聊天推送 pushInMsg({ msgId, //消息Id msgContent, //内容 msgType, //消息类型 windowType, //聊天室类型 SINGLE GROUP userId, //聊天对象ID personId, //发送人ID time, //时间 type, //显示类型 1左侧 2右侧 3中间 fromInfo, //来源 groupInfo, //群信息 disturb, //是否静默消息 top //是否置顶 }) { var msgTypeLabel = ''; //消息类型 if (msgType == 'TEXT') { msgTypeLabel = msgContent; } if (msgType == 'ALERT') { msgTypeLabel = msgContent; } if (msgType == 'IMAGE') { msgTypeLabel = '[图片]'; } if (msgType == 'VOICE') { msgTypeLabel = '[语音]'; } if (msgType == 'VIDEO') { msgTypeLabel = '[视频]'; } if (msgType == 'LOCATION') { msgTypeLabel = '[位置]'; } if (msgType == 'COLLECTION') { msgTypeLabel = '[收藏]'; } if (msgType == 'CARD') { msgTypeLabel = '[名片]'; } if (msgType == 'FILE') { msgTypeLabel = '[文件]'; } if (msgType == 'TRTC_VOICE_END') { msgTypeLabel = '[语音通话]' } if (msgType == 'TRTC_VIDEO_END') { msgTypeLabel = '[视频通话]' } console.log(userId) store.dispatch('createChatObj', { userId: userId, windowType: windowType, }).then(res => { var localData = res.data store.dispatch('getchatDatalist'); store.dispatch('getChatList'); var chatWindowData = store.state.chatDatalist[userId].list var chatListInfo = store.state.chatlist[userId] // 找到数组中对象属性值一样的对象并返回 function arrfindobject({ arr, object, key }) { var result = arr.find(item => { return item[key] == object[key] }); return result } var same = arrfindobject({ arr: chatWindowData, object: { msgId: msgId }, key: 'msgId' }) if (same) { return } //离线消息体 var msgOffline = { userId: userId, personId: personId, nickName: fromInfo.nickName, portrait: fromInfo.portrait, msgType: msgType, content: msgContent, time: time, type: type, msgId: msgId, windowType: windowType } // 聊天记录体 var msgList = {} if (windowType == 'SINGLE') { msgList = { userId: userId, personId: personId, nickName: fromInfo.nickName, portrait: fromInfo.portrait, content: msgTypeLabel, time: time, num: disturb == 'Y' ? 'dot' : (chatListInfo.num ? chatListInfo.num + 1 : 1), windowType: windowType, disturb: disturb, //是否静默消息 top: top, //是否置顶 userType: fromInfo.userType } } if (windowType == 'GROUP') { msgList = { userId: userId, personId: personId, nickName: groupInfo.nickName, portrait: groupInfo.portrait, content: msgTypeLabel, time: time, num: disturb == 'Y' ? 'dot' : (chatListInfo.num ? chatListInfo.num + 1 : 1), windowType: windowType, disturb: disturb, //是否静默消息 top: top, //是否置顶 userType: 'GROUP' } } chatWindowData.push(msgOffline) store.dispatch('updateChatById', { userId: userId, data: chatWindowData }) store.dispatch('updateChatListInfoById', { userId: userId, data: msgList }) store.dispatch('tabBarpull') store.dispatch('updateChatDataState', userId); }); }, //发送消息 pushOutMsg({ msgContent, //内容 msgType, //消息类型 windowType, //聊天室类型SINGLE GROUP userId }) { var msgTypeLabel = ''; //消息类型 if (msgType == 'TEXT') { msgTypeLabel = msgContent; } if (msgType == 'ALERT') { msgTypeLabel = msgContent; } if (msgType == 'IMAGE') { msgTypeLabel = '[图片]'; } if (msgType == 'VOICE') { msgTypeLabel = '[语音]'; } if (msgType == 'VIDEO') { msgTypeLabel = '[视频]'; } if (msgType == 'LOCATION') { msgTypeLabel = '[位置]'; } if (msgType == 'COLLECTION') { msgTypeLabel = '[收藏]'; } if (msgType == 'CARD') { msgTypeLabel = '[名片]'; } if (msgType == 'FILE') { msgTypeLabel = '[文件]'; } if (msgType == 'TRTC_VOICE_END') { msgTypeLabel = '[语音通话]' } if (msgType == 'TRTC_VIDEO_END') { msgTypeLabel = '[视频通话]' } var userInfo = store.state.userInfo; store.dispatch('createChatObj', { userId: userId, windowType: windowType, }).then(res => { var localData = res.data store.dispatch('getchatDatalist'); store.dispatch('getChatList'); var chatWindowData = store.state.chatDatalist[userId].list var chatListInfo = store.state.chatlist[userId] var time = this.getNewDate('format', true) //在线消息体 var msgOnlie = {} //聊天记录 var msgList = {} var url = '' if (windowType == 'SINGLE') { msgOnlie = { userId: userId, msgType: msgType, content: msgContent } url = '/chat/sendMsg' msgList = { userId: userId, personId: userInfo.userId, nickName: localData.fromInfo.nickName, portrait: localData.fromInfo.portrait, content: msgTypeLabel, time: time, num: chatListInfo.disturb == 'Y' ? 'dot' : (chatListInfo.num ? chatListInfo.num : 0), windowType: windowType, disturb: chatListInfo.disturb ? chatListInfo.disturb : 'N', //是否静默消息 top: chatListInfo.top ? chatListInfo.top : 'N', //是否置顶 userType: localData.fromInfo.userType } } if (windowType == 'GROUP') { msgOnlie = { groupId: userId, msgType: msgType, content: msgContent } url = '/group/sendMsg' msgList = { userId: userId, personId: userInfo.userId, nickName: localData.groupInfo.nickName, portrait: localData.groupInfo.portrait, content: msgTypeLabel, time: time, num: chatListInfo.disturb == 'Y' ? 'dot' : (chatListInfo.num ? chatListInfo.num : 0), windowType: windowType, disturb: chatListInfo.disturb ? chatListInfo.disturb : 'N', //是否静默消息 top: chatListInfo.top ? chatListInfo.top : 'N', //是否置顶 userType: 'GROUP' } } //离线消息体 自己的消息 var msgOffline = { userId: userInfo.userId, personId: userInfo.userId, nickName: userInfo.nickName, portrait: userInfo.portrait, msgType: msgType, content: msgContent, time: time, type: 2, msgId: 'local', windowType: windowType }; //离线/发送失败错误消息体 var msgNotSend = { userId: userInfo.userId, portrait: userInfo.portrait, msgType: msgType, content: msgContent, type: 3 }; var msgSendType = 'wating'; //开始发送消息 store.dispatch('sendMsg', { userId: userId, data: msgOnlie }); // TODO // 发送完成之后设置消息状态 // msgSendType = 'error'; msgOffline.sendtype = msgSendType; msgOffline.msgId = "1231" msgNotSend.content = msgOnlie.content; msgList.content = msgOnlie.content; chatWindowData.push(msgOffline); if (msgSendType == 'error') { chatWindowData.push(msgNotSend); } store.dispatch('updateChatById', { userId: userId, data: chatWindowData }); store.dispatch('updateChatListInfoById', { userId: userId, data: msgList }); store.dispatch('tabBarpull'); store.dispatch('updateChatDataState', userId); return false; http.request({ url: url, method: 'POST', data: JSON.stringify(msgOnlie), success: res => { if (res.data.code == 200) { if (res.data.data.status !== '0') { msgSendType = 'error'; msgOffline.sendtype = msgSendType; msgOffline.msgId = res.data.data.msgId msgNotSend.content = res.data.data.statusLabel; msgList.content = res.data.data.statusLabel; } else { msgSendType = 'success'; } } else { msgSendType = 'error'; msgOffline.sendtype = msgSendType; msgNotSend.content = res.data.msg; } chatWindowData.push(msgOffline); if (msgSendType == 'error') { chatWindowData.push(msgNotSend); } store.dispatch('updateChatById', { userId: userId, data: chatWindowData }); store.dispatch('updateChatListInfoById', { userId: userId, data: msgList }); store.dispatch('tabBarpull'); store.dispatch('updateChatDataState', userId); }, fail: res => { msgSendType = 'error'; msgOffline.sendtype = msgSendType; msgNotSend.content = '发送失败,请检查网络'; chatWindowData.push(msgOffline); chatWindowData.push(msgNotSend); store.dispatch('updateChatById', { userId: userId, data: chatWindowData }); store.dispatch('updateChatListInfoById', { userId: userId, data: msgList }); store.dispatch('tabBarpull'); store.dispatch('updateChatDataState', userId); } }); }); }, //H5保存base64图片 h5SaveBase64Img({ base64 }) { var arr = base64.split(','); var bytes = atob(arr[1]); let ab = new ArrayBuffer(bytes.length); let ia = new Uint8Array(ab); for (let i = 0; i < bytes.length; i++) { ia[i] = bytes.charCodeAt(i); } var blob = new Blob([ab], { type: 'application/octet-stream' }); var url = URL.createObjectURL(blob); var a = document.createElement('a'); a.href = url; a.download = new Date().getTime() + ".png"; var e = document.createEvent('MouseEvents'); e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); a.dispatchEvent(e); URL.revokeObjectURL(url); }, //APP保存base64图片 plusSaveBase64Img({ base64 }) { const bitmap = new plus.nativeObj.Bitmap("test"); bitmap.loadBase64Data(base64, function() { const url = new Date().getTime() + ".png"; // url为时间戳命名方式 bitmap.save(url, { overwrite: true, // 是否覆盖 }, (i) => { uni.saveImageToPhotosAlbum({ filePath: url, success: function() { uni.showToast({ title: '图片保存成功', icon: 'none' }) bitmap.clear() } }); }, (e) => { uni.showToast({ title: '图片保存失败', icon: 'none' }) bitmap.clear() }); }, (e) => { uni.showToast({ title: '图片保存失败', icon: 'none' }) bitmap.clear() }); }, // 寻找数组中的对象中的key对应值的对象 arrFindkey({ arr, //数组[{id:'1'}] key, //key键值'id' val //值 '1' }) { var item = arr.find(function(obj, i, arr) { return obj[key] === val }) var index = arr.findIndex(function(obj, i, arr) { return obj[key] === val }) return { item: item, index: index } }, //APP下载文件 plusDownload({ onlinePath, savePath = 'file://storage/emulated/0/Documents/weiliao/' }) { return new Promise((resolve, reject) => { // #ifdef H5 reject('下载失败,H5不支持plus') return // #endif var fname = onlinePath.split("/").pop() var localPath = savePath + fname plus.io.resolveLocalFileSystemURL( //检测本地是否存在 localPath, (entry) => { console.log('文件已存在' + entry.name) resolve(entry.fullPath) }, (e) => { console.log('文件不存在:' + e.message); uni.showLoading({ title: '加载中' }) createDownload(onlinePath) } ); function createDownload(e) { let downloadOptions = { method: "GET", timeout: 120, retryInterval: 10, filename: savePath }; // https://www.html5plus.org/doc/zh_cn/downloader.html#plus.downloader.Download var dtask = plus.downloader.createDownload(e, downloadOptions, function(download, status) { uni.hideLoading() // 下载完成 if (status == 200) { resolve(download.filename) } else { reject({ status: status, msg: '下载失败' }) } }); dtask.start(); } }) }, //APP打开文件 plusOpenFile({ filePath }) { let system = uni.getSystemInfoSync().platform; if (system == 'ios') { filePath = encodeURI(filePath); } uni.openDocument({ filePath, success: res => { // console.log('打开文件成功'); }, fail: res => { console.log(res); } }); }, // 汉字拼音A-Z排序 sortList({ list, key }) { var sortKey = [] //字母 list.forEach(item => { let firstChar = '' item[key] = item[key] ? item[key].trim() : "" if (item[key]) { // 如传入空字符串,getCamelFistChar错误地返回Y firstChar = pinyin.getCamelFistChar(item[key]).toUpperCase() // 如字母开头,将返回字母且保留原大小写;一律改为大写 var reg = /^\d+$/; if (reg.test(firstChar)) { firstChar = 'Z#' } item.sort = firstChar sortKey.push(firstChar) } }) sortKey = [...new Set(sortKey)] list.sort((a, b) => a.sort.localeCompare(b.sort, 'zh')) //排序 sortKey.sort((a, b) => a.localeCompare(b, 'zh')) //排序 var sortlist = [] for (var i = 0; i < sortKey.length; i++) { var sort = sortKey[i] if (sort == 'Z#') { sort = '#' } sortlist.push({ letter: sort, data: [] }) for (var j = 0; j < list.length; j++) { var item = list[j] if (item.sort == 'Z#') { item.sort = '#' } if (item.sort == sort) { sortlist[i].data.push(item) } } } return sortlist }, saoyisao() { //扫一扫 // #ifdef APP-PLUS uni.scanCode({ success: (res) => { var result = res.result var data = res.result.split(':') var type = data[0] var value = data[1] switch (type) { case 'group': uni.navigateTo({ url: '../../wx/groupInfo/scanCodeDetail?param=' + result }) break; case 'user': uni.navigateTo({ url: '../../wx/personInfo/detail?param=' + value + '&source=1' }) break; default: break; } } }); // #endif // #ifndef APP-PLUS uni.showToast({ title: '扫一扫', icon: 'none' }) // #endif }, // 设置原生titleNView导航文字 setTitleNViewBtns(index, text) { let pages = getCurrentPages(); let page = pages[pages.length - 1]; // #ifdef APP-PLUS let currentWebview = page.$getAppWebview(); let titleObj = currentWebview.getStyle().titleNView; if (!titleObj.buttons) { return; } titleObj.buttons[index].text = text; currentWebview.setStyle({ titleNView: titleObj }); // #endif }, debounce(func, wait = 1000, immediate = true) { /** * @desc 函数防抖 * @param func 目标函数 * @param wait 延迟执行毫秒数 * @param immediate true - 立即执行, false - 延迟执行 */ let timer; return function() { let args = arguments; if (timer) { console.log('拦截') clearTimeout(timer); } if (immediate) { let callNow = !timer; timer = setTimeout(() => { timer = null; }, wait); if (callNow) { func.apply(this, args); } } else { timer = setTimeout(() => { func.apply(this, args); }, wait) } } }, throttle(func, wait = 1000, type = 1) { /** * @desc 函数节流 * @param func 函数 * @param wait 延迟执行毫秒数 * @param type 1 使用表时间戳,在时间段开始的时候触发 2 使用表定时器,在时间段结束的时候触发 */ let previous = 0; let timeout; return function() { let context = this; let args = arguments; if (type === 1) { let now = Date.now(); if (now - previous > wait) { func.apply(context, args); previous = now; } } else if (type === 2) { if (!timeout) { timeout = setTimeout(() => { timeout = null; func.apply(context, args) }, wait) } } } } }