From 512bc12a206a7d8db3887421b22e2d06e70823ec Mon Sep 17 00:00:00 2001 From: mediabot-pt <295750538+mediabot-pt@users.noreply.github.com> Date: Sun, 5 Jul 2026 21:28:01 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=AB=99=E7=82=B9=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=A0=87=E7=AD=BE+=E7=AE=80=E4=BB=8B=E5=AD=97=E6=AE=B5+?= =?UTF-8?q?=E8=A1=A8=E5=8D=95=E7=BC=96=E8=BE=91=E5=8F=8C=E5=90=91=E5=90=8C?= =?UTF-8?q?=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../par/api/controller/SiteController.java | 4 +++- .../main/java/com/par/core/dto/SiteDTO.java | 1 + .../main/java/com/par/core/entity/Site.java | 3 +++ .../com/par/core/service/SiteService.java | 4 ++-- .../core/service/impl/SiteServiceImpl.java | 8 +++++-- web/src/views/Sites.vue | 23 ++++++++++++++----- 6 files changed, 32 insertions(+), 11 deletions(-) diff --git a/par-api/src/main/java/com/par/api/controller/SiteController.java b/par-api/src/main/java/com/par/api/controller/SiteController.java index 0fe9acd..f269313 100644 --- a/par-api/src/main/java/com/par/api/controller/SiteController.java +++ b/par-api/src/main/java/com/par/api/controller/SiteController.java @@ -52,13 +52,15 @@ public class SiteController { List names = (List) payload.get("names"); @SuppressWarnings("unchecked") List urls = (List) payload.get("urls"); + @SuppressWarnings("unchecked") + List tags = (List) payload.get("tags"); String siteType = (String) payload.get("siteType"); String status = (String) payload.get("status"); String description = (String) payload.get("description"); Long operatorId = (Long) request.getAttribute("accountId"); try { - Site site = siteService.updateSite(siteId, names, urls, description, siteType, status, operatorId); + Site site = siteService.updateSite(siteId, names, urls, tags, description, siteType, status, operatorId); return ApiResponse.success(siteService.toDTO(site)); } catch (IllegalArgumentException e) { return ApiResponse.error(404, e.getMessage()); diff --git a/par-core/src/main/java/com/par/core/dto/SiteDTO.java b/par-core/src/main/java/com/par/core/dto/SiteDTO.java index f862428..c88d54a 100644 --- a/par-core/src/main/java/com/par/core/dto/SiteDTO.java +++ b/par-core/src/main/java/com/par/core/dto/SiteDTO.java @@ -19,6 +19,7 @@ public class SiteDTO { private String description; private String notes; private List urls; + private List tags; private String iconUrl; private SiteType siteType; private String schemaVersion; diff --git a/par-core/src/main/java/com/par/core/entity/Site.java b/par-core/src/main/java/com/par/core/entity/Site.java index 8fc4bad..6548d53 100644 --- a/par-core/src/main/java/com/par/core/entity/Site.java +++ b/par-core/src/main/java/com/par/core/entity/Site.java @@ -30,6 +30,9 @@ public class Site { @TableField("description") private String description; + @TableField("tags") + private String tagsJson; + @TableField("notes") private String notes; diff --git a/par-core/src/main/java/com/par/core/service/SiteService.java b/par-core/src/main/java/com/par/core/service/SiteService.java index ab97d59..3a768f6 100644 --- a/par-core/src/main/java/com/par/core/service/SiteService.java +++ b/par-core/src/main/java/com/par/core/service/SiteService.java @@ -43,8 +43,8 @@ public interface SiteService { /** * 管理员编辑站点基本信息 */ - Site updateSite(String siteId, List names, List urls, String description, - String siteType, String status, Long operatorId); + Site updateSite(String siteId, List names, List urls, List tags, + String description, String siteType, String status, Long operatorId); /** 所有站点列表(管理员用) */ List listAllSites(); diff --git a/par-core/src/main/java/com/par/core/service/impl/SiteServiceImpl.java b/par-core/src/main/java/com/par/core/service/impl/SiteServiceImpl.java index bcd1b2e..266f551 100644 --- a/par-core/src/main/java/com/par/core/service/impl/SiteServiceImpl.java +++ b/par-core/src/main/java/com/par/core/service/impl/SiteServiceImpl.java @@ -83,6 +83,7 @@ public class SiteServiceImpl implements SiteService { dto.setDescription(site.getDescription()); dto.setNotes(site.getNotes()); dto.setUrls(fromJsonArray(site.getUrlsJson())); + dto.setTags(fromJsonArray(site.getTagsJson())); dto.setIconUrl(site.getIconUrl()); dto.setSiteType(site.getSiteType()); dto.setSchemaVersion(site.getSchemaVersion()); @@ -208,8 +209,8 @@ public class SiteServiceImpl implements SiteService { } @Override - public Site updateSite(String siteId, List names, List urls, String description, - String siteType, String status, Long operatorId) { + public Site updateSite(String siteId, List names, List urls, List tags, + String description, String siteType, String status, Long operatorId) { Site site = siteMapper.selectBySiteId(siteId); if (site == null) throw new IllegalArgumentException("站点不存在: " + siteId); @@ -219,6 +220,9 @@ public class SiteServiceImpl implements SiteService { if (urls != null && !urls.isEmpty()) { site.setUrlsJson(toJsonArray(urls.stream().filter(u -> u != null && !u.isBlank()).toList())); } + if (tags != null) { + site.setTagsJson(toJsonArray(tags.stream().filter(t -> t != null && !t.isBlank()).toList())); + } if (description != null) site.setDescription(description); if (siteType != null && !siteType.isBlank()) { try { site.setSiteType(SiteType.fromValue(siteType)); } catch (Exception ignored) {} diff --git a/web/src/views/Sites.vue b/web/src/views/Sites.vue index a09247d..1a81534 100644 --- a/web/src/views/Sites.vue +++ b/web/src/views/Sites.vue @@ -72,6 +72,12 @@ + + + + + + @@ -93,12 +99,16 @@ import api from '../api' const loading = ref(false), saving = ref(false), pendingCount = ref(0) const sites = ref([]), editSiteId = ref(''), editorJson = ref('{}'), jsonError = ref(false) -const form = reactive({ siteId:'', namesStr:'', urlsStr:'', siteType:'nexusphp', status:'active' }) +const form = reactive({ siteId:'', namesStr:'', urlsStr:'', tagsStr:'', desc:'', siteType:'nexusphp', status:'active' }) let syncing = false const jsonToForm = () => { - try { const s = JSON.parse(editorJson.value); form.siteId = s.siteId||''; form.namesStr = (s.names||[]).join('\n'); form.urlsStr = (s.urls||[]).join('\n'); form.siteType = s.siteType||'nexusphp'; form.status = s.status||'active'; jsonError.value = false } - catch { jsonError.value = true } + try { + const s = JSON.parse(editorJson.value) + form.siteId = s.siteId||''; form.namesStr = (s.names||[]).join('\n'); form.urlsStr = (s.urls||[]).join('\n') + form.tagsStr = (s.tags||[]).join(','); form.desc = s.description||''; form.siteType = s.siteType||'nexusphp'; form.status = s.status||'active' + jsonError.value = false + } catch { jsonError.value = true } } const formToJson = () => { @@ -107,7 +117,8 @@ const formToJson = () => { editorJson.value = JSON.stringify({ siteId: form.siteId, names: (form.namesStr||'').split('\n').map(s=>s.trim()).filter(Boolean), urls: (form.urlsStr||'').split('\n').map(s=>s.trim()).filter(Boolean), - siteType: form.siteType, status: form.status, + tags: (form.tagsStr||'').split(',').map(s=>s.trim()).filter(Boolean), + description: form.desc||'', siteType: form.siteType, status: form.status, }, null, 2) nextTick(() => { syncing = false }) } @@ -128,7 +139,7 @@ const refresh = async () => { const editSite = (row) => { editSiteId.value = row.siteId - editorJson.value = JSON.stringify({siteId:row.siteId,names:row.names,urls:row.urls,siteType:row.siteType,status:row.status||'active'}, null, 2) + editorJson.value = JSON.stringify({siteId:row.siteId,names:row.names,urls:row.urls,tags:row.tags||[],description:row.description||'',siteType:row.siteType,status:row.status||'active'}, null, 2) } const newSite = () => { @@ -141,7 +152,7 @@ const saveSite = async () => { try { const s = JSON.parse(editorJson.value) if (!s.siteId) { ElMessage.warning('siteId不能为空'); return } - await api.raw.put('/admin/sites/'+s.siteId, {names:s.names||[],urls:s.urls||[],siteType:s.siteType||'unknown',status:s.status||'active'}) + await api.raw.put('/admin/sites/'+s.siteId, {names:s.names||[],urls:s.urls||[],tags:s.tags||[],description:s.description||'',siteType:s.siteType||'unknown',status:s.status||'active'}) ElMessage.success('已保存'); editSiteId.value = ''; refresh() } catch { ElMessage.error('保存失败') } finally { saving.value = false }