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

  1. <view class="xqbox">
  2. <!-- 页面内容 -->
  3. <scroll-view class="page-content" scroll-y refresher-enabled refresher-triggered="{{refreshing}}" bindrefresherrefresh="onRefresh" scroll-with-animation="{{true}}">
  4. <!-- 用户问诊卡片 -->
  5. <view class="user-query-card card-enter">
  6. <!-- 用户信息 -->
  7. <view class="user-info-section">
  8. <view class="avatar-wrapper">
  9. <image class="user-avatar" src="{{diagnosisData.avatar?baseUrl+diagnosisData.avatar:'/pages/images/tx.png'}}"></image>
  10. </view>
  11. <view class="user-details">
  12. <view class="user-name-row">
  13. <text class="user-name">{{diagnosisData.farmerName || '用户'}}</text>
  14. <view class="status-badge {{diagnosisData.status === '已回复' ? 'status-replied' : 'status-pending'}} pulse">
  15. {{diagnosisData.status}}
  16. </view>
  17. </view>
  18. <view class="pet-info">
  19. <view class="pet-info-tags">
  20. <view class="pet-tag gradient-blue">{{diagnosisData.animalType}}</view>
  21. <view class="pet-tag gradient-orange">{{diagnosisData.animalAge}}</view>
  22. <view class="pet-tag gradient-pink">{{diagnosisData.animalGender}}</view>
  23. </view>
  24. <view class="time-info">
  25. <text class="time-text">{{diagnosisData.createdTime}}</text>
  26. </view>
  27. </view>
  28. </view>
  29. </view>
  30. <!-- 症状描述 -->
  31. <view class="symptom-section">
  32. <view class="section-header">
  33. <text class="section-title">症状描述</text>
  34. <view class="title-decoration"></view>
  35. </view>
  36. <view class="symptom-content">
  37. <view class="quote-left">
  38. <text>"</text>
  39. </view>
  40. <text class="symptom-text">{{diagnosisData.description}}</text>
  41. </view>
  42. </view>
  43. <!-- 相关图片 -->
  44. <view class="image-section" wx:if="{{diagnosisData.images && diagnosisData.images.length > 0}}">
  45. <view class="section-header">
  46. <text class="section-title">相关图片</text>
  47. <text class="image-count gradient-blue">{{diagnosisData.images.length}}张</text>
  48. </view>
  49. <scroll-view class="images-scroll" scroll-x>
  50. <view class="images-container">
  51. <block wx:for="{{diagnosisData.images}}" wx:key="*this" wx:for-index="index">
  52. <view class="image-wrapper">
  53. <image
  54. class="symptom-image"
  55. src="{{baseUrl+item}}"
  56. mode="aspectFill"
  57. bindtap="previewImage"
  58. data-url="{{baseUrl+item}}"
  59. data-urls="{{diagnosisData.images}}"
  60. data-type="user"
  61. ></image>
  62. </view>
  63. </block>
  64. </view>
  65. </scroll-view>
  66. </view>
  67. <!-- 卡片装饰 -->
  68. <view class="card-decoration">
  69. <view class="decoration-dot dot-1"></view>
  70. <view class="decoration-dot dot-2"></view>
  71. <view class="decoration-dot dot-3"></view>
  72. </view>
  73. </view>
  74. <!-- 兽医回复区域 -->
  75. <view class="replies-section">
  76. <view class="section-header">
  77. <text class="section-title">兽医回复</text>
  78. <view class="reply-count gradient-purple">
  79. <text class="count-number">{{replies.length}}</text>
  80. <text class="count-text">条回复</text>
  81. </view>
  82. </view>
  83. <!-- 回复列表 -->
  84. <view class="replies-list">
  85. <block wx:for="{{replies}}" wx:key="index" wx:for-index="index">
  86. <view class="vet-reply-card fade-in-up" style="animation-delay: {{index * 0.1}}s;">
  87. <!-- 兽医信息 -->
  88. <view class="vet-info">
  89. <view class="avatar-wrapper">
  90. <image class="vet-avatar" src="{{item.avatar?baseUrl+item.avatar:'/pages/images/tx.png'}}"></image>
  91. <view class="vet-verified"></view>
  92. </view>
  93. <view class="vet-details">
  94. <view class="vet-name-row">
  95. <text class="vet-name">{{item.replyName || '兽医'}}</text>
  96. <view class="vet-badge gradient-gold" wx:if="{{item.title}}">
  97. <text class="vet-title">{{item.title}}</text>
  98. </view>
  99. </view>
  100. <view class="vet-meta">
  101. <view class="meta-item" wx:if="{{item.hospital}}">
  102. <text class="vet-hospital">{{item.hospital}}</text>
  103. </view>
  104. <view class="meta-item" wx:if="{{item.experience}}">
  105. <text class="vet-experience">{{item.experience}}</text>
  106. </view>
  107. </view>
  108. </view>
  109. </view>
  110. <!-- 回复内容 -->
  111. <view class="reply-content">
  112. <view class="reply-bubble">
  113. <text class="reply-text">{{item.content}}</text>
  114. </view>
  115. <!-- 兽医回复图片 - 优化后的图片网格布局,支持预览 -->
  116. <view wx:if="{{item.images && item.images.length > 0}}" class="reply-images-section">
  117. <view class="reply-images-grid grid-{{item.images.length}}">
  118. <block wx:for="{{item.images}}" wx:key="this" wx:for-index="imgIndex">
  119. <view class="reply-image-wrapper"
  120. bindtap="previewReplyImage"
  121. data-url="{{item}}"
  122. data-fullurl="{{baseUrl + item}}"
  123. data-urls="{{item.images}}"
  124. data-current-index="{{imgIndex}}"
  125. data-reply-index="{{index}}">
  126. <image
  127. class="reply-image"
  128. src="{{baseUrl + item}}"
  129. mode="aspectFill"
  130. lazy-load
  131. ></image>
  132. <!-- 如果图片数量大于4且当前是第4张,显示剩余数量遮罩(仅当图片很多时视觉优化,但预览仍全部可看) -->
  133. <view wx:if="{{item.images.length > 4 && imgIndex === 3}}" class="image-more-mask">
  134. <text class="more-count">+{{item.images.length - 4}}</text>
  135. </view>
  136. </view>
  137. </block>
  138. </view>
  139. </view>
  140. </view>
  141. <!-- 回复底部 -->
  142. <view class="reply-footer">
  143. <view class="reply-time">
  144. <text class="time-text">{{item.createdAt || item.createTime || ''}}</text>
  145. </view>
  146. </view>
  147. </view>
  148. </block>
  149. <!-- 无回复状态 -->
  150. <view wx:if="{{replies.length === 0}}" class="no-replies fade-in">
  151. <text class="no-replies-title">等待兽医回复中</text>
  152. <text class="no-replies-desc">专业兽医通常会在24小时内为您解答</text>
  153. <view class="waiting-animation">
  154. <view class="loading-dot dot-1"></view>
  155. <view class="loading-dot dot-2"></view>
  156. <view class="loading-dot dot-3"></view>
  157. </view>
  158. </view>
  159. </view>
  160. </view>
  161. <!-- 底部占位,防止内容被回复框遮挡 -->
  162. <view class="bottom-placeholder" wx:if="{{showReplyInput}}"></view>
  163. </scroll-view>
  164. <!-- 回复输入区域 - 固定在底部 -->
  165. <view class="reply-input-section {{showReplyInput ? 'show' : ''}}" wx:if="{{showReplyInput}}">
  166. <view class="reply-input-container">
  167. <!-- 图片预览区 - 添加删除全部图标 -->
  168. <view class="reply-image-preview" wx:if="{{replyImagesTemp.length > 0}}">
  169. <view class="preview-header">
  170. <text class="preview-title">已选图片 ({{replyImagesTemp.length}}/9)</text>
  171. <view class="clear-all-btn" bindtap="clearAllImages" wx:if="{{replyImagesTemp.length > 0}}">
  172. <text class="clear-icon">🗑️</text>
  173. <text class="clear-text">清空全部</text>
  174. </view>
  175. </view>
  176. <scroll-view class="preview-scroll" scroll-x>
  177. <view class="preview-list">
  178. <block wx:for="{{replyImagesTemp}}" wx:key="index" wx:for-index="imgIndex">
  179. <view class="preview-item">
  180. <image class="preview-img" src="{{item}}" mode="aspectFill"></image>
  181. <view class="preview-remove" bindtap="removeReplyImage" data-index="{{imgIndex}}">
  182. <text class="remove-icon">×</text>
  183. </view>
  184. </view>
  185. </block>
  186. </view>
  187. </scroll-view>
  188. </view>
  189. <!-- 输入工具栏 -->
  190. <view class="input-toolbar">
  191. <textarea
  192. class="reply-textarea"
  193. placeholder="请输入回复内容..."
  194. placeholder-class="textarea-placeholder"
  195. value="{{replyContent}}"
  196. bindinput="onReplyContentInput"
  197. auto-height
  198. maxlength="{{500}}"
  199. show-confirm-bar="{{false}}"
  200. ></textarea>
  201. <view class="toolbar-actions">
  202. <view class="action-left">
  203. <view class="action-item" bindtap="chooseReplyImage">
  204. <text class="action-icon">📷</text>
  205. <text class="action-text">图片</text>
  206. </view>
  207. <view class="image-count-badge" wx:if="{{replyImagesTemp.length > 0}}">
  208. <text class="count-text">{{replyImagesTemp.length}}</text>
  209. </view>
  210. </view>
  211. <view class="action-right">
  212. <button class="submit-reply-btn {{replyContent || replyImages.length > 0 ? 'active' : ''}}"
  213. bindtap="submitReply"
  214. disabled="{{!replyContent && replyImages.length === 0}}">
  215. 发送回复
  216. </button>
  217. </view>
  218. </view>
  219. </view>
  220. </view>
  221. </view>
  222. <!-- 未登录或非兽医时显示的提示 -->
  223. <view class="no-reply-permission" wx:elif="{{!isVet}}">
  224. <text class="no-permission-text">仅兽医可回复</text>
  225. </view>
  226. </view>