feat: v2.6.0 - API安全优化和文档整合

## 核心优化
- 移除详情页自动调用博查API的逻辑,改为按需加载
- 添加基于IP的频率限制(每小时3次)
- 实现验证码防护机制(超过阈值后要求验证)
- 新增频率限制工具类 utils/rate_limiter.py

## 成本控制
- API调用减少约90%+(只在用户点击时调用)
- 防止恶意滥用和攻击
- 可配置的频率限制和验证码策略

## 文档整合
- 创建 docs/ 目录结构
- 归档历史版本文档到 docs/archive/
- 移动部署文档到 docs/deployment/
- 添加文档索引 docs/README.md

## 技术变更
- 新增依赖: Flask-Limiter==3.5.0
- 修改: app.py (移除自动调用,新增API端点)
- 修改: templates/detail_new.html (按需加载UI)
- 新增: utils/rate_limiter.py (频率限制和验证码)
- 新增: docs/archive/DEVELOP_v2.6.0_API_SECURITY.md

## 部署说明
1. pip install Flask-Limiter==3.5.0
2. 重启应用
3. 无需数据库迁移

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Jowe
2026-02-06 15:54:13 +08:00
parent c1a06ad684
commit 939717fa57
27 changed files with 1670 additions and 140 deletions

View File

@@ -0,0 +1,132 @@
# 📦 1Panel部署打包清单
部署前请确保以下文件都已准备好:
## ✅ 必需文件
### 应用文件
- [x] app.py - 主应用文件
- [x] wsgi.py - WSGI入口生产环境
- [x] config.py - 配置文件
- [x] models.py - 数据模型
- [x] init_db.py - 数据库初始化脚本
- [x] requirements.txt - Python依赖列表
### 配置文件
- [x] gunicorn_config.py - Gunicorn配置
- [x] .env.example - 环境变量模板
- [ ] .env - 生产环境变量(需在服务器上创建)
### 部署脚本
- [x] deploy.sh - 一键部署脚本
- [x] manage.sh - 应用管理脚本
### 文档
- [x] DEPLOYMENT.md - 完整部署文档
- [x] QUICK_DEPLOY.md - 快速部署指南
- [x] README.md - 项目说明
### 目录结构
```
zjpb/
├── static/ # 静态文件
│ ├── css/
│ ├── js/
│ └── uploads/ # 上传文件目录
├── templates/ # 模板文件
│ ├── admin/
│ └── *.html
├── utils/ # 工具类
│ ├── website_fetcher.py
│ ├── tag_generator.py
│ └── bookmark_parser.py
├── migrations/ # 数据库迁移脚本
├── logs/ # 日志目录(自动创建)
└── venv/ # 虚拟环境(服务器上创建)
```
## 🚫 排除文件(不要上传到服务器)
- `__pycache__/` - Python缓存
- `*.pyc` - 编译的Python文件
- `.git/` - Git仓库
- `.env` - 本地环境变量
- `venv/` `env/` - 虚拟环境
- `test_*.py` - 测试文件
- `*.log` - 日志文件
- `logs/` - 日志目录
- `static/uploads/*` - 上传的文件
## 📋 部署前检查清单
### 本地准备
- [ ] 更新 requirements.txt
- [ ] 测试应用运行正常
- [ ] 准备 .env.example 模板
- [ ] 压缩项目文件
### 服务器准备
- [ ] 1Panel已安装
- [ ] MySQL数据库已创建
- [ ] 域名已解析(可选)
- [ ] SSH访问权限
### 部署步骤
- [ ] 上传项目文件到服务器
- [ ] 解压并设置目录权限
- [ ] 执行 deploy.sh 脚本
- [ ] 配置 .env 文件
- [ ] 初始化数据库
- [ ] 在1Panel中创建网站反向代理
- [ ] 启动应用
- [ ] 配置SSL证书可选
### 部署后验证
- [ ] 前台页面访问正常
- [ ] 后台登录成功
- [ ] 修改默认管理员密码
- [ ] 测试网站添加功能
- [ ] 测试标签创建功能
- [ ] 测试图片上传功能
## 🔐 安全检查
- [ ] 修改默认管理员密码
- [ ] 设置强密码的 SECRET_KEY
- [ ] 配置 .env 权限chmod 600
- [ ] 启用 SSL/HTTPS
- [ ] 配置防火墙规则
- [ ] 定期备份数据库
## 📝 压缩命令
Windows PowerShell:
```powershell
Compress-Archive -Path * -DestinationPath zjpb.zip -Force
```
Linux/Mac:
```bash
zip -r zjpb.zip . -x "*.pyc" "*__pycache__*" "*.git*" ".env" "venv/*" "test_*.py" "logs/*"
```
## 🎯 快速部署(服务器上)
```bash
# 1. 上传并解压
cd /www/wwwroot/zjpb
unzip zjpb.zip
# 2. 一键部署
chmod +x deploy.sh
./deploy.sh
# 3. 配置环境变量
nano .env
# 4. 启动应用
chmod +x manage.sh
./manage.sh start
```
详细步骤请参考:`DEPLOYMENT.md`

View File

@@ -0,0 +1,255 @@
# ZJPB v2.3.0 部署清单
**当前状态**: ✅ 代码已提交到本地Git等待推送
---
## 📋 本地准备完成
**代码修改**
- models.py - Site模型添加news_keywords字段
- app.py - 后台表单、API路由、搜索逻辑
- utils/news_searcher.py - 严格匹配搜索
- templates/detail_new.html - 刷新按钮和UI
**新增文件**
- migrate_news_keywords.py - 数据库迁移脚本
- DEPLOY_v2.3.0.md - 完整部署文档
- DEPLOY_v2.3_QUICK.md - 快速部署指南
**本地测试**
- ✅ 数据库迁移成功4个网站已设置默认关键词
- ✅ Flask服务运行正常
- ✅ 后台管理可访问
**Git提交**
- Commit: `fdde699` - feat: v2.3.0 - 新闻获取准确性优化
- Tag: `v2.3.0` - Release v2.3.0: 新闻获取准确性优化
---
## 🚀 下一步操作(需要你执行)
### 第1步推送代码到远程仓库
```bash
# 在本地项目目录执行
cd D:\315mac\Code\zjpb
# 推送代码需要输入Git认证
git push origin master
# 推送标签
git push origin v2.3.0
```
### 第2步SSH登录服务器部署
```bash
# SSH登录服务器
ssh root@your-server
# 进入项目目录
cd /opt/1panel/apps/zjpb
# 停止应用
./manage.sh stop
# 拉取最新代码
git pull origin master
# 查看当前版本应该看到fdde699
git log --oneline -3
# 激活虚拟环境
source venv/bin/activate
# 运行数据库迁移
python migrate_news_keywords.py
# 重启应用
./manage.sh restart
# 检查状态
./manage.sh status
# 查看日志
./manage.sh logs
```
### 第3步验证部署
#### 后台验证
```
1. 访问http://zjpb.net/admin/login
2. 进入:网站管理
3. 编辑任意网站
4. 检查:是否有"新闻关键词"字段
```
#### 前台验证
```
1. 访问任意网站详情页
2. 滚动到"相关新闻"模块
3. 检查:是否有"获取最新资讯"按钮
4. 点击测试刷新功能
```
---
## 📊 部署变更摘要
### 数据库变更
```sql
ALTER TABLE sites
ADD COLUMN news_keywords VARCHAR(200)
COMMENT '新闻获取关键词(用于精准匹配相关新闻)'
AFTER features;
```
**影响**
- 新增1个字段
- 约200字节/网站
- 无性能影响
### 代码变更
| 文件 | 行数变化 | 说明 |
|------|---------|------|
| models.py | +2 | 添加news_keywords字段定义 |
| app.py | +81 | 后台配置+新API路由 |
| utils/news_searcher.py | +16 | 支持关键词参数 |
| templates/detail_new.html | +125 | 刷新按钮+CSS+JS |
| migrate_news_keywords.py | +114 | 新建迁移脚本 |
**总计**7个文件+1009行-8行
### API变更
**新增**
- `POST /api/refresh-site-news/<site_code>` - 前台刷新新闻
**修改**
- `search_site_news()` - 新增news_keywords参数
---
## ⚠️ 重要提示
### 1. 备份数据库
部署前务必备份:
```bash
mysqldump -h localhost -u ai_nav -p ai_nav > backup_v2.3_$(date +%Y%m%d).sql
```
### 2. BOCHA_API_KEY配置
确认服务器`.env`文件包含:
```bash
BOCHA_API_KEY=sk-76d0236a50d445ae92e75b634ed5313c
BOCHA_BASE_URL=https://api.bocha.cn
```
### 3. 迁移脚本幂等性
迁移脚本可以重复执行,会自动跳过已存在的字段。
---
## 🔍 常见问题
### Q1: Git拉取后没有新文件
```bash
# 检查当前commit
git log --oneline -1
# 应该显示fdde699 feat: v2.3.0 - 新闻获取准确性优化
# 如果不是,强制拉取
git fetch origin
git reset --hard origin/master
```
### Q2: 迁移脚本找不到?
```bash
# 确认文件存在
ls -la migrate_news_keywords.py
# 如果不存在检查git状态
git status
# 拉取特定文件
git checkout origin/master -- migrate_news_keywords.py
```
### Q3: 后台表单没有新字段?
```bash
# 重启应用清除缓存
./manage.sh restart
# 检查代码是否更新
grep -n "news_keywords" app.py
# 应该看到1007: 'news_keywords': '新闻关键词',
```
---
## 📈 性能监控
部署后建议监控:
1. **应用启动时间**应在2-3秒内
2. **数据库查询性能**:无明显变化
3. **新闻刷新响应时间**1-3秒取决于博查API
4. **错误日志**关注news相关错误
```bash
# 监控日志
tail -f logs/gunicorn_error.log | grep -i "news\|error"
```
---
## ✅ 部署完成检查清单
**代码部署**
- [ ] Git push成功
- [ ] 服务器Git pull成功
- [ ] 当前commit是fdde699
**数据库迁移**
- [ ] migrate_news_keywords.py执行成功
- [ ] sites表有news_keywords字段
- [ ] 现有网站已设置默认关键词
**应用运行**
- [ ] manage.sh status显示运行中
- [ ] 无错误日志
- [ ] 前后台访问正常
**功能验证**
- [ ] 后台可编辑新闻关键词
- [ ] 前台显示刷新按钮
- [ ] 刷新功能正常工作
---
## 📞 技术支持
如遇问题:
1. **查看日志**`./manage.sh logs`
2. **检查文档**`DEPLOY_v2.3.0.md`(完整版)
3. **快速参考**`DEPLOY_v2.3_QUICK.md`(精简版)
---
**清单版本**: v1.0
**创建时间**: 2025-12-31
**预计部署时间**: 5-10分钟

View File

@@ -0,0 +1,457 @@
# ZJPB v2.2.0 Git Patch 部署指南
## 版本信息
- **版本号**: v2.2.0
- **发布日期**: 2025-12-30
- **主要功能**: 博查新闻搜索集成
---
## 新功能概述
### 1. 博查Web Search API集成
- 自动获取网站相关新闻
- 支持手动和批量获取
- 新闻来源展示(网站名称+图标)
### 2. 智能新闻更新机制
- **每日首次访问触发更新**用户访问网站详情页时如果今天还没有更新过新闻自动获取最新3条
- **历史新闻保留**:如果没有访问,保留历史新闻不会被删除
- **一周内新闻**:只获取最近一周的相关新闻
- **自动去重**根据URL防止重复新闻
### 3. 数据库扩展
- News表新增字段
- `source_name`: 新闻来源网站名称
- `source_icon`: 新闻来源网站图标URL
### 4. 用户界面优化
- 网站详情页新增"相关新闻"模块
- 新闻展示包括:标题、摘要、来源、发布时间、阅读链接
- "相似推荐"移至右侧边栏,界面更加清晰
### 5. 管理功能
- 后台新闻管理界面优化
- 支持批量获取所有网站的新闻
- 定期任务脚本 `fetch_news_cron.py`
---
## 部署前准备
### 1. 环境要求
- Python 3.8+
- MySQL 5.7+
- Git已配置
- 虚拟环境已创建
### 2. 配置检查
**必需配置**(生产服务器.env文件
```bash
# 博查 Web Search API配置必需
BOCHA_API_KEY=your_api_key_here
BOCHA_BASE_URL=https://api.bocha.cn
```
如果没有配置BOCHA_API_KEY
- 新闻功能不会运行
- 不会影响其他功能
- 详情页会正常显示,只是没有新闻模块
### 3. 备份数据库
在1Panel中备份数据库
```bash
# 或者使用命令行
mysqldump -h 112.124.42.38 -u ai_nav -p ai_nav > backup_before_v2.2_$(date +%Y%m%d).sql
```
---
## 部署步骤
### 方法一Git Patch部署推荐
#### 1. 上传文件到服务器
需要上传2个文件到 `/opt/1panel/apps/zjpb/`
- `v2.2.0.patch` (56KB)
- `git_patch_deploy_v2.2.sh`
**使用1Panel文件管理器**或**SCP命令**
```bash
scp v2.2.0.patch root@your-server:/opt/1panel/apps/zjpb/
scp git_patch_deploy_v2.2.sh root@your-server:/opt/1panel/apps/zjpb/
```
#### 2. 执行部署脚本
SSH登录服务器或使用1Panel终端
```bash
cd /opt/1panel/apps/zjpb
# 赋予执行权限
chmod +x git_patch_deploy_v2.2.sh
# 执行部署
./git_patch_deploy_v2.2.sh
```
#### 3. 脚本自动完成的操作
```
1. 停止应用
2. 检查Git状态
3. 备份未提交的修改(如有)
4. 应用v2.2.0补丁
- 添加NewsSearcher工具类
- 更新app.py新闻路由+智能更新)
- 更新models.pyNews字段扩展
- 更新config.py博查API配置
- 更新detail_new.html新闻展示UI
- 添加数据库迁移脚本
- 添加测试脚本和定期任务脚本
5. 提交到Git
6. 激活虚拟环境
7. 安装依赖
8. 运行数据库迁移添加source_name和source_icon字段
9. 重启应用
10. 检查状态
```
---
## 部署后验证
### 1. 前台验证
**访问网站详情页**
```
http://your-domain.com/site/xxxxxxxx
```
检查项:
- [ ] 页面正常加载
- [ ] 如果配置了BOCHA_API_KEY首次访问会自动获取新闻
- [ ] "相关新闻"模块显示在左侧主栏
- [ ] "相似推荐"显示在右侧边栏
- [ ] 新闻显示来源名称和图标
- [ ] 点击新闻标题可以跳转到原文
### 2. 后台验证
**登录后台管理**
```
http://your-domain.com/admin/login
```
检查项:
- [ ] 进入"新闻管理" `/admin/newsadmin/`
- [ ] 列表显示包含source_name和source_icon
- [ ] 可以搜索和过滤新闻
- [ ] 编辑新闻时可以看到新字段
### 3. 数据库验证
```sql
-- 检查news表结构
DESCRIBE news;
-- 应该看到新字段
-- source_name VARCHAR(100)
-- source_icon VARCHAR(500)
-- 检查现有新闻数据
SELECT id, title, source_name, source_icon
FROM news
ORDER BY created_at DESC
LIMIT 5;
```
### 4. API测试可选
如果配置了BOCHA_API_KEY可以测试API
```bash
# 在服务器上
cd /opt/1panel/apps/zjpb
source venv/bin/activate
# 运行测试脚本
python test_news_feature.py
```
### 5. 日志检查
```bash
# 查看应用日志
./manage.sh logs
# 或者查看Gunicorn日志
tail -f logs/gunicorn_error.log
```
---
## 配置博查API重要
### 1. 获取API Key
如果还没有博查API Key
1. 访问 https://api.bocha.cn
2. 注册并获取API Key
3. 充值建议至少10元用于测试
### 2. 配置.env文件
编辑生产服务器的.env文件
```bash
nano /opt/1panel/apps/zjpb/.env
```
添加或更新:
```bash
# 博查 Web Search API配置
BOCHA_API_KEY=sk-your-actual-api-key-here
BOCHA_BASE_URL=https://api.bocha.cn
```
### 3. 重启应用
```bash
cd /opt/1panel/apps/zjpb
./manage.sh restart
```
---
## 定期任务配置(可选)
如果想定期批量更新所有网站的新闻可以配置cron任务
### 1. 编辑crontab
```bash
crontab -e
```
### 2. 添加定时任务
```bash
# 每天凌晨2点更新前10个网站的新闻每个网站获取3条
0 2 * * * cd /opt/1panel/apps/zjpb && source venv/bin/activate && python fetch_news_cron.py --limit 10 --count 3 >> logs/cron_news.log 2>&1
```
### 3. 查看定期任务日志
```bash
tail -f /opt/1panel/apps/zjpb/logs/cron_news.log
```
---
## 常见问题排查
### 1. 新闻不显示
**检查项**
- BOCHA_API_KEY是否配置正确
- API Key是否有余额
- 网站是否有相关新闻?
- 查看应用日志是否有错误
**测试命令**
```bash
cd /opt/1panel/apps/zjpb
source venv/bin/activate
python test_news_feature.py
```
### 2. 数据库迁移失败
**症状**source_name或source_icon字段不存在
**解决方案**
```bash
cd /opt/1panel/apps/zjpb
source venv/bin/activate
python migrate_news_fields.py
```
### 3. 页面报错
**检查**
```bash
# 查看错误日志
./manage.sh logs
# 检查进程状态
./manage.sh status
# 重启应用
./manage.sh restart
```
### 4. 补丁应用失败
**症状**`git apply --check` 失败
**原因**:可能有未提交的本地修改冲突
**解决方案**
```bash
# 查看冲突文件
git status
# 备份本地修改
git stash
# 重新应用补丁
git apply v2.2.0.patch
# 如需恢复本地修改
git stash pop
```
---
## 回滚方案
如果部署后发现问题,可以快速回滚:
### 1. 回滚代码
```bash
cd /opt/1panel/apps/zjpb
./manage.sh stop
# 回滚到上一个提交v2.1.0
git reset --hard HEAD~2
# 如果有stash备份恢复它
git stash list
git stash pop
./manage.sh start
```
### 2. 回滚数据库(如需要)
```bash
# 删除新添加的字段
mysql -h 112.124.42.38 -u ai_nav -p ai_nav
ALTER TABLE news DROP COLUMN source_name;
ALTER TABLE news DROP COLUMN source_icon;
```
---
## 性能说明
### 1. 智能更新策略
- **触发条件**:用户首次访问网站详情页 + 今天还没更新过新闻
- **更新频率**:每个网站每天最多更新一次
- **查询数量**每次获取3条新闻
- **时间范围**:最近一周内的新闻
- **API调用**:只有满足更新条件时才会调用
### 2. 对用户体验的影响
- **首次加载**如果触发新闻更新页面加载时间增加1-3秒
- **后续访问**:使用缓存的新闻,无额外延迟
- **错误处理**API调用失败不影响页面正常显示
- **异步加载**:后续可优化为异步加载新闻模块
### 3. 成本估算
- 假设每天100个网站被访问每个网站触发一次新闻更新
- 每次查询约0.01元参考博查API定价
- 每天成本约1元每月约30元
---
## 版本对比
| 功能 | v2.1.0 | v2.2.0 |
|------|--------|--------|
| Prompt管理 | ✅ | ✅ |
| 标签生成 | ✅ | ✅ |
| 功能生成 | ✅ | ✅ |
| 详细介绍生成 | ✅ | ✅ |
| 新闻搜索 | ❌ | ✅ |
| 新闻展示 | ❌ | ✅ |
| 智能更新 | ❌ | ✅ |
| 新闻来源信息 | ❌ | ✅ |
| 定期任务 | ❌ | ✅ |
---
## 后续优化建议
1. **新闻模块异步加载**使用AJAX加载新闻不阻塞页面
2. **缓存优化**使用Redis缓存新闻数据
3. **全文搜索**:支持在新闻内容中搜索关键词
4. **RSS订阅**为网站新闻生成RSS feed
5. **新闻分类**:根据新闻类型自动分类
6. **新闻推荐**:基于用户行为推荐相关新闻
---
## 完整部署命令(一键复制)
```bash
# SSH登录服务器后执行
cd /opt/1panel/apps/zjpb
# 检查上传的文件
ls -lh v2.2.0.patch git_patch_deploy_v2.2.sh
# 赋予执行权限
chmod +x git_patch_deploy_v2.2.sh
# 执行部署
./git_patch_deploy_v2.2.sh
# 配置API Key如果还没配置
nano .env
# 添加BOCHA_API_KEY=your-key-here
# 重启应用(如果修改了.env
./manage.sh restart
# 验证部署
./manage.sh status
git log --oneline -3
```
---
## 技术支持
如有问题,请检查:
1. 应用日志:`./manage.sh logs`
2. 数据库连接:检查.env中的DB_配置
3. API配置检查BOCHA_API_KEY是否正确
4. 网络连接:确认服务器可以访问 api.bocha.cn
---
## 更新日志
### v2.2.0 (2025-12-30)
- 新增博查Web Search API集成
- 新增智能新闻更新机制
- News模型扩展source_name, source_icon
- 新增网站详情页新闻模块
- 新增定期任务脚本和测试工具
- 优化详情页布局(新闻左侧,推荐右侧)
---
**部署文档版本**: v1.0
**最后更新**: 2025-12-30
**维护者**: ZJPB开发团队

View File

@@ -0,0 +1,298 @@
# v2.2.0 部署检查清单
## 部署前准备
### 1. 本地文件准备
- [x] v2.2.0.patch (56KB) - 已生成
- [x] git_patch_deploy_v2.2.sh - 已创建
- [x] DEPLOY_v2.2.0.md - 完整部署文档
- [x] migrate_news_fields.py - 数据库迁移脚本
### 2. 备份(重要!)
- [ ] 生产数据库已备份
```bash
# 在1Panel中备份或执行
mysqldump -h 112.124.42.38 -u ai_nav -p ai_nav > backup_v2.2_$(date +%Y%m%d).sql
```
- [ ] 代码已备份Git会自动保存
### 3. 环境检查
- [ ] 服务器可以访问 api.bocha.cn
- [ ] Python 3.8+ 已安装
- [ ] 虚拟环境已创建
- [ ] Git已配置
---
## 部署步骤
### 步骤1上传文件
上传以下2个文件到 `/opt/1panel/apps/zjpb/`
- [ ] v2.2.0.patch
- [ ] git_patch_deploy_v2.2.sh
**使用1Panel文件管理器**或**SCP命令**
```bash
scp v2.2.0.patch root@your-server:/opt/1panel/apps/zjpb/
scp git_patch_deploy_v2.2.sh root@your-server:/opt/1panel/apps/zjpb/
```
### 步骤2执行部署
```bash
cd /opt/1panel/apps/zjpb
chmod +x git_patch_deploy_v2.2.sh
./git_patch_deploy_v2.2.sh
```
### 步骤3配置API Key
编辑.env文件添加博查API配置
```bash
nano /opt/1panel/apps/zjpb/.env
```
添加:
```bash
BOCHA_API_KEY=sk-76d0236a50d445ae92e75b634ed5313c
BOCHA_BASE_URL=https://api.bocha.cn
```
### 步骤4重启应用
```bash
cd /opt/1panel/apps/zjpb
./manage.sh restart
```
---
## 部署验证
### 前台验证
- [ ] 访问首页正常
- [ ] 访问网站详情页正常
- [ ] "相关新闻"模块显示(首次访问会触发获取)
- [ ] 新闻可以点击查看原文
- [ ] "相似推荐"在右侧边栏显示
### 后台验证
- [ ] 登录后台成功 `/admin/login`
- [ ] 进入"新闻管理" `/admin/newsadmin/`
- [ ] 可以看到新闻列表(如果已有新闻)
- [ ] 新闻列表显示source_name和source_icon
### 数据库验证
```sql
-- 检查news表新字段
DESCRIBE news;
-- 应该看到:
-- source_name VARCHAR(100)
-- source_icon VARCHAR(500)
```
### 功能测试
- [ ] 访问一个网站详情页,检查是否自动获取新闻
- [ ] 刷新页面,新闻应该不会重复获取(使用缓存)
- [ ] 第二天首次访问,应该会更新新闻
---
## 部署后检查
### 日志检查
```bash
cd /opt/1panel/apps/zjpb
./manage.sh logs
```
检查是否有错误信息:
- [ ] 没有Python异常
- [ ] 没有数据库错误
- [ ] 没有API调用错误
### Git状态
```bash
git log --oneline -3
```
应该看到v2.2.0的提交:
- [ ] release: v2.2.0 相关的提交记录
### 应用状态
```bash
./manage.sh status
```
- [ ] zjpb 正在运行
- [ ] 进程PID正常
---
## 问题排查
### 1. 新闻不显示
**可能原因**
- BOCHA_API_KEY未配置或配置错误
- API余额不足
- 网站没有相关新闻
**排查步骤**
```bash
# 测试API配置
cd /opt/1panel/apps/zjpb
source venv/bin/activate
python test_news_feature.py
# 检查环境变量
cat .env | grep BOCHA
# 查看日志
./manage.sh logs | grep -i "news\|bocha"
```
### 2. 数据库迁移失败
**症状**:字段不存在错误
**解决方案**
```bash
cd /opt/1panel/apps/zjpb
source venv/bin/activate
python migrate_news_fields.py
```
### 3. 补丁应用失败
**症状**git apply报错
**解决方案**
```bash
# 查看冲突
git status
# 备份修改
git stash
# 重新应用
git apply v2.2.0.patch
```
---
## 回滚方案(如需要)
### 快速回滚
```bash
cd /opt/1panel/apps/zjpb
./manage.sh stop
# 回滚到v2.1.0
git reset --hard HEAD~2
# 重启
./manage.sh start
```
### 恢复数据库(可选)
```bash
mysql -h 112.124.42.38 -u ai_nav -p ai_nav < backup_v2.2_YYYYMMDD.sql
```
---
## 完成标记
部署完成后,确认以下所有项:
- [ ] 补丁应用成功
- [ ] 数据库迁移成功
- [ ] 应用启动正常
- [ ] 前台功能正常
- [ ] 后台功能正常
- [ ] 新闻功能测试通过
- [ ] 日志无错误
- [ ] Git提交记录正确
---
## 一键部署命令(完整版)
```bash
# ============================================
# v2.2.0 完整部署命令
# ============================================
# 1. 进入项目目录
cd /opt/1panel/apps/zjpb
# 2. 检查上传的文件
ls -lh v2.2.0.patch git_patch_deploy_v2.2.sh
# 3. 执行部署
chmod +x git_patch_deploy_v2.2.sh
./git_patch_deploy_v2.2.sh
# 4. 配置API Key如果.env中还没有
nano .env
# 添加以下两行:
# BOCHA_API_KEY=sk-76d0236a50d445ae92e75b634ed5313c
# BOCHA_BASE_URL=https://api.bocha.cn
# 5. 重启应用
./manage.sh restart
# 6. 验证部署
./manage.sh status
git log --oneline -3
# 7. 查看日志(可选)
./manage.sh logs
echo "部署完成!请访问网站测试功能"
```
---
## 预期结果
执行部署脚本后,应该看到类似输出:
```
================================
ZJPB v2.2 Git Patch 部署
================================
当前目录: /opt/1panel/apps/zjpb
1. 停止应用...
2. 检查Git状态...
3. 备份当前修改(如有)...
4. 应用v2.2.0补丁...
>>> 补丁应用成功
5. 提交更改到Git...
6. 激活虚拟环境...
7. 检查依赖...
8. 运行数据库迁移...
正在创建 source_name 和 source_icon 字段...
>>> 数据库迁移成功
9. 重启应用...
10. 检查应用状态...
zjpb 正在运行 (PID: xxxx)
================================
>>> 部署完成!
================================
Git提交历史
xxxxxxx release: v2.2.0 - 博查新闻搜索功能
```
---
## 时间估算
- 上传文件1-2分钟
- 执行部署3-5分钟
- 配置验证2-3分钟
- **总计**约10分钟
---
**检查清单版本**: v1.0
**创建日期**: 2025-12-30
**适用版本**: ZJPB v2.2.0

View File

@@ -0,0 +1,201 @@
# ZJPB v2.2.0 部署操作指南
## 版本信息
- **版本**: v2.2.0
- **发布日期**: 2025-12-30
- **补丁大小**: 56KB
- **部署时间**: 约10分钟
---
## 核心功能
### 博查新闻搜索集成
✅ 自动获取网站相关新闻博查Web Search API
✅ 智能更新:每日首次访问触发更新
✅ 每个网站获取3条一周内新闻
✅ 新闻来源展示(名称+图标)
✅ 自动去重防止重复
### 数据库扩展
✅ News表新增 `source_name` 字段
✅ News表新增 `source_icon` 字段
### 界面优化
✅ 新闻模块在左侧主栏
✅ 相似推荐在右侧边栏
---
## 快速部署3步
### 第1步上传文件到服务器
上传以下2个文件到 `/opt/1panel/apps/zjpb/`
```
v2.2.0.patch
git_patch_deploy_v2.2.sh
```
### 第2步执行部署脚本
```bash
cd /opt/1panel/apps/zjpb
chmod +x git_patch_deploy_v2.2.sh
./git_patch_deploy_v2.2.sh
```
### 第3步配置API Key
编辑 `.env` 文件,添加:
```bash
BOCHA_API_KEY=sk-76d0236a50d445ae92e75b634ed5313c
BOCHA_BASE_URL=https://api.bocha.cn
```
然后重启:
```bash
./manage.sh restart
```
---
## 验证部署
### ✓ 前台测试
1. 访问任意网站详情页
2. 检查"相关新闻"模块是否显示
3. 新闻应该显示来源网站名称和图标
4. 点击新闻标题可跳转到原文
### ✓ 后台测试
1. 登录 `/admin/login`
2. 进入"新闻管理" `/admin/newsadmin/`
3. 查看新闻列表是否正常显示
### ✓ 功能测试
```bash
cd /opt/1panel/apps/zjpb
source venv/bin/activate
python test_news_feature.py
```
---
## 关键文件
### 本地准备好的文件
```
D:\315mac\Code\zjpb\
├── v2.2.0.patch (56KB) 补丁文件
├── git_patch_deploy_v2.2.sh 部署脚本
├── DEPLOY_v2.2.0.md 完整部署文档
├── DEPLOY_v2.2_CHECKLIST.md 检查清单
├── migrate_news_fields.py 数据库迁移脚本
├── test_news_feature.py 测试脚本
└── fetch_news_cron.py 定期任务脚本
```
### 服务器需要的文件只需2个
```
v2.2.0.patch
git_patch_deploy_v2.2.sh
```
---
## Git提交历史
v2.2.0包含以下3个提交
```
2e9f634 docs: 添加v2.2.0部署文档和脚本
495248b feat: v2.2.0 智能新闻更新和布局优化
d7d21e1 release: v2.2.0 - 博查新闻搜索功能
```
---
## 部署脚本自动完成的操作
```
1. 停止应用
2. 检查Git状态
3. 备份未提交的修改
4. 应用v2.2.0补丁
- utils/news_searcher.py (新增)
- app.py (更新)
- models.py (更新)
- config.py (更新)
- templates/detail_new.html (更新)
- migrate_news_fields.py (新增)
- test_news_feature.py (新增)
- fetch_news_cron.py (新增)
- NEWS_FEATURE_v2.2.md (新增)
5. 提交到Git
6. 激活虚拟环境
7. 安装依赖
8. 运行数据库迁移
9. 重启应用
10. 检查状态
```
---
## 回滚方案(如需要)
```bash
cd /opt/1panel/apps/zjpb
./manage.sh stop
git reset --hard HEAD~3 # 回滚到v2.1.0
./manage.sh start
```
---
## 常见问题
### Q1: 新闻不显示?
**A**: 检查 `.env``BOCHA_API_KEY` 是否配置正确
### Q2: 补丁应用失败?
**A**: 备份本地修改后重试
```bash
git stash
git apply v2.2.0.patch
```
### Q3: 数据库迁移失败?
**A**: 手动运行迁移脚本
```bash
python migrate_news_fields.py
```
---
## 成本估算
假设每天100个网站被访问
- 每次API调用约 0.01元
- 每天成本约 1元
- 每月成本约 30元
---
## 下一步
部署完成后:
1. 访问网站测试功能
2. 查看应用日志确认无错误
3. 监控API调用情况
4. 根据需要调整新闻获取数量和时间范围
---
## 技术支持文档
- **完整文档**: `DEPLOY_v2.2.0.md`
- **检查清单**: `DEPLOY_v2.2_CHECKLIST.md`
- **功能文档**: `NEWS_FEATURE_v2.2.md`
---
**创建时间**: 2025-12-30 22:32
**准备就绪**: ✅
**可以开始部署**: ✅

View File

@@ -0,0 +1,496 @@
# ZJPB v2.3.0 部署指南
**版本**: v2.3.0
**发布日期**: 2025-12-31
**核心功能**: 新闻获取准确性优化
---
## 📋 版本概述
v2.3.0版本专注于解决新闻获取准确性问题,通过引入专用新闻关键词字段和严格匹配策略,显著提升新闻相关性。
### ✨ 核心改进
1. **专用新闻关键词字段**
- Sites表新增`news_keywords`字段
- 支持为每个网站设置专属搜索关键词
- 避免网站名称混淆导致的不相关新闻
2. **严格匹配搜索策略**
- 使用双引号包裹关键词,确保完整匹配
- 优先使用news_keywords降级使用网站名称
- 提高新闻相关性和准确性
3. **前台手动刷新功能**
- 详情页新增"获取最新资讯"按钮
- 用户可主动刷新最新新闻
- 无需后台权限,前台直接使用
---
## 🔧 技术变更
### 数据库变更
**Sites表**
```sql
ALTER TABLE sites
ADD COLUMN news_keywords VARCHAR(200)
COMMENT '新闻获取关键词(用于精准匹配相关新闻)'
AFTER features;
```
### 代码变更
| 文件 | 变更类型 | 说明 |
|------|---------|------|
| `models.py` | 修改 | Site模型添加news_keywords字段 |
| `migrate_news_keywords.py` | 新增 | 数据库迁移脚本 |
| `app.py` | 修改 | • 后台表单配置<br>• search_site_news调用<br>• 新API路由 |
| `utils/news_searcher.py` | 修改 | 支持news_keywords参数 |
| `templates/detail_new.html` | 修改 | 刷新按钮和JavaScript |
---
## 🚀 部署步骤
### 方法一Git Pull 部署(推荐)
#### 1. 备份数据库
```bash
# SSH登录服务器
cd /opt/1panel/apps/zjpb
# 备份数据库
mysqldump -h localhost -u ai_nav -p ai_nav > backup_before_v2.3_$(date +%Y%m%d_%H%M%S).sql
```
#### 2. 拉取最新代码
```bash
# 停止应用
./manage.sh stop
# 查看当前状态
git status
# 如有本地修改,先暂存
git stash
# 拉取最新代码
git pull origin master
# 如有stash可选择恢复
# git stash pop
# 查看当前版本
git log --oneline -3
```
#### 3. 运行数据库迁移
```bash
# 激活虚拟环境
source venv/bin/activate
# 运行迁移脚本
python migrate_news_keywords.py
```
**预期输出**
```
============================================================
开始执行数据库迁移 v2.3.0
============================================================
1. 添加 news_keywords 字段...
>>> news_keywords 字段添加成功
2. 为现有网站设置默认关键词(使用网站名称)...
>>> 已更新 X 个网站的默认关键词
============================================================
>>> 数据库迁移完成!
============================================================
```
#### 4. 重启应用
```bash
# 重启应用
./manage.sh restart
# 检查状态
./manage.sh status
# 查看日志(可选)
./manage.sh logs
```
---
### 方法二:手动文件上传(备用)
如果Git pull失败可以手动上传修改的文件
#### 需要上传的文件
1. `models.py`
2. `migrate_news_keywords.py` (新文件)
3. `app.py`
4. `utils/news_searcher.py`
5. `templates/detail_new.html`
**上传后执行**
```bash
cd /opt/1panel/apps/zjpb
source venv/bin/activate
python migrate_news_keywords.py
./manage.sh restart
```
---
## ✅ 部署验证
### 1. 数据库验证
```sql
-- 检查sites表结构
DESCRIBE sites;
-- 应该看到新字段
-- news_keywords | varchar(200) | YES
-- 检查现有数据
SELECT id, name, news_keywords
FROM sites
LIMIT 5;
```
### 2. 后台验证
访问后台管理http://your-domain.com/admin/login
**检查项**
- [ ] 进入"网站管理"
- [ ] 点击"编辑"任意网站
- [ ] 查看是否有"新闻关键词"输入框
- [ ] 输入测试关键词,保存成功
### 3. 前台验证
访问任意网站详情页http://your-domain.com/site/xxxxxxxx
**检查项**
- [ ] 页面正常加载
- [ ] 滚动到"相关新闻"模块
- [ ] 查看是否有"获取最新资讯"按钮
- [ ] 点击按钮测试刷新功能需配置BOCHA_API_KEY
### 4. API测试
```bash
# 测试刷新新闻API
curl -X POST http://your-domain.com/api/refresh-site-news/12345678 \
-H "Content-Type: application/json"
# 预期返回
{
"success": true,
"message": "成功获取 X 条新资讯",
"total_found": X,
"saved_count": X
}
```
---
## 📝 使用指南
### 后台管理员
#### 设置新闻关键词
1. 登录后台:`/admin/login`
2. 进入"网站管理" → 选择要编辑的网站
3. 找到"新闻关键词"字段
4. 输入精准的搜索关键词
**关键词设置建议**
-**推荐**:使用产品官方全称或核心品牌词
- 示例:`ChatGPT``GitHub Copilot``Midjourney`
-**多个关键词**:可以使用空格分隔(会被当作一个整体匹配)
- 示例:`Claude AI``Google Gemini`
-**避免**:过于宽泛的词
- 错误示例:`AI``工具``助手`
#### 批量设置关键词
```sql
-- 示例:批量设置关键词
UPDATE sites SET news_keywords = 'ChatGPT' WHERE name = 'ChatGPT';
UPDATE sites SET news_keywords = 'GitHub Copilot' WHERE name = 'GitHub Copilot';
UPDATE sites SET news_keywords = 'Claude AI' WHERE name = 'Claude';
```
### 前台用户
#### 手动刷新新闻
1. 访问网站详情页
2. 滚动到"相关新闻"模块
3. 点击"获取最新资讯"按钮
4. 等待1-2秒页面自动刷新
**注意**
- 刷新功能需要配置BOCHA_API_KEY
- 每次刷新获取最新5条一周内的新闻
- 自动去重,不会重复保存
---
## 🔍 问题排查
### 1. 迁移脚本报错
**错误**`news_keywords字段已存在`
**解决**:正常现象,脚本会自动跳过已存在的字段
---
### 2. 后台表单没有新字段
**可能原因**
- 代码未更新
- 浏览器缓存
**解决方案**
```bash
# 确认代码已更新
grep -n "news_keywords" app.py
# 清除浏览器缓存强制刷新Ctrl + F5
# 重启应用
./manage.sh restart
```
---
### 3. 刷新按钮不显示
**可能原因**
- detail_new.html未更新
- 模板缓存
**解决方案**
```bash
# 确认模板已更新
grep -n "refresh-news-btn" templates/detail_new.html
# 清除Flask缓存重启应用
./manage.sh restart
```
---
### 4. 刷新新闻失败
**错误信息**`新闻功能未启用`
**原因**BOCHA_API_KEY未配置
**解决方案**
```bash
# 编辑.env文件
nano /opt/1panel/apps/zjpb/.env
# 添加或确认以下配置
BOCHA_API_KEY=sk-your-api-key-here
BOCHA_BASE_URL=https://api.bocha.cn
# 重启应用
./manage.sh restart
```
---
## 🔄 回滚方案
如果部署后出现问题,可以快速回滚:
### 1. 回滚代码
```bash
cd /opt/1panel/apps/zjpb
./manage.sh stop
# 查看提交历史
git log --oneline -5
# 回滚到v2.2.0(假设是前一个提交)
git reset --hard <v2.2.0的commit-id>
./manage.sh start
```
### 2. 回滚数据库(可选)
```bash
# 删除新添加的字段(如需要)
mysql -h localhost -u ai_nav -p ai_nav
ALTER TABLE sites DROP COLUMN news_keywords;
```
**注意**:删除字段会丢失已设置的关键词数据,谨慎操作!
---
## 📊 性能影响
### 数据库
- **新增字段**1个VARCHAR(200)字段
- **存储增长**约200字节/网站
- **查询性能**:无影响(字段不参与索引查询)
### 应用性能
- **后台表单**:无明显影响
- **前台刷新**
- API调用耗时1-3秒取决于博查API响应
- 不影响页面正常浏览
- 仅在用户主动点击时触发
---
## 🆕 新增API端点
### POST /api/refresh-site-news/<site_code>
手动刷新指定网站的新闻
**参数**
- `site_code`网站编码URL路径参数
**返回**
```json
{
"success": true,
"message": "成功获取 3 条新资讯",
"total_found": 5,
"saved_count": 3
}
```
**权限**:无需登录,前台可用
---
## 📈 版本对比
| 功能 | v2.2.0 | v2.3.0 |
|------|--------|--------|
| 新闻搜索 | ✅ | ✅ |
| 搜索关键词 | 仅网站名称 | 专用关键词优先 |
| 匹配策略 | 普通匹配 | 严格匹配(双引号) |
| 手动刷新 | ❌ | ✅ 前台按钮 |
| 关键词管理 | ❌ | ✅ 后台配置 |
---
## 🔧 维护建议
### 定期检查关键词
建议定期检查新闻获取效果,优化关键词设置:
```sql
-- 查看没有设置关键词的网站
SELECT id, name, news_keywords
FROM sites
WHERE news_keywords IS NULL OR news_keywords = '';
-- 查看新闻获取较少的网站
SELECT s.name, s.news_keywords, COUNT(n.id) as news_count
FROM sites s
LEFT JOIN news n ON s.id = n.site_id
GROUP BY s.id
HAVING news_count < 3
ORDER BY news_count;
```
### 关键词优化流程
1. 识别新闻数量少的网站
2. 访问该网站,了解官方品牌名称
3. 在后台设置更精准的关键词
4. 点击前台刷新按钮测试效果
5. 根据结果调整关键词
---
## 📞 技术支持
**项目**: ZJPB - 焦提示词 | AI工具导航
**版本**: v2.3.0
**更新日期**: 2025-12-31
**常见问题**
1. 查看应用日志:`./manage.sh logs`
2. 检查数据库连接:确认.env中的DB_配置
3. 验证API配置确认BOCHA_API_KEY正确
---
## 🎯 后续优化建议
v2.3.0之后可以考虑的优化方向:
1. **智能关键词推荐**
- 根据网站URL自动提取品牌词
- AI分析网站内容推荐关键词
2. **新闻质量评分**
- 使用AI评估新闻相关性
- 自动过滤低质量新闻
3. **批量关键词管理**
- 后台批量设置关键词
- 导入导出关键词配置
4. **新闻效果统计**
- 统计每个网站的新闻点击率
- 根据数据优化关键词策略
---
## 📝 更新日志
### v2.3.0 (2025-12-31)
**新增**
- ✨ Sites表添加news_keywords字段
- ✨ 后台管理支持设置新闻关键词
- ✨ 详情页新增"获取最新资讯"按钮
- ✨ 新API端点`/api/refresh-site-news/<code>`
**优化**
- 🎯 新闻搜索使用专用关键词(优先级高于网站名称)
- 🎯 严格匹配策略(双引号包裹关键词)
- 🎯 所有search_site_news调用传递news_keywords参数
**修复**
- 🐛 解决网站名称相似导致的新闻混淆问题
- 🐛 提高新闻相关性和准确性
---
**部署文档版本**: v1.0
**最后更新**: 2025-12-31
**维护者**: ZJPB开发团队

View File

@@ -0,0 +1,175 @@
# ZJPB v2.3.0 快速部署指南
> 3步完成部署5分钟上线
---
## 📦 版本信息
- **版本**: v2.3.0
- **日期**: 2025-12-31
- **核心**: 新闻准确性优化
---
## ⚡ 快速部署3步
### 第1步拉取代码
```bash
cd /opt/1panel/apps/zjpb
./manage.sh stop
git pull origin master
```
### 第2步数据库迁移
```bash
source venv/bin/activate
python migrate_news_keywords.py
```
### 第3步重启应用
```bash
./manage.sh restart
./manage.sh status
```
**部署完成!**
---
## ✅ 快速验证
### 1. 后台验证1分钟
```
1. 访问http://your-domain.com/admin/login
2. 进入:网站管理 → 编辑任意网站
3. 检查:是否有"新闻关键词"字段
```
### 2. 前台验证1分钟
```
1. 访问http://your-domain.com/site/xxxxxxxx
2. 滚动:到"相关新闻"模块
3. 检查:是否有"获取最新资讯"按钮
```
---
## 🎯 核心功能
### 1. 新闻关键词设置
**后台操作**
```
网站管理 → 编辑 → 新闻关键词 → 输入"ChatGPT" → 保存
```
**效果**
- 搜索更精准
- 避免名称混淆
- 提高相关性
### 2. 前台手动刷新
**用户操作**
```
详情页 → 相关新闻 → 点击"获取最新资讯" → 等待刷新
```
**效果**
- 获取最新5条新闻
- 自动去重
- 1-2秒完成
---
## 🔧 关键词设置技巧
### 推荐设置
| 网站名称 | 推荐关键词 | 说明 |
|---------|-----------|------|
| ChatGPT | `ChatGPT` | 官方品牌名 |
| GitHub Copilot | `GitHub Copilot` | 完整产品名 |
| Claude | `Claude AI` | 添加AI避免混淆 |
| 文心一言 | `文心一言` | 中文全称 |
### 避免设置
`AI``工具``助手` - 过于宽泛
`聊天机器人` - 不够精准
`GPT` - 会匹配所有GPT相关
---
## 🐛 问题速查
### 问题1后台没有新字段
```bash
# 检查代码
grep "news_keywords" app.py
# 清缓存重启
./manage.sh restart
```
### 问题2刷新按钮不显示
```bash
# 检查模板
grep "refresh-news-btn" templates/detail_new.html
# 强制刷新浏览器Ctrl + F5
```
### 问题3刷新失败
```bash
# 检查API配置
grep "BOCHA_API_KEY" .env
# 如未配置,添加:
echo "BOCHA_API_KEY=sk-your-key" >> .env
./manage.sh restart
```
---
## 📊 变更文件
| 文件 | 说明 |
|------|------|
| `models.py` | 添加字段 |
| `migrate_news_keywords.py` | 迁移脚本 |
| `app.py` | 后台+API |
| `utils/news_searcher.py` | 搜索逻辑 |
| `templates/detail_new.html` | 刷新按钮 |
---
## 🔄 回滚(如需要)
```bash
cd /opt/1panel/apps/zjpb
./manage.sh stop
git reset --hard HEAD~1 # 回到上一版本
./manage.sh start
```
---
## 📚 完整文档
详细信息请查看:`DEPLOY_v2.3.0.md`
---
**快速指南版本**: v1.0
**部署时间**: 约5分钟
**难度**: ⭐ 简单

View File

@@ -0,0 +1,375 @@
# ZJPB v2.4.0 部署指南 - SEO优化版本
## 版本说明
**版本号**: v2.4.0
**发布日期**: 2026-01-03
**主题**: SEO全面优化
**向下兼容**: 是
---
## 📋 版本更新内容
### 1. 自动化SEO基础设施
#### 1.1 Sitemap.xml 自动生成
- **路由**: `/sitemap.xml`
- **功能**: 动态生成符合搜索引擎标准的sitemap
- **包含内容**:
- 首页 (优先级: 1.0, 更新频率: daily)
- 所有工具详情页 (优先级: 0.8, 更新频率: weekly)
- 所有标签页 (优先级: 0.6, 更新频率: weekly)
- **特性**: 自动包含最后修改时间 (lastmod)
#### 1.2 Robots.txt 动态配置
- **路由**: `/robots.txt`
- **功能**: 指导搜索引擎爬虫
- **配置**:
- 允许爬取: 所有公开页面
- 禁止爬取: /admin/, /api/
- 自动引用sitemap.xml地址
### 2. 结构化数据 (Schema.org)
#### 2.1 工具详情页 - SoftwareApplication
- **类型**: `SoftwareApplication`
- **包含字段**:
- name, url, image, description
- featureList (主要功能列表)
- applicationCategory, operatingSystem
- keywords (关联标签)
- offers (价格信息)
- aggregateRating (基于浏览次数的评分)
#### 2.2 面包屑导航 - BreadcrumbList
- **类型**: `BreadcrumbList`
- **层级结构**: 首页 > 标签 > 工具详情
- **好处**: 搜索结果中显示完整导航路径
#### 2.3 Open Graph 标签
- **支持平台**: 微信、Twitter、Facebook等
- **包含内容**: title, description, url, image
- **效果**: 社交媒体分享时显示精美卡片
### 3. 内容自动内链系统
#### 3.1 智能识别工具名称
- **功能**: 自动识别内容中提到的其他工具并添加链接
- **实现**: 新增 `auto_link` Jinja2过滤器
- **策略**:
- 按名称长度降序匹配(优先匹配长名称)
- 每个工具名称仅链接一次
- 排除当前工具本身
- **样式**: 虚线下划线,蓝色文字,带tooltip
#### 3.2 应用范围
- 工具详情页的"产品概述"
- 工具详情页的"主要功能"
### 4. 标签专题页SEO优化
#### 4.1 新增Tag模型字段
- `seo_title`: SEO标题 (100字符)
- `seo_description`: SEO页面描述 (300字符)
- `seo_keywords`: SEO关键词 (200字符)
#### 4.2 动态Meta标签
- 标签页自动使用专属SEO信息
- 支持降级: 无配置时使用默认值
- 首页也有完整的meta标签配置
### 5. 面包屑导航
#### 5.1 可视化导航
- **结构**: 首页 > 标签 > 工具名
- **样式**: 灰色文字,悬停变蓝,当前项加粗
- **位置**: 详情页顶部,返回按钮上方
#### 5.2 增强用户体验
- 清晰的页面层级关系
- 便捷的快速导航
- aria-label支持屏幕阅读器
### 6. 页面级SEO改进
#### 6.1 工具详情页
- canonical链接(避免重复内容)
- 动态keywords meta标签
- 动态description meta标签
#### 6.2 标签页
- 专属的页面标题
- 专属的描述和关键词
- canonical URL
---
## 🚀 部署步骤
### 1. 备份数据库
```bash
# 备份当前数据库
mysqldump -u root -p zjpb > zjpb_backup_v2.3.0_$(date +%Y%m%d).sql
```
### 2. 停止应用
```bash
# 如果使用supervisor
sudo supervisorctl stop zjpb
# 或者如果使用gunicorn直接运行
pkill -f gunicorn
```
### 3. 更新代码
```bash
cd /path/to/zjpb
git pull origin master
# 或者手动上传更新的文件
```
### 4. 执行数据库迁移
```bash
# 激活虚拟环境
source venv/bin/activate # Linux/Mac
# 或
venv\Scripts\activate # Windows
# 执行迁移脚本
python migrate_tag_seo_fields.py
```
**迁移脚本说明:**
-`tags`表添加3个新字段
- 自动检查字段是否已存在,避免重复执行
- 支持MySQL COMMENT
### 5. 重启应用
```bash
# 使用supervisor
sudo supervisorctl start zjpb
sudo supervisorctl status zjpb
# 或使用gunicorn
gunicorn -c gunicorn_config.py app:app
```
### 6. 验证部署
#### 6.1 检查SEO路由
访问以下URL确认功能正常:
- `https://your-domain.com/sitemap.xml` - 应显示完整的sitemap
- `https://your-domain.com/robots.txt` - 应显示robots配置
#### 6.2 检查详情页
- 打开任意工具详情页
- 查看页面源代码,确认有Schema.org JSON-LD
- 确认面包屑导航显示正常
- 确认meta标签完整
#### 6.3 检查数据库
```sql
-- 确认新字段已添加
DESCRIBE tags;
-- 应该看到:
-- seo_title
-- seo_description
-- seo_keywords
```
---
## 📝 后续配置任务
### 1. 为标签填写SEO信息 (重要!)
登录后台管理系统 (`/admin`),进入"标签管理":
**推荐配置示例:**
**标签名**: AI写作
- **SEO标题**: 最好用的AI写作工具推荐 - ZJPB
- **SEO描述**: 发现最优秀的AI写作工具,包括文章生成、内容润色、创意写作等功能。精选30+款专业AI写作助手,提升写作效率10倍。
- **SEO关键词**: AI写作,AI文章生成,智能写作,AI内容创作,写作助手
**注意事项:**
- SEO标题控制在60字符以内
- SEO描述控制在160字符以内
- SEO关键词用逗号分隔,不超过10个
### 2. 提交Sitemap到搜索引擎
#### 2.1 Google Search Console
1. 登录 https://search.google.com/search-console
2. 选择你的网站属性
3. 侧边栏点击"站点地图"
4. 输入 `sitemap.xml` 并提交
#### 2.2 百度搜索资源平台
1. 登录 https://ziyuan.baidu.com
2. 选择你的网站
3. "数据引入" > "链接提交" > "sitemap"
4. 提交sitemap地址
#### 2.3 必应站长工具
1. 登录 https://www.bing.com/webmasters
2. 选择你的网站
3. "配置我的网站" > "站点地图"
4. 提交sitemap地址
### 3. 验证结构化数据
使用Google Rich Results Test:
1. 访问 https://search.google.com/test/rich-results
2. 输入你的工具详情页URL
3. 确认"SoftwareApplication"和"BreadcrumbList"被正确识别
### 4. 优化内容以利用内链系统
**建议**:
- 在编写工具详细介绍时,自然地提及相关工具名称
- 系统会自动为这些名称添加内链
- 例如: "与ChatGPT类似,Claude也是..."
---
## 🔍 SEO效果监测
### 1. 关键指标
监测以下数据(建议使用Google Analytics):
- 自然搜索流量
- 页面停留时间
- 跳出率
- 页面加载速度
### 2. 搜索结果优化
观察搜索结果中是否出现:
- ✓ 面包屑导航路径
- ✓ 评分星级(来自aggregateRating)
- ✓ 丰富摘要信息
### 3. 索引监控
使用Google Search Console监控:
- 页面索引数量
- 覆盖率报告
- 增强功能报告(查看结构化数据状态)
---
## 🐛 故障排查
### 问题1: sitemap.xml 显示404
**原因**: 路由未正确注册
**解决**: 检查app.py中是否有sitemap路由,重启应用
### 问题2: 数据库迁移失败
**错误**: "Column already exists"
**原因**: 迁移脚本已执行过
**解决**: 这是正常现象,脚本会自动跳过已存在的字段
### 问题3: Schema.org数据不显示
**检查项**:
- 确认base_new.html中有 `{% block extra_head %}`
- 确认detail_new.html正确继承并使用该block
- 使用Google Rich Results Test验证
### 问题4: 内链不生效
**检查项**:
- 确认app.py中有`auto_link`过滤器定义
- 确认detail_new.html使用了 `| auto_link(site.id)`
- 数据库中是否有其他启用的工具
---
## 📈 性能影响评估
### 1. 页面加载
- Sitemap生成: +20ms (缓存后几乎无影响)
- Schema.org输出: +5ms
- 内链处理: +30ms (仅详情页)
### 2. 数据库
- 新增3个VARCHAR字段,存储开销: <1KB/标签
- 无新增查询,性能影响可忽略
### 3. 优化建议
- 未来可为sitemap添加缓存(如15分钟)
- 内链可考虑结果缓存
---
## 🎯 下一步建议
### 短期(1-2周)
1. 完成所有标签的SEO信息配置
2. 提交sitemap到主流搜索引擎
3. 验证所有结构化数据
### 中期(1个月)
1. 监控自然搜索流量变化
2. 根据Search Console数据优化关键词
3. A/B测试不同的SEO描述
### 长期(3个月+)
1. 定期更新sitemap(自动完成)
2. 分析哪些页面SEO表现最好
3. 考虑添加更多Schema类型(如FAQPage)
---
## 🔄 版本回滚
如需回滚到v2.3.0:
```bash
# 1. 停止应用
sudo supervisorctl stop zjpb
# 2. 还原代码
git checkout v2.3.0
# 或还原备份的文件
# 3. (可选)还原数据库
# 注意: 新增的SEO字段不影响旧版本运行,可保留
mysql -u root -p zjpb < zjpb_backup_v2.3.0_YYYYMMDD.sql
# 4. 重启应用
sudo supervisorctl start zjpb
```
---
## 📞 技术支持
- **GitHub Issues**: https://github.com/your-repo/zjpb/issues
- **文档**: 查看项目Wiki
- **版本历史**: CHANGELOG.md
---
## ✅ 部署检查清单
- [ ] 数据库已备份
- [ ] 代码已更新
- [ ] 迁移脚本执行成功
- [ ] 应用重启成功
- [ ] /sitemap.xml 可访问
- [ ] /robots.txt 可访问
- [ ] 工具详情页有结构化数据
- [ ] 面包屑导航显示正常
- [ ] 标签SEO字段可在后台编辑
- [ ] 已提交sitemap到搜索引擎
- [ ] 已用Rich Results Test验证
- [ ] 性能监控正常
---
**祝部署顺利! v2.4.0将为你的SEO带来显著提升。**
*最后更新: 2026-01-03*

View File

@@ -0,0 +1,594 @@
# ZJPB v2.4.1 开发文档 - 标签功能优化
**版本号**: v2.4.1
**开发日期**: 2026-01-04
**功能主题**: 最新/热门/推荐标签功能
**开发者**: Claude Code
**Git Commit**: 8011e5b
---
## 📋 功能概述
### 用户需求
用户原本要求实现"热门工具排行榜"功能,但在看到初版实现后明确拒绝了顶部独立排行榜的设计,提出了新的需求:
> "这个列表并不好看不用在顶部单独增加模块可以在tag下增加3个tab分别是"最新"、"热门"、"推荐" 这三个,其中"推荐"可以在后台添加网站或者编辑的时候设置"
### 最终实现
-**完全移除**删除顶部热门工具排行榜模块约118行CSS + HTML
-**Tab导航**在分类标签下方添加三个tab最新/热门/推荐)
-**数据库支持**:添加`is_recommended`字段到Site模型
-**后台管理**:支持在后台标记推荐工具
-**状态保持**URL参数保持tab、分类、搜索、分页状态
-**完整测试**:所有功能已本地验证通过
---
## 🏗️ 技术架构
### 1. 数据库层
#### 新增字段
**表名**: `sites`
**字段名**: `is_recommended`
**类型**: `TINYINT(1)`
**默认值**: `0` (False)
**注释**: "是否推荐"
**DDL语句**:
```sql
ALTER TABLE sites ADD COLUMN is_recommended TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否推荐';
```
#### 迁移脚本
**文件**: `migrations/add_is_recommended.py`
**特性**:
- 幂等性检查(避免重复执行)
- 支持upgrade/downgrade
- 自动检测字段是否已存在
- 错误处理和事务回滚
### 2. 后端层
#### 路由修改
**文件**: `app.py`
**函数**: `index()` (Lines 70-148)
**新增参数处理**:
```python
current_tab = request.args.get('tab', 'latest') # 默认为"最新"
```
**三种模式的查询逻辑**:
1. **最新模式** (默认):
```python
if current_tab == 'latest' or not current_tab:
query = query.order_by(Site.created_at.desc(), Site.id.desc())
```
2. **热门模式**:
```python
elif current_tab == 'popular':
query = query.order_by(Site.view_count.desc(), Site.id.desc())
```
3. **推荐模式**:
```python
elif current_tab == 'recommended':
query = query.filter_by(is_recommended=True).order_by(Site.sort_order.desc(), Site.id.desc())
```
**关键特性**:
- 支持与分类筛选tag组合使用
- 支持与搜索q组合使用
- 支持分页
- 所有查询条件可叠加
#### Flask-Admin配置
**文件**: `app.py`
**类**: `SiteAdmin` (Lines 1345-1481)
**修改点**:
```python
# 列表显示添加推荐字段
column_list = ['id', 'code', 'name', 'url', 'slug', 'is_active', 'is_recommended', 'view_count', 'created_at']
# 添加推荐筛选器
column_filters = ['is_active', 'is_recommended', 'tags']
# 表单添加推荐字段
form_columns = ['name', 'url', 'slug', 'logo', 'short_desc', 'description', 'features', 'news_keywords', 'tags', 'is_active', 'is_recommended', 'sort_order']
# 中文标签
column_labels = {
'is_recommended': '是否推荐',
# ... 其他字段
}
```
### 3. 前端层
#### 模板文件
**文件**: `templates/index_new.html`
**删除内容** (约118行):
- `.popular-section` 相关所有CSS
- `.popular-header`, `.popular-title`, `.popular-badge` 样式
- `.popular-grid`, `.popular-item` 样式
- 顶部热门工具HTML结构
**新增内容**:
**Tab导航CSS** (Lines 339-397):
```css
.sort-tabs {
padding: 24px 0 0 0;
border-top: 1px solid var(--border-color);
margin-top: 24px;
}
.sort-tab {
padding: 8px 20px;
border-radius: 50px;
/* ... 完整样式见源码 */
}
.sort-tab.active {
background: var(--primary-blue);
border-color: var(--primary-blue);
color: white;
}
```
**Tab导航HTML** (Lines 443-462):
```html
<div class="sort-tabs">
<div class="sort-tabs-container">
<a href="/?{% if selected_tag %}tag={{ selected_tag.slug }}&{% endif %}tab=latest"
class="sort-tab {% if not current_tab or current_tab == 'latest' %}active{% endif %}">
<span class="icon">🕐</span>
最新
</a>
<a href="/?{% if selected_tag %}tag={{ selected_tag.slug }}&{% endif %}tab=popular"
class="sort-tab {% if current_tab == 'popular' %}active{% endif %}">
<span class="icon">🔥</span>
热门
</a>
<a href="/?{% if selected_tag %}tag={{ selected_tag.slug }}&{% endif %}tab=recommended"
class="sort-tab {% if current_tab == 'recommended' %}active{% endif %}">
<span class="icon"></span>
推荐
</a>
</div>
</div>
```
**分页链接更新** (Lines 505-556):
所有分页链接都更新为保持tab状态
```html
<!-- 示例 -->
<a href="?page={{ page_num }}{% if selected_tag %}&tag={{ selected_tag.slug }}{% endif %}{% if search_query %}&q={{ search_query }}{% endif %}{% if current_tab and current_tab != 'latest' %}&tab={{ current_tab }}{% endif %}">
```
**关键逻辑**:
- 默认tab为'latest'时不显示在URL中保持URL简洁
- 非默认tab时添加`&tab=xxx`参数
- 保持所有其他状态tag, q, page
---
## 📁 文件变更清单
### 新增文件
1. **migrations/add_is_recommended.py** (73 lines)
- 数据库迁移脚本
- 添加is_recommended字段
### 修改文件
1. **models.py**
- Line 29: 添加`is_recommended`字段定义
- Line 56: `to_dict()`方法添加字段序列化
2. **app.py**
- Lines 95: 添加`current_tab`参数处理
- Lines 130-139: 实现三种tab模式的查询逻辑
- Line 148: 传递`current_tab`到模板
- Lines 1360-1382: Flask-Admin配置更新
3. **templates/index_new.html**
- 删除: ~118行热门section相关代码
- Lines 339-397: 新增tab导航CSS
- Lines 443-462: 新增tab导航HTML
- Lines 505-556: 更新所有分页链接
**统计**: 4个文件修改167行新增181行删除
---
## 🔄 URL参数设计
### 参数说明
| 参数 | 说明 | 默认值 | 示例 |
|------|------|--------|------|
| `tag` | 分类筛选 | 无 | `tag=ai-chat` |
| `tab` | 排序模式 | `latest` | `tab=popular` |
| `q` | 搜索关键词 | 无 | `q=chatgpt` |
| `page` | 页码 | `1` | `page=2` |
### URL组合示例
```
# 只有tab
/?tab=popular
# 分类 + tab
/?tag=ai-chat&tab=popular
# 分类 + tab + 分页
/?tag=ai-chat&tab=recommended&page=2
# 分类 + tab + 搜索 + 分页
/?tag=ai-chat&tab=popular&q=对话&page=2
```
### 设计原则
- **简洁性**: 默认值tab=latest, page=1不出现在URL中
- **状态保持**: 所有操作切换tab、翻页等保持其他参数
- **向后兼容**: 无tab参数时默认为latest模式
- **SEO友好**: URL清晰可读
---
## 🧪 测试验证
### 本地测试(已完成)
**测试环境**:
- Flask Development Server
- 测试时间: 2026-01-04 00:16:41 - 00:54:25
- 数据库: MySQL
**测试用例**:
1.**数据库迁移**
- 执行时间: 00:28:18
- 结果: 成功添加is_recommended字段
- SQL: `ALTER TABLE sites ADD COLUMN is_recommended TINYINT(1) NOT NULL DEFAULT 0`
2.**三种tab模式**
- 最新 (00:38:37): `ORDER BY created_at DESC`
- 热门 (00:38:39): `ORDER BY view_count DESC`
- 推荐 (00:39:10): `WHERE is_recommended = true ORDER BY sort_order DESC`
3.**后台管理**
- 访问admin界面 (00:38:48)
- 编辑Site ID=1 (00:39:02)
- 成功设置is_recommended=1
4.**组合筛选**
- 分类 + tab: `?tag=ai-chat&tab=popular` (00:39:15)
- 所有组合均正常工作
5.**分页状态保持**
- URL参数在翻页时正确保持
### 生产部署(已完成)
**部署时间**: 2026-01-04
**部署方式**: Git pull + 数据库迁移 + 应用重启
**部署状态**: ✅ 成功
---
## 💡 核心技术要点
### 1. SQLAlchemy查询链式调用
```python
# 基础查询
query = Site.query.filter_by(is_active=True)
# 条件叠加
if tag_slug:
query = query.filter(Site.tags.contains(selected_tag))
# 排序方式
query = query.order_by(Site.created_at.desc(), Site.id.desc())
# 分页
pagination = query.paginate(page=page, per_page=100, error_out=False)
```
### 2. Jinja2条件CSS类
```html
<a class="sort-tab {% if current_tab == 'popular' %}active{% endif %}">
```
### 3. URL参数拼接
```html
href="/?{% if selected_tag %}tag={{ selected_tag.slug }}&{% endif %}tab=latest"
```
**技巧**: 使用`{% if %}`控制参数是否出现,避免空参数
### 4. Flask请求参数处理
```python
# 获取参数,提供默认值
current_tab = request.args.get('tab', 'latest')
# 安全获取整数
page = request.args.get('page', 1, type=int)
# 字符串处理
search_query = request.args.get('q', '').strip()
```
---
## 🎨 UI/UX设计
### 视觉设计
**Tab样式**:
- 未激活: 白色背景,灰色边框,灰色文字
- 悬停: 蓝色边框,浅蓝背景,蓝色文字
- 激活: 蓝色背景,白色文字
- 圆角: 50px胶囊形状
- 图标: Unicode emoji🕐🔥⭐
**位置**:
- 在分类标签下方
- 顶部有1px灰色分隔线
- 24px上边距
### 交互设计
**用户流程**:
1. 用户访问首页,默认显示"最新"工具
2. 点击分类标签,查看特定分类
3. 切换tab改变排序方式
4. 所有状态通过URL保持支持刷新和分享
**状态反馈**:
- 当前激活的tab高亮显示
- URL参数实时更新
- 页面内容即时切换
---
## 🔒 数据完整性
### 默认值处理
- 所有现有记录的`is_recommended`默认为`0` (False)
- 新创建的Site默认`is_recommended=False`
- 不影响现有数据
### 查询优化
```python
# 推荐模式只查询is_recommended=True的记录
query.filter_by(is_recommended=True)
# 使用索引字段排序
order_by(Site.sort_order.desc(), Site.id.desc())
```
### 数据库索引建议
```sql
-- 可选:如果推荐工具数量很多,建议添加索引
CREATE INDEX idx_is_recommended ON sites(is_recommended);
```
---
## 📊 性能影响评估
### 查询性能
- **Latest模式**: 使用created_at索引性能无影响
- **Popular模式**: 使用view_count字段建议添加索引
- **Recommended模式**: 数据量少(推荐工具有限),性能影响可忽略
### 数据库存储
- 新增1个TINYINT字段1 byte/record
- 假设1000个工具1 KB额外存储
- 影响可忽略
### 页面加载
- 无额外HTTP请求
- CSS/HTML增加约2KBgzip后<1KB
- 渲染时间 <5ms
---
## 🐛 已知问题和解决方案
### 问题1: 推荐tab显示为空
**原因**: 没有标记任何工具为推荐
**解决**: 在后台至少标记几个优质工具为推荐
### 问题2: 数据库迁移重复执行
**原因**: 迁移脚本被多次运行
**解决**: 脚本有幂等性检查,会自动跳过已存在的字段
### 问题3: URL过长
**原因**: 同时使用tag, tab, q, page参数
**解决**:
- 默认值不出现在URLtab=latest, page=1
- 这是正常行为,利于状态保持
---
## 🚀 未来优化建议
### 短期优化 (1-2周)
1. **添加数据库索引**
```sql
CREATE INDEX idx_view_count ON sites(view_count DESC);
CREATE INDEX idx_is_recommended ON sites(is_recommended);
```
2. **优化推荐工具管理**
- 在后台网站列表添加"快速推荐"按钮
- 批量操作:批量设置/取消推荐
3. **用户行为分析**
- 添加Google Analytics事件追踪
- 统计哪个tab使用最频繁
### 中期优化 (1个月)
1. **Tab切换动画**
- 添加淡入淡出效果
- 优化用户体验
2. **推荐算法**
- 根据浏览量、评分自动建议推荐
- 定期更新推荐列表
3. **A/B测试**
- 测试不同的默认tablatest vs popular
- 测试tab位置上方 vs 下方)
### 长期优化 (3个月+)
1. **个性化推荐**
- 基于用户浏览历史
- 机器学习推荐算法
2. **多维度筛选**
- 添加更多tab如"最受欢迎"、"编辑精选"
- 组合筛选器
3. **缓存优化**
- Redis缓存热门查询
- 减少数据库压力
---
## 📚 相关文档
### 项目文档
- `DEPLOY_v2.4.0.md` - SEO功能部署文档
- `DEPLOY_CHECKLIST_v2.3.md` - 部署检查清单
- `README.md` - 项目总体说明
### 代码文件
- `app.py` - Flask应用主文件
- `models.py` - 数据库模型定义
- `templates/index_new.html` - 首页模板
- `migrations/add_is_recommended.py` - 本次迁移脚本
### Git提交
- **Commit ID**: `8011e5b`
- **Commit Message**: "feat: 实现最新/热门/推荐标签功能"
- **上一个版本**: `da30394` (热门工具排行榜 - 已废弃)
---
## 🔧 开发环境设置
### 本地开发
```bash
# 1. 克隆项目
git clone http://server.zjpb.net:3000/jowelin/zjpb.git
cd zjpb
# 2. 创建虚拟环境
python -m venv venv
source venv/bin/activate # Linux/Mac
# 或
venv\Scripts\activate # Windows
# 3. 安装依赖
pip install -r requirements.txt
# 4. 配置环境变量
cp .env.example .env
# 编辑.env文件配置数据库等信息
# 5. 运行数据库迁移
python migrations/add_is_recommended.py
# 6. 启动开发服务器
python app.py
# 访问 http://localhost:5000
```
### 数据库配置
```python
# .env文件示例
FLASK_ENV=development
DATABASE_URL=mysql+pymysql://root:password@localhost/zjpb
SECRET_KEY=your-secret-key
BOCHA_API_KEY=your-api-key
```
---
## 📞 技术支持
### 问题反馈
- **Git仓库**: http://server.zjpb.net:3000/jowelin/zjpb
- **Issues**: 在Git仓库创建Issue
### 开发者联系
- **开发者**: Claude Code
- **开发日期**: 2026-01-04
- **版本**: v2.4.1
---
## ✅ 二次开发快速启动清单
下次重新开启开发时,参考以下清单:
- [ ] 阅读本文档,了解最新功能
- [ ] 查看Git log了解最近提交
- [ ] 拉取最新代码:`git pull origin master`
- [ ] 激活虚拟环境
- [ ] 运行`python app.py`启动开发服务器
- [ ] 访问`http://localhost:5000`验证功能
- [ ] 登录后台`/admin`检查数据
- [ ] 查看`logs/error.log`确认无错误
---
## 📈 功能使用统计(建议追踪)
### 关键指标
- Tab点击率latest vs popular vs recommended
- 推荐工具数量
- 用户停留时间
- 分类+tab组合使用频率
### 数据查询示例
```sql
-- 查看推荐工具数量
SELECT COUNT(*) FROM sites WHERE is_recommended = 1 AND is_active = 1;
-- 查看各分类的推荐工具分布
SELECT t.name, COUNT(st.site_id) as recommended_count
FROM tags t
LEFT JOIN site_tags st ON t.id = st.tag_id
LEFT JOIN sites s ON st.site_id = s.id
WHERE s.is_recommended = 1 AND s.is_active = 1
GROUP BY t.id, t.name
ORDER BY recommended_count DESC;
-- 查看热门工具TOP 10
SELECT id, name, view_count
FROM sites
WHERE is_active = 1
ORDER BY view_count DESC
LIMIT 10;
```
---
**文档版本**: v1.0
**最后更新**: 2026-01-04
**下次更新**: 根据需要
---
祝二次开发顺利!🎉

View File

@@ -0,0 +1,462 @@
# ZJPB v2.6.0 开发文档 - API安全优化
**版本号**: v2.6.0
**开发日期**: 2026-02-06
**功能主题**: 博查API调用优化 + 频率限制 + 安全防护
**Git Commit**: (待提交)
---
## 📋 功能概述
### 问题背景
v2.5及之前版本存在严重的成本浪费问题:
- 每次访问详情页都自动调用博查API
- 没有频率限制,容易被滥用
- 缺少安全防护机制
### 优化目标
1. **按需加载**: 只在用户点击按钮时才调用API
2. **频率限制**: 每个IP每小时最多3次请求
3. **验证码防护**: 超过阈值后需要验证码
4. **成本控制**: 大幅降低无意义的API消耗
---
## 🎯 核心改进
### 1. 移除自动调用逻辑
**修改文件**: `app.py:151-240`
**before (v2.5)**:
```python
# 智能新闻更新:检查今天是否已更新过新闻
need_update = False
if not latest_news:
need_update = True
elif latest_news.created_at.date() < today:
need_update = True
# 如果需要更新,自动获取最新新闻
if need_update:
searcher = NewsSearcher(api_key)
news_items = searcher.search_site_news(...)
# 保存到数据库
```
**after (v2.6)**:
```python
# v2.6优化移除自动调用博查API的逻辑改为按需加载
# 只获取数据库中已有的新闻不再自动调用API
news_list = News.query.filter_by(
site_id=site.id,
is_active=True
).order_by(News.published_at.desc()).limit(5).all()
```
**影响**: 每次页面访问减少1次API调用节省成本约95%+
### 2. 按需加载API
**新增路由**: `/api/fetch-news/<code>`
**方法**: POST
**权限**: 公开(有频率限制)
**功能**:
- 用户点击"加载资讯"按钮时调用
- 返回JSON格式的新闻列表
- 前端动态渲染,无需刷新页面
### 3. 频率限制系统
**新增文件**: `utils/rate_limiter.py` (320行)
**核心类**:
- `RateLimiter`: 基于内存的频率限制器
- `CaptchaVerifier`: 验证码验证器
- `get_client_ip()`: 获取真实IP考虑代理/CDN
**限制策略**:
- 每个IP每小时最多3次请求
- 超过限制后需要等待或完成验证码
- 验证码要求持续30分钟
**配置参数**:
```python
# 在 fetch_news_for_site() 中配置
limiter.is_rate_limited(
client_ip,
action='news_fetch',
limit=3, # 每小时3次
window_minutes=60 # 时间窗口60分钟
)
```
### 4. 验证码集成
**支持的服务**:
- `simple`: 简单验证(开发测试用)
- `recaptcha`: Google reCAPTCHA v2/v3
- `hcaptcha`: hCaptcha
**集成步骤**:
1.`.env`中配置密钥:
```env
RECAPTCHA_SECRET_KEY=your-secret-key
# 或
HCAPTCHA_SECRET_KEY=your-secret-key
```
2. 修改`app.py`中的验证器实例化:
```python
verifier = CaptchaVerifier(
service='recaptcha',
secret_key=app.config.get('RECAPTCHA_SECRET_KEY')
)
```
3. 前端添加验证码组件(见下文)
---
## 🔧 技术实现
### 前端改进
**修改文件**: `templates/detail_new.html`
**1. 新闻区域显示逻辑**:
```html
<!-- 始终显示新闻区域 -->
<div class="content-block">
<button onclick="loadNews('{{ site.code }}')">
{% if has_news %}获取最新资讯{% else %}加载资讯{% endif %}
</button>
{% if news_list %}
<!-- 显示已有新闻 -->
{% else %}
<!-- 显示占位提示 -->
<div class="news-placeholder">
点击右上角"加载资讯"按钮获取最新内容
</div>
{% endif %}
</div>
```
**2. AJAX加载函数**:
```javascript
function loadNews(siteCode) {
fetch(`/api/fetch-news/${siteCode}`, {
method: 'POST',
headers: {'Content-Type': 'application/json'}
})
.then(response => response.json())
.then(data => {
if (data.success) {
// 动态渲染新闻列表
renderNews(data.news);
showMessage(data.message, 'success');
} else if (data.require_captcha) {
// 显示验证码
showCaptchaModal();
} else {
showMessage(data.error, 'error');
}
});
}
```
### 后端改进
**修改文件**: `app.py:185-307`
**流程图**:
```
用户请求
获取客户端IP
检查是否需要验证码 → YES → 返回429错误
↓ NO
检查频率限制 → 超限 → 要求验证码 → 返回429错误
↓ 未超限
验证验证码(如果提供)
记录请求
调用博查API
保存到数据库
返回新闻列表
```
---
## 📊 性能对比
### API调用次数
**场景**: 某个工具详情页被浏览100次
| 版本 | 自动调用 | 手动点击 | 总调用 | 成本 |
|------|---------|---------|--------|------|
| v2.5 | 100次 | 0次 | 100次 | ¥100 |
| v2.6 | 0次 | ~10次 | 10次 | ¥10 |
**节省**: 约90% API成本
### 频率限制效果
**攻击场景**: 恶意脚本每秒请求1次
| 版本 | 1小时调用 | 成本 |
|------|----------|------|
| v2.5 | 3600次 | ¥3600 |
| v2.6 | 3次 | ¥3 |
**防护**: 99.9% 成本节省
---
## 🚀 部署指南
### 1. 更新依赖
```bash
pip install Flask-Limiter==3.5.0
# 或
pip install -r requirements.txt
```
### 2. 更新代码
```bash
git pull origin master
# 或手动上传更新的文件
```
### 3. 无需数据库迁移
本次更新无数据库结构变更。
### 4. 重启应用
```bash
# 使用1Panel或命令行
sudo supervisorctl restart zjpb
```
### 5. 验证部署
1. 访问任意工具详情页
2. 确认不会自动加载新闻(页面加载快了)
3. 点击"加载资讯"按钮
4. 确认新闻正常显示
5. 连续点击4次确认出现频率限制提示
---
## ⚙️ 配置选项
### 频率限制参数
在`app.py`的`fetch_news_for_site()`函数中:
```python
# 调整限制次数和时间窗口
is_limited, remaining, reset_time = limiter.is_rate_limited(
client_ip,
action='news_fetch',
limit=3, # 改为5次更宽松
window_minutes=60 # 改为30分钟更严格
)
# 调整验证码持续时间
limiter.require_captcha(
client_ip,
duration_minutes=30 # 改为60分钟更严格
)
```
### 验证码配置
**使用Google reCAPTCHA**:
1. 注册并获取密钥https://www.google.com/recaptcha/admin
2. 配置`.env`:
```env
RECAPTCHA_SITE_KEY=your-site-key
RECAPTCHA_SECRET_KEY=your-secret-key
```
3. 修改`app.py`:
```python
verifier = CaptchaVerifier(
service='recaptcha',
secret_key=app.config.get('RECAPTCHA_SECRET_KEY')
)
```
**使用hCaptcha**(国内推荐):
1. 注册https://www.hcaptcha.com/
2. 配置`.env`:
```env
HCAPTCHA_SITE_KEY=your-site-key
HCAPTCHA_SECRET_KEY=your-secret-key
```
3. 修改`app.py`:
```python
verifier = CaptchaVerifier(
service='hcaptcha',
secret_key=app.config.get('HCAPTCHA_SECRET_KEY')
)
```
---
## 🔐 安全特性
### IP识别策略
支持CDN/代理场景按优先级获取真实IP
1. `X-Forwarded-For` 头第一个IP
2. `X-Real-IP` 头
3. `request.remote_addr`
### 防绕过机制
- 基于IP地址限制不依赖Cookie/Session
- 验证码要求持续30分钟不能通过清除缓存绕过
- 时间窗口滑动(不是固定时段)
### 日志记录
建议添加日志记录TODO
```python
# 记录频率限制触发
app.logger.warning(f"Rate limit triggered: {client_ip}")
# 记录验证码验证失败
app.logger.warning(f"Captcha failed: {client_ip}")
```
---
## 📝 文档整合
**新增目录结构**:
```
docs/
├── README.md # 文档索引
├── deployment/ # 部署相关文档
│ ├── DEPLOYMENT.md
│ ├── QUICK_DEPLOY.md
│ └── ...
└── archive/ # 历史版本文档
├── DEPLOY_v2.4.0.md
├── DEVELOP_v2.4.1_TAB_FEATURE.md
├── NEWS_FEATURE_v2.2.md
└── WORK_PROGRESS_20250130.md
```
**整合原因**: 简化根目录,提高可维护性
---
## 🐛 已知问题和注意事项
### 1. 内存存储限制
当前使用内存存储频率限制数据,重启应用后清空。
**生产环境建议**:
- 使用Redis存储持久化
- 使用Flask-Limiter扩展自带Redis支持
**Redis集成示例**:
```python
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address
limiter = Limiter(
app,
key_func=get_remote_address,
storage_uri="redis://localhost:6379"
)
@app.route('/api/fetch-news/<code>')
@limiter.limit("3 per hour")
def fetch_news_for_site(code):
...
```
### 2. 验证码体验
当前简单验证码仅用于开发测试,生产环境必须配置实际验证码服务。
### 3. CDN缓存
如果使用CDN确保`/api/fetch-news/*`路径不被缓存:
- Cloudflare: Page Rules设置`Cache Level: Bypass`
- 阿里云CDN: 配置缓存规则排除API路径
---
## 🎯 未来改进
### 短期 (1周内)
- [ ] 配置Redis存储替换内存存储
- [ ] 配置生产环境验证码服务reCAPTCHA或hCaptcha
- [ ] 添加请求日志记录和监控
- [ ] 优化前端错误提示UI
### 中期 (1个月)
- [ ] 实现验证码UI组件
- [ ] 添加管理后台查看API调用统计
- [ ] 实现白名单机制管理员IP不限制
- [ ] 添加用户友好的限流提示页面
### 长期 (3个月+)
- [ ] 实现基于用户账号的限流(登录用户更高额度)
- [ ] API调用成本统计和预警
- [ ] 智能频率调整(基于历史行为)
- [ ] 分布式限流支持
---
## 📞 技术支持
- **开发者**: Claude Code
- **版本**: v2.6.0
- **发布日期**: 2026-02-06
---
## ✅ 部署检查清单
- [ ] 已安装Flask-Limiter依赖
- [ ] 已更新app.py代码
- [ ] 已更新detail_new.html模板
- [ ] 已添加utils/rate_limiter.py
- [ ] 已更新requirements.txt
- [ ] 应用重启成功
- [ ] 详情页不再自动加载新闻
- [ ] 点击按钮可以加载新闻
- [ ] 连续请求触发频率限制
- [ ] 错误提示正常显示
- [ ] (可选)已配置验证码服务
- [ ] 可选已配置Redis存储
---
**祝部署顺利v2.6将大幅降低API成本。** 🎉
*最后更新: 2026-02-06*

View File

@@ -0,0 +1,408 @@
# ZJPB v2.2.0 - 新闻搜索功能
**版本**: v2.2.0
**发布日期**: 2025-01-30
**主要功能**: 集成博查Web Search API自动获取网站相关新闻
---
## 📋 功能概述
v2.2.0版本引入了全新的新闻搜索和展示功能通过博查AI搜索引擎API自动为每个网站获取最新的相关新闻并在网站详情页进行展示。
### ✨ 核心特性
1. **智能新闻搜索** 🔍
- 基于网站名称自动搜索相关新闻
- 支持自定义搜索时间范围(一天、一周、一月、一年)
- 自动排除网站自身的内容,确保新闻来源多样性
2. **新闻管理系统** 📰
- 后台新闻列表管理
- 支持手动编辑和删除新闻
- 新闻来源信息展示(网站名称、图标)
3. **前台新闻展示** 🎨
- 网站详情页展示最多5条相关新闻
- 显示新闻标题、摘要、来源、发布时间
- 点击新闻直接跳转到原文链接
4. **定期任务支持**
- 提供cron任务脚本支持定期批量获取新闻
- 可配置获取数量、时间范围等参数
---
## 🚀 快速开始
### 1. 配置博查API
`.env`文件中添加博查API配置
```env
# 博查 Web Search API配置
BOCHA_API_KEY=sk-your-api-key-here
BOCHA_BASE_URL=https://api.bocha.cn
```
获取API Key访问 [博查AI开放平台](https://open.bocha.cn) 注册并获取API密钥。
### 2. 数据库迁移
运行迁移脚本为News表添加新字段
```bash
python migrate_news_fields.py
```
迁移会添加以下字段:
- `source_name`: 新闻来源网站名称
- `source_icon`: 新闻来源网站图标URL
### 3. 测试新闻获取
#### 方法1使用Python测试脚本
```bash
# 测试NewsSearcher类
python utils/news_searcher.py
```
#### 方法2使用后台API
登录后台后使用API接口
**单个网站获取新闻**
```bash
curl -X POST http://localhost:5000/api/fetch-site-news \
-H "Content-Type: application/json" \
-d '{
"site_id": 1,
"count": 10,
"freshness": "oneMonth"
}'
```
**批量获取新闻**
```bash
curl -X POST http://localhost:5000/api/fetch-all-news \
-H "Content-Type: application/json" \
-d '{
"count": 5,
"freshness": "oneMonth",
"limit": 10
}'
```
### 4. 查看新闻
1. 访问任意网站详情页(例如:`http://localhost:5000/site/12345678`
2. 滚动到页面下方,查看"相关新闻"部分
3. 点击新闻标题或"阅读全文"链接跳转到原文
---
## 📖 使用指南
### 后台管理
#### 新闻管理界面
1. 登录后台:`http://localhost:5000/admin`
2. 点击左侧菜单"新闻管理"
3. 可以查看、编辑、删除已获取的新闻
**新闻列表字段**
- ID
- 关联网站
- 新闻标题
- 来源网站
- 新闻类型
- 发布时间
- 是否启用
#### 手动获取新闻
虽然提供了API接口但目前没有直接的后台UI按钮。可以通过以下方式触发
1. 使用API接口参见快速开始
2. 使用定期任务脚本(参见下文)
### 定期任务设置
使用`fetch_news_cron.py`脚本定期自动获取新闻。
#### 手动执行
```bash
# 默认参数处理10个网站每个网站获取5条新闻时间范围一个月
python fetch_news_cron.py
# 自定义参数
python fetch_news_cron.py --limit 20 --count 10 --freshness oneWeek
```
**参数说明**
- `--limit`: 处理的网站数量限制默认10
- `--count`: 每个网站获取的新闻数量默认5
- `--freshness`: 新闻时间范围可选noLimit, oneDay, oneWeek, oneMonth, oneYear
#### 配置Crontab
在Linux服务器上配置定期任务
```bash
# 编辑crontab
crontab -e
# 添加以下行每天早上8点执行
0 8 * * * cd /opt/1panel/apps/zjpb && /opt/1panel/apps/zjpb/venv/bin/python fetch_news_cron.py --limit 10 >> logs/news_fetch.log 2>&1
# 或每6小时执行一次
0 */6 * * * cd /opt/1panel/apps/zjpb && /opt/1panel/apps/zjpb/venv/bin/python fetch_news_cron.py --limit 20 >> logs/news_fetch.log 2>&1
```
**注意**
- 确保创建`logs`目录:`mkdir -p logs`
- 修改路径为实际的项目路径
- 根据API配额合理设置执行频率
---
## 🗂️ 文件结构
### 新增文件
```
zjpb/
├── utils/
│ └── news_searcher.py # 博查API封装类
├── migrate_news_fields.py # 数据库迁移脚本
├── fetch_news_cron.py # 定期任务脚本
└── NEWS_FEATURE_v2.2.md # 本文档
```
### 修改文件
```
zjpb/
├── config.py # 添加博查API配置
├── models.py # News模型添加source_name/source_icon字段
├── app.py # 添加新闻获取API路由更新NewsAdmin
└── templates/
└── detail_new.html # 优化新闻展示UI
```
---
## 🔧 技术实现
### API集成
使用博查Web Search API进行新闻搜索
- **接口地址**: `https://api.bocha.cn/v1/web-search`
- **认证方式**: Bearer Token
- **请求方法**: POST
- **返回格式**: JSON
### 数据模型
News模型字段
| 字段 | 类型 | 说明 |
|------|------|------|
| id | Integer | 主键 |
| site_id | Integer | 关联网站ID外键 |
| title | String(200) | 新闻标题 |
| content | Text | 新闻内容/摘要 |
| news_type | String(50) | 新闻类型 |
| url | String(500) | 新闻链接 |
| source_name | String(100) | ⭐ 来源网站名称(新增) |
| source_icon | String(500) | ⭐ 来源网站图标(新增) |
| published_at | DateTime | 发布时间 |
| is_active | Boolean | 是否启用 |
| created_at | DateTime | 创建时间 |
| updated_at | DateTime | 更新时间 |
### API路由
**1. 单个网站获取新闻**
- **路径**: `/api/fetch-site-news`
- **方法**: POST
- **权限**: 需要登录
- **参数**:
```json
{
"site_id": 1,
"count": 10,
"freshness": "oneMonth"
}
```
**2. 批量获取新闻**
- **路径**: `/api/fetch-all-news`
- **方法**: POST
- **权限**: 需要登录
- **参数**:
```json
{
"count": 5,
"freshness": "oneMonth",
"limit": 10
}
```
---
## 📊 配置选项
在`config.py`中的新闻相关配置:
```python
# 博查 Web Search API配置
BOCHA_API_KEY = os.environ.get('BOCHA_API_KEY')
BOCHA_BASE_URL = os.environ.get('BOCHA_BASE_URL') or 'https://api.bocha.cn'
BOCHA_SEARCH_ENDPOINT = '/v1/web-search'
# 新闻搜索配置
NEWS_SEARCH_COUNT = 10 # 每次搜索返回的新闻数量
NEWS_SEARCH_FRESHNESS = 'oneMonth' # 默认搜索一个月内的新闻
NEWS_SEARCH_SUMMARY = True # 是否显示摘要
```
---
## ⚠️ 注意事项
### API配额限制
- 博查API根据充值金额有请求频率限制
- 建议合理设置定期任务频率,避免过度消耗配额
- 详情参见:[博查API定价](https://open.bocha.cn)
### 去重机制
系统会根据新闻URL自动去重同一条新闻不会重复保存。
### 搜索策略
- 搜索关键词:`{网站名称} 最新 新闻`
- 自动排除:网站自身域名的内容
- 时间优先:优先显示最新发布的新闻
### 性能优化
- 批量获取时建议限制数量(`--limit 10-20`
- 避免短时间内频繁调用API
- 数据库查询已优化,使用索引和去重
---
## 🐛 故障排查
### 1. 新闻获取失败
**可能原因**
- 博查API Key未配置或无效
- API配额不足
- 网络连接问题
**解决方法**
```bash
# 检查环境变量
python -c "import os; from dotenv import load_dotenv; load_dotenv(); print(os.getenv('BOCHA_API_KEY'))"
# 测试API连接
python utils/news_searcher.py
```
### 2. 数据库字段不存在
**错误信息**`Unknown column 'source_name' in 'field list'`
**解决方法**
```bash
# 运行数据库迁移
python migrate_news_fields.py
```
### 3. 详情页不显示新闻
**可能原因**
- 数据库中没有该网站的新闻记录
- 新闻被设置为不启用is_active=False
**解决方法**
```bash
# 为该网站获取新闻
curl -X POST http://localhost:5000/api/fetch-site-news \
-H "Content-Type: application/json" \
-d '{"site_id": YOUR_SITE_ID}'
```
### 4. 定期任务不执行
**检查清单**
- [ ] Crontab配置是否正确
- [ ] Python路径是否正确
- [ ] 日志文件是否有写入权限
- [ ] 查看cron日志`grep CRON /var/log/syslog`
---
## 📈 未来改进
### 计划功能
- [ ] 后台UI按钮直接触发新闻获取
- [ ] 新闻分类和标签支持
- [ ] 新闻摘要AI优化
- [ ] 新闻热度排序
- [ ] 用户收藏新闻功能
- [ ] 新闻RSS订阅
### 性能优化
- [ ] 使用异步任务队列Celery
- [ ] 新闻缓存机制
- [ ] 图片CDN加速
---
## 📞 技术支持
- **项目名称**: ZJPB - 焦提示词 | AI工具导航
- **版本**: v2.2.0
- **发布日期**: 2025-01-30
- **博查API文档**: https://bocha-ai.feishu.cn/wiki/RXEOw02rFiwzGSkd9mUcqoeAnNK
---
## 📝 更新日志
### v2.2.0 (2025-01-30)
**新增**
- ✨ 集成博查Web Search API
- ✨ 新闻自动搜索和存储功能
- ✨ News模型添加source_name和source_icon字段
- ✨ 网站详情页新闻展示优化
- ✨ 后台新闻管理界面增强
- ✨ 定期任务脚本fetch_news_cron.py
- ✨ API路由/api/fetch-site-news 和 /api/fetch-all-news
**修改**
- 🔧 config.py添加博查API配置
- 🔧 NewsAdmin添加source_name字段显示
- 🔧 detail_new.html优化新闻展示UI
**文档**
- 📖 NEWS_FEATURE_v2.2.md 功能文档
- 📖 migrate_news_fields.py 迁移脚本文档
---
**祝您使用愉快!** 🎉

View File

@@ -0,0 +1,427 @@
# ZJPB v2.1.0 开发进度记录
**日期**: 2025-01-30
**版本**: v2.1.0
**状态**: 部署进行中90%完成)
---
## 📋 本次开发内容总结
### 新增功能
1. **Prompt管理系统**
- 新增 `prompt_templates` 数据库表
- 后台新增"Prompt管理"菜单
- 可管理AI提示词模板标签生成、功能生成、详细介绍生成
- 默认初始化3条模板数据
2. **页脚优化**
- 添加ICP备案号浙ICP备2025154782号-1
- 添加Microsoft Clarity统计代码ID: uoa2j40sf0
- 更新版权年份为2025
- 优化页脚链接文字(中文化)
3. **图标优化**
- 详情页Material Icons → Emoji
- 替换图标:`arrow_back``←`, `north_east``↗`, `visibility``👁`, `calendar_today``📅`
- 首页已使用emoji但有CSS残留待上传修复文件
4. **标签显示修复**
- 修复编辑页/创建页标签名称无法显示问题
- 使用正则表达式提取 `<Tag XXX>` 格式中的标签名称
- 修改文件:`templates/admin/site/create.html`, `templates/admin/site/edit.html`
---
## ✅ 已完成的工作
### 代码开发
- [x] 创建 `PromptTemplate` 模型(`models.py`
- [x] 创建数据库迁移脚本(`migrate_prompts.py`
- [x] 添加 `PromptAdmin` 管理视图(`app.py`
- [x] 修复详情页图标(`templates/detail_new.html`
- [x] 修复标签显示问题(`templates/admin/site/create.html`, `edit.html`
- [x] 优化页脚(`templates/base_new.html`
- [x] 完善 `TagGenerator` 类,添加 `generate_description` 方法
### Git管理
- [x] Git提交所有修改Commit ID: `9f5d006`
- [x] Git提交信息`release: v2.1.0 - Prompt管理系统、页脚优化、图标修复`
- [x] 文件统计23 files changed, 5868 insertions(+), 96 deletions(-)
### 服务器部署
- [x] 配置Git用户信息
- [x] 恢复Git stash
- [x] 提交代码到服务器Git仓库
- [x] 安装新依赖:`markdown`, `pypinyin`, `gunicorn`
- [x] 运行数据库迁移(成功创建 `prompt_templates` 表及3条数据
- [x] 修复 `manage.sh` 路径配置(`/www/wwwroot/zjpb``/opt/1panel/apps/zjpb`
- [x] 修复gunicorn启动命令`app:app``wsgi:app`
- [x] 应用成功启动PID: 20+
---
## ✅ 已验证功能
1. **页脚ICP备案号** ✅ - 正常显示
2. **Microsoft Clarity统计** ✅ - 已加载
3. **详情页图标** ✅ - 全部为emoji
4. **搜索功能** ✅ - 正常工作
5. **数据库迁移** ✅ - 表和数据创建成功
6. **应用运行状态** ✅ - 服务正常
---
## 🔄 待完成任务
### 1. 上传缺失的文件(重要!)
需要上传以下2个文件到服务器
**文件1**: `templates/index_new.html`
- **本地路径**: `D:\315mac\Code\zjpb\templates\index_new.html`
- **服务器路径**: `/opt/1panel/apps/zjpb/templates/index_new.html`
- **原因**: 删除Material Icons残留CSS第259-261行已删除
- **作用**: 修复首页图标显示问题
**文件2**: `utils/tag_generator.py`
- **本地路径**: `D:\315mac\Code\zjpb\utils\tag_generator.py`
- **服务器路径**: `/opt/1panel/apps/zjpb/utils/tag_generator.py`
- **原因**: 包含完整的 `generate_description` 方法第150-219行
- **作用**: 修复AI生成详细介绍报错'TagGenerator' object has no attribute 'generate_description'
**上传后执行**:
```bash
cd /opt/1panel/apps/zjpb
./manage.sh restart
```
### 2. 待验证功能
**后台Prompt管理**:
- [ ] 检查后台左侧菜单是否有"Prompt管理"
- [ ] 点击进入查看是否有3条记录
- 标签生成 (id: 1)
- 主要功能生成 (id: 2)
- 详细介绍生成 (id: 3)
**标签显示验证**:
- [ ] 后台 → 网站管理 → 编辑任意网站
- [ ] 检查标签区域是否显示蓝色标签带文字
- [ ] 不应该是空白蓝框
**AI功能测试**:
- [ ] 测试"AI生成标签"按钮
- [ ] 测试"AI生成详细介绍"按钮需要先上传tag_generator.py
- [ ] 测试"AI生成主要功能"按钮
**首页图标验证**:
- [ ] 清除浏览器缓存Ctrl+Shift+Delete
- [ ] 强制刷新首页Ctrl+F5
- [ ] 检查首页卡片图标是否为emoji需要先上传index_new.html
---
## 📊 数据库变更
### 新增表: `prompt_templates`
```sql
CREATE TABLE prompt_templates (
id INTEGER NOT NULL AUTO_INCREMENT,
`key` VARCHAR(50) NOT NULL COMMENT '唯一标识(tags/features/description)',
name VARCHAR(100) NOT NULL COMMENT '模板名称',
system_prompt TEXT NOT NULL COMMENT '系统提示词',
user_prompt_template TEXT NOT NULL COMMENT '用户提示词模板(支持变量)',
description VARCHAR(200) COMMENT '模板说明',
is_active BOOL COMMENT '是否启用',
created_at DATETIME COMMENT '创建时间',
updated_at DATETIME COMMENT '更新时间',
PRIMARY KEY (id),
UNIQUE (`key`)
)
```
### 已插入的默认数据3条
| ID | Key | Name | Description |
|----|-----|------|-------------|
| 1 | tags | 标签生成 | 根据网站名称和描述生成3-5个分类标签 |
| 2 | features | 主要功能生成 | 根据网站名称和描述生成5-8个主要功能点 |
| 3 | description | 详细介绍生成 | 根据网站名称和简短描述生成200-400字的详细介绍 |
---
## 🔧 服务器配置信息
### 基本信息
- **服务器路径**: `/opt/1panel/apps/zjpb`(不是 `/www/wwwroot/zjpb`
- **Python虚拟环境**: `/opt/1panel/apps/zjpb/venv`
- **Git版本**: 2.43.0
- **Git用户**: `ZJPB Admin <admin@zjpb.net>`
### 已安装的依赖
- Flask==3.0.0
- Flask-SQLAlchemy==3.1.1
- Flask-Admin==1.6.1
- Flask-Login==0.6.3
- pymysql==1.1.0
- python-dotenv==1.0.0
- Werkzeug==3.0.1
- cryptography==41.0.7
- WTForms==2.3.3
- requests==2.31.0
- beautifulsoup4==4.12.2
- Pillow>=10.2.0
- openai>=1.0.0
- **markdown==3.10** (新增)
- **pypinyin==0.51.0** (已有)
- **gunicorn==21.2.0** (已有)
### 应用管理脚本
- **启动**: `./manage.sh start`
- **停止**: `./manage.sh stop`
- **重启**: `./manage.sh restart`
- **状态**: `./manage.sh status`
- **日志**: `./manage.sh logs`
### 配置文件修复记录
1. `manage.sh` - 路径已修复为 `/opt/1panel/apps/zjpb`
2. `gunicorn_config.py` - 路径已修复
3. `deploy.sh` - 路径已修复
4. `manage.sh` - 启动命令已修复为 `wsgi:app`
---
## 📝 Git提交记录
### 最新提交(服务器)
```
Commit: 9f5d006
Author: ZJPB Admin <admin@zjpb.net>
Date: 2025-12-30 01:21:xx
release: v2.1.0 - Prompt管理系统、页脚优化、图标修复
23 files changed, 5868 insertions(+), 96 deletions(-)
新增文件:
- DEPLOYMENT.md
- DEPLOY_CHECKLIST.md
- INCREMENTAL_DEPLOY.md
- QUICK_DEPLOY.md
- deploy.sh
- export_data.py
- git_patch_deploy.sh
- gunicorn_config.py
- manage.sh
- migrate_db.py
- migrate_prompts.py
- nul
- one_click_deploy.sh
- templates/admin/change_password.html
- test_deepseek.py
- v2.1.0.patch
- wsgi.py
```
### 本地提交(待推送)
```
Commit: 30b1ef7
Tag: v2.1.0
release: v2.1.0 - Prompt管理系统、页脚优化、图标修复
新增功能:
- Prompt管理后台新增Prompt模板管理功能
- 数据库迁移新增prompt_templates表及默认数据
- 页脚优化添加ICP备案号和Microsoft Clarity统计
- 图标修复详情页Material Icons替换为Emoji
- 标签显示:修复编辑页标签名称无法显示的问题
```
---
## 🐛 已知问题
### 1. 首页图标CSS残留
- **状态**: 待修复(需上传文件)
- **文件**: `templates/index_new.html`
- **问题**: 第259-261行有Material Icons CSS残留
- **解决方案**: 已删除,需上传到服务器
### 2. AI生成详细介绍报错
- **状态**: 待修复(需上传文件)
- **文件**: `utils/tag_generator.py`
- **错误**: `'TagGenerator' object has no attribute 'generate_description'`
- **原因**: 服务器版本缺少该方法
- **解决方案**: 上传包含完整方法的文件
### 3. Git Stash残留
- **状态**: 已处理
- **位置**: 服务器还有1个stash备份 `stash@{1}`
- **建议**: 可以保留作为备份,或清理:`git stash clear`
---
## 📂 关键文件清单
### 已修改的文件(本地最新)
1. `app.py` - 新增PromptAdmin视图
2. `models.py` - 新增PromptTemplate模型
3. `migrate_prompts.py` - 数据库迁移脚本
4. `templates/base_new.html` - 页脚优化
5. `templates/detail_new.html` - 图标修复
6. `templates/index_new.html` - 删除CSS残留
7. `templates/admin/site/create.html` - 标签显示修复
8. `templates/admin/site/edit.html` - 标签显示修复
9. `utils/tag_generator.py` - 完整的AI生成方法
10. `requirements.txt` - 依赖清单未变更markdown未加入
### 新增的文件
1. `migrate_prompts.py` - Prompt表迁移脚本
2. `INCREMENTAL_DEPLOY.md` - 增量部署指南
3. `GIT_PATCH_DEPLOY.md` - Git Patch部署指南
4. `MANUAL_DEPLOY.md` - 手动部署指南
5. `CHECK_GIT.md` - Git检查指南
6. `one_click_deploy.sh` - 一键部署脚本
7. `git_patch_deploy.sh` - Git patch部署脚本
8. `quick_deploy_server.sh` - 服务器快速部署脚本
---
## 🚀 下次继续工作的步骤
### 立即执行5分钟
1. **上传缺失文件**使用1Panel文件管理器:
```
本地 → 服务器
D:\315mac\Code\zjpb\templates\index_new.html
→ /opt/1panel/apps/zjpb/templates/index_new.html
D:\315mac\Code\zjpb\utils\tag_generator.py
→ /opt/1panel/apps/zjpb/utils/tag_generator.py
```
2. **重启应用**SSH或1Panel终端:
```bash
cd /opt/1panel/apps/zjpb
./manage.sh restart
./manage.sh status
```
3. **清除浏览器缓存** (Ctrl+Shift+Delete 或 Ctrl+F5)
### 验证功能5分钟
1. **验证Prompt管理**:
- 登录 `/admin/login`
- 检查"Prompt管理"菜单
- 查看3条记录
2. **验证标签显示**:
- 后台 → 网站管理 → 编辑
- 检查标签是否显示名称
3. **验证AI功能**:
- 测试3个AI生成按钮
- 确保都能正常工作
4. **验证首页图标**:
- 刷新首页
- 检查所有图标是否为emoji
### 可选优化(未来)
- [ ] 将 `markdown` 添加到 `requirements.txt`
- [ ] 清理服务器上的临时文件(`nul`, `test_deepseek.py`, `*.patch`
- [ ] 配置Git远程仓库GitHub/Gitee用于版本管理
- [ ] 优化gunicorn配置worker数量、超时时间等
- [ ] 设置应用自动启动systemd service
---
## 💡 技术要点记录
### Git Stash恢复
```bash
git stash list # 查看stash列表
git stash pop # 恢复最新stash
git stash apply # 恢复但不删除stash
git stash clear # 清除所有stash
```
### 正则表达式提取标签
```javascript
// 从 <Tag XXX> 格式提取标签名称
const match = tagText.match(/<Tag\s+(.+?)>/);
if (match) {
tagText = match[1]; // 提取 "XXX"
}
```
### Flask-Admin模型repr格式
```python
# Tag模型的__repr__返回
def __repr__(self):
return f'<Tag {self.name}>'
# 在Flask-Admin select中显示为<Tag 图像生成>
# 需要JavaScript提取实际标签名
```
### Gunicorn启动配置
```python
# wsgi.py - 正确的应用入口
from app import create_app
app = create_app(os.getenv('FLASK_ENV', 'production'))
# manage.sh - 正确的启动命令
gunicorn -c gunicorn_config.py wsgi:app
```
---
## 📞 联系信息
- **项目名称**: ZJPB - 焦提示词 | AI工具导航
- **ICP备案号**: 浙ICP备2025154782号-1
- **统计代码**: Microsoft Clarity (ID: uoa2j40sf0)
- **数据库**: ai_nav @ 112.124.42.38 (MySQL)
- **服务器路径**: /opt/1panel/apps/zjpb
---
## 📚 相关文档
- `INCREMENTAL_DEPLOY.md` - 增量部署完整指南
- `GIT_PATCH_DEPLOY.md` - Git Patch部署方案
- `MANUAL_DEPLOY.md` - 手动上传部署方案
- `CHECK_GIT.md` - Git环境检查指南
- `DEPLOYMENT.md` - 通用部署文档
- `QUICK_DEPLOY.md` - 1Panel快速部署
---
## ✅ 部署完成度
**总体进度**: 90%
| 任务 | 状态 |
|------|------|
| 代码开发 | ✅ 100% |
| Git提交 | ✅ 100% |
| 服务器配置 | ✅ 100% |
| 数据库迁移 | ✅ 100% |
| 应用启动 | ✅ 100% |
| 文件上传 | ⏳ 80% (缺2个文件) |
| 功能验证 | ⏳ 60% (部分已验证) |
**预计剩余时间**: 10分钟上传文件+验证)
---
**最后更新**: 2025-01-30 01:30
**下次继续**: 上传2个文件 → 重启应用 → 验证功能 → 完成部署 🎉