GEO 工作站是一套 GEO 营销运营系统,用于围绕生成式 AI 搜索/问答场景建设品牌诊断、提示词策略、企业知识资产、GEO 内容生成、模型覆盖记录和优化复盘能力。
它不是普通 CMS、普通知识库,也不是员工效率工具。所有后续功能都必须服务于这条业务主线:
GEO 诊断 -> 提示词策略 -> 企业知识库 -> GEO 内容生成 -> 效果记录 -> 优化建议
- 前端:Vue 3 + Vite + TypeScript + Element Plus
- 后端:NestJS + TypeScript
- 数据库:PostgreSQL
- ORM:Prisma
- 队列:Redis + BullMQ,后续 AI 和解析任务使用
- 文件存储:本地存储起步
- AI 接入:演示和离线开发默认使用 mock Provider,支持 OpenAI-compatible Provider;可通过后端私有环境变量配置 DeepSeek、硅基流动或其他兼容服务
- 包管理:pnpm workspace
.
├── AGENTS.md
├── README.md
├── apps
│ ├── api
│ └── web
├── docs
│ ├── implementation-plan.md
│ └── specs
│ └── geo-marketing-platform-spec.md
├── packages
│ └── shared
├── scripts
├── package.json
├── pnpm-workspace.yaml
└── tsconfig.base.json
- 项目约束:
AGENTS.md - 产品规格:
docs/specs/geo-marketing-platform-spec.md - 实施计划:
docs/implementation-plan.md - 后端 API 文档:
docs/api/backend-api.md - GEO MVP 联调流程:
docs/api/geo-mvp-flow.md - 前端 MVP 使用指南:
docs/frontend/frontend-mvp-guide.md - 使用教程文档:
docs/help/user-guide.md - 常用 SOP:
docs/help/sop.md - 内部版本记录:
docs/help/changelog.md - 内部演示指南:
docs/demo/internal-demo-guide.md - MVP 功能清单:
docs/demo/mvp-feature-checklist.md - 演示数据说明:
docs/demo/demo-data-notes.md - 部署准备指南:
docs/deployment/deployment-guide.md - 环境变量指南:
docs/deployment/env-guide.md - 数据库备份与恢复:
docs/deployment/database-backup.md - 上线前检查清单:
docs/deployment/release-checklist.md - 角色与公司上下文说明:
docs/deployment/roles-and-company-context.md - 部署前 P1 修复清单:
docs/deployment/pre-deploy-p1-checklist.md - 自用操作 SOP:
docs/operation/self-use-sop.md - 真实 AI 测试计划:
docs/operation/real-ai-test-plan.md - 真实 AI 质量记录:
docs/operation/quality-notes.md - 通用内容质量规则:
docs/operation/content-quality-rules.md - 内容质量检查与发布稿优化:
docs/operation/content-quality-check.md - 发布稿富文本排版与复制:
docs/operation/publish-format-guide.md - 跨行业通用模板体系:
docs/operation/generic-template-system.md - 默认/示例指令模板备份:
docs/operation/default-instruction-templates.md
根目录原始 spec 已归位到 docs/specs/geo-marketing-platform-spec.md,该路径是正式 spec 路径。
前端使用教程入口:/help。登录后可从侧边栏底部“使用教程”进入。
配套文档:
- 使用教程:
docs/help/user-guide.md - 常用 SOP:
docs/help/sop.md - 内部版本记录保留在:
docs/help/changelog.md
这些文档面向长期自用、内部演示和交接说明,不新增后端 API、不修改 Prisma schema,也不改变现有业务数据。
当前版本状态:internal-mvp-v0.2。
一键启动顺序:
cp .env.example .env # 如果本地还没有 .env
docker compose up -d postgres
pnpm install
pnpm prisma:migrate
pnpm prisma:seed
pnpm dev:api
pnpm dev:web默认管理员由基础 seed 创建。开发环境可使用 .env.example 中的占位账号和密码;共享部署或生产环境必须先在私有 .env / .env.production 中修改 JWT_SECRET、DEFAULT_ADMIN_EMAIL 和 DEFAULT_ADMIN_PASSWORD,再执行 seed。需要演示样例 GEO 数据时,额外执行 INCLUDE_DEMO_SEED=true pnpm prisma:seed:demo;正式库和干净库不要执行演示 seed。
演示入口:
http://localhost:5173/login
演示指南:
docs/demo/internal-demo-guide.mddocs/demo/mvp-feature-checklist.mddocs/demo/demo-data-notes.md
内部演示版验收命令:
pnpm lint
pnpm typecheck
pnpm build
DATABASE_URL=postgresql://geo_workstation:geo_workstation@localhost:5432/geo_workstation?schema=public pnpm test:api
pnpm smoke:api
pnpm test:web-mvp
pnpm test:auth
pnpm test:web-auth
pnpm check:internal-mvppnpm smoke:api 需要先启动后端 API,并会先使用默认管理员账号登录。可以通过 SMOKE_AUTH_EMAIL 和 SMOKE_AUTH_PASSWORD 覆盖冒烟测试使用的登录账号。
当前 mock 能力只用于演示、测试和无 Key 环境,不作为正式外部 AI 效果承诺:
- GEO 分析。
- AI 拓词默认使用 mock Provider,可切换
openai_compatible,并按用户决策场景生成“真实用户会向 AI 提问”的候选问题。 - GEO 内容生成默认使用 mock Provider,可切换
openai_compatible。
当前未实现能力:
- PC、移动网页和 App 端真实用户结果自动检测,以及全平台定时批量检测。
- 多模型批量外部检测和定时检测。
- 开放注册、忘记密码、OAuth、多租户和复杂菜单级权限。
- 自动发布。
- 真实服务器部署执行。
- 多用户协作。
当前版本已加入内部 MVP 所需的最小访问控制:
- 后端使用 JWT Bearer 登录态。
POST /api/auth/login校验邮箱、密码和用户状态。GET /api/auth/me返回当前登录用户。POST /api/auth/logout用于前端清理登录态。/health和/api/auth/login可匿名访问,其他/api/*默认需要登录。- 前端
/login提供登录页,业务路由会在未登录时跳转登录页。 - 顶部栏显示当前用户、角色和退出登录入口。
当前正式角色为 platform_admin、company_admin、operator、viewer:
| 角色 | 说明 | 主要权限 | 限制 |
|---|---|---|---|
platform_admin |
平台管理员 | 管理用户、查看当前公司上下文内所有业务数据、执行主要业务操作 | 生产环境仍需配合内网/Nginx/账号安全 |
company_admin |
公司管理员 | 管理本公司范围内的主要 GEO 业务数据 | 当前用户管理主要由 platform_admin 管理 |
operator |
运营成员 | 创建和维护 GEO 诊断、提示词、拓词、知识库、指令、内容、模型覆盖和报表相关数据 | 只能操作当前公司与自己权限范围内的数据 |
viewer |
只读角色 | 查看业务数据和报表 | 不能创建 GEO 诊断任务,不能创建 GEO 内容任务,不应执行写操作 |
公司上下文会影响业务数据范围。前端会隐藏无权限入口,但真正的权限边界以后端认证、角色判断和 companyId 隔离为准。历史兼容角色如 admin、geo_operator、content_editor 仅用于旧数据兼容,不作为当前主文档角色。
本阶段不做开放注册、忘记密码、短信/邮箱验证码、OAuth、多租户 SaaS、复杂审批流或细粒度菜单权限配置。完整说明见 docs/deployment/roles-and-company-context.md。
当前版本已加入统一 AI Provider 抽象:
- 默认
AI_PROVIDER=mock,无需真实 API Key,适合演示、测试和离线开发。 AI_PROVIDER=openai_compatible时,后端通过 OpenAI-compatible Chat Completions 接口生成内容或拓词候选。- 可以通过
AI_OPENAI_COMPATIBLE_BASE_URL和AI_OPENAI_COMPATIBLE_MODEL配置 DeepSeek、硅基流动或其他兼容服务。 AI_OPENAI_COMPATIBLE_API_KEY只允许放在后端私有.env/.env.production中,前端不会读取、输入、保存或展示 API Key。- 真实 AI 调用会消耗接口额度;缺少 key、鉴权失败、模型不可用或超时时,后端会返回可读错误并写入
ai_call_logs。
示例配置见 .env.example、.env.production.example 和 docs/deployment/env-guide.md。
当前版本支持单项目“项目档案 / 品牌档案”能力。系统不绑定某个固定公司、产品线或行业;它适用于企业品牌、产品、服务、课程、门店、本地生活、个人品牌或其他项目在生成式 AI 搜索/问答场景中的可见度运营。
在 /settings 可以维护:
- 项目名称、企业名称、品牌名称、官网。
- 所属行业,用户自由填写,不作为固定枚举。
- 主营产品 / 服务 / 课程 / 门店 / 个人品牌方向。
- 目标客户、品牌定位、内容语气、禁止表达、目标 AI 平台和补充说明。
项目档案会作为真实 AI 内容生成和 AI 拓词的上下文,但不会替代知识库事实。具体参数、价格、认证、案例、效果承诺、课程结果、门店活动或服务细节仍必须来自知识库、目标提示词或任务输入。
当前自用真实流程面向本地或内网试用,不提交真实 Key,不做全自动外部 AI 检测。
推荐阅读:
- 自用 SOP:
docs/operation/self-use-sop.md - 真实 AI 测试计划:
docs/operation/real-ai-test-plan.md - 质量记录模板:
docs/operation/quality-notes.md
自用流程建议:
- 在私有
.env中配置AI_OPENAI_COMPATIBLE_API_KEY,不要提交该文件。 - 启动 PostgreSQL、后端和前端。
- 登录系统。
- 先在
/settings配置当前项目档案,再导入该项目的真实提示词和知识库资料。仓库中的“激光测距传感器”资料仅作为示例数据。 - 在
/expansion使用provider = openai_compatible生成候选词,人工勾选保存。 - 在
/geo-content使用provider = openai_compatible生成内容,人工审核后导出 Markdown;/content-tasks是历史兼容入口。 内容生成后可在详情中执行“质量检查”和“生成发布优化版”,用于识别知识库外参数、品牌表达和 GEO 结构风险;还可以生成富文本发布稿,复制富文本 / Markdown / 纯文本或下载 HTML,优化稿和排版稿都不会自动覆盖原文。 - 人工录入模型覆盖记录,并在
/geo-reports复盘;/reports是历史兼容入口。
自用就绪检查:
pnpm check:self-use该脚本只检查文档、示例配置和脚本是否齐备,不读取或打印真实环境变量。
当前部署准备已覆盖 internal-mvp-v0.2 的文档、环境变量示例、PM2 示例、Nginx 示例、Docker Compose 生产示例和部署检查脚本。当前仓库不连接真实服务器,不配置真实域名,不写真实数据库密码,也不会提交真实 AI Provider Key。
部署准备和真实 AI 自用配置都必须坚持:不提交真实 AI Provider Key。
当前推荐部署方案:
- 单 VPS 或内网测试服务器。
- PostgreSQL 使用 Docker Compose。
- NestJS API 构建后使用 PM2 运行。
- Vite Web 构建后由 Nginx 托管静态文件。
- Nginx 将
/api和/health反向代理到本机 API。
后续可选方案:
deploy/docker-compose.production.example.yml提供一体化 Docker Compose 结构示例。- 该示例不替换当前本地开发
docker-compose.yml。
部署文档:
docs/deployment/deployment-guide.mddocs/deployment/env-guide.mddocs/deployment/database-backup.mddocs/deployment/release-checklist.mddocs/deployment/roles-and-company-context.mddocs/deployment/pre-deploy-p1-checklist.md
生产环境变量示例:
.env.production.exampleapps/web/.env.production.example
部署示例配置:
deploy/ecosystem.config.cjsdeploy/nginx.geo-workstation.example.confdeploy/docker-compose.production.example.yml
部署准备检查:
pnpm check:deployment安装依赖:
pnpm install启动前端:
pnpm dev:web前端默认地址:http://localhost:5173
前端 API 地址读取 VITE_API_BASE_URL。开发环境未配置时使用本机 API;生产构建未配置时走同源 /api。局域网或生产部署不要把该变量设为 localhost,详见 docs/deployment/env-guide.md。
登录页:http://localhost:5173/login
联网检测 Provider 只在后端读取环境变量,前端不会接触 API Key。启用 /model-inclusion-records 的联网检测入口时,Kimi 方向需要在后端运行环境配置:
KIMI_API_KEYKIMI_BASE_URLKIMI_MODELKIMI_WEB_SEARCH_ENABLEDKIMI_WEB_SEARCH_TOOL_NAMEKIMI_TIMEOUT_MS,建议设置为120000
豆包 / 火山生态方向使用火山方舟 Web Search API,需要配置:
VOLCENGINE_WEB_SEARCH_API_KEYVOLCENGINE_WEB_SEARCH_BASE_URLVOLCENGINE_WEB_SEARCH_RESPONSES_URLVOLCENGINE_WEB_SEARCH_MODELVOLCENGINE_WEB_SEARCH_FORCE_SEARCHVOLCENGINE_WEB_SEARCH_MAX_OUTPUT_TOKENS,建议设置为1200VOLCENGINE_WEB_SEARCH_TIMEOUT_MS,建议设置为180000
通义 / 阿里云百炼方向使用百炼 OpenAI-compatible Chat Completions + Web Search,需要配置:
ALIYUN_BAILIAN_API_KEYALIYUN_BAILIAN_BASE_URLALIYUN_BAILIAN_MODELALIYUN_BAILIAN_WEB_SEARCH_ENABLEDALIYUN_BAILIAN_FORCE_SEARCHALIYUN_BAILIAN_TIMEOUT_MS,未配置时默认120000
Kimi 联网检测是 Kimi Web Search API 结果,不等同于 Kimi App 端真实用户结果,也不包含 PC/移动网页端自动采集。联网搜索可能出现 timeout、fetch failed、连接重置等临时网络类失败;后端会对这类错误做最多 1 次轻量重试,并在返回结果中标记错误分类和 retryCount。
豆包 / 火山方舟联网搜索检测写入 platform = 豆包 / 火山方舟、entryPoint = web_search_api、detectionMethod = web_search。它是火山方舟 Web Search API 检测结果,不等同于豆包 App 端真实用户结果;当前可能不返回结构化 URL / citations,但会保存 web_search_call 作为联网证据。火山检测会在请求中限制为 300 字以内短回答,并用 VOLCENGINE_WEB_SEARCH_MAX_OUTPUT_TOKENS 控制输出,避免生成长篇选型指南导致 incomplete:length。
通义千问 / 阿里云百炼联网搜索检测写入 platform = 通义千问 / 阿里云百炼、entryPoint = web_search_api、detectionMethod = web_search。它是百炼 Web Search API 检测结果,不等同于通义千问 App 或网页端真实用户结果;当前响应可能不返回结构化 references / citations / searchResults / URL,第一版主要从回答正文判断品牌提及、品牌推荐和官网引用,不伪造引用来源。
启动后端:
pnpm dev:api后端健康检查:http://localhost:3000/health
/login:内部登录页,使用邮箱和密码获取 JWT 登录态。/dashboard:GEO 工作台,展示总览指标、优化建议、快捷入口和能力边界。/geo-analysis:GEO 分析,支持创建任务、编辑 pending 任务、运行 Mock 分析、查看结果、转提示词和创建内容任务。/geo-prompts:提示词策略库,支持查询、筛选、新增、编辑、软删除、批量导入和 CSV 导出。/expansion:AI 拓词,支持手动组合、默认 Mock 或openai_compatible候选生成、重复标记、勾选保存到提示词库。/knowledge-bases:企业 GEO 知识库,支持知识库管理、文本导入、txt/md/csv 上传解析、文件 reparse 和知识片段管理。/instruction-templates:指令库,支持指令模板创建、编辑、查看详情、复制和软删除。/geo-content:GEO 内容生成正式入口,支持创建默认 mock 或openai_compatible内容任务、查看/编辑/删除内容项、质量检查、发布优化版、富文本发布稿排版、Markdown/HTML 导出和失败重试入口。/content-tasks:GEO 内容生成历史兼容入口,指向同一页面。/model-inclusion-records:模型覆盖记录已升级为多入口 GEO 命中记录口径,支持手动录入、批量导入、Kimi Web Search API 联网检测、豆包 / 火山方舟联网搜索检测、通义千问 / 阿里云百炼联网搜索检测、summary、未覆盖提示词和 CSV 导出,并记录平台、入口、联网/登录状态、命中等级、内容资产引用、竞品出现、原始回答和引用来源。/geo-reports:GEO 报表正式入口,支持总览、提示词覆盖、模型覆盖、GEO 命中汇总、内容覆盖、知识库覆盖、优化建议和 CSV 导出。GEO 命中汇总默认按每个提示词 + 平台 + 入口的最新检测结果统计,避免历史测试和重复检测干扰判断,并提供品牌提及率、品牌推荐率、平台对比、提示词矩阵和待优化清单。/reports:GEO 报表历史兼容入口,指向同一页面。/settings:系统设置,维护单项目档案、AI 接口配置边界和事实来源说明;不包含团队管理、Provider Key 管理或复杂权限配置。/help:使用教程,整理快速开始、日常 SOP、AI 拓词、知识库维护、内容质检、富文本发布稿和操作边界。
完整前端使用说明见 docs/frontend/frontend-mvp-guide.md;日常教程和交接说明见 docs/help/user-guide.md。
pnpm lint
pnpm typecheck
pnpm build
pnpm format:check
pnpm test:web-framework
pnpm test:web-dashboard
pnpm test:web-geo-analysis
pnpm test:web-geo-prompts
pnpm test:web-expansion
pnpm test:web-knowledge
pnpm test:web-instructions
pnpm test:web-content
pnpm test:web-model-inclusion
pnpm test:web-reports
pnpm test:web-mvp
pnpm test:web-auth
pnpm test:web-help
pnpm test:auth
pnpm test:ai-provider
pnpm test:api
pnpm check:internal-mvp
pnpm check:deployment
pnpm check:self-use
pnpm test:geo-prompts
pnpm test:geo-expansion
pnpm test:geo-knowledge
pnpm test:geo-knowledge-files
pnpm test:geo-instructions
pnpm test:geo-content
pnpm test:model-inclusion
pnpm test:geo-reports
pnpm test:geo-analysis
pnpm test:prisma
pnpm smoke:apipnpm smoke:api 需要 API 服务已经启动;默认请求 http://localhost:3000,可通过 API_BASE_URL 覆盖。脚本会先登录默认管理员,登录账号可通过 SMOKE_AUTH_EMAIL / SMOKE_AUTH_PASSWORD 覆盖。
Prisma 命令:
pnpm prisma:validate
pnpm prisma:generate
pnpm prisma:migrate
pnpm prisma:migrate:deploy
pnpm prisma:seed
pnpm prisma:seed:base
pnpm prisma:seed:demo这些命令可以从项目根目录直接执行。apps/api/prisma.config.ts 会显式加载项目根目录 .env,不需要手动 export DATABASE_URL。pnpm prisma:migrate 仅用于开发迁移,生产发布使用 pnpm prisma:migrate:deploy。
pnpm prisma:seed 等同于 pnpm prisma:seed:base,会为默认管理员写入密码 hash,并创建默认公司、管理员 Membership 和基础产品线,不生成演示 GEO 数据。共享部署前请先修改私有环境变量中的 DEFAULT_ADMIN_PASSWORD,不要使用示例占位密码。生产环境基础 seed 仅建议首次初始化执行,且必须显式设置确认变量;已有真实数据后不要常规重跑 seed。演示 seed 需要 INCLUDE_DEMO_SEED=true pnpm prisma:seed:demo 显式执行。
本地开发使用 docker-compose.yml 中的 PostgreSQL。首次本地执行前可复制环境变量文件:
cp .env.example .env
docker compose up -d postgres
pnpm prisma:migrate
pnpm prisma:seed后端 MVP 冒烟测试:
# 终端 1
docker compose up -d postgres
pnpm dev:api
# 终端 2
pnpm smoke:api如果 API 不在默认端口:
API_BASE_URL=http://localhost:3001 pnpm smoke:api如果冒烟测试需要使用非默认管理员账号:
SMOKE_AUTH_EMAIL=admin@example.com SMOKE_AUTH_PASSWORD=replace_me pnpm smoke:api生产或局域网部署后的 smoke 验收需要覆盖登录、/api/auth/me、Dashboard、GEO 诊断、提示词策略库、AI 拓词、知识库、指令库、/geo-content 与 /content-tasks、AI 模型覆盖记录、/geo-reports 与 /reports、用户管理、系统设置、上传小文件和导出小样本。smoke 账号通过环境变量注入,不使用真实敏感数据,不输出 token 或密码。
前端 MVP 路由与后端断开态冒烟测试:
pnpm test:web-mvp该脚本会启动临时 Vite 服务,用无头 Chrome 检查主要路由标题,并将 API 地址指向不可用端口,确认后端未启动时页面不白屏。
也可以单独检查某个工作区:
pnpm --filter @geo-workstation/web build
pnpm --filter @geo-workstation/api build
pnpm --filter @geo-workstation/shared build部署前关键批次建议使用中文业务语义 tag,例如:
backup/UX-9C_全站轻量收口完成_20260517
backup/FIX-1_部署前P1修复完成_20260517
不要使用难以回溯业务含义的临时英文 tag,例如 backup/before-auth-xxx、backup/before-user-xxx。修复批次建议按风险分批提交,push 后再按需要创建备份 tag。
以下 Phase 记录仅作为历史归档,帮助理解能力来源;当前交付入口、部署步骤和权限边界以上文正式说明为准。
- 初始化 git 仓库,不创建远程仓库,不推送代码。
- 建立 pnpm workspace monorepo 骨架。
- 创建
apps/webVue 3 + Vite + TypeScript + Element Plus 最小前端。 - 创建
apps/apiNestJS + TypeScript 最小后端。 - 创建
packages/shared共享类型占位包。 - 创建 ESLint、Prettier、TypeScript 基础配置。
- 创建
.env.example,仅包含占位配置,不包含真实密钥。 - 将产品 spec 归位到
docs/specs/geo-marketing-platform-spec.md。 - 不连接数据库,不创建 Prisma 模型,不接入 DeepSeek,不实现业务 API 或业务页面。
- 创建 Prisma schema、迁移和 seed。
- 建立 GEO 业务数据表:
geo_analysis_tasks、geo_prompts、knowledge_bases、knowledge_chunks、instruction_templates、content_tasks、model_inclusion_records等。 - 添加 Prisma Client、
PrismaModule、PrismaService和基础模型验证。 - 继续保持所有命名优先表达 GEO 业务语义。
- 增加统一 API 响应封装,接口返回
{ code, message, data }。 - 增加全局异常过滤器和全局 DTO 校验管道。
- 增加后端配置管理,支持根目录
.env。 - 将
PrismaService接入配置管理。 - 升级 health 接口为 Phase 2A 基础设施检查。
- 增加 GEO 业务模块骨架:GEO 分析、提示词策略、AI 拓词、企业 GEO 知识库、指令库、GEO 内容、模型覆盖记录、GEO 报表。
- 不实现业务 CRUD、不接入真实 AI Provider、不新增前端业务页面。
- 实现提示词策略库后端 API:列表查询、新增、更新、软删除、批量导入、CSV 导出。
- 查询默认排除软删除数据,支持 GEO 提示词搜索、分页和业务筛选。
- 新增和更新
promptText时检查未软删除数据中的重复项。 - 批量导入按行校验,标记批次内重复、数据库重复和失败行,合法且不重复的数据才入库。
- 不实现前端页面、不做 AI 拓词、不接入 DeepSeek、不实现知识库或内容生成。
- 实现 AI 拓词后端 API:规则拓词、Mock AI 拓词、任务详情、勾选候选词保存到 GEO 提示词库。
- 规则拓词覆盖七类组合规则,并在候选词阶段标记批次内重复和数据库重复。
- Mock AI Provider 只作为流程占位,不接入真实 DeepSeek,不使用真实 API Key。
- 候选词不会直接入库,必须通过
save-candidates勾选保存,保存前继续按未软删除promptText去重。 - Mock AI 调用也写入
ai_call_logs,保留后续真实 Provider 替换空间。 - 不实现前端页面、不做知识库解析、不做内容生成、不做登录注册或权限守卫。
- 实现企业 GEO 知识库后端 API:知识库列表、创建、详情、更新、软删除。
- 实现粘贴文本导入
text-import,创建可编辑的 GEO 知识片段,文本导入不关联文件,fileId保持为空。 - 知识片段支持分页查询、标题/正文搜索、来源、产品线、资料类型和标签筛选。
- 知识片段支持编辑和软删除,知识库软删除会同步软删除关联文件和知识片段。
sourceType和materialType第一版先按字符串处理,后续可枚举化为 GEO 资料类型。- 不做真实文件上传、PDF/Word/Excel 解析、URL 抓取、RAG、向量数据库、前端页面、内容生成或真实 AI Provider。
- 实现企业 GEO 知识库文件 API:上传文件、文件列表、文件详情、重新解析、文件软删除。
- 文件上传使用
multipart/form-data的file字段,第一版支持.txt、.md、.csv,文件大小限制为 10MB。 - 本地文件存储路径为
LOCAL_STORAGE_ROOT/uploads/knowledge-bases/{knowledgeBaseId}/,默认落在.env.example的./storage下。 - 上传后创建
knowledge_files记录,并同步解析为knowledge_chunks;解析失败时保留文件记录,设置parseStatus = failed并写入errorMessage。 reparse成功时软删除旧片段并创建新片段;失败时更新文件解析状态和错误信息,不让接口崩溃。- 文件软删除会设置
knowledge_files.deletedAt,并同步软删除关联knowledge_chunks;第一版不物理删除本地文件。 - 不做 PDF/Word/Excel 解析、URL 抓取、整站采集、RAG、向量数据库、前端页面、内容生成或真实 AI Provider。
- 实现 GEO 指令库后端 API:指令模板列表、创建、详情、编辑、复制、软删除。
- 列表默认排除软删除数据,支持名称/正文/内容类型/指令类型搜索,以及指令类型、内容类型、目标提示词类型、目标模型、创建人筛选。
- 创建和编辑会按同一
instructionType + name检查未软删除模板重名。 - 复制指令会保留 GEO 内容生产方法字段,默认生成“原名称 副本”,名称冲突时自动追加序号。
contentType在 API 中可选;第一版省略时默认写入geo_content,以满足当前 Prisma 必填字段。- 不做前端页面、不做内容生成、不接入 DeepSeek 或真实 AI Provider。
- 实现 GEO 内容生成后端 API:内容任务列表、创建、详情、失败重试,以及内容项列表、编辑、软删除、Markdown 导出。
- 创建内容任务时校验 GEO 提示词、知识库和指令模板存在且未删除;任务状态从
running流转到succeeded或failed。 - 第一版使用
mock-content-v1同步生成内容,不接入真实 DeepSeek,不使用真实 API Key。 - 每个目标 GEO 提示词生成一个
content_item,生成结果包含标题、正文、GEO 优化点和建议发布位置。 retry只重新生成失败内容项,已成功内容项不会重复生成;每次生成或重试都会写入ai_call_logs。- Markdown 导出只返回 Markdown 文本,不做 Word 导出、不做复杂排版、不做自动发布。
- 不做前端页面、不接真实 AI Provider、不做权限守卫、登录注册、多租户或外部媒体发布。
- 实现模型覆盖与上词记录后端 API:手动新增、分页查询、批量导入、CSV 导出、未覆盖提示词查询和基础 summary。
- Phase Monitor-Record-1 将模型覆盖记录升级为多入口 GEO 命中记录字段:保留旧字段,同时新增
platform、entryPoint、detectionMethod、deviceType、isWebSearchEnabled、isLoggedIn、citedContentAsset、competitorMentioned、hitLevel、rawAnswer、citations、searchResults、screenshotPath和errorMessage,用于承接后续联网搜索 API、PC/移动网页和 App 人工抽查结果。 - Phase Monitor-Web-1 接入 Kimi Web Search API:选择少量 GEO 提示词后触发
$web_searchtool-call loop,自动规则判断品牌提及、品牌推荐、官网引用、内容资产引用和竞品出现,并写入model_inclusion_records的platform = Kimi、entryPoint = web_search_api、detectionMethod = web_search、deviceType = api、isWebSearchEnabled = true等字段。Monitor-Web-1.1 将 Kimi 默认超时调整为 120000ms,并对 timeout、fetch failed、连接重置等网络类失败做最多 1 次重试。 - Phase Monitor-Web-2 接入豆包 / 火山方舟联网搜索检测:通过火山方舟 Responses API +
tools: [{ type: "web_search" }]写入platform = 豆包 / 火山方舟的联网 API 检测结果。该结果不等同于豆包 App 端真实用户结果;当没有结构化 URL / citations 时,会保存web_search_call到searchResults作为联网证据。Monitor-Web-2.1 将火山默认输出上限设为 1200、默认超时设为 180000ms,并要求 300 字以内短回答,降低incomplete:length和长等待风险。 - Phase Monitor-Web-3 接入通义千问 / 阿里云百炼联网搜索检测:通过百炼 OpenAI-compatible Chat Completions 启用
enable_search与search_options.forced_search,写入platform = 通义千问 / 阿里云百炼的联网 API 检测结果。百炼第一版定位为回答型联网检测 Provider,不等同于通义千问 App 或网页端真实用户结果;当前不稳定返回结构化引用来源,官网引用主要从回答正文判断。 - 新增记录前校验 GEO 提示词存在且未软删除;查询记录时返回关联提示词的
promptText、类型、产品线和用户意图。 - 批量导入按行独立校验,支持通过
geoPromptId或promptText匹配提示词;导入成功行强制写入recordMethod = import,不自动创建新提示词。 - 未覆盖提示词查询基于
geo_prompts,默认只查询trackEnabled = true且未软删除的提示词。 - 新增记录和导入成功后会刷新
geoPrompt.latestCoverageStatus:recommended、mentioned、not_mentioned。 - summary 返回品牌提及率、推荐率、官网引用率、模型分布和产品线分布。
- 不做 OpenAI、Perplexity 或 Tavily 接入;不做 PC / 移动端自动采集、App 自动化、定时任务或自动发布。
- 实现 GEO 报表后端 API:GEO 总览、提示词覆盖、模型覆盖、内容覆盖、知识库覆盖、优化建议和 CSV 导出。
- GEO 总览聚合提示词资产、知识库资产、内容产出、模型覆盖记录、品牌提及/推荐率、官网引用率和失败内容任务。
- 提示词覆盖报表统计提示词类型、产品线、用户意图、最新覆盖状态和高优先级未覆盖提示词。
- 模型覆盖报表按模型统计品牌提及率、推荐率、官网引用率,并返回推荐提示词和未提及提示词。
- 内容覆盖报表统计内容任务、内容项、生成类型分布,以及高优先级无内容提示词。
- 知识库覆盖报表统计知识库、文件、片段、解析状态和缺知识库产品线。
- 优化建议第一版使用规则生成,不接入 AI,不做自动检测或前端图表。
- 不修改 Prisma schema,不做前端页面、不接真实 AI Provider、不做 Word/PDF 报告导出或复杂月报。
- 实现 GEO 分析任务后端 API:列表、创建、详情、编辑、Mock 执行、提示词建议转入提示词库、基于分析建议创建内容任务。
- 创建任务时保存品牌、官网、产品线、目标模型和基础训练词输入;由于当前 schema 没有
baseWords字段,第一版将其保存在summary.inputBaseWords。 - Mock GEO 分析不调用真实 AI、不访问真实网站,生成 summary、内容缺口、知识库缺口、提示词建议和
geo_model_results。 convert-prompts将promptSuggestions转入geo_prompts,使用source = geo_analysis:{taskId}作为轻量追溯标记,保存前按未软删除promptText去重。create-content-task复用 Phase 2G 的ContentTasksService和 Mock 内容生成逻辑,不重复实现内容生成。- 当前 schema 没有分析任务到内容任务的关系字段,详情接口第一版返回
relatedContentTasks: [],后续可在需要时补关系模型。 - 不修改 Prisma schema,不做真实 AI、外部检测、网页爬取、SEO 扫描、前端页面、定时任务或权限系统。
- 补充后端 API 交接文档:统一响应、错误结构、环境变量、启动方式和全部后端模块接口清单。
- 补充 GEO MVP 端到端联调流程文档,说明从分析任务到报表建议的业务路径。
- 新增
scripts/smoke-test-api.mjs,用 HTTP 请求跑通本地后端 MVP 主链路。
- 搭建 Vue Router 后台路由,
/默认跳转/dashboard。 - 搭建 Element Plus 后台布局、左侧 GEO 菜单、顶部环境标识和后端健康状态入口。
- 创建 GEO 工作台、GEO 分析、提示词策略库、AI 拓词、企业 GEO 知识库、指令库、GEO 内容生成、模型覆盖记录、GEO 报表、系统设置占位页。
- 接入 Pinia,用于保存前端环境标识和 API Base URL。
- 新增 fetch API client 基础封装,统一处理后端
{ code, message, data }响应结构。 - 新增空状态、加载状态、错误状态组件和 Phase 3A 前端骨架检查脚本。
- 不实现业务 CRUD 页面、不修改后端业务逻辑、不修改 Prisma schema、不接入真实 AI。
- 将
/dashboard从占位页升级为 GEO 工作台首页。 - 调用
GET /api/reports/geo-overview展示提示词资产、知识库资产、内容资产和模型覆盖效果。 - 调用
GET /api/reports/optimization-suggestions展示最多 8 条待优化建议。 - 增加手动刷新、加载中、错误、空状态处理;后端未启动时页面保持可访问。
- 增加快捷入口:GEO 分析、提示词导入、AI 拓词、知识库、指令库、内容生成、模型覆盖记录、GEO 报表。
- 展示真实入库能力、Mock 能力和未做能力边界。
- 不实现其他业务页面 CRUD、不新增图表库、不修改后端业务逻辑或 Prisma schema。
- 新增
pnpm smoke:api,默认请求http://localhost:3000,支持API_BASE_URL覆盖。 - 当前 Mock 能力:GEO 分析、AI 拓词、GEO 内容生成。
- 当前真实入库能力:登录、提示词、知识库、txt/md/csv 文件上传解析、指令库、内容任务和内容项、模型覆盖记录、报表统计。
- 不修改 Prisma schema,不新增业务模块、不做前端页面、不接真实 AI、不做外部检测、爬虫、定时任务、登录注册、权限守卫、多租户或外部媒体发布。
早期 Phase 3A 曾建议进入前端基础布局与后台框架;该目标已完成,当前后续工作以部署前 P1 修复、验收和运维文档为准。