89 lines
3.8 KiB
JavaScript
89 lines
3.8 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";
|
|
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()); |