feat: 首次推送到Gitea - 完整项目代码 + 安全加固 + 知识库

This commit is contained in:
ZhuiGuangAI Dev
2026-10-02 18:52:49 +08:00
parent b44601bb66
commit 8205ae709c
1185 changed files with 49841 additions and 12802 deletions
+23 -6
View File
@@ -93,6 +93,12 @@ async function main() {
console.log(`\n 已发布工具巡检完成: ${checked}个, 网站失效${websiteFails}个, Logo异常${logoFails}个`);
checked = 0;
// 自动发布判定:只要求"网站可达";Logo 仅作提示、不阻断发布
// 原因:checkLogo 用 HEAD 探测,很多站点/CDN 不支持 HEAD(返回 405/403),而前端 <img> 用 GET 渲染,
// HEAD 失败 ≠ 坏链。原先要求 websiteOk && logoOk 同时成立,导致 292 个待审核工具 0 产出。
const skipReasons = { noWebsiteUrl: 0, websiteUnreachable: 0, slugConflict: 0, publishError: 0 };
let logoBadHint = 0;
for (const pt of pendingTools) {
try {
const websiteOk = pt.websiteUrl ? await checkWebsite(pt.websiteUrl) : false;
@@ -103,10 +109,17 @@ async function main() {
data: { checkWebsiteOk: websiteOk, checkLogoOk: logoOk, checkDescOk: true, checkCategoryOk: true },
});
if (websiteOk && logoOk) {
const slug = pt.slug || pt.name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "") + "-" + Date.now().toString(36);
if (!pt.websiteUrl) {
skipReasons.noWebsiteUrl++;
} else if (!websiteOk) {
skipReasons.websiteUnreachable++;
} else {
if (!logoOk) logoBadHint++;
const slug = pt.slug || pt.name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "") + "-" + Date.now().toString(36) + Math.random().toString(36).slice(2, 5);
const existingSlug = await prisma.tool.findUnique({ where: { slug } });
if (!existingSlug) {
if (existingSlug) {
skipReasons.slugConflict++;
} else {
await prisma.tool.create({
data: {
name: pt.name,
@@ -121,16 +134,17 @@ async function main() {
tags: pt.tags,
status: "published",
websiteOk: true,
logoOk: true,
logoOk,
},
});
await prisma.pendingTool.delete({ where: { id: pt.id } });
autoPublished++;
console.log(` ✅ 自动发布: ${pt.name}`);
console.log(` ✅ 自动发布: ${pt.name}${logoOk ? "" : " (Logo 校验未通过,已放行)"}`);
}
}
checked++;
} catch (e) {
skipReasons.publishError++;
errors.push(`PendingTool ${pt.name}: ${e.message}`);
}
@@ -147,16 +161,19 @@ async function main() {
websiteFails,
logoFails,
autoPublished,
logoBadHint,
skipReasons,
duration: `${(duration / 1000).toFixed(1)}s`,
};
console.log(`\n🏁 [Task3] 完成: 巡检${tools.length + pendingTools.length}个, 自动发布${autoPublished}个, 网站失效${websiteFails}个`);
console.log(` 待审核未发布原因: 网站不可达${skipReasons.websiteUnreachable} / 无网址${skipReasons.noWebsiteUrl} / slug冲突${skipReasons.slugConflict} / 异常${skipReasons.publishError};其中 Logo 校验未通过${logoBadHint}个已放行`);
await prisma.taskLog.create({
data: {
taskKey: "task3-check-tools",
taskName: "工具巡检",
status: errors.length > 0 ? "completed" : "completed",
status: "completed",
startedAt: startTime,
finishedAt: endTime,
duration,