基于若依ruoyi-nbcio增加flowable流程待办消息的提醒,并提供右上角的红字数字提醒(八)

news2024/12/28 21:21:13

更多ruoyi-nbcio功能请看演示系统

gitee源代码地址

前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio

演示地址:RuoYi-Nbcio后台管理系统

这个部分是这个单元最后内容了,就是点击消息更多的一些代码与逻辑。

1、需要在我的个人中心里增加一个菜单我的消息

2、同时角色里进行授权给相应用户

3、增加后端代码

   首先因为需要联合多表查询,所以需要进行一个新的数据结构如下:

/**
 *   NoticeSendModel 用户通告阅读标记表
 *
 *  @author nbacheng
 *  @date 2023-09-20
 */
@Data
public class NoticeSendModel {

	/**id*/
	private java.lang.Long sendId;
	/**通告id*/
	private java.lang.Long noticeId;
	/**用户id*/
	private java.lang.Long userId;
	/**标题*/
	private java.lang.String noticeTitle;
	/**内容*/
	private java.lang.String noticeContent;
	/**发布人*/
	private java.lang.String sender;
	/**优先级(L低,M中,H高)*/
	private java.lang.String priority;
	/**阅读状态*/
	private java.lang.String readFlag;
	/**发布时间*/
	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
	private java.util.Date sendTime;
	/**页数*/
	private java.lang.Integer pageNo;
	/**大小*/
	private java.lang.Integer pageSize;
    /**
     * 消息类型1:通知公告2:系统消息3:待办
     */
    private java.lang.String noticeType;
}

同时mapper.xml文件需要增加下面sql联合查询

    
    <resultMap id="NoticeSendModel" type="com.ruoyi.system.model.NoticeSendModel" >
		<result column="send_id" property="sendId" jdbcType="BIGINT"/>
		<result column="notice_id" property="noticeId" jdbcType="BIGINT"/>
		<result column="user_id" property="userId" jdbcType="BIGINT"/>
		<result column="notice_title" property="noticeTitle" jdbcType="VARCHAR"/>
		<result column="notice_content" property="noticeContent" jdbcType="VARCHAR"/>
		<result column="sender" property="sender" jdbcType="VARCHAR"/>
		<result column="priority" property="priority" jdbcType="VARCHAR"/>
		<result column="notice_type" property="noticeType" jdbcType="VARCHAR"/>
		<result column="send_time" property="sendTime" jdbcType="TIMESTAMP"/>
	</resultMap>
    
    <select id="getMyNoticeSendList" parameterType="Object"  resultMap="NoticeSendModel">
	   select
	   		sns.send_id,
	   		sns.notice_id,
	   		sns.user_id,
	   		sns.read_flag,
	   		sa.notice_title as notice_title,
	   		sa.notice_content as notice_content,
	   		sa.sender as sender,
	   		sa.priority as priority,
	   		sa.notice_type as notice_type,
	   		sa.send_time as send_time
	   from sys_notice_send sns
	   left join sys_notice sa ON sns.notice_id = sa.notice_id
	   where sa.send_status = '1'
	   and sa.status = '0'
	   and sns.user_id = #{noticeSendModel.userId}
	   <if test="noticeSendModel.noticeTitle !=null and noticeSendModel.noticeTitle != ''">
	   		and sa.notice_title LIKE concat(concat('%',#{noticeSendModel.noticeTitle}),'%')
	   </if>
	   <if test="noticeSendModel.sender !=null and noticeSendModel.sender != ''">
	   		and sa.sender LIKE concat(concat('%',#{noticeSendModel.sender}),'%')
	   </if>
	   <if test="noticeSendModel.readFlag !=null and noticeSendModel.readFlag != ''">
	   		and sns.read_flag = #{noticeSendModel.readFlag}
	   </if>
        <if test="noticeSendModel.noticeType !=null and noticeSendModel.noticeType != ''">
            and sa.notice_type = #{noticeSendModel.noticeType}
        </if>
	   order by sns.read_flag,sa.send_time desc
	</select>

 control接口层增加下面代码

/**
	 * 获取我的消息
	 * @return
	 */
    @SaCheckPermission("system:noticeSend:list")
    @PostMapping(value = "/getMyNoticeSend")
    public  R<Page<NoticeSendModel>> getMyNoticeSend(@RequestBody JSONObject json) {	
    	LoginUser loginUser = commonService.getLoginUser();
		Long userId = loginUser.getUserId();
		Integer pageNum = json.getInteger("pageNum");
		Integer pageSize = json.getInteger("pageSize");	
		NoticeSendModel noticeSendModel = new NoticeSendModel();
		noticeSendModel.setUserId(userId);
		noticeSendModel.setPageNo((pageNum-1)*pageSize);
		noticeSendModel.setPageSize(pageSize);
		Page<NoticeSendModel> pageList = new Page<NoticeSendModel>(pageNum,pageSize);
		pageList = iSysNoticeSendService.getMyNoticeSendPage(pageList, noticeSendModel);
		return R.ok(pageList);
    }

对应的实现就是调用mapper里sql

@Override
	public Page<NoticeSendModel> getMyNoticeSendPage(Page<NoticeSendModel> pageList, NoticeSendModel noticeSendModel) {
		return pageList.setRecords(baseMapper.getMyNoticeSendList(pageList, noticeSendModel));
	}

因为上面noticeSendModel是个sql参数,所以需要注意mapper接口层的写法如下,需要增加一个@Param("noticeSendModel")这样的参数:

/**
 * 用户公告阅读标记Mapper接口
 *
 * @author nbacheng
 * @date 2023-09-21
 */
public interface SysNoticeSendMapper extends BaseMapperPlus<SysNoticeSendMapper, SysNoticeSend, SysNoticeSendVo> {

	List<NoticeSendModel> getMyNoticeSendList(Page<NoticeSendModel> pageList, @Param("noticeSendModel")NoticeSendModel noticeSendModel);

}

4、前端增加

我的消息页面

<template>
  <div class="app-container">
    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
      <el-form-item label="公告标题" prop="noticeTitle">
        <el-input
          v-model="queryParams.noticeTitle"
          placeholder="请输入公告标题"
          clearable
          @keyup.enter.native="handleQuery"
        />
      </el-form-item>
      <el-form-item label="操作人员" prop="createBy">
        <el-input
          v-model="queryParams.createBy"
          placeholder="请输入操作人员"
          clearable
          @keyup.enter.native="handleQuery"
        />
      </el-form-item>
      <el-form-item label="类型" prop="noticeType">
        <el-select v-model="queryParams.noticeType" placeholder="公告类型" clearable>
          <el-option
            v-for="dict in dict.type.sys_notice_type"
            :key="dict.value"
            :label="dict.label"
            :value="dict.value"
          />
        </el-select>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
      </el-form-item>
    </el-form>

    <el-row :gutter="10" class="mb8">
      <el-col :span="1.5">
        <el-button
          type="success"
          plain
          icon="el-icon-edit"
          size="mini"
          :disabled="single"
          @click=""
          v-hasPermi="['system:noticeSend:list']"
        >全部标注已读</el-button>
      </el-col>
      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
    </el-row>

    <el-table v-loading="loading" :data="noticeList" @selection-change="handleSelectionChange">
      <el-table-column type="selection" width="55" align="center" />
      <el-table-column label="序号" align="center" prop="noticeId" width="100" />
      <el-table-column
        label="消息标题"
        align="center"
        prop="noticeTitle"
        :show-overflow-tooltip="true"
      />
      <el-table-column label="消息类型" align="center" prop="noticeType" width="100">
        <template slot-scope="scope">
          <dict-tag :options="dict.type.sys_notice_type" :value="scope.row.noticeType"/>
        </template>
      </el-table-column>
      <el-table-column label="发布人" align="center" prop="sender" width="100" />
      <el-table-column label="发布时间" align="center" prop="sendTime" width="100" />
      <el-table-column label="优先级" align="center" prop="priority" width="100">
        <template slot-scope="scope">
          <dict-tag :options="dict.type.sys_priority" :value="scope.row.priority"/>
        </template>
      </el-table-column>
      <el-table-column label="阅读状态" align="center" prop="readFlag" width="100">
        <template slot-scope="scope">
          <dict-tag :options="dict.type.sys_readflag" :value="scope.row.readFlag"/>
        </template>
      </el-table-column>
      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
        <template slot-scope="scope">
          <el-button
            size="mini"
            type="text"
            icon="el-icon-view"
            @click="handleSee(scope.row)"
            v-hasPermi="['system:noticeSend:list']"
          >查看</el-button>

        </template>
      </el-table-column>
    </el-table>

    <pagination
      v-show="total>0"
      :total="total"
      :page.sync="queryParams.pageNum"
      :limit.sync="queryParams.pageSize"
      @pagination="getList"
    />

    <!-- 添加或修改公告对话框 -->
    <el-dialog :title="title" :visible.sync="open" width="780px" append-to-body>
      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
        <el-row>
          <el-col :span="12">
            <el-form-item label="公告标题" prop="noticeTitle">
              <el-input v-model="form.noticeTitle" placeholder="请输入公告标题" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="公告类型" prop="noticeType">
              <el-select v-model="form.noticeType" placeholder="请选择公告类型">
                <el-option
                  v-for="dict in dict.type.sys_notice_type"
                  :key="dict.value"
                  :label="dict.label"
                  :value="dict.value"
                ></el-option>
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="状态">
              <el-radio-group v-model="form.status">
                <el-radio
                  v-for="dict in dict.type.sys_notice_status"
                  :key="dict.value"
                  :label="dict.value"
                >{{dict.label}}</el-radio>
              </el-radio-group>
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="内容">
              <editor v-model="form.noticeContent" :min-height="192"/>
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="">确 定</el-button>
        <el-button @click="cancel">取 消</el-button>
      </div>
    </el-dialog>
  </div>
</template>

<script>
import { listNotice, getMyNoticeSend, getNotice, updateNotice } from "@/api/system/notice";

export default {
  name: "MyNotice",
  dicts: ['sys_readflag', 'sys_notice_type','sys_priority'],
  data() {
    return {
      // 遮罩层
      loading: true,
      // 选中数组
      ids: [],
      // 非单个禁用
      single: true,
      // 非多个禁用
      multiple: true,
      // 显示搜索条件
      showSearch: true,
      // 总条数
      total: 0,
      // 公告表格数据
      noticeList: [],
      // 弹出层标题
      title: "",
      // 是否显示弹出层
      open: false,
      // 查询参数
      queryParams: {
        noticeSendModel: {},
        pageNum: 1,
        pageSize: 10
      },

      // 表单参数
      form: {},
      // 表单校验
      rules: {
        noticeTitle: [
          { required: true, message: "公告标题不能为空", trigger: "blur" }
        ],
        noticeType: [
          { required: true, message: "公告类型不能为空", trigger: "change" }
        ]
      }
    };
  },
  created() {
    this.getList();
  },
  methods: {
    /** 查询公告列表 */
    getList() {
      this.loading = true;
      console.log("this.queryParams",this.queryParams);
      getMyNoticeSend(this.queryParams).then(res => {
        console.log("getMyNoticeSend res", res);
        this.noticeList = res.data.records;
        this.total = res.data.total;
        this.loading = false;
      });
    },
    // 取消按钮
    cancel() {
      this.open = false;
      this.reset();
    },
    // 表单重置
    reset() {
      this.form = {
        noticeId: undefined,
        noticeTitle: undefined,
        noticeType: undefined,
        noticeContent: undefined,
        status: "0"
      };
      this.resetForm("form");
    },
    handleSee(row) {

    },
    /** 搜索按钮操作 */
    handleQuery() {
      this.queryParams.pageNum = 1;
      this.getList();
    },
    /** 重置按钮操作 */
    resetQuery() {
      this.resetForm("queryForm");
      this.handleQuery();
    },
    // 多选框选中数据
    handleSelectionChange(selection) {
      this.ids = selection.map(item => item.noticeId)
      this.single = selection.length!=1
      this.multiple = !selection.length
    }
  }
};
</script>

点击更多的跳转工作如下:

toMyNotice() {
        this.$router.push({
          path: '/personal/mynotice'
        });
      },


5、效果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1036096.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Plant Simulation 与Web交互 V3.0工具

Plant Simulation WebTool V3.0工具&#xff0c;仅需简单设置&#xff0c;web与Plant Simulation可以双向通信&#xff0c;Web端可以缩放、旋转、平移操作 WebTool 工具

软件测试笔试

作者&#xff1a;爱塔居 专栏&#xff1a;软件测试 文章简介&#xff1a;记录了我在笔试、面试过程中遇见的一些小问题 1.软件的生命周期&#xff1a;需求分析、计划、设计、编码、测试、运行维护 2.软件测试的生命周期&#xff1a;需求分析、测试计划、测试设计/开发、测试执…

Vue.js 2—插槽 Slots

我们已经了解到组件能够接收任意类型的 JavaScript 值作为 props &#xff0c;但组件要如何接收模板内容呢? 在某些场景中&#xff0c;我们可能想要为子组件传递一些模板片段&#xff0c;让子组件在它们的组件中渲染这些片段。 此处&#xff0c;传递的是标签结构而不再是数据…

libpcap之PF_PACKET协议族

一、kernel中PF_PACKET协议族注册 af_packet.c module_init(packet_init);static int __init packet_init(void) {int rc proto_register(&packet_proto, 0);if (rc ! 0)goto out;sock_register(&packet_family_ops);register_pernet_subsys(&packet_net_ops);r…

威胁追踪如何增强您的网络安全态势

网络威胁的复杂性、频率和影响正在加剧。2022 年&#xff0c;勒索软件攻击达到2.361 亿次&#xff0c;其中 39% 的英国企业遭受网络攻击。 这些攻击需要工具和资源来识别和纠正漏洞&#xff0c;以在云环境中维护强大的安全框架&#xff0c;从而降低数据泄露和合规违规的风险。…

SpringCloud Alibaba - Sentinel篇

一、Sentinel快速入门 Sentinel官网地址&#xff1a;https://sentinelguard.io/zh-cn/index.html Sentinel项目地址&#xff1a;https://github.com/alibaba/Sentinel Sentinel是阿里巴巴开源的一款微服务流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量限流、熔…

计算机组成原理之初识计算机硬件,帮你拆开电脑看看里面的组成!!!

大家好&#xff0c;欢迎阅读《计算机组成原理》的系列文章&#xff0c;本系列文章主要教内容是从零学习计算机组成原理&#xff0c;内容通俗易懂&#xff0c;大家好好学习吧&#xff01;&#xff01;&#xff01; 更多的优质内容&#xff0c;请点击以下链接查看哦~~ ↓ ↓ ↓ …

Java实验案例(一)

目录 案例一&#xff1a;买飞机票 案例二&#xff1a;开发验证码 案例三&#xff1a;评委打分 案例四&#xff1a;数字加密 案例五&#xff1a;数组拷贝 案例六&#xff1a;抢红包 案例七&#xff1a;找素数的三种方法 案例八&#xff1a;打印乘法口诀表 案例九&#x…

若依微服务如何处理Long类型精度丢失问题?

当字段实体类为Long类型且值超过前端js显示的长度范围时会导致前端回显错误。 目录 1、ruoyi-common-security模块添加JacksonConfig配置全局序列化 2、增加指定配置类信息

20230924清远博物馆和图书馆

为了漂流来清远&#xff0c;但是一个城市&#xff0c;想快速了解她的年龄&#xff0c;不就得去博物馆图书馆吗&#xff0c;云想衣裳花想容&#xff0c;春风拂槛露华浓。若非群玉山头见&#xff0c;会向瑶台月下逢。 学校她也曾因历史而不断迁移。 清远她呀&#xff0c;原来已…

ortools在idea中导入失败解决方案

这里写目录标题 错误描述解决方案 <dependencies><!-- https://mvnrepository.com/artifact/com.google.ortools/ortools-java --><dependency><groupId>com.google.ortools</groupId><artifactId>ortools-java</artifactId><ver…

UWB高精度定位系统 超宽带技术

说到定位我们并不陌生&#xff0c;定位技术一直与我们的生活密不可分&#xff0c;比如最常见的车辆导航。 根据使用场景&#xff0c;定位技术分为室内定位和室外定位。 室外定位主要依靠GPS&#xff0c;北斗&#xff0c;GLONASS&#xff0c;伽利略等全球卫星定位导航系统。室内…

【linux】进程等待,进程替换

进程等待&#xff0c;进程替换 1.进程等待1.1进程等待必要性1.2进程等待的方法1.2.1wait方法1.2.2waitpid方法1.2.3通过宏得到退出码1.2.4 阻塞vs非阻塞 2.进程替换2.1进程替换的目的2.2execl替换函数2.3理解原理2.4其他替换接口2.4.1execl2.4.2execlp2.4.3execv2.4.4execvp2.4…

什么是JavaScript中的IIFE(Immediately Invoked Function Expression)?它的作用是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ JavaScript中的IIFE⭐ 示例⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们…

C++中实现一些特殊的类|设计模式

1.设计一个类 不能被拷贝 拷贝只会发生在两个场景中&#xff1a;拷贝构造以及赋值运算符重载。想要让一个类禁止拷贝&#xff0c;只需要该类不能调用拷贝构造和赋值运算符重载 c98中 将拷贝构造与赋值运算符重载只声明不定义&#xff0c;不定义是因为该函数根本不会调用&#x…

基于springboot+vue的校园外卖服务系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

静态路由与默认路由配置

实验原理&#xff1a; 路由分类 &#xff08;1&#xff09;根据目的网络的不同&#xff0c;路由可以划分为&#xff1a; 特定网络路由&#xff1a;目的网络为目的主机所在网络的IP地址&#xff0c;其子网掩码表示的前缀长度为32位&#xff08;对于IPv4地址&#xff09;&…

分布式搜索引擎01

1.初识elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容 例如: 在GitHub搜索代码 在电商网站搜索商品 在百度搜索答案 在打车软件搜索附近的车 1.1.2.ELK…

程序员的快乐如此简单

最近在GitHub上发起了一个关于Beego框架的小插件的开源仓库&#xff0c;这一举动虽然看似微小&#xff0c;但其中的快乐和意义却是无法用言语表达的。 Beego是一个开源的Go语言Web框架&#xff0c;它采用了MVC架构模式&#xff0c;并集成了很多常用的功能和中间件。小插件是指…

Linux chmod命令——修改权限信息

我们可以使用chmod命令&#xff0c;修改文件、文件夹的权限信息。注意&#xff0c;只有文件、文件夹的所属用户或root用户可以修改。 chmod [-R] 权限 文件或文件夹 -R&#xff0c;对文件夹内的全部内容应用同样的操作 例如&#xff1a; chmod urwx,grx,ox hello.txt &…