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

245 lines
8.6 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">{{expertInfo.name}}</text>
  8. <view class="expert-status">
  9. <view class="status-dot {{expertInfo.online ? 'online' : 'offline'}}"></view>
  10. <text class="status-text">{{expertInfo.online ? '在线' : '离线'}}</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.sender === 'expert'}}">
  35. <view class="message-avatar">
  36. <image src="/pagesA/images/1.png" class="avatar-img"></image>
  37. </view>
  38. <view class="message-content-wrapper">
  39. <view class="message-arrow arrow-left"></view>
  40. <view class="message-bubble bubble-left" wx:if="{{item.type === '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.type === '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="/pagesA/images/2.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. <image src="/images/icons/empty_chat.png" class="empty-icon"></image>
  139. <text class="empty-text">暂无聊天记录,开始咨询吧</text>
  140. </view>
  141. </scroll-view>
  142. <view class="input-section" id="inputSection">
  143. <view class="text-input-panel">
  144. <!-- 添加按钮 - 完美垂直居中 -->
  145. <view class="add-btn" bindtap="showMediaActionSheet">
  146. <image src="/pagesA/images/add.png" class="add-icon"></image>
  147. </view>
  148. <!-- 输入框包装器 -->
  149. <view class="input-wrapper">
  150. <textarea
  151. auto-height
  152. maxlength="500"
  153. class="chat-textarea"
  154. placeholder="请输入消息..."
  155. placeholder-class="input-placeholder"
  156. value="{{inputValue}}"
  157. bindinput="onInput"
  158. confirm-type="send"
  159. focus="{{inputFocus}}"
  160. adjust-position="{{false}}"
  161. cursor-spacing="20"
  162. bindfocus="onInputFocus"
  163. bindblur="onInputBlur"
  164. show-confirm-bar="{{false}}"
  165. disable-default-padding="{{true}}"
  166. ></textarea>
  167. <!-- 清空按钮 - 垂直居中 -->
  168. <view class="input-actions" wx:if="{{inputValue}}">
  169. <button class="clear-btn" bindtap="clearInput">
  170. <image src="/images/icons/clear.png" class="clear-icon"></image>
  171. </button>
  172. </view>
  173. </view>
  174. <!-- 发送按钮 - 美观渐变绿色,完美垂直居中 -->
  175. <button
  176. class="send-btn"
  177. bindtap="sendTextMessage"
  178. wx:if="{{inputValue}}"
  179. >
  180. <text class="send-text">发送</text>
  181. </button>
  182. <!-- 无内容时显示占位,保持布局稳定 -->
  183. <view class="send-placeholder" wx:else></view>
  184. </view>
  185. </view>
  186. <!-- 多媒体选择面板 -->
  187. <view class="media-action-sheet" wx:if="{{showMediaSheet}}" catchtap="hideMediaActionSheet">
  188. <view class="media-sheet-content" catchtap="stopPropagation">
  189. <view class="media-sheet-header">
  190. <text class="sheet-title">发送内容</text>
  191. <view class="close-sheet-btn" bindtap="hideMediaActionSheet">
  192. <image src="/pagesA/images/cuo.png"></image>
  193. </view>
  194. </view>
  195. <view class="media-options-grid">
  196. <view class="media-option" bindtap="chooseImage">
  197. <view class="option-icon-box">
  198. <image src="/pagesA/images/zp.png"></image>
  199. </view>
  200. <text class="option-text">照片</text>
  201. </view>
  202. <view class="media-option" bindtap="chooseVideo">
  203. <view class="option-icon-box">
  204. <image src="/pagesA/images/ps.png"></image>
  205. </view>
  206. <text class="option-text">视频</text>
  207. </view>
  208. <view class="media-option" bindtap="chooseFile">
  209. <view class="option-icon-box">
  210. <image src="/pagesA/images/wj.png"></image>
  211. </view>
  212. <text class="option-text">文件</text>
  213. </view>
  214. </view>
  215. <view class="sheet-bottom">
  216. <text class="bottom-tip">最多可选择9张照片</text>
  217. </view>
  218. </view>
  219. </view>
  220. </view>