用户系统

This commit is contained in:
2026-04-15 00:21:43 +08:00
parent 97bbb3f306
commit 47c0863bab
23 changed files with 1640 additions and 56 deletions

View File

@@ -1,15 +1,26 @@
/**
* 基于 localStorage 的客户端持久化存储。
* 提供会话、标签、图片资源的 CRUD 操作。
* 所有 key 按 user_id 隔离,确保多用户数据不混淆。
*/
import type { Session, Tag, ImageAsset, ChatMessage } from "./types";
const STORAGE_KEYS = {
sessions: "epeekit-sessions",
tags: "epeekit-tags",
assets: "epeekit-assets",
} as const;
// 当前登录用户的 ID由 AppProvider 在初始化时设置
let _userId = "";
export function setStoreUserId(id: string) {
_userId = id;
}
export function getStoreUserId(): string {
return _userId;
}
function storageKey(base: string): string {
const prefix = _userId || "_anonymous";
return `epeekit-${prefix}-${base}`;
}
// --------------- 内置标签 ---------------
@@ -52,7 +63,7 @@ export function generateId(prefix = ""): string {
// --------------- 标签 ---------------
export function loadTags(): Tag[] {
const custom = readJSON<Tag[]>(STORAGE_KEYS.tags, []);
const custom = readJSON<Tag[]>(storageKey("tags"), []);
const builtinIds = new Set(BUILTIN_TAGS.map((t) => t.id));
const merged = [...BUILTIN_TAGS, ...custom.filter((t) => !builtinIds.has(t.id))];
return merged;
@@ -60,7 +71,7 @@ export function loadTags(): Tag[] {
export function saveTags(tags: Tag[]) {
const custom = tags.filter((t) => !t.builtin);
writeJSON(STORAGE_KEYS.tags, custom);
writeJSON(storageKey("tags"), custom);
}
export function addTag(name: string, color: string): Tag {
@@ -78,11 +89,11 @@ export function deleteTag(tagId: string) {
// --------------- 会话 ---------------
export function loadSessions(): Session[] {
return readJSON<Session[]>(STORAGE_KEYS.sessions, []);
return readJSON<Session[]>(storageKey("sessions"), []);
}
export function saveSessions(sessions: Session[]) {
writeJSON(STORAGE_KEYS.sessions, sessions);
writeJSON(storageKey("sessions"), sessions);
}
export function createSession(): Session {
@@ -114,7 +125,6 @@ export function updateSession(session: Session) {
export function deleteSession(sessionId: string) {
const sessions = loadSessions().filter((s) => s.id !== sessionId);
saveSessions(sessions);
// 同时删除关联的图片资源
const assets = loadAssets().filter((a) => a.sessionId !== sessionId);
saveAssets(assets);
}
@@ -122,11 +132,11 @@ export function deleteSession(sessionId: string) {
// --------------- 图片资源 ---------------
export function loadAssets(): ImageAsset[] {
return readJSON<ImageAsset[]>(STORAGE_KEYS.assets, []);
return readJSON<ImageAsset[]>(storageKey("assets"), []);
}
export function saveAssets(assets: ImageAsset[]) {
writeJSON(STORAGE_KEYS.assets, assets);
writeJSON(storageKey("assets"), assets);
}
export function addAsset(asset: ImageAsset) {