-
-
-
-
-

[[${notice.noticeTitle}]]

-
- 发送时间:[[${#dates.format(notice.createTime, 'yyyy-MM-dd HH:mm:ss')}]] - 发件人: [[${notice.createBy}]] -
-
-
-
-
-
-
+ +
+ +
+ + 通知 + + + 公告 + + + 消息 + +
+ +

公告标题

+ +
+ + + 发布人 + + + + 发布时间 + + + + 状态 + +
+ +
+ + + +
+ +
+
+
+
+ 暂无内容
- + +
+ \ No newline at end of file diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysNotice.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysNotice.java index b5c6187b..adb057b7 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysNotice.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysNotice.java @@ -4,6 +4,7 @@ import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; +import com.fasterxml.jackson.annotation.JsonProperty; import com.ruoyi.common.core.domain.BaseEntity; import com.ruoyi.common.xss.Xss; @@ -31,6 +32,10 @@ public class SysNotice extends BaseEntity /** 公告状态(0正常 1关闭) */ private String status; + /** 是否已读 */ + @JsonProperty("isRead") + private boolean isRead; + public Long getNoticeId() { return noticeId; @@ -84,6 +89,16 @@ public class SysNotice extends BaseEntity return status; } + public boolean getIsRead() + { + return isRead; + } + + public void setIsRead(boolean isRead) + { + this.isRead = isRead; + } + @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysNoticeRead.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysNoticeRead.java new file mode 100644 index 00000000..6ebf88cd --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysNoticeRead.java @@ -0,0 +1,76 @@ +package com.ruoyi.system.domain; + +import java.util.Date; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * 公告已读记录表 sys_notice_read + * + * @author ruoyi + */ +public class SysNoticeRead +{ + /** 主键 */ + private Long readId; + + /** 公告ID */ + private Long noticeId; + + /** 用户ID */ + private Long userId; + + /** 阅读时间 */ + private Date readTime; + + public Long getReadId() + { + return readId; + } + + public void setReadId(Long readId) + { + this.readId = readId; + } + + public Long getNoticeId() + { + return noticeId; + } + + public void setNoticeId(Long noticeId) + { + this.noticeId = noticeId; + } + + public Long getUserId() + { + return userId; + } + + public void setUserId(Long userId) + { + this.userId = userId; + } + + public Date getReadTime() + { + return readTime; + } + + public void setReadTime(Date readTime) + { + this.readTime = readTime; + } + + @Override + public String toString() + { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("readId", getReadId()) + .append("noticeId", getNoticeId()) + .append("userId", getUserId()) + .append("readTime", getReadTime()) + .toString(); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysNoticeReadMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysNoticeReadMapper.java new file mode 100644 index 00000000..69e9b8d6 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysNoticeReadMapper.java @@ -0,0 +1,65 @@ +package com.ruoyi.system.mapper; + +import java.util.List; +import org.apache.ibatis.annotations.Param; +import com.ruoyi.system.domain.SysNoticeRead; +import com.ruoyi.system.domain.SysNotice; + +/** + * 公告已读记录 数据层 + * + * @author ruoyi + */ +public interface SysNoticeReadMapper +{ + /** + * 新增已读记录(忽略重复) + * + * @param noticeRead 已读记录 + * @return 结果 + */ + public int insertNoticeRead(SysNoticeRead noticeRead); + + /** + * 查询某用户未读公告数量 + * + * @param userId 用户ID + * @return 未读数量 + */ + public int selectUnreadCount(@Param("userId") Long userId); + + /** + * 查询某用户是否已读某公告 + * + * @param noticeId 公告ID + * @param userId 用户ID + * @return 已读记录数(0未读 1已读) + */ + public int selectIsRead(@Param("noticeId") Long noticeId, @Param("userId") Long userId); + + /** + * 批量标记已读 + * + * @param userId 用户ID + * @param noticeIds 公告ID数组 + * @return 结果 + */ + public int insertNoticeReadBatch(@Param("userId") Long userId, @Param("noticeIds") Long[] noticeIds); + + /** + * 查询带已读状态的公告列表(SQL层限制条数,一次查询完成) + * + * @param userId 用户ID + * @param limit 最多返回条数 + * @return 带 isRead 标记的公告列表 + */ + public List selectNoticeListWithReadStatus(@Param("userId") Long userId, @Param("limit") int limit); + + /** + * 公告删除时清理对应已读记录 + * + * @param noticeIds 公告ID数组 + * @return 结果 + */ + public int deleteByNoticeIds(@Param("noticeIds") String[] noticeIds); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysNoticeReadService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysNoticeReadService.java new file mode 100644 index 00000000..de1df9b4 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysNoticeReadService.java @@ -0,0 +1,52 @@ +package com.ruoyi.system.service; + +import java.util.List; +import com.ruoyi.system.domain.SysNotice; + +/** + * 公告已读记录 服务层 + * + * @author ruoyi + */ +public interface ISysNoticeReadService +{ + /** + * 标记已读(幂等,重复调用不报错) + * + * @param noticeId 公告ID + * @param userId 用户ID + */ + public void markRead(Long noticeId, Long userId); + + /** + * 查询某用户未读公告数量 + * + * @param userId 用户ID + * @return 未读数量 + */ + public int selectUnreadCount(Long userId); + + /** + * 查询公告列表并标记当前用户已读状态(用于首页展示) + * + * @param userId 用户ID + * @param limit 最多返回条数 + * @return 带 isRead 标记的公告列表 + */ + public List selectNoticeListWithReadStatus(Long userId, int limit); + + /** + * 批量标记已读 + * + * @param userId 用户ID + * @param noticeIds 公告ID数组 + */ + public void markReadBatch(Long userId, Long[] noticeIds); + + /** + * 删除公告时清理对应已读记录 + * + * @param ids 公告ID字符串(逗号分隔) + */ + public void deleteByNoticeIds(String ids); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysNoticeReadServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysNoticeReadServiceImpl.java new file mode 100644 index 00000000..e5b1e14e --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysNoticeReadServiceImpl.java @@ -0,0 +1,74 @@ +package com.ruoyi.system.service.impl; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.common.core.text.Convert; +import com.ruoyi.system.domain.SysNoticeRead; +import com.ruoyi.system.domain.SysNotice; +import com.ruoyi.system.mapper.SysNoticeReadMapper; +import com.ruoyi.system.service.ISysNoticeReadService; + +/** + * 公告已读记录 服务层实现 + * + * @author ruoyi + */ +@Service +public class SysNoticeReadServiceImpl implements ISysNoticeReadService +{ + @Autowired + private SysNoticeReadMapper noticeReadMapper; + + /** + * 标记已读 + */ + @Override + public void markRead(Long noticeId, Long userId) + { + SysNoticeRead record = new SysNoticeRead(); + record.setNoticeId(noticeId); + record.setUserId(userId); + noticeReadMapper.insertNoticeRead(record); + } + + /** + * 查询某用户未读公告数量 + */ + @Override + public int selectUnreadCount(Long userId) + { + return noticeReadMapper.selectUnreadCount(userId); + } + + /** + * 查询公告列表并标记当前用户已读状态 + */ + @Override + public List selectNoticeListWithReadStatus(Long userId, int limit) + { + return noticeReadMapper.selectNoticeListWithReadStatus(userId, limit); + } + + /** + * 批量标记已读 + */ + @Override + public void markReadBatch(Long userId, Long[] noticeIds) + { + if (noticeIds == null || noticeIds.length == 0) + { + return; + } + noticeReadMapper.insertNoticeReadBatch(userId, noticeIds); + } + + /** + * 删除公告时清理对应已读记录 + */ + @Override + public void deleteByNoticeIds(String ids) + { + noticeReadMapper.deleteByNoticeIds(Convert.toStrArray(ids)); + } +} diff --git a/ruoyi-system/src/main/resources/mapper/system/SysNoticeMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysNoticeMapper.xml index c2037c9e..9a8c9acd 100644 --- a/ruoyi-system/src/main/resources/mapper/system/SysNoticeMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/SysNoticeMapper.xml @@ -40,6 +40,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" AND create_by like concat('%', #{createBy}, '%') + order by notice_id desc diff --git a/ruoyi-system/src/main/resources/mapper/system/SysNoticeReadMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysNoticeReadMapper.xml new file mode 100644 index 00000000..3af8092e --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/system/SysNoticeReadMapper.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + insert ignore into sys_notice_read (notice_id, user_id, read_time) + values (#{noticeId}, #{userId}, sysdate()) + + + + + + + + + + + + + + insert ignore into sys_notice_read (notice_id, user_id, read_time) + values + + (#{noticeId}, #{userId}, sysdate()) + + + + + + delete from sys_notice_read where notice_id in + + #{noticeId} + + + +