与牧同行-小程序用户端
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.

257 lines
9.1 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 online"></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. <view class="sending-tip-container" wx:if="{{sendingCount > 0}}">
  33. <view class="sending-tip">
  34. <view class="sending-dot"></view>
  35. <view class="sending-dot"></view>
  36. <view class="sending-dot"></view>
  37. <text class="sending-text">正在发送{{sendingCount}}条消息...</text>
  38. </view>
  39. </view>
  40. <!-- 消息列表 -->
  41. <block wx:for="{{messageList}}" wx:key="index">
  42. <!-- 对方消息 -->
  43. <view class="message-item message-left" wx:if="{{!item.isMe}}">
  44. <view class="message-avatar">
  45. <image src="{{conversation.otherUserAvatar?baseUrl+conversation.otherUserAvatar:' /pages/images/tx.png'}}" class="avatar-img"></image>
  46. </view>
  47. <view class="message-content-wrapper">
  48. <view class="message-arrow arrow-left"></view>
  49. <!-- 文本消息 -->
  50. <view class="message-bubble bubble-left" wx:if="{{item.contentType === 'text'}}">
  51. <text class="message-text">{{item.content}}</text>
  52. </view>
  53. <!-- 图片消息 -->
  54. <view class="media-bubble" wx:elif="{{item.contentType === 'image'}}">
  55. <image
  56. src="{{item.content}}"
  57. class="message-image"
  58. mode="aspectFill"
  59. bindtap="previewImage"
  60. data-url="{{item.content}}"
  61. ></image>
  62. </view>
  63. <!-- 视频消息 -->
  64. <view class="media-bubble" wx:elif="{{item.contentType === 'video'}}">
  65. <video
  66. src="{{item.content}}"
  67. class="message-video"
  68. controls
  69. show-center-play-btn
  70. poster="{{item.thumb}}"
  71. object-fit="contain"
  72. ></video>
  73. </view>
  74. <!-- 文件消息 -->
  75. <view class="message-bubble bubble-left message-file" wx:elif="{{item.contentType === 'file'}}">
  76. <view class="file-icon-box">
  77. <image src="/images/icons/file_icon.png" class="file-icon"></image>
  78. </view>
  79. <view class="file-info">
  80. <text class="file-name">{{item.fileName}}</text>
  81. <text class="file-size">{{formatFileSize(item.fileSize)}}</text>
  82. </view>
  83. </view>
  84. <!-- 消息状态 - 仅对方消息显示已读状态 -->
  85. <view class="message-status" wx:if="{{item.status === 'read'}}">
  86. <text class="status-text">已读</text>
  87. </view>
  88. </view>
  89. </view>
  90. <!-- 我的消息 -->
  91. <view class="message-item message-right" wx:else>
  92. <view class="message-content-wrapper">
  93. <view class="message-arrow arrow-right"></view>
  94. <!-- 文本消息 -->
  95. <view class="message-bubble bubble-right" wx:if="{{item.contentType === 'text'}}">
  96. <text class="message-text">{{item.content}}</text>
  97. </view>
  98. <!-- 图片消息 -->
  99. <view class="media-bubble" wx:elif="{{item.contentType === 'image'}}">
  100. <image
  101. src="{{item.content}}"
  102. class="message-image"
  103. mode="aspectFill"
  104. bindtap="previewImage"
  105. data-url="{{item.content}}"
  106. ></image>
  107. <!-- 上传进度 -->
  108. <view class="upload-progress" wx:if="{{item.status === 'uploading'}}">
  109. <view class="progress-circle">
  110. <text class="progress-text">{{item.progress}}%</text>
  111. </view>
  112. </view>
  113. </view>
  114. <!-- 视频消息 -->
  115. <view class="media-bubble" wx:elif="{{item.contentType === 'video'}}">
  116. <video
  117. src="{{item.content}}"
  118. class="message-video"
  119. controls
  120. show-center-play-btn
  121. poster="{{item.thumb}}"
  122. object-fit="contain"
  123. ></video>
  124. <view class="upload-progress" wx:if="{{item.status === 'uploading'}}">
  125. <view class="progress-circle">
  126. <text class="progress-text">{{item.progress}}%</text>
  127. </view>
  128. </view>
  129. </view>
  130. <!-- 文件消息 -->
  131. <view class="message-bubble bubble-right message-file" wx:elif="{{item.contentType === 'file'}}">
  132. <view class="file-icon-box">
  133. <image src="/images/icons/file_icon.png" class="file-icon"></image>
  134. </view>
  135. <view class="file-info">
  136. <text class="file-name">{{item.fileName}}</text>
  137. <text class="file-size">{{formatFileSize(item.fileSize)}}</text>
  138. </view>
  139. <view class="upload-progress" wx:if="{{item.status === 'uploading'}}">
  140. <view class="progress-circle">
  141. <text class="progress-text">{{item.progress}}%</text>
  142. </view>
  143. </view>
  144. </view>
  145. </view>
  146. <view class="message-avatar">
  147. <image src="{{conversation.userAvatar?baseUrl+conversation.userAvatar:'/pages/images/tx.png'}}" class="avatar-img"></image>
  148. </view>
  149. </view>
  150. </block>
  151. <view class="chat-bottom-space"></view>
  152. <view class="load-more-tip" wx:if="{{loadingMore}}">
  153. <text>加载中...</text>
  154. </view>
  155. <view class="empty-tip" wx:if="{{messageList.length === 0 && !loading}}">
  156. <text class="empty-text">暂无聊天记录,开始咨询吧</text>
  157. </view>
  158. </scroll-view>
  159. <view class="input-section" id="inputSection">
  160. <view class="text-input-panel">
  161. <!-- 添加按钮 - 完美垂直居中 -->
  162. <view class="add-btn" bindtap="showMediaActionSheet">
  163. <image src="/pagesA/images/add.png" class="add-icon"></image>
  164. </view>
  165. <!-- 输入框包装器 -->
  166. <view class="input-wrapper">
  167. <textarea
  168. auto-height
  169. maxlength="500"
  170. class="chat-textarea"
  171. placeholder="请输入消息..."
  172. placeholder-class="input-placeholder"
  173. value="{{inputValue}}"
  174. bindinput="onInput"
  175. confirm-type="send"
  176. focus="{{inputFocus}}"
  177. adjust-position="{{false}}"
  178. cursor-spacing="20"
  179. bindfocus="onInputFocus"
  180. bindblur="onInputBlur"
  181. show-confirm-bar="{{false}}"
  182. disable-default-padding="{{true}}"
  183. ></textarea>
  184. <!-- 清空按钮 - 垂直居中 -->
  185. <view class="input-actions" wx:if="{{inputValue}}">
  186. <button class="clear-btn" bindtap="clearInput">
  187. <image src="/pagesA/images/ch.png" class="clear-icon"></image>
  188. </button>
  189. </view>
  190. </view>
  191. <!-- 发送按钮 - 美观渐变绿色,完美垂直居中 -->
  192. <button
  193. class="send-btn"
  194. bindtap="sendTextMessage"
  195. wx:if="{{inputValue}}"
  196. >
  197. <text class="send-text">发送</text>
  198. </button>
  199. <!-- 无内容时显示占位,保持布局稳定 -->
  200. <view class="send-placeholder" wx:else></view>
  201. </view>
  202. </view>
  203. <!-- 多媒体选择面板 -->
  204. <view class="media-action-sheet" wx:if="{{showMediaSheet}}" catchtap="hideMediaActionSheet">
  205. <view class="media-sheet-content" catchtap="stopPropagation">
  206. <view class="media-sheet-header">
  207. <text class="sheet-title">发送内容</text>
  208. <view class="close-sheet-btn" bindtap="hideMediaActionSheet">
  209. <image src="/pagesA/images/cuo.png"></image>
  210. </view>
  211. </view>
  212. <view class="media-options-grid">
  213. <view class="media-option" bindtap="chooseImage">
  214. <view class="option-icon-box">
  215. <image src="/pagesA/images/zp.png"></image>
  216. </view>
  217. <text class="option-text">照片</text>
  218. </view>
  219. <view class="media-option" bindtap="chooseVideo">
  220. <view class="option-icon-box">
  221. <image src="/pagesA/images/ps.png"></image>
  222. </view>
  223. <text class="option-text">视频</text>
  224. </view>
  225. </view>
  226. <view class="sheet-bottom">
  227. <text class="bottom-tip">最多可选择9张照片</text>
  228. </view>
  229. </view>
  230. </view>
  231. </view>