pet/utils/adoptionManager.js

679 lines
18 KiB
JavaScript

/**
* 宠物领养数据管理工具类
* 负责领养宠物数据的存储、筛选、搜索等管理
*/
class AdoptionManager {
constructor() {
this.storageKey = 'adoption_pets'
// 宠物类型配置
this.petTypes = {
cat: {
name: '猫咪',
icon: '🐱',
breeds: {
'british-shorthair': '英国短毛猫',
'american-shorthair': '美国短毛猫',
'persian': '波斯猫',
'ragdoll': '布偶猫',
'siamese': '暹罗猫',
'maine-coon': '缅因猫',
'scottish-fold': '苏格兰折耳猫',
'russian-blue': '俄罗斯蓝猫',
'bengal': '孟加拉猫',
'mixed': '混血猫',
'unknown': '品种不明'
}
},
dog: {
name: '狗狗',
icon: '🐶',
breeds: {
'golden-retriever': '金毛寻回犬',
'labrador': '拉布拉多',
'husky': '哈士奇',
'german-shepherd': '德国牧羊犬',
'poodle': '贵宾犬',
'chihuahua': '吉娃娃',
'bulldog': '斗牛犬',
'shiba-inu': '柴犬',
'corgi': '柯基',
'border-collie': '边境牧羊犬',
'mixed': '混血犬',
'unknown': '品种不明'
}
},
rabbit: {
name: '兔子',
icon: '🐰',
breeds: {
'holland-lop': '荷兰垂耳兔',
'mini-lop': '迷你垂耳兔',
'lionhead': '狮子头兔',
'dutch': '荷兰兔',
'angora': '安哥拉兔',
'mixed': '混血兔',
'unknown': '品种不明'
}
},
other: {
name: '其他',
icon: '🐾',
breeds: {
'hamster': '仓鼠',
'guinea-pig': '豚鼠',
'bird': '鸟类',
'turtle': '乌龟',
'fish': '鱼类',
'other': '其他'
}
}
}
// 地区数据(简化版三级联动)
this.regions = {
'beijing': {
name: '北京市',
cities: {
'beijing': {
name: '北京市',
districts: {
'chaoyang': '朝阳区',
'haidian': '海淀区',
'dongcheng': '东城区',
'xicheng': '西城区',
'fengtai': '丰台区',
'shijingshan': '石景山区'
}
}
}
},
'shanghai': {
name: '上海市',
cities: {
'shanghai': {
name: '上海市',
districts: {
'huangpu': '黄浦区',
'xuhui': '徐汇区',
'changning': '长宁区',
'jingan': '静安区',
'putuo': '普陀区',
'hongkou': '虹口区'
}
}
}
},
'guangdong': {
name: '广东省',
cities: {
'guangzhou': {
name: '广州市',
districts: {
'tianhe': '天河区',
'yuexiu': '越秀区',
'liwan': '荔湾区',
'haizhu': '海珠区',
'baiyun': '白云区',
'panyu': '番禺区'
}
},
'shenzhen': {
name: '深圳市',
districts: {
'futian': '福田区',
'luohu': '罗湖区',
'nanshan': '南山区',
'yantian': '盐田区',
'baoan': '宝安区',
'longgang': '龙岗区'
}
}
}
},
'jiangsu': {
name: '江苏省',
cities: {
'nanjing': {
name: '南京市',
districts: {
'xuanwu': '玄武区',
'qinhuai': '秦淮区',
'jianye': '建邺区',
'gulou': '鼓楼区',
'pukou': '浦口区',
'qixia': '栖霞区'
}
},
'suzhou': {
name: '苏州市',
districts: {
'gusu': '姑苏区',
'wuzhong': '吴中区',
'xiangcheng': '相城区',
'kunshan': '昆山市',
'changshu': '常熟市',
'zhangjiagang': '张家港市'
}
}
}
}
}
// 领养状态
this.adoptionStatus = {
available: { name: '可领养', color: '#4CAF50', icon: '✅' },
reserved: { name: '已预约', color: '#FF9800', icon: '⏰' },
adopted: { name: '已领养', color: '#9E9E9E', icon: '❤️' },
pending: { name: '审核中', color: '#2196F3', icon: '📋' }
}
}
/**
* 获取所有领养宠物数据
* @returns {Array} 领养宠物数组
*/
getAdoptionPets() {
try {
let pets = uni.getStorageSync(this.storageKey) || []
// 如果没有数据,初始化一些测试数据
if (pets.length === 0) {
pets = this.initializeTestData()
uni.setStorageSync(this.storageKey, pets)
}
return pets
} catch (error) {
console.error('获取领养宠物数据失败:', error)
return this.initializeTestData()
}
}
/**
* 初始化测试数据
* @returns {Array} 测试数据数组
*/
initializeTestData() {
const testData = []
// 猫咪数据
testData.push({
id: Date.now() + 1,
name: '小橘',
type: 'cat',
breed: 'british-shorthair',
age: 2,
gender: 'male',
photos: ['https://images.unsplash.com/photo-1574158622682-e40e69881006?w=400&h=300&fit=crop', 'https://images.unsplash.com/photo-1592194996308-7b43878e84a6?w=400&h=300&fit=crop'],
description: '小橘是一只非常温顺的英国短毛猫,性格亲人,喜欢和人互动。已经完成绝育手术和疫苗接种,身体健康。适合有爱心的家庭领养,希望能给它一个温暖的家。',
personality: ['温顺', '亲人', '安静', '乖巧'],
health: '健康良好,已绝育,疫苗齐全',
location: {
province: 'beijing',
city: 'beijing',
district: 'chaoyang',
address: '朝阳区宠物救助中心'
},
status: 'available',
requirements: [
'有稳定收入',
'有养猫经验',
'家中无其他宠物',
'同意定期回访'
],
contact: {
name: '北京爱心救助站',
phone: '138****1234',
wechat: 'rescue_station_bj',
type: 'organization'
},
publishTime: new Date(Date.now() - 2 * 24 * 60 * 60 * 1000).toISOString()
})
testData.push({
id: Date.now() + 2,
name: '小白',
type: 'dog',
breed: 'golden-retriever',
age: 1,
gender: 'female',
photos: ['https://images.unsplash.com/photo-1552053831-71594a27632d?w=400&h=300&fit=crop', 'https://images.unsplash.com/photo-1583337130417-3346a1be7dee?w=400&h=300&fit=crop'],
description: '小白是一只活泼可爱的金毛幼犬,性格温和友善,非常聪明好训练。喜欢和小朋友玩耍,是很好的家庭伴侣犬。目前疫苗接种进行中,身体健康活泼。',
personality: ['活泼', '聪明', '友善', '温和'],
health: '健康良好,疫苗接种中',
location: {
province: 'shanghai',
city: 'shanghai',
district: 'xuhui',
address: '徐汇区宠物医院'
},
status: 'available',
requirements: [
'有足够空间',
'每天遛狗',
'有耐心训练',
'定期体检'
],
contact: {
name: '张医生',
phone: '139****5678',
wechat: 'dr_zhang_sh',
type: 'individual'
},
publishTime: new Date(Date.now() - 5 * 24 * 60 * 60 * 1000).toISOString()
})
testData.push({
id: Date.now() + 3,
name: '花花',
type: 'cat',
breed: 'ragdoll',
age: 3,
gender: 'female',
photos: ['https://images.unsplash.com/photo-1596854407944-bf87f6fdd49e?w=400&h=300&fit=crop'],
description: '花花是一只美丽的布偶猫,拥有柔软的长毛和温和的性格。她非常优雅安静,适合喜欢安静环境的家庭。已经完成绝育手术,身体健康。',
personality: ['温和', '优雅', '独立', '安静'],
health: '健康良好,已绝育',
location: {
province: 'guangdong',
city: 'guangzhou',
district: 'tianhe',
address: '天河区个人救助'
},
status: 'reserved',
requirements: [
'有养猫经验',
'家庭环境稳定',
'经济条件良好',
'同意家访'
],
contact: {
name: '李女士',
phone: '137****9012',
wechat: 'cat_lover_li',
type: 'individual'
},
publishTime: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString()
})
testData.push({
id: Date.now() + 4,
name: '豆豆',
type: 'rabbit',
breed: 'holland-lop',
age: 1,
gender: 'male',
photos: ['https://images.unsplash.com/photo-1585110396000-c9ffd4e4b308?w=400&h=300&fit=crop', 'https://images.unsplash.com/photo-1589952283406-b53a7d1347e8?w=400&h=300&fit=crop'],
description: '豆豆是一只可爱的荷兰垂耳兔,性格温顺亲人,很适合新手饲养。它喜欢安静的环境,也喜欢和人互动。身体健康,食欲良好。',
personality: ['可爱', '亲人', '安静', '温顺'],
health: '健康良好',
location: {
province: 'jiangsu',
city: 'nanjing',
district: 'xuanwu',
address: '玄武区小动物救助中心'
},
status: 'available',
requirements: [
'了解兔子习性',
'提供合适笼具',
'定期清洁',
'适当运动空间'
],
contact: {
name: '南京小动物救助中心',
phone: '025****3456',
wechat: 'animal_rescue_nj',
type: 'organization'
},
publishTime: new Date(Date.now() - 10 * 24 * 60 * 60 * 1000).toISOString()
})
testData.push({
id: Date.now() + 5,
name: '黑黑',
type: 'cat',
breed: 'mixed',
age: 4,
gender: 'male',
photos: ['https://images.unsplash.com/photo-1561948955-570b270e7c36?w=400&h=300&fit=crop'],
description: '黑黑是一只成年混血猫,性格稳重独立,已经完全社会化。它很适合有经验的猫奴,不需要太多关注但很忠诚。已完成绝育和疫苗。',
personality: ['稳重', '独立', '温顺', '忠诚'],
health: '健康良好,已绝育',
location: {
province: 'guangdong',
city: 'shenzhen',
district: 'nanshan',
address: '南山区流浪动物救助站'
},
status: 'adopted',
requirements: [
'有养猫经验',
'室内饲养',
'定期体检',
'终生负责'
],
contact: {
name: '深圳流浪动物救助',
phone: '0755****7890',
wechat: 'sz_stray_rescue',
type: 'organization'
},
publishTime: new Date(Date.now() - 15 * 24 * 60 * 60 * 1000).toISOString()
})
// 添加更多宠物数据
testData.push({
id: Date.now() + 6,
name: '咪咪',
type: 'cat',
breed: 'siamese',
age: 2,
gender: 'female',
photos: ['https://images.unsplash.com/photo-1513245543132-31f507417b26?w=400&h=300&fit=crop'],
description: '咪咪是一只美丽的暹罗猫,拥有独特的蓝色眼睛和优雅的身姿。性格活泼好奇,喜欢探索新事物,也很喜欢和人交流。',
personality: ['活泼', '好奇', '聪明', '粘人'],
health: '健康良好,已绝育',
location: {
province: 'beijing',
city: 'beijing',
district: 'haidian',
address: '海淀区宠物救助中心'
},
status: 'available',
requirements: [
'有养猫经验',
'能提供足够陪伴',
'室内饲养',
'定期体检'
],
contact: {
name: '海淀宠物救助中心',
phone: '010****2468',
wechat: 'haidian_pet_rescue',
type: 'organization'
},
publishTime: new Date(Date.now() - 3 * 24 * 60 * 60 * 1000).toISOString()
})
testData.push({
id: Date.now() + 7,
name: '旺财',
type: 'dog',
breed: 'corgi',
age: 3,
gender: 'male',
photos: ['https://images.unsplash.com/photo-1518717758536-85ae29035b6d?w=400&h=300&fit=crop', 'https://images.unsplash.com/photo-1583337130417-3346a1be7dee?w=400&h=300&fit=crop'],
description: '旺财是一只可爱的柯基犬,拥有短腿和大屁股的经典柯基特征。性格开朗活泼,很喜欢和人玩耍,是很好的家庭伴侣。',
personality: ['开朗', '活泼', '友善', '忠诚'],
health: '健康良好,已绝育',
location: {
province: 'jiangsu',
city: 'suzhou',
district: 'gusu',
address: '姑苏区个人救助'
},
status: 'available',
requirements: [
'有养狗经验',
'每天遛狗',
'有足够空间',
'耐心训练'
],
contact: {
name: '王先生',
phone: '151****7890',
wechat: 'corgi_lover_wang',
type: 'individual'
},
publishTime: new Date(Date.now() - 6 * 24 * 60 * 60 * 1000).toISOString()
})
testData.push({
id: Date.now() + 8,
name: '雪球',
type: 'cat',
breed: 'persian',
age: 1,
gender: 'female',
photos: ['https://images.unsplash.com/photo-1571566882372-1598d88abd90?w=400&h=300&fit=crop'],
description: '雪球是一只纯白色的波斯猫幼猫,毛发柔软蓬松,眼睛是漂亮的蓝色。性格温和安静,喜欢被人抚摸,是很好的陪伴猫咪。',
personality: ['温和', '安静', '亲人', '乖巧'],
health: '健康良好,疫苗接种中',
location: {
province: 'shanghai',
city: 'shanghai',
district: 'jingan',
address: '静安区宠物医院'
},
status: 'available',
requirements: [
'有养长毛猫经验',
'定期梳毛',
'室内饲养',
'定期美容'
],
contact: {
name: '静安宠物医院',
phone: '021****5678',
wechat: 'jingan_pet_hospital',
type: 'organization'
},
publishTime: new Date(Date.now() - 4 * 24 * 60 * 60 * 1000).toISOString()
})
testData.push({
id: Date.now() + 9,
name: '小柴',
type: 'dog',
breed: 'shiba-inu',
age: 2,
gender: 'male',
photos: ['https://images.unsplash.com/photo-1605568427561-40dd23c2acea?w=400&h=300&fit=crop'],
description: '小柴是一只帅气的柴犬,拥有经典的柴犬笑容和独立的性格。它很聪明但有时候有点固执,需要有经验的主人来训练。',
personality: ['独立', '聪明', '固执', '忠诚'],
health: '健康良好,已绝育',
location: {
province: 'guangdong',
city: 'guangzhou',
district: 'yuexiu',
address: '越秀区个人救助'
},
status: 'reserved',
requirements: [
'有养狗经验',
'了解柴犬特性',
'有耐心训练',
'定期运动'
],
contact: {
name: '陈女士',
phone: '138****9012',
wechat: 'shiba_lover_chen',
type: 'individual'
},
publishTime: new Date(Date.now() - 8 * 24 * 60 * 60 * 1000).toISOString()
})
testData.push({
id: Date.now() + 10,
name: '毛毛',
type: 'rabbit',
breed: 'angora',
age: 2,
gender: 'female',
photos: ['https://images.unsplash.com/photo-1585110396000-c9ffd4e4b308?w=400&h=300&fit=crop'],
description: '毛毛是一只安哥拉兔,拥有非常柔软蓬松的长毛。性格温顺安静,喜欢被人轻柔地抚摸。需要定期梳毛和护理。',
personality: ['温顺', '安静', '乖巧', '敏感'],
health: '健康良好',
location: {
province: 'jiangsu',
city: 'nanjing',
district: 'qinhuai',
address: '秦淮区小动物救助'
},
status: 'available',
requirements: [
'了解长毛兔护理',
'定期梳毛',
'安静环境',
'耐心照料'
],
contact: {
name: '秦淮动物救助',
phone: '025****1357',
wechat: 'qinhuai_animal_rescue',
type: 'organization'
},
publishTime: new Date(Date.now() - 12 * 24 * 60 * 60 * 1000).toISOString()
})
return testData
}
/**
* 搜索宠物
* @param {string} keyword 关键词
* @param {Array} pets 宠物数组
* @returns {Array} 搜索结果
*/
searchPets(keyword, pets = null) {
if (!pets) {
pets = this.getAdoptionPets()
}
if (!keyword) return pets
const lowerKeyword = keyword.toLowerCase()
return pets.filter(pet => {
return pet.name.toLowerCase().includes(lowerKeyword) ||
pet.description.toLowerCase().includes(lowerKeyword) ||
this.getPetTypeName(pet.type).includes(keyword) ||
this.getPetBreedName(pet.type, pet.breed).includes(keyword) ||
pet.personality.some(trait => trait.includes(keyword))
})
}
/**
* 筛选宠物
* @param {Object} filters 筛选条件
* @param {Array} pets 宠物数组
* @returns {Array} 筛选结果
*/
filterPets(filters, pets = null) {
if (!pets) {
pets = this.getAdoptionPets()
}
return pets.filter(pet => {
// 宠物类型筛选
if (filters.type && pet.type !== filters.type) {
return false
}
// 品种筛选
if (filters.breed && pet.breed !== filters.breed) {
return false
}
// 地区筛选
if (filters.province && pet.location.province !== filters.province) {
return false
}
if (filters.city && pet.location.city !== filters.city) {
return false
}
if (filters.district && pet.location.district !== filters.district) {
return false
}
// 状态筛选
if (filters.status && pet.status !== filters.status) {
return false
}
// 性别筛选
if (filters.gender && pet.gender !== filters.gender) {
return false
}
// 年龄筛选
if (filters.ageRange) {
const [minAge, maxAge] = filters.ageRange
if (pet.age < minAge || pet.age > maxAge) {
return false
}
}
return true
})
}
/**
* 获取宠物类型名称
* @param {string} type 类型代码
* @returns {string} 类型名称
*/
getPetTypeName(type) {
return this.petTypes[type]?.name || '未知类型'
}
/**
* 获取宠物品种名称
* @param {string} type 类型代码
* @param {string} breed 品种代码
* @returns {string} 品种名称
*/
getPetBreedName(type, breed) {
return this.petTypes[type]?.breeds[breed] || '未知品种'
}
/**
* 获取地区名称
* @param {string} province 省份代码
* @param {string} city 城市代码
* @param {string} district 区县代码
* @returns {string} 地区名称
*/
getLocationName(province, city = null, district = null) {
let locationName = this.regions[province]?.name || province
if (city) {
const cityName = this.regions[province]?.cities[city]?.name
if (cityName) {
locationName += ' ' + cityName
}
}
if (district) {
const districtName = this.regions[province]?.cities[city]?.districts[district]
if (districtName) {
locationName += ' ' + districtName
}
}
return locationName
}
/**
* 获取状态信息
* @param {string} status 状态代码
* @returns {Object} 状态信息
*/
getStatusInfo(status) {
return this.adoptionStatus[status] || {
name: '未知状态',
color: '#999999',
icon: '❓'
}
}
}
export default new AdoptionManager()