hookehuyr

feat(表单验证): 添加数字输入验证函数并应用至多个表单字段

实现通用数字输入验证函数 validateNumberInput,限制输入范围为0-99999,可选择是否允许小数
将验证函数应用于价格、里程、时速等表单字段,移除myAuthCar页面中注释的价格显示代码
1 <!-- 1 <!--
2 * @Date: 2022-09-19 14:11:06 2 * @Date: 2022-09-19 14:11:06
3 * @LastEditors: hookehuyr hookehuyr@gmail.com 3 * @LastEditors: hookehuyr hookehuyr@gmail.com
4 - * @LastEditTime: 2025-07-16 16:53:13 4 + * @LastEditTime: 2025-07-16 17:02:41
5 * @FilePath: /jgdl/src/pages/myAuthCar/index.vue 5 * @FilePath: /jgdl/src/pages/myAuthCar/index.vue
6 * @Description: 我的认证车页面 6 * @Description: 我的认证车页面
7 --> 7 -->
...@@ -47,7 +47,7 @@ ...@@ -47,7 +47,7 @@
47 <view v-if="item.verification_status === 7 && item.verification_reason" class="verification-reason mt-1"> 47 <view v-if="item.verification_status === 7 && item.verification_reason" class="verification-reason mt-1">
48 <text class="text-xs text-red-500">审核结果:{{ item.verification_reason }}</text> 48 <text class="text-xs text-red-500">审核结果:{{ item.verification_reason }}</text>
49 </view> 49 </view>
50 - <view class="mt-2 flex justify-between items-center"> 50 + <!-- <view class="mt-2 flex justify-between items-center">
51 <view> 51 <view>
52 <text class="text-orange-500 font-bold" style="font-size: 1.2rem;"> 52 <text class="text-orange-500 font-bold" style="font-size: 1.2rem;">
53 ¥ {{ item.price?.toLocaleString() }} 53 ¥ {{ item.price?.toLocaleString() }}
...@@ -56,7 +56,7 @@ ...@@ -56,7 +56,7 @@
56 ¥ {{ item.market_price?.toLocaleString() }} 56 ¥ {{ item.market_price?.toLocaleString() }}
57 </text> 57 </text>
58 </view> 58 </view>
59 - </view> 59 + </view> -->
60 <view class="action-buttons mt-4"> 60 <view class="action-buttons mt-4">
61 <nut-button 61 <nut-button
62 v-if="item.review_status === 7" 62 v-if="item.review_status === 7"
......
...@@ -154,7 +154,7 @@ ...@@ -154,7 +154,7 @@
154 <!-- 行驶里程 --> 154 <!-- 行驶里程 -->
155 <nut-form-item label="行驶里程" prop="total_mileage_km" required 155 <nut-form-item label="行驶里程" prop="total_mileage_km" required
156 :rules="[{ required: true, message: '请输入行驶里程' }]"> 156 :rules="[{ required: true, message: '请输入行驶里程' }]">
157 - <nut-input v-model="formData.total_mileage_km" placeholder="请输入" type="number" input-align="right"> 157 + <nut-input v-model="formData.total_mileage_km" placeholder="请输入" type="number" input-align="right" @input="validateMileageInput">
158 <template #right> 158 <template #right>
159 <text class="unit">公里</text> 159 <text class="unit">公里</text>
160 </template> 160 </template>
...@@ -163,7 +163,7 @@ ...@@ -163,7 +163,7 @@
163 163
164 <!-- 续航里程 --> 164 <!-- 续航里程 -->
165 <nut-form-item label="续航里程" prop="range_km"> 165 <nut-form-item label="续航里程" prop="range_km">
166 - <nut-input v-model="formData.range_km" placeholder="请输入" type="number" input-align="right"> 166 + <nut-input v-model="formData.range_km" placeholder="请输入" type="number" input-align="right" @input="validateRangeInput">
167 <template #right> 167 <template #right>
168 <text class="unit">公里</text> 168 <text class="unit">公里</text>
169 </template> 169 </template>
...@@ -172,7 +172,8 @@ ...@@ -172,7 +172,8 @@
172 172
173 <!-- 最高时速 --> 173 <!-- 最高时速 -->
174 <nut-form-item label="最高时速" prop="max_speed_kmh"> 174 <nut-form-item label="最高时速" prop="max_speed_kmh">
175 - <nut-input v-model="formData.max_speed_kmh" placeholder="请输入" type="number" input-align="right"> 175 + <nut-input v-model="formData.max_speed_kmh" placeholder="请输入" type="number"
176 + input-align="right" @input="validateMaxSpeedInput">
176 <template #right> 177 <template #right>
177 <text class="unit">km/h</text> 178 <text class="unit">km/h</text>
178 </template> 179 </template>
...@@ -181,8 +182,7 @@ ...@@ -181,8 +182,7 @@
181 182
182 <!-- 电池容量 --> 183 <!-- 电池容量 -->
183 <nut-form-item label="电池容量" prop="battery_capacity_ah"> 184 <nut-form-item label="电池容量" prop="battery_capacity_ah">
184 - <nut-input v-model="formData.battery_capacity_ah" placeholder="请输入" type="number" 185 + <nut-input v-model="formData.battery_capacity_ah" placeholder="请输入" type="number" input-align="right" @input="validateBatteryCapacityInput">
185 - input-align="right">
186 <template #right> 186 <template #right>
187 <text class="unit">Ah</text> 187 <text class="unit">Ah</text>
188 </template> 188 </template>
...@@ -610,57 +610,91 @@ const showTireWearPicker = () => { ...@@ -610,57 +610,91 @@ const showTireWearPicker = () => {
610 } 610 }
611 611
612 /** 612 /**
613 - * 校验价格输入,只允许数字和小数点 613 + * 通用数字输入验证函数,限制范围在0-9999之间
614 * @param {Object} event - 输入事件对象 614 * @param {Object} event - 输入事件对象
615 + * @param {String} field - 字段名
616 + * @param {Boolean} allowDecimal - 是否允许小数,默认true
615 */ 617 */
616 -const validatePriceInput = (event) => { 618 +const validateNumberInput = (event, field, allowDecimal = true) => {
617 let value = event.detail.value 619 let value = event.detail.value
618 620
619 - // 只保留数字和小数点,删除其他字符 621 + // 只保留数字和小数点(如果允许),删除其他字符
620 - value = value.replace(/[^0-9.]/g, '') 622 + if (allowDecimal) {
623 + value = value.replace(/[^0-9.]/g, '')
624 +
625 + // 防止多个小数点,只保留第一个小数点
626 + const dotIndex = value.indexOf('.')
627 + if (dotIndex !== -1) {
628 + value = value.substring(0, dotIndex + 1) + value.substring(dotIndex + 1).replace(/\./g, '')
629 + }
621 630
622 - // 防止多个小数点,只保留第一个小数点 631 + // 防止以小数点开头
623 - const dotIndex = value.indexOf('.') 632 + if (value.startsWith('.')) {
624 - if (dotIndex !== -1) { 633 + value = '0' + value
625 - value = value.substring(0, dotIndex + 1) + value.substring(dotIndex + 1).replace(/\./g, '') 634 + }
635 + } else {
636 + // 只允许整数
637 + value = value.replace(/[^0-9]/g, '')
626 } 638 }
627 639
628 - // 防止以小数点开头 640 + // 限制范围在0-9999之间
629 - if (value.startsWith('.')) { 641 + const numValue = parseFloat(value)
630 - value = '0' + value 642 + if (numValue > 99999) {
643 + value = '99999'
631 } 644 }
632 645
633 // 使用 nextTick 确保视图更新 646 // 使用 nextTick 确保视图更新
634 Taro.nextTick(() => { 647 Taro.nextTick(() => {
635 - formData.price = value 648 + formData[field] = value
636 }) 649 })
637 } 650 }
638 651
639 /** 652 /**
640 - * 校验市场价格输入,只允许数字和小数点 653 + * 校验价格输入,只允许数字和小数点,范围0-99999
654 + * @param {Object} event - 输入事件对象
655 + */
656 +const validatePriceInput = (event) => {
657 + validateNumberInput(event, 'price', true)
658 +}
659 +
660 +/**
661 + * 校验市场价格输入,只允许数字和小数点,范围0-99999
641 * @param {Object} event - 输入事件对象 662 * @param {Object} event - 输入事件对象
642 */ 663 */
643 const validateMarketPriceInput = (event) => { 664 const validateMarketPriceInput = (event) => {
644 - let value = event.detail.value 665 + validateNumberInput(event, 'market_price', true)
666 +}
645 667
646 - // 只保留数字和小数点,删除其他字符 668 +/**
647 - value = value.replace(/[^0-9.]/g, '') 669 + * 校验行驶里程输入,只允许整数,范围0-99999
670 + * @param {Object} event - 输入事件对象
671 + */
672 +const validateMileageInput = (event) => {
673 + validateNumberInput(event, 'total_mileage_km', false)
674 +}
648 675
649 - // 防止多个小数点,只保留第一个小数点 676 +/**
650 - const dotIndex = value.indexOf('.') 677 + * 校验续航里程输入,只允许整数,范围0-99999
651 - if (dotIndex !== -1) { 678 + * @param {Object} event - 输入事件对象
652 - value = value.substring(0, dotIndex + 1) + value.substring(dotIndex + 1).replace(/\./g, '') 679 + */
653 - } 680 +const validateRangeInput = (event) => {
681 + validateNumberInput(event, 'range_km', false)
682 +}
654 683
655 - // 防止以小数点开头 684 +/**
656 - if (value.startsWith('.')) { 685 + * 校验最高时速输入,只允许整数,范围0-99999
657 - value = '0' + value 686 + * @param {Object} event - 输入事件对象
658 - } 687 + */
688 +const validateMaxSpeedInput = (event) => {
689 + validateNumberInput(event, 'max_speed_kmh', false)
690 +}
659 691
660 - // 使用 nextTick 确保视图更新 692 +/**
661 - Taro.nextTick(() => { 693 + * 校验电池容量输入,允许小数,范围0-99999
662 - formData.market_price = value 694 + * @param {Object} event - 输入事件对象
663 - }) 695 + */
696 +const validateBatteryCapacityInput = (event) => {
697 + validateNumberInput(event, 'battery_capacity_ah', true)
664 } 698 }
665 699
666 /** 700 /**
......
...@@ -100,7 +100,7 @@ ...@@ -100,7 +100,7 @@
100 100
101 <!-- 续航里程 --> 101 <!-- 续航里程 -->
102 <nut-form-item label="续航里程" prop="range_km"> 102 <nut-form-item label="续航里程" prop="range_km">
103 - <nut-input v-model="formData.range_km" placeholder="请输入" type="number" input-align="right"> 103 + <nut-input v-model="formData.range_km" placeholder="请输入" type="number" input-align="right" @input="validateRangeInput">
104 <template #right> 104 <template #right>
105 <text class="unit">公里</text> 105 <text class="unit">公里</text>
106 </template> 106 </template>
...@@ -109,7 +109,7 @@ ...@@ -109,7 +109,7 @@
109 109
110 <!-- 最高时速 --> 110 <!-- 最高时速 -->
111 <nut-form-item label="最高时速" prop="max_speed_kmh"> 111 <nut-form-item label="最高时速" prop="max_speed_kmh">
112 - <nut-input v-model="formData.max_speed_kmh" placeholder="请输入" type="number" input-align="right"> 112 + <nut-input v-model="formData.max_speed_kmh" placeholder="请输入" type="number" input-align="right" @input="validateMaxSpeedInput">
113 <template #right> 113 <template #right>
114 <text class="unit">km/h</text> 114 <text class="unit">km/h</text>
115 </template> 115 </template>
...@@ -329,6 +329,62 @@ const onBrandModelCancel = () => { ...@@ -329,6 +329,62 @@ const onBrandModelCancel = () => {
329 } 329 }
330 330
331 /** 331 /**
332 + * 通用数字输入验证函数,限制范围在0-99999之间
333 + * @param {Object} event - 输入事件对象
334 + * @param {String} field - 字段名
335 + * @param {Boolean} allowDecimal - 是否允许小数,默认false
336 + */
337 +const validateNumberInput = (event, field, allowDecimal = false) => {
338 + let value = event.detail.value
339 +
340 + // 只保留数字和小数点(如果允许),删除其他字符
341 + if (allowDecimal) {
342 + value = value.replace(/[^0-9.]/g, '')
343 +
344 + // 防止多个小数点,只保留第一个小数点
345 + const dotIndex = value.indexOf('.')
346 + if (dotIndex !== -1) {
347 + value = value.substring(0, dotIndex + 1) + value.substring(dotIndex + 1).replace(/\./g, '')
348 + }
349 +
350 + // 防止以小数点开头
351 + if (value.startsWith('.')) {
352 + value = '0' + value
353 + }
354 + } else {
355 + // 只允许整数
356 + value = value.replace(/[^0-9]/g, '')
357 + }
358 +
359 + // 限制范围在0-99999之间
360 + const numValue = parseFloat(value)
361 + if (numValue > 99999) {
362 + value = '99999'
363 + }
364 +
365 + // 使用 nextTick 确保视图更新
366 + Taro.nextTick(() => {
367 + formData[field] = value
368 + })
369 +}
370 +
371 +/**
372 + * 校验续航里程输入,只允许整数,范围0-99999
373 + * @param {Object} event - 输入事件对象
374 + */
375 +const validateRangeInput = (event) => {
376 + validateNumberInput(event, 'range_km', false)
377 +}
378 +
379 +/**
380 + * 校验最高时速输入,只允许整数,范围0-99999
381 + * @param {Object} event - 输入事件对象
382 + */
383 +const validateMaxSpeedInput = (event) => {
384 + validateNumberInput(event, 'max_speed_kmh', false)
385 +}
386 +
387 +/**
332 * 加载品牌型号数据 388 * 加载品牌型号数据
333 */ 389 */
334 const loadBrandsModels = async () => { 390 const loadBrandsModels = async () => {
......