1125 lines
27 KiB
JavaScript
1125 lines
27 KiB
JavaScript
import http from '@/common/request'
|
||
import browser from '@/common/browser'
|
||
import store from '../store'
|
||
import pinyin from '@/common/pinyin.js';
|
||
import dayjs from "dayjs"
|
||
import localForage from 'localforage';
|
||
|
||
|
||
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) {
|
||
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 = '[视频通话]'
|
||
}
|
||
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 data2 = this.getKeyObjectStorage(store.state.userInfo.userId + '_' +
|
||
'chatlistData')
|
||
// var _num=data2[userId].num||
|
||
|
||
// 找到数组中对象属性值一样的对象并返回
|
||
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: dayjs(time).format("YYYY/MM/DD HH:mm:ss"),
|
||
num: disturb == 'Y' ? 'dot' : (chatListInfo.num ? chatListInfo.num + 1 : 1),
|
||
windowType: windowType,
|
||
disturb: "N", //是否静默消息
|
||
top: "N", //是否置顶
|
||
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: "N", //是否静默消息
|
||
top: top, //是否置顶
|
||
userType: 'GROUP'
|
||
}
|
||
}
|
||
//TODO 需要请求接口获取真实的消息时间
|
||
/*
|
||
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;
|
||
const _userInfo = uni.getStorageSync("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.photo,
|
||
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
|
||
// 发送完成之后设置消息状态
|
||
|
||
//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);
|
||
}
|
||
// TODO 内网环境下特殊配置,消息返送出去之后不直接存储
|
||
/*
|
||
store.dispatch('updateChatById', {
|
||
userId: userId,
|
||
data: chatWindowData
|
||
});
|
||
*/
|
||
setTimeout(() => {
|
||
store.dispatch('updateChartHistoryFromServerLimit5', {
|
||
userId: userId,
|
||
data: {
|
||
|
||
}
|
||
});
|
||
}, 500)
|
||
|
||
|
||
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
|
||
},
|
||
formatMessage(msg) {
|
||
msg.pushType = "MSG"
|
||
var msgType = "TEXT"
|
||
var data = store.state.addressList
|
||
|
||
const fromUserData = data.find(item => item.userId == msg.fromId)
|
||
|
||
|
||
|
||
const _data = JSON.parse(msg.messageBody)
|
||
|
||
|
||
|
||
// try{
|
||
// console.log("=======================formatMessage")
|
||
// console.log(_data)
|
||
// _data.content=JSON.parse(_data.content)
|
||
// msgType=_data.content.type
|
||
// }catch(e){
|
||
// console.error(e)
|
||
// //TODO handle the exception
|
||
// }
|
||
msg.msgContent = {
|
||
msgType: _data.msgType,
|
||
content: _data.content,
|
||
disturb: false,
|
||
top: false,
|
||
}
|
||
|
||
msg.windowType = "SINGLE"
|
||
msg.createTime = msg.messageTime;
|
||
msg.userId = msg.fromId;
|
||
msg.fromInfo = {
|
||
userId: msg.fromId,
|
||
userType: 1,
|
||
nickName: fromUserData ? fromUserData.realname : msg.fromId,
|
||
portrait: "https://shudong2022.oss-cn-hangzhou.aliyuncs.com/common/user/logo.png"
|
||
};
|
||
msg.groupInfo = {};
|
||
msg.msgId = msg.messageKey;
|
||
|
||
return msg
|
||
|
||
},
|
||
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)
|
||
}
|
||
}
|
||
}
|
||
}
|
||
} |