diff --git a/my-project-backend/src/main/java/com/example/controller/NotificationController.java b/my-project-backend/src/main/java/com/example/controller/NotificationController.java new file mode 100644 index 0000000..f5e50cd --- /dev/null +++ b/my-project-backend/src/main/java/com/example/controller/NotificationController.java @@ -0,0 +1,37 @@ +package com.example.controller; + +import com.example.entity.RestBean; +import com.example.entity.vo.response.NotificationVO; +import com.example.service.NotificationService; +import com.example.utils.Const; +import jakarta.annotation.Resource; +import jakarta.validation.constraints.Min; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/api/notification") +public class NotificationController { + + @Resource + NotificationService service; + + @GetMapping("/list") + public RestBean> listNotification(@RequestAttribute(Const.ATTR_USER_ID) int id) { + return RestBean.success(service.findUserNotification(id)); + } + + @GetMapping("/delete") + public RestBean> deleteNotification(@RequestParam @Min(0) int id, + @RequestAttribute(Const.ATTR_USER_ID) int uid) { + service.deleteUserNotification(id, uid); + return RestBean.success(); + } + + @GetMapping("/delete-all") + public RestBean> deleteAllNotification(@RequestAttribute(Const.ATTR_USER_ID) int uid) { + service.deleteUserAllNotification(uid); + return RestBean.success(); + } +} diff --git a/my-project-backend/src/main/java/com/example/entity/dto/Notification.java b/my-project-backend/src/main/java/com/example/entity/dto/Notification.java new file mode 100644 index 0000000..6730dae --- /dev/null +++ b/my-project-backend/src/main/java/com/example/entity/dto/Notification.java @@ -0,0 +1,19 @@ +package com.example.entity.dto; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.example.entity.BaseData; +import lombok.Data; + +@Data +@TableName("db_notification") +public class Notification implements BaseData { + @TableId(type = IdType.AUTO) + Integer id; + Integer uid; + String title; + String content; + String type; + String url; +} diff --git a/my-project-backend/src/main/java/com/example/entity/vo/response/NotificationVO.java b/my-project-backend/src/main/java/com/example/entity/vo/response/NotificationVO.java new file mode 100644 index 0000000..903a9ba --- /dev/null +++ b/my-project-backend/src/main/java/com/example/entity/vo/response/NotificationVO.java @@ -0,0 +1,12 @@ +package com.example.entity.vo.response; + +import lombok.Data; + +@Data +public class NotificationVO { + Integer id; + String title; + String content; + String type; + String url; +} diff --git a/my-project-backend/src/main/java/com/example/mapper/NotificationMapper.java b/my-project-backend/src/main/java/com/example/mapper/NotificationMapper.java new file mode 100644 index 0000000..ef6dfd6 --- /dev/null +++ b/my-project-backend/src/main/java/com/example/mapper/NotificationMapper.java @@ -0,0 +1,9 @@ +package com.example.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.example.entity.dto.Notification; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface NotificationMapper extends BaseMapper { +} diff --git a/my-project-backend/src/main/java/com/example/service/NotificationService.java b/my-project-backend/src/main/java/com/example/service/NotificationService.java new file mode 100644 index 0000000..a8c05f2 --- /dev/null +++ b/my-project-backend/src/main/java/com/example/service/NotificationService.java @@ -0,0 +1,14 @@ +package com.example.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.example.entity.dto.Notification; +import com.example.entity.vo.response.NotificationVO; + +import java.util.List; + +public interface NotificationService extends IService { + List findUserNotification(int uid); + void deleteUserNotification(int id, int uid); + void deleteUserAllNotification(int uid); + void addNotification(int uid, String title, String content, String type, String url); +} diff --git a/my-project-backend/src/main/java/com/example/service/impl/NotificationServiceImpl.java b/my-project-backend/src/main/java/com/example/service/impl/NotificationServiceImpl.java new file mode 100644 index 0000000..9b1047b --- /dev/null +++ b/my-project-backend/src/main/java/com/example/service/impl/NotificationServiceImpl.java @@ -0,0 +1,42 @@ +package com.example.service.impl; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.example.entity.dto.Notification; +import com.example.entity.vo.response.NotificationVO; +import com.example.mapper.NotificationMapper; +import com.example.service.NotificationService; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class NotificationServiceImpl extends ServiceImpl implements NotificationService { + + @Override + public List findUserNotification(int uid) { + return this.list(Wrappers.query().eq("uid", uid)) + .stream() + .map(notification -> notification.asViewObject(NotificationVO.class)) + .toList(); + } + + public void deleteUserNotification(int id, int uid){ + this.remove(Wrappers.query().eq("id", id).eq("uid", uid)); + } + + public void deleteUserAllNotification(int uid){ + this.remove(Wrappers.query().eq("uid", uid)); + } + + @Override + public void addNotification(int uid, String title, String content, String type, String url) { + Notification notification = new Notification(); + notification.setUid(uid); + notification.setTitle(title); + notification.setContent(content); + notification.setType(type); + notification.setUrl(url); + this.save(notification); + } +} diff --git a/my-project-backend/src/main/java/com/example/service/impl/TopicServiceImpl.java b/my-project-backend/src/main/java/com/example/service/impl/TopicServiceImpl.java index dcf3977..287a31b 100644 --- a/my-project-backend/src/main/java/com/example/service/impl/TopicServiceImpl.java +++ b/my-project-backend/src/main/java/com/example/service/impl/TopicServiceImpl.java @@ -14,6 +14,7 @@ import com.example.entity.vo.response.TopicDetailVO; import com.example.entity.vo.response.TopicPreviewVO; import com.example.entity.vo.response.TopicTopVO; import com.example.mapper.*; +import com.example.service.NotificationService; import com.example.service.TopicService; import com.example.utils.CacheUtils; import com.example.utils.Const; @@ -56,6 +57,9 @@ public class TopicServiceImpl extends ServiceImpl implements @Resource StringRedisTemplate template; + @Resource + NotificationService notificationService; + @Override public List listType() { return typeMapper.selectList(null); @@ -171,6 +175,22 @@ public class TopicServiceImpl extends ServiceImpl implements BeanUtils.copyProperties(vo, comment); comment.setTime(new Date()); commentMapper.insert(comment); + Topic topic = baseMapper.selectById(vo.getTid()); + Account account = accountMapper.selectById(uid); + if(vo.getQuote() > 0) { + TopicComment com = commentMapper.selectById(vo.getQuote()); + if(!Objects.equals(com.getUid(), account.getId())) { + notificationService.addNotification(com.getUid(), + "您有新的帖子评论回复", + account.getUsername()+" 回复了你发表的评论,快去看看吧!", + "success", "/index/post-detail/"+com.getTid()); + } + } else if(!Objects.equals(topic.getUid(), account.getId())) { + notificationService.addNotification(topic.getUid(), + "您有新的帖子回复", + account.getUsername()+" 回复了你发表的主题: "+topic.getTitle() +",快去看看吧!", + "success", "/index/post-detail/"+topic.getId()); + } return null; } diff --git a/my-project-frontend/src/views/forum/TopicDetail.vue b/my-project-frontend/src/views/forum/TopicDetail.vue index 6746ce8..61f00c8 100644 --- a/my-project-frontend/src/views/forum/TopicDetail.vue +++ b/my-project-frontend/src/views/forum/TopicDetail.vue @@ -202,7 +202,7 @@ function deleteComment(id) { :submit="updateTopic"/> + @comment="comment.show = false;loadComments(Math.max(0, Math.ceil(topic.data.commentCount / 10) - 1))"/>