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

279 lines
6.5 KiB

import http from '../../../utils/api'
Page({
data: {
// 分类数据
categories: [],
currentCategory: '全部', // 当前选中分类
currentType: '', // 当前选中的分类值
searchKeyword: '', // 搜索关键字
noticeList: [], // 渲染列表数据
pageIndex: 1, // 页码
pageSize: 8, // 每页条数
hasMore: true, // 是否有更多
loading: false, // 加载中
refreshing: false, // 下拉刷新状态
total: 0, // 总条数
searchTimer: null, // 搜索防抖定时器
isSearching: false, // 是否正在搜索
},
onLoad() {
this.getwarningType()
this.fetchNotices(true)
},
onUnload() {
// 页面卸载时清除定时器
if (this.data.searchTimer) {
clearTimeout(this.data.searchTimer)
}
},
// 获取分类数据
getwarningType() {
http.warningType({
data: {
dictType: 'warning_type'
},
success: res => {
console.log('分类数据:', res)
this.setData({
categories: res.rows || []
})
},
fail: err => {
console.error('获取分类失败:', err)
}
})
},
// 获取通知公告列表
fetchNotices(isRefresh = false) {
const { pageIndex, pageSize, searchKeyword, currentType, loading, hasMore } = this.data
// 如果是刷新或者没有更多数据且不是刷新,则返回
if (!isRefresh && !hasMore) return
if (loading) return
this.setData({ loading: true })
// 构建请求参数
const params = {
pageNum: isRefresh ? 1 : pageIndex,
pageSize: pageSize,
}
// 添加搜索关键字(如果有关键字)
if (searchKeyword && searchKeyword.trim() !== '') {
params.keyword = searchKeyword.trim()
}
// 添加分类筛选(如果有分类且不是"全部")
if (currentType) {
params.warningType = currentType
}
console.log('请求参数:', params, '当前分类:', this.data.currentCategory, '当前类型:', currentType)
http.disaster({
data: params,
success: res => {
console.log('公告数据:', res)
const newList = res.rows || []
const total = res.total || 0
this.setData({
noticeList: isRefresh ? newList : [...this.data.noticeList, ...newList],
total: total,
hasMore: newList.length >= pageSize,
pageIndex: isRefresh ? 2 : pageIndex + 1,
loading: false,
refreshing: false,
isSearching: false
})
},
fail: err => {
console.error('获取公告失败:', err)
this.setData({
loading: false,
refreshing: false,
isSearching: false
})
wx.showToast({
title: '加载失败',
icon: 'none'
})
}
})
},
// 切换分类
switchCategory(e) {
const category = e.currentTarget.dataset.category
const type = e.currentTarget.dataset.type || ''
if (category === this.data.currentCategory) return
console.log('切换分类:', category, type)
this.setData({
currentCategory: category,
currentType: type,
pageIndex: 1,
hasMore: true,
noticeList: []
}, () => {
// 切换分类后立即加载数据(保留当前搜索关键词)
this.fetchNotices(true)
})
},
// 搜索输入 - 实时搜索
onSearchInput(e) {
const keyword = e.detail.value
this.setData({
searchKeyword: keyword,
isSearching: true
})
// 清除之前的定时器
if (this.data.searchTimer) {
clearTimeout(this.data.searchTimer)
}
// 设置新的定时器,300ms后执行搜索
const timer = setTimeout(() => {
this.performSearch()
}, 300)
this.setData({
searchTimer: timer
})
},
// 执行搜索
performSearch() {
const { searchKeyword } = this.data
console.log('执行搜索:', searchKeyword)
// 重置列表并加载新数据
this.setData({
pageIndex: 1,
hasMore: true,
noticeList: []
}, () => {
this.fetchNotices(true)
})
},
// 手动搜索(点击确认时)
handleSearch() {
// 清除防抖定时器
if (this.data.searchTimer) {
clearTimeout(this.data.searchTimer)
}
// 立即执行搜索
this.setData({
pageIndex: 1,
hasMore: true,
noticeList: []
}, () => {
this.fetchNotices(true)
})
},
// 清空搜索框
clearSearch() {
// 清除防抖定时器
if (this.data.searchTimer) {
clearTimeout(this.data.searchTimer)
}
this.setData({
searchKeyword: '',
pageIndex: 1,
hasMore: true,
noticeList: []
}, () => {
// 清空搜索后重新加载数据(保持当前分类)
this.fetchNotices(true)
})
},
// 上拉加载更多
loadMore() {
const { hasMore, loading, refreshing, isSearching } = this.data
if (!hasMore || loading || refreshing || isSearching) return
this.fetchNotices(false)
},
// 下拉刷新
onRefresh() {
// 清除防抖定时器
if (this.data.searchTimer) {
clearTimeout(this.data.searchTimer)
}
this.setData({
refreshing: true,
pageIndex: 1,
hasMore: true
}, () => {
this.fetchNotices(true)
})
},
// 查看详情
viewDetail(e) {
const id = e.currentTarget.dataset.id
//跳转详情页
wx.navigateTo({
url: `/pagesA/pages/noticeListDetails/noticeListDetails?id=${id}`,
})
},
// 根据重要性获取颜色
getImportanceColor(level) {
const colorMap = {
'紧急': '#f43f5e',
'重要': '#f97316',
'一般': '#3b82f6'
}
return colorMap[level] || '#3b82f6'
},
// 获取标签背景色
getTagBg(level) {
const bgMap = {
'紧急': '#fee2e2',
'重要': '#fff3e0',
'一般': '#eef2ff'
}
return bgMap[level] || '#eef2ff'
},
// 获取级别文字颜色
getLevelColor(level) {
const colorMap = {
'紧急': '#f43f5e',
'重要': '#f97316',
'一般': '#3b82f6'
}
return colorMap[level] || '#3b82f6'
},
// 获取级别背景色
getLevelBg(level) {
const bgMap = {
'紧急': 'rgba(244, 63, 94, 0.1)',
'重要': 'rgba(249, 115, 22, 0.1)',
'一般': 'rgba(59, 130, 246, 0.1)'
}
return bgMap[level] || 'rgba(59, 130, 246, 0.1)'
}
})