diff --git a/src/main/java/com/mini/capi/job/taskEnable.java b/src/main/java/com/mini/capi/job/taskEnable.java index 91680d1..c9e3444 100644 --- a/src/main/java/com/mini/capi/job/taskEnable.java +++ b/src/main/java/com/mini/capi/job/taskEnable.java @@ -1,20 +1,15 @@ package com.mini.capi.job; -import com.mini.capi.biz.domain.*; -import com.mini.capi.biz.service.*; import com.mini.capi.model.ApiResult; +import com.mini.capi.sys.service.DbService; +import com.mini.capi.sys.service.DockerService; import com.mini.capi.utils.*; import jakarta.annotation.Resource; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.util.*; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.Executor; -import java.util.function.Function; -import java.util.stream.Collectors; @RestController @RequestMapping("/Sys/jobs") @@ -22,23 +17,10 @@ public class taskEnable { @Resource - private SshInfoService sshInfoService; + private DockerService dockerService; @Resource - private SshUserService sshUserService; - - @Resource - private DockerHostService dockerHostService; - - @Resource - private DiskMountService diskMountService; - - @Resource - private SysHostService sysHostService; - - - @Resource - private Executor hostExecutor; + private DbService dbService; /** @@ -49,75 +31,20 @@ public class taskEnable { if (!vToken.isValidToken(token)) { return ApiResult.error(401, "无效的访问令牌"); } - try { - List dockerHosts = dockerHostService.list(); - List errorList = Collections.synchronizedList(new ArrayList<>()); - // 并行处理所有宿主机 - CompletableFuture[] futures = dockerHosts.stream() - .map(host -> CompletableFuture.runAsync(() -> handleSingleHost(host, errorList), hostExecutor)) - .toArray(CompletableFuture[]::new); - // 等待全部完成 - CompletableFuture.allOf(futures).join(); - return errorList.isEmpty() - ? ApiResult.success() - : ApiResult.error(); - } catch (Exception e) { - return ApiResult.error(101, e.getMessage()); - } + return dockerService.jobHostDisk(); } - private void handleSingleHost(DockerHost host, List errorList) { - try { - SshUser sshUser = sshUserService.getById(host.getUserId()); - SshInfo sshInfo = sshInfoService.getById(host.getHostId()); - /* 1. 采集实时数据 */ - HostInfo.Result r = HostInfo.collect( - sshInfo.getHostIp(), - Integer.parseInt(sshInfo.getHostPort()), - sshUser.getCUsername(), - sshUser.getCPassword()); - /* 2. 主机维度 saveOrUpdate */ - SysHost sysHost = r.host; - sysHost.setSysHostId(host.getHostId()); - sysHost.setUpdateTime(vDate.getNow()); - sysHost.setDokerHostId(host.getDokerHostId()); - sysHostService.saveOrUpdate(sysHost); - /* 3. 处理磁盘:先查库做索引,再比对 */ - List dbDisks = diskMountService.lambdaQuery() - .eq(DiskMount::getSysHostId, host.getHostId()) - .list(); - Map dbDiskMap = dbDisks.stream() - .collect(Collectors.toMap(DiskMount::getMountPoint, Function.identity())); - - List toSaveOrUpdate = new ArrayList<>(); - Set liveMountPoint = new HashSet<>(); - for (DiskMount d : r.disks) { - liveMountPoint.add(d.getMountPoint()); - DiskMount exist = dbDiskMap.get(d.getMountPoint()); - if (exist != null) { - d.setDiskMountId(exist.getDiskMountId()); - } else { - d.setDiskMountId(vId.getUid()); - } - d.setSysHostId(host.getHostId()); - d.setUpdateTime(vDate.getNow()); - toSaveOrUpdate.add(d); - } - /* 4. 批量保存/更新 */ - diskMountService.saveOrUpdateBatch(toSaveOrUpdate); - /* 5. 删除实时已消失的盘 */ - List delIds = dbDisks.stream() - .filter(d -> !liveMountPoint.contains(d.getMountPoint())) - .map(DiskMount::getDiskMountId) - .collect(Collectors.toList()); - if (!delIds.isEmpty()) { - diskMountService.removeByIds(delIds); - } - } catch (Exception e) { - // 仅记录异常,不中断其它任务 - errorList.add(String.format("hostId=%s, error=%s", host.getHostId(), e.getMessage())); + /** + * 运行全部任务数据同步 + */ + @GetMapping("/getTaskSyncDbInfo") + public ApiResult jobSyncAllTask(String token) { + if (!vToken.isValidToken(token)) { + return ApiResult.error(401, "无效的访问令牌"); } + return dbService.jobSyncAllTask(); } + } diff --git a/src/main/java/com/mini/capi/sys/controller/dbController.java b/src/main/java/com/mini/capi/sys/controller/dbController.java index 7dbc610..736f5a8 100644 --- a/src/main/java/com/mini/capi/sys/controller/dbController.java +++ b/src/main/java/com/mini/capi/sys/controller/dbController.java @@ -1,20 +1,15 @@ package com.mini.capi.sys.controller; -import com.mini.capi.biz.domain.DbConfig; -import com.mini.capi.biz.service.DbConfigService; -import com.mini.capi.config.DataSourceConfig; import com.mini.capi.model.ApiResult; import com.mini.capi.model.TabResult; +import com.mini.capi.sys.service.DbService; import com.mini.capi.utils.vToken; import jakarta.annotation.Resource; -import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.util.Comparator; import java.util.List; -import java.util.Map; @RestController @RequestMapping("/Sys/dbs") @@ -22,7 +17,7 @@ public class dbController { @Resource - private DbConfigService dbConfigService; + private DbService dbService; /** * 获取MySQL的当前连接下的所有数据表 @@ -33,45 +28,18 @@ public class dbController { if (!vToken.isValidToken(token)) { return ApiResult.error(401, "无效的访问令牌"); } - - // 2. 校验dbId参数 - if (dbId == null || dbId.trim().isEmpty()) { - return ApiResult.error(400, "数据库ID不能为空"); - } - - // 3. 查询数据库配置并校验 - DbConfig dbConfig = dbConfigService.getById(dbId); - if (dbConfig == null) { - return ApiResult.error(404, "未找到ID为[" + dbId + "]的数据库配置"); - } - - try { - JdbcTemplate jdbcTemplate = DataSourceConfig.createJdbcTemplate(dbConfig); - // 补充参数传递 - String querySql = "SELECT TABLE_NAME,TABLE_COMMENT FROM information_schema.tables WHERE TABLE_SCHEMA = ?"; - List> result = jdbcTemplate.queryForList(querySql, dbConfig.getDbName()); - List data = result.stream() - .map(row -> { - String tableName = row.get("TABLE_NAME") != null ? row.get("TABLE_NAME").toString() : ""; - String tableDesc = row.get("TABLE_COMMENT") != null ? row.get("TABLE_COMMENT").toString() : ""; - return new TabResult(tableName, getComment(tableName, tableDesc)); - }) - .sorted(Comparator.comparing(TabResult::getTableName)) // 按表名排序 - .toList(); - return ApiResult.success(data); - } catch (Exception e) { - return ApiResult.error(101, e.getMessage()); - } + return dbService.listSourceTables(dbId); } - private String getComment(String tableName, String tableDesc) { - boolean hasTableDesc = tableDesc != null && !tableDesc.trim().isEmpty(); - // 根据表描述是否存在返回不同格式 - if (hasTableDesc) { - return String.format("%s(%s)", tableDesc.trim(), tableName); - } else { - return tableName; + /** + * 运行单个任务 + */ + @GetMapping("/getTaskSyncDbByInfo") + public ApiResult jobSyncOneTask(String token, String taskId) { + if (!vToken.isValidToken(token)) { + return ApiResult.error(401, "无效的访问令牌"); } + return dbService.jobSyncOneTask(taskId); } } diff --git a/src/main/java/com/mini/capi/sys/controller/hostController.java b/src/main/java/com/mini/capi/sys/controller/hostController.java new file mode 100644 index 0000000..0609c2f --- /dev/null +++ b/src/main/java/com/mini/capi/sys/controller/hostController.java @@ -0,0 +1,70 @@ +package com.mini.capi.sys.controller; + + +import com.mini.capi.model.ApiResult; +import com.mini.capi.sys.service.HostService; +import com.mini.capi.utils.vToken; + +import jakarta.annotation.Resource; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +import java.util.*; + +@RestController +@RequestMapping("/Sys/hosts") +public class hostController { + + + @Resource + private HostService hostService; + + + @GetMapping("/getApiInfo") + public ApiResult> getApiInfo(String token) { + if (!vToken.isValidToken(token)) { + return ApiResult.error(401, "无效的访问令牌"); + } + return hostService.getApiInfo(); + } + + + /** + * 获取容器列表 + */ + @GetMapping("/getApiDockerInfo") + public ApiResult getDockerInfo(String token) { + if (!vToken.isValidToken(token)) { + return ApiResult.error(401, "无效的访问令牌"); + } + return hostService.getDockerInfo(); + } + + + /** + * 启动容器 + */ + @GetMapping("/getApiStartDockerInfo") + public ApiResult startDockerInfo(String id, String token) { + if (!vToken.isValidToken(token)) { + return ApiResult.error(401, "无效的访问令牌"); + } + return hostService.startDockerInfo(id); + } + + + /** + * 停止容器 + */ + @GetMapping("/getApiStopDockerInfo") + public ApiResult stopDockerInfo(String id, String token) { + if (!vToken.isValidToken(token)) { + return ApiResult.error(401, "无效的访问令牌"); + } + return hostService.stopDockerInfo(id); + } + + +} diff --git a/src/main/java/com/mini/capi/job/taskDbSync.java b/src/main/java/com/mini/capi/sys/service/DbService.java similarity index 87% rename from src/main/java/com/mini/capi/job/taskDbSync.java rename to src/main/java/com/mini/capi/sys/service/DbService.java index 870113d..6e53023 100644 --- a/src/main/java/com/mini/capi/job/taskDbSync.java +++ b/src/main/java/com/mini/capi/sys/service/DbService.java @@ -1,4 +1,4 @@ -package com.mini.capi.job; +package com.mini.capi.sys.service; import com.mini.capi.biz.domain.DbConfig; import com.mini.capi.biz.domain.SyncTask; @@ -8,28 +8,22 @@ import com.mini.capi.biz.service.SyncTaskLogService; import com.mini.capi.biz.service.SyncTaskService; import com.mini.capi.config.DataSourceConfig; import com.mini.capi.model.ApiResult; -import com.mini.capi.utils.vToken; +import com.mini.capi.model.TabResult; import jakarta.annotation.Resource; import org.springframework.jdbc.core.BatchPreparedStatementSetter; import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.stereotype.Service; import java.sql.*; import java.time.Duration; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.Executor; -@RestController -@RequestMapping("/Sys/dbs") -public class taskDbSync { +@Service +public class DbService { @Resource private SyncTaskService syncTaskService; @@ -43,17 +37,57 @@ public class taskDbSync { @Resource private Executor hostExecutor; + private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd"); private static final String dsValue = LocalDate.now().format(DATE_FORMATTER); + + public ApiResult> listSourceTables(String dbId) { + // 1. 校验dbId参数 + if (dbId == null || dbId.trim().isEmpty()) { + return ApiResult.error(400, "数据库ID不能为空"); + } + // 2. 查询数据库配置并校验 + DbConfig dbConfig = dbConfigService.getById(dbId); + if (dbConfig == null) { + return ApiResult.error(404, "未找到ID为[" + dbId + "]的数据库配置"); + } + try { + JdbcTemplate jdbcTemplate = DataSourceConfig.createJdbcTemplate(dbConfig); + // 补充参数传递 + String querySql = "SELECT TABLE_NAME,TABLE_COMMENT FROM information_schema.tables WHERE TABLE_SCHEMA = ?"; + List> result = jdbcTemplate.queryForList(querySql, dbConfig.getDbName()); + List data = result.stream() + .map(row -> { + String tableName = row.get("TABLE_NAME") != null ? row.get("TABLE_NAME").toString() : ""; + String tableDesc = row.get("TABLE_COMMENT") != null ? row.get("TABLE_COMMENT").toString() : ""; + return new TabResult(tableName, getComment(tableName, tableDesc)); + }) + .sorted(Comparator.comparing(TabResult::getTableName)) // 按表名排序 + .toList(); + return ApiResult.success(data); + } catch (Exception e) { + return ApiResult.error(101, e.getMessage()); + } + } + + + private String getComment(String tableName, String tableDesc) { + boolean hasTableDesc = tableDesc != null && !tableDesc.trim().isEmpty(); + // 根据表描述是否存在返回不同格式 + if (hasTableDesc) { + return String.format("%s(%s)", tableDesc.trim(), tableName); + } else { + return tableName; + } + } + + + /** * 运行全部任务 */ - @GetMapping("/getTaskSyncDbInfo") - public ApiResult jobSyncAllTask(String token) { - if (!vToken.isValidToken(token)) { - return ApiResult.error(401, "无效的访问令牌"); - } + public ApiResult jobSyncAllTask() { List syncTasks = syncTaskService.list(); // 记录是否有任务失败(仅用于后台日志,不影响接口返回) List errorMessages = new ArrayList<>(); @@ -69,11 +103,7 @@ public class taskDbSync { /** * 运行单个任务 */ - @GetMapping("/getTaskSyncDbByInfo") - public ApiResult jobSyncOneTask(String token, String taskId) { - if (!vToken.isValidToken(token)) { - return ApiResult.error(401, "无效的访问令牌"); - } + public ApiResult jobSyncOneTask( String taskId) { try { SyncTask task = syncTaskService.getById(taskId); // 记录是否有任务失败(仅用于后台日志,不影响接口返回) diff --git a/src/main/java/com/mini/capi/sys/service/DockerService.java b/src/main/java/com/mini/capi/sys/service/DockerService.java new file mode 100644 index 0000000..849c3c8 --- /dev/null +++ b/src/main/java/com/mini/capi/sys/service/DockerService.java @@ -0,0 +1,117 @@ +package com.mini.capi.sys.service; + +import com.mini.capi.biz.domain.*; +import com.mini.capi.biz.service.*; +import com.mini.capi.model.ApiResult; +import com.mini.capi.utils.HostInfo; +import com.mini.capi.utils.vDate; +import com.mini.capi.utils.vId; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; +import java.util.function.Function; +import java.util.stream.Collectors; + +@Service +public class DockerService { + + + + @Resource + private SshInfoService sshInfoService; + + @Resource + private SshUserService sshUserService; + + @Resource + private DockerHostService dockerHostService; + + @Resource + private DiskMountService diskMountService; + + @Resource + private SysHostService sysHostService; + + + @Resource + private Executor hostExecutor; + + + /** + * 获取容器主机的磁盘使用情况 + */ + public ApiResult jobHostDisk() { + try { + List dockerHosts = dockerHostService.list(); + List errorList = Collections.synchronizedList(new ArrayList<>()); + // 并行处理所有宿主机 + CompletableFuture[] futures = dockerHosts.stream() + .map(host -> CompletableFuture.runAsync(() -> handleSingleHost(host, errorList), hostExecutor)) + .toArray(CompletableFuture[]::new); + // 等待全部完成 + CompletableFuture.allOf(futures).join(); + return errorList.isEmpty() + ? ApiResult.success() + : ApiResult.error(); + } catch (Exception e) { + return ApiResult.error(101, e.getMessage()); + } + } + + + private void handleSingleHost(DockerHost host, List errorList) { + try { + SshUser sshUser = sshUserService.getById(host.getUserId()); + SshInfo sshInfo = sshInfoService.getById(host.getHostId()); + /* 1. 采集实时数据 */ + HostInfo.Result r = HostInfo.collect( + sshInfo.getHostIp(), + Integer.parseInt(sshInfo.getHostPort()), + sshUser.getCUsername(), + sshUser.getCPassword()); + /* 2. 主机维度 saveOrUpdate */ + SysHost sysHost = r.host; + sysHost.setSysHostId(host.getHostId()); + sysHost.setUpdateTime(vDate.getNow()); + sysHost.setDokerHostId(host.getDokerHostId()); + sysHostService.saveOrUpdate(sysHost); + /* 3. 处理磁盘:先查库做索引,再比对 */ + List dbDisks = diskMountService.lambdaQuery() + .eq(DiskMount::getSysHostId, host.getHostId()) + .list(); + Map dbDiskMap = dbDisks.stream() + .collect(Collectors.toMap(DiskMount::getMountPoint, Function.identity())); + + List toSaveOrUpdate = new ArrayList<>(); + Set liveMountPoint = new HashSet<>(); + for (DiskMount d : r.disks) { + liveMountPoint.add(d.getMountPoint()); + DiskMount exist = dbDiskMap.get(d.getMountPoint()); + if (exist != null) { + d.setDiskMountId(exist.getDiskMountId()); + } else { + d.setDiskMountId(vId.getUid()); + } + d.setSysHostId(host.getHostId()); + d.setUpdateTime(vDate.getNow()); + toSaveOrUpdate.add(d); + } + /* 4. 批量保存/更新 */ + diskMountService.saveOrUpdateBatch(toSaveOrUpdate); + /* 5. 删除实时已消失的盘 */ + List delIds = dbDisks.stream() + .filter(d -> !liveMountPoint.contains(d.getMountPoint())) + .map(DiskMount::getDiskMountId) + .collect(Collectors.toList()); + if (!delIds.isEmpty()) { + diskMountService.removeByIds(delIds); + } + } catch (Exception e) { + // 仅记录异常,不中断其它任务 + errorList.add(String.format("hostId=%s, error=%s", host.getHostId(), e.getMessage())); + } + } +} diff --git a/src/main/java/com/mini/capi/sys/controller/sysController.java b/src/main/java/com/mini/capi/sys/service/HostService.java similarity index 91% rename from src/main/java/com/mini/capi/sys/controller/sysController.java rename to src/main/java/com/mini/capi/sys/service/HostService.java index 40ef07f..692f6d2 100644 --- a/src/main/java/com/mini/capi/sys/controller/sysController.java +++ b/src/main/java/com/mini/capi/sys/service/HostService.java @@ -1,4 +1,4 @@ -package com.mini.capi.sys.controller; +package com.mini.capi.sys.service; import com.mini.capi.biz.domain.DockerContainerInfo; import com.mini.capi.biz.domain.DockerHost; @@ -12,11 +12,8 @@ import com.mini.capi.model.ApiResult; import com.mini.capi.utils.HostRuntime; import com.mini.capi.utils.docker; import com.mini.capi.utils.vDate; -import com.mini.capi.utils.vToken; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.stereotype.Service; import java.time.Instant; import java.time.ZoneId; @@ -26,9 +23,8 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; import java.util.stream.Collectors; -@RestController -@RequestMapping("/Sys/hosts") -public class sysController { +@Service +public class HostService { @Resource @@ -57,7 +53,7 @@ public class sysController { public String memUsage; public String swapTotal; public String swapUsed; - public List disks; + public List disks; public String netRxBytes; public String netTxBytes; public double load1; @@ -78,7 +74,7 @@ public class sysController { dto.swapTotal = humanBytes(s.swapTotal); dto.swapUsed = humanBytes(s.swapUsed); dto.disks = s.disks.stream() - .map(d -> new DiskDTO(d.path, + .map(d -> new SnapshotDTO.DiskDTO(d.path, humanBytes(d.total), humanBytes(d.free), humanBytes(d.used), @@ -253,12 +249,7 @@ public class sysController { } - @GetMapping("/getApiInfo") - public ApiResult> getApiInfo(String token) { - if (!vToken.isValidToken(token)) { - return ApiResult.error(401, "无效的访问令牌"); - } - + public ApiResult> getApiInfo() { try { // 1. 新建一个一次性 List List snapshots = @@ -280,11 +271,7 @@ public class sysController { /** * 获取容器列表 */ - @GetMapping("/getApiDockerInfo") - public ApiResult getDockerInfo(String token) { - if (!vToken.isValidToken(token)) { - return ApiResult.error(401, "无效的访问令牌"); - } + public ApiResult getDockerInfo() { try { List dockerHosts = dockerHostService.list(); List errorList = Collections.synchronizedList(new ArrayList<>()); @@ -306,11 +293,7 @@ public class sysController { /** * 启动容器 */ - @GetMapping("/getApiStartDockerInfo") - public ApiResult startDockerInfo(String id, String token) { - if (!vToken.isValidToken(token)) { - return ApiResult.error(401, "无效的访问令牌"); - } + public ApiResult startDockerInfo(String id) { try { DockerContainerInfo cur = dockerInfoService.getById(id); DockerHost host = dockerHostService.getById(cur.getDokerHostId()); @@ -337,11 +320,7 @@ public class sysController { /** * 停止容器 */ - @GetMapping("/getApiStopDockerInfo") - public ApiResult stopDockerInfo(String id, String token) { - if (!vToken.isValidToken(token)) { - return ApiResult.error(401, "无效的访问令牌"); - } + public ApiResult stopDockerInfo(String id) { try { DockerContainerInfo cur = dockerInfoService.getById(id); DockerHost host = dockerHostService.getById(cur.getDokerHostId()); @@ -363,6 +342,4 @@ public class sysController { return ApiResult.error(101, e.getMessage()); } } - - }