Files
car_rental/frontend/src/views/CarDetail.vue
王子琦 0446cc184b add
2026-01-16 13:26:57 +08:00

99 lines
2.9 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div>
<a-card v-if="car" :title="car.brand + ' ' + car.model">
<p>车牌{{ car.plateNo }}</p>
<p>日租金¥{{ car.pricePerDay }}</p>
<p>押金¥{{ car.deposit }}</p>
<p>座位{{ car.seats }} | 变速箱{{ car.transmission }} | 油耗类型{{ car.fuelType }}</p>
<p>里程{{ car.mileage }} km</p>
<p>{{ car.description }}</p>
<a-tag v-if="car.isSpecial" color="red">特价</a-tag>
<a-tag v-if="car.status !== 'AVAILABLE'" color="orange">{{ mapText(carStatusMap, car.status) }}</a-tag>
<div style="margin-top: 12px; display: flex; gap: 12px;">
<a-button type="primary" @click="toggleFavorite">
{{ isFavorite ? '取消收藏' : '加入收藏' }}
</a-button>
</div>
</a-card>
<div style="height: 16px"></div>
<a-card>
<div class="section-title">租车下单</div>
<a-form :model="orderForm" layout="inline">
<a-form-item label="租期">
<a-range-picker v-model="orderForm.range" />
</a-form-item>
<a-form-item>
<a-button type="primary" @click="createOrder">提交订单</a-button>
</a-form-item>
</a-form>
</a-card>
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { Message } from '@arco-design/web-vue'
import http from '../api/http'
import { useAuthStore } from '../store/auth'
import { carStatusMap, mapText } from '../utils/format'
const route = useRoute()
const router = useRouter()
const auth = useAuthStore()
const car = ref(null)
const isFavorite = ref(false)
const orderForm = ref({ range: [] })
const loadCar = async () => {
car.value = await http.get(`/api/cars/${route.params.id}`)
}
const loadFavorite = async () => {
if (!auth.token) return
const favorites = await http.get('/api/user/favorite')
isFavorite.value = favorites.some((item) => item.carId === Number(route.params.id))
}
const toggleFavorite = async () => {
if (!auth.token) {
router.push('/login')
return
}
if (isFavorite.value) {
await http.delete(`/api/user/favorite/${route.params.id}`)
isFavorite.value = false
Message.success('已取消收藏')
} else {
await http.post(`/api/user/favorite/${route.params.id}`)
isFavorite.value = true
Message.success('已收藏')
}
}
const createOrder = async () => {
if (!auth.token) {
router.push('/login')
return
}
if (!orderForm.value.range || orderForm.value.range.length !== 2) {
Message.warning('请选择租期')
return
}
const [startDate, endDate] = orderForm.value.range
await http.post('/api/user/order', {
carId: car.value.id,
startDate,
endDate
})
Message.success('订单创建成功,请前往我的订单支付')
router.push('/orders')
}
onMounted(() => {
loadCar()
loadFavorite()
})
</script>