hookehuyr

feat(车辆发布): 实现真实API调用并完善表单处理

- 替换模拟数据为真实API调用,包括获取车辆详情、编辑和新增接口
- 修改学校字段为school_id和school_name以匹配接口数据结构
- 完善表单提交后的跳转逻辑和加载状态处理
- 移除模拟请求代码,直接使用真实API响应处理
...@@ -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()
......