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

242 lines
8.5 KiB

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