当前位置: 首页 > news >正文

vue项目实现会议预约(包含某天的某个时间段和某月的某几天)

一、一天的时间段预约

在这里插入图片描述

会议预约有以下操作:
1.点击预约按钮,弹窗最近一周的预约时间点(半小时一个点),预约时间为5:00到24:00;
2.超过当前时间的时间点不允许再预约,已经预约的时间不允许再预约,预约的时间段内有已经预约的时间点不允许预约;
3.预约时间为时间段,所以最少包含两个时间点,选中两个时间点时,两个时间点被选中,若两个时间点内有其他时间点,其他时间点也要被选中;
4.已经选中的时间点再次点击时,取消选中,

html部分

<el-dialog title="预约"  :visible.sync="isAppoint" width="40%" :before-close="closeAppoint"><el-form label-width="120px" :model="appointForm"><div style="margin:20px;"><div style="display:flex;justify-content:space-between;"><span v-for="(item,index) in week" :key="index" :class="{'top_style':item.is_active==0,'top_active':item.is_active==1}" @click="changWeek(item,index)"><div style="height:25px;line-height:20px;">{{item.month}}-{{item.date}}</div><div style="height:25px;line-height:20px;">{{item.day}}</div></span></div><div style="display:flex;margin:20px 50px;font-size:18px;justify-content:space-between;"><div style="display:flex;"><div style="background-color:#C8C9CC;width:40px;height:20px;margin-right:10px;"></div><div>不可预约</div></div><div style="display:flex;"><div style="background-color:#ffa4a4;width:40px;height:20px;margin-right:10px;"></div><div>已有预约</div></div><div style="display:flex;"><div style="background-color:#3EA7F1;width:40px;height:20px;margin-right:10px;"></div><div>当前预约</div></div></div><div style="margin:20px 50px;height:250px" class="button_wrap"><el-button v-for="(item,index) in timeArr" :key="index" @click="changTime(item,index)" :type="item.status==0?'':item.status==1?'danger':item.status==2?'info':'primary'" :disabled="item.status==1||item.status==2" class="button_style">{{item.time}}</el-button></div></div><el-row :gutter="20"><el-col :span="18"><el-form-item label="备注:"><el-input placeholder="请输入" v-model="remark" clearable></el-input></el-form-item></el-col></el-row></el-form><div slot="footer" class="dialog-footer" ><el-button @click="closeAppoint">取消</el-button><el-button type="primary" @click="saveAppoint" style="margin-left:20px;">确定</el-button></div></el-dialog>

css部分

.top_style,.top_active{border:1px solid #AAA;padding:3px 20px;text-align:center;
}
.top_active{border-color:#02A7F0;color: #02A7F0;
}
.button_style{text-align:center;float:left;width: 80px;
}

js部分

1.点击预约时,记录下会议id及name位置id及name,并把会议id当前时间(0点~24点)传过去,后台需要根据时间返回时间点数组

	//预约addAppoint(val){this.isAppoint=true;this.appointAreaId=val.appointAreaId;this.appointAreaName=val.appointAreaName;this.positionId=val.positionId;this.positionName=val.positionName;this.getAppoint();let formData={appointAreaId:val.appointAreaId,startTime:this.getYMD(new Date())+' '+'00:00:00',endTime:this.getYMD(new Date())+' '+'23:59:59'}this.getAppointed(formData);},//每次打开预约弹窗时,默认选中当天getAppoint(){let arr = []for (let i = 0; i < 7; i++) {arr.push(this.dealTime(i))}arr[0].is_active=1;this.week=arr;this.dateNow=this.week[0].full;},

2.获取时间数组

//获取时间数组getAppointed(formData){appointTime(formData).then(res=>{this.timeArr=res.data.data;if(res.data.code==200){this.timeArr=res.data.data;}})},

时间数组格式为:时间点+状态;未选中状态为0,已经预约过的状态为1,不可预约(过期时间)的状态为2,当前预约(即点击时选中)的状态为3(这个状态为点击时判断,不要接口返回)
在这里插入图片描述
3.处理未来七天的函数

// 处理未来七天的函数dealTime(num){let time = new Date() // 获取当前时间日期let date = new Date(time.setDate(time.getDate() + num)).getDate() //这里先获取日期,在按需求设置日期,最后获取需要的let newDate=(date.toString()).padStart(2,"0");let month = time.getMonth() + 1 // 获取月份let newMonth=(month.toString()).padStart(2,"0");let day = time.getDay() //  获取星期let year=time.getFullYear();let full=year+'-'+month+'-'+date;switch (day) { //  格式化case 0:day = "星期日"breakcase 1:day = "星期一"breakcase 2:day = "星期二"breakcase 3:day = "星期三"breakcase 4:day = "星期四"breakcase 5:day = "星期五"breakcase 6:day = "星期六"break}let obj = {date: newDate,day: day,is_active: 0,month: newMonth,year:year,full:full,}return obj // 返回对象},

4.点击切换星期状态

//点击切换星期状态changWeek(val,index){for(let i=0;i<this.week.length;i++){this.week[i].is_active=0;}//星期切换时,其他星期状态重置为0,即未选中,当前星期状态为1,即选中this.week[index].is_active=1;let formData={appointAreaId:this.appointAreaId,startTime:val.full+' '+'00:00:00',endTime:val.full+' '+'23:59:59'};this.dateNow=val.full;//dateNow为当前选中时的日期(年月日)this.getAppointed(formData)},

5.选中时间点时,判断状态及改变状态

//选中时间点时,判断状态及改变状态
//appointTimeArr 保存点击的按钮的数组,即当前选中数组changTime(val,index){//当前选中数组的长度小于2时,即点击了1次、2if(this.appointTimeArr.length<2){this.timeArr[index].status=3;点击按钮的状态设为3,即当前选中this.appointTimeArr.push(index);//当前选中数组的长度为2,即点击了2if(this.appointTimeArr.length==2){//选中数组的俩个下标一样时,即同一个时间点点击了两次,即取消选中,则把状态都重置为0,并且清空选中数组if(this.appointTimeArr[0]==this.appointTimeArr[1]){this.timeArr[this.appointTimeArr[0]].status=0;this.appointTimeArr=[];}else{//选中数组的两个下下标不一样时,对数组进行排序,顺序排序,如若是[3,2]则改为[2,3],开始时间点和结束时间点this.appointTimeArr=this.appointTimeArr.sort(function(a,b){return a-b});//求出开始时间和结束时间之间选中的时间点个数,let len=this.appointTimeArr[1]-this.appointTimeArr[0];//根据个数,把选中时间段内的时间的状态都改为3,即当前选中for(let i=0;i<len;i++){//将下选中数组内容的下标与时间数组的下标状态进行比对,若是有状态等于1的,即已有预约,则做出提示,并且把开始时间点和结束时间点重置为空,循环终止if(this.timeArr[this.appointTimeArr[0]+i].status==1){this.$message.warning("已预约过的时间不允许预约!")this.timeStart='';this.timeEnd='';break}else{将最终获取到的选中数组下标与时间数组进行比对,获取开始时间点和结束时间点,并且状态改为3,即当前选中this.timeArr[this.appointTimeArr[0]+i].status=3;this.timeStart=this.timeArr[this.appointTimeArr[0]].time;this.timeEnd=this.timeArr[this.appointTimeArr[1]].time;}}}}}else if(this.appointTimeArr.length=3){//当前选中数组的长度等于3时,即点击了3次,则把前两个状态改为0,即未选中,把第三次点击时的状态设为3,即当前选中for(let i=0;i<this.timeArr.length;i++){if(this.timeArr[i].status===3){this.timeArr[i].status=0;}}this.appointTimeArr=[];this.appointTimeArr.push(index);this.timeArr[index].status=3;}},

6.保存

saveAppoint(){//保存时,开始时间点和结束时间点必须存在,即选中数组的长度为2,否则做出提示,并且将选中的下标对赢得时间点状态重置为0,即未选中if(this.timeStart!=''&&this.timeEnd!=''){this.appointForm.appointAreaId=this.appointAreaId;this.appointForm.appointAreaName=this.appointAreaName;this.appointForm.positionId=this.positionId;this.appointForm.positionName=this.positionName;this.appointForm.remark=this.remark;//对开始时间和结束时间进行拼接,即当前选中星期对应的日期+当前选中时间点this.appointForm.startTime=this.dateNow+' '+this.timeStart;this.appointForm.endTime=this.dateNow+' '+this.timeEnd;appoint(this.appointForm).then(res=>{if(res.data.code==200){this.$message.success(res.data.message)this.remark='';this.isAppoint=false;this.isMeeting=falsethis.getList();}else{this.$message.error(res.data.message)}})}else{this.$message.error("请选择预约时间")for(let i=0;i<this.timeArr.length;i++){if(this.timeArr[i].status==2){this.timeArr[i].status=0}}}},

7.弹窗关闭

closeAppoint(){this.isAppoint=false//弹窗关闭时,星期重置,默认选中星期数组的第一个,即当前日期对应的星期;重置备注;重置当前星期对应的时间数组中的状态为3的时间点状态为0,即未未选中for(let i=0;i<this.week.length;i++){this.week[i].is_active=0;}this.week[0].is_active=1;this.remark='';for(let i=0;i<this.timeArr.length;i++){if(this.timeArr[i].status==3){this.timeArr[i].status=0;}}},

二、一月的天数预约(最少一天)

在这里插入图片描述

1.时间数组同样由后端返回,把每月的第一天和最后一天传给后端,后端接口返回日期数组
格式也是time+status,0代表未选中,1代表已有预约,2代表不可预约,3代表当前选中
2.与时间点预约不同的是,天数预约可以选择一个时间点即某个月的某一天,其他的逻辑基本都差不多了,剩下的就是一些代码的不同了
3.天数预约比较有意思的就是会用到日历!没错就是日历,一开始是想着使用一些什么日历插件的,但是考虑到日历插件能满足我目前需求的可能性不大,所以只好想着给他画出来!哈哈,去百度了亿篇博客,然后自己再汇总+修改,so,手绘的日历出来了,切换月份啊,显示数据啊都么得问题的,嘿嘿,针不戳针不戳~
在这里插入图片描述

html

<el-dialog title="预约"  :visible.sync="isAppoint" width="40%" :before-close="closeAppoint"><el-form label-width="120px" :model="appointForm"><div class="calender"><div class="calender_title"><div class="arrow arrow-left" @click="prev()">&lt;</div><div class="data">{{ currentYear }}-{{ currentMonthChinese }}</div><div class="arrow arrow-right" @click="next()">></div></div><div class="calender_content"><div class="row title"><span class="title_span" v-for="item in title" :key="item">{{item}}</span></div><div class="row content"><span style="margin-bottom:5px;width:60px;margin-left:10px;" class="button_no" v-for="(item,index) in prevDays" :key="index+'a'"></span><el-button class="content_button" v-for="(item,index) in timeArr" :key="index" @click="changTime(item,index)" :type="item.status==0?'':item.status==1?'danger':item.status==2?'info':'primary'" :disabled="item.status==1||item.status==2">{{index+1 }}</el-button></div></div></div><div class="button_wrap"><div style="display:flex;"><div style="background-color:#C8C9CC;width:40px;height:20px;margin-right:10px;"></div><div>不可预约</div></div><div style="display:flex;"><div style="background-color:#ffa4a4;width:40px;height:20px;margin-right:10px;"></div><div>已有预约</div></div><div style="display:flex;"><div style="background-color:#3EA7F1;width:40px;height:20px;margin-right:10px;"></div><div>当前预约</div></div></div><el-row style="width:500px;margin:0 auto;"><el-col><el-form-item label="备注:" label-width="60px"><el-input placeholder="请输入" v-model="remark" clearable></el-input></el-form-item></el-col></el-row></el-form><div slot="footer" class="dialog-footer" ><el-button @click="closeAppoint">取消</el-button><el-button type="primary" @click="saveAppoint" style="margin-left:20px;">确定</el-button></div></el-dialog>

js

data(){reurn{appointForm:{},//预约isAppoint:false,//appointAreaId:'',//预约的路演厅idappointAreaName:'',//预约的路演厅nameremark:'',//备注appointTimeArr:[],//预约选中时间数组title: ["日", "一", "二", "三", "四", "五", "六"],timeArr:[],dateNow:'',//预约年月timeStart:'',//预约开始日期timeEnd:'',//预约结束日期currentDay: new Date().getDate(),currentMonth: new Date().getMonth(),currentYear: new Date().getFullYear(),}
}computed: {// 获取中文的月份    显示:8currentMonthChinese() {return new Date(this.currentYear, this.currentMonth).toLocaleString("default",{ month: "short" });},currentDays() {// Date中的月份是从0开始的return new Date(this.currentYear, this.currentMonth + 1, 0).getDate();},prevDays() {// 获取上个月的最后一行的日期let data = new Date(this.currentYear, this.currentMonth, 0).getDate();let num = new Date(this.currentYear, this.currentMonth, 1).getDay();var days = [];while (num > 0) {days.push(data--);num--;}return days.sort();},},methods:{/* 以下日历相关*///日历点击事件changTime(val,index){if(this.appointTimeArr.length<2){this.timeArr[index].status=3;this.appointTimeArr.push(index);if(this.appointTimeArr.length==1){this.timeStart=this.appointTimeArr[0];this.timeEnd=this.appointTimeArr[0];}else if(this.appointTimeArr.length==2){if(this.appointTimeArr[0]==this.appointTimeArr[1]){this.timeArr[this.appointTimeArr[0]].status=0;this.appointTimeArr=[];}else{this.appointTimeArr=this.appointTimeArr.sort(function(a,b){return a-b});let len=this.appointTimeArr[1]-this.appointTimeArr[0];for(let i=0;i<len;i++){if(this.timeArr[this.appointTimeArr[0]+i].status==1){this.$message.warning("已预约过的时间不允许预约!")this.timeStart='';this.timeEnd='';break}else{this.timeArr[this.appointTimeArr[0]+i].status=3;this.timeStart=this.timeArr[this.appointTimeArr[0]].time;this.timeEnd=this.timeArr[this.appointTimeArr[1]].time;}}}}}else if(this.appointTimeArr.length=3){for(let i=0;i<this.timeArr.length;i++){if(this.timeArr[i].status===3){this.timeArr[i].status=0;}}this.appointTimeArr=[];this.appointTimeArr.push(index);this.timeArr[index].status=3;}},//点击左侧箭头prev() {// 点击上个月,若是0月则年份-1// 01  1112if (this.currentMonth == 0) {this.currentYear -= 1;this.currentMonth = 11;} else {this.currentMonth--;}let date=this.currentYear+'-'+(this.currentMonth+1);let formData={appointAreaId:this.appointAreaId,startTime:this.getFirst(date)+' '+"00:00:00",endTime:this.getLast(date)+' '+"23:59:59"}this.dateNow=date;this.getAppointed(formData)},//点击右侧箭头next() {if (this.currentMonth == 11) {this.currentYear++;this.currentMonth = 0;} else {this.currentMonth++;}let date=this.currentYear+'-'+(this.currentMonth+1);let formData={appointAreaId:this.appointAreaId,startTime:this.getFirst(date)+' '+"00:00:00",endTime:this.getLast(date)+' '+"23:59:59"}this.dateNow=date;this.getAppointed(formData)},/* 以上日历相关*/getYM(time){let date = new Date(time)let Str=date.getFullYear() + '-' +(date.getMonth() + 1)return Str},getFirst(time){let date = new Date(time)let Str=date.getFullYear() + '-' +(date.getMonth() + 1) + '-' + date.getDate()return Str},getLast(time){var y = new Date(time).getFullYear(); //获取年份var m = new Date(time).getMonth() + 1; //获取月份var d = new Date(y, m, 0).getDate(); //获取当月最后一日let Str=y + '-' +m + '-' + dreturn Str},//获取时间数组getAppointed(formData){appointTime(formData).then(res=>{this.timeArr=res.data.data;if(res.data.code==200){this.timeArr=res.data.data;}})},//预约addAppoint(val){this.isAppoint=true;this.appointAreaId=val.appointAreaId;this.appointAreaName=val.appointAreaName;this.positionId=val.positionId;this.positionName=val.positionName;let formData={appointAreaId:val.appointAreaId,startTime:this.getFirst(this.getYM(new Date()))+' '+'00:00:00',endTime:this.getLast(this.getYM(new Date()))+' '+'23:59:59'}this.dateNow=this.getYM(new Date());this.getAppointed(formData);},saveAppoint(){if(this.timeStart!=''&&this.timeEnd!=''){this.appointForm.appointAreaId=this.appointAreaId;this.appointForm.appointAreaName=this.appointAreaName;this.appointForm.positionId=this.positionId;this.appointForm.positionName=this.positionName;this.appointForm.remark=this.remark;this.appointForm.startTime=this.timeStart+' '+"00:00:00";this.appointForm.endTime=this.timeEnd+' '+"23:59:59";appoint(this.appointForm).then(res=>{if(res.data.code==200){this.$message.success(res.data.message)this.remark='';this.currentDay=new Date().getDate();this.currentMonth=new Date().getMonth();this.currentYear=new Date().getFullYear();this.isAppoint=false;this.isMeeting=falsethis.getList();}else{this.$message.error(res.data.message)}})}else{this.$message.error("请选择预约时间")for(let i=0;i<this.timeArr.length;i++){if(this.timeArr[i].status==3){this.timeArr[i].status=0}}}},closeAppoint(){this.isAppoint=falsethis.remark='';for(let i=0;i<this.timeArr.length;i++){if(this.timeArr[i].status==3){this.timeArr[i].status=0;}}this.currentDay=new Date().getDate();this.currentMonth=new Date().getMonth();this.currentYear=new Date().getFullYear();},
}

css

.button_wrap{margin: 0 auto;width: 480px;display: flex;font-size: 18px;justify-content: space-between;margin-bottom: 20px;
}
.button_no{display: inline-block;line-height: 1;white-space: nowrap;background: #FFFFFF;color: #606266;-webkit-appearance: none;text-align: center;-webkit-box-sizing: border-box;box-sizing: border-box;outline: none;margin: 0;-webkit-transition: 0.1s;transition: 0.1s;font-weight: 400;padding: 12px 20px;font-size: 14px;border-radius: 4px;
}
.calender {width: 500px;height: 300px;margin: 0 auto;// margin-left:50px;
}
.calender_title {display: flex;width: 100%;height: 40px;line-height: 40px;text-align: center;
}
.arrow {width: 50px;height: 100%;
}
.data {font-size: 20px;
}
.title_span {width: calc(100% / 7);text-align: center;height: 40px;line-height: 40px;
}
.row {width: 100%;display: flex;justify-content: space-between;
}.prevDay {color: #fff;background-color: #eee;
}.content_span {width: calc(100% / 7);height: 30px;line-height: 30px;text-align: center;
}
.content_button{margin-bottom:5px;width:60px;margin-left:10px;
}.calender_content {width: 100%;height: 250px;
}
.content {-webkit-box-pack: start;-ms-flex-pack: start;justify-content: flex-start;-ms-flex-wrap: wrap;flex-wrap: wrap;
}

相关文章:

vue项目实现会议预约(包含某天的某个时间段和某月的某几天)

一、一天的时间段预约 会议预约有以下操作&#xff1a; 1.点击预约按钮&#xff0c;弹窗最近一周的预约时间点&#xff08;半小时一个点&#xff09;&#xff0c;预约时间为5:00到24:00; 2.超过当前时间的时间点不允许再预约&#xff0c;已经预约的时间不允许再预约&#xff0c…...

javacv桌面推送 通过推送和拉取udp组播视频流实现

ffmpeg udp 推流拉流命令单播推流E:/工具/ffmpeg/ffmpeg -f gdigrab -r 23 -i desktop -pkt_size 1316 -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f h264 udp://192.168.1.20:5001拉流ffplay -f h264 udp://192.168.1.20:5001 -fflags nobuffer -nofind_strea…...

2022年直播电商成交额,更是达到了24816亿元的成交额

近年来移动网络覆盖率、网速提升&#xff0c;直播行业不在是陌生的行业&#xff0c;直播也诞生了繁多的领域&#xff0c;游戏直播、户外直播等&#xff0c;当然还有今天的主题“直播带货”。直播带货是线上销售模式的一种&#xff0c;由衷是为了更好的把商品展示给用户观看&…...

【学习总结】2023寒假总结

写在前面时光匆匆&#xff0c;白驹过隙&#xff0c;转眼间寒假就过去了&#xff0c;这次寒假可以算的上是最长的一次假期&#xff0c;经历了从疫情到放开&#xff0c;从患病到阳康&#xff0c;在现实与虚幻的世界中玩耍&#xff0c;在痛苦的数据结构中徘徊&#xff0c;在每次早…...

宝塔搭建实战php源码人才求职管理系统后台端thinkphp源码(一)

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 在开源社区里看到了这一套系统&#xff0c;骑士人才系统SE版&#xff0c;搭建测试了&#xff0c;感觉很不错。能够帮助一些想做招聘平台的朋友降低开发成本&#xff0c;就是要注意&#xff0c;想商业使用的话&…...

stk 根据六根数文件生成卫星轨迹(一)

先简单介绍下上面的参数。 Propagator预报轨道模型。 TwoBody为二体&#xff08;开普勒运动模型&#xff09;。HPOP为高精度轨道模型。目前只用到这两个。 下图为六根数参数 Orbit Epoch&#xff1a;为根数时间&#xff08;UTC&#xff09; Semimajor Axis&#xff1a;长半…...

深度学习算法面试常问问题(一)

博主秋招遇到的面试问题以及整理其他面经相关问题&#xff0c;无偿分享~ 项目叙述&#xff1a; 算法需求及应用场景算法的调研和初步方案的制定数据的准备&#xff08;包括数据标注和数据增强&#xff09;算法的介绍&#xff08;包括输入和输出&#xff0c;loss、backbone、训…...

Spring 底层原理与解析 - 容器接口

Spring 底层原理与解析 - 容器接口 BeanFactory 能做哪些事 BeanFactory 与 ApplicaiotnContext 到底是谁提前做完了对象的加载 在之前的一篇关于 Spring 的文章Spring IoC 与容器的初始化中提到过&#xff0c;BeanFactory 接口与 ApplicationContext 接口之间的关系 可以看…...

Compose-Navigation简单案例上手

Navigation 快速上手 下面案例简要展示使用 Compose 版本的 Navigation 库来实现两个页面之间的跳转 这是完整的结构&#xff08;忽略掉红线划过的那个包&#xff09; 安装适用于 kotlin 的 navigation 依赖 dependencies {implementation("androidx.navigation:navigati…...

855. 考场就座

题目 考场就座 在考场里&#xff0c;一排有 N 个座位&#xff0c;分别编号为 0, 1, 2, …, N-1 。 当学生进入考场后&#xff0c;他必须坐在能够使他与离他最近的人之间的距离达到最大化的座位上。如果有多个这样的座位&#xff0c;他会坐在编号最小的座位上。(另外&#xf…...

k8s之ingress(二)

文章目录k8s之ingress1.1、Kubernetes 暴露服务的方式:1.2 基本概念1.3为什么需要Ingress资源1.4 Ingress的工作原理1.5ingress 暴露服务的方式总结k8s之ingress 1.1、Kubernetes 暴露服务的方式: Kubernetes暴露服务的方式目前只有三种&#xff1a;LoadBlancer Service、Nod…...

linux下监测串口数据

在编写上下位机通信代码时&#xff0c;需要分阶段测试&#xff0c;确保下位机&#xff0c;线路&#xff0c;上位机都&#xff2f;&#xff2b;&#xff0e; 一&#xff0e;检查设备数据传出 &#xff11;&#xff0e;确定下位机的串口参数 如果波特率有问题&#xff0c;可能会…...

【面试之闭包】前端面试那些事(2)三分钟深入理解闭包(附详解实例)

目录1、什么是闭包&#xff0c;什么是作用域1.1 变量作用域1.2 闭包是啥&#xff1f;如何改变变量调用格局1.3 闭包的特性2、怎么用闭包&#xff0c;闭包实例应用2.1 常见闭包实例2.2 闭包异步函数的应用2.3 柯里化的应用3、闭包的优缺点3.1 优点3.2 缺点4、片尾彩蛋【写在前面…...

深入浅出带你学习WebSphere中间件漏洞

前言 上一篇文章给大家介绍了中间件glassfish的一些常见漏洞以及利用方法&#xff0c;今天我给大家带来的是WebSphere中间件的常见漏洞以及这些漏洞的利用方法&#xff0c;下面我们首先介绍一下WebSphere中间件是什么&#xff0c;然后展开来讲关于该中间件的漏洞。 WebSphere…...

如何一眼分辨是C还是C++

C语言的历史C语言是由贝尔实验室的Dennis Ritchie在20世纪70年代初开发的一种通用程序设计语言。在早期的计算机时代&#xff0c;许多计算机使用不同的汇编语言编写程序&#xff0c;这导致了程序的可移植性和代码的可重用性很低。因此&#xff0c;Dennis Ritchie在开发C语言时试…...

CMake系列:正确使用多配置编译系统

目录 常见错误 问题现象 正确做法 if指令应该什么时候使用 活学活用 把IF指令用于多配置编译系统是很多初学者容易犯下的错误。这篇文章启示性的教你如何正确理解、使用CMake的多配置编译系统。 常见错误 以Debug和Release配置有不同的宏定义为例&#xff0c;如下所示&a…...

PCB中的HDI板生产中的变化

关键词&#xff1a;HDI概述 HDI发展演变 HDI生产难点如果把一整个电子产业比作浩瀚的宇宙&#xff0c;那些智能电子设备就像宇宙中闪耀的星光&#xff0c;当你以“上帝”的视角手持放大镜去观察时&#xff0c;这些闪烁的星光点点其实都是一个个由精密的“自然规律”所“设计”好…...

程序分析与神经网络后门

原文来自微信公众号“编程语言Lab”&#xff1a;程序分析与神经网络后门 搜索关注“编程语言Lab”公众号&#xff08;HW-PLLab&#xff09;获取更多技术内容&#xff01; 欢迎加入编程语言社区 SIG-程序分析&#xff0c;了解更多程序分析相关的技术内容。 加入方式&#xff1a;…...

redis主从哨兵模式

一.为什么用redis主从模式 1.数据备份:主从复制实现数据的热备份。 2.故障恢复:当主节点出现问题时,由从节点提供服务,实现快速恢复。 3.负载均衡:读写分离,主节点提供写服务,从节点提供读服务。在写少读多时提高Redis的并发。 二.为什么使用哨兵模式 主要用于主节…...

Spring 系列之 MVC

Spring 系列文章目录 文章目录Spring 系列文章目录前言一、介绍二、项目搭建1.创建空项目2.设置maven和lombok3.创建maven web module4. 配置Tomcat启动运行项目&#xff08;选择local本地&#xff09;5. 导入jar依赖包6.在web.xml中配置DispatcherServlet7. 加入SpringMVC的配…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...