PHP 站群系统(SEO / GEO 站群优化系统)开发文档
文档版本:v1.0 更新日期:2026-10-11 目标读者:开发人员、产品负责人、测试人员 技术栈:PHP + HTML + JS + Layui + MySQL + Nginx(宝塔面板部署) 开发辅助:WorkBuddyAI(腾讯 AI Agent 工作台,用于 AI 辅助编码与自动化开发流程)
目录
- 项目概述
- 需求分析与补充(PRD)
- 技术架构与总体设计
- 数据库设计
- 模块详细设计
- 接口设计(API)
- DeepSeek 大模型集成设计
- 宝塔部署与泛域名方案
- 搜索引擎推送设计
- 定时任务设计
- 安全设计
- 测试与验收
- 开发计划与里程碑
- 合规与风险提示
- 附录
1. 项目概述
1.1 项目背景
用户需要搭建一套 站群管理系统,用于批量创建、管理、发布独立子站页面,并通过传统 SEO(搜索引擎优化)与 GEO(生成式引擎优化,面向 AI 搜索引擎)手段获取自然流量与客户线索。
系统核心诉求是 全自动化:从关键词挖掘、内容生成、页面发布、泛域名绑定,到搜索引擎推送、定时任务执行,全流程无需人工干预。
1.2 项目目标
| 编号 | 目标 | 说明 |
| G1 | 全自动建站 | 输入描述词 + 引流配置,AI 自动生成独立页面并绑定泛域名子域 |
| G2 | 全自动优化 | AI 自动挖掘核心词 / 长尾词,自动生成内容并持续扩充 |
| G3 | 全自动推送 | 定时调用百度 / 必应 / Google/360 站长 API 推送新页面 |
| G4 | GEO 友好 | 页面按生成式引擎优化标准构建,提升被 AI 搜索引用概率 |
| G5 | 集中管控 | Layui 后台统一管理:管理员、页面、域名、关键词、任务、日志 |
1.3 核心能力一览
- 管理员登录与 RBAC 权限管理(超级管理员 / 普通管理员)
- 多域名管理,支持多个根域名及各自泛解析(
*.xxx.com / *.xxx.xxx.com)
- 页面管理:创建 / 修改 / 预览 / 发布 / 下线 / 删除,版本留痕
- AI 内容生成:接入 DeepSeek API,按描述词 + 关键词自动生成整页内容
- 引流配置:页面自动携带 QQ 客服号 / 微信客服二维码(悬浮客服组件)
- 泛域名自动绑定:生成随机字符子域,前台
{随机字符}.xxx.xxx.com 直接可访问
- 搜索引擎 API 推送:百度普通收录 / 快速收录、必应 Batch、Google Indexing、360
- 关键词与长尾词全自动体系:AI 挖掘 + 词库管理 + 定时扩充
- 定时任务中心:内容生成、推送、静态化、sitemap、日志清理等
- 数据统计:访问量、推送成功率、AI 调用成本、收录状态跟踪
1.4 术语表
| 术语 | 说明 |
| SEO | 搜索引擎优化(Search Engine Optimization),面向传统搜索引擎排名 |
| GEO | 生成式引擎优化(Generative Engine Optimization),面向 AI 搜索引擎(豆包、DeepSeek、ChatGPT、Perplexity、AI Overviews 等),目标是让内容被 AI 直接引用为答案来源 |
| 泛域名解析 | DNS 通配符解析,将 *.domain.com 的所有子域指向同一服务器 |
| 子域 / Subdomain | 泛解析下随机生成的独立子域名,如 a1b2c3.xxx.com |
| 长尾词 | 搜索量低、竞争小、转化意图明确的多词组合关键词 |
| 静态化 | 将动态页面输出为静态 HTML 文件,提升访问速度与抓取友好度 |
| 收录推送 | 通过站长平台官方 API 主动提交新 URL,加速搜索引擎收录 |
| 引流配置 | 页面内的客服转化元素:QQ 号、微信二维码、联系表单等 |
2. 需求分析与补充(PRD)
本章在用户原始需求基础上补充完整需求,作为开发验收基线。
2.1 用户角色与权限模型
| 角色 | 权限范围 |
| 超级管理员(role=1) | 全部功能:管理员管理、系统配置、域名管理、页面管理、关键词、推送、任务、日志、财务 / 成本查看 |
| 普通管理员(role=2) | 页面管理、关键词管理、数据统计;不可修改系统配置与管理员账号 |
补充说明:
- 登录使用账号密码 + 图形验证码,支持 "记住我"(7 天 Cookie)。
- 密码使用
password_hash()(bcrypt)存储,禁止明文。
- 所有后台操作写入操作日志(operation\_log)。
2.2 功能需求清单
F1 管理员管理模块
| 编号 | 功能 | 说明 |
| F1.1 | 管理员列表 | 分页、搜索(用户名 / 昵称 / 状态) |
| F1.2 | 新增管理员 | 用户名、昵称、密码、角色、状态 |
| F1.3 | 编辑管理员 | 修改资料、重置密码 |
| F1.4 | 禁用 / 启用 | 禁用后立即无法登录 |
| F1.5 | 删除管理员 | 不允许删除自身与最后一个超级管理员 |
| F1.6 | 登录日志 | 记录登录 IP、时间、结果 |
F2 域名管理模块(泛域名)
| 编号 | 功能 | 说明 |
| F2.1 | 域名列表 | 展示根域名、泛解析状态、SSL 状态、绑定页面数 |
| F2.2 | 新增域名 | 录入根域名(如 xxx.com),开启泛解析开关 |
| F2.3 | 泛解析引导 | 展示 DNS 配置指引(A 记录 * → 服务器 IP),并校验解析是否生效 |
| F2.4 | 搜索引擎配置 | 每个域名独立配置百度 token、必应 API Key、Google 凭证、360 token |
| F2.5 | 删除域名 | 仅允许在无绑定页面时删除 |
| F2.6 | 状态控制 | 启用 / 暂停该域名下所有页面的发布与推送 |
F3 页面管理模块
| 编号 | 功能 | 说明 |
| F3.1 | 页面列表 | 分页、按域名 / 状态 / 关键词 / 时间筛选;展示 URL、收录状态、访问量 |
| F3.2 | 创建页面 | 填写:标题、描述词(内容主题)、选择模板、引流配置(QQ 号 / 微信二维码)、关键词、GEO 开关;点击 "自动生成" |
| F3.3 | 修改页面 | 修改描述词后重新生成,保留历史版本(page\_revision) |
| F3.4 | 预览页面 | 后台 iframe 预览生成效果 |
| F3.5 | 发布 / 下线 | 发布后生成静态文件并写入推送队列;下线后 404 并停止推送 |
| F3.6 | 批量操作 | 批量发布、批量下线、批量删除 |
| F3.7 | 自动绑定泛域名 | 创建成功后自动生成随机字符子域(如 k8f2x9.xxx.com),无需人工配置 |
| F3.8 | 访问统计 | 每页面展示 PV/UV(基于 visit\_log 或 Redis 计数) |
F4 AI 内容生成模块(DeepSeek)
| 编号 | 功能 | 说明 |
| F4.1 | API 配置 | 后台配置 DeepSeek API Key、模型(默认 deepseek-chat)、Base URL、超时、并发数 |
| F4.2 | 单页生成 | 按描述词 + 标题 + 关键词 + 模板类型生成整页 HTML 内容 |
| F4.3 | 批量生成 | 对关键词池批量生成页面(定时任务驱动) |
| F4.4 | 内容校验 | 生成后自动检查:字数下限、敏感词、重复率;不合格自动重试或标记 |
| F4.5 | 成本统计 | 记录每次调用的 token 用量与预估费用,后台可视化 |
| F4.6 | 失败降级 | API 异常时进入重试队列,超过阈值停止并告警,不影响已发布页面 |
F5 前台访问模块
| 编号 | 功能 | 说明 |
| F5.1 | 泛域名访问 | {随机字符}.xxx.xxx.com 直接访问独立静态页面 |
| F5.2 | 模板渲染 | 多套行业模板(通用 / 科技 / 生活 / 教育等),响应式布局 |
| F5.3 | 引流组件 | 右下角悬浮客服:QQ 一键会话 / 微信二维码弹窗;页脚联系方式 |
| F5.4 | 静态化 | 发布时生成静态 HTML,Nginx 直接托管,降低服务器压力 |
| F5.5 | 404 页面 | 未绑定子域统一返回友好 404 |
| F5.6 | 内容结构 | 面包屑、H1/H2 层级、FAQ 区块、相关阅读(GEO 友好) |
F6 关键词与长尾词自动化模块
| 编号 | 功能 | 说明 |
| F6.1 | 词库管理 | 核心词、长尾词、地域词分类管理;去重;状态流转(待生成 / 已生成 / 已废弃) |
| F6.2 | 手工添加 | 后台手动添加关键词,可一键生成页面 |
| F6.3 | AI 挖掘 | 定时任务调用 DeepSeek,基于种子词批量生成长尾词(带搜索意图分类) |
| F6.4 | 自动建页 | 词库中 "待生成" 的长尾词自动进入生成队列,全自动产出页面 |
| F6.5 | 词 - 页绑定 | 一个词对应一个页面(一对一),避免重复内容 |
| F6.6 | 扩展策略 | 地域 + 核心词、疑问句式(怎么办 / 是什么 / 多少钱)、对比句式等模板化扩展 |
F7 搜索引擎推送模块
| 编号 | 功能 | 说明 |
| F7.1 | 推送配置 | 各引擎开关、每日配额、推送间隔 |
| F7.2 | 自动推送 | 新发布页面自动入队,定时任务批量推送 |
| F7.3 | 推送日志 | 记录每次推送的引擎、URL、HTTP 状态、返回内容、成功 / 失败 |
| F7.4 | 配额管理 | 按引擎每日配额控制推送量,超限自动暂停次日恢复 |
| F7.5 | 失败重试 | 网络类失败自动重试 3 次;业务类失败(如 over quota)停止并记录 |
| F7.6 | sitemap 生成 | 自动生成 / 更新 sitemap.xml 与各子域 URL 列表 |
F8 定时任务中心
| 编号 | 功能 | 说明 |
| F8.1 | 任务列表 | 查看所有内置任务的 cron 表达式、上次 / 下次执行时间、状态 |
| F8.2 | 任务开关 | 每个任务可独立启用 / 停用,可手动立即执行 |
| F8.3 | 任务日志 | 每次执行的开始 / 结束时间、结果摘要、错误信息 |
| F8.4 | 守护机制 | 任务互斥锁,防止重复执行;超时自动中断 |
F9 GEO 优化模块(补充需求)
| 编号 | 功能 | 说明 |
| F9.1 | 结构化数据 | 自动生成 schema.org JSON-LD(Article / FAQPage / Product / Organization) |
| F9.2 | FAQ 区块 | AI 基于页面主题自动生成 3-5 条高频问答,直接可被 AI 引擎引用 |
| F9.3 | 引用友好正文 | 首段直接回答问题(Q\&A 式开头),语义层级清晰,统计性、列表化内容占比提升 |
| F9.4 | 实体与权威信号 | 输出作者 / 机构 / 日期 / 引用来源等字段,增强可信度信号 |
| F9.5 | llms.txt | 自动生成 llms.txt,向 LLM 爬虫提供结构化站点说明与链接索引 |
| F9.6 | 爬虫策略 | robots.txt 默认允许 GPTBot / ClaudeBot / PerplexityBot / Bingbot 等(可配置) |
| F9.7 | 被引监测(可选) | 定时向 AI 引擎提问页面核心词,记录页面是否被引用(人工 / 半自动) |
F10 统计与日志
| 编号 | 功能 | 说明 |
| F10.1 | 总览看板 | 页面总数、已推送数、今日访问量、AI 调用成本、任务健康度 |
| F10.2 | 访问统计 | 按日 / 页面 / 来源统计 PV、UV |
| F10.3 | 推送统计 | 各引擎成功率、推送量趋势 |
| F10.4 | 操作日志 | 后台所有管理操作留痕 |
| F10.5 | AI 成本 | token 用量、费用估算、失败率 |
2.3 非功能需求
| 类别 | 要求 |
| 性能 | 静态页面首屏 < 1s;后台接口 < 500ms;单台服务器支撑 500+ 泛域名页面 |
| 并发 | 静态页面由 Nginx 直接服务,不经过 PHP 动态解析(泛域名页面除外) |
| 可用性 | 定时任务失败自动重试;AI 不可用时系统其余功能不受影响 |
| 安全 | 见 第 11 章 安全设计 |
| 可维护性 | MVC 分层,配置化模板,全部功能可在后台开关 |
| 扩展性 | 支持后续接入更多搜索引擎、更多 AI 模型(兼容 OpenAI 协议) |
| 兼容性 | PHP 7.4+(推荐 8.1/8.2),MySQL 5.7+/8.0,Chrome/Edge 浏览器 |
3. 技术架构与总体设计
3.1 技术选型
| 层次 | 选型 | 说明 |
| 后端语言 | PHP 7.0+ | 原生 PHP + 轻量自研 MVC 框架(不引入 Composer 重依赖,也可选 ThinkPHP 6) |
| 前端框架 | Layui 2.9.x | 后台管理界面(表格、表单、弹层、树形) |
| 前台渲染 | HTML5 + CSS3 + 原生 JS | 模板引擎输出静态 HTML,响应式 |
| 数据库 | MySQL 5.7 / 8.0 | utf8mb4 |
| 缓存(可选) | Redis | 任务锁、计数器、会话 |
| Web 服务器 | Nginx(宝塔) | 泛域名 server_name *.xxx.com,静态化页面直接托管 |
| 定时任务 | 宝塔计划任务 /crontab | 调用 CLI 脚本或 curl 触发任务入口 |
| AI 服务 | DeepSeek API | OpenAI 兼容协议,deepseek-chat 模型 |
| 推送服务 | 各站长平台官方 API | 百度 / 必应 / Google / 360 |
3.2 总体架构图
flowchart TB
subgraph 前台访问层
Browser[用户浏览器 / AI 爬虫<br/>GPTBot / ClaudeBot / PerplexityBot]
StaticHTML[静态 HTML 页面<br/>随机字符.xxx.com]
end
subgraph Web层[Nginx(宝塔)]
NG[泛域名 server_name *.xxx.com<br/>静态文件直出 / 动态接口转发]
end
subgraph 应用层[PHP 应用]
MVC[MVC 核心<br/>路由 / 控制器 / 模型 / 视图]
Admin[Layui 后台<br/>管理员 / 页面 / 域名 / 关键词 / 任务]
AI[AI 内容生成引擎<br/>DeepSeek Client]
Push[搜索引擎推送引擎<br/>百度 / 必应 / Google / 360]
Task[定时任务调度器<br/>互斥锁 + 队列]
Geo[GEO 引擎<br/>JSON-LD / FAQ / llms.txt / robots]
Static[静态化引擎<br/>模板渲染 → HTML 落盘]
end
subgraph 数据层
DB[(MySQL<br/>admin/domain/page/keyword/...)]
Redis[(Redis<br/>锁 / 计数 / 队列)]
FILES[(静态页面文件<br/>/www/wwwroot/site/html/)]
end
subgraph 外部服务
DS[DeepSeek API]
SE[站长平台<br/>百度/必应/Google/360]
DNS[DNS 服务商<br/>泛解析 *.xxx.com]
end
Browser --> NG
StaticHTML --> NG
NG --> MVC
Admin --> MVC
MVC --> AI --> DS
MVC --> Push --> SE
MVC --> Task
MVC --> Geo
MVC --> Static --> FILES
MVC --> DB
Task --> DB
Push --> DB
AI --> DB
MVC --> Redis
NG -.域名校验.-> DNS
3.3 核心流程图
流程一:全自动页面创建与发布
sequenceDiagram
participant A as 管理员/定时任务
participant B as 后台控制器
participant C as AI引擎(DeepSeek)
participant D as 数据库
participant E as 静态化引擎
participant F as Nginx/前台
A->>B: 提交描述词+关键词+引流配置
B->>B: 校验输入、生成随机子域字符
B->>D: 创建 page 记录(草稿) + 版本
B->>C: 调用 DeepSeek 生成内容
C-->>B: 返回 HTML 内容
B->>B: 内容校验(字数/敏感词/重复)
alt 校验通过
B->>D: 更新 page(内容+GEO元数据)
B->>E: 渲染模板 → 生成静态文件
E-->>B: 静态文件路径
B->>D: 状态置为"已发布" + 入推送队列
B-->>A: 返回页面URL(随机字符.xxx.com)
F-->>A: 前台直接访问
else 校验失败
B->>B: 重试生成(最多3次)
B->>D: 记录失败原因
B-->>A: 返回失败提示
end
流程二:搜索引擎自动推送
flowchart LR
P[页面发布] --> Q[写入推送队列<br/>push_queue]
Q --> C[定时任务触发<br/>每30分钟]
C --> S{引擎开关与配额检查}
S -->|百度| B[百度 API<br/>data.zz.baidu.com]
S -->|必应| Y[必应 Batch API]
S -->|Google| G[Google Indexing API]
S -->|360| Z[360 站长 API]
B --> L[写入 push_log]
Y --> L
G --> L
Z --> L
L --> R{结果}
R -->|成功| OK[更新页面收录状态]
R -->|失败| RT[按类型重试或终止]
流程三:关键词 / 长尾词全自动体系
flowchart TB
A[种子词库] --> B[定时任务: AI长尾词挖掘<br/>每日 01:00]
B --> C[去重/过滤入库<br/>keyword 状态=待生成]
C --> D[定时任务: 批量自动建页<br/>每 2 小时]
D --> E[AI 生成内容 → 发布页面]
E --> F[词状态=已生成<br/>绑定 page_id]
F --> G[进入推送队列]
3.4 项目目录结构(建议)
/www/wwwroot/zhanqun/ # 站点根目录(宝塔站点目录)
├── app/ # 应用层
│ ├── controllers/ # 控制器
│ │ ├── admin/ # 后台控制器
│ │ │ ├── LoginController.php
│ │ │ ├── AdminController.php
│ │ │ ├── DomainController.php
│ │ │ ├── PageController.php
│ │ │ ├── KeywordController.php
│ │ │ ├── PushController.php
│ │ │ ├── TaskController.php
│ │ │ ├── AiController.php
│ │ │ ├── SettingController.php
│ │ │ └── StatController.php
│ │ └── front/ # 前台控制器
│ │ ├── PageController.php # 泛域名页面渲染
│ │ └── IndexController.php # 根域名入口/404
│ ├── models/ # 数据模型
│ ├── services/ # 业务服务
│ │ ├── AiService.php # DeepSeek 调用
│ │ ├── PushService.php # 搜索引擎推送
│ │ ├── KeywordService.php # 长尾词挖掘
│ │ ├── StaticService.php # 静态化
│ │ ├── GeoService.php # GEO 元数据生成
│ │ └── TaskService.php # 定时任务
│ ├── lib/ # 基础库
│ │ ├── Db.php # PDO 封装
│ │ ├── Redis.php
│ │ ├── Request.php
│ │ ├── Response.php
│ │ ├── Auth.php # 登录认证
│ │ ├── Csrf.php
│ │ └── Helper.php
│ └── views/ # 视图
│ ├── admin/ # Layui 后台页面
│ └── front/ # 前台模板
├── public/ # Web 入口(宝塔运行目录指向此处)
│ ├── index.php # 前台入口(泛域名路由)
│ ├── admin.php # 后台入口
│ ├── static/ # 静态资源 css/js/images
│ └── robots.txt
├── storage/ # 运行时数据(不可直接访问)
│ ├── html/ # 生成的静态页面文件
│ ├── qrcode/ # 微信二维码素材
│ ├── logs/ # 运行日志
│ └── cache/
├── config/
│ ├── database.php # 数据库配置
│ ├── app.php # 应用配置
│ └── ai.php # DeepSeek 配置
├── cron/ # 定时任务 CLI 入口
│ ├── keyword.php # 长尾词挖掘
│ ├── build\_page.php # 批量自动建页
│ ├── push.php # 搜索引擎推送
│ ├── sitemap.php # sitemap 生成
│ └── cleanup.php # 日志清理
└── install/ # 安装向导
4. 数据库设计
4.1 ER 关系概览
erDiagram
ADMIN ||--o{ OPERATION_LOG : "操作"
DOMAIN ||--o{ PAGE : "拥有"
DOMAIN ||--o{ KEYWORD : "拥有"
PAGE ||--o{ PAGE_REVISION : "版本"
PAGE ||--o{ PUSH_LOG : "推送"
PAGE ||--o| KEYWORD : "绑定词"
PAGE ||--o{ VISIT_LOG : "访问"
KEYWORD ||--o{ AI_LOG : "生成记录"
4.2 数据表明细
所有表使用 utf8mb4 ,主键自增 bigint ,时间字段 datetime 。以下字段类型为建议值,可按需微调。
表 t\_admin 管理员
| 字段 | 类型 | 说明 |
| id | bigint PK | 主键 |
| username | varchar(50) unique | 登录名 |
| password | varchar(255) | password\_hash 加密 |
| nickname | varchar(50) | 昵称 |
| role | tinyint | 1 = 超级管理员 2 = 普通管理员 |
| status | tinyint | 1 = 启用 0 = 禁用 |
| email | varchar(100) | 邮箱 |
| phone | varchar(20) | 手机号 |
| last\_login\_ip | varchar(50) | 最近登录 IP |
| last\_login\_time | datetime | 最近登录时间 |
| created\_at / updated\_at | datetime | 创建 / 更新时间 |
表 t\_domain 域名配置
| 字段 | 类型 | 说明 |
| id | bigint PK | 主键 |
| domain | varchar(100) unique | 根域名,如 xxx.com |
| is\_wildcard | tinyint | 1 = 已开启泛解析 0 = 未开启 |
| wildcard\_prefix | varchar(20) | 随机子域字符集(默认 abcdefghijklmnopqrstuvwxyz0123456789) |
| sub\_len | tinyint | 随机子域长度(默认 6) |
| ssl\_status | tinyint | 0 = 未配置 1 = 已配置泛域名证书 |
| engines | json | 推送配置 JSON:{"baidu":{"token":"","enabled":1,"daily_quota":1000},"bing":{"apikey":"","enabled":1,"daily_quota":10000},"google":{"json":"","enabled":0,"daily_quota":200},"so360":{"token":"","enabled":0}} |
| status | tinyint | 1 = 启用 0 = 暂停 |
| remark | varchar(255) | 备注 |
| created\_at / updated\_at | datetime | 时间 |
表 t\_page 页面
| 字段 | 类型 | 说明 |
| id | bigint PK | 主键 |
| domain\_id | bigint | 所属域名(FK → t\_domain) |
| subdomain | varchar(30) unique | 随机子域字符(如 k8f2x9) |
| full\_domain | varchar(130) unique | 完整域名 k8f2x9.xxx.com |
| title | varchar(200) | 页面标题(H1/Title) |
| description | varchar(300) | 页面描述(meta description) |
| keywords | varchar(300) | 页面关键词(meta keywords) |
| description\_prompt | text | 创建时输入的描述词(内容主题) |
| content\_html | longtext | 生成的正文 HTML(不含模板外壳) |
| template\_id | bigint | 模板 ID(FK → t\_page\_template) |
| qq\_number | varchar(20) | 引流 QQ 号(可空) |
| wechat\_qr | varchar(255) | 微信二维码图片路径(可空) |
| status | tinyint | 1 = 草稿 2 = 已发布 3 = 已下线 |
| is\_static | tinyint | 1 = 已生成静态文件 |
| static\_path | varchar(255) | 静态文件相对路径 |
| geo\_enabled | tinyint | 1 = 启用 GEO 优化 |
| geo\_jsonld | text | 生成的 JSON-LD 结构化数据 |
| faq\_json | text | FAQ 区块数据 JSON |
| source | varchar(20) | 来源:manual /keyword/batch |
| keyword\_id | bigint | 绑定关键词 ID(可空) |
| publish\_time | datetime | 发布时间 |
| view\_count | bigint | 访问计数(PV) |
| index\_status | varchar(20) | 收录状态:pending/pushed/indexed/unknown |
| created\_at / updated\_at | datetime | 时间 |
表 t\_page\_template 页面模板
| 字段 | 类型 | 说明 |
| id | bigint PK | 主键 |
| name | varchar(50) | 模板名称 |
| industry | varchar(50) | 行业分类(通用 / 科技 / 生活 / 教育 / 本地服务) |
| html\_path | varchar(255) | 模板文件路径(app/views/front/xx.html) |
| layout\_config | json | 布局配置(配色、模块开关) |
| is\_default | tinyint | 是否默认模板 |
| status | tinyint | 1 = 启用 0 = 停用 |
表 t\_page\_revision 页面版本
| 字段 | 类型 | 说明 |
| id | bigint PK | 主键 |
| page\_id | bigint | 页面 ID |
| title / description / content\_html | ... | 版本快照 |
| admin\_id | bigint | 操作人 |
| created\_at | datetime | 版本时间 |
表 t\_keyword 关键词库
| 字段 | 类型 | 说明 |
| id | bigint PK | 主键 |
| domain\_id | bigint | 所属域名 |
| keyword | varchar(200) unique(domain\_id) | 关键词文本 |
| keyword\_type | tinyint | 1 = 核心词 2 = 长尾词 3 = 地域词 |
| intent | varchar(20) | 意图分类:info/buy/compare/nav |
| source | varchar(20) | manual / ai / template |
| status | tinyint | 1 = 待生成 2 = 已生成 3 = 已废弃 |
| page\_id | bigint | 绑定页面 ID(可空) |
| search\_volume | int | 搜索量(可空,估算) |
| difficulty | tinyint | 竞争度 1-100(可空) |
| created\_at / updated\_at | datetime | 时间 |
表 t\_push\_log 推送日志
| 字段 | 类型 | 说明 |
| id | bigint PK | 主键 |
| page\_id | bigint | 页面 ID |
| engine | varchar(20) | baidu / bing / google / so360 |
| url | varchar(200) | 推送 URL |
| http\_code | int | HTTP 状态码 |
| result | text | 返回原文(JSON) |
| success | tinyint | 1 = 成功 0 = 失败 |
| error\_msg | varchar(255) | 错误信息 |
| created\_at | datetime | 推送时间 |
表 t\_push\_queue 推送队列
| 字段 | 类型 | 说明 |
| id | bigint PK | 主键 |
| page\_id | bigint | 页面 ID |
| engine | varchar(20) | 目标引擎 |
| url | varchar(200) | URL |
| status | tinyint | 0 = 待推送 1 = 已推送 2 = 失败 3 = 跳过 |
| retry\_count | tinyint | 已重试次数 |
| next\_try\_time | datetime | 下次尝试时间 |
| created\_at / updated\_at | datetime | 时间 |
表 t\_cron\_task 定时任务
| 字段 | 类型 | 说明 |
| id | bigint PK | 主键 |
| task\_name | varchar(50) | 任务名 |
| task\_key | varchar(50) unique | 唯一标识(keyword/build/push/sitemap/cleanup) |
| cron\_expr | varchar(50) | cron 表达式(展示用) |
| enabled | tinyint | 1 = 启用 0 = 停用 |
| running | tinyint | 1 = 执行中(互斥锁) |
| last\_run\_at | datetime | 上次执行时间 |
| last\_result | varchar(255) | 上次结果摘要 |
| fail\_count | int | 连续失败次数 |
| remark | varchar(255) | 备注 |
表 t\_ai\_log AI 调用日志
| 字段 | 类型 | 说明 |
| id | bigint PK | 主键 |
| task\_type | varchar(20) | page\_gen / keyword / faq / geo |
| model | varchar(50) | 模型名 |
| prompt\_hash | char(32) | Prompt 内容哈希(去重) |
| input\_tokens | int | 输入 token |
| output\_tokens | int | 输出 token |
| cost | decimal(10,4) | 估算费用(元) |
| status | tinyint | 1 = 成功 0 = 失败 |
| error\_msg | varchar(255) | 错误信息 |
| created\_at | datetime | 时间 |
表 t\_visit\_log 访问日志
| 字段 | 类型 | 说明 |
| id | bigint PK | 主键 |
| page\_id | bigint | 页面 ID |
| ip | varchar(50) | 访客 IP |
| ua | varchar(255) | User-Agent |
| referer | varchar(255) | 来源 |
| visit\_time | datetime | 访问时间 |
表 t\_settings 系统配置
| 字段 | 类型 | 说明 |
| id | bigint PK | 主键 |
| group\_name | varchar(30) | 分组:ai/push/cron/system/geo |
| key | varchar(50) unique | 配置键 |
| value | text | 配置值 |
| remark | varchar(255) | 说明 |
| updated\_at | datetime | 更新时间 |
表 t\_operation\_log 操作日志
| 字段 | 类型 | 说明 |
| id | bigint PK | 主键 |
| admin\_id | bigint | 操作人 |
| action | varchar(50) | 动作(page\_create/page\_update/...) |
| detail | varchar(500) | 详情 |
| ip | varchar(50) | 操作 IP |
| created\_at | datetime | 时间 |
5. 模块详细设计
5.1 管理员认证与权限
- 登录页:Layui 表单 + 图形验证码(GD 库生成),失败 5 次锁定 10 分钟。
- 会话:
$_SESSION(或 Redis session),后台每个请求校验 Auth::check()。
- 权限:超级管理员全量;普通管理员在控制器入口做
role 判断(中间件式)。
- 安全:密码
password_hash()/password_verify();Cookie "记住我" 用随机 token 存 remember_token 字段。
5.2 域名与泛域名管理
- 新增域名 → 写入
t_domain → 后台展示 DNS 配置指引:
- A 记录:
* → 服务器 IP,TTL 600(示例:阿里云 / 腾讯云 DNSPod 均可)
- 若根域也需访问,另配 A 记录
@ → 服务器 IP
- 泛解析生效校验:
gethostbyname('test.' . $domain) 是否等于服务器 IP,或前端提示手动确认。
- 每个域名的搜索引擎配置独立存储于
t_domain.engines JSON。
- 域名暂停:
t_domain.status=0 时,前台该域名下所有子域返回 404,推送任务跳过。
5.3 页面管理
创建页面前端交互(Layui 弹层表单):
\[域名] 下拉选择(启用中的域名)
\[标题] 输入框(可留空由 AI 生成)
\[描述词] 文本域(必填,如"桂林旅游攻略")
\[关键词] 输入框(可多个,逗号分隔)
\[模板] 下拉选择(按行业)
\[引流QQ号] 输入框(可空)
\[微信二维码] 上传图片(可空)
\[GEO优化] 开关(默认开)
\[按钮] 立即生成
- 点击 "立即生成":
POST /admin/page/create → 生成随机子域 → 创建草稿 → 异步 / 同步调用 AI → 校验 → 发布。
- 修改:进入编辑页,修改描述词后 "重新生成",旧内容存
t_page_revision。
- 列表页:表格展示 + 操作列(预览 / 编辑 / 发布 / 下线 / 删除 / 推送记录)。
5.4 DeepSeek AI 内容生成引擎(AiService)
核心方法:
class AiService {
  /\*\*
  \* 生成整页内容
  \* @param string \$title 标题
  \* @param string \$prompt 描述词
  \* @param array \$keywords 关键词列表
  \* @param string \$templateType 模板类型
  \* @return array{html:string, faq:array, jsonld:string}
  \*/
  public function generatePage(\$title, \$prompt, \$keywords, \$templateType) { ... }
  /\*\* 挖掘长尾词 \*/
  public function generateKeywords(\$seedWords, \$count = 30) { ... }
  /\*\* 生成 FAQ \*/
  public function generateFaq(\$title, \$content, \$count = 4) { ... }
  /\*\* 生成 GEO 元数据(jsonld) \*/
  public function generateGeoMeta(\$page) { ... }
}
调用协议(DeepSeek,OpenAI 兼容):
POST https://api.deepseek.com/chat/completions
Authorization: Bearer {API\_KEY}
Content-Type: application/json
{
  "model": "deepseek-chat",
  "messages": \[
  {"role": "system", "content": "你是一名资深SEO内容编辑..."},
  {"role": "user", "content": "..."}
  ],
  "temperature": 0.8,
  "max\_tokens": 3000,
  "stream": false
}
限流与降级策略:
- 单次生成超时 60s,失败重试 2 次(指数退避:5s / 15s)。
- 并发控制:全局最大 2-3 个并发(防止触发 API 限流 429)。
- 连续失败 10 次 → 任务进入 "暂停" 状态并写入
t_ai_log,后台看板告警。
5.5 前台渲染与静态化(StaticService)
- 取模板 HTML 外壳(占位符:
{title} {content} {qq} {wechat} {jsonld} {faq} {footer}...)
- 填充生成内容 → 完整 HTML
- 写入
storage/html/{subdomain}/index.html
- 更新
t_page.is_static=1, static_path
- Nginx 静态托管优先:
try_files 命中静态文件直接返回,未命中走 PHP 路由渲染(兼容未静态化页面)。
- 根域名访问(如
xxx.com):展示站点导航页(可配置)或 404。
5.6 关键词 / 长尾词全自动体系(KeywordService)
- AI 挖掘 Prompt 模板(见 7.3),产出 JSON 数组:
["桂林旅游攻略", "桂林旅游攻略多少钱", "桂林两日游最佳路线", ...]
- 入库前去重(按
domain_id + keyword unique),过滤已有词。
- 自动建页任务(cron/build\_page.php):取
status=1 待生成 的词,逐条走 5.3 创建流程,成功后将词状态置 2 并绑定 page\_id。
- 模板化扩展:内置句式模板(疑问式 / 对比式 / 地域式 / 场景式),作为 AI 挖掘的种子补充。
5.7 搜索引擎推送(PushService)
推送引擎抽象:
interface PushEngine {
  public function push(string \$url): PushResult; // 单条
  public function pushBatch(array \$urls): array; // 批量
  public function name(): string;
}
- 百度:POST
http://data.zz.baidu.com/urls?site={域名}&token={token},body 为 URL 列表(每行一条),一次 ≤ 10 条。
- 必应:POST
https://ssl.bing.com/webmaster/api.svc/json/SubmitUrlbatch?apikey={key},body {"siteUrl":"https://xxx.com","urlList":["..."]},每日上限 10000。
- Google:POST
https://indexing.googleapis.com/v3/urlNotifications:publish(需 Service Account JWT 鉴权),每日上限 200。
- 360:POST
https://url.so.com/s/{token}(360 站长平台,可选)。
流程:发布 → 写 t_push_queue(按引擎各一条)→ 定时任务消费队列 → 写 t_push_log → 配额控制。
5.8 定时任务中心(TaskService)
- 统一入口:
cron/{key}.php,由宝塔计划任务按 cron 表达式调用(php /www/wwwroot/zhanqun/cron/push.php)。
- 互斥锁:Redis
SET NX EX 3600 或数据库锁表(t_cron_task.running + 时间戳),防止任务重叠。
- 执行后更新
t_cron_task 的 last_run_at / last_result / fail_count。
| 任务 key | 说明 | 建议 cron | 建议频率 |
| keyword | AI 长尾词挖掘 | 0 1 * * * | 每天 01:00 |
| build\_page | 批量自动建页 | 0 */2 * * * | 每 2 小时 |
| push | 搜索引擎推送 | */30 * * * * | 每 30 分钟 |
| sitemap | 生成 / 更新 sitemap.xml | 0 */6 * * * | 每 6 小时 |
| cleanup | 清理过期日志 / 临时文件 | 0 3 * * 1 | 每周一 03:00 |
| geo\_check | GEO 被引监测(可选) | 0 6 * * 1 | 每周一 06:00 |
5.9 GEO 优化模块(GeoService)
生成内容时同步产出:
- JSON-LD 结构化数据:
{
  "@context": "https://schema.org",
  "@type": "Article",
  "headline": "桂林旅游攻略:5天4夜行程安排",
  "description": "...",
  "datePublished": "2026-10-11",
  "keywords": \["桂林旅游", "桂林攻略"],
  "author": {"@type": "Organization", "name": "站点名称"},
  "mainEntityOfPage": {"@type": "WebPage", "@id": "https://xxx.xxx.com/"}
}
- FAQPage:AI 生成 3-5 条问答,前台折叠展示,JSON-LD 同步输出。
- 引用友好正文:首段直接回答核心问题(Q\&A 式开头);H2 语义化小标题;正文含列表、表格、数据等结构化表达。
- llms.txt:
storage/html/llms.txt 自动生成站点与页面索引。
- robots.txt:允许
GPTBot、ClaudeBot、PerplexityBot、Bingbot、Google-Extended(可配置开关)。
- 权威信号:页面输出作者 / 机构、发布时间、来源引用字段。
5.10 统计与日志
- 访问统计:静态页面内嵌 JS 上报
/api/visit?page_id=xx(异步,写 t_visit_log),或 Nginx access log 解析;PV 直接累加 t_page.view_count。
- 看板:
t_settings 存汇总缓存,定时任务刷新当日数据。
- AI 成本:
t_ai_log.cost 按 DeepSeek 单价估算(deepseek-chat 按官方刊例价,可在配置中填写单价)。
6. 接口设计(API)
统一前缀:后台 /admin/* (JSON 响应 {code:0,msg,data} ,code=0 成功);前台 /api/* 。所有写操作带 CSRF Token(header X-CSRF-Token )。
6.1 认证
| 方法 | 路径 | 说明 |
| POST | /admin/login | 登录(username/password/captcha) |
| POST | /admin/logout | 退出 |
| GET | /admin/captcha | 图形验证码 |
6.2 管理员
| 方法 | 路径 | 说明 |
| GET | /admin/admin/list | 管理员列表(分页 / 搜索) |
| POST | /admin/admin/add | 新增管理员 |
| POST | /admin/admin/edit | 编辑管理员 |
| POST | /admin/admin/delete | 删除管理员 |
| POST | /admin/admin/resetPwd | 重置密码 |
| GET | /admin/admin/loginLog | 登录日志 |
6.3 域名
| 方法 | 路径 | 说明 |
| GET | /admin/domain/list | 域名列表 |
| POST | /admin/domain/add | 新增域名 |
| POST | /admin/domain/edit | 编辑域名(含 engines 配置) |
| POST | /admin/domain/delete | 删除域名 |
| POST | /admin/domain/checkDns | 校验泛解析是否生效 |
6.4 页面
| 方法 | 路径 | 说明 |
| GET | /admin/page/list | 页面列表 |
| GET | /admin/page/detail | 页面详情 |
| POST | /admin/page/create | 创建页面(AI 生成) |
| POST | /admin/page/update | 修改页面 |
| POST | /admin/page/regenerate | 重新 AI 生成 |
| POST | /admin/page/publish | 发布(静态化 + 入推送队列) |
| POST | /admin/page/offline | 下线 |
| POST | /admin/page/delete | 删除 |
| POST | /admin/page/batch | 批量操作 |
| GET | /admin/page/preview | 预览 HTML |
| GET | /admin/page/revisions | 版本列表 |
| GET | /admin/page/pushLog | 推送记录 |
6.5 关键词
| 方法 | 路径 | 说明 |
| GET | /admin/keyword/list | 词库列表 |
| POST | /admin/keyword/add | 手工添加 |
| POST | /admin/keyword/delete | 删除 |
| POST | /admin/keyword/aiMine | 手动触发 AI 挖掘 |
| POST | /admin/keyword/buildPage | 指定词一键生成页面 |
6.6 AI 与系统
| 方法 | 路径 | 说明 |
| GET | /admin/ai/log | AI 调用日志 / 成本 |
| GET | /admin/task/list | 任务列表 |
| POST | /admin/task/toggle | 启用 / 停用任务 |
| POST | /admin/task/run | 手动立即执行 |
| GET | /admin/stat/overview | 总览看板 |
| GET | /admin/stat/visit | 访问统计 |
| GET | /admin/stat/push | 推送统计 |
| POST | /admin/setting/save | 保存系统配置(含 DeepSeek Key) |
| GET | /admin/setting/get | 读取配置(敏感字段脱敏) |
6.7 前台
| 方法 | 路径 | 说明 |
| GET | /{subdomain}/index.html | 静态页面(Nginx 直出) |
| GET | /api/visit | 访问上报 |
| GET | /api/page/check | 页面可用性探测(供监测用) |
7. DeepSeek 大模型集成设计
7.1 配置项(t\_settings /config/ai.php)
| 配置键 | 说明 | 默认值 |
| api\_key | DeepSeek API Key(后台配置,加密存储) | 空 |
| base\_url | API Base URL | https://api.deepseek.com |
| model | 模型 | deepseek-chat |
| temperature | 温度 | 0.8 |
| max\_tokens | 单次最大输出 | 3000 |
| timeout | 请求超时(秒) | 60 |
| max\_concurrency | 最大并发 | 3 |
| retry\_times | 失败重试次数 | 2 |
| price\_input / price\_output | 单价(元 / 千 token) | 按官方刊例价填写 |
7.2 模型选择建议
- 默认
deepseek-chat(V3 系列):性价比高,适合长文生成、长尾词挖掘。
- 若需深度推理(如复杂 GEO 结构化策略),可选
deepseek-reasoner,成本更高,默认不启用。
7.3 Prompt 模板(示例)
页面内容生成 System Prompt
你是一名资深的SEO内容编辑与信息架构师。请根据用户提供的主题撰写一篇
原创、专业、对读者有用的中文文章。要求:
1\. 首段直接回答用户最关心的问题,100字以内。
2\. 使用 H2/H3 语义化小标题组织内容,至少4个部分。
3\. 适当使用列表、表格、数据增强结构化表达。
4\. 自然融入以下关键词:{keywords},禁止堆砌。
5\. 输出格式:Markdown(标题用#),正文1500-2500字。
页面内容生成 User Prompt
主题描述:{description\_prompt}
页面标题:{title}
核心关键词:{keywords}
目标读者:搜索这些词的普通用户
请生成文章正文内容。
长尾词挖掘 Prompt
请围绕以下种子词,从用户真实搜索意图出发(信息查询、价格咨询、
攻略方案、对比选择、本地服务等),生成 {count} 个长尾关键词。
要求:自然口语化、符合中文搜索习惯、避免重复。
只输出 JSON 数组,格式:\["词1","词2",...]
种子词:{seed\_words}
FAQ 生成 Prompt
根据以下文章内容,提炼 {count} 条用户最可能追问的高频问题,
并给出简洁、直接、可被引用的答案。只输出 JSON,格式:
\[{"q":"问题","a":"答案"}]
文章标题:{title}
文章内容:{content 前 2000 字}
7.4 内容校验与降级
生成后校验规则(AiService::validate):
| 校验项 | 规则 |
| 字数 | 正文 ≥ 800 字(可配置),不足则重试 |
| 敏感词 | 内置敏感词库,命中则重新生成(最多 3 次) |
| 重复率 | 与同域名已有页面正文相似度 < 80%(simhash 快速比对) |
| 结构 | 必须含至少 2 个 H2 标题 |
| JSON 解析 | FAQ / 长尾词输出必须可解析为合法 JSON |
8. 宝塔部署与泛域名方案
8.1 环境准备(宝塔面板)
| 软件 | 版本 | 说明 |
| Nginx | 1.22+ | Web 服务器 |
| PHP | 8.1 / 8.2 | 需启用扩展:pdo\_mysql、curl、mbstring、gd、openssl、fileinfo |
| MySQL | 5.7 / 8.0 | utf8mb4 |
| Redis(可选) | 6.x/7.x | 锁、会话、计数器 |
| 宝塔 | 最新稳定版 | 面板管理 |
8.2 站点创建
- 宝塔 → 网站 → 添加站点:域名填写
xxx.com 与 *.xxx.com(泛域名),根目录 /www/wwwroot/zhanqun,运行目录选择 public。
- PHP 版本选择 8.1+,纯静态与 PHP 同时开启。
- 伪静态规则(Nginx):
\# 后台
location /admin {
  try\_files \$uri \$uri/ /admin.php?\$query\_string;
}
\# 前台动态回退(静态文件不存在时)
location / {
  try\_files \$uri \$uri/ /index.php?\$query\_string;
}
8.3 DNS 泛解析配置
在域名服务商(阿里云 / 腾讯云 DNSPod/Cloudflare 等)添加记录:
| 主机记录 | 记录类型 | 记录值 | TTL |
* | A | 服务器公网 IP | 600 |
@ | A | 服务器公网 IP(如需根域访问) | 600 |
注意: *. xxx.com 的泛解析会覆盖所有子域,无需为每个页面单独添加 DNS 记录。多级泛域名( *. xxx.xxx.com )同理,只需在对应域下添加 * A 记录。
8.4 Nginx 泛域名站点配置(宝塔自动生成,可参考)
server {
  listen 80;
  server\_name xxx.com \*.xxx.com;
  root /www/wwwroot/zhanqun/public;
  index index.php index.html;
  \# 静态文件直出
  location \~\* \\.(html|css|js|png|jpg|jpeg|gif|ico|svg|webp|woff2?)\$ {
  expires 7d;
  add\_header Cache-Control "public";
  }
  location / {
  try\_files \$uri \$uri/ /index.php?\$query\_string;
  }
  location \~ \\.php\$ {
  fastcgi\_pass unix:/tmp/php-cgi-82.sock;
  fastcgi\_index index.php;
  include fastcgi.conf;
  }
}
8.5 SSL 泛域名证书
- 泛域名证书(通配符证书)支持
*.xxx.com,宝塔 → 站点 → SSL → Let's Encrypt → 选择 "泛域名" 申请(需 DNS 验证)。
- 泛域名证书必须通过 DNS 验证方式签发(Let's Encrypt 不支持 HTTP 验证签发通配符证书)。
- 申请后开启 "强制 HTTPS",HTTP 301 跳转 HTTPS。
8.6 安装向导
- 首次访问
install/index.php:检查环境 → 填写数据库 / 管理员 / DeepSeek Key → 写入配置文件 → 导入 install/schema.sql → 完成。
- 安装完成后自动锁定(删除 install 目录或写入锁文件)。
8.7 宝塔计划任务(crontab 示例)
\# 每30分钟推送一次
\*/30 \* \* \* \* php /www/wwwroot/zhanqun/cron/push.php >> /www/wwwroot/zhanqun/storage/logs/push.log 2>&1
\# 每天1点挖掘长尾词
0 1 \* \* \* php /www/wwwroot/zhanqun/cron/keyword.php >> /www/wwwroot/zhanqun/storage/logs/keyword.log 2>&1
\# 每2小时批量建页
0 \*/2 \* \* \* php /www/wwwroot/zhanqun/cron/build\_page.php >> /www/wwwroot/zhanqun/storage/logs/build.log 2>&1
\# 每6小时更新sitemap
0 \*/6 \* \* \* php /www/wwwroot/zhanqun/cron/sitemap.php >> /www/wwwroot/zhanqun/storage/logs/sitemap.log 2>&1
也可在宝塔面板 → 计划任务 → 添加 Shell 脚本任务,按上述命令配置。
9. 搜索引擎推送设计
9.1 各引擎接入要点
| 引擎 | 接入方式 | 频率 / 配额 | 失败特征 |
| 百度普通收录 | POST http://data.zz.baidu.com/urls?site={域名}&token={token},body 每行一个 URL,单次 ≤ 10 条 | 每日有限额(以账号配额为准) | over quota(超配额)、not existed(token 错) |
| 百度快速收录 | POST https://ziyuan.baidu.com/linksubmit/index(需付费 / 资质) | 可选 | — |
| 必应 Batch | POST https://ssl.bing.com/webmaster/api.svc/json/SubmitUrlbatch?apikey={key} | 每日 10000 | HTTP 401(Key 无效) |
| Google Indexing | POST https://indexing.googleapis.com/v3/urlNotifications:publish,Service Account JWT | 每日 200 | 403(权限不足) |
| 360 | POST https://url.so.com/s/{token} | 每日 500(以平台为准) | 非 200 |
9.2 推送策略
- 入队:页面发布成功 → 写入
t_push_queue(每个启用引擎一条)。
- 消费:定时任务每 30 分钟取
status=0 且 next_try_time <= now 的记录,按引擎分批推送。
- 配额控制:
t_settings 记录每个引擎当日已推数量,超配额置 status=3 跳过,次日 0 点重置。
- 重试:网络错误(curl 超时 / 连接失败)重试 3 次,指数退避 10/30/60 分钟;业务错误(quota / 鉴权)直接终止并告警。
- 结果回写:成功 →
t_push_log + 更新 t_page.index_status='pushed';失败 → 记录原因。
- 去重:URL 已在
t_push_log 中推送过且成功,跳过。
10. 定时任务设计
10.1 任务清单与调度
| 任务 key | 入口脚本 | 说明 | cron |
| keyword | cron/keyword.php | AI 长尾词挖掘(种子词 → 长尾词库) | 0 1 * * * |
| build\_page | cron/build\_page.php | 消费 "待生成" 关键词 → 自动建页发布 | 0 */2 * * * |
| push | cron/push.php | 消费推送队列 → 各引擎推送 | */30 * * * * |
| sitemap | cron/sitemap.php | 生成 sitemap.xml/llms.txt | 0 */6 * * * |
| cleanup | cron/cleanup.php | 清理 30 天前日志、临时文件 | 0 3 * * 1 |
| geo\_check | cron/geo\_check.php | GEO 被引监测(可选) | 0 6 * * 1 |
10.2 调度器实现要点
- 互斥锁:任务开头
Redis::set($key.'_lock', 1, ['NX','EX'=>3600]),获取失败直接退出(防止上一轮未结束)。
- 超时保护:
set_time_limit(0) + 每处理 N 条检查内存 / 时间。
- 结果记录:成功条数、失败条数、耗时写入
t_cron_task.last_result。
- 连续失败告警:
fail_count >= 10 → 写 t_ai_log/ 发送后台站内信或邮件(可选)。
- 手动执行:后台 "立即执行" 通过
proc_open 或任务队列异步触发,避免阻塞请求。
10.3 全自动链路串联
关键词任务(每天) → 词库扩充 → 自动建页(每2h) → AI生成+发布
→ 静态化 → 推送队列 → 推送任务(每30min) → 各引擎
→ 结果回写 → sitemap(每6h) → 收录状态更新 → 统计看板
11. 安全设计
| 类别 | 措施 |
| 登录安全 | 图形验证码、失败锁定、password_hash、登录 IP 记录 |
| 会话安全 | Session 固定防护(登录后 session\_regenerate\_id)、"记住我" 随机 token |
| CSRF | 所有后台写请求校验 CSRF Token(Layui 表单携带 _token) |
| SQL 注入 | 全部 PDO 预处理语句,禁止字符串拼接 SQL |
| XSS | 后台输出转义(htmlspecialchars);AI 生成内容入库前过滤 <script> 等危险标签 |
| 文件上传 | 二维码仅允许 jpg/png/webp,MIME + 扩展名双校验,重命名存储,禁止执行目录 |
| 权限 | 控制器入口角色校验;敏感接口(设置 / 管理员)仅超级管理员 |
| 密钥存储 | DeepSeek Key、推送 token 加密存储(AES-256-CBC,密钥放 config 且不进仓库) |
| 限流 | 登录接口、AI 生成接口按 IP / 账号限流 |
| 泛域名安全 | 前台路由校验 subdomain 仅允许白名单字符 [a-z0-9],防路径穿越 |
| 日志脱敏 | 日志中不记录完整 token/Key,仅显示后 4 位 |
12. 测试与验收
12.1 功能测试清单(关键项)
| 编号 | 用例 | 预期结果 |
| T1 | 新增域名并校验泛解析 | DNS 指引正确,校验接口返回解析状态 |
| T2 | 创建页面(AI 生成) | 生成随机子域,内容合格,状态 = 已发布 |
| T3 | 访问 {子域}.xxx.com | 直接打开静态页面,引流组件正常 |
| T4 | 修改描述词重新生成 | 生成新版本,历史版本可查 |
| T5 | 下线页面 | 前台 404,不再进入推送队列 |
| T6 | AI 长尾词挖掘 | 产出合法 JSON 词数组,去重入库 |
| T7 | 自动建页任务 | 待生成词全部产出页面并绑定 |
| T8 | 百度 / 必应推送 | 队列消费,push\_log 成功记录 |
| T9 | 配额超限 | 自动跳过,次日恢复 |
| T10 | 后台权限 | 普通管理员无法访问系统配置 |
| T11 | GEO 输出 | 页面含 JSON-LD、FAQ、robots 放行 AI 爬虫 |
| T12 | 定时任务互斥 | 同时触发两次不重复执行 |
12.2 性能测试
- 静态页面并发:
ab -n 10000 -c 200,P95 响应 < 200ms(Nginx 直出)。
- 数据库:page 表 10 万级分页查询 < 1s(加
domain_id+status 联合索引)。
12.3 验收标准
- 登录后台 → 配置 DeepSeek Key 与域名 → 一键创建页面并发布成功。
- 前台泛域名可访问,页面含引流组件与 GEO 结构化数据。
- 定时任务按计划运行,推送日志有成功记录。
- 全程(创建→发布→推送)无人工干预即可完成。
- 安全测试(注入 / 上传 / XSS 基础用例)通过。
13. 开发计划与里程碑
| 里程碑 | 周期 | 交付内容 |
| M1 基础框架 | 第 1 周 | 项目骨架、数据库、登录认证、Layui 后台布局、权限 |
| M2 域名 + 页面管理 | 第 2 周 | 域名管理、页面 CRUD、模板系统、预览 |
| M3 AI 生成 + 前台渲染 | 第 3 周 | DeepSeek 集成、内容校验、静态化、泛域名前台访问 |
| M4 自动化体系 | 第 4 周 | 关键词 / 长尾词、自动建页、推送引擎、定时任务中心 |
| M5 GEO + 统计 + 安全 | 第 5 周 | GEO 模块、访问 / 成本统计、安全加固、告警 |
| M6 测试部署 | 第 6 周 | 宝塔部署、泛域名证书、全链路测试、文档完善、上线 |
建议使用 WorkBuddyAI 辅助开发:将本文档各章节作为需求输入,按模块(数据库→模型→服务→控制器→视图)逐步生成代码,人工评审后合入主干。
14. 合规与风险提示
14.1 搜索引擎规范风险(重要)
- 站群 / 大量低质量页面可能被搜索引擎判定为 垃圾内容(Thin Content)或内容农场,导致整站降权、子域被收录淘汰。
- 应对:坚持内容原创性与有用性,AI 生成内容必须经校验与人工抽检;控制单日建页量;避免纯搬运与关键词堆砌。
- 推送 API 是各站长平台官方正规渠道,须遵守配额与《服务条款》;超配额会被限流,勿暴力刷量。
14.2 GEO 行业自律
- 2026 年多家 GEO 企业联合发起《生成式引擎优化(GEO)行业自律公约》,公开抵制 "语料轰炸"" 关键词堆砌 ""一键分发虚假测评 / 科普 / 权威内容"。
- 本系统的 GEO 功能定位为内容质量优化(结构化、语义层级、FAQ、权威信号),不应被用于操纵 AI 引擎输出虚假信息。
14.3 备案与法律要求
- 使用国内服务器(宝塔部署)必须完成 ICP 备案,泛域名子域均归属于已备案根域名,须确保备案信息与实际站点一致。
- 页面内容不得涉及违法信息(赌博、色情、诈骗、侵权等);引流到 QQ / 微信从事营销须符合平台规则与《广告法》,不得虚假宣传。
14.4 泛域名滥用风险
- 泛解析开放后,任何随机子域都会解析到服务器,需确保未绑定子域返回 404,避免被用于恶意用途。
- 建议限制单域名每日建页上限,并对子域字符做白名单校验。
14.5 成本与配额风险
- AI 生成有 token 成本,建议设置每日生成上限与预算告警。
- 搜索引擎推送有每日配额,避免一次性推送过多导致账号风控。
15. 附录
15.1 依赖与资源清单
15.2 配置文件示例
config/ai.php:
return \[
  'api\_key' => getenv('DEEPSEEK\_API\_KEY') ?: '', // 后台可覆盖
  'base\_url' => 'https://api.deepseek.com',
  'model' => 'deepseek-chat',
  'temperature' => 0.8,
  'max\_tokens' => 3000,
  'timeout' => 60,
  'max\_concurrency' => 3,
  'retry\_times' => 2,
  'price\_input' => 0.002, // 元/千token,按官方刊例价填写
  'price\_output' => 0.008,
];
config/database.php:
return \[
  'host' => '127.0.0.1',
  'port' => 3306,
  'dbname' => 'zhanqun',
  'username' => 'zhanqun\_user',
  'password' => '\*\*\*\*\*\*',
  'charset' => 'utf8mb4',
];
15.3 使用 WorkBuddyAI 辅助开发的建议工作流
- 将本开发文档(或拆分后的章节)作为需求材料提供给 WorkBuddy,明确要求输出 PHP 代码。
- 按模块顺序生成:数据库建表 SQL → 模型 → 服务类(Ai/Push/Keyword/Static/Geo)→ 控制器 → Layui 视图。
- 每完成一个模块,在本机(宝塔环境)验证后再进入下一模块。
- 使用 WorkBuddy 的 Skills / 自定义模型能力,将 "页面生成 Prompt 模板" 等沉淀为可复用指令。
- 代码评审关注:SQL 注入、密钥泄露、权限校验、目录权限(storage 不可 Web 访问)。
15.4 后续扩展方向(非本期范围)
- 接入更多 AI 模型(OpenAI、Kimi、通义等,兼容协议统一封装)。
- 多服务器 / 负载均衡部署(静态文件 CDN 分发)。
- 数据看板升级(ECharts 图表:推送趋势、词库分布、成本曲线)。
文档结束。开发过程中如需求变更,请更新本文档并同步版本号。