const UUID_STORAGE_KEY = 'app_uuid'; /** * 生成一个随机十六进制字符 */ function randomHexChar(): string { return Math.floor(Math.random() * 16).toString(16); } /** * 生成符合 UUID v4 标准的 UUID * UUID v4 格式:xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx * 其中: * - x 是任意十六进制数字 * - 第 13 个字符必须是 '4'(表示版本 4) * - 第 17 个字符必须是 8, 9, a, 或 b 中的一个(表示变体) * * @returns 符合 UUID v4 标准的字符串 */ export function generateUUID(): string { // UUID v4 格式:xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx // 生成随机十六进制数字 const chars: string[] = []; // 生成 32 个十六进制字符 for (let i = 0; i < 32; i++) { if (i === 12) { // 第 13 个字符必须是 '4'(版本号) chars[i] = '4'; } else if (i === 16) { // 第 17 个字符必须是 8, 9, a, 或 b 中的一个(变体) const variant = ['8', '9', 'a', 'b'][Math.floor(Math.random() * 4)]; chars[i] = variant; } else { chars[i] = randomHexChar(); } } // 按照 UUID 格式组合:xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx return [ chars.slice(0, 8).join(''), chars.slice(8, 12).join(''), chars.slice(12, 16).join(''), chars.slice(16, 20).join(''), chars.slice(20, 32).join(''), ].join('-'); } export function setAppUUID(uuid: string): void { wx.setStorageSync(UUID_STORAGE_KEY, uuid); } /** * 获取应用的 UUID * 优先从 globalData 获取,如果没有则从 localStorage 获取 */ export function getAppUUID(): string { try { // 尝试从 globalData 获取 const app = getApp(); if (app && app.globalData && app.globalData.uuid) { return app.globalData.uuid; } // 如果 globalData 中没有,从 localStorage 获取 const uuid = wx.getStorageSync(UUID_STORAGE_KEY); if (uuid) { return uuid; } // 如果都没有,返回空字符串(这种情况不应该发生,因为 app.ts 会在启动时生成) console.warn('UUID 未找到,请确保应用已正确启动'); return ''; } catch (error) { console.error('获取 UUID 失败:', error); return ''; } }