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());