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

279 lines
9.8 KiB

  1. <!-- 专家端聊天页面 -->
  2. <view class="consult-page">
  3. <!-- 头部专家信息 -->
  4. <view class="consult-header">
  5. <view class="header-content">
  6. <view class="back-btn" bindtap="goBack">
  7. <image src="/pagesA/images/back.png" class="back-icon"></image>
  8. </view>
  9. <view class="header-center">
  10. <view class="expert-info">
  11. <text class="expert-name">{{conversation.userName || '用户'}}</text>
  12. <view class="expert-status">
  13. <view class="status-dot {{onlineStatus ? 'online' : 'offline'}}"></view>
  14. <text class="status-text">{{onlineStatus ? '在线' : '离线'}}</text>
  15. </view>
  16. </view>
  17. </view>
  18. </view>
  19. </view>
  20. <!-- 聊天内容区域 -->
  21. <scroll-view
  22. id="chatScroll"
  23. class="chat-container"
  24. scroll-y
  25. scroll-top="{{scrollTop}}"
  26. scroll-with-animation="{{scrollAnimate}}"
  27. enable-back-to-top="true"
  28. show-scrollbar="{{false}}"
  29. bindscroll="onScroll"
  30. >
  31. <!-- 加载更多提示 -->
  32. <view class="load-more-tip" wx:if="{{loadingMore}}">
  33. <text>加载中...</text>
  34. </view>
  35. <!-- 消息列表 -->
  36. <block wx:for="{{messageList}}" wx:key="id">
  37. <!-- 对方消息(用户) -->
  38. <view class="message-item message-left" wx:if="{{!item.isMe}}">
  39. <view class="message-avatar">
  40. <image src="{{item.avatar || '/pages/images/tx.png'}}" class="avatar-img"></image>
  41. </view>
  42. <view class="messages-content-wrapper">
  43. <view class="message-arrow arrow-left"></view>
  44. <!-- 文本消息 -->
  45. <view class="message-bubble bubble-left" wx:if="{{item.type === 'text'}}">
  46. <text class="message-text">{{item.content}}</text>
  47. </view>
  48. <!-- 图片消息 -->
  49. <view class="media-bubble" wx:elif="{{item.type === 'image'}}">
  50. <image
  51. src="{{item.content}}"
  52. class="message-image"
  53. mode="aspectFill"
  54. bindtap="previewImage"
  55. data-url="{{item.content}}"
  56. ></image>
  57. </view>
  58. <!-- 视频消息 -->
  59. <view class="media-bubble" wx:elif="{{item.type === 'video'}}">
  60. <video
  61. src="{{item.content}}"
  62. class="message-video"
  63. controls
  64. show-center-play-btn
  65. poster="{{item.thumb}}"
  66. ></video>
  67. <view class="video-play-overlay">
  68. <image src="/images/icons/play.png" class="play-icon"></image>
  69. </view>
  70. </view>
  71. <!-- 文件消息 -->
  72. <view class="message-bubble bubble-left message-file" wx:elif="{{item.type === 'file'}}">
  73. <view class="file-icon-box">
  74. <image src="/images/icons/file_icon.png" class="file-icon"></image>
  75. </view>
  76. <view class="file-info">
  77. <text class="file-name">{{item.fileName}}</text>
  78. <text class="file-size">{{formatFileSize(item.fileSize)}}</text>
  79. </view>
  80. </view>
  81. <!-- 消息时间(如果显示) -->
  82. <text class="message-time" wx:if="{{item.showTime}}">{{formatTime(item.timestamp)}}</text>
  83. </view>
  84. </view>
  85. <!-- 我的消息(专家) -->
  86. <view class="message-item message-right" wx:else>
  87. <view class="message-content-wrapper">
  88. <view class="message-arrow arrow-right"></view>
  89. <!-- 文本消息 -->
  90. <view class="message-bubble bubble-right" wx:if="{{item.type === 'text'}}">
  91. <text class="message-text">{{item.content}}</text>
  92. </view>
  93. <!-- 图片消息 -->
  94. <view class="media-bubble" wx:elif="{{item.type === 'image'}}">
  95. <image
  96. src="{{item.content}}"
  97. class="message-image"
  98. mode="aspectFill"
  99. bindtap="previewImage"
  100. data-url="{{item.content}}"
  101. ></image>
  102. <!-- 上传进度 -->
  103. <view class="upload-progress" wx:if="{{item.status === 'uploading'}}">
  104. <view class="progress-circle">
  105. <text class="progress-text">{{item.progress}}%</text>
  106. </view>
  107. </view>
  108. </view>
  109. <!-- 视频消息 -->
  110. <view class="media-bubble" wx:elif="{{item.type === 'video'}}">
  111. <video
  112. src="{{item.content}}"
  113. class="message-video"
  114. controls
  115. show-center-play-btn
  116. poster="{{item.thumb}}"
  117. ></video>
  118. <view class="video-play-overlay">
  119. <image src="/images/icons/play.png" class="play-icon"></image>
  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. <!-- 文件消息 -->
  128. <view class="message-bubble bubble-right message-file" wx:elif="{{item.type === 'file'}}">
  129. <view class="file-icon-box">
  130. <image src="/images/icons/file_icon.png" class="file-icon"></image>
  131. </view>
  132. <view class="file-info">
  133. <text class="file-name">{{item.fileName}}</text>
  134. <text class="file-size">{{formatFileSize(item.fileSize)}}</text>
  135. </view>
  136. <view class="upload-progress" wx:if="{{item.status === 'uploading'}}">
  137. <view class="progress-circle">
  138. <text class="progress-text">{{item.progress}}%</text>
  139. </view>
  140. </view>
  141. </view>
  142. <!-- 消息状态 -->
  143. <view class="message-status" wx:if="{{item.status === 'sending'}}">
  144. <text class="status-text">发送中</text>
  145. </view>
  146. <view class="message-status" wx:elif="{{item.status === 'fail'}}">
  147. <text class="status-text fail">发送失败</text>
  148. <text class="retry-text" bindtap="retrySend" data-id="{{item.id}}">重试</text>
  149. </view>
  150. <!-- 消息时间 -->
  151. <text class="message-time" wx:if="{{item.showTime}}">{{formatTime(item.timestamp)}}</text>
  152. </view>
  153. <view class="message-avatar">
  154. <image src="{{expertAvatar || '/pages/images/tx.png'}}" class="avatar-img"></image>
  155. </view>
  156. </view>
  157. </block>
  158. <!-- 底部空间 -->
  159. <view class="chat-bottom-space"></view>
  160. <!-- 空状态 -->
  161. <view class="empty-tip" wx:if="{{messageList.length === 0}}">
  162. <text class="empty-text">暂无聊天记录,开始咨询吧</text>
  163. </view>
  164. </scroll-view>
  165. <!-- 输入区域 -->
  166. <view class="input-section" id="inputSection">
  167. <view class="text-input-panel">
  168. <!-- 添加按钮 -->
  169. <view class="add-btn" bindtap="showMediaActionSheet">
  170. <image src="/pagesA/images/add.png" class="add-icon"></image>
  171. </view>
  172. <!-- 输入框包装器 -->
  173. <view class="input-wrapper">
  174. <textarea
  175. auto-height
  176. maxlength="500"
  177. class="chat-textarea"
  178. placeholder="请输入消息..."
  179. placeholder-class="input-placeholder"
  180. value="{{inputValue}}"
  181. bindinput="onInput"
  182. confirm-type="send"
  183. focus="{{inputFocus}}"
  184. adjust-position="{{false}}"
  185. cursor-spacing="20"
  186. bindfocus="onInputFocus"
  187. bindblur="onInputBlur"
  188. show-confirm-bar="{{false}}"
  189. disable-default-padding="{{true}}"
  190. ></textarea>
  191. <!-- 清空按钮 -->
  192. <view class="input-actions" wx:if="{{inputValue}}">
  193. <button class="clear-btn" bindtap="clearInput">
  194. <image src="/pagesA/images/ch.png" class="clear-icon"></image>
  195. </button>
  196. </view>
  197. </view>
  198. <!-- 发送按钮 -->
  199. <button
  200. class="send-btn"
  201. bindtap="sendTextMessage"
  202. wx:if="{{inputValue}}"
  203. >
  204. <text class="send-text">发送</text>
  205. </button>
  206. <!-- 占位 -->
  207. <view class="send-placeholder" wx:else></view>
  208. </view>
  209. </view>
  210. <!-- 多媒体选择面板 -->
  211. <view class="media-action-sheet" wx:if="{{showMediaSheet}}" catchtap="hideMediaActionSheet">
  212. <view class="media-sheet-content" catchtap="stopPropagation">
  213. <view class="media-sheet-header">
  214. <text class="sheet-title">发送内容</text>
  215. <view class="close-sheet-btn" bindtap="hideMediaActionSheet">
  216. <image src="/pagesA/images/cuo.png"></image>
  217. </view>
  218. </view>
  219. <view class="media-options-grid">
  220. <view class="media-option" bindtap="chooseImage">
  221. <view class="option-icon-box">
  222. <image src="/pagesA/images/zp.png"></image>
  223. </view>
  224. <text class="option-text">照片</text>
  225. </view>
  226. <view class="media-option" bindtap="chooseVideo">
  227. <view class="option-icon-box">
  228. <image src="/pagesA/images/ps.png"></image>
  229. </view>
  230. <text class="option-text">视频</text>
  231. </view>
  232. </view>
  233. <view class="sheet-bottom">
  234. <text class="bottom-tip">最多可选择9张照片</text>
  235. </view>
  236. </view>
  237. </view>
  238. <!-- 更多菜单 -->
  239. <view class="more-menu" wx:if="{{showMoreMenu}}" catchtap="hideMoreMenu">
  240. <view class="menu-content">
  241. <view class="menu-item" bindtap="clearHistory">
  242. <text>清空聊天记录</text>
  243. </view>
  244. <view class="menu-item" bindtap="reportUser">
  245. <text>举报用户</text>
  246. </view>
  247. <view class="menu-item" bindtap="blockUser">
  248. <text>拉黑用户</text>
  249. </view>
  250. </view>
  251. </view>
  252. </view>