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.
477 lines
11 KiB
477 lines
11 KiB
import http from '../../../utils/api'
|
|
const baseUrl = require('../../../utils/baseUrl')
|
|
|
|
Page({
|
|
data: {
|
|
// 帖子列表相关
|
|
posts: [],
|
|
baseUrl: baseUrl,
|
|
loading: false,
|
|
searchLoading: false,
|
|
initialLoading: true,
|
|
loadingMore: false,
|
|
refreshing: false,
|
|
hasMore: true,
|
|
page: 1,
|
|
pageSize: 10,
|
|
searchKeyword: '',
|
|
lastSearchKeyword: '', // 新增:记录上次搜索关键词
|
|
|
|
scrollTop: 0,
|
|
showBackToTop: false,
|
|
scrollThreshold: 300,
|
|
|
|
// 发布帖子相关
|
|
showPostModal: false,
|
|
postTitle: '',
|
|
postContent: '',
|
|
postImages: [],
|
|
isSubmitting: false
|
|
},
|
|
|
|
onLoad: function () {
|
|
this.loadPosts(true);
|
|
},
|
|
|
|
onShow: function () {
|
|
// 每次显示页面时刷新数据
|
|
this.refreshData();
|
|
},
|
|
|
|
// 加载帖子列表
|
|
loadPosts: function (reset = false) {
|
|
// 防止重复请求
|
|
if (reset) {
|
|
this.setData({
|
|
page: 1,
|
|
hasMore: true,
|
|
loading: true,
|
|
searchLoading: !!this.data.searchKeyword
|
|
});
|
|
} else if (this.data.loadingMore) {
|
|
return;
|
|
}
|
|
|
|
this.setData({
|
|
loading: reset || this.data.page === 1,
|
|
loadingMore: !reset && this.data.page > 1
|
|
});
|
|
|
|
// 准备请求参数
|
|
const params = {
|
|
page: this.data.page,
|
|
pageSize: this.data.pageSize
|
|
};
|
|
|
|
// 如果有搜索关键词,添加搜索参数
|
|
const searchKeyword = this.data.searchKeyword.trim();
|
|
if (searchKeyword) {
|
|
params.searchKey = searchKeyword;
|
|
}
|
|
|
|
// 记录当前搜索关键词
|
|
this.setData({
|
|
lastSearchKeyword: searchKeyword
|
|
});
|
|
|
|
// 调用接口获取数据
|
|
http.forumList({
|
|
data: params,
|
|
success: (res) => {
|
|
if (res.code === 200) {
|
|
let postsData = res.rows || [];
|
|
|
|
// 处理图片字段(分割字符串为数组)
|
|
postsData = postsData.map(item => {
|
|
if (item.images && typeof item.images === 'string') {
|
|
item.images = item.images.split(',').filter(img => img.trim() !== '');
|
|
} else {
|
|
item.images = [];
|
|
}
|
|
return item;
|
|
});
|
|
|
|
if (reset) {
|
|
this.setData({
|
|
posts: postsData,
|
|
loading: false,
|
|
searchLoading: false,
|
|
initialLoading: false,
|
|
hasMore: postsData.length === this.data.pageSize
|
|
});
|
|
} else {
|
|
this.setData({
|
|
posts: [...this.data.posts, ...postsData],
|
|
loading: false,
|
|
initialLoading: false,
|
|
loadingMore: false,
|
|
hasMore: postsData.length === this.data.pageSize
|
|
});
|
|
}
|
|
} else {
|
|
wx.showToast({
|
|
title: res.msg || '加载失败',
|
|
icon: 'none'
|
|
});
|
|
this.setData({
|
|
loading: false,
|
|
searchLoading: false,
|
|
initialLoading: false,
|
|
loadingMore: false
|
|
});
|
|
}
|
|
|
|
if (this.data.refreshing) {
|
|
wx.stopPullDownRefresh();
|
|
this.setData({
|
|
refreshing: false
|
|
});
|
|
}
|
|
},
|
|
fail: (err) => {
|
|
wx.showToast({
|
|
title: '网络错误',
|
|
icon: 'none'
|
|
});
|
|
this.setData({
|
|
loading: false,
|
|
searchLoading: false,
|
|
initialLoading: false,
|
|
loadingMore: false,
|
|
refreshing: false
|
|
});
|
|
}
|
|
});
|
|
},
|
|
|
|
// 下拉刷新
|
|
onRefresh: function () {
|
|
this.setData({
|
|
refreshing: true
|
|
});
|
|
this.loadPosts(true);
|
|
},
|
|
|
|
// 加载更多
|
|
loadMore: function () {
|
|
if (!this.data.hasMore || this.data.loadingMore) return;
|
|
|
|
this.setData({
|
|
page: this.data.page + 1
|
|
}, () => {
|
|
this.loadPosts();
|
|
});
|
|
},
|
|
|
|
// 搜索输入(防抖)
|
|
onSearchInput: function (e) {
|
|
const keyword = e.detail.value;
|
|
this.setData({
|
|
searchKeyword: keyword
|
|
});
|
|
|
|
// 防抖搜索
|
|
clearTimeout(this.searchTimer);
|
|
|
|
// 如果输入框为空,立即重置搜索
|
|
if (!keyword.trim()) {
|
|
this.setData({
|
|
searchKeyword: ''
|
|
});
|
|
// 清空搜索时立即重新加载数据
|
|
this.loadPosts(true);
|
|
return;
|
|
}
|
|
|
|
this.searchTimer = setTimeout(() => {
|
|
// 只有当有搜索词且与上次不同时才搜索
|
|
if (keyword.trim() && keyword.trim() !== this.data.lastSearchKeyword) {
|
|
this.loadPosts(true);
|
|
}
|
|
}, 500);
|
|
},
|
|
|
|
// 搜索确认
|
|
onSearchConfirm: function (e) {
|
|
const keyword = e.detail.value.trim();
|
|
this.setData({
|
|
searchKeyword: keyword
|
|
});
|
|
|
|
// 如果搜索词为空,加载所有帖子
|
|
if (!keyword) {
|
|
this.loadPosts(true);
|
|
} else {
|
|
// 只有当搜索词与上次不同时才搜索
|
|
if (keyword !== this.data.lastSearchKeyword) {
|
|
this.loadPosts(true);
|
|
}
|
|
}
|
|
},
|
|
|
|
// 清空搜索 - 优化版
|
|
clearSearch: function () {
|
|
// 如果当前已经有搜索词,才执行清空操作
|
|
if (this.data.searchKeyword) {
|
|
this.setData({
|
|
searchKeyword: ''
|
|
}, () => {
|
|
// 清空后立即加载所有帖子
|
|
this.loadPosts(true);
|
|
});
|
|
}
|
|
},
|
|
|
|
// 跳转到详情页
|
|
goToDetail: function (e) {
|
|
const postId = e.currentTarget.dataset.id;
|
|
wx.navigateTo({
|
|
url: `/pagesB/pages/onlineAsk/onlineAsk?id=${postId}`
|
|
});
|
|
},
|
|
|
|
// 图片预览功能
|
|
previewImage: function (e) {
|
|
const postIndex = e.currentTarget.dataset.postindex;
|
|
const imageIndex = e.currentTarget.dataset.imageindex;
|
|
const post = this.data.posts[postIndex];
|
|
|
|
if (!post || !post.images || post.images.length === 0) return;
|
|
|
|
// 构建完整的图片URL数组
|
|
const urls = post.images.map(img => this.data.baseUrl + img);
|
|
|
|
wx.previewImage({
|
|
current: urls[imageIndex], // 当前显示图片的链接
|
|
urls: urls // 需要预览的图片链接列表
|
|
});
|
|
},
|
|
|
|
// 显示发布模态框
|
|
createPost: function () {
|
|
// 检查登录状态(如果需要)
|
|
// 这里可以添加登录检查逻辑
|
|
|
|
this.setData({
|
|
showPostModal: true
|
|
});
|
|
},
|
|
|
|
// 隐藏发布模态框
|
|
hidePostModal: function () {
|
|
if (this.data.isSubmitting) return;
|
|
this.setData({
|
|
showPostModal: false,
|
|
postTitle: '',
|
|
postContent: '',
|
|
postImages: []
|
|
});
|
|
},
|
|
|
|
// 阻止事件冒泡
|
|
stopPropagation: function () {},
|
|
|
|
// 标题输入
|
|
onPostTitleInput: function (e) {
|
|
this.setData({
|
|
postTitle: e.detail.value
|
|
});
|
|
},
|
|
|
|
// 内容输入
|
|
onPostContentInput: function (e) {
|
|
this.setData({
|
|
postContent: e.detail.value
|
|
});
|
|
},
|
|
|
|
// 选择图片
|
|
chooseImage: function () {
|
|
const remaining = 3 - this.data.postImages.length;
|
|
if (remaining <= 0) {
|
|
wx.showToast({
|
|
title: '最多上传3张图片',
|
|
icon: 'none'
|
|
});
|
|
return;
|
|
}
|
|
|
|
wx.chooseMedia({
|
|
count: remaining,
|
|
mediaType: ['image'],
|
|
sizeType: ['compressed'],
|
|
sourceType: ['album', 'camera'],
|
|
success: (res) => {
|
|
const tempFiles = res.tempFiles;
|
|
const newImages = tempFiles.map(file => file.tempFilePath);
|
|
const postImages = [...this.data.postImages, ...newImages];
|
|
|
|
this.setData({
|
|
postImages: postImages.slice(0, 3) // 确保不超过3张
|
|
});
|
|
},
|
|
fail: (err) => {
|
|
console.error('选择图片失败:', err);
|
|
}
|
|
});
|
|
},
|
|
|
|
// 移除图片
|
|
removeImage: function (e) {
|
|
const index = e.currentTarget.dataset.index;
|
|
const postImages = [...this.data.postImages];
|
|
postImages.splice(index, 1);
|
|
this.setData({
|
|
postImages
|
|
});
|
|
},
|
|
|
|
// 提交帖子
|
|
submitPost: function () {
|
|
const { postTitle, postContent, postImages } = this.data;
|
|
|
|
// 验证输入
|
|
if (!postTitle.trim()) {
|
|
wx.showToast({
|
|
title: '请输入标题',
|
|
icon: 'none'
|
|
});
|
|
return;
|
|
}
|
|
|
|
if (!postContent.trim()) {
|
|
wx.showToast({
|
|
title: '请输入内容',
|
|
icon: 'none'
|
|
});
|
|
return;
|
|
}
|
|
|
|
this.setData({
|
|
isSubmitting: true
|
|
});
|
|
|
|
// 如果有图片,先上传图片
|
|
const uploadPromises = postImages.map(imagePath => {
|
|
return new Promise((resolve, reject) => {
|
|
wx.uploadFile({
|
|
url: baseUrl+'/common/upload',
|
|
header: {
|
|
'Authorization': 'Bearer ' + wx.getStorageSync('token')
|
|
},
|
|
filePath: imagePath,
|
|
name: 'file',
|
|
success: (res) => {
|
|
const data = JSON.parse(res.data);
|
|
console.log(data);
|
|
if (data.code === 200) {
|
|
resolve(data.fileName); // 假设返回的图片路径在data.url中
|
|
} else {
|
|
reject(new Error('图片上传失败'));
|
|
}
|
|
},
|
|
fail: (err) => {
|
|
reject(err);
|
|
}
|
|
});
|
|
});
|
|
});
|
|
|
|
// 处理图片上传
|
|
Promise.all(uploadPromises)
|
|
.then((imageUrls) => {
|
|
// 所有图片上传成功,提交帖子数据
|
|
const postData = {
|
|
title: postTitle,
|
|
content: postContent,
|
|
images: imageUrls.join(',') // 将图片URL用逗号拼接
|
|
};
|
|
|
|
return http.forumAdd({
|
|
data: postData,
|
|
success:res=>{
|
|
console.log(1111,res);
|
|
if (res.code === 200) {
|
|
// 发布成功
|
|
this.setData({
|
|
showPostModal: false,
|
|
postTitle: '',
|
|
postContent: '',
|
|
postImages: [],
|
|
isSubmitting: false
|
|
});
|
|
|
|
wx.showToast({
|
|
title: '发布成功',
|
|
icon: 'success',
|
|
duration: 2000
|
|
});
|
|
|
|
// 刷新帖子列表
|
|
setTimeout(() => {
|
|
this.loadPosts(true);
|
|
}, 500);
|
|
} else {
|
|
throw new Error(res.msg || '发布失败');
|
|
}
|
|
}
|
|
});
|
|
})
|
|
},
|
|
|
|
// 滚动事件监听
|
|
onScroll: function (e) {
|
|
const scrollTop = e.detail.scrollTop;
|
|
const showBackToTop = scrollTop > this.data.scrollThreshold;
|
|
|
|
if (showBackToTop !== this.data.showBackToTop) {
|
|
this.setData({
|
|
scrollTop: scrollTop,
|
|
showBackToTop: showBackToTop
|
|
});
|
|
}
|
|
},
|
|
|
|
// 返回顶部
|
|
backToTop: function () {
|
|
this.setData({
|
|
showBackToTop: false
|
|
});
|
|
|
|
wx.pageScrollTo({
|
|
scrollTop: 0,
|
|
duration: 400,
|
|
success: () => {
|
|
this.setData({
|
|
scrollTop: 0
|
|
});
|
|
},
|
|
fail: (err) => {
|
|
console.log('滚动失败:', err);
|
|
this.setData({
|
|
scrollTop: 0
|
|
});
|
|
}
|
|
});
|
|
},
|
|
|
|
// 刷新数据
|
|
refreshData: function () {
|
|
const pages = getCurrentPages();
|
|
const currentPage = pages[pages.length - 1];
|
|
if (currentPage.data && currentPage.data.refresh) {
|
|
this.loadPosts(true);
|
|
currentPage.setData({
|
|
refresh: false
|
|
});
|
|
}
|
|
},
|
|
|
|
onPullDownRefresh: function () {
|
|
this.onRefresh();
|
|
},
|
|
|
|
onReachBottom: function () {
|
|
this.loadMore();
|
|
}
|
|
});
|