Files
zhuiguang-ai/scripts/db-status.mjs
T

89 lines
3.9 KiB
JavaScript

import { PrismaClient } from "@prisma/client";
import { PrismaMariaDb } from "@prisma/adapter-mariadb";
import "dotenv/config";
const base = (process.env.DATABASE_URL || "mysql://localhost:3306/zhuiguang_ai?charset=utf8mb4").replace("mysql://", "mariadb://");
const sep = base.includes("?") ? "&" : "?";
const connectionString = `${base}${sep}connection_limit=20&pool_timeout=30`;
const adapter = new PrismaMariaDb(connectionString);
const prisma = new PrismaClient({ adapter });
async function main() {
console.log("📊 数据库内容状态总览\n");
const [skillCount, publishedSkillCount, draftSkillCount, reviewCount, publishedReviewCount, draftReviewCount, dailyReportCount, publishedDailyCount, toolCount, publishedToolCount, pendingToolCount, pendingSkillCount] = await Promise.all([
prisma.skill.count(),
prisma.skill.count({ where: { status: "published" } }),
prisma.skill.count({ where: { status: "draft" } }),
prisma.skillReview.count(),
prisma.skillReview.count({ where: { status: "PUBLISHED" } }),
prisma.skillReview.count({ where: { status: "DRAFT" } }),
prisma.dailyReport.count(),
prisma.dailyReport.count({ where: { status: "published" } }),
prisma.tool.count(),
prisma.tool.count({ where: { status: "published" } }),
prisma.pendingTool.count(),
prisma.pendingSkill.count(),
]);
console.log("=== 技能 ===");
console.log(` 总数: ${skillCount} | 已发布: ${publishedSkillCount} | 草稿: ${draftSkillCount}`);
console.log(` 待审核: ${pendingSkillCount}`);
console.log("\n=== 评测 ===");
console.log(` 总数: ${reviewCount} | 已发布: ${publishedReviewCount} | 草稿: ${draftReviewCount}`);
console.log("\n=== 日报 ===");
console.log(` 总数: ${dailyReportCount} | 已发布: ${publishedDailyCount}`);
console.log("\n=== 工具 ===");
console.log(` 总数: ${toolCount} | 已发布: ${publishedToolCount} | 待审核: ${pendingToolCount}`);
console.log("\n=== 技能详情 ===");
const skills = await prisma.skill.findMany({
select: {
id: true, name: true, status: true, rating: true,
sourceUrl: true, description: true,
skillReview: { select: { id: true, overall: true, status: true, longArticle: true, videoScript: true, socialCards: true } },
},
orderBy: { id: "desc" },
});
for (const s of skills) {
const r = s.skillReview;
const hasContent = !!(r?.longArticle || r?.videoScript || r?.socialCards);
console.log(` #${s.id} [${s.status}] ${s.name} ⭐${s.rating} | 评测:${r ? `${r.overall}(${r.status})` : "无"} | 内容:${hasContent ? "✅" : "❌"} | ${s.description?.substring(0, 60) || "无描述"}`);
}
console.log("\n=== 评测详情 ===");
const reviews = await prisma.skillReview.findMany({
include: { skill: { select: { name: true } } },
orderBy: { id: "desc" },
});
for (const r of reviews) {
const reviewsData = r.reviews;
const dims = reviewsData ? {
cap: reviewsData.capability?.score,
dev: reviewsData.devExp?.score,
cost: reviewsData.costLicense?.score,
comm: reviewsData.community?.score,
perf: reviewsData.performance?.score,
} : {};
console.log(` #${r.id} [${r.status}] ${r.skill.name} | overall:${r.overall} | cap:${dims.cap} dev:${dims.dev} cost:${dims.cost} comm:${dims.comm} perf:${dims.perf}`);
console.log(` 长文:${r.longArticle ? `${String(r.longArticle).length}字` : "无"} | 脚本:${r.videoScript ? `${String(r.videoScript).length}字` : "无"} | 卡片:${r.socialCards ? "有" : "无"}`);
}
console.log("\n=== 日报详情 ===");
const reports = await prisma.dailyReport.findMany({
orderBy: { id: "desc" },
take: 5,
});
for (const r of reports) {
console.log(` #${r.id} [${r.status}] ${r.title} | ${r.reportDate?.toISOString().split("T")[0]}`);
}
}
main()
.catch((e) => { console.error("💥", e.message); process.exit(1); })
.finally(() => prisma.$disconnect());