const io = require('./socket.io-mp') var user = require('./services/user.js'); const api = require('/config/api.js'); const util = require('/utils/util.js'); const UNLOGIN = 'NO_LOGIN' const btoa = require('./utils/btoa') const manyCount = 30 import remote from './config.js' var app = getApp(); var isIos = false wx.getSystemInfo({ success: function (res) { isIos = res.platform == "ios" } }) let urlToJson = (url = window.location.href) => { // 箭头函数默认传值为当前页面url let obj = {}, index = url.indexOf('?'), // 看url有没有参数 params = url.substr(index + 1); // 截取url参数部分 id = 1 & type = 2 if (index != -1) { // 有参数时 let parr = params.split('&'); // 将参数分割成数组 ["id = 1 ", " type = 2"] for (let i of parr) { // 遍历数组 let arr = i.split('='); // 1) i id = 1 arr = [id, 1] 2)i type = 2 arr = [type, 2] obj[arr[0]] = arr[1]; // obj[arr[0]] = id, obj.id = 1 obj[arr[0]] = type, obj.type = 2 } } return obj; } export default { joinUrl() { let options = { API_BASE_URL: api.API_BASE_URL, "url": this.data.url, // "url": 'http://192.168.0.112:8080', "reload": this.data.reload, "token": wx.getStorageSync('token'), "code": this.mcode, "brandId": this.options.id, "open": this.data.showCommodity, "pauseVideo": this.pauseVideo, "bottom": this.data.bottom || 0, socket: { socketHost: remote.socketHost, path: '/fsl-node', options: { ...this.data.socketOptions, nickname: encodeURI(encodeURI(this.data.socketOptions.nickname)) } } } // let base = 'http://127.0.0.1:5500/index.html' // let base = remote.viewHost + '/shop-container/shop.html' let sponsor = !!this.data.canShow if (this.data.join && !this.options.join) { sponsor = false } // remote.viewHost let hostUrl if (options.url.indexOf('www.4dkankan.com') != -1) { hostUrl = 'https://www.4dkankan.com/shop-container-zfb/' } else { hostUrl = 'https://zfb.4dkankan.com/shop-container/' } // let base = remote.viewHost + '/shop-container/fashilong.html?env=' + remote.env + '&sponsor=' + sponsor + '&many=' + this.data.many let base = hostUrl + 'fashilong.html?time=' + Date.now() + '&env=' + remote.env + '&sponsor=' + sponsor + '&many=' + this.data.many // let base = remote.viewHost + '/shop.html' this.data.reload = false this.data.showCommodity = false // options.url = options.url+'&vlog'; if (!this.data.webviewUrl) { console.log(base) this.setData({ 'webviewUrl': base + '#' + JSON.stringify(options) }) } else { this.socketSendMessage('clientSyncAction', { sender: 'h5', type: 'hashChange', data: options }) } }, onShow() { this.setData({ isIos, showComtypesAllTab: false }) if (this.socketSendMessage) { this.pauseVideo = false this.joinUrl() this.socketSendMessage('changeOnlineStatus', { status: true }) } }, changeShowComtypesAllTab(ev) { this.setData({ showCommodity: false }) setTimeout(() => { this.setData({ showComtypesAllTab: ev.currentTarget.dataset.show, showCommodity: true }) }, 100) }, async authorizeRecord() { let isAuth = await new Promise((r, j) => { wx.authorize({ scope: 'scope.record', success: () => r(true), fail: () => r(false) }) }) if (isAuth) return true let res = await new Promise(r => { wx.showModal({ title: '提示', content: '您未授权录音,说话功能将无法使用', showCancel: true, confirmText: "授权", confirmColor: "#52a2d8", success: res => r(res), fail: () => r(false) }) }) if (!res || res.cancel) return; isAuth = await new Promise((r) => { wx.openSetting({ success: res => r(res.authSetting['scope.record']), fail: () => r(false) }) }) return isAuth }, async agetUserInfo() { const res = await util.request(api.UserInfo) if (res.errno === 401) { return { userId: UNLOGIN, avatar: '' } } else { const data = res.data data.region = data.city ? data.city.split(',') : [] data.birthday = data.birthday || '1990-01-01' return data } }, async getUserInfo() { let userInfo = wx.getStorageSync('userInfo'); let token = wx.getStorageSync('token'); if (userInfo && userInfo.userId && token) { let info = await this.agetUserInfo() return { ...userInfo, ...info, avatarUrl: info.avatar }; } else { return { userId: UNLOGIN, avatar: '' } } // let detail // let isAuth = await new Promise((r, j) => { // wx.authorize({ // scope: 'scope.userInfo', // success: () => r(true), // fail: () => r(false) // }) // }) // if (!isAuth) { // this.setData({userAuth: true}) // detail = await new Promise(r => { // this.bindGetUserInfo = (e) => { // if (e.detail.userInfo) { // this.setData({userAuth: false}) // console.log('gei', e.detail) // r(e.detail) // } // } // }) // } else { // detail = await new Promise(r => { // wx.getUserInfo({ // success: res => r(res), // fail: () => r(false) // }) // }) // } // try { // let res = await user.loginByWeixin(detail) // app.globalData.userInfo = res.data.userInfo; // app.globalData.token = res.data.token; // return res.data.userInfo // } catch(e) { // return false // } }, login() { getApp().setLoginProps(false) }, async getSocketOptions(sceneId, roomId) { let room = roomId || (Number(Date.now().toString().slice(4)) + parseInt((Math.random() * 1000))) // let room = '147852' let userInfo = await this.getUserInfo() // console.log('---', userInfo) // this.setData({ // userInfoa: userInfo.nickname.split('').join(' ') // }) // this.role !== 'leader' let roomType if ((!this.data.canShow && !this.data.join) || (this.data.join && !this.options.join)) { roomType = '1v1' if (this.options.roomId) { this.role = 'leader' } console.log('**************') console.log(this.options) } // wx.showToast({ // title: this.data.peopleCount.toString(), // }) return { role: this.role || 'leader', userId: userInfo.userId, roomType, avatar: userInfo.avatarUrl, nickname: userInfo.nickname, voiceStatus: getApp().globalData.voiceProps.noMute ? 0 : 2, enableTalk: this.role === 'leader' ? true : undefined, roomId: room, sceneNumber: sceneId, onlineStatus: true, userLimitNum: this.data.peopleCount } }, async socketStart({ sceneId, roomId, options }) { if (!options) { options = await this.getSocketOptions(sceneId, roomId) } console.log('小程序参数', options) let socket = io(remote.socketHost, { path: '/fsl-node', query: { ...options, isClient: true } }) console.error('新建socket Room', options.roomId) this.setData({ socketStatus: 0 }) socket.on('connect', () => this.setData({ socketStatus: 1 })) socket.on('connect_error', () => this.setData({ socketStatus: -1 })) socket.on('connect_timeout', () => this.setData({ socketStatus: -1 })) socket.on('disconnect', () => this.setData({ socketStatus: -1 })) socket.on('reconnect', () => { this.setData({ socketStatus: 0 }) let noMute = getApp().globalData.voiceProps.noMute this.socketSendMessage('changeVoiceStatus', { status: noMute ? 0 : 2 }) this.socketSendMessage('changeOnlineStatus', { status: true }) }) socket.on('reconnect_failed', () => this.setData({ socketStatus: -1 })) socket.on('error', () => this.setData({ socketStatus: -1 })) socket.on('roomIn', config => { let enableTalk = config.roomsConfig.enableTalk !== false let noMute = getApp().globalData.voiceProps.noMute getApp().globalData.voiceProps.force = enableTalk if (!enableTalk && !noMute) { this.mic() } }) this.socketSendMessage = (event, obj) => { console.error('发送 socket Room', options.roomId, event, obj) socket.emit(event, obj) } socket.on('clientSyncAction', (data) => { console.log('调用', data.type, '方法', data) if (this[data.type]) { this[data.type](data) } else if (data.type == 'wx-subscribe') { this.getUrlCode(data.data) } else { console.error('没有', data.type, '方法') } }) socket.on('action', (data) => { if (data.type === 'navigateToGoods') { this.navigateToGoodsAction(data.data) } }) socket.on('changeRoomEnableTalk', config => { if (this.role !== 'leader') { this.changeRoomEnableTalk(config) } }) socket.on('startCall', this.startCall.bind(this)) socket.on('stopCall', (data) => { console.log('on stopCall') this.stopCall(data) }) socket.on('someOneInRoom', this.startCall.bind(this)) socket.on('someOneLeaveRoom', (user, data) => { this.handleSomeOneLeave(user) }) socket.on('roomClose', (data) => { console.log('on roomClose') this.stopCall(data) }) this.socketStop = () => { socket.close() console.error('断开 并滞空 socket Room', options.roomId) this.setData({ socketStatus: 2 }) socket = null } return options }, getUrlCode(url) { this.socketSendMessage('clientSyncAction', { sender: 'wx', type: 'wx-subscribe-result', data: 3020 }) // wx.request({ // url: url, //仅为示例,并非真实的接口地址 // method: 'get', // success: (res) => { // let code = -1 // if (typeof res.data.code != 'undefined') { // code = res.data.code // } // this.socketSendMessage('clientSyncAction', { // sender: 'wx', // type: 'wx-subscribe-result', // data: code // }) // }, // fail: (err) => { // console.log(err) // } // }) }, changeRoomEnableTalk(data) { console.log(data) let noMute = getApp().globalData.voiceProps.noMute getApp().globalData.voiceProps.force = data.enableTalk // noMute true 静音 // enableTalk false 静音 if (!!data.enableTalk === !!noMute) { this.mic() } }, navigateToGoods({ data }) { // wx.showToast({ // title: JSON.stringify(data).substr(40) // }) this.navigateToGoodsAction(data) }, navigateToGoodsAction(id) { wx.navigateTo({ url: '/pages/goods/goods?id=' + id, }) }, getUrl(url, socketOptions, isJoin) { url += '&room_id=' + socketOptions.roomId + '&user_id=' + socketOptions.userId + '&origin=fashilong' if (isJoin) { url += '&role=' + this.role + '&shopping' } else { url += '&role=' + this.role } console.error(url) console.log(isJoin) return url }, navigateToMiniProgram(data) { wx.showModal({ title: '温馨提示', content: '即将跳到其他小程序,是否继续?', showCancel: true, //是否显示取消按钮 cancelText: "取消", //默认是“取消” confirmText: "确定", //默认是“确定” success: function (res) { if (res.cancel) { //点击取消,wx.navigateBack } else { wx.navigateToMiniProgram(data.data) } }, fail: function (res) { //接口调用失败的回调函数,wx.navigateBack }, complete: function (res) { //接口调用结束的回调函数(调用成功、失败都会执行) }, }) }, async startCall(data) { this.setData({ shareStatus: 1 }) if (!data) return; this.setData({ surplus: this.data.peopleCount - data.roomsPerson.length }) if (!this.isAuthorizeRecord) { const voiceStatus = Number(await this.authorizeRecord()) this.isAuthorizeRecord = true // getApp().setVoiceProps({ // noMute: !voiceStatus // }) // console.log(getApp().globalData.voiceProps.noMute) // this.socketSendMessage('changeVoiceStatus', { // status: getApp().globalData.voiceProps.noMute ? 0 : 2 // }) // this.data.socketOptions.voiceStatus = 1 // this.socketSendMessage('changeVoiceStatus', {status: noMute ? 0 : 2}) } const socketOptions = this.data.socketOptions getApp().globalData.roomId = socketOptions.roomId const user = data.roomsPerson.find(user => user.userId == socketOptions.userId) if (!user) { return } if (data.roomsPerson.length <= 1) { return } user.noMute = getApp().globalData.voiceProps.noMute getApp().setVoiceProps({ ...user, action: 'startCall' }) // this.socketSendMessage('changeVoiceStatus', { // status: getApp().globalData.voiceProps.noMute ? 0 : 2 // }) }, stopCall() { console.error('stopCall') this.setData({ shareStatus: 0 }) getApp().setVoiceProps({ noMute: false, action: 'stopCall' }) if (this.runManager) { // this.recorderManager.stop() this.runManager = false } }, handleSomeOneLeave(data) { if (data.roomsPerson.length <= 1) { // this.stopCall() } }, async newRoom(data) { if (data.roomId) return; this.stopCall() getApp().globalData.rtcParams = [] getApp().globalData.pusher = '' if (this.data.join && !this.options.join) { wx.switchTab({ url: '/pages/index/index', }) return; } this.role = this.data.canShow ? 'leader' : 'customer' let options = await this.getSocketOptions(this.mcode) this.socketSendMessage('clientSyncAction', { type: 'newRoom', data: options }) setTimeout(async () => { this.wssSuccess = false this.socketStop && this.socketStop() this.data.many = !!this.data.canShow this.setData({ // peopleCount: this.data.many ? manyCount : 5 peopleCount: this.data.many ? manyCount : 2 }) let base = this.base let socketOptions = await this.socketStart({ options }) let url = this.getUrl(base, socketOptions, false) + (this.urlPj || '') this.base = base this.setData({ url, socketOptions, }) this.joinUrl() this.setData({ socketOptions }) this.loadConponSuccess = true this.readySendCouponCtrl() }, 300) }, async exit() { this.stopCall() getApp().globalData.rtcParams = [] getApp().globalData.pusher = '' this.socketStop && this.socketStop() this.role = 'leader' let base = this.base let socketOptions = await this.socketStart({ sceneId: this.mcode }) let url = this.getUrl(base, socketOptions, false) + (this.urlPj || '') this.base = base wx.nextTick(() => { setTimeout(() => { this.setData({ url, loadUrl: true, socketOptions, showCommodityCtrl: false, hideWebView: false, reload: true }) this.joinUrl() }, 500) }) }, clearDebuger() { this.setData({ debugerInfo: '' }) }, async mic() { let noMute = getApp().globalData.voiceProps.noMute // noMute true 静音 // enableTalk false 静音 // if (!!getApp().globalData.voiceProps.force === !!noMute) // return // if (!getApp().globalData.voiceProps.force && (!this.data.socketOptions.voiceStatus || noMute)) return; if (!this.data.socketOptions.voiceStatus) { let voiceStatus = await this.authorizeRecord() if (voiceStatus) { this.data.socketOptions.voiceStatus = 1 noMute = false } else { noMute = true } } else { noMute = !noMute } getApp().globalData.voiceProps.noMute = noMute this.socketSendMessage('changeVoiceStatus', { status: noMute ? 0 : 2 }) getApp().setVoiceProps({ noMute }) wx.showToast({ title: `已${noMute ? '关闭' : '开启'}麦克风`, }) }, callPhone() { wx.makePhoneCall({ phoneNumber: this.data.contractPhone, }) this.setData({ showContact: false }) }, /** * 用户点击右上角分享 */ onShareAppMessage: function (res) { let { id, newPicUrl } = this.data if (res.from === 'button') { this.setData({ sendShare: false }) return { title: '【好友推荐】一起来云逛吧', imageUrl: newPicUrl, path: `/pages/webview/index?id=${id}&type=${this.data.type}&join=true&roomId=${this.data.socketOptions.roomId}&many=${!!this.data.many}`, } } else { return { imageUrl: newPicUrl, path: `/pages/webview/index?id=${id}&type=${this.data.type}&join=false`, } } }, /** * 生命周期函数--监听页面卸载 */ onUnload: function () { console.log('on onUnload') this.socketSendMessage('stopCall', {}) this.stopCall() this.socketStop() getApp().globalData.pusher = '' }, cart(data) { this.setData({ showCommodityCtrl: data.data }) }, share() { const companyName = `杭州天门科技有限公司` const vrLink = `/pages/webview/index` const img_url = this.data.newPicUrl || 'http://video.cgaii.com/new4dage/images/images/home_2_a.jpg' const shareImg = img_url this.count = this.count || 0 if (this.data.many && this.data.shareStatus == 1) { //开启一起逛时候的分享 console.log(`/pages/shareRoom/shareRoom?img_url=${btoa(img_url)}&vrLink=${btoa(vrLink)}&id=${this.data.id}&type=${this.data.type}&roomId=${this.data.socketOptions.roomId}&many=${!!this.data.many}`) console.log(this.data.socketOptions) wx.navigateTo({ url: `/pages/shareRoom/shareRoom?img_url=${btoa(img_url)}&vrLink=${btoa(vrLink)}&id=${this.data.id}&type=${this.data.type}&roomId=${this.data.socketOptions.roomId}&many=${!!this.data.many}`, }) } else { console.log(`/pages/shared/shared?img_url=${btoa(img_url)}&shareImg=${btoa(shareImg)}&companyName=${companyName}&vrLink=${btoa(vrLink)}&id=${this.data.id}&type=${this.data.type}`); wx.navigateTo({ url: `/pages/shared/shared?img_url=${btoa(img_url)}&shareImg=${btoa(shareImg)}&companyName=${companyName}&vrLink=${btoa(vrLink)}&id=${this.data.id}&type=${this.data.type}`, }) } }, back(data) { if (data.sender !== 'h5') return; wx.switchTab({ url: '/pages/index/index' }) this.setData({ showCommodityCtrl: false }) }, service() { this.setData({ showContact: true, showCommodity: false, showCoupon: false }) }, invite(data) { if (data.sender !== 'h5') return; this.setData({ sendShare: true, count: ++this.data.count }) }, coupon(data) { if (data.sender !== 'h5') return; this.setData({ showContact: false, showCommodity: false, showCoupon: true }) }, liveGotoGood(ev) { let id = ev.currentTarget.dataset.item.goodsId wx.navigateTo({ url: '/pages/goods/goods?id=' + id, }) }, gotoGoodsDOM(event) { this.gotoGoods(event.currentTarget.dataset.item.hotIdList[0]) }, gotoGoodsSocket(data) { this.gotoGoods(data.data) }, gotoGoods(id) { console.log('---', id) this.socketSendMessage('clientSyncAction', { type: 'openTag', data: id }) this.setData({ showCommodity: false }) this.joinUrl() }, addCard(event) { wx.navigateTo({ url: '/pages/goods/goods?id=' + event.currentTarget.dataset.id + '&oper=addCard', }) }, buyGoods(event) { wx.navigateTo({ url: '/pages/goods/goods?id=' + event.currentTarget.dataset.id + '&oper=buyGoods', }) }, showCommodityFn() { this.setData({ showCommodity: true, showContact: false, showCoupon: false }) this.joinUrl() }, hideComodity() { this.setData({ showCommodity: false }) this.joinUrl() }, hideCoupon() { this.setData({ showCoupon: !this.data.showCoupon }) }, async receive(ev) { let item = ev.target.dataset.item try { // wx.showToast({ // title: '领取优惠卷', // }) // return; if (item.hasReceived || item.number <= item.receiveNumber) return; let res = await util.request(api.CouponExchange, { couponId: item.id }) if (res.code === 0) { wx.showToast({ title: '已成功领取', success: () => { this.setData({ showCoupon: false }) wx.nextTick(() => { this.setData({ coupons: this.data.coupons.map(citem => { return { ...citem, hasReceived: citem.id === item.id ? true : citem.hasReceived } }), showCoupon: true }) }) } }) } else if (res.errno === 401) { getApp().setLoginProps(false) } else { wx.showToast({ title: res.msg, }) } } catch (e) { console.error(e) wx.showToast({ icon: 'none', title: '领取失败', }) } }, async getCouponList(id) { const success = (res) => { this.setData({ coupons: res.data.list.map(item => { item.typeMoney = item.typeMoney.toString() item.fontSize = item.typeMoney.length === 3 ? '90rpx' : item.typeMoney.length === 4 ? '70rpx' : '130rpx' return item }) }) this.loadConponSuccess = true this.readySendCouponCtrl() } let res = await util.request(api.BrandCouponList, { brandId: id, pageNum: 1, pageSize: 10000 }, 'GET') console.log(res) if (res.code === 0) { success(res) } else { let res = await util.request(api.UNBrandCouponList, { brandId: id, pageNum: 1, pageSize: 10000 }, 'GET') success(res) } }, ready() { this.wssSuccess = true this.readySendCouponCtrl() }, readySendCouponCtrl() { if (this.wssSuccess && this.loadConponSuccess) { this.loadConponSuccess = false this.socketSendMessage('clientSyncAction', { type: 'showCoupon', data: this.data.coupons.length > 0 }) } }, getBrand: function (id, code) { this.getGoodsCount(code, id) return; let that = this; util.request(api.SueneCategory, { sceneNum: code }, 'GET').then(function (res) { if (res.code === 0) { const comtypes = res.list.map(item => { item.width = (item.name.length + (item.num.toString().length / 2) + 2) * 16 return { ...item } }) that.setData({ comWidth: comtypes.reduce((a, b) => a + b.width + 10, 0), comtypes, thumComtypes: (!isIos && comtypes.length > 3) ? comtypes.slice(0, 3) : null, currTypeId: comtypes.length > 0 && comtypes[0].category_id }); wx.showToast({ title: 'currTypeId' + that.data.currTypeId.length, }) that.data.currTypeId && that.getGoodsList(id, that.data.currTypeId); } }); }, getGoodsCount(code, id) { util.request(api.GoodsNumCount, { isDelete: 0, isOnSale: 1, brandId: id }, 'GET') .then(res => { if (res.code === 0) { this.setData({ goodsCount: res.data }) } this.getCouponList(id) }) }, getGoodsList(id, category_id) { var that = this; if (!(this.data.navList && this.data.navList.length)) { that.navDatas = {} let navDatas = this.data.navList = this.data.comtypes // util.request(api.GoodsCategory, { id: category_id }) // .then(function (res) { // if (res.errno == 0) { // let navDatas = res.data.brotherCategory // that.setData({ // navList: navDatas, // currTypeId: category_id // }); that.navDatas = {} navDatas.forEach(item => { util.request(api.GoodsList, { brandId: id, categoryId: item.category_id, page: that.data.page, size: that.data.size }) .then(res => { if (res.errno === 0) { that.navDatas[item.category_id] = res.data.goodsList } }) }) // } // }) } if (that.navDatas[category_id]) { if (!isIos) { let showCommodity = that.data.showCommodity that.setData({ showCommodity: false }) setTimeout(() => { wx.nextTick(() => { that.setData({ goodsList: that.navDatas[category_id], currTypeId: category_id, showCommodity: showCommodity }); }) }, 500) } else { that.setData({ goodsList: that.navDatas[category_id], currTypeId: category_id, }); } } else { console.error('诱惑去啦') util.request(api.GoodsList, { brandId: id, categoryId: category_id, page: that.data.page, size: that.data.size }) .then(function (res) { if (res.errno === 0) { that.setData({ goodsList: res.data.goodsList, currTypeId: category_id }); // this.data.navList } }); } }, getBrandDetail: function (id, type, cb) { util.request(api.BrandDetail, { id: id, type: type, }).then((res) => { let base = res.data.brand.sceneUrl // let base = 'http://192.168.0.112:8080/shop.html?m=t-7Uqj9Fq&origin=fashilong' if (res.errno === 0) { let url = base + "&sid=" + id this.setData({ id: id, newPicUrl: res.data.brand.appListPicUrl, sceneNum: res.data.brand.sceneNum, canShow: res.data.brand.canShow, contractPhone: res.data.brand.contractPhone }) if (this.data.many === void 0) { this.data.many = !!res.data.brand.canShow } this.setData({ // peopleCount: this.data.many ? manyCount : 5, peopleCount: this.data.many ? manyCount : 2, }) if (!res.data.brand.canShow) { this.role = 'customer' } else if (!this.options.join) { this.role = 'leader' } cb(url, urlToJson(url).m, ) } }); }, selectType(ev) { this.getGoodsList(this.options.id, ev.target.dataset.item.category_id) }, hideCS() { this.setData({ showCommodity: false, showCoupon: false, showContact: false }) }, hideContact() { this.setData({ showContact: false }) }, calcShare() { // this.exit() this.setData({ sendShare: false }) }, contactKf() { let keys = Object.keys(this.navDatas) let goodsId = this.navDatas[keys[0]][0].id let user = wx.getStorageSync('userinfoDetail') util.request(api.AddTalkCount, { goodsId, viewId: user && user.userId || '', sceneNum: this.data.sceneNum }, 'get') this.hideAlert && this.hideAlert() this.hideContact && this.hideContact() }, onHide() { this.socketSendMessage('changeOnlineStatus', { status: false }) this.pauseVideo = true this.joinUrl() } }