# ============================================================================= # 外部系统集成 — 凭据配置脚本 # ============================================================================= # 用法: # 1. 在下方填入真实凭据(替换 <填入...> 占位符) # 2. 保存文件 # 3. 运行:cd backend && python -m scripts.setup_integrations # # 说明: # - 脚本会将凭据写入 system_configs 数据库表 # - 已存在的配置键会更新,不会重复插入 # - 运行后可在管理后台 → 系统集成 页面查看和测试连接 # - 此文件已在 .gitignore 中排除,凭据不会提交到 Git # ============================================================================= # -------------------------------------------------------------------------- # 火绒企业版 — AccessKey 认证模式 # -------------------------------------------------------------------------- # 在火绒管理后台 → 系统设置 → API管理 中创建 AccessKey HUORONG = { # 火绒管理后台的内网API地址(含协议和端口) "base_url": "<填入火绒Base URL,如 http://huorong.oa.servyou-it.com/:8080>", # AccessKey ID(在火绒后台创建API密钥时生成) "access_key_id": "59O8K6NSUW", # AccessKey Secret(创建时仅显示一次,请妥善保管) "access_key_secret": "VXM7B878BDUN0P5P5KYC", } # -------------------------------------------------------------------------- # 联软LV7000 — 账号密码认证模式 # -------------------------------------------------------------------------- # 在联软管理后台 → 系统设置 → API管理 中创建API账号 LIANRUAN = { # 联软管理后台的内网API地址(含协议和端口,默认端口30098) "base_url": "<填入联软Base URL,如 http://192.168.x.x:30098>", # API账号 "api_account": "<填入API账号>", # API密码 "api_password": "<填入API密码>", # 验证密钥(部分版本需要,无则留空字符串) "validate_key": "", } # ========================================================================== # 以下为脚本逻辑,无需修改 # ========================================================================== import asyncio import sys import os # 将 backend 目录加入 Python 路径,以便导入 app 模块 sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) from sqlalchemy import select from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession from sqlalchemy.orm import sessionmaker async def upsert_config( session: AsyncSession, key: str, value: str, description: str, ) -> None: """插入或更新一条配置记录。 如果 key 已存在则更新 value,否则插入新记录。 Args: session: 数据库异步会话 key: 配置键(如 integration_huorong_base_url) value: 配置值 description: 配置说明 """ # 动态导入,避免在模块级别触发 app 初始化 from app.models.system_config import SystemConfig # 查询是否已存在该配置键 result = await session.execute( select(SystemConfig).where(SystemConfig.config_key == key) ) existing = result.scalar_one_or_none() if existing: # 已存在 → 更新值 existing.config_value = value print(f" ✏️ 更新: {key}") else: # 不存在 → 插入新记录 new_config = SystemConfig( config_key=key, config_value=value, description=description, ) session.add(new_config) print(f" ➕ 新增: {key}") async def setup_huorong(session: AsyncSession) -> None: """将火绒凭据写入数据库。 Args: session: 数据库异步会话 """ # 检查是否还是占位符 if HUORONG["base_url"].startswith("<"): print("⏭️ 火绒:跳过(凭据未填写)") return print("\n🔥 配置火绒企业版...") prefix = "integration_huorong_" await upsert_config(session, f"{prefix}base_url", HUORONG["base_url"], "火绒 Base URL") await upsert_config(session, f"{prefix}access_key_id", HUORONG["access_key_id"], "火绒 AccessKey ID") await upsert_config(session, f"{prefix}access_key_secret", HUORONG["access_key_secret"], "火绒 AccessKey Secret") await session.commit() print(" ✅ 火绒配置已保存") async def setup_lianruan(session: AsyncSession) -> None: """将联软凭据写入数据库。 Args: session: 数据库异步会话 """ # 检查是否还是占位符 if LIANRUAN["base_url"].startswith("<"): print("⏭️ 联软:跳过(凭据未填写)") return print("\n💻 配置联软LV7000...") prefix = "integration_lianruan_" await upsert_config(session, f"{prefix}base_url", LIANRUAN["base_url"], "联软 Base URL") await upsert_config(session, f"{prefix}api_account", LIANRUAN["api_account"], "联软 API账号") await upsert_config(session, f"{prefix}api_password", LIANRUAN["api_password"], "联软 API密码") await upsert_config(session, f"{prefix}validate_key", LIANRUAN["validate_key"], "联软 验证密钥") await session.commit() print(" ✅ 联软配置已保存") async def main() -> None: """脚本主入口:读取数据库连接 → 写入凭据配置。""" # 从 .env 或环境变量获取数据库连接地址 # 优先使用同步驱动(psycopg2),因为此脚本不需要异步数据库操作 database_url = os.environ.get("DATABASE_URL", "") # 如果是 postgresql:// 开头(同步驱动格式),转为 asyncpg 格式 if database_url.startswith("postgresql://"): database_url = database_url.replace("postgresql://", "postgresql+asyncpg://", 1) # 回退到本地开发默认值 if not database_url: database_url = "postgresql+asyncpg://postgres:postgres@localhost:5432/it_smart_desk" print(f"⚠️ 未设置 DATABASE_URL,使用默认值: {database_url}") print(f"📦 数据库: {database_url.split('@')[-1]}") # 只显示主机部分,隐藏密码 # 创建异步引擎和会话工厂 engine = create_async_engine(database_url, echo=False) async_session = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False) async with async_session() as session: await setup_huorong(session) await setup_lianruan(session) # 关闭引擎连接池 await engine.dispose() print("\n🎉 配置完成!请在管理后台 → 系统集成 中测试连接") if __name__ == "__main__": asyncio.run(main())