更多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
- 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;
- }
- }