ai-c/pages/square/square.js
2026-02-02 18:21:32 +08:00

288 lines
6.7 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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