hookehuyr

feat(打卡): 优化打卡ID获取逻辑并添加列表刷新功能

添加 get_new_checkin_id 函数用于更可靠地从响应数据中提取打卡ID
新增 refresh_checkin_list 函数作为回退刷新机制
当特定ID刷新失败时自动回退到完整列表刷新
......@@ -263,6 +263,47 @@ export function useCheckin() {
* 提交打卡
* @param {Object} extraData - 额外提交数据
*/
const get_new_checkin_id = (data) => {
if (!data) return null
if (typeof data === 'string' || typeof data === 'number') return data
if (typeof data !== 'object') return null
const direct_keys = ['id', 'checkin_id', 'post_id', 'i']
for (const key of direct_keys) {
const value = data?.[key]
if (typeof value === 'string' || typeof value === 'number') return value
}
const visited = new Set()
const deep_find = (obj, max_depth) => {
if (!obj || typeof obj !== 'object') return null
if (visited.has(obj)) return null
visited.add(obj)
for (const [key, value] of Object.entries(obj)) {
if ((typeof value === 'string' || typeof value === 'number') && /(^|_)(id)$/.test(String(key))) {
return value
}
}
if (max_depth <= 0) return null
for (const value of Object.values(obj)) {
if (value && typeof value === 'object') {
const found = deep_find(value, max_depth - 1)
if (found) return found
}
}
return null
}
const found_id = deep_find(data, 2)
if (found_id) return found_id
return null
}
const onSubmit = async (extraData = {}) => {
if (uploading.value) return
......@@ -338,9 +379,8 @@ export function useCheckin() {
if (refreshType === 'edit') {
sessionStorage.setItem('checkin_refresh_id', route.query.post_id);
} else if (result.data) {
// 尝试获取新ID
const newId = result.data.id || (typeof result.data !== 'object' ? result.data : null);
if (newId) sessionStorage.setItem('checkin_refresh_id', newId);
const new_id = get_new_checkin_id(result.data)
if (new_id) sessionStorage.setItem('checkin_refresh_id', new_id)
}
router.back()
......
<!--
* @Date: 2025-05-29 15:34:17
* @LastEditors: hookehuyr hookehuyr@gmail.com
* @LastEditTime: 2025-12-19 14:55:13
* @LastEditTime: 2026-01-18 21:57:29
* @FilePath: /mlaj/src/views/checkin/IndexCheckInPage.vue
* @Description: 文件描述
-->
......@@ -743,6 +743,16 @@ onDeactivated(() => {
savedScrollTop.value = window.scrollY
})
const refresh_checkin_list = async () => {
const current_date = route.query.date || dayjs().format('YYYY-MM-DD')
checkinDataList.value = []
page.value = 0
finished.value = false
loading.value = true
await getTaskDetail(dayjs(current_date).format('YYYY-MM'))
await onLoad(current_date)
}
onActivated(async () => {
// 检查任务ID是否变化
// 注意:route.query.id 可能是数字或字符串,统一转为字符串比较
......@@ -774,6 +784,7 @@ onActivated(async () => {
sessionStorage.removeItem('checkin_refresh_flag')
sessionStorage.removeItem('checkin_refresh_id')
let has_refreshed = false
if (refreshId) {
try {
// 获取最新的打卡信息
......@@ -792,6 +803,7 @@ onActivated(async () => {
if (index > -1) {
checkinDataList.value.splice(index, 1, formattedItem)
}
has_refreshed = true
} else if (refreshType === 'add') {
// 新增模式:添加到列表顶部,且去重
const exists = checkinDataList.value.some(item => item.id == formattedItem.id)
......@@ -801,6 +813,7 @@ onActivated(async () => {
// 更新统计数据
const current_date = route.query.date || dayjs().format('YYYY-MM-DD');
getTaskDetail(dayjs(current_date).format('YYYY-MM'));
has_refreshed = true
}
}
}
......@@ -808,6 +821,14 @@ onActivated(async () => {
console.error('刷新打卡数据失败:', error)
}
}
if (!has_refreshed) {
try {
await refresh_checkin_list()
} catch (error) {
console.error('回退刷新打卡列表失败:', error)
}
}
}
})
</script>
......