更多ruoyi-nbcio功能请看演示系统
gitee源代码地址
前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio
演示地址:RuoYi-Nbcio后台管理系统
1、数据库表方面
在原来sys_notice修改基础上增加一个表叫sys_notice_send
表结构如下:
DROP TABLE IF EXISTS `sys_notice`; CREATE TABLE `sys_notice` ( `notice_id` bigint(20) NOT NULL COMMENT '公告ID', `notice_title` varchar(50) NOT NULL COMMENT '公告标题', `notice_type` char(1) NOT NULL COMMENT '公告类型(1通知 2公告 3待办)', `notice_content` longblob COMMENT '公告内容', `status` char(1) DEFAULT '0' COMMENT '公告状态(0正常 1关闭)', `sender` bigint(20) DEFAULT NULL COMMENT '发布人', `priority` varchar(50) DEFAULT NULL COMMENT '优先级(L低,M中,H高)', `msg_type` varchar(10) DEFAULT NULL COMMENT '通告对象类型(USER:指定用户,ALL:全体用户)', `send_status` varchar(10) DEFAULT NULL COMMENT '发布状态(0未发布,1已发布,2已撤销)', `send_time` datetime DEFAULT NULL COMMENT '发布时间', `cancel_time` datetime DEFAULT NULL COMMENT '撤销时间', `create_by` varchar(64) DEFAULT '' COMMENT '创建者', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_by` varchar(64) DEFAULT '' COMMENT '更新者', `update_time` datetime DEFAULT NULL COMMENT '更新时间', `remark` varchar(255) DEFAULT NULL COMMENT '备注', PRIMARY KEY (`notice_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='通知公告表'; DROP TABLE IF EXISTS `sys_notice_send`; CREATE TABLE `sys_notice_send` ( `send_id` bigint(20) NOT NULL COMMENT '公告发送ID', `notice_id` bigint(20) NOT NULL COMMENT '公告ID', `user_id` bigint(20) NOT NULL COMMENT '用户id', `read_flag` varchar(10) DEFAULT NULL COMMENT '阅读状态(0未读,1已读)', `read_time` datetime DEFAULT NULL COMMENT '阅读时间', `create_by` varchar(64) DEFAULT NULL COMMENT '创建人', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_by` varchar(64) DEFAULT NULL COMMENT '更新人', `update_time` datetime DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`send_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='用户公告阅读标记表';
2、通过上面的数据导入,用系统提供的代码生成,生成前端与后端代码。
3、在common模块里增加一个公共的接口服务,以后一些公共需要各个模块使用的,都可以放在这里。
目前先提供下面一些接口服务
package com.ruoyi.common.core.service; import com.ruoyi.common.core.domain.dto.MessageDTO; import com.ruoyi.common.core.domain.model.LoginUser; /** * 通用 公共服务 * * @author nbacheng * @date 2023-09-21 */ public interface CommonService { /** * 1发送系统消息 * @param message 使用构造器赋值参数 如果不设置category(消息类型)则默认为2 发送系统消息 */ void sendSysNotice(MessageDTO message); /** * 发消息 * @param fromUser * @param toUser * @param title * @param msgContent * @param setMsgCategory */ void sendSysNotice(String fromUser, String toUser, String title, String msgContent, String setMsgCategory); /** * 获取流程发送消息基地址 * @return */ String getBaseUrl(); /** * 获取当前登录用户 * * @return 当前登录用户信息 */ public LoginUser getLoginUser(); }
4、common接口服务实现如下:
package com.ruoyi.system.service.impl; import java.util.Date; import javax.annotation.Resource; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.alibaba.fastjson.JSONObject; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.WebsocketConst; import com.ruoyi.common.core.domain.dto.MessageDTO; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.websocket.WebSocketServer; import com.ruoyi.system.domain.SysNotice; import com.ruoyi.system.domain.SysNoticeSend; import com.ruoyi.system.mapper.SysNoticeMapper; import com.ruoyi.system.mapper.SysNoticeSendMapper; import com.ruoyi.system.mapper.SysUserMapper; import com.ruoyi.common.core.service.CommonService; import com.ruoyi.common.helper.LoginHelper; import cn.hutool.core.util.ObjectUtil; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor @Service public class SysCommServiceImple implements CommonService { @Value("${flowable.message-base-url}") private String msgBaseUrl; @Resource private SysUserMapper userMapper; @Resource SysNoticeMapper sysNoticeMapper; @Resource private WebSocketServer webSocket; @Resource private SysNoticeSendMapper sysNoticeSendMapper; @Override public void sendSysNotice(MessageDTO message) { this.sendSysNotice(message.getFromUser(), message.getToUser(), message.getTitle(), message.getContent(), message.getCategory()); } /** * 发消息 * @param fromUser * @param toUser * @param title * @param msgContent * @param setMsgCategory */ @Override @Transactional(rollbackFor = Exception.class) public void sendSysNotice(String fromUser, String toUser, String title, String msgContent, String setMsgCategory) { SysNotice notice = new SysNotice(); notice.setNoticeTitle(title); notice.setNoticeContent(msgContent); notice.setNoticeType(setMsgCategory); notice.setSender(Long.valueOf(fromUser)); notice.setPriority(Constants.PRIORITY_M); notice.setMsgType(Constants.MSG_TYPE_UESR); notice.setSendStatus(Constants.HAS_SEND); notice.setSendTime(new Date()); notice.setMsgType(Constants.MSG_TYPE_UESR); notice.setStatus("0"); sysNoticeMapper.insert(notice); // 2.插入用户通告阅读标记表记录 String userId = toUser; String[] userIds = userId.split(","); Long noticeId = notice.getNoticeId(); for(int i=0;i<userIds.length;i++) { if(ObjectUtil.isNotEmpty(userIds[i])) { SysUser sysUser = userMapper.selectUserById(Long.valueOf(userIds[i])); if(sysUser==null) { continue; } SysNoticeSend noticeSend = new SysNoticeSend(); noticeSend.setNoticeId(noticeId); noticeSend.setUserId(sysUser.getUserId()); noticeSend.setReadFlag(Constants.NO_READ_FLAG); sysNoticeSendMapper.insert(noticeSend); JSONObject obj = new JSONObject(); obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_USER); obj.put(WebsocketConst.MSG_USER_ID, sysUser.getUserName()); obj.put(WebsocketConst.MSG_ID, notice.getNoticeId()); obj.put(WebsocketConst.MSG_TXT, notice.getNoticeTitle()); webSocket.sendMessage(sysUser.getUserName(), obj.toJSONString()); } } } @Override public String getBaseUrl() { return msgBaseUrl; } @Override public LoginUser getLoginUser() { LoginUser user = LoginHelper.getLoginUser(); return user; } }