PHP技术论坛

搜索
查看: 483|回复: 0
打印 上一主题 下一主题

微信小程序即时通讯私聊UI

[复制链接]

83

主题

88

帖子

411

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
411
跳转到指定楼层
楼主
发表于 2022-5-7 12:44:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这个UI感觉不错 基本功能都已经实现

地址:https://blog.csdn.net/qq_41366114/article/details/123121930

WML代码

  1. <view>
  2.                 <view class="content" bindtouchstart="hideDrawer">
  3.                         <scroll-view class="msg-list {{popupLayerClass}}" scroll-y="true"
  4.                                 scroll-with-animation="{{scrollAnimation}}" scroll-top="{{scrollTop}}" scroll-into-view="{{scrollToView}}"
  5.                                 bindscrolltoupper="loadHistory" upper-threshold="50">
  6.                                 <!-- 加载历史数据waitingUI -->
  7.                                 <view class="loading">
  8.                                         <view class="spinner">
  9.                                                 <view class="rect1"></view>
  10.                                                 <view class="rect2"></view>
  11.                                                 <view class="rect3"></view>
  12.                                                 <view class="rect4"></view>
  13.                                                 <view class="rect5"></view>
  14.                                         </view>
  15.                                 </view>
  16.                                 <view class="row" wx:for="{{msgList}}" id="{{'msg'+item.msg.id}}"  wx:key="item">
  17.                                         <!-- 系统消息 -->
  18.                                         <block wx:if="{{item.type=='system'}}">
  19.                                                 <view class="system">
  20.                                                         <!-- 文字消息 -->
  21.                                                         <view wx:if="{{item.msg.type=='text'}}" class="text">
  22.                                                                 {{item.msg.content.text}}
  23.                                                         </view>
  24.                                                         <!-- 领取红包消息 -->
  25.                                                         <view wx:if="{{item.msg.type=='redEnvelope'}}"  class="red-envelope">
  26.                                                                 <image src="/static/chat/red-envelope-chat.png"></image>
  27.                                                                 {{item.msg.content.text}}
  28.                                                         </view>
  29.                                                 </view>
  30.                                         </block>
  31.                                         <!-- 用户消息 -->
  32.                                         <block wx:if="{{item.type=='user'}}">
  33.                                                 <!-- 自己发出的消息 -->
  34.                                                 <view class="my" wx:if="{{item.msg.userinfo.uid==myuid}}">
  35.                                                         <!-- 左-消息 -->
  36.                                                         <view class="left">
  37.                                                                 <!-- 文字消息 -->
  38.                                                                 <view wx:if="{{item.msg.type=='text'}}" class="bubble">
  39.                                                                         <rich-text nodes="{{item.msg.content.text}}"></rich-text>
  40.                                                                 </view>
  41.                                                                 <!-- 语言消息 -->
  42.                                                                 <view wx:if="{{item.msg.type=='voice'}}" class="bubble voice {{playMsgid == item.msg.id?'play':''}}" data-msg="{{item.msg}}" bindtap="playVoice">
  43.                                                                         <view class="length">{{item.msg.content.length}}</view>
  44.                                                                         <view class="icon my-voice"></view>
  45.                                                                 </view>
  46.                                                                 <!-- 图片消息 -->
  47.                                                                 <view wx:if="{{item.msg.type=='img'}}" class="bubble img" data-msg="{{item.msg}}" bindtap="showPic">
  48.                                                                         <image src="{{item.msg.content.url}}"
  49.                                                                                 style="width:{{item.msg.content.w}}px;height:{{item.msg.content.h}}px;">
  50.                                                                         </image>
  51.                                                                 </view>
  52.                                                                 <!-- 红包 -->
  53.                                                                 <view wx:if="{{item.msg.type=='redEnvelope'}}" class="bubble red-envelope" data-index="{{index}}" data-msg="{{item.msg}}"
  54.                                                                         bindtap="openRedEnvelope">
  55.                                                                         <image src="/static/chat/red-envelope.png"></image>
  56.                                                                         <view class="tis">
  57.                                                                                 <!-- 点击开红包 -->
  58.                                                                         </view>
  59.                                                                         <view class="blessing">
  60.                                                                                 {{item.msg.content.blessing}}
  61.                                                                         </view>
  62.                                                                 </view>

  63.                                                         </view>
  64.                                                         <!-- 右-头像 -->
  65.                                                         <view class="right">
  66.                                                                 <image src="{{item.msg.userinfo.face}}"></image>
  67.                                                         </view>
  68.                                                 </view>
  69.                                                 <!-- 别人发出的消息 -->
  70.                                                 <view class="other" wx:if="{{item.msg.userinfo.uid!=myuid}}">
  71.                                                         <!-- 左-头像 -->
  72.                                                         <view class="left">
  73.                                                                 <image src="{{item.msg.userinfo.face}}"></image>
  74.                                                         </view>
  75.                                                         <!-- 右-用户名称-时间-消息 -->
  76.                                                         <view class="right">
  77.                                                                 <view class="username">
  78.                                                                         <view class="name">{{item.msg.userinfo.username}}</view>
  79.                                                                         <view class="time">{{item.msg.time}}</view>
  80.                                                                 </view>
  81.                                                                 <!-- 文字消息 -->
  82.                                                                 <view wx:if="{{item.msg.type=='text'}}" class="bubble">
  83.                                                                         <rich-text nodes="{{item.msg.content.text}}"></rich-text>
  84.                                                                 </view>
  85.                                                                 <!-- 语音消息 -->
  86.                                                                 <view wx:if="{{item.msg.type=='voice'}}" data-msg="{{item.msg}}" class="bubble voice {{playMsgid == item.msg.id?'play':''}}" bindtap="playVoice">
  87.                                                                         <view class="icon other-voice"></view>
  88.                                                                         <view class="length">{{item.msg.content.length}}</view>
  89.                                                                 </view>
  90.                                                                 <!-- 图片消息 -->
  91.                                                                 <view wx:if="{{item.msg.type=='img'}}" data-msg="{{item.msg}}" class="bubble img" bindtap="showPic">
  92.                                                                         <image src="{{item.msg.content.url}}"
  93.                                                                                    style="width:{{item.msg.content.w}}px;height:{{item.msg.content.h}}px;">
  94.                                                                         </image>
  95.                                                                 </view>
  96.                                                                 <!-- 红包 -->
  97.                                                                 <view wx:if="{{item.msg.type=='redEnvelope'}}" class="bubble red-envelope" data-msg="{{item.msg}}" data-index="{{index}}"
  98.                                                                         bindtap="openRedEnvelope">
  99.                                                                         <image src="/static/chat/red-envelope.png"></image>
  100.                                                                         <view class="tis">
  101.                                                                                 <!-- 点击开红包 -->
  102.                                                                         </view>
  103.                                                                         <view class="blessing">
  104.                                                                                 {{item.msg.content.blessing}}
  105.                                                                         </view>
  106.                                                                 </view>
  107.                                                         </view>
  108.                                                 </view>
  109.                                         </block>
  110.                                 </view>
  111.                         </scroll-view>
  112.                 </view>
  113.                 <!-- 抽屉栏 -->
  114.                 <view class="popup-layer {{popupLayerClass}}"  catchtouchmove="discard">
  115.                         <!-- 表情 -->
  116.                         <swiper class="emoji-swiper {{hideEmoji?'hidden':''}}" indicator-dots="true" duration="150">
  117.                                 <swiper-item wx:for="{{emojiList}}" wx:for-item="page" wx:key="{{page}}">
  118.                                         <view wx:for="{{page}}"  wx:for-item="em" wx:key="{{em}}" data-em="{{em}}" bindtap="addEmoji">
  119.                                                 <!-- https://zhoukaiwen.com/img/icon/emojj1/1.png -->
  120.                                                 <image mode="widthFix" src="https://zhoukaiwen.com/img/icon/emojj1/{{em.url}}"></image>
  121.                                         </view>
  122.                                 </swiper-item>
  123.                         </swiper>
  124.                         <!-- 更多功能 相册-拍照-红包 -->
  125.                         <view class="more-layer {{hidden?'hideMore':''}}">
  126.                                 <view class="list">
  127.                                         <view class="box" bindtap="chooseImage">
  128.                                                 <view class="icon tupian2"></view>
  129.                                         </view>
  130.                                         <view class="box" bindtap="camera">
  131.                                                 <view class="icon paizhao"></view>
  132.                                         </view>
  133.                                         <view class="box" bindtap="handRedEnvelopes">
  134.                                                 <view class="icon hongbao"></view>
  135.                                         </view>
  136.                                 </view>
  137.                         </view>
  138.                 </view>
  139.                 <!-- 底部输入栏 -->
  140.                 <view class="input-box cu-bar tabbar {{popupLayerClass}}" catchtouchmove="discard">
  141.                         <view class="voice">
  142.                                 <view class="icon {{isVoice?'jianpan':'yuyin'}}" bindtap="switchVoice"></view>
  143.                         </view>
  144.                         <view class="textbox">
  145.                                 <view class="voice-mode {{isVoice?'':'hidden'}}{{recording?'recording':''}}"
  146.                                         bindtouchstart="voiceBegin" catchtouchmove="voiceIng" bindtouchend="voiceEnd"
  147.                                         bindtouchcancel="voiceCancel">{{voiceTis}}</view>
  148.                                 <view class="text-mode {{isVoice?'hidden':''}}">
  149.                                         <view class="box">
  150.                                                 <textarea auto-height="true" bindinput="inputtextMsg" value="{{textMsg}}" bindfocus="textareaFocus" />
  151.                                         </view>
  152.                                         <view class="em" bindtap="chooseEmoji">
  153.                                                 <view class="icon biaoqing"></view>
  154.                                         </view>
  155.                                 </view>
  156.                         </view>
  157.                         <view class="more" bindtap="showMore">
  158.                                 <view class="icon add"></view>
  159.                         </view>
  160.                         <view class="send {{isVoice?'hidden':''}}" bindtap="sendText">
  161.                                 <view class="btn">发送</view>
  162.                         </view>
  163.                 </view>
  164.                 <!-- 录音UI效果 -->
  165.                 <view class="record {{recording?'':'hidden'}}">
  166.                         <view class="ing {{willStop?'hidden':''}}">
  167.                                 <view class="icon luyin2"></view>
  168.                         </view>
  169.                         <view class="cancel {{willStop?'':'hidden'}}">
  170.                                 <view class="icon chehui"></view>
  171.                         </view>
  172.                         <view class="tis {{willStop?'change':''}}">{{recordTis}}</view>
  173.                 </view>
  174.                 <!-- 红包弹窗 -->
  175.                 <view class="windows {{windowsState}}">
  176.                         <!-- 遮罩层 -->
  177.                         <view class="mask" catch:touchmove="discard" bindtap="closeRedEnvelope"></view>
  178.                         <view class="layer" catch:touchmove="discard">
  179.                                 <view class="open-redenvelope">
  180.                                         <view class="top">
  181.                                                 <view class="close-btn">
  182.                                                         <view class="icon close" bindtap="closeRedEnvelope"></view>
  183.                                                 </view>
  184.                                                 <image src="https://zhoukaiwen.com/img/qdpz/face/face_1.jpg"></image>
  185.                                         </view>
  186.                                         <view class="from">来自{{redenvelopeData.from}}</view>
  187.                                         <view class="blessing">{{redenvelopeData.blessing}}</view>
  188.                                         <view class="money">{{redenvelopeData.money}}</view>
  189.                                         <view class="showDetails" data-rid="{{redenvelopeData.rid}}" bindtap="toDetails">
  190.                                                 查看领取详情 <view class="icon to"></view>
  191.                                         </view>
  192.                                 </view>
  193.                         </view>

  194.                 </view>
  195.         </view>
复制代码



CSS代码:


  1. .cu-bar.tabbar {
  2.   padding: 0;
  3.   /* height: calc(100rpx + env(safe-area-inset-bottom) / 2); */
  4.   padding-bottom: calc(env(safe-area-inset-bottom) / 2);
  5. }
  6. .cu-bar {
  7.   display: flex;
  8.   position: relative;
  9.   align-items: center;
  10.   min-height: 100rpx;
  11.   justify-content: space-between;
  12. }
  13. page {
  14.   background-color: #e5e5e5;
  15. }
  16. @font-face {
  17.   font-family: "HMfont-home";
  18.   src: url("data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAAn8AAsAAAAAE1wAAAmvAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCFDAqWYJI9ATYCJANACyIABCAFhFUHgV8bThBRlFFWNdkXBXbDsSFQq221McNWrxUbYqGhiTju98MTeXqNh/9fo90388cEMe0bwSOJRIjavZIgESqnE5J5JqQVDZH/XdNfoHSAjqKqRsA+Tf/Ruya33E/bkdHsJtycY2XWAGbM5oenzf173A3lHrEilsmMbu74Y5VmYtxpgza9DMxkWL0gfjGbGRE54AL2f2ut3h2u8Q7RaZRCjDPLIv8cfAUR30MtEUWbSReVJkk0RB4lWWkNg7WVA1sBKmIUdr0uzibQOmxA4vrWwQXkJUweKHPfdwXkA+FSik2o1aVizyTegEKdvWINwGv59bEGY9GeTJFjW95pswIrzz3LYi//0O4JEaDrY3DZjxwXgUR8V3IfIeXARaloVRXT3mK/tsi3LubcJfese8l96Xbd1l1ve2z7eJp5lv3zB7URSdJNYd3Dfm7UUxxkGu0sLFcbVEa5pP3D6/QmokQw3OGzfJp/2kBkLJYQDYuziJbFJUSweIkoWXQRNYuEGFi0BLzFOhAjS4+InKUPRGI5I2a+kg7VSWUGoXoos2BNmGIWexwFroD8IUD6C1A9lYp8F3ClwsFgcgPdNpN08v1czkEOJ4aeieaC3QyVfb9PX2kbn9/0CwTeNAm79H1Kc2x3i9C7LcEZtMSLfE6T4aM+YWOm06dZ5cm9I+xoYw+rqGlScKKlHytu9h6Dw0E5nXK7nbTZknT1jFldR9cuzNMz9Srf7FydqpYW5mRr6Dq1OC9HqzYzoiw1cjohV2tX1Ji1K9bSdVkEbaxS1xQwpmpVpUFheyyzPyGdbXKHexkByib+vtgeK1X75xKqWl+grUNIbRZDXT31tBMiPZAyF0KmniCQhSgACkh5+gIxtvTS/si+VjbAuY6SMdCzbqInzwkjk5ENzMCkNv+ghQQ0qSSAUGmAMQoBozoAIrUe6qpzM+tma1T1jDgvVzdBWcIcLT170njGQU3cCpnUTSdkHH3ltwPHpKotTIP6HH12Lvd4czCWgbJYhY1U5ddlTCICSs1is0in8tXExk7VVRuMQhIQGgOtFcolPmMkIqDVduTGEOn1jI4gFERmSUsv3rGmoKUEQLITLUyzqpFukq8T6U+omVQsT8XHxsnipPEyBAlKNmkNMlMJgOT5Tpsoo2RGP3lOTQyk5GRBgJKw2WQsarWzSa1aLF/+UBk2PkA3wEkBM/RwOLJ0ORWiVCR3YYAAFyIlAdaNqEnmh0sTqOsAq97R85Jt+HGHrNKWgDHmxOPxumKmRGzudayPtogu9D2Zx688C3D6XJSgpgF6MJbomdtyOYBgcXOGSgMAPXqy+F11pMYHlFLCkkKM0S1T+U5SN0Ynh39SxcxmTPNHrTFIuieyxYgZXSDUAPpLLT2ZciVvihOh05k+JIAjoL7HtNsVFc5Rl+1hgAAIlNqGX3GEK0llMm0nZUdmhQzymg3Q9j6yO4FQsmqtQbXmZ+z+sOynUrt3nmbeXu3MYW9f8y38128LpWAVeyLMz4cTORbEDPYKHU19Oyx0OF12GIhfEx+/RRIm2RzPeIPE2yYRM7HBWBx+GvANWXAlMYcmWriz1/Tt2bk+jq7CdOzMu5zsn3zZXwg2Gu14YCBuh3NggN0DI8BbJpCXZb2I4xh+kdAmbU0IA6HYquya81nqYSk87Xgi35ur4HnxZWEvnoLrzbOEjHmJiY2JjV6I8c4ynSEsJTKcHxuWYPRFFleV2Sbi0Dsk4XmDSToXTMnUnW/PW9J9W4UCgP+h0rTi9tiJd6qQgk2lPI/KKeybAPx+c7vZHdimbruzyCP9iZvd0VuBuIniuXirHQ8oG2IThFIUI8QOhjfNMg86GH4Bv4ixLlr4BDi2wDDwXTYYTgfnBJur1nAw2yGngw96JhQo+48cMWVE8kWwcA55ZuzwkSP/mpp9D6wFm2e1Bc8cPVraL2Ng7y6KfSNHqQfTYByYMmbT73WNmwZs6m8sBR54XCndTHwvu6v+8N+Jze9/jeGd8bpoHePtMv0/9U6e78bTtf+aly55P40cNtJ3PH3U6xQ9DkRNos+Chp2TpNwX4lZOwkTa4nOLPxpMLc8Sm0srSwD6Y1KW7ftPZ68x3DWS8d4cJbAKE6QJEfRrhAafMLV0RoCRLhKdBaJzNtzPD7dxLIgZ7Al4006exyHEYXMewjqApFokPRIu9FvLiPf96uWlpuZmRZKiH1i0OCNj1ar7zSDqYiRbCQsMrKUXZswxBkQEbCmv2RJgKK82+UcGbpk+0woVSxekQrYCzp4Hk30E3oHhAh+4fLcOPCfzOVu3cvKkHAWzNAVyjAyOQsrJix47n0OZpbTUDKdJp8CZs+BkAKfMnDkF+kJmmrcN4OSZs8CRuwZ+N76gampCxtj83XWO5X1GYc7hIypq+N32eTe6Wr/GfXW5GukBLnvJ1gEPhlmsuUHzg3Osp/vJCZ4flGsFf27fjV18spjdTfQUuVANcgldRA3hKhSUutCGgGhDaMo0tXMHwiUq3gG5entO2xmnECa3H53AjRpKFFYIK7qrHjMJ75sEC91BPlGc0TlZY9qlsdcuZaXy0D3hfz4cmLd2WzbK3Xhhdw7c2VLCxtxsFCMEo8bArEww9ruOrc5joK9g1xp85MghQ4wyuPV71+/tMVxAMmzA1lSt+WmbjFkwL/lV6az7APzZ5qvVmmy7b1bJGrTDhmRfMBYbWMZmNOu3bJdPlLL/5WOR2XZCTJpmU4mx8lv9Fg76T8NagO4vUacJ+n/Sr0b/LYb8+1z5QCb935a0m6WWYXzwh4DO2Sa9g2jEnJ6tYwTU5jp7N2RmaHkn/gjEb/fXpmpXbkpAGaAv7pnKAfdc6bg4GZx1L3QuQ8lVC3BvXbC8f2eHQEqkBuc9aO6h9849M3oPucrgAyQY/HEv7PYJJQy23Ft3/R+xczqmsHWDgrDCyzfcl1o5ehKxnUOr5Bm6NhTGR4u1rtDEvlZ8dGgklLeNCk3ZbeKaO0bkcMfoKt+6ng/DUPPI6AAlDXlE0dzwsKPadkjqKjDXGEgg4b2CK7vx65M0xSlPmNsOA58/g1xWSDDKeq/KV5AR89+zc6OGjKSKtxUqR4NtF47VuMZemcTBDQxGqzqqrXIMCnm2xkXq1QJIIkO8EpmROcOkIyevYmhUqurWBmgCe4U5WJFHiiLKqKKOJtrooo8hxphihl6g5bGv3MAXkfBvPaFbVq6ga4Uq+wWdEfo6NVTmr1oVkYoye2NvfCWLmYQx0sjozFSxszhZ4Ctjb7QtavLQDNa0L5HRZQYJYxrNLbJR4QhZvOV46Fm/lqB428nsrJSx/OwbEgYA") format("woff2");
  19. }
  20. .icon {
  21.   font-family: "HMfont-home" !important;
  22.   font-size: 56rpx;
  23.   font-style: normal;
  24.   color: #333;
  25. }
  26. .icon.biaoqing:before {
  27.   content: "\e797";
  28. }
  29. .icon.jianpan:before {
  30.   content: "\e7b2";
  31. }
  32. .icon.yuyin:before {
  33.   content: "\e805";
  34. }
  35. .icon.tupian:before {
  36.   content: "\e639";
  37. }
  38. .icon.chehui:before {
  39.   content: "\e904";
  40. }
  41. .icon.luyin:before {
  42.   content: "\e905";
  43. }
  44. .icon.luyin2:before {
  45.   content: "\e677";
  46. }
  47. .icon.other-voice:before {
  48.   content: "\e667";
  49. }
  50. .icon.my-voice:before {
  51.   content: "\e906";
  52. }
  53. .icon.hongbao:before {
  54.   content: "\e626";
  55. }
  56. .icon.tupian2:before {
  57.   content: "\e674";
  58. }
  59. .icon.paizhao:before {
  60.   content: "\e63e";
  61. }
  62. .icon.add:before {
  63.   content: "\e655";
  64. }
  65. .icon.close:before {
  66.   content: "\e607";
  67. }
  68. .icon.to:before {
  69.   content: "\e675";
  70. }
  71. .hidden {
  72.   display: none !important;
  73. }
  74. .popup-layer {
  75.   transition: all .15s linear;
  76.   width: 100%;
  77.   height: 42vw;
  78.   padding: 20rpx 2%;
  79.   background-color: #f3f3f3;
  80.   border-top: solid 1rpx #ddd;
  81.   position: fixed;
  82.   z-index: 20;
  83.   top: 100%;
  84.   box-sizing: border-box;
  85. }
  86. .popup-layer.showLayer {
  87.   -webkit-transform: translate3d(0, -43vw, 0);
  88.           transform: translate3d(0, -43vw, 0);
  89. }
  90. .popup-layer .emoji-swiper {
  91.   height: 40vw;
  92. }
  93. .popup-layer .emoji-swiper swiper-item {
  94.   display: flex;
  95.   align-content: flex-start;
  96.   flex-wrap: wrap;
  97. }
  98. .popup-layer .emoji-swiper swiper-item view {
  99.   width: 12vw;
  100.   height: 12vw;
  101.   display: flex;
  102.   justify-content: center;
  103.   align-items: center;
  104. }
  105. .popup-layer .emoji-swiper swiper-item view image {
  106.   width: 8.4vw;
  107.   height: 8.4vw;
  108. }
  109. .popup-layer .more-layer {
  110.   width: 100%;
  111.   height: 42vw;
  112. }
  113. .popup-layer .more-layer .list {
  114.   width: 100%;
  115.   display: flex;
  116.   flex-wrap: wrap;
  117. }
  118. .popup-layer .more-layer .list .box {
  119.   width: 18vw;
  120.   height: 18vw;
  121.   border-radius: 20rpx;
  122.   background-color: #fff;
  123.   display: flex;
  124.   justify-content: center;
  125.   align-items: center;
  126.   margin: 0 3vw 2vw 3vw;
  127. }
  128. .popup-layer .more-layer .list .box .icon {
  129.   font-size: 70rpx;
  130. }
  131. .input-box {
  132.   width: 100%;
  133.   min-height: 100rpx;
  134.   padding: 0 1%;
  135.   background-color: #f2f2f2;
  136.   display: flex;
  137.   position: fixed;
  138.   z-index: 20;
  139.   bottom: -2rpx;
  140.   transition: all .15s linear;
  141.   border-bottom: solid 1rpx #ddd;
  142. }
  143. .input-box.showLayer {
  144.   -webkit-transform: translate3d(0, -43vw, 0);
  145.           transform: translate3d(0, -43vw, 0);
  146. }
  147. .input-box .voice, .input-box .more {
  148.   flex-shrink: 0;
  149.   width: 90rpx;
  150.   height: 100rpx;
  151.   display: flex;
  152.   justify-content: center;
  153.   align-items: center;
  154. }
  155. .input-box .send {
  156.   flex-shrink: 0;
  157.   width: 100rpx;
  158.   height: 100rpx;
  159.   display: flex;
  160.   align-items: center;
  161. }
  162. .input-box .send .btn {
  163.   width: 90rpx;
  164.   height: 56rpx;
  165.   display: flex;
  166.   justify-content: center;
  167.   align-items: center;
  168.   background: linear-gradient(to right, #f09b37, #eb632c);
  169.   color: #fff;
  170.   border-radius: 6rpx;
  171.   font-size: 24rpx;
  172. }
  173. .input-box .textbox {
  174.   width: 100%;
  175.   min-height: 70rpx;
  176. }
  177. .input-box .textbox .voice-mode {
  178.   width: calc(100% - 2rpx);
  179.   height: 68rpx;
  180.   border-radius: 70rpx;
  181.   border: solid 1rpx #cdcdcd;
  182.   display: flex;
  183.   justify-content: center;
  184.   align-items: center;
  185.   font-size: 28rpx;
  186.   background-color: #fff;
  187.   color: #555;
  188. }
  189. .input-box .textbox .voice-mode.recording {
  190.   background-color: #e5e5e5;
  191. }
  192. .input-box .textbox .text-mode {
  193.   width: 100%;
  194.   min-height: 70rpx;
  195.   display: flex;
  196.   background-color: #fff;
  197.   border-radius: 40rpx;
  198. }
  199. .input-box .textbox .text-mode .box {
  200.   width: 100%;
  201.   padding-left: 30rpx;
  202.   min-height: 70rpx;
  203.   display: flex;
  204.   align-items: center;
  205. }
  206. .input-box .textbox .text-mode .box textarea {
  207.   width: 100%;
  208. }
  209. .input-box .textbox .text-mode .em {
  210.   flex-shrink: 0;
  211.   width: 80rpx;
  212.   padding-left: 10rpx;
  213.   height: 70rpx;
  214.   display: flex;
  215.   justify-content: center;
  216.   align-items: center;
  217. }
  218. .record {
  219.   width: 40vw;
  220.   height: 40vw;
  221.   position: fixed;
  222.   top: 55%;
  223.   left: 30%;
  224.   background-color: rgba(0, 0, 0, 0.6);
  225.   border-radius: 20rpx;
  226. }
  227. .record .ing {
  228.   width: 100%;
  229.   height: 30vw;
  230.   display: flex;
  231.   justify-content: center;
  232.   align-items: center;
  233. }
  234. @-webkit-keyframes volatility {
  235. 0% {
  236.     background-position: 0% 130%;
  237. }
  238. 20% {
  239.     background-position: 0% 150%;
  240. }
  241. 30% {
  242.     background-position: 0% 155%;
  243. }
  244. 40% {
  245.     background-position: 0% 150%;
  246. }
  247. 50% {
  248.     background-position: 0% 145%;
  249. }
  250. 70% {
  251.     background-position: 0% 150%;
  252. }
  253. 80% {
  254.     background-position: 0% 155%;
  255. }
  256. 90% {
  257.     background-position: 0% 140%;
  258. }
  259. 100% {
  260.     background-position: 0% 135%;
  261. }
  262. }
  263. @keyframes volatility {
  264. 0% {
  265.     background-position: 0% 130%;
  266. }
  267. 20% {
  268.     background-position: 0% 150%;
  269. }
  270. 30% {
  271.     background-position: 0% 155%;
  272. }
  273. 40% {
  274.     background-position: 0% 150%;
  275. }
  276. 50% {
  277.     background-position: 0% 145%;
  278. }
  279. 70% {
  280.     background-position: 0% 150%;
  281. }
  282. 80% {
  283.     background-position: 0% 155%;
  284. }
  285. 90% {
  286.     background-position: 0% 140%;
  287. }
  288. 100% {
  289.     background-position: 0% 135%;
  290. }
  291. }
  292. .record .ing .icon {
  293.   background-image: linear-gradient(to bottom, #f09b37, #fff 50%);
  294.   background-size: 100% 200%;
  295.   -webkit-animation: volatility 1.5s ease-in-out -1.5s infinite alternate;
  296.           animation: volatility 1.5s ease-in-out -1.5s infinite alternate;
  297.   -webkit-background-clip: text;
  298.   -webkit-text-fill-color: transparent;
  299.   font-size: 150rpx;
  300.   color: #f09b37;
  301. }
  302. .record .cancel {
  303.   width: 100%;
  304.   height: 30vw;
  305.   display: flex;
  306.   justify-content: center;
  307.   align-items: center;
  308. }
  309. .record .cancel .icon {
  310.   color: #fff;
  311.   font-size: 150rpx;
  312. }
  313. .record .tis {
  314.   width: 100%;
  315.   height: 10vw;
  316.   display: flex;
  317.   justify-content: center;
  318.   font-size: 28rpx;
  319.   color: #fff;
  320. }
  321. .record .tis.change {
  322.   color: #f09b37;
  323. }
  324. .content {
  325.   width: 100%;
  326. }
  327. .content .msg-list {
  328.   width: 100%;
  329.   padding: 0 2%;
  330.   position: absolute;
  331.   top: 0;
  332.   bottom: 100rpx;
  333.   padding-bottom: calc(env(safe-area-inset-bottom) / 2);
  334.   box-sizing: border-box;
  335. }
  336. .content .msg-list .loading {
  337.   display: flex;
  338.   justify-content: center;
  339. }
  340. @-webkit-keyframes stretchdelay {
  341. 0%, 40%, 100% {
  342.     -webkit-transform: scaleY(0.6);
  343.             transform: scaleY(0.6);
  344. }
  345. 20% {
  346.     -webkit-transform: scaleY(1);
  347.             transform: scaleY(1);
  348. }
  349. }
  350. @keyframes stretchdelay {
  351. 0%, 40%, 100% {
  352.     -webkit-transform: scaleY(0.6);
  353.             transform: scaleY(0.6);
  354. }
  355. 20% {
  356.     -webkit-transform: scaleY(1);
  357.             transform: scaleY(1);
  358. }
  359. }
  360. .content .msg-list .loading .spinner {
  361.   margin: 20rpx 0;
  362.   width: 60rpx;
  363.   height: 100rpx;
  364.   display: flex;
  365.   align-items: center;
  366.   justify-content: space-between;
  367. }
  368. .content .msg-list .loading .spinner view {
  369.   background-color: #f06c7a;
  370.   height: 50rpx;
  371.   width: 6rpx;
  372.   border-radius: 6rpx;
  373.   -webkit-animation: stretchdelay 1.2s infinite ease-in-out;
  374.           animation: stretchdelay 1.2s infinite ease-in-out;
  375. }
  376. .content .msg-list .loading .spinner .rect2 {
  377.   -webkit-animation-delay: -1.1s;
  378.           animation-delay: -1.1s;
  379. }
  380. .content .msg-list .loading .spinner .rect3 {
  381.   -webkit-animation-delay: -1.0s;
  382.           animation-delay: -1.0s;
  383. }
  384. .content .msg-list .loading .spinner .rect4 {
  385.   -webkit-animation-delay: -0.9s;
  386.           animation-delay: -0.9s;
  387. }
  388. .content .msg-list .loading .spinner .rect5 {
  389.   -webkit-animation-delay: -0.8s;
  390.           animation-delay: -0.8s;
  391. }
  392. .content .msg-list .row {
  393.   padding: 20rpx 0;
  394. }
  395. .content .msg-list .row .system {
  396.   display: flex;
  397.   justify-content: center;
  398. }
  399. .content .msg-list .row .system view {
  400.   padding: 0 30rpx;
  401.   height: 50rpx;
  402.   display: flex;
  403.   justify-content: center;
  404.   align-items: center;
  405.   background-color: #c9c9c9;
  406.   color: #fff;
  407.   font-size: 24rpx;
  408.   border-radius: 40rpx;
  409. }
  410. .content .msg-list .row .system .red-envelope image {
  411.   margin-right: 5rpx;
  412.   width: 30rpx;
  413.   height: 30rpx;
  414. }
  415. .content .msg-list .row:first-child {
  416.   margin-top: 20rpx;
  417. }
  418. .content .msg-list .row .my .left, .content .msg-list .row .other .right {
  419.   width: 100%;
  420.   display: flex;
  421. }
  422. .content .msg-list .row .my .left .bubble, .content .msg-list .row .other .right .bubble {
  423.   max-width: 70%;
  424.   min-height: 50rpx;
  425.   border-radius: 10rpx;
  426.   padding: 15rpx 20rpx;
  427.   display: flex;
  428.   align-items: center;
  429.   font-size: 32rpx;
  430.   word-break: break-word;
  431. }
  432. .content .msg-list .row .my .left .bubble.img, .content .msg-list .row .other .right .bubble.img {
  433.   background-color: transparent;
  434.   padding: 0;
  435.   overflow: hidden;
  436. }
  437. .content .msg-list .row .my .left .bubble.img image, .content .msg-list .row .other .right .bubble.img image {
  438.   max-width: 350rpx;
  439.   max-height: 350rpx;
  440. }
  441. .content .msg-list .row .my .left .bubble.red-envelope, .content .msg-list .row .other .right .bubble.red-envelope {
  442.   background-color: transparent;
  443.   padding: 0;
  444.   overflow: hidden;
  445.   position: relative;
  446.   justify-content: center;
  447.   align-items: flex-start;
  448. }
  449. .content .msg-list .row .my .left .bubble.red-envelope image, .content .msg-list .row .other .right .bubble.red-envelope image {
  450.   width: 250rpx;
  451.   height: 313rpx;
  452. }
  453. .content .msg-list .row .my .left .bubble.red-envelope .tis, .content .msg-list .row .other .right .bubble.red-envelope .tis {
  454.   position: absolute;
  455.   top: 6%;
  456.   font-size: 26rpx;
  457.   color: #9c1712;
  458. }
  459. .content .msg-list .row .my .left .bubble.red-envelope .blessing, .content .msg-list .row .other .right .bubble.red-envelope .blessing {
  460.   position: absolute;
  461.   bottom: 14%;
  462.   color: #e9b874;
  463.   width: 80%;
  464.   text-align: center;
  465.   overflow: hidden;
  466.   display: -webkit-box;
  467.   -webkit-box-orient: vertical;
  468.   -webkit-line-clamp: 2;
  469. }
  470. .content .msg-list .row .my .left .bubble.voice .icon, .content .msg-list .row .other .right .bubble.voice .icon {
  471.   font-size: 40rpx;
  472.   display: flex;
  473.   align-items: center;
  474. }
  475. .content .msg-list .row .my .left .bubble.voice .icon:after, .content .msg-list .row .other .right .bubble.voice .icon:after {
  476.   content: " ";
  477.   width: 53rpx;
  478.   height: 53rpx;
  479.   border-radius: 100%;
  480.   position: absolute;
  481.   box-sizing: border-box;
  482. }
  483. .content .msg-list .row .my .left .bubble.voice .length, .content .msg-list .row .other .right .bubble.voice .length {
  484.   font-size: 28rpx;
  485. }
  486. .content .msg-list .row .my .right, .content .msg-list .row .other .left {
  487.   flex-shrink: 0;
  488.   width: 80rpx;
  489.   height: 80rpx;
  490. }
  491. .content .msg-list .row .my .right image, .content .msg-list .row .other .left image {
  492.   width: 80rpx;
  493.   height: 80rpx;
  494.   border-radius: 10rpx;
  495. }
  496. .content .msg-list .row .my {
  497.   width: 100%;
  498.   display: flex;
  499.   justify-content: flex-end;
  500. }
  501. .content .msg-list .row .my .left {
  502.   min-height: 80rpx;
  503.   align-items: center;
  504.   justify-content: flex-end;
  505. }
  506. .content .msg-list .row .my .left .bubble {
  507.   background-color: #f06c7a;
  508.   color: #fff;
  509. }
  510. .content .msg-list .row .my .left .bubble.voice .icon {
  511.   color: #fff;
  512. }
  513. .content .msg-list .row .my .left .bubble.voice .length {
  514.   margin-right: 20rpx;
  515. }
  516. @-webkit-keyframes my-play {
  517. 0% {
  518.     -webkit-transform: translateX(80%);
  519.             transform: translateX(80%);
  520. }
  521. 100% {
  522.     -webkit-transform: translateX(0%);
  523.             transform: translateX(0%);
  524. }
  525. }
  526. @keyframes my-play {
  527. 0% {
  528.     -webkit-transform: translateX(80%);
  529.             transform: translateX(80%);
  530. }
  531. 100% {
  532.     -webkit-transform: translateX(0%);
  533.             transform: translateX(0%);
  534. }
  535. }
  536. .content .msg-list .row .my .left .bubble.play .icon:after {
  537.   border-left: solid 10rpx rgba(240, 108, 122, 0.5);
  538.   -webkit-animation: my-play 1s linear infinite;
  539.           animation: my-play 1s linear infinite;
  540. }
  541. .content .msg-list .row .my .right {
  542.   margin-left: 15rpx;
  543. }
  544. .content .msg-list .row .other {
  545.   width: 100%;
  546.   display: flex;
  547. }
  548. .content .msg-list .row .other .left {
  549.   margin-right: 15rpx;
  550. }
  551. .content .msg-list .row .other .right {
  552.   flex-wrap: wrap;
  553. }
  554. .content .msg-list .row .other .right .username {
  555.   width: 100%;
  556.   height: 45rpx;
  557.   line-height: 30rpx;
  558.   font-size: 24rpx;
  559.   color: #999;
  560.   display: flex;
  561. }
  562. .content .msg-list .row .other .right .username .name {
  563.   margin-right: 50rpx;
  564. }
  565. .content .msg-list .row .other .right .bubble {
  566.   background-color: #fff;
  567.   color: #333;
  568. }
  569. .content .msg-list .row .other .right .bubble.voice .icon {
  570.   color: #333;
  571. }
  572. .content .msg-list .row .other .right .bubble.voice .length {
  573.   margin-left: 20rpx;
  574. }
  575. @-webkit-keyframes other-play {
  576. 0% {
  577.     -webkit-transform: translateX(-80%);
  578.             transform: translateX(-80%);
  579. }
  580. 100% {
  581.     -webkit-transform: translateX(0%);
  582.             transform: translateX(0%);
  583. }
  584. }
  585. @keyframes other-play {
  586. 0% {
  587.     -webkit-transform: translateX(-80%);
  588.             transform: translateX(-80%);
  589. }
  590. 100% {
  591.     -webkit-transform: translateX(0%);
  592.             transform: translateX(0%);
  593. }
  594. }
  595. .content .msg-list .row .other .right .bubble.play .icon:after {
  596.   border-right: solid 10rpx rgba(255, 255, 255, 0.8);
  597.   -webkit-animation: other-play 1s linear infinite;
  598.           animation: other-play 1s linear infinite;
  599. }
  600. .windows .mask {
  601.   position: fixed;
  602.   top: 100%;
  603.   width: 100%;
  604.   height: 100%;
  605.   z-index: 1000;
  606.   background-color: rgba(0, 0, 0, 0.6);
  607.   opacity: 0;
  608.   transition: opacity .2s ease-out;
  609. }
  610. .windows .layer {
  611.   position: fixed;
  612.   width: 80%;
  613.   height: 70%;
  614.   left: 10%;
  615.   z-index: 1001;
  616.   border-radius: 20rpx;
  617.   overflow: hidden;
  618.   top: 100%;
  619.   -webkit-transform: scale3d(0.5, 0.5, 1);
  620.           transform: scale3d(0.5, 0.5, 1);
  621.   transition: all .2s ease-out;
  622. }
  623. .windows.show {
  624.   display: block;
  625. }
  626. .windows.show .mask {
  627.   top: 0;
  628.   opacity: 1;
  629. }
  630. .windows.show .layer {
  631.   -webkit-transform: translate3d(0, -85vh, 0) scale3d(1, 1, 1);
  632.           transform: translate3d(0, -85vh, 0) scale3d(1, 1, 1);
  633. }
  634. .windows.hide {
  635.   display: block;
  636. }
  637. .windows.hide .mask {
  638.   top: 0;
  639.   opacity: 0;
  640. }
  641. .open-redenvelope {
  642.   width: 100%;
  643.   height: 70vh;
  644.   background-color: #cf3c35;
  645.   position: relative;
  646. }
  647. .open-redenvelope .top {
  648.   width: 100%;
  649.   background-color: #fe5454;
  650.   display: flex;
  651.   justify-content: center;
  652.   flex-wrap: wrap;
  653.   border-radius: 0 0 100% 100%;
  654.   box-shadow: inset 0 -20rpx 0 #9c1712;
  655.   margin-bottom: 65rpx;
  656. }
  657. .open-redenvelope .top .close-btn {
  658.   width: 100%;
  659.   height: 80rpx;
  660.   display: flex;
  661.   justify-content: flex-end;
  662.   margin-bottom: 30rpx;
  663. }
  664. .open-redenvelope .top .close-btn .icon {
  665.   color: #9c1712;
  666.   margin-top: 10rpx;
  667.   margin-right: 10rpx;
  668. }
  669. .open-redenvelope .top image {
  670.   width: 130rpx;
  671.   height: 130rpx;
  672.   border: solid 12rpx #cf3c35;
  673.   border-radius: 100%;
  674.   margin-bottom: -65rpx;
  675. }
  676. .open-redenvelope .from, .open-redenvelope .blessing, .open-redenvelope .money, .open-redenvelope .showDetails {
  677.   width: 100%;
  678.   padding: 5rpx 5%;
  679.   display: flex;
  680.   justify-content: center;
  681.   font-size: 32rpx;
  682.   color: #fff;
  683. }
  684. .open-redenvelope .money {
  685.   font-size: 100rpx;
  686.   color: #f8d757;
  687.   display: flex;
  688.   padding-top: 20rpx;
  689. }
  690. .open-redenvelope .showDetails {
  691.   position: absolute;
  692.   bottom: 20rpx;
  693.   align-items: center;
  694.   font-size: 28rpx;
  695.   color: #f8d757;
  696. }
  697. .open-redenvelope .showDetails .icon {
  698.   font-size: 26rpx;
  699.   color: #f8d757;
  700. }
  701. .content .showLayer {
  702.   -webkit-transform: translate3d(0, -43vw, 0);
  703.           transform: translate3d(0, -43vw, 0);
  704. }


复制代码



JS代码:


  1. // author Lin 2022/2/16
  2. let {TIM,webIm} = require('../../utils/tim-aggregate');

  3. Page({

  4.     data: {
  5.         //文字消息
  6.         textMsg: '',
  7.         //消息列表
  8.         isHistoryLoading: false,
  9.         scrollAnimation: false,
  10.         scrollTop: 0,
  11.         scrollToView: '',
  12.         msgList: [],
  13.         msgImgList: [],
  14.         myuid: 0,

  15.         //录音相关参数
  16.         //H5不能录音
  17.         RECORDER: '',
  18.         isVoice: false,
  19.         voiceTis: '按住 说话',
  20.         recordTis: "手指上滑 取消发送",
  21.         recording: false,
  22.         willStop: false,
  23.         initPoint: {
  24.             identifier: 0,
  25.             Y: 0
  26.         },
  27.         recordTimer: null,
  28.         recordLength: 0,

  29.         //播放语音相关参数
  30.         AUDIO: '',
  31.         playMsgid: null,
  32.         VoiceTimer: null,
  33.         // 抽屉参数
  34.         popupLayerClass: '',
  35.         // more参数
  36.         hideMore: true,
  37.         //表情定义
  38.         hideEmoji: true,
  39.         emojiList: [
  40.             [{
  41.                 "url": "1.png",
  42.                 alt: "[微笑]"
  43.             }, {
  44.                 "url": "2.png",
  45.                 alt: "[生气]"
  46.             }, {
  47.                 "url": "3.png",
  48.                 alt: "[坏笑]"
  49.             }, {
  50.                 "url": "4.png",
  51.                 alt: "[难受]"
  52.             }, {
  53.                 "url": "5.png",
  54.                 alt: "[困]"
  55.             }, {
  56.                 "url": "6.png",
  57.                 alt: "[偷看]"
  58.             }, {
  59.                 "url": "7.png",
  60.                 alt: "[难过]"
  61.             }, {
  62.                 "url": "8.png",
  63.                 alt: "[斜眼]"
  64.             }, {
  65.                 "url": "9.png",
  66.                 alt: "[委屈]"
  67.             }, {
  68.                 "url": "10.png",
  69.                 alt: "[害羞]"
  70.             }, {
  71.                 "url": "11.png",
  72.                 alt: "[裂开]"
  73.             }, {
  74.                 "url": "12.png",
  75.                 alt: "[偷笑]"
  76.             }, {
  77.                 "url": "13.png",
  78.                 alt: "[痛苦]"
  79.             }, {
  80.                 "url": "14.png",
  81.                 alt: "[白眼]"
  82.             }, {
  83.                 "url": "15.png",
  84.                 alt: "[丑]"
  85.             }, {
  86.                 "url": "16.png",
  87.                 alt: "[哇哇哭]"
  88.             }, {
  89.                 "url": "17.png",
  90.                 alt: "[笑嘻嘻]"
  91.             }, {
  92.                 "url": "18.png",
  93.                 alt: "[盯着你]"
  94.             }, {
  95.                 "url": "19.png",
  96.                 alt: "[啊哈]"
  97.             }, {
  98.                 "url": "20.png",
  99.                 alt: "[吃瓜]"
  100.             }, {
  101.                 "url": "21.png",
  102.                 alt: "[哦吼]"
  103.             }, {
  104.                 "url": "22.png",
  105.                 alt: "[哭死]"
  106.             }, {
  107.                 "url": "23.png",
  108.                 alt: "[打脸]"
  109.             }, {
  110.                 "url": "24.png",
  111.                 alt: "[斗鸡眼]"
  112.             }],
  113.             [{
  114.                 "url": "25.png",
  115.                 alt: "[发呆]"
  116.             }, {
  117.                 "url": "26.png",
  118.                 alt: "[憨笑]"
  119.             }, {
  120.                 "url": "27.png",
  121.                 alt: "[无语]"
  122.             }, {
  123.                 "url": "28.png",
  124.                 alt: "[鸡贼]"
  125.             }, {
  126.                 "url": "29.png",
  127.                 alt: "[大无语]"
  128.             }, {
  129.                 "url": "30.png",
  130.                 alt: "[哭吐了]"
  131.             }, {
  132.                 "url": "31.png",
  133.                 alt: "[呲牙笑]"
  134.             }, {
  135.                 "url": "32.png",
  136.                 alt: "[奸笑]"
  137.             }, {
  138.                 "url": "33.png",
  139.                 alt: "[啊啊啊]"
  140.             }, {
  141.                 "url": "34.png",
  142.                 alt: "[哈嘿]"
  143.             }, {
  144.                 "url": "35.png",
  145.                 alt: "[惊讶]"
  146.             }, {
  147.                 "url": "36.png",
  148.                 alt: "[指你]"
  149.             }, {
  150.                 "url": "37.png",
  151.                 alt: "[可爱型]"
  152.             }, {
  153.                 "url": "38.png",
  154.                 alt: "[快哭了]"
  155.             }, {
  156.                 "url": "39.png",
  157.                 alt: "[抠鼻屎]"
  158.             }, {
  159.                 "url": "40.png",
  160.                 alt: "[酷酷]"
  161.             }, {
  162.                 "url": "41.png",
  163.                 alt: "[笑汗]"
  164.             }, {
  165.                 "url": "42.png",
  166.                 alt: "[算命]"
  167.             }, {
  168.                 "url": "43.png",
  169.                 alt: "[红脸坏笑]"
  170.             }, {
  171.                 "url": "44.png",
  172.                 alt: "[委屈死了]"
  173.             }, {
  174.                 "url": "45.png",
  175.                 alt: "[爆炸]"
  176.             }, {
  177.                 "url": "46.png",
  178.                 alt: "[吐了]"
  179.             }, {
  180.                 "url": "47.png",
  181.                 alt: "[么么哒]"
  182.             }, {
  183.                 "url": "48.png",
  184.                 alt: "[吐血]"
  185.             }],
  186.             [{
  187.                 "url": "49.png",
  188.                 alt: "[面无表情]"
  189.             }, {
  190.                 "url": "50.png",
  191.                 alt: "[捂嘴吐]"
  192.             }, {
  193.                 "url": "51.png",
  194.                 alt: "[斜眼看]"
  195.             }, {
  196.                 "url": "52.png",
  197.                 alt: "[花痴]"
  198.             }, {
  199.                 "url": "53.png",
  200.                 alt: "[被打]"
  201.             }, {
  202.                 "url": "54.png",
  203.                 alt: "[瞌睡]"
  204.             }, {
  205.                 "url": "55.png",
  206.                 alt: "[冥想]"
  207.             }, {
  208.                 "url": "56.png",
  209.                 alt: "[俏皮]"
  210.             }, {
  211.                 "url": "57.png",
  212.                 alt: "[戳手委屈]"
  213.             }, {
  214.                 "url": "58.png",
  215.                 alt: "[端庄]"
  216.             }, {
  217.                 "url": "59.png",
  218.                 alt: "[emmm]"
  219.             }, {
  220.                 "url": "60.png",
  221.                 alt: "[欢呼]"
  222.             }, {
  223.                 "url": "61.png",
  224.                 alt: "[笑哭了]"
  225.             }, {
  226.                 "url": "62.png",
  227.                 alt: "[抱抱]"
  228.             }, {
  229.                 "url": "63.png",
  230.                 alt: "[闭眼笑]"
  231.             }, {
  232.                 "url": "64.png",
  233.                 alt: "[捂嘴微笑]"
  234.             }, {
  235.                 "url": "65.png",
  236.                 alt: "[笑哭2]"
  237.             }, {
  238.                 "url": "66.png",
  239.                 alt: "[笑嘻嘻]"
  240.             }, {
  241.                 "url": "67.png",
  242.                 alt: "[笑露齿]"
  243.             }, {
  244.                 "url": "68.png",
  245.                 alt: "[阴脸笑]"
  246.             }, {
  247.                 "url": "69.png",
  248.                 alt: "[问号脸]"
  249.             }, {
  250.                 "url": "70.png",
  251.                 alt: "[拜拜]"
  252.             }, {
  253.                 "url": "71.png",
  254.                 alt: "[难受2]"
  255.             }, {
  256.                 "url": "72.png",
  257.                 alt: "[傻笑2]"
  258.             }],
  259.             [{
  260.                 "url": "73.png",
  261.                 alt: "[爆炸2]"
  262.             }, {
  263.                 "url": "74.png",
  264.                 alt: "[二哈]"
  265.             }, {
  266.                 "url": "75.png",
  267.                 alt: "[二哈吐舌]"
  268.             }, {
  269.                 "url": "76.png",
  270.                 alt: "[狗狗笑哭]"
  271.             }, {
  272.                 "url": "77.png",
  273.                 alt: "[狗狗绿帽]"
  274.             }, {
  275.                 "url": "78.png",
  276.                 alt: "[狗狗张嘴]"
  277.             }, {
  278.                 "url": "79.png",
  279.                 alt: "[狗狗绿扇]"
  280.             }, {
  281.                 "url": "80.png",
  282.                 alt: "[狗狗]"
  283.             }, {
  284.                 "url": "81.png",
  285.                 alt: "[猫咪]"
  286.             }, {
  287.                 "url": "82.png",
  288.                 alt: "[牛啊]"
  289.             }, {
  290.                 "url": "83.png",
  291.                 alt: "[爱心]"
  292.             }, {
  293.                 "url": "84.png",
  294.                 alt: "[心裂开]"
  295.             }, {
  296.                 "url": "85.png",
  297.                 alt: "[玫瑰花]"
  298.             }, {
  299.                 "url": "86.png",
  300.                 alt: "[枯萎]"
  301.             }, {
  302.                 "url": "87.png",
  303.                 alt: "[棒]"
  304.             }, {
  305.                 "url": "88.png",
  306.                 alt: "[差]"
  307.             }, {
  308.                 "url": "89.png",
  309.                 alt: "[红药]"
  310.             }, {
  311.                 "url": "90.png",
  312.                 alt: "[绿药]"
  313.             }, {
  314.                 "url": "91.png",
  315.                 alt: "[抱拳]"
  316.             }, {
  317.                 "url": "92.png",
  318.                 alt: "[ok]"
  319.             }, {
  320.                 "url": "93.png",
  321.                 alt: "[pk]"
  322.             }, {
  323.                 "url": "94.png",
  324.                 alt: "[绿帽子]"
  325.             }, {
  326.                 "url": "95.png",
  327.                 alt: "[菜刀]"
  328.             }]
  329.         ],
  330.         //表情图片图床名称 ,由于我上传的第三方图床名称会有改变,所以有此数据来做对应,您实际应用中应该不需要
  331.         onlineEmoji: {
  332.             "1.png": "1.png",
  333.             "2.png": "2.png",
  334.             "3.png": "3.png",
  335.             "4.png": "4.png",
  336.             "5.png": "5.png",
  337.             "6.png": "6.png",
  338.             "7.png": "7.png",
  339.             "8.png": "8.png",
  340.             "9.png": "9.png",
  341.             "10.png": "10.png",
  342.             "11.png": "11.png",
  343.             "12.png": "12.png",

  344.             "13.png": "13.png",
  345.             "14.png": "14.png",
  346.             "15.png": "15.png",
  347.             "16.png": "16.png",
  348.             "17.png": "17.png",
  349.             "18.png": "18.png",
  350.             "19.png": "19.png",
  351.             "20.png": "20.png",
  352.             "21.png": "21.png",
  353.             "22.png": "22.png",
  354.             "23.png": "23.png",
  355.             "24.png": "24.png",

  356.             "25.png": "25.png",
  357.             "26.png": "26.png",
  358.             "27.png": "27.png",
  359.             "28.png": "28.png",
  360.             "29.png": "29.png",
  361.             "30.png": "30.png",
  362.             "31.png": "31.png",
  363.             "32.png": "32.png",
  364.             "33.png": "33.png",
  365.             "34.png": "34.png",
  366.             "35.png": "35.png",
  367.             "36.png": "36.png",

  368.             "37.png": "37.png",
  369.             "38.png": "38.png",
  370.             "39.png": "39.png",
  371.             "40.png": "40.png",
  372.             "41.png": "41.png",
  373.             "42.png": "42.png",
  374.             "43.png": "43.png",
  375.             "44.png": "44.png",
  376.             "45.png": "45.png",
  377.             "46.png": "46.png",
  378.             "47.png": "47.png",
  379.             "48.png": "48.png",

  380.             "49.png": "49.png",
  381.             "50.png": "50.png",
  382.             "51.png": "51.png",
  383.             "52.png": "52.png",
  384.             "53.png": "53.png",
  385.             "54.png": "54.png",
  386.             "55.png": "55.png",
  387.             "56.png": "56.png",
  388.             "57.png": "57.png",
  389.             "58.png": "58.png",
  390.             "59.png": "59.png",
  391.             "60.png": "60.png",

  392.             "61.png": "61.png",
  393.             "62.png": "62.png",
  394.             "63.png": "63.png",
  395.             "64.png": "64.png",
  396.             "65.png": "65.png",
  397.             "66.png": "66.png",
  398.             "67.png": "67.png",
  399.             "68.png": "68.png",
  400.             "69.png": "69.png",
  401.             "70.png": "70.png",
  402.             "71.png": "71.png",
  403.             "72.png": "72.png",

  404.             "73.png": "73.png",
  405.             "74.png": "74.png",
  406.             "75.png": "75.png",
  407.             "76.png": "76.png",
  408.             "77.png": "77.png",
  409.             "78.png": "78.png",
  410.             "79.png": "79.png",
  411.             "80.png": "80.png",
  412.             "81.png": "81.png",
  413.             "82.png": "82.png",
  414.             "83.png": "83.png",
  415.             "84.png": "84.png",

  416.             "85.png": "85.png",
  417.             "86.png": "86.png",
  418.             "87.png": "87.png",
  419.             "88.png": "88.png",
  420.             "89.png": "89.png",
  421.             "90.png": "90.png",
  422.             "91.png": "91.png",
  423.             "92.png": "92.png",
  424.             "93.png": "93",
  425.             "94.png": "94.png",
  426.             "95.png": "95.png"
  427.         },
  428.         //红包相关参数
  429.         windowsState: '',
  430.         redenvelopeData: {
  431.             rid: null, //红包ID
  432.             from: null,
  433.             face: null,
  434.             blessing: null,
  435.             money: null
  436.         }
  437.     },

  438.     onLoad(options) {

  439.         this.getMsgList();

  440.         this.setData({
  441.             RECORDER:wx.getRecorderManager(),
  442.             AUDIO:wx.createInnerAudioContext()
  443.         },()=>{
  444.             //语音自然播放结束
  445.             this.data.AUDIO.onEnded((res) => {
  446.                 this.setData({
  447.                     playMsgid:null
  448.                 });
  449.             });
  450.             //录音开始事件
  451.             this.data.RECORDER.onStart((e) => {
  452.                 this.recordBegin(e);
  453.             });
  454.             //录音结束事件
  455.             this.data.RECORDER.onStop((e) => {
  456.                 this.recordEnd(e);
  457.             });
  458.         });
  459.         console.log('IM参数方法集合:',TIM,webIm)

  460.         let joinGroup = webIm.joinGroup({ groupID: '@TGS#aYDESY2HY', type:TIM.TYPES.GRP_AVCHATROOM});
  461.             joinGroup.then(function(imResponse) {
  462.                 console.log(imResponse)
  463.             switch (imResponse.data.status) {
  464.                 case TIM.TYPES.JOIN_STATUS_WAIT_APPROVAL: // 等待管理员同意
  465.                 console.log('等待管理员同意')
  466.                 break;
  467.                 case TIM.TYPES.JOIN_STATUS_SUCCESS: // 加群成功
  468.                 console.log('加群成功')
  469.                 console.log(imResponse.data.group); // 加入的群组资料
  470.                 break;
  471.                 case TIM.TYPES.JOIN_STATUS_ALREADY_IN_GROUP: // 已经在群中
  472.                 console.log('已经在群中')
  473.                 break;
  474.                 default:
  475.                 break;
  476.             }
  477.             }).catch(function(imError){
  478.             console.warn('joinGroup error:', imError); // 申请加群失败的相关信息
  479.             });

  480.             setTimeout(()=>{
  481.                 let getGroupMemberList = webIm.getGroupMemberList({ groupID: '@TGS#aYDESY2HY',count: 30, offset:0});
  482.                     getGroupMemberList.then(function(imResponse) {
  483.                     console.log('群成员列表:',imResponse.data);
  484.                 }).catch(function(imError) {
  485.                     console.warn('getGroupMemberList error:', imError); // 获取群详细资料失败的相关信息
  486.                 });
  487.             },5000)

  488.     },
  489.     onShow() {
  490.         this.scrollTop = 9999999;

  491.         //模板借由本地缓存实现发红包效果,实际应用中请不要使用此方法。
  492.         wx.getStorage({
  493.             key: 'redEnvelopeData',
  494.             success: (res) => {
  495.                 console.log(res.data);
  496.                 let nowDate = new Date();
  497.                 let lastid = this.msgList[this.msgList.length - 1].msg.id;
  498.                 lastid++;
  499.                 let row = {
  500.                     type: "user",
  501.                     msg: {
  502.                         id: lastid,
  503.                         type: "redEnvelope",
  504.                         time: nowDate.getHours() + ":" + nowDate.getMinutes(),
  505.                         userinfo: {
  506.                             uid: 0,
  507.                             username: "大黑哥",
  508.                             face: "https://zhoukaiwen.com/img/kevinLogo.png"
  509.                         },
  510.                         content: {
  511.                             blessing: res.data.blessing,
  512.                             rid: Math.floor(Math.random() * 1000 + 1),
  513.                             isReceived: false
  514.                         }
  515.                     }
  516.                 };
  517.                 this.screenMsg(row);
  518.                 wx.removeStorage({
  519.                     key: 'redEnvelopeData'
  520.                 });
  521.             }
  522.         });
  523.     },
  524.     // 接受消息(筛选处理)
  525.     screenMsg(msg) {
  526.         //从长连接处转发给这个方法,进行筛选处理
  527.         if (msg.type == 'system') {
  528.             // 系统消息
  529.             switch (msg.msg.type) {
  530.                 case 'text':
  531.                     this.addSystemTextMsg(msg);
  532.                     break;
  533.                 case 'redEnvelope':
  534.                     this.addSystemRedEnvelopeMsg(msg);
  535.                     break;
  536.             }
  537.         } else if (msg.type == 'user') {
  538.             // 用户消息
  539.             switch (msg.msg.type) {
  540.                 case 'text':
  541.                     this.addTextMsg(msg);
  542.                     break;
  543.                 case 'voice':
  544.                     this.addVoiceMsg(msg);
  545.                     break;
  546.                 case 'img':
  547.                     this.addImgMsg(msg);
  548.                     break;
  549.                 case 'redEnvelope':
  550.                     this.addRedEnvelopeMsg(msg);
  551.                     break;
  552.             }
  553.             console.log('用户消息');
  554.             //非自己的消息震动
  555.             if (msg.msg.userinfo.uid != this.data.myuid) {
  556.                 console.log('振动');
  557.                 wx.vibrateLong();
  558.             }
  559.         }
  560.         this.setData({
  561.             scrollToView: 'msg' + msg.msg.id
  562.         })
  563.     },
  564.     // 消息列表
  565.     getMsgList() {
  566.         let self = this;
  567.         let msgImgList = self.data.msgImgList;
  568.         let list = [{
  569.                 type: "system",
  570.                 msg: {
  571.                     id: 0,
  572.                     type: "text",
  573.                     content: {
  574.                         text: "欢迎进入Kevin聊天室"
  575.                     }
  576.                 }
  577.             },
  578.             {
  579.                 type: "user",
  580.                 msg: {
  581.                     id: 1,
  582.                     type: "text",
  583.                     time: "12:56",
  584.                     userinfo: {
  585.                         uid: 0,
  586.                         username: "大黑哥",
  587.                         face: "https://zhoukaiwen.com/img/kevinLogo.png"
  588.                     },
  589.                     content: {
  590.                         text: "web前端开发该怎么学习?"
  591.                     }
  592.                 }
  593.             },
  594.             {
  595.                 type: "user",
  596.                 msg: {
  597.                     id: 2,
  598.                     type: "text",
  599.                     time: "12:57",
  600.                     userinfo: {
  601.                         uid: 1,
  602.                         username: "售后客服008",
  603.                         face: "https://zhoukaiwen.com/img/qdpz/face/face_2.jpg"
  604.                     },
  605.                     content: {
  606.                         text: "按照基本路线,从html、css、js三大基础开始,然后ajax、vue进阶学习,最后学习小程序、node、react。"
  607.                     }
  608.                 }
  609.             },
  610.             {
  611.                 type: "user",
  612.                 msg: {
  613.                     id: 3,
  614.                     type: "voice",
  615.                     time: "12:59",
  616.                     userinfo: {
  617.                         uid: 1,
  618.                         username: "售后客服008",
  619.                         face: "https://zhoukaiwen.com/img/qdpz/face/face_2.jpg"
  620.                     },
  621.                     content: {
  622.                         url: "/static/voice/1.mp3",
  623.                         length: "00:06"
  624.                     }
  625.                 }
  626.             },
  627.             {
  628.                 type: "user",
  629.                 msg: {
  630.                     id: 4,
  631.                     type: "voice",
  632.                     time: "13:05",
  633.                     userinfo: {
  634.                         uid: 0,
  635.                         username: "大黑哥",
  636.                         face: "https://zhoukaiwen.com/img/kevinLogo.png"
  637.                     },
  638.                     content: {
  639.                         url: "/static/voice/2.mp3",
  640.                         length: "00:06"
  641.                     }
  642.                 }
  643.             },
  644.             {
  645.                 type: "user",
  646.                 msg: {
  647.                     id: 5,
  648.                     type: "img",
  649.                     time: "13:05",
  650.                     userinfo: {
  651.                         uid: 0,
  652.                         username: "大黑哥",
  653.                         face: "https://zhoukaiwen.com/img/kevinLogo.png"
  654.                     },
  655.                     content: {
  656.                         url: "https://zhoukaiwen.com/img/Design/logo/psketch3.png",
  657.                         w: 200,
  658.                         h: 200
  659.                     }
  660.                 }
  661.             },
  662.             {
  663.                 type: "user",
  664.                 msg: {
  665.                     id: 6,
  666.                     type: "img",
  667.                     time: "12:59",
  668.                     userinfo: {
  669.                         uid: 1,
  670.                         username: "售后客服008",
  671.                         face: "https://zhoukaiwen.com/img/qdpz/face/face_2.jpg"
  672.                     },
  673.                     content: {
  674.                         url: "https://zhoukaiwen.com/img/Design/pc/ybss_jt.png",
  675.                         w: 1920,
  676.                         h: 1080
  677.                     }
  678.                 }
  679.             },
  680.             {
  681.                 type: "system",
  682.                 msg: {
  683.                     id: 7,
  684.                     type: "text",
  685.                     content: {
  686.                         text: "欢迎进入Kevin聊天室"
  687.                     }
  688.                 }
  689.             },

  690.             {
  691.                 type: "system",
  692.                 msg: {
  693.                     id: 9,
  694.                     type: "redEnvelope",
  695.                     content: {
  696.                         text: "售后客服008领取了你的红包"
  697.                     }
  698.                 }
  699.             },
  700.             {
  701.                 type: "user",
  702.                 msg: {
  703.                     id: 10,
  704.                     type: "redEnvelope",
  705.                     time: "12:56",
  706.                     userinfo: {
  707.                         uid: 0,
  708.                         username: "大黑哥",
  709.                         face: "https://zhoukaiwen.com/img/kevinLogo.png"
  710.                     },
  711.                     content: {
  712.                         blessing: "恭喜发财,大吉大利,万事如意",
  713.                         rid: 0,
  714.                         isReceived: false
  715.                     }
  716.                 }
  717.             },
  718.             {
  719.                 type: "user",
  720.                 msg: {
  721.                     id: 11,
  722.                     type: "redEnvelope",
  723.                     time: "12:56",
  724.                     userinfo: {
  725.                         uid: 1,
  726.                         username: "售后客服008",
  727.                         face: "https://zhoukaiwen.com/img/qdpz/face/face_2.jpg"
  728.                     },
  729.                     content: {
  730.                         blessing: "恭喜发财",
  731.                         rid: 1,
  732.                         isReceived: false
  733.                     }
  734.                 }
  735.             },
  736.         ]
  737.         // 获取消息中的图片,并处理显示尺寸
  738.         for (let i = 0; i < list.length; i++) {
  739.             if (list[i].type == 'user' && list[i].msg.type == "img") {
  740.                 list[i].msg.content = self.setPicSize(list[i].msg.content);

  741.                 msgImgList.push(list[i].msg.content.url);

  742.                 self.setData({
  743.                     msgImgList:msgImgList
  744.                 })
  745.             }
  746.         }
  747.         self.setData({
  748.             msgList:list,
  749.             scrollTop:9999,
  750.             scrollAnimation:true
  751.         })
  752.     },
  753.     //处理图片尺寸,如果不处理宽高,新进入页面加载图片时候会闪
  754.     setPicSize(content) {
  755.         // 让图片最长边等于设置的最大长度,短边等比例缩小,图片控件真实改变,区别于aspectFit方式。
  756.         let maxW = this.toPx(350); //350是定义消息图片最大宽度
  757.         let maxH = this.toPx(350); //350是定义消息图片最大高度
  758.         if (content.w > maxW || content.h > maxH) {
  759.             let scale = content.w / content.h;
  760.             content.w = scale > 1 ? maxW : maxH * scale;
  761.             content.h = scale > 1 ? maxW / scale : maxH;
  762.         }
  763.         return content;
  764.     },
  765.     // rpx转px
  766.     toPx(num){
  767.         var px = num / 750 * wx.getSystemInfoSync().windowWidth;
  768.         return px;
  769.     },
  770.     //更多功能(点击+弹出)
  771.     showMore() {
  772.         let self = this;
  773.         self.setData({
  774.             isVoice:false,
  775.             hideEmoji:true
  776.         })
  777.         if (self.data.hideMore) {
  778.             self.setData({
  779.                 hideMore:false
  780.             });
  781.             self.openDrawer();
  782.         } else {
  783.             self.hideDrawer();
  784.         }
  785.     },
  786.     // 打开抽屉
  787.     openDrawer() {
  788.         this.setData({
  789.             popupLayerClass:'showLayer'
  790.         })
  791.     },
  792.     // 隐藏抽屉
  793.     hideDrawer() {
  794.         this.setData({
  795.             popupLayerClass:''
  796.         })
  797.         setTimeout(() => {
  798.             this.setData({
  799.                 hideMore:true,
  800.                 hideEmoji:true
  801.             })
  802.         }, 150);
  803.     },
  804.     // 选择图片发送
  805.     chooseImage() {
  806.         this.getImage('album');
  807.     },
  808.     //拍照发送
  809.     camera() {
  810.         this.getImage('camera');
  811.     },
  812.     //选照片 or 拍照
  813.     getImage(type) {
  814.         let self = this;
  815.         self.hideDrawer();
  816.         wx.chooseImage({
  817.             sourceType: [type],
  818.             sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
  819.             success: (res) => {
  820.                 for (let i = 0; i < res.tempFilePaths.length; i++) {
  821.                     wx.getImageInfo({
  822.                         src: res.tempFilePaths[i],
  823.                         success: (image) => {
  824.                             console.log(image.width);
  825.                             console.log(image.height);
  826.                             let msg = {
  827.                                 url: res.tempFilePaths[i],
  828.                                 w: image.width,
  829.                                 h: image.height
  830.                             };
  831.                             self.sendMsg(msg, 'img');
  832.                         }
  833.                     });
  834.                 }
  835.             }
  836.         });
  837.     },
  838.     // 选择表情
  839.     chooseEmoji() {
  840.         let self = this;
  841.         self.setData({
  842.             hideMore:true
  843.         })
  844.         if (self.data.hideEmoji) {
  845.             self.setData({
  846.                 hideEmoji:false
  847.             })
  848.             self.openDrawer();
  849.         } else {
  850.             self.hideDrawer();
  851.         }
  852.     },
  853.     //添加表情
  854.     addEmoji(e) {
  855.         let textMsg = this.data.textMsg;
  856.             textMsg += e.currentTarget.dataset.em.alt;
  857.             this.setData({
  858.                 textMsg:textMsg
  859.             });
  860.     },
  861.     //获取焦点,如果不是选表情ing,则关闭抽屉
  862.     textareaFocus() {
  863.         if (this.data.popupLayerClass == 'showLayer' && this.data.hideMore == false) {
  864.             this.hideDrawer();
  865.         }
  866.     },
  867.     // 发送文字消息
  868.     sendText() {
  869.         this.hideDrawer(); //隐藏抽屉
  870.         if (!this.data.textMsg) {
  871.             return;
  872.         }
  873.         let content = this.replaceEmoji(this.data.textMsg);
  874.         let msg = {
  875.             text: content
  876.         }
  877.         this.sendMsg(msg, 'text');
  878.         //清空输入框
  879.         this.setData({
  880.             textMsg:''
  881.         })
  882.     },
  883.     //替换表情符号为图片
  884.     replaceEmoji(str) {
  885.         let emojiList = this.data.emojiList,
  886.             onlineEmoji = this.data.onlineEmoji;

  887.         let replacedStr = str.replace(/\[([^(\]|\[)]*)\]/g, (item, index) => {

  888.             console.log("str: " + str);
  889.             console.log("index: " + index);
  890.             console.log("item: " + item);

  891.             for (let i = 0; i < this.data.emojiList.length; i++) {
  892.                 let row = emojiList[i];
  893.                 for (let j = 0; j < row.length; j++) {
  894.                     let EM = row[j];
  895.                     if (EM.alt == item) {
  896.                         //在线表情路径,图文混排必须使用网络路径,请上传一份表情到你的服务器后再替换此路径
  897.                         //比如你上传服务器后,你的100.gif路径为https://www.xxx.com/emoji/100.gif 则替换onlinePath填写为https://www.xxx.com/emoji/
  898.                         let onlinePath = 'https://zhoukaiwen.com/img/icon/emojj1/'
  899.                         let imgstr = '<img width="32rpx" src="' + onlinePath + onlineEmoji[EM.url] +
  900.                             '">';
  901.                         console.log("imgstr: " + imgstr);
  902.                         return imgstr;
  903.                     }
  904.                 }
  905.             }
  906.         });
  907.         return '<div style="display: flex;align-items: center;word-wrap:break-word;">' + replacedStr + '</div>';
  908.     },
  909.     //输入框双向数据绑定
  910.     inputtextMsg(e){
  911.         this.setData({
  912.             textMsg:e.detail.value
  913.         })
  914.     },
  915.     // 发送消息
  916.     sendMsg(content, type) {
  917.         //实际应用中,此处应该提交长连接,模板仅做本地处理。
  918.         var nowDate = new Date();
  919.         let self = this;
  920.         let lastid = self.data.msgList[self.data.msgList.length - 1].msg.id;
  921.         lastid++;
  922.         let msg = {
  923.             type: 'user',
  924.             msg: {
  925.                 id: lastid,
  926.                 time: nowDate.getHours() + ":" + nowDate.getMinutes(),
  927.                 type: type,
  928.                 userinfo: {
  929.                     uid: 0,
  930.                     username: "大黑哥",
  931.                     face: "https://zhoukaiwen.com/img/kevinLogo.png"
  932.                 },
  933.                 content: content
  934.             }
  935.         }
  936.         // 发送消息
  937.         self.screenMsg(msg);
  938.         // 定时器模拟对方回复,三秒
  939.         setTimeout(() => {
  940.             lastid = self.data.msgList[self.data.msgList.length - 1].msg.id;
  941.             lastid++;
  942.             msg = {
  943.                 type: 'user',
  944.                 msg: {
  945.                     id: lastid,
  946.                     time: nowDate.getHours() + ":" + nowDate.getMinutes(),
  947.                     type: type,
  948.                     userinfo: {
  949.                         uid: 1,
  950.                         username: "售后客服008",
  951.                         face: "https://zhoukaiwen.com/img/qdpz/face/face_2.jpg"
  952.                     },
  953.                     content: content
  954.                 }
  955.             }
  956.             // 本地模拟发送消息
  957.             self.screenMsg(msg);
  958.         }, 3000)
  959.     },
  960.     // 添加文字消息到列表
  961.     addTextMsg(msg) {
  962.         let msgList = this.data.msgList;

  963.         msgList.push(msg);

  964.         this.setData({
  965.             msgList:msgList
  966.         })
  967.         },
  968.     // 添加语音消息到列表
  969.     addVoiceMsg(msg) {
  970.         let msgList = this.data.msgList;

  971.         msgList.push(msg);

  972.         this.setData({
  973.             msgList:msgList
  974.         })
  975.     },
  976.     // 添加图片消息到列表
  977.     addImgMsg(msg) {
  978.         let self = this,
  979.             msgImgList = self.data.msgImgList,
  980.             msgList = self.data.msgList;

  981.         msg.msg.content = self.setPicSize(msg.msg.content);

  982.         msgImgList.push(msg.msg.content.url);
  983.         msgList.push(msg);

  984.         self.setData({
  985.             msgImgList:msgImgList,
  986.             msgList:msgList
  987.         })
  988.     },
  989.     addRedEnvelopeMsg(msg) {
  990.         let msgList = this.data.msgList;

  991.         msgList.push(msg);

  992.         this.setData({
  993.             msgList:msgList
  994.         })
  995.     },
  996.     // 添加系统文字消息到列表
  997.     addSystemTextMsg(msg) {
  998.         let msgList = this.data.msgList;

  999.         msgList.push(msg);

  1000.         this.setData({
  1001.             msgList:msgList
  1002.         })
  1003.     },
  1004.     // 添加系统红包消息到列表
  1005.     addSystemRedEnvelopeMsg(msg) {
  1006.         let msgList = this.data.msgList;

  1007.         msgList.push(msg);

  1008.         this.setData({
  1009.             msgList:msgList
  1010.         })
  1011.     },
  1012.     // 打开红包
  1013.     openRedEnvelope(e) {
  1014.         let msg = e.currentTarget.dataset.msg,
  1015.             index = e.currentTarget.dataset.index,
  1016.             rid = msg.content.rid,
  1017.             redenvelopeData = this.data.redenvelopeData,
  1018.             msgList = this.data.msgList;
  1019.         wx.showLoading({
  1020.             title: '加载中...'
  1021.         });
  1022.         console.log("index: " + index);
  1023.         //模拟请求服务器效果
  1024.         setTimeout(() => {
  1025.             //加载数据
  1026.             if (rid == 0) {
  1027.                 redenvelopeData = {
  1028.                     rid: 0, //红包ID
  1029.                     from: "大黑哥",
  1030.                     face: "https://zhoukaiwen.com/img/qdpz/face/face.jpg",
  1031.                     blessing: "恭喜发财,大吉大利",
  1032.                     money: "已领完"
  1033.                 }
  1034.                 this.setData({
  1035.                     redenvelopeData:redenvelopeData
  1036.                  })
  1037.             } else {
  1038.                 redenvelopeData = {
  1039.                     rid: 1, //红包ID
  1040.                     from: "售后客服008",
  1041.                     face: "https://zhoukaiwen.com/img/qdpz/face/face_2.jpg",
  1042.                     blessing: "恭喜发财",
  1043.                     money: "0.01"
  1044.                 }
  1045.                 this.setData({
  1046.                    redenvelopeData:redenvelopeData
  1047.                 })
  1048.                 if (!msg.content.isReceived) {
  1049.                     // {type:"system",msg:{id:8,type:"redEnvelope",content:{text:"你领取了售后客服008的红包"}}},
  1050.                     this.sendSystemMsg({
  1051.                         text: "你领取了" + (msg.userinfo.uid == this.data.myuid ? "自己" : msg.userinfo
  1052.                             .username) + "的红包"
  1053.                     }, 'redEnvelope');
  1054.                     console.log("this.msgList[index]: " + JSON.stringify(this.msgList[index]));
  1055.                     msgList[index].msg.content.isReceived = true;

  1056.                     this.setData({
  1057.                         msgList:msgList
  1058.                     })
  1059.                 }
  1060.             }
  1061.             wx.hideLoading();
  1062.             this.setData({
  1063.                 windowsState:'show'
  1064.             })

  1065.         }, 200)

  1066.     },
  1067.     // 关闭红包弹窗
  1068.     closeRedEnvelope() {
  1069.         this.setData({
  1070.             windowsState:'hide'
  1071.         })
  1072.         setTimeout(() => {
  1073.             this.setData({
  1074.                 windowsState:''
  1075.             })
  1076.         }, 200)
  1077.     },
  1078.     sendSystemMsg(content, type) {
  1079.         let lastid = this.data.msgList[this.data.msgList.length - 1].msg.id;
  1080.         lastid++;
  1081.         let row = {
  1082.             type: "system",
  1083.             msg: {
  1084.                 id: lastid,
  1085.                 type: type,
  1086.                 content: content
  1087.             }
  1088.         };
  1089.         this.screenMsg(row)
  1090.     },
  1091.     //领取详情
  1092.     toDetails(rid) {
  1093.         wx.navigateTo({
  1094.             url: 'details/details?rid=' + rid
  1095.         })
  1096.     },
  1097.     // 预览图片
  1098.     showPic(e) {
  1099.         wx.previewImage({
  1100.             indicator: "none",
  1101.             current: e.currentTarget.dataset.msg.content.url,
  1102.             urls: this.data.msgImgList
  1103.         });
  1104.     },
  1105.     // 播放语音
  1106.     playVoice(e) {
  1107.         let msg = e.currentTarget.dataset.msg;
  1108.         this.setData({
  1109.             playMsgid:msg.id
  1110.         },()=>{
  1111.             this.data.AUDIO.src = msg.content.url;
  1112.             this.data.AUDIO.play();
  1113.         })
  1114.     },
  1115.     // 录音开始
  1116.     voiceBegin(e) {
  1117.         if (e.touches.length > 1) {
  1118.             return;
  1119.         }
  1120.         console.log(e)
  1121.         this.setData({
  1122.             ['initPoint.Y']:e.touches[0].clientY,
  1123.             ['initPoint.identifier']:e.touches[0].identifier
  1124.         },()=>{
  1125.             this.data.RECORDER.start({
  1126.                 format: "mp3"
  1127.             }); //录音开始,
  1128.         })
  1129.     },
  1130.     //录音开始UI效果
  1131.     recordBegin(e) {
  1132.             
  1133.         this.setData({
  1134.             recording:true,
  1135.             voiceTis:'松开 结束',
  1136.             recordLength:0,
  1137.         },()=>{
  1138.         let recordLength = this.data.recordLength,
  1139.             recordTimer = null;
  1140.             recordTimer = setInterval(() => {
  1141.                 this.setData({
  1142.                     recordLength:recordLength++
  1143.                 })
  1144.             }, 1000);
  1145.             this.setData({
  1146.                 recordTimer:recordTimer
  1147.             })
  1148.         })
  1149.     },
  1150.     // 录音被打断
  1151.     voiceCancel() {
  1152.         this.setData({
  1153.             recording:false,
  1154.             voiceTis:'按住 说话',
  1155.             recordTis:'手指上滑 取消发送',
  1156.             willStop:true //不发送录音
  1157.         },()=>{
  1158.             this.data.RECORDER.stop(); //录音结束
  1159.         })
  1160.     },
  1161.     // 录音中(判断是否触发上滑取消发送)
  1162.     voiceIng(e) {
  1163.         if (!this.data.recording) {
  1164.             return;
  1165.         }
  1166.         let touche = e.touches[0];
  1167.         //上滑一个导航栏的高度触发上滑取消发送
  1168.         if (this.data.initPoint.Y - touche.clientY >= this.toPx(100)) {
  1169.             this.setData({
  1170.                 willStop:true,
  1171.                 recordTis:'松开手指 取消发送'
  1172.             })
  1173.         } else {
  1174.             this.setData({
  1175.                 willStop:true,
  1176.                 recordTis:'手指上滑 取消发送'
  1177.             })
  1178.         }
  1179.     },
  1180.     // 结束录音
  1181.     voiceEnd(e) {
  1182.         if (!this.data.recording) {
  1183.             return;
  1184.         }
  1185.         this.setData({
  1186.             recording:false,
  1187.             voiceTis:'按住 说话',
  1188.             recordTis:'手指上滑 取消发送'
  1189.         },()=>{
  1190.             this.data.RECORDER.stop(); //录音结束
  1191.         })
  1192.     },
  1193.     //录音结束(回调文件)
  1194.     recordEnd(e) {
  1195.         clearInterval(this.data.recordTimer);
  1196.         if (!this.data.willStop) {
  1197.             console.log("e: " + JSON.stringify(e));
  1198.             let msg = {
  1199.                 length: 0,
  1200.                 url: e.tempFilePath
  1201.             }
  1202.             let min = parseInt(this.data.recordLength / 60);
  1203.             let sec = this.data.recordLength % 60;
  1204.             min = min < 10 ? '0' + min : min;
  1205.             sec = sec < 10 ? '0' + sec : sec;
  1206.             msg.length = min + ':' + sec;
  1207.             this.sendMsg(msg, 'voice');
  1208.         } else {
  1209.             console.log('取消发送录音');
  1210.         }
  1211.         this.setData({
  1212.             willStop:false
  1213.         })
  1214.     },
  1215.     // 切换语音/文字输入
  1216.     switchVoice() {
  1217.         this.hideDrawer();
  1218.         this.setData({
  1219.             isVoice:this.data.isVoice ? false : true
  1220.         })
  1221.     },
  1222.     discard() {
  1223.         return;
  1224.     }
  1225. })
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|PHP  

GMT+8, 2024-5-4 04:28 , Processed in 0.069406 second(s), 33 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表