diff --git a/frontend/admin/src/pages/PostCreatePage.vue b/frontend/admin/src/pages/PostCreatePage.vue
index 03cb18e..e633260 100644
--- a/frontend/admin/src/pages/PostCreatePage.vue
+++ b/frontend/admin/src/pages/PostCreatePage.vue
@@ -100,14 +100,16 @@ const statusOptions = [
const mediaSelectionTarget = ref('content'); // 'content' or 'headImages'
// Open media selection dialog
-const openMediaDialog = (target = 'content') => {
+const openMediaDialog = async (target = 'content') => {
mediaSelectionTarget.value = target;
mediaDialogVisible.value = true;
mediaCurrentPage.value = 1;
mediaFirst.value = 0;
- // Set selected items based on target
- selectedMediaItems.value = target === 'headImages' ? [...post.head_images] : [...post.selectedMedia];
- loadMediaItems();
+ await loadMediaItems();
+
+ // Set selected items based on target and match with loaded media items
+ const selectedIds = target === 'headImages' ? post.head_images : post.selectedMedia.map(m => m.id);
+ selectedMediaItems.value = mediaItems.value.filter(item => selectedIds.includes(item.id));
};
// Load media items with pagination
@@ -144,7 +146,8 @@ const confirmMediaSelection = () => {
toast.add({ severity: 'warn', summary: '提示', detail: '展示图片最多选择3张', life: 3000 });
return;
}
- post.head_images = [...selectedMediaItems.value];
+ // Store only IDs
+ post.head_images = selectedMediaItems.value.map(item => item.id);
errors.head_images = '';
loadHeadImagePreviews();
} else {
@@ -169,8 +172,8 @@ const removeMedia = (media) => {
};
// Remove head image
-const removeHeadImage = (media) => {
- const index = post.head_images.findIndex(item => item.id === media.id);
+const removeHeadImage = (mediaId) => {
+ const index = post.head_images.indexOf(mediaId);
if (index > -1) {
post.head_images.splice(index, 1);
loadHeadImagePreviews();
@@ -219,7 +222,6 @@ const savePost = async () => {
try {
post.medias = post.selectedMedia.map(media => media.id);
- post.head_image_ids = post.head_images.map(media => media.id); // Add head image IDs
const resp = await postService.createPost(post);
console.log(resp)
@@ -244,12 +246,12 @@ const cancelCreate = () => {
// Add head image preview loading
const loadHeadImagePreviews = async () => {
headImageUrls.value = [];
- for (const media of post.head_images) {
+ for (const mediaId of post.head_images) {
try {
- const url = await mediaService.getMediaPreviewUrl(media.id);
- headImageUrls.value.push({ id: media.id, url });
+ const url = await mediaService.getMediaPreviewUrl(mediaId);
+ headImageUrls.value.push({ id: mediaId, url });
} catch (error) {
- console.error('Failed to load preview for media:', media.id);
+ console.error('Failed to load preview for media:', mediaId);
}
}
};
@@ -291,13 +293,13 @@ const loadHeadImagePreviews = async () => {
-
![]()
+ class="w-full h-full object-cover rounded bg-gray-200" :alt="mediaId">
+ @click="removeHeadImage(mediaId)" />
diff --git a/frontend/admin/src/pages/PostEditPage.vue b/frontend/admin/src/pages/PostEditPage.vue
index fb7aa28..51d8463 100644
--- a/frontend/admin/src/pages/PostEditPage.vue
+++ b/frontend/admin/src/pages/PostEditPage.vue
@@ -137,14 +137,16 @@ const fetchPost = async (id) => {
};
// Open media selection dialog
-const openMediaDialog = (target = 'content') => {
+const openMediaDialog = async (target = 'content') => {
mediaSelectionTarget.value = target;
mediaDialogVisible.value = true;
mediaCurrentPage.value = 1;
mediaFirst.value = 0;
- // Set selected items based on target
- selectedMediaItems.value = target === 'headImages' ? [...post.head_images] : [...post.selectedMedia];
- loadMediaItems();
+ await loadMediaItems();
+
+ // Set selected items based on target and match with loaded media items
+ const selectedIds = target === 'headImages' ? post.head_images : post.selectedMedia.map(m => m.id);
+ selectedMediaItems.value = mediaItems.value.filter(item => selectedIds.includes(item.id));
};
// Load media items
@@ -172,7 +174,8 @@ const confirmMediaSelection = () => {
toast.add({ severity: 'warn', summary: '提示', detail: '展示图片最多选择3张', life: 3000 });
return;
}
- post.head_images = [...selectedMediaItems.value];
+ // Store only IDs
+ post.head_images = selectedMediaItems.value.map(item => item.id);
errors.head_images = '';
loadHeadImagePreviews();
} else {
@@ -197,8 +200,8 @@ const removeMedia = (media) => {
};
// Remove a selected head image
-const removeHeadImage = (media) => {
- const index = post.head_images.findIndex(item => item.id === media.id);
+const removeHeadImage = (mediaId) => {
+ const index = post.head_images.indexOf(mediaId);
if (index > -1) {
post.head_images.splice(index, 1);
loadHeadImagePreviews();
@@ -208,12 +211,12 @@ const removeHeadImage = (media) => {
// Load head image previews
const loadHeadImagePreviews = async () => {
headImageUrls.value = [];
- for (const media of post.head_images) {
+ for (const mediaId of post.head_images) {
try {
- const url = await mediaService.getMediaPreviewUrl(media.id);
- headImageUrls.value.push({ id: media.id, url });
+ const url = await mediaService.getMediaPreviewUrl(mediaId);
+ headImageUrls.value.push({ id: mediaId, url });
} catch (error) {
- console.error('Failed to load preview for media:', media.id);
+ console.error('Failed to load preview for media:', mediaId);
}
}
};
@@ -258,7 +261,7 @@ const savePost = async () => {
try {
post.medias = post.selectedMedia.map(media => media.id);
- post.head_image_ids = post.head_images.map(media => media.id); // Add head image IDs
+ // Remove head_image_ids, use head_images directly since it now contains IDs
const resp = await postService.updatePost(post.id, post);
if (resp.status !== 200) {
@@ -278,10 +281,6 @@ const cancelEdit = () => {
router.push('/posts');
};
-// File type badge severity mapping
-const getBadgeSeverity = () => {
- return 'info';
-};
// Add pagination handler
const onMediaPage = (event) => {
@@ -343,13 +342,13 @@ onMounted(() => {
-
![]()
+ class="w-full h-full object-cover rounded bg-gray-200" :alt="mediaId">
+ @click="removeHeadImage(mediaId)" />