479 lines
13 KiB
JavaScript
479 lines
13 KiB
JavaScript
/**
|
|
* 宠物记录管理工具类
|
|
* 负责记录数据的存储、分类、社交功能等管理
|
|
*/
|
|
|
|
class RecordManager {
|
|
constructor() {
|
|
this.storageKey = 'pet_records'
|
|
this.socialDataKey = 'pet_records_social'
|
|
|
|
// 记录分类配置
|
|
this.categories = {
|
|
// 一级分类
|
|
health: {
|
|
name: '健康',
|
|
icon: '🏥',
|
|
color: '#4CAF50',
|
|
subCategories: {
|
|
medical: { name: '就医记录', icon: '🏥' },
|
|
checkup: { name: '体检记录', icon: '🔍' },
|
|
vaccine: { name: '疫苗接种', icon: '💉' },
|
|
weight: { name: '体重记录', icon: '⚖️' },
|
|
symptom: { name: '异常症状', icon: '⚠️' },
|
|
medication: { name: '用药记录', icon: '💊' }
|
|
}
|
|
},
|
|
care: {
|
|
name: '护理',
|
|
icon: '🛁',
|
|
color: '#2196F3',
|
|
subCategories: {
|
|
grooming: { name: '洗护美容', icon: '🛁' },
|
|
cleaning: { name: '清洁护理', icon: '🧽' },
|
|
nail: { name: '修剪指甲', icon: '✂️' },
|
|
dental: { name: '口腔护理', icon: '🦷' },
|
|
ear: { name: '耳部清洁', icon: '👂' },
|
|
eye: { name: '眼部护理', icon: '👁️' }
|
|
}
|
|
},
|
|
behavior: {
|
|
name: '行为',
|
|
icon: '🎾',
|
|
color: '#FF9800',
|
|
subCategories: {
|
|
training: { name: '训练记录', icon: '🎯' },
|
|
play: { name: '游戏互动', icon: '🎾' },
|
|
social: { name: '社交活动', icon: '👥' },
|
|
habit: { name: '习惯养成', icon: '📝' },
|
|
milestone: { name: '成长里程碑', icon: '🏆' },
|
|
mood: { name: '情绪状态', icon: '😊' }
|
|
}
|
|
},
|
|
daily: {
|
|
name: '日常',
|
|
icon: '📝',
|
|
color: '#9C27B0',
|
|
subCategories: {
|
|
feeding: { name: '喂食记录', icon: '🍽️' },
|
|
sleep: { name: '睡眠记录', icon: '😴' },
|
|
exercise: { name: '运动记录', icon: '🏃' },
|
|
photo: { name: '拍照记录', icon: '📷' },
|
|
note: { name: '随手记', icon: '📝' },
|
|
weather: { name: '天气记录', icon: '🌤️' }
|
|
}
|
|
},
|
|
expense: {
|
|
name: '消费',
|
|
icon: '💰',
|
|
color: '#F44336',
|
|
subCategories: {
|
|
food: { name: '食物用品', icon: '🍽️' },
|
|
toy: { name: '玩具用品', icon: '🧸' },
|
|
medical: { name: '医疗费用', icon: '🏥' },
|
|
grooming: { name: '美容费用', icon: '✂️' },
|
|
insurance: { name: '保险费用', icon: '🛡️' },
|
|
other: { name: '其他消费', icon: '💰' }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取宠物的所有记录
|
|
* @param {string} petId 宠物ID
|
|
* @returns {Array} 记录数组
|
|
*/
|
|
getRecords(petId) {
|
|
try {
|
|
const allRecords = uni.getStorageSync(this.storageKey) || {}
|
|
let records = allRecords[petId] || []
|
|
|
|
// 如果没有数据,初始化一些测试数据
|
|
if (records.length === 0) {
|
|
records = this.initializeTestData(petId)
|
|
allRecords[petId] = records
|
|
uni.setStorageSync(this.storageKey, allRecords)
|
|
}
|
|
|
|
return records
|
|
} catch (error) {
|
|
console.error('获取记录失败:', error)
|
|
return this.initializeTestData(petId)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 初始化测试数据
|
|
* @param {string} petId 宠物ID
|
|
* @returns {Array} 测试数据数组
|
|
*/
|
|
initializeTestData(petId) {
|
|
const now = new Date()
|
|
const testData = []
|
|
|
|
// 健康记录
|
|
testData.push({
|
|
id: Date.now() + 1,
|
|
petId: petId,
|
|
category: 'health',
|
|
subCategory: 'checkup',
|
|
title: '年度体检',
|
|
content: '带小橘去宠物医院做年度体检,医生说各项指标都很正常,身体很健康!',
|
|
recordTime: new Date(now.getTime() - 2 * 24 * 60 * 60 * 1000).toISOString(),
|
|
photos: ['/static/checkup1.jpg', '/static/checkup2.jpg'],
|
|
tags: ['体检', '健康', '正常'],
|
|
location: '宠物医院',
|
|
weather: '晴天',
|
|
mood: 'happy',
|
|
shareLevel: 'family',
|
|
createTime: new Date(now.getTime() - 2 * 24 * 60 * 60 * 1000).toISOString(),
|
|
updateTime: new Date(now.getTime() - 2 * 24 * 60 * 60 * 1000).toISOString()
|
|
})
|
|
|
|
// 护理记录
|
|
testData.push({
|
|
id: Date.now() + 2,
|
|
petId: petId,
|
|
category: 'care',
|
|
subCategory: 'grooming',
|
|
title: '洗澡美容',
|
|
content: '给小橘洗澡和修剪毛发,全程很乖很配合,洗完后毛毛很蓬松很香!',
|
|
recordTime: new Date(now.getTime() - 5 * 24 * 60 * 60 * 1000).toISOString(),
|
|
photos: ['/static/grooming1.jpg'],
|
|
tags: ['洗澡', '美容', '乖巧'],
|
|
location: '家里',
|
|
weather: '阴天',
|
|
mood: 'calm',
|
|
shareLevel: 'family',
|
|
createTime: new Date(now.getTime() - 5 * 24 * 60 * 60 * 1000).toISOString(),
|
|
updateTime: new Date(now.getTime() - 5 * 24 * 60 * 60 * 1000).toISOString()
|
|
})
|
|
|
|
// 行为记录
|
|
testData.push({
|
|
id: Date.now() + 3,
|
|
petId: petId,
|
|
category: 'behavior',
|
|
subCategory: 'milestone',
|
|
title: '第一次用猫砂',
|
|
content: '小橘第一次学会用猫砂盆,真是个聪明的小家伙!这是一个重要的成长里程碑。',
|
|
recordTime: new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000).toISOString(),
|
|
photos: [],
|
|
tags: ['第一次', '猫砂', '聪明'],
|
|
location: '家里',
|
|
weather: '晴天',
|
|
mood: 'proud',
|
|
shareLevel: 'public',
|
|
createTime: new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000).toISOString(),
|
|
updateTime: new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000).toISOString()
|
|
})
|
|
|
|
// 日常记录
|
|
testData.push({
|
|
id: Date.now() + 4,
|
|
petId: petId,
|
|
category: 'daily',
|
|
subCategory: 'note',
|
|
title: '今天很活泼',
|
|
content: '小橘今天特别活泼,一直在客厅里跑来跑去,看起来心情很好!还主动来找我玩。',
|
|
recordTime: new Date(now.getTime() - 1 * 24 * 60 * 60 * 1000).toISOString(),
|
|
photos: ['/static/active1.jpg', '/static/active2.jpg', '/static/active3.jpg'],
|
|
tags: ['活泼', '开心', '互动'],
|
|
location: '家里',
|
|
weather: '晴天',
|
|
mood: 'excited',
|
|
shareLevel: 'family',
|
|
createTime: new Date(now.getTime() - 1 * 24 * 60 * 60 * 1000).toISOString(),
|
|
updateTime: new Date(now.getTime() - 1 * 24 * 60 * 60 * 1000).toISOString()
|
|
})
|
|
|
|
// 消费记录
|
|
testData.push({
|
|
id: Date.now() + 5,
|
|
petId: petId,
|
|
category: 'expense',
|
|
subCategory: 'food',
|
|
title: '购买猫粮和用品',
|
|
content: '购买了新的猫粮、猫砂和一些玩具,希望小橘会喜欢。',
|
|
recordTime: new Date(now.getTime() - 10 * 24 * 60 * 60 * 1000).toISOString(),
|
|
photos: ['/static/shopping1.jpg'],
|
|
tags: ['猫粮', '猫砂', '玩具'],
|
|
location: '宠物用品店',
|
|
weather: '多云',
|
|
mood: 'happy',
|
|
shareLevel: 'private',
|
|
amount: 268,
|
|
store: '宠物用品店',
|
|
createTime: new Date(now.getTime() - 10 * 24 * 60 * 60 * 1000).toISOString(),
|
|
updateTime: new Date(now.getTime() - 10 * 24 * 60 * 60 * 1000).toISOString()
|
|
})
|
|
|
|
return testData
|
|
}
|
|
|
|
/**
|
|
* 添加记录
|
|
* @param {string} petId 宠物ID
|
|
* @param {Object} record 记录数据
|
|
*/
|
|
addRecord(petId, record) {
|
|
try {
|
|
const allRecords = uni.getStorageSync(this.storageKey) || {}
|
|
if (!allRecords[petId]) {
|
|
allRecords[petId] = []
|
|
}
|
|
|
|
const newRecord = {
|
|
id: Date.now(),
|
|
petId: petId,
|
|
category: record.category,
|
|
subCategory: record.subCategory,
|
|
title: record.title,
|
|
content: record.content,
|
|
recordTime: record.recordTime || new Date().toISOString(),
|
|
photos: record.photos || [],
|
|
tags: record.tags || [],
|
|
location: record.location || '',
|
|
weather: record.weather || '',
|
|
mood: record.mood || '',
|
|
shareLevel: record.shareLevel || 'family',
|
|
amount: record.amount || 0,
|
|
store: record.store || '',
|
|
createTime: new Date().toISOString(),
|
|
updateTime: new Date().toISOString()
|
|
}
|
|
|
|
allRecords[petId].push(newRecord)
|
|
allRecords[petId].sort((a, b) => new Date(b.recordTime) - new Date(a.recordTime))
|
|
|
|
uni.setStorageSync(this.storageKey, allRecords)
|
|
|
|
// 初始化社交数据
|
|
this.initSocialData(newRecord.id)
|
|
|
|
return newRecord
|
|
} catch (error) {
|
|
console.error('添加记录失败:', error)
|
|
return null
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取记录的社交数据
|
|
* @param {string} recordId 记录ID
|
|
* @returns {Object} 社交数据
|
|
*/
|
|
getSocialData(recordId) {
|
|
try {
|
|
const allSocialData = uni.getStorageSync(this.socialDataKey) || {}
|
|
return allSocialData[recordId] || {
|
|
likes: 0,
|
|
views: 0,
|
|
comments: [],
|
|
likedBy: []
|
|
}
|
|
} catch (error) {
|
|
console.error('获取社交数据失败:', error)
|
|
return {
|
|
likes: 0,
|
|
views: 0,
|
|
comments: [],
|
|
likedBy: []
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 初始化社交数据
|
|
* @param {string} recordId 记录ID
|
|
*/
|
|
initSocialData(recordId) {
|
|
try {
|
|
const allSocialData = uni.getStorageSync(this.socialDataKey) || {}
|
|
if (!allSocialData[recordId]) {
|
|
allSocialData[recordId] = {
|
|
likes: Math.floor(Math.random() * 10), // 模拟点赞数
|
|
views: Math.floor(Math.random() * 50) + 10, // 模拟浏览数
|
|
comments: this.generateMockComments(), // 模拟评论
|
|
likedBy: []
|
|
}
|
|
uni.setStorageSync(this.socialDataKey, allSocialData)
|
|
}
|
|
} catch (error) {
|
|
console.error('初始化社交数据失败:', error)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 生成模拟评论
|
|
* @returns {Array} 评论数组
|
|
*/
|
|
generateMockComments() {
|
|
const comments = [
|
|
{ id: 1, user: '爱宠达人', content: '好可爱啊!', time: '2小时前' },
|
|
{ id: 2, user: '猫咪专家', content: '看起来很健康呢', time: '1天前' },
|
|
{ id: 3, user: '宠物医生', content: '定期体检很重要', time: '2天前' }
|
|
]
|
|
|
|
// 随机返回0-3条评论
|
|
const count = Math.floor(Math.random() * 4)
|
|
return comments.slice(0, count)
|
|
}
|
|
|
|
/**
|
|
* 点赞记录
|
|
* @param {string} recordId 记录ID
|
|
* @param {string} userId 用户ID
|
|
*/
|
|
likeRecord(recordId, userId = 'current_user') {
|
|
try {
|
|
const allSocialData = uni.getStorageSync(this.socialDataKey) || {}
|
|
if (!allSocialData[recordId]) {
|
|
this.initSocialData(recordId)
|
|
allSocialData[recordId] = this.getSocialData(recordId)
|
|
}
|
|
|
|
const socialData = allSocialData[recordId]
|
|
const likedIndex = socialData.likedBy.indexOf(userId)
|
|
|
|
if (likedIndex === -1) {
|
|
// 点赞
|
|
socialData.likes += 1
|
|
socialData.likedBy.push(userId)
|
|
} else {
|
|
// 取消点赞
|
|
socialData.likes -= 1
|
|
socialData.likedBy.splice(likedIndex, 1)
|
|
}
|
|
|
|
uni.setStorageSync(this.socialDataKey, allSocialData)
|
|
return socialData
|
|
} catch (error) {
|
|
console.error('点赞失败:', error)
|
|
return null
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 增加浏览量
|
|
* @param {string} recordId 记录ID
|
|
*/
|
|
incrementViews(recordId) {
|
|
try {
|
|
const allSocialData = uni.getStorageSync(this.socialDataKey) || {}
|
|
if (!allSocialData[recordId]) {
|
|
this.initSocialData(recordId)
|
|
allSocialData[recordId] = this.getSocialData(recordId)
|
|
}
|
|
|
|
allSocialData[recordId].views += 1
|
|
uni.setStorageSync(this.socialDataKey, allSocialData)
|
|
} catch (error) {
|
|
console.error('增加浏览量失败:', error)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 添加评论
|
|
* @param {string} recordId 记录ID
|
|
* @param {string} content 评论内容
|
|
* @param {string} user 用户名
|
|
*/
|
|
addComment(recordId, content, user = '我') {
|
|
try {
|
|
const allSocialData = uni.getStorageSync(this.socialDataKey) || {}
|
|
if (!allSocialData[recordId]) {
|
|
this.initSocialData(recordId)
|
|
allSocialData[recordId] = this.getSocialData(recordId)
|
|
}
|
|
|
|
const newComment = {
|
|
id: Date.now(),
|
|
user: user,
|
|
content: content,
|
|
time: '刚刚'
|
|
}
|
|
|
|
allSocialData[recordId].comments.unshift(newComment)
|
|
uni.setStorageSync(this.socialDataKey, allSocialData)
|
|
|
|
return newComment
|
|
} catch (error) {
|
|
console.error('添加评论失败:', error)
|
|
return null
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取分类信息
|
|
* @param {string} category 分类
|
|
* @param {string} subCategory 子分类
|
|
* @returns {Object} 分类信息
|
|
*/
|
|
getCategoryInfo(category, subCategory = null) {
|
|
const categoryInfo = this.categories[category]
|
|
if (!categoryInfo) {
|
|
return { name: '未知分类', icon: '📝', color: '#999999' }
|
|
}
|
|
|
|
if (subCategory && categoryInfo.subCategories) {
|
|
const subCategoryInfo = categoryInfo.subCategories[subCategory]
|
|
if (subCategoryInfo) {
|
|
return {
|
|
name: subCategoryInfo.name,
|
|
icon: subCategoryInfo.icon,
|
|
color: categoryInfo.color
|
|
}
|
|
}
|
|
}
|
|
|
|
return {
|
|
name: categoryInfo.name,
|
|
icon: categoryInfo.icon,
|
|
color: categoryInfo.color
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 搜索记录
|
|
* @param {string} petId 宠物ID
|
|
* @param {string} keyword 关键词
|
|
* @returns {Array} 搜索结果
|
|
*/
|
|
searchRecords(petId, keyword) {
|
|
const records = this.getRecords(petId)
|
|
if (!keyword) return records
|
|
|
|
const lowerKeyword = keyword.toLowerCase()
|
|
return records.filter(record => {
|
|
return record.title.toLowerCase().includes(lowerKeyword) ||
|
|
record.content.toLowerCase().includes(lowerKeyword) ||
|
|
record.tags.some(tag => tag.toLowerCase().includes(lowerKeyword))
|
|
})
|
|
}
|
|
|
|
/**
|
|
* 按分类筛选记录
|
|
* @param {string} petId 宠物ID
|
|
* @param {string} category 一级分类
|
|
* @param {string} subCategory 二级分类
|
|
* @returns {Array} 筛选结果
|
|
*/
|
|
filterRecords(petId, category = null, subCategory = null) {
|
|
const records = this.getRecords(petId)
|
|
|
|
if (!category) return records
|
|
|
|
return records.filter(record => {
|
|
if (subCategory) {
|
|
return record.category === category && record.subCategory === subCategory
|
|
} else {
|
|
return record.category === category
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
export default new RecordManager()
|