fix: 定时任务修复+管理后台Task7支持 (Task4外键修复, Task7管理员邮箱动态查询, Task5限流防护, Task7加入SCRIPT_MAP)

This commit is contained in:
ZhuiGuangAI Dev
2026-05-30 18:03:48 +08:00
parent 4d5e7266b5
commit 10d1acb305
56 changed files with 2779 additions and 135 deletions
+128
View File
@@ -1,5 +1,133 @@
# 追光AI 变更日志
## 2026-05-28 UI优化 + 社区页面修复
### 🟡 HeroBanner 新增 orange 配色方案
- **问题**: Skills 页面深红色(crimson `#881337→#e11d48`)视觉过深,用户反馈体验不佳
- **修复**: 新增 `orange` 配色方案 `#c2410c → #ea580c → #f97316 → #fb923c`
- **文件**: `src/components/common/HeroBanner.tsx` — 新增 `orange` scheme,STAR_COUNTS 添加 `orange: 80`,SVG 圆环渲染加入 orange
- **页面**: `src/app/skills/SkillsPageClient.tsx` — colorScheme 从 `crimson` 改为 `orange`
### 🟡 社区话题详情页 Server Component 错误修复
- **问题**: `/community/topic/[id]` 页面报错 `Event handlers cannot be passed to Client Component props`
- **根因**: 页面是 Server Component,但内联了 `onSubmit={async (e) => {...}}` 事件处理函数
- **修复**: 提取回复表单为独立 Client Component `ReplyForm.tsx`,页面仅渲染 `<ReplyForm topicId={topicId} isLocked={topic.isLocked} />`
- **文件**: `src/app/community/topic/[id]/ReplyForm.tsx`(新增)、`src/app/community/topic/[id]/page.tsx`(修改)
- **同时**: ReplyForm 增加 `disabled` 状态防止重复提交
### 📁 变更统计
| 类型 | 数量 |
|------|------|
| 修改文件 | 3个(HeroBanner.tsx + SkillsPageClient.tsx + community/topic/[id]/page.tsx) |
| 新增文件 | 1个(ReplyForm.tsx) |
| 新增配色 | 1个(orange) |
| TypeScript检查 | 零错误通过 |
---
## 2026-05-28 全盘安全扫描 + 系统优化(6项修复)
### 🔴 P0 安全修复:任意用户可创建工具
- **admin/tools/route.ts POST**: 此前无任何认证,任意登录用户可直接创建工具
- **修复**: 添加 `requireAdmin()` 认证检查,输入参数校验(name/websiteUrl/categoryId非空),categoryId有效性校验(存在性检查),slug自动去重
- **注**: 扫描全部25个后台写操作API,其余24个已有requireAdmin
### 🔴 P0 FK回退硬编码修复(4处)
- **问题**: `categoryId || 1` — id=1 在生产数据库不存在(分类从165开始),导致FK约束失败
- **修复方式**: 动态取数据库第一个有效分类 `category.findFirst({ select: { id: true } })` 替代硬编码 `1`
- **修复文件**:
| 文件 | 修复 |
|------|------|
| `scripts/task3-check-tools.mjs` | 自动发布时 FK 回退 |
| `src/app/api/admin/tools/route.ts` | 创建工具 POST |
| `src/app/api/admin/pending/batch-publish/route.ts` | 批量发布待审核工具 |
| `src/app/api/admin/pending-skills/batch-publish/route.ts` | 批量发布待审核技能 |
| `src/app/api/admin/pending-skills/publish-all/route.ts` | 一键发布所有待审核技能 |
### 🟡 P1 批量操作安全加固
- **validation.ts**: `toolImportSchema.max(100)`、`skillImportSchema.max(100)`、`newsImportSchema.max(50)`、`checkTypeSchema.max(50)`
- **批量发布API**: `pending/batch-publish` 和 `pending-skills/batch-publish` 添加 `ids.length > 500` 上限检查
- **问题**: 原无上限,恶意请求可一次处理任意多条记录
### 🟡 定时任务全盘扫描结果
- **lib库**: prisma/deepseek/github/logo-fetcher/rate-limit 全部符合规范 ✅
- **脚本**: 全部使用 `mariadb://` 协议 + `PrismaMariaDb` adapter ✅
- **API**: 25个后台POST中24个已有requireAdmin(1个漏洞已修复) ✅
- **TypeScript**: `tsc --noEmit` 零错误通过 ✅
### 📊 定时任务执行情况(05-27 → 05-28)
| 任务 | 状态 | 说明 |
|------|------|------|
| Task5 更新星值 | ✅ 正常 | 更新37个技能星值 |
| Task3 工具巡检 | ⚠️ 服务器未更新 | 本地已修复FK回退,需部署脚本到服务器 |
| Task6 评测热门 | ✅ 正常 | 无待评测技能,reviewed:0(正常) |
| Task4 发现技能 | ✅ 正常 | 发现0,跳过42(GitHub新项目少) |
| Task1 发现工具 | ✅ 正常 | 发现6个,导入2个 |
| AI日报 | ✅ 正常 | 生成37号日报,6条内容 |
| Task7 新闻推社区 | ✅ 正常 | 创建6条帖子 |
### 📁 变更统计
| 类型 | 数量 |
|------|------|
| 修改文件 | 8个 |
| 修复问题 | 6项(1P0安全 + 4P0 FK + 1P1批量上限) |
| TypeScript检查 | 零错误通过 |
---
## 2026-05-27 定时任务根因修复 + 新闻推社区功能上线
### 🔴 P0 根因修复:定时任务全部不运行(5月25日故障)
**诊断过程:**
- SSH 调查发现 `logs/` 目录不存在,crontab 环境不加载 `.env` 变量
- 首次修复(wrapper + install-cron)后测试 task5 报错:`error parsing connection string, format must be 'mariadb://'`
- 进一步发现 `.env` 文件值带单引号(`DATABASE_URL='mysql://...'`),`xargs` 导出方式无法正确处理
**三层根因 + 修复:**
| 层次 | 问题 | 修复 |
|------|------|------|
| 环境变量加载 | crontab 不加载 `.env` → 创建 `cron-wrapper.sh` 统一入口,使用 `source` + `set -a`/`set +a` |
| .env 值格式 | 带单引号导致 `SET NAMES utf8mb4'` SQL语法错误 → 去除所有值的引号 |
| 数据库协议 | `mysql://` 与 PrismaMariaDb 不兼容 → 21个脚本添加 `.replace('mysql://', 'mariadb://')` |
### 🔴 P0 脚本语法修复
- **task1-discover-tools.mjs**: 移除 TypeScript 类型注解(`const errors: string[]` / `const categoryMap: Record<string, number>`)— `.mjs` 文件不支持 TS 语法
- **task6-review-hot.mjs**: 移除 `prisma.skillReview.create()` 中的 `tags` 字段 — SkillReview 模型无此字段,Prisma 报 `Unknown argument 'tags'`
- **task7-news-to-community.mjs**: CATEGORY_MAP slug 映射修复 — `ai-products/tech-discussion/open-source/industry-trends` → `ai-tools/ai-news/tech/discuss`(匹配 DB 实际 slug)
### 🟢 新功能上线
- **Task7 新闻推社区**: `scripts/task7-news-to-community.mjs` — 每天 08:00 将日报新闻分发到社区 4 个板块
- 映射规则:product→AI工具推荐 / business→AI资讯 / model→技术探讨 / opensource→技术探讨 / policy→AI资讯 / insight→观点讨论
- 首次运行测试:9条日报全部成功分发([AI资讯]×6, [技术探讨]×2, [观点讨论]×1)
### 🛠 新增工具脚本
- `scripts/fix-db-url.cjs` — 批量修复 21 个脚本的 `mysql://` → `mariadb://` 协议
- `scripts/fix-ts-types.cjs` — 批量移除 `.mjs` 文件中的 TypeScript 类型注解
- `scripts/check-categories.cjs` — 检查数据库社区板块
### 📊 测试验证结果(7个任务全部通过)
| 任务 | 测试结果 |
|------|----------|
| Task5 星值更新 | ✅ 更新37⭐,0失败 |
| Task3 工具巡检 | ✅ 巡检463个,网站失效32个 |
| Task6 评测热门 | ✅ 评测2个(Snailclimb/JavaGuide 4.4⭐, system-prompts 3.4⭐) |
| Task4 技能发现 | ✅ 正常执行 |
| Task1 工具发现 | ✅ 发现10个AI工具,入库6个 |
| 日报生成 | ✅ 生成9条AI日报 |
| Task7 新闻推社区 | ✅ 9条全部分发到社区板块 |
### 📁 变更统计
| 类型 | 数量 |
|------|------|
| 修改的服务器脚本 | 21个(协议修复)+ 3个(bug修复) |
| 新增脚本 | 3个(fix-db-url.cjs, fix-ts-types.cjs, check-categories.cjs) |
| 修复的根因 | 3层(env加载 + 引号 + 协议) + 4个脚本bug |
| 服务器验证 | 7/7 任务全部测试通过 |
---
## 2026-05-25 全面审查优化(三轮扫描 + 43项修复)
### 🔴 P0 安全修复