• OA项目之我的会议(会议排座&送审)


    目录

    一、会议排座功能的意义

     二、实现会议排座功能

    效果图: 

    seatPic.jsp界面代码

    会议参会用户数据初始化

    点击会议排座时进入另一个页面

    配置图片下载路径

    MeetingInfoDao

    引入插件画布插件 

    运行结果

    ​编辑 看文件中是否有此图片

     三、会议送审


    一、会议排座功能的意义

     二、实现会议排座功能

    1.查询出本场会议中的所有参与人员
    2.需要完成在页面上元素的拖动功能,把对应的参会人员放在指定位置,如:重要的人就放在主位
    3.将已经画好的会议座位图,保存下来,并且绑定到本次会议数据上去;

    效果图: 

    seatPic.jsp界面代码

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    4. <html>
    5. <head>
    6. <base href="${pageContext.request.contextPath }/"/>
    7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    8. <link href="static/js/layui/css/layui.css" rel="stylesheet" type="text/css"/>
    9. <script type="text/javascript" src="static/js/jquery-3.3.1.min.js">script>
    10. <script type="text/javascript" src="static/js/layui/layui.js">script>
    11. <script type="text/javascript" src="static/js/plugins/html2canvas/html2canvas.js">script>
    12. <title>会议座位安排title>
    13. head>
    14. <style type="text/css">
    15. * {
    16. padding: 0;
    17. margin: 0;
    18. }
    19. body{
    20. width: 100%;
    21. height: 100%;
    22. /* background: red; */
    23. }
    24. .tips {
    25. /* position: absolute; */
    26. background: pink;
    27. display: inline-block;
    28. height: 60px;
    29. /* width: 60px; */
    30. line-height: 60px;
    31. text-align: center;
    32. margin: 5px;
    33. padding: 0 10px;
    34. }
    35. .add {
    36. position: fixed;
    37. right: 10px;
    38. top: 10px;
    39. display:inline;
    40. }
    41. #tu {
    42. width: 100%;
    43. height: 100%;
    44. /* background: lightblue; */
    45. /*background: url('u=3318199716,2583790385&fm=26&gp=0.jpg');*/
    46. }
    47. .layui-input{
    48. height:30px;
    49. }
    50. style>
    51. <body id="screen_body">
    52. <div id="tu">div>
    53. <div class="add">
    54. <div style="display:inline-block;">
    55. <input id="dan_input" type="text" value="" class="layui-input">
    56. div>
    57. <div style="display:inline-block;">
    58. <button onclick="return addDanMu()" class="layui-btn layui-btn-sm">添加座位button><input id="jie_input" type="button" class="layui-btn layui-btn-sm" value='下载'>
    59. div>
    60. div>
    61. body>
    62. <script type="text/javascript">
    63. var $id = function(id) {
    64. return document.getElementById(id);
    65. }
    66. //会议排座拖拽
    67. var dragF = {
    68. locked: false,
    69. lastObj: undefined,
    70. drag: function(obj) {
    71. $id(obj).onmousedown = function(e) {
    72. var e = e ? e : window.event;
    73. if (!window.event) {
    74. e.preventDefault();
    75. } /* 阻止标注浏览器下拖动a,img的默认事件 */
    76. dragF.locked = true;
    77. $id(obj).style.position = "absolute";
    78. $id(obj).style.zIndex = "100";
    79. if (dragF.lastObj && dragF.lastObj != $id(obj)) { /* 多元素拖动需要恢复上次元素状态 */
    80. dragF.lastObj.style.zIndex = "1";
    81. }
    82. dragF.lastObj = $id(obj);
    83. var tempX = $id(obj).offsetLeft;
    84. var tempY = $id(obj).offsetTop;
    85. dragF.x = e.clientX;
    86. dragF.y = e.clientY;
    87. document.onmousemove = function(e) {
    88. var e = e ? e : window.event;
    89. if (dragF.locked == false) return false;
    90. $id(obj).style.left = tempX + e.clientX - dragF.x + "px";
    91. $id(obj).style.top = tempY + e.clientY - dragF.y + "px";
    92. if (window.event) {
    93. e.returnValue = false;
    94. } /* 阻止ie下a,img的默认事件 */
    95. }
    96. document.onmouseup = function() {
    97. dragF.locked = false;
    98. }
    99. }
    100. }
    101. }
    102. script>
    103. <script type="text/javascript">
    104. var layer;
    105. layui.use(['layer'],function(){
    106. layer=layui.layer;
    107. //初始化会议排座:根据会议ID获取参会的所有人员的名字(主持人+参会人+列席人)
    108. initMeetingUsers();
    109. //绘制会议排座图片
    110. $("#jie_input").on("click", function(event) {
    111. $('.add').hide();
    112. event.preventDefault();
    113. html2canvas(document.getElementById("screen_body")).then(function(canvas) {
    114. var dataUrl = canvas.toDataURL();
    115. console.log(dataUrl);
    116. var param = {};
    117. param['seatPic'] = dataUrl;
    118. param['id'] = '${param.id}';
    119. param['methodName']='updateSeatPicById';
    120. console.log(param);
    121. //此处需要完成会议排座图片上传操作
    122. $.post('${pageContext.request.contextPath }/info.action',param,function(rs){
    123. if(rs.success){
    124. //先得到当前iframe层的索引
    125. var index = parent.layer.getFrameIndex(window.name);
    126. //再执行关闭
    127. parent.layer.close(index);
    128. //调用父页面的刷新方法
    129. parent.query();
    130. }else{
    131. layer.msg(rs.msg,{icon:5},function(){});
    132. }
    133. },'json');
    134. });
    135. });
    136. });
    137. function initMeetingUsers(){
    138. //http://localhost:8080/xxx/seatPic.jsp?id=12 -> ${param.id}
    139. $.getJSON('${pageContext.request.contextPath }/user.action',{
    140. 'methodName':'queryUserByMeetingId',
    141. 'meetingId':'${param.id}'
    142. },function(rs){
    143. console.log(rs);
    144. let data=rs.data;
    145. $.each(data,function(i,e){
    146. $('#dan_input').val(e.name);
    147. addDanMu();
    148. });
    149. });
    150. }
    151. //添加会议排座
    152. function addDanMu() {
    153. var dan = document.getElementById("dan_input").value;
    154. if (dan == "") {
    155. alert("请输入弹幕~");
    156. return false;
    157. } else {
    158. document.getElementById("dan_input").value = ""; //清空 弹幕输入框
    159. // var br = document.createElement("BR"); //
    160. var node = document.createElement("DIV"); //
    161. var tipsArr = document.getElementsByClassName('tips');
    162. var i;
    163. // console.log(parseInt(tipsArr[tipsArr.length-1].id.substr(4))+1);
    164. if (tipsArr.length == 0) {
    165. i = 1
    166. } else {
    167. i = parseInt(tipsArr[tipsArr.length - 1].id.substr(4)) + 1;
    168. }
    169. // var aNode = document.createElement("P"); //

    170. node.setAttribute("class", "tips");
    171. node.setAttribute("id", "tips" + i);
    172. node.setAttribute("onmouseover", "dragF.drag('tips" + i + "');");
    173. var textnode = document.createTextNode(dan); // 创建个 文本节点, 将用户输入的弹幕,存入 创建的 元素节点

    174. // aNode.appendChild(textnode);
    175. node.appendChild(textnode);
    176. // document.body.appendChild(br);
    177. // document.body.appendChild(node);
    178. document.getElementById("tu").appendChild(node);
    179. return true;
    180. }
    181. }
    182. script>
    183. html>

    会议参会用户数据初始化

    数据库的分析要查出 会议排座用户查询 用一条SQL语句 联两个表

    -- find in set
    -- 第一个参数:数据库字段
    -- 第二个参数:列段的条件
    select * from t_oa_user  where FIND_IN_SET (id,(select CONCAT(canyuze,',',liexize,',',zhuchiren) from t_oa_meeting_info where id=8))

    点击会议排座时进入另一个页面

    1. //打开会议排座对话框
    2. function open(id){
    3. layer.open({
    4. type: 2, //layer提供了5种层类型。可传入的值有:0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层)
    5. title: '会议排座', //对话框标题
    6. area: ['460px', '340px'], //宽高
    7. skin: 'layui-layer-rim', //样式类名
    8. content: $("#ctx").val()+'/jsp/meeting/seatPic.jsp?id='+id, //弹出内容。可以传入普通的html内容,还可以指定DOM,更可以随着type的不同而不同
    9. });
    10. }

    UserDao绑定座位人员

    1. public List list(Integer meetingId) throws Exception {
    2. String sql="select * from t_oa_user where FIND_IN_SET(id,(select concat(canyuze,',',liexize,',',zhuchiren) from "
    3. + "t_oa_meeting_info where id="+meetingId+"))";
    4. return super.executeQuery(sql, User.class, null);
    5. }

     UserAction

    1. package com.oyang.web;
    2. import java.io.IOException;
    3. import java.util.HashMap;
    4. import java.util.List;
    5. import java.util.Map;
    6. import javax.servlet.http.HttpServletRequest;
    7. import javax.servlet.http.HttpServletResponse;
    8. import com.oyang.dao.UserDao;
    9. import com.oyang.entity.User;
    10. import com.oyang.framework.ActionSupport;
    11. import com.oyang.framework.ModelDriver;
    12. import com.oyang.util.PageBean;
    13. import com.oyang.util.R;
    14. import com.oyang.util.ResponseUtil;
    15. public class UserAction extends ActionSupport implements ModelDriver{
    16. private User user=new User();
    17. private UserDao udao=new UserDao();
    18. //写一个方法处理前台的请求
    19. /*public String login(HttpServletRequest req, HttpServletResponse resp) {
    20. Map map=new HashMap();
    21. if("oyang".equals(user.getUsername())&&"123456".equals(user.getPassword())) {
    22. //登录成功
    23. map.put("code", 200);
    24. map.put("msg", "登录成功");
    25. //响应到前端
    26. }
    27. else {
    28. //登录失败
    29. map.put("code", 0);
    30. map.put("msg", "账户密码错误");
    31. }
    32. try {
    33. ResponseUtil.writeJson(resp, map);
    34. } catch (Exception e) {
    35. e.printStackTrace();
    36. }
    37. return null;
    38. }*/
    39. public String login(HttpServletRequest req, HttpServletResponse resp) {
    40. try {
    41. User u = udao.login(user);
    42. //通过账户名密码查到了用户记录
    43. if(u!=null) {
    44. /*ResponseUtil.writeJson(resp, new R()
    45. .data("code", 200)
    46. .data("msg", "登录成功"));*/
    47. ResponseUtil.writeJson(resp, R.ok(200, "登录成功"));
    48. req.getSession().setAttribute("user", u);
    49. }
    50. else {
    51. /*ResponseUtil.writeJson(resp, new R()
    52. .data("code", 0)
    53. .data("msg", "账户密码错误"));*/
    54. ResponseUtil.writeJson(resp, R.error(0, "用户名密码错误"));
    55. }
    56. } catch (Exception e) {
    57. e.printStackTrace();
    58. try {
    59. ResponseUtil.writeJson(resp, R.error(0, "登录失败"));
    60. } catch (Exception e1) {
    61. // TODO Auto-generated catch block
    62. e1.printStackTrace();
    63. }
    64. }
    65. return null;
    66. }
    67. //用户查询
    68. public String queryUserByMeetingId(HttpServletRequest req, HttpServletResponse resp) {
    69. try {
    70. String parameter = req.getParameter("meetingId");
    71. List users = udao.list(Integer.valueOf(parameter));
    72. //注意:LayUI中数据表格的格式
    73. ResponseUtil.writeJson(resp, R.ok(0, "会议用户数据初始化成功",users));
    74. } catch (Exception e) {
    75. e.printStackTrace();
    76. try {
    77. ResponseUtil.writeJson(resp, R.error(0, "会议用户数据初始化失败"));
    78. } catch (Exception e1) {
    79. // TODO Auto-generated catch block
    80. e1.printStackTrace();
    81. }
    82. }
    83. return null;
    84. }
    85. //用户查询
    86. public String list(HttpServletRequest req, HttpServletResponse resp) {
    87. try {
    88. PageBean pageBean=new PageBean();
    89. pageBean.setRequest(req);
    90. List> users = udao.list(user, pageBean);
    91. //注意:LayUI中数据表格的格式
    92. ResponseUtil.writeJson(resp, R.ok(0, "用户数据查询成功",pageBean.getTotal(),users));
    93. } catch (Exception e) {
    94. e.printStackTrace();
    95. try {
    96. ResponseUtil.writeJson(resp, R.error(0, "用户查询失败"));
    97. } catch (Exception e1) {
    98. // TODO Auto-generated catch block
    99. e1.printStackTrace();
    100. }
    101. }
    102. return null;
    103. }
    104. //用户增加
    105. public String add(HttpServletRequest req, HttpServletResponse resp) {
    106. try {
    107. //rs是sql语句执行的影响行数
    108. int rs = udao.add(user);
    109. if(rs>0) {
    110. ResponseUtil.writeJson(resp, R.ok(200, "用户数据新增成功"));
    111. }
    112. else {
    113. ResponseUtil.writeJson(resp, R.ok(0, "用户数据新增失败"));
    114. }
    115. } catch (Exception e) {
    116. e.printStackTrace();
    117. try {
    118. ResponseUtil.writeJson(resp, R.error(0, "用户数据新增失败"));
    119. } catch (Exception e1) {
    120. // TODO Auto-generated catch block
    121. e1.printStackTrace();
    122. }
    123. }
    124. return null;
    125. }
    126. //用户删除
    127. public String del(HttpServletRequest req, HttpServletResponse resp) {
    128. try {
    129. //rs是sql语句执行的影响行数
    130. int rs = udao.del(user);
    131. if(rs>0) {
    132. ResponseUtil.writeJson(resp, R.ok(200, "用户数据删除成功"));
    133. }
    134. else {
    135. ResponseUtil.writeJson(resp, R.ok(0, "用户数据删除失败"));
    136. }
    137. } catch (Exception e) {
    138. e.printStackTrace();
    139. try {
    140. ResponseUtil.writeJson(resp, R.error(0, "用户数据删除失败"));
    141. } catch (Exception e1) {
    142. // TODO Auto-generated catch block
    143. e1.printStackTrace();
    144. }
    145. }
    146. return null;
    147. }
    148. //用户修改
    149. public String edit(HttpServletRequest req, HttpServletResponse resp) {
    150. try {
    151. //rs是sql语句执行的影响行数
    152. int rs = udao.add(user);
    153. if(rs>0) {
    154. ResponseUtil.writeJson(resp, R.ok(200, "用户数据修改成功"));
    155. }
    156. else {
    157. ResponseUtil.writeJson(resp, R.ok(0, "用户数据修改失败"));
    158. }
    159. } catch (Exception e) {
    160. e.printStackTrace();
    161. try {
    162. ResponseUtil.writeJson(resp, R.error(0, "用户修改新增失败"));
    163. } catch (Exception e1) {
    164. // TODO Auto-generated catch block
    165. e1.printStackTrace();
    166. }
    167. }
    168. return null;
    169. }
    170. //查询所有用户用于绑定多功能下拉框
    171. public String queryUserAll(HttpServletRequest req, HttpServletResponse resp) {
    172. try {
    173. List> users = udao.queryUserAll(user, null);
    174. // 注意:layui中的数据表格的格式
    175. ResponseUtil.writeJson(resp, R.ok(0, "多功能下拉框数据查询成功",users));
    176. } catch (Exception e) {
    177. e.printStackTrace();
    178. try {
    179. ResponseUtil.writeJson(resp, R.error(0, "多功能下拉框数据查询失败"));
    180. } catch (Exception e2) {
    181. e2.printStackTrace();
    182. }
    183. }
    184. return null;
    185. }
    186. @Override
    187. public User getModel() {
    188. // TODO Auto-generated method stub
    189. return user;
    190. }
    191. }

    配置图片下载路径

    1. dirPath=E:/temp/images/oyang/
    2. serverPath=/upload/paizuo/
    3. dirPathSign=E:/temp/images/oyang/sign/
    4. serverPathSign=/upload/sign/

    MeetingInfoDao

    1. package com.oyang.dao;
    2. import java.util.List;
    3. import java.util.Map;
    4. import javax.servlet.http.HttpServletRequest;
    5. import javax.servlet.http.HttpServletResponse;
    6. import java.lang.Long;
    7. import java.lang.String;
    8. import java.sql.SQLException;
    9. import java.lang.String;
    10. import com.oyang.entity.MeetingInfo;
    11. import com.oyang.util.BaseDao;
    12. import com.oyang.util.PageBean;
    13. import com.oyang.util.StringUtils;
    14. /**
    15. *
    16. * @author yang
    17. *
    18. */
    19. public class MeetingInfoDao extends BaseDao {
    20. /*public List list(MeetingInfo meetingInfo, PageBean pageBean) throws Exception {
    21. String sql = "select * from t_oa_meeting_info where 1 = 1 ";
    22. if (!(meetingInfo.getId() == null || meetingInfo.getId() == 0)) {
    23. sql += "and id = " + meetingInfo.getId();
    24. }
    25. return super.executeQuery(sql, MeetingInfo.class, pageBean);
    26. }*/
    27. // 添加会议信息
    28. public int add(MeetingInfo t) throws Exception {
    29. String sql="insert into t_oa_meeting_info"
    30. +"(title,content,canyuze,liexize,zhuchiren,location,startTime,endTime,remark) values (?,?,?,?,?,?,?,?,?)";
    31. return super.executeUpdate(sql, t, new String[] {"title","content","canyuze","liexize","zhuchiren","location","startTime","endTime","remark"});
    32. }
    33. //我的会议sql,后续其他的菜单也会使用
    34. private String getSQL() {
    35. return "select a.id,a.title,a.content,a.canyuze,a.liexize,a.zhuchiren\r\n" +
    36. ",b.name zhuchirenname,\r\n" +
    37. "a.location,\r\n" +
    38. "DATE_FORMAT(a.startTime,'%Y-%m-%d %H-%m-%s') startTime,\r\n" +
    39. "DATE_FORMAT(a.endTime,'%Y-%m-%d %H-%m-%s') endTime,\r\n" +
    40. "a.state,\r\n" +
    41. "(\r\n" +
    42. " case a.state\r\n" +
    43. " when 0 then '取消会议'\r\n" +
    44. " when 1 then '新建'\r\n" +
    45. " when 2 then '待审核'\r\n" +
    46. " when 3 then '驳回'\r\n" +
    47. " when 4 then '待开'\r\n" +
    48. " when 5 then '进行中'\r\n" +
    49. " when 6 then '开启投票'\r\n" +
    50. " when 7 then '结束会议'\r\n" +
    51. " else '其他' end\r\n" +
    52. ") meetingstate,\r\n" +
    53. "a.seatPic,a.remark,a.auditor,\r\n" +
    54. "c.name auditorname from t_oa_meeting_info a\r\n" +
    55. "inner join t_oa_user b on a.zhuchiren = b.id\r\n" +
    56. "left join t_oa_user c on a.auditor = c.id and 1=1";
    57. }
    58. //我的会议
    59. public List> myInfos(MeetingInfo info, PageBean pageBean)
    60. throws SQLException, InstantiationException, IllegalAccessException {
    61. String sql = getSQL();
    62. //会议标题
    63. String title = info.getTitle();
    64. if(StringUtils.isNotBlank(title)){
    65. sql+=" and title like '%"+title+"%'";
    66. }
    67. sql +=" and zhuchiren = " + info.getZhuchiren();
    68. return super.executeQuery(sql, pageBean);
    69. }
    70. // 状态:0取消会议 1新建 2待审核 3驳回 4待开 5进行中 6开启投票 7结束会议,默认值为1
    71. public int updatezt(MeetingInfo m) throws Exception {
    72. String sql = "update t_oa_meeting_info set state=? where id = ?";
    73. return super.executeUpdate(sql, m, new String[] {"state","id"});
    74. }
    75. //设置会议排座图片
    76. public int updateSeatPicById(MeetingInfo info) throws Exception {
    77. String sql="update t_oa_meeting_info set seatPic=? where id=?";
    78. return super.executeUpdate(sql, info, new String[] {"seatPic","id"});
    79. }
    80. }

    MeetingInfoAction  

    1. package com.oyang.web;
    2. import java.io.IOException;
    3. import java.util.Date;
    4. import java.util.List;
    5. import java.util.Map;
    6. import java.util.UUID;
    7. import javax.servlet.http.HttpServletRequest;
    8. import javax.servlet.http.HttpServletResponse;
    9. import org.apache.commons.beanutils.ConvertUtils;
    10. import com.oyang.dao.MeetingInfoDao;
    11. import com.oyang.entity.MeetingInfo;
    12. import com.oyang.framework.ActionSupport;
    13. import com.oyang.framework.ModelDriver;
    14. import com.oyang.util.Base64ImageUtils;
    15. import com.oyang.util.MyDateConverter;
    16. import com.oyang.util.PageBean;
    17. import com.oyang.util.PropertiesUtil;
    18. import com.oyang.util.R;
    19. import com.oyang.util.ResponseUtil;
    20. public class MeetingInfoAction extends ActionSupport implements ModelDriver{
    21. private MeetingInfo info=new MeetingInfo();
    22. private MeetingInfoDao infoDao=new MeetingInfoDao();
    23. public String updateSeatPicById(HttpServletRequest req, HttpServletResponse resp) {
    24. /**
    25. * 1、接收前端页面传递到后台的图片对应的字符串
    26. * 2、借助工具类将字符串生成一个图片,保存到配置文件所配置的路径下
    27. * 3、添加服务器硬盘与请求地址 的映射,即可访问
    28. * 4、将请求地址 保存到数据库中
    29. */
    30. //获取到图片的存放地址
    31. try {
    32. String dirPath = PropertiesUtil.getValue("dirPath");
    33. //获取到浏览器请求路径,为了后续保存到数据库
    34. String serverPath = PropertiesUtil.getValue("serverPath");
    35. //随机生成一个图片名称
    36. String fileName = UUID.randomUUID().toString().replace("-", "")+".jpg";
    37. //info.getSeatPic();//图片字符串
    38. Base64ImageUtils.GenerateImage(info.getSeatPic().replaceAll("data:image/png;base64,", ""), dirPath+fileName);
    39. //将seatPic中内容修改为 请求地址
    40. info.setSeatPic(serverPath+fileName);
    41. //修改会议排座 数据库图片 对应的数据库列段
    42. int rs = infoDao.updateSeatPicById(info);
    43. if(rs>0) {
    44. ResponseUtil.writeJson(resp, R.ok(200, "会议排座成功"));
    45. }else {
    46. ResponseUtil.writeJson(resp, R.error(0, "会议排座失败"));
    47. }
    48. } catch (Exception e) {
    49. e.printStackTrace();
    50. try {
    51. ResponseUtil.writeJson(resp, R.error(0, "会议排座失败"));
    52. } catch (Exception e2) {
    53. e2.printStackTrace();
    54. }
    55. }
    56. return null;
    57. }
    58. }

    引入插件画布插件 

    运行结果

     看文件中是否有此图片

     三、会议送审

    myMeeting.js

    1. let layer,table,$,form;
    2. let row;
    3. layui.use(['layer','table','jquery','form'],function(){
    4. layer=layui.layer,
    5. table=layui.table,
    6. form=layui.form,
    7. $=layui.jquery;
    8. initTable();
    9. //查询事件
    10. $('#btn_search').click(function(){
    11. query();
    12. });
    13. //初始化审批人
    14. initFormSelects();
    15. //送审
    16. $('#btn_auditor').click(function(){
    17. $.post($("#ctx").val()+'/info.action',{
    18. 'methodName':'updateAuditorById',
    19. 'id':$('#meetingId').val(),
    20. 'auditor':$('#auditor').val()
    21. },function(rs){
    22. if(rs.success){
    23. //关闭对话框
    24. layer.closeAll();
    25. //刷新列表
    26. query();
    27. }else{
    28. layer.msg(rs.msg,{icon:5},function(){});
    29. }
    30. },'json');
    31. return false;
    32. });
    33. });
    34. //1.初始化数据表格
    35. function initTable(){
    36. table.render({ //执行渲染
    37. elem: '#tb', //指定原始表格元素选择器(推荐id选择器)
    38. height: 400, //自定义高度
    39. loading: false, //是否显示加载条(默认 true)
    40. cols: [[ //设置表头
    41. {field: 'id', title: '会议编号', width: 90},
    42. {field: 'title', title: '会议标题', width: 120},
    43. {field: 'location', title: '会议地点', width: 140},
    44. {field: 'startTime', title: '开始时间', width: 120},
    45. {field: 'endTime', title: '结束时间', width: 120},
    46. {field: 'meetingState', title: '会议状态', width: 120},
    47. {field: 'seatPic', title: '会议排座', width: 120,
    48. templet: function(d){
    49. if(d.seatPic==null || d.seatPic=="")
    50. return "尚未排座";
    51. else
    52. return "";
    53. }
    54. },
    55. {field: 'auditor', title: '审批人', width: 120},
    56. {field: '', title: '操作', width: 200,toolbar:'#tbar'},
    57. ]]
    58. });
    59. }
    60. //2.点击查询
    61. function query(){
    62. table.reload('tb', {
    63. url: $("#ctx").val()+'/info.action', //请求地址
    64. method: 'POST', //请求方式,GET或者POST
    65. loading: true, //是否显示加载条(默认 true)
    66. page: true, //是否分页
    67. where: { //设定异步数据接口的额外参数,任意设
    68. 'methodName':'myInfos',
    69. 'zhuchiren':$('#zhuchiren').val(),
    70. 'title':$('#title').val(),
    71. },
    72. request: { //自定义分页请求参数名
    73. pageName: 'page', //页码的参数名称,默认:page
    74. limitName: 'rows' //每页数据量的参数名,默认:limit
    75. },
    76. done: function (res, curr, count) {
    77. console.log(res);
    78. }
    79. });
    80. //工具条事件
    81. table.on('tool(tb)', function(obj){ //注:tool 是工具条事件名,test 是 table 原始容器的属性 lay-filter="对应的值"
    82. row = obj.data; //获得当前行数据
    83. var layEvent = obj.event; //获得 lay-event 对应的值(也可以是表头的 event 参数对应的值)
    84. var tr = obj.tr; //获得当前行 tr 的 DOM 对象(如果有的话)
    85. console.log(row);
    86. if(layEvent === 'seat'){ //会议排座
    87. open(row.id);
    88. } else if(layEvent === 'send'){ //送审
    89. if(row.seatPic==null || row.seatPic==""){
    90. layer.msg('先请完成会议排座,再进行送审操作!',function(){});
    91. return false;
    92. }
    93. //在打开送审页面之前,先请完成会议ID的赋值操作
    94. $('#meetingId').val(row.id);
    95. openLayerAudit();
    96. } else if(layEvent==="back"){ //反馈详情
    97. openLayerFeedBack(row.id);
    98. } else {
    99. }
    100. });
    101. }
    102. //打开会议排座对话框
    103. function open(id){
    104. layer.open({
    105. type: 2, //layer提供了5种层类型。可传入的值有:0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层)
    106. title: '会议排座', //对话框标题
    107. area: ['460px', '340px'], //宽高
    108. skin: 'layui-layer-rim', //样式类名
    109. content: $("#ctx").val()+'/jsp/meeting/seatPic.jsp?id='+id, //弹出内容。可以传入普通的html内容,还可以指定DOM,更可以随着type的不同而不同
    110. });
    111. }
    112. //会议送审
    113. function openLayerAudit(){
    114. //每次打开都对送审人进行初始化默认值设置
    115. $('#auditor').val("");
    116. //必须重新渲染
    117. form.render('select');
    118. //弹出对话框
    119. layer.open({
    120. type: 1, //layer提供了5种层类型。可传入的值有:0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层)
    121. title:'会议送审',
    122. area: ['426px', '140px'], //宽高
    123. skin: 'layui-layer-rim', //样式类名
    124. content: $('#audit'), //弹出内容。可以传入普通的html内容,还可以指定DOM,更可以随着type的不同而不同
    125. });
    126. }
    127. //初始化审批人
    128. function initFormSelects(){
    129. $.getJSON($("#ctx").val()+'/user.action',{
    130. 'methodName':'queryUserAll'
    131. },function(rs){
    132. console.log(rs);
    133. let data=rs.data;
    134. $.each(data,function(i,e){
    135. $('#auditor').append(new Option(e.name,e.value));
    136. });
    137. //重新渲染
    138. form.render('select');
    139. });
    140. }
    141. // 打开查看本会议的反馈详情
    142. function openLayerFeedBack(id){
    143. $.getJSON('feedBack.action',{
    144. methodName:'queryMeetingBackByMeetingId',
    145. meetingId:id
    146. },function(data){
    147. $('#meeting_ok').html("");
    148. $('#meeting_no').html("");
    149. $('#meeting_noread').html("");
    150. if(data.success){
    151. console.log(data.data);
    152. $.each(data.data,function(i,e){
    153. if(e.result==1)
    154. $('#meeting_ok').html(e.names);
    155. else if(e.result==2)
    156. $('#meeting_no').html(e.names);
    157. else
    158. $('#meeting_noread').html(e.names);
    159. });
    160. //弹出对话框
    161. layer.open({
    162. type: 1, //layer提供了5种层类型。可传入的值有:0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层)
    163. title:'反馈详情',
    164. area: ['426px', '420px'], //宽高
    165. skin: 'layui-layer-rim', //样式类名
    166. content: $('#feedback'), //弹出内容。可以传入普通的html内容,还可以指定DOM,更可以随着type的不同而不同
    167. btn:['关闭'],
    168. yes:function(index,layero){
    169. layer.closeAll();
    170. }
    171. });
    172. }
    173. });
    174. }

     MeetingInfoDao

    1. // 会议送审
    2. public int updateAuditorById(MeetingInfo info) throws Exception {
    3. String sql="update t_oa_meeting_info set auditor=?,state=2 where id=?";
    4. return super.executeUpdate(sql, info, new String[] {"auditor","id"});
    5. }

    MeetingInfoAction

    1. // 会议送审
    2. public String updateAuditorById(HttpServletRequest req, HttpServletResponse resp) {
    3. try {
    4. // rs是sql语句执行的影响行数
    5. int rs = infoDao.updateAuditorById(info);
    6. if(rs>0) {
    7. ResponseUtil.writeJson(resp, R.ok(200, "会议送审成功"));
    8. }else {
    9. ResponseUtil.writeJson(resp, R.error(0, "会议送审失败"));
    10. }
    11. } catch (Exception e) {
    12. e.printStackTrace();
    13. try {
    14. ResponseUtil.writeJson(resp, R.error(0, "会议送审失败"));
    15. } catch (Exception e2) {
    16. e2.printStackTrace();
    17. }
    18. }
    19. return null;
    20. }

    OK,今日的分享就到此结束啦,如果对个位看官有帮助的话可以留下免费的赞哦(收藏或关注也行),如果文章中有什么问题或不足以及需要改正的地方可以私信博主,博主会做出改正的。个位看官,小陽在此跟大家说拜拜啦!

  • 相关阅读:
    zabbix监控
    【性能测试入门必看】性能测试理论知识
    介绍几个语言生成的预训练模型
    网络安全(黑客)自学
    LeetCode 2760. 最长奇偶子数组:模拟(使用一个变量记录状态)
    语句和表达式有什么不同
    网易云信语音短信验证码图解
    利用Bootstrap的面包屑组件实现面包屑层次分级导航效果
    visual studio Qt 开发环境中手动添加 Q_OBJECT 导致编译时出错的问题
    基于Springboot+vue的汽车租赁系统 elementui
  • 原文地址:https://blog.csdn.net/weixin_65211978/article/details/125992347