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

214 lines
8.4 KiB

  1. <!-- pages/training/training.wxml -->
  2. <view class="training-container">
  3. <!-- 顶部标题 -->
  4. <view class="header">
  5. <view class="title">在线培训</view>
  6. <view class="subtitle">专业学习资源,助您快速成长</view>
  7. <view class="header-decoration">
  8. <view class="decoration-circle circle-1"></view>
  9. <view class="decoration-circle circle-2"></view>
  10. <view class="decoration-circle circle-3"></view>
  11. </view>
  12. </view>
  13. <!-- 主选项卡切换 -->
  14. <view class="tabs">
  15. <view class="tab-item {{currentTab === 0 ? 'active' : ''}}" bindtap="switchTab" data-tab="0">
  16. <text>文章</text>
  17. <view class="tab-highlight {{currentTab === 0 ? 'active' : ''}}"></view>
  18. </view>
  19. <view class="tab-item {{currentTab === 1 ? 'active' : ''}}" bindtap="switchTab" data-tab="1">
  20. <text>视频</text>
  21. <view class="tab-highlight {{currentTab === 1 ? 'active' : ''}}"></view>
  22. </view>
  23. <view class="tab-slider {{currentTab === 0 ? 'left' : 'right'}}"></view>
  24. </view>
  25. <!-- 文章板块 -->
  26. <view class="content-section" wx:if="{{currentTab === 0}}">
  27. <!-- 搜索框 -->
  28. <view class="search-box">
  29. <image class="search-icon" src="/pagesB/images/sou.png"></image>
  30. <input class="search-input" placeholder="搜索文章..." placeholder-class="placeholder-style" bindinput="onSearchInput" value="{{searchKeyword}}" />
  31. <view class="search-decoration">
  32. <view class="search-wave"></view>
  33. </view>
  34. </view>
  35. <!-- 文章分类筛选 -->
  36. <scroll-view class="category-scroll" scroll-x scroll-with-animation>
  37. <view class="category-list">
  38. <view class="category-item {{articleActiveCategory === 0 ? 'active' : ''}}" bindtap="selectArticleCategory" data-category="0">
  39. <text>全部</text>
  40. <view class="category-indicator"></view>
  41. </view>
  42. <view class="category-item {{item.dictSort === articleActiveCategory? 'active' : ''}}" bindtap="selectArticleCategory" data-category="{{item.dictSort}}" wx:for="{{wzzd}}" wx:key="index">
  43. <text>{{item.dictLabel}}</text>
  44. <view class="category-indicator"></view>
  45. </view>
  46. </view>
  47. </scroll-view>
  48. <!-- 文章列表 -->
  49. <view class="articles-list">
  50. <view class="article-card" wx:for="{{filteredArticles}}" wx:key="id" bindtap="viewArticleDetail" data-id="{{item.id}}">
  51. <!-- 封面图片 -->
  52. <view class="article-cover-container">
  53. <image class="article-cover" src="{{baseUrl+item.coverImage}}" mode="aspectFill"></image>
  54. <view class="cover-overlay"></view>
  55. <view class="category-tag">{{item.category}}</view>
  56. <view class="article-hover-effect"></view>
  57. </view>
  58. <!-- 文章信息 -->
  59. <view class="article-info">
  60. <view class="article-title">{{item.title}}</view>
  61. <view class="article-desc">{{item.subtitle}}</view>
  62. <view class="article-meta">
  63. <view class="meta-item">
  64. <image class="meta-icon" src="{{baseUrl+item.expertAvatar}}"></image>
  65. <text class="meta-text">{{item.expertName}}</text>
  66. </view>
  67. <view class="meta-item">
  68. <text class="meta-text">{{item.publishTime}}</text>
  69. </view>
  70. </view>
  71. <view class="article-stats">
  72. <view class="stat-item">
  73. <image class="stat-icon" src="/pagesB/images/lll.png"></image>
  74. <text>{{item.viewCount}}</text>
  75. </view>
  76. </view>
  77. </view>
  78. </view>
  79. </view>
  80. <!-- 加载更多状态 -->
  81. <view wx:if="{{currentTab === 0 && filteredArticles.length > 0}}">
  82. <view class="load-more" wx:if="{{articleHasMore && !articleLoading}}">
  83. <text>上拉加载更多</text>
  84. </view>
  85. <view class="loading-more" wx:if="{{articleLoading}}">
  86. <view class="loading-dot"></view>
  87. <view class="loading-dot"></view>
  88. <view class="loading-dot"></view>
  89. <text>加载中...</text>
  90. </view>
  91. <view class="no-more" wx:if="{{!articleHasMore && filteredArticles.length > 0}}">
  92. <text>已加载全部</text>
  93. </view>
  94. </view>
  95. <!-- 空状态 -->
  96. <view class="empty-state" wx:if="{{filteredArticles.length === 0}}">
  97. <view class="empty-animation">
  98. <view class="empty-circle"></view>
  99. <view class="empty-circle circle-2"></view>
  100. <view class="empty-circle circle-3"></view>
  101. </view>
  102. <text class="empty-text">暂无相关文章</text>
  103. <text class="empty-hint">换个关键词试试吧</text>
  104. </view>
  105. </view>
  106. <!-- 视频板块 -->
  107. <view class="content-section" wx:if="{{currentTab === 1}}">
  108. <!-- 搜索框 -->
  109. <view class="search-box">
  110. <image class="search-icon" src="/pagesB/images/sou.png"></image>
  111. <input class="search-input" placeholder="搜索视频..." placeholder-class="placeholder-style" bindinput="onSearchInput" value="{{searchKeyword}}" />
  112. <view class="search-decoration">
  113. <view class="search-wave"></view>
  114. </view>
  115. </view>
  116. <!-- 视频分类筛选 -->
  117. <scroll-view class="category-scroll" scroll-x scroll-with-animation>
  118. <view class="category-list">
  119. <view class="category-item {{videoActiveCategory === '全部' ? 'active' : ''}}" bindtap="selectVideoCategory" data-category="全部">
  120. <text>全部视频</text>
  121. <view class="category-indicator"></view>
  122. </view>
  123. <view wx:for="{{videoType}}" wx:key="index" class="category-item {{ item.dictLabel=== videoActiveCategory ? 'active' : ''}}" bindtap="selectVideoCategory" data-category="{{item.dictLabel}}">
  124. <text>{{item.dictLabel}}</text>
  125. <view class="category-indicator"></view>
  126. </view>
  127. </view>
  128. </scroll-view>
  129. <!-- 视频列表 -->
  130. <view class="videos-grid">
  131. <view class="video-card" wx:for="{{filteredVideos}}" wx:key="id" bindtap="playVideo" data-id="{{item.id}}">
  132. <!-- 视频封面 -->
  133. <view class="video-cover-container">
  134. <image class="video-cover" src="{{baseUrl+item.coverImage}}" mode="aspectFill"></image>
  135. <view class="video-duration">{{item.category}}</view>
  136. <view class="cover-overlay"></view>
  137. <view class="play-button">
  138. <image class="play-icon" src="/pagesB/images/bo.png"></image>
  139. <view class="play-ripple"></view>
  140. </view>
  141. <view class="video-hover-effect"></view>
  142. </view>
  143. <!-- 视频信息 -->
  144. <view class="video-info">
  145. <view class="video-title">{{item.title}}</view>
  146. <view class="video-instructor">
  147. <image class="instructor-avatar" src="{{baseUrl+item.publisherAvatar}}"></image>
  148. <text class="instructor-name">{{item.publisherName}}</text>
  149. </view>
  150. <view class="video-meta">
  151. <view class="video-meta-item">
  152. <text>{{item.auditTime}}</text>
  153. </view>
  154. <view class="video-meta-item">
  155. <text>{{item.viewCount}}</text>
  156. </view>
  157. </view>
  158. </view>
  159. </view>
  160. </view>
  161. <!-- 加载更多状态 -->
  162. <view wx:if="{{currentTab === 1 && filteredVideos.length > 0}}">
  163. <view class="load-more" wx:if="{{videoHasMore && !videoLoading}}">
  164. <text>上拉加载更多</text>
  165. </view>
  166. <view class="loading-more" wx:if="{{videoLoading}}">
  167. <view class="loading-dot"></view>
  168. <view class="loading-dot"></view>
  169. <view class="loading-dot"></view>
  170. <text>加载中...</text>
  171. </view>
  172. <view class="no-more" wx:if="{{!videoHasMore && filteredVideos.length > 0}}">
  173. <text>已加载全部</text>
  174. </view>
  175. </view>
  176. <!-- 空状态 -->
  177. <view class="empty-state" wx:if="{{filteredVideos.length === 0}}">
  178. <view class="empty-animation">
  179. <view class="empty-circle"></view>
  180. <view class="empty-circle circle-2"></view>
  181. <view class="empty-circle circle-3"></view>
  182. </view>
  183. <text class="empty-text">暂无相关视频</text>
  184. <text class="empty-hint">换个关键词试试吧</text>
  185. </view>
  186. </view>
  187. <!-- 新增视频气泡按钮 -->
  188. <view class="create-btn-container" bind:tap="bindPublish">
  189. <view class="create-btn" bindtap="showCreateModal">
  190. <image class="btn-icon" src="/pagesA/images/jh.png"></image>
  191. <text class="btn-text">发布</text>
  192. </view>
  193. </view>
  194. </view>