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

107 lines
3.7 KiB

  1. <view class="notice-page">
  2. <!-- 毛玻璃背景装饰 -->
  3. <view class="bg-blur"></view>
  4. <!-- 主内容区 -->
  5. <view class="content">
  6. <!-- 头部标题 & 搜索栏一体化 -->
  7. <view class="header">
  8. <text class="title">📋 公告·通知</text>
  9. <view class="search-box">
  10. <text class="icon">🔍</text>
  11. <input
  12. type="text"
  13. placeholder="搜索标题或摘要..."
  14. placeholder-class="placeholder"
  15. bindinput="onSearchInput"
  16. value="{{searchKeyword}}"
  17. confirm-type="search"
  18. bindconfirm="handleSearch"
  19. />
  20. <text class="clear-icon" wx:if="{{searchKeyword}}" bindtap="clearSearch">✕</text>
  21. </view>
  22. </view>
  23. <!-- 分类导航 - 滑动流畅 -->
  24. <scroll-view class="category-scroll" scroll-x show-scrollbar="{{false}}" enhanced>
  25. <view class="category-list">
  26. <view
  27. wx:for="{{categories}}"
  28. wx:key="index"
  29. class="category-item {{currentCategory === item.value ? 'active' : ''}}"
  30. bindtap="switchCategory"
  31. data-category="{{item.value}}"
  32. >
  33. <text>{{item.name}}</text>
  34. <text class="dot" wx:if="{{currentCategory === item.value}}"></text>
  35. </view>
  36. </view>
  37. </scroll-view>
  38. <!-- 列表内容区域 -->
  39. <view class="list-container">
  40. <!-- 骨架屏 / 加载提示 -->
  41. <block wx:if="{{loading && noticeList.length === 0}}">
  42. <view class="skeleton-list">
  43. <view wx:for="{{4}}" wx:key="*this" class="skeleton-item"></view>
  44. </view>
  45. </block>
  46. <!-- 列表渲染 -->
  47. <scroll-view
  48. class="notice-scroll"
  49. scroll-y
  50. enhanced
  51. show-scrollbar="{{false}}"
  52. bindscrolltolower="loadMore"
  53. lower-threshold="50"
  54. refresher-enabled
  55. refresher-triggered="{{refreshing}}"
  56. bindrefresherrefresh="onRefresh"
  57. >
  58. <view class="notice-list">
  59. <view
  60. wx:for="{{noticeList}}"
  61. wx:key="id"
  62. class="notice-card"
  63. bindtap="viewDetail"
  64. data-id="{{item.id}}"
  65. >
  66. <!-- 重要性标记装饰 -->
  67. <view class="card-left-bar" style="background: {{item.importanceColor}};"></view>
  68. <view class="card-content">
  69. <view class="card-header">
  70. <text class="notice-title">{{item.title}}</text>
  71. <text class="notice-tag" style="background: {{item.tagBg}};">{{item.warningType}}</text>
  72. </view>
  73. <view class="notice-abstract">{{item.responseMeasures}}</view>
  74. <view class="card-footer">
  75. <view class="date-time">
  76. <text class="date-icon">📅</text>
  77. <text>{{item.createdTime}}</text>
  78. </view>
  79. </view>
  80. </view>
  81. </view>
  82. </view>
  83. <!-- 上拉加载更多状态 -->
  84. <view class="load-more" wx:if="{{noticeList.length > 0}}">
  85. <block wx:if="{{hasMore}}">
  86. <text class="loading-icon">⋯</text>
  87. <text>加载更多</text>
  88. </block>
  89. <block wx:else>
  90. <text>—— 已经到底了 ——</text>
  91. </block>
  92. </view>
  93. <!-- 空状态展示 -->
  94. <view class="empty-state" wx:if="{{!loading && noticeList.length === 0}}">
  95. <image src="/images/empty-notice.png" mode="aspectFit" style="width: 160rpx; height: 160rpx;" wx:if="{{false}}"></image>
  96. <text>📭 暂无相关公告</text>
  97. <text style="font-size: 28rpx; color: #999; margin-top: 16rpx;">试试其他关键词或分类</text>
  98. </view>
  99. </scroll-view>
  100. </view>
  101. </view>
  102. </view>