feat(event): 添加酒局报名审核功能并优化前端组件
- 新增 ApproveEvent API 接口用于审核报名用户
- 在 EventCard 组件中显示待审核状态(⏳ 待审核)
- 实现酒局发起人审核报名用户的完整流程
- 添加用户协议和隐私政策页面
- 优化 FeedCard 组件中的图片展示逻辑
- 修复连续打卡天数计算问题
- 更新 HaveADrink SDK 至 1.0.15 版本
This commit is contained in:
@@ -205,6 +205,69 @@ export function calcStats(records) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 本地计算连续打卡天数(修正后端 streak 不区分饮酒/戒酒模式的问题)
|
||||
* 双轨计算:
|
||||
* - 连续饮酒:从今天的饮酒记录向前追溯;今天未饮酒(戒酒/未打卡)则从昨天算起
|
||||
* - 连续戒酒:从今天的戒酒记录向前追溯;今天饮酒/未打卡则从昨天算起
|
||||
* @param {Array} records 记录列表,每项需含 date 和 mode 字段
|
||||
* @returns {{ streak, streakType, drankStreak, abstainStreak }}
|
||||
* streak/streakType:主展示值(今天有记录取今天模式,否则取最近记录模式)
|
||||
*/
|
||||
export function calcLocalStreak(records) {
|
||||
if (!records || !records.length) {
|
||||
return { streak: 0, streakType: 'drank', drankStreak: 0, abstainStreak: 0 }
|
||||
}
|
||||
const today = formatDate(new Date(), 'YYYY-MM-DD')
|
||||
// 按日期去重(同一天多条取第一条)
|
||||
const byDate = {}
|
||||
records.forEach(r => {
|
||||
if (r && r.date && byDate[r.date] === undefined) byDate[r.date] = r
|
||||
})
|
||||
const dates = Object.keys(byDate).sort()
|
||||
// 单模式连续链:优先从今天起算,今天非该模式则宽限到昨天
|
||||
const chainOf = (mode) => {
|
||||
const todayMode = byDate[today] ? byDate[today].mode : null
|
||||
let base = null
|
||||
if (todayMode === mode) {
|
||||
base = today
|
||||
} else {
|
||||
const y = new Date()
|
||||
y.setDate(y.getDate() - 1)
|
||||
const yStr = formatDate(y, 'YYYY-MM-DD')
|
||||
if (byDate[yStr] && byDate[yStr].mode === mode) base = yStr
|
||||
}
|
||||
if (!base) return 0
|
||||
let count = 1
|
||||
const d = new Date(base)
|
||||
for (let i = 1; i < 366; i++) {
|
||||
const prev = new Date(d)
|
||||
prev.setDate(prev.getDate() - i)
|
||||
const r = byDate[formatDate(prev, 'YYYY-MM-DD')]
|
||||
if (r && r.mode === mode) {
|
||||
count++
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
return count
|
||||
}
|
||||
const drankStreak = chainOf('drank')
|
||||
const abstainStreak = chainOf('abstain')
|
||||
// 主展示值:今天有记录取今天模式,否则取最近一次记录的模式
|
||||
let streak
|
||||
let streakType
|
||||
if (byDate[today]) {
|
||||
streakType = byDate[today].mode || 'drank'
|
||||
streak = streakType === 'drank' ? drankStreak : abstainStreak
|
||||
} else {
|
||||
const lastDate = dates[dates.length - 1]
|
||||
streakType = byDate[lastDate].mode || 'drank'
|
||||
streak = streakType === 'drank' ? drankStreak : abstainStreak
|
||||
}
|
||||
return { streak, streakType, drankStreak, abstainStreak }
|
||||
}
|
||||
|
||||
/**
|
||||
* 主题系统:日夜自动切换
|
||||
* 白天:6:00-16:00 → light
|
||||
|
||||
Reference in New Issue
Block a user