fix: 版本信息转临时存储;允许强制请求版本信息

This commit is contained in:
DLmaster361
2025-09-13 11:01:26 +08:00
parent 642b34eca3
commit e097e40826
4 changed files with 25 additions and 33 deletions

View File

@@ -37,7 +37,7 @@ async def check_update(version: UpdateCheckIn = Body(...)) -> UpdateCheckOut:
try: try:
if_need, latest_version, update_info = await Updater.check_update( if_need, latest_version, update_info = await Updater.check_update(
current_version=version.current_version current_version=version.current_version, if_force=version.if_force
) )
except Exception as e: except Exception as e:
return UpdateCheckOut( return UpdateCheckOut(

View File

@@ -144,12 +144,6 @@ class GlobalConfig(ConfigBase):
Data_LastWebConfigUpdated = ConfigItem( Data_LastWebConfigUpdated = ConfigItem(
"Data", "LastWebConfigUpdated", "2000-01-01 00:00:00", DateTimeValidator() "Data", "LastWebConfigUpdated", "2000-01-01 00:00:00", DateTimeValidator()
) )
Data_LastCheckVersion = ConfigItem(
"Data", "LastCheckVersion", "2000-01-01 00:00:00", DateTimeValidator()
)
Data_UpdateVersionInfo = ConfigItem(
"Data", "UpdateVersionInfo", "{ }", JSONValidator()
)
Data_WebConfig = ConfigItem("Data", "WebConfig", "{ }", JSONValidator()) Data_WebConfig = ConfigItem("Data", "WebConfig", "{ }", JSONValidator())

View File

@@ -788,6 +788,7 @@ class SettingUpdateIn(BaseModel):
class UpdateCheckIn(BaseModel): class UpdateCheckIn(BaseModel):
current_version: str = Field(..., description="当前前端版本号") current_version: str = Field(..., description="当前前端版本号")
if_force: bool = Field(..., description="是否强制拉取更新信息")
class UpdateCheckOut(OutBase): class UpdateCheckOut(OutBase):

View File

@@ -44,27 +44,28 @@ class _UpdateHandler:
def __init__(self) -> None: def __init__(self) -> None:
self.is_locked: bool = False self.is_locked: bool = False
self.remote_version: Optional[str] = None self.remote_version: Optional[str] = None
self.last_check_time: Optional[datetime] = None
self.update_version_info: Optional[Dict[str, List[str]]] = None
self.mirror_chyan_download_url: Optional[str] = None self.mirror_chyan_download_url: Optional[str] = None
async def check_update( async def check_update(
self, current_version: str self, current_version: str, if_force: bool = False
) -> tuple[bool, str, Dict[str, List[str]]]: ) -> tuple[bool, str, Dict[str, List[str]]]:
if datetime.now() - timedelta(hours=4) < datetime.strptime( if (
Config.get("Data", "LastCheckVersion"), "%Y-%m-%d %H:%M:%S" not if_force
and self.remote_version is not None
and self.last_check_time is not None
and self.update_version_info is not None
and self.last_check_time > datetime.now() - timedelta(hours=4)
): ):
logger.info("四小时内已进行过一次检查, 直接使用缓存的版本更新信息") logger.info("四小时内已进行过一次检查, 直接使用缓存的版本更新信息")
return ( return (
( bool(
False version.parse(self.remote_version) > version.parse(current_version)
if self.remote_version is None
else bool(
version.parse(self.remote_version)
> version.parse(current_version)
)
), ),
current_version if self.remote_version is None else self.remote_version, self.remote_version,
json.loads(Config.get("Data", "UpdateVersionInfo")), self.update_version_info,
) )
logger.info("开始检查更新") logger.info("开始检查更新")
@@ -90,16 +91,15 @@ class _UpdateHandler:
) )
logger.success("获取版本信息成功") logger.success("获取版本信息成功")
await Config.set( self.last_check_time = datetime.now()
"Data", "LastCheckVersion", datetime.now().strftime("%Y-%m-%d %H:%M:%S")
)
remote_version = version_info["data"]["version_name"] self.remote_version = version_info["data"]["version_name"]
self.remote_version = remote_version if self.remote_version is None:
raise Exception("Mirror 酱未返回版本号, 请稍后重试")
if "url" in version_info["data"]: if "url" in version_info["data"]:
self.mirror_chyan_download_url = version_info["data"]["url"] self.mirror_chyan_download_url = version_info["data"]["url"]
if version.parse(remote_version) > version.parse(current_version): if version.parse(self.remote_version) > version.parse(current_version):
# 版本更新信息 # 版本更新信息
version_info_json: Dict[str, Dict[str, List[str]]] = json.loads( version_info_json: Dict[str, Dict[str, List[str]]] = json.loads(
@@ -110,7 +110,7 @@ class _UpdateHandler:
) )
) )
update_version_info = {} self.update_version_info = {}
for v_i in [ for v_i in [
info info
for ver, info in version_info_json.items() for ver, info in version_info_json.items()
@@ -118,14 +118,11 @@ class _UpdateHandler:
]: ]:
for key, value in v_i.items(): for key, value in v_i.items():
if key not in update_version_info: if key not in self.update_version_info:
update_version_info[key] = [] self.update_version_info[key] = []
update_version_info[key] += value self.update_version_info[key] += value
await Config.set( return True, self.remote_version, self.update_version_info
"Data", "UpdateVersionInfo", json.dumps(update_version_info)
)
return True, remote_version, update_version_info
else: else:
return False, current_version, {} return False, current_version, {}