diff --git a/.idea/mybatisx/templates.xml b/.idea/mybatisx/templates.xml
index f2e668e..7e0ea5c 100644
--- a/.idea/mybatisx/templates.xml
+++ b/.idea/mybatisx/templates.xml
@@ -67,8 +67,8 @@
diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/controller/CommentController.java b/community-8073/src/main/java/com/ivmiku/tutorial/controller/CommentController.java
index fbf5ab1..28a986b 100644
--- a/community-8073/src/main/java/com/ivmiku/tutorial/controller/CommentController.java
+++ b/community-8073/src/main/java/com/ivmiku/tutorial/controller/CommentController.java
@@ -10,6 +10,7 @@ import com.ivmiku.tutorial.response.Result;
import com.ivmiku.tutorial.service.CommentService;
import com.ivmiku.tutorial.service.FileService;
import io.swagger.v3.oas.annotations.Operation;
+import org.apiguardian.api.API;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;
@@ -24,6 +25,7 @@ import java.util.List;
@RestController
@RequestMapping("/comments")
@SaCheckLogin
+
public class CommentController {
private static final Logger logger = LoggerFactory.getLogger(CommentController.class);
diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/controller/CommunityController.java b/community-8073/src/main/java/com/ivmiku/tutorial/controller/CommunityController.java
index 90142a7..20672fc 100644
--- a/community-8073/src/main/java/com/ivmiku/tutorial/controller/CommunityController.java
+++ b/community-8073/src/main/java/com/ivmiku/tutorial/controller/CommunityController.java
@@ -49,6 +49,7 @@ public class CommunityController {
* @return 包含社区信息的响应
*/
@GetMapping("/get/{id}")
+ @Operation(summary = "通过id获取社区信息")
public Result getCommunity(@PathVariable Long id) {
Community community = communityService.getById(id); // 根据ID获取社区信息
return Result.ok(community); // 返回包含社区信息的成功结果
@@ -62,6 +63,7 @@ public class CommunityController {
* @return 更新结果的响应
*/
@PutMapping("/update/{id}")
+ @Operation(summary = "根据id修改社区")
public Result updateCommunity(@PathVariable Long id, @RequestBody Community community) {
communityService.updateCommunity(id, community); // 调用服务层更新社区信息
return Result.ok(); // 返回成功结果
@@ -74,6 +76,7 @@ public class CommunityController {
* @return 删除结果的响应
*/
@DeleteMapping("/delete/{id}")
+ @Operation(summary = "删除社区")
public Result deleteCommunity(@PathVariable Long id) {
communityService.deleteCommunity(id); // 调用服务层删除社区
return Result.ok(); // 返回成功结果
@@ -86,6 +89,7 @@ public class CommunityController {
* @return 包含社区信息的响应
*/
@GetMapping("/getByName/{name}")
+ @Operation(summary = "根据name获取社区信息")
public Result getCommunityByName(@PathVariable String name) {
logger.info("社区名称为: {}", name);
List communitys = communityService.getByName(name); // 根据ID获取社区信息
@@ -98,6 +102,7 @@ public class CommunityController {
* @return 包含社区信息的响应
*/
@GetMapping("/list")
+ @Operation(summary = "获取所有社区")
public Result getCommunityList() {
List communities = communityService.getCommunityList(); // 获取社区列表
return Result.ok(communities); // 返回包含社区信息的成功结果
diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/controller/CommunitytagController.java b/community-8073/src/main/java/com/ivmiku/tutorial/controller/CommunitytagController.java
index ca1644b..251c42b 100644
--- a/community-8073/src/main/java/com/ivmiku/tutorial/controller/CommunitytagController.java
+++ b/community-8073/src/main/java/com/ivmiku/tutorial/controller/CommunitytagController.java
@@ -3,6 +3,7 @@ package com.ivmiku.tutorial.controller;
import com.ivmiku.tutorial.entity.Communitytag;
import com.ivmiku.tutorial.response.Result;
import com.ivmiku.tutorial.service.CommunitytagService;
+import io.swagger.v3.oas.annotations.Operation;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@@ -16,30 +17,35 @@ public class CommunitytagController {
private CommunitytagService communitytagService;
@PostMapping("/create")
+ @Operation(summary = "创建社区标签")
public Result createCommunityTag(@RequestBody Communitytag communityTag) {
communitytagService.createCommunityTag(communityTag);
return Result.ok();
}
@PutMapping("/update/{id}")
+ @Operation(summary = "更新社区标签")
public Result updateCommunityTag(@PathVariable Long id, @RequestBody Communitytag communityTag) {
communitytagService.updateCommunityTag(id, communityTag);
return Result.ok();
}
@DeleteMapping("/delete/{id}")
+ @Operation(summary = "删除社区标签")
public Result deleteCommunityTag(@PathVariable Long id) {
communitytagService.deleteCommunityTag(id);
return Result.ok();
}
@GetMapping("/get/{id}")
+ @Operation(summary = "获取社区标签详情")
public Result getCommunityTag(@PathVariable Long id) {
Communitytag communityTag = communitytagService.getCommunityTagById(id);
return Result.ok(communityTag);
}
@GetMapping("/list/{communityId}")
+ @Operation(summary = "获取社区标签列表")
public Result getCommunityTagListByCommunityId(@PathVariable Long communityId) {
List tags = communitytagService.getCommunityTagListByCommunityId(communityId);
return Result.ok(tags);
diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/controller/InteractionController.java b/community-8073/src/main/java/com/ivmiku/tutorial/controller/InteractionController.java
index 7e18427..b1e0f62 100644
--- a/community-8073/src/main/java/com/ivmiku/tutorial/controller/InteractionController.java
+++ b/community-8073/src/main/java/com/ivmiku/tutorial/controller/InteractionController.java
@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ivmiku.tutorial.entity.Post;
import com.ivmiku.tutorial.response.Result;
import com.ivmiku.tutorial.service.InteractionService;
+import io.swagger.v3.oas.annotations.Operation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
@@ -33,6 +34,7 @@ public class InteractionController {
* @return 操作结果
*/
@PostMapping("/favorite")
+ @Operation(summary = "对帖子收藏")
public Result favoritePost(@RequestParam Long postId) {
String userOpenid = StpUtil.getLoginIdAsString();
log.info("User {} is favoriting post {}", userOpenid, postId);
@@ -47,6 +49,7 @@ public class InteractionController {
* @return 操作结果
*/
@PostMapping("/likePost")
+ @Operation(summary = "对帖子点赞")
public Result likePost(@RequestParam Long postId) {
String userOpenid = StpUtil.getLoginIdAsString();
log.info("User {} is liking post {}", userOpenid, postId);
@@ -61,6 +64,7 @@ public class InteractionController {
* @return 操作结果
*/
@PostMapping("/likeComment")
+ @Operation(summary = "对评论点赞")
public Result likeComment(@RequestParam Long commentId) {
String userOpenid = StpUtil.getLoginIdAsString();
log.info("User {} is liking comment {}", userOpenid, commentId);
@@ -75,6 +79,7 @@ public class InteractionController {
* @return 操作结果
*/
@DeleteMapping("/unfavorite")
+ @Operation(summary = "取消收藏帖子")
public Result unfavoritePost(@RequestParam Long postId) {
String userOpenid = StpUtil.getLoginIdAsString();
log.info("User {} is unfavoriting post {}", userOpenid, postId);
@@ -89,6 +94,7 @@ public class InteractionController {
* @return 操作结果
*/
@DeleteMapping("/unlikePost")
+ @Operation(summary = "取消对帖子的点赞")
public Result unlikePost(@RequestParam Long postId) {
String userOpenid = StpUtil.getLoginIdAsString();
log.info("User {} is unliking post {}", userOpenid, postId);
@@ -103,6 +109,7 @@ public class InteractionController {
* @return 操作结果
*/
@DeleteMapping("/unlikeComment")
+ @Operation(summary = "取消对评论的点赞")
public Result unlikeComment(@RequestParam Long commentId) {
String userOpenid = StpUtil.getLoginIdAsString();
log.info("User {} is unliking comment {}", userOpenid, commentId);
@@ -116,6 +123,7 @@ public class InteractionController {
* @return
*/
@GetMapping("/getFavoritePosts")
+ @Operation(summary = "获取用户收藏的帖子")
public Result getFavoritePosts() {
String userOpenid = StpUtil.getLoginIdAsString();
log.info("用户 {} 正在获取收藏的帖子", userOpenid);
@@ -134,6 +142,7 @@ public class InteractionController {
* 统计我的获赞数量 笔记数量 收藏数量
*/
@GetMapping("/getLikeCount")
+ @Operation(summary = "统计用户获赞数量")
public Result getLikeCount() {
String userOpenid = StpUtil.getLoginIdAsString();
log.info("用户 {} 正在获取用户获赞的数量", userOpenid);
diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/controller/PostController.java b/community-8073/src/main/java/com/ivmiku/tutorial/controller/PostController.java
index 52a4d70..5a2c476 100644
--- a/community-8073/src/main/java/com/ivmiku/tutorial/controller/PostController.java
+++ b/community-8073/src/main/java/com/ivmiku/tutorial/controller/PostController.java
@@ -9,8 +9,11 @@ import com.ivmiku.tutorial.entity.Post;
import com.ivmiku.tutorial.response.Result;
import com.ivmiku.tutorial.service.FileService;
import com.ivmiku.tutorial.service.PostService;
+import io.swagger.v3.oas.annotations.Operation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -36,7 +39,12 @@ public class PostController {
@Resource
private FileService fileService;
+ // RedisTemplate 用于存储和检索搜索历史
+ @Resource
+ private RedisTemplate redisTemplate;
+
@PostMapping("/create")
+ @Operation(summary = "创建帖子")
public Result createPost(@RequestParam("title") String title,
@RequestParam("content") String content,
@RequestParam("communityId") Long communityId,
@@ -82,6 +90,7 @@ public class PostController {
@GetMapping("/get/{id}")
+ @Operation(summary = "获取帖子详细信息")
public Result getPost(@PathVariable Long id) {
logger.info("开始获取帖子ID:{}的详细信息", id);
String userId = StpUtil.getLoginIdAsString();
@@ -95,6 +104,7 @@ public class PostController {
}
@PutMapping("/update/{id}")
+ @Operation(summary = "更新帖子信息")
public Result updatePost(@PathVariable Long id, @RequestBody Post post) {
String userId = StpUtil.getLoginIdAsString(); // 获取当前登录用户的ID
logger.info("用户ID:{}开始更新帖子ID:{}", userId, id);
@@ -104,6 +114,7 @@ public class PostController {
}
@DeleteMapping("/delete/{id}")
+ @Operation(summary = "删除帖子")
public Result deletePost(@PathVariable Long id) {
String userId = StpUtil.getLoginIdAsString(); // 获取当前登录用户的ID
logger.info("用户ID:{}开始删除帖子ID:{}", userId, id);
@@ -117,6 +128,7 @@ public class PostController {
* @return 当前用户帖子列表与该用户的总发布数量
*/
@GetMapping("/getPostList")
+ @Operation(summary = "用户获取自己发布的帖子的列表")
public Result getPostList(@RequestBody Pages pages) {
logger.info("开始获取帖子列表");
String userId = StpUtil.getLoginIdAsString(); // 获取当前登录用户的ID
@@ -132,6 +144,7 @@ public class PostController {
* @return 当前用户帖子列表
*/
@GetMapping("/getCommunityPostList/{communityId}")
+ @Operation(summary = "获取当前社区帖子列表")
public Result getCommunityPostList(@PathVariable("communityId") Long communityId, @RequestBody Pages pages) {
logger.info("开始获取帖子列表");
IPage posts = postService.getCommunityPostList(communityId, pages.getPageNum(), pages.getPageSize());
@@ -143,6 +156,7 @@ public class PostController {
* @return
*/
@GetMapping("/official")
+ @Operation(summary = "获取所有官方创建的帖子")
public IPage getOfficialPosts(@RequestBody Pages pages) {
return postService.getOfficialPosts(pages.getPageNum(), pages.getPageSize());
}
@@ -152,11 +166,13 @@ public class PostController {
* @return
*/
@GetMapping("/nonOfficial")
+ @Operation(summary = "获取所有非官方创建的帖子")
public IPage getNonOfficialPosts(@RequestBody Pages pages) {
return postService.getNonOfficialPosts(pages.getPageNum(), pages.getPageSize());
}
@PutMapping("/changePublic")
+ @Operation(summary = "修改帖子公开状态")
public Result changePublic(@RequestParam Long postId, @RequestParam Integer isPublic) {
String userId = StpUtil.getLoginIdAsString(); // 获取当前登录用户的ID
logger.info("用户ID:{}开始修改帖子ID:{}的公开状态", userId, postId);
@@ -164,4 +180,130 @@ public class PostController {
logger.info("用户ID:{}的帖子ID:{}修改成功", userId, postId);
return Result.ok();
}
+
+
+ @GetMapping("/popularSearches")
+ @Operation(summary = "获取热门搜索词")
+ public Result getPopularSearches() {
+ List popularSearches = postService.getPopularSearches();
+ return Result.ok(popularSearches);
+ }
+
+ @PostMapping("/searchHistory")
+ @Operation(summary = "保存搜索历史")
+ public Result saveSearchHistory(@RequestParam String keyword) {
+ String userId = StpUtil.getLoginIdAsString();
+ String key = "search_history:" + userId;
+
+ // 保存搜索历史到 Redis 中
+ redisTemplate.opsForList().rightPush(key, keyword);
+ // 如果列表长度超过 10 条,删除最早的记录
+ Long listSize = redisTemplate.opsForList().size(key);
+ if (listSize != null && listSize > 10) {
+ redisTemplate.opsForList().leftPop(key); // 删除最早的记录
+ }
+
+ return Result.ok("搜索历史保存成功");
+ }
+
+ /**
+ * 获取用户的搜索历史
+ */
+ @GetMapping("/searchHistory")
+ @Operation(summary = "获取用户的搜索历史")
+ public Result getSearchHistory() {
+ String userId = StpUtil.getLoginIdAsString();
+ String key = "search_history:" + userId;
+
+ // 从 Redis 中获取搜索历史
+ List history = redisTemplate.opsForList().range(key, 0, -1);
+
+ return Result.ok(history);
+ }
+
+ /**
+ * 根据关键字搜索帖子,包括标题和内容
+ */
+ @GetMapping("/search")
+ @Operation(summary = "根据关键字搜索帖子")
+ public Result searchPosts(@RequestParam String keyword) {
+ // 保存用户搜索历史
+ saveSearchHistory(keyword);
+
+ // 调用服务层方法进行帖子搜索
+ List posts = postService.searchPosts(keyword);
+
+ return Result.ok(posts);
+ }
+
+
+ @GetMapping("/topFavorited")
+ @Operation(summary = "获取用户收藏数量较高的帖子")
+ public Result getTopFavoritedPosts(@RequestParam(defaultValue = "10") int limit) {
+ List topFavoritedPosts = postService.getTopFavoritedPosts(limit);
+ return Result.ok(topFavoritedPosts);
+ }
+
+
+ @PostMapping("/saveDraft")
+ @Operation(summary = "暂存帖子草稿")
+ public Result saveDraft(@RequestParam("title") String title,
+ @RequestParam("content") String content,
+ @RequestParam("communityId") Long communityId,
+ @RequestParam(value = "imageFiles", required = false) MultipartFile[] imageFiles,
+ @RequestParam(value = "videoFile", required = false) MultipartFile videoFile,
+ @RequestParam(value = "location", required = false) String location) {
+ String userId = StpUtil.getLoginIdAsString();
+ logger.info("用户ID:{} 开始暂存帖子草稿", userId);
+
+ Post post = new Post();
+ post.setUserOpenid(userId);
+ post.setTitle(title);
+ post.setContent(content);
+ post.setCommunityId(communityId);
+ post.setIsDraft(0); // 0 表示草稿
+ post.setLocation(location);
+
+ try {
+ // 上传视频
+ if (videoFile != null && !videoFile.isEmpty()) {
+ String uploadResult = fileService.uploadMinio(videoFile);
+ post.setVideoUrl(uploadResult);
+ }
+
+ // 上传图片
+ if (imageFiles != null && imageFiles.length > 0) {
+ StringBuilder imageUrls = new StringBuilder();
+ for (MultipartFile file : imageFiles) {
+ String uploadResult = fileService.uploadMinio(file);
+ imageUrls.append(uploadResult).append(";");
+ }
+ post.setImageUrls(imageUrls.toString());
+ }
+ } catch (Exception e) {
+ logger.error("文件上传失败", e);
+ return Result.error("文件上传失败");
+ }
+
+ postService.createPost(post); // 保存草稿
+ logger.info("用户ID:{} 的帖子草稿暂存成功", userId);
+ return Result.ok(post);
+ }
+
+ @GetMapping("/getDrafts")
+ @Operation(summary = "获取用户的所有草稿")
+ public Result getDrafts() {
+ String userId = StpUtil.getLoginIdAsString();
+ logger.info("用户ID:{} 开始获取草稿", userId);
+
+ List drafts = postService.getDraftsByUserId(userId);
+
+ if (drafts.isEmpty()) {
+ return Result.error("未找到任何草稿");
+ }
+
+ return Result.ok(drafts);
+ }
+
+
}
diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/controller/PostTagController.java b/community-8073/src/main/java/com/ivmiku/tutorial/controller/PostTagController.java
index e1df2d1..7ca2ea2 100644
--- a/community-8073/src/main/java/com/ivmiku/tutorial/controller/PostTagController.java
+++ b/community-8073/src/main/java/com/ivmiku/tutorial/controller/PostTagController.java
@@ -6,6 +6,7 @@ import com.ivmiku.tutorial.entity.PostTag;
import com.ivmiku.tutorial.entity.Tag;
import com.ivmiku.tutorial.response.Result;
import com.ivmiku.tutorial.service.PostTagService;
+import io.swagger.v3.oas.annotations.Operation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -24,6 +25,7 @@ public class PostTagController {
private PostTagService postTagService;
@PostMapping("/create")
+ @Operation(summary = "创建帖子标签")
public Result createPostTag(@RequestBody PostTag postTag) {
logger.info("开始创建帖子标签");
postTagService.createPostTag(postTag);
@@ -32,6 +34,7 @@ public class PostTagController {
}
@GetMapping("/get/{id}")
+ @Operation(summary = "获取帖子标签详细信息")
public Result getPostTag(@PathVariable Long id) {
logger.info("开始获取帖子标签ID:{}的详细信息", id);
PostTag postTag = postTagService.getPostTagById(id);
@@ -44,6 +47,7 @@ public class PostTagController {
}
@PutMapping("/update/{id}")
+ @Operation(summary = "更新帖子标签")
public Result updatePostTag(@PathVariable Long id, @RequestBody PostTag postTag) {
logger.info("开始更新帖子标签ID:{}", id);
postTagService.updatePostTag(id, postTag);
@@ -52,6 +56,7 @@ public class PostTagController {
}
@DeleteMapping("/delete/{id}")
+ @Operation(summary = "删除帖子标签")
public Result deletePostTag(@PathVariable Long id) {
logger.info("开始删除帖子标签ID:{}", id);
postTagService.deletePostTag(id);
@@ -60,6 +65,7 @@ public class PostTagController {
}
@GetMapping("/getPostTagList/{postId}")
+ @Operation(summary = "获取帖子附带的标签列表")
public Result getPostTagList(@PathVariable Long postId) {
logger.info("开始获取帖子标签列表");
List tags = postTagService.getPostTagList(postId);
@@ -67,6 +73,7 @@ public class PostTagController {
}
@GetMapping("/getTagPostList/{tagId}")
+ @Operation(summary = "获取标签附带的帖子列表")
public Result getTagPostList(@PathVariable Long tagId) {
logger.info("开始获取标签帖子列表");
List posts = postTagService.getTagPostList(tagId);
@@ -74,6 +81,7 @@ public class PostTagController {
}
@GetMapping("/topTags")
+ @Operation(summary = "获取使用次数最多的标签")
public Result getTopTags(@RequestParam(defaultValue = "10") int topN) {
logger.info("开始获取前{}个使用次数最多的标签", topN);
List tags = postTagService.getTopTags(topN);
diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/controller/TagController.java b/community-8073/src/main/java/com/ivmiku/tutorial/controller/TagController.java
index 9ecbeac..b19aacf 100644
--- a/community-8073/src/main/java/com/ivmiku/tutorial/controller/TagController.java
+++ b/community-8073/src/main/java/com/ivmiku/tutorial/controller/TagController.java
@@ -5,6 +5,7 @@ import com.ivmiku.tutorial.entity.Tag;
import com.ivmiku.tutorial.response.Result;
import com.ivmiku.tutorial.service.PostTagService;
import com.ivmiku.tutorial.service.TagService;
+import io.swagger.v3.oas.annotations.Operation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -34,6 +35,7 @@ public class TagController {
* @return Result 返回操作结果
*/
@PostMapping("/create")
+ @Operation(summary = "创建标签")
public Result createTag(@RequestBody Tag tag) {
logger.info("开始创建标签:{}", tag.getName());
tagService.createTag(tag);
@@ -49,6 +51,7 @@ public class TagController {
* @return Result 返回操作结果和标签详情
*/
@GetMapping("/get/{id}")
+ @Operation(summary = "获取标签详情")
public Result getTag(@PathVariable Long id) {
logger.info("开始获取标签ID:{}的详细信息", id);
Tag tag = tagService.getTagById(id);
@@ -69,6 +72,7 @@ public class TagController {
* @return Result 返回操作结果
*/
@PutMapping("/update/{id}")
+ @Operation(summary = "更新标签")
public Result updateTag(@PathVariable Long id, @RequestBody Tag tag) {
logger.info("开始更新标签ID:{}的信息", id);
tagService.updateTag(id, tag);
@@ -84,6 +88,7 @@ public class TagController {
* @return Result 返回操作结果
*/
@DeleteMapping("/delete/{id}")
+ @Operation(summary = "删除标签")
public Result deleteTag(@PathVariable Long id) {
logger.info("开始删除标签ID:{}", id);
tagService.deleteTag(id);
@@ -97,6 +102,7 @@ public class TagController {
* @return Result 返回操作结果和标签详情
*/
@GetMapping("/getTagList")
+ @Operation(summary = "获取所有标签详情")
public Result getTagList() {
List tags = tagService.getTagList();
return Result.ok(tags);
@@ -107,6 +113,7 @@ public class TagController {
* @return Result 返回操作结果和排序后的标签列表
*/
@GetMapping("/sorted-tag-list")
+ @Operation(summary = "获取排序后的标签列表")
public Result getSortedTagList() {
logger.info("开始获取排序后的标签列表");
List tags = postTagService.getSortedTagList();
diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/controller/TutorialController.java b/community-8073/src/main/java/com/ivmiku/tutorial/controller/TutorialController.java
new file mode 100644
index 0000000..ac26b2f
--- /dev/null
+++ b/community-8073/src/main/java/com/ivmiku/tutorial/controller/TutorialController.java
@@ -0,0 +1,126 @@
+package com.ivmiku.tutorial.controller;
+
+import cn.dev33.satoken.stp.StpUtil;
+import com.ivmiku.tutorial.entity.Tutorials;
+import com.ivmiku.tutorial.response.Result;
+import com.ivmiku.tutorial.service.FileService;
+import com.ivmiku.tutorial.service.TutorialsService;
+import io.swagger.v3.oas.annotations.Operation;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/tutorial")
+@Slf4j
+public class TutorialController {
+
+ private static final Logger logger = LoggerFactory.getLogger(TutorialController.class);
+
+
+ @Autowired
+ private TutorialsService tutorialsService;
+
+ @Resource
+ private FileService fileService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建教程")
+ public Result createTutorial(@RequestParam("title") String title,
+ @RequestParam("content") String content,
+ @RequestParam("tagId") Long tagId,
+ @RequestParam(value = "imageFile", required = false) MultipartFile imageFile,
+ @RequestParam(value = "videoFile", required = false) MultipartFile videoFile,
+ @RequestParam("isOfficial") Integer isOfficial) {
+ String userId = StpUtil.getLoginIdAsString(); // 获取 userOpenid
+ logger.info("用户ID:{} 开始创建教程", userId);
+
+ Tutorials tutorial = new Tutorials();
+ tutorial.setTitle(title);
+ tutorial.setContent(content);
+ tutorial.setTagId(tagId);
+ tutorial.setIsOfficial(isOfficial);
+ tutorial.setUserOpenid(userId); // 设置 userOpenid
+
+ try {
+ // 上传图片
+ if (imageFile != null && !imageFile.isEmpty()) {
+ String uploadResult = fileService.uploadMinio(imageFile);
+ tutorial.setImageUrl(uploadResult);
+ }
+
+ // 上传视频
+ if (videoFile != null && !videoFile.isEmpty()) {
+ String uploadResult = fileService.uploadMinio(videoFile);
+ tutorial.setVideoUrl(uploadResult);
+ }
+ } catch (Exception e) {
+ logger.error("文件上传失败", e);
+ return Result.error("文件上传失败");
+ }
+
+ tutorialsService.createTutorial(tutorial);
+ logger.info("用户ID:{} 的教程创建成功", userId);
+ return Result.ok(tutorial);
+ }
+
+
+ // 获取教程详细信息
+ @GetMapping("/get/{id}")
+ @Operation(summary = "获取教程详细信息")
+ public Result getTutorial(@PathVariable Long id) {
+ Tutorials tutorial = tutorialsService.getById(id);
+ if (tutorial != null) {
+ return Result.ok("教程获取成功");
+ }
+ return Result.error("未找到教程");
+ }
+
+ // 更新教程
+ @PutMapping("/update/{id}")
+ @Operation(summary = "更新教程")
+ public Result updateTutorial(@PathVariable Long id, @RequestBody Tutorials tutorial) {
+ tutorial.setTutorialId(id); // 确保教程ID是正确的
+ boolean updated = tutorialsService.updateById(tutorial);
+ if (updated) {
+ return Result.ok("教程更新成功");
+ }
+ return Result.error("教程更新失败");
+ }
+
+ // 删除教程
+ @DeleteMapping("/delete/{id}")
+ @Operation(summary = "删除教程")
+ public Result deleteTutorial(@PathVariable Long id) {
+ boolean deleted = tutorialsService.removeById(id);
+ if (deleted) {
+ return Result.ok("教程删除成功");
+ }
+ return Result.error("教程删除失败");
+ }
+
+ // 获取所有教程
+ @GetMapping("/list")
+ @Operation(summary = "获取所有教程")
+ public Result listTutorials() {
+ List tutorials = tutorialsService.list();
+ return Result.ok("教程列表获取成功");
+ }
+ // 根据教程标签ID获取教程列表
+ @GetMapping("/listByTag/{tagId}")
+ @Operation(summary = "根据教程标签ID获取教程列表")
+ public Result listTutorialsByTag(@PathVariable Long tagId) {
+ List tutorials = tutorialsService.getTutorialsByTagId(tagId);
+ if (tutorials.isEmpty()) {
+ return Result.error("未找到对应标签的教程");
+ }
+ return Result.ok(tutorials);
+ }
+
+}
diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/controller/TutorialTagsController.java b/community-8073/src/main/java/com/ivmiku/tutorial/controller/TutorialTagsController.java
new file mode 100644
index 0000000..c0772fa
--- /dev/null
+++ b/community-8073/src/main/java/com/ivmiku/tutorial/controller/TutorialTagsController.java
@@ -0,0 +1,61 @@
+package com.ivmiku.tutorial.controller;
+
+import com.ivmiku.tutorial.entity.TutorialTags;
+import com.ivmiku.tutorial.response.Result;
+import com.ivmiku.tutorial.service.TutorialTagsService;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/tutorialTags")
+public class TutorialTagsController {
+
+ @Autowired
+ private TutorialTagsService tutorialTagsService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建教程标签")
+ public Result createTag(@RequestParam("tagName") String tagName,
+ @RequestParam("isOfficial") Integer isOfficial) {
+ TutorialTags tag = new TutorialTags();
+ tag.setTagName(tagName);
+ tag.setIsOfficial(isOfficial);
+
+ tutorialTagsService.createTag(tag);
+ return Result.ok(tag);
+ }
+
+ @GetMapping("/getAll")
+ @Operation(summary = "获取所有教程标签")
+ public Result getAllTags() {
+ List tags = tutorialTagsService.getAllTags();
+ return Result.ok(tags);
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新教程标签")
+ public Result updateTag(@RequestParam("tagId") Long tagId,
+ @RequestParam("tagName") String tagName,
+ @RequestParam("isOfficial") Integer isOfficial) {
+ TutorialTags tag = tutorialTagsService.getTagById(tagId);
+ if (tag == null) {
+ return Result.error("标签不存在");
+ }
+
+ tag.setTagName(tagName);
+ tag.setIsOfficial(isOfficial);
+
+ tutorialTagsService.updateTag(tag);
+ return Result.ok(tag);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除教程标签")
+ public Result deleteTag(@RequestParam("tagId") Long tagId) {
+ tutorialTagsService.deleteTag(tagId);
+ return Result.ok("标签已删除");
+ }
+}
diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/entity/Post.java b/community-8073/src/main/java/com/ivmiku/tutorial/entity/Post.java
index 440d6c2..7208d4d 100644
--- a/community-8073/src/main/java/com/ivmiku/tutorial/entity/Post.java
+++ b/community-8073/src/main/java/com/ivmiku/tutorial/entity/Post.java
@@ -37,6 +37,8 @@ public class Post implements Serializable {
private String location; // 存储帖子位置信息
+ private Integer isDraft; // 是否为草稿 0不是 1是
+
private Date createdAt;
private Date updatedAt;
diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/entity/TutorialTags.java b/community-8073/src/main/java/com/ivmiku/tutorial/entity/TutorialTags.java
new file mode 100644
index 0000000..3b79187
--- /dev/null
+++ b/community-8073/src/main/java/com/ivmiku/tutorial/entity/TutorialTags.java
@@ -0,0 +1,25 @@
+package com.ivmiku.tutorial.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.io.Serializable;
+import lombok.Data;
+
+/**
+ * @TableName tutorial_tags
+ */
+@TableName(value ="tutorial_tags")
+@Data
+public class TutorialTags implements Serializable {
+ @TableId(type = IdType.AUTO)
+ private Long tagId;
+
+ private String tagName;
+
+ private Integer isOfficial;
+
+ @TableLogic
+ private Integer isDeleted;
+
+ private static final long serialVersionUID = 1L;
+}
\ No newline at end of file
diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/entity/Tutorials.java b/community-8073/src/main/java/com/ivmiku/tutorial/entity/Tutorials.java
new file mode 100644
index 0000000..bf85462
--- /dev/null
+++ b/community-8073/src/main/java/com/ivmiku/tutorial/entity/Tutorials.java
@@ -0,0 +1,38 @@
+package com.ivmiku.tutorial.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * @TableName tutorials
+ */
+@TableName(value ="tutorials")
+@Data
+public class Tutorials implements Serializable {
+ @TableId(type = IdType.AUTO)
+ private Long tutorialId;
+
+ private String title;
+
+ private String content;
+
+ private String imageUrl;
+
+ private String videoUrl;
+
+ private Integer isOfficial;
+
+ @TableLogic
+ private Integer isDeleted;
+
+ private Date createdAt;
+
+ private Long tagId;
+
+ private String userOpenid; // 新增的字段
+
+ private static final long serialVersionUID = 1L;
+}
\ No newline at end of file
diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/mapper/PostMapper.java b/community-8073/src/main/java/com/ivmiku/tutorial/mapper/PostMapper.java
index 0a93921..4e6708e 100644
--- a/community-8073/src/main/java/com/ivmiku/tutorial/mapper/PostMapper.java
+++ b/community-8073/src/main/java/com/ivmiku/tutorial/mapper/PostMapper.java
@@ -17,6 +17,12 @@ public interface PostMapper extends BaseMapper {
List getTagPostList(Long tagId);
+
+ List selectPopularSearches();
+
+ List searchPosts(String keyword);
+
+ List getTopFavoritedPosts(int limit);
}
diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/mapper/TutorialTagsMapper.java b/community-8073/src/main/java/com/ivmiku/tutorial/mapper/TutorialTagsMapper.java
new file mode 100644
index 0000000..0b17fc4
--- /dev/null
+++ b/community-8073/src/main/java/com/ivmiku/tutorial/mapper/TutorialTagsMapper.java
@@ -0,0 +1,18 @@
+package com.ivmiku.tutorial.mapper;
+
+import com.ivmiku.tutorial.entity.TutorialTags;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author rog
+* @description 针对表【tutorial_tags】的数据库操作Mapper
+* @createDate 2024-08-29 21:15:08
+* @Entity com.ivmiku.tutorial.entity.TutorialTags
+*/
+public interface TutorialTagsMapper extends BaseMapper {
+
+}
+
+
+
+
diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/mapper/TutorialsMapper.java b/community-8073/src/main/java/com/ivmiku/tutorial/mapper/TutorialsMapper.java
new file mode 100644
index 0000000..3b924ad
--- /dev/null
+++ b/community-8073/src/main/java/com/ivmiku/tutorial/mapper/TutorialsMapper.java
@@ -0,0 +1,18 @@
+package com.ivmiku.tutorial.mapper;
+
+import com.ivmiku.tutorial.entity.Tutorials;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author rog
+* @description 针对表【tutorials】的数据库操作Mapper
+* @createDate 2024-08-29 21:14:50
+* @Entity com.ivmiku.tutorial.entity.Tutorials
+*/
+public interface TutorialsMapper extends BaseMapper {
+
+}
+
+
+
+
diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/service/PostService.java b/community-8073/src/main/java/com/ivmiku/tutorial/service/PostService.java
index 05a2a2d..d010cef 100644
--- a/community-8073/src/main/java/com/ivmiku/tutorial/service/PostService.java
+++ b/community-8073/src/main/java/com/ivmiku/tutorial/service/PostService.java
@@ -23,4 +23,12 @@ public interface PostService extends IService {
IPage getNonOfficialPosts(int pageNum, int pageSize);
void changePublic(Long postId, Integer isPublic);
+
+ List getPopularSearches();
+
+ List searchPosts(String keyword);
+
+ List getTopFavoritedPosts(int limit);
+
+ List getDraftsByUserId(String userId);
}
diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/service/TutorialTagsService.java b/community-8073/src/main/java/com/ivmiku/tutorial/service/TutorialTagsService.java
new file mode 100644
index 0000000..95b821c
--- /dev/null
+++ b/community-8073/src/main/java/com/ivmiku/tutorial/service/TutorialTagsService.java
@@ -0,0 +1,25 @@
+package com.ivmiku.tutorial.service;
+
+import com.ivmiku.tutorial.entity.TutorialTags;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+* @author rog
+* @description 针对表【tutorial_tags】的数据库操作Service
+* @createDate 2024-08-29 21:15:08
+*/
+public interface TutorialTagsService extends IService {
+
+
+ void createTag(TutorialTags tag);
+
+ List getAllTags();
+
+ TutorialTags getTagById(Long tagId);
+
+ void updateTag(TutorialTags tag);
+
+ void deleteTag(Long tagId);
+}
diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/service/TutorialsService.java b/community-8073/src/main/java/com/ivmiku/tutorial/service/TutorialsService.java
new file mode 100644
index 0000000..b4f0217
--- /dev/null
+++ b/community-8073/src/main/java/com/ivmiku/tutorial/service/TutorialsService.java
@@ -0,0 +1,18 @@
+package com.ivmiku.tutorial.service;
+
+import com.ivmiku.tutorial.entity.Tutorials;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+* @author rog
+* @description 针对表【tutorials】的数据库操作Service
+* @createDate 2024-08-29 21:14:50
+*/
+public interface TutorialsService extends IService {
+
+ void createTutorial(Tutorials tutorial);
+
+ List getTutorialsByTagId(Long tagId);
+}
diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/service/impl/PostServiceImpl.java b/community-8073/src/main/java/com/ivmiku/tutorial/service/impl/PostServiceImpl.java
index 98d7adc..889f90e 100644
--- a/community-8073/src/main/java/com/ivmiku/tutorial/service/impl/PostServiceImpl.java
+++ b/community-8073/src/main/java/com/ivmiku/tutorial/service/impl/PostServiceImpl.java
@@ -15,6 +15,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.sql.Timestamp;
import java.util.Date;
+import java.util.List;
@Service
public class PostServiceImpl extends ServiceImpl implements PostService {
@@ -170,4 +171,31 @@ public class PostServiceImpl extends ServiceImpl implements Po
post.setIsPublic(isPublic);
postMapper.update(post, wrapper);
}
+
+ @Override
+ public List getPopularSearches() {
+ return postMapper.selectPopularSearches();
+ }
+
+ @Override
+ public List searchPosts(String keyword) {
+ // 调用 Mapper 中的搜索方法
+ return postMapper.searchPosts(keyword);
+ }
+
+ @Override
+ public List getTopFavoritedPosts(int limit) {
+ return postMapper.getTopFavoritedPosts(limit);
+ }
+
+
+ @Override
+ public List getDraftsByUserId(String userId) {
+ return postMapper.selectList(new LambdaQueryWrapper()
+ .eq(Post::getUserOpenid, userId)
+ .eq(Post::getIsDraft, 0)); // 0 表示草稿
+ }
+
+
+
}
diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/service/impl/TutorialTagsServiceImpl.java b/community-8073/src/main/java/com/ivmiku/tutorial/service/impl/TutorialTagsServiceImpl.java
new file mode 100644
index 0000000..7bd65f7
--- /dev/null
+++ b/community-8073/src/main/java/com/ivmiku/tutorial/service/impl/TutorialTagsServiceImpl.java
@@ -0,0 +1,56 @@
+package com.ivmiku.tutorial.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ivmiku.tutorial.entity.TutorialTags;
+import com.ivmiku.tutorial.service.TutorialTagsService;
+import com.ivmiku.tutorial.mapper.TutorialTagsMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+* @author rog
+* @description 针对表【tutorial_tags】的数据库操作Service实现
+* @createDate 2024-08-29 21:15:08
+*/
+@Service
+public class TutorialTagsServiceImpl extends ServiceImpl
+ implements TutorialTagsService{
+
+ @Autowired
+ private TutorialTagsMapper tutorialTagsMapper;
+
+ @Override
+ public void createTag(TutorialTags tag) {
+ tutorialTagsMapper.insert(tag);
+ }
+
+ @Override
+ public List getAllTags() {
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ queryWrapper.eq("is_deleted", 0);
+ return tutorialTagsMapper.selectList(queryWrapper);
+ }
+
+ @Override
+ public TutorialTags getTagById(Long tagId) {
+ return tutorialTagsMapper.selectById(tagId);
+ }
+
+ @Override
+ public void updateTag(TutorialTags tag) {
+ tutorialTagsMapper.updateById(tag);
+ }
+
+ @Override
+ public void deleteTag(Long tagId) {
+ tutorialTagsMapper.deleteById(tagId);
+ }
+
+}
+
+
+
+
diff --git a/community-8073/src/main/java/com/ivmiku/tutorial/service/impl/TutorialsServiceImpl.java b/community-8073/src/main/java/com/ivmiku/tutorial/service/impl/TutorialsServiceImpl.java
new file mode 100644
index 0000000..867c270
--- /dev/null
+++ b/community-8073/src/main/java/com/ivmiku/tutorial/service/impl/TutorialsServiceImpl.java
@@ -0,0 +1,43 @@
+package com.ivmiku.tutorial.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ivmiku.tutorial.entity.Tutorials;
+import com.ivmiku.tutorial.service.TutorialsService;
+import com.ivmiku.tutorial.mapper.TutorialsMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+* @author rog
+* @description 针对表【tutorials】的数据库操作Service实现
+* @createDate 2024-08-29 21:14:50
+*/
+@Service
+public class TutorialsServiceImpl extends ServiceImpl
+ implements TutorialsService{
+
+ @Autowired
+ private TutorialsMapper tutorialsMapper;
+
+ // 其他已存在的方法
+
+ @Override
+ public List getTutorialsByTagId(Long tagId) {
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ queryWrapper.eq("tag_id", tagId);
+ return tutorialsMapper.selectList(queryWrapper);
+ }
+
+ @Override
+ public void createTutorial(Tutorials tutorial) {
+ this.save(tutorial);
+ }
+
+}
+
+
+
+
diff --git a/community-8073/src/main/resources/mapper/PostMapper.xml b/community-8073/src/main/resources/mapper/PostMapper.xml
index 4c3989b..1659df8 100644
--- a/community-8073/src/main/resources/mapper/PostMapper.xml
+++ b/community-8073/src/main/resources/mapper/PostMapper.xml
@@ -16,6 +16,7 @@
+
@@ -37,32 +38,33 @@
INSERT INTO post (
- post_id, user_openid, community_id, title, content,
- video_url, image_urls,
- is_deleted, is_official, is_public, location, created_at, updated_at
+ post_id, user_openid, community_id, title, content,
+ video_url, image_urls,
+ is_deleted, is_official, is_public, location, is_draft, created_at, updated_at
) VALUES (
- #{postId}, #{userOpenid}, #{communityId}, #{title}, #{content},
- #{videoUrl}, #{imageUrls},
- #{isDeleted}, #{isOfficial}, #{is_public}, #{location}, #{createdAt}, #{updatedAt}
- )
+ #{postId}, #{userOpenid}, #{communityId}, #{title}, #{content},
+ #{videoUrl}, #{imageUrls},
+ #{isDeleted}, #{isOfficial}, #{isPublic}, #{location}, #{isDraft}, #{createdAt}, #{updatedAt}
+ )
UPDATE post
SET
- user_openid = #{userOpenid},
- community_id = #{communityId},
- title = #{title},
- content = #{content},
- video_url = #{videoUrl},
- image_urls = #{imageUrls},
- is_deleted = #{isDeleted},
- is_official = #{isOfficial},
- is_public = #{is_public},
- location = #{location},
- created_at = #{createdAt},
- updated_at = #{updatedAt}
+ user_openid = #{userOpenid},
+ community_id = #{communityId},
+ title = #{title},
+ content = #{content},
+ video_url = #{videoUrl},
+ image_urls = #{imageUrls},
+ is_deleted = #{isDeleted},
+ is_official = #{isOfficial},
+ is_public = #{isPublic},
+ location = #{location},
+ is_draft = #{isDraft},
+ created_at = #{createdAt},
+ updated_at = #{updatedAt}
WHERE post_id = #{postId}
@@ -80,5 +82,31 @@
FROM post p, posttag pt, tag t
WHERE p.post_id = pt.post_id AND pt.tag_id = t.tag_id AND t.tag_id = #{tagId} AND p.is_deleted = 0 AND p.is_public = 1
+
+
+
diff --git a/community-8073/src/main/resources/mapper/TutorialTagsMapper.xml b/community-8073/src/main/resources/mapper/TutorialTagsMapper.xml
new file mode 100644
index 0000000..34dcf9f
--- /dev/null
+++ b/community-8073/src/main/resources/mapper/TutorialTagsMapper.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ tag_id,tag_name,is_official,
+ is_deleted
+
+
diff --git a/community-8073/src/main/resources/mapper/TutorialsMapper.xml b/community-8073/src/main/resources/mapper/TutorialsMapper.xml
new file mode 100644
index 0000000..63690ee
--- /dev/null
+++ b/community-8073/src/main/resources/mapper/TutorialsMapper.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ tutorial_id,title,content,
+ image_url,video_url,is_official,
+ is_deleted,created_at,tag_id
+
+