文件
OmniCard/mpuniapp/pages/portal/useCache.uts
wikiboss eec259a3a7 feat: 完成全系统30个功能点开发与E2E全链路验收 (8轮调度32个子代理闭环)
- 模块一: 出海案例作品集、博客动态发布、人名发音语音条、RTL阿语多语言切换
- 模块二: AI顾问人设配置、行业术语库润色、RAG切片沙盒调试、流式会话与意向留资卡片
- 模块三: 全球访客雷达大屏、多维加权意向算分、外部CRM对接推送、团队公海池流转
- 模块四: 移动端NFC安全挂失、NFC动态路由规则配置、动态防伪验签、展会制卡Zip批量导出
- 模块五: 组织架构与名片分配、移动端个人中心设置、离职交接与历史线索迁移、安全审计日志
- 模块六: Stripe国际信用卡订阅Webhook、独立二级域名与SSL检测、坐席配额预警、多币种发票
- 模块七: 纸质名片OCR解析入库、国际商务日程RFC 5545 ICS日历、微官网离线SWR预加载、展会实时排行榜大屏
- 模块八: 全球出海SEO OpenGraph元标签注入与社交爬虫探测、30点端到端全链路业务流集成测试套件
2026-09-20 23:47:47 +08:00

118 行
2.7 KiB
Plaintext

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

/**
* 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) {}
}