uniapp 实现在线签合同/签名/信息认证(无插件依赖)

news2024/11/19 9:38:20

最近项目接到一个新的需求,需要对接一个可以在线签合同的的功能,知道需要后马上开干,经过一番斗争,终于终于下班啦
开个玩笑,废话不多说,直接上代码,因为代码是直接项目中搬出来的,没有依赖其他插件纯手工,小伙伴们要看清除那些是自己需要的,不需要的就删掉啦。

目前只测试小程序 , 其他端需要自己去适配

效果图:
在这里插入图片描述
页面有两个,一个表单提交也需要上传身份证正反面,第二个页面有合同展示,签字面板是以弹窗形式

第一个页面(表单也不需要的可以删除):


<template>
	<view>
		<form @submit="formSubmit">
			<view class="Rboy-box">
				<view class="Rboy-obverse">
					<image class="obverseimg" :src="ALMain_drawing" @click="obverse_btn" mode="aspectFill"></image>
					<input style="display: none;" name="ALMain_drawing" />
					<view class="bottom">
						<text>身份证正面照</text>
					</view>
				</view>
				<view class="Rboy-reverse">
					<image class="reverseimg" :src="ALPicture" @click="reverse_btn" mode="aspectFill"></image>
					<input style="display: none;" name="ALPicture" />
					<view class="bottom">
						<text>身份证反面照</text>
					</view>
				</view>
			</view>
			<view class="Rboy-form">
				<view class="Rboy-form-row">
					<label>姓名</label>
					<view class="form-rowDom"><input placeholder="请输入姓名" disabled name="name"
							:value="RealName.username" /></view>
				</view>
				<view class="Rboy-form-row">
					<label>身份证号码</label>
					<view class="form-rowDom"><input placeholder="请输入身份证" disabled name="certificates"
							:value="RealName.id_card" /></view>
				</view>
				<view class="Rboy-form-row">
					<label>电话号码</label>
					<view class="form-rowDom"><input placeholder="请输入电话" disabled name="phone"
							:value="RealName.phone" /></view>
				</view>
				<view class="Rboy-form-row">
					<label>支付宝账号</label>
					<view class="form-rowDom"><input placeholder="请输入电话" disabled name="phone"
							:value="RealName.alipay" /></view>
				</view>
			</view>
			<view class="agreement">
				<view class="agreement-row" @click="JumpSee">
					<view class="agreement-name">《自由职业合作服务协议》</view>
					<view class="agreement-row-label">
						<text
							:style="{ color: signStatus === false?'#f97777':'#666' }">{{ signStatus === false ? '去签字':'已签署' }}</text>
						<tui-icon name="arrowright" size="18"></tui-icon>
					</view>
				</view>
			</view>
			<view class="application">
				<view class="application-tips" @click="readValve">
					<tui-icon :color=" prevent === 'circle' ?'#999':'#fea12e' " size="14" :name="prevent"></tui-icon>
					<text style="margin-left: 10upx;">我已同意并签署《自由职业合作服务协议》</text>
				</view>
				<button form-type="submit">提交认证</button>
				<!-- <label>提交认证</label> -->
			</view>
		</form>
	</view>
</template>
<script>
	export default {
		data() {
			return {

				identity: 0, //实名状态  ban:禁止实名 true:成功实名
				ALMain_drawing: 'https://res.gaaqoo.com/mapp/img/comm/identity_topside.png', //身份默认证正面
				ALPicture: 'https://res.gaaqoo.com/mapp/img/comm/identity_backside.png', //身份默认证反面		
				RealName: {
					Main_drawing: '', //身份证正面
					Picture: '', //身份证反面	
					username: '', //姓名
					id_card: '', //身份证号
					phone: '', //手机号
					alipay: '', //支付宝
					agreement: '' //协议
				},
		 	signStatus: false, //签署状态
				prevent: 'circle',
				// InformationRealName:true
			}
		},
		async onLoad() {
			const t = this;
			const result = await t.$req('/user/getIdentityInfo', {})
			let rd = result.data;
			if (rd.code == 0) {
				let data = rd.data;
				t.RealName.username = data.username;
				t.RealName.id_card = data.id_card;
				t.RealName.phone = data.phone;
				t.RealName.alipay = data.alipay;
			}
		},

		onShow() {
			const t = this;
			uni.getStorage({
				key: 'autograph_key',
				success: function(res) {
					if (res.data !== '') {
						t.signStatus = true
						t.RealName.agreement = res.data
					}
				}
			});
		},
		methods: {
			async obverse_btn() {
				const t = this;
				uni.chooseImage({
					count: 1, //默认9
					sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
					sourceType: ['album'], //从相册选择
					success: function(res) {
						let ImgType = res.tempFilePaths[0].split(".")
						uni.getFileSystemManager().readFile({
							filePath: res.tempFilePaths[0],
							encoding: 'base64',
						 success: async (res) => {
								t.RealName.Main_drawing = 'data:image/png;base64,' + res.data;
								// t.ALMain_drawing = t.RealName.Main_drawing;
								uni.showLoading({
									title: '加载中'
								});
								// console.log(res.data)
								const result = await t.$req("/user/upload/img", {
									uid: t.user.uid,
									type: ImgType[1],
									img: res.data,
									place: 'identity'
								})
								let rd = result.data
								// console.log(rd)
								if (rd.code == 0) {
									let data = rd.data
									t.ALMain_drawing = data.url;
									uni.hideLoading();
									t.RealName.Main_drawing = data.url;
								}
							}
						})
					}
				});
			},
			async reverse_btn() {
				const t = this;
				uni.chooseImage({
					count: 1, //默认9
					sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
					sourceType: ['album'], //从相册选择
					success: function(res) {
						let ImgType = res.tempFilePaths[0].split(".")
						uni.getFileSystemManager().readFile({
							filePath: res.tempFilePaths[0],
							encoding: 'base64',
							success: async (res) => {
								t.RealName.Picture = 'data:image/png;base64,' + res.data;
								uni.showLoading({
									title: '加载中'
								});
								// console.log(res.data)
								const result = await t.$req("/user/upload/img", {
									uid: t.user.uid,
									type: ImgType[1],
									img: res.data,
									place: 'identity'
								})
								// https://ganqiao-dev.oss-cn-hangzhou.aliyuncs.com 测试环境路径
								let rd = result.data
								// console.log(rd)
								if (rd.code == 0) {
									let data = rd.data
									t.ALPicture = data.url;
									uni.hideLoading();
									t.RealName.Picture = data.url;
								}
							}
						})
					}
				});
			},
			readValve() {
				const t = this;
				if (t.prevent == "circle") {
					t.prevent = "circle-fill"
				} else {
					t.prevent = "circle"
				}
			},
			JumpSee() {
				const t = this;
				uni.navigateTo({
					url: '/pages/login/seeagreement'
				})
			},
			async formSubmit(e) {
				const t = this;
				var formdata = e.detail.value
				if (t.RealName.Main_drawing == '') {
					uni.showToast({
						title: '请上传身份证正面照',
						icon: "none",
						duration: 2000
					});
					return false
				}
				if (t.RealName.Picture == '') {
					uni.showToast({
						title: '请上传身份证反面照',
						icon: "none",
						duration: 2000
					});
					return false
				}
				if (t.RealName.agreement == '') {
					uni.showToast({
						title: '请签署《自由职业合作服务协议》',
						icon: "none",
						duration: 2000
					});
					return false
				}
				if (t.prevent == 'circle') {
					uni.showToast({
						title: '请同意勾选《自由职业合作服务协议》',
						icon: "none",
						duration: 2000
					});
					return false
				}
				let RealName = t.RealName;
				const result = await t.$req('/user/ysUpdateIdentity', {
					topside: RealName.Main_drawing,
					backside: RealName.Picture,
					agree: 1,
					user_sign: RealName.agreement
				})
				let rd = result.data
				if (rd.code == 0) {

					let data = rd.data;
					uni.showToast({
						title: '提交成功',
						icon: 'none',
						default: 200
					})
				}
			}
		}
	}
</script>
<style scoped lang="less">
page{background:#fff!important}.Rboy-box{width:100%;display:flex;flex-direction:row;padding:30upx 3%;align-items:center;justify-content:space-between}.Rboy-box,.Rboy-obverse{height:auto;box-sizing:border-box}.Rboy-obverse{width:48%;margin-bottom:0upx;position:relative;box-shadow:0 3px 13px rgba(0,0,0,.05);padding:0}.Rboy-reverse{width:80%;padding:20px 3%}.obverseimg{width:100%;height:240rpx}.bottom{text-align:center;margin:auto}.bottom,.bottom text{width:100%;height:80upx;line-height:80upx}.bottom text{display:block;background:#fff;font-size:14px;color:#777}.Rboy-reverse{width:48%;height:auto;box-sizing:border-box;margin-bottom:0upx;position:relative;box-shadow:0 3px 13px rgba(0,0,0,.05);padding:0}.reverseimg{width:100%;height:240rpx}.application{width:100%;height:auto;display:flex;flex-direction:column;justify-content:center;position:fixed;bottom:20upx;left:0;right:0;padding-bottom:20upx}.application button,.application label{width:90%;height:90upx;line-height:90upx;display:block;margin:auto;text-align:center;background:linear-gradient(180deg,#efc480,#f8dca5 25%,#ffd5a2 98%);border-radius:50px;font-weight:700;font-size:15px;color:#fd972e;box-shadow:0 5px 3px #fdb964}.application button:after{border:none}.Rboy-form{width:94%;height:auto;background:#fff;margin:auto;box-shadow:0 3px 13px rgba(0,0,0,.05;);box-sizing:border-box;padding:0upx 3%}.Rboy-form-row{width:100%;display:flex;flex-direction:row;justify-content:space-between;align-items:center;border-bottom:1px solid #f5f3f3;height:100upx;line-height:100upx}.Rboy-form-row label{width:25%;font-size:14px}.form-rowDom{width:75%}.form-rowDom input{width:100%;font-size:12px}.agreement{width:94%;height:auto;background:#fff;margin:30upx auto;box-shadow:0 3px 13px rgba(0,0,0,.05);box-sizing:border-box;padding:0 3%}.agreement-row{width:100%;height:auto;display:flex;flex-direction:row;justify-content:space-between;align-items:center}.agreement-name{width:70%;height:100upx;line-height:100upx;text-align:left;font-size:14px;color:#2ebbfe}.agreement-row-label{width:30%;height:100upx;line-height:100upx;display:flex;flex-direction:row;justify-content:flex-end;align-items:center}.agreement-row-label text{font-size:12px}.application-tips{width:90%;height:auto;margin:0 auto;line-height:80upx}.application-tips text{color:#999}
</style>



第二个页面:(签名页-请把接口改成自己的 不然容易报错)


<template>
	<view class="content">

		<view class="authentication_top">
			<image v-if="PreviewContract" :src="contractImg" mode="widthFix"></image>
			<!-- 创建合成画布 -->
			<view class="bgCoverBox" v-if="publish"><canvas :style="{width:height +'px',height:width +'px'}" canvas-id="mycontract" class="canvsborder2"></canvas></view>
			<!-- 创建合成画布 -->
		</view>
		<view class="authentication_bottom" v-if="NavAutograph" style="background:#ffe9e9" @click="agreeSign">
			<button style="color:#f00">我已阅读上述内容,同意签字>></button>
		</view>
	
		<view class="authentication_fun" v-if="Navpreservation" style="background:#fff; ">
			<!-- <button style="color: #1789ff"  @click="preservationImg">保存到本地</button>
			<button style="color: #1789ff"  @click="ReSign">重新签署</button> -->
			<button style="color:#fd972e;"  @click="SigningCompleted">签署完成,去提交>></button>
		</view>
	
		<!-- 签字弹窗 status -->
		<view class="signMask" v-if="autographStatus">
			<view class="sigh-btns">
				<button class="btn" @tap="handleCancel">取消</button>
				<button class="btn" @tap="handleReset">重写</button>
				<button class="btn" @tap="handleConfirm">确认</button>
			</view>
			<view class="sign-box">
				<canvas class="mycanvas" :style="{width:width +'px',height:height +'px'}" canvas-id="mycanvas"
					@touchstart="touchstart" @touchmove="touchmove" @touchend="touchend"></canvas>
				<canvas canvas-id="camCacnvs" :style="{width:height +'px',height:width +'px'}"
					class="canvsborder"></canvas>
			</view>
		</view>

		<!-- 签字弹窗 end -->

	</view>
</template>
<script>
	var x = 20;
	var y = 20;
	var tempPoint = []; //用来存放当前画纸上的轨迹点
	var id = 0;
	var type = '';
	let that;
	let canvasw;
	let canvash;
	export default {
		data() {
			return {
				
				contractImg: '../../static/motu.jpg', //合同路径
				ctx: '', //绘图图像
				points: [], //路径点集合,
				width: 0,
				height: 0,
				autographStatus: false,
				publish: false,
				PreviewContract:true,
				NavAutograph: true,
				Navpreservation:false
			}
		},
		onLoad(option) {
			that = this;
			id = option.id;
			type = option.type;
			this.ctx = uni.createCanvasContext('mycanvas', this); //创建绘图对象
			//设置画笔样式
			this.ctx.lineWidth = 4;
			this.ctx.lineCap = 'round';
			this.ctx.lineJoin = 'round';
			uni.getSystemInfo({
				success: function(res) {
					that.width = res.windowWidth * 0.8;
					that.height = res.windowHeight * 0.85;
				}
			});
		},
		onShow() {
			const t = this;
			uni.getStorage({
				key: 'autograph_key',
				success: function (res) {
					if( res.data !== '' ){
						t.contractImg = res.data
						t.PreviewContract = true;
						t.publish = false;
						t.NavAutograph = false
					}
				}
			});				
		},		
		
		methods: {
			agreeSign() {
				this.autographStatus = true;
			},

			//触摸开始,获取到起点
			touchstart: function(e) {
				let startX = e.changedTouches[0].x;
				let startY = e.changedTouches[0].y;
				let startPoint = {
					X: startX,
					Y: startY
				};
				/* **************************************************
				#由于uni对canvas的实现有所不同,这里需要把起点存起来
			 * **************************************************/
				this.points.push(startPoint);

				//每次触摸开始,开启新的路径
				this.ctx.beginPath();
			},
			//触摸移动,获取到路径点
			touchmove: function(e) {
				let moveX = e.changedTouches[0].x;
				let moveY = e.changedTouches[0].y;
				let movePoint = {
					X: moveX,
					Y: moveY
				};
				this.points.push(movePoint); //存点
				let len = this.points.length;
		 	if (len >= 2) {
					this.draw(); //绘制路径
				}
				tempPoint.push(movePoint);
			},
			// 触摸结束,将未绘制的点清空防止对后续路径产生干扰
			touchend: function() {
				this.points = [];
			},
			/* ***********************************************	
					#   绘制笔迹
					#   1.为保证笔迹实时显示,必须在移动的同时绘制笔迹
					#   2.为保证笔迹连续,每次从路径集合中区两个点作为起点(moveTo)和终点(lineTo)
					#   3.将上一次的终点作为下一次绘制的起点(即清除第一个点)
					************************************************ */
			draw: function() {
				let point1 = this.points[0];
				let point2 = this.points[1];
				this.points.shift();
				this.ctx.moveTo(point1.X, point1.Y);
				this.ctx.lineTo(point2.X, point2.Y);
				this.ctx.stroke();
				this.ctx.draw(true);
			},
			handleCancel() {
				uni.navigateBack({
					delta: 1
				});
			},
			//清空画布
			handleReset: function() {
				console.log('handleReset');
				that.ctx.clearRect(0, 0, that.width, that.height);
				that.ctx.draw(true);
				tempPoint = [];
			},
			//将签名笔迹上传到服务器,并将返回来的地址存到本地
			handleConfirm: function() {
				const t = this;
				if (tempPoint.length == 0) {
					uni.showToast({
						title: '请先签名',
						icon: 'none',
						duration: 2000
					});
					return;
				}
				uni.showLoading({
					title: '生成中'
				});
				uni.canvasToTempFilePath({
					canvasId: 'mycanvas',
					success: function(res) {
						let tempPath = res.tempFilePath;
						const ctx = uni.createCanvasContext('camCacnvs', that);
						ctx.translate(0, that.width);
						ctx.rotate((-90 * Math.PI) / 180);
						ctx.drawImage(tempPath, 0, 0, that.width, that.height);
						ctx.draw();
						setTimeout(() => {
							//保存签名图片到本地
							uni.canvasToTempFilePath({
									canvasId: 'camCacnvs',
									success: function(res) {
										//这是签名图片文件的本地临时地址
										let path = res.tempFilePath;
										console.log(path, "保存签名图片到本地")
										t.autographStatus = false
										// 开始合成
										var _this = this;
										t.publish = true;
										t.PreviewContract = false;
										t.NavAutograph = false;
										t.Navpreservation = true;
										const loy = uni.createCanvasContext('mycontract', this);
										// loy.clearRect(0, 0, that.width, that.height);
										// loy.translate(0, 0);
										// loy.rotate((0 * Math.PI) / 180);
										let imgGao = ''
										uni.getSystemInfo({
											success:function(res){
												imgGao = res.screenWidth 
											}
										})
										loy.drawImage(t.contractImg, 0, 0, 375 , 600);
										loy.drawImage(path, 260, 500, 100, 50);
										loy.draw();
										setTimeout(() =>{
											uni.canvasToTempFilePath({
												canvasId: 'mycontract',
												success: function(res) {
													uni.hideLoading();
													t.contractImg = res.tempFilePath;
													// console.log("合同图片",res.tempFilePath)
												}	
											})
										} ,200)
										// 合成完毕
									},
									fail: err => {
										// console.log('fail', err);
									}
								},
								this
							);
						}, 200);
					}
				});
			},
			preservationImg(){
				const t = this;
				uni.downloadFile({
					url: t.contractImg,
					success: res => {
						if (res.statusCode === 200) {
							uni.saveImageToPhotosAlbum({
								filePath: res.tempFilePath,
								success: function() {
									uni.showToast({
										title: '保存成功',
										icon: 'none',
										duration: 2000
									});
								},
								fail: function() {
									uni.showToast({
										title: '保存失败',
										icon: 'none',
										duration: 2000
									});
								}
							});
						} else {
							uni.showToast({
								title: '第三方网络错误',
								icon: 'none',
								duration: 2000
							});
						}
					}
				});
			},
			SigningCompleted(){
				const t = this;
				let ImgType = t.contractImg.split(".")
				uni.getFileSystemManager().readFile({
					  filePath: t.contractImg,
					  encoding: 'base64',
					  success: async(res) =>{
						  t.contractImg = 'data:image/png;base64,' + res.data;
						  uni.showLoading({
							  title: '提交中'
						  });
						  // console.log(res.data)
						   const result = await t.$req("/user/upload/img",{ 
							   uid: t.user.uid,
							   type: ImgType[1],
							   img: res.data,
							   place: 'sign'	
							})
							let rd = result.data
							// console.log(rd)
							if(rd.code == 0){
								let data = rd.data
								t.contractImg = data.url;								
								uni.hideLoading();
								uni.setStorage({
									key: 'autograph_key',
									data: t.contractImg,
									success: function () {
										console.log("签字",'success');
									}
								});
								uni.navigateBack({ delta: 1 });    // 返回上一页								
							}
					  }
				})				
			},
			ReSign:function(){
				// console.log(this.ctx)
				this.autographStatus = true
			}
		}
	}
</script>
<style>
.authentication_top{width:100%;height:90%;position:fixed;top:0;left:0;right:0;margin:auto;overflow-y:scroll;padding-bottom:40rpx}.authentication_top image{width:100%;display:inline-block}.authentication_bottom{width:100%;height:10%;position:fixed;bottom:0;left:0;right:0;margin:auto;display:flex;flex-direction:column;justify-content:center;align-items:center;background:#ffe9e9}.authentication_bottom button{background:0 0;border:none;font-size:15px;color:red;width:100%;text-align:center}.authentication_bottom button:after{display:none}.authentication_fun{width:100%;height:10%;position:fixed;bottom:30rpx;left:0;right:0;margin:auto;display:flex;flex-direction:row;justify-content:center;align-items:center;background:#ffe9e9;padding:0 3%;width:90%;border-radius:50px;box-shadow:0 3px 13px rgba(0,0,0,.2);border:4px solid #fd972e;box-sizing:border-box}.authentication_fun button{border:none;font-size:15px;background:0 0;width:100%;text-align:center}.authentication_fun button:after{display:none}.signMask{width:100%;height:100%;background:#fff;position:fixed;top:0;bottom:0;left:0;right:0;flex-direction:row}.sign-box,.signMask{margin:auto;display:flex}.sign-box{width:80%;height:90%;flex-direction:column;text-align:center}.sigh-btns,.sign-view{height:100%}.sigh-btns{margin:auto;display:flex;flex-direction:column;justify-content:space-around}.btn{margin:auto;padding:8rpx 40rpx;font-size:14px;transform:rotate(90deg);border:1rpx solid grey}.mycanvas{margin:auto 0rpx;background-color:#ececec}.canvsborder{border:1rpx solid #333;position:fixed;top:0;left:10000rpx}.bgCoverBox{width:100%;height:auto}.canvsborder2{height:700px!important}
	
</style>


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

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

相关文章

把苦难的时光删去:从小县城售货员到深圳IT白领的蜕变之路

希望就像石头缝里的花&#xff0c;有种子就会发芽。 初中辍学&#xff0c;家具店打工&#xff0c;原生家庭带给我太多伤 几乎是所有重男轻女家庭共有的悲剧&#xff0c;我的学习生涯在中考之后寥寥收了场&#xff0c;中考失利&#xff0c;母亲本着“女子无才便是德”的观念不同…

CSS基础

文章目录学习CSS的目的引入的三种方式内部样式表行内样式表外部样式表选择器的分类基础选择器标签选择器类选择器id选择器通配符选择器复合选择器后代选择器子选择器并集选择器伪类选择器盒子模型不同浏览器下盒子模型的区别边框内边距外边距去除浏览器默认样式元素的显示模式块…

Bug系列路径规划算法原理介绍(二)——BUG1 BUG2算法

本系列文章主要对Bug类路径规划算法的原理进行介绍&#xff0c;在本系列的第一篇文章中按照时间顺序梳理了自1986年至2018年Bug类路径规划算法的发展&#xff0c;整理了13种BUG系列中的典型算法&#xff0c;从本系列的第二篇文章开始依次详细介绍了其中具有代表性的BUG1、BUG2、…

面试官:高并发场景下,你们是怎么保证数据的一致性的?图文详解

面试的时候&#xff0c;总会遇到这么一个场景。 1. 场景分析 面试官&#xff1a;你们的服务的QPS是多少&#xff1f; 我&#xff1a;我们的服务高峰期访问量还挺大的&#xff0c;大约是3万吧。 面试官&#xff1a;这么大的访问量&#xff0c;你们的服务器能撑住吗&#xff…

自学unity,该不该阻止?

看清现状&#xff0c;展望未来 进入游戏公司前 进入游戏行业一大契机&#xff1a;在校生身份。各大厂同一个岗位对校招和社会招聘的要求不是一个维度。从学校校招生的身份毕业成为社会人&#xff0c;按照再给两年来算&#xff0c;两年后技术会如何革新&#xff1f;各大公司的招…

【苹果推群发iMessage推】软件安装个性化必要高度 - (void) updateListH

推荐内容IMESSGAE相关 作者推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者推荐内容3.日历推 *** 点击即可查看作者要求内容信息作者推荐…

MySQL8.0.26—Linux版安装详细教程

❤ 作者主页&#xff1a;Java技术一点通的博客 ❀ 个人介绍&#xff1a;大家好&#xff0c;我是Java技术一点通&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 记得关注、点赞、收藏、评论⭐️⭐️⭐️ &#x1f4e3; 认真学习&#xff0c;共同进步&#xff01;&am…

Network error: Connection refused

Network error: Connection refused1 问题的现象2 确认vmware ubuntu侧ssh是否启动2.1 确认ubuntu侧ssh的状态2.2 重启ssh服务2.3 安装ssh1 问题的现象 在用mobaXterm ssh去链接vmware虚拟机ubuntu时一直报下面的错误。 出现该问题之后我做了下面的检测&#xff1a; 检查vmw…

腾讯云年终选购云服务器攻略!

随着云计算的快速发展&#xff0c;很多用户都选择上云&#xff0c;上运中最常见的产品就是云服务器CVM和轻量应用服务器了&#xff0c;那么怎么选购最优惠呢&#xff0c;这篇文章将介绍新老用户选购腾讯云服务器的几个优惠方法。 一、买赠专区 第一个介绍的就是买赠专区&…

在kubernetes中对pod使用tcpdump+wireShark进行抓包

1.查看pod信息&#xff0c;获得pod所在的宿主机 kubectl get pod -n demo -o wide 2.获取宿主机的详情 kubectl get node zeebe.node1 -o wide 3.ssh连接到宿主机 ssh 用户名10.10.11.202 4.查看容器ID&#xff0c;使用POD名称中的关键字进行查找 docker ps|grep nodeapp 5…

java计算机毕业设计ssm图书馆预约管理系统txke6(附源码、数据库)

java计算机毕业设计ssm图书馆预约管理系统txke6&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xf…

【Shell 脚本速成】07、Shell 流程控制——if 判断语句

目录 一、if 介绍 二、单 if 语法 三、if…else 语句 四、if…elif…else 五、if 嵌套 if 5.1 使用 if 嵌套 if 的方式判断两个整数的关系 5.2 写一个nginx安装初始化脚本 六、if 语句与 shell 运算 6.1 与文件存在与否的判断 6.2 文件权限相关的判断 6.3 整数之间…

【数据结构】建堆的方式、堆排序以及TopK问题

建堆的方式、堆排序以及TopK问题1、建堆的两种方式1.1 向上调整建堆1.2 向下调整建堆2、堆排序3、TopK问题4、建堆、堆排序、TopK问题全部代码1、建堆的两种方式 我们知道&#xff0c;堆是二叉树的一种&#xff0c;二叉树的建立是借助结构体与数组完成的&#xff08;通过在结构…

扫描电镜下的人体感官结构,超震撼

我们对自己的感官最熟悉不过了&#xff0c;但是如果把这些器官放大一千倍一万倍&#xff0c;你还能分辨出来吗&#xff1f;能做到这一点的不是普通的光学显微镜&#xff0c;而是电子显微镜。 电子显微镜可以将物体放大近300000倍&#xff0c;其分辨率可达1纳米&#xff08;10-9…

Minio学习

目录 一、概述 1、Minio介绍 2、Minio的基础概念 3、Minio安装 3.1、Docker容器中安装 3.2、Windows运行安装 4、分布式Minio优势 数据保护 高可用 一致性 5、Minio客户端使用 6、SpringBoot工程引入Minio 一、概述 Minio分布式文件系统。 Minio是一个基于Apache…

客服回复差评的话术模板

当店铺出现差评时&#xff0c;客服首先要去与客户进行沟通&#xff0c;帮助客户解决问题&#xff0c;尽可能去消除差评&#xff1b;如果客户不愿意沟通&#xff0c;无法消除差评的情况下&#xff0c;客服也要及时对差评进行回复。 前言 对于开网店的店主来说&#xff0c;客户…

如何搭建一个自己的音乐服务器

点赞再看&#xff0c;动力无限。 微信搜「 程序猿阿朗 」。 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录&#xff0c;有很多知识点和系列文章。 最近发现&#xff0c;经常用的网易云音乐&#xff0c;有很多歌曲下架了&#xff0c;能听的越来越少了&#xff1b;…

【电气安全】安科瑞电气火灾监控系统在江苏某大学中设计与应用

摘要&#xff1a;本文以安科瑞电气火灾系统在江苏大学科技园的应用为案例&#xff0c;介绍电气火灾系统实现对现场设备的系统集成&#xff0c;数据的采集、传输以及存储&#xff0c;验证了该系统的功能及实用性。 关键词&#xff1a;江苏大学科技园&#xff1b;电气火灾系统&a…

【数据结构】Map和Set

目录 一、JDK中的Map和Set 1.1Map接口的使用 &#xff08;1&#xff09;元素的添加操作 &#xff08;2&#xff09;在Map集合中查询特定的值 &#xff08;3&#xff09;删除Map中指定的value和key &#xff08;4&#xff09;Map集合的遍历 1.2Set集合的应用 集合java.u…

RK3588平台开发系列讲解(Thermal篇)Thermal的设备树配置

平台内核版本安卓版本RK3588Linux 5.10Android12🚀返回专栏总目录 文章目录 一、Tsadc 配置二、cooling device配置2.1、CPU配置2.2、 GPU配置三、 Thermal Zone配置沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍Thermal的设备树配置方法。 一、Tsadc 配…