| 
		 Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB  | 
| 
		 After Width: | Height: | Size: 762 B  | 
| 
		 After Width: | Height: | Size: 1.0 KiB  | 
| 
		 After Width: | Height: | Size: 990 B  | 
| 
		 Before Width: | Height: | Size: 496 B After Width: | Height: | Size: 792 B  | 
| 
		 Before Width: | Height: | Size: 701 B After Width: | Height: | Size: 1.1 KiB  | 
| 
		 After Width: | Height: | Size: 3.2 KiB  | 
| 
		 Before Width: | Height: | Size: 600 B After Width: | Height: | Size: 1.0 KiB  | 
| 
		 Before Width: | Height: | Size: 873 B After Width: | Height: | Size: 1.5 KiB  | 
| 
		 Before Width: | Height: | Size: 553 B After Width: | Height: | Size: 1.0 KiB  | 
| 
		 Before Width: | Height: | Size: 774 B After Width: | Height: | Size: 1.4 KiB  | 
| 
		 Before Width: | Height: | Size: 464 B After Width: | Height: | Size: 777 B  | 
| 
		 Before Width: | Height: | Size: 671 B After Width: | Height: | Size: 1.2 KiB  | 
@ -0,0 +1,242 @@ | 
				
			|||||||
 | 
					<template> | 
				
			||||||
 | 
					  <view class="container"> | 
				
			||||||
 | 
					    <!-- Tab 切换 --> | 
				
			||||||
 | 
					    <view class="tab-container"> | 
				
			||||||
 | 
					      <view | 
				
			||||||
 | 
					        v-for="(tab, index) in tabs" | 
				
			||||||
 | 
					        :key="index" | 
				
			||||||
 | 
					        class="tab-item" | 
				
			||||||
 | 
					        :class="{ active: currentTab === index }" | 
				
			||||||
 | 
					        @tap="switchTab(index)" | 
				
			||||||
 | 
					      > | 
				
			||||||
 | 
					        <text>{{ tab.name }}</text> | 
				
			||||||
 | 
					        <text v-if="tab.count > 0" class="badge">{{ tab.count }}</text> | 
				
			||||||
 | 
					      </view> | 
				
			||||||
 | 
					    </view> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <!-- 列表内容 --> | 
				
			||||||
 | 
					    <scroll-view | 
				
			||||||
 | 
					      class="scroll-container" | 
				
			||||||
 | 
					      scroll-y | 
				
			||||||
 | 
					      @scrolltolower="loadMore" | 
				
			||||||
 | 
					      @refresherrefresh="onRefresh" | 
				
			||||||
 | 
					      refresher-enabled | 
				
			||||||
 | 
					      :refresher-triggered="isRefreshing" | 
				
			||||||
 | 
					    > | 
				
			||||||
 | 
					      <view | 
				
			||||||
 | 
					        v-for="(item, index) in list" | 
				
			||||||
 | 
					        :key="index" | 
				
			||||||
 | 
					        :class="['notice-item', !item.type ? 'is-read' : '']" | 
				
			||||||
 | 
					        @tap="goDetail(item)" | 
				
			||||||
 | 
					      > | 
				
			||||||
 | 
					        <view :class="['notice-icon', !item.type ? 'green' : '']"> | 
				
			||||||
 | 
					          <image | 
				
			||||||
 | 
					            :src=" | 
				
			||||||
 | 
					              !item.type | 
				
			||||||
 | 
					                ? '/static/images/owner/message.png' | 
				
			||||||
 | 
					                : '/static/images/owner/message-grey.png' | 
				
			||||||
 | 
					            " | 
				
			||||||
 | 
					            mode="aspectFill" | 
				
			||||||
 | 
					          ></image> | 
				
			||||||
 | 
					        </view> | 
				
			||||||
 | 
					        <view class="notice-content"> | 
				
			||||||
 | 
					          <view class="notice-title">{{ item.title }}</view> | 
				
			||||||
 | 
					          <view class="notice-time">{{ item.time }}</view> | 
				
			||||||
 | 
					        </view> | 
				
			||||||
 | 
					        <view class="notice-arrow"> | 
				
			||||||
 | 
					          <text class="iconfont icon-right"></text> | 
				
			||||||
 | 
					        </view> | 
				
			||||||
 | 
					      </view> | 
				
			||||||
 | 
					      <cs-emty v-if="list.length == 0"></cs-emty> | 
				
			||||||
 | 
					    </scroll-view> | 
				
			||||||
 | 
					  </view> | 
				
			||||||
 | 
					</template> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script> | 
				
			||||||
 | 
					export default { | 
				
			||||||
 | 
					  data() { | 
				
			||||||
 | 
					    return { | 
				
			||||||
 | 
					      tabs: [ | 
				
			||||||
 | 
					        { name: '任务通知', count: 4 }, | 
				
			||||||
 | 
					        { name: '整改到期', count: 0 }, | 
				
			||||||
 | 
					        { name: '资质逾期', count: 0 } | 
				
			||||||
 | 
					      ], | 
				
			||||||
 | 
					      currentTab: 0, | 
				
			||||||
 | 
					      list: [], | 
				
			||||||
 | 
					      mock: [ | 
				
			||||||
 | 
					        { | 
				
			||||||
 | 
					          id: 1, | 
				
			||||||
 | 
					          title: '全区餐饮环保检查全区餐饮环保检查全区餐饮环保检查...', | 
				
			||||||
 | 
					          time: '2025年3月18日 - 2025年3月18日', | 
				
			||||||
 | 
					          icon: '/static/images/notice-icon.png', | 
				
			||||||
 | 
					          type: 0 | 
				
			||||||
 | 
					        }, | 
				
			||||||
 | 
					        { | 
				
			||||||
 | 
					          id: 2, | 
				
			||||||
 | 
					          title: '餐饮店卫生检查通知', | 
				
			||||||
 | 
					          time: '2025年3月15日 - 2025年3月20日', | 
				
			||||||
 | 
					          icon: '/static/images/notice-icon.png', | 
				
			||||||
 | 
					          type: 0 | 
				
			||||||
 | 
					        }, | 
				
			||||||
 | 
					        { | 
				
			||||||
 | 
					          id: 3, | 
				
			||||||
 | 
					          title: '消防安全整改通知', | 
				
			||||||
 | 
					          time: '2025年3月10日 - 2025年3月25日', | 
				
			||||||
 | 
					          icon: '/static/images/notice-icon.png', | 
				
			||||||
 | 
					          type: 1 | 
				
			||||||
 | 
					        }, | 
				
			||||||
 | 
					        { | 
				
			||||||
 | 
					          id: 4, | 
				
			||||||
 | 
					          title: '营业执照即将到期提醒', | 
				
			||||||
 | 
					          time: '2025年4月1日到期', | 
				
			||||||
 | 
					          icon: '/static/images/notice-icon.png', | 
				
			||||||
 | 
					          type: 1 | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					      ], | 
				
			||||||
 | 
					      page: 1, | 
				
			||||||
 | 
					      isRefreshing: false, | 
				
			||||||
 | 
					      hasMore: true // 添加是否有更多数据的标志 | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  onLoad() { | 
				
			||||||
 | 
					    this.getList() | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  methods: { | 
				
			||||||
 | 
					    switchTab(index) { | 
				
			||||||
 | 
					      if (this.currentTab === index) return | 
				
			||||||
 | 
					      this.currentTab = index | 
				
			||||||
 | 
					      this.page = 1 | 
				
			||||||
 | 
					      this.list = [] | 
				
			||||||
 | 
					      this.getList() | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					    async getList() { | 
				
			||||||
 | 
					      if (this.currentTab == 0) { | 
				
			||||||
 | 
					        this.list = [...this.mock, ...this.mock] | 
				
			||||||
 | 
					      } | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					    async loadMore() { | 
				
			||||||
 | 
					      if (!this.hasMore) return // 没有更多数据时不再加载 | 
				
			||||||
 | 
					      this.page++ | 
				
			||||||
 | 
					      await this.getList() | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					    async onRefresh() { | 
				
			||||||
 | 
					      try { | 
				
			||||||
 | 
					        this.isRefreshing = true | 
				
			||||||
 | 
					        this.page = 1 | 
				
			||||||
 | 
					        await this.getList() | 
				
			||||||
 | 
					      } finally { | 
				
			||||||
 | 
					        this.isRefreshing = false | 
				
			||||||
 | 
					      } | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					    goDetail(item) { | 
				
			||||||
 | 
					      //   // 跳转到详情页 | 
				
			||||||
 | 
					      //   uni.navigateTo({ | 
				
			||||||
 | 
					      //     url: `/pages/notice-detail/notice-detail?id=${item.id}`, | 
				
			||||||
 | 
					      //   }); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					</script> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style lang="scss" scoped> | 
				
			||||||
 | 
					.container { | 
				
			||||||
 | 
					  height: 100vh; | 
				
			||||||
 | 
					  display: flex; | 
				
			||||||
 | 
					  flex-direction: column; | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.tab-container { | 
				
			||||||
 | 
					  display: flex; | 
				
			||||||
 | 
					  background: #fff; | 
				
			||||||
 | 
					  padding: 24rpx 32rpx; | 
				
			||||||
 | 
					  gap: 24rpx; | 
				
			||||||
 | 
					  border-bottom: 2rpx solid var(--LightMode-Grey-Grey-100, #f9f9f9); | 
				
			||||||
 | 
					  .tab-item { | 
				
			||||||
 | 
					    flex: 1; | 
				
			||||||
 | 
					    text-align: center; | 
				
			||||||
 | 
					    position: relative; | 
				
			||||||
 | 
					    height: 64rpx; | 
				
			||||||
 | 
					    line-height: 64rpx; | 
				
			||||||
 | 
					    font-size: 28rpx; | 
				
			||||||
 | 
					    color: #4b5675; | 
				
			||||||
 | 
					    background: #f9f9f9; | 
				
			||||||
 | 
					    border-radius: 240rpx; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    &.active { | 
				
			||||||
 | 
					      color: #07c160; | 
				
			||||||
 | 
					      background: rgba(7, 193, 96, 0.1); | 
				
			||||||
 | 
					      font-weight: bold; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .badge { | 
				
			||||||
 | 
					      margin-left: 8rpx; | 
				
			||||||
 | 
					      color: #07c160; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.scroll-container { | 
				
			||||||
 | 
					  flex: 1; | 
				
			||||||
 | 
					  box-sizing: border-box; | 
				
			||||||
 | 
					  max-height: calc(100vh - 124rpx); | 
				
			||||||
 | 
					  padding: 0 24rpx; | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.notice-item { | 
				
			||||||
 | 
					  display: flex; | 
				
			||||||
 | 
					  align-items: center; | 
				
			||||||
 | 
					  padding: 32rpx 24rpx; | 
				
			||||||
 | 
					  border-radius: 16rpx; | 
				
			||||||
 | 
					  border: 2rpx solid #f9f9f9; | 
				
			||||||
 | 
					  background: #fff; | 
				
			||||||
 | 
					  color: #4b5675; | 
				
			||||||
 | 
					  margin-top: 24rpx; | 
				
			||||||
 | 
					  &:last-child { | 
				
			||||||
 | 
					    margin-bottom: 48rpx; | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					  .notice-icon { | 
				
			||||||
 | 
					    padding: 16rpx; | 
				
			||||||
 | 
					    border-radius: 50%; | 
				
			||||||
 | 
					    background-color: #f9f9f9; | 
				
			||||||
 | 
					    box-sizing: border-box; | 
				
			||||||
 | 
					    margin-right: 24rpx; | 
				
			||||||
 | 
					    display: flex; | 
				
			||||||
 | 
					    justify-content: center; | 
				
			||||||
 | 
					    align-items: center; | 
				
			||||||
 | 
					    image { | 
				
			||||||
 | 
					      width: 40rpx; | 
				
			||||||
 | 
					      height: 40rpx; | 
				
			||||||
 | 
					      flex-shrink: 0; | 
				
			||||||
 | 
					      z-index: 1; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					  .green { | 
				
			||||||
 | 
					    background-color: #eafff1; | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					  .notice-content { | 
				
			||||||
 | 
					    flex: 1; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .notice-title { | 
				
			||||||
 | 
					      margin-bottom: 10rpx; | 
				
			||||||
 | 
					      font-weight: bold; | 
				
			||||||
 | 
					      max-width: 486rpx; | 
				
			||||||
 | 
					      overflow: hidden; | 
				
			||||||
 | 
					      text-overflow: ellipsis; | 
				
			||||||
 | 
					      white-space: nowrap; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .notice-time { | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .notice-arrow { | 
				
			||||||
 | 
					    color: #c4cada; | 
				
			||||||
 | 
					    font-size: 24rpx; | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					.is-read { | 
				
			||||||
 | 
					  color: #071437; | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					</style> | 
				
			||||||
@ -1 +1,32 @@ | 
				
			|||||||
@import '../common/index.wxss';.van-dropdown-item{left:0;overflow:hidden;position:fixed;right:0}.van-dropdown-item__option{text-align:left}.van-dropdown-item__option--active .van-dropdown-item__icon,.van-dropdown-item__option--active .van-dropdown-item__title{color:var(--dropdown-menu-option-active-color,#ee0a24)}.van-dropdown-item--up{top:0}.van-dropdown-item--down{bottom:0}.van-dropdown-item__icon{display:block;line-height:inherit} | 
					@import '../common/index.wxss'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.van-dropdown-item { | 
				
			||||||
 | 
						left: 0; | 
				
			||||||
 | 
						overflow: hidden; | 
				
			||||||
 | 
						position: fixed; | 
				
			||||||
 | 
						right: 0 | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.van-dropdown-item__option { | 
				
			||||||
 | 
						text-align: left | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.van-dropdown-item__option--active .van-dropdown-item__icon, | 
				
			||||||
 | 
					.van-dropdown-item__option--active .van-dropdown-item__title { | 
				
			||||||
 | 
						color: var(--dropdown-menu-option-active-color, #ee0a24) | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.van-dropdown-item--up { | 
				
			||||||
 | 
						top: 0 | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.van-dropdown-item--down { | 
				
			||||||
 | 
						/* bottom: 48rpx */ | 
				
			||||||
 | 
						bottom: 0; | 
				
			||||||
 | 
						margin-bottom: 48rpx; | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.van-dropdown-item__icon { | 
				
			||||||
 | 
						display: block; | 
				
			||||||
 | 
						line-height: inherit | 
				
			||||||
 | 
					} | 
				
			||||||