feat: 站点编辑加发布按钮生成manifest上传七牛云

This commit is contained in:
mediabot-pt
2026-07-05 23:54:25 +08:00
parent 25df4203d7
commit b7adbfd18a
2 changed files with 64 additions and 2 deletions

View File

@@ -337,6 +337,21 @@ public class AdminController {
// ===================== 站点审核 =====================
/** 发布站点配置到七牛云(生成 manifest/manifest.json) */
@PostMapping("/sites/publish")
public ApiResponse<Map<String,Object>> publishManifest(HttpServletRequest request) {
checkAdmin(request);
try {
var manifest = buildManifest();
String json = new com.fasterxml.jackson.databind.ObjectMapper()
.writerWithDefaultPrettyPrinter().writeValueAsString(manifest);
storageService.store("manifest/manifest.json", json);
log.info("Manifest published: {} sites", ((List<?>)manifest.get("sites")).size());
return ApiResponse.success(Map.of("version", manifest.get("version"),
"sites", ((List<?>)manifest.get("sites")).size()));
} catch (Exception e) { return ApiResponse.error(500, "发布失败: " + e.getMessage()); }
}
@GetMapping("/sites")
public ApiResponse<List<com.par.core.dto.SiteDTO>> listAllSites(HttpServletRequest request) {
checkAdmin(request);
@@ -505,6 +520,43 @@ public class AdminController {
catch (Exception e) { return java.util.List.of(); }
}
// buildManifest = 复用 ManifestController 逻辑
@SuppressWarnings("unchecked")
private Map<String, Object> buildManifest() {
var sites = siteService.listAllSites();
List<Map<String,Object>> list = new ArrayList<>();
int total = 0;
for (var site : sites) {
var dto = siteService.toDTO(site);
Map<String,Object> e = new LinkedHashMap<>();
e.put("siteId", site.getSiteId());
e.put("names", dto.getNames());
e.put("urls", dto.getUrls());
e.put("tags", dto.getTags());
e.put("description", dto.getDescription());
e.put("siteType", site.getSiteType() != null ? site.getSiteType().getValue() : null);
e.put("status", site.getStatus() != null ? site.getStatus().getValue() : null);
e.put("version", site.getVersion() != null ? site.getVersion() : 1);
var latest = siteConfigMapper.selectLatestBySiteId(site.getSiteId());
e.put("latestVersion", latest != null ? latest.getVersion() : null);
e.put("hasScript", latest != null && latest.getScriptStoragePath() != null && !latest.getScriptStoragePath().isBlank());
e.put("hasPages", sitePagesMapper.selectCount(
new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<com.par.core.entity.SitePages>()
.eq(com.par.core.entity.SitePages::getSiteId, site.getSiteId())
.eq(com.par.core.entity.SitePages::getDeleted, 0)) > 0);
e.put("hasRisk", riskRuleMapper.selectCount(
new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<com.par.core.entity.RiskRule>()
.eq(com.par.core.entity.RiskRule::getSiteType, site.getSiteType().getValue())
.eq(com.par.core.entity.RiskRule::getDeleted, 0)) > 0);
total += (site.getVersion() != null ? site.getVersion() : 1);
list.add(e);
}
Map<String,Object> m = new LinkedHashMap<>();
m.put("version", total);
m.put("sites", list);
return m;
}
private void checkAdmin(HttpServletRequest request) {
TrustLevel level = (TrustLevel) request.getAttribute("trustLevel");
if (level == null || level != TrustLevel.ADMIN) {