修改帖子
Change-Id: I467b35242bce8b27d612eb96f2710b27aa03d1d2
diff --git a/src/pages/FriendMoments/FriendMoments.jsx b/src/pages/FriendMoments/FriendMoments.jsx
index 6d9def6..fd017b2 100644
--- a/src/pages/FriendMoments/FriendMoments.jsx
+++ b/src/pages/FriendMoments/FriendMoments.jsx
@@ -4,69 +4,66 @@
import Header from '../../components/Header';
import { Edit } from '@icon-park/react';
-
-const USER_ID = 456;
-
const FriendMoments = () => {
const [feeds, setFeeds] = useState([]);
const [filteredFeeds, setFilteredFeeds] = useState([]);
const [query, setQuery] = useState('');
+ const [userId, setUserId] = useState(456); // 从状态管理或登录信息获取
// Modal state & form fields
const [showModal, setShowModal] = useState(false);
const [title, setTitle] = useState('');
const [content, setContent] = useState('');
- const [previewUrls, setPreviewUrls] = useState([]);
- const [images, setImages] = useState([]);
+ const [selectedImages, setSelectedImages] = useState([]);
+ const [previewUrls, setPreviewUrls] = useState([]); // 新增:图片预览URLs
// 拉取好友动态列表
const fetchFeeds = async () => {
try {
- const res = await axios.get(`/echo/users/${USER_ID}/feeds`);
- setFeeds(res.data.feeds);
- setFilteredFeeds(res.data.feeds);
+ // 修改为新的API路径
+ const res = await axios.get(`/echo/dynamic/${userId}/getAllDynamics`);
+ setFeeds(res.data.posts || []);
+ setFilteredFeeds(res.data.posts || []);
} catch (err) {
console.error('获取动态列表失败:', err);
+ alert('获取动态列表失败,请稍后重试');
}
};
useEffect(() => {
fetchFeeds();
- }, []);
+ }, [userId]);
// 搜索处理
const handleSearch = () => {
const q = query.trim().toLowerCase();
- if (!q) return;
+ if (!q) {
+ setFilteredFeeds(feeds);
+ return;
+ }
setFilteredFeeds(
- feeds.filter(f => (f.title || '').toLowerCase().includes(q))
+ feeds.filter(f =>
+ (f.title || '').toLowerCase().includes(q) ||
+ (f.postContent || '').toLowerCase().includes(q)
+ )
);
};
+
const handleReset = () => {
setQuery('');
setFilteredFeeds(feeds);
};
- // 对话框内:本地预览 & 上传
- const handleImageChange = async (e) => {
+ // 对话框内:处理图片选择
+ const handleImageChange = (e) => {
const files = Array.from(e.target.files);
if (!files.length) return;
- setPreviewUrls(files.map(f => URL.createObjectURL(f)));
- try {
- const uploaded = await Promise.all(files.map(f => uploadImageToServer(f)));
- setImages(uploaded);
- } catch (err) {
- console.error('图片上传失败', err);
- alert('图片上传失败,请重试');
- }
- };
- const uploadImageToServer = async (file) => {
- const fd = new FormData();
- fd.append('file', file);
- const res = await axios.post(`/upload`, fd, {
- headers: {'Content-Type':'multipart/form-data'}
- });
- return res.data.url;
+
+ // 生成预览URLs
+ const previewUrls = files.map(file => URL.createObjectURL(file));
+
+ setSelectedImages(files);
+ setPreviewUrls(previewUrls); // 更新预览URLs
};
// 对话框内:提交新动态
@@ -75,18 +72,33 @@
alert('内容不能为空');
return;
}
+
try {
- await axios.post(
- `/echo/users/${USER_ID}/createFeed`,
- { title: title.trim() || undefined, friend_content: content.trim(), images }
- );
+ const formData = new FormData();
+ formData.append('user_id', userId);
+ formData.append('title', title.trim() || '');
+ formData.append('content', content.trim());
+
+ // 添加图片文件
+ selectedImages.forEach((file, index) => {
+ formData.append('image_url', file);
+ });
+
+ // 修改为新的API路径
+ await axios.post(`/echo/dynamic/${userId}/createDynamic`, formData, {
+ headers: {
+ 'Content-Type': 'multipart/form-data'
+ }
+ });
+
// 重置表单
setTitle('');
setContent('');
- setImages([]);
- setPreviewUrls([]);
+ setSelectedImages([]);
+ setPreviewUrls([]); // 重置预览URLs
setShowModal(false);
fetchFeeds();
+ alert('发布成功');
} catch (err) {
console.error('发布失败', err);
alert('发布失败,请稍后重试');
@@ -94,14 +106,75 @@
};
// 删除动态
- const handleDelete = async (feedId) => {
+ const handleDelete = async (dynamicId) => {
if (!window.confirm('确定要删除这条动态吗?')) return;
try {
- await axios.delete(`/echo/users/me/feed/${feedId}`);
+ // 修改为新的API路径
+ await axios.delete(`/echo/dynamic/me/deleteDynamic/${dynamicId}`);
fetchFeeds();
+ alert('删除成功');
} catch (err) {
console.error('删除失败', err);
- alert('删除失败');
+ alert('删除失败,请稍后重试');
+ }
+ };
+
+ // 点赞动态
+ const handleLike = async (dynamicId) => {
+ try {
+ // 调用新的点赞API
+ const res = await axios.post(`/echo/dynamic/like`, {
+ userId,
+ dynamicId
+ });
+
+ if (res.status === 200) {
+ // 更新本地状态
+ setFeeds(feeds.map(feed => {
+ if (feed.postNo === dynamicId) {
+ return {
+ ...feed,
+ postLikeNum: (feed.postLikeNum || 0) + 1,
+ liked: true
+ };
+ }
+ return feed;
+ }));
+ } else {
+ alert(res.data.message || '点赞失败');
+ }
+ } catch (err) {
+ console.error('点赞失败', err);
+ alert('点赞失败,请稍后重试');
+ }
+ };
+
+ // 取消点赞
+ const handleUnlike = async (dynamicId) => {
+ try {
+ // 调用新的取消点赞API
+ const res = await axios.delete(`/echo/dynamic/unlike`, {
+ data: { userId, dynamicId }
+ });
+
+ if (res.status === 200) {
+ // 更新本地状态
+ setFeeds(feeds.map(feed => {
+ if (feed.postNo === dynamicId) {
+ return {
+ ...feed,
+ postLikeNum: Math.max(0, (feed.postLikeNum || 0) - 1),
+ liked: false
+ };
+ }
+ return feed;
+ }));
+ } else {
+ alert(res.data.message || '取消点赞失败');
+ }
+ } catch (err) {
+ console.error('取消点赞失败', err);
+ alert('取消点赞失败,请稍后重试');
}
};
@@ -128,13 +201,13 @@
<div className="feed-list">
{filteredFeeds.map(feed => (
- <div className="feed-item" key={feed.feed_id}>
+ <div className="feed-item" key={feed.postNo}>
{feed.title && <h4>{feed.title}</h4>}
- <p>{feed.friend_content}</p>
+ <p>{feed.postContent}</p>
- {feed.images?.length > 0 && (
+ {feed.imageUrl && feed.imageUrl.split(',').length > 0 && (
<div className="feed-images">
- {feed.images.map((url, i) => (
+ {feed.imageUrl.split(',').map((url, i) => (
<img key={i} src={url} alt={`动态图${i}`} />
))}
</div>
@@ -142,10 +215,21 @@
<div className="feed-footer">
<span className="feed-date">
- {new Date(feed.created_at).toLocaleString()}
+ {new Date(feed.postTime).toLocaleString()}
</span>
- {feed.is_mine && (
- <button className="delete-btn" onClick={() => handleDelete(feed.feed_id)}>
+ <div className="like-container">
+ {feed.liked ? (
+ <button className="unlike-btn" onClick={() => handleUnlike(feed.postNo)}>
+ 已点赞 ({feed.postLikeNum || 0})
+ </button>
+ ) : (
+ <button className="like-btn" onClick={() => handleLike(feed.postNo)}>
+ 点赞 ({feed.postLikeNum || 0})
+ </button>
+ )}
+ </div>
+ {feed.user_id === userId && (
+ <button className="delete-btn" onClick={() => handleDelete(feed.postNo)}>
删除
</button>
)}
@@ -170,12 +254,6 @@
value={content}
onChange={e => setContent(e.target.value)}
/>
- {/* <input
- type="file"
- accept="image/*"
- multiple
- onChange={handleImageChange}
- /> */}
<label className="file-label">
选择图片
<input
@@ -187,7 +265,7 @@
/>
</label>
<div className="cf-preview">
- {previewUrls.map((url, i) => (
+ {previewUrls.map((url, i) => ( // 使用定义的previewUrls
<img key={i} src={url} alt={`预览${i}`} />
))}
</div>
@@ -206,5 +284,4 @@
);
};
-export default FriendMoments;
-
+export default FriendMoments;
\ No newline at end of file