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

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();
}
});