feat: enhance homepage version management with database persistence

This commit is contained in:
wxy
2026-04-01 11:04:27 +08:00
parent e659ca9fa2
commit 8b997b422a
2 changed files with 101 additions and 28 deletions

View File

@@ -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,

View File

@@ -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}<br>{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: