- 模块一: 出海案例作品集、博客动态发布、人名发音语音条、RTL阿语多语言切换 - 模块二: AI顾问人设配置、行业术语库润色、RAG切片沙盒调试、流式会话与意向留资卡片 - 模块三: 全球访客雷达大屏、多维加权意向算分、外部CRM对接推送、团队公海池流转 - 模块四: 移动端NFC安全挂失、NFC动态路由规则配置、动态防伪验签、展会制卡Zip批量导出 - 模块五: 组织架构与名片分配、移动端个人中心设置、离职交接与历史线索迁移、安全审计日志 - 模块六: Stripe国际信用卡订阅Webhook、独立二级域名与SSL检测、坐席配额预警、多币种发票 - 模块七: 纸质名片OCR解析入库、国际商务日程RFC 5545 ICS日历、微官网离线SWR预加载、展会实时排行榜大屏 - 模块八: 全球出海SEO OpenGraph元标签注入与社交爬虫探测、30点端到端全链路业务流集成测试套件
118 行
2.7 KiB
Plaintext
118 行
2.7 KiB
Plaintext
/**
|
||
* OmniCard AI (CRMmp) - 移动微官网离线 LocalStorage 极速预加载 Composable
|
||
* 严格遵循 UTS 强类型规范与 AGENTS.md 准则
|
||
*/
|
||
|
||
import { CardPortalDetail } from '../../common/types.uts';
|
||
|
||
export interface CachedPortalData {
|
||
version: string;
|
||
timestamp: number;
|
||
ttlMs: number;
|
||
slug: string;
|
||
data: CardPortalDetail;
|
||
}
|
||
|
||
export const PORTAL_CACHE_PREFIX = 'omni_portal_cache_';
|
||
export const DEFAULT_PORTAL_CACHE_TTL_MS: number = 86400000;
|
||
export const PORTAL_CACHE_VERSION = '1.0.0';
|
||
|
||
export function getPortalCacheKey(slug: string): string {
|
||
return `${PORTAL_CACHE_PREFIX}${slug}`;
|
||
}
|
||
|
||
/**
|
||
* 校验缓存时效与完整性(默认24小时)
|
||
*/
|
||
export function isCacheValid(cache: CachedPortalData | null): boolean {
|
||
if (cache == null) {
|
||
return false;
|
||
}
|
||
if (cache.version !== PORTAL_CACHE_VERSION) {
|
||
return false;
|
||
}
|
||
if (cache.data == null || cache.data.id == null) {
|
||
return false;
|
||
}
|
||
const now = Date.now();
|
||
const age = now - cache.timestamp;
|
||
if (age < 0 || age > cache.ttlMs) {
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* 秒级从本地 Storage 读取名片快照
|
||
*/
|
||
export function getCachedPortal(slug: string): CachedPortalData | null {
|
||
if (slug == null || slug.trim() === '') {
|
||
return null;
|
||
}
|
||
const key = getPortalCacheKey(slug.trim());
|
||
try {
|
||
const raw = uni.getStorageSync(key) as string;
|
||
if (raw == null || raw.trim() === '') {
|
||
return null;
|
||
}
|
||
const parsed = JSON.parse(raw) as CachedPortalData;
|
||
if (parsed == null || typeof parsed !== 'object') {
|
||
return null;
|
||
}
|
||
if (
|
||
parsed.version == null ||
|
||
parsed.timestamp == null ||
|
||
parsed.ttlMs == null ||
|
||
parsed.data == null ||
|
||
parsed.data.id == null
|
||
) {
|
||
return null;
|
||
}
|
||
return parsed;
|
||
} catch (_e) {
|
||
return null;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 写入缓存快照带时间戳、版本与 TTL
|
||
*/
|
||
export function setCachedPortal(
|
||
slug: string,
|
||
data: CardPortalDetail,
|
||
ttlMs?: number
|
||
): boolean {
|
||
if (slug == null || slug.trim() === '' || data == null || data.id == null) {
|
||
return false;
|
||
}
|
||
const effectiveTtlMs =
|
||
ttlMs != null && ttlMs > 0 ? ttlMs : DEFAULT_PORTAL_CACHE_TTL_MS;
|
||
const cacheObj: CachedPortalData = {
|
||
version: PORTAL_CACHE_VERSION,
|
||
timestamp: Date.now(),
|
||
ttlMs: effectiveTtlMs,
|
||
slug: slug.trim(),
|
||
data: data,
|
||
};
|
||
|
||
try {
|
||
const key = getPortalCacheKey(slug.trim());
|
||
uni.setStorageSync(key, JSON.stringify(cacheObj));
|
||
return true;
|
||
} catch (_e) {
|
||
return false;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 清除指定名片本地缓存
|
||
*/
|
||
export function clearCachedPortal(slug: string): void {
|
||
if (slug == null || slug.trim() === '') {
|
||
return;
|
||
}
|
||
try {
|
||
uni.removeStorageSync(getPortalCacheKey(slug.trim()));
|
||
} catch (_e) {}
|
||
}
|