import Taro from '@tarojs/taro' import { invalidateAuthCache } from '../authState' import { getDesignListFor } from './design' import { ACTIVE_USER_KEY, USER_KEY } from './keys' import { getOrderListFor } from './order' const USER_REGISTRY_KEY = 'smart_user_registry' const ADMIN_PASSWORD = 'zhihui2024' // ---------- 用户注册表 ---------- function getUserRegistry(): string[] { try { return Taro.getStorageSync(USER_REGISTRY_KEY) || [] } catch { return [] } } function saveToRegistry(openid: string) { const list = getUserRegistry() if (!list.includes(openid)) { list.push(openid) Taro.setStorageSync(USER_REGISTRY_KEY, list) } } function removeFromRegistry(openid: string) { const list = getUserRegistry().filter(id => id !== openid) Taro.setStorageSync(USER_REGISTRY_KEY, list) } // ---------- 用户数据 ---------- export function getUserInfoRaw(): any { try { return Taro.getStorageSync(USER_KEY) } catch { return null } } export function setUserInfoRaw(info: any) { Taro.setStorageSync(USER_KEY, info) if (info?.openid) { Taro.setStorageSync(ACTIVE_USER_KEY, info.openid) // 为每个用户备份独立副本,方便切换账号时读取 Taro.setStorageSync(`user_info_${info.openid}`, info) saveToRegistry(info.openid) } invalidateAuthCache() Taro.eventCenter?.trigger('authStateChanged', { openid: info?.openid || '' }) } export function getUserInfoByOpenid(openid: string): any | null { try { const backup = Taro.getStorageSync(`user_info_${openid}`) if (backup) return backup } catch {} const current = getUserInfoRaw() if (current?.openid === openid) return current return null } export function clearUserInfo() { // 仅退出登录,不删除用户数据 Taro.removeStorageSync(USER_KEY) Taro.removeStorageSync(ACTIVE_USER_KEY) invalidateAuthCache() Taro.eventCenter?.trigger('authStateChanged', { openid: '' }) } export function setUserInfo(info: any) { setUserInfoRaw(info) } export function getUserInfo() { return getUserInfoRaw() } // ---------- 用户数据库管理 ---------- export function listAllUsers() { const registry = getUserRegistry() return registry.map(openid => { const info = getUserInfoByOpenid(openid) const dList = getDesignListFor(openid) const oList = getOrderListFor(openid) return { openid, nickName: info?.nickName || '未知用户', avatarUrl: info?.avatarUrl || '', loginAt: info?.loginAt || 0, designCount: dList.length, orderCount: oList.length } }) } export function createUser(nickName: string, avatarUrl?: string) { const openid = 'mock_' + Date.now().toString(36) + '_' + Math.random().toString(36).slice(2, 6) const info = { openid, nickName: nickName || '微信用户', avatarUrl: avatarUrl || '', loginAt: Date.now() } setUserInfoRaw(info) return info } export function switchUser(openid: string) { const info = getUserInfoByOpenid(openid) if (!info) return false Taro.setStorageSync(USER_KEY, info) Taro.setStorageSync(ACTIVE_USER_KEY, openid) return true } export function deleteUser(openid: string) { // 删除该用户的所有数据 Taro.removeStorageSync(`user_info_${openid}`) Taro.removeStorageSync(`design_list_${openid}`) Taro.removeStorageSync(`order_list_${openid}`) Taro.removeStorageSync(`address_list_${openid}`) removeFromRegistry(openid) // 如果删的是当前登录用户,清掉登录态 const current = getUserInfoRaw() if (current?.openid === openid) { clearUserInfo() } } export function verifyAdminPassword(password: string): boolean { return password === ADMIN_PASSWORD }