124 lines
3.6 KiB
TypeScript
124 lines
3.6 KiB
TypeScript
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
|
|
}
|