OA会议管理系统之会议通知(送审成功可查看人员是否参与会议)

一、前言

1.导读

 在上一次的博文中我们实现了会议审批,会议通过审批后,状态就会由原来的待审核变为待开,这时候我们就可以在我的会议下的反馈详情查看人员是否参与会议的反馈情况。这篇博客就是来了解,人员是怎么接收会议通知并反馈和我的会议模块会议怎么查看反馈情况的功能讲解!!

二、会议通知功能实现

1.功能介绍及分析

我的通知模块

         数据初始化:显示会议通知的数据,首先拿到全部的数据判断是不是待开会议和当前登陆的人的id是否在会议的参与者、列席者、主持人中存在,如果存在就显示该条数据。

        是否参会按钮:点击此按钮弹出反馈页面,其中有人员身份(拿到当前登录的rid身份进行判断如果为1,2,4那就是参会人员具有投票权,如果是3,5就是列席人员没有投票权利)、是否参会(可选择参加或是不参加)、不参会的原因(如果不参与就要必须填写)

我的会议模块

        反馈详情按钮:点击按钮将我的会议jsp页面的html代码从隐藏变为显示并且发送ajax到后端查询该条会议的反馈情况并将查询到的人进行遍历拼接到我们的html代码中。

2.功能实现

2.1.dao层编写

MeetingFeedBackDao

package com.xw.dao;

import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import com.xw.entity.MeetingFeedBack;
import com.zking.util.BaseDao;
import com.zking.util.PageBean;
import com.zking.util.StringUtils;

/**
 * MeetingFeedBack会议反馈数据访问层的接口实现
 * 
 * @author 索隆
 *
 */
public class MeetingFeedBackDaoImpl extends BaseDao<MeetingFeedBack> implements IMeetingFeedBackDao {

	@Override
	public List<Map<String, Object>> list(MeetingFeedBack back, PageBean pageBean) throws Exception {
		String title="";
		if(StringUtils.isNotBlank(back.getTitle())) {
			title=back.getTitle();
		}
		String sql = " SELECT\r\n" + " t1.*,IFNULL(f.result,-1) result\r\n" + " FROM\r\n"
				+ " (SELECT * FROM t_oa_meeting_info where FIND_IN_SET(" + back.getPersonId()
				+ ",CONCAT(canyuze,',',liexize,',',zhuchiren))  and state=4 and title LIKE '%" + title + "%') t1\r\n"
				+ " LEFT JOIN t_oa_meeting_feedback f on t1.id=f.meetingId AND f.personId=" + back.getPersonId() +" "
				+ "  ORDER BY id DESC,result ";
		return super.executeQuery(sql, pageBean);
	}

	@Override
	public List<Map<String, Object>> queryMeetingBackByMeetingId(MeetingFeedBack back) throws Exception {
		String sql = "  select\r\n" + "t.result,GROUP_CONCAT(t.name) NAMES\r\n" + "from\r\n" + "(	select\r\n"
				+ "	 t1.name,IFNULL(f.result,-1) result\r\n" + "	FROM\r\n"
				+ "	 (SELECT * FROM t_oa_user where FIND_IN_SET(id,(select CONCAT(canyuze,',',liexize,',',zhuchiren) from t_oa_meeting_info where id="+back.getMeetingId()+"  and FIND_IN_SET(state,('4,5,6'))))) t1\r\n"
				+ "	 LEFT JOIN t_oa_meeting_feedback f on t1.id=f.personId and f.meetingId ="+back.getMeetingId()+") t\r\n"
				+ " GROUP BY t.result";
		return super.executeQuery(sql, null);
	}

	@Override
	public int add(MeetingFeedBack back) throws Exception {
		String sql="insert into t_oa_meeting_feedback VALUES(?,?,?,?,?,?)";
		back.setId(UUID.randomUUID().toString().replaceAll("-", ""));
		return super.executeUpdate(sql, back, new String[] {"id","meetingId","personType","personId","result","reason"});
	}

}

2.2.jsp页面编写

meetingNotify.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="/common/static.jsp"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="static/js/meeting/meetingNotify.js"></script>
<title>会议通知</title>
</head>
<style>
body{
	margin:15px;
}
 .layui-table-cell {height: inherit;}
 .layui-layer-page .layui-layer-content {  overflow: visible !important;}
</style>
<body>
<!-- 搜索栏 -->
<div class="layui-form-item" style="margin:15px 0px;">
  <div class="layui-inline">
    <label class="layui-form-label">会议标题</label>
    <div class="layui-input-inline">
      <input type="hidden" id="personId" value="${user.id }"/>
      <input type="text" id="title" autocomplete="off" class="layui-input">
    </div>
  </div>
  <div class="layui-inline">
    <button id="btn_search" type="button" class="layui-btn"><i class="layui-icon layui-icon-search"></i> 查询</button>
  </div>
</div>
<!-- 数据表格 -->
<table id="tb" lay-filter="tb" class="layui-table" style="margin-top:-15px"></table>

<script type="text/html" id="tbar">
  {{# if(d.result==-1){ }}
  <a class="layui-btn layui-btn-xs" lay-event="edits">是否参会</a>
  {{# } }}
</script>
</body>
</html>









meetingNotify.js

//--------------------------------------------------会议通知------------------------------------------------------
let layer,table,$,form,test;
var row;
layui.use(['layer','table','jquery','form','test'],function(){
	layer=layui.layer,
	table=layui.table,
	form=layui.form,
	test=layui.test,
	$=layui.jquery;
	
	initTable();
	
	//查询事件
	$('#btn_search').click(function(){
		query();
	});
	
});

//初始化数据表格(我的审批)
function initTable(){
	table.render({          //执行渲染
        elem: '#tb',   //指定原始表格元素选择器(推荐id选择器)
        url : 'MeetingFeedBack.action',
		title : '会议通知',
		where : { //设定异步数据接口的额外参数,任意设
			'methodName':'queryMeetingFeedBackByUserId',
        	'title':$('#title').val(),
		},
        height: 400,         //自定义高度
        loading: false,      //是否显示加载条(默认 true)
        cols: [[             //设置表头
            {field: 'id', title: '会议编号', width: 90},
            {field: 'title', title: '会议标题', width: 120},
            {field: 'location', title: '会议地点', width: 140},
            {field: 'startTime', title: '开始时间', width: 120,
            	templet:function(d){
            		return test.toDate(new Date(d.startTime));
            	}
            },
            {field: 'endTime', title: '结束时间', width: 120,
            	templet:function(d){
            		return test.toDate(new Date(d.endTime));
            	}
            },
         
            {field: 'result', title: '反馈状态', width: 120,
            	templet: function(d){
                    if(d.result==1)
                    	return "参会";
                    else if(d.result==2)
                    	return "缺席";
                    else
                    	return "未读";
                }
            },
            {field: '', title: '操作', width: 200,toolbar:'#tbar'},
        ]],
		page : true
   });
	
	//工具条事件
	table.on('tool(tb)', function(obj){ //注:tool 是工具条事件名,test 是 table 原始容器的属性 lay-filter="对应的值"
		  row = obj.data; //获得当前行数据
		  var layEvent = obj.event; //获得 lay-event 对应的值(也可以是表头的 event 参数对应的值)
		  var tr = obj.tr; //获得当前行 tr 的 DOM 对象(如果有的话)
		//console.log("反馈"+row);
		//console.log("反馈"+layEvent);
		  if(layEvent === 'edits'){ //审批
			  openLayer(row.id)
		  } 
		});
}

//点击查询
function query(){
	table.reload('tb', {
        url:'MeetingFeedBack.action',     //请求地址
        method: 'POST',                    //请求方式,GET或者POST
        loading: true,                     //是否显示加载条(默认 true)
        page: true,                        //是否分页
        where: {                           //设定异步数据接口的额外参数,任意设
        	'methodName':'queryMeetingFeedBackByUserId',
        	'title':$('#title').val(),
        },  
        request: {                         //自定义分页请求参数名
            pageName: 'page', //页码的参数名称,默认:page
            limitName: 'rows' //每页数据量的参数名,默认:limit
        },
        done: function (res, curr, count) {
        	console.log(res);
        }
   });
	
}


function openLayer(id){
    layer.open({
        type: 2,                    //layer提供了5种层类型。可传入的值有:0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层)
        title: '会议反馈',                   //对话框标题
        area: ['660px', '400px'],   //宽高
        skin: 'layui-layer-rim',    //样式类名
        content: '../../Layui/jsp/meeting/addFeedBack.jsp?id='+id,                //弹出内容。可以传入普通的html内容,还可以指定DOM,更可以随着type的不同而不同
        btn:['会议反馈','关闭'],
        yes:function(index,layero){
        	//layer.msg('保存');
        	//调用子页面中提供的getData方法,快速获取子页面的form表单数据
            let data= $(layero).find("iframe")[0].contentWindow.getData();
            addMeetingFeedBack(data);
        },
        btn2:function(){
        	layer.closeAll();
        }
    });
}

// 对会议通知进行 参会/不参会的反馈
function addMeetingFeedBack(params){
	params['methodName']="add";
	console.log(params);
	$.post('MeetingFeedBack.action',params,function(rs){
		if(rs.success){
			layer.closeAll();
			query();
		}else{
			layer.msg(rs.msg,{icon:5},function(){});
		}
	},'json');
}

addFeedBack.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ include file="/common/static.jsp"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="static/js/meeting/addFeedBack.js"></script>

<title>反馈页面</title>
</head>
<style>
body {
	margin: 5px;
}
</style>
<body>
	<div style="padding: 10px;">
		<form class="layui-form layui-form-pane" lay-filter="back">
			<!-- <div class="layui-form-item">
		    <button type="submit" class="layui-btn" lay-submit="" lay-filter="meeting">立即提交</button>
		    <button id="reset" type="reset" class="layui-btn layui-btn-primary">重置</button>
  		</div> -->
			<input type="hidden" name="meetingId" value="${param.id }" /> <input
				type="hidden" name="personId" value="${sessionScope.user.id }" />
			<div class="layui-form-item">
				<label class="layui-form-label">人员类型</label>
				<div class="layui-input-block">
					<select id="personType" name="personType">
						<c:if test="${user.rid == 1 || user.rid == 2 || user.rid == 4}">
							<option value="1" selected>参会人员</option>
						</c:if>
						<c:if test="${user.rid == 3 || user.rid == 5}">
							<option value="2" selected>列席人员</option>
						</c:if>
					</select>
				</div>
			</div>
			<div class="layui-form-item">
				<label class="layui-form-label">反馈结果</label>
				<div class="layui-input-block">
					<select id="result" name="result">
						<option value="">请选择反馈结果</option>
						<option value="1">参加</option>
						<option value="2">不参加</option>
					</select>
				</div>
			</div>
			<div class="layui-form-item layui-form-text" id="textareadiv">
				<label class="layui-form-label">如果不参与会议的请填写原因(参会无需填写)</label>
				<div class="layui-input-block">
					<textarea placeholder="请输入内容" name="reason" class="layui-textarea"></textarea>
				</div>
			</div>
		</form>
	</div>
	
</body>
</html>

addFeedBack.js

//---------会议通知反馈-------------------
let form, $, resultSelect, reasonInput;
layui.use(['form', 'jquery'], function() {
    form = layui.form;
    $ = layui.jquery;
    
   
});


function getData() {
	return form.val('back');
}

2.3.Web层编写

MeetingFeedBackAction

package com.xw.web;

import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.xw.biz.IMeetingFeedBackBiz;
import com.xw.biz.MeetingFeedBackBizImpl;
import com.xw.entity.MeetingFeedBack;
import com.xw.entity.User;
import com.zking.framework.ActionSupport;
import com.zking.framework.ModelDriver;
import com.zking.util.PageBean;
import com.zking.util.R;
import com.zking.util.ResponseUtil;
import com.zking.util.StringUtils;

/**会议反馈
 * @author 索隆
 *
 */
public class MeetingFeedBackAction extends ActionSupport implements ModelDriver<MeetingFeedBack>{
	private MeetingFeedBack meetingFeedBack=new MeetingFeedBack();
	private IMeetingFeedBackBiz imbd=new MeetingFeedBackBizImpl();
	
	
	
	/**
	 * 初始化会议通知数据
	 * 
	 * @param req
	 * @param resp
	 * @throws Exception
	 */
	public void queryMeetingFeedBackByUserId(HttpServletRequest req, HttpServletResponse resp) throws Exception {
		// 初始化PageBean
		PageBean pageBean = new PageBean();
		pageBean.setRequest(req);

		// 获取当前登陆的用户id
		HttpSession session = req.getSession();
		User user = (User) session.getAttribute("user");
		if (user != null) {
			meetingFeedBack.setPersonId(user.getId());
		}
		
		// 初始化数据
		List<Map<String, Object>> list = imbd.list(meetingFeedBack, pageBean);
		// 利用R工具类制造出符合要求的json格式数据
		ResponseUtil.writeJson(resp, R.ok(0, "查询成功", pageBean.getTotal(), list));
	}
	
	
	
	/**
	 * 新增反馈信息
	 * 
	 * @param req
	 * @param resp
	 * @throws Exception
	 */
	public void add(HttpServletRequest req, HttpServletResponse resp) throws Exception {
		
		
		// 调用新增的方法
		int n  = imbd.add(meetingFeedBack);
		// 利用R工具类制造出符合要求的json格式数据
		if (n > 0) {
			// 反馈成功
			ResponseUtil.writeJson(resp, R.ok(0, "反馈成功"));
		} else {
			// 反馈失败
			ResponseUtil.writeJson(resp, R.error(1, "反馈失败"));
		}
	}
	
	
	/**
	 * 反馈信息的数据加载
	 * 
	 * @param req
	 * @param resp
	 * @throws Exception
	 */
	public void queryMeetingBackByMeetingId(HttpServletRequest req, HttpServletResponse resp) throws Exception {
		
		// 初始化数据
		List<Map<String, Object>> list = imbd.queryMeetingBackByMeetingId(meetingFeedBack);
		// 利用R工具类制造出符合要求的json格式数据
		ResponseUtil.writeJson(resp, R.ok(0, "查询成功", list));
	}
	
	
	
	
	

	@Override
	public MeetingFeedBack getModel() {
		return meetingFeedBack;
	}

}

温馨提示:

注意配置我们的MVC哦!!

3.案例展示

 

到这里我的分享就结束了,欢迎到评论区探讨交流!!

如果觉得有用的话还请点个赞吧 ♥  ♥

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis 查询数据库之二(增、删、改、查操作)

目录 1. 配置打印 MyBatis 执行的SQL 2. 查询操作 2.1 通过用户 ID 查询用户信息、查询所有用户信息 (1) Mapper 接口 (2)UserMapper.xml 查询所有用户的具体实现 SQL (3)进行单元测试 3. 增加操作 3.1 在 mapper&#xff08;interface&#xff09;里面添加增加方法的声…

unity如何手动更改脚本执行顺序

在Unity中&#xff0c;脚本的执行顺序是由脚本的执行顺序属性决定的。默认情况下&#xff0c;Unity根据脚本在项目中的加载顺序来确定它们的执行顺序。然而&#xff0c;你可以手动更改脚本的执行顺序&#xff0c;以下是一种方法&#xff1a; 在Unity编辑器中&#xff0c;选择你…

剑指Offer05.替换空格

剑指Offer05.替换空格 目录 剑指Offer05.替换空格题目描述解法一&#xff1a;遍历添加解法二&#xff1a;原地修改 题目描述 请实现一个函数&#xff0c;把字符串s中的每个空格都替换成“%20”。 解法一&#xff1a;遍历添加 由于每次替换都要把一个空格字符变成三个字符&a…

【LeetCode】516. 最长回文子序列

文章目录 1. 思路讲解1.1 创建dp表1.2 状态转移方程1.3 不需考虑边界问题 2. 整体代码 1. 思路讲解 1.1 创建dp表 此题采用动态规划的方法&#xff0c;创建一个二维dp表&#xff0c;dp[i][j]表示s[i, j]中最大回文子序列的长度。且我们人为规定 i 是一定小于等于 j 的。 1.2…

OpenAI 已为 GPT-5 申请商标,GPT-4 发布不到半年,GPT-5 就要来了吗?

据美国专利商标局&#xff08;USPTO&#xff09;信息显示&#xff0c;OpenAI已经在7月18日申请注册了“GPT-5”商标。 在这份新商标申请中&#xff0c;OpenAI将“GPT-5”描述为一种“用于使用语言模型的可下载计算机软件”。 继GPT-4发布之后&#xff0c;它预计将成为OpenAI下一…

vue响应数据为二维码如何渲染到页面

在postman测试请求后发现响应数据为一个二维码图片,不是链接,如何解决? 然后如果在vue中使用请求还会报Uncaught (in promise) SyntaxError: Unexpected token o in JSON at position 1的错误。这个就是使用了JSON.parse导致的响应格式不对)&#xff0c;使用JSON.stringify解决…

骑砍二 ATC MOD 使用教程与应用案例解析

骑砍二 ATC MOD 使用教程与应用案例解析 作者&#xff1a;blibli-财不外漏 / NEXUSMODS-PuepleKarmen 案例MOD依赖&#xff1a;ATC - Adonnay’s Troop Changer & AEW - Adonnay’s Exotic Weaponry & New Armor 文本编辑工具&#xff1a;VS Code&#xff08;推荐使用&…

Typescript - 索引签名

目录 1&#xff0c;什么是索引签名1&#xff0c;js 中使用对象的属性2&#xff0c;ts 中的索引签名3&#xff0c;扩展索引签名定义的类型 2&#xff0c;与 Record 对比3&#xff0c;遇到的问题1&#xff0c;索引 key 的类型问题&#xff0c;keyof2&#xff0c;索引 key 的类型问…

Zebec APP:构建全面、广泛的流支付应用体系

目前&#xff0c;流支付协议 Zebec Protocol 基本明确了生态的整体轮廓&#xff0c;它包括由其社区推动的模块化 Layer3 构架的公链 Nautilus Chain、流支付应用 Zebec APP 以及 流支付薪酬工具 Zebec payroll 。其中&#xff0c;Zebec APP 是原有 Zebec Protocol 的主要部分&a…

无向图-已知根节点求高度

深搜板子题&#xff0c;无向图&#xff0c;加边加两个&#xff0c;dfs输入两个参数变量&#xff0c;一个是当前深搜节点&#xff0c;另一个是父节点&#xff08;避免重复搜索父节点&#xff09;&#xff0c;恢复现场 ///首先完成数组模拟邻接表#include<iostream> #incl…

re学习(27)攻防世界toddler_regs(字符串函数总结+交叉引用)

找不到main&#xff08;&#xff09;函数&#xff0c;查找字符串&#xff0c;发现特殊字符串 定位字符串出现的位置&#xff0c;反汇编出代码&#xff0c;进行分析“ flag{Xp0int_1s_n1c3_but_Xp0intJNU_is_we1rd} 总结 一.CP&#xff1a;shiftF12 展示所有的字符串; ctrlx查…

python高阶技巧

目录 设计模式 单例模式 具体用法 工厂模式 优点 闭包 案例 修改闭包外部变量 闭包优缺点 装饰器 装饰器原理 装饰器写法 递归 递归的调用过程 递归的优缺点 用递归计算阶乘 设计模式 含义&#xff1a;设计模式是一种编程套路&#xff0c;通过这种编程套路可…

Linux-centos花生壳实现内网穿透

Linux-centos花生壳实现内网穿透 官网教程 1.安装花生壳 下载网址 点击复制就可以复制下载命令了 wget "https://dl.oray.com/hsk/linux/phddns_5.2.0_amd64.rpm" -O phddns_5.2.0_amd64.rpm# 下载完成之后会多一个rpm文件 [rootlocalhost HuaSheng]# ls phddns_…

Java8 list多属性去重

大家好&#xff0c;我是三叔&#xff0c;很高兴这期又和大家见面了&#xff0c;一个奋斗在互联网的打工人。 在 Java 开发中&#xff0c;我们经常会面临对 List 中的对象属性去重的需求。然而&#xff0c;当需要根据多个属性来进行去重时&#xff0c;情况会稍微复杂一些。本篇…

nodejs+vue鲜花商城销售系统 uniapp网上花店 多商家 微信小程序67m8n

在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括鲜花销售微信小程序的网络应用&#xff0c;在外国各式各样的小程序已经是很普遍的方式&#xff0c;不过国内可能还处于起步阶段。鲜花销售微信小程序具有鲜花销售信息管理功能…

利用awk筛选给定时间范围内的日志

文章目录 筛选给定时间范围内的日志时间时间戳什么是时间戳&#xff1f; 系统时间 筛选日志时间示例简单示例mktime()函数是什么 进阶示例 筛选给定时间范围内的日志 时间 时间的表示方法&#xff1a; 时间戳系统时间&#xff08;年月日时间&#xff09; 时间戳 什么是时间…

Linux中安装Node

安装 先从 官方网站 下载安装包&#xff0c;有时 node 版本太新会导致失败&#xff0c;详见下方的常见问题第2点 cd /home // 创建目录&#xff0c;将下载好的 node 安装包上传到此目录 mkdir Download mkdir /usr/local/lib/node解压 // 解压&#xff0c;前面是文件当前路径…

Spring集成Junit

目录 1、简介 2、Junit存在的问题 3、回顾Junit注解 4、集成步骤 4.1、导入坐标 4.2、Runwith 4.3、ContextConfiguration 4.4、Autowired 4.5、Test 4.6、代码 5、补充说明 5.1、Runwith 5.2、BlockJUnit4ClassRunner 5.3、没有配置Runwith ⭐作者介绍&#xff1…

uniapp android底部弹框

uniapp android底部弹框&#xff0c;带有动画效果 <view class"popup_box"><view class"bottom_more" click"handleClickCancel"><image src"/static/images/rescue/icon_more.png"></image></view><…

C++笔记之从数组指针到函数数组指针(使用using name和std::function)

C笔记之从数组指针到函数数组指针(使用using name和std::function) 参考笔记&#xff1a; C之指针探究(三)&#xff1a;指针数组和数组指针 C之指针探究(十三)&#xff1a;函数指针数组 C之指针探究(二)&#xff1a;一级指针和一维数组 C之指针探究(十一)&#xff1a;函数名的…