acdr/acdr-ui/src/pages/pet/pet-detail-page.vue

189 lines
4.8 KiB
Vue

<route lang="json5">
{
style: {
navigationBarTitleText: '宠物详情',
navigationStyle: 'custom',
},
}
</route>
<template>
<TopBar />
<image
:src="imgUrl('@/static/push/bg.png')"
class="object-cover absolute top-[-80px] left-0 w-full z-[-1]"
mode="widthFix"
></image>
<view class="w-full h-40"></view>
<view class="w-full bg-[#ffff]">
<!-- 顶部背景和头像 -->
<view class="relative">
<view class="absolute left-4 bottom-[-20px] z-10">
<image
:src="petInfo.profileUrl ? imgUrl(petInfo.profileUrl) : imgUrl('@/static/icons/cat.png')"
class="w-20 h-20 object-cover rounded-full border-4 border-white"
></image>
</view>
<!-- 圆角遮罩 -->
<view
class="absolute bottom-[-5px] left-0 w-full h-6 bg-white rounded-tl-xl rounded-tr-xl z-0"
></view>
</view>
<!-- 数据统计 -->
<view class="flex justify-around bg-white pt-4 rounded-lg">
<view class="text-center">
<text class="text-lg">0</text>
<text class="block text-gray-600">粉丝</text>
</view>
<view class="text-center">
<text class="text-lg">0</text>
<text class="block text-gray-600">关注度</text>
</view>
<view class="text-center">
<text class="text-lg">0</text>
<text class="block text-gray-600">获得赞</text>
</view>
</view>
<view class="pl-4 pr-4">
<!-- 宠物信息 -->
<view class="bg-white p-4 rounded-lg">
<text class="text-xl">{{ petInfo.name || 'cat' }}</text>
<view class="flex items-center mt-2">
<wd-icon name="calendar" size="20" class="text-[#ffc107]"></wd-icon>
<text class="ml-2 text-gray-600">
距离生日还有{{ daysUntilBirthday(petInfo.age) }}天哦
</text>
</view>
</view>
<!-- 操作按钮 -->
<view class="flex justify-between py-4">
<button
@click="editPet(petInfo.id)"
class="bg-[#F0985A] text-white rounded-lg py-2 px-6 h-9 flex-grow-[8] flex items-center justify-center"
>
修改信息
</button>
<button
@click="share"
class="bg-[#ffc107] text-white rounded-lg py-2 px-6 h-9 flex-grow-[2] flex items-center justify-center ml-4"
>
分享
</button>
</view>
<!-- 标签栏 -->
<view class="flex justify-around bg-white py-2 rounded-lg">
<view
v-for="tab in tabs"
:key="tab"
:class="[
'text-lg px-4',
activeTab === tab
? 'text-[#ffc107] relative border-b-2 border-[#ffc107]'
: 'text-gray-600',
]"
@click="activeTab = tab"
>
{{ tab }}
<view v-if="activeTab === tab" class="active-underline"></view>
</view>
</view>
<!-- 内容提示 -->
<EmptyState type="default" message="暂无内容" />
</view>
</view>
</template>
<script setup>
import EmptyState from '@/components/EmptyState.vue'
import TopBar from '@/components/TopBar.vue'
import { imgUrl, toast, toPath } from '@/utils/commUtils'
import { httpGet } from '@/utils/http'
import { ref } from 'vue'
const tabs = ref(['全部', '心情', '养护', '清洁'])
const activeTab = ref('全部')
const petInfo = ref({})
const getPetId = async (id) => {
try {
const res = await httpGet('/petInfo/find_by_id/' + id)
if (res.code === 200) {
petInfo.value = res.data
console.log(petInfo.value)
} else {
toast(res.data.message)
}
} catch (e) {
console.log(e)
}
}
const editPet = (id) => {
toPath('/pages/pet/pet-add-page?id=' + id)
}
const share = () => {}
const daysUntilBirthday = (birthDateStr) => {
// 将出生日期转换为日期对象
const birthDate = new Date(birthDateStr)
const today = new Date()
// 将出生年份替换为当前年份
const nextBirthday = new Date(today.getFullYear(), birthDate.getMonth(), birthDate.getDate())
// 如果今年的生日已经过了,则计算明年的生日
if (nextBirthday < today) {
nextBirthday.setFullYear(today.getFullYear() + 1)
}
// 计算天数差
const oneDay = 24 * 60 * 60 * 1000 // 一天的毫秒数
const daysLeft = Math.ceil((nextBirthday - today) / oneDay)
return daysLeft
}
onLoad(async (options) => {
if (options.id) {
await getPetId(options.id)
}
})
</script>
<style scoped>
/* 使用 UnoCSS 定义样式 */
.view {
@apply bg-[#F5F5F5] h-full;
}
.image {
@apply w-full h-40 object-cover;
}
.button {
@apply bg-[#ffc107] text-white rounded-lg py-2 px-6 h-12;
}
.text-gray-600 {
@apply text-gray-600;
}
.text-gray-400 {
@apply text-gray-400;
}
.border-b-2 {
border-bottom-width: 2px;
}
.active-underline {
@apply w-6 h-[0.20rem] bg-yellow-400 mt-1 absolute bottom-[-2px] left-[1.45rem] transform;
}
</style>