From aeb0696f457ca85b62d15ab6586c5779cf5cd97b Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Fri, 31 Jul 2026 16:56:21 +0800
Subject: [PATCH] feat(firewall): 添加访问日志功能
---
src/main/java/cc/mrbird/febs/firewall/controller/AdminFirewallController.java | 198 +++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 198 insertions(+), 0 deletions(-)
diff --git a/src/main/java/cc/mrbird/febs/firewall/controller/AdminFirewallController.java b/src/main/java/cc/mrbird/febs/firewall/controller/AdminFirewallController.java
new file mode 100644
index 0000000..ed4888f
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/firewall/controller/AdminFirewallController.java
@@ -0,0 +1,198 @@
+package cc.mrbird.febs.firewall.controller;
+
+import cc.mrbird.febs.common.annotation.ControllerEndpoint;
+import cc.mrbird.febs.common.controller.BaseController;
+import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.common.entity.QueryRequest;
+import cc.mrbird.febs.firewall.dto.CountryVo;
+import cc.mrbird.febs.firewall.dto.SaveCountryRuleDto;
+import cc.mrbird.febs.firewall.entity.FirewallAccessLog;
+import cc.mrbird.febs.firewall.entity.FirewallCountryRule;
+import cc.mrbird.febs.firewall.entity.FirewallIpWhite;
+import cc.mrbird.febs.firewall.entity.FirewallSite;
+import cc.mrbird.febs.firewall.mapper.FirewallSiteMapper;
+import cc.mrbird.febs.firewall.service.IFirewallRuleService;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.constraints.NotNull;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 防火墙管理控制器
+ * <p>
+ * 提供站点、国家白名单的完整 CRUD + Nginx配置生成 + reload 等管理接口
+ *
+ * @author auto-generated
+ * @date 2026-07-31
+ */
+@Slf4j
+@Validated
+@RestController
+@RequiredArgsConstructor
+@RequestMapping(value = "/admin/firewall")
+public class AdminFirewallController extends BaseController {
+
+ private final IFirewallRuleService firewallRuleService;
+ private final FirewallSiteMapper firewallSiteMapper;
+
+ // ==================== 站点数据表 CRUD ====================
+
+ /**
+ * 站点分页列表
+ */
+ @GetMapping("/siteList")
+ public FebsResponse siteList(FirewallSite site, QueryRequest request) {
+ Map<String, Object> data = getDataTable(firewallRuleService.siteList(site, request));
+ return new FebsResponse().success().data(data);
+ }
+
+ /**
+ * 保存/更新站点
+ */
+ @PostMapping("/site/save")
+ @ControllerEndpoint(operation = "保存防火墙站点")
+ public FebsResponse saveSite(@Validated FirewallSite site) {
+ return firewallRuleService.saveSite(site);
+ }
+
+ /**
+ * 删除站点
+ */
+ @GetMapping("/site/delete/{id}")
+ @ControllerEndpoint(operation = "删除防火墙站点")
+ public FebsResponse deleteSite(@PathVariable @NotNull Long id) {
+ return firewallRuleService.deleteSite(id);
+ }
+
+ /**
+ * 查询所有启用站点(下拉框用)
+ */
+ @GetMapping("/sites")
+ public FebsResponse listSites() {
+ List<FirewallSite> sites = firewallSiteMapper.selectList(
+ new LambdaQueryWrapper<FirewallSite>()
+ .eq(FirewallSite::getStatus, 1)
+ );
+
+ List<Map<String, Object>> result = new java.util.ArrayList<>();
+ for (FirewallSite site : sites) {
+ Map<String, Object> item = new HashMap<>();
+ item.put("id", site.getId());
+ item.put("siteName", site.getSiteName());
+ item.put("domain", site.getDomain());
+ item.put("status", site.getStatus());
+ result.add(item);
+ }
+ return new FebsResponse().success().data(result);
+ }
+
+ // ==================== 国家规则数据表 CRUD ====================
+
+ /**
+ * 国家规则分页列表
+ */
+ @GetMapping("/countryRuleList")
+ public FebsResponse countryRuleList(FirewallCountryRule rule, QueryRequest request) {
+ Map<String, Object> data = getDataTable(firewallRuleService.countryRuleList(rule, request));
+ return new FebsResponse().success().data(data);
+ }
+
+ /**
+ * 保存/更新单个国家规则(保存后自动生成Nginx配置)
+ */
+ @PostMapping("/countryRule/save")
+ @ControllerEndpoint(operation = "保存防火墙国家规则")
+ public FebsResponse saveCountryRuleSingle(@Validated FirewallCountryRule rule) {
+ return firewallRuleService.saveCountryRuleSingle(rule);
+ }
+
+ /**
+ * 删除单个国家规则(删除后自动生成Nginx配置)
+ */
+ @GetMapping("/countryRule/delete/{id}")
+ @ControllerEndpoint(operation = "删除防火墙国家规则")
+ public FebsResponse deleteCountryRule(@PathVariable @NotNull Long id) {
+ return firewallRuleService.deleteCountryRule(id);
+ }
+
+ // ==================== 国家白名单(原有接口) ====================
+
+ /**
+ * 查询站点允许的国家列表
+ */
+ @GetMapping("/site/{siteId}/countries")
+ public FebsResponse getCountries(@PathVariable @NotNull Long siteId) {
+ List<CountryVo> countries = firewallRuleService.getCountries(siteId);
+ return new FebsResponse().success().data(countries);
+ }
+
+ /**
+ * 批量保存站点国家白名单规则(交互式checkbox页面用)
+ */
+ @PostMapping("/site/country/save")
+ @ControllerEndpoint(operation = "批量保存防火墙国家白名单")
+ public FebsResponse saveCountryRule(@RequestBody @Validated SaveCountryRuleDto dto) {
+ firewallRuleService.saveCountryRule(dto.getSiteId(), dto.getCountries());
+ return new FebsResponse().success().message("保存成功,Nginx 配置已更新");
+ }
+
+ // ==================== Nginx Reload ====================
+
+ /**
+ * 手动触发 Nginx 配置生成 & reload
+ */
+ @PostMapping("/site/{siteId}/reload")
+ @ControllerEndpoint(operation = "手动reload Nginx配置")
+ public FebsResponse triggerReload(@PathVariable @NotNull Long siteId) {
+ firewallRuleService.triggerNginxReload(siteId);
+ return new FebsResponse().success().message("Nginx reload 信号已发送");
+ }
+
+ // ==================== IP白名单 CRUD ====================
+
+ /**
+ * IP白名单分页列表
+ */
+ @GetMapping("/ipWhiteList")
+ public FebsResponse ipWhiteList(FirewallIpWhite ipWhite, QueryRequest request) {
+ Map<String, Object> data = getDataTable(firewallRuleService.ipWhiteList(ipWhite, request));
+ return new FebsResponse().success().data(data);
+ }
+
+ /**
+ * 保存/更新IP白名单(保存后自动生成Nginx配置)
+ */
+ @PostMapping("/ipWhite/save")
+ @ControllerEndpoint(operation = "保存防火墙IP白名单")
+ public FebsResponse saveIpWhite(@Validated FirewallIpWhite ipWhite) {
+ return firewallRuleService.saveIpWhite(ipWhite);
+ }
+
+ /**
+ * 删除IP白名单(删除后自动生成Nginx配置)
+ */
+ @GetMapping("/ipWhite/delete/{id}")
+ @ControllerEndpoint(operation = "删除防火墙IP白名单")
+ public FebsResponse deleteIpWhite(@PathVariable @NotNull Long id) {
+ return firewallRuleService.deleteIpWhite(id);
+ }
+
+ // ==================== 访问日志查询 ====================
+
+ @GetMapping("/accessLogList")
+ public FebsResponse accessLogList(FirewallAccessLog log, QueryRequest request) {
+ Map<String, Object> data = getDataTable(firewallRuleService.accessLogList(log, request));
+ return new FebsResponse().success().data(data);
+ }
+}
--
Gitblit v1.9.1