diff --git a/par-api/src/main/java/com/par/api/controller/AdminController.java b/par-api/src/main/java/com/par/api/controller/AdminController.java index 8bf03c4..7120105 100644 --- a/par-api/src/main/java/com/par/api/controller/AdminController.java +++ b/par-api/src/main/java/com/par/api/controller/AdminController.java @@ -266,34 +266,34 @@ public class AdminController { } @GetMapping("/sites/pending") - public ApiResponse> listPendingSubmissions(HttpServletRequest request) { + public ApiResponse> listPendingChanges(HttpServletRequest request) { checkAdmin(request); - return ApiResponse.success(siteService.listPendingSubmissions()); + return ApiResponse.success(siteService.listPendingChanges()); } - @PostMapping("/submissions/{id}/approve") - public ApiResponse approveSubmission(@PathVariable Long id, HttpServletRequest request) { + @PostMapping("/changes/{id}/approve") + public ApiResponse approveChange(@PathVariable Long id, HttpServletRequest request) { checkAdmin(request); Long reviewerId = (Long) request.getAttribute("accountId"); - siteService.approveSubmission(id, reviewerId); - log.info("Submission approved: id={}, reviewer={}", id, reviewerId); + siteService.approveChange(id, reviewerId); + log.info("Change approved: id={}, reviewer={}", id, reviewerId); return ApiResponse.success(); } - @PostMapping("/submissions/{id}/reject") - public ApiResponse rejectSubmission(@PathVariable Long id, HttpServletRequest request) { + @PostMapping("/changes/{id}/reject") + public ApiResponse rejectChange(@PathVariable Long id, HttpServletRequest request) { checkAdmin(request); Long reviewerId = (Long) request.getAttribute("accountId"); - siteService.rejectSubmission(id, reviewerId); - log.info("Submission rejected: id={}", id); + siteService.rejectChange(id, reviewerId); + log.info("Change rejected: id={}", id); return ApiResponse.success(); } - @GetMapping("/sites/{siteId}/submissions") - public ApiResponse> listSiteSubmissions( + @GetMapping("/sites/{siteId}/changes") + public ApiResponse> listSiteChanges( @PathVariable("siteId") String siteId, HttpServletRequest request) { checkAdmin(request); - return ApiResponse.success(siteService.listSubmissionsBySite(siteId)); + return ApiResponse.success(siteService.listChangeLogBySite(siteId)); } private void checkAdmin(HttpServletRequest request) { diff --git a/par-core/src/main/java/com/par/core/dto/SiteSubmissionDTO.java b/par-core/src/main/java/com/par/core/dto/SiteChangeLogDTO.java similarity index 94% rename from par-core/src/main/java/com/par/core/dto/SiteSubmissionDTO.java rename to par-core/src/main/java/com/par/core/dto/SiteChangeLogDTO.java index b5d989c..4e49716 100644 --- a/par-core/src/main/java/com/par/core/dto/SiteSubmissionDTO.java +++ b/par-core/src/main/java/com/par/core/dto/SiteChangeLogDTO.java @@ -6,7 +6,7 @@ import java.time.LocalDateTime; import java.util.List; @Data -public class SiteSubmissionDTO { +public class SiteChangeLogDTO { private Long id; private String siteId; private Long submitterId; diff --git a/par-core/src/main/java/com/par/core/entity/SiteSubmission.java b/par-core/src/main/java/com/par/core/entity/SiteChangeLog.java similarity index 93% rename from par-core/src/main/java/com/par/core/entity/SiteSubmission.java rename to par-core/src/main/java/com/par/core/entity/SiteChangeLog.java index 9f6a15d..0a79137 100644 --- a/par-core/src/main/java/com/par/core/entity/SiteSubmission.java +++ b/par-core/src/main/java/com/par/core/entity/SiteChangeLog.java @@ -6,8 +6,8 @@ import lombok.Data; import java.time.LocalDateTime; @Data -@TableName("site_submissions") -public class SiteSubmission { +@TableName("site_change_log") +public class SiteChangeLog { @TableId(type = IdType.AUTO) private Long id; diff --git a/par-core/src/main/java/com/par/core/mapper/SiteChangeLogMapper.java b/par-core/src/main/java/com/par/core/mapper/SiteChangeLogMapper.java new file mode 100644 index 0000000..7fb6f0b --- /dev/null +++ b/par-core/src/main/java/com/par/core/mapper/SiteChangeLogMapper.java @@ -0,0 +1,19 @@ +package com.par.core.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.par.core.entity.SiteChangeLog; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +@Mapper +public interface SiteChangeLogMapper extends BaseMapper { + + @Select("SELECT * FROM site_change_log WHERE status = #{status} ORDER BY created_at DESC") + List selectByStatus(@Param("status") String status); + + @Select("SELECT * FROM site_change_log WHERE site_id = #{siteId} ORDER BY created_at DESC") + List selectBySiteId(@Param("siteId") String siteId); +} diff --git a/par-core/src/main/java/com/par/core/mapper/SiteSubmissionMapper.java b/par-core/src/main/java/com/par/core/mapper/SiteSubmissionMapper.java deleted file mode 100644 index 1eb8d93..0000000 --- a/par-core/src/main/java/com/par/core/mapper/SiteSubmissionMapper.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.par.core.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.par.core.entity.SiteSubmission; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; -import org.apache.ibatis.annotations.Select; - -import java.util.List; - -@Mapper -public interface SiteSubmissionMapper extends BaseMapper { - - @Select("SELECT * FROM site_submissions WHERE status = #{status} ORDER BY created_at DESC") - List selectByStatus(@Param("status") String status); - - @Select("SELECT * FROM site_submissions WHERE site_id = #{siteId} ORDER BY created_at DESC") - List selectBySiteId(@Param("siteId") String siteId); -} 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 5c8896a..5421fe8 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 @@ -1,7 +1,7 @@ package com.par.core.service; +import com.par.core.dto.SiteChangeLogDTO; import com.par.core.dto.SiteDTO; -import com.par.core.dto.SiteSubmissionDTO; import com.par.core.entity.Site; import java.util.List; @@ -47,15 +47,15 @@ public interface SiteService { /** 所有站点列表(管理员用) */ List listAllSites(); - /** 待审核提交列表 */ - List listPendingSubmissions(); + /** 待审核变更列表 */ + List listPendingChanges(); /** 审核通过 → 写入 sites 表 */ - Site approveSubmission(Long submissionId, Long reviewerId); + Site approveChange(Long changeId, Long reviewerId); - /** 拒绝提交 */ - void rejectSubmission(Long submissionId, Long reviewerId); + /** 拒绝变更 */ + void rejectChange(Long changeId, Long reviewerId); - /** 查看站点的变更(审核)记录 */ - List listSubmissionsBySite(String siteId); + /** 查看站点的变更记录 */ + List listChangeLogBySite(String siteId); } 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 05f7bbe..393fa74 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 @@ -3,14 +3,14 @@ package com.par.core.service.impl; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import com.par.core.dto.SiteChangeLogDTO; import com.par.core.dto.SiteDTO; -import com.par.core.dto.SiteSubmissionDTO; import com.par.core.entity.Site; -import com.par.core.entity.SiteSubmission; +import com.par.core.entity.SiteChangeLog; import com.par.core.enums.SiteStatus; import com.par.core.enums.SiteType; +import com.par.core.mapper.SiteChangeLogMapper; import com.par.core.mapper.SiteMapper; -import com.par.core.mapper.SiteSubmissionMapper; import com.par.core.service.SiteService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -28,7 +28,7 @@ import java.util.stream.Collectors; public class SiteServiceImpl implements SiteService { private final SiteMapper siteMapper; - private final SiteSubmissionMapper submissionMapper; + private final SiteChangeLogMapper changeLogMapper; private static final ObjectMapper objectMapper = new ObjectMapper(); // ==================== 工具方法 ==================== @@ -132,17 +132,17 @@ public class SiteServiceImpl implements SiteService { raw.put("notes", notes != null ? notes : ""); raw.put("siteStatus", status != null ? status : "正常"); - SiteSubmission sub = new SiteSubmission(); - sub.setSiteId(siteId); - sub.setSubmitterId(submitterId); - sub.setStatus("pending"); + SiteChangeLog entry = new SiteChangeLog(); + entry.setSiteId(siteId); + entry.setSubmitterId(submitterId); + entry.setStatus("pending"); try { - sub.setRawData(objectMapper.writeValueAsString(raw)); + entry.setRawData(objectMapper.writeValueAsString(raw)); } catch (JsonProcessingException e) { - throw new RuntimeException("序列化提交数据失败", e); + throw new RuntimeException("序列化变更数据失败", e); } - submissionMapper.insert(sub); - log.info("站点信息提交审核: siteId={} submissionId={}", siteId, sub.getId()); + changeLogMapper.insert(entry); + log.info("站点变更提交: siteId={} changeLogId={}", siteId, entry.getId()); } @Override @@ -181,23 +181,22 @@ public class SiteServiceImpl implements SiteService { } @Override - public List listPendingSubmissions() { - return submissionMapper.selectByStatus("pending").stream() - .map(this::toSubmissionDTO).collect(Collectors.toList()); + public List listPendingChanges() { + return changeLogMapper.selectByStatus("pending").stream() + .map(this::toChangeLogDTO).collect(Collectors.toList()); } @Override - public Site approveSubmission(Long submissionId, Long reviewerId) { - SiteSubmission sub = submissionMapper.selectById(submissionId); - if (sub == null) throw new IllegalArgumentException("提交记录不存在"); - if (!"pending".equals(sub.getStatus())) throw new IllegalArgumentException("该提交已处理"); + public Site approveChange(Long changeId, Long reviewerId) { + SiteChangeLog entry = changeLogMapper.selectById(changeId); + if (entry == null) throw new IllegalArgumentException("变更记录不存在"); + if (!"pending".equals(entry.getStatus())) throw new IllegalArgumentException("该变更已处理"); - // 解析提交数据 Map raw; try { - raw = objectMapper.readValue(sub.getRawData(), new TypeReference>() {}); + raw = objectMapper.readValue(entry.getRawData(), new TypeReference>() {}); } catch (Exception e) { - throw new RuntimeException("解析提交数据失败", e); + throw new RuntimeException("解析变更数据失败", e); } @SuppressWarnings("unchecked") @@ -206,8 +205,7 @@ public class SiteServiceImpl implements SiteService { List urls = (List) raw.getOrDefault("urls", List.of()); String notes = (String) raw.getOrDefault("notes", ""); - // 写入 sites 表 - Site existing = siteMapper.selectBySiteId(sub.getSiteId()); + Site existing = siteMapper.selectBySiteId(entry.getSiteId()); Site site; if (existing != null) { existing.setNamesJson(toJsonArray(names)); @@ -218,58 +216,57 @@ public class SiteServiceImpl implements SiteService { site = existing; } else { site = new Site(); - site.setSiteId(sub.getSiteId()); + site.setSiteId(entry.getSiteId()); site.setNamesJson(toJsonArray(names)); site.setUrlsJson(toJsonArray(urls)); site.setNotes(notes); site.setSiteType(SiteType.UNKNOWN); site.setSchemaVersion("1.0.0"); site.setStatus(SiteStatus.ACTIVE); - site.setSubmitterId(sub.getSubmitterId()); + site.setSubmitterId(entry.getSubmitterId()); siteMapper.insert(site); } - // 更新提交状态 - sub.setStatus("approved"); - sub.setReviewerId(reviewerId); - sub.setReviewedAt(java.time.LocalDateTime.now()); - sub.setSiteRecordId(site.getId()); - submissionMapper.updateById(sub); - log.info("站点审核通过: siteId={} submissionId={}", sub.getSiteId(), submissionId); + entry.setStatus("approved"); + entry.setReviewerId(reviewerId); + entry.setReviewedAt(java.time.LocalDateTime.now()); + entry.setSiteRecordId(site.getId()); + changeLogMapper.updateById(entry); + log.info("站点变更通过: siteId={} changeLogId={}", entry.getSiteId(), changeId); return site; } @Override - public void rejectSubmission(Long submissionId, Long reviewerId) { - SiteSubmission sub = submissionMapper.selectById(submissionId); - if (sub == null) throw new IllegalArgumentException("提交记录不存在"); - if (!"pending".equals(sub.getStatus())) throw new IllegalArgumentException("该提交已处理"); - sub.setStatus("rejected"); - sub.setReviewerId(reviewerId); - sub.setReviewedAt(java.time.LocalDateTime.now()); - submissionMapper.updateById(sub); - log.info("站点审核拒绝: siteId={} submissionId={}", sub.getSiteId(), submissionId); + public void rejectChange(Long changeId, Long reviewerId) { + SiteChangeLog entry = changeLogMapper.selectById(changeId); + if (entry == null) throw new IllegalArgumentException("变更记录不存在"); + if (!"pending".equals(entry.getStatus())) throw new IllegalArgumentException("该变更已处理"); + entry.setStatus("rejected"); + entry.setReviewerId(reviewerId); + entry.setReviewedAt(java.time.LocalDateTime.now()); + changeLogMapper.updateById(entry); + log.info("站点变更拒绝: siteId={} changeLogId={}", entry.getSiteId(), changeId); } @Override - public List listSubmissionsBySite(String siteId) { - return submissionMapper.selectBySiteId(siteId).stream() - .map(this::toSubmissionDTO).collect(Collectors.toList()); + public List listChangeLogBySite(String siteId) { + return changeLogMapper.selectBySiteId(siteId).stream() + .map(this::toChangeLogDTO).collect(Collectors.toList()); } - private SiteSubmissionDTO toSubmissionDTO(SiteSubmission sub) { - SiteSubmissionDTO dto = new SiteSubmissionDTO(); - dto.setId(sub.getId()); - dto.setSiteId(sub.getSiteId()); - dto.setSubmitterId(sub.getSubmitterId()); - dto.setStatus(sub.getStatus()); - dto.setReviewerId(sub.getReviewerId()); - dto.setReviewComment(sub.getReviewComment()); - dto.setReviewedAt(sub.getReviewedAt()); - dto.setCreatedAt(sub.getCreatedAt()); + private SiteChangeLogDTO toChangeLogDTO(SiteChangeLog entry) { + SiteChangeLogDTO dto = new SiteChangeLogDTO(); + dto.setId(entry.getId()); + dto.setSiteId(entry.getSiteId()); + dto.setSubmitterId(entry.getSubmitterId()); + dto.setStatus(entry.getStatus()); + dto.setReviewerId(entry.getReviewerId()); + dto.setReviewComment(entry.getReviewComment()); + dto.setReviewedAt(entry.getReviewedAt()); + dto.setCreatedAt(entry.getCreatedAt()); try { - Map raw = objectMapper.readValue(sub.getRawData(), new TypeReference>() {}); + Map raw = objectMapper.readValue(entry.getRawData(), new TypeReference>() {}); @SuppressWarnings("unchecked") List names = (List) raw.getOrDefault("names", List.of()); @SuppressWarnings("unchecked") diff --git a/par-core/src/main/resources/db/migration/V7__site_submissions.sql b/par-core/src/main/resources/db/migration/V7__site_change_log.sql similarity index 96% rename from par-core/src/main/resources/db/migration/V7__site_submissions.sql rename to par-core/src/main/resources/db/migration/V7__site_change_log.sql index e9bc0a1..93a9633 100644 --- a/par-core/src/main/resources/db/migration/V7__site_submissions.sql +++ b/par-core/src/main/resources/db/migration/V7__site_change_log.sql @@ -1,4 +1,4 @@ -CREATE TABLE site_submissions ( +CREATE TABLE site_change_log ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', site_id VARCHAR(64) NOT NULL COMMENT '站点标识', submitter_id BIGINT UNSIGNED COMMENT '提交者账户ID', diff --git a/web/src/api/index.js b/web/src/api/index.js index 95a973e..2494e25 100644 --- a/web/src/api/index.js +++ b/web/src/api/index.js @@ -36,10 +36,10 @@ export default { get: (id) => api.get(`/sites/${id}`), create: (data) => api.post('/sites', data), update: (id, data) => api.put(`/sites/${id}`, data), - pendingSubmissions: () => api.get('/admin/sites/pending'), - approveSubmission: (id) => api.post(`/admin/submissions/${id}/approve`), - rejectSubmission: (id) => api.post(`/admin/submissions/${id}/reject`), - submissionsBySite: (siteId) => api.get(`/admin/sites/${siteId}/submissions`), + pendingChanges: () => api.get('/admin/sites/pending'), + approveChange: (id) => api.post(`/admin/changes/${id}/approve`), + rejectChange: (id) => api.post(`/admin/changes/${id}/reject`), + changesBySite: (siteId) => api.get(`/admin/sites/${siteId}/changes`), }, configs: { list: () => api.get('/configs'), diff --git a/web/src/views/Sites.vue b/web/src/views/Sites.vue index 5a56fc9..1963d0b 100644 --- a/web/src/views/Sites.vue +++ b/web/src/views/Sites.vue @@ -187,7 +187,7 @@ const handleViewHistory = async (row) => { historyVisible.value = true historyLoading.value = true try { - const res = await api.sites.submissionsBySite(row.siteId) + const res = await api.sites.changesBySite(row.siteId) historyList.value = res.data || [] } catch (e) { ElMessage.error('获取变更记录失败') @@ -262,7 +262,7 @@ const fetchAll = async () => { try { const [siteRes, subRes] = await Promise.all([ api.sites.adminList(), - api.sites.pendingSubmissions(), + api.sites.pendingChanges(), ]) sites.value = siteRes.data || [] submissions.value = subRes.data || [] @@ -275,7 +275,7 @@ const fetchAll = async () => { const handleApprove = async (row) => { try { - await api.sites.approveSubmission(row.id) + await api.sites.approveChange(row.id) ElMessage.success('已通过') fetchAll() } catch (e) { @@ -287,7 +287,7 @@ const handleReject = async (row) => { try { const name = (row.names || [])[0] || row.siteId await ElMessageBox.confirm(`确认拒绝 "${name}" 的提交?`, '警告', { type: 'warning' }) - await api.sites.rejectSubmission(row.id) + await api.sites.rejectChange(row.id) ElMessage.success('已拒绝') fetchAll() } catch (e) {