feat(表单验证): 添加数字输入验证函数并应用至多个表单字段
实现通用数字输入验证函数 validateNumberInput,限制输入范围为0-99999,可选择是否允许小数 将验证函数应用于价格、里程、时速等表单字段,移除myAuthCar页面中注释的价格显示代码
Showing
3 changed files
with
129 additions
and
39 deletions
| 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 () => { | ... | ... |
-
Please register or login to post a comment