v0.11.1: 权限体系重构 + AI管线优化 + 内容整理
This commit is contained in:
+275
@@ -0,0 +1,275 @@
|
||||
# 追光AI 变更日志
|
||||
|
||||
## v0.11.1 (2026-05-22) - AI发现管线质量优化
|
||||
|
||||
### 全链路测试
|
||||
- 跑通全部AI自动化管线:GitHub搜索 → DeepSeek评测 → 入库 → 内容生成
|
||||
- 2个脚本(automatic-review + daily-discover) + 4个API端点全部验证通过
|
||||
- 连测创建12条技能+评测记录,DeepSeek生成1篇日报+长文+视频脚本+社交卡片
|
||||
|
||||
### 质量过滤修复
|
||||
- **非AI项目过滤**: auto-review.mjs + daily-discover.mjs 新增 `isValidAIProject()` 函数
|
||||
- 关键词过滤: `book/guide/tutorial/awesome/interview/notes/handbook/cheatsheet/roadmap/curated-list` 等
|
||||
- 语言过滤: 纯Markdown/HTML文档Repo(Stars<5000)自动拒绝
|
||||
- 主题过滤: 有GitHub Topics的Repo必须包含AI相关Topic(ai/llm/rag/agent/gpt等)
|
||||
- 清理5条误入库非AI数据:AgentGuide、JavaGuide、pathway、StableDiffusionBook、Claude-Code-Everything
|
||||
|
||||
### JSON解析健壮性
|
||||
- 新增 `extractJSON()` 统一工具函数 → `src/lib/utils.ts`
|
||||
- 支持markdown代码块包裹(`\`\`\`json...\`\`\``)、花括号/方括号容错
|
||||
- 替换 deepseek.ts、auto-review.mjs、daily-discover.mjs、daily-reports/generate 的旧解析逻辑
|
||||
- 新增 `scripts/test-content-generation.mjs` 全管线测试脚本
|
||||
|
||||
### 新增脚本
|
||||
- `scripts/cleanup-non-ai.mjs` — 一键清理误入库非AI技能数据
|
||||
|
||||
---
|
||||
|
||||
## v0.11.0 (2026-05-22) - 权限体系重构
|
||||
|
||||
### 架构变更
|
||||
- **新增数据模型**: `Role`(角色), `Permission`(权限点), `RolePermission`(角色-权限关联) 三张表
|
||||
- **User 模型**: 新增 `roleId` 字段关联 `Role`,与原有 `role` 字符串字段并行(向后兼容)
|
||||
- 默认角色:**超级管理员**(Admin, 全部53权限)、**VIP成员**(Vip, 19个精选权限)
|
||||
|
||||
### 权限体系
|
||||
- **53个精细化权限点**,按页面分组管理:
|
||||
- 工具管理 14项 · 技能库 12项 · 评测管理 8项
|
||||
- AI发现 7项 · 内容管理 8项 · 系统管理 4项
|
||||
- 所有后台按钮/操作均已对应权限点,可逐个勾选控制
|
||||
|
||||
### 新增页面
|
||||
- **`/admin/roles` 角色权限管理**: 左侧角色列表 + 右侧按分组的权限勾选网格
|
||||
- 新建/删除自定义角色(系统角色受保护)
|
||||
- 分组全选/取消全选
|
||||
- 保存按钮实时同步到数据库
|
||||
|
||||
### 新增 API
|
||||
- `GET/POST /api/admin/roles` — 角色列表/创建
|
||||
- `PUT/DELETE /api/admin/roles/[id]` — 角色编辑/删除
|
||||
- `GET /api/admin/permissions` — 全部权限点列表
|
||||
- `GET /api/admin/user-permissions` — 用户权限查询(支持roleId/userId/当前用户)
|
||||
|
||||
### 鉴权升级
|
||||
- **middleware.ts**: 从硬编码 `role==="admin"` 改为认证检查 + 路由层委派
|
||||
- **admin-auth.ts**: `requireAdmin()` 兼容旧 `role` 字符串 + 新 `roleId` 关联角色双重逻辑
|
||||
- 新增 `requirePermission(key)` — 细粒度权限点校验
|
||||
- 新增 `getAllUserPermissions()` — 获取当前用户全部权限集合
|
||||
|
||||
### 前端工具
|
||||
- 新增 `usePermission()` hook — 提供 `can(key)`, `canAny(keys)`, `canAll(keys)` 方法
|
||||
- 侧边栏新增"角色权限"菜单入口
|
||||
|
||||
### 种子脚本
|
||||
- `scripts/seed-permissions.mjs` — 一键初始化全部权限点+角色
|
||||
|
||||
---
|
||||
|
||||
## v0.10.1 (2026-05-22) - 全面修复与优化
|
||||
|
||||
### 安全修复
|
||||
- **Admin API 鉴权增强**: 中间件matcher新增`/api/admin/:path*`路由保护,未登录或非管理员角色返回403
|
||||
- 所有关键admin路由已内置`requireAdmin()`双重校验(中间件+路由层防御深度)
|
||||
|
||||
### Bug 修复
|
||||
- **Category ID 动态化**: `skill-discoverer.ts`、`daily-discover.mjs`、`auto-review.mjs`三个文件的硬编码Category ID(120-127)替换为数据库查询+关键词匹配,消除分类错配风险
|
||||
- **reviews统计卡片**: 修复评测管理页面统计(已发布/草稿/平均评分)只显示当前页数据的问题,改为从全局groupBy统计获取
|
||||
- **内容生成日志完善**: `/api/admin/reviews/[id]/generate`成功和失败均写入`ReviewGenerationLog`
|
||||
|
||||
### 功能增强
|
||||
- **待审核技能编辑增强**: 编辑对话框新增"功能特性(JSON)"和"标签(逗号分隔)"输入框,支持直接编辑上传
|
||||
- **已发布技能编辑增强**: 编辑对话框新增"分类"下拉选择、"功能特性(JSON)"、"标签"字段,功能对齐待审核页面
|
||||
- **日报AI一键生成**: 新增`/api/admin/daily-reports/generate`端点,前端新增"一键AI生成"按钮,直接调用DeepSeek生成日报并自动填充表单,替代原有的"复制提示词→粘贴JSON"手动流程
|
||||
|
||||
### 内部改进
|
||||
- `ReviewGenerationLog`确认已在`skill-discoverer.ts`和两个脚本中正常使用,非僵尸表
|
||||
- 三个脚本文件统一使用数据库查询获取分类ID,消除代码不一致
|
||||
|
||||
---
|
||||
|
||||
## v0.10.0 (2026-05-20) - 五维评测系统
|
||||
|
||||
### 新增
|
||||
- **数据库扩展**: SkillReview模型(五维评测)、ReviewGenerationLog模型(评测日志)、ReviewStatus枚举(DRAFT/PUBLISHED/REJECTED/OUTDATED)
|
||||
- **Skill模型扩展**: 新增lastReviewedAt(最近评测时间)、githubStarsHistory(Star历史)字段,关联skillReview
|
||||
- **GitHub数据采集模块** (`src/lib/github.ts`): octokit封装,支持searchHotRepos搜索热门仓库、getRepoReadme获取README
|
||||
- **DeepSeek评测生成模块** (`src/lib/deepseek.ts`): OpenAI兼容接口,五维评测提示词模板,综合分自动校验
|
||||
- **自动化评测脚本** (`scripts/auto-review.mjs`): GitHub搜索→README获取→DeepSeek评测→入库全流程,每日限制8个
|
||||
- **评测API** (`/api/skills/[slug]/review`): 获取PUBLISHED状态的五维评测数据
|
||||
- **SkillReviewCard组件**: Chart.js雷达图+维度详情卡片,dynamic import(ssr:false),紫色主色调
|
||||
- **技能详情页集成**: 在标签卡片和评论之间展示五维评测雷达图
|
||||
- **发布评测脚本** (`scripts/publish-reviews.mjs`): 批量将DRAFT评测改为PUBLISHED
|
||||
- **测试脚本**: test-github.mjs(GitHub API)、test-deepseek.mjs(DeepSeek API)
|
||||
- **新依赖**: octokit, openai, chart.js, react-chartjs-2
|
||||
|
||||
### 修改
|
||||
- .env新增GITHUB_TOKEN、DEEPSEEK_API_KEY配置
|
||||
- 开发规则更新: 允许服务端脚本调用外部AI API,前端仍禁止
|
||||
- 迁移记录: 第10次迁移 add_skill_reviews
|
||||
|
||||
### 踩坑
|
||||
- Prisma 7.8需通过PrismaMariaDb适配器初始化,脚本中不能直接new PrismaClient()
|
||||
- Chart.js组件需dynamic import + ssr:false,不支持服务端渲染
|
||||
- 服务器环境SSL证书问题: 运行脚本需设置$env:NODE_TLS_REJECT_UNAUTHORIZED="0"
|
||||
- Chart.js font.weight只接受bold/normal/bolder/lighter,不接受数字字符串如"500"
|
||||
|
||||
---
|
||||
|
||||
## v0.9.0 (2026-05-09)
|
||||
|
||||
### 重大变更
|
||||
- **移除所有外部AI API调用**: discover-tools、discover-skills、discover-news三个API不再调用DeepSeek API,改为接收前端提交的JSON数据
|
||||
- **端口迁移**: 开发端口从3100-3110迁移至8301-8310,默认端口8301
|
||||
- **五大操作指令模式重构**: 从"一键调用API"模式改为"提示词+JSON粘贴导入"模式
|
||||
|
||||
### 新增
|
||||
- AI新闻发现页面 `/admin/discover-news`:3步流程(复制提示词→粘贴JSON→查看日报),6大分类+热度评分
|
||||
- AI新闻发现API `POST /api/admin/discover-news`:接收新闻JSON数组,自动生成今日AI日报
|
||||
- AI新闻发现API `GET /api/admin/discover-news`:获取今日AI日报
|
||||
- `fetchLogoWithMethod()` 函数:返回Logo URL + 成功方法名(如"HTML Link图标"、"OG/Twitter图片"等)
|
||||
- 检测AI工具页面增加Logo抓取功能:检测时同步抓取缺失Logo,记录成功方法名统计
|
||||
- 检测AI工具页面增加Logo抓取方法统计面板:按成功次数排序展示每种方法的效果
|
||||
- 检测AI工具页面增加Logo新抓取成功列表:展示Logo预览和使用的抓取方法名
|
||||
- 导入10天100条真实AI新闻(4月30日-5月9日)
|
||||
|
||||
### 修改
|
||||
- discover-tools API: 从调用DeepSeek API改为接收 `{tools: [...], categoryId}` JSON数组
|
||||
- discover-skills API: 从调用DeepSeek API改为接收 `{skills: [...], categoryId}` JSON数组
|
||||
- discover-tools页面: 从一键发现改为4步流程(选分类→复制提示词→粘贴JSON→抓取Logo)
|
||||
- discover-skills页面: 从一键发现改为3步流程(选分类→复制提示词→粘贴JSON)
|
||||
- discover-news页面: 从一键发现改为3步流程(复制提示词→粘贴JSON→查看日报)
|
||||
- check-tools API: 增加Logo抓取功能,返回logoFetched/logoMethod/logoUrl字段,GET请求获取HTML用于Logo抓取
|
||||
- check-tools页面: 默认选中待审核工具,4步流程卡片,增加Logo抓取方法统计和新抓取成功列表
|
||||
- update-skills页面: 去掉复制提示词,保留快速更新Star
|
||||
- logo-fetcher.ts: 新增 `fetchLogoWithMethod()` 导出,每种成功方法返回中文名称
|
||||
- package.json: 端口3100→8301
|
||||
- .env: NEXTAUTH_URL端口3100→8301
|
||||
- restart.ps1: 端口扫描范围3100-3110→8301-8310
|
||||
- project_rules.md: 端口规范8301-8310,新增强制要求;五大操作指令改为提示词+JSON粘贴模式;禁止硬编码API Key;禁止调用外部AI API
|
||||
|
||||
### 删除
|
||||
- 移除3个API文件中的DeepSeek API调用逻辑(硬编码API Key、callDeepSeek函数等)
|
||||
- 移除discover-tools页面的"一键发现"按钮和DeepSeek API调用
|
||||
- 移除discover-skills页面的"一键发现"按钮和DeepSeek API调用
|
||||
- 移除discover-news页面的DeepSeek API调用
|
||||
- 清除旧的虚构AI新闻数据
|
||||
|
||||
---
|
||||
|
||||
## v0.8.0 (2026-05-05)
|
||||
|
||||
### 新增
|
||||
- 用户系统:邮箱注册/登录、GitHub OAuth登录、用户中心页面
|
||||
- 收藏功能:工具/技能收藏、收藏列表页面、乐观更新按钮
|
||||
- 浏览历史:自动记录浏览过的工具/技能
|
||||
- 评论评价系统:ReviewSection组件,支持评分和文字评论
|
||||
- LoginModal组件:登录/注册弹窗,支持模式切换
|
||||
- FavoriteButton组件:收藏按钮,乐观更新
|
||||
- CategorySidebar组件:通用分类侧边栏
|
||||
- 用户API: `/api/user/favorites`, `/api/user/history`
|
||||
- 评论API: `/api/reviews`
|
||||
- 首页API: `/api/homepage`(含嵌套分类结构)
|
||||
|
||||
### 改进
|
||||
- **UI主题重构:暗色→浅色主题**
|
||||
- 全局CSS变量从暗色切换为浅色(background: 210 20% 98%, card: 0 0% 100%等)
|
||||
- 所有页面和组件适配浅色主题(7个前台页面+12个后台页面+5个组件)
|
||||
- 颜色规范:文字-600/-700、背景-50、边框-200/60
|
||||
- 卡片样式:bg-white/60/80 + shadow-sm,hover时bg-white + shadow-md
|
||||
- 输入框:bg-muted/50 focus:bg-white focus:ring-2 focus:ring-primary/10
|
||||
- 毛玻璃效果:bg-white/80 backdrop-blur-xl
|
||||
- 渐变文字:蓝→紫→粉渐变保持科技感
|
||||
- 移除noise纹理,新增dot-grid点阵背景
|
||||
- **层级分类导航重构**
|
||||
- 首页/技能页:左侧固定一级分类导航 + 右侧二级分类标签切换
|
||||
- 每个一级类目下有"全部"标签显示该分类下所有内容
|
||||
- 左侧导航sticky跟随页面滚动
|
||||
- **安全加固**
|
||||
- 新增admin-auth.ts中间件,requireAdmin函数
|
||||
- 28个后台API端点全部添加requireAdmin中间件验证
|
||||
- 移除硬编码API密钥,改用环境变量
|
||||
- Header组件:滚动时bg-white/80 backdrop-blur-2xl,搜索框bg-muted/50
|
||||
- Logo位置修复:Header容器宽度统一为max-w-[1440px]
|
||||
|
||||
### 修复
|
||||
- 修复webpack缓存损坏导致的页面加载失败(清除.next目录)
|
||||
- 修复左侧导航栏sticky定位不生效(flex容器添加self-start)
|
||||
- 修复Logo被左侧导航遮挡(统一容器宽度)
|
||||
|
||||
---
|
||||
|
||||
## v0.5.0 (2026-05-03)
|
||||
|
||||
### 新增
|
||||
- 待审核工具页面批量多选功能:全选/批量通过/批量拒绝
|
||||
- 待审核技能页面批量多选功能:全选/批量通过/批量拒绝
|
||||
- 待审核技能一键全部通过功能
|
||||
- 所有列表页面分页功能(每页20条)
|
||||
- 批量拒绝API: `/api/admin/pending/batch-reject`, `/api/admin/pending-skills/batch-reject`
|
||||
- 一键全部发布API: `/api/admin/pending-skills/publish-all`
|
||||
- AI技能自动探索API: `/api/admin/discover-skills/run`
|
||||
- 探索脚本存入系统配置,discover-skills页面展示脚本和调用说明
|
||||
- 一键自动探索按钮(服务端调用DeepSeek API)
|
||||
- Logo抓取策略改进:新增manifest.json解析、更多link/img匹配模式、图片URL验证
|
||||
- 工具库与脚本模块文档: `.trae/specs/modules/07-lib-and-scripts.md`
|
||||
|
||||
### 改进
|
||||
- Logo抓取引擎增强:6种策略按优先级,minFileSize降至50字节,timeout增至10秒
|
||||
- 待审核工具页面:新增Logo状态列、Logo筛选、抓取缺失Logo/重新抓取全部Logo按钮
|
||||
- 待审核技能页面:新增Star数展示、GitHub链接、分类标签
|
||||
- pending API和pending-skills API支持分页参数
|
||||
- 技术文档全面更新(7个模块文档+索引+开发规则+变更日志)
|
||||
|
||||
---
|
||||
|
||||
## v0.4.0 (2026-05-02)
|
||||
|
||||
### 新增
|
||||
- 系统配置页面:Logo抓取配置、发现提示词配置
|
||||
- 四个AI发现菜单:探索AI工具、检测AI工具、探索Skill技能、更新Skill技能
|
||||
- AI技能发现脚本 `scripts/discover-skills.mjs`
|
||||
- GitHub中文友好判断标准(4步标准)
|
||||
- 技能分类管理页面
|
||||
- DeepSeek V4 Pro API配置
|
||||
|
||||
### 改进
|
||||
- 配置驱动模式:提示词和Logo抓取策略存储在SystemConfig表
|
||||
- 去掉DeepSeek API配置功能,改为配置项驱动
|
||||
- 技能发现提示词优化
|
||||
|
||||
---
|
||||
|
||||
## v0.3.0 (2026-05-01)
|
||||
|
||||
### 新增
|
||||
- 技能库模块:Skill/PendingSkill数据模型、API、管理页面
|
||||
- API接口配置:ApiProvider数据模型和管理页面
|
||||
- 发现配置:DiscoveryConfig与分类管理集成
|
||||
- 公共Logo抓取工具 `src/lib/logo-fetcher.ts`
|
||||
- 服务重启脚本 `restart.ps1`
|
||||
|
||||
### 改进
|
||||
- 去除爬虫功能,改为AI发现模式
|
||||
- UI全面优化:暗色主题、毛玻璃效果、动画
|
||||
- 端口从3000改为3100
|
||||
|
||||
---
|
||||
|
||||
## v0.2.0 (2026-04-30)
|
||||
|
||||
### 新增
|
||||
- 后台管理页面:工具管理、分类管理、待审核工具
|
||||
- NextAuth认证系统
|
||||
- Prisma ORM + MySQL数据库
|
||||
- AI智能发现新工具功能(DeepSeek API)
|
||||
- 批量导入工具脚本
|
||||
|
||||
---
|
||||
|
||||
## v0.1.0 (2026-04-28)
|
||||
|
||||
### 新增
|
||||
- Next.js 14项目初始化
|
||||
- Tailwind CSS + shadcn/ui配置
|
||||
- 前台页面:首页、工具列表、工具详情、分类页
|
||||
- Header/Footer布局组件
|
||||
@@ -0,0 +1,126 @@
|
||||
# 追光AI 项目开发规则
|
||||
|
||||
## 端口规范
|
||||
- 开发端口: 8301-8310
|
||||
- 默认端口: 8301
|
||||
- 重启脚本仅扫描8301-8310范围
|
||||
- **强制要求:本项目端口必须锁定在8301-8310区间内,禁止使用其他端口,因为本服务器同时运行其他产品**
|
||||
|
||||
## 技术栈
|
||||
- Next.js 14 (App Router) + TypeScript
|
||||
- Tailwind CSS + shadcn/ui
|
||||
- Prisma 7.8 + MySQL (阿里云RDS)
|
||||
- NextAuth.js v4 (Credentials Provider)
|
||||
- DeepSeek API (deepseek-v4-pro) — 用于技能五维评测生成(服务端脚本调用)
|
||||
|
||||
## 代码风格
|
||||
- 不添加注释(除非明确要求)
|
||||
- 使用中文作为UI文案和提示词语言
|
||||
- TypeScript严格模式,零编译错误
|
||||
- 组件使用 `"use client"` 标记客户端组件
|
||||
- 路径别名: `@/*` → `./src/*`
|
||||
- **禁止在代码中硬编码任何AI API Key**
|
||||
- **禁止在代码中调用任何外部AI API(DeepSeek、OpenAI等)** — 前台/后台页面代码中禁止调用;服务端脚本(scripts/)中允许通过环境变量调用DeepSeek API和GitHub API
|
||||
- 所有发现/导入功能通过页面提示词+JSON粘贴方式完成,不调用外部接口
|
||||
|
||||
## 构建与检查
|
||||
- 修改代码后必须运行 `npx tsc --noEmit` 确认零错误
|
||||
- 重启服务使用 `pwsh -ExecutionPolicy Bypass -File restart.ps1`
|
||||
- 开发服务器: `npm run dev` (端口8301)
|
||||
|
||||
## 数据库
|
||||
- 云数据库: 阿里云RDS MySQL
|
||||
- 连接: `mysql://mohe001:***@rm-0jlbgr2rv6dj3t6jngo.mysql.rds.aliyuncs.com:3306/zhuiguang_ai`
|
||||
- Prisma单例模式防止热重载多实例
|
||||
- 修改Schema后: `npx prisma migrate dev --name <描述>`
|
||||
|
||||
## 认证
|
||||
- 管理员: admin@zhuiguang.ai / admin123
|
||||
- JWT Session策略
|
||||
- middleware.ts保护/admin路由(跳过/admin/login)
|
||||
- 后台API需requireAdmin中间件验证(src/lib/admin-auth.ts)
|
||||
- 用户注册/登录: NextAuth Credentials Provider,支持邮箱+密码
|
||||
|
||||
## API约定
|
||||
- 前台API: `/api/` 前缀,无需认证
|
||||
- 后台API: `/api/admin/` 前缀,需NextAuth认证
|
||||
- 分页参数: `page`(默认1), `pageSize`(默认20)
|
||||
- 返回格式: `{ data, total, page, pageSize }` 或 `{ success, error }`
|
||||
- 批量操作: body中传 `ids` 数组
|
||||
|
||||
## 页面路由
|
||||
- 前台: `/`, `/tools`, `/tools/[slug]`, `/categories/[slug]`, `/skills`, `/skills/[slug]`, `/login`, `/user`, `/user/favorites`
|
||||
- 后台: `/admin/login`, `/admin/pending`, `/admin/pending-skills`, `/admin/tools`, `/admin/skills`, `/admin/categories`, `/admin/skill-categories`, `/admin/discover-tools`, `/admin/check-tools`, `/admin/discover-skills`, `/admin/update-skills`, `/admin/discover-news`, `/admin/system-config`
|
||||
|
||||
## 五大操作指令
|
||||
|
||||
用户使用以下五个命令时,必须跳转到对应页面理解流程并按流程执行。
|
||||
所有页面均为"提示词+JSON粘贴导入"模式,不调用任何外部AI API。
|
||||
|
||||
### 探索AI工具
|
||||
- 页面: `/admin/discover-tools`
|
||||
- 流程: 选分类 → 复制提示词发给AI → 粘贴JSON → 导入审核列表 → 抓取Logo
|
||||
- 导入API: POST `/api/admin/discover-tools` body: `{ tools: [...], categoryId }`
|
||||
- API接收前端提交的工具JSON数组,自动去重导入待审核列表
|
||||
- Logo抓取API: POST `/api/admin/pending/fetch-logos`
|
||||
- 工具分类(20个): 文本生成(165), 图像生成(174), 视频生成(183), 音频与语音(191), 代码开发(199), AI Agent(208), 办公效率(216), 设计与创意(224), 营销与SEO(231), 数据分析(238), 教育与学习(245), 搜索与信息(252), 安全与合规(258), 医疗健康(264), 金融与法律(270), 电商与零售(276), 3D与游戏(282), 科学研究(288), 模型与框架(294), 聊天机器人(302)
|
||||
|
||||
### 检测AI工具
|
||||
- 页面: `/admin/check-tools`
|
||||
- 流程: 选择范围(已发布/待审核) → 一键检测+抓取Logo → 处理失效工具
|
||||
- 检测API: POST `/api/admin/check-tools` body: `{ type: "published" | "pending" }`
|
||||
- 系统自动逐一GET请求检测网站可访问性,同时自动抓取缺失Logo并记录成功方法名
|
||||
- 删除API: DELETE `/api/admin/tools/{id}` / `/api/admin/pending/{id}`
|
||||
|
||||
### 探索AI技能
|
||||
- 页面: `/admin/discover-skills`
|
||||
- 流程: 选分类 → 复制提示词发给AI → 粘贴JSON → 导入审核列表
|
||||
- 导入API: POST `/api/admin/discover-skills` body: `{ skills: [...], categoryId }`
|
||||
- API接收前端提交的技能JSON数组,自动去重导入待审核列表
|
||||
- 技能分类(20个父分类): 代码生成(1), 测试(10), 代码质量与分析(20), 安全(29), 文档(36), 架构与设计(43), 需求工程(49), DevOps与部署(56), 调试与错误处理(62), 形式化验证(69), 维护与重构(76), 版本控制与协作(82), 开发工具(86), UI/UX设计(91), 科学研究(95), 金融(103), 云服务(109), 移动开发(115), AI/ML工程(120), 营销与增长(127)
|
||||
|
||||
### 更新Skill技能
|
||||
- 页面: `/admin/update-skills`
|
||||
- 流程: 选择范围(已发布/待审核) → 一键更新 → 自动同步星级
|
||||
- 更新API: POST `/api/admin/update-stars` body: `{ type: "published" | "pending" }`
|
||||
- 系统自动从GitHub/Gitee/GitCode API获取最新星级评分并写入数据库
|
||||
|
||||
### AI新闻发现
|
||||
- 页面: `/admin/discover-news`
|
||||
- 流程: 复制提示词发给AI → 粘贴JSON → 导入今日新闻
|
||||
- 导入API: POST `/api/admin/discover-news` body: `{ items: [...] }`
|
||||
- API接收前端提交的新闻JSON数组,自动生成今日AI日报
|
||||
- 新闻分类: 产品发布/融资投资/技术突破/政策法规/开源项目/行业事件
|
||||
|
||||
### 通用执行规则
|
||||
1. **禁止调用任何外部AI API**,所有发现/导入功能通过页面提示词+JSON粘贴方式完成
|
||||
2. 页面提供提示词模板(含排除列表),用户复制发给AI助手获取JSON,粘贴到页面导入
|
||||
3. 导入API接收JSON数组,自动去重(名称+网址),导入待审核列表
|
||||
4. 导入工具后建议执行Logo抓取,确保所有工具有图标
|
||||
5. 所有提示词要求: 优先推荐国产AI工具/技能,国内可直连,中文友好
|
||||
6. 检测工具时:系统自动GET请求检测网站可访问性,同时抓取缺失Logo
|
||||
7. 更新技能时:系统自动从GitHub/Gitee/GitCode API获取最新星级
|
||||
|
||||
## 设计系统
|
||||
- 浅色主题,HSL CSS变量
|
||||
- 圆角: rounded-xl / rounded-2xl
|
||||
- 边框: border-border/40 (40%透明度)
|
||||
- 背景: bg-white/80 (毛玻璃) / bg-white/60 (卡片) / bg-muted/50 (输入框)
|
||||
- 阴影: shadow-sm (卡片) / shadow-md (悬浮)
|
||||
- 动画: transition-all duration-200
|
||||
- 自定义工具类: .glow-sm, .gradient-text, .glass, .card-shine, .dot-grid, .animate-fade-in
|
||||
- 颜色规范: 文字用 -600/-700 (非-400),背景用 -50 (非-500/10),边框用 -200/60 (非-500/20)
|
||||
- 输入框: bg-muted/50 focus:bg-white focus:ring-2 focus:ring-primary/10
|
||||
|
||||
## 环境变量
|
||||
- GITHUB_TOKEN: GitHub Personal Access Token(可选,提升API限流从60→5000次/小时)
|
||||
- DEEPSEEK_API_KEY: DeepSeek API Key(用于技能评测生成脚本)
|
||||
|
||||
## 踩坑记录
|
||||
- Next.js 14不支持useActionState,登录页用原生表单POST
|
||||
- Prisma MariaDB adapter需要连接字符串方式初始化
|
||||
- 图片域名需在next.config.mjs中配置remotePatterns
|
||||
- 热重载后需清除.next缓存: 删除.next目录后重启
|
||||
- Chart.js组件需用dynamic import + ssr: false,不支持服务端渲染
|
||||
- Prisma 7.8需通过PrismaMariaDb适配器初始化,不能直接new PrismaClient()
|
||||
- 服务器环境SSL证书问题: 运行脚本需设置$env:NODE_TLS_REJECT_UNAUTHORIZED="0"
|
||||
@@ -0,0 +1,90 @@
|
||||
# 追光AI - 模块文档索引
|
||||
|
||||
## 项目概述
|
||||
追光AI是一个AI工具与开源技能目录网站,支持提示词驱动的工具/技能发现、审核管理和前台展示。
|
||||
|
||||
## 技术栈
|
||||
|
||||
| 类别 | 技术 | 版本 |
|
||||
|------|------|------|
|
||||
| 框架 | Next.js (App Router) | 14.2.35 |
|
||||
| 语言 | TypeScript | 5.x |
|
||||
| 样式 | Tailwind CSS + shadcn/ui | 3.x |
|
||||
| 数据库 | MySQL (阿里云RDS) + Prisma | 7.8 |
|
||||
| 认证 | NextAuth.js | v4 |
|
||||
| AI | DeepSeek API (技能评测生成) | deepseek-v4-pro |
|
||||
| 图表 | Chart.js + react-chartjs-2 | 4.x |
|
||||
| 部署 | Node.js | 18+ |
|
||||
| 端口 | 8301-8310 | 默认8301 |
|
||||
|
||||
## 项目结构
|
||||
```
|
||||
zhuiguang-ai/
|
||||
├── prisma/ # 数据库Schema + 迁移 + 种子
|
||||
├── public/ # 静态资源 (logo.png, logos/)
|
||||
├── scripts/ # 独立脚本 (discover-skills, import-tools)
|
||||
├── src/
|
||||
│ ├── app/
|
||||
│ │ ├── (admin)/admin/ # 后台页面 (15个页面)
|
||||
│ │ ├── api/ # API路由 (36+个端点)
|
||||
│ │ ├── categories/ # 前台分类页
|
||||
│ │ ├── skills/ # 前台技能页
|
||||
│ │ ├── tools/ # 前台工具页
|
||||
│ │ ├── login/ # 用户登录页
|
||||
│ │ ├── user/ # 用户中心(个人资料/收藏)
|
||||
│ │ ├── globals.css # 全局样式
|
||||
│ │ ├── layout.tsx # 前台布局
|
||||
│ │ └── page.tsx # 首页
|
||||
│ ├── components/ # 组件 (Header, Footer, UI, Common)
|
||||
│ ├── lib/ # 工具库 (prisma, auth, admin-auth, github, deepseek, logo-fetcher, logo-storage, utils)
|
||||
│ └── middleware.ts # 路由保护
|
||||
├── .env # 环境变量
|
||||
├── restart.ps1 # 服务重启脚本(端口8301-8310)
|
||||
└── package.json # 依赖配置
|
||||
```
|
||||
|
||||
## 模块文档
|
||||
|
||||
| 序号 | 模块 | 文档 | 说明 |
|
||||
|------|------|------|------|
|
||||
| 01 | 数据库 | [01-database.md](./modules/01-database.md) | 数据模型、枚举、索引、迁移历史 |
|
||||
| 02 | API | [02-api.md](./modules/02-api.md) | 前台/后台API端点、SystemConfig配置键 |
|
||||
| 03 | 页面 | [03-pages.md](./modules/03-pages.md) | 前台/后台页面路由、布局、功能说明 |
|
||||
| 04 | 组件与样式 | [04-components-and-styles.md](./modules/04-components-and-styles.md) | UI组件、样式系统、设计规范 |
|
||||
| 05 | AI发现 | [05-ai-discovery.md](./modules/05-ai-discovery.md) | 提示词驱动发现流程、Logo抓取引擎、新闻发现 |
|
||||
| 06 | 认证 | [06-auth.md](./modules/06-auth.md) | NextAuth配置、路由保护、登录流程 |
|
||||
| 07 | 工具库与脚本 | [07-lib-and-scripts.md](./modules/07-lib-and-scripts.md) | 工具函数、独立脚本、运维脚本 |
|
||||
|
||||
## 环境变量
|
||||
```
|
||||
DATABASE_URL=mysql://mohe001:***@rm-0jlbgr2rv6dj3t6jngo.mysql.rds.aliyuncs.com:3306/zhuiguang_ai
|
||||
NEXTAUTH_URL=http://localhost:8301
|
||||
NEXTAUTH_SECRET=<secret>
|
||||
GITHUB_TOKEN=<optional>
|
||||
DEEPSEEK_API_KEY=<required-for-review>
|
||||
```
|
||||
|
||||
## 核心业务流程
|
||||
```
|
||||
提示词模板(页面内嵌) → 用户复制发给AI助手 → AI返回JSON → 粘贴到页面导入
|
||||
→ PendingTool / PendingSkill (待审核)
|
||||
→ 管理员审核(编辑/发布/拒绝/批量操作)
|
||||
→ Tool / Skill (已发布)
|
||||
→ 前台展示(分类浏览/搜索/详情)
|
||||
```
|
||||
|
||||
## 关键特性
|
||||
- **提示词驱动**: 页面内嵌提示词模板(含排除列表),用户复制发给AI获取JSON后粘贴导入,不调用外部AI API
|
||||
- **Logo自动抓取**: 10种策略按优先级执行,fetchLogoWithMethod返回成功方法名,支持20+常见路径和5个Favicon服务
|
||||
- **检测+Logo联动**: 检测AI工具时同步抓取缺失Logo,记录每种抓取方法的成功次数统计
|
||||
- **双轨内容**: 工具(Tool)面向商业AI产品,技能(Skill)面向GitHub开源项目
|
||||
- **批量操作**: 批量导入、批量发布、批量拒绝、一键全部通过
|
||||
- **GitHub Star同步**: 通过GitHub API定期更新技能Star数
|
||||
- **AI新闻发现**: 提示词驱动发现AI新闻,按日生成日报,6大分类+热度评分
|
||||
- **五维评测系统**: GitHub数据采集 + DeepSeek AI评测 + 雷达图展示,5维度(capability/devExp/costLicense/community/performance)评分
|
||||
- **分页**: 所有列表页面支持分页(每页20条)
|
||||
- **浅色主题**: 科技感浅色设计系统,毛玻璃效果+渐变文字+精致阴影
|
||||
- **层级分类**: 一级分类+二级分类,左侧导航+标签切换
|
||||
- **用户系统**: 邮箱注册/登录、收藏功能、浏览历史
|
||||
- **安全加固**: 28个后台API全部添加requireAdmin中间件验证
|
||||
- **端口锁定**: 8301-8310区间,禁止使用其他端口
|
||||
@@ -0,0 +1,136 @@
|
||||
# 数据库模块
|
||||
|
||||
## 技术栈
|
||||
- Prisma 7.8 + @prisma/adapter-mariadb
|
||||
- MySQL (阿里云RDS)
|
||||
- 连接字符串: `mysql://mohe001:***@rm-0jlbgr2rv6dj3t6jngo.mysql.rds.aliyuncs.com:3306/zhuiguang_ai`
|
||||
|
||||
## 数据模型
|
||||
|
||||
### Category (工具分类)
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| id | Int @id @default(autoincrement()) | 主键 |
|
||||
| name | String @db.VarChar(100) | 分类名称 |
|
||||
| slug | String @unique @db.VarChar(100) | URL标识 |
|
||||
| icon | String? | 图标 |
|
||||
| parentId | Int? | 父分类ID(自引用) |
|
||||
| sortOrder | Int @default(0) | 排序权重 |
|
||||
| createdAt | DateTime | 创建时间 |
|
||||
| updatedAt | DateTime | 更新时间 |
|
||||
|
||||
### SkillCategory (技能分类)
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| id | Int @id @default(autoincrement()) | 主键 |
|
||||
| name | String @db.VarChar(100) | 分类名称 |
|
||||
| slug | String @unique @db.VarChar(100) | URL标识 |
|
||||
| icon | String? | 图标 |
|
||||
| parentId | Int? | 父分类ID(自引用) |
|
||||
| sortOrder | Int @default(0) | 排序权重 |
|
||||
| createdAt | DateTime | 创建时间 |
|
||||
| updatedAt | DateTime | 更新时间 |
|
||||
|
||||
### Tool (已发布工具)
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| id | Int @id | 主键 |
|
||||
| name | String | 工具名称 |
|
||||
| slug | String @unique | URL标识 |
|
||||
| categoryId | Int | 分类ID(必填) |
|
||||
| description | String @db.Text | 简介 |
|
||||
| logoUrl | String? | Logo地址 |
|
||||
| websiteUrl | String | 官网地址 |
|
||||
| pricingModel | PricingModel | 定价模型(free/freemium/paid/subscription) |
|
||||
| pricingDetail | String? | 定价详情 |
|
||||
| features | Json? | 功能特性数组 |
|
||||
| tags | Json? | 标签数组 |
|
||||
| viewCount | Int @default(0) | 浏览次数 |
|
||||
| status | Status @default(draft) | 状态(draft/published) |
|
||||
| createdAt/updatedAt | DateTime | 时间戳 |
|
||||
|
||||
### PendingTool (待审核工具)
|
||||
与Tool类似,但categoryId/description/websiteUrl等可为空,额外有sourceUrl和status(pending/approved/rejected)。
|
||||
|
||||
### Skill (已发布技能)
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| id | Int @id | 主键 |
|
||||
| name | String | 技能名称 |
|
||||
| slug | String @unique | URL标识 |
|
||||
| categoryId | Int | 分类ID(必填) |
|
||||
| description | String @db.Text | 简介 |
|
||||
| logoUrl | String? | Logo地址 |
|
||||
| sourceUrl | String | GitHub仓库地址 |
|
||||
| sourceType | String @default("gitee") | 来源类型 |
|
||||
| rating | Float @default(0) | 综合评分 |
|
||||
| features | Json? | 功能特性(含forks/language/license/topics) |
|
||||
| tags | Json? | 标签数组 |
|
||||
| viewCount | Int @default(0) | 浏览次数 |
|
||||
| status | Status | 状态 |
|
||||
| lastReviewedAt | DateTime? | 最近评测时间 |
|
||||
| githubStarsHistory | Json? | Star历史数据 |
|
||||
|
||||
### PendingSkill (待审核技能)
|
||||
与Skill类似,但多个字段可为空。
|
||||
|
||||
### SystemConfig (系统配置)
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| id | Int @id | 主键 |
|
||||
| key | String @unique | 配置键 |
|
||||
| value | Json | 配置值(JSON) |
|
||||
|
||||
### SkillReview (技能评测)
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| id | Int @id @default(autoincrement()) | 主键 |
|
||||
| skillId | Int @unique | 关联Skill(一对一) |
|
||||
| capability | Float | 场景与能力评分(1-5) |
|
||||
| devExp | Float | 开发体验评分(1-5) |
|
||||
| costLicense | Float | 成本与许可评分(1-5) |
|
||||
| community | Float | 社区健康评分(1-5) |
|
||||
| performance | Float | 性能稳定评分(1-5) |
|
||||
| overall | Float | 综合评分(五维均值) |
|
||||
| reviews | Json | 完整评测数据(含各维度summary/detail) |
|
||||
| longArticle | String? @db.Text | 长文评测 |
|
||||
| videoScript | String? @db.Text | 视频脚本 |
|
||||
| socialCards | Json? | 社交卡片数据 |
|
||||
| status | ReviewStatus @default(DRAFT) | 评测状态 |
|
||||
| reviewedAt | DateTime @updatedAt | 评测时间 |
|
||||
| createdAt | DateTime | 创建时间 |
|
||||
|
||||
### ReviewGenerationLog (评测生成日志)
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| id | Int @id @default(autoincrement()) | 主键 |
|
||||
| skillId | Int | 关联Skill ID |
|
||||
| status | String @db.VarChar(20) | SUCCESS/FAILED |
|
||||
| prompt | String @db.Text | 生成提示词 |
|
||||
| response | String? @db.Text | API响应内容 |
|
||||
| error | String? @db.Text | 错误信息 |
|
||||
| createdAt | DateTime | 创建时间 |
|
||||
|
||||
## 枚举
|
||||
- `PricingModel`: free, freemium, paid, subscription
|
||||
- `Status`: draft, published
|
||||
- `PendingStatus`: pending, approved, rejected
|
||||
- `ReviewStatus`: DRAFT, PUBLISHED, REJECTED, OUTDATED
|
||||
|
||||
## 索引
|
||||
- Tool: categoryId+status联合索引, name+description全文索引
|
||||
- Skill: categoryId+status联合索引
|
||||
- SkillReview: skillId索引(唯一), overall索引
|
||||
- ReviewGenerationLog: skillId索引
|
||||
|
||||
## 迁移历史
|
||||
1. init - 初始化
|
||||
2. remove_scraped_at - 移除scrapedAt字段
|
||||
3. add_discovery_configs - 添加发现配置
|
||||
4. fix_tag_pool_column - 修复标签池列
|
||||
5. add_discovery_configs_v2 - 发现配置V2
|
||||
6. add_api_providers_and_skills - 添加API提供者和技能
|
||||
7. add_skill_categories - 添加技能分类
|
||||
8. add_pendingtool_category_relation - 添加待审核工具分类关联
|
||||
9. add_hot_score - 添加热度评分
|
||||
10. add_skill_reviews - 添加技能评测表(SkillReview/ReviewGenerationLog)、Skill新增lastReviewedAt/githubStarsHistory字段
|
||||
@@ -0,0 +1,140 @@
|
||||
# API模块
|
||||
|
||||
## 前台API(无需认证)
|
||||
|
||||
### GET /api/homepage
|
||||
获取首页数据(含嵌套分类结构,一级分类+二级子分类)。
|
||||
- 返回: `{ categories: CategoryWithChildren[], skillCategories: SkillCategoryWithChildren[] }`
|
||||
|
||||
### GET /api/categories
|
||||
获取工具分类树形结构(含子分类),按sortOrder排序。
|
||||
|
||||
### GET /api/skill-categories
|
||||
获取技能分类树形结构(含子分类),按sortOrder排序。
|
||||
|
||||
### GET /api/tools
|
||||
获取已发布工具列表。
|
||||
- Query: `categoryId`, `pricingModel`, `search`, `page`(默认1), `pageSize`(默认20)
|
||||
- 返回: `{ tools: Tool[], total, page, pageSize }`
|
||||
|
||||
### GET /api/tools/[slug]
|
||||
获取工具详情(by slug),浏览计数+1。
|
||||
|
||||
### GET /api/skills
|
||||
获取已发布技能列表。
|
||||
- Query: `category`, `search`, `page`, `pageSize`
|
||||
- 返回: `{ skills: Skill[], total, page, pageSize }`
|
||||
|
||||
### GET /api/skills/[slug]
|
||||
获取技能详情(by slug),浏览计数+1。
|
||||
|
||||
### GET /api/skills/[slug]/review
|
||||
获取技能的五维评测数据(仅返回PUBLISHED状态)。
|
||||
- 返回: `{ capability, devExp, costLicense, community, performance, overall, reviews, longArticle?, videoScript?, socialCards?, reviewedAt }`
|
||||
|
||||
### GET/POST /api/auth/[...nextauth]
|
||||
NextAuth认证端点(登录/回调/CSRF等)。
|
||||
|
||||
### 用户相关API(需NextAuth用户认证)
|
||||
|
||||
| 路由 | 方法 | 功能 |
|
||||
|------|------|------|
|
||||
| /api/user/favorites | GET | 获取当前用户收藏列表(工具+技能) |
|
||||
| /api/user/favorites | POST | 添加收藏(body: { targetType, targetId }) |
|
||||
| /api/user/favorites | DELETE | 取消收藏(body: { targetType, targetId }) |
|
||||
| /api/user/history | GET | 获取浏览历史 |
|
||||
|
||||
---
|
||||
|
||||
## 后台API(需NextAuth认证)
|
||||
|
||||
### 分类管理
|
||||
|
||||
| 路由 | 方法 | 功能 |
|
||||
|------|------|------|
|
||||
| /api/admin/categories | GET | 获取所有分类(含工具数/子分类数) |
|
||||
| /api/admin/categories | POST | 创建分类 |
|
||||
| /api/admin/categories/[id] | PUT | 更新分类 |
|
||||
| /api/admin/categories/[id] | DELETE | 删除分类(有工具/子分类时拒绝) |
|
||||
| /api/admin/skill-categories | GET | 获取技能分类列表 |
|
||||
| /api/admin/skill-categories | POST | 创建技能分类 |
|
||||
| /api/admin/skill-categories/[id] | PUT | 更新技能分类 |
|
||||
| /api/admin/skill-categories/[id] | DELETE | 删除技能分类 |
|
||||
|
||||
### 工具管理
|
||||
|
||||
| 路由 | 方法 | 功能 |
|
||||
|------|------|------|
|
||||
| /api/admin/tools | GET | 获取所有工具(分页) |
|
||||
| /api/admin/tools | POST | 创建工具 |
|
||||
| /api/admin/tools/[id] | PUT | 更新工具 |
|
||||
| /api/admin/tools/[id] | DELETE | 删除工具 |
|
||||
|
||||
### 技能管理
|
||||
|
||||
| 路由 | 方法 | 功能 |
|
||||
|------|------|------|
|
||||
| /api/admin/skills | GET | 获取所有技能(分页) |
|
||||
| /api/admin/skills/[id] | PUT | 更新技能 |
|
||||
| /api/admin/skills/[id] | DELETE | 删除技能 |
|
||||
|
||||
### 待审核工具
|
||||
|
||||
| 路由 | 方法 | 功能 |
|
||||
|------|------|------|
|
||||
| /api/admin/pending | GET | 获取待审核工具列表(分页) |
|
||||
| /api/admin/pending | DELETE | 清空所有待审核工具 |
|
||||
| /api/admin/pending/[id] | PUT | 编辑待审核工具(websiteUrl变更时自动抓Logo) |
|
||||
| /api/admin/pending/[id] | DELETE | 删除单个待审核工具 |
|
||||
| /api/admin/pending/[id]/publish | POST | 发布为正式工具 |
|
||||
| /api/admin/pending/batch | POST | 批量导入(去重+自动抓Logo) |
|
||||
| /api/admin/pending/batch-publish | POST | 批量发布(ids数组) |
|
||||
| /api/admin/pending/batch-reject | POST | 批量拒绝(ids数组) |
|
||||
| /api/admin/pending/fetch-logos | POST | 批量抓取Logo(body: {scope, refetch?}) |
|
||||
|
||||
### 待审核技能
|
||||
|
||||
| 路由 | 方法 | 功能 |
|
||||
|------|------|------|
|
||||
| /api/admin/pending-skills | GET | 获取待审核技能列表(分页) |
|
||||
| /api/admin/pending-skills | DELETE | 清空所有待审核技能 |
|
||||
| /api/admin/pending-skills/[id] | PUT | 编辑待审核技能 |
|
||||
| /api/admin/pending-skills/[id] | DELETE | 删除单个待审核技能 |
|
||||
| /api/admin/pending-skills/[id]/publish | POST | 发布为正式技能 |
|
||||
| /api/admin/pending-skills/batch | POST | 批量导入(去重) |
|
||||
| /api/admin/pending-skills/batch-publish | POST | 批量发布(ids数组) |
|
||||
| /api/admin/pending-skills/batch-reject | POST | 批量拒绝(ids数组) |
|
||||
| /api/admin/pending-skills/publish-all | POST | 一键发布所有待审核技能 |
|
||||
|
||||
### AI发现与检测(提示词+JSON粘贴模式,不调用外部AI API)
|
||||
|
||||
| 路由 | 方法 | 功能 |
|
||||
|------|------|------|
|
||||
| /api/admin/discover-tools | POST | 导入工具JSON数组(body: {tools: [...], categoryId}),自动去重导入待审核列表 |
|
||||
| /api/admin/discover-skills | POST | 导入技能JSON数组(body: {skills: [...], categoryId}),自动去重导入待审核列表 |
|
||||
| /api/admin/discover-news | POST | 导入新闻JSON数组(body: {items: [...]}),自动生成今日AI日报 |
|
||||
| /api/admin/discover-news | GET | 获取今日AI日报 |
|
||||
| /api/admin/check-tools | POST | 检测工具网站可访问性+抓取缺失Logo(body: {type: "published"/"pending"}),返回logoFetched/logoMethod/logoUrl |
|
||||
| /api/admin/update-stars | POST | 更新GitHub Star数(body: {type: "published"/"pending"}) |
|
||||
|
||||
### 系统配置
|
||||
|
||||
| 路由 | 方法 | 功能 |
|
||||
|------|------|------|
|
||||
| /api/admin/system-config | GET | 获取所有配置 |
|
||||
| /api/admin/system-config | PUT | 批量更新配置(upsert) |
|
||||
|
||||
### 评论API(需NextAuth用户认证)
|
||||
|
||||
| 路由 | 方法 | 功能 |
|
||||
|------|------|------|
|
||||
| /api/reviews | GET | 获取评论列表(query: type, targetId) |
|
||||
| /api/reviews | POST | 创建评论(body: { type, targetId, content, rating? }) |
|
||||
|
||||
## SystemConfig 配置键
|
||||
|
||||
| Key | 类型 | 说明 |
|
||||
|-----|------|------|
|
||||
| discoveryPromptConfig | JSON | AI发现提示词配置(含toolPrompt/skillPrompt/newsPrompt/tagPool等) |
|
||||
| logoFetchConfig | JSON | Logo抓取策略配置 |
|
||||
| discoverSkillsScript | string | 技能探索脚本源码 |
|
||||
@@ -0,0 +1,137 @@
|
||||
# 页面模块
|
||||
|
||||
## 前台页面
|
||||
|
||||
### / (首页)
|
||||
- 文件: `src/app/page.tsx`
|
||||
- 功能: 搜索框、AI工具分类网格(一级+二级分类,左侧导航+标签切换)、技能分类网格、最新上架工具、热门工具、CTA区块
|
||||
- 数据源: `/api/homepage`, `/api/categories`, `/api/skill-categories`, `/api/tools`
|
||||
|
||||
### /tools (工具列表)
|
||||
- 文件: `src/app/tools/page.tsx`
|
||||
- 功能: 分类筛选侧边栏(一级分类)、定价模型筛选、搜索、分页
|
||||
- 数据源: `/api/categories`, `/api/tools`
|
||||
|
||||
### /tools/[slug] (工具详情)
|
||||
- 文件: `src/app/tools/[slug]/page.tsx`
|
||||
- 功能: 工具完整信息展示、浏览计数+1、收藏按钮、评论评价
|
||||
- 数据源: `/api/tools/[slug]`
|
||||
|
||||
### /categories/[slug] (分类详情)
|
||||
- 文件: `src/app/categories/[slug]/page.tsx`
|
||||
- 功能: 按分类slug展示该分类下的工具
|
||||
- 数据源: `/api/categories`, `/api/tools`
|
||||
|
||||
### /skills (技能库)
|
||||
- 文件: `src/app/skills/page.tsx`
|
||||
- 功能: 技能分类筛选(一级+二级分类,左侧导航+标签切换)、搜索
|
||||
- 数据源: `/api/skill-categories`, `/api/skills`
|
||||
|
||||
### /skills/[slug] (技能详情)
|
||||
- 文件: `src/app/skills/[slug]/page.tsx`
|
||||
- 功能: 技能完整信息展示、浏览计数+1、收藏按钮、五维评测雷达图(SkillReviewCard)、评论评价
|
||||
- 数据源: `/api/skills/[slug]`, `/api/skills/[slug]/review`
|
||||
|
||||
### /login (用户登录)
|
||||
- 文件: `src/app/login/page.tsx`
|
||||
- 功能: 用户邮箱+密码登录/注册,GitHub OAuth登录
|
||||
- 数据源: NextAuth Credentials Provider
|
||||
|
||||
### /user (用户中心)
|
||||
- 文件: `src/app/user/page.tsx`
|
||||
- 功能: 用户资料编辑、快捷入口、浏览历史
|
||||
- 数据源: NextAuth session, `/api/user/history`
|
||||
|
||||
### /user/favorites (我的收藏)
|
||||
- 文件: `src/app/user/favorites/page.tsx`
|
||||
- 功能: 收藏的工具和技能列表,支持筛选和搜索
|
||||
- 数据源: `/api/user/favorites`
|
||||
|
||||
---
|
||||
|
||||
## 后台页面
|
||||
|
||||
### /admin/login (登录)
|
||||
- 文件: `src/app/(admin)/admin/login/page.tsx`
|
||||
- 功能: 管理员登录表单,CSRF token + 原生POST
|
||||
- 凭证: admin@zhuiguang.ai / admin123
|
||||
|
||||
### /admin/pending (待审核工具)
|
||||
- 文件: `src/app/(admin)/admin/pending/page.tsx`
|
||||
- 功能: 审核列表表格、多选复选框、全选、批量通过/拒绝、抓取缺失Logo/重新抓取全部Logo、编辑弹窗、单个通过/拒绝
|
||||
- 数据源: `/api/admin/pending`, `/api/admin/pending/batch-publish`, `/api/admin/pending/batch-reject`, `/api/admin/pending/fetch-logos`
|
||||
|
||||
### /admin/pending-skills (待审核技能)
|
||||
- 文件: `src/app/(admin)/admin/pending-skills/page.tsx`
|
||||
- 功能: 审核列表表格、多选复选框、全选、批量通过/拒绝、一键全部通过、编辑弹窗、Star数展示、GitHub链接
|
||||
- 数据源: `/api/admin/pending-skills`, `/api/admin/pending-skills/batch-publish`, `/api/admin/pending-skills/batch-reject`, `/api/admin/pending-skills/publish-all`
|
||||
|
||||
### /admin/tools (已发布工具)
|
||||
- 文件: `src/app/(admin)/admin/tools/page.tsx`
|
||||
- 功能: 工具管理表格、新增/编辑/删除、分页
|
||||
- 数据源: `/api/admin/tools`, `/api/admin/categories`
|
||||
|
||||
### /admin/skills (已发布技能)
|
||||
- 文件: `src/app/(admin)/admin/skills/page.tsx`
|
||||
- 功能: 技能管理表格、编辑/删除、分页
|
||||
- 数据源: `/api/admin/skills`, `/api/admin/skill-categories`
|
||||
|
||||
### /admin/categories (工具分类管理)
|
||||
- 文件: `src/app/(admin)/admin/categories/page.tsx`
|
||||
- 功能: 分类CRUD、树形展示、排序
|
||||
- 数据源: `/api/admin/categories`
|
||||
|
||||
### /admin/skill-categories (技能分类管理)
|
||||
- 文件: `src/app/(admin)/admin/skill-categories/page.tsx`
|
||||
- 功能: 技能分类CRUD
|
||||
- 数据源: `/api/admin/skill-categories`
|
||||
|
||||
### /admin/discover-tools (探索AI工具)
|
||||
- 文件: `src/app/(admin)/admin/discover-tools/page.tsx`
|
||||
- 功能: 选分类→复制提示词→粘贴JSON→导入审核列表→抓取Logo
|
||||
- 流程: 4步流程(选分类/复制提示词/粘贴导入/抓取Logo),提示词含排除列表,JSON粘贴区+导入按钮,Logo批量抓取
|
||||
- 数据源: `/api/admin/discover-tools`, `/api/admin/pending/fetch-logos`
|
||||
|
||||
### /admin/check-tools (检测AI工具)
|
||||
- 文件: `src/app/(admin)/admin/check-tools/page.tsx`
|
||||
- 功能: 4步流程(选范围/检测+抓取/Logo方法统计/处理失效),检测可访问性同时自动抓取缺失Logo,记录成功方法名统计
|
||||
- 数据源: `/api/admin/check-tools`, `/api/admin/tools/[id]`, `/api/admin/pending/[id]`
|
||||
|
||||
### /admin/discover-skills (探索AI技能)
|
||||
- 文件: `src/app/(admin)/admin/discover-skills/page.tsx`
|
||||
- 功能: 选分类→复制提示词→粘贴JSON→导入审核列表
|
||||
- 流程: 3步流程(选分类/复制提示词/粘贴导入),提示词含排除列表,JSON粘贴区+导入按钮
|
||||
- 数据源: `/api/admin/discover-skills`
|
||||
|
||||
### /admin/update-skills (更新Skill技能)
|
||||
- 文件: `src/app/(admin)/admin/update-skills/page.tsx`
|
||||
- 功能: 3步流程(选范围/一键更新/自动同步),更新GitHub/Gitee/GitCode星级,展示Star变化表格
|
||||
- 数据源: `/api/admin/update-stars`
|
||||
|
||||
### /admin/discover-news (AI新闻发现)
|
||||
- 文件: `src/app/(admin)/admin/discover-news/page.tsx`
|
||||
- 功能: 3步流程(复制提示词/粘贴导入/查看日报),新闻6大分类+热度评分,展示今日AI日报
|
||||
- 数据源: `/api/admin/discover-news`
|
||||
|
||||
### /admin/system-config (系统配置)
|
||||
- 文件: `src/app/(admin)/admin/system-config/page.tsx`
|
||||
- 功能: Logo抓取配置、发现提示词配置等全局设置
|
||||
- 数据源: `/api/admin/system-config`
|
||||
|
||||
---
|
||||
|
||||
## 布局
|
||||
|
||||
### 前台布局
|
||||
- 文件: `src/app/layout.tsx`
|
||||
- 结构: Geist字体 → AuthProvider → Header + main + Footer
|
||||
|
||||
### 后台布局
|
||||
- 文件: `src/app/(admin)/admin/layout.tsx`
|
||||
- 结构: 左侧边栏(4组菜单) + 右侧内容区
|
||||
- 菜单分组:
|
||||
- 工具管理: 待审核工具、已发布工具、工具分类
|
||||
- 技能库: 待审核技能、已发布技能、技能分类
|
||||
- AI发现: 探索AI工具、检测AI工具、探索Skill技能、更新Skill技能、AI新闻发现
|
||||
- 系统配置: 系统配置
|
||||
- 登录页不显示侧边栏
|
||||
@@ -0,0 +1,117 @@
|
||||
# 组件与样式模块
|
||||
|
||||
## 组件
|
||||
|
||||
### 布局组件
|
||||
|
||||
#### Header (`src/components/layout/Header.tsx`)
|
||||
- 前台顶部导航栏
|
||||
- Logo + 导航链接(工具库/技能库/分类浏览) + 搜索框 + 登录/用户按钮
|
||||
- 移动端汉堡菜单
|
||||
- 滚动时背景模糊效果(bg-white/80 backdrop-blur-2xl)
|
||||
- 搜索框: bg-muted/50 focus:bg-white focus:ring-2 focus:ring-primary/10
|
||||
|
||||
#### Footer (`src/components/layout/Footer.tsx`)
|
||||
- 前台底部页脚
|
||||
- Logo + 简介 + 发现/分类/关于链接 + 社交图标(GitHub/Twitter)
|
||||
|
||||
### Provider组件
|
||||
|
||||
#### AuthProvider (`src/components/providers/auth-provider.tsx`)
|
||||
- NextAuth SessionProvider 包裹组件
|
||||
- 用于在客户端组件中访问session
|
||||
|
||||
### 公共组件
|
||||
|
||||
#### LoginModal (`src/components/common/LoginModal.tsx`)
|
||||
- 登录/注册弹窗,支持模式切换
|
||||
- 邮箱+密码认证,注册可选填昵称
|
||||
- bg-white/95 backdrop-blur-xl
|
||||
|
||||
#### SkillReviewCard (五维评测雷达图)
|
||||
- 文件: `src/components/common/SkillReviewCard.tsx`
|
||||
- 用途: 技能详情页展示五维评测雷达图和维度详情卡片
|
||||
- 依赖: chart.js, react-chartjs-2 (dynamic import, ssr: false)
|
||||
- Props: `{ slug: string }`
|
||||
- 数据源: `/api/skills/${slug}/review`
|
||||
- 五维度: 场景与能力(capability) / 开发体验(devExp) / 成本与许可(costLicense) / 社区健康(community) / 性能稳定(performance)
|
||||
- 评分色标: ≥4绿色(emerald) / ≥3黄色(amber) / <3红色(red)
|
||||
- 设计规范: 遵循浅色主题设计系统,紫色(violet)主色调雷达图
|
||||
|
||||
### ReviewSection (`src/components/common/ReviewSection.tsx`)
|
||||
- 用户评论/评价组件,支持评分和文字评论
|
||||
- 支持tool和skill两种类型
|
||||
- bg-white/80卡片,bg-white/60评论项
|
||||
|
||||
#### FavoriteButton (`src/components/common/FavoriteButton.tsx`)
|
||||
- 收藏按钮,乐观更新
|
||||
- text-gray-500 hover:text-red-500
|
||||
|
||||
#### CategorySidebar (`src/components/common/CategorySidebar.tsx`)
|
||||
- 分类侧边栏,支持搜索和分类选择
|
||||
- bg-muted/50搜索框
|
||||
|
||||
### UI组件 (shadcn/ui)
|
||||
|
||||
#### Button (`src/components/ui/button.tsx`)
|
||||
- 6种变体: default, outline, secondary, ghost, destructive, link
|
||||
- 4种尺寸: default, sm, lg, icon
|
||||
|
||||
#### Card (`src/components/ui/card.tsx`)
|
||||
- Card/CardHeader/CardTitle/CardDescription/CardContent/CardFooter
|
||||
|
||||
#### Dialog (`src/components/ui/dialog.tsx`)
|
||||
- 基于 @radix-ui/react-dialog
|
||||
- Dialog/DialogTrigger/DialogContent/DialogHeader/DialogTitle/DialogDescription/DialogFooter/DialogClose
|
||||
- 遮罩层: bg-black/80
|
||||
|
||||
---
|
||||
|
||||
## 样式系统
|
||||
|
||||
### 全局样式 (`src/app/globals.css`)
|
||||
- 浅色主题CSS变量(HSL色系)
|
||||
- shadcn/ui 主题变量
|
||||
- 自定义工具类:
|
||||
- `.glow-sm` / `.glow-md` / `.glow-lg` - 发光效果
|
||||
- `.gradient-text` - 渐变文字(蓝→紫→粉)
|
||||
- `.gradient-border` - 渐变边框
|
||||
- `.glass` / `.glass-sm` - 毛玻璃效果(bg-white/80 + backdrop-blur)
|
||||
- `.card-shine` - 卡片光泽动画
|
||||
- `.dot-grid` - 点阵网格背景
|
||||
- `.animate-fade-in` - 淡入动画
|
||||
- `.animate-slide-up` - 上滑动画
|
||||
- `.animate-float` - 浮动动画
|
||||
- `.animate-pulse-glow` - 脉冲发光
|
||||
|
||||
### Tailwind配置 (`tailwind.config.ts`)
|
||||
- 浅色模式: class策略
|
||||
- 主题色系: HSL CSS变量(background: 210 20% 98%, foreground: 222 47% 11%, primary: 221 83% 53%等)
|
||||
- 动画: fade-in, slide-up, float, glow-pulse
|
||||
- 自定义字体: Geist Sans, Geist Mono
|
||||
|
||||
### 设计规范
|
||||
- 圆角: 统一使用 rounded-xl (12px) 或 rounded-2xl (16px)
|
||||
- 边框: border-border/40 (40%透明度)
|
||||
- 背景: bg-white/80 (毛玻璃) / bg-white/60 (卡片) / bg-muted/50 (输入框)
|
||||
- 阴影: shadow-sm (卡片) / shadow-md (悬浮)
|
||||
- 间距: 统一使用 Tailwind 间距系统
|
||||
- 动画: transition-all duration-200
|
||||
|
||||
### 颜色规范(浅色主题)
|
||||
- 文字颜色: 使用 -600/-700 系列(如 text-blue-700, text-emerald-600)
|
||||
- 背景颜色: 使用 -50 系列(如 bg-blue-50, bg-emerald-50)
|
||||
- 边框颜色: 使用 -200/60 系列(如 border-blue-200/60, border-emerald-200/60)
|
||||
- 严禁使用暗色主题的 -400 文字、-500/10 背景、-500/20 边框
|
||||
- 输入框: bg-muted/50 focus:bg-white focus:ring-2 focus:ring-primary/10
|
||||
|
||||
### 定价模型颜色
|
||||
- free: bg-emerald-50 text-emerald-700 border-emerald-200/60
|
||||
- freemium: bg-blue-50 text-blue-700 border-blue-200/60
|
||||
- paid: bg-amber-50 text-amber-700 border-amber-200/60
|
||||
- subscription: bg-purple-50 text-purple-700 border-purple-200/60
|
||||
|
||||
### 来源类型颜色
|
||||
- github: bg-slate-50 text-slate-700
|
||||
- gitlab: bg-orange-50 text-orange-700
|
||||
- huggingface: bg-yellow-50 text-yellow-700
|
||||
@@ -0,0 +1,132 @@
|
||||
# AI发现模块
|
||||
|
||||
## 概述
|
||||
AI发现模块是追光AI的核心功能,采用"提示词+JSON粘贴导入"模式,用户复制页面内嵌的提示词发给AI助手,获取JSON后粘贴到页面导入,不调用任何外部AI API。
|
||||
|
||||
## 架构
|
||||
```
|
||||
页面内嵌提示词模板(含排除列表) → 用户复制发给AI助手 → AI返回JSON → 粘贴到页面 → API去重导入 → PendingTool/PendingSkill → 管理员审核 → Tool/Skill
|
||||
```
|
||||
|
||||
## 五大操作指令
|
||||
|
||||
### 探索AI工具 (`/admin/discover-tools`)
|
||||
1. 选择分类(20个工具分类)
|
||||
2. 复制提示词(自动注入排除列表)
|
||||
3. 粘贴AI返回的JSON到输入框
|
||||
4. 点击导入按钮,API自动去重导入待审核列表
|
||||
5. 可选:批量抓取Logo
|
||||
|
||||
### 检测AI工具 (`/admin/check-tools`)
|
||||
1. 选择范围(已发布/待审核)
|
||||
2. 一键检测+抓取Logo
|
||||
3. 系统自动逐一GET请求检测网站可访问性
|
||||
4. 同时自动抓取缺失Logo,记录成功方法名
|
||||
5. 展示Logo抓取方法统计(按成功次数排序)
|
||||
6. 失效工具可一键删除
|
||||
|
||||
### 探索AI技能 (`/admin/discover-skills`)
|
||||
1. 选择分类(20个技能分类)
|
||||
2. 复制提示词(自动注入排除列表)
|
||||
3. 粘贴AI返回的JSON到输入框
|
||||
4. 点击导入按钮,API自动去重导入待审核列表
|
||||
|
||||
### 更新Skill技能 (`/admin/update-skills`)
|
||||
1. 选择范围(已发布/待审核)
|
||||
2. 一键更新Star
|
||||
3. 系统自动从GitHub/Gitee/GitCode API获取最新星级
|
||||
4. 展示Star变化表格(上升/下降/不变)
|
||||
|
||||
### AI新闻发现 (`/admin/discover-news`)
|
||||
1. 复制新闻发现提示词
|
||||
2. 粘贴AI返回的JSON到输入框
|
||||
3. 点击导入按钮,自动生成今日AI日报
|
||||
4. 新闻6大分类:产品发布/融资投资/技术突破/政策法规/开源项目/行业事件
|
||||
5. 每条新闻含热度评分(1-100)
|
||||
|
||||
## Logo抓取引擎 (`src/lib/logo-fetcher.ts`)
|
||||
|
||||
### 核心API
|
||||
- `fetchLogo(websiteUrl, html?): Promise<string>` — 返回Logo URL
|
||||
- `fetchLogoWithMethod(websiteUrl, html?): Promise<{url, method}>` — 返回Logo URL + 成功方法名
|
||||
|
||||
### 抓取策略(按优先级,共10种)
|
||||
1. **HTML Link图标**: 解析 `<link rel="icon/apple-touch-icon">` 标签
|
||||
2. **OG/Twitter图片**: 解析 `<meta property="og:image">` 标签
|
||||
3. **HTML Manifest**: 解析 `manifest.json` 中的icons数组
|
||||
4. **HTML img标签**: 查找class/alt含"logo"的img标签
|
||||
5. **Header区域Logo**: 解析header/nav区域内的img标签
|
||||
6. **SVG Logo**: 查找内联SVG logo
|
||||
7. **常见路径**: 尝试 /apple-touch-icon.png, /logo.png, /favicon.ico 等
|
||||
8. **Favicon服务**:
|
||||
- favicon.im
|
||||
- Google Favicons (sz=128/64)
|
||||
- Clearbit
|
||||
- DuckDuckGo
|
||||
- Favicon Grabr (API解析)
|
||||
- Icon Horse (API解析)
|
||||
9. **Brandfetch品牌库**: 通过Brandfetch API获取品牌Logo
|
||||
10. **截图兜底**: 通过截图服务获取网站截图
|
||||
|
||||
### 配置项
|
||||
- `enabledMethods`: 启用的抓取方法
|
||||
- `commonPaths`: 常见图标路径列表
|
||||
- `faviconServices`: Favicon服务列表
|
||||
- `minFileSize`: 最小文件大小(默认50字节)
|
||||
- `requestTimeout`: 请求超时(默认10秒)
|
||||
|
||||
### Logo本地存储 (`src/lib/logo-storage.ts`)
|
||||
- `downloadLogo(url, filename): Promise<string>` — 下载Logo到 `/public/logos/` 目录
|
||||
- 返回本地路径如 `/logos/filename.png`
|
||||
|
||||
## 脚本
|
||||
|
||||
### discover-skills.mjs
|
||||
- 独立运行的AI技能发现脚本
|
||||
- 遍历20个技能分类,每类调用DeepSeek API推荐10个GitHub开源项目
|
||||
- 通过 `/api/admin/pending-skills/batch` 批量导入
|
||||
- 每分类间隔3秒避免限流
|
||||
- 自动排除已收录技能
|
||||
|
||||
### import-tools-batch1.mjs / import-tools-batch2.mjs
|
||||
- 硬编码的AI工具数据导入脚本
|
||||
- 通过 `/api/admin/pending/batch` 批量导入
|
||||
|
||||
## 自动化评测流程
|
||||
|
||||
### 架构概览
|
||||
```
|
||||
GitHub API (octokit) → 搜索热门仓库 → 获取README
|
||||
↓
|
||||
DeepSeek API (openai兼容) → 五维评测生成 → JSON解析+校验
|
||||
↓
|
||||
Prisma → Skill记录 + SkillReview记录 + ReviewGenerationLog日志
|
||||
↓
|
||||
前端 → /api/skills/[slug]/review → SkillReviewCard雷达图展示
|
||||
```
|
||||
|
||||
### 评测脚本 (scripts/auto-review.mjs)
|
||||
- 搜索关键词: ai agent, llm framework, rag, prompt engineering
|
||||
- 每日限制: 8个项目 (DAILY_LIMIT可配置)
|
||||
- 最低Star数: 500
|
||||
- 去重: 通过sourceUrl检查是否已存在
|
||||
- 综合分校验: 自动计算五维均分,偏差>0.3时修正
|
||||
- 评测状态: 初始为DRAFT,需手动或通过脚本改为PUBLISHED
|
||||
|
||||
### 五维评测维度
|
||||
| 维度 | 字段 | 说明 |
|
||||
|------|------|------|
|
||||
| 场景与能力 | capability | 场景覆盖度和核心能力 |
|
||||
| 开发体验 | devExp | 安装、文档、API易用性 |
|
||||
| 成本与许可 | costLicense | 硬件成本、API定价、许可证风险 |
|
||||
| 社区健康 | community | Issue响应、PR频率、生态 |
|
||||
| 性能稳定 | performance | 运行效率、稳定性、输出质量 |
|
||||
|
||||
### 评测标签分类
|
||||
LLM框架, Agent框架, RAG, 提示工程, 多模态, 代码助手, 模型训练, 数据工程, 部署工具, 评测工具, 安全对齐, 其他
|
||||
|
||||
### 发布评测脚本 (scripts/publish-reviews.mjs)
|
||||
- 将DRAFT状态评测改为PUBLISHED
|
||||
- 同时将对应Skill状态从draft改为published
|
||||
|
||||
## 踩坑记录
|
||||
@@ -0,0 +1,58 @@
|
||||
# 认证模块
|
||||
|
||||
## 技术栈
|
||||
- NextAuth.js v4
|
||||
- Credentials Provider(用户名密码 + 用户邮箱密码)
|
||||
- JWT Session策略
|
||||
|
||||
## 配置 (`src/lib/auth.ts`)
|
||||
|
||||
### 管理员认证
|
||||
- 唯一凭证: `admin@zhuiguang.ai` / `admin123`
|
||||
- 硬编码在auth.ts中,非数据库查询
|
||||
|
||||
### 用户认证
|
||||
- 邮箱+密码注册/登录
|
||||
- 用户数据存储在User表
|
||||
- 密码bcrypt加密
|
||||
|
||||
### Session策略
|
||||
- 使用JWT,不使用数据库session
|
||||
- JWT密钥: `NEXTAUTH_SECRET` 环境变量
|
||||
|
||||
### 回调函数
|
||||
- `jwt`: 登录时将用户信息加入token
|
||||
- `session`: 将token中的用户信息传递给session
|
||||
|
||||
## 路由保护 (`src/middleware.ts`)
|
||||
|
||||
### 保护规则
|
||||
- 保护 `/admin` 下所有路由
|
||||
- 跳过 `/admin/login`
|
||||
- 使用NextAuth middleware进行认证检查
|
||||
|
||||
### 登录流程
|
||||
1. 访问 `/admin/*` → middleware检查session
|
||||
2. 未登录 → 重定向到 `/admin/login`
|
||||
3. 登录页提交表单 → Server Action验证凭证
|
||||
4. 验证成功 → 重定向到 `/admin`
|
||||
|
||||
## 管理员API认证 (`src/lib/admin-auth.ts`)
|
||||
|
||||
### requireAdmin中间件
|
||||
- 所有 `/api/admin/` 路由必须使用requireAdmin中间件
|
||||
- 验证流程: 检查session → 验证邮箱是否为admin@zhuiguang.ai
|
||||
- 已覆盖28个后台API端点
|
||||
|
||||
## 登录页
|
||||
- 管理员登录: `src/app/(admin)/admin/login/page.tsx` (原生HTML表单 + CSRF Token)
|
||||
- 用户登录: `src/app/login/page.tsx` (NextAuth Credentials + GitHub OAuth)
|
||||
- 用户登录弹窗: `src/components/common/LoginModal.tsx`
|
||||
|
||||
## 环境变量
|
||||
```
|
||||
NEXTAUTH_URL=http://localhost:3100
|
||||
NEXTAUTH_SECRET=<secret>
|
||||
GITHUB_ID=<github-oauth-id>
|
||||
GITHUB_SECRET=<github-oauth-secret>
|
||||
```
|
||||
@@ -0,0 +1,110 @@
|
||||
# 工具库与脚本模块
|
||||
|
||||
## 工具库 (`src/lib/`)
|
||||
|
||||
### src/lib/github.ts (GitHub数据采集)
|
||||
- 依赖: octokit
|
||||
- 认证: process.env.GITHUB_TOKEN (可选,提升限流60→5000次/小时)
|
||||
- `searchHotRepos(query, minStars, maxResults)`: 搜索热门仓库,按Star降序
|
||||
- `getRepoReadme(owner, repo)`: 获取仓库README内容(base64解码)
|
||||
- `GitHubRepo` 接口: id, full_name, html_url, description, stargazers_count, forks_count, language, license, topics, updated_at, readme
|
||||
|
||||
### src/lib/deepseek.ts (DeepSeek评测生成)
|
||||
- 依赖: openai (兼容OpenAI接口)
|
||||
- 认证: process.env.DEEPSEEK_API_KEY
|
||||
- baseURL: https://api.deepseek.com/v1
|
||||
- 模型: deepseek-v4-pro
|
||||
- `generateReview(repoName, description, stars, license, readme)`: 调用DeepSeek生成五维评测
|
||||
- `ReviewDimension` 接口: { score, summary, detail }
|
||||
- `ReviewResult` 接口: capability, devExp, costLicense, community, performance, overall, tags
|
||||
- 综合分校验: 自动计算五维均分,偏差>0.3时修正
|
||||
- JSON提取: 兼容markdown代码块包裹的响应
|
||||
|
||||
### prisma.ts - 数据库客户端
|
||||
- Prisma单例模式,防止开发环境热重载创建多实例
|
||||
- 使用PrismaMariaDb adapter
|
||||
- 连接池配置
|
||||
|
||||
### auth.ts - 认证配置
|
||||
- NextAuth配置导出
|
||||
- Credentials Provider(管理员+用户)
|
||||
- JWT策略
|
||||
- GitHub OAuth Provider
|
||||
- 导出GET/POST handler
|
||||
|
||||
### admin-auth.ts - 管理员API认证
|
||||
- 导出 `requireAdmin()` 中间件函数
|
||||
- 验证session中邮箱是否为admin@zhuiguang.ai
|
||||
- 所有 `/api/admin/` 路由必须使用此中间件
|
||||
- 返回401/403错误响应
|
||||
|
||||
### utils.ts - 工具函数
|
||||
- `cn()`: 合并clsx + tailwind-merge的className工具
|
||||
|
||||
### logo-fetcher.ts - Logo抓取引擎
|
||||
- 导出 `fetchLogo(websiteUrl, html?): Promise<string>` — 返回Logo URL
|
||||
- 导出 `fetchLogoWithMethod(websiteUrl, html?): Promise<LogoFetchResult>` — 返回 `{url, method}`
|
||||
- 10种抓取策略按优先级执行
|
||||
- 支持从SystemConfig读取配置
|
||||
- 每种成功方法返回中文名称(如"HTML Link图标"、"OG/Twitter图片"等)
|
||||
- 详见 [05-ai-discovery.md](./05-ai-discovery.md)
|
||||
|
||||
### logo-storage.ts - Logo本地存储
|
||||
- 导出 `downloadLogo(url, filename): Promise<string>`
|
||||
- 下载远程Logo到 `/public/logos/` 目录
|
||||
- 返回本地路径如 `/logos/filename.png`
|
||||
|
||||
---
|
||||
|
||||
## 脚本 (`scripts/`)
|
||||
|
||||
### discover-skills.mjs - AI技能发现
|
||||
- 独立运行的Node.js脚本
|
||||
- 遍历20个技能分类,每类调用DeepSeek API推荐10个GitHub开源项目
|
||||
- 通过 `/api/admin/pending-skills/batch` 批量导入
|
||||
- 自动排除已收录技能
|
||||
- 每分类间隔3秒
|
||||
- 运行: `node scripts/discover-skills.mjs`
|
||||
|
||||
### import-tools-batch1.mjs - 第一批工具导入
|
||||
- 硬编码约80个国产AI工具
|
||||
- 分类: 文本生成(165)/图像生成(174)/视频生成(183)/音频与语音(191)
|
||||
|
||||
### import-tools-batch2.mjs - 第二批工具导入
|
||||
- 硬编码约200个国产AI工具
|
||||
- 分类: 代码开发/AI Agent/办公效率/设计创意/营销SEO/数据分析/教育学习/搜索信息/安全合规/医疗健康/金融法律/电商零售/3D游戏/科学研究/模型框架/聊天机器人
|
||||
|
||||
---
|
||||
|
||||
## 运维脚本
|
||||
|
||||
### scripts/auto-review.mjs (自动化评测脚本)
|
||||
- 依赖: @prisma/client, @prisma/adapter-mariadb, octokit, openai
|
||||
- 流程: GitHub搜索→README获取→DeepSeek评测→Skill入库→SkillReview入库→日志记录
|
||||
- 配置: SEARCH_QUERIES(4个关键词), MIN_STARS(500), MAX_PER_QUERY(5), DAILY_LIMIT(8)
|
||||
- 去重: 通过sourceUrl检查
|
||||
- slug生成: repo full_name转小写+连字符
|
||||
- 默认分类ID: 120 (AI/ML工程)
|
||||
- 运行: `$env:NODE_TLS_REJECT_UNAUTHORIZED="0"; node scripts/auto-review.mjs`
|
||||
|
||||
### scripts/publish-reviews.mjs (发布评测脚本)
|
||||
- 将DRAFT状态SkillReview改为PUBLISHED
|
||||
- 将对应draft状态Skill改为published
|
||||
|
||||
### scripts/test-github.mjs (GitHub API测试)
|
||||
- 测试searchHotRepos和getRepoReadme功能
|
||||
- 运行: `$env:NODE_TLS_REJECT_UNAUTHORIZED="0"; node -r dotenv/config scripts/test-github.mjs`
|
||||
|
||||
### scripts/test-deepseek.mjs (DeepSeek API测试)
|
||||
- 测试generateReview功能,使用langflow作为测试用例
|
||||
- 运行: `$env:NODE_TLS_REJECT_UNAUTHORIZED="0"; node scripts/test-deepseek.mjs`
|
||||
|
||||
### restart.ps1 - 服务重启
|
||||
- PowerShell脚本
|
||||
- 扫描8301-8310端口
|
||||
- 杀死占用进程
|
||||
- 执行 `npm run dev` 启动服务(端口8301)
|
||||
- 运行: `pwsh -ExecutionPolicy Bypass -File restart.ps1`
|
||||
|
||||
### temp_clear.mjs - 临时清理
|
||||
- 清空pending_tools表
|
||||
Reference in New Issue
Block a user