diff --git a/open-isle-cli/src/router/index.js b/open-isle-cli/src/router/index.js
index 877f6da9d..2239d8a1a 100644
--- a/open-isle-cli/src/router/index.js
+++ b/open-isle-cli/src/router/index.js
@@ -8,6 +8,7 @@ import LoginPageView from '../views/LoginPageView.vue'
import SignupPageView from '../views/SignupPageView.vue'
import SignupReasonPageView from '../views/SignupReasonPageView.vue'
import NewPostPageView from '../views/NewPostPageView.vue'
+import EditPostPageView from '../views/EditPostPageView.vue'
import SettingsPageView from '../views/SettingsPageView.vue'
import ProfileView from '../views/ProfileView.vue'
import NotFoundPageView from '../views/NotFoundPageView.vue'
@@ -41,6 +42,11 @@ const routes = [
name: 'new-post',
component: NewPostPageView
},
+ {
+ path: '/posts/:id/edit',
+ name: 'edit-post',
+ component: EditPostPageView
+ },
{
path: '/posts/:id',
name: 'post',
diff --git a/open-isle-cli/src/views/EditPostPageView.vue b/open-isle-cli/src/views/EditPostPageView.vue
new file mode 100644
index 000000000..58358983c
--- /dev/null
+++ b/open-isle-cli/src/views/EditPostPageView.vue
@@ -0,0 +1,339 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 清空
+
+
+
+ md格式优化
+
+
+ 取消
+
+
更新
+
更新中...
+
+
+
+
+
+
+
+
+
diff --git a/open-isle-cli/src/views/PostPageView.vue b/open-isle-cli/src/views/PostPageView.vue
index 856ef6872..90efefac2 100644
--- a/open-isle-cli/src/views/PostPageView.vue
+++ b/open-isle-cli/src/views/PostPageView.vue
@@ -156,6 +156,7 @@ export default {
const articleMenuItems = computed(() => {
const items = []
if (isAuthor.value || isAdmin.value) {
+ items.push({ text: '编辑文章', onClick: () => editPost() })
items.push({ text: '删除文章', color: 'red', onClick: () => deletePost() })
}
if (isAdmin.value) {
@@ -432,6 +433,10 @@ export default {
toast.error('操作失败')
}
}
+
+ const editPost = () => {
+ router.push(`/posts/${postId}/edit`)
+ }
const deletePost = async () => {
const token = getToken()
@@ -545,6 +550,7 @@ export default {
status,
isAdmin,
approvePost,
+ editPost,
onCommentDeleted,
deletePost,
pinPost,
diff --git a/src/main/java/com/openisle/controller/PostController.java b/src/main/java/com/openisle/controller/PostController.java
index 32a247c93..06cfe7c3f 100644
--- a/src/main/java/com/openisle/controller/PostController.java
+++ b/src/main/java/com/openisle/controller/PostController.java
@@ -50,6 +50,14 @@ public class PostController {
return ResponseEntity.ok(toDto(post));
}
+ @PutMapping("/{id}")
+ public ResponseEntity updatePost(@PathVariable Long id, @RequestBody PostRequest req,
+ Authentication auth) {
+ Post post = postService.updatePost(id, auth.getName(), req.getCategoryId(),
+ req.getTitle(), req.getContent(), req.getTagIds());
+ return ResponseEntity.ok(toDto(post));
+ }
+
@DeleteMapping("/{id}")
public void deletePost(@PathVariable Long id, Authentication auth) {
postService.deletePost(id, auth.getName());
diff --git a/src/main/java/com/openisle/service/PostService.java b/src/main/java/com/openisle/service/PostService.java
index b000316e0..8de2bc3ad 100644
--- a/src/main/java/com/openisle/service/PostService.java
+++ b/src/main/java/com/openisle/service/PostService.java
@@ -323,6 +323,39 @@ public class PostService {
return postRepository.save(post);
}
+ @org.springframework.transaction.annotation.Transactional
+ public Post updatePost(Long id,
+ String username,
+ Long categoryId,
+ String title,
+ String content,
+ java.util.List tagIds) {
+ if (tagIds == null || tagIds.isEmpty()) {
+ throw new IllegalArgumentException("At least one tag required");
+ }
+ if (tagIds.size() > 2) {
+ throw new IllegalArgumentException("At most two tags allowed");
+ }
+ Post post = postRepository.findById(id)
+ .orElseThrow(() -> new com.openisle.exception.NotFoundException("Post not found"));
+ User user = userRepository.findByUsername(username)
+ .orElseThrow(() -> new com.openisle.exception.NotFoundException("User not found"));
+ if (!user.getId().equals(post.getAuthor().getId()) && user.getRole() != Role.ADMIN) {
+ throw new IllegalArgumentException("Unauthorized");
+ }
+ Category category = categoryRepository.findById(categoryId)
+ .orElseThrow(() -> new IllegalArgumentException("Category not found"));
+ java.util.List tags = tagRepository.findAllById(tagIds);
+ if (tags.isEmpty()) {
+ throw new IllegalArgumentException("Tag not found");
+ }
+ post.setTitle(title);
+ post.setContent(content);
+ post.setCategory(category);
+ post.setTags(new java.util.HashSet<>(tags));
+ return postRepository.save(post);
+ }
+
@org.springframework.transaction.annotation.Transactional
public void deletePost(Long id, String username) {
Post post = postRepository.findById(id)