Files
gmTouringMiniApp/files/打卡/userStore.js
T

114 lines
2.8 KiB
JavaScript

// userStore.js
// 用户数据管理模块:负责积分、徽章、打卡记录的本地存储与业务逻辑
const STORAGE_KEY = 'USER_DATA';
// 默认的用户数据结构
const defaultUserData = {
points: 0, // 用户积分
badges: [], // 用户徽章列表,元素形如 { name, obtainedAt }
checkIns: [] // 打卡记录,元素形如 { poiId, poiName, time }
};
/**
* 获取完整的用户数据
* 如果本地没有数据,返回默认结构
* @returns {{points:number, badges:Array, checkIns:Array}}
*/
function getUserData() {
try {
const data = wx.getStorageSync(STORAGE_KEY);
if (data && typeof data === 'object') {
// 兼容旧数据:补齐可能缺失的字段
return Object.assign({}, defaultUserData, data);
}
} catch (e) {
console.error('[userStore] 读取用户数据失败:', e);
}
// 深拷贝默认数据,避免外部修改影响默认值
return JSON.parse(JSON.stringify(defaultUserData));
}
/**
* 保存用户数据到本地
* @param {Object} data
*/
function saveUserData(data) {
try {
wx.setStorageSync(STORAGE_KEY, data);
} catch (e) {
console.error('[userStore] 保存用户数据失败:', e);
}
}
/**
* 判断某个景点是否已经打卡过
* @param {string|number} poiId
* @returns {boolean}
*/
function hasCheckedIn(poiId) {
const data = getUserData();
return data.checkIns.some(item => item.poiId === poiId);
}
/**
* 判断是否已经拥有某个徽章
* @param {Object} data 用户数据
* @param {string} badgeName
* @returns {boolean}
*/
function hasBadge(data, badgeName) {
return data.badges.some(b => b.name === badgeName);
}
/**
* 处理打卡逻辑
* 检查是否已打卡;如未打卡则 +10 积分,添加“探索者”徽章(如没有),保存数据
* @param {string|number} poiId 景点 ID
* @param {string} poiName 景点名称
* @returns {{success:boolean, message:string, data?:Object}}
*/
function checkIn(poiId, poiName) {
if (!poiId) {
return { success: false, message: '景点 ID 无效' };
}
const data = getUserData();
// 已打卡则不再重复奖励
if (data.checkIns.some(item => item.poiId === poiId)) {
return { success: false, message: '你已经打卡过该景点', data };
}
// 增加打卡记录
data.checkIns.push({
poiId,
poiName: poiName || '',
time: Date.now()
});
// 增加 10 积分
data.points += 10;
// 添加“探索者”徽章(若尚未拥有)
const BADGE_NAME = '探索者';
if (!hasBadge(data, BADGE_NAME)) {
data.badges.push({
name: BADGE_NAME,
obtainedAt: Date.now()
});
}
// 保存到本地
saveUserData(data);
return { success: true, message: '打卡成功,积分 +10', data };
}
module.exports = {
getUserData,
saveUserData,
hasCheckedIn,
checkIn
};