| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271 | 
							- <template name="graceIMMsg">
 
- 	<view>
 
- 		<view class="grace-im-footer" :style="{paddingBottom:paddingB}">
 
- 			<view class="grace-im-menus graceIMFonts icon-voice" 
 
- 				v-if="voiceBtnShow" 
 
- 				@tap="showRec"></view>
 
- 			<view class="grace-im-menus graceIMFonts icon-photograph" @tap="chooseImg"></view>
 
- 			<view class="grace-im-input">
 
- 				<input type="text" v-model="inputMsg" @confirm="sendTextMsg" />
 
- 			</view>
 
- 			<view class="grace-items" style="padding:0 8px; margin-right:6px;" @tap="sendTextMsg">发送</view>
 
- 		</view>
 
- 		<!-- 语音输入 -->
 
- 		<view class="grace-im-record" v-if="recShow">
 
- 			<view class="grace-im-record-txt">
 
- 				{{recTxt}}<text v-if="recing">已录音 : {{recLength}} s</text>
 
- 			</view>
 
- 			<view class="grace-im-record-btn"  @tap="rec" :class="[recing ? 'grace-im-recording' : '']"></view>
 
- 			<view class="grace-im-send-voice" v-if="tmpVoice != ''">
 
- 				<text @tap="playVoice">{{playTxt}}</text>| <text @tap="sendVoiceMsg">发送语音</text>
 
- 			</view>
 
- 			<view class="grace-im-record-close graceIMFonts icon-close" @tap="closeRec" v-if="!recing"></view>
 
- 		</view>
 
- 	</view>
 
- </template>
 
- <script>
 
- var bgAudioMannager = {};
 
- export default {
 
- 	name: "graceIMMsg",
 
- 	props: {
 
- 		user : {
 
- 			type : Object,
 
- 			default : function(){return {};}
 
- 		},
 
- 		token : {
 
- 			type : String,
 
- 			default : ""
 
- 		},
 
- 		config :{
 
- 			type : Object,
 
- 			default : function(){return {};}
 
- 		}
 
- 	},
 
- 	data() {
 
- 		return {
 
- 			paddingB        : '0',
 
- 			uploading       : false,
 
- 			recShow         : false,
 
- 			recTxt          : "请点击绿色按钮开始录音",
 
- 			inputMsg        : "",
 
- 			recorderManager : null,
 
- 			recing          : false,
 
- 			recLength       : 1,
 
- 			recTimer        : null,
 
- 			tmpVoice        : '',
 
- 			voiceLen        : 0,
 
- 			voiceBtnShow    : false,
 
- 			// 播放相关
 
- 			player          : null,
 
- 			playTxt         : "试听语音"
 
- 		}
 
- 	},
 
- 	created : function(){
 
- 		var _self = this;
 
- 		// #ifndef H5
 
- 		this.voiceBtnShow = true;
 
- 		this.recorderManager = uni.getRecorderManager();
 
- 		this.recorderManager.onStop((res) => {
 
- 			_self.tmpVoice     = res.tempFilePath;
 
- 			this.recing = false;
 
- 			this.recTxt   =  "... 已录音 "+this.recLength+"s, 点击绿色按钮重新录音 ...";
 
- 			clearInterval(this.recTimer);
 
- 		});
 
- 		this.recorderManager.onError(function () {
 
- 			uni.showToast({ title: '录音失败', icon: 'none' });
 
- 			_self.recing = false;
 
- 			_self.recTxt   = "请点击绿色按钮开始录音",
 
- 			clearInterval(_self.recTimer);
 
- 		});
 
- 		// #endif
 
- 		// #ifdef MP
 
- 		try {
 
- 		    var res = uni.getSystemInfoSync();
 
- 			res.model = res.model.replace(' ', '');
 
- 			res.model = res.model.toLowerCase();
 
- 			if(res.model.indexOf('iphonex') != -1 || res.model.indexOf('iphone11') != -1){
 
- 				this.paddingB = uni.upx2px(50)+'px';
 
- 			}
 
- 		} catch (e){return null;}
 
- 		// #endif
 
- 	},
 
- 	methods:{
 
- 		// 录音
 
- 		rec : function(){
 
- 			if (this.recing){
 
- 				this.recorderManager.stop();
 
- 				this.recing = false;
 
- 				this.recTxt   =  "... 已录音 "+this.recLength+"s, 点击绿色按钮重新录音 ...";
 
- 				clearInterval(this.recTimer);
 
- 			} else {
 
- 				this.recorderManager.start({duration:60000, format:'mp3' });
 
- 				this.recing     = true;
 
- 				this.recTxt     =  "... 正在录音 ...";
 
- 				this.recLength  = 1;
 
- 				this.recTimer   = setInterval(function(){this.recLength++;}.bind(this), 1000);
 
- 			}
 
- 		},
 
- 		// 播放录音
 
- 		playVoice : function(){
 
- 			var _self = this;
 
- 			if(this.playTxt == '正在播放'){
 
- 				this.playTxt = '试听语音';
 
- 				bgAudioMannager.stop();
 
- 				return ;
 
- 			}
 
- 			bgAudioMannager = uni.getBackgroundAudioManager();
 
- 			this.playTxt      = '正在播放';
 
- 			bgAudioMannager.src   = this.tmpVoice;
 
- 			bgAudioMannager.onEnded(function(){
 
- 				_self.playTxt = "试听语音";
 
- 			});
 
- 			bgAudioMannager.onStop(function(){
 
- 				_self.playTxt = "试听语音";
 
- 			});
 
- 			
 
- 		},
 
- 		// 发送录音
 
- 		sendVoiceMsg : function(){
 
- 			var _self = this;
 
- 			if (_self.tmpVoice == '') {
 
- 				uni.showToast({ title: "请先录制一段语音", icon: "none" });
 
- 				return;
 
- 			}
 
- 			// 关闭界面
 
- 			this.recShow = false;
 
- 			uni.showLoading({ title:"正在发送" });
 
- 			const uploadTask = uni.uploadFile({
 
- 				url      : _self.config.serverUrl+'?c=uploadFile&token='+_self.token,
 
- 				filePath : _self.tmpVoice,
 
- 				name     : 'gChatUploadFile',
 
- 				success   : function (uploadFileRes) {
 
- 					var res = JSON.parse(uploadFileRes.data);
 
- 					if(res.status == 'ok'){
 
- 						var msg         = _self.user;
 
- 						msg.type        = 'msg';
 
- 						msg.contentType = 'voice';
 
- 						msg.content     = res.msg;
 
- 						msg.length      = _self.recLength;
 
- 						uni.sendSocketMessage({
 
- 							data : JSON.stringify(msg),
 
- 							complete:function(){
 
- 								setTimeout(function(){
 
- 									_self.uploading = false;
 
- 									uni.hideLoading();
 
- 									_self.tmpVoice = '';
 
- 								}, 500);
 
- 							},
 
- 							fail:function(e){
 
- 								_self.uploading = false;
 
- 								console.log('消息发送失败');
 
- 							}
 
- 						});
 
- 					}else{
 
- 						setTimeout(function(){uni.hideLoading();}, 1000);
 
- 					}
 
- 					
 
- 				},
 
- 				fail:function(e){
 
- 					_self.uploading = false;
 
- 					console.log(e);
 
- 				}
 
- 			});
 
- 		},
 
- 		// 展示录音界面
 
- 		showRec : function(){this.recShow = true;},
 
- 		// 关闭录音界面
 
- 		closeRec: function (){this.recShow = false;},
 
- 		// 发送文本消息
 
- 		sendTextMsg: function () {
 
- 			if (this.inputMsg < 1) {return false;}
 
- 			var msg         = this.user;
 
- 			msg.type        = 'msg';
 
- 			msg.contentType = 'txt';
 
- 			msg.content     = this.inputMsg;
 
- 			msg.token       = this.token;
 
- 			console.log(msg,33);
 
- 			uni.sendSocketMessage({
 
- 				data : JSON.stringify(msg),
 
- 				fail:function(e){console.log('消息发送失败 ...');}
 
- 			});
 
- 			this.inputMsg = '';
 
- 		},
 
- 		// 选择图片
 
- 		chooseImg : function(){
 
- 			if(this.uploading){ return false;}
 
- 			var _self = this;
 
- 			uni.showLoading({title:"选择图片"});
 
- 			this.uploading = true;
 
- 			uni.chooseImage({
 
- 				count: 1,
 
- 				sizeType: ['compressed'],
 
- 				sourceType: ['album', 'camera'],
 
- 				success : function(res){
 
- 					uni.showLoading({title:"图片发送中"});
 
- 					const tempFilePaths = res.tempFilePaths;
 
- 					const uploadTask = uni.uploadFile({
 
- 						url      : _self.config.serverUrl+'?c=uploadFile&token='+_self.token,
 
- 						filePath : tempFilePaths[0],
 
- 						name     : 'gChatUploadFile',
 
- 						success   : function (uploadFileRes) {
 
- 							var res = JSON.parse(uploadFileRes.data);
 
- 							if(res.status == 'ok'){
 
- 								var msg         = _self.user;
 
- 								msg.type        = 'msg';
 
- 								msg.contentType = 'img';
 
- 								msg.content     = res.msg;
 
- 								uni.sendSocketMessage({
 
- 									data : JSON.stringify(msg),
 
- 									complete:function(){
 
- 										setTimeout(function(){
 
- 											_self.uploading = false;
 
- 											uni.hideLoading();
 
- 										}, 500);
 
- 									},
 
- 									fail:function(e){
 
- 										_self.uploading = false;
 
- 										console.log('消息发送失败');
 
- 									}
 
- 								});
 
- 							}else{
 
- 								setTimeout(function(){uni.hideLoading();}, 500);
 
- 							}
 
- 							
 
- 						},
 
- 						fail:function(e){
 
- 							_self.uploading = false;
 
- 							console.log(e);
 
- 						}
 
- 					});
 
- 				},
 
- 				fail:function(){uni.hideLoading();}
 
- 			});
 
- 		}
 
- 	}
 
- }
 
- </script>
 
- <style scoped>
 
- @font-face {font-family: "graceIMFonts"; src:url('data:font/truetype;charset=utf-8;base64,d09GMgABAAAAAASoAAsAAAAACpAAAARbAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCDMgqILIZ4ATYCJAMUCwwABCAFhG0HSxsHCcgOJQUABgUAAMBk8EB6fW8yk/3Z7Cd4BLPXQW6vA9B99wc4f67lvzL5jC8R2YVkAS+XAsN4QPB1pPqF+wfHUj8K/8Hyvu1BXjGyLDq25lGBDagb1ySRuNkEfcvRGr5iXEVcDQGYRBOJS2OXykbwRoFqQYpmTZc48HZYUBEkgaF3BBypENvQMbT12hNgq/b24g35wgANXYLX6jelSITc52EvKqRlDzJKWljFuYDbcSCBTAAFYkGgZxZuhipT05hBv+dOLYCJgYb2POx50vPyFxW2DZaiQzqT/8MDDYlCgHCAGk+KrY0reB4m8aDB8yQeJDwv50HBiwrZtGh0ur0JhAGiEhCdYIisoERHonui2lcmOM2zJHp7m6a+suXpoNZng9tfDG17vkyohugi+3dbns4wdwWyFuTaGyL2DH1o+v/RweMTg2Y6LqngIEk2qXNSr6zPX9naOrilZVBb25D29qFN+/Nh99riT7Z3vdsad6xlyKkr1tWNZ09eGz6kkbRWS7iliav7hBVp1hm64Q4O3rMhcFCzzBa4ywoa3MgWtHtjyNAmVUhYR3kdd6O7DasHDfpeN2jwb7vbQFjoV6Fa7o6VK9v0qChdVrZdRURhRbwW3rqlUHWLS5mMreMeM3nRSDO2TbYUy16uGosg002pTpZwphre5b7iZKa3S1VPqnNboCS+PE4Hmd9c9SJ2Lk+1zG3JjnAsPmH0XBpvDWJl+WX186e6zIWKSG6z0np0qthYRZSdTEQULL34fb9uJZ66RKiru0eP4K4lSXcWecR/xPf20/WbFi0Bz/8qJrcUz0VLHq9jd7SqyEjVyoWKSFZYZV4TL99QQihCuiGEghgP3sLyqYFyCAlv/7hDnEsCyWXFCOnjZkAVINnlhrLtTEJFJEusvRjRsGVZpxpGRH+psDBFlC1MRCRsj0k9bjZvPtcjYrOpiXamCVUROssu7hLWO2VNhdl5+yxFRU/Z8/pcBwNGkpu2yNAKAPaY/CNXAvak/CmXAfaM/CYXH8o/w6M7d+aODar8ZrgUAB2fJ5zRauxBhbTgeNSSWHrgShOOqa8crbp6d0qSt09n10Gh0T6LTOBwDfjzrxh7EEUmBAZBFmh4EAUSg0SkwmaCjotCcGBQAyYZlBzvIgCKG0I5gXTGAAS+nIKGN9dB4ssnUmH/QCeY/+DAV0gwGSICzugiWUw3GxZgjmER8V1IESyTCDvz1YvrsdSmc9Qu18jNmDqVIIrLznUnS7CJaRH7ONuleMYIItQyUDFcD+u6hWxqqVhg0TJjdnpMzpSgJ4oWLAN8aYCC4WBgRBA8XSAUBCxMiLIww9fz+vVgJNrQ4aARXT/8zWAoTpTVI+KIJjYBskRjJuralEon7UjEw2iEgCC3QgsDRDF1YXQes0DYwZupYAQY0cgZIjbpxNDJSFJNdPU6Yx5LT5ueeAZdaEIKJXThwGPGdM60RcRz0WJbUY1TF8sb8IrH8sVdigkAAA==') format('truetype');}
 
- .graceIMFonts {font-family:"graceIMFonts" !important; font-size:15px; font-style:normal; color:#5E5E5E;}
 
- .icon-voice:before{content: "\e63a";}
 
- .icon-photograph:before {content:"\e619";}
 
- .icon-close:before {content:"\e625";}
 
- .icon-kbd{content:"\e73b";}
 
- .grace-im-footer{display:flex; background:#FFFFFF; width:100%; position:fixed; left:0; bottom:0; height:50px; flex-wrap:nowrap; overflow:hidden; box-shadow:1px 1px 6px #888;}
 
- .grace-im-footer .grace-items{width:auto; line-height:50px; flex-shrink:0;}
 
- .grace-im-menus{width:44px; height:50px; flex-shrink:0; line-height:50px; text-align:center; font-size:28px;}
 
- .grace-im-input{width:100%; margin:5px; padding:0 8px; background:#F4F5F6; border-radius:5px; height:40px; flex-wrap:nowrap; margin-left:10px;}
 
- .grace-im-input input{width:100%; background:#F4F5F6; height:20px; margin:8px 0; line-height:20px; border-radius:5px;}
 
- .grace-im-record{width:100%; position:fixed; left:0; bottom:0; background:#FFF; padding:30px 0; padding-bottom:50px; z-index:11; box-shadow:1px 1px 6px #888;}
 
- .grace-im-record-close{width:50px; height:50px; position:absolute; top:0px; right:0px; z-index:100; text-align:center; line-height:50px; color:#ccc; font-size:20px;}
 
- .grace-im-record-txt{text-align:center; line-height:30px; padding-bottom:10px; color:#ccc;}
 
- .grace-im-record-btn{width:60px; height:60px; margin:0 auto; border:5px solid #F1F2F3; border-radius:100%; background:#00B26A;}
 
- .grace-im-recording{background:#FF0000; animation:fade linear 2s infinite;}
 
- @keyframes fade{from{opacity:0.1;} 50%{opacity:1;} to{opacity:0.1;}}
 
- .grace-im-record-txt text{color:#00B26A; padding:0 12px;}
 
- .grace-im-send-voice{margin-top:12px; color:#00BA62; text-align:center;}
 
- .grace-im-send-voice text{margin:0 15px; color:#00BA62;}
 
- </style>
 
 
  |