BodyBalanceEvaluation/backend/app_simple.py
2025-08-07 14:38:08 +08:00

202 lines
6.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
身体平衡评估系统 - 后端服务器 (简化版本)
专门用于PyInstaller打包的版本移除了SocketIO功能
"""
import os
import sys
import json
import time
import threading
from datetime import datetime
from flask import Flask, jsonify, send_file
from flask import request as flask_request
from flask_cors import CORS
import sqlite3
import logging
from pathlib import Path
import cv2
import configparser
# 添加当前目录到Python路径
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
# 导入自定义模块
from database import DatabaseManager
from device_manager import DeviceManager, VideoStreamManager
from utils import config as app_config
# 配置日志
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('logs/backend.log', encoding='utf-8'),
logging.StreamHandler()
]
)
logger = logging.getLogger(__name__)
# 创建Flask应用
app = Flask(__name__)
app.config['SECRET_KEY'] = 'body-balance-detection-system-2024'
# 启用CORS支持
CORS(app, origins='*', supports_credentials=True, allow_headers=['Content-Type', 'Authorization'], methods=['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'])
# 读取RTSP配置
config = configparser.ConfigParser()
config_path = os.path.join(os.path.dirname(__file__), 'config.ini')
if not os.path.exists(config_path):
# 如果当前目录没有config.ini尝试上级目录
config_path = os.path.join(os.path.dirname(__file__), '..', 'config.ini')
config.read(config_path, encoding='utf-8')
# 全局变量
db_manager = None
device_manager = None
current_detection = None
detection_thread = None
video_stream_manager = None
def init_app():
"""初始化应用"""
global db_manager, device_manager, video_stream_manager
try:
# 初始化数据库管理器
db_path = os.path.join(os.path.dirname(__file__), 'data', 'body_balance.db')
os.makedirs(os.path.dirname(db_path), exist_ok=True)
db_manager = DatabaseManager(db_path)
# 初始化数据库表结构
db_manager.init_database()
logger.info("数据库管理器初始化成功")
# 初始化设备管理器
device_manager = DeviceManager()
logger.info("设备管理器初始化成功")
# 初始化视频流管理器
video_stream_manager = VideoStreamManager(device_manager=device_manager)
logger.info("视频流管理器初始化成功")
logger.info("应用初始化完成")
except Exception as e:
logger.error(f"应用初始化失败: {e}")
raise
@app.route('/health', methods=['GET'])
def health_check():
"""健康检查接口"""
return jsonify({
'status': 'ok',
'timestamp': datetime.now().isoformat(),
'message': '身体平衡评估系统后端服务正常运行'
})
@app.route('/api/health', methods=['GET'])
def api_health_check():
"""API健康检查接口"""
return jsonify({
'status': 'success',
'data': {
'service': '身体平衡评估系统',
'version': '1.0.0',
'timestamp': datetime.now().isoformat()
}
})
@app.route('/api/auth/login', methods=['POST'])
def login():
"""用户登录接口"""
try:
data = flask_request.get_json()
username = data.get('username')
password = data.get('password')
if not username or not password:
return jsonify({
'status': 'error',
'message': '用户名和密码不能为空'
}), 400
# 验证用户凭据
user = db_manager.authenticate_user(username, password)
if user:
return jsonify({
'status': 'success',
'message': '登录成功',
'data': {
'user_id': user['id'],
'username': user['username'],
'role': user['role'],
'token': 'simple_token_' + str(user['id'])
}
})
else:
return jsonify({
'status': 'error',
'message': '用户名或密码错误'
}), 401
except Exception as e:
logger.error(f"登录失败: {e}")
return jsonify({'status': 'error', 'message': '登录失败'}), 500
@app.route('/api/auth/register', methods=['POST'])
def register():
"""用户注册接口"""
try:
data = flask_request.get_json()
username = data.get('username')
password = data.get('password')
email = data.get('email', '')
if not username or not password:
return jsonify({
'status': 'error',
'message': '用户名和密码不能为空'
}), 400
# 创建用户
user_id = db_manager.create_user(username, password, email)
if user_id:
return jsonify({
'status': 'success',
'message': '注册成功',
'data': {'user_id': user_id}
})
else:
return jsonify({
'status': 'error',
'message': '注册失败,用户名可能已存在'
}), 400
except Exception as e:
logger.error(f"注册失败: {e}")
return jsonify({'status': 'error', 'message': '注册失败'}), 500
if __name__ == '__main__':
try:
# 初始化应用
init_app()
# 启动服务器
logger.info("启动身体平衡评估系统后端服务器...")
logger.info("服务器地址: http://localhost:5000")
app.run(
host='0.0.0.0',
port=5000,
debug=False,
threaded=True
)
except KeyboardInterrupt:
logger.info("服务器已停止")
except Exception as e:
logger.error(f"服务器启动失败: {e}")
sys.exit(1)