提交 4950eb8f 编写于 作者: 张磊's avatar 张磊

Merge branch 'feat/zl' into 'release'

Feat/zl

See merge request !263
......@@ -649,7 +649,6 @@
that.memberList &&
that.memberList.length > 0
) {
that.memberList.map((i) => {
console.log('res==---', l, i.id, l.includes(i.id));
if (l.includes(i.id)) {
......@@ -666,14 +665,12 @@
}
}
});
}else {
if( that.memberList &&
that.memberList.length > 0) {
that.memberList.map( i => {
} else {
if (that.memberList && that.memberList.length > 0) {
that.memberList.map((i) => {
that.removeMember(i.liveUserId);
});
}
}
});
}, 2000);
......
......@@ -295,7 +295,7 @@
font-weight: 400;
color: #666666;
border-radius: 9px;
border: 1px solid #D9D9D9;
border: 1px solid #d9d9d9;
margin-right: 8px;
}
.info-phone {
......
/* eslint-disable */
class RtcClient {
constructor(options) {
this.sdkAppId_ = options.sdkAppId;
......@@ -25,7 +26,7 @@ class RtcClient {
mode: 'live',
sdkAppId: this.sdkAppId_,
userId: this.userId_,
userSig: this.userSig_
userSig: this.userSig_,
});
this.handleEvents();
} catch (error) {
......@@ -43,7 +44,7 @@ class RtcClient {
try {
await this.client_.join({
roomId: this.roomId_,
role: this.role
role: this.role,
});
console.log('加入房间trtc成功');
this.isJoined_ = true;
......@@ -52,7 +53,7 @@ class RtcClient {
audio: true,
video: false,
userId: this.userId_,
mirror: true
mirror: true,
});
this.startRTC();
} catch (e) {
......@@ -69,7 +70,7 @@ class RtcClient {
width: this.vueInstance.viedoParams.webVideoWidth,
height: this.vueInstance.viedoParams.webVideoHeight,
frameRate: this.vueInstance.viedoParams.webVideoFramerate,
bitrate: this.vueInstance.viedoParams.webVideoBitrate /* kpbs */
bitrate: this.vueInstance.viedoParams.webVideoBitrate /* kpbs */,
});
// 避免重复开摄像头
this.stopPush();
......@@ -86,27 +87,30 @@ class RtcClient {
return;
}
try {
this.localStream_.initialize().catch(error => {
this.localStream_
.initialize()
.catch((error) => {
this.vueInstance.$message({
message: '打开设备失败,请检查您的设备!',
type: 'error'
type: 'error',
});
console.error('failed initialize localStream ' + error);
}).then(() => {
})
.then(() => {
// 本地流在主播放器上播放,并且插入到一个关联的box中
var localVideoWrapEl = document.getElementById('ask');
this.localStream_.play(localVideoWrapEl, {
muted: true
muted: true,
});
// 主播直接推流
if (this.role == 'anchor') {
this.publish();
}
}).catch(() => {
})
.catch(() => {
this.vueInstance.$message({
message: '麦克风打开失败!',
type: 'error'
type: 'error',
});
});
} catch (e) {
......@@ -117,12 +121,16 @@ class RtcClient {
// 发布本地流
async publish() {
this.client_ && this.client_.publish(this.localStream_).then(() => {
this.client_ &&
this.client_
.publish(this.localStream_)
.then(() => {
console.log('本地流发布成功');
this.isPublished_ = true;
// 手动将麦克风打开
this.unmuteLocalAudio();
}).catch(error => {
})
.catch((error) => {
console.log('本地流发布失败');
this.isPublished_ = false;
this.vueInstance.reloadfn();
......@@ -189,12 +197,12 @@ class RtcClient {
roomID: this.roomId_, // 房间id
viewslist: this.viewslist, // 当前房间用户列表
TRTCType: 'mute', // trtc 实时通讯状态数据类型 1. error , 2.network-quality 3. AudioStats
TRTCData: {muteLocalAudio: '静音' }, // trtc 实时通讯状态数据
TRTCData: { muteLocalAudio: '静音' }, // trtc 实时通讯状态数据
};
_VM.$sendBuriedData({
action: 'TRTC',
component_tag: 'TRTC#0',
web_data: params
web_data: params,
});
this.localStream_.muteAudio();
}
......@@ -207,12 +215,12 @@ class RtcClient {
roomID: this.roomId_, // 房间id
viewslist: this.viewslist, // 当前房间用户列表
TRTCType: 'unmute', // trtc 实时通讯状态数据类型 1. error , 2.network-quality 3. AudioStats
TRTCData: {muteLocalAudio: '取消静音' }, // trtc 实时通讯状态数据
TRTCData: { muteLocalAudio: '取消静音' }, // trtc 实时通讯状态数据
};
_VM.$sendBuriedData({
action: 'TRTC',
component_tag: 'TRTC#0',
web_data: params
web_data: params,
});
this.localStream_.unmuteAudio();
}
......@@ -239,15 +247,17 @@ class RtcClient {
// client的一些事件监听
handleEvents() {
// 报错
this.client_.on('error', err => {
console.log('client 报错了--------------------------------------------------------------');
this.client_.on('error', (err) => {
console.log(
'client 报错了--------------------------------------------------------------'
);
console.log(err);
// alert(err);
window.onbeforeunload = null;
location.reload();
});
this.client_.on('network-quality', event => {
this.client_.on('network-quality', (event) => {
console.log('--network-quality', event);
const params = {
roomID: this.roomId_, // 房间id
......@@ -258,9 +268,9 @@ class RtcClient {
_VM.$sendBuriedData({
action: 'TRTC',
component_tag: 'TRTC#0',
web_data: params
web_data: params,
});
this.client_.getLocalAudioStats().then(stats => {
this.client_.getLocalAudioStats().then((stats) => {
const params = {
roomID: this.roomId_, // 房间id
viewslist: this.viewslist, // 当前房间用户列表
......@@ -270,10 +280,10 @@ class RtcClient {
_VM.$sendBuriedData({
action: 'TRTC',
component_tag: 'TRTC#0',
web_data: params
web_data: params,
});
});
this.client_.getRemoteAudioStats().then(stats => {
this.client_.getRemoteAudioStats().then((stats) => {
const params = {
roomID: this.roomId_, // 房间id
viewslist: this.viewslist, // 当前房间用户列表
......@@ -284,10 +294,9 @@ class RtcClient {
_VM.$sendBuriedData({
action: 'TRTC',
component_tag: 'TRTC#0',
web_data: params
web_data: params,
});
});
});
// 房间被解散了
......@@ -296,20 +305,20 @@ class RtcClient {
});
// 当一个远程同伴(必须推流)进入房间时触发
this.client_.on('peer-join', evt => {
this.client_.on('peer-join', (evt) => {
const userId = evt.userId;
console.log('有远程同伴进入房间:', userId);
});
// 当远处的同伴离开房间时触发(删减好友列表)
this.client_.on('peer-leave', evt => {
this.client_.on('peer-leave', (evt) => {
const userId = evt.userId;
console.log('有远程同伴离开房间:' + userId);
this.removeUserList(userId);
});
// 在添加远程流时触发
this.client_.on('stream-added', evt => {
this.client_.on('stream-added', (evt) => {
const remoteStream = evt.stream;
// 获取流的StreamId
const id = remoteStream.getId();
......@@ -317,19 +326,21 @@ class RtcClient {
const userId = remoteStream.getUserId();
this.members_.set(userId, remoteStream);
this.inmembers_.set(userId, remoteStream);
console.log(`remote stream added: [${userId}] ID: ${id} type: ${remoteStream.getType()}`);
console.log(
`remote stream added: [${userId}] ID: ${id} type: ${remoteStream.getType()}`
);
// 我们订阅远端的流
console.log('subscribe to this remote stream');
this.client_.subscribe(remoteStream);
});
// 在订阅远程流时触发
this.client_.on('stream-subscribed', evt => {
this.client_.on('stream-subscribed', (evt) => {
const remoteStream = evt.stream;
const id = remoteStream.getId();
const uid = remoteStream.userId_;
this.remoteStreams_.push(remoteStream);
remoteStream.on('player-state-changed', event => {
remoteStream.on('player-state-changed', (event) => {
console.log(`${event.type} player is ${event.state}`);
// 远端流是播放还是暂停状态(显示按钮等画面不同)
if (event.type == 'video' && event.state == 'STOPPED') {
......@@ -360,14 +371,13 @@ class RtcClient {
setTimeout(() => {
// 避免其他乱入视频
const index = this.viewslist.findIndex((item => {
const index = this.viewslist.findIndex((item) => {
if (item && item.userId) {
return item.userId == uid;
} else {
return -1;
}
}));
});
if (index < 0) {
return;
}
......@@ -381,11 +391,10 @@ class RtcClient {
this.changeView(id, 'vioce', false);
}
}, 1000);
});
// 当远程流被移除时触发
this.client_.on('stream-removed', evt => {
this.client_.on('stream-removed', (evt) => {
const remoteStream = evt.stream;
const id = remoteStream.getId();
const uid = remoteStream.userId_;
......@@ -393,14 +402,14 @@ class RtcClient {
// 停止播放并删除相应<video>标签
remoteStream.stop();
this.inmembers_.delete(uid);
this.remoteStreams_ = this.remoteStreams_.filter(stream => {
this.remoteStreams_ = this.remoteStreams_.filter((stream) => {
return stream.getId() !== id;
});
this.removeUserList(uid);
});
// 流更新
this.client_.on('stream-updated', evt => {
this.client_.on('stream-updated', (evt) => {
console.log('=========流更新========stream-updated===================');
console.log(evt);
const remoteStream = evt.stream;
......@@ -408,37 +417,52 @@ class RtcClient {
// remoteStream.hasVideo() // 是否有视频轨道
// remoteStream.hasAudio() //是否有音轨道
// remoteStream.getType() // 主要用于判断一个远端流是主音视频流还是辅路视频流,辅路视频流通常是一个屏幕分享流。
console.log('remoteStream ID: ' + remoteStream.getId() + ' was updated hasAudio: ' +
remoteStream.hasAudio() + ' hasVideo: ' + remoteStream.hasVideo());
console.log(
'remoteStream ID: ' +
remoteStream.getId() +
' was updated hasAudio: ' +
remoteStream.hasAudio() +
' hasVideo: ' +
remoteStream.hasVideo()
);
});
// 关闭音轨道
this.client_.on('mute-audio', evt => {
this.client_.on('mute-audio', (evt) => {
this.changeView(evt.userId, 'vioce', false);
console.log(evt.userId + '关闭麦克风============================================');
console.log(
evt.userId + '关闭麦克风============================================'
);
});
// 打开音轨道
this.client_.on('unmute-audio', evt => {
this.client_.on('unmute-audio', (evt) => {
this.changeView(evt.userId, 'vioce', true);
if (evt.type == 'audio' && evt.state == 'PLAYING' && this.vueInstance.type == 1) {
if (
evt.type == 'audio' &&
evt.state == 'PLAYING' &&
this.vueInstance.type == 1
) {
this.changeView(evt.userId, 'mask', true);
}
});
// 关闭视频轨道
this.client_.on('mute-video', evt => {
console.log(evt.userId + '关闭 video==============================================');
this.client_.on('mute-video', (evt) => {
console.log(
evt.userId + '关闭 video=============================================='
);
this.changeView(evt.userId, 'mask', true);
});
// 打开视频轨道
this.client_.on('unmute-video', evt => {
console.log(evt.userId + '打开 video=============================================');
this.client_.on('unmute-video', (evt) => {
console.log(
evt.userId + '打开 video============================================='
);
if (this.members_.get(evt.userId)) {
this.changeView(evt.userId, 'mask', false);
}
});
}
......@@ -452,7 +476,7 @@ class RtcClient {
// 移除视频数组
removeUserList(userId) {
for(let i = 0; i < this.viewslist.length; i++) {
for (let i = 0; i < this.viewslist.length; i++) {
if (this.viewslist[i] && this.viewslist[i].userId == userId) {
this.viewslist[i] = null;
}
......@@ -462,7 +486,10 @@ class RtcClient {
// 改变视频数组属性
changeView(id, attr, val) {
for (let i = 0; i < this.viewslist.length; i++) {
if (this.viewslist[i] && (this.viewslist[i].userId == id || this.viewslist[i].id == id)) {
if (
this.viewslist[i] &&
(this.viewslist[i].userId == id || this.viewslist[i].id == id)
) {
this.viewslist[i][attr] = val;
}
}
......@@ -471,7 +498,13 @@ class RtcClient {
add(id, uid, isMask) {
this.vueInstance.memberList.forEach((ele, index) => {
if (ele.liveUserId == uid) {
this.viewslist[index] = { id: id, userId: uid, nick: uid, mask: isMask, vioce: true };
this.viewslist[index] = {
id: id,
userId: uid,
nick: uid,
mask: isMask,
vioce: true,
};
}
});
}
......
// api路径
import {isNotEmptyUtils} from './utils';
/* eslint-disable */
import { isNotEmptyUtils } from './utils';
export default async(url = '', data = {}, type = 'POST', method = 'fetch') => {
export default async (url = '', data = {}, type = 'POST', method = 'fetch') => {
type = type.toUpperCase();
// url = (server==='WECHAT'?wechatUrl:baseUrl) + url;
......@@ -12,7 +12,7 @@ export default async(url = '', data = {}, type = 'POST', method = 'fetch') => {
console.log('完整url:', url);
if (type == 'GET' && data) {
let dataStr = ''; // 数据拼接字符串
Object.keys(data).forEach(key => {
Object.keys(data).forEach((key) => {
dataStr += key + '=' + data[key] + '&';
});
......@@ -30,17 +30,22 @@ export default async(url = '', data = {}, type = 'POST', method = 'fetch') => {
// mode: "cors",
headers: {
// 'Access-Control-Allow-Origin': '*',
'Accept': '*',
Accept: '*',
'Content-Type': 'application/json',
'sysCode':'2'
sysCode: '2',
// 'token': localStorage.getItem('token') || null, //固定传header:
// 'system_code': 'todo' //固定传header:系统编号
},
};
if (type == 'POST' || type === 'PUT' || type === 'PATCH' || type === 'DELETE' && data) {
if (
type == 'POST' ||
type === 'PUT' ||
type === 'PATCH' ||
(type === 'DELETE' && data)
) {
Object.defineProperty(requestConfig, 'body', {
value: JSON.stringify(data)
value: JSON.stringify(data),
});
}
try {
......
import axios from 'axios';
import store from '../store';
// import { getHostnameAndPort } from '../utils'
// axios.defaults.withCredentials = true
......@@ -7,48 +6,45 @@ import store from '../store';
const service = axios.create({
// baseURL: process.env.BASE_API
timeout: 600000,
withCredentials: false
withCredentials: false,
});
// request拦截器
service.interceptors.request.use(config => {
service.interceptors.request.use(
(config) => {
config.headers['sysCode'] = 26;
config.headers['token'] = localStorage.getItem('token');
config.headers['deviceInfo'] = JSON.stringify({ 'app_channel': '', 'app_mac': '', 'app_uuid': '', 'app_version': '', 'device_brand': '', 'device_ip': '', 'device_model': '', 'device_net': '', 'device_ops': '', 'resolution_wh': '', 'system_level': '', 'device_type': '10' });
config.headers['deviceInfo'] = JSON.stringify({
app_channel: '',
app_mac: '',
app_uuid: '',
app_version: '',
device_brand: '',
device_ip: '',
device_model: '',
device_net: '',
device_ops: '',
resolution_wh: '',
system_level: '',
device_type: '10',
});
Object.assign(config.headers, config.changeHeader);
if (config.fileHeader) {
config.headers['Content-Type'] = 'application/x-www-form-urlencoded';
}
// if (config.data && config.data.setEntry) {
// config.headers['sysCode'] = config.data.sysCode || 10
// if(config.data.token){
// config.headers['token'] = config.data.token || '63C3FA92AF8A45A48B31EB7FD97B95EB'
// }
// config.headers['deviceInfo'] = JSON.stringify({ "app_channel": "", "app_mac": "", "app_uuid": "", "app_version": "", "device_brand": "", "device_ip": "", "device_model": "", "device_net": "", "device_ops": "", "resolution_wh": "", "system_level": "", "device_type": '10' })
// }
return config;
}, error => {
},
(error) => {
Promise.reject(error);
});
}
);
// respone拦截器
service.interceptors.response.use(
response => {
const res = response.data;
/*
baseUrl时,返回000000为成功
apiUrl时,返回200为成功
*/
// if (res.code !== '000000') {
// return Promise.reject(response.data)
// } else {
(response) => {
return response.data;
// }
},
error => {
(error) => {
return Promise.reject(error);
}
);
......
/**
* Created by Anndy Yang on 18/09/18.
*/
/* eslint-disable */
import { envConfig } from '@/utils/env-config';
export function setEventByModuleCode(itemData) {
const modeCode = itemData.appModuleInfo.code || '';
let paramList = itemData.appModuleInfo.paramList ? itemData.appModuleInfo.paramList : '';
let paramList = itemData.appModuleInfo.paramList
? itemData.appModuleInfo.paramList
: '';
if (modeCode === 'M001' || modeCode === 'M002' || modeCode === 'M003') {
paramList = '';
} else if (modeCode === 'M100' || modeCode === 'M300') {
const urlPara = getUrlParmByCode(paramList);
paramList[0] && (paramList[0].value += urlPara);
} else if (modeCode === 'M400') {
}
if (typeof paramList === 'string' && !paramList) {
paramList = [];
......@@ -84,18 +81,14 @@ export function arraySort(originData, isUp = true, sortedField, converFun) {
sourceB = converFun(sourceB[sortedField]);
}
}
// if(!sourceA || !sourceB) {
// sourceA = 0
// sourceB = 0
// }
if (isUp) {
if ((sourceA - 0) > (sourceB - 0)) {
if (sourceA - 0 > sourceB - 0) {
swap = sortedData[j];
sortedData[j] = sortedData[j + 1];
sortedData[j + 1] = swap;
}
} else {
if ((sourceA - 0) < (sourceB - 0)) {
if (sourceA - 0 < sourceB - 0) {
swap = sortedData[j];
sortedData[j] = sortedData[j + 1];
sortedData[j + 1] = swap;
......
/* eslint-disable */
class RtcClient {
constructor(options) {
this.sdkAppId_ = options.sdkAppId;
......@@ -25,7 +26,7 @@ class RtcClient {
mode: 'live',
sdkAppId: this.sdkAppId_,
userId: this.userId_,
userSig: this.userSig_
userSig: this.userSig_,
});
this.handleEvents();
} catch (error) {
......@@ -43,7 +44,7 @@ class RtcClient {
try {
await this.client_.join({
roomId: this.roomId_,
role: this.role
role: this.role,
});
console.log('加入房间trtc成功');
this.isJoined_ = true;
......@@ -52,7 +53,7 @@ class RtcClient {
audio: true,
video: false,
userId: this.userId_,
mirror: true
mirror: true,
});
this.startRTC();
} catch (e) {
......@@ -69,7 +70,7 @@ class RtcClient {
width: this.vueInstance.viedoParams.webVideoWidth,
height: this.vueInstance.viedoParams.webVideoHeight,
frameRate: this.vueInstance.viedoParams.webVideoFramerate,
bitrate: this.vueInstance.viedoParams.webVideoBitrate /* kpbs */
bitrate: this.vueInstance.viedoParams.webVideoBitrate /* kpbs */,
});
// 避免重复开摄像头
this.stopPush();
......@@ -86,14 +87,16 @@ class RtcClient {
return;
}
try {
this.localStream_.initialize().catch(error => {
this.localStream_
.initialize()
.catch((error) => {
this.vueInstance.$message({
message: '打开设备失败,请检查您的设备!',
type: 'error'
type: 'error',
});
console.error('failed initialize localStream ' + error);
}).then(() => {
})
.then(() => {
// 本地流在主播放器上播放,并且插入到一个关联的box中
// var localVideoWrapEl = document.getElementById('ask');
// this.localStream_.play(localVideoWrapEl, {
......@@ -103,10 +106,11 @@ class RtcClient {
if (this.role == 'anchor') {
this.publish();
}
}).catch(error => {
})
.catch((error) => {
this.vueInstance.$message({
message: '麦克风打开失败!',
type: 'error'
type: 'error',
});
});
} catch (e) {
......@@ -117,13 +121,17 @@ class RtcClient {
// 发布本地流
async publish() {
this.client_ && this.client_.publish(this.localStream_).then(() => {
this.client_ &&
this.client_
.publish(this.localStream_)
.then(() => {
console.log('本地流发布成功');
this.isPublished_ = true;
// 手动将麦克风打开
this.unmuteLocalAudio();
this.vueInstance.isMicOn = true;
}).catch(error => {
})
.catch((error) => {
console.log('本地流发布失败');
this.isPublished_ = false;
this.vueInstance.reloadfn();
......@@ -217,8 +225,10 @@ class RtcClient {
// client的一些事件监听
handleEvents() {
// 报错
this.client_.on('error', err => {
console.log('client 报错了--------------------------------------------------------------');
this.client_.on('error', (err) => {
console.log(
'client 报错了--------------------------------------------------------------'
);
console.log(err);
const params = {
roomID: this.roomId_, // 房间id
......@@ -229,14 +239,14 @@ class RtcClient {
this.$sendBuriedData({
action: 'TRTC',
component_tag: 'TRTC#0',
web_data: params
web_data: params,
});
// alert(err);
window.onbeforeunload = null;
location.reload();
});
this.client_.on('network-quality', event => {
this.client_.on('network-quality', (event) => {
console.log('--network-quality', event);
const params = {
roomID: this.roomId_, // 房间id
......@@ -247,9 +257,9 @@ class RtcClient {
this.$sendBuriedData({
action: 'TRTC',
component_tag: 'TRTC#0',
web_data: params
web_data: params,
});
this.client_.getLocalAudioStats().then(stats => {
this.client_.getLocalAudioStats().then((stats) => {
const params = {
roomID: this.roomId_, // 房间id
viewslist: this.viewslist, // 当前房间用户列表
......@@ -259,10 +269,10 @@ class RtcClient {
this.$sendBuriedData({
action: 'TRTC',
component_tag: 'TRTC#0',
web_data: params
web_data: params,
});
});
this.client_.getRemoteAudioStats().then(stats => {
this.client_.getRemoteAudioStats().then((stats) => {
const params = {
roomID: this.roomId_, // 房间id
viewslist: this.viewslist, // 当前房间用户列表
......@@ -272,32 +282,31 @@ class RtcClient {
this.$sendBuriedData({
action: 'TRTC',
component_tag: 'TRTC#0',
web_data: params
web_data: params,
});
});
});
// 房间被解散了
this.client_.on('client-banned', err => {
this.client_.on('client-banned', (err) => {
console.log('房间被解散了');
});
// 当一个远程同伴(必须推流)进入房间时触发
this.client_.on('peer-join', evt => {
this.client_.on('peer-join', (evt) => {
const userId = evt.userId;
console.log('有远程同伴进入房间:', userId);
});
// 当远处的同伴离开房间时触发(删减好友列表)
this.client_.on('peer-leave', evt => {
this.client_.on('peer-leave', (evt) => {
const userId = evt.userId;
console.log('有远程同伴离开房间:' + userId);
this.remove(userId);
});
// 在添加远程流时触发
this.client_.on('stream-added', evt => {
this.client_.on('stream-added', (evt) => {
const remoteStream = evt.stream;
// 获取流的StreamId
const id = remoteStream.getId();
......@@ -305,19 +314,21 @@ class RtcClient {
const userId = remoteStream.getUserId();
this.members_.set(userId, remoteStream);
this.inmembers_.set(userId, remoteStream);
console.log(`remote stream added: [${userId}] ID: ${id} type: ${remoteStream.getType()}`);
console.log(
`remote stream added: [${userId}] ID: ${id} type: ${remoteStream.getType()}`
);
// 我们订阅远端的流
console.log('subscribe to this remote stream');
this.client_.subscribe(remoteStream);
});
// 在订阅远程流时触发
this.client_.on('stream-subscribed', evt => {
this.client_.on('stream-subscribed', (evt) => {
const remoteStream = evt.stream;
const id = remoteStream.getId();
const uid = remoteStream.userId_;
this.remoteStreams_.push(remoteStream);
remoteStream.on('player-state-changed', event => {
remoteStream.on('player-state-changed', (event) => {
console.log(`${event.type} player is ${event.state}`);
// 远端流是播放还是暂停状态(显示按钮等画面不同)
if (event.type == 'video' && event.state == 'STOPPED') {
......@@ -348,14 +359,13 @@ class RtcClient {
setTimeout(() => {
// 避免其他乱入视频
const index = this.viewslist.findIndex((item => {
const index = this.viewslist.findIndex((item) => {
if (item && item.userId) {
return item.userId == uid;
} else {
return -1;
}
}));
});
if (index < 0) {
return;
}
......@@ -369,11 +379,10 @@ class RtcClient {
this.changeView(id, 'vioce', false);
}
}, 1000);
});
// 当远程流被移除时触发
this.client_.on('stream-removed', evt => {
this.client_.on('stream-removed', (evt) => {
const remoteStream = evt.stream;
const id = remoteStream.getId();
const uid = remoteStream.userId_;
......@@ -381,14 +390,14 @@ class RtcClient {
// 停止播放并删除相应<video>标签
remoteStream.stop();
this.inmembers_.delete(uid);
this.remoteStreams_ = this.remoteStreams_.filter(stream => {
this.remoteStreams_ = this.remoteStreams_.filter((stream) => {
return stream.getId() !== id;
});
this.remove(uid);
});
// 流更新
this.client_.on('stream-updated', evt => {
this.client_.on('stream-updated', (evt) => {
console.log('=========流更新========stream-updated===================');
console.log(evt);
const remoteStream = evt.stream;
......@@ -396,37 +405,52 @@ class RtcClient {
// remoteStream.hasVideo() // 是否有视频轨道
// remoteStream.hasAudio() //是否有音轨道
// remoteStream.getType() // 主要用于判断一个远端流是主音视频流还是辅路视频流,辅路视频流通常是一个屏幕分享流。
console.log('remoteStream ID: ' + remoteStream.getId() + ' was updated hasAudio: ' +
remoteStream.hasAudio() + ' hasVideo: ' + remoteStream.hasVideo());
console.log(
'remoteStream ID: ' +
remoteStream.getId() +
' was updated hasAudio: ' +
remoteStream.hasAudio() +
' hasVideo: ' +
remoteStream.hasVideo()
);
});
// 关闭音轨道
this.client_.on('mute-audio', evt => {
this.client_.on('mute-audio', (evt) => {
this.changeView(evt.userId, 'vioce', false);
console.log(evt.userId + '关闭麦克风============================================');
console.log(
evt.userId + '关闭麦克风============================================'
);
});
// 打开音轨道
this.client_.on('unmute-audio', evt => {
this.client_.on('unmute-audio', (evt) => {
this.changeView(evt.userId, 'vioce', true);
if (evt.type == 'audio' && evt.state == 'PLAYING' && this.vueInstance.type == 1) {
if (
evt.type == 'audio' &&
evt.state == 'PLAYING' &&
this.vueInstance.type == 1
) {
this.changeView(evt.userId, 'mask', true);
}
});
// 关闭视频轨道
this.client_.on('mute-video', evt => {
console.log(evt.userId + '关闭 video==============================================');
this.client_.on('mute-video', (evt) => {
console.log(
evt.userId + '关闭 video=============================================='
);
this.changeView(evt.userId, 'mask', true);
});
// 打开视频轨道
this.client_.on('unmute-video', evt => {
console.log(evt.userId + '打开 video=============================================');
this.client_.on('unmute-video', (evt) => {
console.log(
evt.userId + '打开 video============================================='
);
if (this.members_.get(evt.userId)) {
this.changeView(evt.userId, 'mask', false);
}
});
}
......@@ -440,7 +464,7 @@ class RtcClient {
// 移除视频数组
remove(userId) {
for(let i = 0; i < this.viewslist.length; i++) {
for (let i = 0; i < this.viewslist.length; i++) {
if (this.viewslist[i] && this.viewslist[i].userId == userId) {
this.viewslist[i] = null;
}
......@@ -450,7 +474,10 @@ class RtcClient {
// 改变视频数组属性
changeView(id, attr, val) {
for (let i = 0; i < this.viewslist.length; i++) {
if (this.viewslist[i] && (this.viewslist[i].userId == id || this.viewslist[i].id == id)) {
if (
this.viewslist[i] &&
(this.viewslist[i].userId == id || this.viewslist[i].id == id)
) {
this.viewslist[i][attr] = val;
}
}
......@@ -459,7 +486,13 @@ class RtcClient {
add(id, uid, isMask) {
this.vueInstance.memberList.forEach((ele, index) => {
if (ele.liveUserId == uid) {
this.viewslist[index] = { id: id, userId: uid, nick: uid, mask: isMask, vioce: true };
this.viewslist[index] = {
id: id,
userId: uid,
nick: uid,
mask: isMask,
vioce: true,
};
}
});
}
......
/* eslint-disable */
/* 浏览器兼容提示 */
export const CHECK_BROWSER_TIPS = {
BROWSER_NOT_COMPATIBLE: '您的浏览器不支持直播功能!',
BROWSER_NOT_SUPPORT_SCREEN_SHARE: '您的浏览器不支持直播功能!'
BROWSER_NOT_SUPPORT_SCREEN_SHARE: '您的浏览器不支持直播功能!',
};
export const setLgTenText = time => {
export const setLgTenText = (time) => {
return time < 10 ? `0${time}` : time;
};
......@@ -21,11 +22,13 @@ export const countDown = (endtime) => {
const nowtime = new Date(); // 获取当前时间
const time = endtime - nowtime.getTime(); // 距离结束时间的毫秒数
if (time > 0) {
const lefth = Math.floor(time / (1000 * 60 * 60) % 24); // 计算小时数
const leftm = Math.floor(time / (1000 * 60) % 60); // 计算分钟数
const lefts = Math.floor(time / 1000 % 60); // 计算秒数
const lefth = Math.floor((time / (1000 * 60 * 60)) % 24); // 计算小时数
const leftm = Math.floor((time / (1000 * 60)) % 60); // 计算分钟数
const lefts = Math.floor((time / 1000) % 60); // 计算秒数
// 返回倒计时的字符串
return `${setLgTenText(lefth)}:${setLgTenText(leftm)}:${setLgTenText(lefts)}`;
return `${setLgTenText(lefth)}:${setLgTenText(leftm)}:${setLgTenText(
lefts
)}`;
} else {
return '时间已到';
}
......@@ -34,20 +37,20 @@ export const countDown = (endtime) => {
export const laseTime = (endtime) => {
const nowtime = new Date(); // 获取当前时间
const time = endtime - nowtime.getTime(); // 距离结束时间的毫秒数
const lefth = Math.floor(time / (1000 * 60 * 60) % 24); // 计算小时数
const leftm = Math.floor(time / (1000 * 60) % 60); // 计算分钟数
const lefts = Math.floor(time / 1000 % 60); // 计算秒数
const lefth = Math.floor((time / (1000 * 60 * 60)) % 24); // 计算小时数
const leftm = Math.floor((time / (1000 * 60)) % 60); // 计算分钟数
const lefts = Math.floor((time / 1000) % 60); // 计算秒数
return {
lefth,
leftm,
lefts
lefts,
};
};
export const lastm = (startTime, endTime) => {
const time = endTime - startTime; // 距离结束时间的毫秒数
const lefth = Math.floor(time / (1000 * 60 * 60) % 24); // 计算小时数
const leftm = Math.floor(time / (1000 * 60) % 60); // 计算分钟数
const lefth = Math.floor((time / (1000 * 60 * 60)) % 24); // 计算小时数
const leftm = Math.floor((time / (1000 * 60)) % 60); // 计算分钟数
return lefth * 60 + leftm;
};
......@@ -69,7 +72,7 @@ export const listSort = (one, two, three, four, arr) => {
const a = h.sort(listCompare(three));
const b = a.sort(listCompare(two));
newList = b.sort(listCompare(one, 1));
newList.forEach(item => {
newList.forEach((item) => {
if (item.isCalling) {
callArr.push(item);
}
......@@ -80,7 +83,7 @@ export const listSort = (one, two, three, four, arr) => {
return {
newList,
callArr,
inviteArr
inviteArr,
};
};
......@@ -93,13 +96,21 @@ export const getBroswer = () => {
const sys = {};
const ua = navigator.userAgent.toLowerCase();
let s;
(s = ua.match(/edge\/([\d.]+)/)) ? sys.edge = s[1] :
(s = ua.match(/rv:([\d.]+)\) like gecko/)) ? sys.ie = s[1] :
(s = ua.match(/msie ([\d.]+)/)) ? sys.ie = s[1] :
(s = ua.match(/firefox\/([\d.]+)/)) ? sys.firefox = s[1] :
(s = ua.match(/chrome\/([\d.]+)/)) ? sys.chrome = s[1] :
(s = ua.match(/opera.([\d.]+)/)) ? sys.opera = s[1] :
(s = ua.match(/version\/([\d.]+).*safari/)) ? sys.safari = s[1] : 0;
(s = ua.match(/edge\/([\d.]+)/))
? (sys.edge = s[1])
: (s = ua.match(/rv:([\d.]+)\) like gecko/))
? (sys.ie = s[1])
: (s = ua.match(/msie ([\d.]+)/))
? (sys.ie = s[1])
: (s = ua.match(/firefox\/([\d.]+)/))
? (sys.firefox = s[1])
: (s = ua.match(/chrome\/([\d.]+)/))
? (sys.chrome = s[1])
: (s = ua.match(/opera.([\d.]+)/))
? (sys.opera = s[1])
: (s = ua.match(/version\/([\d.]+).*safari/))
? (sys.safari = s[1])
: 0;
if (sys.edge) return { broswer: 'Edge', version: sys.edge };
if (sys.ie) return { broswer: 'IE', version: sys.ie };
......
import {isEmptyUtils, isNotEmptyUtils, subString} from './utils';
/* eslint-disable */
import { isEmptyUtils, isNotEmptyUtils, subString } from './utils';
import fetchQiniu from './fetch-qiniu.js';
import { getQiniuToken1, uploadVideo, uploadImg } from './index';
const qiniu = require('qiniu-js');
......@@ -14,7 +15,7 @@ const result = {
fullPath: null, // 文件网络路径(文件url)
size: null, // 资源尺寸,单位为字节
name: null, // 原始文件名
ext: null// 上传资源的后缀名,通过自动检测的mimeType 或者原文件的后缀来获取
ext: null, // 上传资源的后缀名,通过自动检测的mimeType 或者原文件的后缀来获取
};
// 上传状态
......@@ -48,7 +49,7 @@ const errorCode = new Map([
[630, '已创建的空间数量达到上限,无法创建新空间。'],
[631, '指定空间不存在'],
[640, '调用列举资源(list)接口时,指定非法的marker参数。'],
[701, '在断点续上传过程中,后续上传接收地址不正确或ctx信息已过期。']
[701, '在断点续上传过程中,后续上传接收地址不正确或ctx信息已过期。'],
]);
const qiniuErrorCheck = function (code) {
......@@ -67,14 +68,15 @@ export const createFilePath = (file, fileName) => {
return null;
}
const arr = fileName.split('_');
if(arr.length != 4) {
if (arr.length != 4) {
alert('上传视频文件名格式不正确');
return null;
}
const arr4 = arr[3].split('.');
// 文件全路径(文件路径 + 文件名) 扩展名​/年/月/日/
const filePath = arr[0] + '/' + arr[1] + '/' + arr[2] + '_' + arr4[0] + '.' + arr4[1];
const filePath =
arr[0] + '/' + arr[1] + '/' + arr[2] + '_' + arr4[0] + '.' + arr4[1];
console.log(filePath);
return filePath;
};
......@@ -88,7 +90,8 @@ const doQiniuAction1 = (fileType) => {
console.log('send---' + fileApiUrl);
return new Promise(function (resolve, reject) {
// if(isEmptyUtils(localStorage.getItem('qiniuToken'))){
fetchQiniu(fileApiUrl, {'fileType': fileType}, 'GET').then(function (result) {
fetchQiniu(fileApiUrl, { fileType: fileType }, 'GET')
.then(function (result) {
let token = null;
if (isNotEmptyUtils(result) && result.code == '000000') {
token = result.data.qiniuToken;
......@@ -99,7 +102,8 @@ const doQiniuAction1 = (fileType) => {
reject(result);
console.error('七牛临时授权失败:', result);
}
}).catch(function (error) {
})
.catch(function (error) {
reject();
console.error('七牛临时授权失败:', error);
});
......@@ -120,11 +124,9 @@ const doQiniuAction1 = (fileType) => {
* @returns {Promise}
*/
export const qiniuUpload = (self, file, filePath, previewId, progressId) => {
// var deferred = $q.defer();
return new Promise(function (resolve, reject) {
if (isEmptyUtils(file) || isEmptyUtils(filePath)) {
console.error('七牛上传失败:非法参数');
reject();
......@@ -140,12 +142,12 @@ export const qiniuUpload = (self, file, filePath, previewId, progressId) => {
const putExtra = {
fname: file.name, // 原文件名
params: {}, // 用来放置自定义变量
mimeType: mimeTypeArray || null // null || array,用来限制上传文件类型,为 null 时表示不对文件类型限制;限制类型放到数组里: ["image/png", "image/jpeg", "image/gif"]
mimeType: mimeTypeArray || null, // null || array,用来限制上传文件类型,为 null 时表示不对文件类型限制;限制类型放到数组里: ["image/png", "image/jpeg", "image/gif"]
};
const config = {
useCdnDomain: true, // 表示是否使用 cdn 加速域名,为布尔值,true 表示使用,默认为 false。
region: null // 选择上传域名区域;当为 null 或 undefined 时,自动分析上传域名区域
region: null, // 选择上传域名区域;当为 null 或 undefined 时,自动分析上传域名区域
};
/*
......@@ -175,10 +177,11 @@ export const qiniuUpload = (self, file, filePath, previewId, progressId) => {
* */
const complete = function (res) {
console.log('七牛上传完成');
setTimeout(function() {
setTimeout(function () {
result.key = res.key;
result.path = '/' + res.key;
result.fullPath = domain + '/' + res.key + '?v=' + new Date().getTime();
result.fullPath =
domain + '/' + res.key + '?v=' + new Date().getTime();
result.size = res.fsize;
result.name = res.fname;
result.ext = res.ext;
......@@ -197,9 +200,7 @@ export const qiniuUpload = (self, file, filePath, previewId, progressId) => {
obj.empty().append($img);
obj.css('max-width', '100%');
}
}, 2000);
};
/**
......@@ -214,11 +215,13 @@ export const qiniuUpload = (self, file, filePath, previewId, progressId) => {
// status = false;
self.qiniuUploadStatus = false;
localStorage.removeItem('qiniuToken');
console.log('七牛上传失败,详细信息请参考:https://developer.qiniu.com/kodo/api/3928/error-responses');
console.log(
'七牛上传失败,详细信息请参考:https://developer.qiniu.com/kodo/api/3928/error-responses'
);
// 输出简略错误信息
if (err.isRequestError) {
qiniuErrorCheck(err.code);
}else {
} else {
console.error(err);
}
......@@ -232,11 +235,9 @@ export const qiniuUpload = (self, file, filePath, previewId, progressId) => {
// 上传开始
subscription = observable.subscribe(next, error, complete);
});
// return deferred.promise;
});
};
......@@ -264,7 +265,20 @@ const guid = () => {
return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
}
return (S4() + S4() + '-' + S4() + '-' + S4() + '-' + S4() + '-' + S4() + S4() + S4());
return (
S4() +
S4() +
'-' +
S4() +
'-' +
S4() +
'-' +
S4() +
'-' +
S4() +
S4() +
S4()
);
};
/**
* 文件重命名--七牛图片 2018 11
......@@ -298,7 +312,6 @@ export const getFilePath = (file, fileName, folder) => {
var filePath = ext + '/' + 'admin/im/' + timeStamp(date) + '.' + suffix;
console.log('filePath==============', filePath);
return filePath;
};
/**
......@@ -311,7 +324,14 @@ export const getFilePath = (file, fileName, folder) => {
* @param fileType 1--图片和文件 空为视频
* @returns {Promise}
*/
export const doUpload = (self, file, filePath, previewId, progressId, fileType) => {
export const doUpload = (
self,
file,
filePath,
previewId,
progressId,
fileType
) => {
return new Promise(function (resolve, reject) {
if (isEmptyUtils(file) || isEmptyUtils(filePath)) {
console.error('七牛上传失败:非法参数');
......@@ -325,12 +345,12 @@ export const doUpload = (self, file, filePath, previewId, progressId, fileType)
const putExtra = {
fname: file.name, // 原文件名
params: {}, // 用来放置自定义变量
mimeType: mimeTypeArray || null // null || array,用来限制上传文件类型,为 null 时表示不对文件类型限制;限制类型放到数组里: ["image/png", "image/jpeg", "image/gif"]
mimeType: mimeTypeArray || null, // null || array,用来限制上传文件类型,为 null 时表示不对文件类型限制;限制类型放到数组里: ["image/png", "image/jpeg", "image/gif"]
};
const config = {
useCdnDomain: true, // 表示是否使用 cdn 加速域名,为布尔值,true 表示使用,默认为 false。
region: null // 选择上传域名区域;当为 null 或 undefined 时,自动分析上传域名区域
region: null, // 选择上传域名区域;当为 null 或 undefined 时,自动分析上传域名区域
};
/*
......@@ -352,10 +372,10 @@ export const doUpload = (self, file, filePath, previewId, progressId, fileType)
const progress = res.total.percent.toFixed(2);
self.uploadProgress = Number(progress);
if(progressId == 'uploadProgress1') {
if (progressId == 'uploadProgress1') {
self.uploadProgress1 = Number(progress);
}
if(progressId == 'uploadProgress2') {
if (progressId == 'uploadProgress2') {
self.uploadProgress2 = Number(progress);
}
console.log('Progress2: ' + progress);
......@@ -367,13 +387,15 @@ export const doUpload = (self, file, filePath, previewId, progressId, fileType)
* */
const complete = function (res) {
console.log('七牛上传完成');
setTimeout(function() {
setTimeout(function () {
result.key = res.key;
result.path = '/' + res.key;
if(!fileType) { // 图片 文件
if (!fileType) {
// 图片 文件
console.log('---domain-------', domain);
result.fullPath = domain + '/' + res.key;
}else{ // 视频
} else {
// 视频
console.log('----domain1------', domain1);
result.fullPath = domain1 + '/' + res.key;
}
......@@ -397,11 +419,13 @@ export const doUpload = (self, file, filePath, previewId, progressId, fileType)
// status = false;
self.qiniuUploadStatus = false;
localStorage.removeItem('qiniuToken');
console.log('七牛上传失败,详细信息请参考:https://developer.qiniu.com/kodo/api/3928/error-responses');
console.log(
'七牛上传失败,详细信息请参考:https://developer.qiniu.com/kodo/api/3928/error-responses'
);
// 输出简略错误信息
if (err.isRequestError) {
qiniuErrorCheck(err.code);
}else {
} else {
console.error(err);
}
return reject(new Error('七牛上传失败'));
......@@ -409,7 +433,6 @@ export const doUpload = (self, file, filePath, previewId, progressId, fileType)
// 上传开始
subscription = observable.subscribe(next, error, complete);
});
// 保存到全局对象
window.QNSubscription = subscription;
......
/* eslint-disable */
import axios from 'axios';
// 对象的合并
export const containObject = function(...obj1) {
export const containObject = function (...obj1) {
const obj = Object.assign(...obj1);
return obj;
};
// 获取页面自适应高度
export function resizeHeight(cMinusHeight = 152, iMinuxHeight = 210, refHeightId = 'slidebar-container',
containerHeightId = 'screenSet') {
export function resizeHeight(
cMinusHeight = 152,
iMinuxHeight = 210,
refHeightId = 'slidebar-container',
containerHeightId = 'screenSet'
) {
// let containerHeight = p_getElm(refHeightId).getBoundingClientRect().height - 15;
let containerHeight = document.body.clientHeight - 80;
p_getElm(containerHeightId).style.height = containerHeight - cMinusHeight + 'px';
window.onresize = function() {
if(p_getElm(refHeightId) && p_getElm(containerHeightId)) {
containerHeight = p_getElm(refHeightId).getBoundingClientRect().height - 15;
p_getElm(containerHeightId).style.height = containerHeight - cMinusHeight + 'px';
p_getElm(containerHeightId).style.height =
containerHeight - cMinusHeight + 'px';
window.onresize = function () {
if (p_getElm(refHeightId) && p_getElm(containerHeightId)) {
containerHeight =
p_getElm(refHeightId).getBoundingClientRect().height - 15;
p_getElm(containerHeightId).style.height =
containerHeight - cMinusHeight + 'px';
}
};
}
......@@ -46,7 +54,8 @@ Array.prototype.remove = function (obj) {
};
// 时间处理
Date.prototype.format = function (fmt) { // author: meizz
Date.prototype.format = function (fmt) {
// author: meizz
const o = {
'M+': this.getMonth() + 1, // 月份
'd+': this.getDate(), // 日
......@@ -54,15 +63,20 @@ Date.prototype.format = function (fmt) { // author: meizz
'm+': this.getMinutes(), // 分
's+': this.getSeconds(), // 秒
'q+': Math.floor((this.getMonth() + 3) / 3), // 季度
'S': this.getMilliseconds()
S: this.getMilliseconds(),
// 毫秒
};
if (/(y+)/.test(fmt))
fmt = fmt.replace(RegExp.$1, (this.getFullYear() + '')
.substr(4 - RegExp.$1.length));
fmt = fmt.replace(
RegExp.$1,
(this.getFullYear() + '').substr(4 - RegExp.$1.length)
);
for (const k in o)
if (new RegExp('(' + k + ')').test(fmt))
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)));
fmt = fmt.replace(
RegExp.$1,
RegExp.$1.length == 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length)
);
return fmt;
};
......@@ -71,7 +85,8 @@ Date.prototype.format = function (fmt) { // author: meizz
* @param {Object} str
*/
export const base64encode = (str) => {
const base64EncodeChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
const base64EncodeChars =
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
let out, i, len;
let c1, c2, c3;
len = str.length;
......@@ -88,16 +103,16 @@ export const base64encode = (str) => {
c2 = str.charCodeAt(i++);
if (i == len) {
out += base64EncodeChars.charAt(c1 >> 2);
out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
out += base64EncodeChars.charAt((c2 & 0xF) << 2);
out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xf0) >> 4));
out += base64EncodeChars.charAt((c2 & 0xf) << 2);
out += '=';
break;
}
c3 = str.charCodeAt(i++);
out += base64EncodeChars.charAt(c1 >> 2);
out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6));
out += base64EncodeChars.charAt(c3 & 0x3F);
out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xf0) >> 4));
out += base64EncodeChars.charAt(((c2 & 0xf) << 2) | ((c3 & 0xc0) >> 6));
out += base64EncodeChars.charAt(c3 & 0x3f);
}
return out;
};
......@@ -106,7 +121,136 @@ export const base64encode = (str) => {
* @param {Object} str
*/
export const base64decode = (str) => {
const base64DecodeChars = new Array(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1);
const base64DecodeChars = new Array(
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
62,
-1,
-1,
-1,
63,
52,
53,
54,
55,
56,
57,
58,
59,
60,
61,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
-1,
-1,
-1,
-1,
-1,
-1,
26,
27,
28,
29,
30,
31,
32,
33,
34,
35,
36,
37,
38,
39,
40,
41,
42,
43,
44,
45,
46,
47,
48,
49,
50,
51,
-1,
-1,
-1,
-1,
-1
);
let c1, c2, c3, c4;
let i, len, out;
len = str.length;
......@@ -116,39 +260,29 @@ export const base64decode = (str) => {
/* c1 */
do {
c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
}
while (i < len && c1 == -1);
if (c1 == -1)
break;
} while (i < len && c1 == -1);
if (c1 == -1) break;
/* c2 */
do {
c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
}
while (i < len && c2 == -1);
if (c2 == -1)
break;
} while (i < len && c2 == -1);
if (c2 == -1) break;
out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));
/* c3 */
do {
c3 = str.charCodeAt(i++) & 0xff;
if (c3 == 61)
return out;
if (c3 == 61) return out;
c3 = base64DecodeChars[c3];
}
while (i < len && c3 == -1);
if (c3 == -1)
break;
out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2));
} while (i < len && c3 == -1);
if (c3 == -1) break;
out += String.fromCharCode(((c2 & 0xf) << 4) | ((c3 & 0x3c) >> 2));
/* c4 */
do {
c4 = str.charCodeAt(i++) & 0xff;
if (c4 == 61)
return out;
if (c4 == 61) return out;
c4 = base64DecodeChars[c4];
}
while (i < len && c4 == -1);
if (c4 == -1)
break;
} while (i < len && c4 == -1);
if (c4 == -1) break;
out += String.fromCharCode(((c3 & 0x03) << 6) | c4);
}
return out;
......@@ -204,7 +338,7 @@ export const isEmptyUtils = (obj) => {
* 校验数组是否为空
* */
export const isEmptyList = (list) => {
return (isEmptyUtils(list) || !(list instanceof Array) || list.length === 0);
return isEmptyUtils(list) || !(list instanceof Array) || list.length === 0;
};
/**
......@@ -219,54 +353,53 @@ export const isNotEmptyList = (list) => {
* * @param {String} [obj] 校验对象
* */
export const isNumber = (obj) => {
return (obj != null && obj.toString().match('^[0-9]*$') != null);
return obj != null && obj.toString().match('^[0-9]*$') != null;
};
// 获取用户系统信息start
const detectOS = () => {
const sUserAgent = navigator.userAgent;
const isWin = (navigator.platform == 'Win32')
|| (navigator.platform == 'Windows');
const isMac = (navigator.platform == 'Mac68K')
|| (navigator.platform == 'MacPPC')
|| (navigator.platform == 'Macintosh')
|| (navigator.platform == 'MacIntel');
if (isMac)
return 'Mac';
const isUnix = (navigator.platform == 'X11') && !isWin && !isMac;
if (isUnix)
return 'Unix';
const isLinux = (String(navigator.platform).indexOf('Linux') > -1);
if (isLinux)
return 'Linux';
const isIos = (sUserAgent.indexOf('Mac OS X') > -1);
if (isIos)
return 'Mac';
const isWin =
navigator.platform == 'Win32' || navigator.platform == 'Windows';
const isMac =
navigator.platform == 'Mac68K' ||
navigator.platform == 'MacPPC' ||
navigator.platform == 'Macintosh' ||
navigator.platform == 'MacIntel';
if (isMac) return 'Mac';
const isUnix = navigator.platform == 'X11' && !isWin && !isMac;
if (isUnix) return 'Unix';
const isLinux = String(navigator.platform).indexOf('Linux') > -1;
if (isLinux) return 'Linux';
const isIos = sUserAgent.indexOf('Mac OS X') > -1;
if (isIos) return 'Mac';
if (isWin) {
const isWinXP = sUserAgent.indexOf('Windows NT 5.1') > -1
|| sUserAgent.indexOf('Windows XP') > -1;
if (isWinXP)
return 'WinXP';
const isWinVista = sUserAgent.indexOf('Windows NT 6.0') > -1
|| sUserAgent.indexOf('Windows Vista') > -1;
if (isWinVista)
return 'WinVista';
const isWin7 = sUserAgent.indexOf('Windows NT 6.1') > -1
|| sUserAgent.indexOf('Windows 7') > -1;
if (isWin7)
return 'Win7';
const isWin8_1 = sUserAgent.indexOf('Windows NT 6.2') > -1
|| sUserAgent.indexOf('Windows 8') > -1;
const isWin8_2 = sUserAgent.indexOf('Windows NT 6.3') > -1
|| sUserAgent.indexOf('Windows 8.1') > -1;
if (isWin8_1 || isWin8_2)
return 'Win8';
const isWin10_1 = sUserAgent.indexOf('Windows NT 6.4') > -1
|| sUserAgent.indexOf('Windows 10') > -1;
const isWin10_2 = sUserAgent.indexOf('Windows NT 10.0') > -1
|| sUserAgent.indexOf('Windows 10') > -1;
if (isWin10_1 || isWin10_2)
return 'Win10';
const isWinXP =
sUserAgent.indexOf('Windows NT 5.1') > -1 ||
sUserAgent.indexOf('Windows XP') > -1;
if (isWinXP) return 'WinXP';
const isWinVista =
sUserAgent.indexOf('Windows NT 6.0') > -1 ||
sUserAgent.indexOf('Windows Vista') > -1;
if (isWinVista) return 'WinVista';
const isWin7 =
sUserAgent.indexOf('Windows NT 6.1') > -1 ||
sUserAgent.indexOf('Windows 7') > -1;
if (isWin7) return 'Win7';
const isWin8_1 =
sUserAgent.indexOf('Windows NT 6.2') > -1 ||
sUserAgent.indexOf('Windows 8') > -1;
const isWin8_2 =
sUserAgent.indexOf('Windows NT 6.3') > -1 ||
sUserAgent.indexOf('Windows 8.1') > -1;
if (isWin8_1 || isWin8_2) return 'Win8';
const isWin10_1 =
sUserAgent.indexOf('Windows NT 6.4') > -1 ||
sUserAgent.indexOf('Windows 10') > -1;
const isWin10_2 =
sUserAgent.indexOf('Windows NT 10.0') > -1 ||
sUserAgent.indexOf('Windows 10') > -1;
if (isWin10_1 || isWin10_2) return 'Win10';
}
return 'other';
};
......@@ -312,47 +445,52 @@ const getTerminalType = () => {
// alert(navigator.userAgent);
if (navigator.userAgent.indexOf('iPad') > -1) {
// alert("iPad");
return brow = 'iPad';
return (brow = 'iPad');
}
if (navigator.userAgent.indexOf('Android') > -1
|| navigator.userAgent.indexOf('Linux') > -1) {
if (
navigator.userAgent.indexOf('Android') > -1 ||
navigator.userAgent.indexOf('Linux') > -1
) {
// alert("Android");
return brow = 'android手机';
return (brow = 'android手机');
}
if (navigator.userAgent.indexOf('iPhone') > -1
if (
navigator.userAgent.indexOf('iPhone') > -1
// || navigator.userAgent.indexOf('Mac') > -1
) {
// alert("iPhone");
return brow = 'iPhone手机';
return (brow = 'iPhone手机');
}
if (navigator.userAgent.indexOf('Trident') > -1) {
// alert("Trident");
return brow = '电脑';
return (brow = '电脑');
}
if (navigator.userAgent.indexOf('Presto') > -1) {
// alert("Presto");
return brow = '电脑';
return (brow = '电脑');
}
if (navigator.userAgent.indexOf('Chrome') > -1) {
// alert("Chrome");
return brow = '电脑';
return (brow = '电脑');
}
if (navigator.userAgent.indexOf('AppleWebKit') > -1) {
// alert("AppleWebKit");
return brow = 'iPad';
return (brow = 'iPad');
}
if (navigator.userAgent.indexOf('Gecko') > -1
&& navigator.userAgent.indexOf('KHTML') == -1) {
if (
navigator.userAgent.indexOf('Gecko') > -1 &&
navigator.userAgent.indexOf('KHTML') == -1
) {
// alert("Gecko");
return brow = '电脑';
return (brow = '电脑');
}
if (navigator.userAgent.indexOf('Mac OS X') > -1) {
// alert("ios");
return brow = 'ios';
return (brow = 'ios');
}
if (navigator.userAgent.indexOf('Safari') == -1) {
// alert("Safari");
return brow = '电脑';
return (brow = '电脑');
}
return brow;
};
......@@ -455,7 +593,7 @@ export const logout = () => {
const ssoLoginUrl = localStorage.getItem('ssoLogin');
const ssoOriginUrl = localStorage.getItem('ssoOrigin');
console.log('logoutUrl:' + logoutUrl);
/* alert("ssoLogin Url:"+ ssoLoginUrl)
/* alert("ssoLogin Url:"+ ssoLoginUrl)
alert("logOut url:" + logoutUrl)
alert("ssoOrigin url:" + ssoOriginUrl);*/
localStorage.clear();
......@@ -464,16 +602,16 @@ export const logout = () => {
localStorage.setItem('ssoLogin', ssoLoginUrl);
localStorage.setItem('ssoOrigin', ssoOriginUrl);
if (isEmptyUtils(logoutUrl)) {
if(isEmptyUtils(ssoLoginUrl)) {
window.location.href = localStorage.getItem('ssoOrigin')
+ '/PICA_SSO_FE/html/pica_login.html';
}else{
if (isEmptyUtils(ssoLoginUrl)) {
window.location.href =
localStorage.getItem('ssoOrigin') + '/PICA_SSO_FE/html/pica_login.html';
} else {
window.location.href = localStorage.getItem('ssoLogin');
}
} else {
// window.location.href = logoutUrl;
window.location.href = localStorage.getItem('ssoOrigin')
+ '/PICA_SSO_FE/html/pica_login.html';
window.location.href =
localStorage.getItem('ssoOrigin') + '/PICA_SSO_FE/html/pica_login.html';
}
};
......@@ -488,7 +626,16 @@ export const logout = () => {
* @param {Function} [cancelFunction] 按取消按钮认时,执行的函数
* @param {String} [messageType] 消息类型 success,info,warning,error
* */
export const messageBox = (self, title, content, confirmButton, confirmFunction, cancelButton, cancelFunction, messageType) => {
export const messageBox = (
self,
title,
content,
confirmButton,
confirmFunction,
cancelButton,
cancelFunction,
messageType
) => {
const titleText = title ? title : '提示';
const contentText = content ? content : '';
const confirmButtonText = confirmButton ? confirmButton : '确定';
......@@ -499,11 +646,13 @@ export const messageBox = (self, title, content, confirmButton, confirmFunction,
}
if (isNotEmptyUtils(cancelButton)) {
self.$confirm(contentText, titleText, {
self
.$confirm(contentText, titleText, {
confirmButtonText: confirmButtonText,
cancelButtonText: cancelButton,
type: type
}).then(() => {
type: type,
})
.then(() => {
// self.$message({
// type: 'success',
// message: '删除成功!'
......@@ -511,7 +660,8 @@ export const messageBox = (self, title, content, confirmButton, confirmFunction,
if (confirmFunction instanceof Function) {
confirmFunction();
}
}).catch(() => {
})
.catch(() => {
// self.$message({
// type: 'info',
// message: '已取消删除'
......@@ -524,7 +674,7 @@ export const messageBox = (self, title, content, confirmButton, confirmFunction,
self.$alert(contentText, titleText, {
confirmButtonText: confirmButtonText,
type: type,
callback: action => {
callback: (action) => {
// self.$message({
// type: 'info',
// message: `action: ${ action }`
......@@ -532,7 +682,7 @@ export const messageBox = (self, title, content, confirmButton, confirmFunction,
if (confirmFunction instanceof Function) {
confirmFunction();
}
}
},
});
}
};
......@@ -548,7 +698,16 @@ export const messageBox = (self, title, content, confirmButton, confirmFunction,
* @param {Function} [cancelFunction] 按取消按钮认时,执行的函数
* @param {String} [messageType] 消息类型 success,info,warning,error
* */
export const htmlMessageBox = (self, title, content, confirmButton, confirmFunction, cancelButton, cancelFunction, messageType) => {
export const htmlMessageBox = (
self,
title,
content,
confirmButton,
confirmFunction,
cancelButton,
cancelFunction,
messageType
) => {
const titleText = title ? title : '提示';
const contentText = content ? content : '';
const confirmButtonText = confirmButton ? confirmButton : '确定';
......@@ -560,16 +719,19 @@ export const htmlMessageBox = (self, title, content, confirmButton, confirmFunct
// debugger
if (isNotEmptyUtils(cancelButton)) {
self.$confirm(contentText, titleText, {
self
.$confirm(contentText, titleText, {
confirmButtonText: confirmButtonText,
cancelButtonText: cancelButton,
dangerouslyUseHTMLString: true, // 是否将 message 属性作为 HTML 片段处理
type: type
}).then(() => {
type: type,
})
.then(() => {
if (confirmFunction instanceof Function) {
confirmFunction();
}
}).catch(() => {
})
.catch(() => {
if (cancelFunction instanceof Function) {
cancelFunction();
}
......@@ -579,7 +741,7 @@ export const htmlMessageBox = (self, title, content, confirmButton, confirmFunct
confirmButtonText: confirmButtonText,
dangerouslyUseHTMLString: true, // 是否将 message 属性作为 HTML 片段处理
type: type,
callback: action => {
callback: (action) => {
// self.$message({
// type: 'info',
// message: `action: ${ action }`
......@@ -587,7 +749,7 @@ export const htmlMessageBox = (self, title, content, confirmButton, confirmFunct
if (confirmFunction instanceof Function) {
confirmFunction();
}
}
},
});
}
};
......@@ -605,16 +767,30 @@ export const errorResponseCheck = (error, self) => {
const code = error ? (error.response ? error.response.data : 0) : 0;
// console.log("请求失败:%s", code);
if (code == '40011') {
messageBox(self, '登录', '登录失效,请重新登录!', '是', function () {
messageBox(
self,
'登录',
'登录失效,请重新登录!',
'是',
function () {
logout();
}, '', null);
},
'',
null
);
setTimeout(function () {
logout();
}, 2000);
} else if (code == '40013') {
messageBox(self, '提示', '刷新太过频繁,休息一下!', '是', function () {
}, '', null);
messageBox(
self,
'提示',
'刷新太过频繁,休息一下!',
'是',
function () {},
'',
null
);
// setTimeout(function () {
//
// }, 2000);
......@@ -626,7 +802,6 @@ export const errorResponseCheck = (error, self) => {
self.$message.error('操作失败');
}
}, 100);
};
// 截位
......@@ -654,7 +829,7 @@ export const openLoading = (self) => {
text: 'Loading',
// target:'#bodyContent',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
background: 'rgba(0, 0, 0, 0.7)',
};
self.elLoadingId = self.$loading(options);
return self.elLoadingId;
......@@ -684,14 +859,13 @@ export const getConstantList = (self, codeObject) => {
}
const req = {
params: {
numMap: JSON.stringify(codeObject)
}
numMap: JSON.stringify(codeObject),
},
};
self.$axios.get(
localStorage.getItem('msUrl') + 'constants'
, req
).then(function (res) {
const map = JSON.parse(JSON.stringify(res.data.data));// 通过这个实现深拷贝
self.$axios
.get(localStorage.getItem('msUrl') + 'constants', req)
.then(function (res) {
const map = JSON.parse(JSON.stringify(res.data.data)); // 通过这个实现深拷贝
for (const key in map) {
self[key] = map[key];
}
......@@ -704,13 +878,17 @@ export const initDepartment = (self, obj, type) => {
}
var num = {
id: obj,
type: type
type: type,
};
axios.create().post(
localStorage.getItem('kfUrl') + 'PICAAddressHospitalServiceImpl/postDepartmentList',
axios
.create()
.post(
localStorage.getItem('kfUrl') +
'PICAAddressHospitalServiceImpl/postDepartmentList',
num
).then(function (res) {
const list = JSON.parse(JSON.stringify(res.data.departmentList));// 通过这个实现深拷贝
)
.then(function (res) {
const list = JSON.parse(JSON.stringify(res.data.departmentList)); // 通过这个实现深拷贝
if (obj == -1) {
self.departmentListP = list;
} else {
......@@ -724,13 +902,15 @@ export const initDepartment = (self, obj, type) => {
};
export const getPdepartmentId = (self) => {
if(isNotEmptyList(self.model.departmentId)
|| !self.departmentList instanceof Array) {
if (
isNotEmptyList(self.model.departmentId) ||
!self.departmentList instanceof Array
) {
return null;
}
if(self.departmentList.length > 0) {
if (self.departmentList.length > 0) {
return self.departmentList[0].parent_id;
}else{
} else {
return -1;
}
};
......@@ -752,25 +932,37 @@ export const getPositionList = (provinceId, cityId, countyId, townId) => {
provinceId,
cityId,
countyId,
townId
townId,
};
axios.create().post(
axios
.create()
.post(
localStorage.getItem('kfUrl') + 'combineHospital/getPositionList',
num
).then(function (res) {
)
.then(function (res) {
resolve(res);
}).then(function (res) {
})
.then(function (res) {
reject(res);
});
});
};
export const setOptionLabel = (self, selfModel, selfEId, selfEName, list, listEId, listEName) => {
export const setOptionLabel = (
self,
selfModel,
selfEId,
selfEName,
list,
listEId,
listEName
) => {
if (isEmptyList(list) || isEmptyUtils(listEId) || isEmptyUtils(listEName)) {
return;
}
for (let i = 0; i < list.length; i++) {
if(list[i][listEId] == self[selfModel][selfEId]) {
if (list[i][listEId] == self[selfModel][selfEId]) {
self[selfModel][selfEName] = list[i][listEName];
break;
}
......@@ -781,13 +973,17 @@ export const setOptionLabel = (self, selfModel, selfEId, selfEName, list, listEI
// 将文件大小B转为MB
export const betaHandle = (limit) => {
var size = '';
if(limit < 1024) { // 小于0.1KB,则转化成B
if (limit < 1024) {
// 小于0.1KB,则转化成B
size = limit + 'B';
}else if(limit < (1024 * 1024)) { // 小于0.1MB,则转化成KB
} else if (limit < 1024 * 1024) {
// 小于0.1MB,则转化成KB
size = (limit / 1024).toFixed(0) + 'KB';
}else if(limit < (1024 * 1024 * 1024)) { // 小于0.1GB,则转化成MB
} else if (limit < 1024 * 1024 * 1024) {
// 小于0.1GB,则转化成MB
size = (limit / (1024 * 1024)).toFixed(1) + 'MB';
}else{ // 其他转化成GB
} else {
// 其他转化成GB
size = (limit / (1024 * 1024 * 1024)).toFixed(1) + 'GB';
}
return size;
......@@ -797,7 +993,10 @@ export const betaHandle = (limit) => {
export const timeHandle = (str) => {
const date = new Date(str * 1);
const Y = date.getFullYear() + '-';
const M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
const M =
(date.getMonth() + 1 < 10
? '0' + (date.getMonth() + 1)
: date.getMonth() + 1) + '-';
const D = change(date.getDate()) + ' ';
const h = change(date.getHours()) + ':';
const m = change(date.getMinutes());
......@@ -805,7 +1004,7 @@ export const timeHandle = (str) => {
};
// 补0操作
const change = (num) => {
if(parseInt(num) < 10) {
if (parseInt(num) < 10) {
num = '0' + num;
}
return num;
......@@ -829,12 +1028,12 @@ export const bindDragHeader = (classname, content) => {
const t = e.clientY - disY;
let x, y, tran;
if(contranslate.length > 1) {
x = (l + Number(contranslate[0])) + 'px';
y = (t + Number(contranslate[1])) + 'px';
}else{
x = (l) + 'px';
y = (t ) + 'px';
if (contranslate.length > 1) {
x = l + Number(contranslate[0]) + 'px';
y = t + Number(contranslate[1]) + 'px';
} else {
x = l + 'px';
y = t + 'px';
}
tran = `translate(${x},${y})`;
......
......@@ -124,9 +124,9 @@
.show-work-set {
margin-top: 100px;
}
.maxNum-first-show{
.maxNum-first-show {
margin-top: 20px;
.show-sep-num{
.show-sep-num {
color: red;
}
}
......
......@@ -197,7 +197,7 @@
workInStep,
getLevel,
} from '@/api/serviceSchedule';
import { departmentAll, savePCDayCount} from '@/api/diagnosis';
import { departmentAll, savePCDayCount } from '@/api/diagnosis';
import TableServiceSchedule from '@/components/list/table-serviceSchedule';
export default {
components: {
......@@ -259,9 +259,9 @@
newCreateList: [],
allTilst: [],
allList: {},
centerDialogVisible:false,
doctorInfo:{},
maxNumValue:''
centerDialogVisible: false,
doctorInfo: {},
maxNumValue: '',
};
},
watch: {},
......@@ -455,16 +455,16 @@
},
submitSetData() {
const params = {
doctorId:this.doctorInfo.doctorId,
preNum:this.maxNumValue
doctorId: this.doctorInfo.doctorId,
preNum: this.maxNumValue,
};
savePCDayCount(params).then(res => {
savePCDayCount(params).then((res) => {
if (res.code == '000000') {
this.centerDialogVisible = false;
this.search();
}
});
}
},
},
};
</script>
......@@ -611,7 +611,7 @@
}
}
}
}
}
}
</style>
<style lang="scss">
......
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册