From 08b5040c7432724367d4e82b75aaed34e70028c8 Mon Sep 17 00:00:00 2001 From: mediabot-pt <295750538+mediabot-pt@users.noreply.github.com> Date: Tue, 30 Jun 2026 13:17:06 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=AB=99=E7=82=B9=E5=90=8D=E7=A7=B0/?= =?UTF-8?q?=E5=9C=B0=E5=9D=80=E6=94=AF=E6=8C=81=E5=A4=9A=E5=80=BC=E7=BC=96?= =?UTF-8?q?=E8=BE=91=EF=BC=8C=E5=8A=A8=E6=80=81=E5=A2=9E=E5=88=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Sites.vue: 名称和地址改为动态列表 + 增删按钮 - SiteController: updateSite 接受 names[]/urls[] 数组 - SiteServiceImpl: 更新时直接覆盖整个名称/地址列表 --- .../par/api/controller/SiteController.java | 11 +++-- .../com/par/core/service/SiteService.java | 2 +- .../core/service/impl/SiteServiceImpl.java | 16 +++----- web/src/views/Sites.vue | 41 +++++++++++++------ 4 files changed, 41 insertions(+), 29 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 35d3c60..fe1ed54 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 @@ -8,6 +8,7 @@ import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; +import java.util.List; import java.util.List; import java.util.Map; @@ -47,15 +48,17 @@ public class SiteController { @RequestBody Map payload, HttpServletRequest request) { - String name = (String) payload.get("name"); - String description = (String) payload.get("description"); - String baseUrl = (String) payload.get("baseUrl"); + @SuppressWarnings("unchecked") + List names = (List) payload.get("names"); + @SuppressWarnings("unchecked") + List urls = (List) payload.get("urls"); 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, name, description, baseUrl, siteType, status, operatorId); + Site site = siteService.updateSite(siteId, names, urls, 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/service/SiteService.java b/par-core/src/main/java/com/par/core/service/SiteService.java index 3f3a9c8..d212433 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,7 +43,7 @@ public interface SiteService { /** * 管理员编辑站点基本信息 */ - Site updateSite(String siteId, String name, String description, String baseUrl, + Site updateSite(String siteId, List names, List urls, String description, String siteType, String status, Long operatorId); /** 所有站点列表(管理员用) */ 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 3cb97ba..496ac4c 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 @@ -194,22 +194,16 @@ public class SiteServiceImpl implements SiteService { } @Override - public Site updateSite(String siteId, String name, String description, String baseUrl, + public Site updateSite(String siteId, List names, List urls, String description, String siteType, String status, Long operatorId) { Site site = siteMapper.selectBySiteId(siteId); if (site == null) throw new IllegalArgumentException("站点不存在: " + siteId); - if (name != null && !name.isBlank()) { - List names = fromJsonArray(site.getNamesJson()); - if (names.isEmpty()) names.add(name); - else names.set(0, name); - site.setNamesJson(toJsonArray(names)); + if (names != null && !names.isEmpty()) { + site.setNamesJson(toJsonArray(names.stream().filter(n -> n != null && !n.isBlank()).toList())); } - if (baseUrl != null && !baseUrl.isBlank()) { - List urls = fromJsonArray(site.getUrlsJson()); - if (urls.isEmpty()) urls.add(baseUrl); - else urls.set(0, baseUrl); - site.setUrlsJson(toJsonArray(urls)); + if (urls != null && !urls.isEmpty()) { + site.setUrlsJson(toJsonArray(urls.stream().filter(u -> u != null && !u.isBlank()).toList())); } if (description != null) site.setDescription(description); if (siteType != null && !siteType.isBlank()) { diff --git a/web/src/views/Sites.vue b/web/src/views/Sites.vue index c1d0ad1..ab1ae74 100644 --- a/web/src/views/Sites.vue +++ b/web/src/views/Sites.vue @@ -33,16 +33,24 @@ - - + + - +
+ + 删 +
+ + 添加名称
- +
+ + 删 +
+ + 添加地址
@@ -122,7 +130,7 @@ import api from '../api' const sites = ref([]) const loading = ref(false) const editVisible = ref(false), saving = ref(false) -const editForm = ref({ id: null, siteId: '', name: '', baseUrl: '', siteType: '', status: '', description: '' }) +const editForm = reactive({ id: null, siteId: '', names: [''], urls: [''], siteType: '', status: '', description: '' }) const siteTypes = [ { value: 'nexusphp', label: 'NexusPHP' }, { value: 'mtorrent', label: 'MTorrent' }, { value: 'mteam', label: 'M-Team API' }, { value: 'pttime', label: 'PTTime' }, @@ -146,20 +154,27 @@ const fetchAll = async () => { } const handleEdit = (row) => { - editForm.value = { id: row.id, siteId: row.siteId, name: (row.names||[]).join('\n'), baseUrl: (row.urls||[]).join('\n'), siteType: row.siteType||'', status: row.status||'active', description: row.description||'' } + editForm.id = row.id + editForm.siteId = row.siteId + editForm.names = (row.names && row.names.length) ? [...row.names] : [''] + editForm.urls = (row.urls && row.urls.length) ? [...row.urls] : [''] + editForm.siteType = row.siteType || '' + editForm.status = row.status || 'active' + editForm.description = row.description || '' editVisible.value = true } const handleSave = async () => { - if (!editForm.value.name.trim()||!editForm.value.baseUrl.trim()) { ElMessage.warning('名称和地址不能为空'); return } + const names = editForm.names.filter(n => n.trim()) + const urls = editForm.urls.filter(u => u.trim()) + if (names.length === 0 || urls.length === 0) { ElMessage.warning('名称和地址不能为空'); return } saving.value = true try { - await api.sites.update(editForm.value.siteId, { - name: editForm.value.name.trim().split('\n').filter(Boolean)[0]||'', - baseUrl: editForm.value.baseUrl.trim().split('\n').filter(Boolean)[0]||'', - siteType: editForm.value.siteType.trim()||'unknown', - status: editForm.value.status||'active', - description: editForm.value.description.trim()||null, + await api.sites.update(editForm.siteId, { + names, urls, + siteType: editForm.siteType.trim()||'unknown', + status: editForm.status||'active', + description: editForm.description.trim()||null, }) ElMessage.success('保存成功'); editVisible.value = false; fetchAll() } catch (e) { ElMessage.error(e.response?.data?.message||'保存失败') }