| | |
| | | <view class="nav-bottom-space"></view> |
| | | </view> |
| | | |
| | | <scroll-view class="news-scroll" scroll-y lower-threshold="80" @scrolltolower="loadMoreNews"> |
| | | <scroll-view :show-scrollbar="false" class="news-scroll" scroll-y lower-threshold="80" @scrolltolower="loadMoreNews"> |
| | | <view v-if="initialLoading" class="list-state"><view class="loading-spinner"></view><text>正在加载人才资讯</text></view> |
| | | <view v-else-if="initialError" class="list-state error-state"><text>人才资讯加载失败</text><text class="retry-text" @tap="retryInitialLoad">重新加载</text></view> |
| | | <view v-else-if="hasLoaded && visibleNews.length == 0" class="list-state"><text>暂无人才资讯</text></view> |
| | |
| | | <text class="news-summary">{{item.summary}}</text> |
| | | <view class="news-meta"><text v-if="item.tag != ''" class="news-tag">{{item.tag}}</text><text class="news-time">{{item.time}}</text></view> |
| | | </view> |
| | | <image class="news-thumb" src="/static/news-assets/meeting-thumb.jpg" mode="aspectFill"></image> |
| | | <!-- 缩略图用后台配置的封面;没配就留空(灰底占位),不再统一显示那张默认会议厅图。 --> |
| | | <image class="news-thumb" :src="item.image != null ? item.image : ''" mode="aspectFill" @error="replaceImage(item)"></image> |
| | | </view> |
| | | </view> |
| | | <view v-if="loadingMore" class="loading-row"><view class="loading-spinner"></view><text>正在加载</text></view> |
| | |
| | | <script setup lang="uts"> |
| | | import { isApiConfigured } from '../../config/api.uts' |
| | | import { getNews } from '../../services/portal.uts' |
| | | import { resolveApiUrl } from '../../services/http.uts' |
| | | import { safeBack } from '../../utils/navigation.uts' |
| | | |
| | | const navTop = ref(28) |
| | |
| | | const failInitialOnce = ref(false) |
| | | const failLoadMoreOnce = ref(false) |
| | | const forceEmpty = ref(false) |
| | | // 封面图加载失败时置空,交给灰底占位,避免出现破图。 |
| | | const replaceImage = (item: any) => { item.image = '' } |
| | | |
| | | onLoad((options: any) => { |
| | | // #ifdef MP-WEIXIN |
| | |
| | | title: item.title != null ? item.title as string : '人才资讯', |
| | | summary: contentPreview(item.contentPreview), |
| | | tag: newsTagText(item.summary), |
| | | time: formatNewsTime(item.publishTime) |
| | | time: formatNewsTime(item.publishTime), |
| | | // 后台配置的封面图;相对路径补成接口域名,没配就留空走灰底占位。 |
| | | image: item.coverUrl != null && ('' + item.coverUrl).trim() != '' ? resolveApiUrl('' + item.coverUrl) : '' |
| | | }) |
| | | } |
| | | return mapped |
| | |
| | | 不覆盖的话标签不会收缩,只会顶出卡片、把时间挤没(省略号也不会出现)。 */ |
| | | .news-tag { display: block; flex: 0 1 auto; flex-grow: 0; flex-shrink: 1; flex-basis: auto; min-width: 0; padding: 5rpx 9rpx; border-radius: 6rpx; background-color: #FFF8EA; color: #F1A32D; font-size: 19rpx; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } |
| | | .news-time { margin-left: 13rpx; color: #A5A8AE; font-size: 20rpx; flex-shrink: 0; } |
| | | .news-thumb { width: 236rpx; height: 168rpx; border-radius: 7rpx; flex-shrink: 0; } |
| | | /* 灰底占位:后台没配封面时不会出现破图或那张默认会议厅图。 */ |
| | | .news-thumb { width: 236rpx; height: 168rpx; border-radius: 7rpx; background-color: #EEEEEE; flex-shrink: 0; } |
| | | .bottom-space { height: calc(28rpx + env(safe-area-inset-bottom)); } |
| | | </style> |