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

255 lines
8.6 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
  16. class="tab-item {{currentTab === 0 ? 'active' : ''}}"
  17. bindtap="switchTab"
  18. data-tab="0"
  19. >
  20. <text>文章</text>
  21. <view class="tab-highlight {{currentTab === 0 ? 'active' : ''}}"></view>
  22. </view>
  23. <view
  24. class="tab-item {{currentTab === 1 ? 'active' : ''}}"
  25. bindtap="switchTab"
  26. data-tab="1"
  27. >
  28. <text>视频</text>
  29. <view class="tab-highlight {{currentTab === 1 ? 'active' : ''}}"></view>
  30. </view>
  31. <view class="tab-slider {{currentTab === 0 ? 'left' : 'right'}}"></view>
  32. </view>
  33. <!-- 文章板块 -->
  34. <view class="content-section" wx:if="{{currentTab === 0}}">
  35. <!-- 搜索框 -->
  36. <view class="search-box">
  37. <image class="search-icon" src="/pagesB/images/sou.png"></image>
  38. <input
  39. class="search-input"
  40. placeholder="搜索文章..."
  41. placeholder-class="placeholder-style"
  42. bindinput="onSearchInput"
  43. value="{{searchKeyword}}"
  44. />
  45. <view class="search-decoration">
  46. <view class="search-wave"></view>
  47. </view>
  48. </view>
  49. <!-- 文章分类筛选 -->
  50. <scroll-view class="category-scroll" scroll-x scroll-with-animation>
  51. <view class="category-list">
  52. <view
  53. class="category-item {{articleActiveCategory === 0 ? 'active' : ''}}"
  54. bindtap="selectArticleCategory"
  55. data-category="0"
  56. >
  57. <text>全部</text>
  58. <view class="category-indicator"></view>
  59. </view>
  60. <view
  61. class="category-item {{item.dictSort === articleActiveCategory? 'active' : ''}}"
  62. bindtap="selectArticleCategory"
  63. data-category="{{item.dictSort}}"
  64. wx:for="{{wzzd}}"
  65. wx:key="index"
  66. >
  67. <text>{{item.dictLabel}}</text>
  68. <view class="category-indicator"></view>
  69. </view>
  70. </view>
  71. </scroll-view>
  72. <!-- 文章列表 -->
  73. <view class="articles-list">
  74. <view
  75. class="article-card"
  76. wx:for="{{filteredArticles}}"
  77. wx:key="id"
  78. bindtap="viewArticleDetail"
  79. data-id="{{item.id}}"
  80. >
  81. <!-- 封面图片 -->
  82. <view class="article-cover-container">
  83. <image class="article-cover" src="{{baseUrl+item.coverImage}}" mode="aspectFill"></image>
  84. <view class="cover-overlay"></view>
  85. <view class="category-tag">{{item.category}}</view>
  86. <view class="article-hover-effect"></view>
  87. </view>
  88. <!-- 文章信息 -->
  89. <view class="article-info">
  90. <view class="article-title">{{item.title}}</view>
  91. <view class="article-desc">{{item.subtitle}}</view>
  92. <view class="article-meta">
  93. <view class="meta-item">
  94. <image class="meta-icon" src="{{baseUrl+item.expertAvatar}}"></image>
  95. <text class="meta-text">{{item.expertName}}</text>
  96. </view>
  97. <view class="meta-item">
  98. <text class="meta-text">{{item.publishTime}}</text>
  99. </view>
  100. </view>
  101. <view class="article-stats">
  102. <view class="stat-item">
  103. <image class="stat-icon" src="/pagesB/images/lll.png"></image>
  104. <text>{{item.viewCount}}</text>
  105. </view>
  106. </view>
  107. </view>
  108. </view>
  109. </view>
  110. <!-- 加载更多状态 -->
  111. <view wx:if="{{currentTab === 0 && filteredArticles.length > 0}}">
  112. <view class="load-more" wx:if="{{articleHasMore && !articleLoading}}">
  113. <text>上拉加载更多</text>
  114. </view>
  115. <view class="loading-more" wx:if="{{articleLoading}}">
  116. <view class="loading-dot"></view>
  117. <view class="loading-dot"></view>
  118. <view class="loading-dot"></view>
  119. <text>加载中...</text>
  120. </view>
  121. <view class="no-more" wx:if="{{!articleHasMore && filteredArticles.length > 0}}">
  122. <text>已加载全部</text>
  123. </view>
  124. </view>
  125. <!-- 空状态 -->
  126. <view class="empty-state" wx:if="{{filteredArticles.length === 0}}">
  127. <view class="empty-animation">
  128. <view class="empty-circle"></view>
  129. <view class="empty-circle circle-2"></view>
  130. <view class="empty-circle circle-3"></view>
  131. </view>
  132. <text class="empty-text">暂无相关文章</text>
  133. <text class="empty-hint">换个关键词试试吧</text>
  134. </view>
  135. </view>
  136. <!-- 视频板块 -->
  137. <view class="content-section" wx:if="{{currentTab === 1}}">
  138. <!-- 搜索框 -->
  139. <view class="search-box">
  140. <image class="search-icon" src="/pagesB/images/sou.png"></image>
  141. <input
  142. class="search-input"
  143. placeholder="搜索视频..."
  144. placeholder-class="placeholder-style"
  145. bindinput="onSearchInput"
  146. value="{{searchKeyword}}"
  147. />
  148. <view class="search-decoration">
  149. <view class="search-wave"></view>
  150. </view>
  151. </view>
  152. <!-- 视频分类筛选 -->
  153. <scroll-view class="category-scroll" scroll-x scroll-with-animation>
  154. <view class="category-list">
  155. <view
  156. class="category-item {{videoActiveCategory === '全部' ? 'active' : ''}}"
  157. bindtap="selectVideoCategory"
  158. data-category="全部"
  159. >
  160. <text>全部视频</text>
  161. <view class="category-indicator"></view>
  162. </view>
  163. <view
  164. wx:for="{{videoType}}"
  165. wx:key="index"
  166. class="category-item {{ item.dictLabel=== videoActiveCategory ? 'active' : ''}}"
  167. bindtap="selectVideoCategory"
  168. data-category="{{item.dictLabel}}"
  169. >
  170. <text>{{item.dictLabel}}</text>
  171. <view class="category-indicator"></view>
  172. </view>
  173. </view>
  174. </scroll-view>
  175. <!-- 视频列表 -->
  176. <view class="videos-grid">
  177. <view
  178. class="video-card"
  179. wx:for="{{filteredVideos}}"
  180. wx:key="id"
  181. bindtap="playVideo"
  182. data-id="{{item.id}}"
  183. >
  184. <!-- 视频封面 -->
  185. <view class="video-cover-container">
  186. <image class="video-cover" src="{{baseUrl+item.coverImage}}" mode="aspectFill"></image>
  187. <view class="video-duration">{{item.category}}</view>
  188. <view class="cover-overlay"></view>
  189. <view class="play-button">
  190. <image class="play-icon" src="/pagesB/images/bo.png"></image>
  191. <view class="play-ripple"></view>
  192. </view>
  193. <view class="video-hover-effect"></view>
  194. </view>
  195. <!-- 视频信息 -->
  196. <view class="video-info">
  197. <view class="video-title">{{item.title}}</view>
  198. <view class="video-instructor">
  199. <image class="instructor-avatar" src="{{baseUrl+item.publisherAvatar}}"></image>
  200. <text class="instructor-name">{{item.publisherName}}</text>
  201. </view>
  202. <view class="video-meta">
  203. <view class="video-meta-item">
  204. <text>{{item.auditTime}}</text>
  205. </view>
  206. <view class="video-meta-item">
  207. <text>{{item.viewCount}}</text>
  208. </view>
  209. </view>
  210. </view>
  211. </view>
  212. </view>
  213. <!-- 加载更多状态 -->
  214. <view wx:if="{{currentTab === 1 && filteredVideos.length > 0}}">
  215. <view class="load-more" wx:if="{{videoHasMore && !videoLoading}}">
  216. <text>上拉加载更多</text>
  217. </view>
  218. <view class="loading-more" wx:if="{{videoLoading}}">
  219. <view class="loading-dot"></view>
  220. <view class="loading-dot"></view>
  221. <view class="loading-dot"></view>
  222. <text>加载中...</text>
  223. </view>
  224. <view class="no-more" wx:if="{{!videoHasMore && filteredVideos.length > 0}}">
  225. <text>已加载全部</text>
  226. </view>
  227. </view>
  228. <!-- 空状态 -->
  229. <view class="empty-state" wx:if="{{filteredVideos.length === 0}}">
  230. <view class="empty-animation">
  231. <view class="empty-circle"></view>
  232. <view class="empty-circle circle-2"></view>
  233. <view class="empty-circle circle-3"></view>
  234. </view>
  235. <text class="empty-text">暂无相关视频</text>
  236. <text class="empty-hint">换个关键词试试吧</text>
  237. </view>
  238. </view>
  239. </view>