与牧同行-小程序用户端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

237 lines
8.4 KiB

  1. <view class="consult-page">
  2. <!-- 头部专家信息 -->
  3. <view class="consult-header">
  4. <view class="header-content">
  5. <view class="header-center">
  6. <view class="expert-info">
  7. <text class="expert-name">{{conversation.otherUserName}}</text>
  8. <view class="expert-status">
  9. <view class="status-dot {{expertInfo.online ? 'online' : 'offline'}}"></view>
  10. <text class="status-text">在线</text>
  11. </view>
  12. </view>
  13. </view>
  14. </view>
  15. </view>
  16. <!-- 聊天内容区域 -->
  17. <scroll-view
  18. id="chatScroll"
  19. class="chat-container"
  20. scroll-y
  21. scroll-top="{{scrollTop}}"
  22. scroll-with-animation="{{scrollAnimate}}"
  23. enable-back-to-top="true"
  24. show-scrollbar="{{false}}"
  25. bindscroll="onScroll"
  26. >
  27. <!-- 日期分隔线 -->
  28. <view class="date-divider" wx:if="{{showDateDivider}}">
  29. <text class="date-text">{{todayDate}}</text>
  30. </view>
  31. <!-- 消息列表 -->
  32. <block wx:for="{{messageList}}" wx:key="id">
  33. <!-- 对方消息 -->
  34. <view class="message-item message-left" wx:if="{{!item.isMe}}">
  35. <view class="message-avatar">
  36. <image src="{{conversation.otherUserAvatar?baseUrl+conversation.otherUserAvatar:' /pages/images/tx.png'}}" class="avatar-img"></image>
  37. </view>
  38. <view class="messages-content-wrapper">
  39. <view class="message-arrow arrow-left"></view>
  40. <view class="message-bubble bubble-left" wx:if="{{item.contentType === 'text'}}">
  41. <text class="message-text">{{item.content}}</text>
  42. </view>
  43. <view class="media-bubble" wx:elif="{{item.type === 'image'}}">
  44. <image
  45. src="{{item.content}}"
  46. class="message-image"
  47. mode="aspectFill"
  48. bindtap="previewImage"
  49. data-url="{{item.content}}"
  50. ></image>
  51. </view>
  52. <view class="media-bubble" wx:elif="{{item.type === 'video'}}">
  53. <video
  54. src="{{item.content}}"
  55. class="message-video"
  56. controls
  57. show-center-play-btn
  58. poster="{{item.thumb}}"
  59. ></video>
  60. <view class="video-play-overlay">
  61. <image src="/images/icons/play.png" class="play-icon"></image>
  62. </view>
  63. </view>
  64. <view class="message-bubble bubble-left message-file" wx:elif="{{item.type === 'file'}}">
  65. <view class="file-icon-box">
  66. <image src="/images/icons/file_icon.png" class="file-icon"></image>
  67. </view>
  68. <view class="file-info">
  69. <text class="file-name">{{item.fileName}}</text>
  70. <text class="file-size">{{formatFileSize(item.fileSize)}}</text>
  71. </view>
  72. </view>
  73. </view>
  74. </view>
  75. <!-- 我的消息 -->
  76. <view class="message-item message-right" wx:else>
  77. <view class="message-content-wrapper">
  78. <view class="message-arrow arrow-right"></view>
  79. <view class="message-bubble bubble-right" wx:if="{{item.contentType === 'text'}}">
  80. <text class="message-text">{{item.content}}</text>
  81. </view>
  82. <view class="media-bubble" wx:elif="{{item.type === 'image'}}">
  83. <image
  84. src="{{item.content}}"
  85. class="message-image"
  86. mode="aspectFill"
  87. bindtap="previewImage"
  88. data-url="{{item.content}}"
  89. ></image>
  90. <view class="upload-progress" wx:if="{{item.status === 'uploading'}}">
  91. <view class="progress-circle">
  92. <text class="progress-text">{{item.progress}}%</text>
  93. </view>
  94. </view>
  95. </view>
  96. <view class="media-bubble" wx:elif="{{item.type === 'video'}}">
  97. <video
  98. src="{{item.content}}"
  99. class="message-video"
  100. controls
  101. show-center-play-btn
  102. poster="{{item.thumb}}"
  103. ></video>
  104. <view class="video-play-overlay">
  105. <image src="/images/icons/play.png" class="play-icon"></image>
  106. </view>
  107. <view class="upload-progress" wx:if="{{item.status === 'uploading'}}">
  108. <view class="progress-circle">
  109. <text class="progress-text">{{item.progress}}%</text>
  110. </view>
  111. </view>
  112. </view>
  113. <view class="message-bubble bubble-right message-file" wx:elif="{{item.type === 'file'}}">
  114. <view class="file-icon-box">
  115. <image src="/images/icons/file_icon.png" class="file-icon"></image>
  116. </view>
  117. <view class="file-info">
  118. <text class="file-name">{{item.fileName}}</text>
  119. <text class="file-size">{{formatFileSize(item.fileSize)}}</text>
  120. </view>
  121. <view class="upload-progress" wx:if="{{item.status === 'uploading'}}">
  122. <view class="progress-circle">
  123. <text class="progress-text">{{item.progress}}%</text>
  124. </view>
  125. </view>
  126. </view>
  127. </view>
  128. <view class="message-avatar">
  129. <image src="{{conversation.userAvatar?baseUrl+conversation.userAvatar:'/pages/images/tx.png'}}" class="avatar-img"></image>
  130. </view>
  131. </view>
  132. </block>
  133. <view class="chat-bottom-space"></view>
  134. <view class="load-more-tip" wx:if="{{loadingMore}}">
  135. <text>加载中...</text>
  136. </view>
  137. <view class="empty-tip" wx:if="{{messageList.length === 0 && !loading}}">
  138. <text class="empty-text">暂无聊天记录,开始咨询吧</text>
  139. </view>
  140. </scroll-view>
  141. <view class="input-section" id="inputSection">
  142. <view class="text-input-panel">
  143. <!-- 添加按钮 - 完美垂直居中 -->
  144. <view class="add-btn" bindtap="showMediaActionSheet">
  145. <image src="/pagesA/images/add.png" class="add-icon"></image>
  146. </view>
  147. <!-- 输入框包装器 -->
  148. <view class="input-wrapper">
  149. <textarea
  150. auto-height
  151. maxlength="500"
  152. class="chat-textarea"
  153. placeholder="请输入消息..."
  154. placeholder-class="input-placeholder"
  155. value="{{inputValue}}"
  156. bindinput="onInput"
  157. confirm-type="send"
  158. focus="{{inputFocus}}"
  159. adjust-position="{{false}}"
  160. cursor-spacing="20"
  161. bindfocus="onInputFocus"
  162. bindblur="onInputBlur"
  163. show-confirm-bar="{{false}}"
  164. disable-default-padding="{{true}}"
  165. ></textarea>
  166. <!-- 清空按钮 - 垂直居中 -->
  167. <view class="input-actions" wx:if="{{inputValue}}">
  168. <button class="clear-btn" bindtap="clearInput">
  169. <image src="/pagesA/images/ch.png" class="clear-icon"></image>
  170. </button>
  171. </view>
  172. </view>
  173. <!-- 发送按钮 - 美观渐变绿色,完美垂直居中 -->
  174. <button
  175. class="send-btn"
  176. bindtap="sendTextMessage"
  177. wx:if="{{inputValue}}"
  178. >
  179. <text class="send-text">发送</text>
  180. </button>
  181. <!-- 无内容时显示占位,保持布局稳定 -->
  182. <view class="send-placeholder" wx:else></view>
  183. </view>
  184. </view>
  185. <!-- 多媒体选择面板 -->
  186. <view class="media-action-sheet" wx:if="{{showMediaSheet}}" catchtap="hideMediaActionSheet">
  187. <view class="media-sheet-content" catchtap="stopPropagation">
  188. <view class="media-sheet-header">
  189. <text class="sheet-title">发送内容</text>
  190. <view class="close-sheet-btn" bindtap="hideMediaActionSheet">
  191. <image src="/pagesA/images/cuo.png"></image>
  192. </view>
  193. </view>
  194. <view class="media-options-grid">
  195. <view class="media-option" bindtap="chooseImage">
  196. <view class="option-icon-box">
  197. <image src="/pagesA/images/zp.png"></image>
  198. </view>
  199. <text class="option-text">照片</text>
  200. </view>
  201. <view class="media-option" bindtap="chooseVideo">
  202. <view class="option-icon-box">
  203. <image src="/pagesA/images/ps.png"></image>
  204. </view>
  205. <text class="option-text">视频</text>
  206. </view>
  207. </view>
  208. <view class="sheet-bottom">
  209. <text class="bottom-tip">最多可选择9张照片</text>
  210. </view>
  211. </view>
  212. </view>
  213. </view>