Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
.DS_Store
Thumbs.db

# 环境变量(保护敏感信息)
# Biến môi trường (bảo vệ thông tin nhạy cảm)
.env
.env.local
.env.*.local
Expand Down Expand Up @@ -36,7 +36,7 @@ yarn-error.log*
*.swp
*.swo

# 测试
# Kiểm thử
.pytest_cache/
.coverage
htmlcov/
Expand All @@ -45,16 +45,16 @@ htmlcov/
.cursor/
.claude/

# 文档与测试程序
# Tài liệu và chương trình kiểm thử
mydoc/
mytest/

# 日志文件
# File log
backend/logs/
*.log

# 上传文件
# File tải lên
backend/uploads/

# Docker 数据
# Dữ liệu Docker
data/
12 changes: 6 additions & 6 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,29 +1,29 @@
FROM python:3.11

# 安装 Node.js (满足 >=18)及必要工具
# Cài đặt Node.js (đáp ứng >=18) và các công cụ cần thiết
RUN apt-get update \
&& apt-get install -y --no-install-recommends nodejs npm \
&& rm -rf /var/lib/apt/lists/*

# uv 官方镜像复制 uv
# Sao chép uv từ image chính thức của uv
COPY --from=ghcr.io/astral-sh/uv:0.9.26 /uv /uvx /bin/

WORKDIR /app

# 先复制依赖描述文件以利用缓存
# Sao chép trước file mô tả dependency để tận dụng cache
COPY package.json package-lock.json ./
COPY frontend/package.json frontend/package-lock.json ./frontend/
COPY backend/pyproject.toml backend/uv.lock ./backend/

# 安装依赖(Node + Python
# Cài đặt dependency (Node + Python)
RUN npm ci \
&& npm ci --prefix frontend \
&& cd backend && uv sync --frozen

# 复制项目源码
# Sao chép mã nguồn dự án
COPY . .

EXPOSE 3000 5001

# 同时启动前后端(开发模式)
# Khởi chạy đồng thời frontend và backend (chế độ phát triển)
CMD ["npm", "run", "dev"]
38 changes: 19 additions & 19 deletions backend/app/__init__.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
"""
MiroFish Backend - Flask应用工厂
MiroFish Backend - Flask application factory
"""

import os
import warnings

# 抑制 multiprocessing resource_tracker 的警告(来自第三方库如 transformers
# 需要在所有其他导入之前设置
# Ẩn cảnh báo từ multiprocessing resource_tracker (đến từ thư viện bên thứ ba như transformers)
# Cần đặt trước mọi import khác
warnings.filterwarnings("ignore", message=".*resource_tracker.*")

from flask import Flask, request
Expand All @@ -17,64 +17,64 @@


def create_app(config_class=Config):
"""Flask应用工厂函数"""
"""Hàm factory để khởi tạo Flask app"""
app = Flask(__name__)
app.config.from_object(config_class)

# 设置JSON编码:确保中文直接显示(而不是 \uXXXX 格式)
# Flask >= 2.3 使用 app.json.ensure_ascii,旧版本使用 JSON_AS_ASCII 配置
# Thiết lập JSON encoding: đảm bảo tiếng Trung hiển thị trực tiếp (không ở dạng \uXXXX)
# Flask >= 2.3 dùng app.json.ensure_ascii, phiên bản cũ dùng JSON_AS_ASCII
if hasattr(app, 'json') and hasattr(app.json, 'ensure_ascii'):
app.json.ensure_ascii = False

# 设置日志
# Thiết lập logger
logger = setup_logger('mirofish')

# 只在 reloader 子进程中打印启动信息(避免 debug 模式下打印两次)
# Chỉ in log khởi động ở tiến trình con của reloader (tránh in 2 lần khi debug)
is_reloader_process = os.environ.get('WERKZEUG_RUN_MAIN') == 'true'
debug_mode = app.config.get('DEBUG', False)
should_log_startup = not debug_mode or is_reloader_process

if should_log_startup:
logger.info("=" * 50)
logger.info("MiroFish Backend 启动中...")
logger.info("MiroFish Backend is starting...")
logger.info("=" * 50)

# 启用CORS
# Bật CORS
CORS(app, resources={r"/api/*": {"origins": "*"}})

# 注册模拟进程清理函数(确保服务器关闭时终止所有模拟进程)
# Đăng ký hàm dọn tiến trình mô phỏng (đảm bảo dừng toàn bộ khi server tắt)
from .services.simulation_runner import SimulationRunner
SimulationRunner.register_cleanup()
if should_log_startup:
logger.info("已注册模拟进程清理函数")
logger.info("Simulation process cleanup hook registered")

# 请求日志中间件
# Middleware log request
@app.before_request
def log_request():
logger = get_logger('mirofish.request')
logger.debug(f"请求: {request.method} {request.path}")
logger.debug(f"Request: {request.method} {request.path}")
if request.content_type and 'json' in request.content_type:
logger.debug(f"请求体: {request.get_json(silent=True)}")
logger.debug(f"Request body: {request.get_json(silent=True)}")

@app.after_request
def log_response(response):
logger = get_logger('mirofish.request')
logger.debug(f"响应: {response.status_code}")
logger.debug(f"Response: {response.status_code}")
return response

# 注册蓝图
# Đăng ký blueprint
from .api import graph_bp, simulation_bp, report_bp
app.register_blueprint(graph_bp, url_prefix='/api/graph')
app.register_blueprint(simulation_bp, url_prefix='/api/simulation')
app.register_blueprint(report_bp, url_prefix='/api/report')

# 健康检查
# Health check
@app.route('/health')
def health():
return {'status': 'ok', 'service': 'MiroFish Backend'}

if should_log_startup:
logger.info("MiroFish Backend 启动完成")
logger.info("MiroFish Backend started successfully")

return app

2 changes: 1 addition & 1 deletion backend/app/api/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
"""
API路由模块
Mô-đun tuyến API
"""

from flask import Blueprint
Expand Down
Loading