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