diff --git a/src/main/java/com/example/myproject/config/WebConfig.java b/src/main/java/com/example/myproject/config/WebConfig.java
new file mode 100644
index 0000000..5564452
--- /dev/null
+++ b/src/main/java/com/example/myproject/config/WebConfig.java
@@ -0,0 +1,15 @@
+package com.example.myproject.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+public class WebConfig implements WebMvcConfigurer {
+    @Override
+    public void addResourceHandlers(ResourceHandlerRegistry registry) {
+        // 访问 /uploads/** 映射到本地 D:/Desktop/echo/echo-backend/uploads/
+        registry.addResourceHandler("/uploads/**")
+                .addResourceLocations("file:D:/PT/echo-backend/uploads/");
+    }
+}
diff --git a/src/main/java/com/example/myproject/service/PostService.java b/src/main/java/com/example/myproject/service/PostService.java
index 90fc706..af032a5 100644
--- a/src/main/java/com/example/myproject/service/PostService.java
+++ b/src/main/java/com/example/myproject/service/PostService.java
@@ -1,5 +1,6 @@
 package com.example.myproject.service;
 
+import com.example.myproject.entity.Collections;
 import com.example.myproject.entity.Likes;
 import com.example.myproject.entity.Post;
 import com.example.myproject.entity.Users;
@@ -9,8 +10,8 @@
 import com.example.myproject.repository.UserRepository;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
-import com.example.myproject.entity.Collections;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -25,6 +26,7 @@
 
     @Autowired
     private UserRepository userRepository;
+
     @Autowired
     private LikesRepository likesRepository;
 
@@ -33,11 +35,10 @@
 
     private static final String IMAGE_DIR = "uploads/post/";
 
-
-    //创建帖子
+    // 创建帖子 - 添加 @Transactional
+    @Transactional
     public Map<String, Object> createPost(Long userId, String postContent, String title, MultipartFile[] imageFiles) {
-        // 查找用户信息
-        Users user = userRepository.findById(Long.valueOf(userId)).orElseThrow(() -> new RuntimeException("User not found"));
+        Users user = userRepository.findById(userId).orElseThrow(() -> new RuntimeException("User not found"));
         Post post = new Post();
         post.setUser_id(user.getUserId());
         post.setPostTime(new Date());
@@ -46,7 +47,6 @@
         post.setPostContent(postContent);
         post.setTitle(title);
 
-        // 处理多张图片的上传
         StringBuilder imageUrlsBuilder = new StringBuilder();
         if (imageFiles != null && imageFiles.length > 0) {
             for (int i = 0; i < imageFiles.length; i++) {
@@ -63,6 +63,7 @@
         }
         post.setImageUrl(imageUrlsBuilder.toString());
         Post savedPost = postRepository.save(post);
+
         Map<String, Object> response = new HashMap<>();
         response.put("postNo", savedPost.getPostNo());
         response.put("message", "帖子创建成功");
@@ -78,8 +79,8 @@
         return "/images/" + fileName;
     }
 
-
-    //编辑帖子
+    // 编辑帖子 - 添加 @Transactional
+    @Transactional
     public void updatePost(Long postId, Post post) {
         Post existingPost = postRepository.findById(postId).orElseThrow(() -> new RuntimeException("Post not found"));
         if (post.getTitle() != null) {
@@ -92,11 +93,11 @@
             existingPost.setImageUrl(post.getImageUrl());
         }
         existingPost.setPostTime(post.getPostTime());
-        // 保存更新后的帖子
         postRepository.save(existingPost);
     }
 
-    //删除帖子
+    // 删除帖子 - 添加 @Transactional
+    @Transactional
     public void deletePost(Long postId) {
         // 查找指定 ID 的帖子，如果不存在则抛出异常
         if (!postRepository.existsById(postId)) {
@@ -106,7 +107,8 @@
         postRepository.deleteById(postId);
     }
 
-    //点赞帖子（已完成）
+    // 点赞帖子 - 添加 @Transactional
+    @Transactional
     public void likePost(Long postId, Long userId) {
         // 查找指定 ID 的帖子
         Post post = postRepository.findById(postId).orElseThrow(() -> new RuntimeException("Post not found"));
@@ -121,7 +123,8 @@
         likesRepository.save(like);
     }
 
-    // 取消点赞帖子（已完成）
+    // 取消点赞帖子 - 已有 @Transactional
+    @Transactional
     public void unlikePost(Long postId, Long userId) {
         // 查找指定 ID 的帖子
         Post post = postRepository.findById(postId).orElseThrow(() -> new RuntimeException("Post not found"));
@@ -138,39 +141,78 @@
         postRepository.save(post);
     }
 
+//    // 获取帖子列表 - 不需要 @Transactional（只读操作）
+//    public Map<String, Object> getAllPosts() {
+//        List<Post> posts = postRepository.findAll();
+//        List<Map<String, Object>> postList = new ArrayList<>();
+//
+//        for (Post post : posts) {
+//            Map<String, Object> postMap = new LinkedHashMap<>();
+//            postMap.put("postNo", post.getPostNo());
+//            postMap.put("user_id", post.getUser_id());
+//            postMap.put("postContent", post.getPostContent());
+//            postMap.put("imgUrl", post.getImageUrl());
+//            postMap.put("title", post.getTitle());
+//            postMap.put("createdAt",
+//                    post.getPostTime() != null ? post.getPostTime().toString() : "未设置");
+//
+//            postMap.put("likeCount", post.getPostLikeNum());
+//            postMap.put("collectCount", post.getPostCollectNum());
+//
+//            postList.add(postMap);
+//        }
+//
+//        Map<String, Object> response = new HashMap<>();
+//        // 统计帖子数量
+//        response.put("total", postList.size());
+//        response.put("posts", postList);
+//
+//        return response;
+//    }
+public Map<String, Object> getAllPosts() {
+    List<Post> posts = postRepository.findAll();
+    List<Map<String, Object>> postList = new ArrayList<>();
 
-    // 获取帖子列表（已完成）
-    public Map<String, Object> getAllPosts() {
-        List<Post> posts = postRepository.findAll();
-        List<Map<String, Object>> postList = new ArrayList<>();
+    for (Post post : posts) {
+        Map<String, Object> postMap = new LinkedHashMap<>();
+        postMap.put("postNo", post.getPostNo());
+        postMap.put("user_id", post.getUser_id());
+        postMap.put("postContent", post.getPostContent());
+        postMap.put("imgUrl", post.getImageUrl());
+        postMap.put("title", post.getTitle());
+        postMap.put("createdAt",
+                post.getPostTime() != null ? post.getPostTime().toString() : "未设置");
 
-        for (Post post : posts) {
-            Map<String, Object> postMap = new LinkedHashMap<>();
-            postMap.put("postNo", post.getPostNo());
-            postMap.put("user_id", post.getUser_id());
-            postMap.put("postContent", post.getPostContent());
-            postMap.put("imgUrl", post.getImageUrl());
-            postMap.put("title", post.getTitle());
-            postMap.put("createdAt", post.getPostTime().toString());
-            postMap.put("likeCount", post.getPostLikeNum());
-            postMap.put("collectCount", post.getPostCollectNum());
+        postMap.put("likeCount", post.getPostLikeNum());
+        postMap.put("collectCount", post.getPostCollectNum());
 
-            postList.add(postMap);
+        // 查询用户信息
+        Optional<Users> userOptional = userRepository.findById(post.getUser_id());
+        if (userOptional.isPresent()) {
+            Users user = userOptional.get();
+            postMap.put("username", user.getUsername());
+            postMap.put("avatarUrl", user.getAvatarUrl());
+        } else {
+            postMap.put("username", "未知用户");
+            postMap.put("avatarUrl", null);
         }
 
-        Map<String, Object> response = new HashMap<>();
-        // 统计帖子数量
-        response.put("total", postList.size());
-        response.put("posts", postList);
-
-        return response;
+        postList.add(postMap);
     }
 
+    Map<String, Object> response = new HashMap<>();
+    // 统计帖子数量
+    response.put("total", postList.size());
+    response.put("posts", postList);
+
+    return response;
+}
+
+
+    // 获取单个帖子 - 不需要 @Transactional（只读操作）
     public Map<String, Object> getPostById(Long postId) {
-        // 获取帖子
         Optional<Post> postOptional = postRepository.findById(postId);
 
-        // 如果帖子存在
         if (postOptional.isPresent()) {
             Post post = postOptional.get();
             Map<String, Object> postData = new LinkedHashMap<>();
@@ -181,14 +223,14 @@
 
             if (user != null) {
                 postData.put("username", user.getUsername());
-                postData.put("avatar_url", user.getAvatarUrl());
+                postData.put("avatarUrl", user.getAvatarUrl());  // 改成 avatarUrl，保持驼峰
             } else {
-                postData.put("username", null);
-                postData.put("avatar_url", null);
+                postData.put("username", "未知用户");
+                postData.put("avatarUrl", null);
             }
 
             postData.put("postContent", post.getPostContent());
-            postData.put("imageUrl", post.getImageUrl());
+            postData.put("imgUrl", post.getImageUrl());  // 改成 imgUrl，和列表接口保持一致
             postData.put("postTime", post.getPostTime());
             postData.put("postLikeNum", post.getPostLikeNum());
             postData.put("postCollectNum", post.getPostCollectNum());
@@ -201,7 +243,8 @@
     }
 
 
-    //收藏
+    // 收藏帖子 - 添加 @Transactional
+    @Transactional
     public void collectPost(Long postId, Long userId) {
         Post post = postRepository.findById(postId).orElseThrow(() -> new RuntimeException("Post not found"));
         post.setPostCollectNum(post.getPostCollectNum() + 1);
@@ -214,7 +257,8 @@
         collectionsRepository.save(collection);
     }
 
-    //取消收藏
+    // 取消收藏 - 添加 @Transactional
+    @Transactional
     public void uncollectPost(Long postId, Long userId) {
         Post post = postRepository.findById(postId).orElseThrow(() -> new RuntimeException("Post not found"));
         // 减少帖子收藏数
@@ -226,8 +270,6 @@
         // 从收藏表中删除对应记录
         collectionsRepository.deleteLikeByUserIdAndPostNo(userId, postId);
     }
-
-
     // 获取用户收藏的所有帖子
     public List<Map<String, Object>> getAllCollections(Long userId) {
         // 获取用户收藏的帖子ID
@@ -266,6 +308,4 @@
         }
         return response;
     }
-
-
-}
+}
\ No newline at end of file
