v2.0: 架构大版本升级

任务 3.2+3.3: 飞书入口迁移到 MessagePipeline
- feishu_bot.py 改用 pipeline.handle_message(去掉 30 行会话管理代码)
- feishu_longconn_service.py 改用 pipeline.handle_message(去掉 25 行)
- 各入口只负责协议适配,业务逻辑统一在 Pipeline

任务 5: 统一配置管理
- 新增 src/config/config_service.py(ConfigService 单例)
- 优先级:环境变量 > system_settings.json > 代码默认值
- 支持点号分隔的嵌套 key、自动类型转换

任务 8: 密码哈希升级
- SHA-256  bcrypt(User.set_password/check_password)
- AuthManager.hash_password/verify_password 同步升级
- 兼容旧密码:登录时检测 SHA-256 格式,验证通过后自动升级为 bcrypt
- auth_manager.secret_key 改为从环境变量读取

任务 9: 前端事件总线
- TSPDashboard 新增 on/off/emit 方法
- 模块间可通过事件通信,不再只靠直接读写共享状态

README.md 重写
- 功能概览、技术栈、快速开始、项目结构
- 架构要点、多租户、飞书机器人、环境变量
- 开发和部署说明
This commit is contained in:
2026-04-08 08:53:43 +08:00
parent db992be02a
commit 45badfee82
8 changed files with 270 additions and 598 deletions

View File

@@ -18,16 +18,21 @@ class AuthManager:
"""认证管理器"""
def __init__(self):
self.secret_key = "your-secret-key-change-this-in-production" # 应该从配置中读取
import os
self.secret_key = os.environ.get('SECRET_KEY', 'change-this-in-production')
self.token_expiry = timedelta(hours=24)
def hash_password(self, password: str) -> str:
"""密码哈希"""
return hashlib.sha256(password.encode()).hexdigest()
"""密码哈希bcrypt"""
import bcrypt
return bcrypt.hashpw(password.encode(), bcrypt.gensalt()).decode()
def verify_password(self, password: str, password_hash: str) -> bool:
"""验证密码"""
return self.hash_password(password) == password_hash
"""验证密码(兼容旧 SHA-256"""
import bcrypt
if password_hash and password_hash.startswith('$2b$'):
return bcrypt.checkpw(password.encode(), password_hash.encode())
return hashlib.sha256(password.encode()).hexdigest() == password_hash
def generate_token(self, user_data: dict) -> str:
"""生成JWT token"""

View File

@@ -294,12 +294,21 @@ class User(Base):
last_login = Column(DateTime)
def set_password(self, password):
"""设置密码哈希"""
self.password_hash = hashlib.sha256(password.encode()).hexdigest()
"""设置密码哈希bcrypt"""
import bcrypt
self.password_hash = bcrypt.hashpw(password.encode(), bcrypt.gensalt()).decode()
def check_password(self, password):
"""验证密码"""
return self.password_hash == hashlib.sha256(password.encode()).hexdigest()
"""验证密码(兼容旧 SHA-256 格式,验证通过后自动升级为 bcrypt"""
import bcrypt
if self.password_hash and self.password_hash.startswith('$2b$'):
return bcrypt.checkpw(password.encode(), self.password_hash.encode())
# 旧格式SHA-256
if self.password_hash == hashlib.sha256(password.encode()).hexdigest():
# 自动升级为 bcrypt
self.set_password(password)
return True
return False
def to_dict(self):
"""转换为字典格式用于API响应"""