feat: 完成整体内容开发

This commit is contained in:
2026-05-22 16:27:35 +08:00
parent 5e05bf4f63
commit d3cb786edb
72 changed files with 2410 additions and 29 deletions
+44
View File
@@ -0,0 +1,44 @@
// server/api/records.get.ts - 最近问答记录接口,供 Nuxt Dashboard 表格展示
import { setResponseStatus } from "h3";
import {
invalidAccessTokenResponse,
verifyAccessToken
} from "~~/server/utils/auth";
import { createApiLogger } from "~~/server/utils/logging";
import { getQaRecords } from "~~/server/utils/runtimeState";
/**
* 最近问答记录接口
*
* 旧 Python Dashboard 直接在服务端模板里读取内存 records;迁移到 Nuxt 后,
* 前端表格需要一个 JSON 数据源,所以这里暴露同样的内存记录副本。
*
* 安全边界:
* - 配置 ACCESS_TOKEN 时必须携带 `X-Access-Token` 或 query `token`
* - 这里只返回题目、选项和最终答案,不包含 OpenAI 响应体、API Key 或内部错误
* - 记录仅存在当前进程内,重启或多实例部署不会共享
*/
export default defineEventHandler((event) => {
const logger = createApiLogger(event, "api.records");
if (!verifyAccessToken(event)) {
setResponseStatus(event, 403);
logger.warn("invalid_access_token");
return {
success: false,
message: invalidAccessTokenResponse().msg,
records: []
};
}
const records = getQaRecords();
logger.info("finish_success", {
count: records.length
});
return {
success: true,
records
};
});
+9
View File
@@ -58,6 +58,15 @@ export const addQaRecord = (record: Omit<QaRecord, "time" | "timestamp">) => {
}
};
/**
* 获取最近问答记录
*
* 返回副本并按“最新在前”排序,避免 API handler 或前端展示逻辑误改内存原数组
*/
export const getQaRecords = () => {
return [...qaRecords].reverse();
};
/** 生成 `/api/stats` 响应,实时计算 uptime 和有效缓存数量 */
export const getRuntimeStats = () => {
return {