【企业办公系统】签到及考勤数据管理

news2024/11/24 4:53:47

员工在系统点击签到时,系统会从是否工作日、是否请假、签到时间和地点是否正确上进行判断,确定是否计入考勤。其中,考勤状态分为'正常'、'地区异常'、'早退异常'、'迟到异常'、'旷工异常'。此外,除了通过逻辑判断以外,系统还需要自动查询全天未签到且未请假的员工,后端设置系统自动处理数据,前端自动延时并刷新信息

逻辑设计

字段名称

描述

标识符

UC003

测试项

用户签到管理功能测试

测试环境要求

1.用户100002/100002为有效登陆用户

输入标准

1.用户在正确的时间范围内点击签到,且系统定位在考勤地点范围内

2.用户在正确的时间范围内点击签到,且系统定位在考勤地点范围外

3.用户若在某日的上午/下午/全天未签到

4.用户在请假时间内点击签到

5.用户上午签到时间晚于正常考勤时间,且系统定位在考勤地点范围内

6.用户下午签到时间早于正常考勤时间,且系统定位在考勤地点范围内

7.用户上午签到时间晚于正常考勤时间,且系统定位在考勤地点范围外

8.用户下午签到时间早于正常考勤时间,且系统定位在考勤地点范围外

输出标准

1.显示的签到状态为正常

2.显示的签到状态为地点异常

3.显示的签到状态为旷工异常

4.显示的签到状态为正常

5.显示的签到状态为迟到异常

6.显示的签到状态为早退异常

7.显示的签到状态为地点异常

8.显示的签到状态为地点异常

场景描述

签到状态

是否工作日

是否签到

是否在指定时间

是否在指定地区

是否请假

×

签到无效

×

正常

正常

×

×

地点异常

×

×

旷工异常

×

×

早退/迟到异常

代码实现

1.在截止时间提醒签到

 后端

public void signSelPerson() throws ParseException {//查询个人在某月的正常出勤、异常出勤次数、每天的签到信息
		String year=this.getPara("year");
		int month=Integer.parseInt(this.getPara("month"));
		String time=year+"-"+month+"-01";
		String etime=year+"-"+(month+1)+"-01";
//		获取查询的截止时间
		SimpleDateFormat ft=new SimpleDateFormat("yyyy-MM-dd");
		Date start = ft.parse(etime);
		Calendar c=Calendar.getInstance();
	 	c.setTime(start);
	    c.add(Calendar.YEAR, 0);
	    c.add(Calendar.MONTH, 0);
	    c.add(Calendar.DAY_OF_YEAR, -1);
	    String s=ft.format(c.getTime());
		List<Record> covers=Db.find("select * from sign where time>='"+time+"' and time<='"+s+"' and workId='"+getSessionAttr("id")+"'");
		int flag=0;
		 String re="[";
		 int i=covers.size()-1;
		 
			 for(int j=0;j<covers.size();j++) {
		        	flag++;
		        	if(covers.get(j).get("signMorning")==null) covers.get(j).set("signMorning","");
		        	if(covers.get(j).get("signAfter")==null) covers.get(j).set("signAfter","");
		        	re+="{"+
		        	"\"workId\":\""+covers.get(j).get("workId")+"\","+"\"id\":\""+covers.get(j).get("workId")+"\","
		        	+"\"signMorning\":\""+covers.get(j).get("signMorning")+"\","+"\"signAfter\":\""+covers.get(j).get("signAfter")+"\","
		        			+"\"state\":\""+covers.get(j).get("state")
		        	+"\"}";
		        	if(flag<=i) re+=",";		
		        }
		List<Record> covers1=Db.find("select * from sign where time>='"+time+"' and time<='"+s+"' and workId='"+getSessionAttr("id")+"' and state='正常'");
		List<Record> covers2=Db.find("select * from sign where time>='"+time+"' and time<='"+s+"' and workId='"+getSessionAttr("id")+"' and state in('异常'"
				+ ",'地区异常','早退异常','迟到异常','旷工异常')");
		re+="]";
//设置json数组,向前台发送数据
		Map map=new HashMap();
		 map.put("json", re);
		 map.put("normalNum", covers1.size());
		 map.put("abnormalNum", covers2.size());
		 renderJson(map);
	}

前端

getMessage(){//在签到截止时提醒签到,获取后端请求信息
            this.getRequest('/sal/sign').then(resp=>{
                if(resp.json){ 
                     Message.error({message:resp.json});
                }
            })            
        }
2.进行签到

后端

public void signSubmit() throws ParseException {//进行签到
		String time=new Rule().getDateRealTimeFormat();
		String dateR=new Rule().getDateReal();
		String place=this.getPara("site");
		Calendar c=Calendar.getInstance();
		List<Record> c1=Db.find("select * from agreement where workId='"+getSessionAttr("id")+"'");
		List<Record> c2=Db.find("select * from signRule");
		List<Record> c5=Db.find("select * from sign where workId='"+getSessionAttr("id")+"' and time='"+new Rule().getDateReal()+"' and signMorning is not null");
		List<Record> c6=Db.find("select * from sign where workId='"+getSessionAttr("id")+"' and time='"+new Rule().getDateReal()+"' and signAfter is not null");
		List<Record> c7=Db.find("select * from apply where applyTime='"+dateR+"' and userId=(select userId from userm where name='"+getSessionAttr("name")+"')"
				+ " and state='审核通过' and mark='2'");
			String mt=c2.get(0).get("startT")+"";
			String at=c2.get(0).get("endT")+"";
			
			String site=c2.get(0).get("site");
			String[] sitearr=site.split(";");
			String date=c2.get(0).get("signDate");
			String[] dateArray=date.split(",");
			boolean dBool=false;
			for(int i=0;i<dateArray.length;i++) {
				if(dateArray[i].equals(dateR))
					dBool=true;
			}
			if(!dBool) {
				Map map=new HashMap();
				 map.put("error", "非工作日不需签到");
				 renderJson(map);
			}
			else if(c.get(Calendar.HOUR_OF_DAY)<12) {
//				上午签到
//				查询当天是否请假
				List<Record> c3=Db.find("select * from apply where applyTime='"+dateR+"' and userId=(select userId from userm where name='"+getSessionAttr("name")+"') and state='审核通过'");
				SimpleDateFormat ft=new SimpleDateFormat("HH:mm:ss");
				Date t = ft.parse(mt);
	    		Calendar mtime=Calendar.getInstance();
	    		mtime.setTime(t);
	    		int mh=mtime.get(Calendar.HOUR_OF_DAY)-8;
	    		Record userm;
	    		if(c3.size()>0) {
	    			String s=c3.get(0).getStr("mark");
	    			if(s.equals("0")) {
//	    				上午请假
	    				userm=new Record().set("state", "正常");		
//	    	    			
	    				 Db.save("sign", userm);
	    			}else if(s.equals("2")) {
	    				userm=new Record().set("state", "正常");
	    				 Db.save("sign", userm);
	    			}
	    		}else {//未请假site.equals(place)
	    			if(!new Rule().area(sitearr, place)) {
//    	    			判断地区
    	    			userm=new Record().set("state", "地区异常");
    	    		}else {
    	    			System.out.print(mh+"  "+c.get(Calendar.HOUR_OF_DAY));
//    	    			判断时间
    	    			if(((mh==c.get(Calendar.HOUR_OF_DAY))&&(mtime.get(Calendar.MINUTE)>c.get(Calendar.MINUTE))) || (mh>c.get(Calendar.HOUR_OF_DAY))) {
    						userm=new Record().set("state", "正常");
    					}else {
    						userm=new Record().set("name", getSessionAttr("name")).set("state", "迟到异常");
    					}	
    	    		}			
    			    Db.save("sign", userm);
	    		}
	    		Map map=new HashMap();
				map.put("message", "签到成功");
				renderJson(map);
			}else {
//				下午签到
				SimpleDateFormat ft=new SimpleDateFormat("HH:mm:ss");
				Date t = ft.parse(at);
	    		Calendar atime=Calendar.getInstance();
	    		atime.setTime(t);
	    		int ah=atime.get(Calendar.HOUR_OF_DAY)-8;
				List<Record> covers=Db.find("select * from sign where workId='"+getSessionAttr("id")+"' and time='"+new Rule().getDateReal()+"'");
				List<Record> c3=Db.find("select * from apply where applyTime='"+dateR+"' and userId=(select userId from userm where name='"+getSessionAttr("name")+"') and state='审核通过'");
				if(covers.size()>0) {
//					如果上午已经签到
					Record pos1=new Record();
					if(c3.size()>0) {
						String s=c3.get(0).getStr("mark");
						if(s.equals("1")) {
//							下午请假
							pos1=Db.findById("sign", covers.get(0).getInt("id")).set("state", "正常");
						}else if(s.equals("2")) {
							pos1=Db.findById("sign", covers.get(0).getInt("id")).set("state", "正常");
						}
					}else {
						if(!new Rule().area(sitearr, place)) {
//			    			判断地区
							pos1=Db.findById("sign", covers.get(0).getInt("id")).set("state", "地区异常");
			    		}else {
			    			System.out.print(ah+"  "+c.get(Calendar.HOUR_OF_DAY));
			    			if(((ah==c.get(Calendar.HOUR_OF_DAY))&&(atime.get(Calendar.MINUTE)<c.get(Calendar.MINUTE))) || (ah<c.get(Calendar.HOUR_OF_DAY))) {
//								判断时间是否异常
								if(!covers.get(0).get("state").equals("正常"))
									pos1=Db.findById("sign", covers.get(0).getInt("id")).set("state", "异常");
								else
									pos1=Db.findById("sign", covers.get(0).getInt("id")).set("state", "正常");
							}else
								pos1=Db.findById("sign", covers.get(0).getInt("id")).set("state", "早退异常");	
			    		}		
					}
																	 
					 Db.update("sign",pos1);
				}else {
//					上午未签到
					Record userm;
					
					if(c3.size()>0) {
						String s=c3.get(0).getStr("mark");
						if(s.equals("1")) {
//							下午请假但上午未签到
							userm=new Record().set("state", "旷工异常").set("time", new Rule().getDateReal());
							Db.save("sign", userm);
						}
						if(s.equals("2")) {
							userm=new Record().set("state", "正常").set("time", new Rule().getDateReal());
									Db.save("sign", userm);
						}
						if(s.equals("0")) {
//							上午请假
							if(!new Rule().area(sitearr, place)) {
//				    			判断地区
								userm=new Record().set("state", "地区异常").set("time", new Rule().getDateReal());
										Db.save("sign", userm);
				    		}else {
				    			if((ah<c.get(Calendar.HOUR_OF_DAY))&&(atime.get(Calendar.MINUTE)<c.get(Calendar.MINUTE))) {
//									判断时间是否异常
				    				userm=new Record().set("state", "正常").set("time", new Rule().getDateReal());
											Db.save("sign", userm);
								}else {
									userm=new Record().set("state", "早退异常").set("time", new Rule().getDateReal());
									Db.save("sign", userm);
								}
										
				    		}	
						}
					}
					else {
//						未请假
						userm=new Record().set("state", "旷工异常").set("time", new Rule().getDateReal());
						Db.save("sign", userm);
					}
				}
				Map map=new HashMap();
				map.put("message", "签到成功");
				renderJson(map);		    
		}		
	}
系统自动处理全天未签的情况 

        try {
			List<Record> c=Db.find("select workId from agreement a where a.state in ('在职','实习','试用') order by workId asc");
			List<String> l=new ArrayList();
			List<String> l1=new ArrayList();
			List<String> finalL=new ArrayList();
			for(int i=0;i<c.size();i++) {
//				全部需要处理的工号
				l.add(c.get(i).getStr("workId"));
			}
//			处理签到日期
			String st = null;
			try {
				st = new Rule().getDateReal();
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			SimpleDateFormat ft=new SimpleDateFormat("yyyy-MM-dd");
			Date start = null;
			try {
				start = ft.parse(st);
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			Calendar cc=Calendar.getInstance();
		 	cc.setTime(start);
		 	cc.add(Calendar.YEAR, 0);
		    cc.add(Calendar.MONTH, 0);
		    cc.add(Calendar.DAY_OF_YEAR, -1);
		    String t=ft.format(cc.getTime());
//			查询已签到的工号
			List<Record> c1=Db.find("select workId from sign where time='"+t+"' order by workId asc");
//			查询请假的工号
			List<Record> c2=Db.find("select workId from apply a,userm u,agreement ag where applyTime='"+t+"' and a.state='审核通过'"
					+ " and a.userId=u.id and u.id=ag.userId order by workId asc");
			int a=0,b=0;
			for(int i=0;i<c1.size();i++) {
				l1.add(c1.get(i).getStr("workId"));
			}
			for(int i=0;i<c2.size();i++) {
				if(!l1.contains(c2.get(i).getStr("workId")))
					l1.add(c2.get(i).getStr("workId"));
			}
//			对不需操作的工号进行排序
			l1.sort((t1,t2)->t1.toString().compareTo(t2.toString()));
			int flag=0;
			for(int i=0;i<l.size();i++) {
				flag=0;
				for(int j=0;j<l1.size();j++) {
					if(l.get(i).equals(l1.get(j)))
						{flag=1;break;}
				}
				if(flag==0) finalL.add(l.get(i));
			}
//			处理全天未签到的情况
			for(int i=0;i<finalL.size();i++) {
				c1=Db.find("select name,a.id as aid from agreement a,userm u where workId='"+finalL.get(i)+"' and a.userId=u.id");
				Record userm=new Record().set("name",c1.get(0).get("name")).set("state","旷工异常");
			    Db.save("sign", userm);
			}

前端

sign(){//进行签到并添加参数
            this.getRequest('/sign/signSubmit?site='+window.sessionStorage.getItem('place')).then(resp=>{
                if(resp.message)
                    Message.success({message:resp.message});
                if(resp.error)
                    Message.error({message:resp.error});
            })
        }
系统自动延时并刷新信息
 created(){
//设置自动延时并刷新界面
        window.setInterval(()=>{
            setTimeout(this.getMessage(),0);
        },20000);
    }

3.查询考勤数据 
界面设计

<el-table v-if="(myrole=='admin')||(myrole=='userHuman')||(role=='admin2')" :data="tableDataW" style="width:60%;margin-top:10px" stripe border size="small">
                <el-table-column type='selection' width="55"></el-table-column>
                <el-table-column prop="id" label="工号" width="65"></el-table-column>
                <el-table-column prop="name" label="姓名" width="70"></el-table-column>
                <el-table-column prop="pos" label="职位" width="100"></el-table-column>
                <el-table-column prop="state" label="签到状态" width="100">
                     <template slot-scope="scope">
                        <el-tag type="success" v-if="scope.row.state=='正常'" >{{scope.row.state}}</el-tag>
                        <el-tag type="danger" v-else >{{scope.row.state}}</el-tag>
                    </template>
                </el-table-column>
                <el-table-column prop="signM" label="上午签到时间" width="150"></el-table-column>
                <el-table-column prop="signY" label="下午签到时间"></el-table-column>  
        </el-table>

前端处理

workSearch(){//查询签到情况          
            if(this.wdate&&(this.userDep!='选择部门')){
                this.getRequest('/apply/selApplyStatus?wdate='+this.wdate+'&dept='+this.userDep).then(resp=>{
                    if(resp){
                        this.tableDataW=JSON.parse(resp.json);
                    }
                })
            }else if(this.wdate&&(this.userDep=='选择部门')){
                this.getRequest('/apply/selApplyStatus?wdate='+this.wdate+'&dept='+this.userDep).then(resp=>{
                    if(resp){
                        this.tableDataW=JSON.parse(resp.json);
                    }
                })  
            }
        }

后端代码 

public void selApplyStatus() {//查询各部门在某天的考勤情况
		 String date=this.getPara("wdate");
		 String myrole=this.getPara("myrole");
		 String dept=this.getPara("dept");
		 List<Record> covers = null;
		 List<Record> c;
		 if(dept.equals("选择部门"))
			 c=Db.find("select id from department where pName='"+getSessionAttr("dept")+"'");
		 else c=Db.find("select id from department where pName='"+dept+"'");
		 if(dept.equals("选择部门"))
			 {covers=Db.find("select s.*,a.workId as i,p.name,u.name as n,a.userId from agreement a left join sign s on a.id=s.agreeId left join position p on a.posId=p.id left join userm u on a.userId=u.id where a.deptId="+c.get(0).getStr("id")+" "
		 		+ "and s.time='"+date+"' and a.posRole='user' order by field(s.state,'正常','迟到异常','早退异常','旷工异常','地点异常'),a.workId");}
		 else {
			 covers=Db.find("select s.*,a.workId as i,p.name,u.name as n,a.userId from agreement a left join sign s on a.id=s.agreeId left join position p on a.posId=p.id left join userm u on a.userId=u.id where a.deptId="+c.get(0).getStr("id")+" "
				 		+ "and s.time='"+date+"' order by field(s.state,'正常','迟到异常','早退异常','旷工异常','地点异常'),a.workId");
		 }
		 String re="[";
		 for(int i=0;i<covers.size();i++) {
			 re+="{"+"\"id\":\""+covers.get(i).get("i")+"\","+
			        	"\"name\":\""+covers.get(i).get("n")+"\","+
			        	"\"pos\":\""+covers.get(i).get("name")+"\","+"\"signM\":\""+covers.get(i).getStr("signMorning")+"\","+
			        	"\"signY\":\""+covers.get(i).get("signAfter")+"\","+"\"state\":\""+covers.get(i).get("state")+"\"}";
			        	if(i!=(covers.size()-1)) re+=",";
		 }
		 Map map=new HashMap();
		 map.put("json", re+"]");
		 renderJson(map);
	 }

 .

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

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

相关文章

Xilinx UltraScale系列FPGA纯verilog图像缩放,工程项目解决方案,提供2套工程源码和技术支持

目录 1、前言工程概述免责声明FPGA高端图像处理培训 2、相关方案推荐我这里已有的FPGA图像缩放方案本方案在Xilinx Artix7 系列FPGA上的应用本方案在Xilinx Kintex7 系列FPGA上的应用本方案在Xilinx Zynq7000 系列FPGA上的应用本方案在国产FPGA紫光同创系列上的应用本方案在国产…

Python OpenCV精讲系列 - 目标检测与识别深入理解(二十)

&#x1f496;&#x1f496;⚡️⚡️专栏&#xff1a;Python OpenCV精讲⚡️⚡️&#x1f496;&#x1f496; 本专栏聚焦于Python结合OpenCV库进行计算机视觉开发的专业教程。通过系统化的课程设计&#xff0c;从基础概念入手&#xff0c;逐步深入到图像处理、特征检测、物体识…

java ---- 关于接口的常见面试题

&#x1f680; 个人简介&#xff1a;某大型国企资深软件开发工程师&#xff0c;信息系统项目管理师、CSDN优质创作者、阿里云专家博主&#xff0c;华为云云享专家&#xff0c;分享前端后端相关技术与工作常见问题~ &#x1f49f; 作 者&#xff1a;码喽的自我修养&#x1f9…

前端学习-css的元素显示模式(十五)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 什么是元素显示模式 块元素 常见的块元素 块元素的特点 注意 行内元素 行内元素的特点 注意 行内块元素 行内块元素的特点 元素显示模式的转换 语法格…

决策智能与强化学习:重放比率(replay ratio)

知乎&#xff1a;DILab决策实验室&#xff08;已授权&#xff09;链接&#xff1a;https://zhuanlan.zhihu.com/p/898641863 0. 概览 近年来&#xff0c;深度强化学习&#xff08;Deep Reinforcement Learning, DRL&#xff09;在诸多领域取得了显著的成果。然而&#xff0c;随…

01电力电子技术介绍

电力电子技术介绍 介绍 讲到电力电子技术就要先说说一位老先生&#xff0c;他就是威廉纽厄尔&#xff08;William Newell&#xff09;。1972年&#xff0c;他在美国杜克大学首次提出了电力电子的概念。电力电子的概念可以表示为一个倒三角的关系。 首先&#xff0c;我们看到电…

C# WinForm实现画笔签名及解决MemoryBmp格式问题

目录 需求 实现效果 开发运行环境 设计实现 界面布局 初始化 画笔绘图 清空画布 导出位图数据 小结 需求 我的文章 《C# 结合JavaScript实现手写板签名并上传到服务器》主要介绍了 web 版的需求实现&#xff0c;本文应项目需求介绍如何通过 C# WinForm 通过画布画笔…

Gitxray:一款基于GitHub REST API的网络安全工具

关于Gitxray Gitxray是一款基于GitHub REST API的网络安全工具&#xff0c;支持利用公共 GitHub REST API 进行OSINT、信息安全取证和安全检测等任务。 Gitxray&#xff08;Git X-Ray 的缩写&#xff09;是一款多功能安全工具&#xff0c;专为 GitHub 存储库而设计。它可以用于…

NASA:ARCTAS 区域的二级 FIRSTLOOK 气溶胶产品子集。 它包含气溶胶光学深度和粒子类型,以及相关的大气数据

目录 简介 信息 代码 引用 网址推荐 知识星球 机器学习 MISR L2 FIRSTLOOK Aerosol Product subset for the ARCTAS region V001 简介 这是 ARCTAS 区域的二级 FIRSTLOOK 气溶胶产品子集。 它包含气溶胶光学深度和粒子类型&#xff0c;以及相关的大气数据&#xff0c;…

基于Segment Anything 模型的智能抠图开发的产品原型,基于官网案例升级改造

最近在研究图像处理的过程中&#xff0c;接触到了Mate开源的 Segment Anything模型&#xff0c;花点时间研究了一番&#xff0c;之前也写了一篇部署模型的教程&#xff0c;感兴趣的同学可以查看一下之前的文章 基于丹摩DAMODEL部署Segment Anything 模型&#xff0c;智能分割一…

多模态模型架构的演进

人工智能咨询培训老师叶梓 转载标明出处 多模态学习正成为连接不同类型数据&#xff08;如图像、文本、音频等&#xff09;的桥梁。随着深度学习技术的发展&#xff0c;多模态模型在理解和处理跨领域数据方面表现出了显著的效能。来自普渡大学、混沌工业公司、斯坦福大学和亚马…

ICM20948 DMP代码详解(80)

接前一篇文章:ICM20948 DMP代码详解(79) 本回继续对“上半场”即ICM20948传感器各寄存器初始化状态进行回顾复盘。 接下来是 icm20948_sensor_setup() ---> icm20948_set_fsr() ---> inv_icm20948_set_fsr() ---> inv_icm20948_set_accel…

ARM 之十九 详解 Semihosting、SWO 以及在 MDK-ARM、IAR、Eclipse、SEGGER-ES 的使用

在嵌入式系统开发中&#xff0c;我们通常会将标准输入输出作为一个控制台功能添加到我的嵌入式应用程序中。这样我就有了一个命令行接口&#xff0c;可以检查和修改目标系统。在 ARM 架构中&#xff0c;Semihosting 和 SWO 是经常会遇到的两个概念&#xff0c;在调试输出方面也…

python+appium+雷电模拟器安卓自动化及踩坑

一、环境安装 环境&#xff1a;window11 1.1 安装Android SDK AndroidDevTools - Android开发工具 Android SDK下载 Android Studio下载 Gradle下载 SDK Tools下载 这里面任选一个就可以&#xff0c;最终下载完主要要安装操作安卓的工具adb&#xff0c;安装这个步骤的前提是要…

MarsCode--字符串有多少种可能性【简单】

问题描述 给定一个数字&#xff0c;我们按照如下规则把它翻译为字符串&#xff1a;0 翻译成 “a” &#xff0c;1 翻译成 “b”&#xff0c;……&#xff0c;11 翻译成 “l”&#xff0c;……&#xff0c;25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数&#x…

[翻译]MOSIP Blue Book

目录 Preface&#xff08;前言&#xff09; Executive summary&#xff08;执行摘要&#xff09; 1 Introduction&#xff08;介绍/序言&#xff09; 1.1 Principles on Identification&#xff08;识别原则&#xff09; 1.2 Need for a Foundational ID&#xff08;需要基…

【Java进阶】Java进阶-手撕java agent

文章目录 Java Agent一、定义与工作原理二、主要特点三、应用场景四、使用注意事项 Java Agent相关接口1. Instrumentation接口2. ClassFileTransformer接口3. 其他相关类和接口 手写一个Java Agent1. 编写Java Agent代码2. 编写MANIFEST.MF文件3. 编译代码并打包成JAR文件4. 运…

JavaWeb——Maven(2/8):概述-介绍安装(步骤、具体操作、测试)

目录 介绍 安装 步驟 具体操作 测试 主要讲解两个方面&#xff1a;Maven的介绍以及Maven的安装。 先来介绍一下没问当中的一些概念和模型。 介绍 Apache Maven是一个项目管理和构建工具&#xff0c;它基于项目对象模型&#xff08;POM&#xff1a;project object model…

Java | Leetcode Java题解之第477题汉明距离总和

题目&#xff1a; 题解&#xff1a; class Solution {public int totalHammingDistance(int[] nums) {int ans 0, n nums.length;for (int i 0; i < 30; i) {int c 0;for (int val : nums) {c (val >> i) & 1;}ans c * (n - c);}return ans;} }

基于Flink+Hologres搭建实时数仓

Apache Paimon是一种流批统一的数据湖存储格式&#xff0c;结合Flink及Spark构建流批处理的实时湖仓一体架构。Paimon创新地将湖格式与LSM技术结合起来&#xff0c;给数据湖带来了实时流更新以及完整的流处理能力。借助实时计算Flink版与Apache Paimon&#xff0c;可以快速地在…