feat: 完善中文心理测评平台

This commit is contained in:
mikemoi
2026-06-22 22:59:01 +02:00
commit 9227c687fc
160 changed files with 16974 additions and 0 deletions
+39
View File
@@ -0,0 +1,39 @@
const RESULT_STORAGE_KEY = 'questionnaire_result';
interface StoredResult {
answers: string[];
savedAt: string;
}
function resultKey(questionnaireId: string) {
return `${RESULT_STORAGE_KEY}_${questionnaireId}`;
}
export function saveResult(questionnaireId: string, answers: string[]) {
try {
const result: StoredResult = {
answers,
savedAt: new Date().toISOString(),
};
sessionStorage.setItem(resultKey(questionnaireId), JSON.stringify(result));
return true;
} catch (error) {
console.error('Failed to save result:', error);
return false;
}
}
export function loadResult(questionnaireId: string): string[] | null {
try {
const raw = sessionStorage.getItem(resultKey(questionnaireId));
if (!raw) {
return null;
}
const parsed = JSON.parse(raw) as Partial<StoredResult>;
return Array.isArray(parsed.answers) ? parsed.answers : null;
} catch (error) {
console.error('Failed to load result:', error);
return null;
}
}
+78
View File
@@ -0,0 +1,78 @@
const STORAGE_KEY = 'questionnaire';
function save(
usage: string,
questionnaireType: string,
answers: { [key: number]: string },
) {
try {
const drafts = JSON.parse(
localStorage.getItem(`${STORAGE_KEY}_${usage}`) || '{}',
);
drafts[questionnaireType] = {
answers,
savedAt: new Date().toISOString(),
};
localStorage.setItem(`${STORAGE_KEY}_${usage}`, JSON.stringify(drafts));
return true;
} catch (error) {
console.error('Failed to save draft:', error);
return false;
}
}
function load(
usage: string,
questionnaireType: string,
): { [key: number]: string } | null {
try {
const drafts = JSON.parse(
localStorage.getItem(`${STORAGE_KEY}_${usage}`) || '{}',
);
return drafts[questionnaireType]?.answers || null;
} catch (error) {
console.error('Failed to load draft:', error);
return null;
}
}
function clear(usage: string, questionnaireType: string) {
try {
const key = `${STORAGE_KEY}_${usage}`;
const drafts = JSON.parse(localStorage.getItem(key) || '{}');
if (!(questionnaireType in drafts)) {
return false;
}
delete drafts[questionnaireType];
if (Object.keys(drafts).length === 0) {
localStorage.removeItem(key);
} else {
localStorage.setItem(key, JSON.stringify(drafts));
}
return true;
} catch (error) {
console.error('Failed to clear draft:', error);
return false;
}
}
export function saveDraft(
questionnaireType: string,
answers: { [key: number]: string },
) {
return save('draft', questionnaireType, answers);
}
export function loadDraft(
questionnaireType: string,
): { [key: number]: string } | null {
return load('draft', questionnaireType);
}
export function clearDraft(questionnaireType: string) {
return clear('draft', questionnaireType);
}
+6
View File
@@ -0,0 +1,6 @@
import { clsx, type ClassValue } from "clsx"
import { twMerge } from "tailwind-merge"
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs))
}