pet/pages/pets/add-pet.vue

218 lines
5.1 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>
<view class="add-pet-container">
<u-form :model="petForm" ref="petFormRef" :rules="rules" label-width="120">
<u-card :padding="20" margin="20">
<view class="avatar-section">
<u-avatar :src="petForm.avatar || '/static/default-pet.png'" size="80" shape="circle" @click="chooseAvatar"></u-avatar>
<u-text text="点击上传头像" type="tips" size="12"></u-text>
</view>
</u-card>
<u-card :padding="20" margin="20">
<u-form-item label="宠物姓名" prop="name" required>
<u-input v-model="petForm.name" placeholder="请输入宠物姓名"></u-input>
</u-form-item>
<u-form-item label="品种" prop="breed" required>
<u-input v-model="petForm.breed" placeholder="请输入宠物品种"></u-input>
</u-form-item>
<u-form-item label="性别" prop="gender" required>
<u-radio-group v-model="petForm.gender" placement="row">
<u-radio label="公" name="公"></u-radio>
<u-radio label="母" name="母"></u-radio>
</u-radio-group>
</u-form-item>
<u-form-item label="生日" prop="birthday" required>
<u-input v-model="petForm.birthday" placeholder="请选择生日" readonly @click="showDatePicker = true"></u-input>
</u-form-item>
<u-form-item label="体重" prop="weight">
<u-input v-model="petForm.weight" placeholder="请输入体重4.5kg"></u-input>
</u-form-item>
<u-form-item label="备注" prop="notes">
<u-textarea v-model="petForm.notes" placeholder="记录一些特殊信息..." maxlength="200"></u-textarea>
</u-form-item>
</u-card>
</u-form>
<view class="submit-section">
<u-button type="primary" text="保存宠物信息" @click="submitForm" :loading="loading"></u-button>
</view>
<!-- 日期选择器 -->
<u-datetime-picker
:show="showDatePicker"
v-model="selectedDate"
mode="date"
@confirm="confirmDate"
@cancel="showDatePicker = false">
</u-datetime-picker>
</view>
</template>
<script>
export default {
data() {
return {
loading: false,
showDatePicker: false,
selectedDate: new Date().getTime(),
petForm: {
name: '',
breed: '',
gender: '公',
birthday: '',
weight: '',
notes: '',
avatar: ''
},
rules: {
name: [
{
required: true,
message: '请输入宠物姓名',
trigger: 'blur'
}
],
breed: [
{
required: true,
message: '请输入宠物品种',
trigger: 'blur'
}
],
gender: [
{
required: true,
message: '请选择宠物性别',
trigger: 'change'
}
],
birthday: [
{
required: true,
message: '请选择宠物生日',
trigger: 'blur'
}
]
}
}
},
methods: {
chooseAvatar() {
uni.chooseImage({
count: 1,
sizeType: ['compressed'],
sourceType: ['album', 'camera'],
success: (res) => {
this.petForm.avatar = res.tempFilePaths[0]
},
fail: (err) => {
console.error('选择图片失败', err)
}
})
},
confirmDate(e) {
const date = new Date(e.value)
this.petForm.birthday = `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')}`
this.showDatePicker = false
},
submitForm() {
this.$refs.petFormRef.validate().then(valid => {
if (valid) {
this.savePet()
}
}).catch(errors => {
console.log('表单验证失败', errors)
})
},
savePet() {
this.loading = true
// 计算陪伴天数
const birthday = new Date(this.petForm.birthday)
const today = new Date()
const companionDays = Math.floor((today - birthday) / (1000 * 60 * 60 * 24))
// 计算年龄
const age = Math.floor(companionDays / 365)
const petData = {
...this.petForm,
id: Date.now(), // 简单的ID生成
age: age,
companionDays: companionDays,
createTime: new Date().toISOString()
}
// 模拟保存到本地存储
setTimeout(() => {
try {
let pets = uni.getStorageSync('pets') || []
pets.push(petData)
uni.setStorageSync('pets', pets)
this.loading = false
uni.showToast({
title: '保存成功',
icon: 'success'
})
setTimeout(() => {
uni.navigateBack()
}, 1500)
} catch (error) {
this.loading = false
uni.showToast({
title: '保存失败',
icon: 'error'
})
}
}, 1000)
}
}
}
</script>
<style lang="scss" scoped>
.add-pet-container {
background: linear-gradient(135deg, #FF8A80 0%, #FFB6C1 25%, #FECFEF 50%, #F8BBD9 100%);
min-height: 100vh;
}
.avatar-section {
display: flex;
flex-direction: column;
align-items: center;
gap: 20rpx;
}
.submit-section {
padding: 40rpx 30rpx;
}
:deep(.u-form-item) {
margin-bottom: 30rpx;
}
:deep(.u-card) {
background: rgba(255, 255, 255, 0.95);
backdrop-filter: blur(20rpx);
border-radius: 24rpx;
box-shadow: 0 8rpx 32rpx rgba(255, 138, 128, 0.2);
border: 1rpx solid rgba(255, 255, 255, 0.3);
}
:deep(.u-button--primary) {
background: linear-gradient(135deg, #FF8A80 0%, #FFB6C1 100%);
border: none;
box-shadow: 0 4rpx 16rpx rgba(255, 138, 128, 0.4);
}
</style>