diff --git a/backend/main.py b/backend/main.py new file mode 100644 index 0000000..f67c295 --- /dev/null +++ b/backend/main.py @@ -0,0 +1,74 @@ +""" +NAC 一键上链系统 - 主入口 +版本: 3.0 (真实注册/登录 + 多语言 + 17步工作流) +""" +import os +import logging +from fastapi import FastAPI +from fastapi.middleware.cors import CORSMiddleware +from fastapi.staticfiles import StaticFiles +from fastapi.responses import FileResponse +# 路由模块 +from routers import assets, onboarding, node +from routers.users import router as users_router + +# 日志配置 +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s [%(name)s] %(levelname)s: %(message)s', + handlers=[ + logging.StreamHandler(), + logging.FileHandler('/opt/nac/onboarding/logs/app.log', encoding='utf-8') + ] +) +logger = logging.getLogger('nac-onboarding') + +app = FastAPI( + title='NAC 一键资产上链系统', + description='基于NAC公链的RWA资产上链平台 - 17步完整工作流', + version='3.0.0', + docs_url='/api/docs', + redoc_url='/api/redoc' +) + +# CORS +app.add_middleware( + CORSMiddleware, + allow_origins=['*'], + allow_credentials=True, + allow_methods=['*'], + allow_headers=['*'], +) + +# API路由注册 +app.include_router(users_router, prefix='/api/users', tags=['用户认证']) +app.include_router(assets.router, prefix='/api/assets', tags=['资产管理']) +app.include_router(onboarding.router, prefix='/api/onboarding', tags=['上链流程']) +app.include_router(node.router, prefix='/api/node', tags=['节点状态']) + +@app.get('/api/health') +async def health(): + from database import db + try: + await db.command('ping') + mongo_status = 'connected' + except Exception: + mongo_status = 'disconnected' + return { + 'status': 'ok', + 'version': '3.0.0', + 'mongo': mongo_status, + 'protocol': 'NAC-Lens/4.0', + 'auth': 'local-jwt' + } + +# 前端静态文件服务 +frontend_dir = '/opt/nac/onboarding/frontend' +if os.path.exists(frontend_dir): + app.mount('/assets', StaticFiles(directory=f'{frontend_dir}/assets'), name='assets') + @app.get('/{full_path:path}') + async def serve_frontend(full_path: str): + index = f'{frontend_dir}/index.html' + if os.path.exists(index): + return FileResponse(index) + return {'error': '前端未构建'}