Files
mkdocs/docs/Obsidian笔记体系/Projects/aitsc/wk2.md
2026-05-11 00:31:26 +08:00

227 lines
8.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
● 根据分析,promptsTemplates.py 的数据迁移确实是一个重要的中优先级改进。以下是详细的迁移方案和实施步骤:
📊 当前问题分析
promptsTemplates.py 的主要问题:
1. 安全漏洞:包含硬编码数据库密码(腾讯云:!Rjb12191,本地:123456)
2. 数据与代码混合:144KB 文件中约 4000 行是模板数据
3. 不规范的数据库连接:使用 pymysql 直接连接,而不是项目的 SQLAlchemy ORM
4. 冗余功能:既是数据存储又是初始化脚本
✅ 有利条件:
- 应用已通过 PromptTemplate.query 从数据库获取模板
- PromptTemplate 模型已在 models.py 中定义
- 项目已有完整的数据库迁移系统 (migrations/ 目录)
- 新的配置系统已就位
🎯 迁移实施计划
阶段一:数据提取和备份(30分钟)
1. 提取模板数据到 JSON
# 创建数据目录
mkdir -p /d/aaa/aitsc/data
# 手动或编写脚本提取 templates 列表到 JSON
# 将生成:data/prompt_templates.json
2. 备份现有数据库中的模板数据
# 创建备份脚本
from src.flask_prompt_master import create_app, db
from src.flask_prompt_master.models.models import PromptTemplate
import json
app = create_app()
with app.app_context():
templates = PromptTemplate.query.all()
data = [{
'name': t.name,
'description': t.description,
'category': t.category,
'industry': t.industry,
'profession': t.profession,
'sub_category': t.sub_category,
'system_prompt': t.system_prompt,
'is_default': t.is_default
} for t in templates]
with open('data/existing_templates_backup.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)
阶段二:创建安全初始化系统(45分钟)
1. 创建新的初始化脚本
# scripts/init_prompt_templates.py
import json
import os
from dotenv import load_dotenv
from src.flask_prompt_master import create_app, db
from src.flask_prompt_master.models.models import PromptTemplate
load_dotenv()
def init_from_json(json_file='data/prompt_templates.json'):
"""从JSON文件安全初始化模板数据"""
app = create_app()
with app.app_context():
# 检查数据库连接
if not db.session.bind:
raise ValueError("数据库连接未初始化")
# 加载模板数据
with open(json_file, 'r', encoding='utf-8') as f:
templates_data = json.load(f)
added_count = 0
skipped_count = 0
for template_data in templates_data:
# 检查是否已存在同名模板
existing = PromptTemplate.query.filter_by(
name=template_data['name']
).first()
if not existing:
template = PromptTemplate(**template_data)
db.session.add(template)
added_count += 1
else:
skipped_count += 1
try:
db.session.commit()
print(f"✅ 初始化完成:新增 {added_count} 条,跳过 {skipped_count} 条")
return True
except Exception as e:
db.session.rollback()
print(f"❌ 初始化失败:{e}")
return False
if __name__ == '__main__':
init_from_json()
2. 更新 promptsTemplates.py(保留向后兼容)
# 在 promptsTemplates.py 顶部添加
import warnings
warnings.warn(
"promptsTemplates.py 已弃用,请使用 scripts/init_prompt_templates.py",
DeprecationWarning
)
# 修改 init_db 函数,移除硬编码密码,调用新的初始化脚本
def init_db(database_type='local'):
"""向后兼容的初始化函数(重定向到新系统)"""
print("⚠️ 此函数已弃用,请使用新的初始化系统")
print("💡 运行: python scripts/init_prompt_templates.py")
# 或者直接调用新脚本
from scripts.init_prompt_templates import init_from_json
return init_from_json()
阶段三:环境配置和安全加固(30分钟)
1. 更新 .env.example 文件
# 移除真实凭据,使用占位符
DATABASE_URL=mysql+pymysql://username:password@host:port/database_name?charset=utf8mb4
LLM_API_KEY=sk-your-api-key-here
WX_SECRET=your-wx-secret-here
2. 确保 .env 不被提交
# 检查 .gitignore
echo ".env" >> /d/aaa/aitsc/.gitignore
echo ".env.*" >> /d/aaa/aitsc/.gitignore
echo "!*.example" >> /d/aaa/aitsc/.gitignore
3. 创建部署说明文档
# 模板数据初始化说明
## 新系统使用
4. 复制环境变量模板:`cp .env.example .env`
5. 编辑 .env 文件,填入真实凭据
6. 初始化模板数据:`python scripts/init_prompt_templates.py`
## 旧系统兼容
旧命令 `python src/flask_prompt_master/promptsTemplates.py [local|tencent]`
将自动重定向到新系统。
阶段四:测试和验证(30分钟)
7. 测试脚本
# tests/test_template_init.py
import pytest
from scripts.init_prompt_templates import init_from_json
from src.flask_prompt_master.models.models import PromptTemplate
def test_template_count():
"""测试模板数量是否正确"""
init_from_json('tests/test_templates.json')
count = PromptTemplate.query.count()
assert count > 0
def test_no_duplicates():
"""测试不会创建重复模板"""
init_from_json('tests/test_templates.json')
count1 = PromptTemplate.query.count()
init_from_json('tests/test_templates.json') # 再次运行
count2 = PromptTemplate.query.count()
assert count1 == count2 # 数量应不变
📅 实施时间表
┌──────┬────────────────┬──────────┬────────┐
│ 阶段 │ 任务 │ 预计时间 │ 优先级 │
├──────┼────────────────┼──────────┼────────┤
│ 1 │ 数据提取和备份 │ 30分钟 │ 高 │
├──────┼────────────────┼──────────┼────────┤
│ 2 │ 安全初始化脚本 │ 45分钟 │ 高 │
├──────┼────────────────┼──────────┼────────┤
│ 3 │ 环境配置加固 │ 30分钟 │ 高 │
├──────┼────────────────┼──────────┼────────┤
│ 4 │ 测试验证 │ 30分钟 │ 中 │
├──────┼────────────────┼──────────┼────────┤
│ 5 │ 文档更新 │ 15分钟 │ 中 │
├──────┼────────────────┼──────────┼────────┤
│ 总计 │ │ 2.5小时 │ │
└──────┴────────────────┴──────────┴────────┘
🔧 迁移后的架构
aitsc/
├── data/ # 数据文件目录
│ ├── prompt_templates.json # 模板数据(JSON格式)
│ └── existing_templates_backup.json
├── scripts/ # 管理脚本
│ ├── init_prompt_templates.py # 安全初始化脚本
│ └── backup_templates.py
├── src/flask_prompt_master/
│ └── promptsTemplates.py # 已弃用(保留兼容)
└── .env.example # 环境变量模板
⚠️ 风险和缓解措施
风险: 生产数据库已有模板数据
- 缓解: 初始化脚本检查重复,不会覆盖现有数据
风险: 依赖旧初始化流程的脚本
- 缓解: 保留 promptsTemplates.py 的兼容性包装
风险: JSON 文件可能过大
- 缓解: 可考虑分多个 JSON 文件或使用数据库种子
📝 下一步建议
立即行动:
8. 先备份现有数据库中的模板数据
9. 提取当前 promptsTemplates.py 中的模板到 JSON
10. 创建安全初始化脚本
验证后:
11. 在测试环境运行新系统
12. 更新部署文档
13. 全面替换旧系统
您希望我:
14. 立即开始实施这个迁移方案?
15. 先处理更高优先级的硬编码安全问题?
16. 还是您有其他特定的要求?
迁移完成后,项目的安全性、可维护性和部署便利性将显著提升。