chore: initial baseline with P0-safety .gitignore

This commit is contained in:
Simon
2026-06-14 16:49:18 +08:00
commit 63262292d7
510 changed files with 146008 additions and 0 deletions
+182
View File
@@ -0,0 +1,182 @@
# =============================================================================
# 外部系统集成 — 凭据配置脚本
# =============================================================================
# 用法:
# 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())