feat(车辆发布): 实现真实API调用并完善表单处理
- 替换模拟数据为真实API调用,包括获取车辆详情、编辑和新增接口 - 修改学校字段为school_id和school_name以匹配接口数据结构 - 完善表单提交后的跳转逻辑和加载状态处理 - 移除模拟请求代码,直接使用真实API响应处理
Showing
1 changed file
with
58 additions
and
83 deletions
| ... | @@ -94,7 +94,7 @@ | ... | @@ -94,7 +94,7 @@ |
| 94 | <text class="form-label">所在学校</text> | 94 | <text class="form-label">所在学校</text> |
| 95 | </view> | 95 | </view> |
| 96 | <view class="form-item-right"> | 96 | <view class="form-item-right"> |
| 97 | - <text class="form-value">{{ formData.school || '上海理工大学' }}</text> | 97 | + <text class="form-value">{{ formData.school_name || '请选择' }}</text> |
| 98 | <Right class="arrow-icon" /> | 98 | <Right class="arrow-icon" /> |
| 99 | </view> | 99 | </view> |
| 100 | </view> | 100 | </view> |
| ... | @@ -323,8 +323,7 @@ import { checkPermission, PERMISSION_TYPES } from '@/utils/permission' | ... | @@ -323,8 +323,7 @@ import { checkPermission, PERMISSION_TYPES } from '@/utils/permission' |
| 323 | import './index.less' | 323 | import './index.less' |
| 324 | 324 | ||
| 325 | // 导入接口 | 325 | // 导入接口 |
| 326 | -// import { addVehicleAPI, editVehicleAPI, getVehicleDetailAPI } from '@/api/car'; | 326 | +import { addVehicleAPI, editVehicleAPI, getVehicleDetailAPI } from '@/api/car'; |
| 327 | -import { addVehicleAPI } from '@/api/car'; | ||
| 328 | 327 | ||
| 329 | const themeVars = ref({ | 328 | const themeVars = ref({ |
| 330 | navbarBackground: '#fb923c', | 329 | navbarBackground: '#fb923c', |
| ... | @@ -367,7 +366,8 @@ const closePreview = () => { | ... | @@ -367,7 +366,8 @@ const closePreview = () => { |
| 367 | 366 | ||
| 368 | // 表单数据 | 367 | // 表单数据 |
| 369 | const formData = reactive({ | 368 | const formData = reactive({ |
| 370 | - school: '', | 369 | + school_name: '', |
| 370 | + school_id: '', | ||
| 371 | brand: '', | 371 | brand: '', |
| 372 | model: '', | 372 | model: '', |
| 373 | brandModel: '', // 品牌型号组合字段,用于表单验证 | 373 | brandModel: '', // 品牌型号组合字段,用于表单验证 |
| ... | @@ -414,6 +414,7 @@ const conditionValue = ref([]) | ... | @@ -414,6 +414,7 @@ const conditionValue = ref([]) |
| 414 | const brakeWearValue = ref([]) | 414 | const brakeWearValue = ref([]) |
| 415 | const tireWearValue = ref([]) | 415 | const tireWearValue = ref([]) |
| 416 | 416 | ||
| 417 | +// TODO: 模拟数据需要等接口 | ||
| 417 | // 选择器选项数据 | 418 | // 选择器选项数据 |
| 418 | const schoolOptions = ref([ | 419 | const schoolOptions = ref([ |
| 419 | { text: '上海理工大学', value: '上海理工大学' }, | 420 | { text: '上海理工大学', value: '上海理工大学' }, |
| ... | @@ -634,7 +635,8 @@ const showTireWearPicker = () => { | ... | @@ -634,7 +635,8 @@ const showTireWearPicker = () => { |
| 634 | * 学校选择确认 | 635 | * 学校选择确认 |
| 635 | */ | 636 | */ |
| 636 | const onSchoolConfirm = ({ selectedValue }) => { | 637 | const onSchoolConfirm = ({ selectedValue }) => { |
| 637 | - formData.school = selectedValue[0] | 638 | + formData.school_id = selectedValue[0].id |
| 639 | + formData.school_name = selectedValue[0].name | ||
| 638 | schoolPickerVisible.value = false | 640 | schoolPickerVisible.value = false |
| 639 | } | 641 | } |
| 640 | 642 | ||
| ... | @@ -780,22 +782,30 @@ const convertScoreToText = (score, type) => { | ... | @@ -780,22 +782,30 @@ const convertScoreToText = (score, type) => { |
| 780 | const createCar = async (data) => { | 782 | const createCar = async (data) => { |
| 781 | const { code } = await addVehicleAPI({ ...data }) | 783 | const { code } = await addVehicleAPI({ ...data }) |
| 782 | if (code) { | 784 | if (code) { |
| 785 | + Taro.hideLoading() | ||
| 783 | Taro.showToast({ | 786 | Taro.showToast({ |
| 784 | title: '发布成功', | 787 | title: '发布成功', |
| 785 | - icon: 'success' | 788 | + icon: 'success', |
| 789 | + duration: 2000, | ||
| 790 | + complete: () => { | ||
| 791 | + Taro.switchTab({ url: '/pages/index/index' }) | ||
| 792 | + } | ||
| 786 | }) | 793 | }) |
| 787 | - Taro.navigateBack() | ||
| 788 | } | 794 | } |
| 789 | } | 795 | } |
| 790 | 796 | ||
| 791 | const updateCar = async (id, data) => { | 797 | const updateCar = async (id, data) => { |
| 792 | - const { code } = await updateVehicleAPI({ id, ...data }) | 798 | + const { code } = await editVehicleAPI({ id, ...data }) |
| 793 | if (code) { | 799 | if (code) { |
| 800 | + Taro.hideLoading() | ||
| 794 | Taro.showToast({ | 801 | Taro.showToast({ |
| 795 | title: '保存成功', | 802 | title: '保存成功', |
| 796 | - icon: 'success' | 803 | + icon: 'success', |
| 804 | + duration: 2000, | ||
| 805 | + complete: () => { | ||
| 806 | + Taro.navigateBack() | ||
| 807 | + } | ||
| 797 | }) | 808 | }) |
| 798 | - Taro.navigateBack() | ||
| 799 | } | 809 | } |
| 800 | } | 810 | } |
| 801 | 811 | ||
| ... | @@ -828,25 +838,6 @@ const onPublish = async () => { | ... | @@ -828,25 +838,6 @@ const onPublish = async () => { |
| 828 | } else { | 838 | } else { |
| 829 | await createCar(submitData) | 839 | await createCar(submitData) |
| 830 | } | 840 | } |
| 831 | - | ||
| 832 | - // 模拟请求 | ||
| 833 | - setTimeout(() => { | ||
| 834 | - Taro.hideLoading() | ||
| 835 | - const successTitle = isEditMode.value ? '保存成功' : '发布成功' | ||
| 836 | - Taro.showToast({ | ||
| 837 | - title: successTitle, | ||
| 838 | - icon: 'success' | ||
| 839 | - }) | ||
| 840 | - | ||
| 841 | - // 成功后跳转 | ||
| 842 | - setTimeout(() => { | ||
| 843 | - if (isEditMode.value) { | ||
| 844 | - Taro.navigateBack() | ||
| 845 | - } else { | ||
| 846 | - Taro.switchTab({ url: '/pages/index/index' }) | ||
| 847 | - } | ||
| 848 | - }, 1500) | ||
| 849 | - }, 2000) | ||
| 850 | } | 841 | } |
| 851 | 842 | ||
| 852 | /** | 843 | /** |
| ... | @@ -894,61 +885,45 @@ const loadCarData = async () => { | ... | @@ -894,61 +885,45 @@ const loadCarData = async () => { |
| 894 | Taro.showLoading({ title: '加载中...' }) | 885 | Taro.showLoading({ title: '加载中...' }) |
| 895 | 886 | ||
| 896 | // TODO: 调用真实API获取车辆数据 | 887 | // TODO: 调用真实API获取车辆数据 |
| 897 | - // const carData = await getCarById(carId.value) | 888 | + const { code, data } = await getVehicleDetailAPI({ id: carId.value }) |
| 898 | - | 889 | + |
| 899 | - // 模拟API响应数据 | 890 | + if (code) { |
| 900 | - const mockCarData = { | 891 | + // 响应数据 |
| 901 | - school: '上海理工大学', | 892 | + const carData = data; |
| 902 | - brand: '小牛电动', | 893 | + |
| 903 | - model: 'NGT', | 894 | + // 填充表单数据,如果是数字则转换为文字 |
| 904 | - manufacture_year: '2023年', | 895 | + Object.assign(formData, { |
| 905 | - new_level: '9成新', | 896 | + school_id: carData.school_id, |
| 906 | - total_mileage_km: '1200', | 897 | + school_name: carData.school_name, |
| 907 | - range_km: '60', | 898 | + brand: carData.brand, |
| 908 | - maxSpeed: '25', | 899 | + model: carData.model, |
| 909 | - battery_capacity_ah: '20', | 900 | + manufacture_year: carData.manufacture_year, |
| 910 | - // batteryWear: '轻微磨损', | 901 | + new_level: typeof carData.new_level === 'number' ? convertScoreToText(carData.new_level, 'condition') : carData.new_level, |
| 911 | - brake_wear_level: '轻微磨损', | 902 | + total_mileage_km: carData.total_mileage_km, |
| 912 | - tire_wear_level: '轻微磨损', | 903 | + range_km: carData.range_km, |
| 913 | - price: '3200', | 904 | + maxSpeed: carData.maxSpeed, |
| 914 | - market_price: '6500', | 905 | + battery_capacity_ah: carData.battery_capacity_ah, |
| 915 | - note: '车况良好,电池续航正常,无重大事故,平时保养得当。', | 906 | + // batteryWear: carData.batteryWear, |
| 916 | - images: { | 907 | + brake_wear_level: typeof carData.brake_wear_level === 'number' ? convertScoreToText(carData.brake_wear_level, 'wear') : carData.brake_wear_level, |
| 917 | - front: 'https://picsum.photos/300/200?random=1', | 908 | + tire_wear_level: typeof carData.tire_wear_level === 'number' ? convertScoreToText(carData.tire_wear_level, 'wear') : carData.tire_wear_level, |
| 918 | - left: 'https://picsum.photos/300/200?random=2', | 909 | + price: carData.price, |
| 919 | - right: 'https://picsum.photos/300/200?random=3', | 910 | + market_price: carData.market_price, |
| 920 | - other: 'https://picsum.photos/300/200?random=4' | 911 | + note: carData.note |
| 921 | - } | 912 | + }) |
| 922 | - } | ||
| 923 | - | ||
| 924 | - // 填充表单数据,如果是数字则转换为文字 | ||
| 925 | - Object.assign(formData, { | ||
| 926 | - school: mockCarData.school, | ||
| 927 | - brand: mockCarData.brand, | ||
| 928 | - model: mockCarData.model, | ||
| 929 | - manufacture_year: mockCarData.manufacture_year, | ||
| 930 | - new_level: typeof mockCarData.new_level === 'number' ? convertScoreToText(mockCarData.new_level, 'condition') : mockCarData.new_level, | ||
| 931 | - total_mileage_km: mockCarData.total_mileage_km, | ||
| 932 | - range_km: mockCarData.range_km, | ||
| 933 | - maxSpeed: mockCarData.maxSpeed, | ||
| 934 | - battery_capacity_ah: mockCarData.battery_capacity_ah, | ||
| 935 | - // batteryWear: mockCarData.batteryWear, | ||
| 936 | - brake_wear_level: typeof mockCarData.brake_wear_level === 'number' ? convertScoreToText(mockCarData.brake_wear_level, 'wear') : mockCarData.brake_wear_level, | ||
| 937 | - tire_wear_level: typeof mockCarData.tire_wear_level === 'number' ? convertScoreToText(mockCarData.tire_wear_level, 'wear') : mockCarData.tire_wear_level, | ||
| 938 | - price: mockCarData.price, | ||
| 939 | - market_price: mockCarData.market_price, | ||
| 940 | - note: mockCarData.note | ||
| 941 | - }) | ||
| 942 | - | ||
| 943 | - // 填充图片数据 | ||
| 944 | - Object.assign(uploadedImages, mockCarData.images) | ||
| 945 | - // 同时填充formData中的照片字段 | ||
| 946 | - formData.front_photo = mockCarData.images.front || '' | ||
| 947 | - formData.left_photo = mockCarData.images.left || '' | ||
| 948 | - formData.right_photo = mockCarData.images.right || '' | ||
| 949 | - formData.other_photo = mockCarData.images.other || '' | ||
| 950 | 913 | ||
| 951 | - Taro.hideLoading() | 914 | + // 填充图片数据 |
| 915 | + uploadedImages.front = carData.front_photo || '' | ||
| 916 | + uploadedImages.left = carData.left_photo || '' | ||
| 917 | + uploadedImages.right = carData.right_photo || '' | ||
| 918 | + uploadedImages.other = carData.other_photo || '' | ||
| 919 | + // 同时填充formData中的照片字段 | ||
| 920 | + formData.front_photo = carData.front_photo || '' | ||
| 921 | + formData.left_photo = carData.left_photo || '' | ||
| 922 | + formData.right_photo = carData.right_photo || '' | ||
| 923 | + formData.other_photo = carData.other_photo || '' | ||
| 924 | + | ||
| 925 | + Taro.hideLoading() | ||
| 926 | + } | ||
| 952 | } catch (error) { | 927 | } catch (error) { |
| 953 | console.error('加载车辆数据失败:', error) | 928 | console.error('加载车辆数据失败:', error) |
| 954 | Taro.hideLoading() | 929 | Taro.hideLoading() | ... | ... |
-
Please register or login to post a comment