110 lines
3.1 KiB
JavaScript
110 lines
3.1 KiB
JavaScript
/**
|
||
* 购买记录管理 Composable
|
||
*/
|
||
import { ref } from 'vue'
|
||
import { getIssueDrawLogs } from '@/api/appUser'
|
||
import { levelToAlpha } from '@/utils/activity'
|
||
|
||
/**
|
||
* 购买记录管理
|
||
*/
|
||
export function useRecords() {
|
||
const winRecords = ref([])
|
||
const loading = ref(false)
|
||
|
||
/**
|
||
* 获取购买记录
|
||
* @param {string} activityId - 活动ID
|
||
* @param {string} issueId - 期ID
|
||
*/
|
||
async function fetchWinRecords(activityId, issueId) {
|
||
if (!activityId || !issueId) return
|
||
|
||
loading.value = true
|
||
try {
|
||
const res = await getIssueDrawLogs(activityId, issueId)
|
||
const list = (res && res.list) || (Array.isArray(res) ? res : [])
|
||
|
||
// 直接使用原始记录列表,不进行聚合
|
||
// 映射字段以符合 RecordsList 组件的展示需求
|
||
winRecords.value = list.map(it => ({
|
||
id: it.id,
|
||
title: it.reward_name || it.title || it.name || '-', // 奖品名称
|
||
image: it.reward_image || it.image || '', // 奖品图片
|
||
count: 1, // 单个记录数量为1
|
||
|
||
// 用户信息
|
||
user_id: it.user_id,
|
||
user_name: it.user_name || '匿名用户',
|
||
avatar: cleanAvatar(it.avatar), // 清理 avatar 数据
|
||
|
||
// 时间信息
|
||
created_at: it.created_at,
|
||
|
||
// 其他元数据
|
||
is_winner: it.is_winner,
|
||
level: it.level,
|
||
level_name: getLevelName(it.level)
|
||
}))
|
||
} catch (e) {
|
||
console.error('fetchWinRecords error', e)
|
||
winRecords.value = []
|
||
} finally {
|
||
loading.value = false
|
||
}
|
||
}
|
||
|
||
function getLevelName(level) {
|
||
if (!level) return ''
|
||
const alpha = levelToAlpha(level)
|
||
return alpha + '赏'
|
||
}
|
||
|
||
/**
|
||
* 清理和验证 avatar 数据
|
||
* @param {string} avatar - 原始 avatar 数据(可能是 base64 或 URL)
|
||
* @returns {string} - 清理后的 avatar 数据
|
||
*/
|
||
function cleanAvatar(avatar) {
|
||
if (!avatar) return ''
|
||
|
||
// 如果是 base64 格式,确保格式正确
|
||
const avatarStr = String(avatar).trim()
|
||
|
||
// 检查是否已经是 data:image 格式
|
||
if (avatarStr.startsWith('data:image/')) {
|
||
return avatarStr
|
||
}
|
||
|
||
// 如果是 http(s) URL,直接返回
|
||
if (avatarStr.startsWith('http://') || avatarStr.startsWith('https://')) {
|
||
return avatarStr
|
||
}
|
||
|
||
// 如果是相对路径,直接返回
|
||
if (avatarStr.startsWith('/')) {
|
||
return avatarStr
|
||
}
|
||
|
||
// 其他情况,可能是不完整的 base64,尝试修复
|
||
// 如果不包含 data:image 前缀,添加默认的 png 前缀
|
||
if (avatarStr.match(/^[A-Za-z0-9+/=]+$/)) {
|
||
// 看起来像 base64 编码
|
||
return `data:image/png;base64,${avatarStr}`
|
||
}
|
||
|
||
return avatarStr
|
||
}
|
||
|
||
function clearRecords() {
|
||
winRecords.value = []
|
||
}
|
||
|
||
return {
|
||
winRecords,
|
||
loading,
|
||
fetchWinRecords,
|
||
clearRecords
|
||
}
|
||
}
|