hookehuyr

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

- 替换模拟数据为真实API调用,包括获取车辆详情、编辑和新增接口
- 修改学校字段为school_id和school_name以匹配接口数据结构
- 完善表单提交后的跳转逻辑和加载状态处理
- 移除模拟请求代码,直接使用真实API响应处理
......@@ -94,7 +94,7 @@
<text class="form-label">所在学校</text>
</view>
<view class="form-item-right">
<text class="form-value">{{ formData.school || '上海理工大学' }}</text>
<text class="form-value">{{ formData.school_name || '请选择' }}</text>
<Right class="arrow-icon" />
</view>
</view>
......@@ -323,8 +323,7 @@ import { checkPermission, PERMISSION_TYPES } from '@/utils/permission'
import './index.less'
// 导入接口
// import { addVehicleAPI, editVehicleAPI, getVehicleDetailAPI } from '@/api/car';
import { addVehicleAPI } from '@/api/car';
import { addVehicleAPI, editVehicleAPI, getVehicleDetailAPI } from '@/api/car';
const themeVars = ref({
navbarBackground: '#fb923c',
......@@ -367,7 +366,8 @@ const closePreview = () => {
// 表单数据
const formData = reactive({
school: '',
school_name: '',
school_id: '',
brand: '',
model: '',
brandModel: '', // 品牌型号组合字段,用于表单验证
......@@ -414,6 +414,7 @@ const conditionValue = ref([])
const brakeWearValue = ref([])
const tireWearValue = ref([])
// TODO: 模拟数据需要等接口
// 选择器选项数据
const schoolOptions = ref([
{ text: '上海理工大学', value: '上海理工大学' },
......@@ -634,7 +635,8 @@ const showTireWearPicker = () => {
* 学校选择确认
*/
const onSchoolConfirm = ({ selectedValue }) => {
formData.school = selectedValue[0]
formData.school_id = selectedValue[0].id
formData.school_name = selectedValue[0].name
schoolPickerVisible.value = false
}
......@@ -780,22 +782,30 @@ const convertScoreToText = (score, type) => {
const createCar = async (data) => {
const { code } = await addVehicleAPI({ ...data })
if (code) {
Taro.hideLoading()
Taro.showToast({
title: '发布成功',
icon: 'success'
icon: 'success',
duration: 2000,
complete: () => {
Taro.switchTab({ url: '/pages/index/index' })
}
})
Taro.navigateBack()
}
}
const updateCar = async (id, data) => {
const { code } = await updateVehicleAPI({ id, ...data })
const { code } = await editVehicleAPI({ id, ...data })
if (code) {
Taro.hideLoading()
Taro.showToast({
title: '保存成功',
icon: 'success'
icon: 'success',
duration: 2000,
complete: () => {
Taro.navigateBack()
}
})
Taro.navigateBack()
}
}
......@@ -828,25 +838,6 @@ const onPublish = async () => {
} else {
await createCar(submitData)
}
// 模拟请求
setTimeout(() => {
Taro.hideLoading()
const successTitle = isEditMode.value ? '保存成功' : '发布成功'
Taro.showToast({
title: successTitle,
icon: 'success'
})
// 成功后跳转
setTimeout(() => {
if (isEditMode.value) {
Taro.navigateBack()
} else {
Taro.switchTab({ url: '/pages/index/index' })
}
}, 1500)
}, 2000)
}
/**
......@@ -894,61 +885,45 @@ const loadCarData = async () => {
Taro.showLoading({ title: '加载中...' })
// TODO: 调用真实API获取车辆数据
// const carData = await getCarById(carId.value)
// 模拟API响应数据
const mockCarData = {
school: '上海理工大学',
brand: '小牛电动',
model: 'NGT',
manufacture_year: '2023年',
new_level: '9成新',
total_mileage_km: '1200',
range_km: '60',
maxSpeed: '25',
battery_capacity_ah: '20',
// batteryWear: '轻微磨损',
brake_wear_level: '轻微磨损',
tire_wear_level: '轻微磨损',
price: '3200',
market_price: '6500',
note: '车况良好,电池续航正常,无重大事故,平时保养得当。',
images: {
front: 'https://picsum.photos/300/200?random=1',
left: 'https://picsum.photos/300/200?random=2',
right: 'https://picsum.photos/300/200?random=3',
other: 'https://picsum.photos/300/200?random=4'
}
}
// 填充表单数据,如果是数字则转换为文字
Object.assign(formData, {
school: mockCarData.school,
brand: mockCarData.brand,
model: mockCarData.model,
manufacture_year: mockCarData.manufacture_year,
new_level: typeof mockCarData.new_level === 'number' ? convertScoreToText(mockCarData.new_level, 'condition') : mockCarData.new_level,
total_mileage_km: mockCarData.total_mileage_km,
range_km: mockCarData.range_km,
maxSpeed: mockCarData.maxSpeed,
battery_capacity_ah: mockCarData.battery_capacity_ah,
// batteryWear: mockCarData.batteryWear,
brake_wear_level: typeof mockCarData.brake_wear_level === 'number' ? convertScoreToText(mockCarData.brake_wear_level, 'wear') : mockCarData.brake_wear_level,
tire_wear_level: typeof mockCarData.tire_wear_level === 'number' ? convertScoreToText(mockCarData.tire_wear_level, 'wear') : mockCarData.tire_wear_level,
price: mockCarData.price,
market_price: mockCarData.market_price,
note: mockCarData.note
})
// 填充图片数据
Object.assign(uploadedImages, mockCarData.images)
// 同时填充formData中的照片字段
formData.front_photo = mockCarData.images.front || ''
formData.left_photo = mockCarData.images.left || ''
formData.right_photo = mockCarData.images.right || ''
formData.other_photo = mockCarData.images.other || ''
const { code, data } = await getVehicleDetailAPI({ id: carId.value })
if (code) {
// 响应数据
const carData = data;
// 填充表单数据,如果是数字则转换为文字
Object.assign(formData, {
school_id: carData.school_id,
school_name: carData.school_name,
brand: carData.brand,
model: carData.model,
manufacture_year: carData.manufacture_year,
new_level: typeof carData.new_level === 'number' ? convertScoreToText(carData.new_level, 'condition') : carData.new_level,
total_mileage_km: carData.total_mileage_km,
range_km: carData.range_km,
maxSpeed: carData.maxSpeed,
battery_capacity_ah: carData.battery_capacity_ah,
// batteryWear: carData.batteryWear,
brake_wear_level: typeof carData.brake_wear_level === 'number' ? convertScoreToText(carData.brake_wear_level, 'wear') : carData.brake_wear_level,
tire_wear_level: typeof carData.tire_wear_level === 'number' ? convertScoreToText(carData.tire_wear_level, 'wear') : carData.tire_wear_level,
price: carData.price,
market_price: carData.market_price,
note: carData.note
})
Taro.hideLoading()
// 填充图片数据
uploadedImages.front = carData.front_photo || ''
uploadedImages.left = carData.left_photo || ''
uploadedImages.right = carData.right_photo || ''
uploadedImages.other = carData.other_photo || ''
// 同时填充formData中的照片字段
formData.front_photo = carData.front_photo || ''
formData.left_photo = carData.left_photo || ''
formData.right_photo = carData.right_photo || ''
formData.other_photo = carData.other_photo || ''
Taro.hideLoading()
}
} catch (error) {
console.error('加载车辆数据失败:', error)
Taro.hideLoading()
......