1e1e5957e8
- Ips.vue: el-select 添加 width: 280px,修复网段下拉框过窄 - Ips.vue: query 参数 networkId → network_id(与 FastAPI snake_case 一致) - Scan.vue: el-select 用 network.id 代替整个 network 对象作为 value,修复切换网段不生效 - enhanced_scan_service.py: 替换失效的 scapy ARP 扫描为 arp-scan 命令;扫描结果自动创建缺失 IP 记录
72 lines
1.8 KiB
Python
72 lines
1.8 KiB
Python
from fastapi import FastAPI
|
|
from fastapi.middleware.cors import CORSMiddleware
|
|
from contextlib import asynccontextmanager
|
|
|
|
from app.core.config import settings
|
|
from app.core.database import engine, Base, SessionLocal
|
|
from app.api.v1 import api_router
|
|
|
|
# 导入所有模型确保创建表
|
|
from app.models.network import Network, IPAddress, ScanTask
|
|
from app.models.snmp import SNMPCredential, NetworkDevice, ARPEntry, MACAddressTable, DeviceInterface
|
|
from app.models.alert import Alert, AlertRule, WhitelistedMAC
|
|
from app.models.auth import User, UserRole, UserStatus, Permission, RolePermission, RefreshToken
|
|
from app.models.audit import AuditLog
|
|
|
|
|
|
@asynccontextmanager
|
|
async def lifespan(app: FastAPI):
|
|
"""应用生命周期管理"""
|
|
# 启动时创建数据库表
|
|
Base.metadata.create_all(bind=engine)
|
|
|
|
# 初始化默认管理员账户 + 默认权限
|
|
from app.services.user_service import UserService
|
|
db = SessionLocal()
|
|
try:
|
|
UserService.init_default_admin(db)
|
|
UserService.init_default_permissions(db)
|
|
print("✅ 系统初始化完成,默认管理员账户: admin / admin123")
|
|
finally:
|
|
db.close()
|
|
|
|
yield
|
|
# 关闭时清理
|
|
|
|
|
|
app = FastAPI(
|
|
title=settings.APP_NAME,
|
|
version=settings.APP_VERSION,
|
|
description="企业级IP地址管理系统",
|
|
lifespan=lifespan
|
|
)
|
|
|
|
# CORS 配置
|
|
app.add_middleware(
|
|
CORSMiddleware,
|
|
allow_origins=["*"],
|
|
allow_credentials=True,
|
|
allow_methods=["*"],
|
|
allow_headers=["*"],
|
|
)
|
|
|
|
# 注册 API 路由
|
|
app.include_router(api_router)
|
|
|
|
|
|
@app.get("/")
|
|
async def root():
|
|
"""根路径"""
|
|
return {
|
|
"name": settings.APP_NAME,
|
|
"version": settings.APP_VERSION,
|
|
"docs": "/docs",
|
|
"redoc": "/redoc"
|
|
}
|
|
|
|
|
|
@app.get("/health")
|
|
async def health_check():
|
|
"""健康检查"""
|
|
return {"status": "healthy"}
|