会议OA项目之会议通知(需要反馈自己的参会情况)

news2024/11/13 15:08:38

一.主要功能点介绍

①显示出所有的数据(查询所有的待开会议)

②模糊查询(根据会议标题)

③附有一个是否参会的操作:反馈结果(参加/不参加)当然,没有阅读此消息时,那么就会是未读

二.效果展示

会议通知界面

 我的会议界面

三.前端代码

meetingNotify.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@include file="/common/head.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>
</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="toolbar">
  {{# if(d.result==-1){ }}
  <a class="layui-btn layui-btn-xs" lay-event="edit">是否参会</a>
  {{# } }}
</script>
</body>
</html>

meetingNotify.js

//把需要用到的模块定义成全局变量
let layer, $, table, form,test;
var row;
layui.use([ 'jquery', 'layer', 'table', 'form', 'test' ], function() {
	layer = layui.layer, $ = layui.jquery, test = layui.test, table = layui.table,
			form = layui.form;
	// 初始化表格
	initTable();
	// 查询按钮的点击事件
	$('#btn_search').click(function() {
		select();// 调用写好的查询的方法
	});
});

// 1.初始化数据表格
function initTable() {
	table
			.render({ // 执行渲染
				elem : '#tb', // 指定原始表格元素选择器(推荐id选择器)
				url : 'meetingFeedBack.action?methodName=selectMeetingFeedBackByUserId', // 请求地址
				height : 980, // 自定义高度
				loading : false, // 是否显示加载条(默认 true)
				cols : [ [ // 设置表头 field是数据库的字段名,title是显示在页面中的值
				{
					field : 'title',
					title : '会议标题',
					width : 125
				}, {
					field : 'location',
					title : '会议地点',
					width : 125,
					edit:'text'
				}, {
					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.startTime));
	            	}
				}, {
					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 : '#toolbar'
				},// #toolbar是工具栏的id
				] ],
				page : true
			});

	// 工具条事件
	table.on('tool(tb)', function(obj) { // 注:tool 是工具条事件名,test 是 table
											// 原始容器的属性 lay-filter="对应的值"
		row = obj.data; // 获得当前行数据
		var layEvent = obj.event; // 获得 lay-event 对应的值(也可以是表头的 event 参数对应的值)
		console.log(row);
		if (layEvent === 'edit') { // 是否参会
			openLayer(row.id);
		} else {

		}
	});

}

// 2.点击查询
function select() {
	// reload中填写的‘tb’是表格的id
	table.reload('tb', {
		url : 'meetingFeedBack.action', // 请求地址
		method : 'POST', // 请求方式,GET或者POST
		loading : true, // 是否显示加载条(默认 true)
		page : true, // 是否分页
		where : { // 设定异步数据接口的额外参数,任意设
			'methodName' : 'selectMeetingFeedBackByUserId',
			'personId' : $('#personId').val(),// 获取当前的主持人
			'title' : $('#title').val()
		// 获取输入框输入的值
		},
		request : { // 自定义分页请求参数名
			pageName : 'page', // 页码的参数名称,默认:page
			limitName : 'rows' // 每页数据量的参数名,默认:limit
		}
	});
}

// 3.点击是否参会弹出的界面
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 : '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();
			select();
		} else {
			layer.msg(rs.msg, {
				icon : 5
			}, function() {
			});
		}
	}, 'json');
}

myMeeting.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@include file="/common/head.jsp"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="/LayUi/static/js/meeting/myMeeting.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="zhuchiren" 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>
<!-- 对话框(送审) -->
<div id="audit" style="display:none;">
	<form style="margin:20px 15px;" class="layui-form layui-form-pane" lay-filter="audit">
		<div class="layui-inline">
		   <label class="layui-form-label">送审人</label>
		   <div class="layui-input-inline">
		      <input type="hidden" id="meetingId" value=""/>
		      <select id="auditor" style="poistion:relative;z-index:1000">
				<option value="">---请选择---</option>
		      </select>
		   </div>
		   <div class="layui-input-inline">
		     <button id="btn_auditor" class="layui-btn">送审</button>
		   </div>
		</div>
	</form>
</div>
<!-- 对话框(反馈详情) -->
<div id="feedback" style="display:none;padding:15px;">
	<fieldset class="layui-elem-field layui-field-title">
	  <legend>参会人员</legend>
	</fieldset>
	<blockquote class="layui-elem-quote" id="meeting_ok"></blockquote>
	<fieldset class="layui-elem-field layui-field-title">
	  <legend>缺席人员</legend>
	</fieldset>
	<blockquote class="layui-elem-quote" id="meeting_no"></blockquote>
	<fieldset class="layui-elem-field layui-field-title">
	  <legend>未读人员</legend>
	</fieldset>
	<blockquote class="layui-elem-quote" id="meeting_noread"></blockquote>
</div>
<!--状态:0取消会议 1新建 2待审核 3驳回 4待开 5进行中 6开启投票 7结束会议,默认值为1  -->
<script type="text/html" id="toolbar">
  {{#  if(d.state==1 || d.state==3){ }}
  <a class="layui-btn layui-btn-xs" lay-event="seat">会议排座</a>
  <a class="layui-btn layui-btn-xs" lay-event="send">送审</a>
  <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
  {{#  } }}
  {{#  if(d.state!=1 && d.state!=2 && d.state!=3){ }}
  <a class="layui-btn layui-btn-xs" lay-event="back">反馈详情</a>
  {{#  } }}
</script>
</body>
</html>

myMeeting.js

//把需要用到的模块定义成全局变量
let layer,$,table,form;
var row;
layui.use(['jquery','layer','table','form'],function(){
	layer=layui.layer,
	$=layui.jquery,
	table=layui.table,
	form=layui.form;
	// 初始化表格
	initTable();
	// 查询按钮的点击事件
	$('#btn_search').click(function(){
		select();// 调用写好的查询的方法
	});
	// 初始化审批人
	initFormSelects();
	// 送审【是打开页面后的送审按钮】
	$('#btn_auditor').click(function(){
		$.post('meetingInfo.action',{
			'methodName':'updateAuditorById',// 指定送审人,并且把会议状态修改为待审核
			'id':$('#meetingId').val(),
			'auditor':$('#auditor').val()
		},function(rs){
			if(rs.success){
				// 关闭对话框
				layer.closeAll();
				// 刷新列表
				select();
			}else{
				layer.msg(rs.msg,{icon:5},function(){});
			}
		},'json');
		return false;
	});
});


// 1.初始化数据表格
function initTable(){
	table.render({           // 执行渲染
        elem:'#tb',         // 指定原始表格元素选择器(推荐id选择器)
        url: 'meetingInfo.action?methodName=myMeeting',     // 请求地址
        height: 980,         // 自定义高度
        loading: false,      // 是否显示加载条(默认 true)
        cols: [[             // 设置表头 field是数据库的字段名,title是显示在页面中的值
            {field: 'title', title: '会议标题', width: 125},
            {field: 'location', title: '会议地点', width: 125},
            {field: 'startTime', title: '开始时间', width: 170},
            {field: 'endTime', title: '结束时间', width: 170},
            {field: 'meetingstate', title: '会议状态', width: 105},
            {field: 'auditorName', title: '审批人', width: 105},
            {field: 'seatPic', title: '会议排座', width: 105,
            templet: function(d){// templet:自定义列内容的显示方式
                if(d.seatPic==null || d.seatPic==""){
                	return "尚未排座";
                }else{
                	return "<img width='16px; ' src='"+d.seatPic+"'/>";
                }
            }
	},
            {field: ' ', title: '操作', width: 255,toolbar:'#toolbar'},// #toolbar是工具栏的id
        ]],
   page:true
    });
	
	
	// 工具条的事件
	table.on('tool(tb)', function (obj) {// obj是指这张表中的数据
		row = obj.data;// 将这张表中的数据赋给row这个变量
		// obj.event:获取触发事件的元素的 event 值,用于区分不同的操作
		var event=obj.event;// 拿到按钮的:‘lay-event="xx"’
		 console.log("该行数据"+row)
		if (obj.event == "seat") {// 排座
			open(row.id)
		}else if (obj.event == "send"){// 送审
			if(row.seatPic==null || row.seatPic==""){// 如果排座的这个字段为空的话(说明没有进行排座)
				  layer.msg('请先完成排座,再进行送审😧😧',function(){});// 做出提示,必须要先排座才能送审
				  return false;
			  }
			 $('#meetingId').val(row.id);// 拿到隐藏域中的会议id,给会议id赋值(数据库数据赋予了row,拿到其中的id就是会议id)
			 openAudit()
		}else if (obj.event == "back"){// 反馈
			openFeedBack(row.id)
		}else if(obj.event == "del"){//如果这个值等于del,那么跳到user.action调用删除的方法
			layer.confirm('确认删除吗?', {icon: 3, title:'提示'}, function(index){
				  $.post('meetingInfo.action?methodName=updateState&id='+row.id,{
				  },function(del){
					  if(del.success){
						//调用查询方法刷新数据
		        		   select();
		        	   }else{
		        		   layer.msg(del.msg,function(){});
		        	   }
				  },'json');
				  layer.close(index);
				});
			}
	
	});
	
}


// 2.点击查询
function select(){
	// reload中填写的‘tb’是表格的id
	table.reload('tb', {
        url: 'meetingInfo.action', // 请求地址
        method: 'POST',                    // 请求方式,GET或者POST
        loading: true,                     // 是否显示加载条(默认 true)
        page: true,                        // 是否分页
        where: {                           // 设定异步数据接口的额外参数,任意设
        	'methodName':'myMeeting',
        	'zhuchiren':$('#zhuchiren').val(),// 获取当前的主持人
        	'title':$('#title').val()// 获取输入框输入的值
        },  
        request: {                         // 自定义分页请求参数名
            pageName: 'page', // 页码的参数名称,默认:page
            limitName: 'rows' // 每页数据量的参数名,默认:limit
        }
   });
}


// 3.排座
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: 'jsp/meeting/seatPic.jsp?id='+id, // 弹出内容。可以传入普通的html内容,还可以指定DOM,更可以随着type的不同而不同
    });
} 

// 4.送审
// 4.1初始化审批人
function initFormSelects(){
	$.getJSON('user.action',{
		'methodName':'selectusers'
	},function(rs){
		console.log(rs);
		let data=rs.data;
		$.each(data,function(i,d){
			$('#auditor').append(new Option(d.name,d.value));// 填充送审人的信息
		});
		form.render('select');// 重新渲染
	});
}

// 4.2送审给指定的审批人
function openAudit(id){
	$('#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'),   // 弹出内容【id为audit的表单】。可以传入普通的html内容,还可以指定DOM,更可以随着type的不同而不同
    });
}

//5.反馈详情
function openFeedBack(id){
	$.getJSON('meetingFeedBack.action',{
		methodName:'selectMeetingBackByMeetingId',
		meetingId:id
	},function(data){
		$('#meeting_ok').html("");
		$('#meeting_no').html("");
		$('#meeting_noread').html("");
		if(data.success){
			console.log(data.data);
			$.each(data.data,function(i,e){
				if(e.result==1)
					$('#meeting_ok').html(e.names);
				else if(e.result==2)
					$('#meeting_no').html(e.names);
				else
					$('#meeting_noread').html(e.names);
			});
			//弹出对话框
		    layer.open({
		        type: 1,                    //layer提供了5种层类型。可传入的值有:0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层)
		        title:'反馈详情',
		        area: ['426px', '420px'],   //宽高
		        skin: 'layui-layer-rim',    //样式类名
		        content: $('#feedback'),   //弹出内容。可以传入普通的html内容,还可以指定DOM,更可以随着type的不同而不同
		        btn:['关闭'],
		        yes:function(index,layero){
		        	layer.closeAll();
		        }
		    });
		}
	});
}

四.后端代码

实体类

package com.wh.entity;

public class MeetingFeedBack {
private String id;
private long meetingId;
private int  personType;
private long personId;
private int result;
private String reason;

public MeetingFeedBack() {
	// TODO Auto-generated constructor stub
}

public MeetingFeedBack(String id, long meetingId, int personType, long personId, int result, String reason) {
	super();
	this.id = id;
	this.meetingId = meetingId;
	this.personType = personType;
	this.personId = personId;
	this.result = result;
	this.reason = reason;
}

public MeetingFeedBack(long meetingId, int personType, long personId, int result, String reason) {
	super();
	this.meetingId = meetingId;
	this.personType = personType;
	this.personId = personId;
	this.result = result;
	this.reason = reason;
}

public String getId() {
	return id;
}

public void setId(String id) {
	this.id = id;
}

public long getMeetingId() {
	return meetingId;
}

public void setMeetingId(long meetingId) {
	this.meetingId = meetingId;
}

public int getPersonType() {
	return personType;
}

public void setPersonType(int personType) {
	this.personType = personType;
}

public long getPersonId() {
	return personId;
}

public void setPersonId(long personId) {
	this.personId = personId;
}

public int getResult() {
	return result;
}

public void setResult(int result) {
	this.result = result;
}

public String getReason() {
	return reason;
}

public void setReason(String reason) {
	this.reason = reason;
}

@Override
public String toString() {
	return "MeetingFeedBack [id=" + id + ", meetingId=" + meetingId + ", personType=" + personType + ", personId="
			+ personId + ", result=" + result + ", reason=" + reason + "]";
}


}

dao

package com.wh.dao;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import com.wh.entity.MeetingFeedBack;
import com.wh.entity.MeetingInfo;
import com.wh.entity.Permission;
import com.wh.entity.User;
import com.zking.util.BaseDao;
import com.zking.util.BuildTree;
import com.zking.util.PageBean;
import com.zking.util.StringUtils;
import com.zking.util.TreeVo;

public class MeetingFeedBackDao extends BaseDao<MeetingFeedBack> {
	
	
	//会议通知查询
		public List<Map<String, Object>> selectMeetingFeedBackByUserId(MeetingFeedBack meetingFeedBack, PageBean pageBean) throws Exception {
			String sql = " 	select \r\n" + 
					"		IFNULL(f.result,-1) result ,t1.*\r\n" + 
					"	from\r\n" + 
					"	(select * from t_oa_meeting_info where FIND_IN_SET("+meetingFeedBack.getPersonId()+",CONCAT(\r\n" + 
					"	canyuze,',',liexize,',',zhuchiren)) and state = 4) t1\r\n" + 
					"	left join t_oa_meeting_feedback f on t1.id = f.meetingId \r\n" + 
					"	and f.personId = "+meetingFeedBack.getPersonId()+"\r\n" + 
					"	order by result";
		
			
//			System.out.println(sql);
			return super.executeQuery(sql, pageBean);
		}

		
		//会议反馈
		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"});
		}

		//查询反馈信息【反馈详情】
		public List<Map<String, Object>> selectMeetingBackByMeetingId(MeetingFeedBack meetingFeedBack, PageBean pageBean) 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(\r\n" + 
					"	canyuze,',',liexize,',',zhuchiren) from t_oa_meeting_info where id="+meetingFeedBack.getMeetingId()+")) ) t1\r\n" + 
					"	left join t_oa_meeting_feedback f on t1.id = f.personId and f.meetingId = "+meetingFeedBack.getMeetingId()+") t\r\n" + 
					" group by t.result";
			return super.executeQuery(sql, pageBean);
		}
	 


}

servlet

package com.wh.web;

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

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

import com.wh.dao.MeetingFeedBackDao;
import com.wh.entity.MeetingFeedBack;
import com.wh.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;

public class MeetingFeedBackAction extends ActionSupport implements ModelDriver<MeetingFeedBack> {
	private MeetingFeedBack meetingFeedBack = new MeetingFeedBack();
	private MeetingFeedBackDao mfbd = new MeetingFeedBackDao();

	// 增加
		public void add(HttpServletRequest req, HttpServletResponse resp) throws Exception {
				// 影响行数
				int add = mfbd.add(meetingFeedBack);
				System.out.println(add);
				if (add > 0) {
					ResponseUtil.writeJson(resp,R.ok(0, "会议反馈增加成功"));
				} else {
					ResponseUtil.writeJson(resp,R.error(0, "会议反馈增加失败"));
				}
		}

	// 会议通知
	public void selectMeetingFeedBackByUserId(HttpServletRequest req, HttpServletResponse resp) {
		try {
			PageBean pageBean = new PageBean();
			pageBean.setRequest(req);
			User u = (User) req.getSession().getAttribute("user");
			if(StringUtils.isNotBlank(u.toString())) {
				meetingFeedBack.setPersonId(u.getId());
			}
		 List<Map<String, Object>> selectMeetingFeedBackByUserId = mfbd.selectMeetingFeedBackByUserId(meetingFeedBack, pageBean);
			// layui 的code 返回一定要是 0,不能是200,否者返回不了数据
			ResponseUtil.writeJson(resp, R.ok(0, "查询成功", pageBean.getTotal(), selectMeetingFeedBackByUserId));
		} catch (Exception e) {
			e.printStackTrace();
			try {
				ResponseUtil.writeJson(resp, R.error(0, "查询失败"));
			} catch (Exception e1) {
				e1.printStackTrace();
			}
		}
	}
	
	
	//查询反馈信息【反馈详情】
		public void selectMeetingBackByMeetingId(HttpServletRequest req, HttpServletResponse resp) {
			try {
				PageBean pageBean = new PageBean();
				pageBean.setRequest(req);
			 List<Map<String, Object>> selectMeetingBackByMeetingId = mfbd.selectMeetingBackByMeetingId(meetingFeedBack, pageBean);
				// layui 的code 返回一定要是 0,不能是200,否者返回不了数据
				ResponseUtil.writeJson(resp, R.ok(0, "查询成功", pageBean.getTotal(), selectMeetingBackByMeetingId));
			} catch (Exception e) {
				e.printStackTrace();
				try {
					ResponseUtil.writeJson(resp, R.error(0, "查询失败"));
				} catch (Exception e1) {
					e1.printStackTrace();
				}
			}
		}

	

	

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

}

工具类(layui自定义模块)

 如果不使用这个自定义模块的话,那在前端显示时间的时候将会以时间戳表示

 

//提示:模块也可以依赖其它模块,如:layui.define('layer', callback);
layui.define(function(exports){ 
  var obj = {
     hello: function(str){
        alert('Hello '+ (str||'test'));
     },
     toDate:function(date,pattern){
    	 return fmtDate(date,pattern);
     }
  };
 
  //输出test接口
  //test.hello('zs');
  exports('test', obj);
}); 


//给Date类添加了一个新的实例方法format
Date.prototype.format = function (fmt) {
	//debugger;
    var o = {
        "M+": this.getMonth() + 1,                 //月份
        "d+": this.getDate(),                    //日
        "h+": this.getHours(),                   //小时
        "m+": this.getMinutes(),                 //分
        "s+": this.getSeconds(),                 //秒
        "q+": Math.floor((this.getMonth() + 3) / 3), //季度
        "S": this.getMilliseconds()             //毫秒
    };
    if (/(y+)/.test(fmt))
        fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
    for (var k in o)
        if (new RegExp("(" + k + ")").test(fmt))
            fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
    return fmt;
};

function fmtDate(date, pattern) {
	var ts = date.getTime();
    var d = new Date(ts).format("yyyy-MM-dd hh:mm:ss");
    if (pattern) {
        d = new Date(ts).format(pattern);
    }
    return d.toLocaleString();
};

好啦,今天的分享就到这了,希望能够帮到你呢!😊😊 

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

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

相关文章

【数据分享】1999—2021年地级市的科技创新相关指标(免费获取\Shp\Excel格式)

1999-2021年地级市的人口相关数据、各类用地面积数据、污染物排放和环境治理相关数据、房地产投资情况和商品房销售面积、社会消费品零售总额和年末金融机构存贷款余额、地方一般公共预算收支状况、工业企业数、固定资产投资和对外经济贸易数据&#xff08;可查看之前的文章获悉…

奇特!AI换脸让康熙本人出演电视剧;LLM超全综述资料;业内深聊游戏行业中AI应用实践;吴恩达联合Hugging Face再出新课 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; B站UP主再出「邪招」&#xff0c;让康熙本人出演电视剧名场面 B站UP主 PAC_松柏 结合康熙画像和电视剧画面&#xff0c;对视频人物角色…

flutter:轮播

前言 介绍几个比较有不错的轮播库 swipe_deck 与轮播沾边&#xff0c;但是更多的是一种卡片式的交互式界面设计。它的主要概念是用户可以通过左右滑动手势浏览不同的卡片&#xff0c;每张卡片上都有不同的信息或功能。 Swipe deck通常用于展示图片、产品信息、新闻文章、社…

从C语言到C++_29(红黑树封装set和map)红黑树迭代器的实现

目录 1. set和map中的红黑树 2. 仿函数比较键值对 3. 红黑树迭代器的实现 3.1 迭代器 3.2 迭代器-- 3.3 map的operator[ ] 4. 完整代码 Set.h Map.h RedBlackTree.h Test.cpp 本章完&#xff0c; 1. set和map中的红黑树 前一篇红黑树的源代码&#xff1a; #pragm…

Python web实战 | 用 Flask 框架快速构建 Web 应用【实战】

概要 Python web 开发已经有了相当长的历史&#xff0c;从最早的 CGI 脚本到现在的全栈 Web 框架&#xff0c;现在已经成为了一种非常流行的方式。 Python 最早被用于 Web 开发是在 1995 年&#xff08;90年代早期&#xff09;&#xff0c;当时使用 CGI 脚本编写动态 Web 页面…

Python爬取IP归属地信息及各个地区天气信息

一、实现样式 二、核心点 1、语言&#xff1a;Python、HTML&#xff0c;CSS 2、python web框架 Flask 3、三方库&#xff1a;requests、xpath 4、爬取网站&#xff1a;https://ip138.com/ 5、文档结构 三、代码 ipquery.py import requests from lxml import etree # 请求…

Lambda-Java8新特性最佳实践

一、基本概念 1.背景 Lambda是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。 Lambda 表达式&#xff08;Lambda express…

视频孪生赋能智慧交通,视频孪生在9大交通场景的典型应用展示

《数字中国建设整体布局规划》中提出&#xff0c;要推动数字技术和实体经济深度融合&#xff0c;在交通领域加快数字技术创新应用。其中对“数字技术创新应用”的理解&#xff0c;一方面是指推动人工智能、大数据、云计算、数字孪生、物联网等新技术与交通行业深度融合&#xf…

深度学习入门(二):神经网络整体架构

一、前向传播 作用于每一层的输入&#xff0c;通过逐层计算得到输出结果 二、反向传播 作用于网络输出&#xff0c;通过计算梯度由深到浅更新网络参数 三、整体架构 层次结构&#xff1a;逐层变换数据 神经元&#xff1a;数据量、矩阵大小&#xff08;代表输入特征的数量…

1400*B. Toy Blocks

Example input 3 3 3 2 2 4 2 2 3 2 3 0 3 0 output 1 0 3 解析&#xff1a; 对于某个盒子&#xff0c;我们用其余盒子的最大值 mx 乘以其余的盒子数量&#xff08;n-1&#xff09;&#xff0c;再减去其余盒子当前的数量 ( sum-a[ i ] )&#xff0c;即为需要补上的数量 cnt…

某制造企业基于 KubeSphere 的云原生实践

背景介绍 随着业务升级改造与软件产品专案的增多&#xff0c;常规的物理机和虚拟机方式逐渐暴露出一些问题&#xff1a; 大量服务部署在虚拟机上&#xff0c;资源预估和硬件浪费较大&#xff1b;大量服务部署在虚拟机上&#xff0c;部署时间和难度较大&#xff0c;自动化程度…

RocketMQ工作原理

文章目录 三.RocketMQ工作原理1.消息的生产消息的生产过程Queue选择算法 2.消息的存储1.commitlog文件目录与文件消息单元 2.consumequeue目录与文件索引条目 3.对文件的读写消息写入消息拉取性能提升 3.indexFile1.索引条目结构2.文件名的作用3.查询流程 4.消息的消费1.推拉消…

思维导图怎么做?一份完整的思维导图绘制教程来了!

在信息爆炸的时代&#xff0c;如何高效地整理和消化信息是每个人都需要面对的问题。思维导图作为一种能够高效组织和呈现信息的工具&#xff0c;凭借其直观、易理解的特性&#xff0c;备受学生、教师、企业管理者、商业团队等许多人的青睐。那么&#xff0c;如何制作思维导图呢…

Python案例|使用Scikit-learn实现客户聚类模型

聚类是一种经典的无监督学习方法&#xff0c;无监督学习的目标是通过对无标记训练样本的学习&#xff0c;发掘和揭示数据集本身潜在的结构与规律&#xff0c;即不依赖于训练数据集的类标记信息。聚类试图将数据集划分为若干个互不相交的类簇&#xff0c;从而每个簇对应一个潜在…

适合运动时戴的蓝牙耳机有哪些?精选五款表现还不错的耳机

音乐能有效地激发人体潜能&#xff0c;充分释放能量&#xff0c;达到更好的运动效果&#xff0c;因此对于运动爱好者来说&#xff0c;运动耳机至关重要。面对产品种类众多的运动耳机&#xff0c;很多人都会感到迷茫&#xff0c;经常有人问“有什么适合运动的时候佩戴的耳机”&a…

健身用什么耳机好?分享几款适合健身时使用的耳机!

随着全民健身的热潮到来&#xff0c;运动耳机的种类也更加丰富。在众多入耳式耳机、半入耳式耳机、头戴式耳机等传统市场之中&#xff0c;诞生了一种新晋关注度极高的耳机骨传导耳机。这种不依赖空气传递声波&#xff0c;并且无需堵住耳朵的新奇聆听方式&#xff0c;不仅健康而…

ChatGPT | 分割Word文字及表格,优化文本分析

知识库读取Word内容时&#xff0c;由于embedding切片操作&#xff0c;可能会出现表格被分割成多个切片的情况。这种切片方式可能导致“列名栏”和“内容栏”之间的Y轴关系链断裂&#xff0c;从而无法准确地确定每一列的数据对应关系&#xff0c;从而使得无法准确知道每一列的数…

PySpark基本操作:如何查看源码

方法一&#xff1a; from pyspark.mllib.tree import GradientBoostedTrees import inspectsource_code inspect.getsource(GradientBoostedTrees) print(source_code) 方法二&#xff1a; GradientBoostedTrees — PySpark 3.4.1 documentation (apache.org) 在官网中&…

【网络原理】 (1) (应用层 传输层 UDP协议 TCP协议 TCP协议段格式 TCP内部工作机制 确认应答 超时重传 连接管理)

文章目录 应用层传输层UDP协议TCP协议TCP协议段格式TCP内部工作机制确认应答超时重传 网络原理部分我们主要学习TCP/IP协议栈这里的关键协议(TCP 和 IP),按照四层分别介绍.(物理层,我们不涉及). 应用层 我们需要学会自定义一个应用层协议. 自定义协议的原因? 当前的软件(应用…

途乐证券:纺织服装板块走强,金发拉比、红蜻蜓涨停,嘉曼服饰等大涨

纺织服装板块28日盘中强势上扬&#xff0c;到发稿&#xff0c;嘉曼服饰涨约17%&#xff0c;金发拉比、红蜻蜓涨停&#xff0c;日播时尚、如意集团、云中马涨约7%&#xff0c;比音勒芬、聚杰微纤等涨超5%。 数据显现&#xff0c;4月美国服装及服装面料批发商库存额与服装及服装配…