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

201 lines
6.8 KiB

  1. <view class="forum-list-page">
  2. <!-- 顶部栏 -->
  3. <view class="header">
  4. <view class="title">问答论坛</view>
  5. <button class="add-btn" bindtap="createPost">提问</button>
  6. </view>
  7. <!-- 筛选栏 -->
  8. <view class="filter-bar">
  9. <scroll-view class="filter-scroll" scroll-x>
  10. <view class="filter-list">
  11. <view
  12. class="filter-item {{currentFilter === 'all' ? 'active' : ''}}"
  13. bindtap="changeFilter"
  14. data-type="all"
  15. >
  16. <text>全部</text>
  17. </view>
  18. <view
  19. class="filter-item {{currentFilter === 'unsolved' ? 'active' : ''}}"
  20. bindtap="changeFilter"
  21. data-type="unsolved"
  22. >
  23. <text>待解决</text>
  24. </view>
  25. <view
  26. class="filter-item {{currentFilter === 'solved' ? 'active' : ''}}"
  27. bindtap="changeFilter"
  28. data-type="solved"
  29. >
  30. <text>已解决</text>
  31. </view>
  32. <view
  33. class="filter-item {{currentFilter === 'hot' ? 'active' : ''}}"
  34. bindtap="changeFilter"
  35. data-type="hot"
  36. >
  37. <text>热门</text>
  38. </view>
  39. <view
  40. class="filter-item {{currentFilter === 'mine' ? 'active' : ''}}"
  41. bindtap="changeFilter"
  42. data-type="mine"
  43. >
  44. <text>我的帖子</text>
  45. </view>
  46. </view>
  47. </scroll-view>
  48. </view>
  49. <!-- 搜索框 -->
  50. <view class="search-container">
  51. <view class="search-input-wrapper">
  52. <image class="search-icon" src="/images/search.png" mode="aspectFit"></image>
  53. <input
  54. class="search-input"
  55. placeholder="搜索问题或关键词..."
  56. value="{{searchKeyword}}"
  57. bindinput="onSearchInput"
  58. bindconfirm="onSearchConfirm"
  59. confirm-type="search"
  60. />
  61. <view class="search-clear" wx:if="{{searchKeyword}}" bindtap="clearSearch">
  62. ×
  63. </view>
  64. </view>
  65. </view>
  66. <!-- 帖子列表 -->
  67. <scroll-view
  68. class="post-list-container"
  69. scroll-y
  70. enable-back-to-top
  71. bindscrolltolower="loadMore"
  72. refresher-enabled="{{true}}"
  73. refresher-triggered="{{refreshing}}"
  74. bindrefresherrefresh="onRefresh"
  75. >
  76. <!-- 空状态 -->
  77. <view class="empty-state" wx:if="{{!loading && posts.length === 0}}">
  78. <image class="empty-image" src="/images/empty-forum.png" mode="aspectFit"></image>
  79. <view class="empty-text" wx:if="{{searchKeyword}}">
  80. 没有找到"{{searchKeyword}}"相关的问题
  81. </view>
  82. <view class="empty-text" wx:else>
  83. 暂无帖子,快来发布第一个问题吧!
  84. </view>
  85. <button class="empty-btn" bindtap="createPost" wx:if="{{!searchKeyword}}">发布问题</button>
  86. <button class="empty-btn" bindtap="clearSearch" wx:else>清空搜索</button>
  87. </view>
  88. <!-- 帖子列表 -->
  89. <view class="post-list" wx:if="{{posts.length > 0}}">
  90. <block wx:for="{{posts}}" wx:key="id">
  91. <view class="post-item" data-id="{{item.id}}" bindtap="goToDetail">
  92. <!-- 左侧状态栏 -->
  93. <view class="post-status-side">
  94. <view class="vote-count">
  95. <view class="vote-number">{{item.likeCount}}</view>
  96. <view class="vote-label">点赞</view>
  97. </view>
  98. <view class="reply-count">
  99. <view class="reply-number">{{item.replyCount}}</view>
  100. <view class="reply-label">回答</view>
  101. </view>
  102. <view class="view-count">
  103. <view class="view-number">{{item.viewCount}}</view>
  104. <view class="view-label">浏览</view>
  105. </view>
  106. </view>
  107. <!-- 右侧内容区 -->
  108. <view class="post-content-main">
  109. <!-- 帖子标题和状态 -->
  110. <view class="post-header">
  111. <view class="post-title">{{item.title}}</view>
  112. <view class="status-badge" wx:if="{{item.solved}}">
  113. <text class="solved-badge">已解决</text>
  114. </view>
  115. <view class="status-badge" wx:if="{{item.hot}}">
  116. <text class="hot-badge">热门</text>
  117. </view>
  118. </view>
  119. <!-- 帖子内容摘要 -->
  120. <view class="post-summary">{{item.summary}}</view>
  121. <!-- 帖子元信息 -->
  122. <view class="post-meta">
  123. <!-- 用户信息 -->
  124. <view class="user-info">
  125. <image class="user-avatar" src="{{item.avatar}}" mode="aspectFill"></image>
  126. <text class="username">{{item.username}}</text>
  127. <text class="separator">·</text>
  128. <text class="post-time">{{item.time}}</text>
  129. </view>
  130. <!-- 标签 -->
  131. <view class="post-tags" wx:if="{{item.tags && item.tags.length > 0}}">
  132. <block wx:for="{{item.tags.slice(0, 2)}}" wx:key="index">
  133. <text class="tag">{{item}}</text>
  134. </block>
  135. <text class="more-tags" wx:if="{{item.tags.length > 2}}">+{{item.tags.length - 2}}</text>
  136. </view>
  137. </view>
  138. <!-- 最后回复信息 -->
  139. <view class="last-reply" wx:if="{{item.lastReply}}">
  140. <text class="last-reply-label">最后回复:</text>
  141. <text class="last-reply-user">{{item.lastReply.username}}</text>
  142. <text class="separator">·</text>
  143. <text class="last-reply-time">{{item.lastReply.time}}</text>
  144. </view>
  145. </view>
  146. </view>
  147. </block>
  148. <!-- 加载更多 -->
  149. <view class="load-more" wx:if="{{hasMore && posts.length > 0}}">
  150. <view class="loading-text" wx:if="{{!loadingMore}}">
  151. 上拉加载更多
  152. </view>
  153. <view class="loading-more" wx:else>
  154. <image class="loading-icon" src="/images/loading.png" mode="aspectFit"></image>
  155. 加载中...
  156. </view>
  157. </view>
  158. <!-- 没有更多了 -->
  159. <view class="no-more" wx:if="{{!hasMore && posts.length > 0}}">
  160. <text>没有更多了</text>
  161. </view>
  162. </view>
  163. <!-- 底部占位 -->
  164. <view class="bottom-placeholder"></view>
  165. </scroll-view>
  166. <!-- 加载提示 -->
  167. <view class="loading" wx:if="{{loading && posts.length === 0}}">
  168. <image class="loading-icon" src="/images/loading.png" mode="aspectFit"></image>
  169. 加载中...
  170. </view>
  171. <!-- 创建帖子浮动按钮 -->
  172. <view class="fab-container" wx:if="{{!searchKeyword}}">
  173. <view class="fab" bindtap="createPost">
  174. <image class="fab-icon" src="/images/add.png" mode="aspectFit"></image>
  175. </view>
  176. </view>
  177. </view>