diff --git a/api/app/controllers/home_page_controller.py b/api/app/controllers/home_page_controller.py index de4a78a3..685157e7 100644 --- a/api/app/controllers/home_page_controller.py +++ b/api/app/controllers/home_page_controller.py @@ -3,9 +3,10 @@ from sqlalchemy.orm import Session from app.core.config import settings from app.core.response_utils import success -from app.db import get_db +from app.db import get_db, SessionLocal from app.dependencies import get_current_user from app.models.user_model import User +from app.repositories.home_page_repository import HomePageRepository from app.schemas.response_schema import ApiResponse from app.services.home_page_service import HomePageService @@ -31,9 +32,39 @@ def get_workspace_list( @router.get("/version", response_model=ApiResponse) def get_system_version(): - """获取系统版本号+说明""" - current_version = settings.SYSTEM_VERSION - version_info = HomePageService.load_version_introduction(current_version) + """获取系统版本号 + 说明""" + current_version = None + version_info = None + + # 1️⃣ 优先从数据库获取最新已发布的版本 + try: + db = SessionLocal() + try: + print(f"[DEBUG] 开始从数据库获取最新版本...") + current_version, version_info = HomePageRepository.get_latest_version_introduction(db) + if current_version: + print(f"[DEBUG] 数据库获取成功:version={current_version}") + else: + print(f"[DEBUG] 数据库获取失败:current_version=None") + finally: + db.close() + except Exception as e: + print(f"[DEBUG] 数据库查询异常:{e}") + pass + + # 2️⃣ 降级:使用环境变量中的版本号 + if not current_version: + print(f"[DEBUG] 使用环境变量版本:{settings.SYSTEM_VERSION}") + current_version = settings.SYSTEM_VERSION + version_info = HomePageService.load_version_introduction(current_version) + + # 3️⃣ 如果数据库和 JSON 都没有,返回基本信息 + if not version_info: + version_info = { + "introduction": {"codeName": "", "releaseDate": "", "upgradePosition": "", "coreUpgrades": []}, + "introduction_en": {"codeName": "", "releaseDate": "", "upgradePosition": "", "coreUpgrades": []} + } + return success( data={ "version": current_version, diff --git a/api/app/repositories/home_page_repository.py b/api/app/repositories/home_page_repository.py index 6d74bcaf..a15b9634 100644 --- a/api/app/repositories/home_page_repository.py +++ b/api/app/repositories/home_page_repository.py @@ -1,4 +1,4 @@ -from datetime import datetime, timedelta +from datetime import datetime, time from sqlalchemy.orm import Session from sqlalchemy import func from uuid import UUID @@ -192,10 +192,65 @@ class HomePageRepository: return workspaces, app_count_dict, user_count_dict + @staticmethod + def get_latest_version_introduction(db: Session) -> tuple[Optional[str], Optional[Dict[str, Any]]]: + """ + 从数据库获取最新已发布的版本说明 + 使用反射方式读取表结构,不依赖 premium 模型类 + + Args: + db: 数据库会话 + + Returns: + (版本号,版本说明字典) 的元组 + 如果数据库中没有已发布的版本,返回 (None, None) + """ + try: + from sqlalchemy import Table, MetaData + + metadata = MetaData() + + version_notes = Table('version_notes', metadata, autoload_with=db.bind) + + # 获取最新已发布的版本(按发布时间倒序,日期相同时按版本号倒序) + query = db.query(version_notes).filter( + version_notes.c.is_published == True + ).order_by( + version_notes.c.release_date.desc(), + version_notes.c.version.desc() + ) + + note = query.first() + + if not note: + return None, None + + version_info = { + "introduction": { + "codeName": note.code_name or "", + "releaseDate": int(datetime.combine(note.release_date, time()).timestamp() * 1000) if note.release_date else 0, + "upgradePosition": note.upgrade_position or "", + "coreUpgrades": note.core_upgrades or [] + }, + "introduction_en": { + "codeName": note.code_name_en or note.code_name or "", + "releaseDate": int(datetime.combine(note.release_date, time()).timestamp() * 1000) if note.release_date else 0, + "upgradePosition": note.upgrade_position_en or note.upgrade_position or "", + "coreUpgrades": note.core_upgrades_en or [] + } + } + + return note.version, version_info + + except Exception as e: + import traceback + traceback.print_exc() + return None, None + @staticmethod def get_version_introduction(db: Session, version: str) -> Optional[Dict[str, Any]]: """ - 从数据库获取版本说明(优先读取已发布的版本) + 从数据库获取指定版本说明(优先读取已发布的版本) 使用反射方式读取表结构,不依赖 premium 模型类 Args: @@ -208,10 +263,10 @@ class HomePageRepository: """ try: from sqlalchemy import Table, MetaData + from datetime import datetime, time metadata = MetaData() version_notes = Table('version_notes', metadata, autoload_with=db.engine) - version_note_items = Table('version_note_items', metadata, autoload_with=db.engine) note = db.query(version_notes).filter( version_notes.c.version == version, @@ -221,31 +276,18 @@ class HomePageRepository: if not note: return None - items = db.query(version_note_items).filter( - version_note_items.c.note_id == note.id - ).order_by(version_note_items.c.sort_order).all() - - core_upgrades = [] - for item in items: - title = item.title - content = item.content - if content: - core_upgrades.append(f"{title}
{content}") - else: - core_upgrades.append(title) - return { "introduction": { - "codeName": "", - "releaseDate": note.release_date.isoformat() if note.release_date else "", - "upgradePosition": "", - "coreUpgrades": core_upgrades + "codeName": note.code_name or "", + "releaseDate": int(datetime.combine(note.release_date, time()).timestamp() * 1000) if note.release_date else 0, + "upgradePosition": note.upgrade_position or "", + "coreUpgrades": note.core_upgrades or [] }, "introduction_en": { - "codeName": "", - "releaseDate": note.release_date.isoformat() if note.release_date else "", - "upgradePosition": "", - "coreUpgrades": core_upgrades + "codeName": note.code_name_en or note.code_name or "", + "releaseDate": int(datetime.combine(note.release_date, time()).timestamp() * 1000) if note.release_date else 0, + "upgradePosition": note.upgrade_position_en or note.upgrade_position or "", + "coreUpgrades": note.core_upgrades_en or [] } } except Exception: