left-bubble.vue 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. <template>
  2. <view>
  3. <!-- 别人发出的消息 -->
  4. <view class="other" v-if="row.sendUid!=userData.user.operId">
  5. <!-- 右键 -->
  6. <view class="left-click" v-show="row.id==lClickId">
  7. <view @tap="copyFunc(row.msgContext)">复制</view>
  8. <view @tap="deleteFunc(row.id,index)" v-if="row.msgType!=1">删除</view>
  9. <view @tap="forwardFunc(row)" v-if="row.msgType!=7">转发</view>
  10. <view @tap="collectFunc(row)" v-if="row.msgType==1">收藏</view>
  11. <text @tap="rollBackFunc(row)">撤销</text>
  12. </view>
  13. <!-- 左-头像 -->
  14. <view :class="row.msgType==0?'left text':'left'" @tap="linkToCard(row.sendUid)">
  15. <img-cache :src="`${$url}/${row.avatar}`"></img-cache>
  16. </view>
  17. <!-- 右-用户名称-时间-消息 -->
  18. <view class="right">
  19. <view class="username">
  20. <view class="name">{{row.nickName}}</view>
  21. <view class="time">{{row.operTime|formatDate}}</view>
  22. </view>
  23. <!-- 文字消息 -->
  24. <view @longtap="openLeft(row)" v-if="row.msgType==0" class="bubble">
  25. <rich-text :nodes="row.msgContext"></rich-text>
  26. </view>
  27. <!-- 语音消息 -->
  28. <view @longtap="openLeft(row)" v-if="row.msgType==3" class="bubble voice" @tap="playVoice(row)" :class="playMsgid == row.id?'play':''">
  29. <view class="icon other-voice"></view>
  30. <view class="length">{{recordToJson(row.msgContext).length}}</view>
  31. </view>
  32. <!-- 图片消息 -->
  33. <view @longtap="openLeft(row)" v-if="row.msgType==1" class="bubble img" @tap="showPic(`${$url}/${row.msgContext}`)">
  34. <image :src="`${$url}/scale_${row.msgContext}`" style="width:100px;height:100px"></image>
  35. </view>
  36. <!-- 红包 -->
  37. <view v-if="row.msgType==7" @tap="openRedPacket(row,index)">
  38. <div class="message-red-packet-left" :style="redProcess(row.msgContext).surplusMoney===0?'background:#F7DFC3':'background:#F09D47'">
  39. <div class="text">
  40. <span class="packet">恭喜发财,大吉大利</span>
  41. <image :src="redProcess(row.msgContext).surplusMoney===0?'../../static/img/red-chai.png':'../../static/img/red.png'"></image>
  42. </div>
  43. <div :class="redProcess(row.msgContext).surplusMoney===0?'footer2':'footer'">红包</div>
  44. <div class="arrow-org" :style="redProcess(row.msgContext).surplusMoney===0?'background:#F7DFC3':'background:#F09D47'"></div>
  45. </div>
  46. </view>
  47. </view>
  48. </view>
  49. </view>
  50. </template>
  51. <script>
  52. export default {
  53. name: 'left-bubble',
  54. components:{
  55. },
  56. props: {
  57. row: {
  58. type: Object,
  59. default() {
  60. return {};
  61. }
  62. },
  63. lClickId: {
  64. type: Number,
  65. default: 0
  66. },
  67. playMsgid: {
  68. type: Number,
  69. default: 0
  70. },
  71. index:{
  72. type:Number,
  73. defalut:0
  74. },
  75. },
  76. data() {
  77. return {
  78. //播放语音相关参数
  79. AUDIO:uni.createInnerAudioContext(),
  80. $url:''
  81. };
  82. },
  83. mounted() {
  84. //语音自然播放结束
  85. this.AUDIO.onEnded((res)=>{
  86. });
  87. },
  88. filters: {
  89. formatDate: function (e) {
  90. // 获取js 时间戳
  91. let time = new Date().getTime();
  92. // 去掉 js 时间戳后三位
  93. time = parseInt((time - e) / 1000);
  94. // 存储转换值
  95. let s;
  96. if (time < 60 * 10) {
  97. // 十分钟内
  98. return '刚刚';
  99. } else if (time < 60 * 60 && time >= 60 * 10) {
  100. // 超过十分钟少于1小时
  101. s = Math.floor(time / 60);
  102. return s + '分钟前';
  103. } else if (time < 60 * 60 * 24 && time >= 60 * 60) {
  104. // 超过1小时少于24小时
  105. s = Math.floor(time / 60 / 60);
  106. return s + '小时前';
  107. } else if (time < 60 * 60 * 24 * 3 && time >= 60 * 60 * 24) {
  108. // 超过1天少于3天内
  109. s = Math.floor(time / 60 / 60 / 24);
  110. return s + '天前';
  111. } else {
  112. // 超过3天
  113. var date = new Date(e);//时间戳为10位需*1000,时间戳为13位的话不需乘1000
  114. var Y = date.getFullYear() + '-';
  115. var M = (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1) : date.getMonth()+1) + '-';
  116. var D = date.getDate() + ' ';
  117. var h = date.getHours() + ':';
  118. var m = date.getMinutes() + ':';
  119. var ss = date.getSeconds();
  120. return Y+M+D+h+m+ss;
  121. }
  122. }
  123. },
  124. methods:{
  125. openLeft(row){
  126. this.$emit('openLeft', row);
  127. },
  128. deleteFunc(id,index){
  129. this.$emit('deleteF', id, index);
  130. },
  131. // 打开红包
  132. openRedPacket(msg){
  133. this.$emit('openRedPacket',msg);
  134. },
  135. //收藏表情
  136. collectFunc({msgContext}){
  137. this.$socket.addEmoticon(this.userData.user.operId, msgContext, res => {
  138. if(res.success){
  139. uni.showToast({
  140. icon:'none',
  141. title:'添加成功'
  142. })
  143. }
  144. });
  145. },
  146. //处理红包数据
  147. redProcess(msgContext){
  148. let packets = JSON.parse(msgContext).Packets;
  149. let msg = {
  150. description:'好友暂不支持发红包',
  151. money:0,
  152. number:0,
  153. userAvatar:'defalut.jpg',
  154. surplusMoney:0,
  155. Records:[]
  156. }
  157. if(packets==undefined){
  158. return msg;
  159. }
  160. if(packets.length==0){
  161. return msg;
  162. }
  163. return packets[0];
  164. },
  165. // 预览图片
  166. showPic(msg){
  167. uni.previewImage({
  168. indicator:"none",
  169. current: msg,
  170. urls: [msg]
  171. });
  172. },
  173. // 播放语音
  174. playVoice(msg){
  175. let s =JSON.parse(msg.msgContext);
  176. this.playMsgid= msg.id;
  177. this.AUDIO.src = this.$url + s.url;
  178. this.$nextTick(function() {
  179. this.AUDIO.play();
  180. });
  181. },
  182. playMp3(){
  183. let s =JSON.parse(msg.msgContext);
  184. const innerAudioContext = uni.createInnerAudioContext();
  185. innerAudioContext.autoplay = true;
  186. innerAudioContext.src = this.$url + s.url;
  187. innerAudioContext.onPlay(() => {
  188. console.log('开始播放');
  189. });
  190. innerAudioContext.onError((res) => {
  191. console.log(res.errMsg);
  192. console.log(res.errCode);
  193. });
  194. },
  195. recordToJson(msg){
  196. let s =JSON.parse(msg);
  197. return s
  198. },
  199. //复制
  200. copyFunc(content){
  201. uni.setClipboardData({
  202. data:content,
  203. success:()=>{
  204. uni.showToast({
  205. title:"复制成功"
  206. })
  207. }
  208. });
  209. },
  210. //转发
  211. forwardFunc({msgType,msgContext}){
  212. this.$u.route({
  213. url:'pages/chat/forward',
  214. params:{msgType,msgContext}
  215. });
  216. },
  217. //撤销
  218. rollBackFunc({id,operTime}){
  219. let _this = this
  220. uni.showActionSheet({
  221. itemList: ['确认'],
  222. success: function (res) {
  223. if(res.tapIndex==0){
  224. let type = _this.chatObj.chatType;
  225. let arr = ['deleteFriendMsg','deleteGroupMsg']
  226. _this.$socket[arr[type]](_this.userData.user.operId, id, _this.chatObj.chatId, res => {
  227. if (res.success) {
  228. _this.sendMsg(6, id);
  229. }
  230. })
  231. }
  232. },
  233. fail: function (res) {
  234. console.log(res.errMsg);
  235. }
  236. });
  237. },
  238. //名片
  239. linkToCard(id){
  240. this.$u.route({
  241. url: 'pages/businessCard/businessCard',
  242. params:{ id: id, source: 1}
  243. })
  244. },
  245. //表情转换
  246. transformFace(text){
  247. return transform(text)
  248. },
  249. }
  250. }
  251. </script>
  252. <style lang="scss">
  253. @import "@/pages/chat/style.scss";
  254. </style>