Merge "用户类以及邀请码"
diff --git a/src/main/java/com/pt5/pthouduan/controller/PostController.java b/src/main/java/com/pt5/pthouduan/controller/PostController.java
new file mode 100644
index 0000000..a3a9017
--- /dev/null
+++ b/src/main/java/com/pt5/pthouduan/controller/PostController.java
@@ -0,0 +1,149 @@
+package com.pt5.pthouduan.controller;
+
+import com.pt5.pthouduan.entity.Post;
+import com.pt5.pthouduan.service.PostService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * <p>
+ * 帖子控制器
+ * </p>
+ *
+ * 功能:创建帖子(支持上传图片、置顶、范围控制)、点赞、取消点赞、关键词搜索、删除、更新、置顶与取消置顶
+ *
+ * @author
+ * @since 2025-05-10
+ */
+@CrossOrigin(origins = "http://localhost:5173")
+@Controller
+@RequestMapping("/post")
+public class PostController {
+
+ @Autowired
+ private PostService postService;
+
+ // 创建帖子(支持图片上传)
+ @PostMapping("/create")
+ @ResponseBody
+ public boolean createPost(
+ @RequestParam("userid") Long userid,
+ @RequestParam("post_title") String post_title,
+ @RequestParam("post_content") String post_content,
+ @RequestParam(value = "tags", required = false) String tags,
+ @RequestParam(value = "rannge", required = false) String rannge,
+ @RequestParam(value = "is_pinned", required = false) Boolean is_pinned,
+ @RequestParam(value = "photo", required = false) MultipartFile photoFile
+ ) {
+ Post post = new Post();
+ post.setUserid(userid);
+ post.setPostTitle(post_title);
+ post.setPostContent(post_content);
+ post.setTags(tags);
+ post.setRannge(rannge);
+ post.setIsSticky(is_pinned != null && is_pinned);
+ post.setPostCreatedTime(LocalDateTime.now());
+ post.setUpdatedTime(LocalDateTime.now());
+ post.setLikes(0);
+
+
+ // 保存图片
+ if (photoFile != null && !photoFile.isEmpty()) {
+ String uploadDir = "D:/postuploads/";
+ File dir = new File(uploadDir);
+ if (!dir.exists()) dir.mkdirs();
+
+ String fileName = UUID.randomUUID() + "_" + photoFile.getOriginalFilename();
+ File dest = new File(uploadDir + fileName);
+ try {
+ photoFile.transferTo(dest);
+ post.setPhoto("/images/" + fileName);
+ } catch (IOException e) {
+ e.printStackTrace();
+ return false;
+ }
+ }
+
+ return postService.createPost(post) != null;
+ }
+
+
+
+ // 删除帖子
+ @DeleteMapping("/delete/{postid}")
+ @ResponseBody
+ public boolean deletePost(@PathVariable Integer postid) {
+ return postService.deletePost(postid);
+ }
+
+ // 更新帖子(包括置顶、范围、照片等)
+ @PutMapping("/update")
+ @ResponseBody
+ public boolean updatePost(@RequestBody Post post) {
+ return postService.updatePost(post);
+ }
+
+ // 关键词搜索
+ @GetMapping("/search")
+ @ResponseBody
+ public List<Post> searchPosts(@RequestParam String keyword) {
+ return postService.searchPostsByKeyword(keyword);
+ }
+
+ // 点赞
+ @PutMapping("/like/{postid}")
+ @ResponseBody
+ public boolean likePost(@PathVariable Integer postid) {
+ return postService.incrementLikes(postid);
+ }
+
+ @GetMapping("/all")
+ @ResponseBody
+ public List<Post> getAllPostsSorted() {
+ return postService.getAllPostsSorted();
+ }
+
+
+ // 取消点赞
+ @PutMapping("/unlike/{postid}")
+ @ResponseBody
+ public boolean unlikePost(@PathVariable Integer postid) {
+ return postService.decrementLikes(postid);
+ }
+
+ // 置顶帖子
+ @PutMapping("/pin/{postid}")
+ @ResponseBody
+ public boolean pinPost(@PathVariable Integer postid) {
+ return postService.setPinnedStatus(postid, true);
+ }
+
+ // 取消置顶
+ @PutMapping("/unpin/{postid}")
+ @ResponseBody
+ public boolean unpinPost(@PathVariable Integer postid) {
+ return postService.setPinnedStatus(postid, false);
+ }
+
+ // 根据用户ID获取该用户所有帖子
+ @GetMapping("/findByUserid")
+ @ResponseBody
+ public List<Post> findByUserid(@RequestParam Long userid) {
+ return postService.findByUserid(userid);
+ }
+
+ // 根据是否置顶查找帖子
+ @GetMapping("/findPinned")
+ @ResponseBody
+ public List<Post> findPinnedPosts() {
+ return postService.findPinnedPosts();
+ }
+}
diff --git a/src/main/java/com/pt5/pthouduan/entity/Post.java b/src/main/java/com/pt5/pthouduan/entity/Post.java
index d04a601..843800d 100644
--- a/src/main/java/com/pt5/pthouduan/entity/Post.java
+++ b/src/main/java/com/pt5/pthouduan/entity/Post.java
@@ -11,7 +11,7 @@
*
* </p>
*
- * @author ljx
+ * @author ym
* @since 2025-04-14
*/
@TableName("post")
@@ -22,16 +22,26 @@
@TableId("postid")
private Integer postid;
+ private Integer likes;
+
private Long userid;
- private LocalDateTime updatedTime;
+ private String photo;
- private Boolean isSticky;
+ private String rannge;
- private String postTitle;
+ private LocalDateTime updated_time;
+
+ private Boolean is_pinned;
+
+ private String post_title;
private LocalDateTime postCreatedTime;
+ private String post_content;
+
+ private String tags;
+
public Integer getPostid() {
return postid;
}
@@ -40,6 +50,14 @@
this.postid = postid;
}
+ public Integer getLikes() {
+ return likes;
+ }
+
+ public void setLikes(Integer likes) {
+ this.likes = likes;
+ }
+
public Long getUserid() {
return userid;
}
@@ -49,27 +67,52 @@
}
public LocalDateTime getUpdatedTime() {
- return updatedTime;
+ return updated_time;
}
- public void setUpdatedTime(LocalDateTime updatedTime) {
- this.updatedTime = updatedTime;
+ public void setUpdatedTime(LocalDateTime updated_time) {
+ this.updated_time = updated_time;
+ }
+
+ public String getTags() {//获取标签
+ return tags;
+ }
+
+ public void setTags(String tags) {
+ this.tags = tags;
+ }
+
+
+ public String getPhoto() {//获取标签
+ return photo;
+ }
+
+ public void setPhoto(String photo) {
+ this.photo = photo;
+ }
+
+ public String getRannge() {
+ return rannge;
+ }
+
+ public void setRannge(String rannge) {
+ this.rannge = rannge;
}
public Boolean getIsSticky() {
- return isSticky;
+ return is_pinned;
}
- public void setIsSticky(Boolean isSticky) {
- this.isSticky = isSticky;
+ public void setIsSticky(Boolean is_pinned) {
+ this.is_pinned = is_pinned;
}
public String getPostTitle() {
- return postTitle;
+ return post_title;
}
- public void setPostTitle(String postTitle) {
- this.postTitle = postTitle;
+ public void setPostTitle(String post_title) {
+ this.post_title = post_title;
}
public LocalDateTime getPostCreatedTime() {
@@ -80,15 +123,28 @@
this.postCreatedTime = postCreatedTime;
}
+ public String getPostContent() {
+ return post_content;
+ }
+
+ public void setPostContent(String post_content) {
+ this.post_content = post_content;
+ }
+
@Override
public String toString() {
return "Post{" +
- "postid = " + postid +
- ", userid = " + userid +
- ", updatedTime = " + updatedTime +
- ", isSticky = " + isSticky +
- ", postTitle = " + postTitle +
- ", postCreatedTime = " + postCreatedTime +
- "}";
+ "postid=" + postid +
+ ", userid=" + userid +
+ ", photo='" + photo + '\'' +
+ ", updatedTime=" + updated_time +
+ ", likes=" + likes +
+ ", is_pinned=" + is_pinned +
+ ", post_title='" + post_title + '\'' +
+ ", post_content='" + post_content + '\'' +
+ ", postCreatedTime=" + postCreatedTime +
+ ", tags='" + tags + '\'' +
+ ", rannge='" + rannge + '\'' +
+ '}';
}
}
diff --git a/src/main/java/com/pt5/pthouduan/mapper/PostMapper.java b/src/main/java/com/pt5/pthouduan/mapper/PostMapper.java
index 817e555..6b95c73 100644
--- a/src/main/java/com/pt5/pthouduan/mapper/PostMapper.java
+++ b/src/main/java/com/pt5/pthouduan/mapper/PostMapper.java
@@ -3,16 +3,50 @@
import com.pt5.pthouduan.entity.Post;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
/**
* <p>
- * Mapper 接口
+ * 帖子 Mapper 接口
* </p>
*
- * @author ljx
+ * 功能:增、删、改、查(按关键词)、点赞、置顶、用户帖子查询、置顶帖子查询
+ *
+ * 作者:杨蔓
* @since 2025-04-14
*/
@Mapper
public interface PostMapper extends BaseMapper<Post> {
+ // 创建帖子
+ void save(Post post);
+
+ // 根据帖子ID删除
+ int deleteByPostid(@Param("postid") Integer postid);
+
+ // 更新帖子
+ int updatePost(Post post);
+
+ // 模糊搜索(标题或标签)
+ List<Post> searchByKeyword(@Param("keyword") String keyword);
+
+ // 点赞 +1
+ int incrementLikes(@Param("postid") Integer postid);
+
+ // 取消点赞 -1(最小为0)
+ int decrementLikes(@Param("postid") Integer postid);
+
+ // 设置置顶状态
+ int updatePinnedStatus(@Param("postid") Integer postid, @Param("pinned") boolean pinned);
+
+ // 根据用户ID查询该用户所有帖子
+ List<Post> findByUserid(@Param("userid") Long userid);
+
+ // 查询所有置顶帖子
+ List<Post> findPinnedPosts();
+
+ // ✅ 新增:查询所有帖子(置顶优先,时间倒序)
+ List<Post> selectAllSorted();
}
diff --git a/src/main/java/com/pt5/pthouduan/service/PostService.java b/src/main/java/com/pt5/pthouduan/service/PostService.java
new file mode 100644
index 0000000..fabf254
--- /dev/null
+++ b/src/main/java/com/pt5/pthouduan/service/PostService.java
@@ -0,0 +1,46 @@
+package com.pt5.pthouduan.service;
+
+import com.pt5.pthouduan.entity.Post;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 帖子服务接口
+ * </p>
+ *
+ * 功能:
+ * - 增、删、改、查(按标签或标题)
+ * - 点赞、取消点赞
+ * - 设置置顶状态
+ * - 可设置可见范围
+ * - 上传图片(通常可选放在 Controller)
+ * - 查找用户所有帖子
+ * - 查找置顶帖子
+ * - 获取所有帖子(置顶优先,时间倒序)
+ *
+ * @author 杨蔓
+ * @since 2025-04-14
+ */
+public interface PostService {
+
+ Post createPost(Post post); // 创建帖子
+
+ boolean deletePost(Integer postid); // 删除帖子
+
+ boolean updatePost(Post post); // 更新帖子
+
+ List<Post> searchPostsByKeyword(String keyword); // 查找帖子(标题或标签)
+
+ boolean incrementLikes(Integer postid); // 点赞(likes + 1)
+
+ boolean decrementLikes(Integer postid); // 取消点赞(likes - 1,最小为0)
+
+ boolean setPinnedStatus(Integer postid, boolean pinned); // 设置是否置顶
+
+ List<Post> findByUserid(Long userid); // 根据用户 ID 获取帖子
+
+ List<Post> findPinnedPosts(); // 查找所有置顶帖子
+
+ List<Post> getAllPostsSorted(); // ✅ 获取所有帖子(置顶优先,按时间排序)
+}
diff --git a/src/main/java/com/pt5/pthouduan/service/impl/PostServiceImpl.java b/src/main/java/com/pt5/pthouduan/service/impl/PostServiceImpl.java
new file mode 100644
index 0000000..d1bda7f
--- /dev/null
+++ b/src/main/java/com/pt5/pthouduan/service/impl/PostServiceImpl.java
@@ -0,0 +1,76 @@
+package com.pt5.pthouduan.service.impl;
+
+import com.pt5.pthouduan.entity.Post;
+import com.pt5.pthouduan.mapper.PostMapper;
+import com.pt5.pthouduan.service.PostService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 帖子服务实现类
+ * </p>
+ *
+ * @author 杨蔓
+ * @since 2025-04-14
+ */
+@Service
+public class PostServiceImpl implements PostService {
+
+ @Autowired
+ private PostMapper postMapper;
+
+ @Override
+ public Post createPost(Post post) {
+ postMapper.save(post);
+ return post;
+ }
+
+ @Override
+ public boolean deletePost(Integer postid) {
+ return postMapper.deleteByPostid(postid) > 0;
+ }
+
+ @Override
+ public boolean updatePost(Post post) {
+ return postMapper.updatePost(post) > 0;
+ }
+
+ @Override
+ public List<Post> searchPostsByKeyword(String keyword) {
+ return postMapper.searchByKeyword(keyword);
+ }
+
+ @Override
+ public boolean incrementLikes(Integer postid) {
+ return postMapper.incrementLikes(postid) >= 0;
+ }
+
+ @Override
+ public boolean decrementLikes(Integer postid) {
+ return postMapper.decrementLikes(postid) >= 0;
+ }
+
+ @Override
+ public boolean setPinnedStatus(Integer postid, boolean pinned) {
+ return postMapper.updatePinnedStatus(postid, pinned) > 0;
+ }
+
+ @Override
+ public List<Post> findByUserid(Long userid) {
+ return postMapper.findByUserid(userid);
+ }
+
+ @Override
+ public List<Post> findPinnedPosts() {
+ return postMapper.findPinnedPosts();
+ }
+
+ /** ✅ 新增:获取所有帖子(置顶优先,时间倒序) */
+ @Override
+ public List<Post> getAllPostsSorted() {
+ return postMapper.selectAllSorted();
+ }
+}
diff --git a/src/main/resources/mapper/PostMapper.xml b/src/main/resources/mapper/PostMapper.xml
new file mode 100644
index 0000000..e676fcc
--- /dev/null
+++ b/src/main/resources/mapper/PostMapper.xml
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+ "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.pt5.pthouduan.mapper.PostMapper">
+
+ <!-- 插入帖子 -->
+ <insert id="save" parameterType="com.pt5.pthouduan.entity.Post"
+ useGeneratedKeys="true" keyProperty="postid" keyColumn="postid">
+ INSERT INTO post (
+ userid,
+ photo,
+ rannge,
+ is_pinned,
+ post_title,
+ post_content,
+ postCreatedTime,
+ updated_time,
+ tags,
+ likes
+ ) VALUES (
+ #{userid},
+ #{photo},
+ #{rannge},
+ #{is_pinned},
+ #{post_title},
+ #{post_content},
+ #{postCreatedTime},
+ #{updated_time},
+ #{tags},
+ COALESCE(#{likes}, 0)
+ )
+ </insert>
+
+ <!-- 删除帖子 -->
+ <delete id="deleteByPostid" parameterType="int">
+ DELETE FROM post WHERE postid = #{postid}
+ </delete>
+
+ <!-- 更新帖子 -->
+ <update id="updatePost" parameterType="com.pt5.pthouduan.entity.Post">
+ UPDATE post
+ SET
+ userid = #{userid},
+ photo = #{photo},
+ rannge = #{rannge},
+ updated_time = #{updated_time},
+ is_pinned = #{is_pinned},
+ post_title = #{post_title},
+ post_content = #{post_content},
+ postCreatedTime = #{postCreatedTime},
+ tags = #{tags},
+ likes = COALESCE(#{likes}, 0)
+ WHERE postid = #{postid}
+ </update>
+
+ <!-- 模糊搜索帖子 -->
+ <select id="searchByKeyword" resultType="com.pt5.pthouduan.entity.Post">
+ SELECT * FROM post
+ WHERE post_title LIKE CONCAT('%', #{keyword}, '%')
+ OR tags LIKE CONCAT('%', #{keyword}, '%')
+ </select>
+
+ <!-- 点赞 +1 -->
+ <update id="incrementLikes" parameterType="int">
+ UPDATE post
+ SET likes = likes + 1
+ WHERE postid = #{postid}
+ </update>
+
+ <!-- 取消点赞 -->
+ <update id="decrementLikes" parameterType="int">
+ UPDATE post
+ SET likes = CASE WHEN likes > 0 THEN likes - 1 ELSE 0 END
+ WHERE postid = #{postid}
+ </update>
+
+ <!-- 更新置顶状态 -->
+ <update id="updatePinnedStatus" parameterType="map">
+ UPDATE post
+ SET is_pinned = #{pinned}
+ WHERE postid = #{postid}
+ </update>
+
+ <!-- 根据用户 ID 查询其所有帖子 -->
+ <select id="findByUserid" resultType="com.pt5.pthouduan.entity.Post">
+ SELECT * FROM post
+ WHERE userid = #{userid}
+ </select>
+
+ <!-- 查询所有置顶帖子 -->
+ <select id="findPinnedPosts" resultType="com.pt5.pthouduan.entity.Post">
+ SELECT * FROM post
+ WHERE is_pinned = TRUE
+ </select>
+
+ <!-- 查询所有帖子,按置顶优先、创建时间倒序 -->
+ <select id="selectAllSorted" resultType="com.pt5.pthouduan.entity.Post">
+ SELECT * FROM post
+ ORDER BY is_pinned DESC, postCreatedTime DESC
+ </select>
+
+</mapper>