v0.11.1: 权限体系重构 + AI管线优化 + 内容整理
This commit is contained in:
@@ -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