99 lines
3.3 KiB
Python
99 lines
3.3 KiB
Python
|
|
"""保单智能客服系统 — 独立后端入口
|
|||
|
|
|
|||
|
|
独立部署时使用的 Flask 应用,不依赖 Dify 扩展。
|
|||
|
|
"""
|
|||
|
|
import os
|
|||
|
|
from flask import Flask
|
|||
|
|
from flask_cors import CORS
|
|||
|
|
from dotenv import load_dotenv
|
|||
|
|
|
|||
|
|
# 加载环境变量
|
|||
|
|
load_dotenv()
|
|||
|
|
|
|||
|
|
|
|||
|
|
def create_app() -> Flask:
|
|||
|
|
"""创建 Flask 应用。"""
|
|||
|
|
app = Flask(__name__)
|
|||
|
|
|
|||
|
|
# 配置
|
|||
|
|
app.config['SECRET_KEY'] = os.getenv('JWT_SECRET', 'baodan-jwt-secret-2026')
|
|||
|
|
app.config['JWT_SECRET'] = os.getenv('JWT_SECRET', 'baodan-jwt-secret-2026')
|
|||
|
|
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
|
|||
|
|
app.config['REDIS_URL'] = os.getenv('REDIS_URL')
|
|||
|
|
|
|||
|
|
# 数据库:优先 DATABASE_URL,其次 DB_* 变量构建 PostgreSQL URL,最后回退到 SQLite
|
|||
|
|
db_url = os.getenv('DATABASE_URL', '')
|
|||
|
|
if not db_url:
|
|||
|
|
# 从 DB_* 环境变量构建 PostgreSQL URL
|
|||
|
|
db_host = os.getenv('DB_HOST', '')
|
|||
|
|
db_port = os.getenv('DB_PORT', '5432')
|
|||
|
|
db_user = os.getenv('DB_USERNAME', '')
|
|||
|
|
db_pass = os.getenv('DB_PASSWORD', '')
|
|||
|
|
db_name = os.getenv('DB_DATABASE', '')
|
|||
|
|
if db_host and db_user and db_name:
|
|||
|
|
db_url = f"postgresql://{db_user}:{db_pass}@{db_host}:{db_port}/{db_name}"
|
|||
|
|
if db_url and 'postgresql' in db_url:
|
|||
|
|
# 检查 psycopg2 是否可用
|
|||
|
|
try:
|
|||
|
|
import psycopg2
|
|||
|
|
app.config['SQLALCHEMY_DATABASE_URI'] = db_url
|
|||
|
|
except ImportError:
|
|||
|
|
print("[warning] psycopg2 未安装,回退到 SQLite")
|
|||
|
|
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///baodan.db'
|
|||
|
|
else:
|
|||
|
|
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///baodan.db'
|
|||
|
|
app.config['MIGRATION_ENABLED'] = True
|
|||
|
|
|
|||
|
|
# Dify 配置
|
|||
|
|
app.config['BAODAN_API_URL'] = os.getenv('DIFY_BASE_URL', 'http://localhost:5001')
|
|||
|
|
app.config['BAODAN_CHAT_API_KEY'] = os.getenv('DIFY_CHAT_APP_API_KEY', '')
|
|||
|
|
app.config['BAODAN_WORKFLOW_API_KEY'] = os.getenv('DIFY_WORKFLOW_APP_API_KEY', '')
|
|||
|
|
|
|||
|
|
# 企业微信配置
|
|||
|
|
app.config['WECOM_CORP_ID'] = os.getenv('WECOM_CORP_ID', '')
|
|||
|
|
app.config['WECOM_SECRET'] = os.getenv('WECOM_SECRET', '')
|
|||
|
|
app.config['WECOM_TOKEN'] = os.getenv('WECOM_TOKEN', '')
|
|||
|
|
app.config['WECOM_AES_KEY'] = os.getenv('WECOM_AES_KEY', '')
|
|||
|
|
app.config['WECOM_WEBHOOK_URL'] = os.getenv('WECOM_WEBHOOK_URL', '')
|
|||
|
|
|
|||
|
|
# 访客模式
|
|||
|
|
app.config['GUEST_MODE'] = os.getenv('GUEST_MODE', 'true').lower() == 'true'
|
|||
|
|
|
|||
|
|
# 域名(分享链接用)
|
|||
|
|
app.config['DOMAIN'] = os.getenv('DOMAIN', 'localhost')
|
|||
|
|
|
|||
|
|
# CORS
|
|||
|
|
CORS(app, resources={r"/*": {"origins": "*"}})
|
|||
|
|
|
|||
|
|
# 初始化数据库
|
|||
|
|
from insurance.db.database import init_db
|
|||
|
|
init_db(app)
|
|||
|
|
|
|||
|
|
# 初始化 Redis
|
|||
|
|
from insurance.db.redis import init_redis
|
|||
|
|
init_redis(app)
|
|||
|
|
|
|||
|
|
# 注册路由
|
|||
|
|
from insurance.routes import register_insurance_routes
|
|||
|
|
register_insurance_routes(app)
|
|||
|
|
|
|||
|
|
# 注册错误处理器
|
|||
|
|
from insurance.utils.error_handler import register_error_handlers
|
|||
|
|
register_error_handlers(app)
|
|||
|
|
|
|||
|
|
# 健康检查
|
|||
|
|
@app.route('/health')
|
|||
|
|
def health():
|
|||
|
|
return {'status': 'ok', 'service': 'baodanagent-api'}
|
|||
|
|
|
|||
|
|
return app
|
|||
|
|
|
|||
|
|
|
|||
|
|
# 创建应用实例
|
|||
|
|
app = create_app()
|
|||
|
|
|
|||
|
|
if __name__ == '__main__':
|
|||
|
|
port = int(os.getenv('PORT', 5001))
|
|||
|
|
debug = os.getenv('FLASK_DEBUG', 'false').lower() == 'true'
|
|||
|
|
app.run(host='0.0.0.0', port=port, debug=debug)
|