feat: OTA热更新 — 版本检测API + App端WGT下载安装 + app_versions表

This commit is contained in:
2026-08-07 11:49:59 +08:00
parent 0df7215134
commit bff8787e62
7 changed files with 278 additions and 1 deletions

View File

@ -0,0 +1,55 @@
"""App 版本更新 API — OTA 热更新检测"""
from fastapi import APIRouter, Depends, Query
from sqlalchemy import select, desc
from sqlalchemy.ext.asyncio import AsyncSession
from app.core.database import get_db
from app.models.app_version import AppVersion
from app.schemas.app_version import AppVersionResponse
router = APIRouter(prefix="/app", tags=["App版本"])
@router.get("/version", response_model=AppVersionResponse)
async def check_version(
current: str = Query(..., description="当前 App 版本号,如 T1.0.0"),
db: AsyncSession = Depends(get_db),
):
"""检测是否有新版本可用"""
# 查询最新的激活版本
result = await db.execute(
select(AppVersion)
.where(AppVersion.is_active.is_(True))
.order_by(desc(AppVersion.version_code))
.limit(1)
)
latest = result.scalar_one_or_none()
if not latest:
# 无版本记录 → 无更新
return AppVersionResponse(
version=current,
version_code=0,
has_update=False,
)
# 比较版本号
has_update = latest.version_code > _parse_version_code(current)
return AppVersionResponse(
version=latest.version,
version_code=latest.version_code,
has_update=has_update,
wgt_url=latest.wgt_url if has_update else None,
description=latest.description if has_update else None,
force_update=False,
)
def _parse_version_code(version_str: str) -> int:
"""从版本字符串提取数字版本号兜底用最后3位"""
import re
nums = re.findall(r"\d+", version_str)
if nums:
return int("".join(nums[-3:]).ljust(3, "0")[:3])
return 0