acdr-ui/src/pages/pet/pet-add-page.vue
2024-09-13 11:21:59 +08:00

406 lines
13 KiB
Vue

<route lang="json5">
{
style: {
navigationBarTitleText: '宠物档案信息',
},
}
</route>
<template>
<view class="p-5 bg-gray-100 h-screen">
<!-- 上传头像区域 -->
<view class="flex justify-center my-5">
<view class="relative">
<wd-img
round
:src="imageSrc"
mode="aspectFill"
class="w-24 h-24 rounded-full"
@error="imageLoadError"
></wd-img>
<view
class="absolute bottom-0 right-0 bg-white rounded-full w-[24px] h-[24px] flex justify-center items-center"
>
<wd-icon name="add" color="#ffc107" @click="chooseImage"></wd-icon>
</view>
</view>
</view>
<view class="text-center text-sm text-gray-600">宠物头像</view>
<!-- 表单区域 -->
<view class="mt-5 bg-white p-5 rounded-lg shadow">
<!-- 名字 -->
<view class="mb-4">
<text class="text-gray-800">宠物名字</text>
<input placeholder="请输入名字" v-model="petName" />
</view>
<!-- 生日 -->
<view class="mb-4">
<text class="text-gray-800">宠物生日</text>
<picker mode="date" :value="petBirthday" start="2000-01-01" @change="onBirthdayChange">
<view class="w-full mt-2 p-2 border border-gray-300 rounded">
{{ petBirthday || '请选择生日' }}
</view>
</picker>
</view>
<!-- 性别 -->
<view class="mb-4">
<text class="text-gray-800">宠物性别</text>
<view class="flex mt-2">
<button
:class="[
'flex-1 py-2 mx-1',
gender === '男孩' ? 'bg-blue-500 text-white' : 'bg-gray-200',
]"
@click="gender = '男孩'"
>
男孩
</button>
<button
:class="[
'flex-1 py-2 mx-1',
gender === '女孩' ? 'bg-pink-500 text-white' : 'bg-gray-200',
]"
@click="gender = '女孩'"
>
女孩
</button>
</view>
</view>
<!-- 品种 -->
<view class="mb-4">
<text class="text-gray-800">宠物品种</text>
<wd-picker
class="w-full mt-2 p-2 border border-gray-300 rounded"
:columns="breedOptions"
v-model="petBreed"
/>
</view>
<!-- 毛色 -->
<view class="mb-4">
<text class="text-gray-800">宠物毛色</text>
<wd-picker
class="w-full mt-2 p-2 border border-gray-300 rounded"
:columns="colorOptions"
v-model="petColor"
/>
</view>
</view>
<!-- 提交按钮 -->
<view class="mt-5">
<button
class="w-full py-4 bg-[#ffc107] text-white text-center rounded-full text-lg h-11 flex items-center justify-center shadow-lg"
@click="createPetProfile"
>
{{ petId ? '更新电子身份证' : '创建电子身份证' }}
</button>
</view>
<!-- 删除按钮 -->
<button
v-if="petId"
class="mt-5 w-full py-4 bg-red-500 text-white rounded-full text-lg h-11 flex items-center justify-center shadow-lg"
@click="deletePet"
>
删除
</button>
</view>
</template>
<script setup>
import { useUserStore } from '@/store'
import { baseUrl } from '@/utils/commUtils'
import { httpPost, httpGet } from '@/utils/http'
import { ref } from 'vue'
const petName = ref('')
const petBirthday = ref('')
const gender = ref('')
const petBreed = ref('')
const petColor = ref('')
const imageSrc = ref('https://via.placeholder.com/150')
const userId = ref('')
const petId = ref(null)
const imageLoadError = (errMsg) => {
console.log('图片加载失败')
imageSrc.value = 'https://via.placeholder.com/150'
}
const userStore = useUserStore()
const breedOptions = ref([
{ value: '其他', label: '其他' },
{ value: '阿比西尼亚猫', label: '阿比西尼亚猫' },
{ value: '安哥拉猫', label: '安哥拉猫' },
{ value: '埃及猫', label: '埃及猫' },
{ value: '奥西猫', label: '奥西猫' },
{ value: '巴厘猫', label: '巴厘猫' },
{ value: '波米拉猫', label: '波米拉猫' },
{ value: '伯曼猫', label: '伯曼猫' },
{ value: '布偶猫', label: '布偶猫' },
{ value: '波斯猫', label: '波斯猫' },
])
const colorOptions = ref([
{ value: '黑白色', label: '黑白色' },
{ value: '白色', label: '白色' },
{ value: '黑色', label: '黑色' },
{ value: '橘色', label: '橘色' },
{ value: '蓝色', label: '蓝色' },
{ value: '蓝白色', label: '蓝白色' },
{ value: '橘白色', label: '橘白色' },
{ value: '灰色', label: '灰色' },
{ value: '灰白色', label: '灰白色' },
{ value: '乳色', label: '乳色' },
{ value: '乳白色', label: '乳白色' },
{ value: '棕色', label: '棕色' },
{ value: '棕白色', label: '棕白色' },
{ value: '银色', label: '银色' },
{ value: '银白色', label: '银白色' },
{ value: '雪色', label: '雪色' },
{ value: '木炭色', label: '木炭色' },
{ value: '金渐层', label: '金渐层' },
{ value: '蓝金渐层', label: '蓝金渐层' },
{ value: '银渐层', label: '银渐层' },
{ value: '金点', label: '金点' },
{ value: '银点', label: '银点' },
{ value: '重点色', label: '重点色' },
{ value: '手套色', label: '手套色' },
{ value: '海豹色', label: '海豹色' },
{ value: '火焰色', label: '火焰色' },
{ value: '蓝双色', label: '蓝双色' },
{ value: '海豹双色', label: '海豹双色' },
{ value: '梵色', label: '梵色' },
{ value: '玳瑁色', label: '玳瑁色' },
{ value: '三花色', label: '三花色' },
{ value: '烟灰色', label: '烟灰色' },
{ value: '虎斑纹', label: '虎斑纹' },
{ value: '棕虎斑', label: '棕虎斑' },
{ value: '银虎斑', label: '银虎斑' },
{ value: '红虎斑', label: '红虎斑' },
{ value: '山猫纹', label: '山猫纹' },
{ value: '玫瑰纹', label: '玫瑰纹' },
{ value: '大理石纹', label: '大理石纹' },
{ value: '其他', label: '其他' },
{ value: '褐色', label: '褐色' },
{ value: '红色', label: '红色' },
{ value: '小鹿色', label: '小鹿色' },
{ value: '纯色', label: '纯色' },
{ value: '渐层色', label: '渐层色' },
{ value: '烟色', label: '烟色' },
{ value: '补丁', label: '补丁' },
{ value: '蓝虎斑', label: '蓝虎斑' },
{ value: '凯米尔虎斑', label: '凯米尔虎斑' },
{ value: '虎斑加白', label: '虎斑加白' },
{ value: '渐层加白', label: '渐层加白' },
{ value: '烟色加白', label: '烟色加白' },
{ value: '双色', label: '双色' },
{ value: '杂色', label: '杂色' },
{ value: '金吉拉银色', label: '金吉拉银色' },
{ value: '金吉拉金色', label: '金吉拉金色' },
{ value: '重点色加白', label: '重点色加白' },
{ value: '渐层重点色', label: '渐层重点色' },
{ value: '貂色', label: '貂色' },
{ value: '香槟色', label: '香槟色' },
{ value: '铂色', label: '铂色' },
{ value: '海豹山猫双色', label: '海豹山猫双色' },
{ value: '蓝山猫双色', label: '蓝山猫双色' },
{ value: '其他双色', label: '其他双色' },
{ value: '重点双色', label: '重点双色' },
{ value: '巧克力重点色', label: '巧克力重点色' },
{ value: '海豹重点色', label: '海豹重点色' },
{ value: '蓝重点色', label: '蓝重点色' },
{ value: '丁香重点色', label: '丁香重点色' },
{ value: '金色', label: '金色' },
{ value: '浅三花色', label: '浅三花色' },
{ value: '鱼骨纹色', label: '鱼骨纹色' },
{ value: '混合色', label: '混合色' },
{ value: '橙褐色', label: '橙褐色' },
{ value: '柏色', label: '柏色' },
{ value: '布伦海姆色', label: '布伦海姆色' },
{ value: '纯红色', label: '纯红色' },
{ value: '橙色', label: '橙色' },
{ value: '紫色', label: '紫色' },
{ value: '淡灰色', label: '淡灰色' },
{ value: '黄色', label: '黄色' },
{ value: '浅红色', label: '浅红色' },
{ value: '野猪色', label: '野猪色' },
{ value: '巧克力色', label: '巧克力色' },
{ value: '黑铁灰色', label: '黑铁灰色' },
{ value: '盐与胡椒色', label: '盐与胡椒色' },
{ value: '红褐色', label: '红褐色' },
{ value: '黑褐色', label: '黑褐色' },
{ value: '花斑色', label: '花斑色' },
{ value: '马斑色', label: '马斑色' },
{ value: '灰褐色', label: '灰褐色' },
{ value: '银灰色', label: '银灰色' },
{ value: '椒盐色', label: '椒盐色' },
{ value: '金黄色', label: '金黄色' },
{ value: '桃红色', label: '桃红色' },
{ value: '火烈鸟红色', label: '火烈鸟红色' },
{ value: '麦色', label: '麦色' },
{ value: '浅黄褐色', label: '浅黄褐色' },
{ value: '浅黄色', label: '浅黄色' },
{ value: '浅米色', label: '浅米色' },
{ value: '灰黄色', label: '灰黄色' },
{ value: '黄褐色', label: '黄褐色' },
{ value: '杏色', label: '杏色' },
{ value: '沙色', label: '沙色' },
{ value: '沙褐色', label: '沙褐色' },
{ value: '蓝灰色', label: '蓝灰色' },
{ value: '浅麦色', label: '浅麦色' },
{ value: '黑银色', label: '黑银色' },
{ value: '棕褐色', label: '棕褐色' },
{ value: '淡棕色', label: '淡棕色' },
{ value: '赤褐色', label: '赤褐色' },
{ value: '浅棕色', label: '浅棕色' },
{ value: '浅巧克力色', label: '浅巧克力色' },
{ value: '深棕色', label: '深棕色' },
{ value: '灰白色', label: '灰白色' },
{ value: '柠檬色', label: '柠檬色' },
{ value: '浅褐色', label: '浅褐色' },
{ value: '深红褐色', label: '深红褐色' },
{ value: '斑点色', label: '斑点色' },
{ value: '虎斑色', label: '虎斑色' },
{ value: '淡黄色', label: '淡黄色' },
{ value: '粉红色', label: '粉红色' },
{ value: '深灰色', label: '深灰色' },
{ value: '黑棕色', label: '黑棕色' },
{ value: '铁锈色', label: '铁锈色' },
{ value: '棕红色', label: '棕红色' },
{ value: '深红色', label: '深红色' },
{ value: '深褐色', label: '深褐色' },
{ value: '奶油色', label: '奶油色' },
{ value: '鹿皮色', label: '鹿皮色' },
{ value: '橙黄色', label: '橙黄色' },
])
onLoad(async (options) => {
if (options && options.id) {
petId.value = options.id
await fetchPetData(petId.value)
}
})
const fetchPetData = async (id) => {
const response = await httpGet(`/petInfo/find_by_id/${id}`)
if (response.code === 200) {
const petData = response.data
petName.value = petData.name || ''
petBirthday.value = petData.age || ''
gender.value = petData.sex === 1 ? '男孩' : '女孩'
petBreed.value = petData.breed || ''
petColor.value = petData.hairColor || ''
imageSrc.value = baseUrl + petData.profileUrl || 'https://via.placeholder.com/150'
userId.value = petData.userId || '-1'
} else {
uni.showToast({ title: '获取宠物信息失败', icon: '' })
}
}
const chooseImage = () => {
uni.chooseImage({
count: 1,
success: (res) => {
imageSrc.value = res.tempFilePaths[0]
},
})
}
const onBirthdayChange = (e) => {
petBirthday.value = e.detail.value
}
const createPetProfile = () => {
const formData = {
id: petId.value || undefined,
name: petName.value,
age: petBirthday.value + ' 00:00:00',
sex: gender.value === '男孩' ? 1 : 0,
breed: petBreed.value,
hairColor: petColor.value,
}
if (petId.value) {
formData.userId = userId.value
}
const url = petId.value ? '/petInfo/update' : '/petInfo/addPet'
const isNetworkUrl = imageSrc.value.startsWith('http')
uni.uploadFile({
url,
filePath: imageSrc.value,
name: 'file',
formData,
header: {
satoken: `Bearer ${userStore.token}`, // 添加认证头部
},
success: (uploadRes) => {
const data = JSON.parse(uploadRes.data)
if (data.code === 200) {
uni.showToast({ title: petId.value ? '更新成功' : '创建成功', icon: 'success' })
resetForm()
uni.navigateBack()
} else {
uni.showToast({ title: data.message, icon: 'none' })
}
},
fail: (e) => {
console.log(e)
uni.showToast({ title: '上传失败', icon: 'none' })
},
})
}
const calculateAge = (birthday) => {
const birthDate = new Date(birthday)
const currentDate = new Date()
let age = currentDate.getFullYear() - birthDate.getFullYear()
const monthDiff = currentDate.getMonth() - birthDate.getMonth()
if (monthDiff < 0 || (monthDiff === 0 && currentDate.getDate() < birthDate.getDate())) {
age--
}
return age
}
const deletePet = () => {
uni.showModal({
title: '确认删除',
content: '你确定要删除这个宠物档案吗?',
success: (res) => {
if (res.confirm) {
httpPost('/petInfo/delete', { id: petId.value }).then(() => {
uni.showToast({ title: '删除成功', icon: 'success' })
uni.navigateBack()
})
}
},
})
}
const resetForm = () => {
petName.value = ''
petBirthday.value = ''
gender.value = ''
petBreed.value = ''
petColor.value = ''
imageSrc.value = 'https://via.placeholder.com/150'
}
</script>
<style scoped>
/* 使用 UnoCSS 定义样式 */
button {
@apply px-2 py-1 text-sm;
}
button.primary {
@apply px-2 py-1 bg-[#ffc107] text-white text-sm;
}
</style>