().eq("name", "captcha_type"));
- String captchaType;
- if (viteConfig == null || Objects.equals(viteConfig.getValue(), "RANDOM")) {
- captchaType = getRandomOption();
- }else {
- captchaType = viteConfig.getValue();
- }
- return application.generateCaptcha(captchaType);
- }
-
-
- @PostMapping("/verify")
- public ApiResponse> verify(@Valid @RequestBody CaptchaVerifyDto verifyDto) {
- ApiResponse> response = application.matching(verifyDto.getId(), verifyDto.getData());
- if (response.isSuccess()) {
- return ApiResponse.ofSuccess(Collections.singletonMap("validToken", verifyDto.getId()));
- }
- return response;
- }
-
- public static String getRandomOption() {
- int index = ThreadLocalRandom.current().nextInt(OPTIONS.length);
- return OPTIONS[index];
- }
-}
diff --git a/springboot-backend/src/main/java/com/admin/controller/CustomErrorController.java b/springboot-backend/src/main/java/com/admin/controller/CustomErrorController.java
deleted file mode 100644
index 05ff38b..0000000
--- a/springboot-backend/src/main/java/com/admin/controller/CustomErrorController.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package com.admin.controller;
-
-import org.springframework.boot.web.servlet.error.ErrorController;
-import org.springframework.http.HttpStatus;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.RequestMapping;
-
-import javax.servlet.RequestDispatcher;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
-
-@Controller
-public class CustomErrorController implements ErrorController {
-
- @RequestMapping("/error")
- public void handleError(HttpServletRequest request, HttpServletResponse response) throws IOException {
- Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);
-
- response.setContentType("text/html; charset=UTF-8");
-
- if (status != null) {
- int statusCode = Integer.valueOf(status.toString());
-
- if (statusCode == HttpStatus.NOT_FOUND.value()) {
- response.setStatus(HttpStatus.NOT_FOUND.value());
- String html = generateErrorHtml(
- "404",
- "你推开了后端的大门,却发现里面只有寂寞。",
- request.getRequestURI()
- );
- response.getWriter().write(html);
- }
- }
- }
-
- private String generateErrorHtml(String statusCode, String title, String path) {
- return "" +
- "" +
- "" +
- " " +
- " " +
- " 错误 " + statusCode + "" +
- " " +
- "" +
- "" +
- " " + statusCode + "
" +
- " " + title + "
" +
- "" +
- "";
- }
-}
\ No newline at end of file
diff --git a/springboot-backend/src/main/java/com/admin/controller/FlowController.java b/springboot-backend/src/main/java/com/admin/controller/FlowController.java
deleted file mode 100644
index 7760ae7..0000000
--- a/springboot-backend/src/main/java/com/admin/controller/FlowController.java
+++ /dev/null
@@ -1,389 +0,0 @@
-package com.admin.controller;
-
-import com.admin.common.aop.LogAnnotation;
-import com.admin.common.dto.FlowDto;
-import com.admin.common.dto.GostConfigDto;
-import com.admin.common.task.CheckGostConfigAsync;
-import com.admin.common.utils.AESCrypto;
-import com.admin.common.utils.GostUtil;
-import com.admin.entity.*;
-import com.admin.service.ChainTunnelService;
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
-import org.springframework.context.annotation.Lazy;
-import org.springframework.web.bind.annotation.*;
-import lombok.extern.slf4j.Slf4j;
-
-import javax.annotation.Resource;
-import java.math.BigDecimal;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * 流量上报控制器
- * 处理节点上报的流量数据,更新用户和隧道的流量统计
- *
- * 主要功能:
- * 1. 接收并处理节点上报的流量数据
- * 2. 更新转发、用户和隧道的流量统计
- * 3. 检查用户总流量限制,超限时暂停所有服务
- * 4. 检查隧道流量限制,超限时暂停对应服务
- * 5. 检查用户到期时间,到期时暂停所有服务
- * 6. 检查隧道权限到期时间,到期时暂停对应服务
- * 7. 检查用户状态,状态不为1时暂停所有服务
- * 8. 检查转发状态,状态不为1时暂停对应转发
- * 9. 检查用户隧道权限状态,状态不为1时暂停对应转发
- *
- * 并发安全解决方案:
- * 1. 使用UpdateWrapper进行数据库层面的原子更新操作,避免读取-修改-写入的竞态条件
- * 2. 使用synchronized锁确保同一用户/隧道的流量更新串行执行
- * 3. 这样可以避免相同用户相同隧道不同转发同时上报时流量统计丢失的问题
- */
-@RestController
-@RequestMapping("/flow")
-@CrossOrigin
-@Slf4j
-public class FlowController extends BaseController {
-
- // 常量定义
- private static final String SUCCESS_RESPONSE = "ok";
- private static final String DEFAULT_USER_TUNNEL_ID = "0";
- private static final long BYTES_TO_GB = 1024L * 1024L * 1024L;
-
- // 用于同步相同用户和隧道的流量更新操作
- private static final ConcurrentHashMap USER_LOCKS = new ConcurrentHashMap<>();
- private static final ConcurrentHashMap TUNNEL_LOCKS = new ConcurrentHashMap<>();
- private static final ConcurrentHashMap FORWARD_LOCKS = new ConcurrentHashMap<>();
-
- // 缓存加密器实例,避免重复创建
- private static final ConcurrentHashMap CRYPTO_CACHE = new ConcurrentHashMap<>();
-
- @Resource
- CheckGostConfigAsync checkGostConfigAsync;
-
- @Resource
- @Lazy
- ChainTunnelService chainTunnelService;
-
- /**
- * 加密消息包装器
- */
- public static class EncryptedMessage {
- private boolean encrypted;
- private String data;
- private Long timestamp;
-
- // getters and setters
- public boolean isEncrypted() {
- return encrypted;
- }
-
- public void setEncrypted(boolean encrypted) {
- this.encrypted = encrypted;
- }
-
- public String getData() {
- return data;
- }
-
- public void setData(String data) {
- this.data = data;
- }
-
- public Long getTimestamp() {
- return timestamp;
- }
-
- public void setTimestamp(Long timestamp) {
- this.timestamp = timestamp;
- }
- }
-
- @PostMapping("/config")
- @LogAnnotation
- public String config(@RequestBody String rawData, String secret) {
- Node node = nodeService.getOne(new QueryWrapper().eq("secret", secret));
- if (node == null) return SUCCESS_RESPONSE;
-
- try {
- // 尝试解密数据
- String decryptedData = decryptIfNeeded(rawData, secret);
-
- // 解析为GostConfigDto
- GostConfigDto gostConfigDto = JSON.parseObject(decryptedData, GostConfigDto.class);
- checkGostConfigAsync.cleanNodeConfigs(node.getId().toString(), gostConfigDto);
-
- log.info("🔓 节点 {} 配置数据接收成功{}", node.getId(), isEncryptedMessage(rawData) ? "(已解密)" : "");
-
- } catch (Exception e) {
- log.error("处理节点 {} 配置数据失败: {}", node.getId(), e.getMessage());
- }
-
- return SUCCESS_RESPONSE;
- }
-
- @RequestMapping("/test")
- @LogAnnotation
- public String test() {
- return "test";
- }
-
- /**
- * 处理流量数据上报
- *
- * @param rawData 原始数据(可能是加密的)
- * @param secret 节点密钥
- * @return 处理结果
- */
- @RequestMapping("/upload")
- @LogAnnotation
- public String uploadFlowData(@RequestBody String rawData, String secret) {
- // 1. 验证节点权限
- if (!isValidNode(secret)) {
- return SUCCESS_RESPONSE;
- }
-
- // 2. 尝试解密数据
- String decryptedData = decryptIfNeeded(rawData, secret);
-
- // 3. 解析为FlowDto列表
- JSONArray flowDataList = JSONObject.parseArray(decryptedData);
- log.info("节点上报流量数据{}", flowDataList);
- for (int i = 0; i < flowDataList.size(); i++) {
- String jsonObject = flowDataList.getJSONObject(i).toJSONString();
- FlowDto flowDto = JSONObject.parseObject(jsonObject, FlowDto.class);
- if (!Objects.equals(flowDto.getN(), "web_api")) {
- processFlowData(flowDto);
- }
- }
- return SUCCESS_RESPONSE;
-
- }
-
- /**
- * 检测消息是否为加密格式
- */
- private boolean isEncryptedMessage(String data) {
- try {
- JSONObject json = JSON.parseObject(data);
- return json.getBooleanValue("encrypted");
- } catch (Exception e) {
- return false;
- }
- }
-
- /**
- * 根据需要解密数据
- */
- private String decryptIfNeeded(String rawData, String secret) {
- if (rawData == null || rawData.trim().isEmpty()) {
- throw new IllegalArgumentException("数据不能为空");
- }
-
- try {
- // 尝试解析为加密消息格式
- EncryptedMessage encryptedMessage = JSON.parseObject(rawData, EncryptedMessage.class);
-
- if (encryptedMessage.isEncrypted() && encryptedMessage.getData() != null) {
- // 获取或创建加密器
- AESCrypto crypto = getOrCreateCrypto(secret);
- if (crypto == null) {
- log.info("⚠️ 收到加密消息但无法创建解密器,使用原始数据");
- return rawData;
- }
-
- // 解密数据
- String decryptedData = crypto.decryptString(encryptedMessage.getData());
- return decryptedData;
- }
- } catch (Exception e) {
- // 解析失败,可能是非加密格式,直接返回原始数据
- log.info("数据未加密或解密失败,使用原始数据: {}", e.getMessage());
- }
-
- return rawData;
- }
-
- /**
- * 获取或创建加密器实例
- */
- private AESCrypto getOrCreateCrypto(String secret) {
- return CRYPTO_CACHE.computeIfAbsent(secret, AESCrypto::create);
- }
-
- /**
- * 处理流量数据的核心逻辑
- */
- private void processFlowData(FlowDto flowDataList) {
- String[] serviceIds = parseServiceName(flowDataList.getN());
- String forwardId = serviceIds[0];
- String userId = serviceIds[1];
- String userTunnelId = serviceIds[2];
-
- Forward forward = forwardService.getById(forwardId);
- if (forward != null){
- Tunnel tunnel = tunnelService.getById(forward.getTunnelId());
-
- // 处理流量倍率及单双向计算
- BigDecimal trafficRatio = tunnel.getTrafficRatio();
- BigDecimal originalD = BigDecimal.valueOf(flowDataList.getD());
- BigDecimal originalU = BigDecimal.valueOf(flowDataList.getU());
- BigDecimal newD = originalD.multiply(trafficRatio);
- BigDecimal newU = originalU.multiply(trafficRatio);
- flowDataList.setD(newD.longValue() * tunnel.getFlow());
- flowDataList.setU(newU.longValue() * tunnel.getFlow());
- }
-
- // 先更新所有流量统计 - 确保流量数据的一致性
- updateForwardFlow(forwardId, flowDataList);
- updateUserFlow(userId, flowDataList);
- updateUserTunnelFlow(userTunnelId, flowDataList);
-
- // 7. 检查和服务暂停操作
- String name = buildServiceName(forwardId, userId, userTunnelId);
- if (!Objects.equals(userTunnelId, DEFAULT_USER_TUNNEL_ID)) { // 非管理员的转发需要检测流量限制
- checkUserRelatedLimits(userId, name);
- checkUserTunnelRelatedLimits(userTunnelId, name, userId);
- }
-
- }
-
- private void checkUserRelatedLimits(String userId, String name) {
-
- // 重新查询用户以获取最新的流量数据
- User updatedUser = userService.getById(userId);
- if (updatedUser == null) return;
-
- // 检查用户总流量限制
- long userFlowLimit = updatedUser.getFlow() * BYTES_TO_GB;
- long userCurrentFlow = updatedUser.getInFlow() + updatedUser.getOutFlow();
- if (userFlowLimit < userCurrentFlow) {
- pauseAllUserServices(userId, name);
- return;
- }
-
- // 检查用户到期时间
- if (updatedUser.getExpTime() != null && updatedUser.getExpTime() <= new Date().getTime()) {
- pauseAllUserServices(userId, name);
- return;
- }
-
- // 检查用户状态
- if (updatedUser.getStatus() != 1) {
- pauseAllUserServices(userId, name);
- }
- }
-
- public void pauseAllUserServices(String userId, String name) {
- List forwardList = forwardService.list(new QueryWrapper().eq("user_id", userId));
- pauseService(forwardList, name);
- }
-
- public void checkUserTunnelRelatedLimits(String userTunnelId, String name, String userId) {
-
- UserTunnel userTunnel = userTunnelService.getById(userTunnelId);
- if (userTunnel == null) return;
- long flow = userTunnel.getInFlow() + userTunnel.getOutFlow();
- if (flow >= userTunnel.getFlow() * BYTES_TO_GB) {
- pauseSpecificForward(userTunnel.getTunnelId(), name, userId);
- return;
- }
-
- if (userTunnel.getExpTime() != null && userTunnel.getExpTime() <= System.currentTimeMillis()) {
- pauseSpecificForward(userTunnel.getTunnelId(), name, userId);
- return;
- }
-
- if (userTunnel.getStatus() != 1) {
- pauseSpecificForward(userTunnel.getTunnelId(), name, userId);
- }
-
-
- }
-
- private void pauseSpecificForward(Integer tunnelId, String name, String userId) {
- List forwardList = forwardService.list(new QueryWrapper().eq("tunnel_id", tunnelId).eq("user_id", userId));
- pauseService(forwardList, name);
- }
-
- public void pauseService(List forwardList, String name) {
- for (Forward forward : forwardList) {
- List chainTunnels = chainTunnelService.list(new QueryWrapper().eq("tunnel_id", forward.getTunnelId()).eq("chain_type", 1));
- for (ChainTunnel chainTunnel : chainTunnels) {
- GostUtil.PauseAndResumeService(chainTunnel.getNodeId(), name, "PauseService");
- }
- forward.setStatus(0);
- forwardService.updateById(forward);
- }
- }
-
- private void updateForwardFlow(String forwardId, FlowDto flowStats) {
- // 对相同转发的流量更新进行同步,避免并发覆盖
- synchronized (getForwardLock(forwardId)) {
- UpdateWrapper updateWrapper = new UpdateWrapper<>();
- updateWrapper.eq("id", forwardId);
- updateWrapper.setSql("in_flow = in_flow + " + flowStats.getD());
- updateWrapper.setSql("out_flow = out_flow + " + flowStats.getU());
-
- forwardService.update(null, updateWrapper);
- }
- }
-
- private void updateUserFlow(String userId, FlowDto flowStats) {
- // 对相同用户的流量更新进行同步,避免并发覆盖
- synchronized (getUserLock(userId)) {
- UpdateWrapper updateWrapper = new UpdateWrapper<>();
- updateWrapper.eq("id", userId);
-
- updateWrapper.setSql("in_flow = in_flow + " + flowStats.getD());
- updateWrapper.setSql("out_flow = out_flow + " + flowStats.getU());
-
- userService.update(null, updateWrapper);
- }
- }
-
- private void updateUserTunnelFlow(String userTunnelId, FlowDto flowStats) {
- if (Objects.equals(userTunnelId, DEFAULT_USER_TUNNEL_ID)) {
- return; // 默认隧道不需要更新,返回成功
- }
-
- // 对相同用户隧道的流量更新进行同步,避免并发覆盖
- synchronized (getTunnelLock(userTunnelId)) {
- UpdateWrapper updateWrapper = new UpdateWrapper<>();
- updateWrapper.eq("id", userTunnelId);
- updateWrapper.setSql("in_flow = in_flow + " + flowStats.getD());
- updateWrapper.setSql("out_flow = out_flow + " + flowStats.getU());
- userTunnelService.update(null, updateWrapper);
- }
- }
-
- private Object getUserLock(String userId) {
- return USER_LOCKS.computeIfAbsent(userId, k -> new Object());
- }
-
- private Object getTunnelLock(String userTunnelId) {
- return TUNNEL_LOCKS.computeIfAbsent(userTunnelId, k -> new Object());
- }
-
- private Object getForwardLock(String forwardId) {
- return FORWARD_LOCKS.computeIfAbsent(forwardId, k -> new Object());
- }
-
- private boolean isValidNode(String secret) {
- int nodeCount = nodeService.count(new QueryWrapper().eq("secret", secret));
- return nodeCount > 0;
- }
-
- private String[] parseServiceName(String serviceName) {
- return serviceName.split("_");
- }
-
- private String buildServiceName(String forwardId, String userId, String userTunnelId) {
- return forwardId + "_" + userId + "_" + userTunnelId;
- }
-}
diff --git a/springboot-backend/src/main/java/com/admin/controller/ForwardController.java b/springboot-backend/src/main/java/com/admin/controller/ForwardController.java
deleted file mode 100644
index b8c55c3..0000000
--- a/springboot-backend/src/main/java/com/admin/controller/ForwardController.java
+++ /dev/null
@@ -1,133 +0,0 @@
-package com.admin.controller;
-
-import com.admin.common.aop.LogAnnotation;
-import com.admin.common.annotation.RequireRole;
-import com.admin.common.dto.BatchDeleteDto;
-import com.admin.common.dto.BatchRedeployDto;
-import com.admin.common.dto.BatchChangeTunnelDto;
-import com.admin.common.dto.ForwardDto;
-import com.admin.common.dto.ForwardUpdateDto;
-import com.admin.common.lang.R;
-import com.admin.service.ForwardService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.Map;
-
-/**
- *
- * 前端控制器
- *
- *
- * @author QAQ
- * @since 2025-06-03
- */
-@RestController
-@CrossOrigin
-@RequestMapping("/api/v1/forward")
-public class ForwardController extends BaseController {
-
- @Autowired
- private ForwardService forwardService;
-
- @LogAnnotation
- @PostMapping("/create")
- public R create(@Validated @RequestBody ForwardDto forwardDto) {
- return forwardService.createForward(forwardDto);
- }
-
- @LogAnnotation
- @PostMapping("/list")
- public R readAll() {
- return forwardService.getAllForwards();
- }
-
- @LogAnnotation
- @PostMapping("/update")
- public R update(@Validated @RequestBody ForwardUpdateDto forwardUpdateDto) {
- return forwardService.updateForward(forwardUpdateDto);
- }
-
- @LogAnnotation
- @PostMapping("/delete")
- public R delete(@RequestBody Map params) {
- Long id = Long.valueOf(params.get("id").toString());
- return forwardService.deleteForward(id);
- }
-
- @LogAnnotation
- @PostMapping("/force-delete")
- public R forceDelete(@RequestBody Map params) {
- Long id = Long.valueOf(params.get("id").toString());
- return forwardService.forceDeleteForward(id);
- }
-
- @LogAnnotation
- @PostMapping("/pause")
- public R pause(@RequestBody Map params) {
- Long id = Long.valueOf(params.get("id").toString());
- return forwardService.pauseForward(id);
- }
-
- @LogAnnotation
- @PostMapping("/resume")
- public R resume(@RequestBody Map params) {
- Long id = Long.valueOf(params.get("id").toString());
- return forwardService.resumeForward(id);
- }
-
- /**
- * 转发诊断功能
- * @param params 包含forwardId的参数
- * @return 诊断结果
- */
- @LogAnnotation
- @PostMapping("/diagnose")
- public R diagnoseForward(@RequestBody Map params) {
- Long forwardId = Long.valueOf(params.get("forwardId").toString());
- return forwardService.diagnoseForward(forwardId);
- }
-
- /**
- * 更新转发排序
- * @param params 包含forwards数组的参数,每个元素包含id和inx
- * @return 更新结果
- */
- @LogAnnotation
- @PostMapping("/update-order")
- public R updateForwardOrder(@RequestBody Map params) {
- return forwardService.updateForwardOrder(params);
- }
-
- @LogAnnotation
- @PostMapping("/batch-delete")
- public R batchDelete(@Validated @RequestBody BatchDeleteDto batchDeleteDto) {
- return forwardService.batchDeleteForwards(batchDeleteDto);
- }
-
- @LogAnnotation
- @PostMapping("/batch-pause")
- public R batchPause(@Validated @RequestBody BatchDeleteDto batchDeleteDto) {
- return forwardService.batchPauseForwards(batchDeleteDto);
- }
-
- @LogAnnotation
- @PostMapping("/batch-resume")
- public R batchResume(@Validated @RequestBody BatchDeleteDto batchDeleteDto) {
- return forwardService.batchResumeForwards(batchDeleteDto);
- }
-
- @LogAnnotation
- @PostMapping("/batch-redeploy")
- public R batchRedeploy(@Validated @RequestBody BatchRedeployDto batchRedeployDto) {
- return forwardService.batchRedeployForwards(batchRedeployDto);
- }
-
- @LogAnnotation
- @PostMapping("/batch-change-tunnel")
- public R batchChangeTunnel(@Validated @RequestBody BatchChangeTunnelDto batchChangeTunnelDto) {
- return forwardService.batchChangeTunnel(batchChangeTunnelDto);
- }
-
-}
diff --git a/springboot-backend/src/main/java/com/admin/controller/GroupController.java b/springboot-backend/src/main/java/com/admin/controller/GroupController.java
deleted file mode 100644
index 63845d4..0000000
--- a/springboot-backend/src/main/java/com/admin/controller/GroupController.java
+++ /dev/null
@@ -1,123 +0,0 @@
-package com.admin.controller;
-
-import com.admin.common.aop.LogAnnotation;
-import com.admin.common.annotation.RequireRole;
-import com.admin.common.dto.GroupCreateDto;
-import com.admin.common.dto.GroupPermissionAssignDto;
-import com.admin.common.dto.GroupUpdateDto;
-import com.admin.common.dto.TunnelGroupAssignTunnelsDto;
-import com.admin.common.dto.UserGroupAssignUsersDto;
-import com.admin.common.lang.R;
-import com.admin.service.GroupService;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.CrossOrigin;
-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.annotation.Resource;
-import java.util.Map;
-
-@RestController
-@CrossOrigin
-@RequestMapping("/api/v1/group")
-public class GroupController {
-
- @Resource
- private GroupService groupService;
-
- @LogAnnotation
- @RequireRole
- @PostMapping("/tunnel/list")
- public R tunnelGroupList() {
- return groupService.getTunnelGroups();
- }
-
- @LogAnnotation
- @RequireRole
- @PostMapping("/tunnel/create")
- public R createTunnelGroup(@Validated @RequestBody GroupCreateDto dto) {
- return groupService.createTunnelGroup(dto);
- }
-
- @LogAnnotation
- @RequireRole
- @PostMapping("/tunnel/update")
- public R updateTunnelGroup(@Validated @RequestBody GroupUpdateDto dto) {
- return groupService.updateTunnelGroup(dto);
- }
-
- @LogAnnotation
- @RequireRole
- @PostMapping("/tunnel/delete")
- public R deleteTunnelGroup(@RequestBody Map params) {
- Long id = Long.valueOf(params.get("id").toString());
- return groupService.deleteTunnelGroup(id);
- }
-
- @LogAnnotation
- @RequireRole
- @PostMapping("/tunnel/assign")
- public R assignTunnels(@Validated @RequestBody TunnelGroupAssignTunnelsDto dto) {
- return groupService.assignTunnelsToGroup(dto);
- }
-
- @LogAnnotation
- @RequireRole
- @PostMapping("/user/list")
- public R userGroupList() {
- return groupService.getUserGroups();
- }
-
- @LogAnnotation
- @RequireRole
- @PostMapping("/user/create")
- public R createUserGroup(@Validated @RequestBody GroupCreateDto dto) {
- return groupService.createUserGroup(dto);
- }
-
- @LogAnnotation
- @RequireRole
- @PostMapping("/user/update")
- public R updateUserGroup(@Validated @RequestBody GroupUpdateDto dto) {
- return groupService.updateUserGroup(dto);
- }
-
- @LogAnnotation
- @RequireRole
- @PostMapping("/user/delete")
- public R deleteUserGroup(@RequestBody Map params) {
- Long id = Long.valueOf(params.get("id").toString());
- return groupService.deleteUserGroup(id);
- }
-
- @LogAnnotation
- @RequireRole
- @PostMapping("/user/assign")
- public R assignUsers(@Validated @RequestBody UserGroupAssignUsersDto dto) {
- return groupService.assignUsersToGroup(dto);
- }
-
- @LogAnnotation
- @RequireRole
- @PostMapping("/permission/list")
- public R listPermissions() {
- return groupService.getGroupPermissions();
- }
-
- @LogAnnotation
- @RequireRole
- @PostMapping("/permission/assign")
- public R assignPermission(@Validated @RequestBody GroupPermissionAssignDto dto) {
- return groupService.assignGroupPermission(dto);
- }
-
- @LogAnnotation
- @RequireRole
- @PostMapping("/permission/remove")
- public R removePermission(@RequestBody Map params) {
- Long id = Long.valueOf(params.get("id").toString());
- return groupService.removeGroupPermission(id);
- }
-}
diff --git a/springboot-backend/src/main/java/com/admin/controller/NodeController.java b/springboot-backend/src/main/java/com/admin/controller/NodeController.java
deleted file mode 100644
index 131a6e8..0000000
--- a/springboot-backend/src/main/java/com/admin/controller/NodeController.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package com.admin.controller;
-
-
-import com.admin.common.annotation.RequireRole;
-import com.admin.common.aop.LogAnnotation;
-import com.admin.common.dto.BatchDeleteDto;
-import com.admin.common.dto.NodeDto;
-import com.admin.common.dto.NodeUpdateDto;
-import com.admin.common.lang.R;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.Map;
-
-/**
- *
- * 前端控制器
- *
- *
- * @author QAQ
- * @since 2025-06-03
- */
-@RestController
-@CrossOrigin
-@RequestMapping("/api/v1/node")
-public class NodeController extends BaseController {
-
- @LogAnnotation
- @RequireRole
- @PostMapping("/create")
- public R create(@Validated @RequestBody NodeDto nodeDto) {
- return nodeService.createNode(nodeDto);
- }
-
-
- @LogAnnotation
- @RequireRole
- @PostMapping("/list")
- public R list() {
- return nodeService.getAllNodes();
- }
-
- @LogAnnotation
- @RequireRole
- @PostMapping("/update")
- public R update(@Validated @RequestBody NodeUpdateDto nodeUpdateDto) {
- return nodeService.updateNode(nodeUpdateDto);
- }
-
- @LogAnnotation
- @RequireRole
- @PostMapping("/delete")
- public R delete(@RequestBody Map params) {
- Long id = Long.valueOf(params.get("id").toString());
- return nodeService.deleteNode(id);
- }
-
- @LogAnnotation
- @RequireRole
- @PostMapping("/install")
- public R getInstallCommand(@RequestBody Map params) {
- Long id = Long.valueOf(params.get("id").toString());
- return nodeService.getInstallCommand(id);
- }
-
- /**
- * 更新节点排序
- * @param params 包含nodes数组的参数,每个元素包含id和inx
- * @return 更新结果
- */
- @LogAnnotation
- @RequireRole
- @PostMapping("/update-order")
- public R updateNodeOrder(@RequestBody Map params) {
- return nodeService.updateNodeOrder(params);
- }
-
- @LogAnnotation
- @RequireRole
- @PostMapping("/batch-delete")
- public R batchDelete(@Validated @RequestBody BatchDeleteDto batchDeleteDto) {
- return nodeService.batchDeleteNodes(batchDeleteDto);
- }
-
-}
diff --git a/springboot-backend/src/main/java/com/admin/controller/OpenApiController.java b/springboot-backend/src/main/java/com/admin/controller/OpenApiController.java
deleted file mode 100644
index a0882de..0000000
--- a/springboot-backend/src/main/java/com/admin/controller/OpenApiController.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package com.admin.controller;
-
-
-import com.admin.common.aop.LogAnnotation;
-import com.admin.common.lang.R;
-import javax.servlet.http.HttpServletResponse;
-
-import com.admin.common.utils.Md5Util;
-import com.admin.entity.User;
-import com.admin.entity.UserTunnel;
-import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.Objects;
-
-@RestController
-@CrossOrigin
-@RequestMapping("/api/v1/open_api")
-public class OpenApiController extends BaseController {
-
- @LogAnnotation
- @GetMapping("/sub_store")
- public Object create(
- @RequestParam("user") String user,
- @RequestParam("pwd") String pwd,
- @RequestParam(value = "tunnel", required = false, defaultValue = "-1") String tunnel,
- HttpServletResponse response) {
- JSONObject result = new JSONObject();
- result.put("upload", 0);
- result.put("download", 0);
- result.put("total", 0);
- result.put("expire", 0);
- // 校验 user 是否为空
- if (user == null || user.isEmpty()) {
- return R.err("用户不能为空");
- }
- if (pwd == null || pwd.isEmpty()) {
- return R.err("密码不能为空");
- }
-
- User userInfo = userService.getOne(new QueryWrapper().eq("user", user));
- if (userInfo == null) {
- return R.err("鉴权失败");
- }
-
- String pwdMd5 = Md5Util.md5(pwd);
- if (!Objects.equals(pwdMd5, userInfo.getPwd())) {
- return R.err("鉴权失败");
- }
-
- final long GIGA = 1024L * 1024L * 1024L;
- String headerValue;
-
- if ("-1".equals(tunnel)) {
- headerValue = buildSubscriptionHeader(
- userInfo.getOutFlow(),
- userInfo.getInFlow(),
- userInfo.getFlow() * GIGA,
- userInfo.getExpTime() / 1000
- );
- } else {
- UserTunnel tunnelInfo = userTunnelService.getById(tunnel);
- if (tunnelInfo == null) return R.err("隧道不存在");
- if (!tunnelInfo.getUserId().toString().equals(userInfo.getId().toString())) return R.err("隧道不存在");
- headerValue = buildSubscriptionHeader(
- tunnelInfo.getOutFlow(),
- tunnelInfo.getInFlow(),
- tunnelInfo.getFlow() * GIGA,
- tunnelInfo.getExpTime() / 1000
- );
- }
-
- response.setHeader("subscription-userinfo", headerValue);
- return headerValue;
- }
-
-
-
- private String buildSubscriptionHeader(long upload, long download, long total, long expire) {
- return String.format("upload=%d; download=%d; total=%d; expire=%d", download, upload, total, expire);
- }
-
-
-}
diff --git a/springboot-backend/src/main/java/com/admin/controller/SpeedLimitController.java b/springboot-backend/src/main/java/com/admin/controller/SpeedLimitController.java
deleted file mode 100644
index c827854..0000000
--- a/springboot-backend/src/main/java/com/admin/controller/SpeedLimitController.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package com.admin.controller;
-
-import com.admin.common.aop.LogAnnotation;
-import com.admin.common.annotation.RequireRole;
-import com.admin.common.dto.SpeedLimitDto;
-import com.admin.common.dto.SpeedLimitUpdateDto;
-import com.admin.common.lang.R;
-import com.admin.service.SpeedLimitService;
-import com.admin.service.TunnelService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.Map;
-
-/**
- *
- * 限速规则前端控制器
- *
- *
- * @author QAQ
- * @since 2025-06-04
- */
-@RestController
-@RequestMapping("/api/v1/speed-limit")
-@CrossOrigin
-public class SpeedLimitController extends BaseController {
-
- @Autowired
- private SpeedLimitService speedLimitService;
-
- @Autowired
- private TunnelService tunnelService;
-
- @LogAnnotation
- @RequireRole
- @PostMapping("/create")
- public R create(@Validated @RequestBody SpeedLimitDto speedLimitDto) {
- return speedLimitService.createSpeedLimit(speedLimitDto);
- }
-
- @LogAnnotation
- @RequireRole
- @PostMapping("/list")
- public R list() {
- return speedLimitService.getAllSpeedLimits();
- }
-
- @LogAnnotation
- @RequireRole
- @PostMapping("/update")
- public R update(@Validated @RequestBody SpeedLimitUpdateDto speedLimitUpdateDto) {
- return speedLimitService.updateSpeedLimit(speedLimitUpdateDto);
- }
-
- @LogAnnotation
- @RequireRole
- @PostMapping("/delete")
- public R delete(@RequestBody Map params) {
- Long id = Long.valueOf(params.get("id").toString());
- return speedLimitService.deleteSpeedLimit(id);
- }
-
- @LogAnnotation
- @RequireRole
- @PostMapping("/tunnels")
- public R getTunnels() {
- return tunnelService.getAllTunnels();
- }
-}
diff --git a/springboot-backend/src/main/java/com/admin/controller/TunnelController.java b/springboot-backend/src/main/java/com/admin/controller/TunnelController.java
deleted file mode 100644
index 5c797d2..0000000
--- a/springboot-backend/src/main/java/com/admin/controller/TunnelController.java
+++ /dev/null
@@ -1,176 +0,0 @@
-package com.admin.controller;
-
-import com.admin.common.aop.LogAnnotation;
-import com.admin.common.annotation.RequireRole;
-import com.admin.common.dto.BatchDeleteDto;
-import com.admin.common.dto.BatchRedeployDto;
-import com.admin.common.dto.TunnelDto;
-import com.admin.common.dto.TunnelUpdateDto;
-
-import com.admin.common.dto.UserTunnelBatchAssignDto;
-import com.admin.common.dto.UserTunnelDto;
-import com.admin.common.dto.UserTunnelQueryDto;
-import com.admin.common.dto.UserTunnelUpdateDto;
-import com.admin.common.lang.R;
-import com.admin.service.TunnelService;
-import com.admin.service.UserTunnelService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.Map;
-
-/**
- *
- * 隧道前端控制器
- *
- *
- * @author QAQ
- * @since 2025-06-03
- */
-@RestController
-@CrossOrigin
-@RequestMapping("/api/v1/tunnel")
-public class TunnelController extends BaseController {
-
- @Autowired
- private TunnelService tunnelService;
-
- @Autowired
- private UserTunnelService userTunnelService;
-
- @LogAnnotation
- @RequireRole
- @PostMapping("/create")
- public R create(@Validated @RequestBody TunnelDto tunnelDto) {
- return tunnelService.createTunnel(tunnelDto);
- }
-
- @LogAnnotation
- @RequireRole
- @PostMapping("/list")
- public R readAll() {
- return tunnelService.getAllTunnels();
- }
-
- @LogAnnotation
- @RequireRole
- @PostMapping("/update")
- public R update(@Validated @RequestBody TunnelUpdateDto tunnelUpdateDto) {
- return tunnelService.updateTunnel(tunnelUpdateDto);
- }
-
- @LogAnnotation
- @RequireRole
- @PostMapping("/delete")
- public R delete(@RequestBody Map params) {
- Long id = Long.valueOf(params.get("id").toString());
- return tunnelService.deleteTunnel(id);
- }
-
- // ============ 用户隧道权限管理相关方法 ============
-
- /**
- * 分配用户隧道权限
- * @param userTunnelDto 用户隧道权限数据
- * @return 操作结果
- */
- @LogAnnotation
- @RequireRole
- @PostMapping("/user/assign")
- public R assignUserTunnel(@Validated @RequestBody UserTunnelDto userTunnelDto) {
- return userTunnelService.assignUserTunnel(userTunnelDto);
- }
-
- @LogAnnotation
- @RequireRole
- @PostMapping("/user/batch-assign")
- public R batchAssignUserTunnel(@Validated @RequestBody UserTunnelBatchAssignDto batchAssignDto) {
- return userTunnelService.batchAssignUserTunnel(batchAssignDto);
- }
-
- /**
- * 查询用户隧道权限列表
- * @param queryDto 查询条件
- * @return 用户隧道权限列表
- */
- @LogAnnotation
- @RequireRole
- @PostMapping("/user/list")
- public R getUserTunnelList(@RequestBody @Validated UserTunnelQueryDto queryDto) {
- return userTunnelService.getUserTunnelList(queryDto);
- }
-
- /**
- * 删除用户隧道权限
- * @param params 包含userId和tunnelId的参数
- * @return 操作结果
- */
- @LogAnnotation
- @RequireRole
- @PostMapping("/user/remove")
- public R removeUserTunnel(@RequestBody Map params) {
- Integer id = Integer.valueOf(params.get("id").toString());
- return userTunnelService.removeUserTunnel(id);
- }
-
-
- /**
- * 更新用户隧道权限(包含流量、流量重置时间、到期时间)
- * @param updateDto 更新数据
- * @return 操作结果
- */
- @LogAnnotation
- @RequireRole
- @PostMapping("/user/update")
- public R updateUserTunnel(@Validated @RequestBody UserTunnelUpdateDto updateDto) {
- return userTunnelService.updateUserTunnel(updateDto);
- }
-
-
- @LogAnnotation
- @PostMapping("/user/tunnel")
- public R userTunnel() {
- return tunnelService.userTunnel();
- }
-
- /**
- * 隧道诊断功能
- * @param params 包含tunnelId的参数
- * @return 诊断结果
- */
- @LogAnnotation
- @RequireRole
- @PostMapping("/diagnose")
- public R diagnoseTunnel(@RequestBody Map params) {
- Long tunnelId = Long.valueOf(params.get("tunnelId").toString());
- return tunnelService.diagnoseTunnel(tunnelId);
- }
-
- /**
- * 更新隧道排序
- * @param params 包含tunnels数组的参数,每个元素包含id和inx
- * @return 更新结果
- */
- @LogAnnotation
- @RequireRole
- @PostMapping("/update-order")
- public R updateTunnelOrder(@RequestBody Map params) {
- return tunnelService.updateTunnelOrder(params);
- }
-
- @LogAnnotation
- @RequireRole
- @PostMapping("/batch-delete")
- public R batchDelete(@Validated @RequestBody BatchDeleteDto batchDeleteDto) {
- return tunnelService.batchDeleteTunnels(batchDeleteDto);
- }
-
- @LogAnnotation
- @RequireRole
- @PostMapping("/batch-redeploy")
- public R batchRedeploy(@Validated @RequestBody BatchRedeployDto batchRedeployDto) {
- return tunnelService.batchRedeployTunnels(batchRedeployDto);
- }
-
-}
diff --git a/springboot-backend/src/main/java/com/admin/controller/UserController.java b/springboot-backend/src/main/java/com/admin/controller/UserController.java
deleted file mode 100644
index 9fcd7b0..0000000
--- a/springboot-backend/src/main/java/com/admin/controller/UserController.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package com.admin.controller;
-
-
-import com.admin.common.aop.LogAnnotation;
-import com.admin.common.annotation.RequireRole;
-import com.admin.common.dto.*;
-import com.admin.common.lang.R;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.Map;
-
-/**
- *
- * 前端控制器
- *
- *
- * @author QAQ
- * @since 2025-06-03
- */
-@RestController
-@CrossOrigin
-@RequestMapping("/api/v1/user")
-public class UserController extends BaseController {
-
- @LogAnnotation
- @PostMapping("/login")
- public R login(@Validated @RequestBody LoginDto loginDto) {
- return userService.login(loginDto);
- }
-
- @LogAnnotation
- @RequireRole
- @PostMapping("/create")
- public R create(@Validated @RequestBody UserDto userDto) {
- return userService.createUser(userDto);
- }
-
-
- @LogAnnotation
- @RequireRole
- @PostMapping("/list")
- public R readAll() {
- return userService.getAllUsers();
- }
-
- @LogAnnotation
- @RequireRole
- @PostMapping("/update")
- public R update(@Validated @RequestBody UserUpdateDto userUpdateDto) {
- return userService.updateUser(userUpdateDto);
- }
-
- @LogAnnotation
- @RequireRole
- @PostMapping("/delete")
- public R delete(@RequestBody Map params) {
- Long id = Long.valueOf(params.get("id").toString());
- return userService.deleteUser(id);
- }
-
- @LogAnnotation
- @PostMapping("/package")
- public R getUserPackageInfo() {
- return userService.getUserPackageInfo();
- }
-
- @LogAnnotation
- @PostMapping("/updatePassword")
- public R updatePassword(@Validated @RequestBody ChangePasswordDto changePasswordDto) {
- return userService.updatePassword(changePasswordDto);
- }
-
- @LogAnnotation
- @RequireRole
- @PostMapping("/reset")
- public R reset(@Validated @RequestBody ResetFlowDto resetFlowDto) {
- return userService.reset(resetFlowDto);
- }
-
-
-
-}
diff --git a/springboot-backend/src/main/java/com/admin/controller/ViteConfigController.java b/springboot-backend/src/main/java/com/admin/controller/ViteConfigController.java
deleted file mode 100644
index 19d1732..0000000
--- a/springboot-backend/src/main/java/com/admin/controller/ViteConfigController.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package com.admin.controller;
-
-
-import com.admin.common.annotation.RequireRole;
-import com.admin.common.aop.LogAnnotation;
-import com.admin.common.lang.R;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.Map;
-
-/**
- *
- * 网站配置控制器
- *
- *
- * @author QAQ
- * @since 2025-07-24
- */
-@RestController
-@CrossOrigin
-@RequestMapping("/api/v1/config")
-public class ViteConfigController extends BaseController {
-
- /**
- * 获取所有网站配置
- * 前端无需权限即可访问,用于获取网站基本信息
- */
- @LogAnnotation
- @PostMapping("/list")
- public R getConfigs() {
- return viteConfigService.getConfigs();
- }
-
- /**
- * 根据配置名获取配置值
- * 前端无需权限即可访问,用于获取特定配置
- */
- @LogAnnotation
- @PostMapping("/get")
- public R getConfigByName(@RequestBody Map params) {
- String name = params.get("name").toString();
- return viteConfigService.getConfigByName(name);
- }
-
- /**
- * 批量更新网站配置
- * 需要管理员权限
- */
- @LogAnnotation
- @RequireRole
- @PostMapping("/update")
- public R updateConfigs(@RequestBody Map configMap) {
- return viteConfigService.updateConfigs(configMap);
- }
-
- /**
- * 更新单个配置项
- * 需要管理员权限
- */
- @LogAnnotation
- @RequireRole
- @PostMapping("/update-single")
- public R updateConfig(@RequestBody Map params) {
- String name = params.get("name").toString();
- String value = params.get("value").toString();
- return viteConfigService.updateConfig(name, value);
- }
-
-}
diff --git a/springboot-backend/src/main/java/com/admin/entity/BaseEntity.java b/springboot-backend/src/main/java/com/admin/entity/BaseEntity.java
deleted file mode 100644
index 1720fe0..0000000
--- a/springboot-backend/src/main/java/com/admin/entity/BaseEntity.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.admin.entity;
-
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import lombok.Data;
-
-import java.io.Serializable;
-
-/**
- * 基础实体类,包含公共字段
- */
-@Data
-public class BaseEntity implements Serializable {
-
- private static final long serialVersionUID = 1L;
-
- /**
- * 主键ID
- */
- @TableId(value = "id", type = IdType.AUTO)
- private Long id;
-
- /**
- * 创建时间(时间戳)
- */
- private Long createdTime;
-
- /**
- * 更新时间(时间戳)
- */
- private Long updatedTime;
-
- /**
- * 状态(0:正常,1:删除)
- */
- private Integer status;
-}
\ No newline at end of file
diff --git a/springboot-backend/src/main/java/com/admin/entity/ChainTunnel.java b/springboot-backend/src/main/java/com/admin/entity/ChainTunnel.java
deleted file mode 100644
index 3338ebb..0000000
--- a/springboot-backend/src/main/java/com/admin/entity/ChainTunnel.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package com.admin.entity;
-
-
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-import java.io.Serializable;
-
-@Data
-@EqualsAndHashCode(callSuper = false)
-public class ChainTunnel implements Serializable {
-
- private static final long serialVersionUID = 1L;
-
- @TableId(value = "id", type = IdType.AUTO)
- private Long id;
-
- // 关联的隧道ID
- private Long tunnelId;
-
- // 记录所选节点的类型: 1是入口节点 2是转发链 3是出口节点
- private Integer chainType;
-
- // 记录所选节点的ID
- private Long nodeId;
-
- // 记录节点使用的端口 入口没有次配置为null
- private Integer port;
-
- // 负载模式 入口没有次配置为null
- private String strategy;
-
- // 只有转发链有次参数 表示是第几条
- private Integer inx;
-
- // 使用的协议 入口没有次配置为null
- private String protocol;
-
-
-}
diff --git a/springboot-backend/src/main/java/com/admin/entity/Forward.java b/springboot-backend/src/main/java/com/admin/entity/Forward.java
deleted file mode 100644
index bf40fc5..0000000
--- a/springboot-backend/src/main/java/com/admin/entity/Forward.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package com.admin.entity;
-
-import java.io.Serializable;
-import java.util.List;
-
-import com.admin.common.dto.ForwardPortDto;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-/**
- *
- *
- *
- *
- * @author QAQ
- * @since 2025-06-03
- */
-@Data
-@EqualsAndHashCode(callSuper = false)
-@TableName(autoResultMap = true)
-public class Forward extends BaseEntity{
-
- private static final long serialVersionUID = 1L;
-
- private Integer userId;
-
- private String userName;
-
- private String name;
-
- private Integer tunnelId;
-
- private String remoteAddr;
-
- private String strategy;
-
- private Long inFlow;
-
- private Long outFlow;
-
- private Integer inx;
-}
diff --git a/springboot-backend/src/main/java/com/admin/entity/ForwardPort.java b/springboot-backend/src/main/java/com/admin/entity/ForwardPort.java
deleted file mode 100644
index 84299ac..0000000
--- a/springboot-backend/src/main/java/com/admin/entity/ForwardPort.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.admin.entity;
-
-
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-import java.util.List;
-
-@Data
-@EqualsAndHashCode(callSuper = false)
-@TableName(autoResultMap = true)
-public class ForwardPort{
-
- /**
- * 主键ID
- */
- @TableId(value = "id", type = IdType.AUTO)
- private Long id;
-
- private Long forwardId;
-
- private Long nodeId;
-
- private Integer port;
-}
diff --git a/springboot-backend/src/main/java/com/admin/entity/GroupPermission.java b/springboot-backend/src/main/java/com/admin/entity/GroupPermission.java
deleted file mode 100644
index 542bde4..0000000
--- a/springboot-backend/src/main/java/com/admin/entity/GroupPermission.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.admin.entity;
-
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import lombok.Data;
-
-import java.io.Serializable;
-
-@Data
-public class GroupPermission implements Serializable {
-
- private static final long serialVersionUID = 1L;
-
- @TableId(value = "id", type = IdType.AUTO)
- private Long id;
-
- private Long userGroupId;
-
- private Long tunnelGroupId;
-
- private Long createdTime;
-}
diff --git a/springboot-backend/src/main/java/com/admin/entity/GroupPermissionGrant.java b/springboot-backend/src/main/java/com/admin/entity/GroupPermissionGrant.java
deleted file mode 100644
index 123813c..0000000
--- a/springboot-backend/src/main/java/com/admin/entity/GroupPermissionGrant.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.admin.entity;
-
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import lombok.Data;
-
-import java.io.Serializable;
-
-@Data
-public class GroupPermissionGrant implements Serializable {
-
- private static final long serialVersionUID = 1L;
-
- @TableId(value = "id", type = IdType.AUTO)
- private Long id;
-
- private Long userGroupId;
-
- private Long tunnelGroupId;
-
- private Long userTunnelId;
-
- private Integer createdByGroup;
-
- private Long createdTime;
-}
diff --git a/springboot-backend/src/main/java/com/admin/entity/Node.java b/springboot-backend/src/main/java/com/admin/entity/Node.java
deleted file mode 100644
index 32d21d8..0000000
--- a/springboot-backend/src/main/java/com/admin/entity/Node.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package com.admin.entity;
-
-import java.io.Serializable;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-/**
- *
- *
- *
- *
- * @author QAQ
- * @since 2025-06-03
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-public class Node extends BaseEntity {
-
- private static final long serialVersionUID = 1L;
-
- private String name;
-
- private String secret;
-
- private String serverIp;
-
- private String serverIpV4;
-
- private String serverIpV6;
-
- private String version;
-
- private String port;
-
- private Integer http;
-
- private Integer tls;
-
- private Integer socks;
-
- private String interfaceName;
-
- private String tcpListenAddr;
-
- private String udpListenAddr;
-
- /**
- * Display/order index for drag-sorting in admin UI.
- * Lower value appears first.
- */
- private Integer inx;
-}
diff --git a/springboot-backend/src/main/java/com/admin/entity/SpeedLimit.java b/springboot-backend/src/main/java/com/admin/entity/SpeedLimit.java
deleted file mode 100644
index dc7332f..0000000
--- a/springboot-backend/src/main/java/com/admin/entity/SpeedLimit.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package com.admin.entity;
-
-import com.admin.entity.BaseEntity;
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-import java.io.Serializable;
-
-/**
- *
- *
- *
- *
- * @author QAQ
- * @since 2025-06-04
- */
-@Data
-public class SpeedLimit implements Serializable {
-
- private static final long serialVersionUID = 1L;
-
- /**
- * 主键ID
- */
- @TableId(value = "id", type = IdType.AUTO)
- private Long id;
-
- /**
- * 创建时间(时间戳)
- */
- private Long createdTime;
-
- /**
- * 更新时间(时间戳)
- */
- private Long updatedTime;
-
- /**
- * 状态(0:正常,1:删除)
- */
- private Integer status;
-
- private String name;
-
- private Integer speed;
-
- private Long tunnelId;
-
- private String tunnelName;
-
-}
diff --git a/springboot-backend/src/main/java/com/admin/entity/StatisticsFlow.java b/springboot-backend/src/main/java/com/admin/entity/StatisticsFlow.java
deleted file mode 100644
index 89626ee..0000000
--- a/springboot-backend/src/main/java/com/admin/entity/StatisticsFlow.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.admin.entity;
-
-import com.admin.entity.BaseEntity;
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-/**
- *
- *
- *
- *
- * @author QAQ
- * @since 2025-08-14
- */
-@Data
-public class StatisticsFlow {
-
- private static final long serialVersionUID = 1L;
- @TableId(value = "id", type = IdType.AUTO)
- private Long id;
- private Long userId;
-
- private Long flow;
-
- private Long totalFlow;
-
- private String time;
-
- private Long createdTime;
-
-
-}
diff --git a/springboot-backend/src/main/java/com/admin/entity/Tunnel.java b/springboot-backend/src/main/java/com/admin/entity/Tunnel.java
deleted file mode 100644
index 01ff83a..0000000
--- a/springboot-backend/src/main/java/com/admin/entity/Tunnel.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package com.admin.entity;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.util.List;
-
-import com.admin.common.dto.ChainNodesItems;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-/**
- *
- * 隧道实体类
- *
- *
- * @author QAQ
- * @since 2025-06-03
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@TableName(autoResultMap = true)
-public class Tunnel extends BaseEntity {
-
- private static final long serialVersionUID = 1L;
-
- private String name;
-
- private Integer type;
-
- private int flow;
-
- private BigDecimal trafficRatio;
-
- private String inIp;
-
- /**
- * Display/order index for drag-sorting in admin UI.
- * Lower value appears first.
- */
- private Integer inx;
-}
diff --git a/springboot-backend/src/main/java/com/admin/entity/TunnelGroup.java b/springboot-backend/src/main/java/com/admin/entity/TunnelGroup.java
deleted file mode 100644
index d280af2..0000000
--- a/springboot-backend/src/main/java/com/admin/entity/TunnelGroup.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.admin.entity;
-
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-@Data
-@EqualsAndHashCode(callSuper = true)
-public class TunnelGroup extends BaseEntity {
-
- private static final long serialVersionUID = 1L;
-
- private String name;
-}
diff --git a/springboot-backend/src/main/java/com/admin/entity/TunnelGroupTunnel.java b/springboot-backend/src/main/java/com/admin/entity/TunnelGroupTunnel.java
deleted file mode 100644
index 530b7ed..0000000
--- a/springboot-backend/src/main/java/com/admin/entity/TunnelGroupTunnel.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.admin.entity;
-
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import lombok.Data;
-
-import java.io.Serializable;
-
-@Data
-public class TunnelGroupTunnel implements Serializable {
-
- private static final long serialVersionUID = 1L;
-
- @TableId(value = "id", type = IdType.AUTO)
- private Long id;
-
- private Long tunnelGroupId;
-
- private Long tunnelId;
-
- private Long createdTime;
-}
diff --git a/springboot-backend/src/main/java/com/admin/entity/User.java b/springboot-backend/src/main/java/com/admin/entity/User.java
deleted file mode 100644
index 432566e..0000000
--- a/springboot-backend/src/main/java/com/admin/entity/User.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package com.admin.entity;
-
-
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-/**
- *
- *
- *
- *
- * @author QAQ
- * @since 2025-06-03
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-public class User extends BaseEntity {
-
- private static final long serialVersionUID = 1L;
-
- /**
- * 主键ID
- */
- @TableId(value = "id", type = IdType.AUTO)
- private Long id;
-
- /**
- * 创建时间(时间戳)
- */
- private Long createdTime;
-
- /**
- * 更新时间(时间戳)
- */
- private Long updatedTime;
-
- /**
- * 状态(0:正常,1:删除)
- */
- private Integer status;
-
- private String user;
-
- private String pwd;
-
- private Integer roleId;
-
- private Long expTime;
-
- private Long flow;
-
- private Long inFlow;
-
- private Long outFlow;
-
- private Integer num;
-
- private Long flowResetTime;
-
-
-}
diff --git a/springboot-backend/src/main/java/com/admin/entity/UserGroup.java b/springboot-backend/src/main/java/com/admin/entity/UserGroup.java
deleted file mode 100644
index 89cf5e6..0000000
--- a/springboot-backend/src/main/java/com/admin/entity/UserGroup.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.admin.entity;
-
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-@Data
-@EqualsAndHashCode(callSuper = true)
-public class UserGroup extends BaseEntity {
-
- private static final long serialVersionUID = 1L;
-
- private String name;
-}
diff --git a/springboot-backend/src/main/java/com/admin/entity/UserGroupUser.java b/springboot-backend/src/main/java/com/admin/entity/UserGroupUser.java
deleted file mode 100644
index 3779fa8..0000000
--- a/springboot-backend/src/main/java/com/admin/entity/UserGroupUser.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.admin.entity;
-
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import lombok.Data;
-
-import java.io.Serializable;
-
-@Data
-public class UserGroupUser implements Serializable {
-
- private static final long serialVersionUID = 1L;
-
- @TableId(value = "id", type = IdType.AUTO)
- private Long id;
-
- private Long userGroupId;
-
- private Long userId;
-
- private Long createdTime;
-}
diff --git a/springboot-backend/src/main/java/com/admin/entity/UserTunnel.java b/springboot-backend/src/main/java/com/admin/entity/UserTunnel.java
deleted file mode 100644
index 39347d8..0000000
--- a/springboot-backend/src/main/java/com/admin/entity/UserTunnel.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package com.admin.entity;
-
-import java.io.Serializable;
-
-import com.baomidou.mybatisplus.annotation.FieldStrategy;
-import com.baomidou.mybatisplus.annotation.TableField;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-
-/**
- *
- *
- *
- *
- * @author QAQ
- * @since 2025-06-03
- */
-@Data
-@EqualsAndHashCode(callSuper = false)
-public class UserTunnel implements Serializable {
-
- private static final long serialVersionUID = 1L;
-
- /**
- * 主键ID
- */
- @TableId(value = "id", type = IdType.AUTO)
- private Integer id;
-
- private Integer userId;
-
- private Integer tunnelId;
-
- private Long flow;
-
- private Long inFlow;
-
- private Long outFlow;
-
- private Long flowResetTime;
-
- private Long expTime;
-
- @TableField(updateStrategy = FieldStrategy.IGNORED)
- private Integer speedId;
-
- private Integer num;
-
- private Integer status;
-
-}
diff --git a/springboot-backend/src/main/java/com/admin/entity/ViteConfig.java b/springboot-backend/src/main/java/com/admin/entity/ViteConfig.java
deleted file mode 100644
index 69ca6c5..0000000
--- a/springboot-backend/src/main/java/com/admin/entity/ViteConfig.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.admin.entity;
-
-import com.admin.entity.BaseEntity;
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-/**
- *
- *
- *
- *
- * @author QAQ
- * @since 2025-07-24
- */
-@Data
-public class ViteConfig {
-
- private static final long serialVersionUID = 1L;
- @TableId(value = "id", type = IdType.AUTO)
- private Long id;
-
- private String name;
-
- private String value;
-
- private Long time;
-
-
-}
diff --git a/springboot-backend/src/main/java/com/admin/mapper/ChainTunnelMapper.java b/springboot-backend/src/main/java/com/admin/mapper/ChainTunnelMapper.java
deleted file mode 100644
index e380434..0000000
--- a/springboot-backend/src/main/java/com/admin/mapper/ChainTunnelMapper.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.admin.mapper;
-
-import com.admin.entity.ChainTunnel;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-
-public interface ChainTunnelMapper extends BaseMapper {
-}
diff --git a/springboot-backend/src/main/java/com/admin/mapper/ForwardMapper.java b/springboot-backend/src/main/java/com/admin/mapper/ForwardMapper.java
deleted file mode 100644
index 6afa058..0000000
--- a/springboot-backend/src/main/java/com/admin/mapper/ForwardMapper.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package com.admin.mapper;
-
-import com.admin.entity.Forward;
-import com.admin.common.dto.ForwardWithTunnelDto;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import org.apache.ibatis.annotations.Param;
-import org.apache.ibatis.annotations.Select;
-
-import java.util.List;
-
-/**
- *
- * Mapper 接口
- *
- *
- * @author QAQ
- * @since 2025-06-03
- */
-public interface ForwardMapper extends BaseMapper {
-
- /**
- * 查询所有转发信息(包含隧道信息)
- * @return 转发信息列表
- */
- List selectAllForwardsWithTunnel();
-
- /**
- * 根据用户ID查询转发信息(包含隧道信息)
- * @param userId 用户ID
- * @return 转发信息列表
- */
- List selectForwardsWithTunnelByUserId(@Param("userId") Integer userId);
-
-
-}
diff --git a/springboot-backend/src/main/java/com/admin/mapper/ForwardPortMapper.java b/springboot-backend/src/main/java/com/admin/mapper/ForwardPortMapper.java
deleted file mode 100644
index 1233e64..0000000
--- a/springboot-backend/src/main/java/com/admin/mapper/ForwardPortMapper.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.admin.mapper;
-
-import com.admin.entity.Forward;
-import com.admin.entity.ForwardPort;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-
-public interface ForwardPortMapper extends BaseMapper {
-}
diff --git a/springboot-backend/src/main/java/com/admin/mapper/GroupPermissionGrantMapper.java b/springboot-backend/src/main/java/com/admin/mapper/GroupPermissionGrantMapper.java
deleted file mode 100644
index 4bbb846..0000000
--- a/springboot-backend/src/main/java/com/admin/mapper/GroupPermissionGrantMapper.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.admin.mapper;
-
-import com.admin.entity.GroupPermissionGrant;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-
-public interface GroupPermissionGrantMapper extends BaseMapper {
-}
diff --git a/springboot-backend/src/main/java/com/admin/mapper/GroupPermissionMapper.java b/springboot-backend/src/main/java/com/admin/mapper/GroupPermissionMapper.java
deleted file mode 100644
index a10ac69..0000000
--- a/springboot-backend/src/main/java/com/admin/mapper/GroupPermissionMapper.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.admin.mapper;
-
-import com.admin.entity.GroupPermission;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-
-public interface GroupPermissionMapper extends BaseMapper {
-}
diff --git a/springboot-backend/src/main/java/com/admin/mapper/NodeMapper.java b/springboot-backend/src/main/java/com/admin/mapper/NodeMapper.java
deleted file mode 100644
index 78385de..0000000
--- a/springboot-backend/src/main/java/com/admin/mapper/NodeMapper.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.admin.mapper;
-
-import com.admin.entity.Node;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-
-/**
- *
- * Mapper 接口
- *
- *
- * @author QAQ
- * @since 2025-06-03
- */
-public interface NodeMapper extends BaseMapper {
-
-}
diff --git a/springboot-backend/src/main/java/com/admin/mapper/SpeedLimitMapper.java b/springboot-backend/src/main/java/com/admin/mapper/SpeedLimitMapper.java
deleted file mode 100644
index 0887ac6..0000000
--- a/springboot-backend/src/main/java/com/admin/mapper/SpeedLimitMapper.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.admin.mapper;
-
-import com.admin.entity.SpeedLimit;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-
-/**
- *
- * Mapper 接口
- *
- *
- * @author QAQ
- * @since 2025-06-04
- */
-public interface SpeedLimitMapper extends BaseMapper {
-
-}
diff --git a/springboot-backend/src/main/java/com/admin/mapper/StatisticsFlowMapper.java b/springboot-backend/src/main/java/com/admin/mapper/StatisticsFlowMapper.java
deleted file mode 100644
index f63d7a3..0000000
--- a/springboot-backend/src/main/java/com/admin/mapper/StatisticsFlowMapper.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.admin.mapper;
-
-import com.admin.entity.StatisticsFlow;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-
-/**
- *
- * Mapper 接口
- *
- *
- * @author QAQ
- * @since 2025-08-14
- */
-public interface StatisticsFlowMapper extends BaseMapper {
-
-}
diff --git a/springboot-backend/src/main/java/com/admin/mapper/TunnelGroupMapper.java b/springboot-backend/src/main/java/com/admin/mapper/TunnelGroupMapper.java
deleted file mode 100644
index fd8852e..0000000
--- a/springboot-backend/src/main/java/com/admin/mapper/TunnelGroupMapper.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.admin.mapper;
-
-import com.admin.entity.TunnelGroup;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-
-public interface TunnelGroupMapper extends BaseMapper {
-}
diff --git a/springboot-backend/src/main/java/com/admin/mapper/TunnelGroupTunnelMapper.java b/springboot-backend/src/main/java/com/admin/mapper/TunnelGroupTunnelMapper.java
deleted file mode 100644
index c937ea0..0000000
--- a/springboot-backend/src/main/java/com/admin/mapper/TunnelGroupTunnelMapper.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.admin.mapper;
-
-import com.admin.entity.TunnelGroupTunnel;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-
-public interface TunnelGroupTunnelMapper extends BaseMapper {
-}
diff --git a/springboot-backend/src/main/java/com/admin/mapper/TunnelMapper.java b/springboot-backend/src/main/java/com/admin/mapper/TunnelMapper.java
deleted file mode 100644
index 333a79b..0000000
--- a/springboot-backend/src/main/java/com/admin/mapper/TunnelMapper.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.admin.mapper;
-
-import com.admin.entity.Tunnel;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-
-/**
- *
- * Mapper 接口
- *
- *
- * @author QAQ
- * @since 2025-06-03
- */
-public interface TunnelMapper extends BaseMapper {
-
-}
diff --git a/springboot-backend/src/main/java/com/admin/mapper/UserGroupMapper.java b/springboot-backend/src/main/java/com/admin/mapper/UserGroupMapper.java
deleted file mode 100644
index 2b3b1df..0000000
--- a/springboot-backend/src/main/java/com/admin/mapper/UserGroupMapper.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.admin.mapper;
-
-import com.admin.entity.UserGroup;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-
-public interface UserGroupMapper extends BaseMapper {
-}
diff --git a/springboot-backend/src/main/java/com/admin/mapper/UserGroupUserMapper.java b/springboot-backend/src/main/java/com/admin/mapper/UserGroupUserMapper.java
deleted file mode 100644
index dfcf62f..0000000
--- a/springboot-backend/src/main/java/com/admin/mapper/UserGroupUserMapper.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.admin.mapper;
-
-import com.admin.entity.UserGroupUser;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-
-public interface UserGroupUserMapper extends BaseMapper {
-}
diff --git a/springboot-backend/src/main/java/com/admin/mapper/UserMapper.java b/springboot-backend/src/main/java/com/admin/mapper/UserMapper.java
deleted file mode 100644
index 3ac3e9a..0000000
--- a/springboot-backend/src/main/java/com/admin/mapper/UserMapper.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.admin.mapper;
-
-import com.admin.entity.User;
-import com.admin.common.dto.UserPackageDto;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import org.apache.ibatis.annotations.Param;
-
-import java.util.List;
-
-/**
- *
- * Mapper 接口
- *
- *
- * @author QAQ
- * @since 2025-06-03
- */
-public interface UserMapper extends BaseMapper {
-
- /**
- * 查询用户隧道权限详情
- * @param userId 用户ID
- * @return 隧道权限列表
- */
- List getUserTunnelDetails(@Param("userId") Integer userId);
-
- /**
- * 查询用户转发详情
- * @param userId 用户ID
- * @return 转发列表
- */
- List getUserForwardDetails(@Param("userId") Integer userId);
-
-}
diff --git a/springboot-backend/src/main/java/com/admin/mapper/UserTunnelMapper.java b/springboot-backend/src/main/java/com/admin/mapper/UserTunnelMapper.java
deleted file mode 100644
index 401edc2..0000000
--- a/springboot-backend/src/main/java/com/admin/mapper/UserTunnelMapper.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.admin.mapper;
-
-import com.admin.entity.UserTunnel;
-import com.admin.common.dto.UserTunnelWithDetailDto;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import org.apache.ibatis.annotations.Param;
-import org.apache.ibatis.annotations.Select;
-
-import java.util.List;
-
-/**
- *
- * Mapper 接口
- *
- *
- * @author QAQ
- * @since 2025-06-03
- */
-public interface UserTunnelMapper extends BaseMapper {
-
-
- List getUserTunnelWithDetails(@Param("userId") Integer userId);
-
-}
diff --git a/springboot-backend/src/main/java/com/admin/mapper/ViteConfigMapper.java b/springboot-backend/src/main/java/com/admin/mapper/ViteConfigMapper.java
deleted file mode 100644
index cf807cb..0000000
--- a/springboot-backend/src/main/java/com/admin/mapper/ViteConfigMapper.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.admin.mapper;
-
-import com.admin.entity.ViteConfig;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-
-/**
- *
- * Mapper 接口
- *
- *
- * @author QAQ
- * @since 2025-07-24
- */
-public interface ViteConfigMapper extends BaseMapper {
-
-}
diff --git a/springboot-backend/src/main/java/com/admin/service/ChainTunnelService.java b/springboot-backend/src/main/java/com/admin/service/ChainTunnelService.java
deleted file mode 100644
index a6cbf97..0000000
--- a/springboot-backend/src/main/java/com/admin/service/ChainTunnelService.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.admin.service;
-
-import com.admin.entity.ChainTunnel;
-import com.admin.entity.Forward;
-import com.baomidou.mybatisplus.extension.service.IService;
-
-public interface ChainTunnelService extends IService {
-}
diff --git a/springboot-backend/src/main/java/com/admin/service/ForwardPortService.java b/springboot-backend/src/main/java/com/admin/service/ForwardPortService.java
deleted file mode 100644
index d1b6e51..0000000
--- a/springboot-backend/src/main/java/com/admin/service/ForwardPortService.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.admin.service;
-
-import com.admin.entity.ForwardPort;
-import com.baomidou.mybatisplus.extension.service.IService;
-
-public interface ForwardPortService extends IService {
-}
diff --git a/springboot-backend/src/main/java/com/admin/service/ForwardService.java b/springboot-backend/src/main/java/com/admin/service/ForwardService.java
deleted file mode 100644
index be53884..0000000
--- a/springboot-backend/src/main/java/com/admin/service/ForwardService.java
+++ /dev/null
@@ -1,96 +0,0 @@
-package com.admin.service;
-
-import com.admin.common.dto.BatchDeleteDto;
-import com.admin.common.dto.BatchRedeployDto;
-import com.admin.common.dto.BatchChangeTunnelDto;
-import com.admin.common.dto.ForwardDto;
-import com.admin.common.dto.ForwardUpdateDto;
-import com.admin.common.lang.R;
-import com.admin.entity.Forward;
-import com.baomidou.mybatisplus.extension.service.IService;
-import java.util.Map;
-import java.util.Set;
-
-/**
- *
- * 服务类
- *
- *
- * @author QAQ
- * @since 2025-06-03
- */
-public interface ForwardService extends IService {
-
- /**
- * 创建端口转发
- * @param forwardDto 转发数据
- * @return 结果
- */
- R createForward(ForwardDto forwardDto);
-
- /**
- * 获取端口转发列表
- * @return 结果
- */
- R getAllForwards();
-
- /**
- * 更新端口转发
- * @param forwardUpdateDto 更新数据
- * @return 结果
- */
- R updateForward(ForwardUpdateDto forwardUpdateDto);
-
- /**
- * 删除端口转发
- * @param id 转发ID
- * @return 结果
- */
- R deleteForward(Long id);
-
- /**
- * 强制删除端口转发
- * 跳过GOST节点验证,直接删除数据库记录
- * @param id 转发ID
- * @return 结果
- */
- R forceDeleteForward(Long id);
-
- /**
- * 暂停转发服务
- * @param id 转发ID
- * @return 结果
- */
- R pauseForward(Long id);
-
- /**
- * 恢复转发服务
- * @param id 转发ID
- * @return 结果
- */
- R resumeForward(Long id);
-
- /**
- * 转发诊断功能
- * @param id 转发ID
- * @return 诊断结果
- */
- R diagnoseForward(Long id);
-
- /**
- * 更新转发排序
- * @param params 包含forwards数组的参数
- * @return 更新结果
- */
- R updateForwardOrder(Map params);
-
- R batchDeleteForwards(BatchDeleteDto batchDeleteDto);
-
- R batchPauseForwards(BatchDeleteDto batchDeleteDto);
-
- R batchResumeForwards(BatchDeleteDto batchDeleteDto);
-
- R batchRedeployForwards(BatchRedeployDto batchRedeployDto);
-
- R batchChangeTunnel(BatchChangeTunnelDto batchChangeTunnelDto);
-}
diff --git a/springboot-backend/src/main/java/com/admin/service/GroupService.java b/springboot-backend/src/main/java/com/admin/service/GroupService.java
deleted file mode 100644
index d6f7918..0000000
--- a/springboot-backend/src/main/java/com/admin/service/GroupService.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.admin.service;
-
-import com.admin.common.dto.GroupCreateDto;
-import com.admin.common.dto.GroupPermissionAssignDto;
-import com.admin.common.dto.GroupUpdateDto;
-import com.admin.common.dto.TunnelGroupAssignTunnelsDto;
-import com.admin.common.dto.UserGroupAssignUsersDto;
-import com.admin.common.lang.R;
-
-public interface GroupService {
-
- R getTunnelGroups();
-
- R createTunnelGroup(GroupCreateDto dto);
-
- R updateTunnelGroup(GroupUpdateDto dto);
-
- R deleteTunnelGroup(Long id);
-
- R assignTunnelsToGroup(TunnelGroupAssignTunnelsDto dto);
-
- R getUserGroups();
-
- R createUserGroup(GroupCreateDto dto);
-
- R updateUserGroup(GroupUpdateDto dto);
-
- R deleteUserGroup(Long id);
-
- R assignUsersToGroup(UserGroupAssignUsersDto dto);
-
- R getGroupPermissions();
-
- R assignGroupPermission(GroupPermissionAssignDto dto);
-
- R removeGroupPermission(Long id);
-}
diff --git a/springboot-backend/src/main/java/com/admin/service/NodeService.java b/springboot-backend/src/main/java/com/admin/service/NodeService.java
deleted file mode 100644
index 1299315..0000000
--- a/springboot-backend/src/main/java/com/admin/service/NodeService.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package com.admin.service;
-
-import com.admin.common.dto.BatchDeleteDto;
-import com.admin.common.dto.NodeDto;
-import com.admin.common.dto.NodeUpdateDto;
-import com.admin.common.lang.R;
-import com.admin.entity.Node;
-import com.baomidou.mybatisplus.extension.service.IService;
-
-import java.util.Map;
-
-/**
- *
- * 服务类
- *
- *
- * @author QAQ
- * @since 2025-06-03
- */
-public interface NodeService extends IService {
-
- R createNode(NodeDto nodeDto);
-
- R getAllNodes();
-
- R updateNode(NodeUpdateDto nodeUpdateDto);
-
- R deleteNode(Long id);
-
- R getInstallCommand(Long id);
-
- /**
- * 更新节点排序(管理员)
- * @param params 包含nodes数组的参数,每个元素包含id和inx
- */
- R updateNodeOrder(Map params);
-
- R batchDeleteNodes(BatchDeleteDto batchDeleteDto);
-
-}
diff --git a/springboot-backend/src/main/java/com/admin/service/SpeedLimitService.java b/springboot-backend/src/main/java/com/admin/service/SpeedLimitService.java
deleted file mode 100644
index cac4848..0000000
--- a/springboot-backend/src/main/java/com/admin/service/SpeedLimitService.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package com.admin.service;
-
-import com.admin.common.dto.SpeedLimitDto;
-import com.admin.common.dto.SpeedLimitUpdateDto;
-import com.admin.common.lang.R;
-import com.admin.entity.SpeedLimit;
-import com.baomidou.mybatisplus.extension.service.IService;
-
-/**
- *
- * 限速规则服务类
- *
- *
- * @author QAQ
- * @since 2025-06-04
- */
-public interface SpeedLimitService extends IService {
-
- /**
- * 创建限速规则
- * @param speedLimitDto 限速规则数据
- * @return 结果
- */
- R createSpeedLimit(SpeedLimitDto speedLimitDto);
-
- /**
- * 获取所有限速规则
- * @return 结果
- */
- R getAllSpeedLimits();
-
- /**
- * 更新限速规则
- * @param speedLimitUpdateDto 更新数据
- * @return 结果
- */
- R updateSpeedLimit(SpeedLimitUpdateDto speedLimitUpdateDto);
-
- /**
- * 删除限速规则
- * @param id 限速规则ID
- * @return 结果
- */
- R deleteSpeedLimit(Long id);
-}
diff --git a/springboot-backend/src/main/java/com/admin/service/StatisticsFlowService.java b/springboot-backend/src/main/java/com/admin/service/StatisticsFlowService.java
deleted file mode 100644
index cf3a5b6..0000000
--- a/springboot-backend/src/main/java/com/admin/service/StatisticsFlowService.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.admin.service;
-
-import com.admin.entity.StatisticsFlow;
-import com.baomidou.mybatisplus.extension.service.IService;
-
-/**
- *
- * 服务类
- *
- *
- * @author QAQ
- * @since 2025-08-14
- */
-public interface StatisticsFlowService extends IService {
-
-}
diff --git a/springboot-backend/src/main/java/com/admin/service/TunnelService.java b/springboot-backend/src/main/java/com/admin/service/TunnelService.java
deleted file mode 100644
index ca83377..0000000
--- a/springboot-backend/src/main/java/com/admin/service/TunnelService.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package com.admin.service;
-
-import com.admin.common.dto.BatchDeleteDto;
-import com.admin.common.dto.BatchRedeployDto;
-import com.admin.common.dto.TunnelDto;
-import com.admin.common.dto.TunnelUpdateDto;
-
-import com.admin.common.lang.R;
-import com.admin.entity.Tunnel;
-import com.baomidou.mybatisplus.extension.service.IService;
-
-import java.util.Map;
-
-/**
- *
- * 隧道服务类
- *
- *
- * @author QAQ
- * @since 2025-06-03
- */
-public interface TunnelService extends IService {
-
- /**
- * 创建隧道
- * @param tunnelDto 隧道数据
- * @return 结果
- */
- R createTunnel(TunnelDto tunnelDto);
-
- /**
- * 获取隧道列表
- * @return 结果
- */
- R getAllTunnels();
-
- /**
- * 更新隧道(只允许修改名称、流量计费、端口范围)
- * @param tunnelUpdateDto 更新数据
- * @return 结果
- */
- R updateTunnel(TunnelUpdateDto tunnelUpdateDto);
-
- /**
- * 删除隧道
- * @param id 隧道ID
- * @return 结果
- */
- R deleteTunnel(Long id);
-
- /**
- * 获取用户可用的隧道列表
- * @return 结果
- */
- R userTunnel();
-
- /**
- * 隧道诊断功能
- * @param tunnelId 隧道ID
- * @return 诊断结果
- */
- R diagnoseTunnel(Long tunnelId);
-
- /**
- * 更新隧道排序(管理员)
- * @param params 包含tunnels数组的参数,每个元素包含id和inx
- */
- R updateTunnelOrder(Map params);
-
- /**
- * 批量删除隧道
- * @param batchDeleteDto 批量删除数据
- * @return 操作结果
- */
- R batchDeleteTunnels(BatchDeleteDto batchDeleteDto);
-
- /**
- * 批量重新下发隧道配置
- * @param batchRedeployDto 批量重新下发数据
- * @return 操作结果
- */
- R batchRedeployTunnels(BatchRedeployDto batchRedeployDto);
-}
diff --git a/springboot-backend/src/main/java/com/admin/service/UserService.java b/springboot-backend/src/main/java/com/admin/service/UserService.java
deleted file mode 100644
index 0738afa..0000000
--- a/springboot-backend/src/main/java/com/admin/service/UserService.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.admin.service;
-
-import com.admin.common.dto.*;
-import com.admin.common.lang.R;
-import com.admin.entity.User;
-import com.baomidou.mybatisplus.extension.service.IService;
-
-/**
- *
- * 服务类
- *
- *
- * @author QAQ
- * @since 2025-06-03
- */
-public interface UserService extends IService {
-
- R login(LoginDto loginDto);
-
- R createUser(UserDto userDto);
-
- R getAllUsers();
-
- R updateUser(UserUpdateDto userUpdateDto);
-
- R deleteUser(Long id);
-
- R getUserPackageInfo();
-
- R updatePassword(ChangePasswordDto changePasswordDto);
-
- R reset(ResetFlowDto resetFlowDto);
-}
diff --git a/springboot-backend/src/main/java/com/admin/service/UserTunnelService.java b/springboot-backend/src/main/java/com/admin/service/UserTunnelService.java
deleted file mode 100644
index 737b4bd..0000000
--- a/springboot-backend/src/main/java/com/admin/service/UserTunnelService.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.admin.service;
-
-import com.admin.common.dto.UserTunnelBatchAssignDto;
-import com.admin.common.dto.UserTunnelDto;
-import com.admin.common.dto.UserTunnelQueryDto;
-import com.admin.common.dto.UserTunnelUpdateDto;
-import com.admin.common.lang.R;
-import com.admin.entity.UserTunnel;
-import com.baomidou.mybatisplus.extension.service.IService;
-
-public interface UserTunnelService extends IService {
-
- R assignUserTunnel(UserTunnelDto userTunnelDto);
-
- R batchAssignUserTunnel(UserTunnelBatchAssignDto batchAssignDto);
-
- R getUserTunnelList(UserTunnelQueryDto queryDto);
-
- R removeUserTunnel(Integer id);
-
- R updateUserTunnel(UserTunnelUpdateDto updateDto);
-
-}
diff --git a/springboot-backend/src/main/java/com/admin/service/ViteConfigService.java b/springboot-backend/src/main/java/com/admin/service/ViteConfigService.java
deleted file mode 100644
index fbde030..0000000
--- a/springboot-backend/src/main/java/com/admin/service/ViteConfigService.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package com.admin.service;
-
-import com.admin.entity.ViteConfig;
-import com.admin.common.lang.R;
-import com.baomidou.mybatisplus.extension.service.IService;
-
-import java.util.Map;
-
-/**
- *
- * 网站配置服务类
- *
- *
- * @author QAQ
- * @since 2025-07-24
- */
-public interface ViteConfigService extends IService {
-
- /**
- * 获取所有网站配置
- * @return 配置Map,key为配置名,value为配置值
- */
- R getConfigs();
-
- /**
- * 根据配置名获取配置值
- * @param name 配置名
- * @return 配置值
- */
- R getConfigByName(String name);
-
- /**
- * 批量更新网站配置
- * @param configMap 配置Map,key为配置名,value为新的配置值
- * @return 更新结果
- */
- R updateConfigs(Map configMap);
-
- /**
- * 更新单个配置项
- * @param name 配置名
- * @param value 配置值
- * @return 更新结果
- */
- R updateConfig(String name, String value);
-
-}
diff --git a/springboot-backend/src/main/java/com/admin/service/impl/ChainTunnelServiceImpl.java b/springboot-backend/src/main/java/com/admin/service/impl/ChainTunnelServiceImpl.java
deleted file mode 100644
index 97929e6..0000000
--- a/springboot-backend/src/main/java/com/admin/service/impl/ChainTunnelServiceImpl.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package com.admin.service.impl;
-
-import com.admin.common.dto.ForwardDto;
-import com.admin.common.dto.ForwardUpdateDto;
-import com.admin.common.dto.ForwardWithTunnelDto;
-import com.admin.common.dto.GostDto;
-import com.admin.common.lang.R;
-import com.admin.common.utils.GostUtil;
-import com.admin.common.utils.JwtUtil;
-import com.admin.common.utils.WebSocketServer;
-import com.admin.entity.*;
-import com.admin.mapper.ChainTunnelMapper;
-import com.admin.mapper.ForwardMapper;
-import com.admin.service.*;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.alibaba.fastjson.JSONObject;
-import lombok.Data;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.BeanUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Lazy;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Resource;
-import java.util.*;
-import java.util.stream.Collectors;
-
-/**
- *
- * 端口转发服务实现类
- *
- *
- * @author QAQ
- * @since 2025-06-03
- */
-@Slf4j
-@Service
-public class ChainTunnelServiceImpl extends ServiceImpl implements ChainTunnelService {
-
-}
diff --git a/springboot-backend/src/main/java/com/admin/service/impl/ForwardPortServiceImpl.java b/springboot-backend/src/main/java/com/admin/service/impl/ForwardPortServiceImpl.java
deleted file mode 100644
index beb9398..0000000
--- a/springboot-backend/src/main/java/com/admin/service/impl/ForwardPortServiceImpl.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.admin.service.impl;
-
-import com.admin.entity.ChainTunnel;
-import com.admin.entity.ForwardPort;
-import com.admin.mapper.ChainTunnelMapper;
-import com.admin.mapper.ForwardPortMapper;
-import com.admin.service.ChainTunnelService;
-import com.admin.service.ForwardPortService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.springframework.stereotype.Service;
-
-@Service
-public class ForwardPortServiceImpl extends ServiceImpl implements ForwardPortService {
-
-}
diff --git a/springboot-backend/src/main/java/com/admin/service/impl/ForwardServiceImpl.java b/springboot-backend/src/main/java/com/admin/service/impl/ForwardServiceImpl.java
deleted file mode 100644
index 21d8c14..0000000
--- a/springboot-backend/src/main/java/com/admin/service/impl/ForwardServiceImpl.java
+++ /dev/null
@@ -1,1512 +0,0 @@
-package com.admin.service.impl;
-
-import com.admin.common.dto.*;
-import com.admin.common.lang.R;
-import com.admin.common.utils.GostUtil;
-import com.admin.common.utils.JwtUtil;
-import com.admin.common.utils.WebSocketServer;
-import com.admin.entity.*;
-import com.admin.mapper.ForwardMapper;
-import com.admin.service.*;
-import com.alibaba.fastjson.JSONArray;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.alibaba.fastjson.JSONObject;
-import lombok.Data;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.BeanUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Lazy;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import javax.annotation.Resource;
-import java.util.*;
-import java.util.concurrent.CompletableFuture;
-import java.util.stream.Collectors;
-
-/**
- *
- * 端口转发服务实现类
- *
- *
- * @author QAQ
- * @since 2025-06-03
- */
-@Slf4j
-@Service
-public class ForwardServiceImpl extends ServiceImpl implements ForwardService {
-
- private static final long BYTES_TO_GB = 1024L * 1024L * 1024L;
-
- @Resource
- @Lazy
- private TunnelService tunnelService;
-
- @Resource
- UserTunnelService userTunnelService;
-
- @Resource
- UserService userService;
-
- @Resource
- NodeService nodeService;
-
- @Resource
- ChainTunnelService chainTunnelService;
-
- @Resource
- ForwardPortService forwardPortService;
-
- @Override
- public R getAllForwards() {
- UserInfo currentUser = getCurrentUserInfo();
- List forwardList;
- if (currentUser.getRoleId() != 0) {
- forwardList = baseMapper.selectForwardsWithTunnelByUserId(currentUser.getUserId());
- } else {
- forwardList = baseMapper.selectAllForwardsWithTunnel();
- }
-
- // 填充入口IP和端口信息
- for (ForwardWithTunnelDto forward : forwardList) {
- // 获取隧道信息
- Tunnel tunnel = tunnelService.getById(forward.getTunnelId());
- if (tunnel == null) continue;
-
- // 获取该转发的所有ForwardPort记录
- List forwardPorts = forwardPortService.list(
- new QueryWrapper().eq("forward_id", forward.getId())
- );
-
- if (forwardPorts.isEmpty()) continue;
-
- // 判断是否使用隧道的inIp
- boolean useTunnelInIp = tunnel.getInIp() != null && !tunnel.getInIp().trim().isEmpty();
-
- Set ipPortSet = new LinkedHashSet<>();
-
- if (useTunnelInIp) {
- // 使用隧道的inIp(求笛卡尔积)
- List ipList = new ArrayList<>();
- List portList = new ArrayList<>();
-
- String[] tunnelInIps = tunnel.getInIp().split(",");
- for (String ip : tunnelInIps) {
- if (ip != null && !ip.trim().isEmpty()) {
- ipList.add(ip.trim());
- }
- }
-
- // 收集所有端口
- for (ForwardPort forwardPort : forwardPorts) {
- if (forwardPort.getPort() != null) {
- portList.add(forwardPort.getPort());
- }
- }
-
- // 去重
- List uniqueIps = ipList.stream().distinct().toList();
- List uniquePorts = portList.stream().distinct().toList();
-
- // 组合 IP:Port(笛卡尔积)
- for (String ip : uniqueIps) {
- for (Integer port : uniquePorts) {
- ipPortSet.add(ip + ":" + port);
- }
- }
-
- // inPort设置为第一个端口(用于向后兼容)
- if (!uniquePorts.isEmpty()) {
- forward.setInPort(uniquePorts.getFirst());
- }
- } else {
- // 使用节点的serverIp(一对一,不求笛卡尔积)
- for (ForwardPort forwardPort : forwardPorts) {
- Node node = nodeService.getById(forwardPort.getNodeId());
- if (node != null && node.getServerIp() != null && forwardPort.getPort() != null) {
- ipPortSet.add(node.getServerIp() + ":" + forwardPort.getPort());
- }
- }
-
- // inPort设置为第一个端口(用于向后兼容)
- if (!forwardPorts.isEmpty() && forwardPorts.getFirst().getPort() != null) {
- forward.setInPort(forwardPorts.getFirst().getPort());
- }
- }
-
- // 设置入口IP
- if (!ipPortSet.isEmpty()) {
- forward.setInIp(String.join(",", ipPortSet));
- }
- }
-
- return R.ok(forwardList);
- }
-
- @Override
- public R createForward(ForwardDto forwardDto) {
- UserInfo currentUser = getCurrentUserInfo();
-
- Tunnel tunnel = validateTunnel(forwardDto.getTunnelId());
- if (tunnel == null) {
- return R.err("隧道不存在");
- }
-
- if (tunnel.getStatus() != 1) {
- return R.err("隧道已禁用,无法创建转发");
- }
-
- UserPermissionResult permissionResult = checkUserPermissions(currentUser, tunnel, null);
- if (permissionResult.isHasError()) {
- return R.err(permissionResult.getErrorMessage());
- }
- Forward forward = new Forward();
- BeanUtils.copyProperties(forwardDto, forward);
- forward.setStatus(1);
- forward.setUserId(currentUser.getUserId());
- forward.setUserName(currentUser.getUserName());
- forward.setCreatedTime(System.currentTimeMillis());
- forward.setUpdatedTime(System.currentTimeMillis());
- List success = new ArrayList<>();
- List chainTunnels = chainTunnelService.list(new QueryWrapper().eq("tunnel_id", tunnel.getId()).eq("chain_type", 1));
- chainTunnels = get_port(chainTunnels, forwardDto.getInPort(), 0L);
- this.save(forward);
-
- for (ChainTunnel chainTunnel : chainTunnels) {
-
- ForwardPort forwardPort = new ForwardPort();
- forwardPort.setForwardId(forward.getId());
- forwardPort.setNodeId(chainTunnel.getNodeId());
- forwardPort.setPort(chainTunnel.getPort());
- forwardPortService.save(forwardPort);
- String serviceName = buildServiceName(forward.getId(), forward.getUserId(), permissionResult.getUserTunnel());
- Integer limiter = permissionResult.getLimiter();
-
- Node node = nodeService.getById(chainTunnel.getNodeId());
- if (node == null) {
- return R.err("部分节点不存在");
- }
- GostDto gostDto = GostUtil.AddAndUpdateService(serviceName, limiter, node, forward, forwardPort, tunnel, "AddService");
- if (Objects.equals(gostDto.getMsg(), "OK")) {
- JSONObject data = new JSONObject();
- data.put("node_id", node.getId());
- data.put("name", serviceName);
- success.add(data);
- } else {
- this.removeById(forward.getId());
- forwardPortService.remove(new QueryWrapper().eq("forward_id", forward.getId()));
- for (JSONObject jsonObject : success) {
- JSONArray se = new JSONArray();
- se.add(jsonObject.getString("name") + "_tcp");
- se.add(jsonObject.getString("name") + "_udp");
- GostUtil.DeleteService(jsonObject.getLong("node_id"), se);
- return R.err(gostDto.getMsg());
- }
- }
-
- }
- return R.ok();
- }
-
- @Override
- @Transactional
- public R updateForward(ForwardUpdateDto forwardUpdateDto) {
- UserInfo currentUser = getCurrentUserInfo();
-
- Forward existForward = validateForwardExists(forwardUpdateDto.getId(), currentUser);
- if (existForward == null) {
- return R.err("转发不存在");
- }
-
- Integer oldTunnelId = existForward.getTunnelId();
- Integer newTunnelId = forwardUpdateDto.getTunnelId() != null ? forwardUpdateDto.getTunnelId() : oldTunnelId;
- boolean tunnelChanged = !Objects.equals(oldTunnelId, newTunnelId);
-
- Tunnel oldTunnel = validateTunnel(oldTunnelId);
- if (oldTunnel == null) {
- return R.err("原隧道不存在");
- }
-
- UserTunnel oldUserTunnel;
- if (currentUser.getRoleId() != 0) {
- oldUserTunnel = getUserTunnel(currentUser.getUserId(), oldTunnelId);
- if (oldUserTunnel == null) {
- return R.err("你没有原隧道权限");
- }
- } else {
- oldUserTunnel = getUserTunnel(existForward.getUserId(), oldTunnelId);
- }
-
- if (tunnelChanged) {
- Tunnel newTunnel = validateTunnel(newTunnelId);
- if (newTunnel == null) {
- return R.err("新隧道不存在");
- }
- if (newTunnel.getStatus() != 1) {
- return R.err("新隧道已禁用,无法切换");
- }
-
- UserPermissionResult newPermResult = checkUserPermissions(currentUser, newTunnel, null);
- if (newPermResult.isHasError()) {
- return R.err(newPermResult.getErrorMessage());
- }
-
- UserTunnel newUserTunnel;
- if (currentUser.getRoleId() != 0) {
- newUserTunnel = getUserTunnel(currentUser.getUserId(), newTunnelId);
- if (newUserTunnel == null) {
- return R.err("你没有新隧道权限");
- }
- } else {
- newUserTunnel = getUserTunnel(existForward.getUserId(), newTunnelId);
- }
-
- releaseOldTunnelResources(existForward, oldTunnel, oldUserTunnel);
-
- existForward.setTunnelId(newTunnelId);
- existForward.setRemoteAddr(forwardUpdateDto.getRemoteAddr());
- existForward.setName(forwardUpdateDto.getName());
- existForward.setStrategy(forwardUpdateDto.getStrategy());
- existForward.setStatus(1);
- existForward.setUpdatedTime(System.currentTimeMillis());
- this.updateById(existForward);
-
- R allocResult = allocateNewTunnelResources(existForward, newTunnel, forwardUpdateDto.getInPort(), newPermResult, newUserTunnel);
- if (allocResult.getCode() != 0) {
- throw new RuntimeException(allocResult.getMsg());
- }
-
- return R.ok();
- }
-
- UserPermissionResult permissionResult = checkUserPermissions(currentUser, oldTunnel, null);
- if (permissionResult.isHasError()) {
- return R.err(permissionResult.getErrorMessage());
- }
-
- existForward.setRemoteAddr(forwardUpdateDto.getRemoteAddr());
- existForward.setName(forwardUpdateDto.getName());
- existForward.setStrategy(forwardUpdateDto.getStrategy());
- existForward.setStatus(1);
- existForward.setUpdatedTime(System.currentTimeMillis());
- this.updateById(existForward);
-
- List chainTunnels = chainTunnelService.list(new QueryWrapper().eq("tunnel_id", oldTunnel.getId()).eq("chain_type", 1));
- chainTunnels = get_port(chainTunnels, forwardUpdateDto.getInPort(), existForward.getId());
-
- for (ChainTunnel chainTunnel : chainTunnels) {
- String serviceName = buildServiceName(existForward.getId(), existForward.getUserId(), oldUserTunnel);
- Integer limiter = permissionResult.getLimiter();
- Node node = nodeService.getById(chainTunnel.getNodeId());
- if (node == null) {
- return R.err("部分节点不存在");
- }
- ForwardPort forwardPort = forwardPortService.getOne(new QueryWrapper().eq("forward_id", existForward.getId()).eq("node_id", node.getId()));
- if (forwardPort == null) {
- return R.err("部分节点不存在1");
- }
- forwardPort.setPort(chainTunnel.getPort());
- forwardPortService.updateById(forwardPort);
- GostDto gostDto = GostUtil.AddAndUpdateService(serviceName, limiter, node, existForward, forwardPort, oldTunnel, "UpdateService");
- if (!Objects.equals(gostDto.getMsg(), "OK")) return R.err(gostDto.getMsg());
- }
-
- return R.ok();
- }
-
- private void releaseOldTunnelResources(Forward forward, Tunnel oldTunnel, UserTunnel oldUserTunnel) {
- List oldInNodes = chainTunnelService.list(
- new QueryWrapper()
- .eq("tunnel_id", oldTunnel.getId())
- .eq("chain_type", 1)
- );
-
- for (ChainTunnel chainTunnel : oldInNodes) {
- String serviceName = buildServiceName(forward.getId(), forward.getUserId(), oldUserTunnel);
- Node node = nodeService.getById(chainTunnel.getNodeId());
- if (node != null) {
- JSONArray services = new JSONArray();
- services.add(serviceName + "_tcp");
- services.add(serviceName + "_udp");
- GostUtil.DeleteService(node.getId(), services);
- }
- }
-
- forwardPortService.remove(new QueryWrapper().eq("forward_id", forward.getId()));
- }
-
- private R allocateNewTunnelResources(Forward forward, Tunnel newTunnel, Integer requestedPort,
- UserPermissionResult permResult, UserTunnel newUserTunnel) {
- List newInNodes = chainTunnelService.list(
- new QueryWrapper()
- .eq("tunnel_id", newTunnel.getId())
- .eq("chain_type", 1)
- );
-
- newInNodes = get_port(newInNodes, requestedPort, forward.getId());
-
- List successServices = new ArrayList<>();
-
- for (ChainTunnel chainTunnel : newInNodes) {
- ForwardPort forwardPort = new ForwardPort();
- forwardPort.setForwardId(forward.getId());
- forwardPort.setNodeId(chainTunnel.getNodeId());
- forwardPort.setPort(chainTunnel.getPort());
- forwardPortService.save(forwardPort);
-
- String serviceName = buildServiceName(forward.getId(), forward.getUserId(), newUserTunnel);
- Integer limiter = permResult.getLimiter();
- Node node = nodeService.getById(chainTunnel.getNodeId());
-
- if (node == null) {
- rollbackCreatedServices(successServices);
- forwardPortService.remove(new QueryWrapper().eq("forward_id", forward.getId()));
- return R.err("新隧道部分节点不存在");
- }
-
- GostDto gostDto = GostUtil.AddAndUpdateService(serviceName, limiter, node, forward, forwardPort, newTunnel, "AddService");
-
- if (!Objects.equals(gostDto.getMsg(), "OK")) {
- rollbackCreatedServices(successServices);
- forwardPortService.remove(new QueryWrapper().eq("forward_id", forward.getId()));
- return R.err("在新隧道创建服务失败: " + gostDto.getMsg());
- }
-
- JSONObject data = new JSONObject();
- data.put("node_id", node.getId());
- data.put("name", serviceName);
- successServices.add(data);
- }
-
- return R.ok();
- }
-
- private void rollbackCreatedServices(List created) {
- for (JSONObject jsonObject : created) {
- JSONArray se = new JSONArray();
- se.add(jsonObject.getString("name") + "_tcp");
- se.add(jsonObject.getString("name") + "_udp");
- GostUtil.DeleteService(jsonObject.getLong("node_id"), se);
- }
- }
-
- @Override
- public R deleteForward(Long id) {
-
- // 1. 获取当前用户信息
- UserInfo currentUser = getCurrentUserInfo();
-
-
- // 2. 检查转发是否存在
- Forward forward = validateForwardExists(id, currentUser);
- if (forward == null) {
- return R.err("转发不存在");
- }
-
-
- Tunnel tunnel = validateTunnel(forward.getTunnelId());
- if (tunnel == null) {
- return R.err("隧道不存在");
- }
-
- UserPermissionResult permissionResult = checkUserPermissions(currentUser, tunnel, null);
- if (permissionResult.isHasError()) {
- return R.err(permissionResult.getErrorMessage());
- }
- UserTunnel userTunnel = null;
- if (currentUser.getRoleId() != 0) {
- userTunnel = getUserTunnel(currentUser.getUserId(), tunnel.getId().intValue());
- if (userTunnel == null) {
- return R.err("你没有该隧道权限");
- }
- } else {
- // 管理员用户也需要获取UserTunnel(如果存在的话),用于构建正确的服务名称
- // 通过forward记录获取原始的用户ID
- userTunnel = getUserTunnel(forward.getUserId(), tunnel.getId().intValue());
- }
-
- List chainTunnels = chainTunnelService.list(new QueryWrapper().eq("tunnel_id", tunnel.getId()).eq("chain_type", 1));
- for (ChainTunnel chainTunnel : chainTunnels) {
-
- String serviceName = buildServiceName(forward.getId(), forward.getUserId(), userTunnel);
- Node node = nodeService.getById(chainTunnel.getNodeId());
- if (node == null) {
- return R.err("部分节点不存在");
- }
-
- JSONArray services = new JSONArray();
- services.add(serviceName + "_tcp");
- services.add(serviceName + "_udp");
- GostUtil.DeleteService(node.getId(), services);
- }
- forwardPortService.remove(new QueryWrapper().eq("forward_id", id));
- this.removeById(id);
- return R.ok();
- }
-
- @Override
- public R pauseForward(Long id) {
- return changeForwardStatus(id, 0, "PauseService");
- }
-
- @Override
- public R resumeForward(Long id) {
- return changeForwardStatus(id, 1, "ResumeService");
- }
-
- @Override
- public R forceDeleteForward(Long id) {
- UserInfo currentUser = getCurrentUserInfo();
- Forward forward = validateForwardExists(id, currentUser);
- if (forward == null) {
- return R.err("端口转发不存在");
- }
- this.removeById(id);
- forwardPortService.remove(new QueryWrapper().eq("forward_id", id));
- return R.ok();
- }
-
- @Override
- public R diagnoseForward(Long id) {
- // 1. 获取当前用户信息
- UserInfo currentUser = getCurrentUserInfo();
-
- // 2. 检查转发是否存在且用户有权限访问
- Forward forward = validateForwardExists(id, currentUser);
- if (forward == null) {
- return R.err("转发不存在");
- }
-
- // 3. 获取隧道信息
- Tunnel tunnel = validateTunnel(forward.getTunnelId());
- if (tunnel == null) {
- return R.err("隧道不存在");
- }
-
- // 4. 获取隧道的ChainTunnel信息
- List chainTunnels = chainTunnelService.list(
- new QueryWrapper().eq("tunnel_id", tunnel.getId())
- );
-
- if (chainTunnels.isEmpty()) {
- return R.err("隧道配置不完整");
- }
-
- // 分类节点
- List inNodes = chainTunnels.stream()
- .filter(ct -> ct.getChainType() == 1)
- .toList();
-
- Map> chainNodesMap = chainTunnels.stream()
- .filter(ct -> ct.getChainType() == 2)
- .collect(Collectors.groupingBy(
- ct -> ct.getInx() != null ? ct.getInx() : 0,
- Collectors.toList()
- ));
-
- List> chainNodesList = chainNodesMap.entrySet().stream()
- .sorted(Map.Entry.comparingByKey())
- .map(Map.Entry::getValue)
- .toList();
-
- List outNodes = chainTunnels.stream()
- .filter(ct -> ct.getChainType() == 3)
- .toList();
-
- List> futures = new ArrayList<>();
- String[] remoteAddresses = forward.getRemoteAddr().split(",");
-
- // 根据隧道类型执行不同的诊断策略(并行执行所有诊断任务)
- if (tunnel.getType() == 1) {
- // 端口转发:入口节点直接TCP ping目标地址
- for (ChainTunnel inNode : inNodes) {
- Node node = nodeService.getById(inNode.getNodeId());
- if (node != null) {
- for (String remoteAddress : remoteAddresses) {
- String targetIp = extractIpFromAddress(remoteAddress);
- int targetPort = extractPortFromAddress(remoteAddress);
- if (targetIp != null && targetPort != -1) {
- final Node finalNode = node;
- final String finalTargetIp = targetIp;
- final int finalTargetPort = targetPort;
- final String finalRemoteAddress = remoteAddress;
- futures.add(CompletableFuture.supplyAsync(() -> {
- DiagnosisResult result = performTcpPingDiagnosisWithConnectionCheck(
- finalNode, finalTargetIp, finalTargetPort,
- "入口(" + finalNode.getName() + ")->目标(" + finalRemoteAddress + ")"
- );
- result.setFromChainType(1);
- return result;
- }));
- }
- }
- }
- }
- } else if (tunnel.getType() == 2) {
- // 隧道转发:测试完整链路
- // 1. 入口->第一跳(或出口)
- for (ChainTunnel inNode : inNodes) {
- Node fromNode = nodeService.getById(inNode.getNodeId());
-
- if (fromNode != null) {
- if (!chainNodesList.isEmpty()) {
- for (ChainTunnel firstChainNode : chainNodesList.getFirst()) {
- Node toNode = nodeService.getById(firstChainNode.getNodeId());
- if (toNode != null) {
- final Node finalFromNode = fromNode;
- final Node finalToNode = toNode;
- final ChainTunnel finalFirstChainNode = firstChainNode;
- futures.add(CompletableFuture.supplyAsync(() -> {
- DiagnosisResult result = performTcpPingDiagnosisWithConnectionCheck(
- finalFromNode, GostUtil.selectDialHost(finalFromNode, finalToNode), finalFirstChainNode.getPort(),
- "入口(" + finalFromNode.getName() + ")->第1跳(" + finalToNode.getName() + ")"
- );
- result.setFromChainType(1);
- result.setToChainType(2);
- result.setToInx(finalFirstChainNode.getInx());
- return result;
- }));
- }
- }
- } else if (!outNodes.isEmpty()) {
- for (ChainTunnel outNode : outNodes) {
- Node toNode = nodeService.getById(outNode.getNodeId());
- if (toNode != null) {
- final Node finalFromNode = fromNode;
- final Node finalToNode = toNode;
- final ChainTunnel finalOutNode = outNode;
- futures.add(CompletableFuture.supplyAsync(() -> {
- DiagnosisResult result = performTcpPingDiagnosisWithConnectionCheck(
- finalFromNode, GostUtil.selectDialHost(finalFromNode, finalToNode), finalOutNode.getPort(),
- "入口(" + finalFromNode.getName() + ")->出口(" + finalToNode.getName() + ")"
- );
- result.setFromChainType(1);
- result.setToChainType(3);
- return result;
- }));
- }
- }
- }
- }
- }
-
- // 2. 链路测试
- for (int i = 0; i < chainNodesList.size(); i++) {
- List currentHop = chainNodesList.get(i);
- final int hopIndex = i;
-
- for (ChainTunnel currentNode : currentHop) {
- Node fromNode = nodeService.getById(currentNode.getNodeId());
-
- if (fromNode != null) {
- if (i + 1 < chainNodesList.size()) {
- for (ChainTunnel nextNode : chainNodesList.get(i + 1)) {
- Node toNode = nodeService.getById(nextNode.getNodeId());
- if (toNode != null) {
- final Node finalFromNode = fromNode;
- final Node finalToNode = toNode;
- final ChainTunnel finalCurrentNode = currentNode;
- final ChainTunnel finalNextNode = nextNode;
- futures.add(CompletableFuture.supplyAsync(() -> {
- DiagnosisResult result = performTcpPingDiagnosisWithConnectionCheck(
- finalFromNode, GostUtil.selectDialHost(finalFromNode, finalToNode), finalNextNode.getPort(),
- "第" + (hopIndex + 1) + "跳(" + finalFromNode.getName() + ")->第" + (hopIndex + 2) + "跳(" + finalToNode.getName() + ")"
- );
- result.setFromChainType(2);
- result.setFromInx(finalCurrentNode.getInx());
- result.setToChainType(2);
- result.setToInx(finalNextNode.getInx());
- return result;
- }));
- }
- }
- } else if (!outNodes.isEmpty()) {
- for (ChainTunnel outNode : outNodes) {
- Node toNode = nodeService.getById(outNode.getNodeId());
- if (toNode != null) {
- final Node finalFromNode = fromNode;
- final Node finalToNode = toNode;
- final ChainTunnel finalCurrentNode = currentNode;
- final ChainTunnel finalOutNode = outNode;
- futures.add(CompletableFuture.supplyAsync(() -> {
- DiagnosisResult result = performTcpPingDiagnosisWithConnectionCheck(
- finalFromNode, GostUtil.selectDialHost(finalFromNode, finalToNode), finalOutNode.getPort(),
- "第" + (hopIndex + 1) + "跳(" + finalFromNode.getName() + ")->出口(" + finalToNode.getName() + ")"
- );
- result.setFromChainType(2);
- result.setFromInx(finalCurrentNode.getInx());
- result.setToChainType(3);
- return result;
- }));
- }
- }
- }
- }
- }
- }
-
- // 3. 出口->目标地址
- for (ChainTunnel outNode : outNodes) {
- Node node = nodeService.getById(outNode.getNodeId());
- if (node != null) {
- for (String remoteAddress : remoteAddresses) {
- String targetIp = extractIpFromAddress(remoteAddress);
- int targetPort = extractPortFromAddress(remoteAddress);
- if (targetIp != null && targetPort != -1) {
- final Node finalNode = node;
- final String finalTargetIp = targetIp;
- final int finalTargetPort = targetPort;
- final String finalRemoteAddress = remoteAddress;
- futures.add(CompletableFuture.supplyAsync(() -> {
- DiagnosisResult result = performTcpPingDiagnosisWithConnectionCheck(
- finalNode, finalTargetIp, finalTargetPort,
- "出口(" + finalNode.getName() + ")->目标(" + finalRemoteAddress + ")"
- );
- result.setFromChainType(3);
- return result;
- }));
- }
- }
- }
- }
- }
-
- // 等待所有诊断任务完成并收集结果
- List results = futures.stream()
- .map(CompletableFuture::join)
- .collect(Collectors.toList());
-
- // 构建诊断报告
- Map diagnosisReport = new HashMap<>();
- diagnosisReport.put("forwardId", id);
- diagnosisReport.put("forwardName", forward.getName());
- diagnosisReport.put("tunnelType", tunnel.getType() == 1 ? "端口转发" : "隧道转发");
- diagnosisReport.put("results", results);
- diagnosisReport.put("timestamp", System.currentTimeMillis());
-
- return R.ok(diagnosisReport);
- }
-
- @Override
- @Transactional
- public R updateForwardOrder(Map params) {
- // 1. 获取当前用户信息
- UserInfo currentUser = getCurrentUserInfo();
-
- // 2. 验证参数
- if (!params.containsKey("forwards")) {
- return R.err("缺少forwards参数");
- }
-
- @SuppressWarnings("unchecked")
- List