288 lines
6.7 KiB
JavaScript
288 lines
6.7 KiB
JavaScript
// pages/square/square.js - 微信朋友圈风格
|
||
const app = getApp()
|
||
const api = require('../../utils/api')
|
||
|
||
// 模拟动态数据 - 将从API获取,这里仅作为备用
|
||
const MOCK_POSTS = []
|
||
|
||
Page({
|
||
data: {
|
||
statusBarHeight: 44,
|
||
navBarHeight: 44,
|
||
totalNavHeight: 88,
|
||
posts: [],
|
||
showCommentInput: false,
|
||
commentText: '',
|
||
currentCommentPostId: null,
|
||
showCreateModal: false,
|
||
newPostText: '',
|
||
newPostImages: [],
|
||
auditStatus: 0
|
||
},
|
||
|
||
onShow() {
|
||
wx.hideTabBar({ animation: false })
|
||
const app = getApp()
|
||
this.setData({
|
||
auditStatus: app.globalData.auditStatus
|
||
})
|
||
},
|
||
|
||
onLoad() {
|
||
const systemInfo = wx.getSystemInfoSync()
|
||
const statusBarHeight = systemInfo.statusBarHeight || 44
|
||
const menuButton = wx.getMenuButtonBoundingClientRect()
|
||
const navBarHeight = menuButton.height + (menuButton.top - statusBarHeight) * 2
|
||
const totalNavHeight = statusBarHeight + navBarHeight
|
||
|
||
this.setData({
|
||
statusBarHeight,
|
||
navBarHeight,
|
||
totalNavHeight
|
||
})
|
||
|
||
// 从API加载动态列表
|
||
this.loadPosts()
|
||
},
|
||
|
||
/**
|
||
* 加载动态列表
|
||
*/
|
||
async loadPosts() {
|
||
try {
|
||
const res = await api.post.getList({ page: 1, limit: 20 })
|
||
|
||
if (res.success && res.data) {
|
||
const posts = (res.data.list || res.data || []).map(post => ({
|
||
id: post.id,
|
||
userId: post.user_id,
|
||
userName: post.user_name || '用户',
|
||
userAvatar: post.user_avatar || '',
|
||
content: post.content || '',
|
||
images: post.images || [],
|
||
time: post.created_at || '',
|
||
likes: post.likes || [],
|
||
comments: post.comments || [],
|
||
isLiked: post.is_liked || false,
|
||
likesText: (post.likes || []).join(','),
|
||
showActions: false
|
||
}))
|
||
|
||
this.setData({ posts })
|
||
}
|
||
} catch (err) {
|
||
console.error('加载动态失败', err)
|
||
// 如果API失败,使用空列表
|
||
this.setData({ posts: [] })
|
||
}
|
||
},
|
||
|
||
// 显示/隐藏操作面板
|
||
onShowActions(e) {
|
||
const postId = e.currentTarget.dataset.id
|
||
const posts = this.data.posts.map(post => ({
|
||
...post,
|
||
showActions: post.id === postId ? !post.showActions : false
|
||
}))
|
||
this.setData({ posts })
|
||
},
|
||
|
||
// 点击页面其他地方隐藏操作面板
|
||
hideAllActions() {
|
||
const posts = this.data.posts.map(post => ({
|
||
...post,
|
||
showActions: false
|
||
}))
|
||
this.setData({ posts })
|
||
},
|
||
|
||
onLikePost(e) {
|
||
const postId = e.currentTarget.dataset.id
|
||
const posts = this.data.posts.map(post => {
|
||
if (post.id === postId) {
|
||
const isLiked = !post.isLiked
|
||
let likes = [...post.likes]
|
||
|
||
if (isLiked) {
|
||
likes.push('我')
|
||
} else {
|
||
likes = likes.filter(l => l !== '我')
|
||
}
|
||
|
||
return {
|
||
...post,
|
||
isLiked,
|
||
likes,
|
||
likesText: likes.join(','),
|
||
showActions: false
|
||
}
|
||
}
|
||
return { ...post, showActions: false }
|
||
})
|
||
|
||
this.setData({ posts })
|
||
},
|
||
|
||
onCommentPost(e) {
|
||
const postId = e.currentTarget.dataset.id
|
||
// 先隐藏操作面板
|
||
const posts = this.data.posts.map(post => ({
|
||
...post,
|
||
showActions: false
|
||
}))
|
||
|
||
this.setData({
|
||
posts,
|
||
showCommentInput: true,
|
||
currentCommentPostId: postId,
|
||
commentText: ''
|
||
})
|
||
},
|
||
|
||
hideCommentInput() {
|
||
this.setData({
|
||
showCommentInput: false,
|
||
currentCommentPostId: null
|
||
})
|
||
},
|
||
|
||
onCommentInput(e) {
|
||
this.setData({ commentText: e.detail.value })
|
||
},
|
||
|
||
onSendComment() {
|
||
const { commentText, currentCommentPostId, posts } = this.data
|
||
|
||
if (!commentText.trim()) {
|
||
wx.showToast({ title: '请输入评论内容', icon: 'none' })
|
||
return
|
||
}
|
||
|
||
const newPosts = posts.map(post => {
|
||
if (post.id === currentCommentPostId) {
|
||
return {
|
||
...post,
|
||
comments: [
|
||
...post.comments,
|
||
{ id: 'c' + Date.now(), user: '我', text: commentText }
|
||
]
|
||
}
|
||
}
|
||
return post
|
||
})
|
||
|
||
this.setData({
|
||
posts: newPosts,
|
||
showCommentInput: false,
|
||
commentText: '',
|
||
currentCommentPostId: null
|
||
})
|
||
|
||
wx.showToast({ title: '评论成功', icon: 'success' })
|
||
},
|
||
|
||
onPreviewImage(e) {
|
||
const { urls, current } = e.currentTarget.dataset
|
||
wx.previewImage({
|
||
urls,
|
||
current
|
||
})
|
||
},
|
||
|
||
onCreatePost() {
|
||
this.setData({ showCreateModal: true })
|
||
},
|
||
|
||
hideCreateModal() {
|
||
this.setData({
|
||
showCreateModal: false,
|
||
newPostText: '',
|
||
newPostImages: []
|
||
})
|
||
},
|
||
|
||
onNewPostInput(e) {
|
||
this.setData({ newPostText: e.detail.value })
|
||
},
|
||
|
||
onAddImage() {
|
||
wx.chooseMedia({
|
||
count: 9 - this.data.newPostImages.length,
|
||
mediaType: ['image'],
|
||
sourceType: ['album', 'camera'],
|
||
success: (res) => {
|
||
const newImages = res.tempFiles.map(f => f.tempFilePath)
|
||
this.setData({
|
||
newPostImages: [...this.data.newPostImages, ...newImages]
|
||
})
|
||
}
|
||
})
|
||
},
|
||
|
||
onDeleteImage(e) {
|
||
const index = e.currentTarget.dataset.index
|
||
const images = this.data.newPostImages.filter((_, i) => i !== index)
|
||
this.setData({ newPostImages: images })
|
||
},
|
||
|
||
async onSubmitPost() {
|
||
const { newPostText, newPostImages } = this.data
|
||
|
||
if (!newPostText.trim() && newPostImages.length === 0) {
|
||
wx.showToast({ title: '请输入内容或添加图片', icon: 'none' })
|
||
return
|
||
}
|
||
|
||
try {
|
||
// 调用API发布动态
|
||
const res = await api.post.create({
|
||
content: newPostText,
|
||
images: newPostImages
|
||
})
|
||
|
||
if (res.success) {
|
||
this.setData({
|
||
showCreateModal: false,
|
||
newPostText: '',
|
||
newPostImages: []
|
||
})
|
||
|
||
wx.showToast({ title: '发布成功', icon: 'success' })
|
||
|
||
// 重新加载动态列表
|
||
this.loadPosts()
|
||
} else {
|
||
wx.showToast({ title: res.message || '发布失败', icon: 'none' })
|
||
}
|
||
} catch (err) {
|
||
console.error('发布动态失败', err)
|
||
wx.showToast({ title: '发布失败', icon: 'none' })
|
||
}
|
||
},
|
||
|
||
// 切换 Tab - 需要登录的页面检查登录状态
|
||
switchTab(e) {
|
||
const path = e.currentTarget.dataset.path
|
||
const app = getApp()
|
||
|
||
// 消息和我的页面需要登录
|
||
if (path === '/pages/chat/chat' || path === '/pages/profile/profile') {
|
||
if (!app.globalData.isLoggedIn) {
|
||
wx.navigateTo({
|
||
url: '/pages/login/login?redirect=' + encodeURIComponent(path)
|
||
})
|
||
return
|
||
}
|
||
}
|
||
wx.switchTab({ url: path })
|
||
},
|
||
|
||
// 测试按钮
|
||
onTest() {
|
||
wx.showToast({
|
||
title: '测试功能',
|
||
icon: 'none'
|
||
})
|
||
}
|
||
})
|