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.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; /** * 防火墙管理控制器 *

* 提供站点、国家白名单的完整 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 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 sites = firewallSiteMapper.selectList( new LambdaQueryWrapper() .eq(FirewallSite::getStatus, 1) ); List> result = new java.util.ArrayList<>(); for (FirewallSite site : sites) { Map 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 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 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 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); } }