新增优化历史模块
This commit is contained in:
390
优化历史数据库升级指南.md
Normal file
390
优化历史数据库升级指南.md
Normal file
@@ -0,0 +1,390 @@
|
||||
# 优化历史功能数据库升级指南
|
||||
|
||||
## 📋 升级概述
|
||||
|
||||
将优化历史功能从localStorage本地存储升级到腾讯云MySQL数据库,实现跨设备同步、数据安全备份和高级分析功能。
|
||||
|
||||
## 🎯 升级优势
|
||||
|
||||
### 数据安全与可靠性
|
||||
- ✅ **数据备份**:自动备份到腾讯云,不会因浏览器清理而丢失
|
||||
- ✅ **跨设备同步**:登录后可在任何设备查看历史记录
|
||||
- ✅ **数据完整性**:事务保证,确保数据一致性
|
||||
|
||||
### 功能增强
|
||||
- ✅ **高级搜索**:支持全文搜索和多重筛选
|
||||
- ✅ **统计分析**:使用数据统计和分析报告
|
||||
- ✅ **收藏功能**:重要记录可收藏管理
|
||||
- ✅ **满意度评分**:记录用户对优化结果的满意度
|
||||
|
||||
### 性能优化
|
||||
- ✅ **分页加载**:大数据量时性能更好
|
||||
- ✅ **索引优化**:快速查询和检索
|
||||
- ✅ **缓存策略**:减少数据库压力
|
||||
|
||||
## 🗄️ 数据库设计
|
||||
|
||||
### 核心表结构
|
||||
|
||||
#### 1. optimization_history(优化历史表)
|
||||
```sql
|
||||
- id: 主键ID
|
||||
- user_id: 用户ID
|
||||
- original_text: 原始输入文本
|
||||
- optimized_text: 优化后文本
|
||||
- optimization_type: 优化类型
|
||||
- industry: 行业分类
|
||||
- profession: 职业分类
|
||||
- template_id: 使用的模板ID
|
||||
- satisfaction_rating: 满意度评分(1-5)
|
||||
- generation_time: 生成耗时(毫秒)
|
||||
- created_at: 创建时间
|
||||
```
|
||||
|
||||
#### 2. optimization_tags(标签表)
|
||||
```sql
|
||||
- id: 主键ID
|
||||
- history_id: 历史记录ID
|
||||
- tag_name: 标签名称
|
||||
- tag_type: 标签类型
|
||||
```
|
||||
|
||||
#### 3. optimization_favorites(收藏表)
|
||||
```sql
|
||||
- id: 主键ID
|
||||
- user_id: 用户ID
|
||||
- history_id: 历史记录ID
|
||||
- favorite_name: 收藏名称
|
||||
- notes: 备注
|
||||
```
|
||||
|
||||
#### 4. user_usage_stats(使用统计表)
|
||||
```sql
|
||||
- id: 主键ID
|
||||
- user_id: 用户ID
|
||||
- date: 统计日期
|
||||
- generation_count: 生成次数
|
||||
- total_time_saved: 节省时间(分钟)
|
||||
- avg_rating: 平均评分
|
||||
```
|
||||
|
||||
## 🚀 升级步骤
|
||||
|
||||
### 第一步:数据库准备
|
||||
|
||||
1. **创建数据库表**
|
||||
```bash
|
||||
# 执行SQL脚本
|
||||
mysql -h your_host -u your_username -p your_database < optimization_history_upgrade.sql
|
||||
```
|
||||
|
||||
2. **配置数据库连接**
|
||||
```python
|
||||
# 在config.py中配置腾讯云数据库
|
||||
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://username:password@host:port/database'
|
||||
```
|
||||
|
||||
### 第二步:代码部署
|
||||
|
||||
1. **安装新模型**
|
||||
```bash
|
||||
# 将新模型文件复制到项目
|
||||
cp src/flask_prompt_master/models/optimization_history.py /path/to/project/models/
|
||||
```
|
||||
|
||||
2. **注册API路由**
|
||||
```python
|
||||
# 在app.py中注册蓝图
|
||||
from src.flask_prompt_master.routes.optimization_history import optimization_history_bp
|
||||
app.register_blueprint(optimization_history_bp)
|
||||
```
|
||||
|
||||
3. **更新前端代码**
|
||||
```html
|
||||
<!-- 在generate.html中引入新的JS文件 -->
|
||||
<script src="{{ url_for('static', filename='js/optimization_history_db.js') }}"></script>
|
||||
```
|
||||
|
||||
### 第三步:数据迁移
|
||||
|
||||
1. **备份localStorage数据**
|
||||
```javascript
|
||||
// 在浏览器控制台运行
|
||||
function backupLocalStorage() {
|
||||
const history = JSON.parse(localStorage.getItem('optimization_history') || '[]');
|
||||
const stats = JSON.parse(localStorage.getItem('usage_stats') || '{}');
|
||||
|
||||
const backup = {
|
||||
timestamp: new Date().toISOString(),
|
||||
history: history,
|
||||
stats: stats,
|
||||
count: history.length
|
||||
};
|
||||
|
||||
// 下载备份文件
|
||||
const blob = new Blob([JSON.stringify(backup, null, 2)], {type: 'application/json'});
|
||||
const url = URL.createObjectURL(blob);
|
||||
const a = document.createElement('a');
|
||||
a.href = url;
|
||||
a.download = `optimization_history_backup_${new Date().toISOString().split('T')[0]}.json`;
|
||||
document.body.appendChild(a);
|
||||
a.click();
|
||||
document.body.removeChild(a);
|
||||
URL.revokeObjectURL(url);
|
||||
|
||||
console.log(`备份完成!共 ${history.length} 条记录`);
|
||||
return backup;
|
||||
}
|
||||
|
||||
backupLocalStorage();
|
||||
```
|
||||
|
||||
2. **执行数据迁移**
|
||||
```bash
|
||||
# 运行迁移脚本
|
||||
python migrate_localStorage_to_database.py
|
||||
```
|
||||
|
||||
### 第四步:功能测试
|
||||
|
||||
1. **基础功能测试**
|
||||
- ✅ 添加历史记录
|
||||
- ✅ 查看历史记录
|
||||
- ✅ 搜索和筛选
|
||||
- ✅ 删除记录
|
||||
- ✅ 评分功能
|
||||
|
||||
2. **高级功能测试**
|
||||
- ✅ 收藏功能
|
||||
- ✅ 统计分析
|
||||
- ✅ 数据导出
|
||||
- ✅ 跨设备同步
|
||||
|
||||
## 🔧 API接口文档
|
||||
|
||||
### 获取历史记录
|
||||
```http
|
||||
GET /api/optimization-history?page=1&per_page=20&search=关键词&date_filter=today&type_filter=提示词优化
|
||||
```
|
||||
|
||||
### 添加历史记录
|
||||
```http
|
||||
POST /api/optimization-history
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"original_text": "原始输入",
|
||||
"optimized_text": "优化结果",
|
||||
"optimization_type": "提示词优化",
|
||||
"industry": "科技",
|
||||
"profession": "产品经理",
|
||||
"tags": ["逻辑强化", "场景适配"]
|
||||
}
|
||||
```
|
||||
|
||||
### 更新评分
|
||||
```http
|
||||
PUT /api/optimization-history/{id}/rating
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"rating": 5
|
||||
}
|
||||
```
|
||||
|
||||
### 删除记录
|
||||
```http
|
||||
DELETE /api/optimization-history/{id}
|
||||
```
|
||||
|
||||
### 获取统计信息
|
||||
```http
|
||||
GET /api/optimization-history/stats?days=30
|
||||
```
|
||||
|
||||
## 📊 性能优化建议
|
||||
|
||||
### 数据库优化
|
||||
1. **索引优化**
|
||||
```sql
|
||||
-- 创建复合索引
|
||||
CREATE INDEX idx_user_type_created ON optimization_history (user_id, optimization_type, created_at);
|
||||
CREATE INDEX idx_user_rating ON optimization_history (user_id, satisfaction_rating);
|
||||
```
|
||||
|
||||
2. **分区表**(大数据量场景)
|
||||
```sql
|
||||
-- 按年份分区
|
||||
ALTER TABLE optimization_history PARTITION BY RANGE (YEAR(created_at)) (
|
||||
PARTITION p2024 VALUES LESS THAN (2025),
|
||||
PARTITION p2025 VALUES LESS THAN (2026),
|
||||
PARTITION p_future VALUES LESS THAN MAXVALUE
|
||||
);
|
||||
```
|
||||
|
||||
### 应用优化
|
||||
1. **缓存策略**
|
||||
```python
|
||||
# 使用Redis缓存热门数据
|
||||
from flask_caching import Cache
|
||||
|
||||
cache = Cache(app, config={'CACHE_TYPE': 'redis'})
|
||||
|
||||
@cache.memoize(timeout=300)
|
||||
def get_user_stats(user_id, days=30):
|
||||
# 缓存用户统计信息
|
||||
pass
|
||||
```
|
||||
|
||||
2. **分页优化**
|
||||
```python
|
||||
# 使用游标分页替代偏移分页
|
||||
def get_history_cursor(user_id, cursor=None, limit=20):
|
||||
query = OptimizationHistory.query.filter_by(user_id=user_id)
|
||||
if cursor:
|
||||
query = query.filter(OptimizationHistory.id < cursor)
|
||||
return query.order_by(OptimizationHistory.id.desc()).limit(limit).all()
|
||||
```
|
||||
|
||||
## 🔒 安全考虑
|
||||
|
||||
### 数据安全
|
||||
1. **SQL注入防护**
|
||||
```python
|
||||
# 使用参数化查询
|
||||
query = OptimizationHistory.query.filter(
|
||||
OptimizationHistory.original_text.contains(search_term)
|
||||
)
|
||||
```
|
||||
|
||||
2. **数据验证**
|
||||
```python
|
||||
# 验证输入数据
|
||||
def validate_history_data(data):
|
||||
if not data.get('original_text') or len(data['original_text']) > 10000:
|
||||
raise ValueError('原始文本长度不能超过10000字符')
|
||||
if data.get('satisfaction_rating') and not (1 <= data['satisfaction_rating'] <= 5):
|
||||
raise ValueError('评分必须在1-5之间')
|
||||
```
|
||||
|
||||
### 访问控制
|
||||
1. **用户权限验证**
|
||||
```python
|
||||
@login_required
|
||||
def get_optimization_history():
|
||||
# 确保用户只能访问自己的数据
|
||||
user_id = current_user.id
|
||||
# ...
|
||||
```
|
||||
|
||||
2. **API限流**
|
||||
```python
|
||||
from flask_limiter import Limiter
|
||||
|
||||
limiter = Limiter(app, key_func=lambda: current_user.id)
|
||||
|
||||
@limiter.limit("100 per hour")
|
||||
def add_optimization_history():
|
||||
# 限制每小时最多100次请求
|
||||
pass
|
||||
```
|
||||
|
||||
## 📈 监控与维护
|
||||
|
||||
### 性能监控
|
||||
1. **慢查询监控**
|
||||
```sql
|
||||
-- 开启慢查询日志
|
||||
SET GLOBAL slow_query_log = 'ON';
|
||||
SET GLOBAL long_query_time = 2;
|
||||
```
|
||||
|
||||
2. **应用监控**
|
||||
```python
|
||||
# 使用APM工具监控性能
|
||||
import time
|
||||
from functools import wraps
|
||||
|
||||
def monitor_performance(func):
|
||||
@wraps(func)
|
||||
def wrapper(*args, **kwargs):
|
||||
start_time = time.time()
|
||||
result = func(*args, **kwargs)
|
||||
execution_time = time.time() - start_time
|
||||
|
||||
if execution_time > 1.0: # 超过1秒记录
|
||||
current_app.logger.warning(f"Slow query: {func.__name__} took {execution_time:.2f}s")
|
||||
|
||||
return result
|
||||
return wrapper
|
||||
```
|
||||
|
||||
### 数据维护
|
||||
1. **定期清理**
|
||||
```python
|
||||
# 清理过期数据
|
||||
def cleanup_old_history():
|
||||
cutoff_date = datetime.utcnow() - timedelta(days=365)
|
||||
deleted_count = OptimizationHistory.query.filter(
|
||||
OptimizationHistory.created_at < cutoff_date
|
||||
).delete()
|
||||
db.session.commit()
|
||||
return deleted_count
|
||||
```
|
||||
|
||||
2. **数据备份**
|
||||
```bash
|
||||
# 定期备份数据库
|
||||
mysqldump -h your_host -u your_username -p your_database > backup_$(date +%Y%m%d).sql
|
||||
```
|
||||
|
||||
## 🎉 升级完成检查清单
|
||||
|
||||
### 功能验证
|
||||
- [ ] 历史记录正常显示
|
||||
- [ ] 搜索和筛选功能正常
|
||||
- [ ] 添加/删除记录功能正常
|
||||
- [ ] 评分功能正常
|
||||
- [ ] 收藏功能正常
|
||||
- [ ] 统计功能正常
|
||||
|
||||
### 性能验证
|
||||
- [ ] 页面加载速度正常
|
||||
- [ ] 大数据量分页正常
|
||||
- [ ] 搜索响应时间正常
|
||||
- [ ] 数据库连接稳定
|
||||
|
||||
### 安全验证
|
||||
- [ ] 用户权限控制正常
|
||||
- [ ] SQL注入防护有效
|
||||
- [ ] 数据验证正常
|
||||
- [ ] API限流正常
|
||||
|
||||
## 📞 技术支持
|
||||
|
||||
如果在升级过程中遇到问题,请:
|
||||
|
||||
1. **查看日志**
|
||||
```bash
|
||||
# 查看应用日志
|
||||
tail -f /path/to/app.log
|
||||
|
||||
# 查看数据库日志
|
||||
tail -f /var/log/mysql/error.log
|
||||
```
|
||||
|
||||
2. **检查配置**
|
||||
```python
|
||||
# 验证数据库连接
|
||||
from src.flask_prompt_master.models.optimization_history import OptimizationHistory
|
||||
print(OptimizationHistory.query.count())
|
||||
```
|
||||
|
||||
3. **联系技术支持**
|
||||
- 提供详细的错误信息
|
||||
- 提供相关的日志文件
|
||||
- 描述复现步骤
|
||||
|
||||
---
|
||||
|
||||
**升级完成后,用户将享受到更安全、更强大的优化历史功能!** 🚀
|
||||
Reference in New Issue
Block a user