diff --git a/backend-java/src/main/java/com/nanri/aiimage/modules/softwareversion/controller/PublicVersionController.java b/backend-java/src/main/java/com/nanri/aiimage/modules/softwareversion/controller/PublicVersionController.java
new file mode 100644
index 00000000..031b70af
--- /dev/null
+++ b/backend-java/src/main/java/com/nanri/aiimage/modules/softwareversion/controller/PublicVersionController.java
@@ -0,0 +1,46 @@
+package com.nanri.aiimage.modules.softwareversion.controller;
+
+import com.nanri.aiimage.modules.softwareversion.service.SoftwareVersionService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * 客户端公开版本查询接口。
+ *
+ *
路径和字段必须保持与 Python 时代兼容:客户端已固定请求
+ * {@code /api/version} 和 {@code /api/version/latest},不能改成 admin 前缀,
+ * 也不能把 {@code file_url} 改成 {@code download_url}。
+ */
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/api/version")
+public class PublicVersionController {
+
+ private final SoftwareVersionService softwareVersionService;
+
+ @Value("${app.version:${APP_VERSION:1.0.0}}")
+ private String appVersion;
+
+ @Value("${app.update-url:${APP_UPDATE_URL:}}")
+ private String updateUrl;
+
+ @GetMapping
+ public Map currentVersion() {
+ Map response = new LinkedHashMap<>();
+ response.put("version", appVersion == null || appVersion.isBlank() ? "1.0.0" : appVersion);
+ response.put("desc", "");
+ response.put("url", updateUrl == null ? "" : updateUrl);
+ return response;
+ }
+
+ @GetMapping("/latest")
+ public Map latestVersion() {
+ return softwareVersionService.latestSoftwareVersion();
+ }
+}
diff --git a/backend-java/src/main/java/com/nanri/aiimage/modules/softwareversion/service/SoftwareVersionService.java b/backend-java/src/main/java/com/nanri/aiimage/modules/softwareversion/service/SoftwareVersionService.java
index 53e3c62d..d8fd7357 100644
--- a/backend-java/src/main/java/com/nanri/aiimage/modules/softwareversion/service/SoftwareVersionService.java
+++ b/backend-java/src/main/java/com/nanri/aiimage/modules/softwareversion/service/SoftwareVersionService.java
@@ -68,6 +68,28 @@ public class SoftwareVersionService {
return items;
}
+ /**
+ * 返回客户端更新接口所需的最新版本记录。空表时保持 Flask 时代的
+ * {"version": null, "file_url": null} 响应语义。
+ */
+ public Map latestSoftwareVersion() {
+ log.info("[software-version] 查询客户端最新可用版本");
+ SoftwareVersionEntity entity = softwareVersionMapper.selectOne(
+ new LambdaQueryWrapper()
+ .orderByDesc(SoftwareVersionEntity::getCreatedAt)
+ .orderByDesc(SoftwareVersionEntity::getId)
+ .last("LIMIT 1"));
+ Map result = new LinkedHashMap<>();
+ if (entity == null) {
+ result.put("version", null);
+ result.put("file_url", null);
+ return result;
+ }
+ result.put("version", entity.getVersion() == null ? "" : entity.getVersion());
+ result.put("file_url", entity.getFileUrl() == null ? "" : entity.getFileUrl());
+ return result;
+ }
+
/**
* 上传客户端软件安装包:zip 上传 MinIO(key:nanri-image/versions/{安全版本号}.zip),
* 并向 web_config 追加一条记录(不做"设为最新",桌面端按 created_at 倒序取第一条)。