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
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)'
|
|
}
|
|
})
|