feat: 前端组件准备

This commit is contained in:
2026-05-22 15:02:31 +08:00
parent 397ccdca13
commit 5e05bf4f63
62 changed files with 6903 additions and 878 deletions
+71
View File
@@ -0,0 +1,71 @@
// server/utils/runtimeState.ts - 服务启动时间和最近问答记录的内存状态
import { answerCache } from "~~/server/utils/cache";
import { serverEnv } from "~~/server/utils/env";
/** 最近问答记录,沿用旧 Python 服务 dashboard/stats 的内存记录语义 */
export interface QaRecord {
/** 本地可读时间,方便后续如果恢复 dashboard 时直接展示 */
time: string;
/** ISO 时间,方便机器处理和排序 */
timestamp: string;
/** 题目正文 */
question: string;
/** 题型 */
type: string;
/** 选项文本 */
options: string;
/** 最终返回给 OCS 的答案 */
answer: string;
}
/** 只保留最近 100 条,避免长时间运行后内存无限增长 */
const MAX_RECORDS = 100;
/** 进程启动时间,用于 `/api/stats` 返回 uptime */
const startTime = Date.now();
/** 进程内问答记录;服务重启或多实例部署时不会共享 */
const qaRecords: QaRecord[] = [];
/** 对外展示的服务版本,和 README/API 文档保持一致 */
export const SERVICE_VERSION = "1.1.0";
/** 格式化成本地 `YYYY-MM-DD HH:mm:ss`,对齐旧 Python 服务记录格式 */
const formatLocalDateTime = (date: Date) => {
const pad = (value: number) => value.toString().padStart(2, "0");
return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(
date.getDate()
)} ${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(
date.getSeconds()
)}`;
};
/**
* 追加一条问答记录
*
* 记录只用于统计和未来可能恢复的 dashboard,不作为题库持久化数据
*/
export const addQaRecord = (record: Omit<QaRecord, "time" | "timestamp">) => {
const now = new Date();
qaRecords.push({
time: formatLocalDateTime(now),
timestamp: now.toISOString(),
...record
});
if (qaRecords.length > MAX_RECORDS) {
qaRecords.shift();
}
};
/** 生成 `/api/stats` 响应,实时计算 uptime 和有效缓存数量 */
export const getRuntimeStats = () => {
return {
version: SERVICE_VERSION,
uptime: (Date.now() - startTime) / 1000,
model: serverEnv.openAiModel,
cache_enabled: serverEnv.enableCache,
cache_size: answerCache?.size() ?? 0,
qa_records_count: qaRecords.length
};
};