391 lines
9.2 KiB
Markdown
391 lines
9.2 KiB
Markdown
# 优化历史功能数据库升级指南
|
||
|
||
## 📋 升级概述
|
||
|
||
将优化历史功能从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. **联系技术支持**
|
||
- 提供详细的错误信息
|
||
- 提供相关的日志文件
|
||
- 描述复现步骤
|
||
|
||
---
|
||
|
||
**升级完成后,用户将享受到更安全、更强大的优化历史功能!** 🚀
|