目录

一、后端

二、前端

三、运行效果


一、后端

MeetingInfoDao

// 设置会议排座图片public int updateSeatPicById(MeetingInfo info) throws Exception {String sql =" update t_oa_meeting_info set seatPic=? where id=?";return super.executeUpdate(sql, info, new String[] {"seatPic","id"});}//  根据会议ID更新会议的审批人(送审)public int updateAuditorById(MeetingInfo info) throws Exception {String sql="update t_oa_meeting_info set auditor=?,state=2 where id=?";return super.executeUpdate(sql, info, new String[] {"auditor","id"});}

MeetingInfoAction

public String updateSeatPicById(HttpServletRequest req, HttpServletResponse resp) {/** 1.接收前端页面传递到后台的图片对应的字符串* 2.借助工具类将字符串生成一个图片,保存到配置文件所配置的路径下* 3.添加服务器硬盘与请求地址的映射,即可访问* 4.将请求地址保存到数据库中*/try {
//          E:/temp/images/T280/abcdefg.png
//          获取图片的存放地址   dirPath=E:/temp/images/T280/String dirPath = PropertiesUtil.getValue("dirPath");
//          获取浏览器请求路径,为了后续保存到数据库    serverPath=/upload/paizuo/String serverPath = PropertiesUtil.getValue("serverPath");
//          随机生成一个图片名称String fileName = UUID.randomUUID().toString().replaceAll("-", "")+".png";info.getSeatPic();//图片字符串Base64ImageUtils.GenerateImage(info.getSeatPic().replaceAll("data:image/png;base64,", ""), dirPath+fileName);
//          将seatPic中内容修改为 请求地址info.setSeatPic(serverPath+fileName);//          修改会议排座 数据库图片 对应的数据库列段int rs = meetingInfoDao.updateSeatPicById(info);if (rs > 0) {ResponseUtil.writeJson(resp, R.ok(200, "会议排座成功"));}else {ResponseUtil.writeJson(resp, R.error(0, "会议排座失败"));}} catch (Exception e) {e.printStackTrace();try {ResponseUtil.writeJson(resp, R.error(0, "会议排座失败"));} catch (Exception e1) {e1.printStackTrace();}}return null;}// 根据会议ID更新会议的审批人(送审)public String updateAuditorById(HttpServletRequest req, HttpServletResponse resp) {try {int rs = meetingInfoDao.updateAuditorById(info);if (rs > 0) {ResponseUtil.writeJson(resp, R.ok(200, "会议审批成功"));}else {ResponseUtil.writeJson(resp, R.error(0, "会议审批失败"));}} catch (Exception e) {e.printStackTrace();try {ResponseUtil.writeJson(resp, R.error(0, "会议审批失败"));} catch (Exception e1) {e1.printStackTrace();}}return null;}

二、前端

myMeeting.js

let layer,$,table,form;
var row;
layui.use(['jquery','layer','table','form'],function(){layer=layui.layer,$=layui.jquery,form=layui.form,table=layui.table;//初始化表格initTable();//绑定查询按钮的点击事件$('#btn_search').click(function(){query();});//初始化审批人initFormSelects();//送审$('#btn_auditor').click(function(){$.post($("#ctx").val()+'/info.action',{'methodName':'updateAuditorById','id':$('#meetingId').val(),'auditor':$('#auditor').val()},function(rs){if(rs.success){//关闭对话框layer.closeAll();//刷新列表query();}else{layer.msg(rs.msg,{icon:5},function(){});}},'json');return false;});
});//1.初始化数据表格
function initTable(){table.render({           //执行渲染elem: '#tb',         //指定原始表格元素选择器(推荐id选择器)
//        url: 'user.action?methodName=list',     //请求地址height: 340,         //自定义高度loading: false,      //是否显示加载条(默认 true)cols: [[             //设置表头{field: 'id', title: '会议编号', width: 120},{field: 'title', title: '会议标题', width: 120},{field: 'location', title: '会议地点', width: 140},{field: 'startTime', title: '开始时间', width: 120},{field: 'endTime', title: '结束时间', width: 140},{field: 'meetingstate', title: '会议状态', width: 120},{field: 'seatPic', title: '会议排座', width: 140,templet: function(d){console.log(d);//得到当前行数据,并拼接成自定义模板return '<img src="'+d.seatPic+'">'}},{field: 'auditorname', title: '审批人', width: 120},{field: '', title: '操作', width: 220,toolbar:'#tbar'},]]});//在页面中的<table>中必须配置lay-filter="tb_goods"属性才能触发属性!!!table.on('tool(tb)', function (obj) {row = obj.data;if (obj.event == "seat") {open(row.id);}else if(obj.event == "send"){
//          layer.msg("送审");
//          判断是否已经排座if(row.seatPic==null || row.seatPic==""){layer.msg('先请完成会议排座,再进行送审操作!',function(){});return false;}//在打开送审页面之前,先请完成会议ID的赋值操作$('#meetingId').val(row.id);
//             打开会议送审HTML 页面层openLayerAudit();}else if(obj.event == "del"){layer.msg("取消会议");}else if(obj.event == "back"){layer.msg("反馈详情");}else {}});
}//打开会议排座对话框
function open(id){layer.open({type: 2,                    //layer提供了5种层类型。可传入的值有:0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层)title: '会议排座',                   //对话框标题area: ['460px', '340px'],   //宽高skin: 'layui-layer-rim',    //样式类名content: $("#ctx").val()+'/jsp/meeting/seatPic.jsp?id='+id,                //弹出内容。可以传入普通的html内容,还可以指定DOM,更可以随着type的不同而不同});
}
//2.点击查询
function query(){table.reload('tb', {url: 'info.action',     //请求地址method: 'POST',                    //请求方式,GET或者POSTloading: true,                     //是否显示加载条(默认 true)page: true,                        //是否分页where: {                           //设定异步数据接口的额外参数,任意设'methodName':'myInfos','title':$('#title').val(),'zhuchiren':$("#zhuchiren").val()},  request: {                         //自定义分页请求参数名pageName: 'page', //页码的参数名称,默认:pagelimitName: 'rows' //每页数据量的参数名,默认:limit}});
}//初始化审批人
function initFormSelects(){$.getJSON($("#ctx").val()+'/user.action',{'methodName':'findAll'},function(rs){console.log(rs);let data=rs.data;$.each(data,function(i,e){$('#auditor').append(new Option(e.name,e.value));});//重新渲染form.render('select');});
}//会议送审
function openLayerAudit(){//每次打开都对送审人进行初始化默认值设置$('#auditor').val("");//必须重新渲染form.render('select');//弹出对话框layer.open({type: 1,                    //layer提供了5种层类型。可传入的值有:0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层)title:'会议送审',area: ['426px', '140px'],   //宽高skin: 'layui-layer-rim',    //样式类名content: $('#audit'),   //弹出内容。可以传入普通的html内容,还可以指定DOM,更可以随着type的不同而不同});
}

seatPic.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<base href="${pageContext.request.contextPath }/"/>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="static/js/layui/css/layui.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="static/js/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="static/js/layui/layui.js"></script>
<script type="text/javascript" src="static/js/plugins/html2canvas/html2canvas.js"></script>
<title>会议座位安排</title>
</head>
<style type="text/css">
* {padding: 0;margin: 0;
}body{width: 100%;height: 100%;/* background: red; */
}.tips {/* position: absolute; */background: pink;display: inline-block;height: 60px;/* width: 60px; */line-height: 60px;text-align: center;margin: 5px;padding: 0 10px;
}.add {position: fixed;right: 10px;top: 10px;display:inline;
}#tu {width: 100%;height: 100%;/* background: lightblue; *//*background: url('u=3318199716,2583790385&fm=26&gp=0.jpg');*/
}
.layui-input{height:30px;
}
</style>
<body id="screen_body"><div id="tu"></div><!-- 下面不要使用layui的表单行内模式,会导致canvas的toDataURL()数据为 data:, --><div class="add"><div style="display:inline-block;"><input id="dan_input" type="text" value="" class="layui-input"></div><div style="display:inline-block;"><button onclick="return addDanMu()" class="layui-btn layui-btn-sm">添加座位</button><input id="jie_input" type="button" class="layui-btn layui-btn-sm" value='下载'></div></div>
</body>
<script type="text/javascript">
var $id = function(id) {return document.getElementById(id);
}
//会议排座拖拽
var dragF = {locked: false,lastObj: undefined,drag: function(obj) {$id(obj).onmousedown = function(e) {var e = e ? e : window.event;if (!window.event) {e.preventDefault();} /* 阻止标注<a href='/site/js-5791-1.html' target='_blank'><u>浏览器</u></a>下拖动a,img的默认事件 */dragF.locked = true;$id(obj).style.position = "absolute";$id(obj).style.zIndex = "100";if (dragF.lastObj && dragF.lastObj != $id(obj)) { /* 多元素拖动需要恢复上次元素状态 */dragF.lastObj.style.zIndex = "1";}dragF.lastObj = $id(obj);var tempX = $id(obj).offsetLeft;var tempY = $id(obj).offsetTop;dragF.x = e.clientX;dragF.y = e.clientY;document.onmousemove = function(e) {var e = e ? e : window.event;if (dragF.locked == false) return false;$id(obj).style.left = tempX + e.clientX - dragF.x + "px";$id(obj).style.top = tempY + e.clientY - dragF.y + "px";if (window.event) {e.returnValue = false;} /* 阻止ie下a,img的默认事件 */}document.onmouseup = function() {dragF.locked = false;}}}
}
</script><script type="text/javascript">
var layer;
layui.use(['layer'],function(){layer=layui.layer;//初始化会议排座:根据会议ID获取参会的所有人员的名字(主持人+参会人+列席人)initMeetingUsers();//绘制会议排座图片$("#jie_input").on("click", function(event) {$('.add').hide();event.preventDefault();html2canvas(document.getElementById("screen_body")).then(function(canvas) {var dataUrl = canvas.toDataURL();console.log(dataUrl);var param = {};
//          图片对应的字符串传递到后台param['seatPic'] = dataUrl;param['id'] = '${param.id}';param['methodName']='updateSeatPicById';console.log(param);//此处需要完成会议排座图片上传操作$.post('${pageContext.request.contextPath }/info.action',param,function(rs){if(rs.success){//先得到当前iframe层的索引var index = parent.layer.getFrameIndex(window.name); //再执行关闭parent.layer.close(index); //调用父页面的刷新方法parent.query();}else{layer.msg(rs.msg,{icon:5},function(){});}},'json');});});
});function initMeetingUsers(){//http://localhost:8080/xxx/seatPic.jsp?id=12  -> ${param.id}$.getJSON('${pageContext.request.contextPath }/user.action',{'methodName':'queryUserByMeetingId','meetingId':'${param.id}'},function(rs){console.log(rs);let data=rs.data;$.each(data,function(i,e){$('#dan_input').val(e.name);addDanMu();});});
}//添加会议排座
function addDanMu() {var dan = document.getElementById("dan_input").value;if (dan == "") {alert("请输入弹幕~");return false;} else {document.getElementById("dan_input").value = ""; //清空 弹幕输入框// var br = document.createElement("BR");  // <br />var node = document.createElement("DIV"); // <div>var tipsArr = document.getElementsByClassName('tips');var i;// console.log(parseInt(tipsArr[tipsArr.length-1].id.substr(4))+1);if (tipsArr.length == 0) {i = 1} else {i = parseInt(tipsArr[tipsArr.length - 1].id.substr(4)) + 1;}// var aNode = document.createElement("P");   // <p>node.setAttribute("class", "tips");node.setAttribute("id", "tips" + i);node.setAttribute("onmouseover", "dragF.drag('tips" + i + "');");var textnode = document.createTextNode(dan); // 创建个 文本节点, 将用户输入的弹幕,存入 创建的 元素节点 <p>  中// aNode.appendChild(textnode);node.appendChild(textnode);// document.body.appendChild(br);// document.body.appendChild(node);document.getElementById("tu").appendChild(node);return true;}
}</script>
</html>

三、运行效果

会议OA项目排座功能以及送审功能相关推荐

  1. 会议oa之排座和送审

    目录 一.会议排座的背景 二.后端 三.前端 一.会议排座的背景 参会人员的每个座位都是有讲究的,是不可乱坐的.就像请客吃饭的人一样,一般请客的那个人是要做主位的,参会的人也一样,重要的人一般都是座主 ...

  2. 会议OA项目(我的会议中的会议排座送审功能)

    文章目录 一.会议排座插件介绍 1)会议项目为什么要有会议排座的功能 2)完成在页面上元素的拖动功能 2.1分析现有素材的不足 2.2修改现有素材的不足⬇⬇⬇ 2.3 content需要传递到后台,并 ...

  3. 会议OA项目(三)---我的会议(会议排座、送审)

    目录 前言 一.需求分析 二.准备工作 三.编码 1.后台编码 2.前端编码 四.效果展示 前言 上篇分享了会议OA项目的我的会议功能的查询.取消会议.本篇文章将完善我的会议功能. 我的会议功能有一个 ...

  4. 会议OA项目之会议通知会议反馈反馈详情功能

    目录 一.需要的SQL语句 1.1 会议通知查询的SQL 1.2 反馈详情的SQL 二.会议通知的前台代码 2.1 会议通知的jsp文件 2.2 要封装的js文件 三.会议通知查询的后台代码 2.1  ...

  5. 会议OA项目(项目原型图介绍发布会议功能)

    目录 一.会议OA项目介绍 为什么要开发OA会议管理 会议OA管理的作用 二.项目原型图介绍 1)会议管理 2)投票管理 3)会议室管理 三.数据库表结构 四.发布会议功能&多功能下拉框 La ...

  6. 微信小程序-会议OA项目03

    目录 1.Flex布局简介 1.1 什么是flex布局 1.2 flex属性 2.轮播图--组件的使用 3.会议OA项目-首页 1.Flex布局简介 布局的传统解决方案,基于盒状模型,依赖 displ ...

  7. 会议OA项目(六)--- (待开会议、历史会议、所有会议)

    前言 上一篇分享了会议通知以及会议反馈,根据需求来今天应该到了,历史会议.待开会议以及所有会议了. 一.需求分析 历史会议:登录人员,属于参与者列席者或者主人其中一个时,并且会议状态为已结束时,要将数 ...

  8. 会议OA项目之会议发布(一)

                                                     目录 前言: 会议发布的产品原型图: 1.会议发布 1.1实现的特色功能: 1.2思路: 使用的数据库 ...

  9. 会议OA项目(待开会议历史会议所有会议)

                                                                    文章目录 一.会议OA项目名词介绍 二.SQL编写 待开会议SQL 所有 ...

最新文章

  1. 面试必备的C++知识(未完待续)
  2. java全局变量和局部变量_Java 10 –局部变量类型推断
  3. java.util中,util是什么意思
  4. 用心整理,尽量最全,一套目标检测、卷积神经网络和OpenCV学习资料(教程/PPT/代码)...
  5. 利用awstats分析nginx日志 简单配置
  6. swfupload 无法加载_SwfUpload在IE10上不出现上传按钮的解决方法
  7. 【MISC怼题入门系列】BUU-MISC-page2
  8. 【爬虫Practice2】爬取豆瓣高分电影
  9. 跑跑卡丁车rush服务器维护,跑跑卡丁车RUSH游戏官方-跑跑卡丁车RUSH+手游官网预约v1.0.8 - 逗游网...
  10. 嵌入式Linux之正点原子Linux开发板入手
  11. css鼠标经过字体抖动,jQuery+css3实现文字跟随鼠标的上下抖动
  12. ICCV 2021 | 性能炸裂的通道剪枝算法ResRep(Keras复现)
  13. 天下难事必作于易,天下大事必作于细
  14. HTML5前端开发入门之H系列标签,P标签和Hr标签
  15. 关于商业企业创业的思考
  16. mysql exists 效率_Mysql之exists和inner join效率问题(1)
  17. 套接字I/O模型-WSAEventSelect(转载)
  18. 关于idea配置方法注释问题——完美注释
  19. 论文结论写什么,如何写?
  20. PHP实现添加到错题本,如何整理错题本?

热门文章

  1. 递归来实现一个二分查找算法函数bi_search()
  2. 【plang 1.4.6】Plang高级编程语言(发布)
  3. 201671010457 朱石景 实验四《英文文本词频统计分析》 结对项目报告
  4. Moment.js 2.22.2 源代码
  5. 王牌特工:黄金圈 经典例句
  6. 深度学习的过拟合与欠拟合问题的介绍与解决方案
  7. 微信小程序-猜拳小游戏
  8. 虚拟pc服务器 翻译,单机服务器配置文件;ServerSettings.ini【翻译】
  9. nomachine NX 远程连接相关问题
  10. android 裁剪屏幕中特定区域内的内容