记账本选择标签选择时间,计算器---记录一下

*
html部分

<template>
	<view class="pages-main">
		<!-- 标题栏 -->
		<!-- #ifndef MP-TOUTIAO -->
		<view class="" :style="'height:'+barHeight +'px;'"></view>
		<!-- #endif -->
		<!-- #ifdef MP-TOUTIAO -->
		<view class="" :style="'height:'+(barHeight-statusBarHeight) +'px;'"></view>
		<!-- #endif -->
		<view class="nabbar-bar">
			<!-- //手机状态栏 -->
			<!-- #ifndef MP-TOUTIAO -->
			<view class="status-bar" :style="{'height': statusBarHeight + 'px'}"></view>
			<!-- #endif -->
			<!-- //导航栏 -->
			<view class="nabbar-box flex-cent" :style="{'height': (barHeight-statusBarHeight) + 'px', }">
				<!-- #ifdef MP-WEIXIN || MP-KUAISHOU -->
				<image class="left-icon" src="@/static/image/icon-xiangzuo.png" mode="widthFix" @click="onGoBack"></image>
				<!-- #endif -->
				<view class="nav-tabs flex-cent">
					<view v-for="(item, index) in titleList" :key="index" class="nav_item flex-cent"
					 @click="onNavSwitch(item.value)" :id="index==0? 'navTitle': ''" >
						<view class="nav_title">{{ item.title }}</view>
						<view class="task_tabs_line_wrapper">
							<view class="task_tabs_line"
								:style="{width: 100 / titleList.length + '%',transform: `translateX(${isNavActive * 100}%);`}">
								<view class="inside_line"></view>
							</view>
						</view>
					</view>
				</view>
			</view>
		</view>
		
		<view class="body-main">
			<!-- #ifndef MP-TOUTIAO -->
			<swiper class="list_swiper" @change="changeSwiper" :current="isNavActive" :scroll-anchoring="true"
			:style="'height:calc(100vh - '+barHeight+'px)'">
			<!-- #endif -->
			<!-- #ifdef MP-TOUTIAO -->
			<swiper class="list_swiper" @change="changeSwiper" :current="isNavActive" :scroll-anchoring="true"
			:style="'height:calc(100vh - '+(barHeight-statusBarHeight)+'px)'">
			<!-- #endif -->
			
				<swiper-item class="list_swiper_item" :key="0" >
					<scroll-view class="scroll-view" :scroll-y="true" :scroll-with-animation="true" 
					:scroll-top="scrollTop"  :scroll-into-view="isScrollShow? 'book'+selevtType: ''">
					 <!-- :style="{height: conHeight + 'px'}" -->
						<view class="list-box" v-for="(item,index) in expenditureList" :key="index"
						:id="'book'+item._id">
							<view class="title-box">{{item.name}}</view>
							<view class="list-main flex-fs-left">
								<view class="list-item " v-for="(item1,index1) in item.children" :key="index1"
								:class="selectCategory._id==item1._id?'is-acitve': ''" @click="onSelectClass(item1)"
								:id="selectCategory._id==item1._id?'activeItem': ''">
									<view class="head-box flex-cent">
										<image :src="item1.iconUrl | onFiltersImg" mode="widthFix"></image>
									</view>
									<view class="item-title">{{item1.name}}</view>
								</view>
							</view>
						</view>
						<view class="height-foot" v-if="isOpenCalculator"></view>
					</scroll-view>
				</swiper-item>
				<swiper-item class="list_swiper_item" :key="1" >
					<view class="list-box">
						<view class="list-main flex-fs-left">
							<view class="list-item" v-for="(item1,index1) in incomeList" :key="index1"
							:class="selectCategory._id==item1._id?'is-acitve': ''" @click="onSelectClass(item1)">
								<view class="head-box flex-cent">
									<image :src="item1.iconUrl | onFiltersImg" mode="widthFix"></image>
								</view>
								<view class="item-title">{{item1.name}}</view>
							</view>
						</view>
					</view>
					<view class="height-foot" v-if="isOpenCalculator"></view>
				</swiper-item>
			</swiper>
		</view>
		<calculator :isOpen="isOpenCalculator" :selectCategory="selectCategory" :formModel="formModel"></calculator>
		<!-- 新手引导 -->
		<block v-if="showGuide && !functionGuidance">
			<guide :show="showGuide" :width="cWidth" :height="cHeight" :left="cLeft" :right="cRight" :top="cTop"
			:showMessage='cShowMsg' :currentIndex="currentIndex" :noticeArray="noticeArray" pageName="记账本分类页"
			 @onNextBtn="clicktoNext" @operatingButton="onWriteAccount" @closeClick="onCloseClick"></guide>
		</block>
		<block v-if="isFeedbackShow">
			<feedbackPopup :isOpen="isFeedbackShow" @close="onCloseFeedback" pageName="记账本分类页"></feedbackPopup>
		</block>
	</view>
</template>

js部分

<script>
	import { accAdd, accSub, accMul, accDiv } from '@/utils/calculation.js'
	import calculator from '../components/calculator.vue'
	import guide from '@/components/guide.vue'
	import { mapGetters, mapMutations } from "vuex";
	import { bookkeepingCategoryList } from '@/api/bookApi.js'
	import feedbackPopup from '../components/feedback-popup.vue'
	const globalData = getApp().globalData
	const defaultImageUrl = globalData.defaultImageUrl
	const imageUrlPrefix = globalData.imageUrlPrefix
	export default {
		filters: {
			onFiltersImg(val) {
				if (val) {
					const photoArray = val.split(',')
					if (photoArray[0].indexOf('http') == -1) {
					  return imageUrlPrefix+photoArray[0]
					} else {
						return photoArray[0]
					}
				} else {
					return defaultImageUrl
				}
			},
		},
		data() {
			return {
				statusBarHeight: 20,
				isNavActive: 0,
				barHeight: 44,
				formModel: {},
				bookinclasslist: [],
				bookoutclasslist: [],
				bookclasslist: [],
				currentClass: {},
				// 标题列表
				titleList: [{
					title: '支出', // 标题名
					value: 0, // 标题编号
					count: 0
				}, {
					title: '收入',
					value: 1,
					count: 0
				}],
				isOpenCalculator: false,
				showGuide: false, //引导是否显示
				cShowTitls: '',
				cShowMsg: '', // 展示的解释语
				cWidth: '',
				cHeight: '',
				cLeft: '',
				cTop: '',
				currentIndex: 0,
				noticeArray: [{
					showID: "navTitle", // 对应的id
					showMessage: `选择您要记录的是收入还是收入`, // 对应的解释文本
					type: "bottom", // 解释框的气泡类型
					isbtn: true,
					arrowShow: true,
					seeTop: '200',
				},{
					showID: "activeItem", // 对应的id
					showMessage: `点击您此次支出的分类`, // 对应的解释文本
					type: "bottom", // 解释框的气泡类型
					isbtn: false,
					arrowShow: true,
				}],
				incomeList: [], // 收入类别列表
				expenditureList: [], // 支出类别列表
				selectCategory: {
					_id: '',
					name: '',
					type: 2,
				},
				scrollTop: 0,
				selevtType: '',
				isScrollShow: false,
				isFeedbackShow: false,
			}
		},
		components: {
			calculator,
			guide,
			feedbackPopup,
		},
		
		onLoad(options) {
			//获取手机系统的信息(在这主要是获取状态栏和胶囊的高度)
			let {statusBarHeight,system} = uni.getSystemInfoSync()
			this.statusBarHeight = statusBarHeight
			this.barHeight = statusBarHeight + (system.indexOf('iOS') > -1 ? 44 : 48)
			if (this.bookCategoryList.length>0) {
				this.incomeList = this.bookCategoryList[1].children || []
				this.expenditureList = this.bookCategoryList[0].children || []
				this.guideInit()
			} else {
				this.getCategoryList()
			}
			if (options && options.model) {
				let model = decodeURIComponent(options.model)
				let mode = JSON.parse(model)
				let category = {}
				if (mode.type==2) {
					this.isNavActive = 0
					this.expenditureList.some(e=>{
						category = e.children.find(i=> i._id == mode.categoryId)
						return category
					})
				} else {
					this.isNavActive = 1
					category = this.incomeList.find(i=> i._id == mode.categoryId)
				}
				this.selectCategory = category
				this.formModel={
					Money: mode.amount,
					ConsumptionTime: mode.ytd,
					id: mode._id
				}
				setTimeout(o=> {
					this.onWriteAccount()
				},100)
			}
		},
		computed: {
			...mapGetters(['hasAuth', 'loginUserKey','bookCategoryList','functionGuidance','bookPageEnterNum']),
		},
		methods: {
			getCategoryList() {
				bookkeepingCategoryList({key: this.loginUserKey.key}).then(data=> {
					this.incomeList = data[1].children || []
					this.expenditureList = data[0].children || []
					this.$store.commit('BOOK_CATEGORY_LIST',data||[])
					this.guideInit()
				})
			},
			onGoBack() {
				if (this.bookPageEnterNum==2) {
					this.isFeedbackShow = true
				} else {
					uni.navigateBack()
				}
			},
			onCloseFeedback(val) {
				this.isFeedbackShow = false
				if (val==2) {
					uni.navigateBack()
				}
			},
			onNavSwitch(val) {
				this.isNavActive = val
				if (JSON.stringify(this.formModel) =='{}') {
					this.$set(this,'isOpenCalculator',false)
				}
			},
			// 左右滑动切换标题的回调
			changeSwiper(e) {
				let val = e.target.current
				this.onNavSwitch(val)
			},
			onSelectClass(val) {
				this.selectCategory = val
				this.isScrollShow = true
				this.selevtType = val.parentId
				this.$set(this,'isOpenCalculator',true)
				this.showGuide = false;
				// 埋点
				// this.$uma.trackEvent('BookkeepingCategaryClick',{page_name: '记账本分类页',user_id: this.loginUserKey._id|| '',event_time: Date.parse(new Date())})
			},
			
			guideInit() {
				if(!this.functionGuidance && this.expenditureList.length>0) {
					this.selectCategory = this.expenditureList[0].children[0]
					this.$nextTick(()=> {
						if (this.currentIndex >= this.noticeArray.length) {
							this.showGuide = false;
							return;
						}
						this.showGuide = true;
						this.cShowMsg = this.noticeArray[this.currentIndex].showMessage;
						var idS = '#' + this.noticeArray[this.currentIndex].showID;
						console.log(idS)
						//根据布局信息显示引导框位置
						const query = uni.createSelectorQuery().in(this);
						query.select(idS).boundingClientRect(data => {
							console.log("得到布局位置信息" + JSON.stringify(data));
							this.cWidth = data.width;
							// #ifndef MP-KUAISHOU
							this.cHeight = data.height;
							this.cTop = data.top;
							// #endif
							// #ifdef MP-KUAISHOU
							if (data.height<= 46) {
								this.cHeight = data.height * 2;
								this.cTop = data.top + 20;
							} else {
								this.cHeight = data.height;
								this.cTop = data.top;
							}
							// #endif
							console.log(data)
							console.log('----------------')
							this.cLeft = data.left;
							
						}).exec();
					});
				}
			},
			onWriteAccount() {
				this.onSelectClass(this.selectCategory)
			},
			clicktoNext(val) {
				if (this.currentIndex >= this.noticeArray.length) {
					this.showGuide = false;
					return;
				}
				this.noticeArray[this.currentIndex].zindex = 0;
				this.cShowMsg = '';
				this.currentIndex++;
				if (this.currentIndex >= this.noticeArray.length) {
					this.showGuide = false;
					return;
				}
				this.cShowMsg = this.noticeArray[this.currentIndex].showMessage;
				var idS = '#' + this.noticeArray[this.currentIndex].showID;
				console.log(idS)
				const query = uni.createSelectorQuery().in(this);
				query.select(idS).boundingClientRect(data => {
					console.log("得到布局位置信息" + JSON.stringify(data));
					this.cWidth = data.width;
					this.cHeight = data.height;
					this.cLeft = data.left;
					this.cTop = data.top;
				}).exec();
			},
			onCloseClick() {
				this.showGuide = false;
			},
		},
		onBackPress(e) {
			console.log(e)
			console.log('监听页面的返回事件')
		},
		watch: {
			loginUserKey() {},
			bookCategoryList() {},
			functionGuidance() {},
			bookPageEnterNum() {},
		}
	}
</script>

css部分


<style lang="less" scoped>
.pages-main {
	.nabbar-bar {
		width: 100%;
		z-index: 100;
		position: fixed;
		top: 0;
		left: 0;
		right: 0;
		background: #fff;
		z-index: 100;
		.status-bar {
			width: 100%;
			height: var(--status-bar-height);
		}
		.nabbar-box {
			width: 100%;
			padding: 0 25rpx;
			z-index: 996;
			align-items: center;
			padding-right: 90rpx;
			.left-icon {
				font-size: 36rpx;
				color: #000;
				position: absolute;
				left: 16rpx;
				width: 40rpx;
				height: 40rpx;
				z-index: 2;
			}
			
		}
		.nav-tabs {
			position: relative;
			height: 100%;
			width: 100%;
			padding: 0 100rpx;
		}
		
		.nav_item {
			width: 50%;
			font-size: 36rpx;
			font-family: PingFang SC;
			font-weight: 700;
			color: #4F4B4E;
			height: 100%;
			align-items: center;
			flex-direction: column;
			
			.task_tabs_line_wrapper {
				position: absolute;
				bottom: 0rpx;
				left: 0;
				height: 4rpx;
				width: 100%;
				padding: 0 100rpx;
				.task_tabs_line {
					height: 4rpx;
					transition: all 0.2s ease;
			
					.inside_line {
						width: 30rpx;
						margin: 0 auto;
						height: 4rpx;
						background: #F08500;
						border-radius: 2rpx;
					}
				}
			}
		}
	}
	.list_swiper {
		height: calc(100vh - 160rpx);
	}
	.list_swiper_item {
		width: 100%;
		height: 100%;
		padding: 16rpx 0;
		// overflow-y: scroll;
		.scroll-view {
			width: 100%;
			height: 100%;
			overflow-y: scroll;
		}
	}
	.height-foot {
		height: 590rpx;
	}
	.list-box {
		width: 100%;
		background: #FFFFFF;
		border-radius: 18rpx;
		padding: 36rpx 40rpx 0;
		margin-bottom: 12rpx;
	}
	.body-main {
		padding: 0 16rpx;
		.title-box {
			font-size: 30rpx;
			font-family: PingFang SC;
			font-weight: 700;
			color: #4F4B4E;
			line-height: 42rpx;
		}
		.list-main {
			flex-wrap: wrap;
			padding-top: 38rpx;
		}
		.list-item {
			width: 25%;
			margin-bottom: 46rpx;
			.head-box {
				width: 100rpx;
				height: 100rpx;
				background: #F6F6F6;
				margin: 0 auto;
				border-radius: 50%;
				overflow: hidden;
				
				image,img {
					width: 58rpx;
					height: 58rpx;
					background: #F6F6F6;
				}
			}
			&.is-acitve {
				.head-box {
					background: #FDF2E5;
					image,img {
						background-color: #FDF2E5;
					}
				}
			}
		}
		
		.item-title {
			font-size: 28rpx;
			font-family: PingFang SC;
			font-weight: 400;
			color: #4F4B4E;
			text-align: center;
			line-height: 40rpx;
			padding-top: 18rpx;
		}
	}
	
}
	
</style>

calculator.vue

<template>
	<view>
		<block v-if="isOpen">
			<view class="input-calculator" >
				<view class="input-box flex-sb-cent">
					<!-- <view class="padding-sm margin-xsradius ">
						<view class="margin-xsradius" :class="selectCategory.IconName" :style="'background-color:'+selectCategory.BgColor"></view>
						<text class="text-grey">{{selectCategory.Name}}</text>
					</view> -->
					<view class="padding-sm ">
						<view class="text-black text-xxl contner">{{model.Money||'0.00'}}</view>
					</view>
				</view>
				<!-- <view class="flex-sb-cent input" :class="InputBottom>0?'foot':''" :style="[{bottom:InputBottom+'px'}]">
					<view class="action">
						<text class="  text-grey">备注</text>
					</view>
					<input class="solid-bottom" :adjust-position="false" :focus="false" maxlength="300" v-model="model.Remark"
					 cursor-spacing="10" @focus="InputFocus" @blur="InputBlur"></input>
				</view> -->
			
				<view class="flex-sb-cent cu-list col-4">
					<view class="cu-item flex-cent border" @click="modifyNum('number','1')">
						<text class="text-black">1</text>
					</view>
					<view class="cu-item flex-cent border" @click="modifyNum('number','2')">
						<text class="text-black">2</text>
					</view>
					<view class="cu-item flex-cent border" @click="modifyNum('number','3')">
						<text class="text-black">3</text>
					</view>
					<view class="cu-item flex-cent border time" @click="onDateOpen">
						<block v-if="model.ConsumptionTime == today">
							<image class="image-time" src="../static/icon-time.png" mode="widthFix"></image>
							今天
						</block>
						<text class="text-black" v-else>{{model.ConsumptionTime}}</text>
					</view>
					<view class="cu-item flex-cent border" @click="modifyNum('number','4')">
						<text class="text-black">4</text>
					</view>
					<view class="cu-item flex-cent border" @click="modifyNum('number','5')">
						<text class="text-black">5</text>
					</view>
					<view class="cu-item flex-cent border" @click="modifyNum('number','6')">
						<text class="text-black">6</text>
					</view>
					<view class="cu-item flex-cent border" @click="modifyNum('operator','+')">	
						<text class="text-black">+</text>
					</view>
					<view class="cu-item flex-cent border" @click="modifyNum('number','7')">
						<text class="text-black">7</text>
					</view>
					<view class="cu-item flex-cent border" @click="modifyNum('number','8')">
						<text class="text-black">8</text>
					</view>
					<view class="cu-item flex-cent border" @click="modifyNum('number','9')">
						<text class="text-black">9</text>
					</view>
					<view class="cu-item flex-cent border" @click="modifyNum('operator','-')">
						<text class="text-black">-</text>
					</view>
					<view class="cu-item flex-cent border" @click="modifyNum('string','.')">
						<text class="text-black">.</text>
					</view>
					<view class="cu-item flex-cent border" @click="modifyNum('number','0')">
						<text class="text-black">0</text>
					</view>
					<view class="cu-item flex-cent border" @click="modifyNum('cut')">
						<image class="del-img" src="../static/icon-del.png" mode="widthFix"></image>
					</view>
					<view class="cu-item flex-cent border" @click="modifyNum('equal')"
					style="background-color: #FF951A;" v-if="state.currentOperator">
						<text class="text-black">=</text>
					</view>
					<view class="cu-item flex-cent border " style="background-color: #FF951A;"
					id="cuItemSubmit" @click="onSubmit" v-if="!state.currentOperator">
						<text class="text-bold">完成</text>
					</view>
				</view>
			</view>
			<pickerDate :isOpen="isPickerShow" @onDayClick="onDayClick" @close="onClosePick"></pickerDate>
			<!-- 新手引导 -->
			<block v-if="showGuide && !functionGuidance">
				<guide :show="showGuide" :width="cWidth" :height="cHeight" :left="cLeft" :right="cRight" :top="cTop"
				:showMessage='cShowMsg' :currentIndex="currentIndex" :noticeArray="noticeArray" pageName="记账本分类页"
				 @onNextBtn="clicktoNext" @operatingButton="onWriteAccount" @closeClick="onCloseClick"></guide>
			</block>
		</block>
		
	</view>
</template>

<script>
	import pickerDate from './picker-date.vue'
	import { accAdd,accSub,accDiv,accMul } from '@/utils/calculation.js'
	import guide from '@/components/guide.vue'
	import { saveOrUpdateBookkeeping } from '@/api/bookApi.js'
	import { mapGetters, mapMutations } from "vuex";
	export default {
		props: {
			isOpen: {
				default: false,
				type: Boolean
			},
			selectCategory: {
				default: {},
				type: Object
			},
			formModel: {
				default: {},
				type: Object
			}
		},
		data() {
			return {
				model: {
					Money: '',
					// Remark: '',
					ConsumptionTime: '',
				},
				today: this.getDate(),
				InputBottom: 0,
				isPickerShow: false,
				/*
				*currentNumber: 用于跟踪当前输入的数字或操作数。当用户按下数字按钮时,这个变量将被更新以包含新的数字字符。
				* 例如,当用户按下数字键 "1""2""3" 时,currentNumber 将依次变为 "1""12""123"。
				
				currentOperator: 用于跟踪当前选定的操作符,例如加法 "+"、减法 "-"、乘法 "*"、除法 "/"。
				* 如果用户按下运算符按钮,这个变量将被设置为相应的运算符。
				
				previousValue: 用于存储上一个操作的结果,以便进行下一个操作时使用。
				* 例如,如果用户按下 "1 + 2",previousValue 将存储 "1",然后在按下 "=" 后,将 "previousValue + currentNumber" 计算为最终结果。
				
				isDecimal: 用于跟踪当前数字是否包含小数点。当用户按下小数点按钮时,这个标志将设置为 true,以确保小数点只能出现一次。
				* */
				state: {
					currentNumber: '',
					currentOperator: '',
					previousValue: null,
					isDecimal: false,
				},
				showGuide: false, //引导是否显示
				cShowTitls: '',
				cShowMsg: '', // 展示的解释语
				cWidth: '',
				cHeight: '',
				cLeft: '',
				cTop: '',
				currentIndex: 0,
				noticeArray: [{
					showID: "cuItemSubmit", // 对应的id
					showMessage: `记账可以养成更好地消费习惯,快来开启您的记账生活吧!`, // 对应的解释文本
					type: "top", // 解释框的气泡类型
					isbtn: false,
					arrowShow: true, // 指示箭头是否显示
				}],
			}
		},
		components: {
			pickerDate,
			guide
		},
		created() {
		},
		computed: {
			...mapGetters(['hasAuth', 'loginUserKey','functionGuidance']),
		},
		mounted() {
			if (JSON.stringify(this.formModel) != '{}') {
				this.model = this.formModel
				this.state.currentNumber = this.formModel.Money || ''
			} else {
				this.model.ConsumptionTime = this.getDate()
			}
		},
		methods: {
			onDateOpen() {
				this.$set(this,'isPickerShow',true)
			},
			onDayClick(time) {
				this.model.ConsumptionTime = time
				this.$set(this,'isPickerShow',false)
			},
			onClosePick() {
				this.$set(this,'isPickerShow',false)
			},
			InputFocus(e) {
				this.InputBottom = e.detail.height
			},
			InputBlur(e) {
				this.InputBottom = 0
			},
			bindDateChange(e) {
				this.model.ConsumptionTime = e.target.value
			},
			getDate(type) {
				const date = new Date();
				let year = date.getFullYear();
				let month = date.getMonth() + 1;
				let day = date.getDate();

				if (type === 'start') {
					year = year - 60;
				} else if (type === 'end') {
					year = year + 2;
				}
				month = month > 9 ? month : '0' + month;;
				day = day > 9 ? day : '0' + day;
				return `${year}/${month}/${day}`;
			},
			modifyNum(type, value) {
				if (type === 'number') {
					if (this.model.Money.length>=23) return //
					if (this.state.isDecimal) {
						const decimalCount = this.state.currentNumber.split('.')[1];
						if (decimalCount && decimalCount.length >= 2) {
							return;
						}
						if(this.state.currentNumber.length>=11) return
						this.state.currentNumber += value;
						this.model.Money += value;
					} else {
						if(this.state.currentNumber.length>=8) return
						if (this.state.currentNumber == '0') {
							if (this.state.currentOperator !== '') {
								if (value == '0') {
									this.state.currentNumber = this.state.currentNumber;
									this.model.Money = this.model.Money
								} else {
									this.state.currentNumber += value;
									this.model.Money = this.model.Money.toString().slice(0, -1); // 删除最后一个数
									this.model.Money += value; // 重新添加
								}
							} else {
								this.state.currentNumber = value;
								this.model.Money = value
							}
						} else if (this.state.currentNumber==''&& value=='0'){
							this.state.isDecimal = true
							this.state.currentNumber = '0.';
							this.model.Money += '0.'
						} else {
							this.state.currentNumber += value;
							this.model.Money += value;
						}
					}
					
				} else if (type === 'operator') {
					if (this.state.currentNumber !== '') {
						if (this.state.currentOperator !== '') {
							// 如果之前已经有运算符,先计算上一步的结果
							this.calculate();
						}
						this.state.previousValue = parseFloat(this.state.currentNumber);
						this.state.currentNumber = '';
						this.state.isDecimal = false;
						this.model.Money += `${value}`; // 添加运算符到表达式
						this.state.currentOperator = value;
					} else if (this.model.Money.length>=1){
						this.model.Money = this.model.Money.toString().slice(0, -1); // 删除最后一个数
						this.model.Money += `${value}`; // 添加运算符到表达式
						this.state.currentOperator = value;
					}
				} else if (type === 'equal') {
					if (this.state.currentOperator && this.state.currentNumber !== '') {
						this.model.Money += `${this.state.currentNumber}`; // 显示完整表达式
						this.calculate(); // 计算结果
						this.state.currentOperator = '';
					} else if (this.state.currentOperator && this.state.currentNumber == '' ){
						this.cut();
					}
				} else if (type === 'string') {
					if (this.model.Money.length>=23) return
					if (this.state.currentNumber == '') {
						this.state.currentNumber = '0';
					}
			
					if (value === '.' && this.state.isDecimal) {
						return; // 如果已经输入小数点,不再输入
					}
					this.state.isDecimal = value === '.';
					this.state.currentNumber += value;
					if (this.state.currentOperator !== '') {
						const currentCount = this.model.Money.split(this.state.currentOperator)[1];
						console.log(currentCount)
						console.log('currentCount0000000000000000000')
						if (currentCount) {
							this.model.Money += value
						} else {
							this.model.Money += `${this.state.currentNumber}`; // 显示完整表达式
						}
					} else {
						this.model.Money = this.state.currentNumber; // 更新表达式
					}
				} else if (type === 'clear') {
					this.clear();
				} else if (type === 'cut') {
					this.cut();
				}
			},
			calculate() {
				const num1 = this.state.previousValue;
				const num2 = parseFloat(this.state.currentNumber);
				let result = 0;
				
				switch (this.state.currentOperator) {
					case '+':
					// num1 + num2
						result = accAdd(num1, num2);
						break;
					case '-':
					// num1 - num2
						result = accSub(num1, num2);
						break;
					case '*':
					// num1 * num2
						result = accMul(num1, num2);
						break;
					case '/':
					// num1 / num2
						result = accDiv(num1, num2);
						break;
				}
				this.state.currentNumber = result.toString();
				this.state.isDecimal = this.state.currentNumber.includes('.');
				this.model.Money = result;
			},
			clear() {
				this.state.currentNumber = '';
				this.state.currentOperator = '';
				this.state.previousValue = null;
				this.state.isDecimal = false;
				this.model.Money = this.state.currentNumber;
			},
			
			cut() {
				if (this.state.currentNumber !== '' || this.state.currentOperator !== '') {
					// 删除最后一个字符,无论是数字还是运算符
					const lastChar = this.model.Money.toString().slice(-1);
					this.model.Money = this.model.Money.toString().slice(0, -1);
					//解决输入一个运算符后,删除之后,不能再输入运算符
					if (lastChar === '+' || lastChar === '-' || lastChar === '*') {
						this.state.currentOperator = '';
						this.state.currentNumber = this.model.Money
					} else if (this.state.currentNumber !== '') {
						// 如果最后一个字符是数字,则更新当前数字
						this.state.currentNumber = this.state.currentNumber.slice(0, -1);
					}
				} else if (this.state.previousValue !== null) {
					// 如果以上条件都不满足,则删除前一个值的最后一个字符
					const previousValueString = this.state.previousValue.toString();
					if (previousValueString.length > 1) {
						this.state.previousValue = parseFloat(previousValueString.slice(0, -1));
					} else {
						this.state.previousValue = null;
					}
				}
			
				//解决输入小数点之后,删了小数点,之后不能再输入小数点问题
				this.state.isDecimal = this.state.currentNumber.includes('.')
				//避免当输入的算式清空后,还在以上个运算结果为初始值继续运算
				if (this.model.Money === '') {
					this.state.currentNumber = '';
					this.state.currentOperator = '';
					this.state.previousValue = null;
				}
			},
			
			Deltext(e) { //删除
				if (this.model.Money.length > 1) {
					this.model.Money = this.model.Money.substr(0, this.model.Money.length - 1)
					if (this.model.Money === '-' || this.model.Money === "+") {
						this.model.Money = "0"
					}
				} else {
					this.model.Money = "0"
				}

			},
			onSubmit(e) {
				if (!this.selectCategory._id) return this.$util.Tips({title: '请选择分类!'})
				if (!this.model.Money || this.model.Money == 0) return this.$util.Tips({title: '请输入金额!'})
				if (this.model.Money.length>8) return this.$util.Tips({title: '金额过大!'})
				let parme = {
					amount: Math.abs(this.model.Money),
					date: this.model.ConsumptionTime,
					categoryId: this.selectCategory._id,
					categoryIcon: this.selectCategory.iconUrl,
					categoryName: this.selectCategory.name,
					type: this.selectCategory.type,
					userType: this.loginUserKey.type,
					key: this.loginUserKey.key,
					deviceType: 3,
					remark: '',
					// id: 0, // 存在及更新
				}
				if (this.model.id) {
					parme.id = this.model.id
				}
				saveOrUpdateBookkeeping(parme).then(data=> {
					this.$util.Tips({title: '保存成功!'})
					if (this.functionGuidance) {
						uni.navigateBack()
					} else {
						let pages = getCurrentPages();//获取页面栈
						let prevPage = pages[pages.length - 2]; //上一个页面
						//直接调用上一个页面的setData()方法,把数据存到上一个页面中去
						prevPage.data.source = 2
						uni.navigateBack()
					}
					// 埋点
					// this.$uma.trackEvent('BookkeepingFinishClick',{page_name: '记账本分类页',user_id: this.loginUserKey._id|| '',event_time: Date.parse(new Date())})
				})
			},
			guideInit() {
				if(!this.functionGuidance && this.hasAuth) {
					this.model.Money = 10
					this.$nextTick(()=> {
						if (this.currentIndex >= this.noticeArray.length) {
							this.showGuide = false;
							return;
						}
						this.showGuide = true;
						this.cShowMsg = this.noticeArray[this.currentIndex].showMessage;
						var idS = '#' + this.noticeArray[this.currentIndex].showID;
						console.log(idS)
						//根据布局信息显示引导框位置
						const query = uni.createSelectorQuery().in(this);
						query.select(idS).boundingClientRect(data => {
							console.log("得到布局位置信息" + JSON.stringify(data));
							this.cWidth = data.width;
							this.cHeight = data.height;
							this.cLeft = data.left;
							this.cTop = data.top;
						}).exec();
					});
				}
			},
			onWriteAccount() {
				this.onSubmit()
				this.showGuide = false;
			},
			clicktoNext(val) {
				if (this.currentIndex >= this.noticeArray.length) {
					this.showGuide = false;
					return;
				}
				this.noticeArray[this.currentIndex].zindex = 0;
				this.cShowMsg = '';
				this.currentIndex++;
				if (this.currentIndex >= this.noticeArray.length) {
					this.showGuide = false;
					return;
				}
				this.cShowMsg = this.noticeArray[this.currentIndex].showMessage;
				var idS = '#' + this.noticeArray[this.currentIndex].showID;
				console.log(idS)
				const query = uni.createSelectorQuery().in(this);
				query.select(idS).boundingClientRect(data => {
					console.log("得到布局位置信息" + JSON.stringify(data));
					this.cWidth = data.width;
					this.cHeight = data.height;
					this.cLeft = data.left;
					this.cTop = data.top;
				}).exec();
			},
			onCloseClick() {
				this.showGuide = false;
			},
		},
		
		watch: {
			isOpen() {
				this.guideInit()
			},
			formModel() {
				if (JSON.stringify(this.formModel) != '{}') {
					this.model = this.formModel
				} else {
					this.model.ConsumptionTime = this.getDate()
				}
			},
			functionGuidance(){},
			
		}
		
	}
</script>

<style lang="less" scoped>
	// @import '../css/main.css';
	.input-calculator {
		position: fixed;
		bottom: var(--window-bottom);
		width: 100%;
		background: #fff;
		box-shadow: 0rpx 0rpx 2rpx 3rpx rgba(229,229,229,0.5);
		.input-box {
			height: 118rpx;
			font-size: 32rpx;
			font-family: PingFang SC;
			font-weight: 700;
			color: #4F4B4E;
			line-height: 118rpx;
			padding: 0 46rpx;
		}
		.cu-list {
			flex-wrap: wrap;
		}
		.cu-item {
			width: 25%;
			text-align: center;
			height: 118rpx;
			line-height: 118rpx;
			overflow: hidden;
			font-size: 32rpx;
			font-family: PingFang SC;
			font-weight: 700;
			color: #4F4B4E;
			letter-spacing: 0;
			&.time {
				font-size: 26rpx;
			}
			&:active {
				background: #F6F6F6;
			}
			
		}
		.image-time {
			width: 36rpx;
			height: 36rpx;
			margin-right: 7rpx;
		}
		.del-img {
			width: 46rpx;
			height: 46rpx;
		}
		
		.border {
			border-top: 1rpx solid #E0E0E0;
			border-right: 1rpx solid #E0E0E0;
			&:nth-child(4n) {
				border-right: none;
			}
		}

	}

	.submit:active {
		background-color: #FF951A !important;
	}
</style>

在这里插入图片描述
./picker-date.vue

<template>
	<view class="">
		<view class="batch-num" :class="isOpen ? 'on' : ''">
			<view class="batch-body">
				<view class="title">
					日期选择
					<image class="close-img" @click="onCancel(0)" src="@/static/image/close.png" mode="widthFix"></image>
				</view>
				<!-- 日期选择器 -->
				<view class="calendar-wrapper">
					<!-- 选择月份 -->
					<view class="header" v-if="headerBar">
						<view class="iconfont iconarrow-left-bold pre" @click="changeMonth('pre')">
							<image src="../static/icon-left.png" mode="widthFix"></image>
						</view>
						<view class="">{{y+'年'+formatNum(m)+'月'}}</view>
						<view class="iconfont iconarrow-left-bold-copy next" @click="changeMonth('next')">
							<image src="../static/icon-right.png" mode="widthFix"></image>
						</view>
					</view>
					<!-- 星期栏 -->
					<view class="week">
						<view class="week-day" v-for="(item, index) in weekDay" :key="index">{{ item }}</view>
					</view>
					<!-- 日历数字 -->
					<view class="content" :style="{ height: height }">
						<view :style="{ top: positionTop + 'rpx' }" class="days">
							<view class="item" v-for="(item,index) in dates" :key="index">
								<view class="day" @click="selectOne(item, $event)" :class="{
									choose: getActday(item),//选中的日期
									chooseMarkDay:getChoose(item),
									nolm: !item.isCurM,//不在本月的日
						            today: isToday(item.year, item.month, item.date),//当日日期
						            isWorkDay: isWorkDay(item.year, item.month, item.date)//周一至周五
						          }">
									{{Number(item.date)}}
								</view>
							</view>	
						</view>
					</view>
				</view>
				<view class="slect-time">{{choose}}</view>
				<view class="sub-btn" @click="onSubmitDeta">确定</view>
			</view>
		</view>
		<view class="mask" v-show="isOpen" @click="onCancel(0)"></view>
	</view>
</template>

<script>
	export default {
		name: 'pickerDate',
		props: {
			isOpen: {
				type: Boolean,
				default: false
			},
			// 星期几为第一天(0为星期日)
			weekstart: {
				type: Number,
				default: 0
			},
			// 标记的日期
			markDays: {
				type: Array,
				default: () => {
					return [];
				}
			},
			//是否展示月份切换按钮
			headerBar: {
				type: Boolean,
				default: true
			},
			//过去日期是否不可点击
			disabledAfter: {
				type: Boolean,
				default: false
			},
			//接收用户选择的参数
			actDay: {
				type: Array,
				default: [],
			},
			//接受已经被选择的参数
			chooseDay: {
				type: Array,
				default: [],
			}
		},
		data() {
			return {
				weektext: ['日', '一', '二', '三', '四', '五', '六'],
				y: new Date().getFullYear(), // 年
				m: new Date().getMonth() + 1, // 月
				d: new Date().getDate(), //日
				dates: [], // 当前月的日期数据
				positionTop: 0,
				choose: this.getToday().date,
				chooseArr: [],
			}
		},
		created() {
			this.dates = this.monthDay(this.y, this.m);
			console.log('')
		},
		mounted() {
			// this.choose = this.getToday().date;
		},
		computed: {
			// 顶部星期栏
			weekDay() {
				return this.weektext.slice(this.weekstart).concat(this.weektext.slice(0, this.weekstart));
			},
			height() {
				return (this.dates.length / 7) * 80 + 'rpx';
			},
			
		},
		methods: {
			onCancel() {
				this.$emit('close')
				console.log('eeeeeeeeeeeeeeeee')
			},
			//已被投标的日期
			getChoose(val) {
				let day = val.year+'/'+val.month+'/'+val.date 
				for (let i = 0; i < this.chooseDay.length; i++) {
					if (day == this.chooseDay[i]) {
						return true;
					}
				}
			},
			//用户选择的日期
			getActday(val) {
				let day = val.year+'/'+val.month+'/'+val.date
				if (this.choose == day) {
					return true
				} else {
					return false
				}
			},
			formatNum(num) {
				let res = Number(num);
				return res < 10 ? '0' + res : res;
			},
			getToday() {
				let date = new Date();
				let y = date.getFullYear();
				let m = date.getMonth();
				let d = date.getDate();
				let week = new Date().getDay();
				let weekText = ['日', '一', '二', '三', '四', '五', '六'];
				let formatWeek = '星期' + weekText[week];
				let today = {
					date: y + '/' + this.formatNum(m + 1) + '/' + this.formatNum(d),
					week: formatWeek
				};
				return today;
			},
			// 获取当前月份数据
			monthDay(y, month) {
				let dates = [];
				let m = Number(month);
				let firstDayOfMonth = new Date(y, m - 1, 1).getDay(); // 当月第一天星期几
				let lastDateOfMonth = new Date(y, m, 0).getDate(); // 当月最后一天
				let lastDayOfLastMonth = new Date(y, m - 2, 0).getDate(); // 上一月的最后一天
				let weekstart = this.weekstart == 7 ? 0 : this.weekstart;
				let startDay = (() => {
					// 周初有几天是上个月的
					if (firstDayOfMonth == weekstart) {
						return 0;
					} else if (firstDayOfMonth > weekstart) {
						return firstDayOfMonth - weekstart;
					} else {
						return 7 - weekstart + firstDayOfMonth;
					}
				})();
				let endDay = 7 - ((startDay + lastDateOfMonth) % 7); // 结束还有几天是下个月的
				for (let i = 1; i <= startDay; i++) {
					dates.push({
						date: this.formatNum(lastDayOfLastMonth - startDay + i),
						day: weekstart + i - 1 || 7,
						month: m - 1 >= 0 ? this.formatNum(m - 1) : 12,
						year: m - 1 >= 0 ? y : y - 1
					});
				}
				for (let j = 1; j <= lastDateOfMonth; j++) {
					dates.push({
						date: this.formatNum(j),
						day: (j % 7) + firstDayOfMonth - 1 || 7,
						month: this.formatNum(m),
						year: y,
						isCurM: true, //是否当前月份
					});
				}
				for (let k = 1; k <= endDay; k++) {
					dates.push({
						date: this.formatNum(k),
						day: (lastDateOfMonth + startDay + weekstart + k - 1) % 7 || 7,
						month: m + 1 <= 11 ? this.formatNum(m + 1) : 0,
						year: m + 1 <= 11 ? y : y + 1
					});
				}
				// console.log(dates); //日期
				return dates;
			},
			isWorkDay(y, m, d) {
				//是否工作日
				let ymd = y+'/'+m+'/'+d // `${y}/${m}/${d}`;
				let formatDY = new Date(ymd.replace(/-/g, '/'));
				let week = formatDY.getDay();
				if (week == 0 || week == 6) {
					return false;
				} else {
					return true;
				}
			},
			isFutureDay(y, m, d) {
				//是否未来日期
				let ymd = y+'/'+m+'/'+d //`${y}/${m}/${d}`;
				let formatDY = new Date(ymd.replace(/-/g, '/'));
				let showTime = formatDY.getTime();
				let curTime = new Date().getTime();
				if (showTime > curTime) {
					return true;
				} else {
					return false;
				}
			},
			// 标记日期
			isMarkDay(y, m, d) {
				let flag = false;
				for (let i = 0; i < this.markDays.length; i++) {
					let dy = y+'/'+m+'/'+d // `${y}-${m}-${d}`;
					if (this.markDays[i] == dy) {
						flag = true;
						break;
					}
				}
				return flag;
			},
			isToday(y, m, d) {
				let checkD = y + '/' + m + '/' + d;
				let today = this.getToday().date;
				if (checkD == today) {
					return true;
				} else {
					return false;
				}
			},
			// 点击回调
			selectOne(i, event) {
				let date = i.year+'/'+i.month+'/'+i.date 
				let selectD = new Date(date).getTime();
				let curTime = new Date().getTime();
				// let week = new Date(date).getDay();
				// let weekText = ['日', '一', '二', '三', '四', '五', '六'];
				// let formatWeek = '星期' + weekText[week];
				// let response = {
				// 	date: date,
				// 	week: formatWeek
				// };
				if (!i.isCurM) {
					console.log('不在当前月范围内');
					return false;
				}
				if (selectD < curTime) {
					if (this.disabledAfter) {
						console.log('过去日期不可选');
						return false;
					} else {
						this.choose = date;
					}
				} else {
					this.choose = date;
					this.chooseArr.push(date)
					
				}
				// this.response = response
			},
			onSubmitDeta() {
				this.$emit('onDayClick', this.choose);
			},
			//改变年月
			changYearMonth(y, m) {
				this.dates = this.monthDay(y, m);
				this.y = y;
				this.m = m;
			},
			changeMonth(type) {
				if (type == 'pre') {
					if (this.m + 1 == 2) {
						this.m = 12;
						this.y = this.y - 1;
					} else {
						this.m = this.m - 1;
					}
				} else {
					if (this.m + 1 == 13) {
						this.m = 1;
						this.y = this.y + 1;
					} else {
						this.m = this.m + 1;
					}
				}
				this.dates = this.monthDay(this.y, this.m);
			}
		}
	}
</script>

<style lang="less" scoped>
	.batch-num {
		width: 100%;
		// height: 624rpx;
		// background-color: #fff;
		position: fixed;
		left: 0;
		bottom: 0;
		z-index: 1000;
		transform: translate3d(0, 100%, 0);
		transition: all 0.3s cubic-bezier(0.25, 0.5, 0.5, 0.9);
		border-top-left-radius: 32rpx;
		border-top-right-radius: 32rpx;
		overflow: hidden;

		&.on {
			transform: translate3d(0, 0, 0);
		}

		.batch-body {
			// padding: 20rpx;
			padding: 35rpx 0 30rpx;
			background: #fff;
			border-radius: 18rpx 18rpx 0 0;

			.title {
				font-size: 30rpx;
				font-family: PingFang SC;
				color: #858585;
				line-height: 42rpx;
				font-weight: 700;
				text-align: center;
				padding-bottom: 35rpx;
				position: relative;
			}
			.close-img {
				position: absolute;
				right: 20rpx;
				width: 58rpx;
				height: 58rpx;
			}
		}

		.calendar-wrapper {
			color: #6f6d6d;
			font-size: 28rpx;
			text-align: center;
			background-color: #fff;
			padding-bottom: 10rpx;
			border-radius: 20rpx;
			.header {
				display: flex;
				align-items: center;
				justify-content: center;
				height: 88rpx;
				font-weight: bold;
				font-size: 28rpx;
				font-family: PingFang SC;
				color: #4F4B4E;
				
				.pre,
				.next {
					image,img {
						width: 24rpx;
						height: 24rpx;
					}
				}

				.pre {
					margin-right: 30rpx;
				}

				.next {
					margin-left: 30rpx;
				}
			}

			.week {
				display: flex;
				align-items: center;
				height: 80rpx;
				line-height: 80rpx;
				background: #FFFFFF;
				box-shadow: 0rpx 4rpx 6rpx 0rpx rgba(201,201,201,0.5);
				border-radius: 18rpx 18rpx 0rpx 0rpx;
				view {
					flex: 1;
				}
			}

			.content {
				position: relative;
				overflow: hidden;
				transition: height 0.4s ease;

				.days {
					transition: top 0.3s;
					display: flex;
					align-items: center;
					flex-wrap: wrap;
					position: relative;

					.item {
						position: relative;
						display: block;
						height: 80rpx;
						line-height: 80rpx;
						width: calc(100% / 7);

						.day {
							display: inline-block;
							vertical-align: middle;
							font-size: 26rpx;
							font-family: PingFang SC;
							font-weight: 400;
							color: #4F4B4E;
							width: 60rpx;
							height: 60rpx;
							line-height: 60rpx;
							overflow: hidden;
							border-radius: 50%;
							&.choose {
								background-color: #FF951A;
								color: #fff;
							}

							&.chooseMarkDay {
								//已被投标的日期
								color: #FF951A;
							}

							&.nolm {
								color: #fff;
								opacity: 0;
							}
						}

						.isWorkDay {
							color: #25272a;
						}

						.notSigned {
							font-style: normal;
							width: 8rpx;
							height: 8rpx;
							background: #fa7268;
							border-radius: 10rpx;
							position: absolute;
							left: 50%;
							bottom: 0;
							pointer-events: none;
						}

						.today {
							color: #FF951A;
						}
						
						.workDay {
							font-style: normal;
							width: 8rpx;
							height: 8rpx;
							background: #4d7df9;
							border-radius: 10rpx;
							position: absolute;
							left: 50%;
							bottom: 0;
							pointer-events: none;
						}

						.markDays {
							font-style: normal;
							position: absolute;
							top: 2rpx;
							right: 11rpx;
							pointer-events: none;
							font-size: 80rpx;
							color: rgba(160, 234, 193, 0.5);
						}
					}
				}
			}
		}

		.cancle-btn {
			width: 100%;
			height: 97rpx;
			background: #FFFFFF;
			text-align: center;
			line-height: 97rpx;
			font-family: PingFang SC;
			font-size: 34rpx;
			font-weight: 500;
			color: #858585;
		}
		.slect-time {
			text-align: center;
			font-size: 26rpx;
			font-family: PingFang SC;
			font-weight: 400;
			color: #858585;
			line-height: 37rpx;
		}
		
		.sub-btn {
			width: 560rpx;
			height: 96rpx;
			background: #FF951A;
			border-radius: 14rpx;
			font-size: 34rpx;
			font-family: PingFang SC;
			font-weight: 700;
			color: #FFFFFF;
			text-align: center;
			line-height: 96rpx;
			margin: 0 auto;
			margin-top: 10rpx;
		}
	}

	// 分享
	.mask {
		position: fixed;
		top: 0;
		left: 0;
		right: 0;
		bottom: 0;
		opacity: 0.7;
		background-color: rgba(0, 0, 0, 0.7);
		z-index: 999 !important;
	}
</style>

calculation.js

export function accAdd(arg1, arg2) {
    var r1, r2, m, c;
    try {
        r1 = arg1.toString().split(".")[1].length;
    }
    catch (e) {
        r1 = 0;
    }
    try {
        r2 = arg2.toString().split(".")[1].length;
    }
    catch (e) {
        r2 = 0;
    }
    c = Math.abs(r1 - r2);
    m = Math.pow(10, Math.max(r1, r2));
    if (c > 0) {
        var cm = Math.pow(10, c);
        if (r1 > r2) {
            arg1 = Number(arg1.toString().replace(".", ""));
            arg2 = Number(arg2.toString().replace(".", "")) * cm;
        } else {
            arg1 = Number(arg1.toString().replace(".", "")) * cm;
            arg2 = Number(arg2.toString().replace(".", ""));
        }
    } else {
        arg1 = Number(arg1.toString().replace(".", ""));
        arg2 = Number(arg2.toString().replace(".", ""));
    }
    return (arg1 + arg2) / m;
}

export function accSub(arg1, arg2) {
    var r1, r2, m, n;
    try {
        r1 = arg1.toString().split(".")[1].length;
    }
    catch (e) {
        r1 = 0;
    }
    try {
        r2 = arg2.toString().split(".")[1].length;
    }
    catch (e) {
        r2 = 0;
    }
    m = Math.pow(10, Math.max(r1, r2)); //last modify by deeka //动态控制精度长度
    n = (r1 >= r2) ? r1 : r2;
    return ((arg1 * m - arg2 * m) / m).toFixed(n);
}

export function accMul(arg1, arg2) {
    var m = 0, s1 = arg1.toString(), s2 = arg2.toString();
    try {
        m += s1.split(".")[1].length;
    }
    catch (e) {
    }
    try {
        m += s2.split(".")[1].length;
    }
    catch (e) {
    }

    return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
}


export function accDiv(arg1, arg2) {
    var t1 = 0, t2 = 0, r1, r2;
    try {
        t1 = arg1.toString().split(".")[1].length;
    }
    catch (e) {
    }
    try {
        t2 = arg2.toString().split(".")[1].length;
    }
    catch (e) {
    }

    r1 = Number(arg1.toString().replace(".", ""));
    r2 = Number(arg2.toString().replace(".", ""));

    return (r1 / r2) * Math.pow(10, t2 - t1);
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

node.js安装和配置

软件介绍 Node.js是一个免费的、开源的、跨平台的JavaScript运行时环境&#xff0c;允许开发人员在浏览器之外编写命令行工具和服务器端脚本。 Node.js是一个基于Chrome JavaScript运行时建立的一个平台。 Node.js是一个事件驱动I/O服务端JavaScript环境&#xff0c;基于Googl…

Java连接数据库的各种细节错误(细节篇)

目录 前后端联调&#xff08;传输文件&#xff09; ClassNotFoundException: SQLException: SQL语法错误: 数据库连接问题: 驱动问题: 资源泄露: 并发问题: 超时问题: 其他库冲突: 配置问题: 网络问题: SSL/TLS问题: 数据库权限问题: 驱动不兼容: 其他未知错误…

祝贺!2023美丽汉字小达人市级比赛和区级自由报名获奖名单发布

昨天&#xff0c;汉字小达人的主办方《中文自修》杂志社在官网发布了两个公示&#xff1a;《“中文自修杯”第十届上海市小学生“美丽汉字小达人”市级活动获奖名单公示》、《“中文自修杯”第十届上海市小学生“美丽汉字小达人”区级活动“自由报名”获奖名单公示》。 这两份名…

在虚拟机的Windows操作系统中:通过Jar方式若依项目,以及在外部的访问!

&#x1f4da;&#x1f4da; &#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; ​​ &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Windows》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有…

SCA面面观 | 五大维度提升,让SCA产品走向成熟

随着开源软件的迅速崛起&#xff0c;特别是在2021年SolarWinds和Log4j漏洞事件引发全球关注后&#xff0c;软件成分分析&#xff08;Software Composition Analysis&#xff0c;简称SCA&#xff09;越来越受到业界的重视。SCA产品已经逐渐成为企业软件供应链资产管理、漏洞管理…

【UE 材质】切换颜色、纹理时的过渡效果

效果 步骤 1. 新建一个工程&#xff0c;创建Basic关卡 2. 创建一个材质&#xff0c;这里命名为“M_Plane”&#xff0c;打开这个材质&#xff0c;在材质图表中添加如下节点 注意“Noise”节点中的函数选择“Voronoi” 3. 对材质“M_Plane”创建材质实例 4. 在场景中放置一个平…

Java_Mybatis_缓存

缓存 1.概述 Mybatis 缓存&#xff1a;MyBatis 内置了一个强大的事务性查询缓存机制&#xff0c;它可以非常方便地配置和定制 2.会话缓存&#xff08;一级缓存&#xff09; sqlSession 级别的&#xff0c;也就是说&#xff0c;使用同一个 sqlSession 查询同一 sql 时&#x…

Impala4.x源码阅读笔记(二)——Impala如何高效读取Iceberg表

前言 本文为笔者个人阅读Apache Impala源码时的笔记&#xff0c;仅代表我个人对代码的理解&#xff0c;个人水平有限&#xff0c;文章可能存在理解错误、遗漏或者过时之处。如果有任何错误或者有更好的见解&#xff0c;欢迎指正。 Iceberg表是一种用于存储大规模结构化数据的…

Vue指令之v-on

v-on指令用于注册事件&#xff0c;作用是添加监听与提供事件触发后对应的处理函数。 v-on有两种语法&#xff0c;在提供处理函数的时候既可以直接使用内联语句&#xff0c;也可以提供函数的名字。 第一种语法是直接提供内联语句&#xff0c;如下 v-on:事件名 "内联语句…

外贸SOHO建站教程?海洋建站推广如何做?

外贸SOHO建站推广的步骤&#xff1f;国际贸易网站建设方法&#xff1f; 随着互联网的普及和发展&#xff0c;越来越多的外贸SOHO从业者选择通过建立自己的网站来拓展业务。那么&#xff0c;如何搭建一个专业、高效的外贸网站呢&#xff1f;海洋建站将为您提供一份详细的外贸SO…

Java - Bean的生命周期

Bean的生命周期之5步 Bean生命周期的管理&#xff0c;可以参考Spring的源码&#xff1a;AbstractAutowireCapableBeanFactory类的doCreateBean()方法。 Bean生命周期可以粗略的划分为五大步&#xff1a; 第一步&#xff1a;实例化Bean 第二步&#xff1a;Bean属性赋值 第三…

扫描电镜(SEM)样品在进行扫描电镜观察前需要进行哪些处理

对于扫描电镜&#xff08;Scanning Electron Microscope&#xff0c;SEM&#xff09;样品的制备&#xff0c;需要经过一系列处理步骤以确保样品表面的干净、导电性好&#xff0c;并且能够提供高质量的显微图像。以下是一些常见的处理步骤&#xff1a; 1. 固定样品&#xff08;…

Vue 学习随笔系列七 -- 表单动态生成

表单动态生成 文章目录 表单动态生成1、动态表单组件封装2、组件引用3、实现效果 1、动态表单组件封装 <!-- 动态生成下拉框&#xff0c;可同理生成input框等 --> <template><el-dialogcustom-class"custom-dialog":title"dialogTitle":vi…

Linux 使用定时任务

在Linux中&#xff0c;你可以使用cron&#xff08;定时任务管理器&#xff09;来设置和管理定时任务。以下是使用cron的基本步骤 编辑定时任务列表 打开终端&#xff0c;输入以下命令来编辑当前用户的定时任务列表 crontab -e如果是要编辑系统范围的定时任务&#xff0c;可以…

如何在忘记密码的情况下恢复解锁 iPhone

您忘记了 iPhone 密码吗&#xff1f;Apple 官方通常建议将 iPhone 恢复至出厂设置以将其删除。这种修复很不方便&#xff0c;甚至可能比问题本身更麻烦。 如果您也经历过同样的情况&#xff0c;并且想知道忘记了 iPhone 密码并且不想恢复它该怎么办&#xff0c;我们的终极指南…

docker基本管理和docker相关概念

docker是开源的的应用容器引擎&#xff0c;基于go语言开发的&#xff0c;运行在linux系统当中的开源的轻量级的"虚拟机。 docker的容器技术可以在一台主机上轻松的为任何应用创建一个轻量级的&#xff0c;可以移植的&#xff0c;自给自足的容器 docker的宿主机是linux系…

ElementPlus table 中嵌套 input 输入框

文章目录 需求分析 需求 vue3 项目中 使用UI组件库 ElementPlus 时&#xff0c;table 中嵌入 input输入框 分析 <template><div class"p-10"><el-table :data"tableData" border><el-table-column prop"date" label&qu…

jemeter,http cookie管理器

Http Cookie管理器自动实现Cookie关联的原理&#xff1a; (默认:作用域在同级别的组件) 一:当Jmeter第1次请求服务器的时候,如果说服务器有通过响应头的Set-Cookie有返回Cookie,那么Http Cookie管理器就会自动的保存这些Cookie的值。 二&#xff1a;当Jmeter第2-N次请求服务器的…

【同步FIFO_2023.12.13】

同步fifo&#xff0c;写时钟和读时钟为同一个时钟&#xff0c;用于交互数据缓冲 fifo的深度&#xff1a;同一块数据内存的大小 reg [2:0] Mem [8];//宽度3&#xff0c;深度8典型同步fifo的三部分 fifo写控制逻辑&#xff1a;写地址、写有效信号&#xff0c;fifo写满、写错等状…

ArkUI组件

目录 一、概述 声明式UI 应用模型 二、常用组件 1、Image&#xff1a;图片展示组件 示例 配置控制授权申请 2、Text&#xff1a;文本显示组件 示例 3、TextInput&#xff1a;文本输入组件 示例 4、Button&#xff1a;按钮组件 5、Slider&#xff1a;滑动条组件 …
最新文章