48 lines
1.5 KiB
JavaScript
48 lines
1.5 KiB
JavaScript
((root) => {
|
|
const STORAGE_KEY = 'traffic_link_history_v1';
|
|
const MAX_RECORDS = 100;
|
|
|
|
function normalize(records) {
|
|
if (!Array.isArray(records)) return [];
|
|
return records.filter((item) => item && item.id && item.url).map((item) => ({
|
|
...item,
|
|
username: item.username || '未标记',
|
|
userRole: item.userRole || 'unknown'
|
|
})).slice(0, MAX_RECORDS);
|
|
}
|
|
|
|
function list() {
|
|
try { return normalize(JSON.parse(localStorage.getItem(STORAGE_KEY) || '[]')); }
|
|
catch (_) { return []; }
|
|
}
|
|
|
|
function write(records) {
|
|
const normalized = normalize(records);
|
|
try {
|
|
localStorage.setItem(STORAGE_KEY, JSON.stringify(normalized));
|
|
return { ok:true, records:normalized };
|
|
} catch (_) { return { ok:false, records:normalized }; }
|
|
}
|
|
|
|
function add(record) {
|
|
const next = list();
|
|
next.unshift({
|
|
id: `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
|
|
username: record.username,
|
|
userRole: record.userRole,
|
|
platform: record.platform || '—',
|
|
pkg: record.pkg || '—',
|
|
type: record.type || 'click',
|
|
createdAt: new Date().toISOString(),
|
|
url: record.url
|
|
});
|
|
return write(next);
|
|
}
|
|
|
|
function remove(id) { return write(list().filter((item) => item.id !== id)); }
|
|
function replace(records) { return write(records); }
|
|
function clear() { return write([]); }
|
|
|
|
root.LinkHistoryStore = { STORAGE_KEY, MAX_RECORDS, list, add, remove, replace, clear };
|
|
})(typeof window === 'undefined' ? globalThis : window);
|