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

@@ -99,59 +99,36 @@ def _process_message_in_background(app, event_data: dict):
logger.info(f"[Feishu Bot] 清理后的消息内容: '{text_content}'")
# 3. 获取或创建该飞书用户的会话(支持群聊隔离)
chat_manager = service_manager.get_chat_manager()
# 获取发送者ID优先 open_iduser_id 可能为 None
# 3. 解析发送者信息
sender = event.get('sender', {})
sender_ids = sender.get('sender_id', {})
sender_open_id = sender_ids.get('open_id', '') or ''
sender_user_id = sender_ids.get('user_id', '') or ''
sender_id = sender_user_id or sender_open_id or 'unknown'
sender_type = sender.get('sender_type', 'user')
# 获取发送者姓名(用 open_id 查询)
sender_name = sender_id
try:
id_for_query = sender_open_id or sender_user_id
id_type = 'open_id' if sender_open_id else 'user_id'
if id_for_query:
user_info = feishu_service.get_user_info(id_for_query, id_type=id_type)
user_info = feishu_service.get_user_info(id_for_query, id_type='open_id' if sender_open_id else 'user_id')
sender_name = user_info.get('name') or user_info.get('en_name') or sender_id
except Exception as e:
logger.warning(f"[Feishu Bot] 获取发送者信息失败: {e}")
except Exception:
pass
logger.info(f"[Feishu Bot] 消息详情: 发送者={sender_name}({sender_id}), 群={chat_id}, 类型={chat_type_desc}, 租户={tenant_id}, 消息ID={message_id}")
logger.info(f"[Feishu Bot] 📝 消息内容: '{text_content}'")
# 群聊隔离:每个用户在每个群都有独立会话
user_id = f"feishu_{chat_id}_{sender_id}"
logger.info(f"[Feishu Bot] 发送者={sender_name}({sender_id}), 群={chat_id}, 租户={tenant_id}")
# 检查是否已有活跃会话
active_sessions = chat_manager.get_active_sessions()
session_id = None
for session in active_sessions:
if session.get('user_id') == user_id:
session_id = session.get('session_id')
# 更新会话的 tenant_id群可能重新绑定了租户
if session_id in chat_manager.active_sessions:
chat_manager.active_sessions[session_id]['tenant_id'] = tenant_id
logger.info(f"[Feishu Bot] 找到已有会话: {session_id}")
break
# 如果没有会话,创建新会话
if not session_id:
session_id = chat_manager.create_session(user_id=user_id, work_order_id=None, tenant_id=tenant_id)
logger.info(f"[Feishu Bot] 新建会话: {session_id}, 用户={sender_name}({sender_id}), 租户={tenant_id}")
# 4. 调用实时对话接口处理消息
response_data = chat_manager.process_message(
session_id=session_id,
user_message=text_content,
# 4. 使用 Pipeline 统一处理消息
pipeline = service_manager.get_pipeline()
response_data = pipeline.handle_message(
user_id=user_id,
message=text_content,
tenant_id=tenant_id,
chat_id=chat_id,
ip_address=f"feishu:{sender_id}:{sender_name}",
invocation_method=f"feishu_bot({chat_type})"
)
logger.info(f"[Feishu Bot] 处理结果: success={response_data.get('success')}, 用户={sender_name}")
logger.info(f"[Feishu Bot] 处理结果: success={response_data.get('success')}")
# 5. 提取回复并发送
if response_data.get("success"):