feat(event): 添加酒局报名审核功能并优化前端组件

- 新增 ApproveEvent API 接口用于审核报名用户
- 在 EventCard 组件中显示待审核状态(⏳ 待审核)
- 实现酒局发起人审核报名用户的完整流程
- 添加用户协议和隐私政策页面
- 优化 FeedCard 组件中的图片展示逻辑
- 修复连续打卡天数计算问题
- 更新 HaveADrink SDK 至 1.0.15 版本
This commit is contained in:
cg
2026-08-16 14:50:50 +08:00
parent 527b0e8a8d
commit 81e7a3afa5
20 changed files with 1470 additions and 249 deletions
+63
View File
@@ -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